diff --git a/src/api/mes/wm/stocktaking/plan.ts b/src/api/mes/wm/stocktaking/plan.ts
new file mode 100644
index 000000000..8716f129c
--- /dev/null
+++ b/src/api/mes/wm/stocktaking/plan.ts
@@ -0,0 +1,72 @@
+import request from '@/config/axios'
+
+// TODO @AI:原则是 plan、task 两个目录;然后每个目录里,index.ts 都只能;param/index.ts 这样;
+export interface StockTakingPlanParamVO {
+ id?: number
+ planId?: number
+ type?: number
+ valueId?: number | string
+ valueCode?: string
+ valueName?: string
+ remark?: string
+}
+
+export interface StockTakingPlanVO {
+ id?: number
+ code?: string
+ name?: string
+ type?: number
+ startTime?: string
+ endTime?: string
+ blindFlag?: boolean
+ frozenFlag?: boolean
+ enableFlag?: boolean
+ status?: number
+ remark?: string
+ params?: StockTakingPlanParamVO[]
+ createTime?: string
+}
+
+export interface StockTakingPlanGenerateReqVO {
+ planId: number
+ code: string
+ name: string
+ takingDate?: string
+ userId: number
+ remark?: string
+ params?: StockTakingPlanParamVO[]
+}
+
+export const StockTakingPlanApi = {
+ getStockTakingPlanPage: async (params: any) => {
+ return await request.get({ url: '/mes/wm/stocktaking-plan/page', params })
+ },
+
+ getStockTakingPlan: async (id: number) => {
+ return await request.get({ url: '/mes/wm/stocktaking-plan/get?id=' + id })
+ },
+
+ createStockTakingPlan: async (data: StockTakingPlanVO) => {
+ return await request.post({ url: '/mes/wm/stocktaking-plan/create', data })
+ },
+
+ updateStockTakingPlan: async (data: StockTakingPlanVO) => {
+ return await request.put({ url: '/mes/wm/stocktaking-plan/update', data })
+ },
+
+ deleteStockTakingPlan: async (id: number) => {
+ return await request.delete({ url: '/mes/wm/stocktaking-plan/delete?id=' + id })
+ },
+
+ confirmStockTakingPlan: async (id: number) => {
+ return await request.put({ url: '/mes/wm/stocktaking-plan/confirm?id=' + id })
+ },
+
+ generateStockTakingTask: async (data: StockTakingPlanGenerateReqVO) => {
+ return await request.post({ url: '/mes/wm/stocktaking-plan/generate-task', data })
+ },
+
+ exportStockTakingPlan: async (params: any) => {
+ return await request.download({ url: '/mes/wm/stocktaking-plan/export-excel', params })
+ }
+}
diff --git a/src/api/mes/wm/stocktaking/result.ts b/src/api/mes/wm/stocktaking/result.ts
new file mode 100644
index 000000000..58dacbf29
--- /dev/null
+++ b/src/api/mes/wm/stocktaking/result.ts
@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+// TODO @AI:原则是 plan、task 两个目录;然后每个目录里,index.ts 都只能;param/index.ts 这样;
+export interface StockTakingResultVO {
+ id?: number
+ taskId?: number
+ lineId?: number
+ materialStockId?: number
+ itemId?: number
+ itemCode?: string
+ itemName?: string
+ specification?: string
+ unitMeasureName?: string
+ batchId?: number
+ batchCode?: string
+ warehouseId?: number
+ warehouseName?: string
+ locationId?: number
+ locationName?: string
+ areaId?: number
+ areaName?: string
+ quantity?: number
+ remark?: string
+ createTime?: string
+}
+
+export const StockTakingResultApi = {
+ getStockTakingResultPage: async (params: any) => {
+ return await request.get({ url: '/mes/wm/stocktaking-task-result/page', params })
+ },
+
+ getStockTakingResultList: async (taskId: number) => {
+ return await request.get({ url: '/mes/wm/stocktaking-task-result/list?taskId=' + taskId })
+ },
+
+ exportStockTakingResult: async (params: any) => {
+ return await request.download({ url: '/mes/wm/stocktaking-task-result/export-excel', params })
+ }
+}
diff --git a/src/api/mes/wm/stocktaking/taking.ts b/src/api/mes/wm/stocktaking/taking.ts
new file mode 100644
index 000000000..2021c5778
--- /dev/null
+++ b/src/api/mes/wm/stocktaking/taking.ts
@@ -0,0 +1,103 @@
+import request from '@/config/axios'
+
+// TODO @AI:原则是 plan、task 两个目录;然后每个目录里,index.ts 都只能;param/index.ts 这样;
+export interface StockTakingTaskVO {
+ id?: number
+ code?: string
+ name?: string
+ takingDate?: string
+ type?: number
+ userId?: number
+ userNickname?: string
+ planId?: number
+ planCode?: string
+ planName?: string
+ blindFlag?: boolean
+ frozenFlag?: boolean
+ snapshotTime?: string
+ startTime?: string
+ endTime?: string
+ status?: number
+ adjustedFlag?: boolean
+ remark?: string
+ createTime?: string
+}
+
+export interface StockTakingTaskLineVO {
+ id: number
+ taskId: number
+ materialStockId?: number
+ itemId?: number
+ itemCode?: string
+ itemName?: string
+ specification?: string
+ unitMeasureName?: string
+ batchId?: number
+ batchCode?: string
+ quantity?: number
+ takingQuantity?: number
+ differenceQuantity?: number
+ warehouseId?: number
+ warehouseName?: string
+ locationId?: number
+ locationName?: string
+ areaId?: number
+ areaName?: string
+ status?: number
+ remark?: string
+}
+
+export interface StockTakingTaskLineBatchUpdateReqVO {
+ taskId: number
+ items: Array<{
+ id: number
+ takingQuantity: number
+ remark?: string
+ }>
+}
+
+export const StockTakingApi = {
+ getStockTakingPage: async (params: any) => {
+ return await request.get({ url: '/mes/wm/stocktaking-task/page', params })
+ },
+
+ getStockTaking: async (id: number) => {
+ return await request.get({ url: '/mes/wm/stocktaking-task/get?id=' + id })
+ },
+
+ createStockTaking: async (data: StockTakingTaskVO) => {
+ return await request.post({ url: '/mes/wm/stocktaking-task/create', data })
+ },
+
+ updateStockTaking: async (data: StockTakingTaskVO) => {
+ return await request.put({ url: '/mes/wm/stocktaking-task/update', data })
+ },
+
+ deleteStockTaking: async (id: number) => {
+ return await request.delete({ url: '/mes/wm/stocktaking-task/delete?id=' + id })
+ },
+
+ startStockTaking: async (id: number) => {
+ return await request.put({ url: '/mes/wm/stocktaking-task/start?id=' + id })
+ },
+
+ finishStockTaking: async (id: number) => {
+ return await request.put({ url: '/mes/wm/stocktaking-task/finish?id=' + id })
+ },
+
+ cancelStockTaking: async (id: number) => {
+ return await request.put({ url: '/mes/wm/stocktaking-task/cancel?id=' + id })
+ },
+
+ getStockTakingLineList: async (taskId: number) => {
+ return await request.get({ url: '/mes/wm/stocktaking-task/line-list?taskId=' + taskId })
+ },
+
+ batchUpdateStockTakingLines: async (data: StockTakingTaskLineBatchUpdateReqVO) => {
+ return await request.put({ url: '/mes/wm/stocktaking-task/line-batch-update', data })
+ },
+
+ exportStockTaking: async (params: any) => {
+ return await request.download({ url: '/mes/wm/stocktaking-task/export-excel', params })
+ }
+}
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index bed41059e..8d563eea8 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -296,6 +296,11 @@ export enum DICT_TYPE {
MES_WM_ITEM_RECEIPT_STATUS = 'mes_wm_item_receipt_status', // MES 物料接收单状态
MES_WM_TRANSFER_STATUS = 'mes_wm_transfer_status', // MES 转移单状态
MES_WM_TRANSFER_TYPE = 'mes_wm_transfer_type', // MES 转移单类型
+ MES_WM_STOCK_TAKING_TYPE = 'mes_wm_stock_taking_type', // MES 盘点类型
+ MES_WM_STOCK_TAKING_PLAN_STATUS = 'mes_wm_stock_taking_plan_status', // MES 盘点方案状态
+ MES_WM_STOCK_TAKING_TASK_STATUS = 'mes_wm_stock_taking_task_status', // MES 盘点任务状态
+ MES_WM_STOCK_TAKING_LINE_STATUS = 'mes_wm_stock_taking_task_line_status', // MES 盘点任务行状态
+ MES_WM_STOCK_TAKING_PARAM_TYPE = 'mes_wm_stock_taking_param_type', // MES 盘点方案参数类型
MES_WM_OUTSOURCE_RECPT_STATUS = 'mes_wm_outsource_recpt_status', // MES 外协入库单状态
MES_WM_PRODUCTION_ISSUE_STATUS = 'mes_wm_production_issue_status', // MES 领料出库单状态
MES_PRODUCT_PRODUCE_STATUS = 'mes_product_produce_status', // MES 生产入库单状态
diff --git a/src/views/mes/utils/constants.ts b/src/views/mes/utils/constants.ts
index e73b1e858..ab455700a 100644
--- a/src/views/mes/utils/constants.ts
+++ b/src/views/mes/utils/constants.ts
@@ -228,6 +228,44 @@ export const MesWmOutsourceReceiptStatusEnum = {
CANCELED: MesOrderStatusConstants.CANCELLED
}
+/** MES 盘点类型枚举 */
+export const MesWmStockTakingTypeEnum = {
+ OPEN: 1,
+ CYCLE: 2,
+ DYNAMIC: 3
+}
+
+/** MES 盘点方案状态枚举 */
+export const MesWmStockTakingPlanStatusEnum = {
+ PREPARE: MesOrderStatusConstants.DRAFT,
+ CONFIRMED: MesOrderStatusConstants.CONFIRMED
+}
+
+/** MES 盘点任务状态枚举 */
+export const MesWmStockTakingTaskStatusEnum = {
+ PREPARE: MesOrderStatusConstants.DRAFT,
+ IN_PROGRESS: MesOrderStatusConstants.CONFIRMED,
+ FINISHED: MesOrderStatusConstants.FINISHED,
+ CANCELED: MesOrderStatusConstants.CANCELLED
+}
+
+/** MES 盘点任务行状态枚举 */
+export const MesWmStockTakingTaskLineStatusEnum = {
+ UNCOUNTED: 0,
+ NORMAL: 1,
+ GAIN: 2,
+ LOSS: 3
+}
+
+/** MES 盘点方案参数类型枚举 */
+export const MesWmStockTakingParamTypeEnum = {
+ WAREHOUSE: 1,
+ LOCATION: 2,
+ AREA: 3,
+ ITEM: 4,
+ BATCH: 5
+}
+
/** MES 外协入库单状态枚举 */
export const MesWmOutsourceRecptStatusEnum = {
PREPARE: MesOrderStatusConstants.DRAFT,
diff --git a/src/views/mes/wm/stocktaking/plan/StockTakingPlanForm.vue b/src/views/mes/wm/stocktaking/plan/StockTakingPlanForm.vue
new file mode 100644
index 000000000..5ca4c6e01
--- /dev/null
+++ b/src/views/mes/wm/stocktaking/plan/StockTakingPlanForm.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+
diff --git a/src/views/mes/wm/stocktaking/plan/components/StockTakingParamTable.vue b/src/views/mes/wm/stocktaking/plan/components/StockTakingParamTable.vue
new file mode 100644
index 000000000..073cabbd9
--- /dev/null
+++ b/src/views/mes/wm/stocktaking/plan/components/StockTakingParamTable.vue
@@ -0,0 +1,182 @@
+
+
+
+
+ 盘点范围参数
+
+ 添加参数
+
+
+
+
+
+
+
+
+
+
+
+
+
+ handleSelectorChange(scope.row, item)"
+ />
+
+
+ handleSelectorChange(scope.row, item)"
+ />
+
+
+ handleSelectorChange(scope.row, item)"
+ />
+
+
+ handleSelectorChange(scope.row, item)"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
diff --git a/src/views/mes/wm/stocktaking/plan/index.vue b/src/views/mes/wm/stocktaking/plan/index.vue
new file mode 100644
index 000000000..3c98716c5
--- /dev/null
+++ b/src/views/mes/wm/stocktaking/plan/index.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.blindFlag ? '是' : '否' }}
+
+
+
+
+
+
+
+ {{ scope.row.frozenFlag ? '是' : '否' }}
+
+
+
+
+
+
+
+ {{ scope.row.enableFlag ? '启用' : '停用' }}
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+
+ 确认
+
+
+ 删除
+
+
+
+ 生成任务
+
+
+
+
+
+
+
+
+
+
+