From cfbf7533b8cfc395a110390da23cf6bb641daff9 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 08 一月 2025 16:05:17 +0800
Subject: [PATCH] Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/funingyunwei into 2.0.1

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java           |  212 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwMaterialMapper.java                        |   13 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java                     |   94 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWarehouseMapper.java                       |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java                         |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingService.java                |  104 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWarehouseService.java                  |   98 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundMapper.java                      |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java       |  357 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingRecordService.java          |  100 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundRecordService.java           |   97 +
 server/db/business.yw_outinbound_record.permissions.sql                                                          |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java                         |  114 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java |  205 ++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java                       |  102 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java                   |  101 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java          |  237 +++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWarehouseController.java                      |  100 +
 server/db/business.yw_stocktaking_record.permissions.sql                                                         |    6 
 server/db/business.yw_outinbound.permissions.sql                                                                 |    6 
 server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java                                    |   30 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStockServiceImpl.java             |  129 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java         |  239 +++
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                         |   91 +
 server/db/business.yw_problem.permissions.sql                                                                    |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWarehouse.java                       |   85 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java               |  139 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java                        |   93 +
 server/db/business.yw_material.permissions.sql                                                                   |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundRecordServiceImpl.java  |  140 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingRecordController.java              |  103 +
 server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java                                   |    4 
 server/db/business.yw_stock.permissions.sql                                                                      |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingRecordMapper.java               |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java                |  138 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingController.java                    |  123 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundRecordMapper.java                |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java                        |  123 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java                           |   97 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java                     |  181 ++
 server/db/business.yw_stocktaking.permissions.sql                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java                    |   97 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java        |  391 +++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Category.java                          |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java                      |  111 +
 server/db/business.yw_warehouse.permissions.sql                                                                  |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStockMapper.java                           |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingMapper.java                     |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundService.java                 |   99 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStockService.java                      |   97 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java                          |   92 +
 51 files changed, 4,668 insertions(+), 8 deletions(-)

diff --git a/server/db/business.yw_material.permissions.sql b/server/db/business.yw_material.permissions.sql
new file mode 100644
index 0000000..df5ce32
--- /dev/null
+++ b/server/db/business.yw_material.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywmaterial:create', '鏂板缓杩愮淮璧勪骇淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywmaterial:delete', '鍒犻櫎杩愮淮璧勪骇淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywmaterial:update', '淇敼杩愮淮璧勪骇淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywmaterial:query', '鏌ヨ杩愮淮璧勪骇淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywmaterial:exportExcel', '瀵煎嚭杩愮淮璧勪骇淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_outinbound.permissions.sql b/server/db/business.yw_outinbound.permissions.sql
new file mode 100644
index 0000000..09b45fa
--- /dev/null
+++ b/server/db/business.yw_outinbound.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinbound:create', '鏂板缓杩愮淮鍑哄叆搴撲俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinbound:delete', '鍒犻櫎杩愮淮鍑哄叆搴撲俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinbound:update', '淇敼杩愮淮鍑哄叆搴撲俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinbound:query', '鏌ヨ杩愮淮鍑哄叆搴撲俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinbound:exportExcel', '瀵煎嚭杩愮淮鍑哄叆搴撲俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_outinbound_record.permissions.sql b/server/db/business.yw_outinbound_record.permissions.sql
new file mode 100644
index 0000000..e26032d
--- /dev/null
+++ b/server/db/business.yw_outinbound_record.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinboundrecord:create', '鏂板缓杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinboundrecord:delete', '鍒犻櫎杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinboundrecord:update', '淇敼杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinboundrecord:query', '鏌ヨ杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywoutinboundrecord:exportExcel', '瀵煎嚭杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_problem.permissions.sql b/server/db/business.yw_problem.permissions.sql
new file mode 100644
index 0000000..07c996d
--- /dev/null
+++ b/server/db/business.yw_problem.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproblem:create', '鏂板缓杩愮淮闂涓婃姤淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproblem:delete', '鍒犻櫎杩愮淮闂涓婃姤淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproblem:update', '淇敼杩愮淮闂涓婃姤淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproblem:query', '鏌ヨ杩愮淮闂涓婃姤淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproblem:exportExcel', '瀵煎嚭杩愮淮闂涓婃姤淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_stock.permissions.sql b/server/db/business.yw_stock.permissions.sql
new file mode 100644
index 0000000..2a2dbd3
--- /dev/null
+++ b/server/db/business.yw_stock.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstock:create', '鏂板缓杩愮淮搴撳瓨淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstock:delete', '鍒犻櫎杩愮淮搴撳瓨淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstock:update', '淇敼杩愮淮搴撳瓨淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstock:query', '鏌ヨ杩愮淮搴撳瓨淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstock:exportExcel', '瀵煎嚭杩愮淮搴撳瓨淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_stocktaking.permissions.sql b/server/db/business.yw_stocktaking.permissions.sql
new file mode 100644
index 0000000..ee2d847
--- /dev/null
+++ b/server/db/business.yw_stocktaking.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktaking:create', '鏂板缓杩愮淮鐩樼偣淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktaking:delete', '鍒犻櫎杩愮淮鐩樼偣淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktaking:update', '淇敼杩愮淮鐩樼偣淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktaking:query', '鏌ヨ杩愮淮鐩樼偣淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktaking:exportExcel', '瀵煎嚭杩愮淮鐩樼偣淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_stocktaking_record.permissions.sql b/server/db/business.yw_stocktaking_record.permissions.sql
new file mode 100644
index 0000000..7013420
--- /dev/null
+++ b/server/db/business.yw_stocktaking_record.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktakingrecord:create', '鏂板缓杩愮淮鐩樼偣鏄庣粏璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktakingrecord:delete', '鍒犻櫎杩愮淮鐩樼偣鏄庣粏璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktakingrecord:update', '淇敼杩愮淮鐩樼偣鏄庣粏璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktakingrecord:query', '鏌ヨ杩愮淮鐩樼偣鏄庣粏璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywstocktakingrecord:exportExcel', '瀵煎嚭杩愮淮鐩樼偣鏄庣粏璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_warehouse.permissions.sql b/server/db/business.yw_warehouse.permissions.sql
new file mode 100644
index 0000000..a874d0b
--- /dev/null
+++ b/server/db/business.yw_warehouse.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywwarehouse:create', '鏂板缓杩愮淮浠撳簱淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywwarehouse:delete', '鍒犻櫎杩愮淮浠撳簱淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywwarehouse:update', '淇敼杩愮淮浠撳簱淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywwarehouse:query', '鏌ヨ杩愮淮浠撳簱淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywwarehouse:exportExcel', '瀵煎嚭杩愮淮浠撳簱淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index 50b0d9d..f5ac3a4 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -52,6 +52,7 @@
     public static final String YW_DEVICE ="YW_DEVICE" ;
     public static final String YW_PATROL ="YW_PATROL" ;
     public static final String YW_CONTRACT_BILL ="YW_CONTRACT_BILL" ;
+    public static final String YW_MATERIAL ="YW_MATERIAL" ;
 
     public static final String RESERVATION_TOTAL_NUM ="RESERVATION_TOTAL_NUM" ;
     public static final String SIGN_IN_PLACE_LAT ="SIGN_IN_PLACE_LAT" ;
@@ -514,6 +515,9 @@
         public static final long EXPIRE_TIME = 7200;
 
         public static final String INTERNAL_TOKEN ="INTERNAL_TOKEN";
+        public static final String COM_OUTBOUND_OUT_KEY = "obout_";
+        public static final String COM_OUTBOUND_IN_KEY = "obin_";
+        public static final String COM_OUTBOUND_TAKING_KEY = "obtaking_";
 
         public static final String GOODSORDER_KEY = "ordercode_";
         public static final String ACTIVITY_SIGN_KEY = "actcode_";
@@ -640,6 +644,91 @@
     int otherDeal = 5;//浠栦汉宸插鐞�
     int otherUnPass = 6;//浠栦汉鎷掔粷
 }
