diff --git a/apps/web-antd/src/views/mes/pro/process/components/pro-process-select.vue b/apps/web-antd/src/views/mes/pro/process/components/pro-process-select.vue index ad50ee802..2b45520a3 100644 --- a/apps/web-antd/src/views/mes/pro/process/components/pro-process-select.vue +++ b/apps/web-antd/src/views/mes/pro/process/components/pro-process-select.vue @@ -39,6 +39,7 @@ const selectValue = computed({ }, }); +// TODO @AI:是不是要写注释; function handleFilter(input: string, option: any) { const keyword = input.toLowerCase(); const item = option?.item as MesProProcessApi.Process | undefined; diff --git a/apps/web-antd/src/views/mes/pro/process/data.ts b/apps/web-antd/src/views/mes/pro/process/data.ts index ff8089acd..c4c8ed503 100644 --- a/apps/web-antd/src/views/mes/pro/process/data.ts +++ b/apps/web-antd/src/views/mes/pro/process/data.ts @@ -40,6 +40,7 @@ export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { { type: 'default', onClick: async () => { + // TODO @AI:需要 try catch 么?感觉直接去掉也可以? try { const code = await generateAutoCode( MesAutoCodeRuleCode.PRO_PROCESS_CODE, diff --git a/apps/web-antd/src/views/mes/pro/process/modules/content-list.vue b/apps/web-antd/src/views/mes/pro/process/modules/content-list.vue index b54968069..15757bcf4 100644 --- a/apps/web-antd/src/views/mes/pro/process/modules/content-list.vue +++ b/apps/web-antd/src/views/mes/pro/process/modules/content-list.vue @@ -60,6 +60,7 @@ async function getList() { /** 新增工序步骤 */ function handleCreate() { + // TODO @AI:是不是可以直接 max 然后 || 0; const maxSort = list.value.length > 0 ? Math.max(...list.value.map((item) => item.sort || 0)) diff --git a/apps/web-antd/src/views/mes/pro/route/data.ts b/apps/web-antd/src/views/mes/pro/route/data.ts index f7565ce9f..1e6f7218e 100644 --- a/apps/web-antd/src/views/mes/pro/route/data.ts +++ b/apps/web-antd/src/views/mes/pro/route/data.ts @@ -14,6 +14,10 @@ import { Button } from 'ant-design-vue'; import { z } from '#/adapter/form'; import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { + MdItemSelect, + MdProductBomSelect, +} from '#/views/mes/md/item/components'; import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; /** 工艺路线表单 */ @@ -333,3 +337,119 @@ export function useRouteProductBomGridColumns(): VxeTableGridOptions void, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + // 产品物料:使用业务自定义选择器,change 回填编码/名称/规格/单位 + { + fieldName: 'itemId', + label: '产品', + component: MdItemSelect as any, + componentProps: { + onChange: onItemChange, + }, + formItemClass: 'col-span-2', + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '生产数量', + component: 'InputNumber', + componentProps: { class: '!w-full', min: 1, precision: 0 }, + rules: z.number().default(1), + }, + { + fieldName: 'productionTime', + label: '生产用时', + component: 'InputNumber', + componentProps: { class: '!w-full', min: 0, precision: 2 }, + rules: z.number().default(1), + }, + { + fieldName: 'timeUnitType', + label: '时间单位', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_TIME_UNIT_TYPE), + placeholder: '请选择', + }, + rules: z.string().default('MINUTE'), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { maxLength: 250, placeholder: '请输入备注', rows: 2 }, + }, + ]; +} + +/** 工艺路线产品 BOM 表单 */ +export function useRouteProductBomFormSchema( + itemId: () => number, + onBomChange?: (bom: any) => void, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'processId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'productId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + // BOM 物料:依赖产品物料,使用业务自定义选择器 + { + fieldName: 'itemId', + label: 'BOM 物料', + component: MdProductBomSelect as any, + componentProps: () => ({ + itemId: itemId(), + onChange: onBomChange, + placeholder: '请选择 BOM 物料', + }), + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '用料比例', + component: 'InputNumber', + componentProps: { class: '!w-full', min: 0, precision: 2 }, + rules: z.number().default(1), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { maxLength: 250, placeholder: '请输入备注', rows: 2 }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/pro/route/modules/bom-form.vue b/apps/web-antd/src/views/mes/pro/route/modules/bom-form.vue new file mode 100644 index 000000000..e2d51c132 --- /dev/null +++ b/apps/web-antd/src/views/mes/pro/route/modules/bom-form.vue @@ -0,0 +1,112 @@ + + + diff --git a/apps/web-antd/src/views/mes/pro/route/modules/form.vue b/apps/web-antd/src/views/mes/pro/route/modules/form.vue index baf0d7921..d9a64fdec 100644 --- a/apps/web-antd/src/views/mes/pro/route/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/route/modules/form.vue @@ -48,8 +48,10 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-2', }); +// TODO @AI:注释风格,是不是和别的没对齐 formApi.setState({ schema: useFormSchema(formApi) }); +// TODO @AI:注释风格,是不是和别的没对齐 const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { diff --git a/apps/web-antd/src/views/mes/pro/route/modules/process-form.vue b/apps/web-antd/src/views/mes/pro/route/modules/process-form.vue index 5b1411c9b..218f99032 100644 --- a/apps/web-antd/src/views/mes/pro/route/modules/process-form.vue +++ b/apps/web-antd/src/views/mes/pro/route/modules/process-form.vue @@ -48,6 +48,7 @@ async function loadSchema(): Promise { return useRouteProcessFormSchema(options); } +// TODO @AI:注释风格,是不是和别的没对齐 const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); diff --git a/apps/web-antd/src/views/mes/pro/route/modules/process-list.vue b/apps/web-antd/src/views/mes/pro/route/modules/process-list.vue index 31b2dad8c..aecb0eafa 100644 --- a/apps/web-antd/src/views/mes/pro/route/modules/process-list.vue +++ b/apps/web-antd/src/views/mes/pro/route/modules/process-list.vue @@ -45,6 +45,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ } as VxeTableGridOptions, }); +// TODO @AI:注释风格,是不是和别的没对齐 async function getList() { gridApi.setLoading(true); try { @@ -55,6 +56,7 @@ async function getList() { } } +// TODO @AI:注释风格,是不是和别的没对齐 function handleCreate() { const maxSort = list.value.length > 0 @@ -63,10 +65,12 @@ function handleCreate() { processFormModalApi.setData({ maxSort, routeId: props.routeId }).open(); } +// TODO @AI:注释风格,是不是和别的没对齐 function handleEdit(row: MesProRouteProcessApi.RouteProcess) { processFormModalApi.setData({ id: row.id, routeId: props.routeId, row }).open(); } +// TODO @AI:注释风格,是不是和别的没对齐 async function handleDelete(row: MesProRouteProcessApi.RouteProcess) { await deleteRouteProcess(row.id!); message.success($t('ui.actionMessage.deleteSuccess', ['工艺路线工序'])); diff --git a/apps/web-antd/src/views/mes/pro/route/modules/product-bom-list.vue b/apps/web-antd/src/views/mes/pro/route/modules/product-bom-list.vue index e9f66f9b5..c875379bd 100644 --- a/apps/web-antd/src/views/mes/pro/route/modules/product-bom-list.vue +++ b/apps/web-antd/src/views/mes/pro/route/modules/product-bom-list.vue @@ -1,34 +1,23 @@ - - - - - - - - - - -