fix(mes): 修复工艺路线前端 TODO,补全注释与交互优化

- API 文件(4 个)补充 VO 字段注释和方法注释,新增 updateRouteStatus 方法
- index.vue 字段加"工艺路线"前缀,状态列改为 el-switch 开关操作
- RouteForm.vue 补充行内注释,status 默认值改用 CommonStatusEnum.ENABLE
- RouteProcessList/ProductList/ProductBomList 补充变量行内注释
- CalendarTypeView/TeamView 修复 ESLint 问题
pull/871/MERGE
YunaiV 2026-02-19 17:44:58 +08:00
parent 0da99069c5
commit e94f2d4fee
9 changed files with 191 additions and 122 deletions

View File

@ -1,35 +1,54 @@
import request from '@/config/axios' import request from '@/config/axios'
// TODO @AI参考别的 api 文件,需要有一些注释 // MES 工艺路线 VO
export interface ProRouteVO { export interface ProRouteVO {
id?: number id?: number // 编号
code: string code: string // 工艺路线编码
name: string name: string // 工艺路线名称
description?: string description?: string // 工艺路线说明
status: number status: number // 状态
remark?: string remark?: string // 备注
createTime?: Date createTime?: Date // 创建时间
} }
// MES 工艺路线 API
export const ProRouteApi = { export const ProRouteApi = {
// 查询工艺路线分页
getRoutePage: async (params: any) => { getRoutePage: async (params: any) => {
return await request.get({ url: `/mes/pro/route/page`, params }) return await request.get({ url: `/mes/pro/route/page`, params })
}, },
// 查询工艺路线精简列表
getRouteSimpleList: async () => { getRouteSimpleList: async () => {
return await request.get({ url: `/mes/pro/route/simple-list` }) return await request.get({ url: `/mes/pro/route/simple-list` })
}, },
// 查询工艺路线详情
getRoute: async (id: number) => { getRoute: async (id: number) => {
return await request.get({ url: `/mes/pro/route/get?id=` + id }) return await request.get({ url: `/mes/pro/route/get?id=` + id })
}, },
// 新增工艺路线
createRoute: async (data: ProRouteVO) => { createRoute: async (data: ProRouteVO) => {
return await request.post({ url: `/mes/pro/route/create`, data }) return await request.post({ url: `/mes/pro/route/create`, data })
}, },
// 修改工艺路线
updateRoute: async (data: ProRouteVO) => { updateRoute: async (data: ProRouteVO) => {
return await request.put({ url: `/mes/pro/route/update`, data }) return await request.put({ url: `/mes/pro/route/update`, data })
}, },
// 修改工艺路线状态
updateRouteStatus: async (id: number, status: number) => {
return await request.put({ url: `/mes/pro/route/update-status?id=` + id + `&status=` + status })
},
// 删除工艺路线
deleteRoute: async (id: number) => { deleteRoute: async (id: number) => {
return await request.delete({ url: `/mes/pro/route/delete?id=` + id }) return await request.delete({ url: `/mes/pro/route/delete?id=` + id })
}, },
// 导出工艺路线 Excel
exportRoute: async (params: any) => { exportRoute: async (params: any) => {
return await request.download({ url: `/mes/pro/route/export-excel`, params }) return await request.download({ url: `/mes/pro/route/export-excel`, params })
} }

View File

@ -1,38 +1,48 @@
import request from '@/config/axios' import request from '@/config/axios'
// TODO @AI参考别的 api 文件,需要有一些注释 // MES 工艺路线工序 VO
export interface ProRouteProcessVO { export interface ProRouteProcessVO {
id?: number id?: number // 编号
routeId: number routeId: number // 工艺路线编号
processId: number processId: number // 工序编号
processCode?: string processCode?: string // 工序编码
processName?: string processName?: string // 工序名称
sort: number sort: number // 序号
nextProcessId?: number nextProcessId?: number // 下一道工序编号
nextProcessName?: string nextProcessName?: string // 下一道工序名称
linkType: number linkType: number // 与下一道工序关系
prepareTime?: number prepareTime?: number // 准备时间(分钟)
waitTime?: number waitTime?: number // 等待时间(分钟)
colorCode?: string colorCode?: string // 甘特图显示颜色
keyFlag?: number keyFlag?: number // 是否关键工序
checkFlag?: number checkFlag?: number // 是否质检工序
remark?: string remark?: string // 备注
createTime?: Date createTime?: Date // 创建时间
} }
// MES 工艺路线工序 API
export const ProRouteProcessApi = { export const ProRouteProcessApi = {
// 按工艺路线查询工序列表
getRouteProcessListByRoute: async (routeId: number) => { getRouteProcessListByRoute: async (routeId: number) => {
return await request.get({ url: `/mes/pro/route-process/list-by-route?routeId=` + routeId }) return await request.get({ url: `/mes/pro/route-process/list-by-route?routeId=` + routeId })
}, },
// 查询工艺路线工序详情
getRouteProcess: async (id: number) => { getRouteProcess: async (id: number) => {
return await request.get({ url: `/mes/pro/route-process/get?id=` + id }) return await request.get({ url: `/mes/pro/route-process/get?id=` + id })
}, },
// 新增工艺路线工序
createRouteProcess: async (data: ProRouteProcessVO) => { createRouteProcess: async (data: ProRouteProcessVO) => {
return await request.post({ url: `/mes/pro/route-process/create`, data }) return await request.post({ url: `/mes/pro/route-process/create`, data })
}, },
// 修改工艺路线工序
updateRouteProcess: async (data: ProRouteProcessVO) => { updateRouteProcess: async (data: ProRouteProcessVO) => {
return await request.put({ url: `/mes/pro/route-process/update`, data }) return await request.put({ url: `/mes/pro/route-process/update`, data })
}, },
// 删除工艺路线工序
deleteRouteProcess: async (id: number) => { deleteRouteProcess: async (id: number) => {
return await request.delete({ url: `/mes/pro/route-process/delete?id=` + id }) return await request.delete({ url: `/mes/pro/route-process/delete?id=` + id })
} }

View File

@ -1,34 +1,44 @@
import request from '@/config/axios' import request from '@/config/axios'
// TODO @AI参考别的 api 文件,需要有一些注释 // MES 工艺路线产品 VO
export interface ProRouteProductVO { export interface ProRouteProductVO {
id?: number id?: number // 编号
routeId: number routeId: number // 工艺路线编号
itemId: number itemId: number // 产品物料编号
itemCode?: string itemCode?: string // 产品编码
itemName?: string itemName?: string // 产品名称
specification?: string specification?: string // 规格型号
unitName?: string unitName?: string // 单位名称
quantity?: number quantity?: number // 生产数量
productionTime?: number productionTime?: number // 生产用时
timeUnitType?: number timeUnitType?: number // 时间单位
remark?: string remark?: string // 备注
createTime?: Date createTime?: Date // 创建时间
} }
// MES 工艺路线产品 API
export const ProRouteProductApi = { export const ProRouteProductApi = {
// 按工艺路线查询产品列表
getRouteProductListByRoute: async (routeId: number) => { getRouteProductListByRoute: async (routeId: number) => {
return await request.get({ url: `/mes/pro/route-product/list-by-route?routeId=` + routeId }) return await request.get({ url: `/mes/pro/route-product/list-by-route?routeId=` + routeId })
}, },
// 查询工艺路线产品详情
getRouteProduct: async (id: number) => { getRouteProduct: async (id: number) => {
return await request.get({ url: `/mes/pro/route-product/get?id=` + id }) return await request.get({ url: `/mes/pro/route-product/get?id=` + id })
}, },
// 新增工艺路线产品
createRouteProduct: async (data: ProRouteProductVO) => { createRouteProduct: async (data: ProRouteProductVO) => {
return await request.post({ url: `/mes/pro/route-product/create`, data }) return await request.post({ url: `/mes/pro/route-product/create`, data })
}, },
// 修改工艺路线产品
updateRouteProduct: async (data: ProRouteProductVO) => { updateRouteProduct: async (data: ProRouteProductVO) => {
return await request.put({ url: `/mes/pro/route-product/update`, data }) return await request.put({ url: `/mes/pro/route-product/update`, data })
}, },
// 删除工艺路线产品
deleteRouteProduct: async (id: number) => { deleteRouteProduct: async (id: number) => {
return await request.delete({ url: `/mes/pro/route-product/delete?id=` + id }) return await request.delete({ url: `/mes/pro/route-product/delete?id=` + id })
} }

View File

@ -1,34 +1,44 @@
import request from '@/config/axios' import request from '@/config/axios'
// TODO @AI参考别的 api 文件,需要有一些注释 // MES 工艺路线产品 BOM VO
export interface ProRouteProductBomVO { export interface ProRouteProductBomVO {
id?: number id?: number // 编号
routeId: number routeId: number // 工艺路线编号
processId: number processId: number // 工序编号
productId: number productId: number // 产品物料编号
itemId: number itemId: number // BOM 物料编号
itemCode?: string itemCode?: string // 物料编码
itemName?: string itemName?: string // 物料名称
specification?: string specification?: string // 规格型号
unitName?: string unitName?: string // 单位名称
quantity?: number quantity?: number // 用料比例
remark?: string remark?: string // 备注
createTime?: Date createTime?: Date // 创建时间
} }
// MES 工艺路线产品 BOM API
export const ProRouteProductBomApi = { export const ProRouteProductBomApi = {
// 查询工艺路线产品 BOM 列表
getRouteProductBomList: async (params: { routeId: number; processId?: number; productId?: number }) => { getRouteProductBomList: async (params: { routeId: number; processId?: number; productId?: number }) => {
return await request.get({ url: `/mes/pro/route-product-bom/list`, params }) return await request.get({ url: `/mes/pro/route-product-bom/list`, params })
}, },
// 查询工艺路线产品 BOM 详情
getRouteProductBom: async (id: number) => { getRouteProductBom: async (id: number) => {
return await request.get({ url: `/mes/pro/route-product-bom/get?id=` + id }) return await request.get({ url: `/mes/pro/route-product-bom/get?id=` + id })
}, },
// 新增工艺路线产品 BOM
createRouteProductBom: async (data: ProRouteProductBomVO) => { createRouteProductBom: async (data: ProRouteProductBomVO) => {
return await request.post({ url: `/mes/pro/route-product-bom/create`, data }) return await request.post({ url: `/mes/pro/route-product-bom/create`, data })
}, },
// 修改工艺路线产品 BOM
updateRouteProductBom: async (data: ProRouteProductBomVO) => { updateRouteProductBom: async (data: ProRouteProductBomVO) => {
return await request.put({ url: `/mes/pro/route-product-bom/update`, data }) return await request.put({ url: `/mes/pro/route-product-bom/update`, data })
}, },
// 删除工艺路线产品 BOM
deleteRouteProductBom: async (id: number) => { deleteRouteProductBom: async (id: number) => {
return await request.delete({ url: `/mes/pro/route-product-bom/delete?id=` + id }) return await request.delete({ url: `/mes/pro/route-product-bom/delete?id=` + id })
} }

View File

@ -72,6 +72,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CommonStatusEnum } from '@/utils/constants'
import { generateRandomStr } from '@/utils' import { generateRandomStr } from '@/utils'
import { ProRouteApi, ProRouteVO } from '@/api/mes/pro/route' import { ProRouteApi, ProRouteVO } from '@/api/mes/pro/route'
import RouteProcessList from './RouteProcessList.vue' import RouteProcessList from './RouteProcessList.vue'
@ -79,21 +80,20 @@ import RouteProductList from './RouteProductList.vue'
defineOptions({ name: 'RouteForm' }) defineOptions({ name: 'RouteForm' })
// TODO @AI /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/template/TemplateForm.vue const { t } = useI18n() //
const { t } = useI18n() const message = useMessage() //
const message = useMessage()
const dialogVisible = ref(false) const dialogVisible = ref(false) //
const dialogTitle = ref('') const dialogTitle = ref('') //
const formLoading = ref(false) const formLoading = ref(false) // 12
const formType = ref('') const formType = ref('') // create - update -
const activeTab = ref('process') const activeTab = ref('process') // Tab
const formData = ref<ProRouteVO>({ const formData = ref<ProRouteVO>({
id: undefined, id: undefined,
code: '', code: '',
name: '', name: '',
description: '', description: '',
status: 0, // TODO @AI status: CommonStatusEnum.ENABLE,
remark: '' remark: ''
}) })
const formRules = reactive({ const formRules = reactive({
@ -101,7 +101,7 @@ const formRules = reactive({
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }] status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}) })
const formRef = ref() const formRef = ref() // Ref
/** 生成编码 */ /** 生成编码 */
const generateCode = () => { const generateCode = () => {
@ -156,7 +156,7 @@ const resetForm = () => {
code: '', code: '',
name: '', name: '',
description: '', description: '',
status: 0, status: CommonStatusEnum.ENABLE,
remark: '' remark: ''
} }
formRef.value?.resetFields() formRef.value?.resetFields()

View File

@ -148,28 +148,26 @@ import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { ProRouteProcessApi, ProRouteProcessVO } from '@/api/mes/pro/route/process' import { ProRouteProcessApi, ProRouteProcessVO } from '@/api/mes/pro/route/process'
import { ProProcessApi } from '@/api/mes/pro/process' import { ProProcessApi } from '@/api/mes/pro/process'
// TODO @AI /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/template/TemplateIndicatorList.vue
defineOptions({ name: 'RouteProcessList' }) defineOptions({ name: 'RouteProcessList' })
const props = defineProps<{ const props = defineProps<{
routeId: number routeId: number
}>() }>()
const message = useMessage() const message = useMessage() //
const { t } = useI18n() const { t } = useI18n() //
const loading = ref(false) const loading = ref(false) //
const list = ref<ProRouteProcessVO[]>([]) const list = ref<ProRouteProcessVO[]>([]) //
const processList = ref<any[]>([]) const processList = ref<any[]>([]) //
// //
const formVisible = ref(false) const formVisible = ref(false) //
const formTitle = ref('') const formTitle = ref('') //
const formLoading = ref(false) const formLoading = ref(false) //
const formType = ref('') const formType = ref('') // create - update -
const formRef = ref() const formRef = ref() // Ref
const formData = ref<any>({}) const formData = ref<any>({}) //
const formRules = reactive({ const formRules = reactive({
sort: [{ required: true, message: '序号不能为空', trigger: 'blur' }], sort: [{ required: true, message: '序号不能为空', trigger: 'blur' }],
processId: [{ required: true, message: '工序不能为空', trigger: 'change' }], processId: [{ required: true, message: '工序不能为空', trigger: 'change' }],

View File

@ -71,30 +71,28 @@ import { MdItemApi } from '@/api/mes/md/item'
defineOptions({ name: 'RouteProductBomList' }) defineOptions({ name: 'RouteProductBomList' })
// TODO @AI /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/template/TemplateIndicatorList.vue
const props = defineProps<{ const props = defineProps<{
routeId: number routeId: number
productId: number productId: number
productName?: string productName?: string
}>() }>()
const message = useMessage() const message = useMessage() //
const { t } = useI18n() const { t } = useI18n() //
const loading = ref(false) const loading = ref(false) //
const bomList = ref<ProRouteProductBomVO[]>([]) const bomList = ref<ProRouteProductBomVO[]>([]) // BOM
const processList = ref<any[]>([]) const processList = ref<any[]>([]) // Tab
const activeProcessId = ref('') const activeProcessId = ref('') // Tab
const itemList = ref<any[]>([]) const itemList = ref<any[]>([]) //
// //
const formVisible = ref(false) const formVisible = ref(false) //
const formTitle = ref('') const formTitle = ref('') //
const formLoading = ref(false) const formLoading = ref(false) //
const formType = ref('') const formType = ref('') // create - update -
const formRef = ref() const formRef = ref() // Ref
const formData = ref<any>({}) const formData = ref<any>({}) //
const formRules = reactive({ const formRules = reactive({
itemId: [{ required: true, message: 'BOM 物料不能为空', trigger: 'change' }], itemId: [{ required: true, message: 'BOM 物料不能为空', trigger: 'change' }],
quantity: [{ required: true, message: '用料比例不能为空', trigger: 'blur' }] quantity: [{ required: true, message: '用料比例不能为空', trigger: 'blur' }]
@ -115,6 +113,7 @@ const getBomList = async () => {
if (!activeProcessId.value) return if (!activeProcessId.value) return
loading.value = true loading.value = true
try { try {
// TODO @AIlinter
bomList.value = await ProRouteProductBomApi.getRouteProductBomList({ bomList.value = await ProRouteProductBomApi.getRouteProductBomList({
routeId: props.routeId, routeId: props.routeId,
processId: activeProcessId.value, processId: activeProcessId.value,

View File

@ -106,29 +106,27 @@ const props = defineProps<{
routeId: number routeId: number
}>() }>()
// TODO @AI /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/template/TemplateIndicatorList.vue const message = useMessage() //
const { t } = useI18n() //
const message = useMessage() const loading = ref(false) //
const { t } = useI18n() const list = ref<ProRouteProductVO[]>([]) //
const itemList = ref<any[]>([]) //
const loading = ref(false)
const list = ref<ProRouteProductVO[]>([])
const itemList = ref<any[]>([])
// //
const formVisible = ref(false) const formVisible = ref(false) //
const formTitle = ref('') const formTitle = ref('') //
const formLoading = ref(false) const formLoading = ref(false) //
const formType = ref('') const formType = ref('') // create - update -
const formRef = ref() const formRef = ref() // Ref
const formData = ref<any>({}) const formData = ref<any>({}) //
const formRules = reactive({ const formRules = reactive({
itemId: [{ required: true, message: '产品不能为空', trigger: 'change' }] itemId: [{ required: true, message: '产品不能为空', trigger: 'change' }]
}) })
// BOM // BOM
const bomDialogVisible = ref(false) const bomDialogVisible = ref(false) // BOM
const currentProduct = ref<any>({}) const currentProduct = ref<any>({}) //
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {

View File

@ -1,5 +1,4 @@
<!-- MES 工艺路线列表 --> <!-- MES 工艺路线列表 -->
<!-- TODO @AI对齐下字段前缀需要加工艺路线不限于编码名称说明 -->
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
@ -10,19 +9,19 @@
:inline="true" :inline="true"
label-width="68px" label-width="68px"
> >
<el-form-item label="编码" prop="code"> <el-form-item label="路线编码" prop="code">
<el-input <el-input
v-model="queryParams.code" v-model="queryParams.code"
placeholder="请输入编码" placeholder="请输入工艺路线编码"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="名称" prop="name"> <el-form-item label="路线名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
placeholder="请输入名称" placeholder="请输入工艺路线名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
@ -65,12 +64,18 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编码" align="center" prop="code" width="180" /> <el-table-column label="路线编码" align="center" prop="code" width="180" />
<el-table-column label="名称" align="center" prop="name" width="200" /> <el-table-column label="路线名称" align="center" prop="name" width="200" />
<el-table-column label="说明" align="center" prop="description" min-width="200" /> <el-table-column label="路线说明" align="center" prop="description" min-width="200" />
<el-table-column label="状态" align="center" prop="status" width="100"> <el-table-column label="状态" align="center" prop="status" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
:disabled="!checkPermi(['mes:pro-route:update'])"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="120" /> <el-table-column label="备注" align="center" prop="remark" min-width="120" />
@ -83,7 +88,8 @@
/> />
<el-table-column label="操作" align="center" width="150"> <el-table-column label="操作" align="center" width="150">
<template #default="scope"> <template #default="scope">
<!-- TODO @AI增加一个启用禁用操作 --> <!-- TODO @AI开启和关闭还是做成按钮好一点 -->
<!-- TODO @AI开启后不允许关闭删除前后端都要限制关联表都要限制 -->
<el-button <el-button
link link
type="primary" type="primary"
@ -119,18 +125,20 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import { CommonStatusEnum } from '@/utils/constants'
import { checkPermi } from '@/utils/permission'
import download from '@/utils/download' import download from '@/utils/download'
import { ProRouteApi, ProRouteVO } from '@/api/mes/pro/route' import { ProRouteApi, ProRouteVO } from '@/api/mes/pro/route'
import RouteForm from './RouteForm.vue' import RouteForm from './RouteForm.vue'
defineOptions({ name: 'MesProRoute' }) defineOptions({ name: 'MesProRoute' })
const message = useMessage() const message = useMessage() //
const { t } = useI18n() const { t } = useI18n() //
const loading = ref(true) const loading = ref(true) //
const list = ref<ProRouteVO[]>([]) const list = ref<ProRouteVO[]>([]) //
const total = ref(0) const total = ref(0) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
@ -138,8 +146,8 @@ const queryParams = reactive({
name: undefined, name: undefined,
status: undefined status: undefined
}) })
const queryFormRef = ref() const queryFormRef = ref() //
const exportLoading = ref(false) const exportLoading = ref(false) //
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -171,6 +179,23 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id) formRef.value.open(type, id)
} }
/** 修改工艺路线状态 */
const handleStatusChange = async (row: ProRouteVO) => {
try {
//
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.name + '"工艺路线吗?')
//
await ProRouteApi.updateRouteStatus(row.id!, row.status)
//
await getList()
} catch {
//
row.status =
row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE
}
}
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {
try { try {