From 177cf37c1f7c3efb6b732aa6b9566c42a26072a7 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 28 May 2026 21:59:11 +0800 Subject: [PATCH 01/52] =?UTF-8?q?feat(mes/qc):=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E7=BC=BA=E9=99=B7=E7=B1=BB=E5=9E=8B=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/mes/qc/defect/data.ts | 190 ++++++++++++++++++ .../src/views/mes/qc/defect/index.vue | 147 ++++++++++++++ .../src/views/mes/qc/defect/modules/form.vue | 86 ++++++++ apps/web-ele/src/views/mes/qc/defect/data.ts | 189 +++++++++++++++++ .../web-ele/src/views/mes/qc/defect/index.vue | 147 ++++++++++++++ .../src/views/mes/qc/defect/modules/form.vue | 86 ++++++++ 6 files changed, 845 insertions(+) create mode 100644 apps/web-antd/src/views/mes/qc/defect/data.ts create mode 100644 apps/web-antd/src/views/mes/qc/defect/index.vue create mode 100644 apps/web-antd/src/views/mes/qc/defect/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/qc/defect/data.ts create mode 100644 apps/web-ele/src/views/mes/qc/defect/index.vue create mode 100644 apps/web-ele/src/views/mes/qc/defect/modules/form.vue diff --git a/apps/web-antd/src/views/mes/qc/defect/data.ts b/apps/web-antd/src/views/mes/qc/defect/data.ts new file mode 100644 index 000000000..e9f717ce4 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defect/data.ts @@ -0,0 +1,190 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcDefectApi } from '#/api/mes/qc/defect'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + placeholder: '请输入缺陷编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_DEFECT_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Textarea', + componentProps: { + placeholder: '请输入缺陷描述', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入缺陷编码', + }, + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入缺陷描述', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '缺陷编码', + width: 140, + }, + { + field: 'name', + title: '缺陷描述', + minWidth: 200, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'level', + title: '缺陷等级', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DEFECT_LEVEL }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/qc/defect/index.vue b/apps/web-antd/src/views/mes/qc/defect/index.vue new file mode 100644 index 000000000..62b17721a --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defect/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/defect/modules/form.vue b/apps/web-antd/src/views/mes/qc/defect/modules/form.vue new file mode 100644 index 000000000..a3dc3badf --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defect/modules/form.vue @@ -0,0 +1,86 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/defect/data.ts b/apps/web-ele/src/views/mes/qc/defect/data.ts new file mode 100644 index 000000000..622753830 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/defect/data.ts @@ -0,0 +1,189 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcDefectApi } from '#/api/mes/qc/defect'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + placeholder: '请输入缺陷编码', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_DEFECT_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Textarea', + componentProps: { + placeholder: '请输入缺陷描述', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入缺陷编码', + }, + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入缺陷描述', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '缺陷编码', + width: 140, + }, + { + field: 'name', + title: '缺陷描述', + minWidth: 200, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'level', + title: '缺陷等级', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DEFECT_LEVEL }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/qc/defect/index.vue b/apps/web-ele/src/views/mes/qc/defect/index.vue new file mode 100644 index 000000000..c3897549d --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/defect/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/defect/modules/form.vue b/apps/web-ele/src/views/mes/qc/defect/modules/form.vue new file mode 100644 index 000000000..0b0ce0cd6 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/defect/modules/form.vue @@ -0,0 +1,86 @@ + + + From 0ec301cfb3b2c43c96bca6cf0e64bb24b508484e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 28 May 2026 23:22:44 +0800 Subject: [PATCH 02/52] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E5=BC=B9=E7=AA=97=E8=B0=83=E7=94=A8=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=BC=80=E5=8F=91=E4=BB=A3=E7=90=86=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/ai/image/manager/index.vue | 29 +++++++------- .../src/views/ai/knowledge/document/index.vue | 29 +++++++------- .../src/views/ai/knowledge/segment/index.vue | 25 ++++++------ .../src/views/ai/music/manager/index.vue | 29 +++++++------- .../crm/business/components/detail-list.vue | 36 ++++++++---------- .../crm/contact/components/detail-list.vue | 36 ++++++++---------- .../src/views/crm/permission/modules/list.vue | 38 +++++++++---------- .../src/views/erp/finance/account/index.vue | 29 +++++++------- .../src/views/erp/stock/warehouse/index.vue | 29 +++++++------- .../src/views/mall/product/comment/index.vue | 31 +++++++-------- .../mall/promotion/coupon/template/index.vue | 25 ++++++------ .../mall/promotion/seckill/config/index.vue | 29 +++++++------- .../views/mall/trade/brokerage/user/index.vue | 33 ++++++++-------- .../src/views/pay/app/index.vue | 31 +++++++-------- .../src/views/system/user/index.vue | 25 ++++++------ .../web-naive/src/views/system/user/index.vue | 25 ++++++------ .../src/views/system/user/index.vue | 25 ++++++------ 17 files changed, 225 insertions(+), 279 deletions(-) diff --git a/apps/web-antdv-next/src/views/ai/image/manager/index.vue b/apps/web-antdv-next/src/views/ai/image/manager/index.vue index 189d2bfcb..66bb21196 100644 --- a/apps/web-antdv-next/src/views/ai/image/manager/index.vue +++ b/apps/web-antdv-next/src/views/ai/image/manager/index.vue @@ -38,24 +38,21 @@ async function handleUpdatePublicStatusChange( row: AiImageApi.Image, ): Promise { const text = newStatus ? '公开' : '私有'; - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确认要将该图片切换为【${text}】吗?`, - }) - .then(async () => { - // 更新图片状态 - await updateImage({ - id: row.id, - publicStatus: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新图片状态 + await updateImage({ + id: row.id, + publicStatus: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/ai/knowledge/document/index.vue b/apps/web-antdv-next/src/views/ai/knowledge/document/index.vue index 798f0404c..2c2d49cc5 100644 --- a/apps/web-antdv-next/src/views/ai/knowledge/document/index.vue +++ b/apps/web-antdv-next/src/views/ai/knowledge/document/index.vue @@ -76,24 +76,21 @@ async function handleStatusChange( newStatus: number, row: AiKnowledgeDocumentApi.KnowledgeDocument, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.name}的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新文档状态 - await updateKnowledgeDocumentStatus({ - id: row.id, - status: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新文档状态 + await updateKnowledgeDocumentStatus({ + id: row.id, + status: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/ai/knowledge/segment/index.vue b/apps/web-antdv-next/src/views/ai/knowledge/segment/index.vue index 0ac3c4f75..836878c9f 100644 --- a/apps/web-antdv-next/src/views/ai/knowledge/segment/index.vue +++ b/apps/web-antdv-next/src/views/ai/knowledge/segment/index.vue @@ -64,21 +64,18 @@ async function handleStatusChange( newStatus: number, row: AiKnowledgeSegmentApi.KnowledgeSegment, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将片段 ${row.id} 的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新片段状态 - await updateKnowledgeSegmentStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新片段状态 + await updateKnowledgeSegmentStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/ai/music/manager/index.vue b/apps/web-antdv-next/src/views/ai/music/manager/index.vue index 784dfff2d..f29075cd6 100644 --- a/apps/web-antdv-next/src/views/ai/music/manager/index.vue +++ b/apps/web-antdv-next/src/views/ai/music/manager/index.vue @@ -38,24 +38,21 @@ async function handleUpdatePublicStatusChange( row: AiMusicApi.Music, ): Promise { const text = newStatus ? '公开' : '私有'; - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确认要将该音乐切换为【${text}】吗?`, - }) - .then(async () => { - // 更新音乐状态 - await updateMusic({ - id: row.id, - publicStatus: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新音乐状态 + await updateMusic({ + id: row.id, + publicStatus: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/crm/business/components/detail-list.vue b/apps/web-antdv-next/src/views/crm/business/components/detail-list.vue index 66cefb628..d2f21c211 100644 --- a/apps/web-antdv-next/src/views/crm/business/components/detail-list.vue +++ b/apps/web-antdv-next/src/views/crm/business/components/detail-list.vue @@ -74,28 +74,24 @@ async function handleDeleteContactBusinessList() { message.error('请先选择商机后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`, - }) - .then(async () => { - const res = await deleteContactBusinessList({ - contactId: props.bizId, - businessIds: checkedRows.value.map((item) => item.id), - }); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error($t('ui.actionMessage.operationFailed'))); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + const res = await deleteContactBusinessList({ + contactId: props.bizId, + businessIds: checkedRows.value.map((item) => item.id), }); + if (!res) { + throw new Error($t('ui.actionMessage.operationFailed')); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 查看商机详情 */ diff --git a/apps/web-antdv-next/src/views/crm/contact/components/detail-list.vue b/apps/web-antdv-next/src/views/crm/contact/components/detail-list.vue index 0b026d358..3948a4282 100644 --- a/apps/web-antdv-next/src/views/crm/contact/components/detail-list.vue +++ b/apps/web-antdv-next/src/views/crm/contact/components/detail-list.vue @@ -71,28 +71,24 @@ async function handleDeleteContactBusinessList() { message.error('请先选择联系人后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`, - }) - .then(async () => { - const res = await deleteBusinessContactList({ - businessId: props.bizId, - contactIds: checkedRows.value.map((item) => item.id), - }); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error($t('ui.actionMessage.operationFailed'))); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + const res = await deleteBusinessContactList({ + businessId: props.bizId, + contactIds: checkedRows.value.map((item) => item.id), }); + if (!res) { + throw new Error($t('ui.actionMessage.operationFailed')); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 创建商机联系人关联 */ diff --git a/apps/web-antdv-next/src/views/crm/permission/modules/list.vue b/apps/web-antdv-next/src/views/crm/permission/modules/list.vue index ddb2674d0..8fb577ca2 100644 --- a/apps/web-antdv-next/src/views/crm/permission/modules/list.vue +++ b/apps/web-antdv-next/src/views/crm/permission/modules/list.vue @@ -94,32 +94,28 @@ function handleEdit() { } /** 删除团队成员 */ -function handleDelete() { +async function handleDelete() { if (checkedRows.value.length === 0) { message.error('请先选择团队成员后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${checkedRows.value.map((item) => item.nickname).join(',')}移出团队吗?`, - }) - .then(async () => { - const res = await deletePermissionBatch( - checkedRows.value.map((item) => item.id!), - ); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error('移出失败')); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + const res = await deletePermissionBatch( + checkedRows.value.map((item) => item.id!), + ); + if (!res) { + throw new Error('移出失败'); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 退出团队 */ diff --git a/apps/web-antdv-next/src/views/erp/finance/account/index.vue b/apps/web-antdv-next/src/views/erp/finance/account/index.vue index 77784b167..0337b512b 100644 --- a/apps/web-antdv-next/src/views/erp/finance/account/index.vue +++ b/apps/web-antdv-next/src/views/erp/finance/account/index.vue @@ -65,23 +65,20 @@ async function handleDefaultStatusChange( newStatus: boolean, row: ErpAccountApi.Account, ): Promise { - return new Promise((resolve, reject) => { - const text = newStatus ? '设置' : '取消'; - confirm({ + const text = newStatus ? '设置' : '取消'; + try { + await confirm({ content: `确认要${text}"${row.name}"默认吗?`, - }) - .then(async () => { - // 更新默认状态 - await updateAccountDefaultStatus(row.id!, newStatus); - // 提示并返回成功 - message.success(`${text}默认成功`); - handleRefresh(); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新默认状态 + await updateAccountDefaultStatus(row.id!, newStatus); + // 提示并返回成功 + message.success(`${text}默认成功`); + handleRefresh(); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/erp/stock/warehouse/index.vue b/apps/web-antdv-next/src/views/erp/stock/warehouse/index.vue index 195127981..9dec3ce96 100644 --- a/apps/web-antdv-next/src/views/erp/stock/warehouse/index.vue +++ b/apps/web-antdv-next/src/views/erp/stock/warehouse/index.vue @@ -63,23 +63,20 @@ async function handleDefaultStatusChange( newStatus: boolean, row: ErpWarehouseApi.Warehouse, ): Promise { - return new Promise((resolve, reject) => { - const text = newStatus ? '设置' : '取消'; - confirm({ + const text = newStatus ? '设置' : '取消'; + try { + await confirm({ content: `确认要${text}"${row.name}"默认吗?`, - }) - .then(async () => { - // 更新默认状态 - await updateWarehouseDefaultStatus(row.id!, newStatus); - // 提示并返回成功 - message.success(`${text}默认成功`); - handleRefresh(); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新默认状态 + await updateWarehouseDefaultStatus(row.id!, newStatus); + // 提示并返回成功 + message.success(`${text}默认成功`); + handleRefresh(); + return true; } const [FormModal, formModalApi] = useVbenModal({ diff --git a/apps/web-antdv-next/src/views/mall/product/comment/index.vue b/apps/web-antdv-next/src/views/mall/product/comment/index.vue index 72f18e1aa..2baa7e484 100644 --- a/apps/web-antdv-next/src/views/mall/product/comment/index.vue +++ b/apps/web-antdv-next/src/views/mall/product/comment/index.vue @@ -63,25 +63,22 @@ async function handleStatusChange( newStatus: boolean, row: MallCommentApi.Comment, ): Promise { - return new Promise((resolve, reject) => { - const text = newStatus ? '展示' : '隐藏'; - confirm({ + const text = newStatus ? '展示' : '隐藏'; + try { + await confirm({ content: `确认要${text}该评论吗?`, - }) - .then(async () => { - // 更新状态 - await updateCommentVisible({ - id: row.id!, - visible: newStatus, - }); - // 提示并返回成功 - message.success(`${text}成功`); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新状态 + await updateCommentVisible({ + id: row.id!, + visible: newStatus, }); + // 提示并返回成功 + message.success(`${text}成功`); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/mall/promotion/coupon/template/index.vue b/apps/web-antdv-next/src/views/mall/promotion/coupon/template/index.vue index 1b08b40f1..9cf786b9f 100644 --- a/apps/web-antdv-next/src/views/mall/promotion/coupon/template/index.vue +++ b/apps/web-antdv-next/src/views/mall/promotion/coupon/template/index.vue @@ -60,21 +60,18 @@ async function handleStatusChange( newStatus: number, row: MallCouponTemplateApi.CouponTemplate, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.name}的状态切换为【${newStatus === CommonStatusEnum.ENABLE ? '启用' : '停用'}】吗?`, - }) - .then(async () => { - // 更新优惠券模板状态 - await updateCouponTemplateStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新优惠券模板状态 + await updateCouponTemplateStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/mall/promotion/seckill/config/index.vue b/apps/web-antdv-next/src/views/mall/promotion/seckill/config/index.vue index 2740484e9..038abe3d1 100644 --- a/apps/web-antdv-next/src/views/mall/promotion/seckill/config/index.vue +++ b/apps/web-antdv-next/src/views/mall/promotion/seckill/config/index.vue @@ -59,23 +59,20 @@ async function handleStatusChange( newStatus: number, row: MallSeckillConfigApi.SeckillConfig, ): Promise { - return new Promise((resolve, reject) => { - // 二次确认 - const text = row.status === 0 ? '启用' : '停用'; - confirm({ + // 二次确认 + const text = row.status === 0 ? '启用' : '停用'; + try { + await confirm({ content: `确认要${text + row.name}吗?`, - }) - .then(async () => { - // 更新状态 - await updateSeckillConfigStatus(row.id, newStatus); - // 提示并返回成功 - message.success(`${text}成功`); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新状态 + await updateSeckillConfigStatus(row.id, newStatus); + // 提示并返回成功 + message.success(`${text}成功`); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/mall/trade/brokerage/user/index.vue b/apps/web-antdv-next/src/views/mall/trade/brokerage/user/index.vue index 297669bc1..2db85c26c 100644 --- a/apps/web-antdv-next/src/views/mall/trade/brokerage/user/index.vue +++ b/apps/web-antdv-next/src/views/mall/trade/brokerage/user/index.vue @@ -87,26 +87,23 @@ async function handleBrokerageEnabledChange( newEnabled: boolean, row: MallBrokerageUserApi.BrokerageUser, ): Promise { - return new Promise((resolve, reject) => { - const text = newEnabled ? '开通' : '关闭'; - confirm({ + const text = newEnabled ? '开通' : '关闭'; + try { + await confirm({ content: `你要将${row.nickname}的推广资格切换为【${text}】吗?`, - }) - .then(async () => { - // 更新推广资格 - await updateBrokerageEnabled({ - id: row.id!, - enabled: newEnabled, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新推广资格 + await updateBrokerageEnabled({ + id: row.id!, + enabled: newEnabled, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antdv-next/src/views/pay/app/index.vue b/apps/web-antdv-next/src/views/pay/app/index.vue index 3be8e5b28..415079f6e 100644 --- a/apps/web-antdv-next/src/views/pay/app/index.vue +++ b/apps/web-antdv-next/src/views/pay/app/index.vue @@ -65,25 +65,22 @@ async function handleStatusChange( newStatus: number, row: PayAppApi.App, ): Promise { - return new Promise((resolve, reject) => { - const text = newStatus === CommonStatusEnum.ENABLE ? '启用' : '停用'; - confirm({ + const text = newStatus === CommonStatusEnum.ENABLE ? '启用' : '停用'; + try { + await confirm({ content: `确认要${text + row.name}应用吗?`, - }) - .then(async () => { - // 更新状态 - await updateAppStatus({ - id: row.id!, - status: newStatus, - }); - // 提示并返回成功 - message.success(`${text}成功`); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新状态 + await updateAppStatus({ + id: row.id!, + status: newStatus, }); + // 提示并返回成功 + message.success(`${text}成功`); + return true; } /** 生成渠道配置按钮 */ diff --git a/apps/web-antdv-next/src/views/system/user/index.vue b/apps/web-antdv-next/src/views/system/user/index.vue index 3d20f2104..b8191bbcf 100644 --- a/apps/web-antdv-next/src/views/system/user/index.vue +++ b/apps/web-antdv-next/src/views/system/user/index.vue @@ -138,21 +138,18 @@ async function handleStatusChange( newStatus: number, row: SystemUserApi.User, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.username}的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新用户状态 - await updateUserStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新用户状态 + await updateUserStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-naive/src/views/system/user/index.vue b/apps/web-naive/src/views/system/user/index.vue index 29c5a28a0..b92293197 100644 --- a/apps/web-naive/src/views/system/user/index.vue +++ b/apps/web-naive/src/views/system/user/index.vue @@ -138,21 +138,18 @@ async function handleStatusChange( newStatus: number, row: SystemUserApi.User, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.username}的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新用户状态 - await updateUserStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新用户状态 + await updateUserStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-tdesign/src/views/system/user/index.vue b/apps/web-tdesign/src/views/system/user/index.vue index c8d8645be..fd881c31e 100644 --- a/apps/web-tdesign/src/views/system/user/index.vue +++ b/apps/web-tdesign/src/views/system/user/index.vue @@ -139,21 +139,18 @@ async function handleStatusChange( newStatus: number, row: SystemUserApi.User, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.username}的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新用户状态 - await updateUserStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新用户状态 + await updateUserStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ From 16d6ab072242cddcd6288a60765baa20d3fb2ba0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 00:38:14 +0800 Subject: [PATCH 03/52] =?UTF-8?q?feat(mes/qc):=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E8=B4=A8=E6=A3=80=E6=8C=87=E6=A0=87=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/qc/indicator/components/index.ts | 2 + .../components/qc-indicator-select-dialog.vue | 201 +++++++++++ .../components/qc-indicator-select.vue | 134 ++++++++ .../src/views/mes/qc/indicator/data.ts | 315 ++++++++++++++++++ .../src/views/mes/qc/indicator/index.vue | 151 +++++++++ .../views/mes/qc/indicator/modules/form.vue | 92 +++++ .../mes/qc/indicator/components/index.ts | 2 + .../components/qc-indicator-select-dialog.vue | 200 +++++++++++ .../components/qc-indicator-select.vue | 132 ++++++++ .../src/views/mes/qc/indicator/data.ts | 314 +++++++++++++++++ .../src/views/mes/qc/indicator/index.vue | 151 +++++++++ .../views/mes/qc/indicator/modules/form.vue | 92 +++++ 12 files changed, 1786 insertions(+) create mode 100644 apps/web-antd/src/views/mes/qc/indicator/components/index.ts create mode 100644 apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue create mode 100644 apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select.vue create mode 100644 apps/web-antd/src/views/mes/qc/indicator/data.ts create mode 100644 apps/web-antd/src/views/mes/qc/indicator/index.vue create mode 100644 apps/web-antd/src/views/mes/qc/indicator/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/qc/indicator/components/index.ts create mode 100644 apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue create mode 100644 apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select.vue create mode 100644 apps/web-ele/src/views/mes/qc/indicator/data.ts create mode 100644 apps/web-ele/src/views/mes/qc/indicator/index.vue create mode 100644 apps/web-ele/src/views/mes/qc/indicator/modules/form.vue diff --git a/apps/web-antd/src/views/mes/qc/indicator/components/index.ts b/apps/web-antd/src/views/mes/qc/indicator/components/index.ts new file mode 100644 index 000000000..5958cc7c5 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/components/index.ts @@ -0,0 +1,2 @@ +export { default as QcIndicatorSelectDialog } from './qc-indicator-select-dialog.vue'; +export { default as QcIndicatorSelect } from './qc-indicator-select.vue'; diff --git a/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue b/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue new file mode 100644 index 000000000..ecc671b3f --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue @@ -0,0 +1,201 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select.vue b/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select.vue new file mode 100644 index 000000000..7857d06f2 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/components/qc-indicator-select.vue @@ -0,0 +1,134 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/indicator/data.ts b/apps/web-antd/src/views/mes/qc/indicator/data.ts new file mode 100644 index 000000000..2a2c600bb --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/data.ts @@ -0,0 +1,315 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcIndicatorApi } from '#/api/mes/qc/indicator'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleDictTypeList } from '#/api/system/dict/type'; +import { + MesAutoCodeRuleCode, + MesQcResultValueType, +} from '#/views/mes/utils/constants'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + maxlength: 64, + placeholder: '请输入检测项编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_INDICATOR_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测项名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'tool', + label: '检测工具', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测工具', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + allowClear: true, + // 结果值类型变化时清空结果值属性 + onChange: () => + formApi?.setFieldValue('resultSpecification', undefined), + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + rules: 'required', + }, + { + fieldName: 'resultSpecification', + label: '文件类型', + component: 'RadioGroup', + componentProps: { + options: [ + { label: '图片/照片', value: 'IMG' }, + { label: '文件', value: 'FILE' }, + ], + }, + dependencies: { + triggerFields: ['resultType'], + show: (values) => values.resultType === MesQcResultValueType.FILE, + }, + rules: 'required', + }, + { + fieldName: 'resultSpecification', + label: '字典类型', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleDictTypeList, + filterOption: (input: string, option: any) => + (option.label as string).toLowerCase().includes(input.toLowerCase()), + labelField: 'name', + placeholder: '请选择字典类型', + showSearch: true, + valueField: 'type', + }, + dependencies: { + triggerFields: ['resultType'], + show: (values) => values.resultType === MesQcResultValueType.DICT, + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxlength: 250, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项编码', + }, + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 140, + }, + { + field: 'resultType', + title: '结果值类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_QC_RESULT_TYPE }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 选择弹窗的搜索表单 */ +export function useSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + ]; +} + +/** 选择弹窗的字段 */ +export function useSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { + type: multiple ? 'checkbox' : 'radio', + width: 50, + }, + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/qc/indicator/index.vue b/apps/web-antd/src/views/mes/qc/indicator/index.vue new file mode 100644 index 000000000..166ec5cb3 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue b/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue new file mode 100644 index 000000000..7b40dbfd1 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/indicator/components/index.ts b/apps/web-ele/src/views/mes/qc/indicator/components/index.ts new file mode 100644 index 000000000..5958cc7c5 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/components/index.ts @@ -0,0 +1,2 @@ +export { default as QcIndicatorSelectDialog } from './qc-indicator-select-dialog.vue'; +export { default as QcIndicatorSelect } from './qc-indicator-select.vue'; diff --git a/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue b/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue new file mode 100644 index 000000000..29697e932 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select-dialog.vue @@ -0,0 +1,200 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select.vue b/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select.vue new file mode 100644 index 000000000..450621c23 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/components/qc-indicator-select.vue @@ -0,0 +1,132 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/indicator/data.ts b/apps/web-ele/src/views/mes/qc/indicator/data.ts new file mode 100644 index 000000000..d227958c9 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/data.ts @@ -0,0 +1,314 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcIndicatorApi } from '#/api/mes/qc/indicator'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleDictTypeList } from '#/api/system/dict/type'; +import { + MesAutoCodeRuleCode, + MesQcResultValueType, +} from '#/views/mes/utils/constants'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + maxlength: 64, + placeholder: '请输入检测项编码', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_INDICATOR_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测项名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'tool', + label: '检测工具', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测工具', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + clearable: true, + // 结果值类型变化时清空结果值属性 + onChange: () => + formApi?.setFieldValue('resultSpecification', undefined), + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + rules: 'required', + }, + { + fieldName: 'resultSpecification', + label: '文件类型', + component: 'RadioGroup', + componentProps: { + options: [ + { label: '图片/照片', value: 'IMG' }, + { label: '文件', value: 'FILE' }, + ], + }, + dependencies: { + triggerFields: ['resultType'], + show: (values) => values.resultType === MesQcResultValueType.FILE, + }, + rules: 'required', + }, + { + fieldName: 'resultSpecification', + label: '字典类型', + component: 'ApiSelect', + componentProps: { + api: getSimpleDictTypeList, + clearable: true, + filterMethod: (input: string, option: any) => + (option.label as string).toLowerCase().includes(input.toLowerCase()), + filterable: true, + labelField: 'name', + placeholder: '请选择字典类型', + valueField: 'type', + }, + dependencies: { + triggerFields: ['resultType'], + show: (values) => values.resultType === MesQcResultValueType.DICT, + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxlength: 250, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入检测项编码', + }, + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 140, + }, + { + field: 'resultType', + title: '结果值类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_QC_RESULT_TYPE }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 选择弹窗的搜索表单 */ +export function useSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + ]; +} + +/** 选择弹窗的字段 */ +export function useSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { + type: multiple ? 'checkbox' : 'radio', + width: 50, + }, + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/qc/indicator/index.vue b/apps/web-ele/src/views/mes/qc/indicator/index.vue new file mode 100644 index 000000000..206b0f062 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue b/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue new file mode 100644 index 000000000..72ed12284 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue @@ -0,0 +1,92 @@ + + + From ec5b607171d25585475edcfbd6f1854ec79d3794 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 08:36:16 +0800 Subject: [PATCH 04/52] =?UTF-8?q?feat(mes/qc):=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E8=B4=A8=E6=A3=80=E6=96=B9=E6=A1=88=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/mes/qc/template/data.ts | 507 +++++++++++++++++ .../src/views/mes/qc/template/index.vue | 172 ++++++ .../views/mes/qc/template/modules/form.vue | 127 +++++ .../qc/template/modules/indicator-form.vue | 97 ++++ .../qc/template/modules/indicator-list.vue | 137 +++++ .../mes/qc/template/modules/item-form.vue | 96 ++++ .../mes/qc/template/modules/item-list.vue | 131 +++++ .../web-ele/src/views/mes/qc/template/data.ts | 514 ++++++++++++++++++ .../src/views/mes/qc/template/index.vue | 172 ++++++ .../views/mes/qc/template/modules/form.vue | 127 +++++ .../qc/template/modules/indicator-form.vue | 97 ++++ .../qc/template/modules/indicator-list.vue | 137 +++++ .../mes/qc/template/modules/item-form.vue | 97 ++++ .../mes/qc/template/modules/item-list.vue | 131 +++++ 14 files changed, 2542 insertions(+) create mode 100644 apps/web-antd/src/views/mes/qc/template/data.ts create mode 100644 apps/web-antd/src/views/mes/qc/template/index.vue create mode 100644 apps/web-antd/src/views/mes/qc/template/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue create mode 100644 apps/web-antd/src/views/mes/qc/template/modules/indicator-list.vue create mode 100644 apps/web-antd/src/views/mes/qc/template/modules/item-form.vue create mode 100644 apps/web-antd/src/views/mes/qc/template/modules/item-list.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/data.ts create mode 100644 apps/web-ele/src/views/mes/qc/template/index.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/modules/indicator-list.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/modules/item-form.vue create mode 100644 apps/web-ele/src/views/mes/qc/template/modules/item-list.vue diff --git a/apps/web-antd/src/views/mes/qc/template/data.ts b/apps/web-antd/src/views/mes/qc/template/data.ts new file mode 100644 index 000000000..ce5268ac7 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/data.ts @@ -0,0 +1,507 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcTemplateApi } from '#/api/mes/qc/template'; +import type { MesQcTemplateIndicatorApi } from '#/api/mes/qc/template/indicator'; +import type { MesQcTemplateItemApi } from '#/api/mes/qc/template/item'; + +import { h, markRaw } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; +import MdUnitMeasureSelect from '#/views/mes/md/unitmeasure/components/md-unit-measure-select.vue'; +import QcIndicatorSelect from '#/views/mes/qc/indicator/components/qc-indicator-select.vue'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '方案编号', + component: 'Input', + componentProps: { + placeholder: '请输入方案编号', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_TEMPLATE_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + placeholder: '请输入方案名称', + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'types', + label: '检测种类', + component: 'Select', + formItemClass: 'col-span-3', + componentProps: { + allowClear: true, + mode: 'multiple', + options: getDictOptions(DICT_TYPE.MES_QC_TYPE, 'number'), + placeholder: '请选择检测种类', + }, + rules: z.array(z.number()).min(1, '检测种类不能为空'), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '方案编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案编号', + }, + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案名称', + }, + }, + { + fieldName: 'type', + label: '检测种类', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_QC_TYPE, 'number'), + placeholder: '请选择检测种类', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '方案编号', + width: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '方案名称', + minWidth: 180, + }, + { + field: 'types', + title: '检测种类', + minWidth: 200, + slots: { default: 'types' }, + }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 检测指标项子表的字段 */ +export function useIndicatorGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'indicatorCode', + title: '检测项编码', + width: 140, + }, + { + field: 'indicatorName', + title: '检测项名称', + minWidth: 150, + }, + { + field: 'indicatorType', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'indicatorTool', + title: '检测工具', + width: 120, + }, + { + field: 'checkMethod', + title: '检测方法', + minWidth: 180, + }, + { + field: 'standardValue', + title: '标准值', + width: 100, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'thresholdMax', + title: '误差上限', + width: 100, + }, + { + field: 'thresholdMin', + title: '误差下限', + width: 100, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 检测指标项子表的表单 */ +export function useIndicatorFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'indicatorId', + label: '质检指标', + component: markRaw(QcIndicatorSelect), + componentProps: { + placeholder: '请选择质检指标', + }, + formItemClass: 'col-span-2', + rules: 'required', + }, + { + fieldName: 'standardValue', + label: '标准值', + component: 'InputNumber', + componentProps: { + class: '!w-full', + precision: 4, + placeholder: '请输入标准值', + }, + }, + { + fieldName: 'unitMeasureId', + label: '计量单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择计量单位', + }, + }, + { + fieldName: 'thresholdMax', + label: '误差上限', + component: 'InputNumber', + componentProps: { + class: '!w-full', + precision: 4, + placeholder: '请输入', + }, + }, + { + fieldName: 'thresholdMin', + label: '误差下限', + component: 'InputNumber', + componentProps: { + class: '!w-full', + precision: 4, + placeholder: '请输入', + }, + }, + { + fieldName: 'checkMethod', + label: '检测方法', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入检测方法', + rows: 3, + }, + }, + { + fieldName: 'docUrl', + label: '说明图URL', + component: 'Input', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入说明图URL', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 产品关联子表的字段 */ +export function useItemGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '物料编码', + width: 130, + }, + { + field: 'itemName', + title: '物料名称', + minWidth: 150, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 130, + }, + { + field: 'unitMeasureName', + title: '计量单位', + width: 100, + }, + { + field: 'quantityCheck', + title: '最低检测数', + width: 110, + }, + { + field: 'quantityUnqualified', + title: '最大不合格数', + width: 120, + formatter: ({ cellValue }) => + cellValue === 0 ? '不启用' : (cellValue ?? ''), + }, + { + field: 'criticalRate', + title: '最大致命缺陷率(%)', + width: 150, + }, + { + field: 'majorRate', + title: '最大严重缺陷率(%)', + width: 150, + }, + { + field: 'minorRate', + title: '最大轻微缺陷率(%)', + width: 150, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 产品关联子表的表单 */ +export function useItemFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + formItemClass: 'col-span-3', + rules: 'required', + }, + { + fieldName: 'quantityCheck', + label: '最低检测数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + placeholder: '请输入最低检测数', + }, + rules: z.number().default(1), + }, + { + fieldName: 'quantityUnqualified', + label: '最大不合格数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '0表示不启用', + }, + rules: z.number().default(0), + help: '超出最大不合格数后整批判定不合格,0表示不启用', + }, + { + fieldName: 'criticalRate', + label: '致命缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + max: 100, + precision: 2, + placeholder: '0表示不允许', + }, + rules: z.number().default(0), + help: '缺陷比例超出后整批判定不合格,0表示不允许出现', + }, + { + fieldName: 'majorRate', + label: '严重缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + max: 100, + precision: 2, + placeholder: '0表示不允许', + }, + rules: z.number().default(0), + help: '缺陷比例超出后整批判定不合格,0表示不允许出现', + }, + { + fieldName: 'minorRate', + label: '轻微缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + max: 100, + precision: 2, + }, + rules: z.number().default(100), + help: '缺陷比例超出后整批判定不合格', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/qc/template/index.vue b/apps/web-antd/src/views/mes/qc/template/index.vue new file mode 100644 index 000000000..e02d8d616 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/template/modules/form.vue b/apps/web-antd/src/views/mes/qc/template/modules/form.vue new file mode 100644 index 000000000..701d0f3fe --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/modules/form.vue @@ -0,0 +1,127 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue b/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue new file mode 100644 index 000000000..cfbd1a238 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue @@ -0,0 +1,97 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/template/modules/indicator-list.vue b/apps/web-antd/src/views/mes/qc/template/modules/indicator-list.vue new file mode 100644 index 000000000..f559ba7f2 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/modules/indicator-list.vue @@ -0,0 +1,137 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue b/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue new file mode 100644 index 000000000..72262de2c --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue @@ -0,0 +1,96 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/template/modules/item-list.vue b/apps/web-antd/src/views/mes/qc/template/modules/item-list.vue new file mode 100644 index 000000000..df41f35e0 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/template/modules/item-list.vue @@ -0,0 +1,131 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/data.ts b/apps/web-ele/src/views/mes/qc/template/data.ts new file mode 100644 index 000000000..490231ac2 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/data.ts @@ -0,0 +1,514 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcTemplateApi } from '#/api/mes/qc/template'; +import type { MesQcTemplateIndicatorApi } from '#/api/mes/qc/template/indicator'; +import type { MesQcTemplateItemApi } from '#/api/mes/qc/template/item'; + +import { h, markRaw } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; +import MdUnitMeasureSelect from '#/views/mes/md/unitmeasure/components/md-unit-measure-select.vue'; +import QcIndicatorSelect from '#/views/mes/qc/indicator/components/qc-indicator-select.vue'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '方案编号', + component: 'Input', + componentProps: { + placeholder: '请输入方案编号', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_TEMPLATE_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + placeholder: '请输入方案名称', + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'types', + label: '检测种类', + component: 'Select', + formItemClass: 'col-span-3', + componentProps: { + clearable: true, + multiple: true, + options: getDictOptions(DICT_TYPE.MES_QC_TYPE, 'number'), + placeholder: '请选择检测种类', + }, + rules: z.array(z.number()).min(1, '检测种类不能为空'), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '方案编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入方案编号', + }, + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入方案名称', + }, + }, + { + fieldName: 'type', + label: '检测种类', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_QC_TYPE, 'number'), + placeholder: '请选择检测种类', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '方案编号', + width: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '方案名称', + minWidth: 180, + }, + { + field: 'types', + title: '检测种类', + minWidth: 200, + slots: { default: 'types' }, + }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 检测指标项子表的字段 */ +export function useIndicatorGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'indicatorCode', + title: '检测项编码', + width: 140, + }, + { + field: 'indicatorName', + title: '检测项名称', + minWidth: 150, + }, + { + field: 'indicatorType', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'indicatorTool', + title: '检测工具', + width: 120, + }, + { + field: 'checkMethod', + title: '检测方法', + minWidth: 180, + }, + { + field: 'standardValue', + title: '标准值', + width: 100, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'thresholdMax', + title: '误差上限', + width: 100, + }, + { + field: 'thresholdMin', + title: '误差下限', + width: 100, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 检测指标项子表的表单 */ +export function useIndicatorFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'indicatorId', + label: '质检指标', + component: markRaw(QcIndicatorSelect), + componentProps: { + placeholder: '请选择质检指标', + }, + formItemClass: 'col-span-2', + rules: 'required', + }, + { + fieldName: 'standardValue', + label: '标准值', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + placeholder: '请输入标准值', + precision: 4, + }, + }, + { + fieldName: 'unitMeasureId', + label: '计量单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择计量单位', + }, + }, + { + fieldName: 'thresholdMax', + label: '误差上限', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + placeholder: '请输入', + precision: 4, + }, + }, + { + fieldName: 'thresholdMin', + label: '误差下限', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + placeholder: '请输入', + precision: 4, + }, + }, + { + fieldName: 'checkMethod', + label: '检测方法', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入检测方法', + rows: 3, + }, + }, + { + fieldName: 'docUrl', + label: '说明图URL', + component: 'Input', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入说明图URL', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 产品关联子表的字段 */ +export function useItemGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '物料编码', + width: 130, + }, + { + field: 'itemName', + title: '物料名称', + minWidth: 150, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 130, + }, + { + field: 'unitMeasureName', + title: '计量单位', + width: 100, + }, + { + field: 'quantityCheck', + title: '最低检测数', + width: 110, + }, + { + field: 'quantityUnqualified', + title: '最大不合格数', + width: 120, + formatter: ({ cellValue }) => + cellValue === 0 ? '不启用' : (cellValue ?? ''), + }, + { + field: 'criticalRate', + title: '最大致命缺陷率(%)', + width: 150, + }, + { + field: 'majorRate', + title: '最大严重缺陷率(%)', + width: 150, + }, + { + field: 'minorRate', + title: '最大轻微缺陷率(%)', + width: 150, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 产品关联子表的表单 */ +export function useItemFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + formItemClass: 'col-span-3', + rules: 'required', + }, + { + fieldName: 'quantityCheck', + label: '最低检测数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 1, + placeholder: '请输入最低检测数', + }, + rules: z.number().default(1), + }, + { + fieldName: 'quantityUnqualified', + label: '最大不合格数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '0表示不启用', + }, + rules: z.number().default(0), + help: '超出最大不合格数后整批判定不合格,0表示不启用', + }, + { + fieldName: 'criticalRate', + label: '致命缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + max: 100, + min: 0, + placeholder: '0表示不允许', + precision: 2, + }, + rules: z.number().default(0), + help: '缺陷比例超出后整批判定不合格,0表示不允许出现', + }, + { + fieldName: 'majorRate', + label: '严重缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + max: 100, + min: 0, + placeholder: '0表示不允许', + precision: 2, + }, + rules: z.number().default(0), + help: '缺陷比例超出后整批判定不合格,0表示不允许出现', + }, + { + fieldName: 'minorRate', + label: '轻微缺陷率(%)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + max: 100, + min: 0, + precision: 2, + }, + rules: z.number().default(100), + help: '缺陷比例超出后整批判定不合格', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/qc/template/index.vue b/apps/web-ele/src/views/mes/qc/template/index.vue new file mode 100644 index 000000000..46088eae1 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/modules/form.vue b/apps/web-ele/src/views/mes/qc/template/modules/form.vue new file mode 100644 index 000000000..bfedadfc5 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/modules/form.vue @@ -0,0 +1,127 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue b/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue new file mode 100644 index 000000000..073ff2ca7 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue @@ -0,0 +1,97 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/modules/indicator-list.vue b/apps/web-ele/src/views/mes/qc/template/modules/indicator-list.vue new file mode 100644 index 000000000..f85632c96 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/modules/indicator-list.vue @@ -0,0 +1,137 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue b/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue new file mode 100644 index 000000000..12df446f9 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue @@ -0,0 +1,97 @@ + + + diff --git a/apps/web-ele/src/views/mes/qc/template/modules/item-list.vue b/apps/web-ele/src/views/mes/qc/template/modules/item-list.vue new file mode 100644 index 000000000..76eed37e3 --- /dev/null +++ b/apps/web-ele/src/views/mes/qc/template/modules/item-list.vue @@ -0,0 +1,131 @@ + + + From 2d1325f11a8abb154d00ef8c9ecc5740ee67df5c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 09:59:13 +0800 Subject: [PATCH 05/52] =?UTF-8?q?feat(mes/wm):=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=9F=BA=E7=A1=80=E5=88=B0=20vben5=20antd/el?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/mes/qc/defectrecord/index.ts | 42 +++ .../src/api/mes/qc/indicatorresult/index.ts | 73 ++++ apps/web-antd/src/api/mes/qc/iqc/index.ts | 80 ++++ .../web-antd/src/api/mes/qc/iqc/line/index.ts | 41 ++ .../web-antd/src/router/routes/modules/mes.ts | 46 +++ .../src/views/mes/wm/warehouse/area/data.ts | 339 +++++++++++++++++ .../src/views/mes/wm/warehouse/area/index.vue | 219 +++++++++++ .../mes/wm/warehouse/area/modules/form.vue | 149 ++++++++ .../mes/wm/warehouse/components/index.ts | 3 + .../components/wm-warehouse-area-select.vue | 114 ++++++ .../wm-warehouse-location-select.vue | 113 ++++++ .../components/wm-warehouse-select.vue | 110 ++++++ .../src/views/mes/wm/warehouse/data.ts | 226 +++++++++++ .../src/views/mes/wm/warehouse/index.vue | 183 +++++++++ .../views/mes/wm/warehouse/location/data.ts | 198 ++++++++++ .../views/mes/wm/warehouse/location/index.vue | 226 +++++++++++ .../wm/warehouse/location/modules/form.vue | 180 +++++++++ .../views/mes/wm/warehouse/modules/form.vue | 122 ++++++ .../src/api/mes/qc/defectrecord/index.ts | 42 +++ .../src/api/mes/qc/indicatorresult/index.ts | 73 ++++ apps/web-ele/src/api/mes/qc/iqc/index.ts | 80 ++++ apps/web-ele/src/api/mes/qc/iqc/line/index.ts | 41 ++ apps/web-ele/src/router/routes/modules/mes.ts | 46 +++ .../src/views/mes/wm/warehouse/area/data.ts | 352 ++++++++++++++++++ .../src/views/mes/wm/warehouse/area/index.vue | 221 +++++++++++ .../mes/wm/warehouse/area/modules/form.vue | 149 ++++++++ .../mes/wm/warehouse/components/index.ts | 3 + .../components/wm-warehouse-area-select.vue | 121 ++++++ .../wm-warehouse-location-select.vue | 120 ++++++ .../components/wm-warehouse-select.vue | 118 ++++++ .../src/views/mes/wm/warehouse/data.ts | 227 +++++++++++ .../src/views/mes/wm/warehouse/index.vue | 185 +++++++++ .../views/mes/wm/warehouse/location/data.ts | 202 ++++++++++ .../views/mes/wm/warehouse/location/index.vue | 229 ++++++++++++ .../wm/warehouse/location/modules/form.vue | 192 ++++++++++ .../views/mes/wm/warehouse/modules/form.vue | 124 ++++++ 36 files changed, 4989 insertions(+) create mode 100644 apps/web-antd/src/api/mes/qc/defectrecord/index.ts create mode 100644 apps/web-antd/src/api/mes/qc/indicatorresult/index.ts create mode 100644 apps/web-antd/src/api/mes/qc/iqc/index.ts create mode 100644 apps/web-antd/src/api/mes/qc/iqc/line/index.ts create mode 100644 apps/web-antd/src/router/routes/modules/mes.ts create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/area/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/area/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/area/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/components/index.ts create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/location/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/location/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/location/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/wm/warehouse/modules/form.vue create mode 100644 apps/web-ele/src/api/mes/qc/defectrecord/index.ts create mode 100644 apps/web-ele/src/api/mes/qc/indicatorresult/index.ts create mode 100644 apps/web-ele/src/api/mes/qc/iqc/index.ts create mode 100644 apps/web-ele/src/api/mes/qc/iqc/line/index.ts create mode 100644 apps/web-ele/src/router/routes/modules/mes.ts create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/area/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/area/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/area/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/components/index.ts create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/location/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/location/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/location/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/wm/warehouse/modules/form.vue diff --git a/apps/web-antd/src/api/mes/qc/defectrecord/index.ts b/apps/web-antd/src/api/mes/qc/defectrecord/index.ts new file mode 100644 index 000000000..0d5182b15 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/defectrecord/index.ts @@ -0,0 +1,42 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectRecordApi { + /** MES 质检缺陷记录 */ + export interface DefectRecord { + id?: number; // 编号 + qcType?: number; // 检验类型 + qcId?: number; // 检验单 ID + lineId?: number; // 检验行 ID + name?: string; // 缺陷描述 + level?: number; // 缺陷等级 + quantity?: number; // 缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询质检缺陷记录分页 */ +export function getDefectRecordPage( + params: PageParam & { lineId?: number; qcId?: number; qcType?: number; }, +) { + return requestClient.get>( + '/mes/qc/defect-record/page', + { params }, + ); +} + +/** 新增质检缺陷记录 */ +export function createDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.post('/mes/qc/defect-record/create', data); +} + +/** 修改质检缺陷记录 */ +export function updateDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.put('/mes/qc/defect-record/update', data); +} + +/** 删除质检缺陷记录 */ +export function deleteDefectRecord(id: number) { + return requestClient.delete(`/mes/qc/defect-record/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/qc/indicatorresult/index.ts b/apps/web-antd/src/api/mes/qc/indicatorresult/index.ts new file mode 100644 index 000000000..dfa8a7f93 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/indicatorresult/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorResultApi { + /** MES 检验结果明细 */ + export interface IndicatorResultDetail { + id?: number; // 编号 + resultId?: number; // 关联检验结果 ID + indicatorId?: number; // 检测指标 ID + value?: string; // 检测值(统一存为字符串) + valueNumber?: number; // UI 数值绑定(提交前转字符串) + remark?: string; // 备注 + // 关联查询字段(来自 indicator) + indicatorName?: string; // 检测指标名称 + valueType?: number; // 质检值类型 + valueSpecification?: string; // 值属性 + } + + /** MES 检验结果 */ + export interface IndicatorResult { + id?: number; // 编号 + code?: string; // 样品编号 + qcId?: number; // 关联质检单 ID + qcType?: number; // 质检类型 + itemId?: number; // 产品物料 ID + sn?: string; // 物资 SN + remark?: string; // 备注 + createTime?: Date; // 创建时间 + items?: IndicatorResultDetail[]; // 检验结果明细列表 + } +} + +/** 查询检验结果分页 */ +export function getIndicatorResultPage( + params: PageParam & { qcId?: number; qcType?: number }, +) { + return requestClient.get>( + '/mes/qc/indicator-result/page', + { params }, + ); +} + +/** 查询检验结果明细(含检测项模板):编辑传 id,新增不传 */ +export function getIndicatorResultDetail( + qcId: number, + qcType: number, + id?: number, +) { + return requestClient.get( + '/mes/qc/indicator-result/get-detail', + { params: { id, qcId, qcType } }, + ); +} + +/** 新增检验结果 */ +export function createIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.post('/mes/qc/indicator-result/create', data); +} + +/** 修改检验结果 */ +export function updateIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.put('/mes/qc/indicator-result/update', data); +} + +/** 删除检验结果 */ +export function deleteIndicatorResult(id: number) { + return requestClient.delete(`/mes/qc/indicator-result/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/qc/iqc/index.ts b/apps/web-antd/src/api/mes/qc/iqc/index.ts new file mode 100644 index 000000000..cdb04cb6a --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/iqc/index.ts @@ -0,0 +1,80 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcApi { + /** MES 来料检验单 */ + export interface Iqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + vendorId?: number; // 供应商 ID + vendorNickname?: string; // 供应商简称(关联查询) + vendorBatch?: string; // 供应商批次号 + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + receivedQuantity?: number; // 本次接收数量 + checkQuantity?: number; // 本次检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格品数量 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + checkResult?: number; // 检测结果 + receiveDate?: number; // 来料日期 + inspectDate?: number; // 检测日期 + inspector?: string; // 检测人员(昵称) + inspectorUserId?: number; // 检测人员 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询来料检验单分页 */ +export function getIqcPage(params: PageParam) { + return requestClient.get>('/mes/qc/iqc/page', { + params, + }); +} + +/** 查询来料检验单详情 */ +export function getIqc(id: number) { + return requestClient.get(`/mes/qc/iqc/get?id=${id}`); +} + +/** 新增来料检验单 */ +export function createIqc(data: MesQcIqcApi.Iqc) { + return requestClient.post('/mes/qc/iqc/create', data); +} + +/** 修改来料检验单 */ +export function updateIqc(data: MesQcIqcApi.Iqc) { + return requestClient.put('/mes/qc/iqc/update', data); +} + +/** 完成来料检验单 */ +export function finishIqc(id: number) { + return requestClient.put(`/mes/qc/iqc/finish?id=${id}`); +} + +/** 删除来料检验单 */ +export function deleteIqc(id: number) { + return requestClient.delete(`/mes/qc/iqc/delete?id=${id}`); +} + +/** 导出来料检验单 */ +export function exportIqc(params: any) { + return requestClient.download('/mes/qc/iqc/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/qc/iqc/line/index.ts b/apps/web-antd/src/api/mes/qc/iqc/line/index.ts new file mode 100644 index 000000000..dc37aa99b --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/iqc/line/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcLineApi { + /** MES 来料检验单行 */ + export interface IqcLine { + id?: number; // 编号 + iqcId?: number; // 来料检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + tool?: string; // 检测工具 + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询来料检验单行分页 */ +export function getIqcLinePage(params: PageParam & { iqcId?: number }) { + return requestClient.get>( + '/mes/qc/iqc/line/page', + { params }, + ); +} + +/** 查询来料检验单行详情 */ +export function getIqcLine(id: number) { + return requestClient.get( + `/mes/qc/iqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-antd/src/router/routes/modules/mes.ts b/apps/web-antd/src/router/routes/modules/mes.ts new file mode 100644 index 000000000..05af60e29 --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/mes.ts @@ -0,0 +1,46 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/mes', + name: 'MesCenter', + meta: { + title: 'MES 制造执行', + icon: 'lucide:factory', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: 'wm/warehouse/location', + name: 'MesWmLocation', + meta: { + title: '库区设置', + activePath: '/mes/wm/warehouse', + }, + component: () => + import('#/views/mes/wm/warehouse/location/index.vue'), + }, + { + path: 'wm/warehouse/area', + name: 'MesWmArea', + meta: { + title: '库位设置', + activePath: '/mes/wm/warehouse', + }, + component: () => import('#/views/mes/wm/warehouse/area/index.vue'), + }, + { + path: 'wm/barcode/config', + name: 'MesWmBarcodeConfig', + meta: { + title: '条码配置', + activePath: '/mes/wm/barcode', + }, + component: () => import('#/views/mes/wm/barcode/config/index.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/views/mes/wm/warehouse/area/data.ts b/apps/web-antd/src/views/mes/wm/warehouse/area/data.ts new file mode 100644 index 000000000..b18fb4981 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/area/data.ts @@ -0,0 +1,339 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseAreaApi } from '#/api/mes/wm/warehouse/area'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; +import { getWarehouseLocationSimpleList } from '#/api/mes/wm/warehouse/location'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'warehouseId', + label: '所属仓库', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getWarehouseSimpleList, + labelField: 'name', + valueField: 'id', + placeholder: '请选择仓库', + // 仓库变更时清空所属库区 + onChange: () => formApi?.setFieldValue('locationId', undefined), + }, + }, + { + fieldName: 'locationId', + label: '所属库区', + component: 'ApiSelect', + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + allowClear: true, + api: () => + getWarehouseLocationSimpleList(values.warehouseId as number), + // 改变 warehouseId 时强制刷新选项 + params: { warehouseId: values.warehouseId }, + disabled: !values.warehouseId, + labelField: 'name', + valueField: 'id', + placeholder: '请选择库区', + }), + }, + rules: 'required', + }, + { + fieldName: 'code', + label: '库位编码', + component: 'Input', + componentProps: { + placeholder: '请输入库位编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_AREA_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '库位名称', + component: 'Input', + componentProps: { + placeholder: '请输入库位名称', + }, + rules: 'required', + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + placeholder: '请输入面积', + }, + }, + { + fieldName: 'maxLoad', + label: '最大载重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + placeholder: '请输入最大载重', + }, + }, + { + fieldName: 'positionX', + label: '位置 X', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 X', + }, + }, + { + fieldName: 'positionY', + label: '位置 Y', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 Y', + }, + }, + { + fieldName: 'positionZ', + label: '位置 Z', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 Z', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'allowItemMixing', + label: '允许物料混放', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'allowBatchMixing', + label: '允许批次混放', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '库位编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入库位编码', + }, + }, + { + fieldName: 'name', + label: '库位名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入库位名称', + }, + }, + { + fieldName: 'positionX', + label: '位置 X', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 X', + }, + }, + { + fieldName: 'positionY', + label: '位置 Y', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 Y', + }, + }, + { + fieldName: 'positionZ', + label: '位置 Z', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入位置 Z', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '库位编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '库位名称', + minWidth: 160, + }, + { + field: 'area', + title: '面积(㎡)', + width: 100, + }, + { + field: 'maxLoad', + title: '最大载重', + width: 100, + }, + { + field: 'positionX', + title: '位置 X', + width: 80, + }, + { + field: 'positionY', + title: '位置 Y', + width: 80, + }, + { + field: 'positionZ', + title: '位置 Z', + width: 80, + }, + { + field: 'status', + title: '状态', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/warehouse/area/index.vue b/apps/web-antd/src/views/mes/wm/warehouse/area/index.vue new file mode 100644 index 000000000..f30a2211c --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/area/index.vue @@ -0,0 +1,219 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/area/modules/form.vue b/apps/web-antd/src/views/mes/wm/warehouse/area/modules/form.vue new file mode 100644 index 000000000..19dc5a60d --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/area/modules/form.vue @@ -0,0 +1,149 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/components/index.ts b/apps/web-antd/src/views/mes/wm/warehouse/components/index.ts new file mode 100644 index 000000000..d2981238b --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/components/index.ts @@ -0,0 +1,3 @@ +export { default as WmWarehouseAreaSelect } from './wm-warehouse-area-select.vue'; +export { default as WmWarehouseLocationSelect } from './wm-warehouse-location-select.vue'; +export { default as WmWarehouseSelect } from './wm-warehouse-select.vue'; diff --git a/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue new file mode 100644 index 000000000..1c482856a --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue @@ -0,0 +1,114 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue new file mode 100644 index 000000000..1852823eb --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue @@ -0,0 +1,113 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue new file mode 100644 index 000000000..e680c7978 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue @@ -0,0 +1,110 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/data.ts b/apps/web-antd/src/views/mes/wm/warehouse/data.ts new file mode 100644 index 000000000..045e21177 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/data.ts @@ -0,0 +1,226 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseApi } from '#/api/mes/wm/warehouse'; +import type { SystemUserApi } from '#/api/system/user'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 关联数据 */ +let userList: SystemUserApi.User[] = []; +getSimpleUserList().then((data) => (userList = data)); + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '仓库编码', + component: 'Input', + componentProps: { + placeholder: '请输入仓库编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_WAREHOUSE_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + placeholder: '请输入仓库名称', + }, + rules: 'required', + }, + { + fieldName: 'chargeUserId', + label: '负责人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + valueField: 'id', + placeholder: '请选择负责人', + }, + }, + { + fieldName: 'address', + label: '仓库地址', + component: 'Input', + componentProps: { + placeholder: '请输入仓库地址', + }, + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + placeholder: '请输入面积', + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '仓库编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库编码', + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Select', + componentProps: { + allowClear: true, + options: [ + { label: '是', value: true }, + { label: '否', value: false }, + ], + placeholder: '请选择', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '仓库编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'address', + title: '仓库地址', + minWidth: 180, + }, + { + field: 'area', + title: '面积(㎡)', + width: 110, + }, + { + field: 'chargeUserId', + title: '负责人', + width: 120, + formatter: ({ cellValue }) => + userList.find((user) => user.id === cellValue)?.nickname ?? '', + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 220, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/warehouse/index.vue b/apps/web-antd/src/views/mes/wm/warehouse/index.vue new file mode 100644 index 000000000..b96de2554 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/index.vue @@ -0,0 +1,183 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/location/data.ts b/apps/web-antd/src/views/mes/wm/warehouse/location/data.ts new file mode 100644 index 000000000..c75c0639c --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/location/data.ts @@ -0,0 +1,198 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseApi } from '#/api/mes/wm/warehouse'; +import type { MesWmWarehouseLocationApi } from '#/api/mes/wm/warehouse/location'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 关联数据 */ +let warehouseList: MesWmWarehouseApi.Warehouse[] = []; +getWarehouseSimpleList().then((data) => (warehouseList = data)); + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'code', + label: '库区编码', + component: 'Input', + componentProps: { + placeholder: '请输入库区编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_LOCATION_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '库区名称', + component: 'Input', + componentProps: { + placeholder: '请输入库区名称', + }, + rules: 'required', + }, + { + fieldName: 'warehouseId', + label: '所属仓库', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getWarehouseSimpleList, + labelField: 'name', + valueField: 'id', + placeholder: '请选择仓库', + }, + rules: 'required', + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + placeholder: '请输入面积', + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '库区编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入库区编码', + }, + }, + { + fieldName: 'name', + label: '库区名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入库区名称', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '库区编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '库区名称', + minWidth: 160, + }, + { + field: 'warehouseId', + title: '所属仓库', + minWidth: 140, + formatter: ({ cellValue }) => + warehouseList.find((w) => w.id === cellValue)?.name ?? '', + }, + { + field: 'area', + title: '面积(㎡)', + width: 110, + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/warehouse/location/index.vue b/apps/web-antd/src/views/mes/wm/warehouse/location/index.vue new file mode 100644 index 000000000..971284258 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/location/index.vue @@ -0,0 +1,226 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/location/modules/form.vue b/apps/web-antd/src/views/mes/wm/warehouse/location/modules/form.vue new file mode 100644 index 000000000..4d1daec3c --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/location/modules/form.vue @@ -0,0 +1,180 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/warehouse/modules/form.vue b/apps/web-antd/src/views/mes/wm/warehouse/modules/form.vue new file mode 100644 index 000000000..9de8bc39e --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/warehouse/modules/form.vue @@ -0,0 +1,122 @@ + + + diff --git a/apps/web-ele/src/api/mes/qc/defectrecord/index.ts b/apps/web-ele/src/api/mes/qc/defectrecord/index.ts new file mode 100644 index 000000000..0d5182b15 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/defectrecord/index.ts @@ -0,0 +1,42 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectRecordApi { + /** MES 质检缺陷记录 */ + export interface DefectRecord { + id?: number; // 编号 + qcType?: number; // 检验类型 + qcId?: number; // 检验单 ID + lineId?: number; // 检验行 ID + name?: string; // 缺陷描述 + level?: number; // 缺陷等级 + quantity?: number; // 缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询质检缺陷记录分页 */ +export function getDefectRecordPage( + params: PageParam & { lineId?: number; qcId?: number; qcType?: number; }, +) { + return requestClient.get>( + '/mes/qc/defect-record/page', + { params }, + ); +} + +/** 新增质检缺陷记录 */ +export function createDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.post('/mes/qc/defect-record/create', data); +} + +/** 修改质检缺陷记录 */ +export function updateDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.put('/mes/qc/defect-record/update', data); +} + +/** 删除质检缺陷记录 */ +export function deleteDefectRecord(id: number) { + return requestClient.delete(`/mes/qc/defect-record/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/qc/indicatorresult/index.ts b/apps/web-ele/src/api/mes/qc/indicatorresult/index.ts new file mode 100644 index 000000000..dfa8a7f93 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/indicatorresult/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorResultApi { + /** MES 检验结果明细 */ + export interface IndicatorResultDetail { + id?: number; // 编号 + resultId?: number; // 关联检验结果 ID + indicatorId?: number; // 检测指标 ID + value?: string; // 检测值(统一存为字符串) + valueNumber?: number; // UI 数值绑定(提交前转字符串) + remark?: string; // 备注 + // 关联查询字段(来自 indicator) + indicatorName?: string; // 检测指标名称 + valueType?: number; // 质检值类型 + valueSpecification?: string; // 值属性 + } + + /** MES 检验结果 */ + export interface IndicatorResult { + id?: number; // 编号 + code?: string; // 样品编号 + qcId?: number; // 关联质检单 ID + qcType?: number; // 质检类型 + itemId?: number; // 产品物料 ID + sn?: string; // 物资 SN + remark?: string; // 备注 + createTime?: Date; // 创建时间 + items?: IndicatorResultDetail[]; // 检验结果明细列表 + } +} + +/** 查询检验结果分页 */ +export function getIndicatorResultPage( + params: PageParam & { qcId?: number; qcType?: number }, +) { + return requestClient.get>( + '/mes/qc/indicator-result/page', + { params }, + ); +} + +/** 查询检验结果明细(含检测项模板):编辑传 id,新增不传 */ +export function getIndicatorResultDetail( + qcId: number, + qcType: number, + id?: number, +) { + return requestClient.get( + '/mes/qc/indicator-result/get-detail', + { params: { id, qcId, qcType } }, + ); +} + +/** 新增检验结果 */ +export function createIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.post('/mes/qc/indicator-result/create', data); +} + +/** 修改检验结果 */ +export function updateIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.put('/mes/qc/indicator-result/update', data); +} + +/** 删除检验结果 */ +export function deleteIndicatorResult(id: number) { + return requestClient.delete(`/mes/qc/indicator-result/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/qc/iqc/index.ts b/apps/web-ele/src/api/mes/qc/iqc/index.ts new file mode 100644 index 000000000..cdb04cb6a --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/iqc/index.ts @@ -0,0 +1,80 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcApi { + /** MES 来料检验单 */ + export interface Iqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + vendorId?: number; // 供应商 ID + vendorNickname?: string; // 供应商简称(关联查询) + vendorBatch?: string; // 供应商批次号 + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + receivedQuantity?: number; // 本次接收数量 + checkQuantity?: number; // 本次检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格品数量 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + checkResult?: number; // 检测结果 + receiveDate?: number; // 来料日期 + inspectDate?: number; // 检测日期 + inspector?: string; // 检测人员(昵称) + inspectorUserId?: number; // 检测人员 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询来料检验单分页 */ +export function getIqcPage(params: PageParam) { + return requestClient.get>('/mes/qc/iqc/page', { + params, + }); +} + +/** 查询来料检验单详情 */ +export function getIqc(id: number) { + return requestClient.get(`/mes/qc/iqc/get?id=${id}`); +} + +/** 新增来料检验单 */ +export function createIqc(data: MesQcIqcApi.Iqc) { + return requestClient.post('/mes/qc/iqc/create', data); +} + +/** 修改来料检验单 */ +export function updateIqc(data: MesQcIqcApi.Iqc) { + return requestClient.put('/mes/qc/iqc/update', data); +} + +/** 完成来料检验单 */ +export function finishIqc(id: number) { + return requestClient.put(`/mes/qc/iqc/finish?id=${id}`); +} + +/** 删除来料检验单 */ +export function deleteIqc(id: number) { + return requestClient.delete(`/mes/qc/iqc/delete?id=${id}`); +} + +/** 导出来料检验单 */ +export function exportIqc(params: any) { + return requestClient.download('/mes/qc/iqc/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/mes/qc/iqc/line/index.ts b/apps/web-ele/src/api/mes/qc/iqc/line/index.ts new file mode 100644 index 000000000..dc37aa99b --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/iqc/line/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcLineApi { + /** MES 来料检验单行 */ + export interface IqcLine { + id?: number; // 编号 + iqcId?: number; // 来料检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + tool?: string; // 检测工具 + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询来料检验单行分页 */ +export function getIqcLinePage(params: PageParam & { iqcId?: number }) { + return requestClient.get>( + '/mes/qc/iqc/line/page', + { params }, + ); +} + +/** 查询来料检验单行详情 */ +export function getIqcLine(id: number) { + return requestClient.get( + `/mes/qc/iqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-ele/src/router/routes/modules/mes.ts b/apps/web-ele/src/router/routes/modules/mes.ts new file mode 100644 index 000000000..05af60e29 --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/mes.ts @@ -0,0 +1,46 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/mes', + name: 'MesCenter', + meta: { + title: 'MES 制造执行', + icon: 'lucide:factory', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: 'wm/warehouse/location', + name: 'MesWmLocation', + meta: { + title: '库区设置', + activePath: '/mes/wm/warehouse', + }, + component: () => + import('#/views/mes/wm/warehouse/location/index.vue'), + }, + { + path: 'wm/warehouse/area', + name: 'MesWmArea', + meta: { + title: '库位设置', + activePath: '/mes/wm/warehouse', + }, + component: () => import('#/views/mes/wm/warehouse/area/index.vue'), + }, + { + path: 'wm/barcode/config', + name: 'MesWmBarcodeConfig', + meta: { + title: '条码配置', + activePath: '/mes/wm/barcode', + }, + component: () => import('#/views/mes/wm/barcode/config/index.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-ele/src/views/mes/wm/warehouse/area/data.ts b/apps/web-ele/src/views/mes/wm/warehouse/area/data.ts new file mode 100644 index 000000000..c6c676806 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/area/data.ts @@ -0,0 +1,352 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseAreaApi } from '#/api/mes/wm/warehouse/area'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; +import { getWarehouseLocationSimpleList } from '#/api/mes/wm/warehouse/location'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'warehouseId', + label: '所属仓库', + component: 'ApiSelect', + componentProps: { + api: getWarehouseSimpleList, + clearable: true, + labelField: 'name', + // 仓库变更时清空所属库区 + onChange: () => formApi?.setFieldValue('locationId', undefined), + placeholder: '请选择仓库', + valueField: 'id', + }, + }, + { + fieldName: 'locationId', + label: '所属库区', + component: 'ApiSelect', + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + api: () => + getWarehouseLocationSimpleList(values.warehouseId as number), + clearable: true, + disabled: !values.warehouseId, + labelField: 'name', + // 改变 warehouseId 时强制刷新选项 + params: { warehouseId: values.warehouseId }, + placeholder: '请选择库区', + valueField: 'id', + }), + }, + rules: 'required', + }, + { + fieldName: 'code', + label: '库位编码', + component: 'Input', + componentProps: { + placeholder: '请输入库位编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_AREA_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '库位名称', + component: 'Input', + componentProps: { + placeholder: '请输入库位名称', + }, + rules: 'required', + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入面积', + precision: 2, + }, + }, + { + fieldName: 'maxLoad', + label: '最大载重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入最大载重', + precision: 2, + }, + }, + { + fieldName: 'positionX', + label: '位置 X', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 X', + }, + }, + { + fieldName: 'positionY', + label: '位置 Y', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 Y', + }, + }, + { + fieldName: 'positionZ', + label: '位置 Z', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 Z', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + inlinePrompt: true, + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'allowItemMixing', + label: '允许物料混放', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + inlinePrompt: true, + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'allowBatchMixing', + label: '允许批次混放', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + inlinePrompt: true, + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '库位编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入库位编码', + }, + }, + { + fieldName: 'name', + label: '库位名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入库位名称', + }, + }, + { + fieldName: 'positionX', + label: '位置 X', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 X', + }, + }, + { + fieldName: 'positionY', + label: '位置 Y', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 Y', + }, + }, + { + fieldName: 'positionZ', + label: '位置 Z', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入位置 Z', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '库位编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '库位名称', + minWidth: 160, + }, + { + field: 'area', + title: '面积(㎡)', + width: 100, + }, + { + field: 'maxLoad', + title: '最大载重', + width: 100, + }, + { + field: 'positionX', + title: '位置 X', + width: 80, + }, + { + field: 'positionY', + title: '位置 Y', + width: 80, + }, + { + field: 'positionZ', + title: '位置 Z', + width: 80, + }, + { + field: 'status', + title: '状态', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/warehouse/area/index.vue b/apps/web-ele/src/views/mes/wm/warehouse/area/index.vue new file mode 100644 index 000000000..b0f4a441c --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/area/index.vue @@ -0,0 +1,221 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/area/modules/form.vue b/apps/web-ele/src/views/mes/wm/warehouse/area/modules/form.vue new file mode 100644 index 000000000..1d31e18bb --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/area/modules/form.vue @@ -0,0 +1,149 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/components/index.ts b/apps/web-ele/src/views/mes/wm/warehouse/components/index.ts new file mode 100644 index 000000000..d2981238b --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/components/index.ts @@ -0,0 +1,3 @@ +export { default as WmWarehouseAreaSelect } from './wm-warehouse-area-select.vue'; +export { default as WmWarehouseLocationSelect } from './wm-warehouse-location-select.vue'; +export { default as WmWarehouseSelect } from './wm-warehouse-select.vue'; diff --git a/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue new file mode 100644 index 000000000..ba3c1a467 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-area-select.vue @@ -0,0 +1,121 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue new file mode 100644 index 000000000..e9dca087e --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-location-select.vue @@ -0,0 +1,120 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue new file mode 100644 index 000000000..edeb295ec --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/components/wm-warehouse-select.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/data.ts b/apps/web-ele/src/views/mes/wm/warehouse/data.ts new file mode 100644 index 000000000..fafda94e7 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/data.ts @@ -0,0 +1,227 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseApi } from '#/api/mes/wm/warehouse'; +import type { SystemUserApi } from '#/api/system/user'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 关联数据 */ +let userList: SystemUserApi.User[] = []; +getSimpleUserList().then((data) => (userList = data)); + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '仓库编码', + component: 'Input', + componentProps: { + placeholder: '请输入仓库编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_WAREHOUSE_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + placeholder: '请输入仓库名称', + }, + rules: 'required', + }, + { + fieldName: 'chargeUserId', + label: '负责人', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + clearable: true, + labelField: 'nickname', + placeholder: '请选择负责人', + valueField: 'id', + }, + }, + { + fieldName: 'address', + label: '仓库地址', + component: 'Input', + componentProps: { + placeholder: '请输入仓库地址', + }, + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入面积', + precision: 2, + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + inlinePrompt: true, + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '仓库编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库编码', + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Select', + componentProps: { + clearable: true, + options: [ + { label: '是', value: true }, + { label: '否', value: false }, + ], + placeholder: '请选择', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '仓库编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'address', + title: '仓库地址', + minWidth: 180, + }, + { + field: 'area', + title: '面积(㎡)', + width: 110, + }, + { + field: 'chargeUserId', + title: '负责人', + width: 120, + formatter: ({ cellValue }) => + userList.find((user) => user.id === cellValue)?.nickname ?? '', + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/warehouse/index.vue b/apps/web-ele/src/views/mes/wm/warehouse/index.vue new file mode 100644 index 000000000..92a9e4059 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/index.vue @@ -0,0 +1,185 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/location/data.ts b/apps/web-ele/src/views/mes/wm/warehouse/location/data.ts new file mode 100644 index 000000000..c3d00a1a3 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/location/data.ts @@ -0,0 +1,202 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmWarehouseApi } from '#/api/mes/wm/warehouse'; +import type { MesWmWarehouseLocationApi } from '#/api/mes/wm/warehouse/location'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 关联数据 */ +let warehouseList: MesWmWarehouseApi.Warehouse[] = []; +getWarehouseSimpleList().then((data) => (warehouseList = data)); + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '库区编码', + component: 'Input', + componentProps: { + placeholder: '请输入库区编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + try { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_LOCATION_CODE, + ); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '库区名称', + component: 'Input', + componentProps: { + placeholder: '请输入库区名称', + }, + rules: 'required', + }, + { + fieldName: 'warehouseId', + label: '所属仓库', + component: 'ApiSelect', + componentProps: { + api: getWarehouseSimpleList, + clearable: true, + labelField: 'name', + placeholder: '请选择仓库', + valueField: 'id', + }, + rules: 'required', + }, + { + fieldName: 'area', + label: '面积(㎡)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入面积', + precision: 2, + }, + }, + { + fieldName: 'frozen', + label: '是否冻结', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + inlinePrompt: true, + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '库区编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入库区编码', + }, + }, + { + fieldName: 'name', + label: '库区名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入库区名称', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '库区编码', + minWidth: 140, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '库区名称', + minWidth: 160, + }, + { + field: 'warehouseId', + title: '所属仓库', + minWidth: 140, + formatter: ({ cellValue }) => + warehouseList.find((w) => w.id === cellValue)?.name ?? '', + }, + { + field: 'area', + title: '面积(㎡)', + width: 110, + }, + { + field: 'frozen', + title: '冻结', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/warehouse/location/index.vue b/apps/web-ele/src/views/mes/wm/warehouse/location/index.vue new file mode 100644 index 000000000..87bad456e --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/location/index.vue @@ -0,0 +1,229 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/location/modules/form.vue b/apps/web-ele/src/views/mes/wm/warehouse/location/modules/form.vue new file mode 100644 index 000000000..59ca8eb28 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/location/modules/form.vue @@ -0,0 +1,192 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/warehouse/modules/form.vue b/apps/web-ele/src/views/mes/wm/warehouse/modules/form.vue new file mode 100644 index 000000000..c944e9498 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/warehouse/modules/form.vue @@ -0,0 +1,124 @@ + + + From d3233c4bb41873390379b8ee9bcee264ff66d7db Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 11:40:28 +0800 Subject: [PATCH 06/52] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=20schema=20=E6=8C=82=E8=BD=BD=E4=B8=8E=20resetForm=20?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/permission/modules/transfer-form.vue | 1 - .../src/views/iot/product/product/data.ts | 4 +- .../iot/product/product/modules/form.vue | 6 +-- .../views/iot/rule/data/rule/modules/form.vue | 1 - .../modules/product-property-add-form.vue | 1 - .../discountActivity/modules/form.vue | 8 ++-- .../views/mes/cal/holiday/modules/form.vue | 1 - .../src/views/mes/cal/plan/modules/form.vue | 5 +-- .../src/views/mes/cal/team/modules/form.vue | 5 +-- .../views/mes/dv/checkplan/modules/form.vue | 5 +-- .../views/mes/dv/checkrecord/modules/form.vue | 1 - .../views/mes/dv/machinery/modules/form.vue | 4 -- .../mes/dv/machinery/type/modules/form.vue | 5 +-- .../mes/dv/maintenrecord/modules/form.vue | 1 - .../src/views/mes/dv/repair/modules/form.vue | 5 +-- .../src/views/mes/dv/subject/modules/form.vue | 5 +-- .../views/mes/md/autocode/modules/form.vue | 1 - .../mes/md/autocode/modules/part-form.vue | 1 - .../src/views/mes/md/client/modules/form.vue | 5 +-- .../src/views/mes/md/item/modules/form.vue | 5 +-- .../views/mes/md/item/type/modules/form.vue | 5 +-- .../views/mes/md/unitmeasure/modules/form.vue | 1 - .../src/views/mes/md/vendor/modules/form.vue | 5 +-- .../views/mes/md/workstation/modules/form.vue | 5 +-- .../md/workstation/workshop/modules/form.vue | 5 +-- .../mes/pro/andon/record/modules/form.vue | 4 -- .../views/mes/pro/feedback/modules/form.vue | 4 -- .../mes/pro/process/modules/content-form.vue | 1 - .../views/mes/pro/process/modules/form.vue | 5 +-- .../views/mes/pro/route/modules/bom-form.vue | 1 - .../src/views/mes/pro/route/modules/form.vue | 5 +-- .../mes/pro/route/modules/process-form.vue | 1 - .../mes/pro/route/modules/product-form.vue | 1 - .../src/views/mes/qc/defect/modules/form.vue | 5 +-- .../views/mes/qc/indicator/modules/form.vue | 5 +-- .../views/mes/qc/template/modules/form.vue | 5 +-- .../qc/template/modules/indicator-form.vue | 1 - .../mes/qc/template/modules/item-form.vue | 1 - .../src/views/mes/tm/tool/modules/form.vue | 5 +-- .../views/mes/tm/tool/type/modules/form.vue | 5 +-- .../web-antd/src/views/mes/utils/constants.ts | 43 +++++++++++++++++++ .../src/views/wms/md/item/brand/data.ts | 4 +- .../views/wms/md/item/brand/modules/form.vue | 5 +-- .../src/views/wms/md/item/category/data.ts | 4 +- .../wms/md/item/category/modules/form.vue | 5 +-- apps/web-antd/src/views/wms/md/item/data.ts | 4 +- .../src/views/wms/md/item/modules/form.vue | 5 +-- .../src/views/wms/md/merchant/data.ts | 4 +- .../views/wms/md/merchant/modules/form.vue | 5 +-- .../src/views/wms/md/warehouse/data.ts | 4 +- .../views/wms/md/warehouse/modules/form.vue | 4 +- .../views/wms/order/check/modules/form.vue | 1 - .../views/wms/order/movement/modules/form.vue | 1 - .../views/wms/order/receipt/modules/form.vue | 1 - .../views/wms/order/shipment/modules/form.vue | 1 - .../crm/permission/modules/transfer-form.vue | 1 - .../src/views/iot/product/product/data.ts | 4 +- .../iot/product/product/modules/form.vue | 6 +-- .../views/iot/rule/data/rule/modules/form.vue | 1 - .../modules/product-property-add-form.vue | 1 - .../discountActivity/modules/form.vue | 8 ++-- .../views/mes/cal/holiday/modules/form.vue | 1 - .../src/views/mes/cal/plan/modules/form.vue | 5 +-- .../src/views/mes/cal/team/modules/form.vue | 5 +-- .../views/mes/dv/checkplan/modules/form.vue | 5 +-- .../views/mes/dv/checkrecord/modules/form.vue | 1 - .../views/mes/dv/machinery/modules/form.vue | 4 -- .../mes/dv/machinery/type/modules/form.vue | 5 +-- .../mes/dv/maintenrecord/modules/form.vue | 1 - .../src/views/mes/dv/repair/modules/form.vue | 5 +-- .../src/views/mes/dv/subject/modules/form.vue | 5 +-- .../views/mes/md/autocode/modules/form.vue | 1 - .../mes/md/autocode/modules/part-form.vue | 1 - .../src/views/mes/md/client/modules/form.vue | 5 +-- .../src/views/mes/md/item/modules/form.vue | 5 +-- .../views/mes/md/item/type/modules/form.vue | 5 +-- .../views/mes/md/unitmeasure/modules/form.vue | 1 - .../src/views/mes/md/vendor/modules/form.vue | 5 +-- .../views/mes/md/workstation/modules/form.vue | 5 +-- .../md/workstation/workshop/modules/form.vue | 5 +-- .../mes/pro/andon/record/modules/form.vue | 4 -- .../views/mes/pro/feedback/modules/form.vue | 4 -- .../mes/pro/process/modules/content-form.vue | 1 - .../views/mes/pro/process/modules/form.vue | 5 +-- .../views/mes/pro/route/modules/bom-form.vue | 1 - .../src/views/mes/pro/route/modules/form.vue | 5 +-- .../mes/pro/route/modules/process-form.vue | 1 - .../mes/pro/route/modules/product-form.vue | 1 - .../src/views/mes/qc/defect/modules/form.vue | 5 +-- .../views/mes/qc/indicator/modules/form.vue | 5 +-- .../views/mes/qc/template/modules/form.vue | 5 +-- .../qc/template/modules/indicator-form.vue | 1 - .../mes/qc/template/modules/item-form.vue | 1 - .../src/views/mes/tm/tool/modules/form.vue | 5 +-- .../views/mes/tm/tool/type/modules/form.vue | 5 +-- apps/web-ele/src/views/mes/utils/constants.ts | 43 +++++++++++++++++++ .../src/views/wms/md/item/brand/data.ts | 4 +- .../views/wms/md/item/brand/modules/form.vue | 5 +-- .../src/views/wms/md/item/category/data.ts | 4 +- .../wms/md/item/category/modules/form.vue | 5 +-- apps/web-ele/src/views/wms/md/item/data.ts | 4 +- .../src/views/wms/md/item/modules/form.vue | 5 +-- .../web-ele/src/views/wms/md/merchant/data.ts | 4 +- .../views/wms/md/merchant/modules/form.vue | 5 +-- .../src/views/wms/md/warehouse/data.ts | 4 +- .../views/wms/md/warehouse/modules/form.vue | 4 +- .../views/wms/order/check/modules/form.vue | 1 - .../views/wms/order/movement/modules/form.vue | 1 - .../views/wms/order/receipt/modules/form.vue | 1 - .../views/wms/order/shipment/modules/form.vue | 1 - packages/constants/src/dict-enum.ts | 2 + 111 files changed, 172 insertions(+), 292 deletions(-) diff --git a/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue b/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue index 21883543f..96b046147 100644 --- a/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue +++ b/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue @@ -100,7 +100,6 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - await formApi.resetForm(); return; } // 加载数据 diff --git a/apps/web-antd/src/views/iot/product/product/data.ts b/apps/web-antd/src/views/iot/product/product/data.ts index 3abe66307..a61b5cc9e 100644 --- a/apps/web-antd/src/views/iot/product/product/data.ts +++ b/apps/web-antd/src/views/iot/product/product/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { IotProductApi } from '#/api/iot/product/product'; @@ -14,7 +14,7 @@ import { getSimpleProductCategoryList } from '#/api/iot/product/category'; /** 基础表单字段(不含图标、图片、描述) */ export function useBasicFormSchema( - formApi?: any, + formApi?: VbenFormApi, generateProductKey?: () => string, ): VbenFormSchema[] { return [ diff --git a/apps/web-antd/src/views/iot/product/product/modules/form.vue b/apps/web-antd/src/views/iot/product/product/modules/form.vue index eb5caddad..a22c0a834 100644 --- a/apps/web-antd/src/views/iot/product/product/modules/form.vue +++ b/apps/web-antd/src/views/iot/product/product/modules/form.vue @@ -60,9 +60,6 @@ const [AdvancedForm, advancedFormApi] = useVbenForm({ showDefaultActions: false, }); -/** 基础表单需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useBasicFormSchema(formApi, generateProductKey) }); - /** 获取高级表单的值(如果表单未挂载,则从 formData 中获取) */ async function getAdvancedFormValues() { if (advancedFormApi.isMounted) { @@ -106,6 +103,9 @@ const [Modal, modalApi] = useVbenModal({ activeKey.value = []; return; } + formApi.setState({ + schema: useBasicFormSchema(formApi, generateProductKey), + }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/iot/rule/data/rule/modules/form.vue b/apps/web-antd/src/views/iot/rule/data/rule/modules/form.vue index 3faafe325..59851ad90 100644 --- a/apps/web-antd/src/views/iot/rule/data/rule/modules/form.vue +++ b/apps/web-antd/src/views/iot/rule/data/rule/modules/form.vue @@ -69,7 +69,6 @@ const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; - await formApi.resetForm(); sourceConfigRef.value?.setData([]); return; } diff --git a/apps/web-antd/src/views/mall/product/spu/form/modules/product-property-add-form.vue b/apps/web-antd/src/views/mall/product/spu/form/modules/product-property-add-form.vue index f34a8d194..1ec33b733 100644 --- a/apps/web-antd/src/views/mall/product/spu/form/modules/product-property-add-form.vue +++ b/apps/web-antd/src/views/mall/product/spu/form/modules/product-property-add-form.vue @@ -134,7 +134,6 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); }, }); diff --git a/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue b/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue index a0eff3e1d..0f159017a 100644 --- a/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue +++ b/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue @@ -7,7 +7,7 @@ import type { SpuProperty, } from '#/views/mall/product/spu/components'; -import { computed, nextTick, ref } from 'vue'; +import { computed, ref } from 'vue'; import { useVbenForm, useVbenModal } from '@vben/common-ui'; import { PromotionDiscountTypeEnum } from '@vben/constants'; @@ -213,13 +213,11 @@ function handleSkuDiscountPercentChange(row: SkuExtension) { } /** 重置表单 */ -async function resetForm() { +function resetForm() { spuList.value = []; spuPropertyList.value = []; spuIdList.value = []; formData.value = {}; - await nextTick(); - await formApi.resetForm(); } // ================= 弹窗相关 ================= @@ -264,7 +262,7 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - await resetForm(); + resetForm(); return; } // 加载数据 diff --git a/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue b/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue index 166514c50..aac5a48d6 100644 --- a/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue +++ b/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue @@ -50,7 +50,6 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); const data = modalApi.getData<{ day: string }>(); if (!data?.day) { return; diff --git a/apps/web-antd/src/views/mes/cal/plan/modules/form.vue b/apps/web-antd/src/views/mes/cal/plan/modules/form.vue index bbfdac011..c76ed81e6 100644 --- a/apps/web-antd/src/views/mes/cal/plan/modules/form.vue +++ b/apps/web-antd/src/views/mes/cal/plan/modules/form.vue @@ -49,9 +49,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 确认排班计划 */ async function handleConfirmPlan() { const { valid } = await formApi.validate(); @@ -106,7 +103,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'shift'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/cal/team/modules/form.vue b/apps/web-antd/src/views/mes/cal/team/modules/form.vue index 4f4128b48..388db173d 100644 --- a/apps/web-antd/src/views/mes/cal/team/modules/form.vue +++ b/apps/web-antd/src/views/mes/cal/team/modules/form.vue @@ -45,9 +45,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -82,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'member'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue b/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue index 3277e9f77..650003ed6 100644 --- a/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -81,7 +78,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'machinery'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue b/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue index 95c7aa8de..0f85d632f 100644 --- a/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue @@ -103,7 +103,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue index b148583a8..9599dc74a 100644 --- a/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue @@ -47,9 +47,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 查看设备条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -91,7 +88,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); subTabsName.value = 'check'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue b/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue index bf17aed85..4a0269d17 100644 --- a/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue index 837f1ef62..0827b1cef 100644 --- a/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue @@ -110,7 +110,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/dv/repair/modules/form.vue b/apps/web-antd/src/views/mes/dv/repair/modules/form.vue index ded9ae757..d9863755b 100644 --- a/apps/web-antd/src/views/mes/dv/repair/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/repair/modules/form.vue @@ -57,9 +57,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 提交维修工单 */ async function handleSubmit() { const { valid } = await formApi.validate(); @@ -164,7 +161,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/dv/subject/modules/form.vue b/apps/web-antd/src/views/mes/dv/subject/modules/form.vue index ebda266c9..a1f953a78 100644 --- a/apps/web-antd/src/views/mes/dv/subject/modules/form.vue +++ b/apps/web-antd/src/views/mes/dv/subject/modules/form.vue @@ -39,9 +39,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -69,7 +66,7 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/md/autocode/modules/form.vue b/apps/web-antd/src/views/mes/md/autocode/modules/form.vue index 04290bf51..75e6f9550 100644 --- a/apps/web-antd/src/views/mes/md/autocode/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/autocode/modules/form.vue @@ -76,7 +76,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData(); if (!data?.id) { diff --git a/apps/web-antd/src/views/mes/md/autocode/modules/part-form.vue b/apps/web-antd/src/views/mes/md/autocode/modules/part-form.vue index 205a2125b..d1ba56e4e 100644 --- a/apps/web-antd/src/views/mes/md/autocode/modules/part-form.vue +++ b/apps/web-antd/src/views/mes/md/autocode/modules/part-form.vue @@ -86,7 +86,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-antd/src/views/mes/md/client/modules/form.vue b/apps/web-antd/src/views/mes/md/client/modules/form.vue index 49e3a4eff..7b78ec05b 100644 --- a/apps/web-antd/src/views/mes/md/client/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/client/modules/form.vue @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -75,7 +72,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'productSalesLine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/md/item/modules/form.vue b/apps/web-antd/src/views/mes/md/item/modules/form.vue index 15ff74a2b..9008507c5 100644 --- a/apps/web-antd/src/views/mes/md/item/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/item/modules/form.vue @@ -52,9 +52,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看物料条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -103,7 +100,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'bom'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/md/item/type/modules/form.vue b/apps/web-antd/src/views/mes/md/item/type/modules/form.vue index 9d59b4646..3b91a56ec 100644 --- a/apps/web-antd/src/views/mes/md/item/type/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/item/type/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -65,7 +62,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/mes/md/unitmeasure/modules/form.vue b/apps/web-antd/src/views/mes/md/unitmeasure/modules/form.vue index cfd906fc8..3f4e0af35 100644 --- a/apps/web-antd/src/views/mes/md/unitmeasure/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/unitmeasure/modules/form.vue @@ -68,7 +68,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/mes/md/vendor/modules/form.vue b/apps/web-antd/src/views/mes/md/vendor/modules/form.vue index f12e7c206..a55a2cab9 100644 --- a/apps/web-antd/src/views/mes/md/vendor/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/vendor/modules/form.vue @@ -46,9 +46,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -77,7 +74,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'itemReceiptLine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/md/workstation/modules/form.vue b/apps/web-antd/src/views/mes/md/workstation/modules/form.vue index aa3f269bf..204cb5214 100644 --- a/apps/web-antd/src/views/mes/md/workstation/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/workstation/modules/form.vue @@ -52,9 +52,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看工作站条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -102,7 +99,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'machine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/md/workstation/workshop/modules/form.vue b/apps/web-antd/src/views/mes/md/workstation/workshop/modules/form.vue index 1b708029b..372006587 100644 --- a/apps/web-antd/src/views/mes/md/workstation/workshop/modules/form.vue +++ b/apps/web-antd/src/views/mes/md/workstation/workshop/modules/form.vue @@ -48,9 +48,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看车间条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -92,7 +89,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue b/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue index 1b7272681..e233b77f1 100644 --- a/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue @@ -49,9 +49,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 处置:保存(保持 ACTIVE 状态) */ async function handleSave() { modalApi.lock(); @@ -136,7 +133,6 @@ const [Modal, modalApi] = useVbenModal({ formType.value = data.formType; formApi.setState({ schema: useFormSchema(formType.value, formApi) }); modalApi.setState({ showConfirmButton: formType.value === 'create' }); - await formApi.resetForm(); if (formType.value === 'create') { // 新增时,发起人默认为当前用户 await formApi.setValues({ userId: userStore.userInfo?.id }); diff --git a/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue b/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue index d0c8a84ce..40e22c3e8 100644 --- a/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue @@ -82,9 +82,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-3', }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 提交前对齐数量:根据 checkFlag 决定 uncheck/合格/不良归零策略 */ function alignQuantity(data: MesProFeedbackApi.Feedback) { if (data.checkFlag) { @@ -239,7 +236,6 @@ const [Modal, modalApi] = useVbenModal({ showConfirmButton: formType.value !== 'detail' && formType.value !== 'approve', }); - await formApi.resetForm(); if (!data?.id) { // 新增:默认报工人和报工时间,并自动生成报工单号 const code = await generateAutoCode( diff --git a/apps/web-antd/src/views/mes/pro/process/modules/content-form.vue b/apps/web-antd/src/views/mes/pro/process/modules/content-form.vue index eb4270b25..ff0c33ac2 100644 --- a/apps/web-antd/src/views/mes/pro/process/modules/content-form.vue +++ b/apps/web-antd/src/views/mes/pro/process/modules/content-form.vue @@ -65,7 +65,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-antd/src/views/mes/pro/process/modules/form.vue b/apps/web-antd/src/views/mes/pro/process/modules/form.vue index a3d910c8d..540c0bea6 100644 --- a/apps/web-antd/src/views/mes/pro/process/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/process/modules/form.vue @@ -48,9 +48,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-3', }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -79,7 +76,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; 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 index 8e2f4c243..e03a816bd 100644 --- 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 @@ -78,7 +78,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; 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 f381fe8d2..9defcdcf5 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 @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-2', }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -82,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTab.value = 'process'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); 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 d4f7681fa..b742c6388 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 @@ -81,7 +81,6 @@ const [Modal, modalApi] = useVbenModal({ // 工序下拉依赖远程数据,schema 在弹窗打开时再生成 const schema = await loadSchema(); formApi.setState({ schema }); - await formApi.resetForm(); } finally { modalApi.unlock(); } diff --git a/apps/web-antd/src/views/mes/pro/route/modules/product-form.vue b/apps/web-antd/src/views/mes/pro/route/modules/product-form.vue index 47ce4ba12..a3b0e5d25 100644 --- a/apps/web-antd/src/views/mes/pro/route/modules/product-form.vue +++ b/apps/web-antd/src/views/mes/pro/route/modules/product-form.vue @@ -83,7 +83,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-antd/src/views/mes/qc/defect/modules/form.vue b/apps/web-antd/src/views/mes/qc/defect/modules/form.vue index a3dc3badf..a0076a4e8 100644 --- a/apps/web-antd/src/views/mes/qc/defect/modules/form.vue +++ b/apps/web-antd/src/views/mes/qc/defect/modules/form.vue @@ -34,9 +34,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -61,7 +58,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue b/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue index 7b40dbfd1..d9a8ee39c 100644 --- a/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue +++ b/apps/web-antd/src/views/mes/qc/indicator/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码、跨字段联动),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-antd/src/views/mes/qc/template/modules/form.vue b/apps/web-antd/src/views/mes/qc/template/modules/form.vue index 701d0f3fe..4966a298c 100644 --- a/apps/web-antd/src/views/mes/qc/template/modules/form.vue +++ b/apps/web-antd/src/views/mes/qc/template/modules/form.vue @@ -49,9 +49,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (formType.value === 'detail') { @@ -80,7 +77,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'indicator'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue b/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue index cfbd1a238..59ac8cf69 100644 --- a/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue +++ b/apps/web-antd/src/views/mes/qc/template/modules/indicator-form.vue @@ -69,7 +69,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData< MesQcTemplateIndicatorApi.TemplateIndicator & { templateId: number } diff --git a/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue b/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue index 72262de2c..f417263b2 100644 --- a/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue +++ b/apps/web-antd/src/views/mes/qc/template/modules/item-form.vue @@ -68,7 +68,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData< MesQcTemplateItemApi.TemplateItem & { templateId: number } diff --git a/apps/web-antd/src/views/mes/tm/tool/modules/form.vue b/apps/web-antd/src/views/mes/tm/tool/modules/form.vue index f964457e0..03f88e467 100644 --- a/apps/web-antd/src/views/mes/tm/tool/modules/form.vue +++ b/apps/web-antd/src/views/mes/tm/tool/modules/form.vue @@ -46,9 +46,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看工具条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -90,7 +87,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/tm/tool/type/modules/form.vue b/apps/web-antd/src/views/mes/tm/tool/type/modules/form.vue index 9b8ce574b..172563cda 100644 --- a/apps/web-antd/src/views/mes/tm/tool/type/modules/form.vue +++ b/apps/web-antd/src/views/mes/tm/tool/type/modules/form.vue @@ -43,9 +43,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -74,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-antd/src/views/mes/utils/constants.ts b/apps/web-antd/src/views/mes/utils/constants.ts index 15993c32a..d931e83d1 100644 --- a/apps/web-antd/src/views/mes/utils/constants.ts +++ b/apps/web-antd/src/views/mes/utils/constants.ts @@ -141,6 +141,8 @@ export const MesAutoCodeRuleCode = { PRO_WORK_ORDER_CODE: 'PRO_WORK_ORDER_CODE', QC_DEFECT_CODE: 'QC_DEFECT_CODE', QC_INDICATOR_CODE: 'QC_INDICATOR_CODE', + QC_INDICATOR_RESULT_CODE: 'QC_INDICATOR_RESULT_CODE', + QC_IQC_CODE: 'QC_IQC_CODE', QC_TEMPLATE_CODE: 'QC_TEMPLATE_CODE', TM_TOOL_TYPE_CODE: 'TM_TOOL_TYPE_CODE', TM_TOOL_CODE: 'TM_TOOL_CODE', @@ -215,6 +217,47 @@ export const MesQcResultValueType = { FILE: 5, } as const; +/** MES 业务类型常量 */ +export const MesBizTypeEnum = { + // WM 仓库模块 [100, 200) + WM_ARRIVAL_NOTICE: 100, // 到货通知单 + WM_RETURN_ISSUE: 116, // 生产退料 + WM_PRODUCT_SALES: 118, // 销售出库 + WM_RETURN_SALES: 119, // 销售退货入库 + WM_OUTSOURCE_RECPT: 121, // 外协入库 + + // PRO 生产模块 [300, 400) + PRO_FEEDBACK: 304, // 生产报工 +} as const; + +/** MES 质检来源单据类型枚举 */ +export const MesQcSourceDocTypeEnum = { + // IQC + ARRIVAL_NOTICE: MesBizTypeEnum.WM_ARRIVAL_NOTICE, + OUTSOURCE_RECPT: MesBizTypeEnum.WM_OUTSOURCE_RECPT, + // IPQC + PRO_FEEDBACK: MesBizTypeEnum.PRO_FEEDBACK, + // OQC + PRODUCT_SALES: MesBizTypeEnum.WM_PRODUCT_SALES, + // RQC + RETURN_ISSUE: MesBizTypeEnum.WM_RETURN_ISSUE, + RETURN_SALES: MesBizTypeEnum.WM_RETURN_SALES, +} as const; + +/** MES 质检类型枚举 */ +export const MesQcTypeEnum = { + IQC: 1, // 来料检验 + IPQC: 2, // 过程检验 + OQC: 3, // 出货检验 + RQC: 4, // 退货检验 +} as const; + +/** MES 质检单状态枚举 */ +export const MesQcStatusEnum = { + DRAFT: MesOrderStatusConstants.DRAFT, + FINISHED: MesOrderStatusConstants.FINISHED, +} as const; + /** MES 编码规则分段类型枚举 */ export const MesAutoCodePartTypeEnum = { INPUT: 1, diff --git a/apps/web-antd/src/views/wms/md/item/brand/data.ts b/apps/web-antd/src/views/wms/md/item/brand/data.ts index 5865a1215..55feec3fe 100644 --- a/apps/web-antd/src/views/wms/md/item/brand/data.ts +++ b/apps/web-antd/src/views/wms/md/item/brand/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -9,7 +9,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改商品品牌的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue b/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue index 8b69b50be..9f20b8b34 100644 --- a/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue +++ b/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue @@ -39,9 +39,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -66,7 +63,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { return; diff --git a/apps/web-antd/src/views/wms/md/item/category/data.ts b/apps/web-antd/src/views/wms/md/item/category/data.ts index 12169a006..30e3823a7 100644 --- a/apps/web-antd/src/views/wms/md/item/category/data.ts +++ b/apps/web-antd/src/views/wms/md/item/category/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { WmsItemCategoryApi } from '#/api/wms/md/item/category'; @@ -15,7 +15,7 @@ import { getItemCategorySimpleList } from '#/api/wms/md/item/category'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改商品分类的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { fieldName: 'id', diff --git a/apps/web-antd/src/views/wms/md/item/category/modules/form.vue b/apps/web-antd/src/views/wms/md/item/category/modules/form.vue index 584dc0d95..b4b26853d 100644 --- a/apps/web-antd/src/views/wms/md/item/category/modules/form.vue +++ b/apps/web-antd/src/views/wms/md/item/category/modules/form.vue @@ -41,9 +41,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -70,7 +67,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { formData.value = data; diff --git a/apps/web-antd/src/views/wms/md/item/data.ts b/apps/web-antd/src/views/wms/md/item/data.ts index 9b4a4e555..47482e5ac 100644 --- a/apps/web-antd/src/views/wms/md/item/data.ts +++ b/apps/web-antd/src/views/wms/md/item/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h, markRaw } from 'vue'; @@ -13,7 +13,7 @@ import { WmsItemBrandSelect } from './brand/components'; import { WmsItemCategorySelect } from './category/components'; /** 新增/修改商品的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/wms/md/item/modules/form.vue b/apps/web-antd/src/views/wms/md/item/modules/form.vue index ccc707efd..482eca9a8 100644 --- a/apps/web-antd/src/views/wms/md/item/modules/form.vue +++ b/apps/web-antd/src/views/wms/md/item/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - async function resetSkuForm(item?: WmsItemApi.Item) { await nextTick(); await skuFormRef.value?.setRows(item?.skus); @@ -77,7 +74,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); await resetSkuForm(); // 加载数据 const data = modalApi.getData(); diff --git a/apps/web-antd/src/views/wms/md/merchant/data.ts b/apps/web-antd/src/views/wms/md/merchant/data.ts index 5f76f7387..bbc16d574 100644 --- a/apps/web-antd/src/views/wms/md/merchant/data.ts +++ b/apps/web-antd/src/views/wms/md/merchant/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -12,7 +12,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改往来企业的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/wms/md/merchant/modules/form.vue b/apps/web-antd/src/views/wms/md/merchant/modules/form.vue index 35871a5ac..4a1329efb 100644 --- a/apps/web-antd/src/views/wms/md/merchant/modules/form.vue +++ b/apps/web-antd/src/views/wms/md/merchant/modules/form.vue @@ -40,9 +40,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { return; diff --git a/apps/web-antd/src/views/wms/md/warehouse/data.ts b/apps/web-antd/src/views/wms/md/warehouse/data.ts index e64ccecd3..7b1813a09 100644 --- a/apps/web-antd/src/views/wms/md/warehouse/data.ts +++ b/apps/web-antd/src/views/wms/md/warehouse/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -9,7 +9,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改仓库的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue index 95d3e7eaa..9d16aa0fd 100644 --- a/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue +++ b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue @@ -40,9 +40,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -69,6 +66,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { await formApi.setValues({ sort: 0 }); diff --git a/apps/web-antd/src/views/wms/order/check/modules/form.vue b/apps/web-antd/src/views/wms/order/check/modules/form.vue index 59e87dac9..6094ec1b2 100644 --- a/apps/web-antd/src/views/wms/order/check/modules/form.vue +++ b/apps/web-antd/src/views/wms/order/check/modules/form.vue @@ -535,7 +535,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-antd/src/views/wms/order/movement/modules/form.vue b/apps/web-antd/src/views/wms/order/movement/modules/form.vue index f1d2a7d30..1e0bf8f5d 100644 --- a/apps/web-antd/src/views/wms/order/movement/modules/form.vue +++ b/apps/web-antd/src/views/wms/order/movement/modules/form.vue @@ -373,7 +373,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/form.vue b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue index 2b7acf71c..fd47e02ce 100644 --- a/apps/web-antd/src/views/wms/order/receipt/modules/form.vue +++ b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue @@ -317,7 +317,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-antd/src/views/wms/order/shipment/modules/form.vue b/apps/web-antd/src/views/wms/order/shipment/modules/form.vue index eb077a1c7..4928298ee 100644 --- a/apps/web-antd/src/views/wms/order/shipment/modules/form.vue +++ b/apps/web-antd/src/views/wms/order/shipment/modules/form.vue @@ -360,7 +360,6 @@ const [Modal, modalApi] = useVbenModal({ return; } initializing.value = true; - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-ele/src/views/crm/permission/modules/transfer-form.vue b/apps/web-ele/src/views/crm/permission/modules/transfer-form.vue index 594777048..6f5b39621 100644 --- a/apps/web-ele/src/views/crm/permission/modules/transfer-form.vue +++ b/apps/web-ele/src/views/crm/permission/modules/transfer-form.vue @@ -100,7 +100,6 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - await formApi.resetForm(); return; } // 加载数据 diff --git a/apps/web-ele/src/views/iot/product/product/data.ts b/apps/web-ele/src/views/iot/product/product/data.ts index f108be5f8..6e5926077 100644 --- a/apps/web-ele/src/views/iot/product/product/data.ts +++ b/apps/web-ele/src/views/iot/product/product/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { IotProductApi } from '#/api/iot/product/product'; @@ -14,7 +14,7 @@ import { getSimpleProductCategoryList } from '#/api/iot/product/category'; /** 基础表单字段(不含图标、图片、描述) */ export function useBasicFormSchema( - formApi?: any, + formApi?: VbenFormApi, generateProductKey?: () => string, ): VbenFormSchema[] { return [ diff --git a/apps/web-ele/src/views/iot/product/product/modules/form.vue b/apps/web-ele/src/views/iot/product/product/modules/form.vue index 58c9186a5..ad6a790b3 100644 --- a/apps/web-ele/src/views/iot/product/product/modules/form.vue +++ b/apps/web-ele/src/views/iot/product/product/modules/form.vue @@ -60,9 +60,6 @@ const [AdvancedForm, advancedFormApi] = useVbenForm({ showDefaultActions: false, }); -/** 基础表单需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useBasicFormSchema(formApi, generateProductKey) }); - /** 获取高级表单的值(如果表单未挂载,则从 formData 中获取) */ async function getAdvancedFormValues() { if (advancedFormApi.isMounted) { @@ -106,6 +103,9 @@ const [Modal, modalApi] = useVbenModal({ activeKey.value = []; return; } + formApi.setState({ + schema: useBasicFormSchema(formApi, generateProductKey), + }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/iot/rule/data/rule/modules/form.vue b/apps/web-ele/src/views/iot/rule/data/rule/modules/form.vue index 7f4adf27e..393f17d09 100644 --- a/apps/web-ele/src/views/iot/rule/data/rule/modules/form.vue +++ b/apps/web-ele/src/views/iot/rule/data/rule/modules/form.vue @@ -69,7 +69,6 @@ const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; - await formApi.resetForm(); sourceConfigRef.value?.setData([]); return; } diff --git a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue index 789ecd139..6516e30ea 100644 --- a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue +++ b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue @@ -134,7 +134,6 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); }, }); diff --git a/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue b/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue index 3dd8c1867..b529caee1 100644 --- a/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue @@ -7,7 +7,7 @@ import type { SpuProperty, } from '#/views/mall/product/spu/components'; -import { computed, nextTick, ref } from 'vue'; +import { computed, ref } from 'vue'; import { useVbenForm, useVbenModal } from '@vben/common-ui'; import { PromotionDiscountTypeEnum } from '@vben/constants'; @@ -213,13 +213,11 @@ function handleSkuDiscountPercentChange(row: SkuExtension) { } /** 重置表单 */ -async function resetForm() { +function resetForm() { spuList.value = []; spuPropertyList.value = []; spuIdList.value = []; formData.value = {}; - await nextTick(); - await formApi.resetForm(); } // ================= 弹窗相关 ================= @@ -264,7 +262,7 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - await resetForm(); + resetForm(); return; } // 加载数据 diff --git a/apps/web-ele/src/views/mes/cal/holiday/modules/form.vue b/apps/web-ele/src/views/mes/cal/holiday/modules/form.vue index b7d155991..38c8c74b9 100644 --- a/apps/web-ele/src/views/mes/cal/holiday/modules/form.vue +++ b/apps/web-ele/src/views/mes/cal/holiday/modules/form.vue @@ -50,7 +50,6 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); const data = modalApi.getData<{ day: string }>(); if (!data?.day) { return; diff --git a/apps/web-ele/src/views/mes/cal/plan/modules/form.vue b/apps/web-ele/src/views/mes/cal/plan/modules/form.vue index 4300f3edf..433658c5b 100644 --- a/apps/web-ele/src/views/mes/cal/plan/modules/form.vue +++ b/apps/web-ele/src/views/mes/cal/plan/modules/form.vue @@ -50,9 +50,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 确认排班计划 */ async function handleConfirmPlan() { const { valid } = await formApi.validate(); @@ -107,7 +104,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'shift'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/cal/team/modules/form.vue b/apps/web-ele/src/views/mes/cal/team/modules/form.vue index 17a70a355..959de5dc0 100644 --- a/apps/web-ele/src/views/mes/cal/team/modules/form.vue +++ b/apps/web-ele/src/views/mes/cal/team/modules/form.vue @@ -45,9 +45,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -82,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'member'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue b/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue index edda2c7b8..179675c36 100644 --- a/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -81,7 +78,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'machinery'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue b/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue index c355deebc..67d2874a8 100644 --- a/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue @@ -103,7 +103,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue index 524946e24..e8727173a 100644 --- a/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue @@ -47,9 +47,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 查看设备条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -91,7 +88,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); subTabsName.value = 'check'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue b/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue index 5a3aae39c..d7357471e 100644 --- a/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue index 02158e5cd..5211903a8 100644 --- a/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue @@ -110,7 +110,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/dv/repair/modules/form.vue b/apps/web-ele/src/views/mes/dv/repair/modules/form.vue index fcff4d0ea..695138673 100644 --- a/apps/web-ele/src/views/mes/dv/repair/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/repair/modules/form.vue @@ -57,9 +57,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 提交维修工单 */ async function handleSubmit() { const { valid } = await formApi.validate(); @@ -164,7 +161,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/dv/subject/modules/form.vue b/apps/web-ele/src/views/mes/dv/subject/modules/form.vue index abdb412be..82e0bc189 100644 --- a/apps/web-ele/src/views/mes/dv/subject/modules/form.vue +++ b/apps/web-ele/src/views/mes/dv/subject/modules/form.vue @@ -39,9 +39,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -69,7 +66,7 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/md/autocode/modules/form.vue b/apps/web-ele/src/views/mes/md/autocode/modules/form.vue index a87d7b7ec..50b0261db 100644 --- a/apps/web-ele/src/views/mes/md/autocode/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/autocode/modules/form.vue @@ -76,7 +76,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData(); if (!data?.id) { diff --git a/apps/web-ele/src/views/mes/md/autocode/modules/part-form.vue b/apps/web-ele/src/views/mes/md/autocode/modules/part-form.vue index ee839560a..efc1e95a1 100644 --- a/apps/web-ele/src/views/mes/md/autocode/modules/part-form.vue +++ b/apps/web-ele/src/views/mes/md/autocode/modules/part-form.vue @@ -86,7 +86,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-ele/src/views/mes/md/client/modules/form.vue b/apps/web-ele/src/views/mes/md/client/modules/form.vue index 3d22f5f4e..1b66c01c5 100644 --- a/apps/web-ele/src/views/mes/md/client/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/client/modules/form.vue @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -75,7 +72,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'productSalesLine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/md/item/modules/form.vue b/apps/web-ele/src/views/mes/md/item/modules/form.vue index 913e02eec..101113e24 100644 --- a/apps/web-ele/src/views/mes/md/item/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/item/modules/form.vue @@ -52,9 +52,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看物料条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -103,7 +100,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'bom'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/md/item/type/modules/form.vue b/apps/web-ele/src/views/mes/md/item/type/modules/form.vue index 580690139..7c6f7328d 100644 --- a/apps/web-ele/src/views/mes/md/item/type/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/item/type/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -65,7 +62,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/mes/md/unitmeasure/modules/form.vue b/apps/web-ele/src/views/mes/md/unitmeasure/modules/form.vue index dc5eb9cdf..1167c4195 100644 --- a/apps/web-ele/src/views/mes/md/unitmeasure/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/unitmeasure/modules/form.vue @@ -68,7 +68,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/mes/md/vendor/modules/form.vue b/apps/web-ele/src/views/mes/md/vendor/modules/form.vue index 433e7f8dc..66c020901 100644 --- a/apps/web-ele/src/views/mes/md/vendor/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/vendor/modules/form.vue @@ -46,9 +46,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -77,7 +74,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'itemReceiptLine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/md/workstation/modules/form.vue b/apps/web-ele/src/views/mes/md/workstation/modules/form.vue index b9d2e87ae..0e24bae46 100644 --- a/apps/web-ele/src/views/mes/md/workstation/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/workstation/modules/form.vue @@ -52,9 +52,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看工作站条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -102,7 +99,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'machine'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/md/workstation/workshop/modules/form.vue b/apps/web-ele/src/views/mes/md/workstation/workshop/modules/form.vue index 191bbbd94..3f8fe45cd 100644 --- a/apps/web-ele/src/views/mes/md/workstation/workshop/modules/form.vue +++ b/apps/web-ele/src/views/mes/md/workstation/workshop/modules/form.vue @@ -48,9 +48,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看车间条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -92,7 +89,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/pro/andon/record/modules/form.vue b/apps/web-ele/src/views/mes/pro/andon/record/modules/form.vue index 83261cd22..7963930d5 100644 --- a/apps/web-ele/src/views/mes/pro/andon/record/modules/form.vue +++ b/apps/web-ele/src/views/mes/pro/andon/record/modules/form.vue @@ -49,9 +49,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 处置:保存(保持 ACTIVE 状态) */ async function handleSave() { modalApi.lock(); @@ -136,7 +133,6 @@ const [Modal, modalApi] = useVbenModal({ formType.value = data.formType; formApi.setState({ schema: useFormSchema(formType.value, formApi) }); modalApi.setState({ showConfirmButton: formType.value === 'create' }); - await formApi.resetForm(); if (formType.value === 'create') { // 新增时,发起人默认为当前用户 await formApi.setValues({ userId: userStore.userInfo?.id }); diff --git a/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue b/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue index 91896b74c..879223439 100644 --- a/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue +++ b/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue @@ -88,9 +88,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-3', }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formType.value, formApi) }); - /** 提交前对齐数量:根据 checkFlag 决定 uncheck/合格/不良归零策略 */ function alignQuantity(data: MesProFeedbackApi.Feedback) { if (data.checkFlag) { @@ -247,7 +244,6 @@ const [Modal, modalApi] = useVbenModal({ showConfirmButton: formType.value !== 'detail' && formType.value !== 'approve', }); - await formApi.resetForm(); if (!data?.id) { // 新增:默认报工人和报工时间,并自动生成报工单号 const code = await generateAutoCode( diff --git a/apps/web-ele/src/views/mes/pro/process/modules/content-form.vue b/apps/web-ele/src/views/mes/pro/process/modules/content-form.vue index 46544dccd..62675bdb2 100644 --- a/apps/web-ele/src/views/mes/pro/process/modules/content-form.vue +++ b/apps/web-ele/src/views/mes/pro/process/modules/content-form.vue @@ -65,7 +65,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-ele/src/views/mes/pro/process/modules/form.vue b/apps/web-ele/src/views/mes/pro/process/modules/form.vue index 4afb9aa04..451f6d6a8 100644 --- a/apps/web-ele/src/views/mes/pro/process/modules/form.vue +++ b/apps/web-ele/src/views/mes/pro/process/modules/form.vue @@ -48,9 +48,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-3', }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -79,7 +76,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/pro/route/modules/bom-form.vue b/apps/web-ele/src/views/mes/pro/route/modules/bom-form.vue index e348b31b4..5feeb51f3 100644 --- a/apps/web-ele/src/views/mes/pro/route/modules/bom-form.vue +++ b/apps/web-ele/src/views/mes/pro/route/modules/bom-form.vue @@ -78,7 +78,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-ele/src/views/mes/pro/route/modules/form.vue b/apps/web-ele/src/views/mes/pro/route/modules/form.vue index ce15b7657..105b7aee7 100644 --- a/apps/web-ele/src/views/mes/pro/route/modules/form.vue +++ b/apps/web-ele/src/views/mes/pro/route/modules/form.vue @@ -44,9 +44,6 @@ const [Form, formApi] = useVbenForm({ wrapperClass: 'grid-cols-2', }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -82,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTab.value = 'process'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/pro/route/modules/process-form.vue b/apps/web-ele/src/views/mes/pro/route/modules/process-form.vue index eb5fe30a0..af5e2938f 100644 --- a/apps/web-ele/src/views/mes/pro/route/modules/process-form.vue +++ b/apps/web-ele/src/views/mes/pro/route/modules/process-form.vue @@ -81,7 +81,6 @@ const [Modal, modalApi] = useVbenModal({ // 工序下拉依赖远程数据,schema 在弹窗打开时再生成 const schema = await loadSchema(); formApi.setState({ schema }); - await formApi.resetForm(); } finally { modalApi.unlock(); } diff --git a/apps/web-ele/src/views/mes/pro/route/modules/product-form.vue b/apps/web-ele/src/views/mes/pro/route/modules/product-form.vue index f07c1a532..626506762 100644 --- a/apps/web-ele/src/views/mes/pro/route/modules/product-form.vue +++ b/apps/web-ele/src/views/mes/pro/route/modules/product-form.vue @@ -83,7 +83,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData<{ id?: number; diff --git a/apps/web-ele/src/views/mes/qc/defect/modules/form.vue b/apps/web-ele/src/views/mes/qc/defect/modules/form.vue index 0b0ce0cd6..7041c3d9e 100644 --- a/apps/web-ele/src/views/mes/qc/defect/modules/form.vue +++ b/apps/web-ele/src/views/mes/qc/defect/modules/form.vue @@ -34,9 +34,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -61,7 +58,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue b/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue index 72ed12284..98444ed27 100644 --- a/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue +++ b/apps/web-ele/src/views/mes/qc/indicator/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码、跨字段联动),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { diff --git a/apps/web-ele/src/views/mes/qc/template/modules/form.vue b/apps/web-ele/src/views/mes/qc/template/modules/form.vue index bfedadfc5..53672d7fa 100644 --- a/apps/web-ele/src/views/mes/qc/template/modules/form.vue +++ b/apps/web-ele/src/views/mes/qc/template/modules/form.vue @@ -49,9 +49,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用(生成编码按钮),所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (formType.value === 'detail') { @@ -80,7 +77,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); subTabsName.value = 'indicator'; // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); diff --git a/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue b/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue index 073ff2ca7..31581cd0a 100644 --- a/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue +++ b/apps/web-ele/src/views/mes/qc/template/modules/indicator-form.vue @@ -69,7 +69,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData< MesQcTemplateIndicatorApi.TemplateIndicator & { templateId: number } diff --git a/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue b/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue index 12df446f9..9a5f25a5e 100644 --- a/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue +++ b/apps/web-ele/src/views/mes/qc/template/modules/item-form.vue @@ -69,7 +69,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); // 加载数据 const data = modalApi.getData< MesQcTemplateItemApi.TemplateItem & { templateId: number } diff --git a/apps/web-ele/src/views/mes/tm/tool/modules/form.vue b/apps/web-ele/src/views/mes/tm/tool/modules/form.vue index 8ab516ab1..ccb2b405e 100644 --- a/apps/web-ele/src/views/mes/tm/tool/modules/form.vue +++ b/apps/web-ele/src/views/mes/tm/tool/modules/form.vue @@ -46,9 +46,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - /** 查看工具条码 */ function handleBarcode() { if (!formData.value?.id) { @@ -90,7 +87,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/tm/tool/type/modules/form.vue b/apps/web-ele/src/views/mes/tm/tool/type/modules/form.vue index e9a3cc46f..99a3d1730 100644 --- a/apps/web-ele/src/views/mes/tm/tool/type/modules/form.vue +++ b/apps/web-ele/src/views/mes/tm/tool/type/modules/form.vue @@ -43,9 +43,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { if (isDetail.value) { @@ -74,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); // 加载数据 const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; diff --git a/apps/web-ele/src/views/mes/utils/constants.ts b/apps/web-ele/src/views/mes/utils/constants.ts index 15993c32a..d931e83d1 100644 --- a/apps/web-ele/src/views/mes/utils/constants.ts +++ b/apps/web-ele/src/views/mes/utils/constants.ts @@ -141,6 +141,8 @@ export const MesAutoCodeRuleCode = { PRO_WORK_ORDER_CODE: 'PRO_WORK_ORDER_CODE', QC_DEFECT_CODE: 'QC_DEFECT_CODE', QC_INDICATOR_CODE: 'QC_INDICATOR_CODE', + QC_INDICATOR_RESULT_CODE: 'QC_INDICATOR_RESULT_CODE', + QC_IQC_CODE: 'QC_IQC_CODE', QC_TEMPLATE_CODE: 'QC_TEMPLATE_CODE', TM_TOOL_TYPE_CODE: 'TM_TOOL_TYPE_CODE', TM_TOOL_CODE: 'TM_TOOL_CODE', @@ -215,6 +217,47 @@ export const MesQcResultValueType = { FILE: 5, } as const; +/** MES 业务类型常量 */ +export const MesBizTypeEnum = { + // WM 仓库模块 [100, 200) + WM_ARRIVAL_NOTICE: 100, // 到货通知单 + WM_RETURN_ISSUE: 116, // 生产退料 + WM_PRODUCT_SALES: 118, // 销售出库 + WM_RETURN_SALES: 119, // 销售退货入库 + WM_OUTSOURCE_RECPT: 121, // 外协入库 + + // PRO 生产模块 [300, 400) + PRO_FEEDBACK: 304, // 生产报工 +} as const; + +/** MES 质检来源单据类型枚举 */ +export const MesQcSourceDocTypeEnum = { + // IQC + ARRIVAL_NOTICE: MesBizTypeEnum.WM_ARRIVAL_NOTICE, + OUTSOURCE_RECPT: MesBizTypeEnum.WM_OUTSOURCE_RECPT, + // IPQC + PRO_FEEDBACK: MesBizTypeEnum.PRO_FEEDBACK, + // OQC + PRODUCT_SALES: MesBizTypeEnum.WM_PRODUCT_SALES, + // RQC + RETURN_ISSUE: MesBizTypeEnum.WM_RETURN_ISSUE, + RETURN_SALES: MesBizTypeEnum.WM_RETURN_SALES, +} as const; + +/** MES 质检类型枚举 */ +export const MesQcTypeEnum = { + IQC: 1, // 来料检验 + IPQC: 2, // 过程检验 + OQC: 3, // 出货检验 + RQC: 4, // 退货检验 +} as const; + +/** MES 质检单状态枚举 */ +export const MesQcStatusEnum = { + DRAFT: MesOrderStatusConstants.DRAFT, + FINISHED: MesOrderStatusConstants.FINISHED, +} as const; + /** MES 编码规则分段类型枚举 */ export const MesAutoCodePartTypeEnum = { INPUT: 1, diff --git a/apps/web-ele/src/views/wms/md/item/brand/data.ts b/apps/web-ele/src/views/wms/md/item/brand/data.ts index cebea33e7..692c23138 100644 --- a/apps/web-ele/src/views/wms/md/item/brand/data.ts +++ b/apps/web-ele/src/views/wms/md/item/brand/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -9,7 +9,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改商品品牌的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue b/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue index 2630f0493..193796eae 100644 --- a/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue +++ b/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue @@ -39,9 +39,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -66,7 +63,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { return; diff --git a/apps/web-ele/src/views/wms/md/item/category/data.ts b/apps/web-ele/src/views/wms/md/item/category/data.ts index e6e536434..be1da0778 100644 --- a/apps/web-ele/src/views/wms/md/item/category/data.ts +++ b/apps/web-ele/src/views/wms/md/item/category/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { WmsItemCategoryApi } from '#/api/wms/md/item/category'; @@ -15,7 +15,7 @@ import { getItemCategorySimpleList } from '#/api/wms/md/item/category'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改商品分类的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { fieldName: 'id', diff --git a/apps/web-ele/src/views/wms/md/item/category/modules/form.vue b/apps/web-ele/src/views/wms/md/item/category/modules/form.vue index ec7b39937..369398247 100644 --- a/apps/web-ele/src/views/wms/md/item/category/modules/form.vue +++ b/apps/web-ele/src/views/wms/md/item/category/modules/form.vue @@ -41,9 +41,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -70,7 +67,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { formData.value = data; diff --git a/apps/web-ele/src/views/wms/md/item/data.ts b/apps/web-ele/src/views/wms/md/item/data.ts index 0e0fb4042..e8463a57a 100644 --- a/apps/web-ele/src/views/wms/md/item/data.ts +++ b/apps/web-ele/src/views/wms/md/item/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h, markRaw } from 'vue'; @@ -13,7 +13,7 @@ import { WmsItemBrandSelect } from './brand/components'; import { WmsItemCategorySelect } from './category/components'; /** 新增/修改商品的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-ele/src/views/wms/md/item/modules/form.vue b/apps/web-ele/src/views/wms/md/item/modules/form.vue index 87ec84ba6..67f42d878 100644 --- a/apps/web-ele/src/views/wms/md/item/modules/form.vue +++ b/apps/web-ele/src/views/wms/md/item/modules/form.vue @@ -38,9 +38,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - async function resetSkuForm(item?: WmsItemApi.Item) { await nextTick(); await skuFormRef.value?.setRows(item?.skus); @@ -77,7 +74,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); await resetSkuForm(); // 加载数据 const data = modalApi.getData(); diff --git a/apps/web-ele/src/views/wms/md/merchant/data.ts b/apps/web-ele/src/views/wms/md/merchant/data.ts index 95903f7b1..189c6870b 100644 --- a/apps/web-ele/src/views/wms/md/merchant/data.ts +++ b/apps/web-ele/src/views/wms/md/merchant/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -12,7 +12,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改往来企业的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-ele/src/views/wms/md/merchant/modules/form.vue b/apps/web-ele/src/views/wms/md/merchant/modules/form.vue index 2e4e2807f..bdefaa2c8 100644 --- a/apps/web-ele/src/views/wms/md/merchant/modules/form.vue +++ b/apps/web-ele/src/views/wms/md/merchant/modules/form.vue @@ -40,9 +40,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -67,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - await formApi.resetForm(); + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { return; diff --git a/apps/web-ele/src/views/wms/md/warehouse/data.ts b/apps/web-ele/src/views/wms/md/warehouse/data.ts index 42cca9655..0803bf321 100644 --- a/apps/web-ele/src/views/wms/md/warehouse/data.ts +++ b/apps/web-ele/src/views/wms/md/warehouse/data.ts @@ -1,4 +1,4 @@ -import type { VbenFormSchema } from '#/adapter/form'; +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { h } from 'vue'; @@ -9,7 +9,7 @@ import { z } from '#/adapter/form'; import { generateWmsCode } from '#/views/wms/utils/constants'; /** 新增/修改仓库的表单 */ -export function useFormSchema(formApi?: any): VbenFormSchema[] { +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue index 93709fe89..985092a7f 100644 --- a/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue +++ b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue @@ -40,9 +40,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -/** 表单 schema 需要 formApi 引用,所以通过 setState 设置 schema */ -formApi.setState({ schema: useFormSchema(formApi) }); - const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -69,6 +66,7 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } + formApi.setState({ schema: useFormSchema(formApi) }); const data = modalApi.getData(); if (!data || !data.id) { await formApi.setValues({ sort: 0 }); diff --git a/apps/web-ele/src/views/wms/order/check/modules/form.vue b/apps/web-ele/src/views/wms/order/check/modules/form.vue index b7dfb9c21..fb259a46d 100644 --- a/apps/web-ele/src/views/wms/order/check/modules/form.vue +++ b/apps/web-ele/src/views/wms/order/check/modules/form.vue @@ -535,7 +535,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-ele/src/views/wms/order/movement/modules/form.vue b/apps/web-ele/src/views/wms/order/movement/modules/form.vue index 596e61d7e..148277c07 100644 --- a/apps/web-ele/src/views/wms/order/movement/modules/form.vue +++ b/apps/web-ele/src/views/wms/order/movement/modules/form.vue @@ -373,7 +373,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-ele/src/views/wms/order/receipt/modules/form.vue b/apps/web-ele/src/views/wms/order/receipt/modules/form.vue index 0597d0230..72fdb7369 100644 --- a/apps/web-ele/src/views/wms/order/receipt/modules/form.vue +++ b/apps/web-ele/src/views/wms/order/receipt/modules/form.vue @@ -317,7 +317,6 @@ const [Modal, modalApi] = useVbenModal({ setDetails([]); return; } - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/apps/web-ele/src/views/wms/order/shipment/modules/form.vue b/apps/web-ele/src/views/wms/order/shipment/modules/form.vue index 12c0e7ef1..19fa19fa1 100644 --- a/apps/web-ele/src/views/wms/order/shipment/modules/form.vue +++ b/apps/web-ele/src/views/wms/order/shipment/modules/form.vue @@ -360,7 +360,6 @@ const [Modal, modalApi] = useVbenModal({ return; } initializing.value = true; - await formApi.resetForm(); const data = modalApi.getData<{ formType: FormType; id?: number }>(); formType.value = data.formType; if (data?.id) { diff --git a/packages/constants/src/dict-enum.ts b/packages/constants/src/dict-enum.ts index 19cba23c0..43ab651a8 100644 --- a/packages/constants/src/dict-enum.ts +++ b/packages/constants/src/dict-enum.ts @@ -216,6 +216,8 @@ const MES_DICT = { MES_INDICATOR_TYPE: 'mes_indicator_type', // MES 检测项类型 MES_QC_RESULT_TYPE: 'mes_qc_result_type', // MES 质检结果值类型 MES_QC_TYPE: 'mes_qc_type', // MES 质检方案类型 + MES_QC_CHECK_RESULT: 'mes_qc_check_result', // MES 检测结果 + MES_QC_SOURCE_DOC_TYPE: 'mes_qc_source_doc_type', // MES 来源单据类型 MES_DEFECT_LEVEL: 'mes_defect_level', // MES 缺陷等级 MES_WM_BARCODE_BIZ_TYPE: 'mes_wm_barcode_biz_type', // MES 条码业务类型 MES_WM_BARCODE_FORMAT: 'mes_wm_barcode_format', // MES 条码格式 From abc8789fe3601b690c464f4c193c88841d9ddb2e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 15:54:58 +0800 Subject: [PATCH 07/52] =?UTF-8?q?`feat(mes-qc):=20=E8=BF=81=E7=A7=BB=20ant?= =?UTF-8?q?d=20=E6=9D=A5=E6=96=99=E6=A3=80=E9=AA=8C=E5=8F=8A=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E7=BB=93=E6=9E=9C=E3=80=81=E7=BC=BA=E9=99=B7=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E7=BB=84=E4=BB=B6`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/defect-record-inline-form.vue | 165 ++++++ .../components/defect-record-inline-list.vue | 215 ++++++++ .../mes/qc/defectrecord/components/index.ts | 2 + .../qc/indicatorresult/components/index.ts | 2 + .../components/qc-indicator-result-form.vue | 270 ++++++++++ .../components/qc-indicator-result-list.vue | 156 ++++++ apps/web-antd/src/views/mes/qc/iqc/data.ts | 508 ++++++++++++++++++ apps/web-antd/src/views/mes/qc/iqc/index.vue | 167 ++++++ .../src/views/mes/qc/iqc/modules/form.vue | 244 +++++++++ .../views/mes/qc/iqc/modules/line-list.vue | 97 ++++ 10 files changed, 1826 insertions(+) create mode 100644 apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-form.vue create mode 100644 apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-list.vue create mode 100644 apps/web-antd/src/views/mes/qc/defectrecord/components/index.ts create mode 100644 apps/web-antd/src/views/mes/qc/indicatorresult/components/index.ts create mode 100644 apps/web-antd/src/views/mes/qc/indicatorresult/components/qc-indicator-result-form.vue create mode 100644 apps/web-antd/src/views/mes/qc/indicatorresult/components/qc-indicator-result-list.vue create mode 100644 apps/web-antd/src/views/mes/qc/iqc/data.ts create mode 100644 apps/web-antd/src/views/mes/qc/iqc/index.vue create mode 100644 apps/web-antd/src/views/mes/qc/iqc/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/qc/iqc/modules/line-list.vue diff --git a/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-form.vue b/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-form.vue new file mode 100644 index 000000000..874b078e0 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-form.vue @@ -0,0 +1,165 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-list.vue b/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-list.vue new file mode 100644 index 000000000..7e740bdc8 --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defectrecord/components/defect-record-inline-list.vue @@ -0,0 +1,215 @@ + + + diff --git a/apps/web-antd/src/views/mes/qc/defectrecord/components/index.ts b/apps/web-antd/src/views/mes/qc/defectrecord/components/index.ts new file mode 100644 index 000000000..6a2bd142a --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/defectrecord/components/index.ts @@ -0,0 +1,2 @@ +export { default as DefectRecordInlineForm } from './defect-record-inline-form.vue'; +export { default as DefectRecordInlineList } from './defect-record-inline-list.vue'; diff --git a/apps/web-antd/src/views/mes/qc/indicatorresult/components/index.ts b/apps/web-antd/src/views/mes/qc/indicatorresult/components/index.ts new file mode 100644 index 000000000..590fb8b8e --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicatorresult/components/index.ts @@ -0,0 +1,2 @@ +export { default as QcIndicatorResultForm } from './qc-indicator-result-form.vue'; +export { default as QcIndicatorResultList } from './qc-indicator-result-list.vue'; diff --git a/apps/web-antd/src/views/mes/qc/indicatorresult/components/qc-indicator-result-form.vue b/apps/web-antd/src/views/mes/qc/indicatorresult/components/qc-indicator-result-form.vue new file mode 100644 index 000000000..96dc91d2c --- /dev/null +++ b/apps/web-antd/src/views/mes/qc/indicatorresult/components/qc-indicator-result-form.vue @@ -0,0 +1,270 @@ + + +