From ec5b607171d25585475edcfbd6f1854ec79d3794 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 08:36:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes/qc):=20=E8=BF=81=E7=A7=BB=E8=B4=A8?= =?UTF-8?q?=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 @@ + + +