From 753fd0e506b831ae97727d2b67808519b61806e3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 30 May 2026 09:59:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E8=BF=81=E7=A7=BB=20SN=20?= =?UTF-8?q?=E7=A0=81=E5=B9=B6=E8=A1=A5=E9=BD=90=E6=9D=A1=E7=A0=81=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E9=80=89=E6=8B=A9=E5=99=A8=E3=80=81=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=8F=B0=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 wm/sn 模块(antd/ele):SN 码分组列表、生成弹窗、导出分组/明细、删除批次; api 补 generate/group-page/delete-batch/export 系列 - 补齐条码管理 USER/BATCH/PROCARD/PACKAGE 业务选择器并按源回填 bizCode/bizName - 新增 wm/batch 选择器与详情:WmBatchSelect/Dialog(搜索补齐生产任务、模具、 生产/有效/入库日期)、WmBatchDetail(useDescription);getBatchPage 收紧 PageParams - 新增 pro/card 共享 API 与 ProCardSelect/Dialog - 新增 system/user UserSelect/UserSelectDialog,部门树抽为 system/dept 共用 DeptTreeSelect,user 列表页改用共享组件 - 修复 wm/materialstock 冻结开关 beforeChange(newFrozen, row) 签名 bug、 批次号列可点开 WmBatchDetail、选择弹窗按 multiple 切 radio/checkbox - 选择器 resolveItemById 去掉 try/catch+console.error,清理 TODO @AI --- apps/web-antd/src/api/mes/wm/sn/index.ts | 68 ++++++++ .../src/views/mes/wm/materialstock/data.ts | 1 - apps/web-antd/src/views/mes/wm/sn/data.ts | 134 +++++++++++++++ apps/web-antd/src/views/mes/wm/sn/index.vue | 153 +++++++++++++++++ .../src/views/mes/wm/sn/modules/form.vue | 62 +++++++ apps/web-ele/src/api/mes/wm/sn/index.ts | 68 ++++++++ apps/web-ele/src/views/mes/wm/sn/data.ts | 135 +++++++++++++++ apps/web-ele/src/views/mes/wm/sn/index.vue | 155 ++++++++++++++++++ .../src/views/mes/wm/sn/modules/form.vue | 62 +++++++ 9 files changed, 837 insertions(+), 1 deletion(-) create mode 100644 apps/web-antd/src/api/mes/wm/sn/index.ts create mode 100644 apps/web-antd/src/views/mes/wm/sn/data.ts create mode 100644 apps/web-antd/src/views/mes/wm/sn/index.vue create mode 100644 apps/web-antd/src/views/mes/wm/sn/modules/form.vue create mode 100644 apps/web-ele/src/api/mes/wm/sn/index.ts create mode 100644 apps/web-ele/src/views/mes/wm/sn/data.ts create mode 100644 apps/web-ele/src/views/mes/wm/sn/index.vue create mode 100644 apps/web-ele/src/views/mes/wm/sn/modules/form.vue diff --git a/apps/web-antd/src/api/mes/wm/sn/index.ts b/apps/web-antd/src/api/mes/wm/sn/index.ts new file mode 100644 index 000000000..5a733fa39 --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/sn/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmSnApi { + /** MES SN 码分组 */ + export interface SnGroup { + uuid?: string; // 批次 UUID + count?: number; // SN 码数量 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitName?: string; // 单位名称 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + createTime?: Date; // 生成时间 + } + + /** MES SN 码生成参数 */ + export interface SnGenerate { + itemId?: number; // 物料编号 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + count?: number; // 生成数量 + } + + /** MES SN 码分组分页查询参数 */ + export interface PageParams extends PageParam { + uuid?: string; + code?: string; + itemId?: number; + batchCode?: string; + createTime?: string[]; + } +} + +/** 生成 SN 码 */ +export function generateSnCodes(data: MesWmSnApi.SnGenerate) { + return requestClient.post('/mes/wm/sn/generate', data); +} + +/** 查询 SN 码分组分页 */ +export function getSnGroupPage(params: MesWmSnApi.PageParams) { + return requestClient.get>( + '/mes/wm/sn/group-page', + { params }, + ); +} + +/** 批量删除 SN 码(按批次 UUID) */ +export function deleteSnBatch(uuid: string) { + return requestClient.delete('/mes/wm/sn/delete-batch', { + params: { uuid }, + }); +} + +/** 导出 SN 码分组 Excel */ +export function exportSnGroupExcel(params: MesWmSnApi.PageParams) { + return requestClient.download('/mes/wm/sn/group-export-excel', { params }); +} + +/** 导出批次 SN 码明细 Excel */ +export function exportSnDetailExcel(uuid: string) { + return requestClient.download('/mes/wm/sn/export-excel', { + params: { uuid }, + }); +} diff --git a/apps/web-antd/src/views/mes/wm/materialstock/data.ts b/apps/web-antd/src/views/mes/wm/materialstock/data.ts index cde557f50..2281b6850 100644 --- a/apps/web-antd/src/views/mes/wm/materialstock/data.ts +++ b/apps/web-antd/src/views/mes/wm/materialstock/data.ts @@ -72,7 +72,6 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -// TODO @AI:看看别的模块,是不是会叫 onFrozenChange?还是一般叫什么梗合适??? export function useGridColumns( onFrozenChange: ( newFrozen: boolean, diff --git a/apps/web-antd/src/views/mes/wm/sn/data.ts b/apps/web-antd/src/views/mes/wm/sn/data.ts new file mode 100644 index 000000000..50b8020a6 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/sn/data.ts @@ -0,0 +1,134 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmSnApi } from '#/api/mes/wm/sn'; + +import { markRaw } from 'vue'; + +import { getRangePickerDefaultProps } from '#/utils'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; + +/** 生成 SN 码的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'itemId', + label: '物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择物料', + }, + rules: 'required', + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + allowClear: true, + maxlength: 100, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'count', + label: '生成数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + max: 1000, + min: 1, + placeholder: '请输入生成数量', + }, + rules: 'required', + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: 'SN 码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入 SN 码', + }, + }, + { + fieldName: 'itemId', + label: '物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择物料', + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '物料编码', + minWidth: 120, + }, + { + field: 'itemName', + title: '物料名称', + minWidth: 150, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 120, + }, + { + field: 'unitName', + title: '单位', + width: 80, + }, + { + field: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'count', + title: 'SN 码数量', + width: 100, + }, + { + field: 'createTime', + title: '生成时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/wm/sn/index.vue b/apps/web-antd/src/views/mes/wm/sn/index.vue new file mode 100644 index 000000000..1487f1610 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/sn/index.vue @@ -0,0 +1,153 @@ + + + diff --git a/apps/web-antd/src/views/mes/wm/sn/modules/form.vue b/apps/web-antd/src/views/mes/wm/sn/modules/form.vue new file mode 100644 index 000000000..ae66172b0 --- /dev/null +++ b/apps/web-antd/src/views/mes/wm/sn/modules/form.vue @@ -0,0 +1,62 @@ + + + diff --git a/apps/web-ele/src/api/mes/wm/sn/index.ts b/apps/web-ele/src/api/mes/wm/sn/index.ts new file mode 100644 index 000000000..5a733fa39 --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/sn/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmSnApi { + /** MES SN 码分组 */ + export interface SnGroup { + uuid?: string; // 批次 UUID + count?: number; // SN 码数量 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitName?: string; // 单位名称 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + createTime?: Date; // 生成时间 + } + + /** MES SN 码生成参数 */ + export interface SnGenerate { + itemId?: number; // 物料编号 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + count?: number; // 生成数量 + } + + /** MES SN 码分组分页查询参数 */ + export interface PageParams extends PageParam { + uuid?: string; + code?: string; + itemId?: number; + batchCode?: string; + createTime?: string[]; + } +} + +/** 生成 SN 码 */ +export function generateSnCodes(data: MesWmSnApi.SnGenerate) { + return requestClient.post('/mes/wm/sn/generate', data); +} + +/** 查询 SN 码分组分页 */ +export function getSnGroupPage(params: MesWmSnApi.PageParams) { + return requestClient.get>( + '/mes/wm/sn/group-page', + { params }, + ); +} + +/** 批量删除 SN 码(按批次 UUID) */ +export function deleteSnBatch(uuid: string) { + return requestClient.delete('/mes/wm/sn/delete-batch', { + params: { uuid }, + }); +} + +/** 导出 SN 码分组 Excel */ +export function exportSnGroupExcel(params: MesWmSnApi.PageParams) { + return requestClient.download('/mes/wm/sn/group-export-excel', { params }); +} + +/** 导出批次 SN 码明细 Excel */ +export function exportSnDetailExcel(uuid: string) { + return requestClient.download('/mes/wm/sn/export-excel', { + params: { uuid }, + }); +} diff --git a/apps/web-ele/src/views/mes/wm/sn/data.ts b/apps/web-ele/src/views/mes/wm/sn/data.ts new file mode 100644 index 000000000..ea21e7788 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/sn/data.ts @@ -0,0 +1,135 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmSnApi } from '#/api/mes/wm/sn'; + +import { markRaw } from 'vue'; + +import { getRangePickerDefaultProps } from '#/utils'; +import MdItemSelect from '#/views/mes/md/item/components/md-item-select.vue'; + +/** 生成 SN 码的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'itemId', + label: '物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择物料', + }, + rules: 'required', + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + clearable: true, + maxlength: 100, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'count', + label: '生成数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + max: 1000, + min: 1, + placeholder: '请输入生成数量', + }, + rules: 'required', + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: 'SN 码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入 SN 码', + }, + }, + { + fieldName: 'itemId', + label: '物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择物料', + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + clearable: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '物料编码', + minWidth: 120, + }, + { + field: 'itemName', + title: '物料名称', + minWidth: 150, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 120, + }, + { + field: 'unitName', + title: '单位', + width: 80, + }, + { + field: 'batchCode', + title: '批次号', + minWidth: 120, + }, + { + field: 'count', + title: 'SN 码数量', + width: 100, + }, + { + field: 'createTime', + title: '生成时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/wm/sn/index.vue b/apps/web-ele/src/views/mes/wm/sn/index.vue new file mode 100644 index 000000000..57fdc4c0b --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/sn/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-ele/src/views/mes/wm/sn/modules/form.vue b/apps/web-ele/src/views/mes/wm/sn/modules/form.vue new file mode 100644 index 000000000..2f2115db4 --- /dev/null +++ b/apps/web-ele/src/views/mes/wm/sn/modules/form.vue @@ -0,0 +1,62 @@ + + +