From 25bbe79cb2b500ba99dc92c1040ec1e035991a40 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 May 2026 23:37:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E8=BF=81=E7=A7=BB=EF=BC=88wm-misc?= =?UTF-8?q?=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 --- .../src/views/mes/wm/miscissue/data.ts | 453 +++++++++++++++++ .../src/views/mes/wm/miscissue/index.vue | 195 ++++++++ .../views/mes/wm/miscissue/modules/form.vue | 194 ++++++++ .../mes/wm/miscissue/modules/line-form.vue | 97 ++++ .../mes/wm/miscissue/modules/line-list.vue | 137 ++++++ .../src/views/mes/wm/miscreceipt/data.ts | 423 ++++++++++++++++ .../src/views/mes/wm/miscreceipt/index.vue | 195 ++++++++ .../views/mes/wm/miscreceipt/modules/form.vue | 194 ++++++++ .../mes/wm/miscreceipt/modules/line-form.vue | 98 ++++ .../mes/wm/miscreceipt/modules/line-list.vue | 137 ++++++ .../web-ele/src/api/mes/wm/miscissue/index.ts | 2 +- .../src/views/mes/wm/miscissue/data.ts | 455 ++++++++++++++++++ .../src/views/mes/wm/miscissue/index.vue | 196 ++++++++ .../views/mes/wm/miscissue/modules/form.vue | 200 ++++++++ .../mes/wm/miscissue/modules/line-form.vue | 97 ++++ .../mes/wm/miscissue/modules/line-list.vue | 137 ++++++ .../src/views/mes/wm/miscreceipt/data.ts | 424 ++++++++++++++++ .../src/views/mes/wm/miscreceipt/index.vue | 196 ++++++++ .../views/mes/wm/miscreceipt/modules/form.vue | 200 ++++++++ .../mes/wm/miscreceipt/modules/line-form.vue | 98 ++++ .../mes/wm/miscreceipt/modules/line-list.vue | 137 ++++++ 21 files changed, 4264 insertions(+), 1 deletion(-) create mode 100644 apps/web-antd/src/views/mes/wm/miscissue/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/miscissue/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscissue/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscissue/modules/line-form.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscissue/modules/line-list.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscreceipt/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/miscreceipt/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscreceipt/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-form.vue create mode 100644 apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-list.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscissue/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/miscissue/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscissue/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscissue/modules/line-form.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscissue/modules/line-list.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscreceipt/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/miscreceipt/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscreceipt/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-form.vue create mode 100644 apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-list.vue diff --git a/apps/web-antd/src/views/mes/wm/miscissue/data.ts b/apps/web-antd/src/views/mes/wm/miscissue/data.ts new file mode 100644 index 000000000..04272d2ca --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscissue/data.ts @@ -0,0 +1,453 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmMaterialStockApi } from '#/api/mes/wm/materialstock'; +import type { MesWmMiscIssueApi } from '#/api/mes/wm/miscissue'; +import type { MesWmMiscIssueLineApi } from '#/api/mes/wm/miscissue/line'; + +import { h, markRaw } 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 { getRangePickerDefaultProps } from '#/utils'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; +import { WmMaterialStockSelect } from '#/views/mes/wm/materialstock/components'; +import { + WmWarehouseAreaSelect, + WmWarehouseLocationSelect, + WmWarehouseSelect, +} from '#/views/mes/wm/warehouse/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'finish' | 'update'; + +/** 表单头部是否只读(详情、执行出库态) */ +function isHeaderReadonly(formType: FormType): boolean { + return formType === 'detail' || formType === 'finish'; +} + +/** 新增/修改的表单 */ +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: isHeaderReadonly(formType) + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_MISC_ISSUE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '出库单名称', + component: 'Input', + componentProps: { + placeholder: '请输入出库单名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '业务类型', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_WM_MISC_ISSUE_TYPE, 'number'), + placeholder: '请选择业务类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'issueDate', + label: '出库日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择出库日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据编号', + }, + }, + { + 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_WM_MISC_ISSUE_TYPE, 'number'), + placeholder: '请选择业务类型', + }, + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'issueDate', + label: '出库日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '单据状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_WM_MISC_ISSUE_STATUS, 'number'), + placeholder: '请选择单据状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '出库单编号', + minWidth: 160, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '出库单名称', + minWidth: 150, + }, + { + field: 'type', + title: '业务类型', + minWidth: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_ISSUE_TYPE }, + }, + }, + { + field: 'sourceDocType', + title: '来源单据类型', + minWidth: 120, + }, + { + field: 'sourceDocCode', + title: '来源单据编号', + minWidth: 150, + }, + { + field: 'issueDate', + title: '出库日期', + width: 180, + formatter: 'formatDate', + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_ISSUE_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 出库单行子表的字段 */ +export function useLineGridColumns( + editable = true, +): 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: 'batchCode', + title: '批次编码', + minWidth: 120, + }, + { + field: 'warehouseName', + title: '仓库', + minWidth: 120, + }, + { + field: 'locationName', + title: '库区', + minWidth: 120, + }, + { + field: 'areaName', + title: '库位', + minWidth: 120, + }, + ...(editable + ? [ + { + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 出库单行新增/修改的表单 */ +export function useLineFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'itemId', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'quantityMax', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'materialStockId', + label: '库存物资', + component: markRaw(WmMaterialStockSelect), + componentProps: { + // 选择库存物资后,自动回填物料、批次号、仓库位置和最大可出库数量 + onChange: async (stock?: MesWmMaterialStockApi.MaterialStock) => { + await formApi?.setValues({ + areaId: stock?.areaId, + batchCode: stock?.batchCode, + itemId: stock?.itemId, + locationId: stock?.locationId, + quantityMax: stock?.quantity, + warehouseId: stock?.warehouseId, + }); + }, + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['itemId'], + componentProps: (values) => ({ + itemId: values.itemId, + }), + }, + }, + { + fieldName: 'quantity', + label: '出库数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0.01, + placeholder: '请输入出库数量', + precision: 2, + }, + rules: 'required', + dependencies: { + triggerFields: ['quantityMax'], + componentProps: (values) => ({ + class: '!w-full', + max: values.quantityMax, + min: 0.01, + placeholder: '请输入出库数量', + precision: 2, + }), + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + disabled: true, + placeholder: '批次号', + }, + }, + { + fieldName: 'warehouseId', + label: '仓库', + component: markRaw(WmWarehouseSelect), + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'locationId', + label: '库区', + component: markRaw(WmWarehouseLocationSelect), + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + disabled: true, + warehouseId: values.warehouseId, + }), + }, + }, + { + fieldName: 'areaId', + label: '库位', + component: markRaw(WmWarehouseAreaSelect), + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['locationId'], + componentProps: (values) => ({ + disabled: true, + locationId: values.locationId, + }), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/miscissue/index.vue b/apps/web-antd/src/views/mes/wm/miscissue/index.vue new file mode 100644 index 000000000..f7ed9e698 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscissue/index.vue @@ -0,0 +1,195 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscissue/modules/form.vue b/apps/web-antd/src/views/mes/wm/miscissue/modules/form.vue new file mode 100644 index 000000000..01393d2a4 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscissue/modules/form.vue @@ -0,0 +1,194 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscissue/modules/line-form.vue b/apps/web-antd/src/views/mes/wm/miscissue/modules/line-form.vue new file mode 100644 index 000000000..39f6fe223 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscissue/modules/line-form.vue @@ -0,0 +1,97 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscissue/modules/line-list.vue b/apps/web-antd/src/views/mes/wm/miscissue/modules/line-list.vue new file mode 100644 index 000000000..ad0041983 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscissue/modules/line-list.vue @@ -0,0 +1,137 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscreceipt/data.ts b/apps/web-antd/src/views/mes/wm/miscreceipt/data.ts new file mode 100644 index 000000000..8b192fc0f --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscreceipt/data.ts @@ -0,0 +1,423 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmMiscReceiptApi } from '#/api/mes/wm/miscreceipt'; +import type { MesWmMiscReceiptLineApi } from '#/api/mes/wm/miscreceipt/line'; + +import { h, markRaw } 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 { getRangePickerDefaultProps } from '#/utils'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; +import { + WmWarehouseAreaSelect, + WmWarehouseLocationSelect, + WmWarehouseSelect, +} from '#/views/mes/wm/warehouse/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'finish' | 'update'; + +/** 表单头部是否只读(详情、执行入库态) */ +function isHeaderReadonly(formType: FormType): boolean { + return formType === 'detail' || formType === 'finish'; +} + +/** 新增/修改的表单 */ +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: isHeaderReadonly(formType) + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_MISC_RECEIPT_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '入库单名称', + component: 'Input', + componentProps: { + placeholder: '请输入入库单名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '杂项类型', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_WM_MISC_RECEIPT_TYPE, 'number'), + placeholder: '请选择杂项类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编码', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据编码', + }, + }, + { + fieldName: 'receiptDate', + label: '入库日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择入库日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + 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_WM_MISC_RECEIPT_TYPE, 'number'), + placeholder: '请选择杂项类型', + }, + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'receiptDate', + label: '入库日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '单据状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_WM_MISC_RECEIPT_STATUS, 'number'), + placeholder: '请选择单据状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '入库单编号', + minWidth: 160, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '入库单名称', + minWidth: 150, + }, + { + field: 'type', + title: '杂项类型', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_RECEIPT_TYPE }, + }, + }, + { + field: 'sourceDocType', + title: '来源单据类型', + minWidth: 120, + }, + { + field: 'sourceDocCode', + title: '来源单据编号', + minWidth: 150, + }, + { + field: 'receiptDate', + title: '入库日期', + width: 180, + formatter: 'formatDate', + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_RECEIPT_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 入库单行子表的字段 */ +export function useLineGridColumns( + editable = true, +): 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: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'warehouseName', + title: '仓库', + minWidth: 100, + }, + { + field: 'locationName', + title: '库区', + minWidth: 100, + }, + { + field: 'areaName', + title: '库位', + minWidth: 100, + }, + ...(editable + ? [ + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 入库单行新增/修改的表单 */ +export function useLineFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + 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: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'warehouseId', + label: '仓库', + component: markRaw(WmWarehouseSelect), + componentProps: { + // 切换仓库后清空库区和库位 + onChange: async () => { + await formApi?.setValues({ + areaId: undefined, + locationId: undefined, + }); + }, + placeholder: '请选择仓库', + }, + rules: 'selectRequired', + }, + { + fieldName: 'locationId', + label: '库区', + component: markRaw(WmWarehouseLocationSelect), + componentProps: { + placeholder: '请选择库区', + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + // 切换库区后清空库位 + onChange: async () => { + await formApi?.setFieldValue('areaId', undefined); + }, + placeholder: '请选择库区', + warehouseId: values.warehouseId, + }), + }, + }, + { + fieldName: 'areaId', + label: '库位', + component: markRaw(WmWarehouseAreaSelect), + componentProps: { + placeholder: '请选择库位', + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['locationId'], + componentProps: (values) => ({ + locationId: values.locationId, + placeholder: '请选择库位', + }), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/miscreceipt/index.vue b/apps/web-antd/src/views/mes/wm/miscreceipt/index.vue new file mode 100644 index 000000000..39c2b8439 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscreceipt/index.vue @@ -0,0 +1,195 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscreceipt/modules/form.vue b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/form.vue new file mode 100644 index 000000000..267ad0fcd --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/form.vue @@ -0,0 +1,194 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-form.vue b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-form.vue new file mode 100644 index 000000000..d660ba3dc --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-form.vue @@ -0,0 +1,98 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-list.vue b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-list.vue new file mode 100644 index 000000000..a04bc667b --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/miscreceipt/modules/line-list.vue @@ -0,0 +1,137 @@ + + + diff --git a/apps/web-ele/src/api/mes/wm/miscissue/index.ts b/apps/web-ele/src/api/mes/wm/miscissue/index.ts index 7ce7ede46..1a54df4f4 100644 --- a/apps/web-ele/src/api/mes/wm/miscissue/index.ts +++ b/apps/web-ele/src/api/mes/wm/miscissue/index.ts @@ -8,7 +8,7 @@ export namespace MesWmMiscIssueApi { id?: number; // 编号 code?: string; // 出库单编号 name?: string; // 出库单名称 - type?: string; // 业务类型 + type?: number; // 业务类型 sourceDocType?: string; // 来源单据类型 sourceDocId?: number; // 来源单据编号 sourceDocCode?: string; // 来源单据编码 diff --git a/apps/web-ele/src/views/mes/wm/miscissue/data.ts b/apps/web-ele/src/views/mes/wm/miscissue/data.ts new file mode 100644 index 000000000..9ff928496 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscissue/data.ts @@ -0,0 +1,455 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmMaterialStockApi } from '#/api/mes/wm/materialstock'; +import type { MesWmMiscIssueApi } from '#/api/mes/wm/miscissue'; +import type { MesWmMiscIssueLineApi } from '#/api/mes/wm/miscissue/line'; + +import { h, markRaw } 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 { getRangePickerDefaultProps } from '#/utils'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; +import { WmMaterialStockSelect } from '#/views/mes/wm/materialstock/components'; +import { + WmWarehouseAreaSelect, + WmWarehouseLocationSelect, + WmWarehouseSelect, +} from '#/views/mes/wm/warehouse/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'finish' | 'update'; + +/** 表单头部是否只读(详情、执行出库态) */ +function isHeaderReadonly(formType: FormType): boolean { + return formType === 'detail' || formType === 'finish'; +} + +/** 新增/修改的表单 */ +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: isHeaderReadonly(formType) + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_MISC_ISSUE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '出库单名称', + component: 'Input', + componentProps: { + placeholder: '请输入出库单名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '业务类型', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_WM_MISC_ISSUE_TYPE, 'number'), + placeholder: '请选择业务类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'issueDate', + label: '出库日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择出库日期', + type: 'date', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据编号', + }, + }, + { + 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_WM_MISC_ISSUE_TYPE, 'number'), + placeholder: '请选择业务类型', + }, + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'issueDate', + label: '出库日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + clearable: true, + }, + }, + { + fieldName: 'status', + label: '单据状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_WM_MISC_ISSUE_STATUS, 'number'), + placeholder: '请选择单据状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '出库单编号', + minWidth: 160, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '出库单名称', + minWidth: 150, + }, + { + field: 'type', + title: '业务类型', + minWidth: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_ISSUE_TYPE }, + }, + }, + { + field: 'sourceDocType', + title: '来源单据类型', + minWidth: 120, + }, + { + field: 'sourceDocCode', + title: '来源单据编号', + minWidth: 150, + }, + { + field: 'issueDate', + title: '出库日期', + width: 180, + formatter: 'formatDate', + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_ISSUE_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 出库单行子表的字段 */ +export function useLineGridColumns( + editable = true, +): 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: 'batchCode', + title: '批次编码', + minWidth: 120, + }, + { + field: 'warehouseName', + title: '仓库', + minWidth: 120, + }, + { + field: 'locationName', + title: '库区', + minWidth: 120, + }, + { + field: 'areaName', + title: '库位', + minWidth: 120, + }, + ...(editable + ? [ + { + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 出库单行新增/修改的表单 */ +export function useLineFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'itemId', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'quantityMax', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'materialStockId', + label: '库存物资', + component: markRaw(WmMaterialStockSelect), + componentProps: { + // 选择库存物资后,自动回填物料、批次号、仓库位置和最大可出库数量 + onChange: async (stock?: MesWmMaterialStockApi.MaterialStock) => { + await formApi?.setValues({ + areaId: stock?.areaId, + batchCode: stock?.batchCode, + itemId: stock?.itemId, + locationId: stock?.locationId, + quantityMax: stock?.quantity, + warehouseId: stock?.warehouseId, + }); + }, + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['itemId'], + componentProps: (values) => ({ + itemId: values.itemId, + }), + }, + }, + { + fieldName: 'quantity', + label: '出库数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0.01, + placeholder: '请输入出库数量', + precision: 2, + }, + rules: 'required', + dependencies: { + triggerFields: ['quantityMax'], + componentProps: (values) => ({ + class: '!w-full', + controlsPosition: 'right', + max: values.quantityMax, + min: 0.01, + placeholder: '请输入出库数量', + precision: 2, + }), + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + disabled: true, + placeholder: '批次号', + }, + }, + { + fieldName: 'warehouseId', + label: '仓库', + component: markRaw(WmWarehouseSelect), + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'locationId', + label: '库区', + component: markRaw(WmWarehouseLocationSelect), + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + disabled: true, + warehouseId: values.warehouseId, + }), + }, + }, + { + fieldName: 'areaId', + label: '库位', + component: markRaw(WmWarehouseAreaSelect), + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['locationId'], + componentProps: (values) => ({ + disabled: true, + locationId: values.locationId, + }), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/miscissue/index.vue b/apps/web-ele/src/views/mes/wm/miscissue/index.vue new file mode 100644 index 000000000..516565b77 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscissue/index.vue @@ -0,0 +1,196 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscissue/modules/form.vue b/apps/web-ele/src/views/mes/wm/miscissue/modules/form.vue new file mode 100644 index 000000000..ead78d938 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscissue/modules/form.vue @@ -0,0 +1,200 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscissue/modules/line-form.vue b/apps/web-ele/src/views/mes/wm/miscissue/modules/line-form.vue new file mode 100644 index 000000000..b16ffd786 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscissue/modules/line-form.vue @@ -0,0 +1,97 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscissue/modules/line-list.vue b/apps/web-ele/src/views/mes/wm/miscissue/modules/line-list.vue new file mode 100644 index 000000000..8b03d16ea --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscissue/modules/line-list.vue @@ -0,0 +1,137 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscreceipt/data.ts b/apps/web-ele/src/views/mes/wm/miscreceipt/data.ts new file mode 100644 index 000000000..2e308be2d --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscreceipt/data.ts @@ -0,0 +1,424 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmMiscReceiptApi } from '#/api/mes/wm/miscreceipt'; +import type { MesWmMiscReceiptLineApi } from '#/api/mes/wm/miscreceipt/line'; + +import { h, markRaw } 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 { getRangePickerDefaultProps } from '#/utils'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; +import { + WmWarehouseAreaSelect, + WmWarehouseLocationSelect, + WmWarehouseSelect, +} from '#/views/mes/wm/warehouse/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'finish' | 'update'; + +/** 表单头部是否只读(详情、执行入库态) */ +function isHeaderReadonly(formType: FormType): boolean { + return formType === 'detail' || formType === 'finish'; +} + +/** 新增/修改的表单 */ +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: isHeaderReadonly(formType) + ? undefined + : () => + h( + ElButton, + { + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.WM_MISC_RECEIPT_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '入库单名称', + component: 'Input', + componentProps: { + placeholder: '请输入入库单名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '杂项类型', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_WM_MISC_RECEIPT_TYPE, 'number'), + placeholder: '请选择杂项类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编码', + component: 'Input', + componentProps: { + placeholder: '请输入来源单据编码', + }, + }, + { + fieldName: 'receiptDate', + label: '入库日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择入库日期', + type: 'date', + valueFormat: 'x', + }, + rules: 'required', + }, + { + 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_WM_MISC_RECEIPT_TYPE, 'number'), + placeholder: '请选择杂项类型', + }, + }, + { + fieldName: 'sourceDocType', + label: '来源单据类型', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入来源单据类型', + }, + }, + { + fieldName: 'sourceDocCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'receiptDate', + label: '入库日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + clearable: true, + }, + }, + { + fieldName: 'status', + label: '单据状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_WM_MISC_RECEIPT_STATUS, 'number'), + placeholder: '请选择单据状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '入库单编号', + minWidth: 160, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '入库单名称', + minWidth: 150, + }, + { + field: 'type', + title: '杂项类型', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_RECEIPT_TYPE }, + }, + }, + { + field: 'sourceDocType', + title: '来源单据类型', + minWidth: 120, + }, + { + field: 'sourceDocCode', + title: '来源单据编号', + minWidth: 150, + }, + { + field: 'receiptDate', + title: '入库日期', + width: 180, + formatter: 'formatDate', + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_WM_MISC_RECEIPT_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 入库单行子表的字段 */ +export function useLineGridColumns( + editable = true, +): 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: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'warehouseName', + title: '仓库', + minWidth: 100, + }, + { + field: 'locationName', + title: '库区', + minWidth: 100, + }, + { + field: 'areaName', + title: '库位', + minWidth: 100, + }, + ...(editable + ? [ + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 入库单行新增/修改的表单 */ +export function useLineFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + 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: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'warehouseId', + label: '仓库', + component: markRaw(WmWarehouseSelect), + componentProps: { + // 切换仓库后清空库区和库位 + onChange: async () => { + await formApi?.setValues({ + areaId: undefined, + locationId: undefined, + }); + }, + placeholder: '请选择仓库', + }, + rules: 'selectRequired', + }, + { + fieldName: 'locationId', + label: '库区', + component: markRaw(WmWarehouseLocationSelect), + componentProps: { + placeholder: '请选择库区', + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['warehouseId'], + componentProps: (values) => ({ + // 切换库区后清空库位 + onChange: async () => { + await formApi?.setFieldValue('areaId', undefined); + }, + placeholder: '请选择库区', + warehouseId: values.warehouseId, + }), + }, + }, + { + fieldName: 'areaId', + label: '库位', + component: markRaw(WmWarehouseAreaSelect), + componentProps: { + placeholder: '请选择库位', + }, + rules: 'selectRequired', + dependencies: { + triggerFields: ['locationId'], + componentProps: (values) => ({ + locationId: values.locationId, + placeholder: '请选择库位', + }), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/miscreceipt/index.vue b/apps/web-ele/src/views/mes/wm/miscreceipt/index.vue new file mode 100644 index 000000000..4b0711511 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscreceipt/index.vue @@ -0,0 +1,196 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscreceipt/modules/form.vue b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/form.vue new file mode 100644 index 000000000..32710862f --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/form.vue @@ -0,0 +1,200 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-form.vue b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-form.vue new file mode 100644 index 000000000..f3b21427d --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-form.vue @@ -0,0 +1,98 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-list.vue b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-list.vue new file mode 100644 index 000000000..e80698072 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/miscreceipt/modules/line-list.vue @@ -0,0 +1,137 @@ + + +