+
+
+
+    //绫诲瀷 0閲囪喘鍏ュ簱 1棰嗙敤閫�鍥� 2搴撳瓨璋冩暣鍏ュ簱 3鍏朵粬鍏ュ簱 4鐩樼泩鍏ュ簱 5棰嗙敤鍑哄簱 6浠撳簱鍑哄簱 7璋冩暣鍑哄簱 8閲囪喘鍑哄簱 9鍏朵粬鍑哄簱 10鐩樹簭鍑哄簱
+    public  enum ywOutInType{
+        BUY_IN(0, 0),
+        USE_RETURN_IN(1, 0),
+        STOCK_IN(2, 0),
+        OTHER_IN(3, 0),
+        TAKING_IN(4, 0),
+        USE_OUT(5, 1),
+        HOUSE_OUT(6, 1),
+        STOCK_OUT(7, 1),
+        OTHER_UN_PASS_OUT(8, 1),
+        BUY_OUT(9, 1),
+        TAKING_OUT(10, 1)
+                ;
+        // 鎴愬憳鍙橀噺
+        private int key;
+        private int inOut;
+
+        // 鏋勯�犳柟娉�
+        ywOutInType(int key, int inOut) {
+            this.inOut = inOut;
+            this.key = key;
+        }
+
+        // 鏅�氭柟娉�
+        public static Integer getInOutValue(int index) {
+            for (ywOutInType c : ywOutInType.values()) {
+                if (c.getKey() == index) {
+                    return c.getInOut();
+                }
+            }
+            return null;
+        }
+
+
+        // 鏅�氭柟娉�
+        public static ywOutInType getYwOutInType(int index) {
+            for (ywOutInType c : ywOutInType.values()) {
+                if (c.getKey() == index) {
+                    return c;
+                }
+            }
+            return null;
+        }
+
+
+        /**
+         * 鏍规嵁鍑哄叆搴撶被鍨嬭幏鍙栨墍鏈夌殑鍏蜂綋绫诲瀷
+         * @param inOutType
+         * @return
+         */
+        public static List<Integer> getAllTypeKey(int inOutType) {
+            List<Integer> list = new ArrayList<>();
+            for (ywOutInType c : ywOutInType.values()) {
+                if (c.getInOut() == inOutType) {
+                    list.add(c.getKey());
+                }
+            }
+            return list;
+        }
+
+        // get set 鏂规硶
+        public int getInOut() {
+            return inOut;
+        }
+
+        public void setInOut(int inOut) {
+            this.inOut = inOut;
+        }
+
+        public int getKey() {
+            return key;
+        }
+
+        public void setKey(int key) {
+            this.key = key;
+        }
+
+
+    }
+
+
 
     /**
      * 鑾峰彇杞︾墝绫诲瀷淇℃伅
@@ -1297,6 +1386,8 @@
         YW_CONTRACT_FILE(9, "鍚堝悓闄勪欢 ", "鍚堝悓闄勪欢 "),
         FN_CONTRACT_REVENUE_FILE(10, "鏀舵敮娴佹按闄勪欢 ", "鍚堝悓璐﹀崟闄勪欢 "),
         FN_PATROL_TASK_RECORD_FILE(11, "宸℃浠诲姟鐐瑰鐞嗛檮浠� ", "宸℃浠诲姟鐐瑰鐞嗛檮浠� "),
+        MATERIAL_FILE(12, "璧勪骇闄勪欢 ", "璧勪骇闄勪欢 "),
+        PROBLEM_FILE(13, "闂闄勪欢 ", "闂闄勪欢 "),
 
         ;
         // 鎴愬憳鍙橀噺
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java b/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
index b0a6fb3..6ed4ba1 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
@@ -63,8 +63,8 @@
     @ExcelColumn(name="绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬")
     private Integer type;
 
-    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0闅愭偅鐜板満鎯呭喌 1闅愭偅澶勭悊鍓嶆儏鍐� 2闅愭偅澶勭悊鍚庢儏鍐� 3闅愭偅閫�鍥炶鏄� 4浼氳瀹ゆ枃浠� 5闃滃畞璁惧鍥剧墖 6闃滃畞璁惧杩愮淮鍥剧墖", example = "1")
-    @ExcelColumn(name="鍏宠仈瀵硅薄绫诲瀷 0闅愭偅鐜板満鎯呭喌 1闅愭偅澶勭悊鍓嶆儏鍐� 2闅愭偅澶勭悊鍚庢儏鍐� 3闅愭偅閫�鍥炶鏄� 4浼氳瀹ゆ枃浠�  5闃滃畞璁惧鍥剧墖 6闃滃畞璁惧杩愮淮鍥剧墖")
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0闅愭偅鐜板満鎯呭喌 1闅愭偅澶勭悊鍓嶆儏鍐� 2闅愭偅澶勭悊鍚庢儏鍐� 3闅愭偅閫�鍥炶鏄� 4浼氳瀹ゆ枃浠� 5闃滃畞璁惧鍥剧墖 6闃滃畞璁惧杩愮淮鍥剧墖 7璧勪骇闄勪欢", example = "1")
+    @ExcelColumn(name="鍏宠仈瀵硅薄绫诲瀷 0闅愭偅鐜板満鎯呭喌 1闅愭偅澶勭悊鍓嶆儏鍐� 2闅愭偅澶勭悊鍚庢儏鍐� 3闅愭偅閫�鍥炶鏄� 4浼氳瀹ゆ枃浠�  5闃滃畞璁惧鍥剧墖 6闃滃畞璁惧杩愮淮鍥剧墖 7璧勪骇闄勪欢")
     private Integer objType;
 
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
index 5bf7386..eda709f 100644
--- a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
@@ -3,17 +3,19 @@
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.utils.redis.RedisUtil;
 import com.doumee.core.wx.WXConstant;
 import com.doumee.dao.business.model.YwContract;
-import com.doumee.service.business.PlatformJobService;
-import com.doumee.service.business.YwContractBillService;
-import com.doumee.service.business.YwContractService;
-import com.doumee.service.business.YwPatrolSchemeService;
+import com.doumee.dao.business.model.YwOutinbound;
+import com.doumee.service.business.*;
+import com.doumee.service.business.impl.YwOutinboundServiceImpl;
 import com.doumee.service.system.SystemDictDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -43,6 +45,12 @@
     @Autowired
     private YwPatrolSchemeService ywPatrolSchemeService;
 
+    @Autowired
+    private YwOutinboundService ywOutinboundService;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
 
     @ApiOperation("瀹氭椂澶勭悊鍚堝悓璐﹀崟缂栫爜")
     @GetMapping("/ywDealContractBillCodeTimer")
@@ -67,7 +75,6 @@
     }
 
 
-
     @ApiOperation("瀹氭椂鐢熸垚浠婃棩宸℃浠诲姟浠诲姟")
     @GetMapping("/ywPatrolSchemeTaskTimer")
     public ApiResponse ywPatrolSchemeTaskTimer() {
@@ -76,4 +83,17 @@
     }
 
 
+    @ApiOperation("瀹氭椂鏇存柊redis鏁版嵁")
+    @GetMapping("/ywUpdRedisDataTimer")
+    public ApiResponse ywUpdRedisDataTimer() {
+        //鍔犲叆redis缂撳瓨锛屽叆搴撳崟鎬绘暟閲�
+        RedisUtil.addObject(redisTemplate, Constants.RedisKeys.COM_OUTBOUND_IN_KEY,0);
+        //鍔犲叆redis缂撳瓨锛屽嚭搴撳崟鎬绘暟閲�
+        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_OUT_KEY,0);
+        //鍔犲叆redis缂撳瓨锛岀洏鐐瑰崟鎬绘暟閲�
+        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_TAKING_KEY,0);
+        return ApiResponse.success("瀹氭椂鏇存柊redis鏁版嵁");
+    }
+
+
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java
new file mode 100644
index 0000000..e9d3cf6
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java
@@ -0,0 +1,102 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwMaterial;
+import com.doumee.service.business.YwMaterialService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮璧勪骇淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywMaterial")
+public class YwMaterialController extends BaseController {
+
+    @Autowired
+    private YwMaterialService ywMaterialService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywmaterial:create")
+    public ApiResponse create(@RequestBody YwMaterial ywMaterial,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywMaterial.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywMaterialService.create(ywMaterial));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywmaterial:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywMaterialService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywmaterial:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywMaterialService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywmaterial:update")
+    public ApiResponse updateById(@RequestBody YwMaterial ywMaterial,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywMaterialService.updateById(ywMaterial);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @CloudRequiredPermission("business:ywmaterial:update")
+    public ApiResponse updateStatus(@RequestBody YwMaterial ywMaterial,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywMaterialService.updateStatus(ywMaterial);
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywmaterial:query")
+    public ApiResponse<PageData<YwMaterial>> findPage (@RequestBody PageWrap<YwMaterial> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywMaterialService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywmaterial:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwMaterial> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwMaterial.class).export(ywMaterialService.findPage(pageWrap).getRecords(), "杩愮淮璧勪骇淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywmaterial:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywMaterialService.getDetail(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java
new file mode 100644
index 0000000..07544f7
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java
@@ -0,0 +1,94 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwOutinbound;
+import com.doumee.service.business.YwOutinboundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮鍑哄叆搴撲俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywOutinbound")
+public class YwOutinboundController extends BaseController {
+
+    @Autowired
+    private YwOutinboundService ywOutinboundService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywoutinbound:create")
+    public ApiResponse create(@RequestBody YwOutinbound ywOutinbound,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywOutinbound.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywOutinboundService.create(ywOutinbound));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywoutinbound:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywOutinboundService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywoutinbound:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywOutinboundService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywoutinbound:update")
+    public ApiResponse updateById(@RequestBody YwOutinbound ywOutinbound,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywOutinbound.setLoginUserInfo(this.getLoginUser(token));
+        ywOutinboundService.updateById(ywOutinbound);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywoutinbound:query")
+    public ApiResponse<PageData<YwOutinbound>> findPage (@RequestBody PageWrap<YwOutinbound> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywOutinboundService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywoutinbound:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwOutinbound> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwOutinbound.class).export(ywOutinboundService.findPage(pageWrap).getRecords(), "杩愮淮鍑哄叆搴撲俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywoutinbound:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywOutinboundService.getDetail(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java
new file mode 100644
index 0000000..310349f
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java
@@ -0,0 +1,93 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.config.annotation.LoginNoRequired;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwProblem;
+import com.doumee.service.business.YwProblemService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮闂涓婃姤淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywProblem")
+public class YwProblemController extends BaseController {
+
+    @Autowired
+    private YwProblemService ywProblemService;
+
+    @LoginNoRequired
+    @PreventRepeat
+    @ApiOperation("闂鎻愭姤")
+    @PostMapping("/create")
+    public ApiResponse create(@RequestBody YwProblem ywProblem) {
+        return ApiResponse.success(ywProblemService.create(ywProblem));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywproblem:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywProblemService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywproblem:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywProblemService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywproblem:update")
+    public ApiResponse updateById(@RequestBody YwProblem ywProblem) {
+        ywProblemService.updateById(ywProblem);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywproblem:query")
+    public ApiResponse<PageData<YwProblem>> findPage (@RequestBody PageWrap<YwProblem> pageWrap) {
+        return ApiResponse.success(ywProblemService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywproblem:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwProblem> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwProblem.class).export(ywProblemService.findPage(pageWrap).getRecords(), "杩愮淮闂涓婃姤淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywproblem:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywProblemService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java
new file mode 100644
index 0000000..badb715
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java
@@ -0,0 +1,92 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwStock;
+import com.doumee.service.business.YwStockService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮搴撳瓨淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywStock")
+public class YwStockController extends BaseController {
+
+    @Autowired
+    private YwStockService ywStockService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywstock:create")
+    public ApiResponse create(@RequestBody YwStock ywStock) {
+        return ApiResponse.success(ywStockService.create(ywStock));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywstock:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywStockService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywstock:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywStockService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywstock:update")
+    public ApiResponse updateById(@RequestBody YwStock ywStock) {
+        ywStockService.updateById(ywStock);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywstock:query")
+    public ApiResponse<PageData<YwStock>> findPage (@RequestBody PageWrap<YwStock> pageWrap) {
+        return ApiResponse.success(ywStockService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywstock:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwStock> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwStock.class).export(ywStockService.findPage(pageWrap).getRecords(), "杩愮淮搴撳瓨淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywstock:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywStockService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingController.java
new file mode 100644
index 0000000..97e1230
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingController.java
@@ -0,0 +1,123 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwStocktaking;
+import com.doumee.service.business.YwStocktakingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮鐩樼偣淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywStocktaking")
+public class YwStocktakingController extends BaseController {
+
+    @Autowired
+    private YwStocktakingService ywStocktakingService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywstocktaking:create")
+    public ApiResponse create(@RequestBody YwStocktaking ywStocktaking,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktaking.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywStocktakingService.create(ywStocktaking));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywstocktaking:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingService.deleteById(id,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywstocktaking:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywStocktakingService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywstocktaking:update")
+    public ApiResponse updateById(@RequestBody YwStocktaking ywStocktaking,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingService.updateById(ywStocktaking);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywstocktaking:query")
+    public ApiResponse<PageData<YwStocktaking>> findPage (@RequestBody PageWrap<YwStocktaking> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywStocktakingService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywstocktaking:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwStocktaking> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwStocktaking.class).export(ywStocktakingService.findPage(pageWrap).getRecords(), "杩愮淮鐩樼偣淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywstocktaking:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywStocktakingService.getDetail(id));
+    }
+
+
+
+    @ApiOperation("鍙栨秷鐩樼偣鍗�")
+    @GetMapping("/cancelById")
+    @CloudRequiredPermission("business:ywstocktaking:delete")
+    public ApiResponse cancelById(@RequestParam Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingService.cancelById(id,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("寮�濮嬬洏鐐瑰崟")
+    @GetMapping("/beginById")
+    @CloudRequiredPermission("business:ywstocktaking:delete")
+    public ApiResponse beginById(@RequestParam Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingService.beginById(id,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("瀹屾垚鐩樼偣鍗�")
+    @GetMapping("/finishById")
+    @CloudRequiredPermission("business:ywstocktaking:delete")
+    public ApiResponse finishById(@RequestParam Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingService.finishById(id,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingRecordController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingRecordController.java
new file mode 100644
index 0000000..71a6469
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStocktakingRecordController.java
@@ -0,0 +1,103 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwStocktakingRecord;
+import com.doumee.service.business.YwStocktakingRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮鐩樼偣鏄庣粏璁板綍琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywStocktakingRecord")
+public class YwStocktakingRecordController extends BaseController {
+
+    @Autowired
+    private YwStocktakingRecordService ywStocktakingRecordService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywstocktakingrecord:create")
+    public ApiResponse create(@RequestBody YwStocktakingRecord ywStocktakingRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywStocktakingRecordService.create(ywStocktakingRecord));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywstocktakingrecord:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingRecordService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywstocktakingrecord:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywStocktakingRecordService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywstocktakingrecord:update")
+    public ApiResponse updateById(@RequestBody YwStocktakingRecord ywStocktakingRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingRecordService.updateById(ywStocktakingRecord);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywstocktakingrecord:query")
+    public ApiResponse<PageData<YwStocktakingRecord>> findPage (@RequestBody PageWrap<YwStocktakingRecord> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywStocktakingRecordService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywstocktakingrecord:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwStocktakingRecord> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwStocktakingRecord.class).export(ywStocktakingRecordService.findPage(pageWrap).getRecords(), "杩愮淮鐩樼偣鏄庣粏璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywstocktakingrecord:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywStocktakingRecordService.getDetail(id));
+    }
+
+
+    @ApiOperation("鐩樼偣鎻愪氦")
+    @PostMapping("/takingData")
+    @CloudRequiredPermission("business:ywstocktakingrecord:update")
+    public ApiResponse takingData(@RequestBody YwStocktakingRecord ywStocktakingRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywStocktakingRecord.setLoginUserInfo(getLoginUser(token));
+        ywStocktakingRecordService.takingData(ywStocktakingRecord);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWarehouseController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWarehouseController.java
new file mode 100644
index 0000000..b4d0c7e
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWarehouseController.java
@@ -0,0 +1,100 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwWarehouse;
+import com.doumee.service.business.YwWarehouseService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Api(tags = "杩愮淮浠撳簱淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywWarehouse")
+public class YwWarehouseController extends BaseController {
+
+    @Autowired
+    private YwWarehouseService ywWarehouseService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywwarehouse:create")
+    public ApiResponse create(@RequestBody YwWarehouse ywWarehouse,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywWarehouse.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywWarehouseService.create(ywWarehouse));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywwarehouse:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywWarehouseService.deleteById(id,this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+//
+//    @ApiOperation("鎵归噺鍒犻櫎")
+//    @GetMapping("/delete/batch")
+//    @CloudRequiredPermission("business:ywwarehouse:delete")
+//    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+//        String [] idArray = ids.split(",");
+//        List<Integer> idList = new ArrayList<>();
+//        for (String id : idArray) {
+//            idList.add(Integer.valueOf(id));
+//        }
+//        ywWarehouseService.deleteByIdInBatch(idList);
+//        return ApiResponse.success(null);
+//    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywwarehouse:update")
+    public ApiResponse updateById(@RequestBody YwWarehouse ywWarehouse,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywWarehouseService.updateById(ywWarehouse);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywwarehouse:query")
+    public ApiResponse<PageData<YwWarehouse>> findPage (@RequestBody PageWrap<YwWarehouse> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWarehouseService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鍒楄〃鏌ヨ")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:ywwarehouse:query")
+    public ApiResponse<List<YwWarehouse>> findList (@RequestBody YwWarehouse model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWarehouseService.findList(model));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywwarehouse:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwWarehouse> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwWarehouse.class).export(ywWarehouseService.findPage(pageWrap).getRecords(), "杩愮淮浠撳簱淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywwarehouse:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWarehouseService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwMaterialMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwMaterialMapper.java
new file mode 100644
index 0000000..7a30466
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwMaterialMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwMaterial;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwMaterialMapper extends MPJBaseMapper<YwMaterial> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundMapper.java
new file mode 100644
index 0000000..7274448
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwOutinbound;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwOutinboundMapper extends MPJBaseMapper<YwOutinbound> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundRecordMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundRecordMapper.java
new file mode 100644
index 0000000..800d513
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwOutinboundRecordMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwOutinboundRecord;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 14:28
+ */
+public interface YwOutinboundRecordMapper extends MPJBaseMapper<YwOutinboundRecord> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java
new file mode 100644
index 0000000..92b447a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwProblem;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwProblemMapper extends BaseMapper<YwProblem> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStockMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStockMapper.java
new file mode 100644
index 0000000..9c80527
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStockMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwStock;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStockMapper extends MPJBaseMapper<YwStock> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingMapper.java
new file mode 100644
index 0000000..1786dea
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwStocktaking;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStocktakingMapper extends MPJBaseMapper<YwStocktaking> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingRecordMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingRecordMapper.java
new file mode 100644
index 0000000..c360f7f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwStocktakingRecordMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwStocktakingRecord;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStocktakingRecordMapper extends MPJBaseMapper<YwStocktakingRecord> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWarehouseMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWarehouseMapper.java
new file mode 100644
index 0000000..e009c33
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWarehouseMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwWarehouse;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwWarehouseMapper extends MPJBaseMapper<YwWarehouse> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Category.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Category.java
index 4f5d50b..c71f12c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Category.java
@@ -68,7 +68,7 @@
      //@ExcelColumn(name="鍥炬爣")
     private String imgurl;
 
