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

View File

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

View File

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

View File

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

View File

@ -72,6 +72,7 @@
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CommonStatusEnum } from '@/utils/constants'
import { generateRandomStr } from '@/utils'
import { ProRouteApi, ProRouteVO } from '@/api/mes/pro/route'
import RouteProcessList from './RouteProcessList.vue'
@ -79,21 +80,20 @@ import RouteProductList from './RouteProductList.vue'
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 message = useMessage()
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false)
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const activeTab = ref('process')
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const activeTab = ref('process') // Tab
const formData = ref<ProRouteVO>({
id: undefined,
code: '',
name: '',
description: '',
status: 0, // TODO @AI
status: CommonStatusEnum.ENABLE,
remark: ''
})
const formRules = reactive({
@ -101,7 +101,7 @@ const formRules = reactive({
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref()
const formRef = ref() // Ref
/** 生成编码 */
const generateCode = () => {
@ -156,7 +156,7 @@ const resetForm = () => {
code: '',
name: '',
description: '',
status: 0,
status: CommonStatusEnum.ENABLE,
remark: ''
}
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 { 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' })
const props = defineProps<{
routeId: number
}>()
const message = useMessage()
const { t } = useI18n()
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(false)
const list = ref<ProRouteProcessVO[]>([])
const processList = ref<any[]>([])
const loading = ref(false) //
const list = ref<ProRouteProcessVO[]>([]) //
const processList = ref<any[]>([]) //
//
const formVisible = ref(false)
const formTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
const formData = ref<any>({})
const formVisible = ref(false) //
const formTitle = ref('') //
const formLoading = ref(false) //
const formType = ref('') // create - update -
const formRef = ref() // Ref
const formData = ref<any>({}) //
const formRules = reactive({
sort: [{ required: true, message: '序号不能为空', trigger: 'blur' }],
processId: [{ required: true, message: '工序不能为空', trigger: 'change' }],

View File

@ -71,30 +71,28 @@ import { MdItemApi } from '@/api/mes/md/item'
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<{
routeId: number
productId: number
productName?: string
}>()
const message = useMessage()
const { t } = useI18n()
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(false)
const bomList = ref<ProRouteProductBomVO[]>([])
const processList = ref<any[]>([])
const activeProcessId = ref('')
const itemList = ref<any[]>([])
const loading = ref(false) //
const bomList = ref<ProRouteProductBomVO[]>([]) // BOM
const processList = ref<any[]>([]) // Tab
const activeProcessId = ref('') // Tab
const itemList = ref<any[]>([]) //
//
const formVisible = ref(false)
const formTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
const formData = ref<any>({})
const formVisible = ref(false) //
const formTitle = ref('') //
const formLoading = ref(false) //
const formType = ref('') // create - update -
const formRef = ref() // Ref
const formData = ref<any>({}) //
const formRules = reactive({
itemId: [{ required: true, message: 'BOM 物料不能为空', trigger: 'change' }],
quantity: [{ required: true, message: '用料比例不能为空', trigger: 'blur' }]
@ -115,6 +113,7 @@ const getBomList = async () => {
if (!activeProcessId.value) return
loading.value = true
try {
// TODO @AIlinter
bomList.value = await ProRouteProductBomApi.getRouteProductBomList({
routeId: props.routeId,
processId: activeProcessId.value,

View File

@ -106,29 +106,27 @@ const props = defineProps<{
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 { t } = useI18n()
const loading = ref(false)
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 formTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
const formData = ref<any>({})
const formVisible = ref(false) //
const formTitle = ref('') //
const formLoading = ref(false) //
const formType = ref('') // create - update -
const formRef = ref() // Ref
const formData = ref<any>({}) //
const formRules = reactive({
itemId: [{ required: true, message: '产品不能为空', trigger: 'change' }]
})
// BOM
const bomDialogVisible = ref(false)
const currentProduct = ref<any>({})
const bomDialogVisible = ref(false) // BOM
const currentProduct = ref<any>({}) //
/** 查询列表 */
const getList = async () => {

View File

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