diff --git a/src/api/mes/wm/sn/index.ts b/src/api/mes/wm/sn/index.ts
new file mode 100644
index 000000000..107c7726d
--- /dev/null
+++ b/src/api/mes/wm/sn/index.ts
@@ -0,0 +1,45 @@
+import request from '@/config/axios'
+
+export interface WmSnGroupVO {
+ uuid?: string
+ count?: number
+ itemId?: number
+ itemCode?: string
+ itemName?: string
+ specification?: string
+ batchCode?: string
+ workOrderId?: number
+ createTime?: Date
+}
+
+export interface WmSnGenerateVO {
+ itemId?: number
+ batchCode?: string
+ workOrderId?: number
+ count?: number
+}
+
+// 生成 SN 码
+export const generateSnCodes = async (data: WmSnGenerateVO) => {
+ return await request.post({ url: `/mes/wm/sn/generate`, data })
+}
+
+// 获得 SN 码分组分页
+export const getSnGroupPage = async (params: any) => {
+ return await request.get({ url: `/mes/wm/sn/group-page`, params })
+}
+
+// 批量删除 SN 码(按批次 UUID)
+export const deleteSnBatch = async (uuid: string) => {
+ return await request.delete({ url: `/mes/wm/sn/delete-batch`, params: { uuid } })
+}
+
+// 导出 SN 码分组 Excel
+export const exportSnGroupExcel = async (params: any) => {
+ return await request.download({ url: `/mes/wm/sn/group-export-excel`, params })
+}
+
+// 导出批次 SN 码明细 Excel
+export const exportSnDetailExcel = async (uuid: string) => {
+ return await request.download({ url: `/mes/wm/sn/export-excel`, params: { uuid } })
+}
diff --git a/src/views/mes/wm/sn/WmSnGenerateForm.vue b/src/views/mes/wm/sn/WmSnGenerateForm.vue
new file mode 100644
index 000000000..11b8c76c6
--- /dev/null
+++ b/src/views/mes/wm/sn/WmSnGenerateForm.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
diff --git a/src/views/mes/wm/sn/index.vue b/src/views/mes/wm/sn/index.vue
new file mode 100644
index 000000000..33a422ec9
--- /dev/null
+++ b/src/views/mes/wm/sn/index.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 生成 SN 码
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 导出明细
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+