-    @ApiModelProperty(value = "绫诲瀷 0鍏徃绫诲瀷 1杞﹁締绫诲瀷 2杩愮淮-瀹㈡埛琛屼笟鍒嗙被 3杩愮淮-宸ュ崟鍒嗙被 4杩愮淮-宸℃鍖哄煙 5杩愮淮-璁惧鍒嗙被 6=瀹㈡埛琛屼笟" )
+    @ApiModelProperty(value = "绫诲瀷 0鍏徃绫诲瀷 1杞﹁締绫诲瀷 2杩愮淮-瀹㈡埛琛屼笟鍒嗙被 3杩愮淮-宸ュ崟鍒嗙被 4杩愮淮-宸℃鍖哄煙 5杩愮淮-璁惧鍒嗙被 6=瀹㈡埛琛屼笟 7=璧勪骇鍒嗙被" )
      //@ExcelColumn(name="绫诲瀷 0鍏徃绫诲瀷 1杞﹁締绫诲瀷")
     private Integer type;
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java
new file mode 100644
index 0000000..5f23ec8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java
@@ -0,0 +1,123 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import com.doumee.dao.system.model.Multifile;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮璧勪骇淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮璧勪骇淇℃伅琛�")
+@TableName("`yw_material`")
+public class YwMaterial extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鎵�灞炰竴绾у垎绫荤紪鐮侊紙鍏宠仈category)", example = "1")
+    @ExcelColumn(name="鎵�灞炰竴绾у垎绫荤紪鐮侊紙鍏宠仈category)")
+    private Integer parentCateId;
+
+    @ApiModelProperty(value = "鎵�灞炰簩绾у垎绫荤紪鐮�(鍏宠仈category锛�", example = "1")
+    @ExcelColumn(name="鎵�灞炰簩绾у垎绫荤紪鐮�(鍏宠仈category锛�")
+    private Integer cateId;
+
+    @ApiModelProperty(value = "鏉$爜")
+    @ExcelColumn(name="鏉$爜")
+    private String qrcode;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍝佺墝")
+    @ExcelColumn(name="鍝佺墝")
+    private String brand;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    @ExcelColumn(name="瑙勬牸鍨嬪彿")
+    private String attr;
+
+    @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笅闄愶級", example = "1")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笅闄愶級")
+    private BigDecimal minStock;
+
+    @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笂闄愶級", example = "1")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笂闄愶級")
+    private BigDecimal maxStock;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    @ExcelColumn(name="鍗曚綅")
+    private String unitName;
+
+    @ApiModelProperty(value = "鎵�灞炴埧婧愮紪鐮�(鍏宠仈yw_room)", example = "1")
+    @ExcelColumn(name="鎵�灞炴埧婧愮紪鐮�(鍏宠仈yw_room)")
+    private Integer roomId;
+
+    @ApiModelProperty(value = "鏄惁鑷姩缂栫爜锛�0=鍚︼紱1=鏄紱", example = "1")
+    @ExcelColumn(name="鏄惁鑷姩缂栫爜锛�0=鍚︼紱1=鏄紱")
+    private Integer autoCode;
+
+    @ApiModelProperty(value = "闄勪欢淇℃伅", example = "1")
+    @TableField(exist = false)
+    private Multifile multifile;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩富閿�", example = "1")
+    @TableField(exist = false)
+    private Integer projectId;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java
new file mode 100644
index 0000000..e84edc2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java
@@ -0,0 +1,111 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭〃
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮鍑哄叆搴撲俊鎭〃")
+@TableName("`yw_outinbound`")
+public class YwOutinbound extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    @ExcelColumn(name="浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
+    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
+    private Integer materialId;
+
+    @ApiModelProperty(value = "鏁伴噺", example = "1")
+    @ExcelColumn(name="鏁伴噺")
+    private BigDecimal stock;
+
+    @ApiModelProperty(value = "绫诲瀷 0閲囪喘鍏ュ簱 1棰嗙敤閫�鍥� 2璋冩暣鍏ュ簱 3鍏朵粬鍏ュ簱 4鐩樼泩鍏ュ簱 5棰嗙敤鍑哄簱 6浠撳簱鍑哄簱 7璋冩暣鍑哄簱 8閲囪喘鍑哄簱 9鍏朵粬鍑哄簱 10鐩樹簭鍑哄簱", example = "1")
+    @ExcelColumn(name="绫诲瀷 0閲囪喘鍏ュ簱 1棰嗙敤閫�鍥� 2璋冩暣鍏ュ簱 3鍏朵粬鍏ュ簱 4鐩樼泩鍏ュ簱 5棰嗙敤鍑哄簱 6浠撳簱鍑哄簱 7璋冩暣鍑哄簱 8閲囪喘鍑哄簱 9鍏朵粬鍑哄簱 10鐩樹簭鍑哄簱")
+    private Integer type;
+
+    @ApiModelProperty(value = "鏉ユ簮 0鎵嬪姩褰曞叆 1绯荤粺鐢熸垚", example = "1")
+    @ExcelColumn(name="鏉ユ簮 0鎵嬪姩褰曞叆 1绯荤粺鐢熸垚")
+    private Integer origin;
+
+    @ApiModelProperty(value = "璇存槑")
+    @ExcelColumn(name="璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "鍑哄叆搴撴棩鏈�")
+    @ExcelColumn(name="鍑哄叆搴撴棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date doneDate;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍗曟嵁缂栧彿")
+    @ExcelColumn(name="鍗曟嵁缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鍑哄叆搴撴暟鎹槑缁�", example = "1")
+    @TableField(exist = false)
+    private List<YwOutinboundRecord> recordList;
+
+
+    @ApiModelProperty(value = "鎿嶄綔绫诲瀷锛�1=鍑哄簱锛�0=鍏ュ簱锛堝垎椤靛垪琛ㄦ煡璇娇鐢級", example = "1")
+    @TableField(exist = false)
+    private Integer inOut;
+
+    @ApiModelProperty(value = "浠撳簱鍚嶇О", example = "1")
+    @TableField(exist = false)
+    private String warehouseName;
+
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
+    @TableField(exist = false)
+    private String createUserName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java
new file mode 100644
index 0000000..b201cb7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java
@@ -0,0 +1,138 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 14:28
+ */
+@Data
+@ApiModel("杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃")
+@TableName("`yw_outinbound_record`")
+public class YwOutinboundRecord {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍑哄叆搴撹褰曚富閿�", example = "1")
+    @ExcelColumn(name="鍑哄叆搴撹褰曚富閿�")
+    private Integer outInBoundId;
+
+    @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
+    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
+    private Integer materialId;
+
+    @ApiModelProperty(value = "鏁伴噺", example = "1")
+    @ExcelColumn(name="鏁伴噺")
+    private BigDecimal stock;
+
+    @ApiModelProperty(value = "璧勪骇缂栫爜")
+    @TableField(exist = false)
+    private String materialCode;
+
+    @ApiModelProperty(value = "璧勪骇鍚嶇О")
+    @TableField(exist = false)
+    private String materialName;
+
+    @ApiModelProperty(value = "璧勪骇鏉″舰鐮�")
+    @TableField(exist = false)
+    private String materialQrcode;
+
+    @ApiModelProperty(value = "璧勪骇鍝佺墝")
+    @TableField(exist = false)
+    private String materialBrand;
+
+    @ApiModelProperty(value = "璧勪骇鍗曚綅")
+    @TableField(exist = false)
+    private String materialUnitName;
+
+    @ApiModelProperty(value = "鎿嶄綔绫诲瀷锛�1=鍑哄簱锛�0=鍏ュ簱锛堝垎椤靛垪琛ㄦ煡璇娇鐢級", example = "1")
+    @TableField(exist = false)
+    private Integer inOut;
+
+    @ApiModelProperty(value = "浠撳簱涓婚敭")
+    @TableField(exist = false)
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "浠撳簱鍚嶇О")
+    @TableField(exist = false)
+    private String warehouseName;
+
+    @ApiModelProperty(value = "鍗曟嵁鏃ユ湡")
+    @TableField(exist = false)
+    private Date doneDate;
+
+    @ApiModelProperty(value = "涓�绾у垎绫诲悕绉�")
+    @TableField(exist = false)
+    private String categoryParentName;
+
+    @ApiModelProperty(value = "浜岀骇鍒嗙被鍚嶇О")
+    @TableField(exist = false)
+    private String categoryName;
+
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
+    @TableField(exist = false)
+    private String createUserName;
+
+    @ApiModelProperty(value = "鍗曟嵁缂栧彿", example = "1")
+    @TableField(exist = false)
+    private String code;
+
+
+    @ApiModelProperty(value = "鍗曟嵁鏃ユ湡 寮�濮� yyyy-MM-dd", example = "1")
+    @TableField(exist = false)
+    private String doneDateStart;
+
+    @ApiModelProperty(value = "鍗曟嵁鏃ユ湡 缁撴潫 yyyy-MM-dd", example = "1")
+    @TableField(exist = false)
+    private String doneDateEnd;
+
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡 寮�濮� yyyy-MM-dd", example = "1")
+    @TableField(exist = false)
+    private String createDateStart;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡 缁撴潫 yyyy-MM-dd", example = "1")
+    @TableField(exist = false)
+    private String createDateEnd;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java
new file mode 100644
index 0000000..d6ab8c4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java
@@ -0,0 +1,114 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.dao.system.model.Multifile;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 杩愮淮闂涓婃姤淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮闂涓婃姤淇℃伅琛�")
+@TableName("`yw_problem`")
+public class YwProblem {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "浣嶇疆")
+    @ExcelColumn(name="浣嶇疆")
+    private String position;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎯呭喌璇存槑")
+    @ExcelColumn(name="鎯呭喌璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "涓婃姤浜哄鍚�")
+    @ExcelColumn(name="涓婃姤浜哄鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽")
+    @ExcelColumn(name="鑱旂郴鐢佃瘽")
+    private String phone;
+
+    @ApiModelProperty(value = "鎻愭姤鏃堕棿")
+    @ExcelColumn(name="鎻愭姤鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date submitDate;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "澶勭悊鐘舵�� 0寰呭鐞� 1宸茶浆宸ュ崟 2宸插叧闂�", example = "1")
+    @ExcelColumn(name="澶勭悊鐘舵�� 0寰呭鐞� 1宸茶浆宸ュ崟 2宸插叧闂�")
+    private Integer dealStatus;
+
+    @ApiModelProperty(value = "澶勭悊浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="澶勭悊浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer dealUserId;
+
+    @ApiModelProperty(value = "澶勭悊鏃堕棿")
+    @ExcelColumn(name="澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+    @ApiModelProperty(value = "澶勭悊澶囨敞")
+    @ExcelColumn(name="澶勭悊澶囨敞")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "澶勭悊鏂瑰紡 0杞伐鍗� 1鍏抽棴", example = "1")
+    @ExcelColumn(name="澶勭悊鏂瑰紡 0杞伐鍗� 1鍏抽棴")
+    private Integer dealType;
+
+    @ApiModelProperty(value = "鍏宠仈宸ュ崟缂栫爜锛堝叧鑱攜w_workorder)", example = "1")
+    @ExcelColumn(name="鍏宠仈宸ュ崟缂栫爜锛堝叧鑱攜w_workorder)")
+    private Integer workorderId;
+
+    @ApiModelProperty(value = "闄勪欢淇℃伅")
+    @TableField(exist = false)
+    private List<Multifile> fileList;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
new file mode 100644
index 0000000..dc2ec33
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
@@ -0,0 +1,97 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮搴撳瓨淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮搴撳瓨淇℃伅琛�")
+@TableName("`yw_stock`")
+public class YwStock {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    @ExcelColumn(name="浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
+    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
+    private Integer materialId;
+
+    @ApiModelProperty(value = "鏁伴噺", example = "1")
+    @ExcelColumn(name="鏁伴噺")
+    private BigDecimal stock;
+
+
+    @ApiModelProperty(value = "璧勪骇缂栫爜")
+    @TableField(exist = false)
+    private String materialCode;
+
+    @ApiModelProperty(value = "璧勪骇鍚嶇О")
+    @TableField(exist = false)
+    private String materialName;
+
+    @ApiModelProperty(value = "璧勪骇鏉″舰鐮�")
+    @TableField(exist = false)
+    private String materialQrcode;
+
+    @ApiModelProperty(value = "璧勪骇鍝佺墝")
+    @TableField(exist = false)
+    private String materialBrand;
+
+    @ApiModelProperty(value = "璧勪骇鍗曚綅")
+    @TableField(exist = false)
+    private String materialUnitName;
+
+    @ApiModelProperty(value = "璧勪骇瑙勬牸鍨嬪彿")
+    @TableField(exist = false)
+    private String materialAttr;
+
+    @ApiModelProperty(value = "浠撳簱鍚嶇О")
+    @TableField(exist = false)
+    private String warehouseName;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java
new file mode 100644
index 0000000..3addc97
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java
@@ -0,0 +1,181 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 杩愮淮鐩樼偣淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮鐩樼偣淇℃伅琛�")
+@TableName("`yw_stocktaking`")
+public class YwStocktaking extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "浣嶇疆")
+    @ExcelColumn(name="浣嶇疆")
+    private String position;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈紑濮� 1杩涜涓� 2宸插畬鎴� 3宸插彇娑�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈紑濮� 1杩涜涓� 2宸插畬鎴� 3宸插彇娑�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
+    @ExcelColumn(name="鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鐩樼偣鏃堕棿")
+    @ExcelColumn(name="鐩樼偣鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDate;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    @ExcelColumn(name="浠撳簱缂栫爜(鍏宠仈yw_warehouse)")
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "寮�濮嬪鐞嗕汉(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="寮�濮嬪鐞嗕汉(鍏宠仈system_user)")
+    private Integer dealUserId;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @ExcelColumn(name="寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+    @ApiModelProperty(value = "寮�濮嬪娉�")
+    @ExcelColumn(name="寮�濮嬪娉�")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "宸茬洏鐐圭墿璧勬暟閲�", example = "1")
+    @ExcelColumn(name="宸茬洏鐐圭墿璧勬暟閲�")
+    private Integer doneNum;
+
+    @ApiModelProperty(value = "鏈洏鐐圭墿璧勬暟閲�", example = "1")
+    @ExcelColumn(name="鏈洏鐐圭墿璧勬暟閲�")
+    private Integer waitNum;
+
+    @ApiModelProperty(value = "鎬荤墿璧勬暟閲�", example = "1")
+    @ExcelColumn(name="鎬荤墿璧勬暟閲�")
+    private Integer totalNum;
+
+    @ApiModelProperty(value = "鐩樼泩鐗╄祫鏁伴噺", example = "1")
+    @ExcelColumn(name="鐩樼泩鐗╄祫鏁伴噺")
+    private Integer profitNum;
+
+    @ApiModelProperty(value = "鐩樹簭鐗╄祫鏁伴噺", example = "1")
+    @ExcelColumn(name="鐩樹簭鐗╄祫鏁伴噺")
+    private Integer lossNum;
+
+    @ApiModelProperty(value = "璐﹀疄鐩哥鐗╄祫鏁伴噺", example = "1")
+    @ExcelColumn(name="璐﹀疄鐩哥鐗╄祫鏁伴噺")
+    private Integer equalNum;
+
+    @ApiModelProperty(value = "瀹屾垚澶勭悊浜�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="瀹屾垚澶勭悊浜�(鍏宠仈system_user)")
+    private Integer doneUserId;
+
+    @ApiModelProperty(value = "瀹屾垚鏃堕棿")
+    @ExcelColumn(name="瀹屾垚鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date doneDate;
+
+    @ApiModelProperty(value = "瀹屾垚澶囨敞")
+    @ExcelColumn(name="瀹屾垚澶囨敞")
+    private String doneInfo;
+
+    @ApiModelProperty(value = "鍙栨秷澶勭悊浜�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="鍙栨秷澶勭悊浜�(鍏宠仈system_user)")
+    private Integer cancelUserId;
+
+    @ApiModelProperty(value = "鍙栨秷鏃堕棿")
+    @ExcelColumn(name="鍙栨秷鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date cancelDate;
+
+    @ApiModelProperty(value = "鍙栨秷澶囨敞")
+    @ExcelColumn(name="鍙栨秷澶囨敞")
+    private String cancelInfo;
+
+    @ApiModelProperty(value = "浠撳簱鍚嶇О")
+    @TableField(exist = false)
+    private String warehouseName;
+
+    @ApiModelProperty(value = "鍒涘缓浜哄悕绉�")
+    @TableField(exist = false)
+    private String createName;
+
+    @ApiModelProperty(value = "鐩樼偣鍛樺悕绉�")
+    @TableField(exist = false)
+    private String userName;
+
+    @ApiModelProperty(value = "宸茬洏璁板綍鏁�")
+    @TableField(exist = false)
+    private Integer finishAmount;
+
+    @ApiModelProperty(value = "鏈洏璁板綍鏁�")
+    @TableField(exist = false)
+    private Integer unFinishAmount;
+
+    @ApiModelProperty(value = "鐩樼泩璁板綍鏁�")
+    @TableField(exist = false)
+    private Integer profitAmount;
+
+    @ApiModelProperty(value = "鐩樹簭璁板綍鏁�")
+    @TableField(exist = false)
+    private Integer lossAmount;
+
+    @ApiModelProperty(value = "鐩哥璁板綍鏁�")
+    @TableField(exist = false)
+    private Integer equalAmount;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java
new file mode 100644
index 0000000..6672876
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java
@@ -0,0 +1,139 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鐩樼偣鏄庣粏璁板綍琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮鐩樼偣鏄庣粏璁板綍琛�")
+@TableName("`yw_stocktaking_record`")
+public class YwStocktakingRecord extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈紑濮� 1宸茬洏鐐�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈紑濮� 1宸茬洏鐐�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
+    @ExcelColumn(name="鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
+    private String userId;
+
+    @ApiModelProperty(value = "鐩樼偣鏃堕棿")
+    @ExcelColumn(name="鐩樼偣鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDate;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
+    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
+    private Integer materialId;
+
+    @ApiModelProperty(value = "璐﹂潰鏁伴噺", example = "1")
+    @ExcelColumn(name="璐﹂潰鏁伴噺")
+    private BigDecimal stock;
+
+    @ApiModelProperty(value = "瀹為檯鐩樼偣搴撳瓨閲�", example = "1")
+    @ExcelColumn(name="瀹為檯鐩樼偣搴撳瓨閲�")
+    private BigDecimal actStock;
+
+    @ApiModelProperty(value = "鐩樼偣 0璐﹀疄鐩哥 1鐩樹簭 2鐩樼泩", example = "1")
+    @ExcelColumn(name="鐩樼偣 0璐﹀疄鐩哥 1鐩樹簭 2鐩樼泩")
+    private Integer type;
+
+    @ApiModelProperty(value = "鐩樼偣璁″垝缂栫爜(鍏宠仈yw_stocktaking)", example = "1")
+    @ExcelColumn(name="鐩樼偣璁″垝缂栫爜(鍏宠仈yw_stocktaking)")
+    private Integer stocktakingId;
+
+    @ApiModelProperty(value = "璧勪骇缂栫爜")
+    @TableField(exist = false)
+    private String materialCode;
+
+    @ApiModelProperty(value = "璧勪骇鍚嶇О")
+    @TableField(exist = false)
+    private String materialName;
+
+    @ApiModelProperty(value = "璧勪骇鏉″舰鐮�")
+    @TableField(exist = false)
+    private String materialQrcode;
+
+    @ApiModelProperty(value = "璧勪骇鍝佺墝")
+    @TableField(exist = false)
+    private String materialBrand;
+
+    @ApiModelProperty(value = "璧勪骇瑙勬牸鍨嬪彿")
+    @TableField(exist = false)
+    private String materialAttr;
+
+    @ApiModelProperty(value = "璧勪骇鍗曚綅")
+    @TableField(exist = false)
+    private String materialUnitName;
+
+    @ApiModelProperty(value = "浠撳簱鍚嶇О")
+    @TableField(exist = false)
+    private String warehouseName;
+
+    @ApiModelProperty(value = "鐩樼偣浜哄悕绉�")
+    @TableField(exist = false)
+    private String userName;
+
+    @ApiModelProperty(value = "鐩樼偣浜虹粍缁囧悕绉�")
+    @TableField(exist = false)
+    private String companyName;
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWarehouse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWarehouse.java
new file mode 100644
index 0000000..812fbc3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWarehouse.java
@@ -0,0 +1,85 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 杩愮淮浠撳簱淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Data
+@ApiModel("杩愮淮浠撳簱淇℃伅琛�")
+@TableName("`yw_warehouse`")
+public class YwWarehouse  extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "浣嶇疆")
+    @ExcelColumn(name="浣嶇疆")
+    private String position;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "璐熻矗浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="璐熻矗浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+
+    @ApiModelProperty(value = "璐熻矗浜哄悕绉�", example = "1")
+    @TableField(exist = false)
+    private String userName;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java
new file mode 100644
index 0000000..6da3431
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java
@@ -0,0 +1,101 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwMaterial;
+import java.util.List;
+
+/**
+ * 杩愮淮璧勪骇淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwMaterialService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwMaterial ywMaterial);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     */
+    void delete(YwMaterial ywMaterial);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     */
+    void updateById(YwMaterial ywMaterial);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywMaterials 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwMaterial> ywMaterials);
+
+    void updateStatus(YwMaterial ywMaterials);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwMaterial
+     */
+    YwMaterial findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     * @return YwMaterial
+     */
+    YwMaterial findOne(YwMaterial ywMaterial);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     * @return List<YwMaterial>
+     */
+    List<YwMaterial> findList(YwMaterial ywMaterial);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwMaterial>
+     */
+    PageData<YwMaterial> findPage(PageWrap<YwMaterial> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywMaterial 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwMaterial ywMaterial);
+
+    YwMaterial getDetail(Integer id);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundRecordService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundRecordService.java
new file mode 100644
index 0000000..8ed0246
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundRecordService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwOutinboundRecord;
+import java.util.List;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 14:28
+ */
+public interface YwOutinboundRecordService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwOutinboundRecord ywOutinboundRecord);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     */
+    void delete(YwOutinboundRecord ywOutinboundRecord);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     */
+    void updateById(YwOutinboundRecord ywOutinboundRecord);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywOutinboundRecords 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwOutinboundRecord> ywOutinboundRecords);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwOutinboundRecord
+     */
+    YwOutinboundRecord findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     * @return YwOutinboundRecord
+     */
+    YwOutinboundRecord findOne(YwOutinboundRecord ywOutinboundRecord);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     * @return List<YwOutinboundRecord>
+     */
+    List<YwOutinboundRecord> findList(YwOutinboundRecord ywOutinboundRecord);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwOutinboundRecord>
+     */
+    PageData<YwOutinboundRecord> findPage(PageWrap<YwOutinboundRecord> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywOutinboundRecord 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwOutinboundRecord ywOutinboundRecord);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundService.java
new file mode 100644
index 0000000..379ff7b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwOutinboundService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwOutinbound;
+import java.util.List;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwOutinboundService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwOutinbound ywOutinbound);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     */
+    void delete(YwOutinbound ywOutinbound);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     */
+    void updateById(YwOutinbound ywOutinbound);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywOutinbounds 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwOutinbound> ywOutinbounds);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwOutinbound
+     */
+    YwOutinbound findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     * @return YwOutinbound
+     */
+    YwOutinbound findOne(YwOutinbound ywOutinbound);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     * @return List<YwOutinbound>
+     */
+    List<YwOutinbound> findList(YwOutinbound ywOutinbound);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwOutinbound>
+     */
+    PageData<YwOutinbound> findPage(PageWrap<YwOutinbound> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywOutinbound 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwOutinbound ywOutinbound);
+
+    YwOutinbound getDetail(Integer id);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java
new file mode 100644
index 0000000..a0f41d4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwProblem;
+import java.util.List;
+
+/**
+ * 杩愮淮闂涓婃姤淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwProblemService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywProblem 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwProblem ywProblem);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywProblem 瀹炰綋瀵硅薄
+     */
+    void delete(YwProblem ywProblem);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywProblem 瀹炰綋瀵硅薄
+     */
+    void updateById(YwProblem ywProblem);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywProblems 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwProblem> ywProblems);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwProblem
+     */
+    YwProblem findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywProblem 瀹炰綋瀵硅薄
+     * @return YwProblem
+     */
+    YwProblem findOne(YwProblem ywProblem);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywProblem 瀹炰綋瀵硅薄
+     * @return List<YwProblem>
+     */
+    List<YwProblem> findList(YwProblem ywProblem);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwProblem>
+     */
+    PageData<YwProblem> findPage(PageWrap<YwProblem> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywProblem 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwProblem ywProblem);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStockService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStockService.java
new file mode 100644
index 0000000..1b6d5a0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStockService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwStock;
+import java.util.List;
+
+/**
+ * 杩愮淮搴撳瓨淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStockService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywStock 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwStock ywStock);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywStock 瀹炰綋瀵硅薄
+     */
+    void delete(YwStock ywStock);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywStock 瀹炰綋瀵硅薄
+     */
+    void updateById(YwStock ywStock);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywStocks 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwStock> ywStocks);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwStock
+     */
+    YwStock findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywStock 瀹炰綋瀵硅薄
+     * @return YwStock
+     */
+    YwStock findOne(YwStock ywStock);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywStock 瀹炰綋瀵硅薄
+     * @return List<YwStock>
+     */
+    List<YwStock> findList(YwStock ywStock);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwStock>
+     */
+    PageData<YwStock> findPage(PageWrap<YwStock> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywStock 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwStock ywStock);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingRecordService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingRecordService.java
new file mode 100644
index 0000000..0c2f5db
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingRecordService.java
@@ -0,0 +1,100 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwStocktakingRecord;
+import java.util.List;
+
+/**
+ * 杩愮淮鐩樼偣鏄庣粏璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStocktakingRecordService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwStocktakingRecord ywStocktakingRecord);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     */
+    void delete(YwStocktakingRecord ywStocktakingRecord);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     */
+    void updateById(YwStocktakingRecord ywStocktakingRecord);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywStocktakingRecords 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwStocktakingRecord> ywStocktakingRecords);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwStocktakingRecord
+     */
+    YwStocktakingRecord findById(Integer id);
+
+    YwStocktakingRecord getDetail(Integer id);
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     * @return YwStocktakingRecord
+     */
+    YwStocktakingRecord findOne(YwStocktakingRecord ywStocktakingRecord);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     * @return List<YwStocktakingRecord>
+     */
+    List<YwStocktakingRecord> findList(YwStocktakingRecord ywStocktakingRecord);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwStocktakingRecord>
+     */
+    PageData<YwStocktakingRecord> findPage(PageWrap<YwStocktakingRecord> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywStocktakingRecord 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwStocktakingRecord ywStocktakingRecord);
+
+    void takingData(YwStocktakingRecord ywStocktakingRecord);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingService.java
new file mode 100644
index 0000000..0df5bf2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwStocktakingService.java
@@ -0,0 +1,104 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwStocktaking;
+import java.util.List;
+
+/**
+ * 杩愮淮鐩樼偣淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwStocktakingService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwStocktaking ywStocktaking);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id, LoginUserInfo loginUserInfo);
+
+    void cancelById(Integer id, LoginUserInfo loginUserInfo);
+
+    void beginById(Integer id, LoginUserInfo loginUserInfo);
+
+    void finishById(Integer id, LoginUserInfo loginUserInfo);
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     */
+    void delete(YwStocktaking ywStocktaking);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     */
+    void updateById(YwStocktaking ywStocktaking);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywStocktakings 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwStocktaking> ywStocktakings);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwStocktaking
+     */
+    YwStocktaking findById(Integer id);
+
+    YwStocktaking getDetail(Integer id);
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     * @return YwStocktaking
+     */
+    YwStocktaking findOne(YwStocktaking ywStocktaking);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     * @return List<YwStocktaking>
+     */
+    List<YwStocktaking> findList(YwStocktaking ywStocktaking);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwStocktaking>
+     */
+    PageData<YwStocktaking> findPage(PageWrap<YwStocktaking> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywStocktaking 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwStocktaking ywStocktaking);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWarehouseService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWarehouseService.java
new file mode 100644
index 0000000..08f453e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWarehouseService.java
@@ -0,0 +1,98 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwWarehouse;
+import java.util.List;
+
+/**
+ * 杩愮淮浠撳簱淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+public interface YwWarehouseService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwWarehouse ywWarehouse);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id, LoginUserInfo loginUserInfo);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     */
+    void delete(YwWarehouse ywWarehouse);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     */
+    void updateById(YwWarehouse ywWarehouse);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywWarehouses 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwWarehouse> ywWarehouses);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwWarehouse
+     */
+    YwWarehouse findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     * @return YwWarehouse
+     */
+    YwWarehouse findOne(YwWarehouse ywWarehouse);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     * @return List<YwWarehouse>
+     */
+    List<YwWarehouse> findList(YwWarehouse ywWarehouse);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwWarehouse>
+     */
+    PageData<YwWarehouse> findPage(PageWrap<YwWarehouse> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywWarehouse 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwWarehouse ywWarehouse);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java
new file mode 100644
index 0000000..90dde7f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java
@@ -0,0 +1,237 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.LoginUserModel;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwMaterialMapper;
+import com.doumee.dao.business.YwOutinboundMapper;
+import com.doumee.dao.business.YwOutinboundRecordMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.MultifileMapper;
+import com.doumee.dao.system.model.Multifile;
+import com.doumee.service.business.YwMaterialService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang.StringUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮璧勪骇淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwMaterialServiceImpl implements YwMaterialService {
+
+    @Autowired
+    private YwMaterialMapper ywMaterialMapper;
+
+    @Autowired
+    private MultifileMapper multifileMapper;
+
+    @Autowired
+    private YwOutinboundRecordMapper ywOutinboundRecordMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public Integer create(YwMaterial ywMaterial) {
+        //TODO rk 鎵�灞為」鐩�/鎴块棿闇�姹傞棶棰�
+        if(Objects.isNull(ywMaterial)
+            || StringUtils.isBlank(ywMaterial.getName())
+                || StringUtils.isBlank(ywMaterial.getCode())
+                || StringUtils.isBlank(ywMaterial.getQrcode())
+                || Objects.isNull(ywMaterial.getCateId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        ywMaterial.setId(null);
+        if(StringUtils.isBlank(ywMaterial.getCode())){
+            //鑷姩鐢熸垚 TODO 瀛樺湪闂
+            Long countCode = ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getAutoCode, Constants.ONE));
+            String nextCode = StringUtils.leftPad(Long.toString(countCode + 1),4,"0");
+            ywMaterial.setCode("P"+nextCode);
+            ywMaterial.setAutoCode(Constants.ONE);
+        }else{
+            //楠岃瘉code鏄惁瀛樺湪
+            if(ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getCode, ywMaterial.getCode()))>0){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠缂栫爜宸插瓨鍦�");
+            };
+            ywMaterial.setAutoCode(Constants.ZERO);
+        }
+        LoginUserInfo loginUserInfo = ywMaterial.getLoginUserInfo();
+        ywMaterial.setCreator(loginUserInfo.getId());
+        ywMaterial.setCreateDate(new Date());
+        ywMaterial.setIsdeleted(Constants.ZERO);
+        ywMaterial.setStatus(Constants.ZERO);
+        ywMaterialMapper.insert(ywMaterial);
+
+        if(Objects.nonNull(ywMaterial.getMultifile())){
+            if(org.apache.commons.lang3.StringUtils.isBlank(ywMaterial.getMultifile().getFileurl())
+                    || org.apache.commons.lang3.StringUtils.isBlank(ywMaterial.getMultifile().getName())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"闄勪欢淇℃伅閿欒");
+            }
+            ywMaterial.getMultifile().setCreator(loginUserInfo.getId());
+            ywMaterial.getMultifile().setCreateDate(new Date());
+            ywMaterial.getMultifile().setIsdeleted(Constants.ZERO);
+            ywMaterial.getMultifile().setObjType(Constants.MultiFile.MATERIAL_FILE.getKey());
+            ywMaterial.getMultifile().setObjId(ywMaterial.getId());
+            multifileMapper.insert(ywMaterial.getMultifile());
+        }
+        return ywMaterial.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        if(ywOutinboundRecordMapper.selectCount(new QueryWrapper<YwOutinboundRecord>().lambda().eq(YwOutinboundRecord::getMaterialId,id))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璧勪骇宸叉湁鍑哄叆搴撹褰曪紝涓嶅彲鍒犻櫎");
+        }
+        ywMaterialMapper.update(new UpdateWrapper<YwMaterial>().lambda().set(YwMaterial::getIsdeleted,Constants.ONE).eq(YwMaterial::getId,id));
+    }
+
+    @Override
+    public void delete(YwMaterial ywMaterial) {
+        UpdateWrapper<YwMaterial> deleteWrapper = new UpdateWrapper<>(ywMaterial);
+        ywMaterialMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywMaterialMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void updateById(YwMaterial ywMaterial) {
+        //TODO rk 鎵�灞為」鐩�/鎴块棿闇�姹傞棶棰�
+        if(Objects.isNull(ywMaterial)
+                || StringUtils.isBlank(ywMaterial.getName())
+                || StringUtils.isBlank(ywMaterial.getCode())
+                || StringUtils.isBlank(ywMaterial.getQrcode())
+                || Objects.isNull(ywMaterial.getCateId())
+                || Objects.isNull(ywMaterial.getId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        ywMaterial.setCode(null);
+        LoginUserInfo loginUserInfo = ywMaterial.getLoginUserInfo();
+        ywMaterial.setEditor(loginUserInfo.getId());
+        ywMaterial.setEditDate(new Date());
+        ywMaterialMapper.updateById(ywMaterial);
+        multifileMapper.delete(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjType,Constants.MultiFile.MATERIAL_FILE.getKey()).eq(Multifile::getObjId,ywMaterial.getId()));
+        if(Objects.nonNull(ywMaterial.getMultifile())){
+            if(org.apache.commons.lang3.StringUtils.isBlank(ywMaterial.getMultifile().getFileurl())
+                    || org.apache.commons.lang3.StringUtils.isBlank(ywMaterial.getMultifile().getName())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"闄勪欢淇℃伅閿欒");
+            }
+            ywMaterial.getMultifile().setCreator(loginUserInfo.getId());
+            ywMaterial.getMultifile().setCreateDate(new Date());
+            ywMaterial.getMultifile().setIsdeleted(Constants.ZERO);
+            ywMaterial.getMultifile().setObjType(Constants.MultiFile.MATERIAL_FILE.getKey());
+            ywMaterial.getMultifile().setObjId(ywMaterial.getId());
+            multifileMapper.insert(ywMaterial.getMultifile());
+        }
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwMaterial> ywMaterials) {
+        if (CollectionUtils.isEmpty(ywMaterials)) {
+            return;
+        }
+        for (YwMaterial ywMaterial: ywMaterials) {
+            this.updateById(ywMaterial);
+        }
+    }
+
+    @Override
+    public void updateStatus(YwMaterial ywMaterials) {
+       if(Objects.isNull(ywMaterials)
+           || Objects.isNull(ywMaterials.getId())
+           || Objects.isNull(ywMaterials.getStatus())){
+           throw new BusinessException(ResponseStatus.BAD_REQUEST);
+       }
+        ywMaterialMapper.update(new UpdateWrapper<YwMaterial>().lambda().eq(YwMaterial::getId,ywMaterials.getId()).set(YwMaterial::getStatus,ywMaterials.getStatus()));
+    }
+
+    @Override
+    public YwMaterial findById(Integer id) {
+        return ywMaterialMapper.selectById(id);
+    }
+
+    @Override
+    public YwMaterial getDetail(Integer id) {
+        YwMaterial ywMaterial = ywMaterialMapper.selectById(id);
+        if(Objects.isNull(ywMaterial)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        Multifile multifile = multifileMapper.selectOne(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,id).eq(Multifile::getObjType,Constants.MultiFile.MATERIAL_FILE.getKey()));
+        if(Objects.nonNull(multifile)){
+            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_CONTRACT_BILL).getCode();
+            multifile.setFileurlFull(path + multifile.getFileurl());
+            ywMaterial.setMultifile(multifile);
+        }
+        return ywMaterial;
+    }
+
+    @Override
+    public YwMaterial findOne(YwMaterial ywMaterial) {
+        QueryWrapper<YwMaterial> wrapper = new QueryWrapper<>(ywMaterial);
+        return ywMaterialMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwMaterial> findList(YwMaterial ywMaterial) {
+        QueryWrapper<YwMaterial> wrapper = new QueryWrapper<>(ywMaterial);
+        return ywMaterialMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwMaterial> findPage(PageWrap<YwMaterial> pageWrap) {
+        IPage<YwMaterial> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwMaterial> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwMaterial model = pageWrap.getModel();
+        queryWrapper.selectAll(YwMaterial.class)
+                .leftJoin(YwRoom.class,YwRoom::getId,YwMaterial::getRoomId)
+                .and(StringUtils.isNotBlank(model.getCode()),i->i.like(YwMaterial::getCode,model.getCode()).or().like(YwMaterial::getName,model.getCode()))
+                .like(StringUtils.isNotBlank(model.getAttr()),YwMaterial::getAttr,model.getAttr())
+                .eq(Objects.nonNull(model.getProjectId()),YwRoom::getProjectId,model.getProjectId())
+                .eq(Objects.nonNull(model.getRoomId()),YwMaterial::getRoomId,model.getRoomId())
+                .eq(YwMaterial::getIsdeleted,Constants.ZERO)
+                .orderByAsc(YwMaterial::getCode)
+        ;
+
+        IPage iPage = ywMaterialMapper.selectJoinPage(page,YwMaterial.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+    @Override
+    public long count(YwMaterial ywMaterial) {
+        QueryWrapper<YwMaterial> wrapper = new QueryWrapper<>(ywMaterial);
+        return ywMaterialMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundRecordServiceImpl.java
new file mode 100644
index 0000000..b839bc7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundRecordServiceImpl.java
@@ -0,0 +1,140 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwOutinboundRecordMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.YwOutinboundRecordService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭槑缁嗚〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 14:28
+ */
+@Service
+public class YwOutinboundRecordServiceImpl implements YwOutinboundRecordService {
+
+    @Autowired
+    private YwOutinboundRecordMapper ywOutinboundRecordMapper;
+
+    @Override
+    public Integer create(YwOutinboundRecord ywOutinboundRecord) {
+        ywOutinboundRecordMapper.insert(ywOutinboundRecord);
+        return ywOutinboundRecord.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywOutinboundRecordMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwOutinboundRecord ywOutinboundRecord) {
+        UpdateWrapper<YwOutinboundRecord> deleteWrapper = new UpdateWrapper<>(ywOutinboundRecord);
+        ywOutinboundRecordMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywOutinboundRecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwOutinboundRecord ywOutinboundRecord) {
+        ywOutinboundRecordMapper.updateById(ywOutinboundRecord);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwOutinboundRecord> ywOutinboundRecords) {
+        if (CollectionUtils.isEmpty(ywOutinboundRecords)) {
+            return;
+        }
+        for (YwOutinboundRecord ywOutinboundRecord: ywOutinboundRecords) {
+            this.updateById(ywOutinboundRecord);
+        }
+    }
+
+    @Override
+    public YwOutinboundRecord findById(Integer id) {
+        return ywOutinboundRecordMapper.selectById(id);
+    }
+
+    @Override
+    public YwOutinboundRecord findOne(YwOutinboundRecord ywOutinboundRecord) {
+        QueryWrapper<YwOutinboundRecord> wrapper = new QueryWrapper<>(ywOutinboundRecord);
+        return ywOutinboundRecordMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwOutinboundRecord> findList(YwOutinboundRecord ywOutinboundRecord) {
+        QueryWrapper<YwOutinboundRecord> wrapper = new QueryWrapper<>(ywOutinboundRecord);
+        return ywOutinboundRecordMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwOutinboundRecord> findPage(PageWrap<YwOutinboundRecord> pageWrap) {
+        IPage<YwOutinboundRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwOutinboundRecord> queryWrapper = new MPJLambdaWrapper<YwOutinboundRecord>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwOutinboundRecord model = pageWrap.getModel();
+        if(Objects.isNull(model)||Objects.isNull(model.getInOut())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<Integer> typeList  = Constants.ywOutInType.getAllTypeKey(model.getInOut());
+        queryWrapper.selectAll(YwOutinboundRecord.class)
+                .selectAs(SystemUser::getRealname,YwOutinboundRecord::getCreateUserName)
+                .selectAs(YwOutinbound::getCode,YwOutinboundRecord::getCode)
+                .selectAs(YwWarehouse::getName,YwOutinboundRecord::getWarehouseName)
+                .selectAs(YwMaterial::getCode,YwOutinboundRecord::getMaterialCode)
+                .selectAs(YwMaterial::getName,YwOutinboundRecord::getMaterialName)
+                .selectAs(YwMaterial::getQrcode,YwOutinboundRecord::getMaterialQrcode)
+                .selectAs(YwMaterial::getBrand,YwOutinboundRecord::getMaterialBrand)
+                .selectAs(YwMaterial::getUnitName,YwOutinboundRecord::getMaterialUnitName)
+                .select(" c.name ",YwOutinboundRecord::getCategoryParentName)
+                .select(" c1.name ",YwOutinboundRecord::getCategoryName)
+                .leftJoin(YwOutinbound.class,YwOutinbound::getId,YwOutinboundRecord::getOutInBoundId)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwOutinbound::getCreator)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwOutinbound::getWarehouseId)
+                .leftJoin(YwMaterial.class,YwMaterial::getId,YwOutinboundRecord::getMaterialId)
+                .leftJoin("category c on t4.PARENT_CATE_ID = c.id")
+                .leftJoin("category c1 on t4.CATE_ID = c1.id")
+                .like(StringUtils.isNotBlank(model.getCode()),YwOutinbound::getCode,model.getCode())
+                .like(StringUtils.isNotBlank(model.getMaterialCode()),YwMaterial::getCode,model.getMaterialCode())
+                .eq(Objects.nonNull(model.getWarehouseId()),YwOutinbound::getWarehouseId,model.getWarehouseId())
+                .in(Objects.nonNull(model.getInOut()),YwOutinbound::getType,typeList)
+                .ge(StringUtils.isNotBlank(model.getDoneDateStart()),YwOutinbound::getDoneDate,model.getDoneDateStart()+" 00:00:00")
+                .le(StringUtils.isNotBlank(model.getDoneDateEnd()),YwOutinbound::getDoneDate,model.getDoneDateEnd()+" 23:59:59")
+                .ge(StringUtils.isNotBlank(model.getCreateDateStart()),YwOutinbound::getCreateDate,model.getCreateDateStart()+" 00:00:00")
+                .le(StringUtils.isNotBlank(model.getCreateDateEnd()),YwOutinbound::getCreateDate,model.getCreateDateEnd()+" 23:59:59")
+                .orderByDesc(YwOutinbound::getCreateDate)
+        ;
+        IPage iPage = ywOutinboundRecordMapper.selectJoinPage(page,YwOutinboundRecord.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+    @Override
+    public long count(YwOutinboundRecord ywOutinboundRecord) {
+        QueryWrapper<YwOutinboundRecord> wrapper = new QueryWrapper<>(ywOutinboundRecord);
+        return ywOutinboundRecordMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java
new file mode 100644
index 0000000..21d53b2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java
@@ -0,0 +1,391 @@
+package com.doumee.service.business.impl;
+
+import com.alibaba.druid.sql.visitor.functions.Concat;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.redis.RedisUtil;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.YwOutinboundService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 杩愮淮鍑哄叆搴撲俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwOutinboundServiceImpl implements YwOutinboundService {
+
+    @Autowired
+    private YwOutinboundMapper ywOutinboundMapper;
+
+    @Autowired
+    private YwMaterialMapper ywMaterialMapper;
+
+    @Autowired
+    private YwOutinboundRecordMapper ywOutinboundRecordMapper;
+
+    @Autowired
+    private YwStockMapper ywStockMapper;
+
+    @Autowired
+    private YwWarehouseMapper ywWarehouseMapper;
+
+    @Autowired
+    private YwStocktakingMapper ywStocktakingMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public Integer create(YwOutinbound ywOutinbound) {
+        List<YwOutinboundRecord> recordList = this.verifyData(ywOutinbound);
+        YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(ywOutinbound.getWarehouseId());
+        if(Objects.isNull(ywWarehouse)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌浠撳簱淇℃伅");
+        }
+        LoginUserInfo loginUserInfo = ywOutinbound.getLoginUserInfo();
+        //鏍规嵁鎿嶄綔绫诲瀷杩涜鍒ゆ柇鏄叆搴�/鍑哄簱
+        Constants.ywOutInType ywOutInType = Constants.ywOutInType.getYwOutInType(ywOutinbound.getType());
+        if(Objects.isNull(ywOutInType)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈尮閰嶅埌鍑哄叆搴撶被鍨�");
+        }
+        //鐢熸垚鍑哄叆搴撳崟鎹紪鍙�
+        ywOutinbound.setCode(getNextInOutCode(ywOutInType.getInOut()));
+        ywOutinbound.setCreator(loginUserInfo.getId());
+        ywOutinbound.setCreateDate(new Date());
+        ywOutinbound.setOrigin(Constants.ZERO);
+        ywOutinboundMapper.insert(ywOutinbound);
+        for (YwOutinboundRecord ywOutinboundRecord:recordList) {
+            ywOutinboundRecord.setCreator(loginUserInfo.getId());
+            ywOutinboundRecord.setCreateDate(new Date());
+            ywOutinboundRecord.setIsdeleted(Constants.ZERO);
+        }
+        ywOutinboundRecordMapper.insert(recordList);
+        //鏇存柊搴撳瓨淇℃伅
+        this.dealStockData(ywOutinbound,recordList,ywOutInType.getInOut());
+        return ywOutinbound.getId();
+    }
+
+
+    public List<YwOutinboundRecord> verifyData(YwOutinbound ywOutinbound){
+        if(Objects.isNull(ywOutinbound)
+                || Objects.isNull(ywOutinbound.getType())
+                || (Objects.nonNull(ywOutinbound.getType()) && (!(ywOutinbound.getType() == Constants.ZERO || ywOutinbound.getType() == Constants.ONE)))
+                || Objects.isNull(ywOutinbound.getWarehouseId())
+                || Objects.isNull(ywOutinbound.getDoneDate())
+                || com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywOutinbound.getRecordList())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<YwOutinboundRecord> recordList = ywOutinbound.getRecordList();
+        for (YwOutinboundRecord ywOutinboundRecord:recordList) {
+            if(Objects.isNull(ywOutinboundRecord)
+                    ||Objects.isNull(ywOutinboundRecord.getMaterialId())
+                    ||Objects.isNull(ywOutinboundRecord.getStock())
+                    ||ywOutinboundRecord.getStock().compareTo(BigDecimal.ZERO)<=Constants.ZERO
+            ){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+        }
+        //鍒ゆ柇褰撳墠鏄惁瀛樺湪杩涜涓殑鐩樼偣鍗�
+        if(ywStocktakingMapper.selectCount(new QueryWrapper<YwStocktaking>().lambda().eq(YwStocktaking::getIsdeleted,Constants.ZERO)
+                        .eq(YwStocktaking::getWarehouseId,ywOutinbound.getWarehouseId())
+                .eq(YwStocktaking::getStatus,Constants.ONE))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀛樺湪杩涜涓殑鐩樼偣鍗曪紝鏃犳硶杩涜鍑哄叆搴撴搷浣�");
+        };
+        //鍒ゆ柇鏄惁瀛樺湪鐩稿悓鏁版嵁
+        Set<Integer> materialIds = new HashSet<Integer>(recordList.stream().map(i->i.getMaterialId()).collect(Collectors.toList()));
+        if(materialIds.size() != recordList.size()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀛樺湪鐩稿悓璧勪骇淇℃伅锛岃妫�鏌ユ暟鎹紒");
+        }
+        if(ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().in(YwMaterial::getId,materialIds))!=recordList.size()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璧勪骇淇℃伅瀛樺湪寮傚父锛岃妫�鏌ユ暟鎹紒");
+        }
+        return recordList;
+    }
+
+    public void dealStockData(YwOutinbound ywOutinbound,List<YwOutinboundRecord> recordList,Integer inOut){
+        for (YwOutinboundRecord ywOutinboundRecord:recordList) {
+            YwStock ywStock = ywStockMapper.selectOne(new QueryWrapper<YwStock>().lambda().eq(YwStock::getIsdeleted,Constants.ZERO).eq(YwStock::getWarehouseId,ywOutinbound.getWarehouseId()).eq(YwStock::getMaterialId,ywOutinboundRecord.getMaterialId()));
+            if(Constants.equalsInteger(inOut,Constants.ZERO)){
+                //鍏ュ簱
+                if(Objects.isNull(ywStock)){
+                    ywStock.setStock(ywOutinboundRecord.getStock());
+                    ywStock.setWarehouseId(ywOutinbound.getWarehouseId());
+                    ywStock.setMaterialId(ywOutinboundRecord.getMaterialId());
+                    ywStock.setCreateDate(new Date());
+                    ywStock.setCreator(ywOutinbound.getCreator());
+                    ywStockMapper.insert(ywStock);
+                }else{
+                    ywStockMapper.update(new UpdateWrapper<YwStock>().lambda()
+                            .set(YwStock::getStock," ( stock + " + ywStock.getStock() + " )")
+                            .set(YwStock::getEditDate, DateUtil.getCurrDateTime())
+                            .set(YwStock::getEditor, ywOutinbound.getCreator())
+                            .eq(YwStock::getId,ywStock.getId())
+                    );
+                }
+            }else{
+                YwMaterial ywMaterial = ywMaterialMapper.selectById(ywOutinboundRecord.getMaterialId());
+                //鍑哄簱
+                if(Objects.isNull(ywStock) || ywStock.getStock().compareTo(ywOutinboundRecord.getStock()) < Constants.ZERO){
+                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), ywMaterial.getName() + "搴撳瓨涓嶈冻锛岃鍒锋柊閲嶈瘯");
+                }else if(ywStock.getStock().compareTo(ywOutinboundRecord.getStock()) == Constants.ZERO){
+                    ywStockMapper.deleteById(ywStock.getId());
+                }else{
+                    ywStockMapper.update(new UpdateWrapper<YwStock>().lambda()
+                            .set(YwStock::getStock," ( stock  - " + ywStock.getStock() + " )")
+                            .set(YwStock::getEditDate, DateUtil.getCurrDateTime())
+                            .set(YwStock::getEditor, ywOutinbound.getCreator())
+                            .eq(YwStock::getId,ywStock.getId())
+                    );
+                }
+            }
+        }
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywOutinboundMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwOutinbound ywOutinbound) {
+        UpdateWrapper<YwOutinbound> deleteWrapper = new UpdateWrapper<>(ywOutinbound);
+        ywOutinboundMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywOutinboundMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwOutinbound ywOutinbound) {
+        ywOutinboundMapper.updateById(ywOutinbound);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwOutinbound> ywOutinbounds) {
+        if (CollectionUtils.isEmpty(ywOutinbounds)) {
+            return;
+        }
+        for (YwOutinbound ywOutinbound: ywOutinbounds) {
+            this.updateById(ywOutinbound);
+        }
+    }
+
+    @Override
+    public YwOutinbound findById(Integer id) {
+        return ywOutinboundMapper.selectById(id);
+    }
+
+    @Override
+    public YwOutinbound findOne(YwOutinbound ywOutinbound) {
+        QueryWrapper<YwOutinbound> wrapper = new QueryWrapper<>(ywOutinbound);
+        return ywOutinboundMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwOutinbound> findList(YwOutinbound ywOutinbound) {
+        QueryWrapper<YwOutinbound> wrapper = new QueryWrapper<>(ywOutinbound);
+        return ywOutinboundMapper.selectList(wrapper);
+    }
+
+    @Override
+    public YwOutinbound getDetail(Integer id) {
+        MPJLambdaWrapper<YwOutinbound> queryWrapper = new MPJLambdaWrapper<YwOutinbound>();
+        queryWrapper.selectAll(YwOutinbound.class)
+                .selectAs(SystemUser::getRealname,YwOutinbound::getCreateUserName)
+                .selectAs(YwWarehouse::getName,YwOutinbound::getWarehouseName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwOutinbound::getCreator)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwOutinbound::getWarehouseId)
+                .eq(YwOutinbound::getId,id)
+                .last(" limit 1");
+        YwOutinbound ywOutinbound = ywOutinboundMapper.selectJoinOne(YwOutinbound.class,queryWrapper);
+        List<Integer> idList = new ArrayList<>();
+        idList.add(id);
+        ywOutinbound.setRecordList(this.getRecordDetailData(idList));
+        return ywOutinbound;
+    }
+
+
+    @Override
+    public PageData<YwOutinbound> findPage(PageWrap<YwOutinbound> pageWrap) {
+        IPage<YwOutinbound> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwOutinbound> queryWrapper = new MPJLambdaWrapper<YwOutinbound>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwOutinbound model = pageWrap.getModel();
+        if(Objects.isNull(model)||Objects.isNull(model.getInOut())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<Integer> typeList  = Constants.ywOutInType.getAllTypeKey(model.getInOut());
+        queryWrapper.selectAll(YwOutinbound.class)
+                .selectAs(SystemUser::getRealname,YwOutinbound::getCreateUserName)
+                .selectAs(YwWarehouse::getName,YwOutinbound::getWarehouseName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwOutinbound::getCreator)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwOutinbound::getWarehouseId)
+                .like(StringUtils.isNotBlank(model.getCode()),YwOutinbound::getCode,model.getCode())
+                .eq(Objects.nonNull(model.getType()),YwOutinbound::getType,model.getType())
+                .eq(Objects.nonNull(model.getWarehouseId()),YwOutinbound::getWarehouseId,model.getWarehouseId())
+                .in(Objects.nonNull(model.getInOut()),YwOutinbound::getType,typeList)
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        IPage iPage = ywOutinboundMapper.selectJoinPage(page,YwOutinbound.class,queryWrapper);
+        if(Objects.nonNull(iPage.getRecords())){
+            iPage.setRecords(this.getDetailData(iPage.getRecords()));
+        }
+        return PageData.from(iPage);
+    }
+
+    public List<YwOutinbound> getDetailData(List<YwOutinbound> ywOutinboundList){
+        List<Integer> idList = ywOutinboundList.stream().map(i->i.getId()).collect(Collectors.toList());
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(idList)){
+           List<YwOutinboundRecord> ywOutinboundRecordList =  this.getRecordDetailData(idList);
+           if(CollectionUtils.isEmpty(ywOutinboundRecordList)){
+               return ywOutinboundList;
+           }
+           for (YwOutinbound ywOutinbound:ywOutinboundList) {
+                ywOutinbound.setRecordList(
+                        ywOutinboundRecordList.stream().filter(i->Constants.equalsInteger(i.getOutInBoundId(),ywOutinbound.getId())).collect(Collectors.toList())
+                );
+            }
+        }
+        return ywOutinboundList;
+    }
+
+
+    public List<YwOutinboundRecord> getRecordDetailData(List<Integer> outinBoundIdList){
+        List<YwOutinboundRecord> ywOutinboundRecordList =  ywOutinboundRecordMapper.selectJoinList(YwOutinboundRecord.class,
+                new MPJLambdaWrapper<YwOutinboundRecord>()
+                        .selectAll(YwOutinboundRecord.class)
+                        .selectAs(YwMaterial::getCode,YwOutinboundRecord::getMaterialCode)
+                        .selectAs(YwMaterial::getName,YwOutinboundRecord::getMaterialName)
+                        .selectAs(YwMaterial::getQrcode,YwOutinboundRecord::getMaterialQrcode)
+                        .selectAs(YwMaterial::getBrand,YwOutinboundRecord::getMaterialBrand)
+                        .selectAs(YwMaterial::getUnitName,YwOutinboundRecord::getMaterialUnitName)
+                        .leftJoin(YwMaterial.class,YwMaterial::getId,YwOutinboundRecord::getMaterialId)
+                        .eq(YwOutinboundRecord::getIsdeleted,Constants.ZERO)
+                        .in(YwOutinboundRecord::getOutInBoundId,outinBoundIdList)
+        );
+        return ywOutinboundRecordList;
+    }
+
+
+//    @Override
+//    public PageData<YwOutinbound> findPage(PageWrap<YwOutinbound> pageWrap) {
+//        IPage<YwOutinbound> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+//
+//        QueryWrapper<YwOutinbound> queryWrapper = new QueryWrapper<>();
+//        Utils.MP.blankToNull(pageWrap.getModel());
+//        if (pageWrap.getModel().getId() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getId, pageWrap.getModel().getId());
+//        }
+//        if (pageWrap.getModel().getCreator() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getCreator, pageWrap.getModel().getCreator());
+//        }
+//        if (pageWrap.getModel().getCreateDate() != null) {
+//            queryWrapper.lambda().ge(YwOutinbound::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+//            queryWrapper.lambda().le(YwOutinbound::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+//        }
+//        if (pageWrap.getModel().getEditor() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getEditor, pageWrap.getModel().getEditor());
+//        }
+//        if (pageWrap.getModel().getEditDate() != null) {
+//            queryWrapper.lambda().ge(YwOutinbound::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+//            queryWrapper.lambda().le(YwOutinbound::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+//        }
+//        if (pageWrap.getModel().getIsdeleted() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getIsdeleted, pageWrap.getModel().getIsdeleted());
+//        }
+//        if (pageWrap.getModel().getRemark() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getRemark, pageWrap.getModel().getRemark());
+//        }
+//        if (pageWrap.getModel().getWarehouseId() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getWarehouseId, pageWrap.getModel().getWarehouseId());
+//        }
+//        if (pageWrap.getModel().getMaterialId() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getMaterialId, pageWrap.getModel().getMaterialId());
+//        }
+//        if (pageWrap.getModel().getStock() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getStock, pageWrap.getModel().getStock());
+//        }
+//        if (pageWrap.getModel().getType() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getType, pageWrap.getModel().getType());
+//        }
+//        if (pageWrap.getModel().getOrigin() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getOrigin, pageWrap.getModel().getOrigin());
+//        }
+//        if (pageWrap.getModel().getContent() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getContent, pageWrap.getModel().getContent());
+//        }
+//        if (pageWrap.getModel().getDoneDate() != null) {
+//            queryWrapper.lambda().ge(YwOutinbound::getDoneDate, Utils.Date.getStart(pageWrap.getModel().getDoneDate()));
+//            queryWrapper.lambda().le(YwOutinbound::getDoneDate, Utils.Date.getEnd(pageWrap.getModel().getDoneDate()));
+//        }
+//        if (pageWrap.getModel().getStatus() != null) {
+//            queryWrapper.lambda().eq(YwOutinbound::getStatus, pageWrap.getModel().getStatus());
+//        }
+//        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+//            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+//                queryWrapper.orderByDesc(sortData.getProperty());
+//            } else {
+//                queryWrapper.orderByAsc(sortData.getProperty());
+//            }
+//        }
+//        return PageData.from(ywOutinboundMapper.selectPage(page, queryWrapper));
+//    }
+
+    @Override
+    public long count(YwOutinbound ywOutinbound) {
+        QueryWrapper<YwOutinbound> wrapper = new QueryWrapper<>(ywOutinbound);
+        return ywOutinboundMapper.selectCount(wrapper);
+    }
+
+
+    public synchronized String  getNextInOutCode(Integer inOut){
+        String prefix =  Constants.equalsInteger(inOut,0)?"RK-":"CK-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-";
+        Integer countNum  = RedisUtil.getObject(redisTemplate,
+                Constants.equalsInteger(inOut,0)?Constants.RedisKeys.COM_OUTBOUND_OUT_KEY:Constants.RedisKeys.COM_OUTBOUND_IN_KEY,
+                Integer.class);
+        countNum = Constants.formatIntegerNum(countNum)+1;
+        //鏇存柊缂撳瓨
+        RedisUtil.addObject(redisTemplate,Constants.equalsInteger(inOut,0)?Constants.RedisKeys.COM_OUTBOUND_OUT_KEY:Constants.RedisKeys.COM_OUTBOUND_IN_KEY,countNum);
+        String nextIndex =Integer.toString( countNum );
+        return prefix + StringUtils.leftPad(nextIndex,4,"0");
+    }
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
new file mode 100644
index 0000000..5ee8050
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
@@ -0,0 +1,212 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwProblemMapper;
+import com.doumee.dao.business.model.YwProblem;
+import com.doumee.dao.system.MultifileMapper;
+import com.doumee.dao.system.model.Multifile;
+import com.doumee.service.business.YwProblemService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮闂涓婃姤淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwProblemServiceImpl implements YwProblemService {
+
+    @Autowired
+    private YwProblemMapper ywProblemMapper;
+
+    @Autowired
+    private MultifileMapper multifileMapper;
+
+    @Override
+    public Integer create(YwProblem ywProblem) {
+        if(Objects.isNull(ywProblem)
+            || Objects.isNull(ywProblem.getSubmitDate())
+            || StringUtils.isBlank(ywProblem.getContent())
+            || StringUtils.isBlank(ywProblem.getPhone())
+            || StringUtils.isBlank(ywProblem.getName())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        ywProblem.setCreateDate(new Date());
+        ywProblem.setIsdeleted(Constants.ZERO);
+        ywProblem.setStatus(Constants.ZERO);
+        ywProblem.setDealStatus(Constants.ZERO);
+        ywProblemMapper.insert(ywProblem);
+
+        List<Multifile> fileList = new ArrayList<>();
+        if(ywProblem.getFileList()!=null && ywProblem.getFileList().size()>0){
+            for (int i = 0; i <  ywProblem.getFileList().size(); i++) {
+                Multifile multifile =  ywProblem.getFileList().get(i);
+                if(StringUtils.isBlank(multifile.getFileurl())){
+                    continue;
+                }
+                multifile.setCreateDate(ywProblem.getCreateDate());
+                multifile.setIsdeleted(Constants.ZERO);
+                multifile.setObjId(ywProblem.getId());
+                multifile.setObjType(Constants.MultiFile.PROBLEM_FILE.getKey());
+                multifile.setSortnum(i+1);
+                fileList.add(multifile);
+            }
+        }
+        if(fileList.size()>0){
+            multifileMapper.insert(fileList);
+        }
+
+        return ywProblem.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywProblemMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwProblem ywProblem) {
+        UpdateWrapper<YwProblem> deleteWrapper = new UpdateWrapper<>(ywProblem);
+        ywProblemMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywProblemMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwProblem ywProblem) {
+        ywProblemMapper.updateById(ywProblem);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwProblem> ywProblems) {
+        if (CollectionUtils.isEmpty(ywProblems)) {
+            return;
+        }
+        for (YwProblem ywProblem: ywProblems) {
+            this.updateById(ywProblem);
+        }
+    }
+
+    @Override
+    public YwProblem findById(Integer id) {
+        return ywProblemMapper.selectById(id);
+    }
+
+    @Override
+    public YwProblem findOne(YwProblem ywProblem) {
+        QueryWrapper<YwProblem> wrapper = new QueryWrapper<>(ywProblem);
+        return ywProblemMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwProblem> findList(YwProblem ywProblem) {
+        QueryWrapper<YwProblem> wrapper = new QueryWrapper<>(ywProblem);
+        return ywProblemMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwProblem> findPage(PageWrap<YwProblem> pageWrap) {
+        IPage<YwProblem> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwProblem> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwProblem::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwProblem::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwProblem::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwProblem::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwProblem::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwProblem::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwProblem::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwProblem::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getPosition() != null) {
+            queryWrapper.lambda().eq(YwProblem::getPosition, pageWrap.getModel().getPosition());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwProblem::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwProblem::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(YwProblem::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().eq(YwProblem::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getSubmitDate() != null) {
+            queryWrapper.lambda().ge(YwProblem::getSubmitDate, Utils.Date.getStart(pageWrap.getModel().getSubmitDate()));
+            queryWrapper.lambda().le(YwProblem::getSubmitDate, Utils.Date.getEnd(pageWrap.getModel().getSubmitDate()));
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwProblem::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getDealStatus() != null) {
+            queryWrapper.lambda().eq(YwProblem::getDealStatus, pageWrap.getModel().getDealStatus());
+        }
+        if (pageWrap.getModel().getDealUserId() != null) {
+            queryWrapper.lambda().eq(YwProblem::getDealUserId, pageWrap.getModel().getDealUserId());
+        }
+        if (pageWrap.getModel().getDealDate() != null) {
+            queryWrapper.lambda().ge(YwProblem::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
+            queryWrapper.lambda().le(YwProblem::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
+        }
+        if (pageWrap.getModel().getDealInfo() != null) {
+            queryWrapper.lambda().eq(YwProblem::getDealInfo, pageWrap.getModel().getDealInfo());
+        }
+        if (pageWrap.getModel().getDealType() != null) {
+            queryWrapper.lambda().eq(YwProblem::getDealType, pageWrap.getModel().getDealType());
+        }
+        if (pageWrap.getModel().getWorkorderId() != null) {
+            queryWrapper.lambda().eq(YwProblem::getWorkorderId, pageWrap.getModel().getWorkorderId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywProblemMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwProblem ywProblem) {
+        QueryWrapper<YwProblem> wrapper = new QueryWrapper<>(ywProblem);
+        return ywProblemMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStockServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStockServiceImpl.java
new file mode 100644
index 0000000..628057e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStockServiceImpl.java
@@ -0,0 +1,129 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwStockMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.YwStockService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮搴撳瓨淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwStockServiceImpl implements YwStockService {
+
+    @Autowired
+    private YwStockMapper ywStockMapper;
+
+    @Override
+    public Integer create(YwStock ywStock) {
+        ywStockMapper.insert(ywStock);
+        return ywStock.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywStockMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwStock ywStock) {
+        UpdateWrapper<YwStock> deleteWrapper = new UpdateWrapper<>(ywStock);
+        ywStockMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywStockMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwStock ywStock) {
+        ywStockMapper.updateById(ywStock);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwStock> ywStocks) {
+        if (CollectionUtils.isEmpty(ywStocks)) {
+            return;
+        }
+        for (YwStock ywStock: ywStocks) {
+            this.updateById(ywStock);
+        }
+    }
+
+    @Override
+    public YwStock findById(Integer id) {
+        return ywStockMapper.selectById(id);
+    }
+
+    @Override
+    public YwStock findOne(YwStock ywStock) {
+        QueryWrapper<YwStock> wrapper = new QueryWrapper<>(ywStock);
+        return ywStockMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwStock> findList(YwStock ywStock) {
+        QueryWrapper<YwStock> wrapper = new QueryWrapper<>(ywStock);
+        return ywStockMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwStock> findPage(PageWrap<YwStock> pageWrap) {
+        IPage<YwStock> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwStock> queryWrapper = new MPJLambdaWrapper<YwStock>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwStock model = pageWrap.getModel();
+        queryWrapper.selectAll(YwStock.class)
+                .selectAs(YwWarehouse::getName,YwStock::getWarehouseName)
+                .selectAs(YwMaterial::getCode,YwStock::getMaterialCode)
+                .selectAs(YwMaterial::getName,YwStock::getMaterialName)
+                .selectAs(YwMaterial::getQrcode,YwStock::getMaterialQrcode)
+                .selectAs(YwMaterial::getBrand,YwStock::getMaterialBrand)
+                .selectAs(YwMaterial::getUnitName,YwStock::getMaterialUnitName)
+                .selectAs(YwMaterial::getAttr,YwStock::getMaterialAttr)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStock::getWarehouseId)
+                .leftJoin(YwMaterial.class,YwMaterial::getId,YwStock::getMaterialId)
+                .eq(Objects.nonNull(model.getWarehouseId()),YwOutinbound::getWarehouseId,model.getWarehouseId())
+                .and(StringUtils.isNotBlank(model.getMaterialCode()),i->i.like(YwMaterial::getName,model.getMaterialCode()).or().like(YwMaterial::getName,model.getMaterialCode()))
+                .like(StringUtils.isNotBlank(model.getMaterialCode()),YwMaterial::getCode,model.getMaterialCode())
+                .like(StringUtils.isNotBlank(model.getMaterialAttr()),YwMaterial::getAttr,model.getMaterialAttr())
+                .orderByAsc(YwMaterial::getCode)
+        ;
+        IPage iPage = ywStockMapper.selectJoinPage(page,YwStock.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+
+
+
+
+
+
+
+    @Override
+    public long count(YwStock ywStock) {
+        QueryWrapper<YwStock> wrapper = new QueryWrapper<>(ywStock);
+        return ywStockMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java
new file mode 100644
index 0000000..a03a028
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java
@@ -0,0 +1,205 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwStocktakingMapper;
+import com.doumee.dao.business.YwStocktakingRecordMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.YwStocktakingRecordService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮鐩樼偣鏄庣粏璁板綍琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwStocktakingRecordServiceImpl implements YwStocktakingRecordService {
+
+    @Autowired
+    private YwStocktakingRecordMapper ywStocktakingRecordMapper;
+
+    @Autowired
+    private YwStocktakingMapper ywStocktakingMapper;
+
+
+    @Override
+    public Integer create(YwStocktakingRecord ywStocktakingRecord) {
+        ywStocktakingRecordMapper.insert(ywStocktakingRecord);
+        return ywStocktakingRecord.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywStocktakingRecordMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwStocktakingRecord ywStocktakingRecord) {
+        UpdateWrapper<YwStocktakingRecord> deleteWrapper = new UpdateWrapper<>(ywStocktakingRecord);
+        ywStocktakingRecordMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywStocktakingRecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwStocktakingRecord ywStocktakingRecord) {
+        ywStocktakingRecordMapper.updateById(ywStocktakingRecord);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwStocktakingRecord> ywStocktakingRecords) {
+        if (CollectionUtils.isEmpty(ywStocktakingRecords)) {
+            return;
+        }
+        for (YwStocktakingRecord ywStocktakingRecord: ywStocktakingRecords) {
+            this.updateById(ywStocktakingRecord);
+        }
+    }
+
+    @Override
+    public YwStocktakingRecord findById(Integer id) {
+        return ywStocktakingRecordMapper.selectById(id);
+    }
+
+
+    @Override
+    public YwStocktakingRecord getDetail(Integer id) {
+        MPJLambdaWrapper<YwStocktakingRecord> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(YwStocktakingRecord.class)
+                .selectAs(YwWarehouse::getName, YwStocktakingRecord::getWarehouseName)
+                .selectAs(YwMaterial::getCode,YwStocktakingRecord::getMaterialCode)
+                .selectAs(YwMaterial::getName,YwStocktakingRecord::getMaterialName)
+                .selectAs(YwMaterial::getQrcode,YwStocktakingRecord::getMaterialQrcode)
+                .selectAs(YwMaterial::getBrand,YwStocktakingRecord::getMaterialBrand)
+                .selectAs(YwMaterial::getUnitName,YwStocktakingRecord::getMaterialUnitName)
+                .selectAs(YwMaterial::getAttr,YwStocktakingRecord::getMaterialAttr)
+                .selectAs(Company::getName,YwStocktakingRecord::getCompanyName)
+                .selectAs(SystemUser::getRealname,YwStocktakingRecord::getUserName)
+                .leftJoin(YwStocktaking.class,YwStocktaking::getId,YwStocktakingRecord::getStocktakingId)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId)
+                .leftJoin(YwMaterial.class,YwMaterial::getId,YwStocktakingRecord::getMaterialId)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwStocktakingRecord::getUserId)
+                .leftJoin(Company.class,Company::getId,SystemUser::getCompanyId)
+                .eq(YwStocktakingRecord::getId,id)
+                .last(" limit 1 ");
+        ;
+        return ywStocktakingRecordMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    public YwStocktakingRecord findOne(YwStocktakingRecord ywStocktakingRecord) {
+        QueryWrapper<YwStocktakingRecord> wrapper = new QueryWrapper<>(ywStocktakingRecord);
+        return ywStocktakingRecordMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwStocktakingRecord> findList(YwStocktakingRecord ywStocktakingRecord) {
+        QueryWrapper<YwStocktakingRecord> wrapper = new QueryWrapper<>(ywStocktakingRecord);
+        return ywStocktakingRecordMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwStocktakingRecord> findPage(PageWrap<YwStocktakingRecord> pageWrap) {
+        IPage<YwStocktakingRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwStocktakingRecord> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwStocktakingRecord model = pageWrap.getModel() ;
+        queryWrapper.selectAll(YwStocktakingRecord.class)
+                .selectAs(YwWarehouse::getName, YwStocktakingRecord::getWarehouseName)
+                .selectAs(YwMaterial::getCode,YwStocktakingRecord::getMaterialCode)
+                .selectAs(YwMaterial::getName,YwStocktakingRecord::getMaterialName)
+                .selectAs(YwMaterial::getQrcode,YwStocktakingRecord::getMaterialQrcode)
+                .selectAs(YwMaterial::getBrand,YwStocktakingRecord::getMaterialBrand)
+                .selectAs(YwMaterial::getUnitName,YwStocktakingRecord::getMaterialUnitName)
+                .selectAs(YwMaterial::getAttr,YwStocktakingRecord::getMaterialAttr)
+                .leftJoin(YwStocktaking.class,YwStocktaking::getId,YwStocktakingRecord::getStocktakingId)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId)
+                .leftJoin(YwMaterial.class,YwMaterial::getId,YwStocktakingRecord::getMaterialId)
+                .eq(Objects.nonNull(model.getStocktakingId()),YwStocktakingRecord::getStocktakingId,model.getStocktakingId())
+                .and(StringUtils.isNotBlank(model.getMaterialCode()),i->i.like(YwMaterial::getCode,model.getMaterialCode()).or().like(YwMaterial::getName,model.getMaterialCode()))
+                .eq(Objects.nonNull(model.getType()),YwStocktakingRecord::getType,model.getType())
+                .eq(Objects.nonNull(model.getStatus()),YwStocktakingRecord::getStatus,model.getStatus());
+        IPage iPage = ywStocktakingRecordMapper.selectJoinPage(page, YwStocktakingRecord.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+    @Override
+    public long count(YwStocktakingRecord ywStocktakingRecord) {
+        QueryWrapper<YwStocktakingRecord> wrapper = new QueryWrapper<>(ywStocktakingRecord);
+        return ywStocktakingRecordMapper.selectCount(wrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void takingData(YwStocktakingRecord ywStocktakingRecord) {
+        if(Objects.isNull(ywStocktakingRecord)
+            || Objects.isNull(ywStocktakingRecord.getId())
+            || Objects.isNull(ywStocktakingRecord.getActStock())
+            || ywStocktakingRecord.getActStock().compareTo(BigDecimal.ZERO) < 0
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywStocktakingRecord.getLoginUserInfo();
+        YwStocktakingRecord model = ywStocktakingRecordMapper.selectById(ywStocktakingRecord.getId());
+        if(Objects.nonNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        YwStocktaking ywStocktaking = ywStocktakingMapper.selectById(ywStocktakingRecord.getStocktakingId());
+        if(Objects.isNull(ywStocktaking)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsInteger(loginUserInfo.getId(),ywStocktaking.getUserId())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勭洏鐐瑰崟鏃犳硶杩涜鎿嶄綔");
+        }
+        if(!Constants.equalsInteger(ywStocktaking.getStatus(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐩樼偣璁㈢姸鎬佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔");
+        }
+        if(ywStocktakingRecord.getActStock().compareTo(model.getStock())==Constants.ZERO){
+            ywStocktakingRecord.setType(Constants.ZERO);
+        }else if(ywStocktakingRecord.getActStock().compareTo(model.getStock())>Constants.ZERO){
+            ywStocktakingRecord.setType(Constants.TWO);
+        }else{
+            ywStocktakingRecord.setType(Constants.ONE);
+        }
+        ywStocktakingRecordMapper.update(new UpdateWrapper<YwStocktakingRecord>().lambda()
+                .set(YwStocktakingRecord::getStatus,Constants.ONE)
+                .set(YwStocktakingRecord::getType,ywStocktakingRecord.getType())
+                .set(YwStocktakingRecord::getActStock,ywStocktakingRecord.getActStock())
+                .set(YwStocktakingRecord::getUserId,loginUserInfo.getId())
+                .set(YwStocktakingRecord::getPlanDate, DateUtil.getCurrDateTime())
+                .eq(YwStocktakingRecord::getId,ywStocktakingRecord.getId())
+        );
+
+
+
+    }
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java
new file mode 100644
index 0000000..cd0e102
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java
@@ -0,0 +1,357 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.redis.RedisUtil;
+import com.doumee.dao.business.YwStockMapper;
+import com.doumee.dao.business.YwStocktakingMapper;
+import com.doumee.dao.business.YwStocktakingRecordMapper;
+import com.doumee.dao.business.YwWarehouseMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.service.business.YwStocktakingService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 杩愮淮鐩樼偣淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwStocktakingServiceImpl implements YwStocktakingService {
+
+    @Autowired
+    private YwStocktakingMapper ywStocktakingMapper;
+
+    @Autowired
+    private YwStockMapper ywStockMapper;
+
+
+    @Autowired
+    private YwStocktakingRecordMapper ywStocktakingRecordMapper;
+    
+    @Autowired
+    private YwWarehouseMapper ywWarehouseMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public Integer create(YwStocktaking ywStocktaking) {
+        if(Objects.isNull(ywStocktaking)
+                || StringUtils.isBlank(ywStocktaking.getName())
+                || Objects.isNull(ywStocktaking.getPlanDate())
+                || Objects.isNull(ywStocktaking.getWarehouseId())
+                || Objects.isNull(ywStocktaking.getUserId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(ywStocktaking.getWarehouseId());
+        if(Objects.isNull(ywWarehouse)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌浠撳簱鏁版嵁");
+        }
+        //鍒ゆ柇褰撳墠浠撳簱褰撳墠鏃ユ湡鏄惁瀛樺湪鐩樼偣鍗�
+        if(ywStocktakingMapper.selectCount(new QueryWrapper<YwStocktaking>().lambda().eq(YwStocktaking::getIsdeleted,Constants.ZERO).eq(YwStocktaking::getStatus,Constants.ZERO)
+                .eq(YwStocktaking::getWarehouseId,ywStocktaking.getWarehouseId()).apply(" DATE(PLAN_DATE) = '" + DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd") +"'" ))>0){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"["+DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd")+"]["+ywWarehouse.getName()+"]宸叉湁鐩樼偣鍗曪紝涓嶅彲閲嶅鍙戣捣鐩樼偣");
+        }
+        LoginUserInfo loginUserInfo = ywStocktaking.getLoginUserInfo();
+        ywStocktaking.setCreator(loginUserInfo.getId());
+        ywStocktaking.setCreateDate(new Date());
+        ywStocktaking.setIsdeleted(Constants.ZERO);
+        ywStocktaking.setStatus(Constants.ZERO);
+        ywStocktaking.setCode(getNextCode());
+        ywStocktakingMapper.insert(ywStocktaking);
+        return ywStocktaking.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void deleteById(Integer id, LoginUserInfo loginUserInfo) {
+        YwStocktaking model = ywStocktakingMapper.selectById(id);
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐩樼偣鍗曟暟鎹�");
+        }
+        if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)||Constants.equalsInteger(model.getStatus(),Constants.THREE)){
+            ywStocktakingMapper.update(new UpdateWrapper<YwStocktaking>().lambda()
+                    .set(YwStocktaking::getIsdeleted,Constants.ONE)
+                    .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime())
+                    .set(YwStocktaking::getEditor,loginUserInfo.getId())
+                    .eq(YwStocktaking::getId,id)
+            );
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐩樼偣鍗曠姸鎬佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void cancelById(Integer id, LoginUserInfo loginUserInfo) {
+        YwStocktaking model = ywStocktakingMapper.selectById(id);
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐩樼偣鍗曟暟鎹�");
+        }
+        if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)||Constants.equalsInteger(model.getStatus(),Constants.ONE)){
+            ywStocktakingMapper.update(new UpdateWrapper<YwStocktaking>().lambda()
+                    .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime())
+                    .set(YwStocktaking::getCancelDate,DateUtil.getCurrDateTime())
+                    .set(YwStocktaking::getCancelUserId,loginUserInfo.getId())
+                    .set(YwStocktaking::getEditor,loginUserInfo.getId())
+                    .set(YwStocktaking::getStatus,Constants.THREE).eq(YwStocktaking::getId,id));
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐩樼偣鍗曠姸鎬佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void beginById(Integer id, LoginUserInfo loginUserInfo) {
+        YwStocktaking model = ywStocktakingMapper.selectById(id);
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐩樼偣鍗曟暟鎹�");
+        }
+        if(model.getPlanDate().getTime()<System.currentTimeMillis()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈埌寮�濮嬫椂闂达紝鏃犳硶杩涜璇ユ搷浣�");
+        }
+        if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)&&Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO)){
+            ywStocktakingMapper.update(new UpdateWrapper<YwStocktaking>().lambda()
+                    .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime())
+                    .set(YwStocktaking::getDealDate,DateUtil.getCurrDateTime())
+                    .set(YwStocktaking::getDealUserId,loginUserInfo.getId())
+                    .set(YwStocktaking::getEditor,loginUserInfo.getId())
+                    .set(YwStocktaking::getStatus,Constants.ONE)
+                    .eq(YwStocktaking::getId,model.getId()));
+            //鐢熸垚褰撳墠浠撳簱涓嬫墍鏈夌殑璧勪骇淇℃伅
+            List<YwStock> stockList = ywStockMapper.selectList(new QueryWrapper<YwStock>().lambda().eq(YwStock::getIsdeleted,Constants.ZERO).eq(YwStock::getWarehouseId,model.getWarehouseId()));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(stockList)){
+                List<YwStocktakingRecord> ywStocktakingRecordList = new ArrayList<>();
+                for (YwStock ywStock:stockList) {
+                    YwStocktakingRecord ywStocktakingRecord = new YwStocktakingRecord();
+                    ywStocktakingRecord.setCreator(loginUserInfo.getId());
+                    ywStocktakingRecord.setCreateDate(new Date());
+                    ywStocktakingRecord.setIsdeleted(Constants.ZERO);
+                    ywStocktakingRecord.setStatus(Constants.ZERO);
+                    ywStocktakingRecord.setMaterialId(ywStock.getMaterialId());
+                    ywStocktakingRecord.setStock(ywStock.getStock());
+                    ywStocktakingRecord.setStocktakingId(model.getId());
+                    ywStocktakingRecordList.add(ywStocktakingRecord);
+                }
+                ywStocktakingRecordMapper.insert(ywStocktakingRecordList);
+            }
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐩樼偣鍗曠姸鎬佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔");
+        }
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void finishById(Integer id, LoginUserInfo loginUserInfo) {
+        YwStocktaking model = ywStocktakingMapper.selectById(id);
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐩樼偣鍗曟暟鎹�");
+        }
+        if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鐩樼偣鍗曠姸鎬佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔锛�");
+        }
+        if(!Constants.equalsInteger(loginUserInfo.getId(),model.getUserId())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勭洏鐐瑰崟鏃犳硶杩涜鎿嶄綔");
+        }
+        List<YwStocktakingRecord> recordList = ywStocktakingRecordMapper.selectList(new QueryWrapper<YwStocktakingRecord>().lambda()
+                .eq(YwStocktakingRecord::getStocktakingId,id).eq(YwStocktakingRecord::getIsdeleted,Constants.ZERO));
+        for (YwStocktakingRecord ywStocktakingRecord:recordList) {
+            //鎻愪氦鏃� 鏈繘琛岀洏鐐圭殑鏄庣粏鏁版嵁
+            if(Constants.equalsInteger(ywStocktakingRecord.getStatus(),Constants.ZERO)){
+                ywStocktakingRecordMapper.update(new UpdateWrapper<YwStocktakingRecord>().lambda()
+                        .set(YwStocktakingRecord::getStatus,Constants.TWO)
+                        .set(YwStocktakingRecord::getUserId,loginUserInfo.getId())
+                        .eq(YwStocktakingRecord::getId,ywStocktakingRecord.getId())
+                );
+            }
+            //鏌ヨ搴撳瓨淇℃伅 杩涜搴撳瓨鏇存柊
+            YwStock ywStock = ywStockMapper.selectOne(new QueryWrapper<YwStock>().lambda().eq(YwStock::getMaterialId,ywStocktakingRecord.getMaterialId())
+                    .eq(YwStock::getWarehouseId,model.getWarehouseId()).eq(YwStock::getStock,ywStocktakingRecord.getStock()));
+            if(Objects.isNull(ywStock)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"搴撳瓨淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛�");
+            }
+            if(ywStocktakingRecord.getActStock().compareTo(BigDecimal.ZERO)==Constants.ZERO){
+                ywStockMapper.deleteById(ywStock.getId());
+            }else {
+                ywStockMapper.update(new UpdateWrapper<YwStock>().lambda().set(YwStock::getStock,ywStocktakingRecord.getActStock()).eq(YwStock::getId,ywStock.getId()));
+            }
+        }
+        ywStocktakingMapper.update(new UpdateWrapper<YwStocktaking>().lambda()
+                .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime())
+                .set(YwStocktaking::getDoneDate,DateUtil.getCurrDateTime())
+                .set(YwStocktaking::getDoneUserId,loginUserInfo.getId())
+                .set(YwStocktaking::getEditor,loginUserInfo.getId())
+                .set(YwStocktaking::getStatus,Constants.TWO)
+                .eq(YwStocktaking::getId,model.getId()));
+
+    }
+
+    @Override
+    public void delete(YwStocktaking ywStocktaking) {
+        UpdateWrapper<YwStocktaking> deleteWrapper = new UpdateWrapper<>(ywStocktaking);
+        ywStocktakingMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywStocktakingMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwStocktaking ywStocktaking) {
+        if(Objects.isNull(ywStocktaking)
+                || StringUtils.isBlank(ywStocktaking.getName())
+                || Objects.isNull(ywStocktaking.getId())
+                || Objects.isNull(ywStocktaking.getPlanDate())
+                || Objects.isNull(ywStocktaking.getWarehouseId())
+                || Objects.isNull(ywStocktaking.getUserId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        YwStocktaking model = ywStocktakingMapper.selectById(ywStocktaking.getId());
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐩樼偣鍗曟暟鎹�");
+        }
+        YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(ywStocktaking.getWarehouseId());
+        if(Objects.isNull(ywWarehouse)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌浠撳簱鏁版嵁");
+        }
+        //鍒ゆ柇褰撳墠浠撳簱褰撳墠鏃ユ湡鏄惁瀛樺湪鐩樼偣鍗�
+        if(ywStocktakingMapper.selectCount(new QueryWrapper<YwStocktaking>().lambda().ne(YwStocktaking::getId,ywStocktaking.getId()).eq(YwStocktaking::getIsdeleted,Constants.ZERO).eq(YwStocktaking::getStatus,Constants.ZERO)
+                .eq(YwStocktaking::getWarehouseId,ywStocktaking.getWarehouseId()).apply(" DATE(PLAN_DATE) = '" + DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd") +"'" ))>0){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"["+DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd")+"]["+ywWarehouse.getName()+"]宸叉湁鐩樼偣鍗曪紝涓嶅彲閲嶅鍙戣捣鐩樼偣");
+        }
+        LoginUserInfo loginUserInfo = ywStocktaking.getLoginUserInfo();
+        ywStocktaking.setEditor(loginUserInfo.getId());
+        ywStocktaking.setEditDate(new Date());
+        ywStocktaking.setCode(null);
+        ywStocktakingMapper.updateById(ywStocktaking);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwStocktaking> ywStocktakings) {
+        if (CollectionUtils.isEmpty(ywStocktakings)) {
+            return;
+        }
+        for (YwStocktaking ywStocktaking: ywStocktakings) {
+            this.updateById(ywStocktaking);
+        }
+    }
+
+    @Override
+    public YwStocktaking findById(Integer id) {
+        return ywStocktakingMapper.selectById(id);
+    }
+
+    @Override
+    public YwStocktaking getDetail(Integer id) {
+        MPJLambdaWrapper<YwStocktaking> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(YwStocktaking.class)
+                .select(" s.name ", YwStocktaking::getUserName)
+                .select(" s1.name ",YwStocktaking::getCreateName)
+                .selectAs(YwWarehouse::getName,YwStocktaking::getWarehouseName)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId)
+                .leftJoin("system_user s on t.user_id = s.id")
+                .leftJoin("system_user s1 on t.creator = s1.id")
+                .eq(YwStocktaking::getId,id)
+                .last("limit 1");
+        YwStocktaking ywStocktaking = ywStocktakingMapper.selectOne(queryWrapper);
+        List<YwStocktakingRecord> recordList = ywStocktakingRecordMapper.selectList(new QueryWrapper<YwStocktakingRecord>().lambda().eq(YwStocktakingRecord::getStocktakingId,id).eq(YwStocktakingRecord::getIsdeleted,Constants.ZERO));
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(recordList)){
+            //鍚堣鐩樼偣鏁版嵁
+            ywStocktaking.setFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size());
+            ywStocktaking.setUnFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
+            ywStocktaking.setEqualAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()).size());
+            ywStocktaking.setLossAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ONE)).collect(Collectors.toList()).size());
+            ywStocktaking.setProfitAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.TWO)).collect(Collectors.toList()).size());
+        }
+        return ywStocktaking;
+    }
+
+    @Override
+    public YwStocktaking findOne(YwStocktaking ywStocktaking) {
+        QueryWrapper<YwStocktaking> wrapper = new QueryWrapper<>(ywStocktaking);
+        return ywStocktakingMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwStocktaking> findList(YwStocktaking ywStocktaking) {
+        QueryWrapper<YwStocktaking> wrapper = new QueryWrapper<>(ywStocktaking);
+        return ywStocktakingMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwStocktaking> findPage(PageWrap<YwStocktaking> pageWrap) {
+        IPage<YwStocktaking> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwStocktaking> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwStocktaking model = pageWrap.getModel();
+        queryWrapper.selectAll(YwStocktaking.class)
+                .select(" s.name ", YwStocktaking::getUserName)
+                .select(" s1.name ",YwStocktaking::getCreateName)
+                .selectAs(YwWarehouse::getName,YwStocktaking::getWarehouseName)
+                .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId)
+                .leftJoin("system_user s on t.user_id = s.id")
+                .leftJoin("system_user s1 on t.creator = s1.id")
+                .eq(YwStocktaking::getIsdeleted,Constants.ZERO)
+                .like(StringUtils.isNotBlank(model.getName()),YwStocktaking::getName,model.getName())
+                .eq(Objects.nonNull(model.getStatus()),YwStocktaking::getStatus,model.getStatus())
+                .orderByAsc(YwStocktaking::getStatus)
+                .orderByDesc(YwStocktaking::getPlanDate)
+        ;
+
+        IPage iPage = ywStocktakingMapper.selectJoinPage(page, YwStocktaking.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+    @Override
+    public long count(YwStocktaking ywStocktaking) {
+        QueryWrapper<YwStocktaking> wrapper = new QueryWrapper<>(ywStocktaking);
+        return ywStocktakingMapper.selectCount(wrapper);
+    }
+
+
+    public synchronized String  getNextCode(){
+        String prefix =  "PD-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-";
+        Integer countNum  = RedisUtil.getObject(redisTemplate,
+                Constants.RedisKeys.COM_OUTBOUND_TAKING_KEY,
+                Integer.class);
+        countNum = Constants.formatIntegerNum(countNum)+1;
+        //鏇存柊缂撳瓨
+        RedisUtil.addObject(redisTemplate, Constants.RedisKeys.COM_OUTBOUND_TAKING_KEY,countNum);
+        String nextIndex =Integer.toString( countNum );
+        return prefix + org.apache.commons.lang3.StringUtils.leftPad(nextIndex,4,"0");
+    }
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java
new file mode 100644
index 0000000..35a70ea
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java
@@ -0,0 +1,239 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwStockMapper;
+import com.doumee.dao.business.YwWarehouseMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.YwWarehouseService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.java.Log;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杩愮淮浠撳簱淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/06 11:05
+ */
+@Service
+public class YwWarehouseServiceImpl implements YwWarehouseService {
+
+    @Autowired
+    private YwWarehouseMapper ywWarehouseMapper;
+
+    @Autowired
+    private YwStockMapper ywStockMapper;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public Integer create(YwWarehouse ywWarehouse) {
+        if(Objects.isNull(ywWarehouse)
+            || StringUtils.isBlank(ywWarehouse.getName())
+            || Objects.isNull(ywWarehouse.getUserId())
+            || Objects.isNull(ywWarehouse.getStatus())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(ywWarehouseMapper.selectCount(new QueryWrapper<YwWarehouse>().lambda().eq(YwWarehouse::getIsdeleted,Constants.ZERO).eq(YwWarehouse::getName,ywWarehouse.getName())) > Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浠撳簱鍚嶇О宸插瓨鍦紒");
+        }
+        LoginUserInfo loginUserInfo = ywWarehouse.getLoginUserInfo();
+        ywWarehouse.setCreator(loginUserInfo.getId());
+        ywWarehouse.setCreateDate(new Date());
+        ywWarehouse.setIsdeleted(Constants.ZERO);
+        ywWarehouseMapper.insert(ywWarehouse);
+        return ywWarehouse.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo loginUserInfo) {
+        YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(id);
+        if(Objects.isNull(ywWarehouse)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        //鍒ゆ柇鏁版嵁涓嬫槸鍚﹀瓨鍦ㄨ祫浜ф暟鎹�
+        if(ywStockMapper.selectCount(new QueryWrapper<YwStock>().lambda().eq(YwStock::getIsdeleted,Constants.ZERO)
+                .gt(YwStock::getStock,Constants.ZERO)
+                .eq(YwStock::getWarehouseId,ywWarehouse.getId()))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠浠撳簱鍐呮湁搴撳瓨鐨勮祫浜э紝涓嶅彲鍒犻櫎");
+        };
+        ywWarehouseMapper.update(new UpdateWrapper<YwWarehouse>().lambda()
+                .set(YwWarehouse::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwWarehouse::getEditor, loginUserInfo.getId())
+                .set(YwWarehouse::getIsdeleted,Constants.ONE)
+                .eq(YwWarehouse::getId,ywWarehouse.getId()));
+    }
+
+    @Override
+    public void delete(YwWarehouse ywWarehouse) {
+        UpdateWrapper<YwWarehouse> deleteWrapper = new UpdateWrapper<>(ywWarehouse);
+        ywWarehouseMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywWarehouseMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void updateById(YwWarehouse ywWarehouse) {
+        if(Objects.isNull(ywWarehouse)
+                || StringUtils.isBlank(ywWarehouse.getName())
+                || Objects.isNull(ywWarehouse.getUserId())
+                || Objects.isNull(ywWarehouse.getStatus())
+                || Objects.isNull(ywWarehouse.getId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(ywWarehouseMapper.selectCount(new QueryWrapper<YwWarehouse>().lambda().ne(YwWarehouse::getId,ywWarehouse.getId()).eq(YwWarehouse::getIsdeleted,Constants.ZERO).eq(YwWarehouse::getName,ywWarehouse.getName())) > Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浠撳簱鍚嶇О宸插瓨鍦紒");
+        }
+        LoginUserInfo loginUserInfo = ywWarehouse.getLoginUserInfo();
+        ywWarehouse.setEditor(loginUserInfo.getId());
+        ywWarehouse.setEditDate(new Date());
+        ywWarehouse.setIsdeleted(Constants.ZERO);
+        ywWarehouseMapper.updateById(ywWarehouse);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwWarehouse> ywWarehouses) {
+        if (CollectionUtils.isEmpty(ywWarehouses)) {
+            return;
+        }
+        for (YwWarehouse ywWarehouse: ywWarehouses) {
+            this.updateById(ywWarehouse);
+        }
+    }
+
+    @Override
+    public YwWarehouse findById(Integer id) {
+        return ywWarehouseMapper.selectById(id);
+    }
+
+    @Override
+    public YwWarehouse findOne(YwWarehouse ywWarehouse) {
+        QueryWrapper<YwWarehouse> wrapper = new QueryWrapper<>(ywWarehouse);
+        return ywWarehouseMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwWarehouse> findList(YwWarehouse model) {
+        MPJLambdaWrapper<YwWarehouse> queryWrapper = new MPJLambdaWrapper<YwWarehouse>();
+        queryWrapper.selectAll(YwWarehouse.class)
+                .eq(Objects.nonNull(model.getStatus()),YwWarehouse::getStatus,model.getStatus())
+                .eq(YwWarehouse::getIsdeleted,Constants.ZERO)
+                .eq(YwWarehouse::getStatus,Constants.ZERO)
+                .orderByAsc(YwWarehouse::getSortnum)
+        ;
+        return ywWarehouseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public PageData<YwWarehouse> findPage(PageWrap<YwWarehouse> pageWrap) {
+        IPage<YwWarehouse> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwWarehouse> queryWrapper = new MPJLambdaWrapper<YwWarehouse>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwWarehouse model = pageWrap.getModel();
+        queryWrapper.selectAll(YwWarehouse.class)
+                .selectAs(SystemUser::getRealname, YwWarehouse::getUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwWarehouse::getUserId)
+                .eq(Objects.nonNull(model.getStatus()),YwWarehouse::getStatus,model.getStatus())
+                .like(StringUtils.isNotBlank(model.getName()),YwWarehouse::getName,model.getName())
+                .eq(YwWarehouse::getIsdeleted,Constants.ZERO)
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        IPage iPage = ywWarehouseMapper.selectJoinPage(page,YwWarehouse.class,queryWrapper);
+        return PageData.from(iPage);
+    }
+
+
+//    @Override
+//    public PageData<YwWarehouse> findPage(PageWrap<YwWarehouse> pageWrap) {
+//        IPage<YwWarehouse> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+//        QueryWrapper<YwWarehouse> queryWrapper = new QueryWrapper<>();
+//        Utils.MP.blankToNull(pageWrap.getModel());
+//
+//        if (pageWrap.getModel().getId() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getId, pageWrap.getModel().getId());
+//        }
+//        if (pageWrap.getModel().getCreator() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getCreator, pageWrap.getModel().getCreator());
+//        }
+//        if (pageWrap.getModel().getCreateDate() != null) {
+//            queryWrapper.lambda().ge(YwWarehouse::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+//            queryWrapper.lambda().le(YwWarehouse::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+//        }
+//        if (pageWrap.getModel().getEditor() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getEditor, pageWrap.getModel().getEditor());
+//        }
+//        if (pageWrap.getModel().getEditDate() != null) {
+//            queryWrapper.lambda().ge(YwWarehouse::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+//            queryWrapper.lambda().le(YwWarehouse::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+//        }
+//        if (pageWrap.getModel().getRemark() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getRemark, pageWrap.getModel().getRemark());
+//        }
+//        if (pageWrap.getModel().getStatus() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getStatus, pageWrap.getModel().getStatus());
+//        }
+//        if (pageWrap.getModel().getName() != null) {
+//            queryWrapper.lambda().like(YwWarehouse::getName, pageWrap.getModel().getName());
+//        }
+//        if (pageWrap.getModel().getPosition() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getPosition, pageWrap.getModel().getPosition());
+//        }
+//        if (pageWrap.getModel().getCode() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getCode, pageWrap.getModel().getCode());
+//        }
+//        if (pageWrap.getModel().getUserId() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getUserId, pageWrap.getModel().getUserId());
+//        }
+//        if (pageWrap.getModel().getSortnum() != null) {
+//            queryWrapper.lambda().eq(YwWarehouse::getSortnum, pageWrap.getModel().getSortnum());
+//        }
+//        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+//            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+//                queryWrapper.orderByDesc(sortData.getProperty());
+//            } else {
+//                queryWrapper.orderByAsc(sortData.getProperty());
+//            }
+//        }
+//        return PageData.from(ywWarehouseMapper.selectPage(page, queryWrapper));
+//    }
+
+    @Override
+    public long count(YwWarehouse ywWarehouse) {
+        QueryWrapper<YwWarehouse> wrapper = new QueryWrapper<>(ywWarehouse);
+        return ywWarehouseMapper.selectCount(wrapper);
+    }
+}

--
Gitblit v1.9.3