From f1523e417b56beca6617a829439a5e014b8f2c51 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 23:39:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E8=BF=81=E7=A7=BB=EF=BC=88wm-pack?= =?UTF-8?q?ages=EF=BC=89=E7=9B=B8=E5=85=B3=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/mes/wm/packages/components/index.ts | 2 + .../components/wm-package-select-dialog.vue | 228 +++++++ .../packages/components/wm-package-select.vue | 145 ++++ .../src/views/mes/wm/packages/data.ts | 639 +++++++++++++++++ .../src/views/mes/wm/packages/index.vue | 172 +++++ .../views/mes/wm/packages/modules/form.vue | 194 ++++++ .../mes/wm/packages/modules/line-form.vue | 92 +++ .../wm/packages/modules/package-line-list.vue | 132 ++++ .../wm/packages/modules/sub-package-list.vue | 126 ++++ .../views/mes/wm/packages/components/index.ts | 2 + .../components/wm-package-select-dialog.vue | 232 +++++++ .../packages/components/wm-package-select.vue | 143 ++++ .../web-ele/src/views/mes/wm/packages/data.ts | 646 ++++++++++++++++++ .../src/views/mes/wm/packages/index.vue | 172 +++++ .../views/mes/wm/packages/modules/form.vue | 189 +++++ .../mes/wm/packages/modules/line-form.vue | 93 +++ .../wm/packages/modules/package-line-list.vue | 132 ++++ .../wm/packages/modules/sub-package-list.vue | 126 ++++ 18 files changed, 3465 insertions(+) create mode 100644 apps/web-antd/src/views/mes/wm/packages/components/index.ts create mode 100644 apps/web-antd/src/views/mes/wm/packages/components/wm-package-select-dialog.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/components/wm-package-select.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/packages/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/modules/line-form.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/modules/package-line-list.vue create mode 100644 apps/web-antd/src/views/mes/wm/packages/modules/sub-package-list.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/components/index.ts create mode 100644 apps/web-ele/src/views/mes/wm/packages/components/wm-package-select-dialog.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/components/wm-package-select.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/packages/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/modules/line-form.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/modules/package-line-list.vue create mode 100644 apps/web-ele/src/views/mes/wm/packages/modules/sub-package-list.vue diff --git a/apps/web-antd/src/views/mes/wm/packages/components/index.ts b/apps/web-antd/src/views/mes/wm/packages/components/index.ts new file mode 100644 index 000000000..18bbc399e --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/components/index.ts @@ -0,0 +1,2 @@ +export { default as WmPackageSelectDialog } from './wm-package-select-dialog.vue'; +export { default as WmPackageSelect } from './wm-package-select.vue'; diff --git a/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select-dialog.vue b/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select-dialog.vue new file mode 100644 index 000000000..23a821409 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select-dialog.vue @@ -0,0 +1,228 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select.vue b/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select.vue new file mode 100644 index 000000000..3055aceab --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/components/wm-package-select.vue @@ -0,0 +1,145 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/data.ts b/apps/web-antd/src/views/mes/wm/packages/data.ts new file mode 100644 index 000000000..4470de2fe --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/data.ts @@ -0,0 +1,639 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmPackageApi } from '#/api/mes/wm/packages'; +import type { MesWmPackageLineApi } from '#/api/mes/wm/packages/line'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { Button } from 'ant-design-vue'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import MdClientSelect from '#/views/mes/md/client/components/md-client-select.vue'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; +import { MdUnitMeasureSelect } from '#/views/mes/md/unitmeasure/components'; +import ProWorkOrderSelect from '#/views/mes/pro/workorder/components/pro-work-order-select.vue'; +import { + MesAutoCodeRuleCode, + MesProWorkOrderStatusEnum, +} 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: 'status', + 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 () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_PACKAGE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'packageDate', + label: '装箱日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择装箱日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + { + fieldName: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'invoiceCode', + label: '发票编号', + component: 'Input', + componentProps: { + placeholder: '请输入发票编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'sizeUnitId', + label: '尺寸单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择尺寸单位', + }, + }, + { + fieldName: 'length', + label: '箱长度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入箱长度', + precision: 2, + }, + }, + { + fieldName: 'width', + label: '箱宽度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入箱宽度', + precision: 2, + }, + }, + { + fieldName: 'height', + label: '箱高度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入箱高度', + precision: 2, + }, + }, + { + fieldName: 'weightUnitId', + label: '重量单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择重量单位', + }, + }, + { + fieldName: 'netWeight', + label: '净重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入净重', + precision: 2, + }, + }, + { + fieldName: 'grossWeight', + label: '毛重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入毛重', + precision: 2, + }, + }, + { + 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: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '装箱单编号', + minWidth: 250, + fixed: 'left', + treeNode: true, + slots: { default: 'code' }, + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'length', + title: '箱长度', + width: 80, + }, + { + field: 'width', + title: '箱宽度', + width: 80, + }, + { + field: 'height', + title: '箱高度', + width: 80, + }, + { + field: 'sizeUnitName', + title: '尺寸单位', + width: 90, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 子箱列表的字段 */ +export function useSubPackageGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '装箱单编号', + minWidth: 160, + fixed: 'left', + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + { + title: '操作', + width: 100, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 装箱明细的表单 */ +export function useLineFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + placeholder: '请选择生产工单', + status: MesProWorkOrderStatusEnum.CONFIRMED, + }, + rules: 'selectRequired', + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '装箱数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0.01, + placeholder: '请输入装箱数量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'expireDate', + label: '有效期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择有效期', + valueFormat: 'x', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 装箱明细列表的字段 */ +export function useLineGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '产品物料编码', + minWidth: 120, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 140, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'quantity', + title: '装箱数量', + width: 100, + }, + { + field: 'workOrderCode', + title: '生产工单编号', + minWidth: 140, + }, + { + field: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'expireDate', + title: '有效期', + width: 120, + formatter: 'formatDate', + }, + { + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 选择弹窗的搜索表单 */ +export function useSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '装箱单编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入装箱单编号', + }, + }, + { + fieldName: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + ]; +} + +/** 选择弹窗的字段 */ +export function useSelectGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + type: 'checkbox', + width: 50, + }, + { + field: 'code', + title: '装箱单编号', + minWidth: 160, + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/packages/index.vue b/apps/web-antd/src/views/mes/wm/packages/index.vue new file mode 100644 index 000000000..1216ff763 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/modules/form.vue b/apps/web-antd/src/views/mes/wm/packages/modules/form.vue new file mode 100644 index 000000000..b3a4d1b90 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/modules/form.vue @@ -0,0 +1,194 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/modules/line-form.vue b/apps/web-antd/src/views/mes/wm/packages/modules/line-form.vue new file mode 100644 index 000000000..3b00e7f08 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/modules/line-form.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/modules/package-line-list.vue b/apps/web-antd/src/views/mes/wm/packages/modules/package-line-list.vue new file mode 100644 index 000000000..14be50523 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/modules/package-line-list.vue @@ -0,0 +1,132 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/packages/modules/sub-package-list.vue b/apps/web-antd/src/views/mes/wm/packages/modules/sub-package-list.vue new file mode 100644 index 000000000..b5183ce4c --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/packages/modules/sub-package-list.vue @@ -0,0 +1,126 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/components/index.ts b/apps/web-ele/src/views/mes/wm/packages/components/index.ts new file mode 100644 index 000000000..18bbc399e --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/components/index.ts @@ -0,0 +1,2 @@ +export { default as WmPackageSelectDialog } from './wm-package-select-dialog.vue'; +export { default as WmPackageSelect } from './wm-package-select.vue'; diff --git a/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select-dialog.vue b/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select-dialog.vue new file mode 100644 index 000000000..3aab57f0b --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select-dialog.vue @@ -0,0 +1,232 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select.vue b/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select.vue new file mode 100644 index 000000000..f732877ce --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/components/wm-package-select.vue @@ -0,0 +1,143 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/data.ts b/apps/web-ele/src/views/mes/wm/packages/data.ts new file mode 100644 index 000000000..30372310d --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/data.ts @@ -0,0 +1,646 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmPackageApi } from '#/api/mes/wm/packages'; +import type { MesWmPackageLineApi } from '#/api/mes/wm/packages/line'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; + +import { ElButton } from 'element-plus'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import MdClientSelect from '#/views/mes/md/client/components/md-client-select.vue'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; +import { MdUnitMeasureSelect } from '#/views/mes/md/unitmeasure/components'; +import ProWorkOrderSelect from '#/views/mes/pro/workorder/components/pro-work-order-select.vue'; +import { + MesAutoCodeRuleCode, + MesProWorkOrderStatusEnum, +} 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: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '装箱单编号', + component: 'Input', + componentProps: { + placeholder: '请输入装箱单编号', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_PACKAGE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'packageDate', + label: '装箱日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择装箱日期', + type: 'date', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + clearable: true, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + { + fieldName: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'invoiceCode', + label: '发票编号', + component: 'Input', + componentProps: { + placeholder: '请输入发票编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'sizeUnitId', + label: '尺寸单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择尺寸单位', + }, + }, + { + fieldName: 'length', + label: '箱长度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入箱长度', + precision: 2, + }, + }, + { + fieldName: 'width', + label: '箱宽度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入箱宽度', + precision: 2, + }, + }, + { + fieldName: 'height', + label: '箱高度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入箱高度', + precision: 2, + }, + }, + { + fieldName: 'weightUnitId', + label: '重量单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择重量单位', + }, + }, + { + fieldName: 'netWeight', + label: '净重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入净重', + precision: 2, + }, + }, + { + fieldName: 'grossWeight', + label: '毛重', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + placeholder: '请输入毛重', + precision: 2, + }, + }, + { + 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: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + clearable: true, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '装箱单编号', + minWidth: 250, + fixed: 'left', + treeNode: true, + slots: { default: 'code' }, + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'length', + title: '箱长度', + width: 80, + }, + { + field: 'width', + title: '箱宽度', + width: 80, + }, + { + field: 'height', + title: '箱高度', + width: 80, + }, + { + field: 'sizeUnitName', + title: '尺寸单位', + width: 90, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 子箱列表的字段 */ +export function useSubPackageGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '装箱单编号', + minWidth: 160, + fixed: 'left', + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + { + title: '操作', + width: 100, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 装箱明细的表单 */ +export function useLineFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + placeholder: '请选择生产工单', + status: MesProWorkOrderStatusEnum.CONFIRMED, + }, + rules: 'selectRequired', + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '装箱数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0.01, + placeholder: '请输入装箱数量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'expireDate', + label: '有效期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择有效期', + type: 'date', + valueFormat: 'x', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 装箱明细列表的字段 */ +export function useLineGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '产品物料编码', + minWidth: 120, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 140, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'quantity', + title: '装箱数量', + width: 100, + }, + { + field: 'workOrderCode', + title: '生产工单编号', + minWidth: 140, + }, + { + field: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'expireDate', + title: '有效期', + width: 120, + formatter: 'formatDate', + }, + { + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 选择弹窗的搜索表单 */ +export function useSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '装箱单编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入装箱单编号', + }, + }, + { + fieldName: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'inspectorUserId', + label: '检查员', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + clearable: true, + labelField: 'nickname', + placeholder: '请选择检查员', + valueField: 'id', + }, + }, + ]; +} + +/** 选择弹窗的字段 */ +export function useSelectGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + type: 'checkbox', + width: 50, + }, + { + field: 'code', + title: '装箱单编号', + minWidth: 160, + }, + { + field: 'packageDate', + title: '装箱日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 140, + }, + { + field: 'invoiceCode', + title: '发票编号', + minWidth: 120, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 100, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'netWeight', + title: '净重', + width: 80, + }, + { + field: 'grossWeight', + title: '毛重', + width: 80, + }, + { + field: 'weightUnitName', + title: '重量单位', + width: 90, + }, + { + field: 'inspectorName', + title: '检查员', + minWidth: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_PACKAGE_STATUS }, + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/packages/index.vue b/apps/web-ele/src/views/mes/wm/packages/index.vue new file mode 100644 index 000000000..2a4808790 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/modules/form.vue b/apps/web-ele/src/views/mes/wm/packages/modules/form.vue new file mode 100644 index 000000000..18453128c --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/modules/form.vue @@ -0,0 +1,189 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/modules/line-form.vue b/apps/web-ele/src/views/mes/wm/packages/modules/line-form.vue new file mode 100644 index 000000000..da9950e77 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/modules/line-form.vue @@ -0,0 +1,93 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/modules/package-line-list.vue b/apps/web-ele/src/views/mes/wm/packages/modules/package-line-list.vue new file mode 100644 index 000000000..45711d17e --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/modules/package-line-list.vue @@ -0,0 +1,132 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/packages/modules/sub-package-list.vue b/apps/web-ele/src/views/mes/wm/packages/modules/sub-package-list.vue new file mode 100644 index 000000000..8180fa3fe --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/packages/modules/sub-package-list.vue @@ -0,0 +1,126 @@ + + +