From 92bc6dca274eb45dc330f63b5a3f90a01458e157 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期二, 27 五月 2025 14:48:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStoreEarlyWarningMapper.xml              |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java                 |  118 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InStoreDetailMapper.xml                       |   42 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java               |   65 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java              |  347 ++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java             |   52 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java                           |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InStoreDetailServiceImpl.java               |   50 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsClassifyServiceImpl.java               |   57 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStoreEarlyWarningMapper.java                 |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodeUtils.java                                   |  121 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java                               |    6 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java                        |  103 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InStoreDetail.java                                |   96 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutStoreDetailService.java                      |   20 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java                             |   29 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBoundDetail.java                         |  154 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundDetailMapper.xml                       |   24 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java                |  209 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InStoreDetailController.java                  |  176 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentTransferService.java                |   49 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java                            |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java                        |   23 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java                         |  160 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java                      |   53 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStoreEarlyWarningServiceImpl.java      |   18 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBound.java                               |  150 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundDetailServiceImpl.java        |   38 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java                              |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundOrderService.java                        |   19 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java                                 |   21 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundDetailMapper.java                          |   27 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundDetailService.java                |   22 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentTransferServiceImpl.java        |  350 ++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundOrder.java                                 |  116 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/ToolCirculationStatus.java                         |   38 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/SharpeeningVo.java                             |   37 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java                  |    9 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/BusinessCodeConst.java                   |    2 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundDetailMapper.xml                |   84 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentTransferMapper.xml                |    7 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/StocktakingPoundVo.java                        |   35 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java                               |   87 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundDetailServiceImpl.java |   39 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java                          |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodePrinterUtils.java                            |   74 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentTransferMapper.java                   |   18 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundDetailMapper.java                   |   41 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStoreEarlyWarningController.java         |  159 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java                      |   30 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutStoreDetailServiceImpl.java              |   36 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java                               |   87 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentTransferStatusEnum.java         |   22 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml                           |  221 +
 lxzn-module-system/lxzn-system-start/src/main/resources/db/tms_2025/tms-init-20250522.sql                    | 1240 +++++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundDetailServiceImpl.java               |   55 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java          |  286 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutStoreDetailController.java                 |  179 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java                  |  137 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentSealUpStatusEnum.java           |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java                 |  327 ++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java               |  175 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferQuery.java                   |   23 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsConfigProperty.java                          |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundMapper.java                         |   21 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundDetailService.java                       |   20 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java         |    3 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java            |    2 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml                      |   79 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java                   |   13 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java                       |    3 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java             |   15 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundOrderController.java                   |  237 +
 db/数据库产品化设计.pdma.json                                                                                        |  202 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentSealUpService.java                  |    8 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/StocktakingBoundFlowDto.java                  |   12 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundMapper.xml               |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundMapper.xml                      |   10 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java       |  266 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutStoreDetailMapper.java                         |   25 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferRequest.java                 |  126 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundDetailService.java         |   31 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/LossBoundFlowDto.java                         |   12 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundDetailController.java                  |  174 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundDetailMapper.java            |   41 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsSharpeningMapper.xml                     |   26 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java                          |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStoreEarlyWarning.java                       |  109 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InStoreDetailMapper.java                          |   23 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolSharpeningVo.java                          |  132 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInStoreDetailService.java                       |   20 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentSealUp.java                           |  232 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentSealUpServiceImpl.java          |  174 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java                          |   78 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java                       |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml         |   91 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java                               |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java                        |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedger.java                                   |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundOrderMapper.xml                        |    5 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java                  |  152 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolsStocktakingVo.java                        |   87 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java                     |   19 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundOrderMapper.java                           |   17 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundMapper.java                  |   14 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentTransferController.java           |  346 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentSealUpRequest.java                   |  166 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java                       |   19 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentSealUpController.java             |   42 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/InboundOrderFlowDto.java                      |   12 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundDetail.java                                |   97 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStoreEarlyWarningService.java              |   14 
 112 files changed, 8,946 insertions(+), 459 deletions(-)

diff --git "a/db/\346\225\260\346\215\256\345\272\223\344\272\247\345\223\201\345\214\226\350\256\276\350\256\241.pdma.json" "b/db/\346\225\260\346\215\256\345\272\223\344\272\247\345\223\201\345\214\226\350\256\276\350\256\241.pdma.json"
index 33ebfa6..9c54df4 100644
--- "a/db/\346\225\260\346\215\256\345\272\223\344\272\247\345\223\201\345\214\226\350\256\276\350\256\241.pdma.json"
+++ "b/db/\346\225\260\346\215\256\345\272\223\344\272\247\345\223\201\345\214\226\350\256\276\350\256\241.pdma.json"
@@ -4,7 +4,7 @@
   "avatar": "",
   "version": "4.9.2",
   "createdTime": "2025-3-10 16:38:19",
-  "updatedTime": "2025-5-22 15:02:23",
+  "updatedTime": "2025-5-26 14:55:20",
   "dbConns": [],
   "profile": {
     "default": {
@@ -12848,6 +12848,150 @@
           "extProps": {},
           "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
           "id": "167FF00A-3AB4-4A25-A0FA-922481A35D9F"
+        },
+        {
+          "defKey": "approval_deal_type",
+          "defName": "瀹℃牳绫诲瀷",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
+          "id": "5AE732AE-B9E0-47C0-A565-FA1EBC7940D3"
+        },
+        {
+          "defKey": "approval_comment",
+          "defName": "瀹℃牳鎰忚",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
+          "id": "295D3DAE-28E0-4DCE-A0A0-839F87F534F4"
+        },
+        {
+          "defKey": "unseal_report_user",
+          "defName": "鍚皝鐢宠浜�",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "FAE53488-7B2A-4F16-8CBF-DB9B774DF33F"
+        },
+        {
+          "defKey": "unseal_reason",
+          "defName": "鍚皝鍘熷洜",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
+          "id": "4DDCB07F-1FEC-4A22-84BD-A45D7C7925B2"
+        },
+        {
+          "defKey": "unseal_approval_user",
+          "defName": "鍚皝瀹℃牳浜�",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "68C346D8-EA2A-4E46-A4B5-16787C79ECBA"
+        },
+        {
+          "defKey": "unseal_approval_time",
+          "defName": "鍚皝瀹℃牳鏃堕棿",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098",
+          "extProps": {},
+          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
+          "id": "51A953E1-6435-413B-AADF-8D695130618D"
+        },
+        {
+          "defKey": "unseal_approval_deal_type",
+          "defName": "鍚皝瀹℃牳绫诲瀷",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
+          "id": "A171B3A4-A12B-4A45-B064-BA63BD77B8EF"
+        },
+        {
+          "defKey": "unseal_approval_comment",
+          "defName": "鍚皝瀹℃牳鎰忚",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
+          "id": "DF17CC8C-26B1-4627-A980-C1E13C787A02"
         }
       ],
       "correlations": [],
@@ -13329,6 +13473,62 @@
           "extProps": {},
           "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
           "id": "66B3E2F7-B450-4D20-B3B2-5F6E80F99110"
+        },
+        {
+          "defKey": "approval_deal_type",
+          "defName": "瀹℃牳绫诲瀷",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
+          "refDict": "",
+          "extProps": {},
+          "notes": {},
+          "attr1": "",
+          "attr2": "",
+          "attr3": "",
+          "attr4": "",
+          "attr5": "",
+          "attr6": "",
+          "attr7": "",
+          "attr8": "",
+          "attr9": "",
+          "id": "3F991F63-D842-4D0B-86BD-4CAEB0F1D33D",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
+        },
+        {
+          "defKey": "approval_comment",
+          "defName": "瀹℃牳鎰忚",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
+          "refDict": "",
+          "extProps": {},
+          "notes": {},
+          "attr1": "",
+          "attr2": "",
+          "attr3": "",
+          "attr4": "",
+          "attr5": "",
+          "attr6": "",
+          "attr7": "",
+          "attr8": "",
+          "attr9": "",
+          "id": "A885F9EB-FAAE-4D76-ACF5-8E6CBCBA02DD",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
         }
       ],
       "correlations": [],
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
index 3175021..7686edc 100644
--- a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
@@ -7,10 +7,7 @@
 import org.aspectj.lang.annotation.*;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.jeecg.modules.eam.aspect.annotation.EquipmentHistoryLog;
-import org.jeecg.modules.eam.constant.EquipmentOperationTagEnum;
-import org.jeecg.modules.eam.constant.InspectionStatus;
-import org.jeecg.modules.eam.constant.ReportRepairEnum;
-import org.jeecg.modules.eam.constant.WeekMaintenanceStatusEnum;
+import org.jeecg.modules.eam.constant.*;
 import org.jeecg.modules.eam.entity.*;
 import org.jeecg.modules.eam.service.IEamEquipmentHistoryLogService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -139,6 +136,16 @@
             case UNSEALED:
                 break;
             case TRANSFERRED:
+                if (result instanceof EamEquipmentTransfer) {
+                    EamEquipmentTransfer order = (EamEquipmentTransfer) result;
+                    if (EquipmentTransferStatusEnum.COMPLETE.name().equals(order.getTransferStatus())) {
+                        log.setEquipmentId(order.getEquipmentId());
+                        log.setBusinessId(order.getId());
+                        log.setOperator(order.getReportUser());
+                        log.setDescription(order.getTransferReason());
+                        log.setCreateTime(order.getTransferTime());
+                    }
+                }
                 break;
             case SCRAPPED:
                 break;
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/BusinessCodeConst.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/BusinessCodeConst.java
index f097367..f66bac7 100644
--- a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/BusinessCodeConst.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/BusinessCodeConst.java
@@ -23,6 +23,8 @@
     String LEAN_OUT_CODE_RULE = "EquipmentLeanOutCodeRule";
     //璁惧灏佸瓨鍚皝
     String SEAL_UP_CODE_RULE = "EquipmentSealUpCodeRule";
+    //璁惧璋冩嫧缂栫爜瑙勫垯
+    String TRANSFER_CODE_RULE = "EquipmentTransferCodeRule";
     /**
      * 澶囦欢璇疯喘鍗曠姸鎬� 1:宸插垱寤� 2:宸叉彁浜� 3:宸查�氳繃 4:宸查┏鍥� 5:宸插畬鎴�
      */
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentSealUpStatusEnum.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentSealUpStatusEnum.java
index 7685601..e86451c 100644
--- a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentSealUpStatusEnum.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentSealUpStatusEnum.java
@@ -8,6 +8,7 @@
     WAIT_SUBMIT, //寰呮彁浜�
     WAIT_CHECK, //寰呭鏍�
     SEALED, //宸插皝瀛�
+    WAIT_UNSEALING_AUDIT, //寰呭惎灏佸鏍�
     COMPLETE, //宸插畬鎴�
     ;
 
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentTransferStatusEnum.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentTransferStatusEnum.java
new file mode 100644
index 0000000..f061fb2
--- /dev/null
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentTransferStatusEnum.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.eam.constant;
+
+/**
+ * @author cuikaidong
+ * @date 2025/5/26
+ */
+public enum EquipmentTransferStatusEnum {
+    WAIT_SUBMIT, //寰呮彁浜�
+    WAIT_CHECK, //寰呭鏍�
+    COMPLETE, //宸插畬鎴�
+    ;
+
+    public static EquipmentTransferStatusEnum getInstance(String code) {
+        EquipmentTransferStatusEnum[] values = EquipmentTransferStatusEnum.values();
+        for (EquipmentTransferStatusEnum value : values) {
+            if (value.name().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java
new file mode 100644
index 0000000..8fc1465
--- /dev/null
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java
@@ -0,0 +1,152 @@
+package org.jeecg.modules.eam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 璁惧褰掑睘鍙樺姩
+ * @Author: jeecg-boot
+ * @Date: 2025-05-13
+ * @Version: V1.0
+ */
+@Data
+@TableName("eam_equipment_transfer")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "eam_equipment_transfer瀵硅薄", description = "璁惧褰掑睘鍙樺姩")
+public class EamEquipmentTransfer implements Serializable {
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 鍒涘缓浜�
+     */
+    @Excel(name = "鍒涘缓浜�", width = 15)
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @Excel(name = "鏇存柊浜�", width = 15)
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    private Integer delFlag;
+    /**
+     * 鍗曟嵁鍙�
+     */
+    @Excel(name = "鍗曟嵁鍙�", width = 15)
+    @ApiModelProperty(value = "鍗曟嵁鍙�")
+    private String code;
+    /**
+     * 璁惧ID
+     */
+    @Excel(name = "璁惧ID", width = 15)
+    @ApiModelProperty(value = "璁惧ID")
+    private String equipmentId;
+    /**
+     * 璋冨嚭閮ㄩ棬
+     */
+    @Excel(name = "璋冨嚭閮ㄩ棬", width = 15)
+    @ApiModelProperty(value = "璋冨嚭閮ㄩ棬")
+    @Dict(dicCode = "mdc_production, production_name, id")
+    private String oldDepartId;
+    /**
+     * 璋冨叆閮ㄩ棬
+     */
+    @Excel(name = "璋冨叆閮ㄩ棬", width = 15)
+    @ApiModelProperty(value = "璋冨叆閮ㄩ棬")
+    @Dict(dicCode = "mdc_production, production_name, id")
+    private String newDepartId;
+    /**
+     * 鐢宠浜�
+     */
+    @Excel(name = "鐢宠浜�", width = 15)
+    @ApiModelProperty(value = "鐢宠浜�")
+    @Dict(dicCode = "sys_user, realname, username")
+    private String reportUser;
+    /**
+     * 鍙樺姩鍘熷洜
+     */
+    @Excel(name = "鍙樺姩鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鍙樺姩鍘熷洜")
+    private String transferReason;
+    /**
+     * 鍙樺姩鐘舵��
+     */
+    @Excel(name = "鍙樺姩鐘舵��", width = 15)
+    @ApiModelProperty(value = "鍙樺姩鐘舵��")
+    @Dict(dicCode = "equipment_transfer_status")
+    private String transferStatus;
+    /**
+     * 鍙樺姩鏃ユ湡
+     */
+    @ApiModelProperty(value = "鍙樺姩鏃ユ湡")
+    private Date transferTime;
+    /**
+     * 瀹℃牳浜�
+     */
+    @Excel(name = "瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    @Dict(dicCode = "sys_user, realname, username")
+    private String approvalUser;
+    /**
+     * 瀹℃牳绫诲瀷
+     */
+    @ApiModelProperty(value = "瀹℃牳绫诲瀷")
+    @Dict(dicCode = "approved_rejected")
+    private String approvalDealType;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalComment;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    private Date approvalTime;
+    /**
+     * 澶囨敞
+     */
+    @Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    //鍒楄〃灞曠ず
+    @TableField(exist = false)
+    private String equipmentCode;
+    @TableField(exist = false)
+    private String equipmentName;
+
+}
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java
index 06784e5..d9a1ad8 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java
@@ -194,7 +194,7 @@
     }
 
     /**
-     * 缂栬緫
+     * 瀹℃壒
      *
      * @param request
      * @return
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentSealUpController.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentSealUpController.java
index f4ecc06..8775cfb 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentSealUpController.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentSealUpController.java
@@ -18,6 +18,7 @@
 import org.jeecg.modules.eam.constant.EquipmentSealUpStatusEnum;
 import org.jeecg.modules.eam.entity.EamEquipmentSealUp;
 import org.jeecg.modules.eam.request.EamEquipmentSealUpQuery;
+import org.jeecg.modules.eam.request.EamEquipmentSealUpRequest;
 import org.jeecg.modules.eam.service.IEamEquipmentSealUpService;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -175,13 +176,30 @@
     }
 
     /**
+     * 鍚皝
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧鍚皝-鍚皝")
+    @ApiOperation(value = "璁惧鍚皝-鍚皝", notes = "璁惧鍚皝-鍚皝")
+    @GetMapping(value = "/unseal")
+    public Result<?> unseal(@RequestParam(name = "id", required = true) String id) {
+        boolean b = eamEquipmentSealUpService.unseal(id);
+        if (!b) {
+            return Result.error("鎿嶄綔澶辫触锛�");
+        }
+        return Result.OK("鎿嶄綔鎴愬姛!");
+    }
+
+    /**
      * 鎻愪氦
      *
      * @param id
      * @return
      */
-    @AutoLog(value = "璁惧灏佸瓨鍚皝-鎻愪氦")
-    @ApiOperation(value = "璁惧灏佸瓨鍚皝-鎻愪氦", notes = "璁惧灏佸瓨鍚皝-鎻愪氦")
+    @AutoLog(value = "璁惧灏佸瓨-鎻愪氦")
+    @ApiOperation(value = "璁惧灏佸瓨-鎻愪氦", notes = "璁惧灏佸瓨-鎻愪氦")
     @GetMapping(value = "/submit")
     public Result<?> submit(@RequestParam(name = "id", required = true) String id) {
         boolean b = eamEquipmentSealUpService.submit(id);
@@ -190,4 +208,24 @@
         }
         return Result.OK("鎿嶄綔鎴愬姛!");
     }
+
+    /**
+     * 瀹℃壒娴�
+     *
+     * @param request
+     * @return
+     */
+    @AutoLog(value = "鍚皝灏佸瓨-瀹℃壒娴�")
+    @ApiOperation(value = "鍚皝灏佸瓨-瀹℃壒娴�", notes = "鍚皝灏佸瓨-瀹℃壒娴�")
+    @RequestMapping(value = "/approval", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> approval(@RequestBody EamEquipmentSealUpRequest request) {
+        if (request == null) {
+            return Result.error("娣诲姞鐨勫璞′笉鑳戒负绌猴紒");
+        }
+        EamEquipmentSealUp entity = eamEquipmentSealUpService.approval(request);
+        if (entity == null) {
+            return Result.error("鎿嶄綔澶辫触锛�");
+        }
+        return Result.OK("鎿嶄綔鎴愬姛!");
+    }
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentTransferController.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentTransferController.java
index 4be8d17..f45c9b8 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentTransferController.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentTransferController.java
@@ -1,167 +1,217 @@
 package org.jeecg.modules.eam.controller;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.jeecg.common.util.oConvertUtils;
-import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
-import org.jeecg.modules.eam.service.IEamEquipmentTransferService;
-import java.util.Date;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-import org.jeecg.common.system.base.controller.JeecgController;
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.util.TranslateDictTextUtils;
+import org.jeecg.modules.eam.constant.BusinessCodeConst;
+import org.jeecg.modules.eam.constant.EquipmentTransferStatusEnum;
+import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
+import org.jeecg.modules.eam.request.EamEquipmentTransferQuery;
+import org.jeecg.modules.eam.request.EamEquipmentTransferRequest;
+import org.jeecg.modules.eam.service.IEamEquipmentTransferService;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
- /**
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+
+/**
  * @Description: 璁惧褰掑睘鍙樺姩
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 @Slf4j
-@Api(tags="璁惧褰掑睘鍙樺姩")
+@Api(tags = "璁惧褰掑睘鍙樺姩")
 @RestController
 @RequestMapping("/eam/eamEquipmentTransfer")
 public class EamEquipmentTransferController extends JeecgController<EamEquipmentTransfer, IEamEquipmentTransferService> {
-	@Autowired
-	private IEamEquipmentTransferService eamEquipmentTransferService;
-	
-	/**
-	 * 鍒嗛〉鍒楄〃鏌ヨ
-	 *
-	 * @param eamEquipmentTransfer
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ", notes="璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ")
-	@GetMapping(value = "/list")
-	public Result<?> queryPageList(EamEquipmentTransfer eamEquipmentTransfer,
-								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-								   HttpServletRequest req) {
-		QueryWrapper<EamEquipmentTransfer> queryWrapper = QueryGenerator.initQueryWrapper(eamEquipmentTransfer, req.getParameterMap());
-		Page<EamEquipmentTransfer> page = new Page<EamEquipmentTransfer>(pageNo, pageSize);
-		IPage<EamEquipmentTransfer> pageList = eamEquipmentTransferService.page(page, queryWrapper);
-		return Result.OK(pageList);
-	}
-	
-	/**
-	 * 娣诲姞
-	 *
-	 * @param eamEquipmentTransfer
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-娣诲姞")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-娣诲姞", notes="璁惧褰掑睘鍙樺姩-娣诲姞")
-	@PostMapping(value = "/add")
-	public Result<?> add(@RequestBody EamEquipmentTransfer eamEquipmentTransfer) {
-		eamEquipmentTransferService.save(eamEquipmentTransfer);
-		return Result.OK("娣诲姞鎴愬姛锛�");
-	}
-	
-	/**
-	 * 缂栬緫
-	 *
-	 * @param eamEquipmentTransfer
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-缂栬緫")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-缂栬緫", notes="璁惧褰掑睘鍙樺姩-缂栬緫")
-	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-	public Result<?> edit(@RequestBody EamEquipmentTransfer eamEquipmentTransfer) {
-		eamEquipmentTransferService.updateById(eamEquipmentTransfer);
-		return Result.OK("缂栬緫鎴愬姛!");
-	}
-	
-	/**
-	 * 閫氳繃id鍒犻櫎
-	 *
-	 * @param id
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎", notes="璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎")
-	@DeleteMapping(value = "/delete")
-	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
-		eamEquipmentTransferService.removeById(id);
-		return Result.OK("鍒犻櫎鎴愬姛!");
-	}
-	
-	/**
-	 * 鎵归噺鍒犻櫎
-	 *
-	 * @param ids
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎", notes="璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎")
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		this.eamEquipmentTransferService.removeByIds(Arrays.asList(ids.split(",")));
-		return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
-	}
-	
-	/**
-	 * 閫氳繃id鏌ヨ
-	 *
-	 * @param id
-	 * @return
-	 */
-	@AutoLog(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ")
-	@ApiOperation(value="璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ", notes="璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ")
-	@GetMapping(value = "/queryById")
-	public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
-		EamEquipmentTransfer eamEquipmentTransfer = eamEquipmentTransferService.getById(id);
-		return Result.OK(eamEquipmentTransfer);
-	}
+    @Autowired
+    private IEamEquipmentTransferService eamEquipmentTransferService;
+    @Autowired
+    private ISysBusinessCodeRuleService businessCodeRuleService;
+    @Autowired
+    private ObjectMapper objectMapper;
+    @Autowired
+    private TranslateDictTextUtils translateDictTextUtils;
 
-  /**
-   * 瀵煎嚭excel
-   *
-   * @param request
-   * @param eamEquipmentTransfer
-   */
-  @RequestMapping(value = "/exportXls")
-  public ModelAndView exportXls(HttpServletRequest request, EamEquipmentTransfer eamEquipmentTransfer) {
-      return super.exportXls(request, eamEquipmentTransfer, EamEquipmentTransfer.class, "璁惧褰掑睘鍙樺姩");
-  }
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param query
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ", notes = "璁惧褰掑睘鍙樺姩-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(EamEquipmentTransferQuery query,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        Page<EamEquipmentTransfer> page = new Page<EamEquipmentTransfer>(pageNo, pageSize);
+        IPage<EamEquipmentTransfer> pageList = eamEquipmentTransferService.queryPageList(page, query);
+        return Result.OK(pageList);
+    }
 
-  /**
-   * 閫氳繃excel瀵煎叆鏁版嵁
-   *
-   * @param request
-   * @param response
-   * @return
-   */
-  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-      return super.importExcel(request, response, EamEquipmentTransfer.class);
-  }
+    /**
+     * 娣诲姞
+     *
+     * @param request
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-娣诲姞")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-娣诲姞", notes = "璁惧褰掑睘鍙樺姩-娣诲姞")
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody EamEquipmentTransfer request) {
+        if (request == null) {
+            return Result.error("娣诲姞鐨勫璞′笉鑳戒负绌猴紒");
+        }
+        request.setCode(businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.TRANSFER_CODE_RULE));
+        request.setTransferStatus(EquipmentTransferStatusEnum.WAIT_SUBMIT.name());
+        request.setDelFlag(CommonConstant.DEL_FLAG_0);
+        boolean b = eamEquipmentTransferService.addTransfer(request);
+        if (!b) {
+            return Result.error("娣诲姞澶辫触锛�");
+        }
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
 
+    /**
+     * 缂栬緫
+     *
+     * @param request
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-缂栬緫")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-缂栬緫", notes = "璁惧褰掑睘鍙樺姩-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> edit(@RequestBody EamEquipmentTransfer request) {
+        if (request == null) {
+            return Result.error("缂栬緫鐨勫璞′笉鑳戒负绌猴紒");
+        }
+        boolean b = eamEquipmentTransferService.editTransfer(request);
+        if (!b) {
+            return Result.error("缂栬緫澶辫触锛�");
+        }
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎", notes = "璁惧褰掑睘鍙樺姩-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        EamEquipmentTransfer entity = eamEquipmentTransferService.getById(id);
+        if (entity != null) {
+            entity.setDelFlag(CommonConstant.DEL_FLAG_1);
+            eamEquipmentTransferService.updateById(entity);
+        }
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎", notes = "璁惧褰掑睘鍙樺姩-鎵归噺鍒犻櫎")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.eamEquipmentTransferService.removeByIds(Arrays.asList(ids.split(",")));
+        List<String> list = Arrays.asList(ids.split(","));
+        list.forEach(id -> {
+            EamEquipmentTransfer entity = eamEquipmentTransferService.getById(id);
+            if (entity != null) {
+                entity.setDelFlag(CommonConstant.DEL_FLAG_1);
+                eamEquipmentTransferService.updateById(entity);
+            }
+        });
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ", notes = "璁惧褰掑睘鍙樺姩-閫氳繃id鏌ヨ")
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        EamEquipmentTransfer equipmentTransfer = eamEquipmentTransferService.getById(id);
+        if (equipmentTransfer == null) {
+            return Result.error("鏈壘鍒板搴旀暟鎹�");
+        }
+        try {
+            String json = objectMapper.writeValueAsString(equipmentTransfer);
+            JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
+            translateDictTextUtils.translateField("reportUser", equipmentTransfer.getReportUser(), item, "sys_user,realname,username");
+            translateDictTextUtils.translateField("newDepartId", equipmentTransfer.getNewDepartId(), item, "mdc_production,production_name,id");
+            translateDictTextUtils.translateField("oldDepartId", equipmentTransfer.getOldDepartId(), item, "mdc_production,production_name,id");
+            return Result.OK(item);
+        } catch (JsonProcessingException e) {
+            return Result.error("鏁版嵁杞瘧澶辫触锛�");
+        }
+    }
+
+    /**
+     * 鎻愪氦
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-鎻愪氦")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-鎻愪氦", notes = "璁惧褰掑睘鍙樺姩-鎻愪氦")
+    @GetMapping(value = "/submit")
+    public Result<?> submit(@RequestParam(name = "id", required = true) String id) {
+        boolean b = eamEquipmentTransferService.submit(id);
+        if (!b) {
+            return Result.error("鎿嶄綔澶辫触锛�");
+        }
+        return Result.OK("鎿嶄綔鎴愬姛!");
+    }
+
+    /**
+     * 瀹℃壒娴�
+     *
+     * @param request
+     * @return
+     */
+    @AutoLog(value = "璁惧褰掑睘鍙樺姩-瀹℃壒娴�")
+    @ApiOperation(value = "璁惧褰掑睘鍙樺姩-瀹℃壒娴�", notes = "璁惧褰掑睘鍙樺姩-瀹℃壒娴�")
+    @RequestMapping(value = "/approval", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> approval(@RequestBody EamEquipmentTransferRequest request) {
+        if (request == null) {
+            return Result.error("娣诲姞鐨勫璞′笉鑳戒负绌猴紒");
+        }
+        EamEquipmentTransfer entity = eamEquipmentTransferService.approval(request);
+        if (entity == null) {
+            return Result.error("鎿嶄綔澶辫触锛�");
+        }
+        return Result.OK("鎿嶄綔鎴愬姛!");
+    }
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentSealUp.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentSealUp.java
index 5c78c33..9f91cce 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentSealUp.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentSealUp.java
@@ -16,91 +16,173 @@
 
 import java.io.Serializable;
 import java.util.Date;
+
 /**
  * @Description: 璁惧灏佸瓨鍚皝
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 @Data
 @TableName("eam_equipment_seal_up")
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-@ApiModel(value="eam_equipment_seal_up瀵硅薄", description="璁惧灏佸瓨鍚皝")
+@ApiModel(value = "eam_equipment_seal_up瀵硅薄", description = "璁惧灏佸瓨鍚皝")
 public class EamEquipmentSealUp implements Serializable {
-    
-	/**涓婚敭*/
-	@TableId(type = IdType.ASSIGN_ID)
-    @ApiModelProperty(value = "涓婚敭")
-	private String id;
-	/**鍒涘缓浜�*/
-	@Excel(name = "鍒涘缓浜�", width = 15)
-    @ApiModelProperty(value = "鍒涘缓浜�")
-	private String createBy;
-	/**鍒涘缓鏃堕棿*/
-    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-	private Date createTime;
-	/**鏇存柊浜�*/
-	@Excel(name = "鏇存柊浜�", width = 15)
-    @ApiModelProperty(value = "鏇存柊浜�")
-	private String updateBy;
-	/**鏇存柊鏃堕棿*/
-    @ApiModelProperty(value = "鏇存柊鏃堕棿")
-	private Date updateTime;
-	/**鍒犻櫎鏍囪*/
-	@Excel(name = "鍒犻櫎鏍囪", width = 15)
-    @ApiModelProperty(value = "鍒犻櫎鏍囪")
-	private Integer delFlag;
-	/**璁惧ID*/
-	@Excel(name = "璁惧ID", width = 15)
-    @ApiModelProperty(value = "璁惧ID")
-	private String equipmentId;
-	/**鍗曟嵁鍙�*/
-	@Excel(name = "鍗曟嵁鍙�", width = 15)
-    @ApiModelProperty(value = "鍗曟嵁鍙�")
-	private String code;
-	/**鐢宠浜�*/
-	@Excel(name = "鐢宠浜�", width = 15)
-    @ApiModelProperty(value = "鐢宠浜�")
-	@Dict(dicCode = "sys_user, realname, username")
-	private String reportUser;
-	/**灏佸瓨寮�濮嬫椂闂�*/
-    @ApiModelProperty(value = "灏佸瓨寮�濮嬫椂闂�")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date sealStartTime;
-	/**灏佸瓨缁撴潫鏃堕棿*/
-    @ApiModelProperty(value = "灏佸瓨缁撴潫鏃堕棿")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date sealEndTime;
-	/**灏佸瓨鍘熷洜*/
-	@Excel(name = "灏佸瓨鍘熷洜", width = 15)
-    @ApiModelProperty(value = "灏佸瓨鍘熷洜")
-	private String sealUpReason;
-	/**灏佸瓨鐘舵��*/
-	@Excel(name = "灏佸瓨鐘舵��", width = 15)
-    @ApiModelProperty(value = "灏佸瓨鐘舵��")
-	@Dict(dicCode = "equipment_seal_up_status")
-	private String sealStatus;
-	/**瀹℃牳浜�*/
-	@Excel(name = "瀹℃牳浜�", width = 15)
-    @ApiModelProperty(value = "瀹℃牳浜�")
-	private String approvalUser;
-	/**瀹℃牳鏃堕棿*/
-    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date approvalTime;
-	/**澶囨敞*/
-	@Excel(name = "澶囨敞", width = 15)
-    @ApiModelProperty(value = "澶囨敞")
-	private String remark;
 
-	//鍒楄〃灞曠ず
-	@TableField(exist = false)
-	private String equipmentCode;
-	@TableField(exist = false)
-	private String equipmentName;
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 鍒涘缓浜�
+     */
+    @Excel(name = "鍒涘缓浜�", width = 15)
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @Excel(name = "鏇存柊浜�", width = 15)
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    private Integer delFlag;
+    /**
+     * 璁惧ID
+     */
+    @Excel(name = "璁惧ID", width = 15)
+    @ApiModelProperty(value = "璁惧ID")
+    private String equipmentId;
+    /**
+     * 鍗曟嵁鍙�
+     */
+    @Excel(name = "鍗曟嵁鍙�", width = 15)
+    @ApiModelProperty(value = "鍗曟嵁鍙�")
+    private String code;
+    /**
+     * 鐢宠浜�
+     */
+    @Excel(name = "鐢宠浜�", width = 15)
+    @ApiModelProperty(value = "鐢宠浜�")
+    @Dict(dicCode = "sys_user, realname, username")
+    private String reportUser;
+    /**
+     * 灏佸瓨寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value = "灏佸瓨寮�濮嬫椂闂�")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date sealStartTime;
+    /**
+     * 灏佸瓨缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value = "灏佸瓨缁撴潫鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date sealEndTime;
+    /**
+     * 灏佸瓨鍘熷洜
+     */
+    @Excel(name = "灏佸瓨鍘熷洜", width = 15)
+    @ApiModelProperty(value = "灏佸瓨鍘熷洜")
+    private String sealUpReason;
+    /**
+     * 灏佸瓨鐘舵��
+     */
+    @Excel(name = "灏佸瓨鐘舵��", width = 15)
+    @ApiModelProperty(value = "灏佸瓨鐘舵��")
+    @Dict(dicCode = "equipment_seal_up_status")
+    private String sealStatus;
+    /**
+     * 瀹℃牳浜�
+     */
+    @Excel(name = "瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    private String approvalUser;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date approvalTime;
+    /**
+     * 澶囨敞
+     */
+    @Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    /**
+     * 瀹℃牳绫诲瀷
+     */
+    @Excel(name = "瀹℃牳绫诲瀷", width = 15)
+    @ApiModelProperty(value = "瀹℃牳绫诲瀷")
+    private String approvalDealType;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @Excel(name = "瀹℃牳鎰忚", width = 15)
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalComment;
+    /**
+     * 鍚皝鐢宠浜�
+     */
+    @Excel(name = "鍚皝鐢宠浜�", width = 15)
+    @ApiModelProperty(value = "鍚皝鐢宠浜�")
+    private String unsealReportUser;
+    /**
+     * 鍚皝鍘熷洜
+     */
+    @Excel(name = "鍚皝鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鍚皝鍘熷洜")
+    private String unsealReason;
+    /**
+     * 鍚皝瀹℃牳浜�
+     */
+    @Excel(name = "鍚皝瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "鍚皝瀹℃牳浜�")
+    private String unsealApprovalUser;
+    /**
+     * 鍚皝瀹℃牳鏃堕棿
+     */
+    @Excel(name = "鍚皝瀹℃牳鏃堕棿", width = 15)
+    @ApiModelProperty(value = "鍚皝瀹℃牳鏃堕棿")
+    private Date unsealApprovalTime;
+    /**
+     * 鍚皝瀹℃牳绫诲瀷
+     */
+    @Excel(name = "鍚皝瀹℃牳绫诲瀷", width = 15)
+    @ApiModelProperty(value = "鍚皝瀹℃牳绫诲瀷")
+    private String unsealApprovalDealType;
+    /**
+     * 鍚皝瀹℃牳鎰忚
+     */
+    @Excel(name = "鍚皝瀹℃牳鎰忚", width = 15)
+    @ApiModelProperty(value = "鍚皝瀹℃牳鎰忚")
+    private String unsealApprovalComment;
+
+
+    //鍒楄〃灞曠ず
+    @TableField(exist = false)
+    private String equipmentCode;
+    @TableField(exist = false)
+    private String equipmentName;
 
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java
index 1415cf9..8fc1465 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentTransfer.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.eam.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -8,85 +9,144 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
 import java.io.Serializable;
 import java.util.Date;
+
 /**
  * @Description: 璁惧褰掑睘鍙樺姩
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 @Data
 @TableName("eam_equipment_transfer")
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-@ApiModel(value="eam_equipment_transfer瀵硅薄", description="璁惧褰掑睘鍙樺姩")
+@ApiModel(value = "eam_equipment_transfer瀵硅薄", description = "璁惧褰掑睘鍙樺姩")
 public class EamEquipmentTransfer implements Serializable {
-    
-	/**涓婚敭*/
-	@TableId(type = IdType.ASSIGN_ID)
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "涓婚敭")
-	private String id;
-	/**鍒涘缓浜�*/
-	@Excel(name = "鍒涘缓浜�", width = 15)
+    private String id;
+    /**
+     * 鍒涘缓浜�
+     */
+    @Excel(name = "鍒涘缓浜�", width = 15)
     @ApiModelProperty(value = "鍒涘缓浜�")
-	private String createBy;
-	/**鍒涘缓鏃堕棿*/
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-	private Date createTime;
-	/**鏇存柊浜�*/
-	@Excel(name = "鏇存柊浜�", width = 15)
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @Excel(name = "鏇存柊浜�", width = 15)
     @ApiModelProperty(value = "鏇存柊浜�")
-	private String updateBy;
-	/**鏇存柊鏃堕棿*/
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-	private Date updateTime;
-	/**鍒犻櫎鏍囪*/
-	@Excel(name = "鍒犻櫎鏍囪", width = 15)
+    private Date updateTime;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
     @ApiModelProperty(value = "鍒犻櫎鏍囪")
-	private Integer delFlag;
-	/**鍗曟嵁鍙�*/
-	@Excel(name = "鍗曟嵁鍙�", width = 15)
+    private Integer delFlag;
+    /**
+     * 鍗曟嵁鍙�
+     */
+    @Excel(name = "鍗曟嵁鍙�", width = 15)
     @ApiModelProperty(value = "鍗曟嵁鍙�")
-	private String code;
-	/**璁惧ID*/
-	@Excel(name = "璁惧ID", width = 15)
+    private String code;
+    /**
+     * 璁惧ID
+     */
+    @Excel(name = "璁惧ID", width = 15)
     @ApiModelProperty(value = "璁惧ID")
-	private String equipmentId;
-	/**璋冨嚭閮ㄩ棬*/
-	@Excel(name = "璋冨嚭閮ㄩ棬", width = 15)
+    private String equipmentId;
+    /**
+     * 璋冨嚭閮ㄩ棬
+     */
+    @Excel(name = "璋冨嚭閮ㄩ棬", width = 15)
     @ApiModelProperty(value = "璋冨嚭閮ㄩ棬")
-	private String oldDepartId;
-	/**璋冨叆閮ㄩ棬*/
-	@Excel(name = "璋冨叆閮ㄩ棬", width = 15)
+    @Dict(dicCode = "mdc_production, production_name, id")
+    private String oldDepartId;
+    /**
+     * 璋冨叆閮ㄩ棬
+     */
+    @Excel(name = "璋冨叆閮ㄩ棬", width = 15)
     @ApiModelProperty(value = "璋冨叆閮ㄩ棬")
-	private String newDepartId;
-	/**鐢宠浜�*/
-	@Excel(name = "鐢宠浜�", width = 15)
+    @Dict(dicCode = "mdc_production, production_name, id")
+    private String newDepartId;
+    /**
+     * 鐢宠浜�
+     */
+    @Excel(name = "鐢宠浜�", width = 15)
     @ApiModelProperty(value = "鐢宠浜�")
-	private String reportUser;
-	/**鍙樺姩鍘熷洜*/
-	@Excel(name = "鍙樺姩鍘熷洜", width = 15)
+    @Dict(dicCode = "sys_user, realname, username")
+    private String reportUser;
+    /**
+     * 鍙樺姩鍘熷洜
+     */
+    @Excel(name = "鍙樺姩鍘熷洜", width = 15)
     @ApiModelProperty(value = "鍙樺姩鍘熷洜")
-	private String transferReason;
-	/**鍙樺姩鐘舵��*/
-	@Excel(name = "鍙樺姩鐘舵��", width = 15)
+    private String transferReason;
+    /**
+     * 鍙樺姩鐘舵��
+     */
+    @Excel(name = "鍙樺姩鐘舵��", width = 15)
     @ApiModelProperty(value = "鍙樺姩鐘舵��")
-	private String transferStatus;
-	/**鍙樺姩鏃ユ湡*/
+    @Dict(dicCode = "equipment_transfer_status")
+    private String transferStatus;
+    /**
+     * 鍙樺姩鏃ユ湡
+     */
     @ApiModelProperty(value = "鍙樺姩鏃ユ湡")
-	private Date transferTime;
-	/**瀹℃牳浜�*/
-	@Excel(name = "瀹℃牳浜�", width = 15)
+    private Date transferTime;
+    /**
+     * 瀹℃牳浜�
+     */
+    @Excel(name = "瀹℃牳浜�", width = 15)
     @ApiModelProperty(value = "瀹℃牳浜�")
-	private String approvalUser;
-	/**瀹℃牳鏃堕棿*/
+    @Dict(dicCode = "sys_user, realname, username")
+    private String approvalUser;
+    /**
+     * 瀹℃牳绫诲瀷
+     */
+    @ApiModelProperty(value = "瀹℃牳绫诲瀷")
+    @Dict(dicCode = "approved_rejected")
+    private String approvalDealType;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalComment;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
     @ApiModelProperty(value = "瀹℃牳鏃堕棿")
-	private Date approvalTime;
-	/**澶囨敞*/
-	@Excel(name = "澶囨敞", width = 15)
+    private Date approvalTime;
+    /**
+     * 澶囨敞
+     */
+    @Excel(name = "澶囨敞", width = 15)
     @ApiModelProperty(value = "澶囨敞")
-	private String remark;
+    private String remark;
+
+    //鍒楄〃灞曠ず
+    @TableField(exist = false)
+    private String equipmentCode;
+    @TableField(exist = false)
+    private String equipmentName;
+
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentTransferMapper.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentTransferMapper.java
index 81cf478..a009088 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentTransferMapper.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentTransferMapper.java
@@ -1,17 +1,27 @@
 package org.jeecg.modules.eam.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
  * @Description: 璁惧褰掑睘鍙樺姩
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 public interface EamEquipmentTransferMapper extends BaseMapper<EamEquipmentTransfer> {
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<EamEquipmentTransfer> queryPageList(Page<EamEquipmentTransfer> page, @Param(Constants.WRAPPER) QueryWrapper<EamEquipmentTransfer> queryWrapper);
 
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentTransferMapper.xml b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentTransferMapper.xml
index 7262154..5777d9c 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentTransferMapper.xml
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentTransferMapper.xml
@@ -2,4 +2,11 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.eam.mapper.EamEquipmentTransferMapper">
 
+    <select id="queryPageList" resultType="org.jeecg.modules.eam.entity.EamEquipmentTransfer">
+        select wmo.*, e.equipment_code, e.equipment_name
+        from eam_equipment_transfer wmo
+                 inner join eam_equipment e
+                            on wmo.equipment_id = e.id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentSealUpRequest.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentSealUpRequest.java
index 33700de..f24336a 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentSealUpRequest.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentSealUpRequest.java
@@ -1,17 +1,12 @@
 package org.jeecg.modules.eam.request;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
-import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
@@ -20,67 +15,146 @@
 /**
  * @Description: 璁惧灏佸瓨鍚皝
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class EamEquipmentSealUpRequest extends FlowTaskVo implements Serializable {
-    
-	/**涓婚敭*/
+
+    /**
+     * 涓婚敭
+     */
     @ApiModelProperty(value = "涓婚敭")
-	private String id;
-	/**鍒涘缓浜�*/
+    private String id;
+    /**
+     * 鍒涘缓浜�
+     */
     @ApiModelProperty(value = "鍒涘缓浜�")
-	private String createBy;
-	/**鍒涘缓鏃堕棿*/
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-	private Date createTime;
-	/**鏇存柊浜�*/
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
     @ApiModelProperty(value = "鏇存柊浜�")
-	private String updateBy;
-	/**鏇存柊鏃堕棿*/
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-	private Date updateTime;
-	/**鍒犻櫎鏍囪*/
+    private Date updateTime;
+    /**
+     * 鍒犻櫎鏍囪
+     */
     @ApiModelProperty(value = "鍒犻櫎鏍囪")
-	private Integer delFlag;
-	/**璁惧ID*/
+    private Integer delFlag;
+    /**
+     * 璁惧ID
+     */
     @ApiModelProperty(value = "璁惧ID")
-	private String equipmentId;
-	/**鍗曟嵁鍙�*/
+    private String equipmentId;
+    /**
+     * 鍗曟嵁鍙�
+     */
     @ApiModelProperty(value = "鍗曟嵁鍙�")
-	private String code;
-	/**鐢宠浜�*/
+    private String code;
+    /**
+     * 鐢宠浜�
+     */
     @ApiModelProperty(value = "鐢宠浜�")
-	private String reportUser;
-	/**灏佸瓨寮�濮嬫椂闂�*/
+    private String reportUser;
+    /**
+     * 灏佸瓨寮�濮嬫椂闂�
+     */
     @ApiModelProperty(value = "灏佸瓨寮�濮嬫椂闂�")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date sealStartTime;
-	/**灏佸瓨缁撴潫鏃堕棿*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date sealStartTime;
+    /**
+     * 灏佸瓨缁撴潫鏃堕棿
+     */
     @ApiModelProperty(value = "灏佸瓨缁撴潫鏃堕棿")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date sealEndTime;
-	/**灏佸瓨鍘熷洜*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date sealEndTime;
+    /**
+     * 灏佸瓨鍘熷洜
+     */
     @ApiModelProperty(value = "灏佸瓨鍘熷洜")
-	private String sealUpReason;
-	/**灏佸瓨鐘舵��*/
+    private String sealUpReason;
+    /**
+     * 灏佸瓨鐘舵��
+     */
     @ApiModelProperty(value = "灏佸瓨鐘舵��")
-	@Dict(dicCode = "equipment_seal_up_status")
-	private String sealStatus;
-	/**瀹℃牳浜�*/
+    @Dict(dicCode = "equipment_seal_up_status")
+    private String sealStatus;
+    /**
+     * 瀹℃牳浜�
+     */
     @ApiModelProperty(value = "瀹℃牳浜�")
-	private String approvalUser;
-	/**瀹℃牳鏃堕棿*/
+    private String approvalUser;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
     @ApiModelProperty(value = "瀹℃牳鏃堕棿")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-	private Date approvalTime;
-	/**澶囨敞*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date approvalTime;
+    /**
+     * 澶囨敞
+     */
     @ApiModelProperty(value = "澶囨敞")
-	private String remark;
+    private String remark;
+
+    /**
+     * 瀹℃牳绫诲瀷
+     */
+    @ApiModelProperty(value = "瀹℃牳绫诲瀷")
+    @Dict(dicCode = "approved_rejected")
+    private String approvalDealType;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalComment;
+    /**
+     * 鍚皝鐢宠浜�
+     */
+    @ApiModelProperty(value = "鍚皝鐢宠浜�")
+    private String unsealReportUser;
+    /**
+     * 鍚皝鍘熷洜
+     */
+    @ApiModelProperty(value = "鍚皝鍘熷洜")
+    private String unsealReason;
+    /**
+     * 鍚皝瀹℃牳浜�
+     */
+    @ApiModelProperty(value = "鍚皝瀹℃牳浜�")
+    private String unsealApprovalUser;
+    /**
+     * 鍚皝瀹℃牳鏃堕棿
+     */
+    @ApiModelProperty(value = "鍚皝瀹℃牳鏃堕棿")
+    private Date unsealApprovalTime;
+    /**
+     * 鍚皝瀹℃牳绫诲瀷
+     */
+    @ApiModelProperty(value = "鍚皝瀹℃牳绫诲瀷")
+    @Dict(dicCode = "approved_rejected")
+    private String unsealApprovalDealType;
+    /**
+     * 鍚皝瀹℃牳鎰忚
+     */
+    @ApiModelProperty(value = "鍚皝瀹℃牳鎰忚")
+    private String unsealApprovalComment;
+
+    //鍒楄〃灞曠ず
+    private String equipmentCode;
+    private String equipmentName;
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferQuery.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferQuery.java
new file mode 100644
index 0000000..8038f71
--- /dev/null
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferQuery.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.eam.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class EamEquipmentTransferQuery {
+    private String code;
+    private String equipmentId;
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date leanDateBegin;
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date leanDateEnd;
+    private String sealStatus;
+
+    private String column;
+    private String order;
+}
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferRequest.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferRequest.java
new file mode 100644
index 0000000..612227e
--- /dev/null
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentTransferRequest.java
@@ -0,0 +1,126 @@
+package org.jeecg.modules.eam.request;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 璁惧褰掑睘鍙樺姩
+ * @Author: jeecg-boot
+ * @Date: 2025-05-13
+ * @Version: V1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class EamEquipmentTransferRequest extends FlowTaskVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    private Integer delFlag;
+    /**
+     * 鍗曟嵁鍙�
+     */
+    @ApiModelProperty(value = "鍗曟嵁鍙�")
+    private String code;
+    /**
+     * 璁惧ID
+     */
+    @ApiModelProperty(value = "璁惧ID")
+    private String equipmentId;
+    /**
+     * 璋冨嚭閮ㄩ棬
+     */
+    @ApiModelProperty(value = "璋冨嚭閮ㄩ棬")
+    private String oldDepartId;
+    /**
+     * 璋冨叆閮ㄩ棬
+     */
+    @ApiModelProperty(value = "璋冨叆閮ㄩ棬")
+    private String newDepartId;
+    /**
+     * 鐢宠浜�
+     */
+    @ApiModelProperty(value = "鐢宠浜�")
+    private String reportUser;
+    /**
+     * 鍙樺姩鍘熷洜
+     */
+    @ApiModelProperty(value = "鍙樺姩鍘熷洜")
+    private String transferReason;
+    /**
+     * 鍙樺姩鐘舵��
+     */
+    @ApiModelProperty(value = "鍙樺姩鐘舵��")
+    private String transferStatus;
+    /**
+     * 鍙樺姩鏃ユ湡
+     */
+    @ApiModelProperty(value = "鍙樺姩鏃ユ湡")
+    private Date transferTime;
+    /**
+     * 瀹℃牳浜�
+     */
+    @Excel(name = "瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    private String approvalUser;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    private Date approvalTime;
+    /**
+     * 瀹℃牳绫诲瀷
+     */
+    @Excel(name = "瀹℃牳绫诲瀷", width = 15)
+    @ApiModelProperty(value = "瀹℃牳绫诲瀷")
+    private String approvalDealType;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalComment;
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    //鍒楄〃灞曠ず
+    @TableField(exist = false)
+    private String equipmentCode;
+    @TableField(exist = false)
+    private String equipmentName;
+
+}
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentSealUpService.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentSealUpService.java
index fcf8915..dc0edca 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentSealUpService.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentSealUpService.java
@@ -41,6 +41,14 @@
     boolean editSealUp(EamEquipmentSealUp request);
 
     /**
+     * 鍚皝鐢宠
+     *
+     * @param id
+     * @return
+     */
+    boolean unseal(String id);
+
+    /**
      * 鎻愪氦鐢宠
      *
      * @param id
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentTransferService.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentTransferService.java
index 6659b86..beecfed 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentTransferService.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentTransferService.java
@@ -1,14 +1,59 @@
 package org.jeecg.modules.eam.service;
 
-import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
+import org.jeecg.modules.eam.request.EamEquipmentTransferQuery;
+import org.jeecg.modules.eam.request.EamEquipmentTransferRequest;
 
 /**
  * @Description: 璁惧褰掑睘鍙樺姩
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
 public interface IEamEquipmentTransferService extends IService<EamEquipmentTransfer> {
 
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<EamEquipmentTransfer> queryPageList(Page<EamEquipmentTransfer> page, EamEquipmentTransferQuery query);
+
+    /**
+     * 娣诲姞灏佸瓨璁板綍
+     *
+     * @param request
+     * @return
+     */
+    boolean addTransfer(EamEquipmentTransfer request);
+
+    /**
+     * 鎻愪氦鐢宠
+     *
+     * @param id
+     * @return
+     */
+    boolean submit(String id);
+
+    /**
+     * 瀹℃壒娴佺▼鎺у埗
+     *
+     * @param request
+     * @return
+     */
+    EamEquipmentTransfer approval(EamEquipmentTransferRequest request);
+
+    /**
+     * 缂栬緫
+     *
+     * @param request
+     * @return
+     */
+    boolean editTransfer(EamEquipmentTransfer request);
+
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java
index 494fba5..c36f796 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java
@@ -301,6 +301,9 @@
                 } else {
                     //璁剧疆entity
                     entity.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
+                    // 淇敼璁惧鐘舵��
+                    equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
+                    eamEquipmentService.updateById(equipment);
                 }
                 break;
             // 褰掕繕
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentSealUpServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentSealUpServiceImpl.java
index 90afff0..b02edfc 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentSealUpServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentSealUpServiceImpl.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -10,6 +11,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.constant.DataBaseConstant;
@@ -18,7 +20,6 @@
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.eam.constant.AssetStatusEnum;
 import org.jeecg.modules.eam.constant.BusinessCodeConst;
-import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
 import org.jeecg.modules.eam.constant.EquipmentSealUpStatusEnum;
 import org.jeecg.modules.eam.entity.EamEquipment;
 import org.jeecg.modules.eam.entity.EamEquipmentSealUp;
@@ -121,7 +122,6 @@
         } else {
             queryWrapper.orderByDesc("wmo.create_time");
         }
-
         return equipmentSealUpMapper.queryPageList(page, queryWrapper);
     }
 
@@ -174,12 +174,57 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public boolean unseal(String id) {
+        EamEquipmentSealUp entity = equipmentSealUpMapper.selectById(id);
+        if (entity == null) {
+            throw new JeecgBootException("瑕佹彁浜ょ殑鏁版嵁涓嶅瓨鍦紝璇峰埛鏂伴噸璇曪紒");
+        }
+        if (!EquipmentSealUpStatusEnum.SEALED.name().equals(entity.getSealStatus())) {
+            throw new JeecgBootException("褰撳墠鏁版嵁鐘舵�佷笉鍏佽缂栬緫锛�");
+        }
+        //妫�鏌ヨ澶�
+        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紒");
+        }
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser == null) {
+            throw new JeecgBootException("褰撳墠鐢ㄦ埛鏃犳硶缂栬緫灏佸瓨璁板綍锛�");
+        }
+        //鍚姩瀹℃壒娴佺▼
+        flowCommonService.initActBusiness("宸ュ崟鍙�:" + entity.getCode() + ";璁惧缂栧彿: " + equipment.getEquipmentCode() + ";杩涜璁惧鍚皝",
+                entity.getId(), "IEamEquipmentSealUpService", "equipment_unseal", null);
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("dataId", entity.getId());
+        variables.put("organization", "鏂板鍚皝榛樿鍚姩娴佺▼");
+        variables.put("comment", "鏂板鍚皝榛樿鍚姩娴佺▼");
+        variables.put("proofreading", true);
+        // 鍒嗛厤缁欒澶囩鐞嗗憳
+        List<UserSelector> userSelectors = sysUserService.selectOperatorList(equipment.getEquipmentCode(), equipment.getOrgId(), BusinessCodeConst.PCR0004);
+        if (CollectionUtil.isEmpty(userSelectors)) {
+            throw new JeecgBootException("璁惧鏈垎閰嶇粰璁惧绠$悊鍛橈紝鏃犳硶杩涘叆涓嬬骇瀹℃壒锛�");
+        }
+        List<String> usernames = userSelectors.stream().map(UserSelector::getUsername).collect(Collectors.toList());
+        variables.put("NextAssignee", usernames);
+        Result result = flowDefinitionService.startProcessInstanceByKey("equipment_unseal", variables);
+        if (result != null) {
+            entity.setSealEndTime(new Date());
+            entity.setSealStatus(EquipmentSealUpStatusEnum.WAIT_UNSEALING_AUDIT.name());
+            //淇濆瓨宸ュ崟
+            equipmentSealUpMapper.updateById(entity);
+            return result.isSuccess();
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean submit(String id) {
         EamEquipmentSealUp entity = equipmentSealUpMapper.selectById(id);
         if (entity == null) {
             throw new JeecgBootException("瑕佹彁浜ょ殑鏁版嵁涓嶅瓨鍦紝璇峰埛鏂伴噸璇曪紒");
         }
-        if (!EquipmentLeanOutStatusEnum.WAIT_SUBMIT.name().equals(entity.getSealStatus())) {
+        if (!EquipmentSealUpStatusEnum.WAIT_SUBMIT.name().equals(entity.getSealStatus())) {
             throw new JeecgBootException("褰撳墠鏁版嵁鐘舵�佷笉鍏佽缂栬緫锛�");
         }
         //妫�鏌ヨ澶�
@@ -234,7 +279,128 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public EamEquipmentSealUp approval(EamEquipmentSealUpRequest request) {
-        return null;
+        EamEquipmentSealUp entity = equipmentSealUpMapper.selectById(request.getId());
+        if (entity == null) {
+            throw new JeecgBootException("瀹℃壒鐨勬暟鎹凡鍒犻櫎锛岃鍒锋柊閲嶈瘯锛�");
+        }
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("鏈幏鍙栧埌鐧诲綍鐢ㄦ埛锛岃閲嶆柊鐧诲綍鍚庡啀璇曪紒");
+        }
+        request.setApprovalUser(user.getUsername());
+        // 鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(request.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼瀹炰緥涓嶅瓨鍦紝璇峰埛鏂板悗閲嶈瘯锛�");
+        }
+
+        boolean userAuthorized = isUserAuthorized(flowMyBusiness, user);
+        if (!userAuthorized) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔★紝璇峰埛鏂板悗閲嶈瘯锛�");
+        }
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰嗭紒");
+        }
+
+        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紝璇锋鏌ワ紒");
+        }
+
+        EquipmentSealUpStatusEnum status = EquipmentSealUpStatusEnum.getInstance(entity.getSealStatus());
+        if (status == null) {
+            return null;
+        }
+        //娴佺▼鍙橀噺
+        Map<String, Object> values = new HashMap<>();
+        switch (status) {
+            // 瀹℃壒
+            case WAIT_CHECK:
+                //鎵ц瀹屾垚
+                values.put("dataId", entity.getId());
+                values.put("organization", request.getApprovalComment());
+                values.put("comment", request.getApprovalComment());
+                values.put("approvalDealType", request.getApprovalDealType());
+                request.setComment(request.getApprovalComment());
+                entity.setApprovalUser(user.getUsername());// 瀹℃牳浜�
+                entity.setApprovalComment(request.getApprovalComment());// 瀹℃牳鎰忚
+                entity.setApprovalTime(new Date());// 瀹℃牳鏃堕棿
+                entity.setApprovalDealType(request.getApprovalDealType()); // 瀹℃壒绫诲瀷
+                // 楠岃瘉閫氳繃杩樻槸椹冲洖
+                if (request.getApprovalDealType().equals("1")) {
+                    //璁剧疆entity
+                    entity.setSealStatus(EquipmentSealUpStatusEnum.SEALED.name());
+                    List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getReportUser()));
+                    values.put("NextAssignee", userApprovalList);
+                } else {
+                    //璁剧疆entity
+                    entity.setSealStatus(EquipmentSealUpStatusEnum.WAIT_SUBMIT.name());
+                    // 淇敼璁惧鐘舵��
+                    equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
+                    eamEquipmentService.updateById(equipment);
+                }
+                break;
+            // 宸插皝瀛�
+            case WAIT_UNSEALING_AUDIT:
+                values.put("dataId", entity.getId());
+                values.put("organization", request.getUnsealApprovalComment());
+                values.put("comment", request.getUnsealApprovalComment());
+                request.setComment(request.getUnsealApprovalComment());
+                // 楠岃瘉閫氳繃杩樻槸椹冲洖
+                if (request.getUnsealApprovalDealType().equals("1")) {
+                    //璁剧疆entity
+                    entity.setSealStatus(EquipmentSealUpStatusEnum.COMPLETE.name());
+                    // 淇敼璁惧鐘舵��
+                    equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
+                } else {
+                    //璁剧疆entity
+                    entity.setSealStatus(EquipmentSealUpStatusEnum.SEALED.name());
+                    entity.setSealEndTime(null);
+                }
+                entity.setUnsealApprovalUser(user.getUsername());
+                entity.setUnsealApprovalComment(request.getUnsealApprovalComment());
+                entity.setUnsealApprovalTime(new Date());
+                // 淇敼璁惧鐘舵��
+                equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
+                eamEquipmentService.updateById(equipment);
+                break;
+        }
+        request.setValues(values);
+
+        // 瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(request);
+        if (!result.isSuccess()) {
+            throw new JeecgBootException("瀹℃壒澶辫触锛岃鍒锋柊鏌ョ湅锛�");
+        }
+        //淇濆瓨宸ュ崟
+        equipmentSealUpMapper.updateById(entity);
+        return entity;
+    }
+
+    /**
+     * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁姝ゆ潈闄�
+     *
+     * @param flowMyBusiness
+     * @param user
+     * @return
+     */
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
     }
 
     @Override
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentTransferServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentTransferServiceImpl.java
index 1eb1313..de1b2b1 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentTransferServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentTransferServiceImpl.java
@@ -1,19 +1,361 @@
 package org.jeecg.modules.eam.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.constant.DataBaseConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.eam.aspect.annotation.EquipmentHistoryLog;
+import org.jeecg.modules.eam.constant.*;
+import org.jeecg.modules.eam.entity.EamEquipment;
 import org.jeecg.modules.eam.entity.EamEquipmentTransfer;
 import org.jeecg.modules.eam.mapper.EamEquipmentTransferMapper;
+import org.jeecg.modules.eam.request.EamEquipmentTransferQuery;
+import org.jeecg.modules.eam.request.EamEquipmentTransferRequest;
+import org.jeecg.modules.eam.service.IEamEquipmentService;
 import org.jeecg.modules.eam.service.IEamEquipmentTransferService;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.vo.UserSelector;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 璁惧褰掑睘鍙樺姩
  * @Author: jeecg-boot
- * @Date:   2025-05-13
+ * @Date: 2025-05-13
  * @Version: V1.0
  */
-@Service
-public class EamEquipmentTransferServiceImpl extends ServiceImpl<EamEquipmentTransferMapper, EamEquipmentTransfer> implements IEamEquipmentTransferService {
+@Service("IEamEquipmentTransferService")
+public class EamEquipmentTransferServiceImpl extends ServiceImpl<EamEquipmentTransferMapper, EamEquipmentTransfer> implements IEamEquipmentTransferService, FlowCallBackServiceI {
 
+
+    @Resource
+    private EamEquipmentTransferMapper equipmentTransferMapper;
+    @Autowired
+    private IEamEquipmentService eamEquipmentService;
+    @Autowired
+    private FlowCommonService flowCommonService;
+    @Autowired
+    private IFlowDefinitionService flowDefinitionService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private IFlowTaskService flowTaskService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Override
+    public IPage<EamEquipmentTransfer> queryPageList(Page<EamEquipmentTransfer> page, EamEquipmentTransferQuery query) {
+        QueryWrapper<EamEquipmentTransfer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("wmo.del_flag", CommonConstant.DEL_FLAG_0);
+        //鐢ㄦ埛鏁版嵁鏉冮檺
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser == null) {
+            return page;
+        }
+        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
+            //閫夋嫨浜嗚澶囷紝鏍规嵁璁惧id杩囨护璁惧
+            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
+            queryWrapper.in("e.equipment_code", equipArr);
+        } else {
+            //娌℃湁閫夋嫨璁惧锛屾牴鎹溅闂磋繃婊よ澶�
+            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id ", sysUser.getId());
+        }
+        //鎺у埗寰呮彁浜ょ姸鎬佺殑鏁版嵁鍙兘鏈汉鏌ョ湅
+        queryWrapper.and(i -> i.ne("wmo.transfer_status", EquipmentTransferStatusEnum.WAIT_SUBMIT).or().eq("wmo.report_user", sysUser.getUsername()));
+        //鏌ヨ鏉′欢杩囨护
+        if (query != null) {
+            if (StringUtils.isNotBlank(query.getEquipmentId())) {
+                queryWrapper.eq("wmo.equipment_id", query.getEquipmentId());
+            }
+            if (StringUtils.isNotBlank(query.getCode())) {
+                queryWrapper.like("wmo.code", query.getCode());
+            }
+            if (StringUtils.isNotBlank(query.getSealStatus())) {
+                queryWrapper.eq("wmo.transfer_status", query.getSealStatus());
+            }
+            if (query.getLeanDateBegin() != null && query.getLeanDateEnd() != null) {
+                queryWrapper.between("wmo.lean_start_time", query.getLeanDateBegin(), query.getLeanDateEnd());
+            }
+            //鎺掑簭
+            if (StringUtils.isNotBlank(query.getColumn()) && StringUtils.isNotBlank(query.getOrder())) {
+                String column = query.getColumn();
+                if (column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
+                    column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
+                }
+                if (DataBaseConstant.SQL_ASC.equalsIgnoreCase(query.getOrder())) {
+                    queryWrapper.orderByAsc("wmo." + oConvertUtils.camelToUnderline(column));
+                } else {
+                    queryWrapper.orderByDesc("wmo." + oConvertUtils.camelToUnderline(column));
+                }
+            } else {
+                queryWrapper.orderByDesc("wmo.create_time");
+            }
+        } else {
+            queryWrapper.orderByDesc("wmo.create_time");
+        }
+
+        return equipmentTransferMapper.queryPageList(page, queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addTransfer(EamEquipmentTransfer request) {
+        //妫�鏌ヨ澶�
+        EamEquipment equipment = eamEquipmentService.getById(request.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紒");
+        }
+        if (!AssetStatusEnum.NORMAL.name().equals(equipment.getAssetStatus())) {
+            throw new JeecgBootException("姝よ澶囧綋鍓嶈祫浜х姸鎬佷笉鍏佽鍊熷嚭锛�");
+        }
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser == null) {
+            throw new JeecgBootException("褰撳墠鐢ㄦ埛鏃犳硶娣诲姞鍊熺敤璁板綍锛�");
+        }
+        if (equipment.getOrgId().equals(request.getNewDepartId())) {
+            throw new JeecgBootException("褰撳墠璁惧灞炰簬姝よ溅闂达紝涓嶉渶瑕佸彉鍔紒");
+        }
+        request.setOldDepartId(equipment.getOrgId());
+        request.setReportUser(sysUser.getUsername());
+        return equipmentTransferMapper.insert(request) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submit(String id) {
+        EamEquipmentTransfer entity = equipmentTransferMapper.selectById(id);
+        if (entity == null) {
+            throw new JeecgBootException("瑕佹彁浜ょ殑鏁版嵁涓嶅瓨鍦紝璇峰埛鏂伴噸璇曪紒");
+        }
+        if (!EquipmentTransferStatusEnum.WAIT_SUBMIT.name().equals(entity.getTransferStatus())) {
+            throw new JeecgBootException("褰撳墠鏁版嵁鐘舵�佷笉鍏佽缂栬緫锛�");
+        }
+        //妫�鏌ヨ澶�
+        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紒");
+        }
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser == null) {
+            throw new JeecgBootException("褰撳墠鐢ㄦ埛鏃犳硶缂栬緫杞璁板綍锛�");
+        }
+        UpdateWrapper<EamEquipmentTransfer> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("transfer_status", EquipmentSealUpStatusEnum.WAIT_SUBMIT.name());
+        updateWrapper.eq("id", id);
+        updateWrapper.eq("report_user", sysUser.getUsername());
+        boolean success = super.update(updateWrapper);
+        if (success) {
+            equipment.setAssetStatus(AssetStatusEnum.DEALT.name()); // 璁惧杞
+            eamEquipmentService.updateById(equipment);
+        }
+        //鍚姩瀹℃壒娴佺▼
+        flowCommonService.initActBusiness("宸ュ崟鍙�:" + entity.getCode() + ";璁惧缂栧彿: " + equipment.getEquipmentCode() + ";杩涜璁惧杞",
+                entity.getId(), "IEamEquipmentTransferService", "equipment_transfer", null);
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("dataId", entity.getId());
+        variables.put("organization", entity.getTransferReason());
+        variables.put("comment", entity.getTransferReason());
+        variables.put("proofreading", true);
+        // 鍒嗛厤缁欒澶囩鐞嗗憳
+        List<UserSelector> userSelectors = sysUserService.selectOperatorList(equipment.getEquipmentCode(), equipment.getOrgId(), BusinessCodeConst.PCR0004);
+        if (CollectionUtil.isEmpty(userSelectors)) {
+            throw new JeecgBootException("璁惧鏈垎閰嶇粰璁惧绠$悊鍛橈紝鏃犳硶杩涘叆涓嬬骇瀹℃壒锛�");
+        }
+        List<String> usernames = userSelectors.stream().map(UserSelector::getUsername).collect(Collectors.toList());
+        variables.put("NextAssignee", usernames);
+        Result result = flowDefinitionService.startProcessInstanceByKey("equipment_transfer", variables);
+        if (result != null) {
+            entity.setTransferTime(new Date());
+            entity.setTransferStatus(EquipmentTransferStatusEnum.WAIT_CHECK.name());
+            //淇濆瓨宸ュ崟
+            equipmentTransferMapper.updateById(entity);
+            return result.isSuccess();
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @EquipmentHistoryLog(operationTag = EquipmentOperationTagEnum.TRANSFERRED, businessTable = "eam_equipment_transfer")
+    public EamEquipmentTransfer approval(EamEquipmentTransferRequest request) {
+        EamEquipmentTransfer entity = equipmentTransferMapper.selectById(request.getId());
+        if (entity == null) {
+            throw new JeecgBootException("瀹℃壒鐨勬暟鎹凡鍒犻櫎锛岃鍒锋柊閲嶈瘯锛�");
+        }
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("鏈幏鍙栧埌鐧诲綍鐢ㄦ埛锛岃閲嶆柊鐧诲綍鍚庡啀璇曪紒");
+        }
+        request.setApprovalUser(user.getUsername());
+        // 鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(request.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼瀹炰緥涓嶅瓨鍦紝璇峰埛鏂板悗閲嶈瘯锛�");
+        }
+
+        boolean userAuthorized = isUserAuthorized(flowMyBusiness, user);
+        if (!userAuthorized) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔★紝璇峰埛鏂板悗閲嶈瘯锛�");
+        }
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰嗭紒");
+        }
+
+        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紝璇锋鏌ワ紒");
+        }
+
+        EquipmentTransferStatusEnum status = EquipmentTransferStatusEnum.getInstance(entity.getTransferStatus());
+        if (status == null) {
+            return null;
+        }
+        //娴佺▼鍙橀噺
+        Map<String, Object> values = new HashMap<>();
+        // 瀹℃壒
+        if (status == EquipmentTransferStatusEnum.WAIT_CHECK) {//鎵ц瀹屾垚
+            values.put("dataId", entity.getId());
+            values.put("organization", request.getApprovalComment());
+            values.put("comment", request.getApprovalComment());
+            values.put("approvalDealType", request.getApprovalDealType());
+            request.setComment(request.getApprovalComment());
+            entity.setApprovalUser(user.getUsername());// 瀹℃牳浜�
+            entity.setApprovalComment(request.getApprovalComment());// 瀹℃牳鎰忚
+            entity.setApprovalTime(new Date());// 瀹℃牳鏃堕棿
+            entity.setApprovalDealType(request.getApprovalDealType()); // 瀹℃壒绫诲瀷
+            // 楠岃瘉閫氳繃杩樻槸椹冲洖
+            if (request.getApprovalDealType().equals("1")) {
+                //璁剧疆entity
+                entity.setTransferStatus(EquipmentTransferStatusEnum.COMPLETE.name());
+                List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getReportUser()));
+                values.put("NextAssignee", userApprovalList);
+                // 淇敼璁惧鐘舵��
+                equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
+            } else {
+                //璁剧疆entity
+                entity.setTransferStatus(EquipmentTransferStatusEnum.WAIT_SUBMIT.name());
+                // 淇敼璁惧鐘舵��
+            }
+            entity.setApprovalUser(user.getUsername());
+            entity.setApprovalComment(request.getApprovalComment());
+            entity.setApprovalTime(new Date());
+            eamEquipmentService.updateById(equipment);
+        }
+        request.setValues(values);
+
+        // 瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(request);
+        if (!result.isSuccess()) {
+            throw new JeecgBootException("瀹℃壒澶辫触锛岃鍒锋柊鏌ョ湅锛�");
+        }
+        //淇濆瓨宸ュ崟
+        equipmentTransferMapper.updateById(entity);
+        return entity;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean editTransfer(EamEquipmentTransfer request) {
+        EamEquipmentTransfer entity = equipmentTransferMapper.selectById(request.getId());
+        if (entity == null) {
+            throw new JeecgBootException("瑕佺紪杈戠殑鏁版嵁涓嶅瓨鍦紝璇峰埛鏂伴噸璇曪紒");
+        }
+        if (!EquipmentSealUpStatusEnum.WAIT_SUBMIT.name().equals(entity.getTransferStatus())) {
+            throw new JeecgBootException("褰撳墠鏁版嵁鐘舵�佷笉鍏佽缂栬緫锛�");
+        }
+        //妫�鏌ヨ澶�
+        EamEquipment equipment = eamEquipmentService.getById(request.getEquipmentId());
+        if (equipment == null) {
+            throw new JeecgBootException("璁惧涓嶅瓨鍦紒");
+        }
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser == null) {
+            throw new JeecgBootException("褰撳墠鐢ㄦ埛鏃犳硶缂栬緫鍊熺敤璁板綍锛�");
+        }
+        UpdateWrapper<EamEquipmentTransfer> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("equipment_id", request.getEquipmentId());
+        updateWrapper.set("remark", request.getRemark());
+        updateWrapper.set("transfer_reason", request.getTransferReason());
+        updateWrapper.set("old_depart_id", equipment.getOrgId());
+        updateWrapper.set("new_depart_id", request.getNewDepartId());
+        updateWrapper.eq("id", request.getId());
+        updateWrapper.eq("report_user", sysUser.getUsername());
+        return super.update(updateWrapper);
+    }
+
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();//鍓嶇浼犺繘鏉ョ殑鍙傛暟
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    /**
+     * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁姝ゆ潈闄�
+     *
+     * @param flowMyBusiness
+     * @param user
+     * @return
+     */
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
+    }
 }
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/db/tms_2025/tms-init-20250522.sql b/lxzn-module-system/lxzn-system-start/src/main/resources/db/tms_2025/tms-init-20250522.sql
new file mode 100644
index 0000000..47fc1db
--- /dev/null
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/db/tms_2025/tms-init-20250522.sql
@@ -0,0 +1,1240 @@
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tools_classify]') AND type in (N'U')) DROP TABLE [dbo].[tools_classify];
+CREATE TABLE [dbo].[tools_classify](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(255),
+    type_name VARCHAR(128) NOT NULL,
+    parent_id VARCHAR(32) NOT NULL,
+    leaf_flag VARCHAR(6),
+    seq VARCHAR(255),
+    status VARCHAR(6),
+    rank INT NOT NULL,
+    encoding_type VARCHAR(32),
+    para_type_flag VARCHAR(32) NOT NULL,
+    remark VARCHAR(128),
+    tenant_id ,
+    created_by VARCHAR(32),
+    created_time DATE,
+    updated_by VARCHAR(32),
+    updated_time DATE,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被淇℃伅琛�', 'SCHEMA', dbo, 'table', tools_classify, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', tools_classify, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', tools_classify, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '绫诲瀷鍚嶇О', 'SCHEMA', dbo, 'table', tools_classify, 'column', type_name;
+EXEC sp_addextendedproperty 'MS_Description', '鐖剁被鍨嬬紪鍙�', 'SCHEMA', dbo, 'table', tools_classify, 'column', parent_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍙跺瓙鑺傜偣鏍囪;1鏄�2鍚�', 'SCHEMA', dbo, 'table', tools_classify, 'column', leaf_flag;
+EXEC sp_addextendedproperty 'MS_Description', '鏄剧ず搴忓彿', 'SCHEMA', dbo, 'table', tools_classify, 'column', seq;
+EXEC sp_addextendedproperty 'MS_Description', '鐘舵��;1.鍚敤锛�2.鍏抽棴', 'SCHEMA', dbo, 'table', tools_classify, 'column', status;
+EXEC sp_addextendedproperty 'MS_Description', '灞傜骇', 'SCHEMA', dbo, 'table', tools_classify, 'column', rank;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栫爜鏂瑰紡;1.绯荤粺鐢熸垚锛�
+2.鎸夌紪鐮佹嫾鎺ワ紱
+3.鎵嬪伐缂栫爜', 'SCHEMA', dbo, 'table', tools_classify, 'column', encoding_type;
+EXEC sp_addextendedproperty 'MS_Description', '瀵瑰簲鍙傛暟妯℃澘琛ㄥ悕绉�', 'SCHEMA', dbo, 'table', tools_classify, 'column', para_type_flag;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', tools_classify, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', tools_classify, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', tools_classify, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', tools_classify, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', tools_classify, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', tools_classify, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[base_tools]') AND type in (N'U')) DROP TABLE [dbo].[base_tools];
+CREATE TABLE [dbo].[base_tools](
+    id 32(32) NOT NULL,
+    classify_id 32(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    tool_level VARCHAR(16),
+    i_count VARCHAR(255),
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    tool_model VARCHAR(255),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿淇℃伅琛�', 'SCHEMA', dbo, 'table', base_tools, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', base_tools, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', base_tools, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', base_tools, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', base_tools, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿绛夌骇;宸ュ叿绮剧‘绛夌骇鍒嗕负3涓瓑绾э細鍒嗗埆涓篈銆丅銆丆
+A绫�:鐗瑰埆閲嶈锛屽叆搴撶殑宸ュ叿鏄闄勫疄鐗╃紪鐮侊紙渚嬪:Q20120918011-0001)
+B绫�:涓�鑸噸瑕侊紝鍏ュ簱鐨勫伐鍏锋槸涓嶉檮瀹炵墿缂栫爜锛堜緥濡�:Q20120918011)
+C绫�:涓嶉噸瑕侊紝娌℃湁鐗规畩瑙勫畾锛岃埅瀹囨殏鏃舵病鏈変娇鐢ㄥ満鏅�', 'SCHEMA', dbo, 'table', base_tools, 'column', tool_level;
+EXEC sp_addextendedproperty 'MS_Description', '鎶婂彿鏈�澶у��', 'SCHEMA', dbo, 'table', base_tools, 'column', i_count;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呯爜)', 'SCHEMA', dbo, 'table', base_tools, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', base_tools, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', base_tools, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囨敞绾у埆', 'SCHEMA', dbo, 'table', base_tools, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', base_tools, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', base_tools, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', base_tools, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', base_tools, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', base_tools, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', base_tools, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', base_tools, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', base_tools, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_hole_tools]') AND type in (N'U')) DROP TABLE [dbo].[para_hole_tools];
+CREATE TABLE [dbo].[para_hole_tools](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255) NOT NULL,
+    diameter VARCHAR(128) NOT NULL,
+    cone_angle VARCHAR(24),
+    edge_length VARCHAR(24) NOT NULL,
+    total_length VARCHAR(24) NOT NULL,
+    tool_material VARCHAR(64) NOT NULL,
+    part_material VARCHAR(64),
+    paintcoat_flag VARCHAR(32) NOT NULL,
+    tool_pattern VARCHAR(64) NOT NULL,
+    handle_specifications VARCHAR(128) NOT NULL,
+    cooling_method VARCHAR(64) NOT NULL,
+    technical_conditions VARCHAR(128) NOT NULL,
+    conditions_info VARCHAR(128),
+    brand VARCHAR(64),
+    types VARCHAR(64),
+    tolerance_class VARCHAR(64),
+    flute_form VARCHAR(64),
+    handle_form VARCHAR(64),
+    blade_count VARCHAR(24),
+    small_diameter VARCHAR(16),
+    chamfer_angle VARCHAR(16),
+    fitter_part VARCHAR(64),
+    effective_length VARCHAR(16),
+    drill_diameter_range VARCHAR(32),
+    knife_diameter VARCHAR(16),
+    bore_diameter VARCHAR(16),
+    connector_type VARCHAR(16),
+    slot_specification VARCHAR(32),
+    scope_of_application VARCHAR(32),
+    latest_boring_diameter VARCHAR(16),
+    max_boring_diameter VARCHAR(16),
+    processingmethod VARCHAR(64),
+    heads_number VARCHAR(16),
+    adapt_holder VARCHAR(64),
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '11瀛斿姞宸ュ垁鍏穏1', 'SCHEMA', dbo, 'table', para_hole_tools, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿-涓婚敭', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿(鎴栦紒涓氬唴鍘熶唬鐮�)', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙凤紙灞曠ず鏃躲�佸彲浠ュ涓嫾鎺ワ級;灞曠ず鏃躲�佸彲浠ュ涓嫾鎺ユ垚澶氫釜搴撲綅鍙风殑瀛楃涓诧紝杩涜浼垪灞曠ず銆�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鐩村緞', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冮敟瑙�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', cone_angle;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冮暱', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', edge_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋�婚暱', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', total_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋潗鏂�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁娑傚眰', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', paintcoat_flag;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏峰瀷寮�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tool_pattern;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯儴瑙勬牸', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', handle_specifications;
+EXEC sp_addextendedproperty 'MS_Description', '鍐峰嵈鏂瑰紡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', cooling_method;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', technical_conditions;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠惰鏄�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', conditions_info;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺墝', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', brand;
+EXEC sp_addextendedproperty 'MS_Description', '鍒跺紡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', types;
+EXEC sp_addextendedproperty 'MS_Description', '鍏樊绛夌骇', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tolerance_class;
+EXEC sp_addextendedproperty 'MS_Description', '鎺掑睉妲藉舰寮�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', flute_form;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯儴褰㈠紡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', handle_form;
+EXEC sp_addextendedproperty 'MS_Description', '鍒冩暟', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', blade_count;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�灏忕洿寰�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', small_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍊掕瑙掑害', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', chamfer_angle;
+EXEC sp_addextendedproperty 'MS_Description', '閫傞厤鍒�鐗�-鍒�澶�-鍒�鏉�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', fitter_part;
+EXEC sp_addextendedproperty 'MS_Description', '鏈夋晥鍔犲伐闀垮害', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', effective_length;
+EXEC sp_addextendedproperty 'MS_Description', '閽诲ご鐩村緞鑼冨洿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', drill_diameter_range;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗙洿寰�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', knife_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '瀛斿緞', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', bore_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鎺ュ彛褰㈠紡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', connector_type;
+EXEC sp_addextendedproperty 'MS_Description', '鎺ュ彛妲介暱瑙勬牸', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', slot_specification;
+EXEC sp_addextendedproperty 'MS_Description', '閫傜敤鑼冨洿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', scope_of_application;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�鏂伴晽瀛旂洿寰�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', latest_boring_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�澶ч晽瀛旂洿寰�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', max_boring_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍔犲伐鏂瑰紡', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', processingmethod;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�澶存暟', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', heads_number;
+EXEC sp_addextendedproperty 'MS_Description', '閫傞厤鍒�搴�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', adapt_holder;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_hole_tools, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_threading_tool]') AND type in (N'U')) DROP TABLE [dbo].[para_threading_tool];
+CREATE TABLE [dbo].[para_threading_tool](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255) NOT NULL,
+    thread_code VARCHAR(64) NOT NULL,
+    pitch VARCHAR(16) NOT NULL,
+    rotation_direction VARCHAR(16) NOT NULL,
+    tolerancezone_level VARCHAR(16) NOT NULL,
+    edge_length VARCHAR(32) NOT NULL,
+    total_length VARCHAR(32) NOT NULL,
+    tool_material VARCHAR(64) NOT NULL,
+    part_material VARCHAR(64),
+    paintcoat_flag VARCHAR(32) NOT NULL,
+    external_dimensions VARCHAR(64),
+    handle_specifications VARCHAR(64) NOT NULL,
+    technical_conditions VARCHAR(128) NOT NULL,
+    conditions_info VARCHAR(128),
+    brand VARCHAR(64),
+    types VARCHAR(64),
+    screw_hole_type VARCHAR(16),
+    cooling_method VARCHAR(64),
+    thread_standard VARCHAR(32),
+    flute_solt_type VARCHAR(32),
+    thread_type VARCHAR(32),
+    guiding_size VARCHAR(32),
+    connection_aperture VARCHAR(32),
+    connecting_keyway VARCHAR(64),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '12铻虹汗鍒�鍏穏2', 'SCHEMA', dbo, 'table', para_threading_tool, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呭師浠g爜锛�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗浠e彿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', thread_code;
+EXEC sp_addextendedproperty 'MS_Description', '铻鸿窛', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', pitch;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗鏃嬪悜', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', rotation_direction;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗鍏樊甯︿唬鍙�/绮惧害绛夌骇', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', tolerancezone_level;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冮暱', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', edge_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋�婚暱', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', total_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋潗鏂�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁娑傚眰', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', paintcoat_flag;
+EXEC sp_addextendedproperty 'MS_Description', '澶栧瀷灏哄', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', external_dimensions;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯儴瑙勬牸', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', handle_specifications;
+EXEC sp_addextendedproperty 'MS_Description', '闄勪欢鎶�鏈潯浠�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', technical_conditions;
+EXEC sp_addextendedproperty 'MS_Description', '闄勪欢鎶�鏈潯浠惰鏄�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', conditions_info;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺墝', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', brand;
+EXEC sp_addextendedproperty 'MS_Description', '鍒跺紡', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', types;
+EXEC sp_addextendedproperty 'MS_Description', '铻哄瓟绫诲瀷', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', screw_hole_type;
+EXEC sp_addextendedproperty 'MS_Description', '鍐峰嵈鏂瑰紡', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', cooling_method;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗鏍囧噯', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', thread_standard;
+EXEC sp_addextendedproperty 'MS_Description', '鎺掑睉妲藉瀷', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', flute_solt_type;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗绫诲瀷', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', thread_type;
+EXEC sp_addextendedproperty 'MS_Description', '瀵煎悜灏哄', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', guiding_size;
+EXEC sp_addextendedproperty 'MS_Description', '杩炴帴瀛斿緞', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', connection_aperture;
+EXEC sp_addextendedproperty 'MS_Description', '杩炴帴閿Ы', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', connecting_keyway;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_threading_tool, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_mill_tool]') AND type in (N'U')) DROP TABLE [dbo].[para_mill_tool];
+CREATE TABLE [dbo].[para_mill_tool](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(32),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255) NOT NULL,
+    diameter VARCHAR(128) NOT NULL,
+    nose_angle_r VARCHAR(64) NOT NULL,
+    number_of_teeth VARCHAR(64) NOT NULL,
+    edge_length VARCHAR(24) NOT NULL,
+    total_length VARCHAR(24) NOT NULL,
+    tool_material VARCHAR(64) NOT NULL,
+    part_material VARCHAR(64),
+    paintcoat_flag VARCHAR(32) NOT NULL,
+    tool_pattern VARCHAR(64) NOT NULL,
+    clamping_specifications VARCHAR(64) NOT NULL,
+    cooling_method VARCHAR(64) NOT NULL,
+    technical_conditions VARCHAR(128) NOT NULL,
+    conditions_info VARCHAR(128),
+    brand VARCHAR(64),
+    neck_diameter VARCHAR(64),
+    handle_form VARCHAR(64),
+    nose_angle_c VARCHAR(32),
+    angle_inside_r VARCHAR(32),
+    small_diameter VARCHAR(32),
+    tool_angle VARCHAR(16),
+    handle_length VARCHAR(16),
+    main_angle_k VARCHAR(16),
+    deepest_depth VARCHAR(16),
+    adapt_blade VARCHAR(64),
+    handle_neck_form VARCHAR(64),
+    handle_neck_length VARCHAR(16),
+    size_specifications VARCHAR(16),
+    milling_head_form VARCHAR(16),
+    overhanging_length VARCHAR(16),
+    cutting_edge_form VARCHAR(16),
+    number_patterns VARCHAR(16),
+    pitch VARCHAR(16),
+    recently_diameter VARCHAR(16),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '13閾e墛鍒�鍏穏3', 'SCHEMA', dbo, 'table', para_mill_tool, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭-鍒�鍏风紪鍙�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呭師浠g爜锛�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏风洿寰�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�灏栬R', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', nose_angle_r;
+EXEC sp_addextendedproperty 'MS_Description', '榻挎暟', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', number_of_teeth;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冮暱', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', edge_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋�婚暱', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', total_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋潗鏂�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁娑傚眰', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', paintcoat_flag;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏峰瀷寮�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tool_pattern;
+EXEC sp_addextendedproperty 'MS_Description', '瑁呭す瑙勬牸', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', clamping_specifications;
+EXEC sp_addextendedproperty 'MS_Description', '鍐峰嵈鏂瑰紡', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', cooling_method;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', technical_conditions;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠惰鏄�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', conditions_info;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺墝', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', brand;
+EXEC sp_addextendedproperty 'MS_Description', '棰堝緞', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', neck_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯儴褰㈠紡', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', handle_form;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�灏栬C', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', nose_angle_c;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�灏栬鍐匯', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', angle_inside_r;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�灏忕洿寰�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', small_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏疯搴�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tool_angle;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯暱', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', handle_length;
+EXEC sp_addextendedproperty 'MS_Description', '涓诲亸瑙扠', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', main_angle_k;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�澶у垏娣�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', deepest_depth;
+EXEC sp_addextendedproperty 'MS_Description', '閫傞厤鍒�鐗�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', adapt_blade;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯褰㈠紡', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', handle_neck_form;
+EXEC sp_addextendedproperty 'MS_Description', '鏌勯闀垮害', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', handle_neck_length;
+EXEC sp_addextendedproperty 'MS_Description', '鎺ュ彛灏哄瑙勬牸', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', size_specifications;
+EXEC sp_addextendedproperty 'MS_Description', '閾e垁澶村舰寮�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', milling_head_form;
+EXEC sp_addextendedproperty 'MS_Description', '鎮几闀垮害', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', overhanging_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冨舰寮�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', cutting_edge_form;
+EXEC sp_addextendedproperty 'MS_Description', '鍐呭绾规暟', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', number_patterns;
+EXEC sp_addextendedproperty 'MS_Description', '铻鸿窛', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', pitch;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�杩戝姞宸ョ洿寰�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', recently_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_mill_tool, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_turning_tools]') AND type in (N'U')) DROP TABLE [dbo].[para_turning_tools];
+CREATE TABLE [dbo].[para_turning_tools](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32),
+    tool_code VARCHAR(32) NOT NULL,
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255),
+    head_specifications VARCHAR(32) NOT NULL,
+    matching_number VARCHAR(64) NOT NULL,
+    lead_angle VARCHAR(32) NOT NULL,
+    cross_sectional_size VARCHAR(16) NOT NULL,
+    total_length VARCHAR(32) NOT NULL,
+    cutting_direction VARCHAR(24) NOT NULL,
+    tool_material VARCHAR(64) NOT NULL,
+    part_material VARCHAR(64),
+    tool_pattern VARCHAR(64) NOT NULL,
+    paintcoat_flag VARCHAR(32) NOT NULL,
+    technical_conditions VARCHAR(128) NOT NULL,
+    conditions_info VARCHAR(128),
+    brand VARCHAR(64),
+    types VARCHAR(64),
+    knife_size VARCHAR(32),
+    cooling_method VARCHAR(64),
+    holder_category VARCHAR(64),
+    tool_diameter VARCHAR(64),
+    fastening_form VARCHAR(64),
+    boring_bar_diameter VARCHAR(32),
+    blade_length VARCHAR(32),
+    blade_shape VARCHAR(24),
+    blade_posterior VARCHAR(24),
+    bar_direction VARCHAR(64),
+    blade_height VARCHAR(32),
+    blade_wide VARCHAR(24),
+    blade_size VARCHAR(32),
+    knife_clip_model VARCHAR(64),
+    clamping_method VARCHAR(64),
+    slot_width VARCHAR(32),
+    small_diameter VARCHAR(32),
+    max_diameter VARCHAR(32),
+    max_depth VARCHAR(32),
+    knife_bar_form VARCHAR(64),
+    blade_thickness VARCHAR(32),
+    min_diameter VARCHAR(32),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id,tool_code)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '14杞﹀墛鍒�鍏穏4', 'SCHEMA', dbo, 'table', para_turning_tools, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭-鍒�鍏风紪鍙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呭師浠g爜锛�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�澶磋鏍�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', head_specifications;
+EXEC sp_addextendedproperty 'MS_Description', '閰嶅鍒�鐗囧彿', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', matching_number;
+EXEC sp_addextendedproperty 'MS_Description', '涓诲亸瑙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', lead_angle;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋埅闈㈠昂瀵�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', cross_sectional_size;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋�婚暱', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', total_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鏂瑰悜', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', cutting_direction;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋潗鏂�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏峰瀷寮�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tool_pattern;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁娑傚眰', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', paintcoat_flag;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', technical_conditions;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠惰鏄�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', conditions_info;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺墝', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', brand;
+EXEC sp_addextendedproperty 'MS_Description', '鍒跺紡', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', types;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧昂瀵�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', knife_size;
+EXEC sp_addextendedproperty 'MS_Description', '鍐峰嵈鏂瑰紡', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', cooling_method;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗙被鍒�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', holder_category;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏风洿寰�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tool_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鎺ュ彛绱у浐褰㈠紡', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', fastening_form;
+EXEC sp_addextendedproperty 'MS_Description', '闀楁潌鐩村緞', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', boring_bar_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗛暱搴�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧舰鐘�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_shape;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧悗瑙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_posterior;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗘柟鍚�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', bar_direction;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗛珮搴�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_height;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗗搴�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_wide;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗗昂瀵�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_size;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�澶瑰瀷鍙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', knife_clip_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囪澶规柟寮�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', clamping_method;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囨Ы瀹�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', slot_width;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�灏忓垏鍏ョ洿寰�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', small_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�澶у垏鍏ョ洿寰�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', max_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�澶у垏妲芥繁搴�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', max_depth;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉嗗舰寮�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', knife_bar_form;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鏉垮帤搴�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', blade_thickness;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�灏忓姞宸ョ洿寰�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', min_diameter;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_turning_tools, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_blade]') AND type in (N'U')) DROP TABLE [dbo].[para_blade];
+CREATE TABLE [dbo].[para_blade](
+    id VARCHAR(32),
+    classify_id VARCHAR(32),
+    tool_code VARCHAR(32) NOT NULL,
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255),
+    blade_shape VARCHAR(32) NOT NULL,
+    blade_length VARCHAR(24) NOT NULL,
+    cutting_edge_count VARCHAR(32) NOT NULL,
+    blade_thickness VARCHAR(32) NOT NULL,
+    clamping_type VARCHAR(64) NOT NULL,
+    nose_angle_r VARCHAR(24) NOT NULL,
+    tool_material VARCHAR(64) NOT NULL,
+    part_material VARCHAR(64),
+    paintcoat_flag VARCHAR(32) NOT NULL,
+    technical_conditions VARCHAR(128) NOT NULL,
+    conditions_info VARCHAR(128),
+    brand VARCHAR(64),
+    types VARCHAR(64),
+    coating_material VARCHAR(64),
+    processing_classify VARCHAR(64),
+    blade_posterior VARCHAR(32),
+    cutting_direction VARCHAR(32),
+    blade_wide VARCHAR(32),
+    blade_size VARCHAR(34),
+    in_out_thread VARCHAR(32),
+    thread_standard VARCHAR(32),
+    dental_angle VARCHAR(16),
+    pitch VARCHAR(24),
+    min_internal_thread VARCHAR(24),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (tool_code)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '20鍒�鐗噂9', 'SCHEMA', dbo, 'table', para_blade, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_blade, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_blade, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭-鍒�鍏风紪鍙�', 'SCHEMA', dbo, 'table', para_blade, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呭師浠g爜锛�', 'SCHEMA', dbo, 'table', para_blade, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_blade, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_blade, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_blade, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_blade, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', para_blade, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_blade, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧舰鐘�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_shape;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囬暱搴�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_length;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鍒冩暟', 'SCHEMA', dbo, 'table', para_blade, 'column', cutting_edge_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧帤搴�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_thickness;
+EXEC sp_addextendedproperty 'MS_Description', '澶瑰浐鍨嬪紡', 'SCHEMA', dbo, 'table', para_blade, 'column', clamping_type;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�灏朢', 'SCHEMA', dbo, 'table', para_blade, 'column', nose_angle_r;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囨潗鏂�', 'SCHEMA', dbo, 'table', para_blade, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_blade, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁娑傚眰', 'SCHEMA', dbo, 'table', para_blade, 'column', paintcoat_flag;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠�', 'SCHEMA', dbo, 'table', para_blade, 'column', technical_conditions;
+EXEC sp_addextendedproperty 'MS_Description', '闄勫姞鎶�鏈潯浠惰鏄�', 'SCHEMA', dbo, 'table', para_blade, 'column', conditions_info;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺墝', 'SCHEMA', dbo, 'table', para_blade, 'column', brand;
+EXEC sp_addextendedproperty 'MS_Description', '鍒跺紡', 'SCHEMA', dbo, 'table', para_blade, 'column', types;
+EXEC sp_addextendedproperty 'MS_Description', '娑傚眰鏉愯川', 'SCHEMA', dbo, 'table', para_blade, 'column', coating_material;
+EXEC sp_addextendedproperty 'MS_Description', '鍔犲伐鍒嗙被', 'SCHEMA', dbo, 'table', para_blade, 'column', processing_classify;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧悗瑙�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_posterior;
+EXEC sp_addextendedproperty 'MS_Description', '鍒囧墛鏂瑰悜', 'SCHEMA', dbo, 'table', para_blade, 'column', cutting_direction;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧搴�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_wide;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鐗囧昂瀵�', 'SCHEMA', dbo, 'table', para_blade, 'column', blade_size;
+EXEC sp_addextendedproperty 'MS_Description', '鍐呭铻虹汗', 'SCHEMA', dbo, 'table', para_blade, 'column', in_out_thread;
+EXEC sp_addextendedproperty 'MS_Description', '铻虹汗鏍囧噯', 'SCHEMA', dbo, 'table', para_blade, 'column', thread_standard;
+EXEC sp_addextendedproperty 'MS_Description', '鐗欏瀷瑙掑害', 'SCHEMA', dbo, 'table', para_blade, 'column', dental_angle;
+EXEC sp_addextendedproperty 'MS_Description', '铻鸿窛', 'SCHEMA', dbo, 'table', para_blade, 'column', pitch;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�灏忓姞宸ュ唴铻虹汗鍏О鐩村緞', 'SCHEMA', dbo, 'table', para_blade, 'column', min_internal_thread;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_blade, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_blade, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_blade, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_blade, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_blade, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[outbound_order]') AND type in (N'U')) DROP TABLE [dbo].[outbound_order];
+CREATE TABLE [dbo].[outbound_order](
+    id VARCHAR(32) NOT NULL,
+    out_storehouse_type VARCHAR(32) NOT NULL,
+    is_return INT,
+    handler VARCHAR(32) NOT NULL,
+    reviewer VARCHAR(32),
+    order_status VARCHAR(32) NOT NULL,
+    out_status VARCHAR(255),
+    audit_date DATETIME,
+    approval_opinion VARCHAR(128),
+    subject_matter VARCHAR(128),
+    outbound_time DATETIME NOT NULL,
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐢宠鍗�', 'SCHEMA', dbo, 'table', outbound_order, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鍗曠紪鍙�', 'SCHEMA', dbo, 'table', outbound_order, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱绫诲瀷', 'SCHEMA', dbo, 'table', outbound_order, 'column', out_storehouse_type;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁褰掕繕;1鏈綊杩橈紙榛樿锛夛紱2.宸插綊杩�', 'SCHEMA', dbo, 'table', outbound_order, 'column', is_return;
+EXEC sp_addextendedproperty 'MS_Description', '缁忔墜浜�', 'SCHEMA', dbo, 'table', outbound_order, 'column', handler;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳浜�', 'SCHEMA', dbo, 'table', outbound_order, 'column', reviewer;
+EXEC sp_addextendedproperty 'MS_Description', '鍗曞瓙鐘舵��', 'SCHEMA', dbo, 'table', outbound_order, 'column', order_status;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐘舵��;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚', 'SCHEMA', dbo, 'table', outbound_order, 'column', out_status;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳鏃堕棿', 'SCHEMA', dbo, 'table', outbound_order, 'column', audit_date;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳鎰忚', 'SCHEMA', dbo, 'table', outbound_order, 'column', approval_opinion;
+EXEC sp_addextendedproperty 'MS_Description', '棰嗙敤浜嬬敱', 'SCHEMA', dbo, 'table', outbound_order, 'column', subject_matter;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鏃堕棿', 'SCHEMA', dbo, 'table', outbound_order, 'column', outbound_time;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', outbound_order, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', outbound_order, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鎿嶄綔鍛�', 'SCHEMA', dbo, 'table', outbound_order, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', outbound_order, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', outbound_order, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', outbound_order, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[inbound_order]') AND type in (N'U')) DROP TABLE [dbo].[inbound_order];
+CREATE TABLE [dbo].[inbound_order](
+    id VARCHAR(32) NOT NULL,
+    inbound_time DATETIME(255),
+    in_storehouse_type VARCHAR(32) NOT NULL,
+    handler VARCHAR(32),
+    borrow_num VARCHAR(32),
+    reviewer VARCHAR(32),
+    approval_date DATETIME,
+    approval_opinion VARCHAR(128),
+    order_status VARCHAR(32),
+    in_status VARCHAR(32),
+    application_reason VARCHAR(128),
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鐢宠鍗�', 'SCHEMA', dbo, 'table', inbound_order, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭-鍏ュ簱鍗曞彿', 'SCHEMA', dbo, 'table', inbound_order, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏃堕棿', 'SCHEMA', dbo, 'table', inbound_order, 'column', inbound_time;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱绫诲瀷', 'SCHEMA', dbo, 'table', inbound_order, 'column', in_storehouse_type;
+EXEC sp_addextendedproperty 'MS_Description', '缁忔墜浜�', 'SCHEMA', dbo, 'table', inbound_order, 'column', handler;
+EXEC sp_addextendedproperty 'MS_Description', '鍊熺敤鍗曞彿', 'SCHEMA', dbo, 'table', inbound_order, 'column', borrow_num;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳浜�', 'SCHEMA', dbo, 'table', inbound_order, 'column', reviewer;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳鏃堕棿', 'SCHEMA', dbo, 'table', inbound_order, 'column', approval_date;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳鎰忚', 'SCHEMA', dbo, 'table', inbound_order, 'column', approval_opinion;
+EXEC sp_addextendedproperty 'MS_Description', '鍗曞瓙鐘舵��', 'SCHEMA', dbo, 'table', inbound_order, 'column', order_status;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鍗曠姸鎬�;1.鏈叆搴擄紱2.閮ㄥ垎鍏ュ簱锛�3.鍏ュ簱瀹屾垚', 'SCHEMA', dbo, 'table', inbound_order, 'column', in_status;
+EXEC sp_addextendedproperty 'MS_Description', '鐢宠鍘熷洜', 'SCHEMA', dbo, 'table', inbound_order, 'column', application_reason;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', inbound_order, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', inbound_order, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鎿嶄綔鍛�', 'SCHEMA', dbo, 'table', inbound_order, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鐢宠鏃堕棿', 'SCHEMA', dbo, 'table', inbound_order, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', inbound_order, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', inbound_order, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[outbound_detail]') AND type in (N'U')) DROP TABLE [dbo].[outbound_detail];
+CREATE TABLE [dbo].[outbound_detail](
+    id VARCHAR(32) NOT NULL,
+    out_storehouse_id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    outbound_quantity DECIMAL(64) NOT NULL,
+    out_actual_count DECIMAL(64),
+    storage_location VARCHAR(64),
+    outbound_location VARCHAR(255),
+    out_status VARCHAR(32) NOT NULL,
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐢宠鏄庣粏', 'SCHEMA', dbo, 'table', outbound_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', outbound_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鍗曞彿', 'SCHEMA', dbo, 'table', outbound_detail, 'column', out_storehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏风紪鐮�', 'SCHEMA', dbo, 'table', outbound_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏风紪鍙�', 'SCHEMA', dbo, 'table', outbound_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鐢宠鍑哄簱鏁伴噺', 'SCHEMA', dbo, 'table', outbound_detail, 'column', outbound_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '瀹為檯鍑哄簱鏁伴噺', 'SCHEMA', dbo, 'table', outbound_detail, 'column', out_actual_count;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱', 'SCHEMA', dbo, 'table', outbound_detail, 'column', storage_location;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱搴撲綅', 'SCHEMA', dbo, 'table', outbound_detail, 'column', outbound_location;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐘舵��;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚', 'SCHEMA', dbo, 'table', outbound_detail, 'column', out_status;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', outbound_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鎿嶄綔鍛�', 'SCHEMA', dbo, 'table', outbound_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鏃堕棿', 'SCHEMA', dbo, 'table', outbound_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', outbound_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', outbound_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[inbound_detail]') AND type in (N'U')) DROP TABLE [dbo].[inbound_detail];
+CREATE TABLE [dbo].[inbound_detail](
+    id VARCHAR(32) NOT NULL,
+    goods_shelves_id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    in_storage_quantity DECIMAL(64) NOT NULL,
+    in_actual_count DECIMAL(64),
+    out_status VARCHAR(32),
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鐢宠鏄庣粏', 'SCHEMA', dbo, 'table', inbound_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', inbound_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦鍙�/瀛樺偍浣嶇疆', 'SCHEMA', dbo, 'table', inbound_detail, 'column', goods_shelves_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', inbound_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', inbound_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏁伴噺', 'SCHEMA', dbo, 'table', inbound_detail, 'column', in_storage_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '瀹為檯鍏ュ簱鏁伴噺', 'SCHEMA', dbo, 'table', inbound_detail, 'column', in_actual_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐘舵��;1.鏈叆搴擄紱2.閮ㄥ垎鍏ュ簱锛�3.鍏ュ簱瀹屾垚', 'SCHEMA', dbo, 'table', inbound_detail, 'column', out_status;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', inbound_detail, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', inbound_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', inbound_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', inbound_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', inbound_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', inbound_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tools_config_property]') AND type in (N'U')) DROP TABLE [dbo].[tools_config_property];
+CREATE TABLE [dbo].[tools_config_property](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32) NOT NULL,
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    application_type INT NOT NULL,
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    tool_model VARCHAR(128) NOT NULL,
+    supplier_id VARCHAR(128),
+    province_city VARCHAR(255),
+    warehouse_id VARCHAR(128),
+    position_code VARCHAR(255),
+    storage_location VARCHAR(64),
+    main_unit VARCHAR(64),
+    auxiliary_unit VARCHAR(64),
+    main_count VARCHAR(255),
+    auxiliary_count VARCHAR(255),
+    auxiliary_unit_flag VARCHAR(8),
+    price DECIMAL,
+    lower_inventory DECIMAL,
+    highest_inventory VARCHAR,
+    status VARCHAR(6),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿閫氱敤鎬ц川--鍙傛暟', 'SCHEMA', dbo, 'table', tools_config_property, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', tools_config_property, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', tools_config_property, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', tools_config_property, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '鑻辨枃鍚嶇О', 'SCHEMA', dbo, 'table', tools_config_property, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿绫诲瀷;1.閫氱敤
+2.涓撶敤', 'SCHEMA', dbo, 'table', tools_config_property, 'column', application_type;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', tools_config_property, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', tools_config_property, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍘傚', 'SCHEMA', dbo, 'table', tools_config_property, 'column', supplier_id;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱鐪佷唤鍩庡競', 'SCHEMA', dbo, 'table', tools_config_property, 'column', province_city;
+EXEC sp_addextendedproperty 'MS_Description', '搴撳尯/搴撳彿', 'SCHEMA', dbo, 'table', tools_config_property, 'column', warehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', tools_config_property, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '瀛樺偍浣嶇疆锛堝亸閭d釜鍘傚尯鐨勫簱锛�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', storage_location;
+EXEC sp_addextendedproperty 'MS_Description', '璁¢噺涓诲崟浣�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', main_unit;
+EXEC sp_addextendedproperty 'MS_Description', '璁¢噺杈呭崟浣�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', auxiliary_unit;
+EXEC sp_addextendedproperty 'MS_Description', '璁¢噺涓诲崟浣嶆暟閲�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', main_count;
+EXEC sp_addextendedproperty 'MS_Description', '璁¢噺杈呭崟浣嶆暟閲�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', auxiliary_count;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁鏈夎閲忚緟鍗曚綅;1,鏈夎緟鍔╁崟浣�2.鏃犺緟鍔╁崟浣�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', auxiliary_unit_flag;
+EXEC sp_addextendedproperty 'MS_Description', '鍗曚环', 'SCHEMA', dbo, 'table', tools_config_property, 'column', price;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�浣庡簱瀛�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', lower_inventory;
+EXEC sp_addextendedproperty 'MS_Description', '鏈�楂樺簱瀛�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', highest_inventory;
+EXEC sp_addextendedproperty 'MS_Description', '鐘舵��;1.鍚敤
+2.鏈惎鐢�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', status;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', tools_config_property, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', tools_config_property, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', tools_config_property, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', tools_config_property, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[warehouse]') AND type in (N'U')) DROP TABLE [dbo].[warehouse];
+CREATE TABLE [dbo].[warehouse](
+    id VARCHAR(32) NOT NULL,
+    warehouse_id VARCHAR(255),
+    warehouse_name VARCHAR(128),
+    parent_id VARCHAR(64),
+    seq VARCHAR(255),
+    leaf_flag VARCHAR(6),
+    status VARCHAR(6),
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱绠$悊', 'SCHEMA', dbo, 'table', warehouse, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', warehouse, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱缂栧彿', 'SCHEMA', dbo, 'table', warehouse, 'column', warehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱鍚嶇О', 'SCHEMA', dbo, 'table', warehouse, 'column', warehouse_name;
+EXEC sp_addextendedproperty 'MS_Description', '鐖惰妭鐐圭紪鍙�', 'SCHEMA', dbo, 'table', warehouse, 'column', parent_id;
+EXEC sp_addextendedproperty 'MS_Description', '灞曠ず搴忓彿', 'SCHEMA', dbo, 'table', warehouse, 'column', seq;
+EXEC sp_addextendedproperty 'MS_Description', '鏄惁鍙跺瓙鑺傜偣;1鏄�2鍚�', 'SCHEMA', dbo, 'table', warehouse, 'column', leaf_flag;
+EXEC sp_addextendedproperty 'MS_Description', '鐘舵��;1.鍚敤锛�2.鍋滅敤', 'SCHEMA', dbo, 'table', warehouse, 'column', status;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', warehouse, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', warehouse, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', warehouse, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', warehouse, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', warehouse, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', warehouse, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[goods_shelves]') AND type in (N'U')) DROP TABLE [dbo].[goods_shelves];
+CREATE TABLE [dbo].[goods_shelves](
+    id VARCHAR(32) NOT NULL,
+    warehouse_id VARCHAR(32) NOT NULL,
+    location_code VARCHAR(255) NOT NULL,
+    storey VARCHAR(32) NOT NULL,
+    arrange VARCHAR(32) NOT NULL,
+    column_number VARCHAR(32) NOT NULL,
+    cells_num VARCHAR(32),
+    shelf_number VARCHAR(64),
+    shelf_name VARCHAR(64),
+    remark VARCHAR(128),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦绠$悊', 'SCHEMA', dbo, 'table', goods_shelves, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', goods_shelves, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱缂栧彿', 'SCHEMA', dbo, 'table', goods_shelves, 'column', warehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�', 'SCHEMA', dbo, 'table', goods_shelves, 'column', location_code;
+EXEC sp_addextendedproperty 'MS_Description', '灞傛暟', 'SCHEMA', dbo, 'table', goods_shelves, 'column', storey;
+EXEC sp_addextendedproperty 'MS_Description', '鎺掓暟', 'SCHEMA', dbo, 'table', goods_shelves, 'column', arrange;
+EXEC sp_addextendedproperty 'MS_Description', '鍒楁暟', 'SCHEMA', dbo, 'table', goods_shelves, 'column', column_number;
+EXEC sp_addextendedproperty 'MS_Description', '鏍兼暟;榛樿鍊间负1', 'SCHEMA', dbo, 'table', goods_shelves, 'column', cells_num;
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦缂栧彿', 'SCHEMA', dbo, 'table', goods_shelves, 'column', shelf_number;
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦鍚嶇О', 'SCHEMA', dbo, 'table', goods_shelves, 'column', shelf_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', goods_shelves, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', goods_shelves, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', goods_shelves, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', goods_shelves, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', goods_shelves, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', goods_shelves, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[in_store_detail]') AND type in (N'U')) DROP TABLE [dbo].[in_store_detail];
+CREATE TABLE [dbo].[in_store_detail](
+    id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    in_storehouse_type VARCHAR(32),
+    goods_shelves_id VARCHAR(32),
+    in_number DECIMAL(64),
+    in_storehouse_id VARCHAR(32),
+    operate_type VARCHAR(64),
+    inbound_time DATETIME(24),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏄庣粏琛�-鎻忚堪鍒�鍏峰瓨鏀俱�佸彂鐢熺殑鏁伴噺', 'SCHEMA', dbo, 'table', in_store_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', in_store_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', in_store_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', in_store_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍏ュ簱鏂瑰紡', 'SCHEMA', dbo, 'table', in_store_detail, 'column', in_storehouse_type;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�', 'SCHEMA', dbo, 'table', in_store_detail, 'column', goods_shelves_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏁伴噺', 'SCHEMA', dbo, 'table', in_store_detail, 'column', in_number;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鐢宠鍗曞彿', 'SCHEMA', dbo, 'table', in_store_detail, 'column', in_storehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟
+2.鎵嬪伐鎿嶄綔', 'SCHEMA', dbo, 'table', in_store_detail, 'column', operate_type;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏃堕棿', 'SCHEMA', dbo, 'table', in_store_detail, 'column', inbound_time;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', in_store_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', in_store_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', in_store_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', in_store_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', in_store_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[out_store_detail]') AND type in (N'U')) DROP TABLE [dbo].[out_store_detail];
+CREATE TABLE [dbo].[out_store_detail](
+    id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    out_storehouse_type VARCHAR(32),
+    goods_shelves_code VARCHAR(64),
+    out_number DECIMAL(64) NOT NULL,
+    in_storehouse_id VARCHAR(128),
+    operate_type VARCHAR(64),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鎻忚堪鍑哄簱鐨勫簱浣嶃�佹暟閲忓叧绯昏〃', 'SCHEMA', dbo, 'table', out_store_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', out_store_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', out_store_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', out_store_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱绫诲瀷', 'SCHEMA', dbo, 'table', out_store_detail, 'column', out_storehouse_type;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�', 'SCHEMA', dbo, 'table', out_store_detail, 'column', goods_shelves_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鏁伴噺', 'SCHEMA', dbo, 'table', out_store_detail, 'column', out_number;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鐢宠鍗曞彿', 'SCHEMA', dbo, 'table', out_store_detail, 'column', in_storehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟
+2.鎵嬪伐鎿嶄綔', 'SCHEMA', dbo, 'table', out_store_detail, 'column', operate_type;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', out_store_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', out_store_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', out_store_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', out_store_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', out_store_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[para_common_tool]') AND type in (N'U')) DROP TABLE [dbo].[para_common_tool];
+CREATE TABLE [dbo].[para_common_tool](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32),
+    tool_code VARCHAR(32),
+    sign_code VARCHAR(16),
+    chinese_name VARCHAR(128),
+    foreign_language_name VARCHAR(128),
+    standard_level VARCHAR(16),
+    standard_code VARCHAR(32),
+    position_code VARCHAR(255),
+    tool_model VARCHAR(255),
+    tool_material VARCHAR(255),
+    part_material VARCHAR(255),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鏍囪瘑', 'SCHEMA', dbo, 'table', para_common_tool, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', para_common_tool, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍒嗙被缂栧彿', 'SCHEMA', dbo, 'table', para_common_tool, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', para_common_tool, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴忓彿锛堟垨浼佷笟鍐呮簮鐮侊級', 'SCHEMA', dbo, 'table', para_common_tool, 'column', sign_code;
+EXEC sp_addextendedproperty 'MS_Description', '涓枃鍚嶇О', 'SCHEMA', dbo, 'table', para_common_tool, 'column', chinese_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶栨枃鍚嶇О', 'SCHEMA', dbo, 'table', para_common_tool, 'column', foreign_language_name;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯绾у埆', 'SCHEMA', dbo, 'table', para_common_tool, 'column', standard_level;
+EXEC sp_addextendedproperty 'MS_Description', '鏍囧噯鍙�', 'SCHEMA', dbo, 'table', para_common_tool, 'column', standard_code;
+EXEC sp_addextendedproperty 'MS_Description', '搴撲綅鍙�;鐢卞簱鍖�+灞�+鎺�+鍒楃粍鎴愶紝鍙互鏄涓簱浣嶅彿浠ヨ嫳鏂囩偣鍙峰垎鍓茬殑瀛楃涓层��', 'SCHEMA', dbo, 'table', para_common_tool, 'column', position_code;
+EXEC sp_addextendedproperty 'MS_Description', '鍨嬪彿/鍥惧彿', 'SCHEMA', dbo, 'table', para_common_tool, 'column', tool_model;
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏锋潗鏂�', 'SCHEMA', dbo, 'table', para_common_tool, 'column', tool_material;
+EXEC sp_addextendedproperty 'MS_Description', '闆朵欢鏉愭枡', 'SCHEMA', dbo, 'table', para_common_tool, 'column', part_material;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', para_common_tool, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', para_common_tool, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', para_common_tool, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', para_common_tool, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', para_common_tool, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', para_common_tool, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tool_sharpening]') AND type in (N'U')) DROP TABLE [dbo].[tool_sharpening];
+CREATE TABLE [dbo].[tool_sharpening](
+    id VARCHAR(32,32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32,32),
+    sharpening_time DATETIME(24) NOT NULL,
+    sharpening_result VARCHAR(255),
+    responsible_person VARCHAR(24),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鍒�鍏峰垉纾�', 'SCHEMA', dbo, 'table', tool_sharpening, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒冪(鏃堕棿', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', sharpening_time;
+EXEC sp_addextendedproperty 'MS_Description', '鍒冪(缁撴灉鍙婂缓璁�', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', sharpening_result;
+EXEC sp_addextendedproperty 'MS_Description', '璐d换浜�', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', responsible_person;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', tool_sharpening, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[loss_bound]') AND type in (N'U')) DROP TABLE [dbo].[loss_bound];
+CREATE TABLE [dbo].[loss_bound](
+    id VARCHAR(32) NOT NULL,
+    losser VARCHAR(64),
+    handler VARCHAR(64),
+    loss_time DATETIME(32),
+    reviewer VARCHAR(64),
+    approval_date DATETIME(255),
+    order_status VARCHAR(32),
+    approval_opinion VARCHAR(255),
+    loss_reason VARCHAR(255),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鎶ユ崯鍗�', 'SCHEMA', dbo, 'table', loss_bound, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯鍗曞彿', 'SCHEMA', dbo, 'table', loss_bound, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯浜�', 'SCHEMA', dbo, 'table', loss_bound, 'column', losser;
+EXEC sp_addextendedproperty 'MS_Description', '缁忔墜浜�', 'SCHEMA', dbo, 'table', loss_bound, 'column', handler;
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound, 'column', loss_time;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳浜�', 'SCHEMA', dbo, 'table', loss_bound, 'column', reviewer;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound, 'column', approval_date;
+EXEC sp_addextendedproperty 'MS_Description', '鍗曟嵁鐘舵��', 'SCHEMA', dbo, 'table', loss_bound, 'column', order_status;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃壒鎰忚', 'SCHEMA', dbo, 'table', loss_bound, 'column', approval_opinion;
+EXEC sp_addextendedproperty 'MS_Description', '鎹熶激鍘熷洜', 'SCHEMA', dbo, 'table', loss_bound, 'column', loss_reason;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', loss_bound, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', loss_bound, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', loss_bound, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', loss_bound, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[loss_bound_detail]') AND type in (N'U')) DROP TABLE [dbo].[loss_bound_detail];
+CREATE TABLE [dbo].[loss_bound_detail](
+    id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(128),
+    loss_reason VARCHAR(64),
+    loss_number DECIMAL(64) NOT NULL,
+    goods_shelves_id VARCHAR(64),
+    in_store_date DATETIME(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯鍗曟槑缁�', 'SCHEMA', dbo, 'table', loss_bound_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯鍘熷洜', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', loss_reason;
+EXEC sp_addextendedproperty 'MS_Description', '鎶ユ崯鏁伴噺', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', loss_number;
+EXEC sp_addextendedproperty 'MS_Description', '瀛樺偍浣嶇疆(搴撲綅鍙�)', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', goods_shelves_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍏ュ簱鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', in_store_date;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', loss_bound_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[stocktaking_bound]') AND type in (N'U')) DROP TABLE [dbo].[stocktaking_bound];
+CREATE TABLE [dbo].[stocktaking_bound](
+    id VARCHAR(255) NOT NULL,
+    stocktaking_type VARCHAR(255),
+    order_code VARCHAR(255),
+    handler VARCHAR(255),
+    reviewer VARCHAR(255),
+    stocktaking_name VARCHAR(255),
+    remark VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鐩樼偣鐢宠鍗�', 'SCHEMA', dbo, 'table', stocktaking_bound, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鐩樼偣绫诲瀷;1.鏄庣洏鐩樼偣
+2.鏆楃洏鐩樼偣', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', stocktaking_type;
+EXEC sp_addextendedproperty 'MS_Description', '鐩樼偣鍗曞彿', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', order_code;
+EXEC sp_addextendedproperty 'MS_Description', '缁忔墜浜�', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', handler;
+EXEC sp_addextendedproperty 'MS_Description', '瀹℃牳浜�', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', reviewer;
+EXEC sp_addextendedproperty 'MS_Description', '鐩樼偣鍚嶇О', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', stocktaking_name;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', stocktaking_bound, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[stocktaking_bound_detail]') AND type in (N'U')) DROP TABLE [dbo].[stocktaking_bound_detail];
+CREATE TABLE [dbo].[stocktaking_bound_detail](
+    id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(32),
+    goods_shelves_id VARCHAR(64),
+    book_quantity DATETIME(255),
+    available_quantity DATETIME(255),
+    practical_quantity DATETIME(255),
+    surplus_deficit VARCHAR(36),
+    stocktaking_date DATETIME(255),
+    remark VARCHAR(218),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '鐩樼偣鍗曟槑缁�', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '搴撳瓨鍙�', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', goods_shelves_id;
+EXEC sp_addextendedproperty 'MS_Description', '璐﹂潰鏁伴噺', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', book_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '鍙敤鏁伴噺', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', available_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '瀹炵洏鏁伴噺', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', practical_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '鐩樼泩鐩樹簭;1.鐩樼泩
+2.鐩樹簭', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', surplus_deficit;
+EXEC sp_addextendedproperty 'MS_Description', '鐩樺簱鏃堕棿', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', stocktaking_date;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', stocktaking_bound_detail, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[store_early warning]') AND type in (N'U')) DROP TABLE [dbo].[store_early warning];
+CREATE TABLE [dbo].[store_early warning](
+    id VARCHAR(32) NOT NULL,
+    tool_code VARCHAR(32) NOT NULL,
+    tool_id VARCHAR(64),
+    goods_shelves_id VARCHAR(32),
+    lower_inventory DECIMAL(64),
+    highest_inventory DECIMAL(64),
+    total_count DECIMAL(64),
+    available_quantity DECIMAL(64),
+    status VARCHAR(255),
+    remark VARCHAR(216),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '搴撳瓨棰勮', 'SCHEMA', dbo, 'table', store_early warning, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', store_early warning, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', store_early warning, 'column', tool_code;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栧彿', 'SCHEMA', dbo, 'table', store_early warning, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '瀛樺偍浣嶇疆', 'SCHEMA', dbo, 'table', store_early warning, 'column', goods_shelves_id;
+EXEC sp_addextendedproperty 'MS_Description', '搴撳瓨涓嬮檺', 'SCHEMA', dbo, 'table', store_early warning, 'column', lower_inventory;
+EXEC sp_addextendedproperty 'MS_Description', '搴撳瓨涓婇檺', 'SCHEMA', dbo, 'table', store_early warning, 'column', highest_inventory;
+EXEC sp_addextendedproperty 'MS_Description', '鎬诲簱瀛樻暟閲�', 'SCHEMA', dbo, 'table', store_early warning, 'column', total_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍙敤搴撳瓨鏁伴噺', 'SCHEMA', dbo, 'table', store_early warning, 'column', available_quantity;
+EXEC sp_addextendedproperty 'MS_Description', '鐘舵��;1宸插鐞嗭紱2.鏈鐞嗐��', 'SCHEMA', dbo, 'table', store_early warning, 'column', status;
+EXEC sp_addextendedproperty 'MS_Description', '澶囨敞', 'SCHEMA', dbo, 'table', store_early warning, 'column', remark;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', store_early warning, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', store_early warning, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', store_early warning, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', store_early warning, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', store_early warning, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[goods_shelves_mark]') AND type in (N'U')) DROP TABLE [dbo].[goods_shelves_mark];
+CREATE TABLE [dbo].[goods_shelves_mark](
+    id VARCHAR(32) NOT NULL,
+    warehouse_id VARCHAR(32) NOT NULL,
+    goods_shelves VARCHAR(32) NOT NULL,
+    storey VARCHAR(128) NOT NULL,
+    variety VARCHAR(255),
+    tenant_id VARCHAR,
+    created_by VARCHAR(32),
+    created_time DATETIME,
+    updated_by VARCHAR(32),
+    updated_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦灞傛帓搴撳瓨宸ュ叿鐗瑰緛鏍囨敞', 'SCHEMA', dbo, 'table', goods_shelves_mark, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '浠撳簱缂栧彿', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', warehouse_id;
+EXEC sp_addextendedproperty 'MS_Description', '璐ф灦缂栧彿', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', goods_shelves;
+EXEC sp_addextendedproperty 'MS_Description', '灞傛暟淇℃伅', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', storey;
+EXEC sp_addextendedproperty 'MS_Description', '鍝佺-鏍囨敞瀛樻斁鍒�鍏峰搧绉嶄俊鎭�', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', variety;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', created_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', created_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', updated_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', goods_shelves_mark, 'column', updated_time;
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tool_ledger]') AND type in (N'U')) DROP TABLE [dbo].[tool_ledger];
+CREATE TABLE [dbo].[tool_ledger](
+    id VARCHAR(32) NOT NULL,
+    classify_id VARCHAR(32),
+    tool_id VARCHAR(32),
+    total_count VARCHAR(64),
+    available_count VARCHAR(64),
+    loss_count VARCHAR(64),
+    repair_count VARCHAR(64),
+    detection_count VARCHAR(64),
+    lend_count VARCHAR(64),
+    sharpening_count VARCHAR(64),
+    tenant_id VARCHAR,
+    create_by VARCHAR(32),
+    create_time DATETIME,
+    update_by VARCHAR(32),
+    update_time DATETIME,
+    PRIMARY KEY (id)
+);
+
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿鍙拌处鏁版嵁琛�', 'SCHEMA', dbo, 'table', tool_ledger, null, null;
+EXEC sp_addextendedproperty 'MS_Description', '涓婚敭', 'SCHEMA', dbo, 'table', tool_ledger, 'column', id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒嗙被缂栫爜', 'SCHEMA', dbo, 'table', tool_ledger, 'column', classify_id;
+EXEC sp_addextendedproperty 'MS_Description', '宸ュ叿缂栫爜', 'SCHEMA', dbo, 'table', tool_ledger, 'column', tool_id;
+EXEC sp_addextendedproperty 'MS_Description', '鎬诲簱瀛�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', total_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍙敤搴撳瓨', 'SCHEMA', dbo, 'table', tool_ledger, 'column', available_count;
+EXEC sp_addextendedproperty 'MS_Description', '鎬绘姤鎹熸暟閲�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', loss_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍦ㄤ慨鏁伴噺', 'SCHEMA', dbo, 'table', tool_ledger, 'column', repair_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍦ㄦ鏁伴噺', 'SCHEMA', dbo, 'table', tool_ledger, 'column', detection_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍦ㄥ�熸暟閲�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', lend_count;
+EXEC sp_addextendedproperty 'MS_Description', '鍦ㄧ(鏁伴噺', 'SCHEMA', dbo, 'table', tool_ledger, 'column', sharpening_count;
+EXEC sp_addextendedproperty 'MS_Description', '绉熸埛鍙�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', tenant_id;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓浜�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', create_by;
+EXEC sp_addextendedproperty 'MS_Description', '鍒涘缓鏃堕棿', 'SCHEMA', dbo, 'table', tool_ledger, 'column', create_time;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊浜�', 'SCHEMA', dbo, 'table', tool_ledger, 'column', update_by;
+EXEC sp_addextendedproperty 'MS_Description', '鏇存柊鏃堕棿', 'SCHEMA', dbo, 'table', tool_ledger, 'column', update_time;
+
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
index 022303c..6690650 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
@@ -493,5 +493,35 @@
 			 return Result.OK("");
 		 }
 	 }
+	 @GetMapping("/listWithLedgerAndConfig")
+	 public Result<IPage<StocktakingPoundVo>> listWithLedgerAndConfig(
+			 StocktakingPoundVo stocktakingPoundVo,
+			 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+			 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+			 HttpServletRequest req) {
 
+		 // 浣跨敤 QueryGenerator 鏋勫缓 QueryWrapper
+		 QueryWrapper<StocktakingPoundVo> queryWrapper = QueryGenerator.initQueryWrapper(stocktakingPoundVo, req.getParameterMap());
+
+		 Page<StocktakingPoundVo> page = new Page<>(pageNo, pageSize);
+		 IPage<StocktakingPoundVo> resultPage = baseToolsService.pageWithLedgerAndConfig(page, queryWrapper);
+		 return Result.OK(resultPage);
+	 }
+
+
+
+	 @GetMapping("/listWithSharpedAndConfig")
+	 public Result<IPage<SharpeeningVo>> listWithSharpedAndConfig(
+			 SharpeeningVo sharpeeningVo,
+			 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+			 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+			 HttpServletRequest req) {
+
+		 // 浣跨敤 QueryGenerator 鏋勫缓 QueryWrapper
+		 QueryWrapper<SharpeeningVo> queryWrapper = QueryGenerator.initQueryWrapper(sharpeeningVo, req.getParameterMap());
+
+		 Page<SharpeeningVo> page = new Page<>(pageNo, pageSize);
+		 IPage<SharpeeningVo> resultPage = baseToolsService.pageWithSharpedAndConfig(page, queryWrapper);
+		 return Result.OK(resultPage);
+	 }
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InStoreDetailController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InStoreDetailController.java
new file mode 100644
index 0000000..1a80548
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InStoreDetailController.java
@@ -0,0 +1,176 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.tms.entity.InStoreDetail;
+import org.jeecg.modules.tms.entity.ToolsClassify;
+import org.jeecg.modules.tms.service.IInStoreDetailService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+ /**
+ * @Description: 鍏ュ簱鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Api(tags="鍏ュ簱鏄庣粏")
+@RestController
+@RequestMapping("/tms/inStoreDetail")
+@Slf4j
+public class InStoreDetailController extends JeecgController<InStoreDetail, IInStoreDetailService> {
+	@Autowired
+	private IInStoreDetailService inStoreDetailService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param inStoreDetail
+	 * @param pageNo
+	 * @param pageSize
+	 * @param query
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ", notes="鍏ュ簱鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<?> findPageList(InStoreDetail inStoreDetail,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   @RequestParam Map<String, String> query) {
+		IPage<Map<String, Object>> pageList = inStoreDetailService.findPageList(pageNo, pageSize, query);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param inStoreDetail
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鏄庣粏-娣诲姞")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-娣诲姞", notes="鍏ュ簱鏄庣粏-娣诲姞")
+	//@RequiresPermissions("org.jeecg.modules:tms_in_store_detail:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody InStoreDetail inStoreDetail) {
+		inStoreDetailService.save(inStoreDetail);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param inStoreDetail
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鏄庣粏-缂栬緫")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-缂栬緫", notes="鍏ュ簱鏄庣粏-缂栬緫")
+	//@RequiresPermissions("org.jeecg.modules:tms_in_store_detail:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody InStoreDetail inStoreDetail) {
+		inStoreDetailService.updateById(inStoreDetail);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鏄庣粏-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-閫氳繃id鍒犻櫎", notes="鍏ュ簱鏄庣粏-閫氳繃id鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_in_store_detail:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		inStoreDetailService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鏄庣粏-鎵归噺鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-鎵归噺鍒犻櫎", notes="鍏ュ簱鏄庣粏-鎵归噺鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_in_store_detail:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.inStoreDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鏄庣粏-閫氳繃id鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鏄庣粏-閫氳繃id鏌ヨ", notes="鍏ュ簱鏄庣粏-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<InStoreDetail> queryById(@RequestParam(name="id",required=true) String id) {
+		InStoreDetail inStoreDetail = inStoreDetailService.getById(id);
+		if(inStoreDetail==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(inStoreDetail);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param inStoreDetail
+    */
+    //@RequiresPermissions("org.jeecg.modules:tms_in_store_detail:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InStoreDetail inStoreDetail) {
+        return super.exportXls(request, inStoreDetail, InStoreDetail.class, "鍏ュ簱鏄庣粏");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("tms_in_store_detail:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, InStoreDetail.class);
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundDetailController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundDetailController.java
new file mode 100644
index 0000000..217b4e3
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundDetailController.java
@@ -0,0 +1,174 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.tms.entity.InboundDetail;
+import org.jeecg.modules.tms.service.IInboundDetailService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+ /**
+ * @Description: 鍏ュ簱鐢宠鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Api(tags="鍏ュ簱鐢宠鏄庣粏")
+@RestController
+@RequestMapping("/tms/inboundDetail")
+@Slf4j
+public class InboundDetailController extends JeecgController<InboundDetail, IInboundDetailService> {
+	@Autowired
+	private IInboundDetailService inboundDetailService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param inboundDetail
+	 * @param pageNo
+	 * @param pageSize
+	 * @param query
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ", notes="鍏ュ簱鐢宠鏄庣粏-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<?> queryPageList(InboundDetail inboundDetail,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, @RequestParam Map<String, String> query) {
+		IPage<Map<String, Object>> pageList = inboundDetailService.findPageList(pageNo, pageSize, query);
+		return Result.ok(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param inboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-娣诲姞")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-娣诲姞", notes="鍏ュ簱鐢宠鏄庣粏-娣诲姞")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_detail:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody InboundDetail inboundDetail) {
+		inboundDetailService.save(inboundDetail);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param inboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-缂栬緫")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-缂栬緫", notes="鍏ュ簱鐢宠鏄庣粏-缂栬緫")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_detail:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody InboundDetail inboundDetail) {
+		inboundDetailService.updateById(inboundDetail);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-閫氳繃id鍒犻櫎", notes="鍏ュ簱鐢宠鏄庣粏-閫氳繃id鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_detail:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		inboundDetailService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-鎵归噺鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-鎵归噺鍒犻櫎", notes="鍏ュ簱鐢宠鏄庣粏-鎵归噺鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_detail:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.inboundDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鐢宠鏄庣粏-閫氳繃id鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鐢宠鏄庣粏-閫氳繃id鏌ヨ", notes="鍏ュ簱鐢宠鏄庣粏-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<InboundDetail> queryById(@RequestParam(name="id",required=true) String id) {
+		InboundDetail inboundDetail = inboundDetailService.getById(id);
+		if(inboundDetail==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(inboundDetail);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param inboundDetail
+    */
+    //@RequiresPermissions("org.jeecg.modules:tms_inbound_detail:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InboundDetail inboundDetail) {
+        return super.exportXls(request, inboundDetail, InboundDetail.class, "鍏ュ簱鐢宠鏄庣粏");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("tms_inbound_detail:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, InboundDetail.class);
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundOrderController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundOrderController.java
new file mode 100644
index 0000000..6852a66
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/InboundOrderController.java
@@ -0,0 +1,237 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.jeecg.modules.tms.entity.InboundDetail;
+import org.jeecg.modules.tms.entity.InboundOrder;
+import org.jeecg.modules.tms.entity.dto.InboundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.service.IInboundDetailService;
+import org.jeecg.modules.tms.service.IInboundOrderService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+ /**
+ * @Description: 鍏ュ簱鐢宠鍗�
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Api(tags="鍏ュ簱鐢宠鍗�")
+@RestController
+@RequestMapping("/tms/inboundOrder")
+@Slf4j
+public class InboundOrderController extends JeecgController<InboundOrder, IInboundOrderService> {
+	@Autowired
+	private IInboundOrderService inboundOrderService;
+
+	 @Autowired
+	 private IInboundDetailService inboundDetailService;
+
+
+	 @Autowired
+	 private ISysBusinessCodeRuleService businessCodeRuleService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param inboundOrder
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鐢宠鍗�-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-鍒嗛〉鍒楄〃鏌ヨ", notes="鍏ュ簱鐢宠鍗�-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<IPage<InboundOrder>> queryPageList(InboundOrder inboundOrder,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<InboundOrder> queryWrapper = QueryGenerator.initQueryWrapper(inboundOrder, req.getParameterMap());
+		Page<InboundOrder> page = new Page<InboundOrder>(pageNo, pageSize);
+		IPage<InboundOrder> pageList = inboundOrderService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param jSONObject
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鍗�-娣诲姞")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-娣诲姞", notes="鍏ュ簱鐢宠鍗�-娣诲姞")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_order:add")
+	@PostMapping(value = "/add")
+	public Result<?> add(@RequestBody JSONObject jSONObject) {
+		InboundOrder inboundOrder = jSONObject.toJavaObject(InboundOrder.class);
+		inboundOrder.setOrderStatus("1");
+		inboundOrder.setInStatus("1");
+		inboundOrder.setInboundNum(businessCodeRuleService.generateBusinessCodeSeq("InBoundOrder"));
+		inboundOrderService.save(inboundOrder);
+		// 淇濆瓨鍏ュ簱鐢宠鍗曟槑缁嗘暟鎹�
+		JSONArray jsonArray = jSONObject.getJSONArray("detailData");
+		List<InboundDetail> list = jsonArray.toJavaList(InboundDetail.class);
+		for (int i = 0; i < list.size(); i++) {
+			InboundDetail temp = list.get(i);
+			temp.setInStorehouseId(inboundOrder.getId());
+			temp.setToolCode(temp.getToolCodeId());
+		}
+		inboundDetailService.saveBatch(list);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param jSONObject
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鍗�-缂栬緫")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-缂栬緫", notes="鍏ュ簱鐢宠鍗�-缂栬緫")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_order:edit")
+	@PostMapping(value = "/edit")
+	public Result<?> edit(@RequestBody JSONObject jSONObject) {
+		InboundOrder inboundOrder = jSONObject.toJavaObject(InboundOrder.class);
+		inboundOrderService.updateById(inboundOrder);
+		// 鍒犻櫎鐢宠鍗曟槑缁嗘暟鎹�
+		inboundDetailService.deleteByInboundOrderId(inboundOrder.getId());
+		// 淇濆瓨鍏ュ簱鐢宠鍗曟槑缁嗘暟鎹�
+		JSONArray jsonArray = jSONObject.getJSONArray("detailData");
+		List<InboundDetail> list = jsonArray.toJavaList(InboundDetail.class);
+		for (int i = 0; i < list.size(); i++) {
+			InboundDetail temp = list.get(i);
+			temp.setInStorehouseId(inboundOrder.getId());
+			temp.setToolCode(temp.getToolCodeId());
+		}
+		inboundDetailService.saveOrUpdateBatch(list);
+		return Result.OK("鎿嶄綔鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鍗�-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-閫氳繃id鍒犻櫎", notes="鍏ュ簱鐢宠鍗�-閫氳繃id鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_order:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		inboundOrderService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "鍏ュ簱鐢宠鍗�-鎵归噺鍒犻櫎")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-鎵归噺鍒犻櫎", notes="鍏ュ簱鐢宠鍗�-鎵归噺鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_inbound_order:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.inboundOrderService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "鍏ュ簱鐢宠鍗�-閫氳繃id鏌ヨ")
+	@ApiOperation(value="鍏ュ簱鐢宠鍗�-閫氳繃id鏌ヨ", notes="鍏ュ簱鐢宠鍗�-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<InboundOrder> queryById(@RequestParam(name="id",required=true) String id) {
+		InboundOrder inboundOrder = inboundOrderService.getById(id);
+		if(inboundOrder==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(inboundOrder);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param inboundOrder
+    */
+    //@RequiresPermissions("org.jeecg.modules:tms_inbound_order:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InboundOrder inboundOrder) {
+        return super.exportXls(request, inboundOrder, InboundOrder.class, "鍏ュ簱鐢宠鍗�");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("tms_inbound_order:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, InboundOrder.class);
+    }
+
+	 /**
+	  *  鎻愪氦
+	  *
+	  * @param id
+	  * @return
+	  */
+	 @AutoLog(value = "鍏ュ簱鐢宠鍗�-鎻愪氦")
+	 @GetMapping(value = "/submit")
+	 public Result<String> submit(@RequestParam(name = "id") String id) {
+		 inboundOrderService.submit(id);
+		 return Result.OK("鎻愪氦鎴愬姛!");
+	 }
+
+	 @AutoLog(value = "瀹℃壒娴佺▼")
+	 @ApiOperation(value = "鍏ュ簱鐢宠鍗�-瀹℃壒娴佺▼", notes = "鍏ュ簱鐢宠鍗�-瀹℃壒娴佺▼")
+	 @PostMapping("/approval")
+	 public Result<?> approval(@RequestBody InboundOrderFlowDto inboundOrderFlowDto) {
+		 inboundOrderService.approvalProcess(inboundOrderFlowDto);
+		 return Result.OK("鎿嶄綔鎴愬姛");
+	 }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutStoreDetailController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutStoreDetailController.java
new file mode 100644
index 0000000..11f95c5
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutStoreDetailController.java
@@ -0,0 +1,179 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.tms.entity.OutStoreDetail;
+import org.jeecg.modules.tms.entity.vo.OutStoreDetailVo;
+import org.jeecg.modules.tms.service.IOutStoreDetailService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+ /**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+@Api(tags="宸ュ叿鍑哄簱娴佹按")
+@RestController
+@RequestMapping("/tms/outStoreDetail")
+@Slf4j
+public class OutStoreDetailController extends JeecgController<OutStoreDetail, IOutStoreDetailService> {
+	@Autowired
+	private IOutStoreDetailService outStoreDetailService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param outStoreDetail
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-鍒嗛〉鍒楄〃鏌ヨ", notes="宸ュ叿鍑哄簱娴佹按-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<IPage<OutStoreDetailVo>> queryPageList(OutStoreDetail outStoreDetail,
+														 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														 HttpServletRequest req) {
+		Map<String, String[]> parameterMap = req.getParameterMap();
+		QueryWrapper<OutStoreDetail> queryWrapper = QueryGenerator.initQueryWrapper(outStoreDetail, parameterMap);
+		Page<OutStoreDetailVo> page = new Page<>(pageNo, pageSize);
+		IPage<OutStoreDetailVo> pageList = outStoreDetailService.queryPageList(page, parameterMap);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param outStoreDetail
+	 * @return
+	 */
+	@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-娣诲姞")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-娣诲姞", notes="宸ュ叿鍑哄簱娴佹按-娣诲姞")
+	//@RequiresPermissions("org.jeecg.modules:tms_out_store_detail:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody OutStoreDetail outStoreDetail) {
+		outStoreDetailService.save(outStoreDetail);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param outStoreDetail
+	 * @return
+	 */
+	@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-缂栬緫")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-缂栬緫", notes="宸ュ叿鍑哄簱娴佹按-缂栬緫")
+	//@RequiresPermissions("org.jeecg.modules:tms_out_store_detail:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody OutStoreDetail outStoreDetail) {
+		outStoreDetailService.updateById(outStoreDetail);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-閫氳繃id鍒犻櫎", notes="宸ュ叿鍑哄簱娴佹按-閫氳繃id鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_out_store_detail:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		outStoreDetailService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-鎵归噺鍒犻櫎")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-鎵归噺鍒犻櫎", notes="宸ュ叿鍑哄簱娴佹按-鎵归噺鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_out_store_detail:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.outStoreDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "宸ュ叿鍑哄簱娴佹按-閫氳繃id鏌ヨ")
+	@ApiOperation(value="宸ュ叿鍑哄簱娴佹按-閫氳繃id鏌ヨ", notes="宸ュ叿鍑哄簱娴佹按-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<OutStoreDetail> queryById(@RequestParam(name="id",required=true) String id) {
+		OutStoreDetail outStoreDetail = outStoreDetailService.getById(id);
+		if(outStoreDetail==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(outStoreDetail);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param outStoreDetail
+    */
+    //@RequiresPermissions("org.jeecg.modules:tms_out_store_detail:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, OutStoreDetail outStoreDetail) {
+        return super.exportXls(request, outStoreDetail, OutStoreDetail.class, "宸ュ叿鍑哄簱娴佹按");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("tms_out_store_detail:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, OutStoreDetail.class);
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java
index bed72c4..cb806cf 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java
@@ -13,6 +13,7 @@
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.TranslateDictTextUtils;
 import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundRequestDto;
 import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
 import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
 import org.jeecg.modules.tms.enums.OutBillStatus;
@@ -177,6 +178,14 @@
 		return Result.OK("鎿嶄綔鎴愬姛");
 	 }
 
+	 @AutoLog(value = "鐢宠鍗曟柟寮忓嚭搴�")
+	 @ApiOperation(value = "鐢宠鍗曟柟寮忓嚭搴�", notes = "鐢宠鍗曟柟寮忓嚭搴�")
+	 @PostMapping(value = "/outBound")
+	 public Result<?> outBound(@RequestBody List<OutBoundRequestDto> outBoundRequestList) {
+		outboundOrderService.outBound(outBoundRequestList);
+		return Result.OK("鍑哄簱鎴愬姛");
+	 }
+
     /**
      * 閫氳繃id鍒犻櫎
      * @param id
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
new file mode 100644
index 0000000..bd1031a
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
@@ -0,0 +1,118 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.tms.entity.ToolLedger;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.vo.ToolSharpeningVo;
+import org.jeecg.modules.tms.service.IToolsSharpeningService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: 鍒�鍏峰垉纾ㄨ褰� 鎺у埗鍣�
+ * @Author: houjie
+ * @Date:   2025-05-10
+ */
+@RestController
+@RequestMapping("/tms/toolSharpening")
+@Api(tags = "鍒�鍏峰垉纾ㄨ褰曠鐞�")
+public class ToolSharpeningController {
+
+    @Autowired
+    private IToolsSharpeningService toolSharpeningService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     */
+//    @GetMapping("/list")
+//    @ApiOperation(value = "鍒嗛〉鏌ヨ", notes = "鍒嗛〉鏌ヨ")
+//    public Result<IPage<ToolSharpening>> queryPageList(ToolSharpening toolSharpening,
+//                                                       @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+//                                                       @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
+//        Page<ToolSharpening> page = new Page<>(pageNo, pageSize);
+//        QueryWrapper<ToolSharpening> queryWrapper = new QueryWrapper<>(toolSharpening);
+//        IPage<ToolSharpening> iPage = toolSharpeningService.page(page, queryWrapper);
+//        return Result.OK(iPage);
+//    }
+
+
+    @ApiOperation(value="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ", notes="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ")
+    @GetMapping(value = "/listToolSharpening")
+    public Result<IPage<ToolSharpeningVo>> listToolSharpening(ToolSharpeningVo toolSharpeningVo,
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                              HttpServletRequest req) {
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        QueryWrapper<ToolSharpeningVo> queryWrapper = QueryGenerator.initQueryWrapper(toolSharpeningVo, parameterMap);
+        Page<ToolSharpeningVo> page = new Page<ToolSharpeningVo>(pageNo, pageSize);
+        IPage<ToolSharpeningVo> pageList = toolSharpeningService.queryPageList(page, parameterMap);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夋暟鎹�
+     */
+    @GetMapping("/all")
+    @ApiOperation(value = "鏌ヨ鎵�鏈夋暟鎹�", notes = "鏌ヨ鎵�鏈夋暟鎹�")
+    public Result<List<ToolSharpening>> queryAll() {
+        List<ToolSharpening> list = toolSharpeningService.list();
+        return Result.OK(list);
+    }
+
+    /**
+     * 鏍规嵁ID鏌ヨ
+     */
+    @GetMapping("/{id}")
+    @ApiOperation(value = "鏍规嵁ID鏌ヨ", notes = "鏍规嵁ID鏌ヨ")
+    public Result<ToolSharpening> queryById(@PathVariable String id) {
+        ToolSharpening entity = toolSharpeningService.getById(id);
+        return Result.OK(entity);
+    }
+
+
+    @AutoLog(value = "tms_tool_sharpening-娣诲姞")
+    @ApiOperation(value="tms_tool_sharpening-娣诲姞", notes="tms_tool_sharpening-娣诲姞")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody ToolSharpening toolSharpening) {
+        toolSharpeningService.save(toolSharpening);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+    /**
+     * 淇敼
+     */
+    @PutMapping
+    @ApiOperation(value = "淇敼", notes = "淇敼")
+    public Result<ToolSharpening> edit(@RequestBody ToolSharpening toolSharpening) {
+        toolSharpeningService.updateById(toolSharpening);
+        return Result.OK(toolSharpening);
+    }
+
+
+
+
+    /**
+     * 鍒犻櫎
+     */
+
+    @AutoLog(value = "tms_tool_sharpening-閫氳繃id鍒犻櫎")
+    @ApiOperation(value="tms_tool_sharpening-閫氳繃id鍒犻櫎", notes="tms_tool_sharpening-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+        toolSharpeningService.removeById(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java
new file mode 100644
index 0000000..d610f05
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java
@@ -0,0 +1,327 @@
+package org.jeecg.modules.tms.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.OutboundOrder;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.service.IToolsLossBoundDetailService;
+import org.jeecg.modules.tms.service.IToolsLossBoundService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 鎹熻�楀崟
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags="鎹熻�楀崟")
+@RestController
+	@RequestMapping("/tms/toolsLossBound")
+public class ToolsLossBoundController extends JeecgController<ToolsLossBound, IToolsLossBoundService> {
+	@Autowired
+	private IToolsLossBoundService toolsLossBoundService;
+	@Autowired
+	private IToolsLossBoundDetailService toolsLossBoundDetailService;
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param toolsLossBound
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@AutoLog(value = "鎹熻�楀崟-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="鎹熻�楀崟-鍒嗛〉鍒楄〃鏌ヨ", notes="鎹熻�楀崟-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<?> queryPageList(ToolsLossBound toolsLossBound,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<ToolsLossBound> queryWrapper = QueryGenerator.initQueryWrapper(toolsLossBound, req.getParameterMap());
+		Page<ToolsLossBound> page = new Page<ToolsLossBound>(pageNo, pageSize);
+		IPage<ToolsLossBound> pageList = toolsLossBoundService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+
+
+	/**
+	 * 缂栬緫
+	 *
+	 * @param toolsLossBound
+	 * @return
+	 */
+	@AutoLog(value = "鎹熻�楀崟-缂栬緫")
+	@ApiOperation(value="鎹熻�楀崟-缂栬緫", notes="鎹熻�楀崟-缂栬緫")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<?> edit(@RequestBody ToolsLossBound toolsLossBound) {
+		toolsLossBoundService.updateById(toolsLossBound);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	 /**
+	  *   娣诲姞
+	  * @param toolsLossBound
+	  * @return
+	  */
+	 @AutoLog(value = "tms_loss_bound-娣诲姞")
+	 @ApiOperation(value="tms_loss_bound-娣诲姞", notes="tms_loss_bound-娣诲姞")
+	 @PostMapping(value = "/add")
+	 public Result<String> add(@RequestBody ToolsLossBound toolsLossBound) {
+		 toolsLossBoundService.save(toolsLossBound);
+		 return Result.OK("娣诲姞鎴愬姛锛�");
+	 }
+
+	 @AutoLog(value = "tms_loss_bound-娣诲姞鎶ユ崯鐢宠鍗曚富琛ㄥ強鏄庣粏淇℃伅")
+	 @ApiOperation(value="tms_loss_bound-娣诲姞鎶ユ崯鐢宠鍗曚富琛ㄥ強鏄庣粏淇℃伅", notes="tms_loss_bound-娣诲姞鎶ユ崯鐢宠鍗曚富琛ㄥ強鏄庣粏淇℃伅")
+	 @PostMapping(value = "/addTotal")
+	 public Result<String> addTotal(@RequestBody ToolsLossBound toolsLossBound) {
+		 toolsLossBoundService.addTotal(toolsLossBound);
+		 return Result.OK("娣诲姞鎴愬姛锛�");
+	 }
+
+	 @AutoLog(value = "tms_loss_bound-缂栬緫鎶ユ崯鍗曚富琛ㄥ強鏄庣粏淇℃伅")
+	 @ApiOperation(value="tms_loss_bound-缂栬緫鎶ユ崯鍗曚富琛ㄥ強鏄庣粏淇℃伅", notes="tms_loss_bound-缂栬緫鎶ユ崯鍗曚富琛ㄥ強鏄庣粏淇℃伅")
+	 @RequestMapping(value = "/editTotal", method = {RequestMethod.PUT,RequestMethod.POST})
+	 public Result<String> editTotal(@RequestBody ToolsLossBound toolsLossBound) {
+		 toolsLossBoundService.editTotal(toolsLossBound);
+		 return Result.OK("缂栬緫鎴愬姛锛�");
+	 }
+
+	/**
+	 * 閫氳繃id鍒犻櫎
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鎶ユ崯鍗曟槑缁�-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="鎶ユ崯鍗曟槑缁�-閫氳繃id鍒犻櫎", notes="鎶ユ崯鍗曟槑缁�-閫氳繃id鍒犻櫎")
+	@DeleteMapping(value = "/deleteLootboundDetail")
+	public Result<String> deleteLootboundDetail(@RequestParam(name="id",required=true) String id) {
+		toolsLossBoundService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	/**
+	 * 閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鎹熻�楀崟-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="鎹熻�楀崟-閫氳繃id鍒犻櫎", notes="鎹熻�楀崟-閫氳繃id鍒犻櫎")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		toolsLossBoundService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+
+	@AutoLog(value = "tms_loss_bound-鎻愪氦鎶ユ崯鍗�")
+	@ApiOperation(value="tms_loss_bound-鎻愪氦鎶ユ崯鍗�", notes="tms_loss_bound-鎻愪氦鎶ユ崯鍗�")
+	@GetMapping(value = "/submit")
+	public Result<String> submit(@RequestParam(name="id") String id) {
+
+
+		toolsLossBoundService.submintOrder(id);
+		return Result.OK("鎻愪氦鎴愬姛");
+	}
+
+
+
+	@AutoLog(value = "瀹℃壒娴佺▼")
+	@ApiOperation(value = "鎶ユ崯鍗�-瀹℃壒娴佺▼", notes = "鎶ユ崯鍗�-瀹℃壒娴佺▼")
+	@PostMapping("/approval")
+	public Result<?> approval(@RequestBody LossBoundFlowDto lossBoundFlowDto) {
+		toolsLossBoundService.approvalProcess(lossBoundFlowDto);
+		return Result.OK("鎿嶄綔鎴愬姛");
+	}
+	/**
+	 * 鎵归噺鍒犻櫎
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "鎶ユ崯鍗曟槑缁�-鎵归噺鍒犻櫎")
+	@ApiOperation(value="鎶ユ崯鍗曟槑缁�-鎵归噺鍒犻櫎", notes="鎶ユ崯鍗曟槑缁�-鎵归噺鍒犻櫎")
+	@DeleteMapping(value = "/deleteBatchLossboundDetail")
+	public Result<String> deleteBatchLossboundDetail(@RequestParam(name="ids",required=true) String ids) {
+		this.toolsLossBoundDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	/**
+	 * 鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "鎹熻�楀崟-鎵归噺鍒犻櫎")
+	@ApiOperation(value="鎹熻�楀崟-鎵归噺鍒犻櫎", notes="鎹熻�楀崟-鎵归噺鍒犻櫎")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.toolsLossBoundService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "鎹熻�楀崟-閫氳繃id鏌ヨ")
+	@ApiOperation(value="鎹熻�楀崟-閫氳繃id鏌ヨ", notes="鎹熻�楀崟-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
+		ToolsLossBound toolsLossBound = toolsLossBoundService.getById(id);
+		return Result.OK(toolsLossBound);
+	}
+
+  /**
+   * 瀵煎嚭excel
+   *
+   * @param request
+   * @param toolsLossBound
+   */
+  @RequestMapping(value = "/exportXls")
+  public ModelAndView exportXls(HttpServletRequest request, ToolsLossBound toolsLossBound) {
+      return super.exportXls(request, toolsLossBound, ToolsLossBound.class, "鎹熻�楀崟");
+  }
+
+
+	/**
+	 * 瀵煎嚭
+	 * @return
+	 */
+	@RequestMapping(value = "/exportLossboundDetail")
+		public ModelAndView exportLossboundDetail(HttpServletRequest request, ToolsLossBoundDetail toolsLossBoundDetail) {
+		// Step.1 缁勮鏌ヨ鏉′欢
+		QueryWrapper<ToolsLossBoundDetail> queryWrapper = QueryGenerator.initQueryWrapper(toolsLossBoundDetail, request.getParameterMap());
+		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+		// Step.2 鑾峰彇瀵煎嚭鏁版嵁
+		List<ToolsLossBoundDetail> pageList = toolsLossBoundDetailService.list(queryWrapper);
+		List<ToolsLossBoundDetail> exportList = null;
+
+		// 杩囨护閫変腑鏁版嵁
+		String selections = request.getParameter("selections");
+		if (oConvertUtils.isNotEmpty(selections)) {
+			List<String> selectionList = Arrays.asList(selections.split(","));
+			exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+		} else {
+			exportList = pageList;
+		}
+
+		// Step.3 AutoPoi 瀵煎嚭Excel
+		ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+		//姝ゅ璁剧疆鐨刦ilename鏃犳晥,鍓嶇浼氶噸鏇存柊璁剧疆涓�涓�
+		mv.addObject(NormalExcelConstants.FILE_NAME, "鎶ユ崯鍗曟槑缁�");
+		mv.addObject(NormalExcelConstants.CLASS, OutboundDetail.class);
+		mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("鎶ユ崯鍗曟槑缁嗘姤琛�", "瀵煎嚭浜�:" + sysUser.getRealname(), "鎶ユ崯鍗曟槑缁�"));
+		mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+		return mv;
+	}
+
+
+	/**
+	 * 瀵煎叆
+	 * @return
+	 */
+	@RequestMapping(value = "/importLossboundDetail/{mainId}")
+	public Result<?> importLossboundDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") String mainId) {
+		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+			// 鑾峰彇涓婁紶鏂囦欢瀵硅薄
+			MultipartFile file = entity.getValue();
+			ImportParams params = new ImportParams();
+			params.setTitleRows(2);
+			params.setHeadRows(1);
+			params.setNeedSave(true);
+			try {
+				List<ToolsLossBoundDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), ToolsLossBoundDetail.class, params);
+				for (ToolsLossBoundDetail temp : list) {
+					temp.setLossBoundId(mainId);
+				}
+				long start = System.currentTimeMillis();
+				toolsLossBoundDetailService.saveBatch(list);
+				log.info("娑堣�楁椂闂�" + (System.currentTimeMillis() - start) + "姣");
+				return Result.OK("鏂囦欢瀵煎叆鎴愬姛锛佹暟鎹鏁帮細" + list.size());
+			} catch (Exception e) {
+				log.error(e.getMessage(), e);
+				return Result.error("鏂囦欢瀵煎叆澶辫触:" + e.getMessage());
+			} finally {
+				try {
+					file.getInputStream().close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return Result.error("鏂囦欢瀵煎叆澶辫触锛�");
+	}
+
+
+  /**
+   * 閫氳繃excel瀵煎叆鏁版嵁
+   *
+   * @param request
+   * @param response
+   * @return
+   */
+  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+      return super.importExcel(request, response, ToolsLossBound.class);
+  }
+
+
+
+	/**
+	 * 閫氳繃涓昏〃ID鏌ヨ
+	 * @return
+	 */
+
+	@ApiOperation(value="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ", notes="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ")
+	@GetMapping(value = "/listlossboundDetailByMainId")
+	public Result<IPage<ToolsLossBoundDetail>> listlossboundDetailByMainId(ToolsLossBoundDetail toolsLossBoundDetail,
+																	   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+																	   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+																	   HttpServletRequest req) {
+		Map<String, String[]> parameterMap = req.getParameterMap();
+		QueryWrapper<ToolsLossBoundDetail> queryWrapper = QueryGenerator.initQueryWrapper(toolsLossBoundDetail, parameterMap);
+		Page<ToolsLossBoundDetail> page = new Page<ToolsLossBoundDetail>(pageNo, pageSize);
+		IPage<ToolsLossBoundDetail> pageList = toolsLossBoundDetailService.queryPageList(page, parameterMap);
+		return Result.OK(pageList);
+	}
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
new file mode 100644
index 0000000..ffef65a
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
@@ -0,0 +1,286 @@
+package org.jeecg.modules.tms.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.jeecg.modules.tms.entity.BaseTools;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.entity.dto.StocktakingBoundFlowDto;
+import org.jeecg.modules.tms.entity.vo.ToolsStocktakingVo;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundMapper;
+import org.jeecg.modules.tms.service.IToolsStocktakingBoundDetailService;
+import org.jeecg.modules.tms.service.IToolsStocktakingBoundService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: houjie
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+@Api(tags = "鐩樼偣鍗曡〃")
+@RestController
+@RequestMapping("/tms/toolsStocktakingBound")
+@Slf4j
+public class ToolsStocktakingBoundController {
+    @Autowired
+    private IToolsStocktakingBoundService toolsStocktakingBoundService;
+    @Autowired
+    private IToolsStocktakingBoundDetailService toolsStocktakingBoundDetailService;
+    @Autowired
+    private ToolsStocktakingBoundMapper toolsStocktakingBoundMapper;
+
+    @Autowired
+    private ISysBusinessCodeRuleService businessCodeRuleService;
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param toolsStocktakingBound
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "鐩樼偣鍗曡〃-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "鐩樼偣鍗曡〃-鍒嗛〉鍒楄〃鏌ヨ", notes = "鐩樼偣鍗曡〃-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<IPage<ToolsStocktakingBound>> queryPageList(ToolsStocktakingBound toolsStocktakingBound,
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                              HttpServletRequest req) {
+        QueryWrapper<ToolsStocktakingBound> queryWrapper = QueryGenerator.initQueryWrapper(toolsStocktakingBound, req.getParameterMap());
+        Page<ToolsStocktakingBound> page = new Page<ToolsStocktakingBound>(pageNo, pageSize);
+        IPage<ToolsStocktakingBound> pageList = toolsStocktakingBoundService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+
+    /**
+     * 娣诲姞
+     *
+     * @param toolsStocktakingBound
+     * @return
+     */
+    @AutoLog(value = "tms_stocktaking_bound-娣诲姞")
+    @ApiOperation(value = "tms_stocktaking_bound-娣诲姞", notes = "tms_stocktaking_bound-娣诲姞")
+    @PostMapping(value = "/add")
+    @Transactional(rollbackFor = {Exception.class})
+    public Result<String> add(@RequestBody ToolsStocktakingBound toolsStocktakingBound) {
+        toolsStocktakingBound.setApprovalStatus(OutBillStatus.DRAFT.getValue());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (sysUser != null) {
+            toolsStocktakingBound.setHandler(sysUser.getId());
+        }
+        toolsStocktakingBound.setOrderCode(businessCodeRuleService.generateBusinessCodeSeq("stocktakingBound"));
+        //鏍¢獙鐗╂枡鍦ㄥ師鏉愭枡鍛ㄨ浆搴撳瓨涓嶅瓨鍦�
+        List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList = toolsStocktakingBound.getToolsStocktakingBoundDetailList();
+
+        toolsStocktakingBoundService.save(toolsStocktakingBound);
+        for (int i = 0; i < toolsStocktakingBoundDetailList.size(); i++) {
+            ToolsStocktakingBoundDetail toolsStocktakingBoundDetail = toolsStocktakingBoundDetailList.get(i);
+            toolsStocktakingBoundDetail.setAvailableQuantity(toolsStocktakingBoundDetail.getBookQuantity());
+            toolsStocktakingBoundDetail.setPracticalQuantity(toolsStocktakingBoundDetail.getPracticalQuantity());
+            toolsStocktakingBoundDetail.setSurplusDeficit(toolsStocktakingBoundDetail.getSurplusDeficit());
+            toolsStocktakingBoundDetail.setStocktakingDate(toolsStocktakingBoundDetail.getStocktakingDate());
+            toolsStocktakingBoundDetail.setRemark(toolsStocktakingBoundDetail.getRemark());
+            toolsStocktakingBoundDetail.setToolId(toolsStocktakingBoundDetail.getToolId());
+            toolsStocktakingBoundDetail.setToolCode(toolsStocktakingBoundDetail.getToolCode());
+            toolsStocktakingBoundDetail.setStocktakingBoundId(toolsStocktakingBound.getId());
+            toolsStocktakingBoundDetailService.save(toolsStocktakingBoundDetail);
+        }
+        return Result.OK();
+
+
+    }
+
+
+    @ApiOperation(value = "宸ュ叿鐩樼偣鏄庣粏-閫氳繃涓昏〃ID鏌ヨ", notes = "宸ュ叿鐩樼偣鏄庣粏-閫氳繃涓昏〃ID鏌ヨ")
+    @GetMapping(value = "/listToolsStocktakingBoundControllerDetailsByMainId")
+    public Result<IPage<ToolsStocktakingBoundDetail>> listToolsStocktakingBoundControllerDetailsByMainId(BaseTools baseTools,
+                                                                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                                                         HttpServletRequest req) {
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        Page<ToolsStocktakingBoundDetail> page = new Page<ToolsStocktakingBoundDetail>(pageNo, pageSize);
+        IPage<ToolsStocktakingBoundDetail> pageList = toolsStocktakingBoundDetailService.selectByMainId(page, parameterMap);
+
+        return Result.OK(pageList);
+    }
+
+
+    @AutoLog(value = "tms_stocktaking_bound-鎻愪氦鐩樼偣鍗�")
+    @ApiOperation(value = "tms_stocktaking_bound-鎻愪氦鐩樼偣鍗�", notes = "tms_stocktaking_bound-鎻愪氦鐩樼偣鍗�")
+    @GetMapping(value = "/submit")
+    public Result<String> submit(@RequestParam(name = "id") String id) {
+
+
+        toolsStocktakingBoundService.submintOrder(id);
+        return Result.OK("鎻愪氦鎴愬姛");
+    }
+
+    /**
+     * 瀹℃壒娴佺▼
+     * @param stocktakingBoundFlowDto
+     * @return
+     */
+    @AutoLog(value = "瀹℃壒娴佺▼")
+    @ApiOperation(value = "鎶ユ崯鍗�-瀹℃壒娴佺▼", notes = "鎶ユ崯鍗�-瀹℃壒娴佺▼")
+    @PostMapping("/approval")
+    public Result<?> approval(@RequestBody StocktakingBoundFlowDto stocktakingBoundFlowDto) {
+        toolsStocktakingBoundService.approvalProcess(stocktakingBoundFlowDto);
+        return Result.OK("鎿嶄綔鎴愬姛");
+    }
+    /**
+     * 缂栬緫
+     *
+     * @param toolsStocktakingBound
+     * @return
+     */
+    @AutoLog(value = "鐩樼偣鍗曡〃-缂栬緫")
+    @ApiOperation(value = "鐩樼偣鍗曡〃-缂栬緫", notes = "鐩樼偣鍗曡〃-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    @Transactional(rollbackFor = {Exception.class})
+    public Result<String> edit(@RequestBody ToolsStocktakingBound toolsStocktakingBound) {
+        if (toolsStocktakingBound == null || StringUtils.isBlank(toolsStocktakingBound.getId())) {
+            return Result.error("鍙傛暟閿欒");
+        }
+
+        toolsStocktakingBoundDetailService.remove(new LambdaQueryWrapper<ToolsStocktakingBoundDetail>()
+                .eq(ToolsStocktakingBoundDetail::getStocktakingBoundId, toolsStocktakingBound.getId()));
+
+        ToolsStocktakingBound stocktakingBound = new ToolsStocktakingBound();
+        BeanUtils.copyProperties(stocktakingBound, toolsStocktakingBound);
+        toolsStocktakingBoundMapper.updateById(stocktakingBound);
+
+
+        List<ToolsStocktakingBoundDetail> detailList = toolsStocktakingBound.getToolsStocktakingBoundDetailList();
+        if (CollectionUtils.isEmpty(detailList)) {
+            return Result.error("鏄庣粏涓嶈兘涓虹┖");
+        }
+
+        detailList.forEach(item -> item.setStocktakingBoundId(stocktakingBound.getId()));
+        toolsStocktakingBoundDetailService.saveBatch(detailList);
+
+        return Result.OK("缂栬緫鎴愬姛");
+    }
+
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "鐩樼偣鍗曡〃-閫氳繃id鍒犻櫎")
+    @ApiOperation(value = "鐩樼偣鍗曡〃-閫氳繃id鍒犻櫎", notes = "鐩樼偣鍗曡〃-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        toolsStocktakingBoundService.delMain(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "鐩樼偣鍗曡〃-鎵归噺鍒犻櫎")
+    @ApiOperation(value = "鐩樼偣鍗曡〃-鎵归噺鍒犻櫎", notes = "鐩樼偣鍗曡〃-鎵归噺鍒犻櫎")
+
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.toolsStocktakingBoundService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "鐩樼偣鍗曡〃-閫氳繃id鏌ヨ")
+    @ApiOperation(value = "鐩樼偣鍗曡〃-閫氳繃id鏌ヨ", notes = "鐩樼偣鍗曡〃-閫氳繃id鏌ヨ")
+    @GetMapping(value = "/queryById")
+    public Result<ToolsStocktakingBound> queryById(@RequestParam(name = "id", required = true) String id) {
+        ToolsStocktakingBound toolsStocktakingBound = toolsStocktakingBoundService.getById(id);
+        if (toolsStocktakingBound == null) {
+            return Result.error("鏈壘鍒板搴旀暟鎹�");
+        }
+        return Result.OK(toolsStocktakingBound);
+
+    }
+
+
+    /**
+     * 閫氳繃excel瀵煎叆鏁版嵁
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 鑾峰彇涓婁紶鏂囦欢瀵硅薄
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<ToolsStocktakingVo> list = ExcelImportUtil.importExcel(file.getInputStream(), ToolsStocktakingVo.class, params);
+                for (ToolsStocktakingVo page : list) {
+                    ToolsStocktakingBound po = new ToolsStocktakingBound();
+                    BeanUtils.copyProperties(page, po);
+                    toolsStocktakingBoundService.saveMain(po, page.getToolsStocktakingBoundDetailList());
+                }
+                return Result.OK("鏂囦欢瀵煎叆鎴愬姛锛佹暟鎹鏁�:" + list.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("鏂囦欢瀵煎叆澶辫触:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.OK("鏂囦欢瀵煎叆澶辫触锛�");
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStoreEarlyWarningController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStoreEarlyWarningController.java
new file mode 100644
index 0000000..e2a8f25
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStoreEarlyWarningController.java
@@ -0,0 +1,159 @@
+package org.jeecg.modules.tms.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.tms.entity.ToolsStoreEarlyWarning;
+import org.jeecg.modules.tms.service.IToolsStoreEarlyWarningService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+ /**
+ * @Description: tools_store_early warning
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@Api(tags="tools_store_early warning")
+@RestController
+@RequestMapping("/tms/toolsStoreEarlyWarning")
+@Slf4j
+public class ToolsStoreEarlyWarningController extends JeecgController<ToolsStoreEarlyWarning, IToolsStoreEarlyWarningService> {
+	@Autowired
+	private IToolsStoreEarlyWarningService toolsStoreEarlyWarningService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param tmsStoreEarlyWarning
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "tools_store_early warning-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="tools_store_early warning-鍒嗛〉鍒楄〃鏌ヨ", notes="tools_store_early warning-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<IPage<ToolsStoreEarlyWarning>> queryPageList(ToolsStoreEarlyWarning tmsStoreEarlyWarning,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<ToolsStoreEarlyWarning> queryWrapper = QueryGenerator.initQueryWrapper(tmsStoreEarlyWarning, req.getParameterMap());
+		Page<ToolsStoreEarlyWarning> page = new Page<ToolsStoreEarlyWarning>(pageNo, pageSize);
+		IPage<ToolsStoreEarlyWarning> pageList = toolsStoreEarlyWarningService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param toolsStoreEarlyWarning
+	 * @return
+	 */
+	@AutoLog(value = "tools_store_early warning-娣诲姞")
+	@ApiOperation(value="tools_store_early warning-娣诲姞", notes="tools_store_early warning-娣诲姞")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody ToolsStoreEarlyWarning toolsStoreEarlyWarning) {
+		toolsStoreEarlyWarningService.save(toolsStoreEarlyWarning);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param tmsStoreEarlyWarning
+	 * @return
+	 */
+	@AutoLog(value = "tools_store_early warning-缂栬緫")
+	@ApiOperation(value="tools_store_early warning-缂栬緫", notes="tools_store_early warning-缂栬緫")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody ToolsStoreEarlyWarning tmsStoreEarlyWarning) {
+		toolsStoreEarlyWarningService.updateById(tmsStoreEarlyWarning);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "tools_store_early warning-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="tools_store_early warning-閫氳繃id鍒犻櫎", notes="tools_store_early warning-閫氳繃id鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_tools_config_property:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		toolsStoreEarlyWarningService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "tools_store_early warning-鎵归噺鍒犻櫎")
+	@ApiOperation(value="tools_store_early warning-鎵归噺鍒犻櫎", notes="tools_store_early warning-鎵归噺鍒犻櫎")
+	//@RequiresPermissions("org.jeecg.modules:tms_tools_config_property:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.toolsStoreEarlyWarningService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "tools_store_early warning-閫氳繃id鏌ヨ")
+	@ApiOperation(value="tools_store_early warning-閫氳繃id鏌ヨ", notes="tools_store_early warning-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<ToolsStoreEarlyWarning> queryById(@RequestParam(name="id",required=true) String id) {
+		ToolsStoreEarlyWarning tmsStoreEarlyWarning = toolsStoreEarlyWarningService.getById(id);
+		if(tmsStoreEarlyWarning==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(tmsStoreEarlyWarning);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param tmsStoreEarlyWarning
+    */
+    //@RequiresPermissions("tools_tools_config_property:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, ToolsStoreEarlyWarning tmsStoreEarlyWarning) {
+        return super.exportXls(request, tmsStoreEarlyWarning, ToolsStoreEarlyWarning.class, "tools_store_early warning");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("tools_tools_config_property:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, ToolsStoreEarlyWarning.class);
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InStoreDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InStoreDetail.java
new file mode 100644
index 0000000..1239559
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InStoreDetail.java
@@ -0,0 +1,96 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 鍏ュ簱鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_in_store_detail")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_in_store_detail瀵硅薄", description="鍏ュ簱鏄庣粏")
+public class InStoreDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**宸ュ叿缂栫爜*/
+	@Excel(name = "宸ュ叿缂栫爜", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+	/**宸ュ叿缂栧彿*/
+	@Excel(name = "宸ュ叿缂栧彿", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+	/**宸ュ叿鍏ュ簱绫诲瀷*/
+	@Excel(name = "宸ュ叿鍏ュ簱绫诲瀷", width = 15)
+    @ApiModelProperty(value = "宸ュ叿鍏ュ簱绫诲瀷")
+    @Dict(dicCode = "in_storehouse_type")
+    private String inStorehouseType;
+	/**搴撲綅鍙�*/
+	@Excel(name = "搴撲綅鍙�", width = 15)
+    @ApiModelProperty(value = "搴撲綅鍙�")
+    private String goodsShelvesId;
+	/**鍏ュ簱鏁伴噺*/
+	@Excel(name = "鍏ュ簱鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鏁伴噺")
+    private BigDecimal inNumber;
+	/**鍏ュ簱鐢宠鍗曞彿*/
+	@Excel(name = "鍏ュ簱鐢宠鍗曞彿", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鐢宠鍗曞彿")
+    private String inStorehouseId;
+	/**鍏ュ簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟
+2.鎵嬪伐鎿嶄綔*/
+	@Excel(name = "鍏ュ簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔")
+    @Dict(dicCode = "inbound_operate_type")
+    private java.lang.String operateType;
+	/**鍏ュ簱鏃堕棿*/
+	@Excel(name = "鍏ュ簱鏃堕棿", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍏ュ簱鏃堕棿")
+    private Date inboundTime;
+	/**绉熸埛鍙�*/
+	@Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+	/**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+	/**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundDetail.java
new file mode 100644
index 0000000..9569464
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundDetail.java
@@ -0,0 +1,97 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_inbound_detail")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_inbound_detail瀵硅薄", description="鍏ュ簱鐢宠鏄庣粏")
+public class InboundDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**鍏ュ簱鐢宠鍗曞彿*/
+	@Excel(name = "鍏ュ簱鐢宠鍗曞彿", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鐢宠鍗曞彿")
+    private String inStorehouseId;
+	/**璐ф灦鍙�/瀛樺偍浣嶇疆*/
+	@Excel(name = "璐ф灦鍙�/瀛樺偍浣嶇疆", width = 15)
+    @ApiModelProperty(value = "璐ф灦鍙�/瀛樺偍浣嶇疆")
+    private String goodsShelvesId;
+	/**宸ュ叿缂栫爜*/
+	@Excel(name = "宸ュ叿缂栫爜", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+	/**宸ュ叿缂栧彿*/
+	@Excel(name = "宸ュ叿缂栧彿", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+	/**鍏ュ簱鏁伴噺*/
+	@Excel(name = "鍏ュ簱鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鏁伴噺")
+    private BigDecimal inStorageQuantity;
+    /**瀹為檯鍏ュ簱鏁伴噺*/
+    @Excel(name = "瀹為檯鍏ュ簱鏁伴噺", width = 15)
+    @ApiModelProperty(value = "瀹為檯鍏ュ簱鏁伴噺")
+    private BigDecimal inActualCount;
+	/**澶囨敞*/
+	@Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+	/**绉熸埛鍙�*/
+	@Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+	/**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+	/**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private String toolName;
+
+    @TableField(exist = false)
+    private String toolModel;
+
+    @TableField(exist = false)
+    private String inStorehouseType;
+
+    @TableField(exist = false)
+    private String toolCodeId;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundOrder.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundOrder.java
new file mode 100644
index 0000000..880d4df
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/InboundOrder.java
@@ -0,0 +1,116 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鍗�
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_inbound_order")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_inbound_order瀵硅薄", description="鍏ュ簱鐢宠鍗�")
+public class InboundOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭id")
+    private String id;
+	/**鍏ュ簱鍗曠紪鍙�*/
+	@Excel(name = "鍏ュ簱鍗曠紪鍙�", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱鍗曠紪鍙�")
+    private String inboundNum;
+	/**鍏ュ簱鏃堕棿*/
+	@Excel(name = "鍏ュ簱鏃堕棿", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍏ュ簱鏃堕棿")
+    private Date inboundTime;
+	/**鍏ュ簱绫诲瀷*/
+	@Excel(name = "鍏ュ簱绫诲瀷", width = 15)
+    @ApiModelProperty(value = "鍏ュ簱绫诲瀷")
+    @Dict(dicCode = "in_storehouse_type")
+    private String inStorehouseType;
+	/**缁忔墜浜�*/
+	@Excel(name = "缁忔墜浜�", width = 15)
+    @ApiModelProperty(value = "缁忔墜浜�")
+    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
+    private String handler;
+	/**鍊熺敤鍗曞彿*/
+	@Excel(name = "鍊熺敤鍗曞彿", width = 15)
+    @ApiModelProperty(value = "鍊熺敤鍗曞彿")
+    private String borrowNum;
+	/**瀹℃牳浜�*/
+	@Excel(name = "瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
+    private String reviewer;
+	/**瀹℃牳鏃堕棿*/
+	@Excel(name = "瀹℃牳鏃堕棿", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    private Date approvalDate;
+	/**瀹℃牳鎰忚*/
+	@Excel(name = "瀹℃牳鎰忚", width = 15)
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalOpinion;
+	/**鍗曞瓙鐘舵��*/
+	@Excel(name = "鍗曞瓙鐘舵��", width = 15)
+    @ApiModelProperty(value = "鍗曞瓙鐘舵��")
+    @Dict(dicCode = "in_bill_status")
+    private String orderStatus;
+    /**鍏ュ簱鐘舵��*/
+    @Excel(name = "鍏ュ簱鐘舵��", width = 15)
+    @Dict(dicCode = "in_status")
+    @ApiModelProperty(value = "鍏ュ簱鐘舵��")
+    private String inStatus;
+	/**鐢宠鍘熷洜*/
+	@Excel(name = "鐢宠鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鐢宠鍘熷洜")
+    private String applicationReason;
+	/**澶囨敞*/
+	@Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+	/**绉熸埛鍙�*/
+	@Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+	/**鎿嶄綔鍛�*/
+    @ApiModelProperty(value = "鎿嶄綔鍛�")
+    private String createBy;
+	/**鐢宠鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鐢宠鏃堕棿")
+    private Date createTime;
+	/**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java
new file mode 100644
index 0000000..02d5c01
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java
@@ -0,0 +1,87 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_out_store_detail")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_out_store_detail瀵硅薄", description="宸ュ叿鍑哄簱娴佹按")
+public class OutStoreDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**宸ュ叿缂栫爜*/
+	@Excel(name = "宸ュ叿缂栫爜", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+	/**宸ュ叿缂栧彿*/
+	@Excel(name = "宸ュ叿缂栧彿", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+	/**鍑哄簱绫诲瀷*/
+	@Excel(name = "鍑哄簱绫诲瀷", width = 15)
+    @ApiModelProperty(value = "鍑哄簱绫诲瀷")
+    private String outStorehouseType;
+	/**搴撲綅鍙�*/
+	@Excel(name = "搴撲綅鍙�", width = 15)
+    @ApiModelProperty(value = "搴撲綅鍙�")
+    private String goodsShelvesCode;
+	/**鍑哄簱鏁伴噺*/
+	@Excel(name = "鍑哄簱鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍑哄簱鏁伴噺")
+    private BigDecimal outNumber;
+	/**鍑哄簱鐢宠鍗曞彿*/
+	@Excel(name = "鍑哄簱鐢宠鍗曞彿", width = 15)
+    @ApiModelProperty(value = "鍑哄簱鐢宠鍗曞彿")
+    private String outStorehouseId;
+	/**鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔*/
+	@Excel(name = "鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔", width = 15)
+    @ApiModelProperty(value = "鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔")
+    private String operateType;
+	/**绉熸埛鍙�*/
+	@Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+	/**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+	/**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
index 21ca411..23b6d36 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
@@ -36,11 +36,11 @@
     private String outStorehouseId;
 	/**鍒�鍏风紪鐮�*/
 	@Excel(name = "鍒�鍏风紪鐮�", width = 15)
-    @ApiModelProperty(value = "鍒�鍏风紪鐮�")
+    @ApiModelProperty(value = "鍒�鍏风紪鐮�(tms_base_tool琛ㄤ富閿甶d)")
     private String toolCode;
 	/**鍒�鍏风紪鍙�*/
 	@Excel(name = "鍒�鍏风紪鍙�", width = 15)
-    @ApiModelProperty(value = "鍒�鍏风紪鍙�")
+    @ApiModelProperty(value = "鍒�鍏风紪鍙�(鍒�鍏峰敮涓�缂栫爜锛岀鍒版妸鐨勫睘鎬�)")
     private String toolId;
 	/**鐢宠鍑哄簱鏁伴噺*/
 	@Excel(name = "鐢宠鍑哄簱鏁伴噺", width = 15)
@@ -69,7 +69,7 @@
 	@Excel(name = "鍑哄簱鐘舵��;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚", width = 15)
     @ApiModelProperty(value = "鍑哄簱鐘舵��;1.鏈嚭搴擄紱2.閮ㄥ垎鍑哄簱锛�3.鍑哄簱瀹屾垚")
     @Dict(dicCode = "out_storehouse_status")
-    private Integer status;
+    private String status;
 	/**绉熸埛鍙�*/
 	@Excel(name = "绉熸埛鍙�", width = 15)
     @ApiModelProperty(value = "绉熸埛鍙�")
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedger.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedger.java
index f58d3ca..6964e57 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedger.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedger.java
@@ -47,31 +47,31 @@
 	/**鎬诲簱瀛�*/
 	@Excel(name = "鎬诲簱瀛�", width = 15)
     @ApiModelProperty(value = "鎬诲簱瀛�")
-    private String totalCount;
+    private BigDecimal totalCount;
 	/**鍙敤搴撳瓨*/
 	@Excel(name = "鍙敤搴撳瓨", width = 15)
     @ApiModelProperty(value = "鍙敤搴撳瓨")
-    private String availableCount;
+    private BigDecimal availableCount;
 	/**鎬绘姤鎹熸暟閲�*/
 	@Excel(name = "鎬绘姤鎹熸暟閲�", width = 15)
     @ApiModelProperty(value = "鎬绘姤鎹熸暟閲�")
-    private String lossCount;
+    private BigDecimal lossCount;
 	/**鍦ㄤ慨鏁伴噺*/
 	@Excel(name = "鍦ㄤ慨鏁伴噺", width = 15)
     @ApiModelProperty(value = "鍦ㄤ慨鏁伴噺")
-    private String repairCount;
+    private BigDecimal repairCount;
 	/**鍦ㄦ鏁伴噺*/
 	@Excel(name = "鍦ㄦ鏁伴噺", width = 15)
     @ApiModelProperty(value = "鍦ㄦ鏁伴噺")
-    private String detectionCount;
+    private BigDecimal detectionCount;
 	/**鍦ㄥ�熸暟閲�*/
 	@Excel(name = "鍦ㄥ�熸暟閲�", width = 15)
     @ApiModelProperty(value = "鍦ㄥ�熸暟閲�")
-    private String lendCount;
+    private BigDecimal lendCount;
 	/**鍦ㄧ(鏁伴噺*/
 	@Excel(name = "鍦ㄧ(鏁伴噺", width = 15)
     @ApiModelProperty(value = "鍦ㄧ(鏁伴噺")
-    private String sharpeningCount;
+    private BigDecimal sharpeningCount;
 	/**绉熸埛鍙�*/
 	@Excel(name = "绉熸埛鍙�", width = 15)
     @ApiModelProperty(value = "绉熸埛鍙�")
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java
new file mode 100644
index 0000000..35ef615
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java
@@ -0,0 +1,87 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * @Description: tms_tool_sharpening
+ * @Author: houjie
+ * @Date:   2025-05-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_tool_sharpening")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ToolSharpening瀵硅薄", description="鍒�鍏峰垉纾ㄨ褰曞疄浣撶被")
+public class ToolSharpening implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭ID */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭ID")
+    private String id;
+
+    /** 宸ュ叿缂栫爜 */
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+
+    /** 宸ュ叿缂栧彿 */
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+
+    /** 鍒冪(鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒冪(鏃堕棿")
+    private Date sharpeningTime;
+
+    /** 鍒冪(缁撴灉鍙婂缓璁� */
+    @ApiModelProperty(value = "鍒冪(缁撴灉鍙婂缓璁�")
+    private String sharpeningResult;
+
+    /** 璐d换浜� */
+    @ApiModelProperty(value = "璐d换浜�")
+    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    private String responsiblePerson;
+
+    /** 澶囨敞 */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    /** 绉熸埛鍙� */
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+
+    /** 鍒涘缓浜� */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    /** 鏇存柊浜� */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    private java.util.Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsConfigProperty.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsConfigProperty.java
index 7084df0..6740196 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsConfigProperty.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsConfigProperty.java
@@ -55,6 +55,7 @@
 	/**宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤*/
 	@Excel(name = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤", width = 15)
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
+    @Dict(dicCode = "application_type")
     private java.lang.String applicationType;
 	/**鏍囧噯绾у埆*/
 	@Excel(name = "鏍囧噯绾у埆", width = 15)
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBound.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBound.java
new file mode 100644
index 0000000..9eacee2
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBound.java
@@ -0,0 +1,150 @@
+package org.jeecg.modules.tms.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 鎹熻�楀崟
+ * @Author: jeecg-boot
+ * @Date: 2025-05-21
+ * @Version: V1.0
+ */
+
+@ApiModel(value = "tms_loss_bound瀵硅薄", description = "鎹熻�楀崟")
+@Data
+@TableName("tms_loss_bound")
+public class ToolsLossBound implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+
+    /**
+     * losser
+     */
+    @Excel(name = "鎶ユ崯浜�", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    @ApiModelProperty(value = "losser")
+    private String losser;
+
+    /**
+     * 鎶ユ崯鍗曞彿
+     */
+    @Excel(name = "orderCode", width = 15)
+    @ApiModelProperty(value = "orderCode")
+    private String orderCode;
+
+    /**
+     * 缁忔墜浜�
+     */
+    @Excel(name = "缁忔墜浜�", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    @ApiModelProperty(value = "缁忔墜浜�")
+    private String handler;
+
+    /**
+     * 鎶ユ崯鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鎶ユ崯鏃堕棿")
+    private java.util.Date lossTime;
+
+    /**
+     * 瀹℃牳浜�
+     */
+    @Excel(name = "瀹℃牳浜�", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    @ApiModelProperty(value = "reviewer")
+    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    private String reviewer;
+    /**
+     * 瀹℃牳鏃堕棿
+     */
+    @Excel(name = "approvalDate", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    private java.util.Date approvalDate;
+    /**
+     * 瀹℃牳鐘舵��
+     */
+    @Excel(name = "orderStatus", width = 15)
+    @ApiModelProperty(value = "orderStatus")
+    @Dict(dicCode = "out_bill_status")
+    private String orderStatus;
+    /**
+     * 瀹℃牳鎰忚
+     */
+    @Excel(name = "approvalOpinion", width = 15)
+    @ApiModelProperty(value = "approvalOpinion")
+    private String approvalOpinion;
+    /**
+     * 鎶ユ崯鍘熷洜
+     */
+    @Excel(name = "lossReason", width = 15)
+    @ApiModelProperty(value = "lossReason")
+    private String lossReason;
+    /**
+     * 澶囨敞
+     */
+    @Excel(name = "remark", width = 15)
+    @ApiModelProperty(value = "remark")
+    private String remark;
+    /**
+     * 绉熸埛鍙�
+     */
+    @Excel(name = "tenantId", width = 15)
+    @ApiModelProperty(value = "tenantId")
+    private String tenantId;
+
+
+    /**鍒涘缓浜�*/
+    @Excel(name = "createdBy", width = 15)
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓浜�
+     */
+    @Excel(name = "createTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @Excel(name = "updateBy", width = 15)
+    @ApiModelProperty(value = "updateBy")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+
+    @TableField(exist = false)
+    private List<ToolsLossBoundDetail> toolsLossBoundDetailList;
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBoundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBoundDetail.java
new file mode 100644
index 0000000..553d673
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBoundDetail.java
@@ -0,0 +1,154 @@
+package org.jeecg.modules.tms.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 鎹熻�楀崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date: 2025-05-21
+ * @Version: V1.0
+ */
+
+@ApiModel(value = "tms_loss_bound_detail瀵硅薄", description = "鎹熻�楀崟鏄庣粏")
+@Data
+@TableName("tms_loss_bound_detail")
+public class ToolsLossBoundDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+
+    /**
+     * 宸ュ叿缂栫爜
+     */
+    @Excel(name = "toolCode", width = 15)
+    @ApiModelProperty(value = "toolCode")
+    private String toolCode;
+    /**
+     * 宸ュ叿缂栧彿
+     */
+    @Excel(name = "toolId", width = 15)
+    @ApiModelProperty(value = "toolId")
+    private String toolId;
+    /**
+     * 鎶ユ崯鍘熷洜
+     */
+    @Excel(name = "lossReason", width = 15)
+    @ApiModelProperty(value = "lossReason")
+    private String lossReason;
+    /**
+     * 鎶ユ崯鏁伴噺
+     */
+    @Excel(name = "lossNumber", width = 15)
+    @ApiModelProperty(value = "lossNumber")
+    private java.math.BigDecimal lossNumber;
+    /**
+     * 瀛樺偍浣嶇疆锛堝簱浣嶅彿锛�
+     */
+    @Excel(name = "goodsShelvesId", width = 15)
+    @ApiModelProperty(value = "goodsShelvesId")
+    private String goodsShelvesId;
+    /**
+     * 鍏ュ簱鏃堕棿
+     */
+    @Excel(name = "inStoreDate", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "inStoreDate")
+    private Date inStoreDate;
+    /**
+     * 绉熸埛鍙�
+     */
+    @Excel(name = "tenantId", width = 15)
+    @ApiModelProperty(value = "tenantId")
+    private String tenantId;
+    /**
+     * 鍒涘缓浜�
+     */
+    @Excel(name = "createBy", width = 15)
+    @ApiModelProperty(value = "createBy")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Excel(name = "createTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @Excel(name = "updateBy", width = 15)
+    @ApiModelProperty(value = "updateBy")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+    /**
+     * 鎶ユ崯鍗曞彿
+     */
+    @Excel(name = "lossBoundId", width = 15)
+    @ApiModelProperty(value = "lossBoundId")
+    private String lossBoundId;
+
+
+    @Dict(dictTable = "tms_tools_classify" , dicText = "type_name", dicCode = "id")
+    @TableField(exist = false)
+    private String classifyId;
+
+    @TableField(exist = false)
+    private String paramaTableName;
+
+    @TableField(exist = false)
+    private String foreignLanguageName;
+
+    @TableField(exist = false)
+    private String chineseName;
+
+    @TableField(exist = false)
+    private String supplierId;
+
+    @TableField(exist = false)
+    private String storageLocation;
+
+    @TableField(exist = false)
+    private String toolMaterial;
+
+    @TableField(exist = false)
+    private String toolModel;
+    /**
+     * 搴撲綅鍙�
+     */
+    @TableField(exist = false)
+    private String positionCode;
+
+    @TableField(exist = false)
+    @Dict(dicCode = "application_type")
+    private String applicationType;
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java
new file mode 100644
index 0000000..38e4313
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java
@@ -0,0 +1,103 @@
+package org.jeecg.modules.tms.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@ApiModel(value="tms_stocktaking_bound瀵硅薄", description="鐩樼偣鍗曡〃")
+@Data
+@TableName("tms_stocktaking_bound")
+public class ToolsStocktakingBound implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**鍒涘缓鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
+    private java.util.Date createTime;
+    /**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**鏇存柊鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    private java.util.Date updateTime;
+    /**鐩樼偣绫诲瀷*/
+    @Excel(name = "鐩樼偣绫诲瀷", width = 15)
+    @ApiModelProperty(value = "鐩樼偣绫诲瀷")
+    private Integer stocktakingType;
+    /**鐩樼偣鍗曞彿*/
+    @Excel(name = "鐩樼偣鍗曞彿", width = 15)
+    @ApiModelProperty(value = "鐩樼偣鍗曞彿")
+    private String orderCode;
+    /**缁忔墜浜�*/
+    @Excel(name = "缁忔墜浜�", width = 15)
+    @ApiModelProperty(value = "缁忔墜浜�")
+    @Dict(dicCode = "sys_user, realname, id")
+    private String handler;
+    /**瀹℃牳浜�*/
+    @Excel(name = "瀹℃牳浜�", width = 15)
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    @Dict(dicCode = "sys_user, realname, id")
+    private String reviewer;
+    /**鐩樼偣鍚嶇О*/
+    @Excel(name = "鐩樼偣鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鐩樼偣鍚嶇О")
+    private String stocktakingName;
+    /**澶囨敞*/
+    @Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    /**瀹℃牳鐘舵��*/
+    @Excel(name = "瀹℃牳鐘舵��", width = 15)
+    @ApiModelProperty(value = "瀹℃牳鐘舵��")
+    @Dict(dicCode = "approval_status")
+    private String approvalStatus;
+    /**瀹℃牳鎰忚*/
+    @Excel(name = "瀹℃牳鎰忚", width = 15)
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalOpinion;
+    /**鐩樼偣鏃堕棿*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鐩樼偣鏃堕棿")
+    private java.util.Date inventoryTime;
+
+
+    /**
+     * 瀹℃牳鏃堕棿
+     */
+    @Excel(name = "approvalDate", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    private java.util.Date approvalDate;
+
+    @TableField(exist = false)
+    private List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java
new file mode 100644
index 0000000..9b22037
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java
@@ -0,0 +1,137 @@
+package org.jeecg.modules.tms.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description: 鐩樼偣鍗曟槑缁�
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@ApiModel(value="tms_stocktaking_bound_detail瀵硅薄", description="鐩樼偣鍗曟槑缁�")
+@Data
+@TableName("tms_stocktaking_bound_detail")
+public class ToolsStocktakingBoundDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+
+    /**鐩樼偣鍗昳d*/
+    @ApiModelProperty(value = "鐩樼偣鍗昳d")
+    private String stocktakingBoundId;
+
+    /**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**鍒涘缓鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
+    private java.util.Date createTime;
+    /**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**鏇存柊鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    private java.util.Date updateTime;
+    /**宸ュ叿缂栫爜*/
+    @Excel(name = "宸ュ叿缂栫爜", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+    /**宸ュ叿缂栧彿*/
+    @Excel(name = "宸ュ叿缂栧彿", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+    /**搴撳瓨鍙�*/
+    @ApiModelProperty(value = "搴撳瓨鍙�")
+    private String goodsShelvesId;
+    /**璐﹀彿鏁伴噺*/
+    @Excel(name = "璐﹂潰鏁伴噺", width = 15)
+    @ApiModelProperty(value = "璐﹂潰鏁伴噺")
+    private java.math.BigDecimal bookQuantity;
+    /**鍙敤鏁伴噺*/
+    @Excel(name = "鍙敤鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍙敤鏁伴噺")
+    private java.math.BigDecimal availableQuantity;
+    /**瀹炵洏鏁伴噺*/
+    @Excel(name = "瀹炵洏鏁伴噺", width = 15)
+    @ApiModelProperty(value = "瀹炵洏鏁伴噺")
+    private java.math.BigDecimal practicalQuantity;
+    /**鐩樹簭鐩樼泩*/
+    @Dict(dicCode = "surplusDeficit")
+    @Excel(name = "鐩樹簭鐩樼泩", width = 15)
+    @ApiModelProperty(value = "鐩樹簭鐩樼泩")
+    private String surplusDeficit;
+    /**鐩樺簱鏃堕棿*/
+    @Excel(name = "鐩樺簱鏃堕棿", width = 20, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鐩樺簱鏃堕棿")
+    private java.util.Date stocktakingDate;
+    /**绉熸埛鍙�*/
+    @Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+    /**澶囨敞*/
+    @Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    /**宸紓鍊�*/
+    @Excel(name = "宸紓鍊�", width = 15)
+    @ApiModelProperty(value = "宸紓鍊�")
+    private String differenceValue;
+
+
+    @TableField(exist = false)
+    private String paramaTableName;
+
+    @TableField(exist = false)
+    private String foreignLanguageName;
+
+    @TableField(exist = false)
+    private String chineseName;
+
+    @TableField(exist = false)
+    private String supplierId;
+
+    @TableField(exist = false)
+    private String storageLocation;
+
+    @TableField(exist = false)
+    private String toolMaterial;
+
+    @TableField(exist = false)
+    private String toolModel;
+    /**
+     * 搴撲綅鍙�
+     */
+    @TableField(exist = false)
+    private String positionCode;
+
+
+    @Dict(dictTable = "tms_tools_classify" , dicText = "type_name", dicCode = "id")
+    @TableField(exist = false)
+    private String classifyId;
+
+
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStoreEarlyWarning.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStoreEarlyWarning.java
new file mode 100644
index 0000000..f772a39
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStoreEarlyWarning.java
@@ -0,0 +1,109 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+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 org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: tools_store_early warning
+ * @Author: HOUJIE
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_store_early_warning")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_store_early_warning瀵硅薄", description="tms_store_early_warning")
+public class ToolsStoreEarlyWarning implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**宸ュ叿缂栧彿*/
+	@Excel(name = "宸ュ叿缂栧彿", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+	/**涓枃鍚嶇О*/
+	@Excel(name = "宸ュ叿缂栫爜", width = 15)
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+
+	/**鍘傚*/
+	@Excel(name = "鍘傚", width = 15)
+    @ApiModelProperty(value = "鍘傚")
+    private String supplierId;
+
+    /**鏉愯川*/
+    @Excel(name = "鏉愯川", width = 15)
+    @ApiModelProperty(value = "鏉愯川")
+    private String toolMaterial;
+
+
+	/**瀛樺偍浣嶇疆锛堝亸閭d釜鍘傚尯鐨勫簱锛�*/
+	@Excel(name = "瀛樺偍浣嶇疆锛�", width = 15)
+    @ApiModelProperty(value = "瀛樺偍浣嶇疆")
+    private String goodsShelvesId;
+
+
+	/**鎬诲簱瀛樻暟閲�*/
+	@Excel(name = "鎬诲簱瀛樻暟閲�", width = 15)
+    @ApiModelProperty(value = "鎬诲簱瀛樻暟閲�")
+    private BigDecimal totalCount;
+
+    /**鍙敤搴撳瓨鏁伴噺*/
+    @Excel(name = "鍙敤搴撳瓨鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍙敤搴撳瓨鏁伴噺")
+    private BigDecimal availableQuantity;
+
+	/**搴撳瓨涓嬮檺*/
+	@Excel(name = "搴撳瓨涓嬮檺", width = 15)
+    @ApiModelProperty(value = "搴撳瓨涓嬮檺")
+    private BigDecimal lowerInventory;
+	/**搴撳瓨涓婇檺*/
+	@Excel(name = "搴撳瓨涓婇檺", width = 15)
+    @ApiModelProperty(value = "搴撳瓨涓婇檺")
+    private String highestInventory;
+
+
+	@Excel(name = "鐘舵��;1宸插鐞嗭紱2.鏈鐞�", width = 15)
+    @ApiModelProperty(value = "鐘舵��;1宸插鐞嗭紱2.鏈鐞�")
+    private String status;
+	/**澶囨敞*/
+	@Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+	/**绉熸埛鍙�*/
+	@Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+	/**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+	/**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/InboundOrderFlowDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/InboundOrderFlowDto.java
new file mode 100644
index 0000000..cc1fd08
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/InboundOrderFlowDto.java
@@ -0,0 +1,12 @@
+package org.jeecg.modules.tms.entity.dto;
+
+import lombok.Data;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+
+@Data
+public class InboundOrderFlowDto extends FlowTaskVo {
+    //瀹℃壒鐘舵��
+    private String status;
+    //瀹℃壒鎰忚
+    private String approvalOpinion;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/LossBoundFlowDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/LossBoundFlowDto.java
new file mode 100644
index 0000000..65d2b09
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/LossBoundFlowDto.java
@@ -0,0 +1,12 @@
+package org.jeecg.modules.tms.entity.dto;
+
+import lombok.Data;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+
+@Data
+public class LossBoundFlowDto extends FlowTaskVo {
+    //瀹℃壒鐘舵��
+    private String status;
+    //瀹℃壒鎰忚
+    private String approvalOpinion;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java
new file mode 100644
index 0000000..9d5f862
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.tms.entity.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class OutBoundRequestDto {
+    //鍑哄簱鐢宠鍗昳d
+    @ApiModelProperty(value = "鍑哄簱鐢宠鍗昳d")
+    private String outBoundOrderId;
+    //鍑哄簱鐢宠鏄庣粏id
+    @ApiModelProperty(value = "鍑哄簱鐢宠鏄庣粏id")
+    private String outboundDetailId;
+    //鍑哄簱鏁伴噺
+    @ApiModelProperty(value = "鍑哄簱鏁伴噺")
+    private BigDecimal outboundQuantity;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/StocktakingBoundFlowDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/StocktakingBoundFlowDto.java
new file mode 100644
index 0000000..46ef4f6
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/StocktakingBoundFlowDto.java
@@ -0,0 +1,12 @@
+package org.jeecg.modules.tms.entity.dto;
+
+import lombok.Data;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+
+@Data
+public class StocktakingBoundFlowDto extends FlowTaskVo {
+    //瀹℃壒鐘舵��
+    private String status;
+    //瀹℃壒鎰忚
+    private String approvalOpinion;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java
new file mode 100644
index 0000000..0b201b2
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java
@@ -0,0 +1,78 @@
+package org.jeecg.modules.tms.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="宸ュ叿鍑哄簱娴佹按椤甸潰灞曠ず瀵硅薄灏佽", description="宸ュ叿鍑哄簱娴佹按椤甸潰灞曠ず瀵硅薄灏佽")
+public class OutStoreDetailVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**涓婚敭*/
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**宸ュ叿缂栫爜*/
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+	/**宸ュ叿缂栧彿*/
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+	/**鍑哄簱绫诲瀷*/
+    @Dict(dicCode = "out_storehouse_type")
+    @ApiModelProperty(value = "鍑哄簱绫诲瀷")
+    private String outStorehouseType;
+	/**搴撲綅鍙�*/
+    @ApiModelProperty(value = "搴撲綅鍙�")
+    private String goodsShelvesCode;
+	/**鍑哄簱鏁伴噺*/
+    @ApiModelProperty(value = "鍑哄簱鏁伴噺")
+    private BigDecimal outNumber;
+	/**鍑哄簱鐢宠鍗曞彿*/
+    @ApiModelProperty(value = "鍑哄簱鐢宠鍗曞彿")
+    private String outStorehouseId;
+	/**鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔*/
+    @ApiModelProperty(value = "鍑哄簱鎿嶄綔鏂瑰紡;1.鎸夌敵璇峰崟 2.鎵嬪伐鎿嶄綔")
+    private String operateType;
+	/**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃堕棿*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**涓枃鍚嶇О*/
+    @ApiModelProperty(value = "涓枃鍚嶇О")
+    private String chineseName;
+    /**鍨嬪彿/鍥惧彿*/
+    @ApiModelProperty(value = "鍨嬪彿/鍥惧彿")
+    private String toolModel;
+    /**鍒�鍏锋潗鏂�*/
+    @ApiModelProperty(value = "鍒�鍏锋潗鏂�")
+    private String toolMaterial;
+    /**闆朵欢鏉愭枡*/
+    @ApiModelProperty(value = "闆朵欢鏉愭枡")
+    private String partMaterial;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
index 96fa5bc..0ce3390 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
@@ -59,6 +59,7 @@
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
     private String applicationType;
+    private String applicationTypeName;
 
     @ApiModelProperty(value = "鍘傚")
     private String supplierId;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
index b68c4f8..0365f95 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
@@ -6,6 +6,7 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
 
 import java.io.Serializable;
 
@@ -56,7 +57,9 @@
     private String positionCode;
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
+    @Dict(dicCode = "application_type")
     private String applicationType;
+    private String applicationTypeName;
 
     @ApiModelProperty(value = "鍘傚")
     private String supplierId;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
index b4b4eb7..59dbf3c 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
@@ -57,25 +57,25 @@
     private String positionCode;
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
-    private java.lang.String applicationType;
+    private String applicationType;
 
     @ApiModelProperty(value = "鍘傚")
-    private java.lang.String supplierId;
+    private String supplierId;
 
     @ApiModelProperty(value = "浠撳簱鐪佷唤鍩庡競")
-    private java.lang.String provinceCity;
+    private String provinceCity;
 
     @ApiModelProperty(value = "瀛樺偍浣嶇疆锛堝亸閭d釜鍘傚尯鐨勫簱锛�")
-    private java.lang.String storageLocation;
+    private String storageLocation;
 
     @ApiModelProperty(value = "璁¢噺涓诲崟浣�")
-    private java.lang.String mainUnit;
+    private String mainUnit;
 
     @ApiModelProperty(value = "璁¢噺杈呭崟浣�")
-    private java.lang.String auxiliaryUnit;
+    private String auxiliaryUnit;
 
     @ApiModelProperty(value = "鏄惁鏈夎閲忚緟鍗曚綅;1,鏈夎緟鍔╁崟浣�2.鏃犺緟鍔╁崟浣�")
-    private java.lang.String auxiliaryUnitFlag;
+    private String auxiliaryUnitFlag;
 
     @ApiModelProperty(value = "鍗曚环")
     private java.math.BigDecimal price;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
index 48c3772..8315462 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
@@ -59,6 +59,7 @@
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
     private String applicationType;
+    private String applicationTypeName;
 
     @ApiModelProperty(value = "鍘傚")
     private String supplierId;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
index 119e077..b2a9781 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
@@ -59,6 +59,7 @@
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
     private String applicationType;
+    private String applicationTypeName;
 
     @ApiModelProperty(value = "鍘傚")
     private String supplierId;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
index d2698c4..304fcc5 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
@@ -59,6 +59,7 @@
 
     @ApiModelProperty(value = "宸ュ叿绫诲瀷;1.閫氱敤 2.涓撶敤")
     private String applicationType;
+    private String applicationTypeName;
 
     @ApiModelProperty(value = "鍘傚")
     private String supplierId;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/SharpeeningVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/SharpeeningVo.java
new file mode 100644
index 0000000..aa9d7d8
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/SharpeeningVo.java
@@ -0,0 +1,37 @@
+package org.jeecg.modules.tms.entity.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class SharpeeningVo {
+    private String id;
+
+    @Dict(dictTable = "tms_tools_classify", dicText = "type_name", dicCode = "id")
+    private String classifyId;
+
+    private String toolCode;
+
+    private String foreignLanguageName;
+    private String standardLevel;
+    private String standardCode;
+    private String toolModel;
+    @Dict(dicCode = "tool_para_type")
+    private String paramaTableName;
+    private Integer totalCount;
+    @Dict(dicCode = "application_type")
+    private String applicationType;
+    private String chineseName;
+    private String supplierId;
+    private String storageLocation;
+    private String mainUnit;
+    private String toolId;
+    private String positionCode;
+    private String warehouseId;
+    private String provinceCity;
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/StocktakingPoundVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/StocktakingPoundVo.java
new file mode 100644
index 0000000..8142c4e
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/StocktakingPoundVo.java
@@ -0,0 +1,35 @@
+package org.jeecg.modules.tms.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class StocktakingPoundVo {
+    private String id;
+    private String classifyId;
+    private String toolCode;
+    private String foreignLanguageName;
+    private String standardLevel;
+    private String standardCode;
+    private String toolModel;
+    private String paramaTableName;
+    private Integer totalCount;
+    private Integer availableCount;
+    @Dict(dicCode = "application_type")
+    private String applicationType;
+    private String chineseName;
+    private String supplierId;
+    private String storageLocation;
+    private String mainUnit;
+    private String toolId;
+    private String positionCode;
+    // 鏉ヨ嚜涓嶅悓鍙傛暟琛ㄧ殑瀛楁
+    private String toolMaterial;
+    private String partMaterial;
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolSharpeningVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolSharpeningVo.java
new file mode 100644
index 0000000..d9d14e5
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolSharpeningVo.java
@@ -0,0 +1,132 @@
+package org.jeecg.modules.tms.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: tms_tool_sharpening
+ * @Author: houjie
+ * @Date:   2025-05-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_tool_sharpening")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ToolSharpening瀵硅薄", description="鍒�鍏峰垉纾ㄨ褰曞疄浣撶被")
+public class ToolSharpeningVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭ID */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭ID")
+    private String id;
+
+    /** 宸ュ叿缂栫爜 */
+    @ApiModelProperty(value = "宸ュ叿缂栫爜")
+    private String toolCode;
+
+    /** 宸ュ叿缂栧彿 */
+    @ApiModelProperty(value = "宸ュ叿缂栧彿")
+    private String toolId;
+
+    /** 鍒冪(鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒冪(鏃堕棿")
+    private Date sharpeningTime;
+
+    /** 鍒冪(缁撴灉鍙婂缓璁� */
+    @ApiModelProperty(value = "鍒冪(缁撴灉鍙婂缓璁�")
+    private String sharpeningResult;
+
+    /** 璐d换浜� */
+    @ApiModelProperty(value = "璐d换浜�")
+    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
+    private String responsiblePerson;
+
+    /** 澶囨敞 */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    /** 绉熸埛鍙� */
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+
+    /** 鍒涘缓浜� */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    /** 鏇存柊浜� */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    private Date updateTime;
+
+    @Dict(dictTable = "tms_tools_classify" , dicText = "type_name", dicCode = "id")
+    @ApiModelProperty(value = "宸ュ叿鍒嗙被")
+    private String  classifyId;
+
+
+    @Dict(dicCode = "tool_para_type")
+    @ApiModelProperty(value = "宸ュ叿鍒嗙被缂栫爜")
+    private String  paramaTableName;
+
+    @ApiModelProperty(value = "宸ュ叿鍚嶇О")
+    private String  typeName;
+
+
+    @Dict(dicCode = "application_type")
+    @ApiModelProperty(value = "宸ュ叿鍒嗙被缂栫爜")
+    private String  applicationType;
+
+
+    @ApiModelProperty(value = "鍨嬪彿/瑙勫垯")
+    private String  toolModel;
+
+    @ApiModelProperty(value = "浠撳簱鍩庡競")
+    private String  provinceCity;
+
+    @ApiModelProperty(value = "涓枃鍚嶅瓧")
+    private String  chineseName;
+
+    @ApiModelProperty(value = "鍘傚")
+    private String  supplierId;
+
+    @ApiModelProperty(value = "瀛樺偍浣嶇疆")
+    private String  positionCode;
+
+
+    @ApiModelProperty(value = "璁$畻涓诲崟浣�")
+    private String  mainUnit;
+
+
+    @ApiModelProperty(value = "搴撳尯/搴撳彿")
+    private String  warehouseId;
+
+
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolsStocktakingVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolsStocktakingVo.java
new file mode 100644
index 0000000..1e94d50
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ToolsStocktakingVo.java
@@ -0,0 +1,87 @@
+package org.jeecg.modules.tms.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: jeecg-boot
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@Data
+@ApiModel(value="tools_stocktaking_bound瀵硅薄", description="鐩樼偣鍗曡〃")
+public class ToolsStocktakingVo {
+
+	/**涓婚敭*/
+	@ApiModelProperty(value = "涓婚敭")
+    private String id;
+	/**鍒涘缓浜�*/
+	@ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+	/**鍒涘缓鏃ユ湡*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "鍒涘缓鏃ユ湡")
+    private Date createTime;
+	/**鏇存柊浜�*/
+	@ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+	/**鏇存柊鏃ユ湡*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    private Date updateTime;
+	/**鐩樼偣绫诲瀷*/
+	@Excel(name = "鐩樼偣绫诲瀷", width = 15)
+	@ApiModelProperty(value = "鐩樼偣绫诲瀷")
+    private Integer stocktakingType;
+	/**鐩樼偣鍗曞彿*/
+	@Excel(name = "鐩樼偣鍗曞彿", width = 15)
+	@ApiModelProperty(value = "鐩樼偣鍗曞彿")
+    private String orderCode;
+	/**缁忔墜浜�*/
+	@Excel(name = "缁忔墜浜�", width = 15)
+	@ApiModelProperty(value = "缁忔墜浜�")
+    private String handler;
+	/**瀹℃牳浜�*/
+	@Excel(name = "瀹℃牳浜�", width = 15)
+	@ApiModelProperty(value = "瀹℃牳浜�")
+    private String reviewer;
+	/**鐩樼偣鍚嶇О*/
+	@Excel(name = "鐩樼偣鍚嶇О", width = 15)
+	@ApiModelProperty(value = "鐩樼偣鍚嶇О")
+    private String stocktakingName;
+	/**澶囨敞*/
+	@Excel(name = "澶囨敞", width = 15)
+	@ApiModelProperty(value = "澶囨敞")
+    private String remark;
+	/**瀹℃牳鐘舵��*/
+	@Excel(name = "瀹℃牳鐘舵��", width = 15)
+	@ApiModelProperty(value = "瀹℃牳鐘舵��")
+    private String approvalStatus;
+	/**瀹℃牳鎰忚*/
+	@Excel(name = "瀹℃牳鎰忚", width = 15)
+	@ApiModelProperty(value = "瀹℃牳鎰忚")
+    private String approvalOpinion;
+	/**鐩樼偣鏃堕棿*/
+	@Excel(name = "鐩樼偣鏃堕棿", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+	@ApiModelProperty(value = "鐩樼偣鏃堕棿")
+    private Date inventoryTime;
+
+	@ExcelCollection(name="鐩樼偣鍗曟槑缁�")
+	@ApiModelProperty(value = "鐩樼偣鍗曟槑缁�")
+	private List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList;
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java
index 7ead9ae..e7be0d2 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java
@@ -1,11 +1,14 @@
 package org.jeecg.modules.tms.enums;
 
 
+import lombok.Getter;
+
 import java.util.Objects;
 
 /**
  * 鍑哄簱鍗曠姸鎬佹灇涓剧被
  */
+@Getter
 public enum OutBillStatus {
     /**
      * 鑽夌鐘舵�侊紝鍊间负1
@@ -39,24 +42,6 @@
     OutBillStatus(String value, String description) {
         this.value = value;
         this.description = description;
-    }
-
-    /**
-     * 鑾峰彇鐘舵�佸��
-     *
-     * @return 鐘舵�佸��
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * 鑾峰彇鐘舵�佹弿杩�
-     *
-     * @return 鐘舵�佹弿杩�
-     */
-    public String getDescription() {
-        return description;
     }
 
     /**
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
new file mode 100644
index 0000000..e8e8165
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
@@ -0,0 +1,29 @@
+package org.jeecg.modules.tms.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum OutStorehouseType {
+
+    TOOL_BORROW("1", "宸ュ叿鍊熺敤"),
+    MAINTENANCE_OUTBOUND("2", "缁翠慨鍑哄簱"),
+    CALIBRATION_OUTBOUND("3", "妫�瀹氬嚭搴�"),
+    GRINDING_OUTBOUND("4", "鍒冪(鍑哄簱");
+
+    private final String value;
+    private final String description;
+
+    OutStorehouseType(String value, String description) {
+        this.value = value;
+        this.description = description;
+    }
+
+    public static OutStorehouseType getByValue(String value) {
+        for (OutStorehouseType type : OutStorehouseType.values()) {
+            if (type.getValue().equals(value)) {
+                return type;
+            }
+        }
+        throw new IllegalArgumentException("Invalid enum value: " + value);
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/ToolCirculationStatus.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/ToolCirculationStatus.java
new file mode 100644
index 0000000..0370465
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/ToolCirculationStatus.java
@@ -0,0 +1,38 @@
+package org.jeecg.modules.tms.enums;
+
+import lombok.Getter;
+
+/**
+ * 宸ュ叿娴侀�氱姸鎬佹灇涓�
+ */
+@Getter
+public enum ToolCirculationStatus {
+    IN_STOCK("1", "鍦ㄥ簱"),
+    BORROWED("2", "鍦ㄥ��"),
+    REPAIRING("3", "鍦ㄤ慨"),
+    INSPECTING("4", "鍦ㄦ"),
+    GRINDING("5", "鍦ㄧ("),
+    SCRAPPED("6", "鎶ュ簾");
+
+    private final String value;
+    private final String description;
+
+    ToolCirculationStatus(String value, String description) {
+        this.value = value;
+        this.description = description;
+    }
+
+    /**
+     * 鏍规嵁鐘舵�佸�艰幏鍙栨灇涓惧疄渚�
+     * @param status 鐘舵�佸��
+     * @return 鏋氫妇瀹炰緥鎴杗ull
+     */
+    public static ToolCirculationStatus fromStatus(String status) {
+        for (ToolCirculationStatus value : values()) {
+            if (value.getValue().equals(status)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java
index 6a0ef0c..da80ca3 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java
@@ -35,4 +35,7 @@
     IPage<ParaBladeVo> paraBladeList(Page<ParaBladeVo> page,
                                                @Param(Constants.WRAPPER) Wrapper<ParaBladeVo> queryWrapper);
 
+    IPage<StocktakingPoundVo> pageWithLedgerAndConfig(Page<StocktakingPoundVo> page, @Param(Constants.WRAPPER) Wrapper<StocktakingPoundVo> wrapper);
+
+    IPage<SharpeeningVo> pageWithSharpedAndConfig(Page<SharpeeningVo> page, @Param(Constants.WRAPPER) Wrapper<SharpeeningVo> wrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InStoreDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InStoreDetailMapper.java
new file mode 100644
index 0000000..84926f4
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InStoreDetailMapper.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.InStoreDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 鍏ュ簱鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface InStoreDetailMapper extends BaseMapper<InStoreDetail> {
+
+    public IPage<Map<String, Object>> findPageList(IPage<Map> pageData, @Param(Constants.WRAPPER) Wrapper<Map> wrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundDetailMapper.java
new file mode 100644
index 0000000..b81f687
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundDetailMapper.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.InboundDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface InboundDetailMapper extends BaseMapper<InboundDetail> {
+
+    public IPage<Map<String, Object>> findPageList(IPage<Map> pageData, @Param(Constants.WRAPPER) Wrapper<Map> wrapper);
+
+    @Delete("delete from tms_inbound_detail where in_storehouse_id = #{inboundOrderId}")
+    public boolean deleteByInboundOrderId(@Param("inboundOrderId") String inboundOrderId);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundOrderMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundOrderMapper.java
new file mode 100644
index 0000000..56662df
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/InboundOrderMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.InboundOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鍗�
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface InboundOrderMapper extends BaseMapper<InboundOrder> {
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutStoreDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutStoreDetailMapper.java
new file mode 100644
index 0000000..08a2c06
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutStoreDetailMapper.java
@@ -0,0 +1,25 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.OutStoreDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.vo.OutStoreDetailVo;
+
+/**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+public interface OutStoreDetailMapper extends BaseMapper<OutStoreDetail> {
+
+    IPage<OutStoreDetailVo> queryPageList(Page<OutStoreDetailVo> page,
+                                          @Param(Constants.WRAPPER) Wrapper<OutStoreDetailVo> queryWrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundDetailMapper.java
new file mode 100644
index 0000000..0989e79
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundDetailMapper.java
@@ -0,0 +1,41 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+
+import java.util.List;
+
+/**
+ * @Description: 鎹熻�楀崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+public interface ToolsLossBoundDetailMapper extends BaseMapper<ToolsLossBoundDetail> {
+
+
+    /**
+     * 閫氳繃涓昏〃id鍒犻櫎瀛愯〃鏁版嵁
+     *
+     * @param mainId 涓昏〃id
+     * @return boolean
+     */
+    public boolean deleteByMainId(@Param("mainId") String mainId);
+
+    /**
+     * 閫氳繃涓昏〃id鏌ヨ瀛愯〃鏁版嵁
+     *
+     * @param mainId 涓昏〃id
+     * @return List<ToolsLossBoundDetail>
+     */
+    public List<ToolsLossBoundDetail> selectByMainId(@Param("mainId") String mainId);
+
+    IPage<ToolsLossBoundDetail> queryPageList(Page<ToolsLossBoundDetail> page,
+                                        @Param(Constants.WRAPPER) Wrapper<ToolsLossBoundDetail> queryWrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundMapper.java
new file mode 100644
index 0000000..b41a156
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsLossBoundMapper.java
@@ -0,0 +1,21 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+
+/**
+ * @Description: 鎹熻�楀崟
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+public interface ToolsLossBoundMapper extends BaseMapper<ToolsLossBound> {
+
+    IPage<ToolsLossBound> queryPageList(Page<ToolsLossBound> page,
+                                       @Param(Constants.WRAPPER) Wrapper<ToolsLossBound> queryWrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java
new file mode 100644
index 0000000..5a951cc
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.OutboundOrder;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
+import org.jeecg.modules.tms.entity.vo.ToolSharpeningVo;
+
+/**
+ * @Description: tms_tool_sharpening Mapper 鎺ュ彛
+ * @Author: 渚澃
+ * @Date:   2025-05-10
+ */
+public interface ToolsSharpeningMapper extends BaseMapper<ToolSharpening> {
+    IPage<ToolSharpeningVo> queryPageList(Page<ToolSharpeningVo> page,
+                                          @Param(Constants.WRAPPER) Wrapper<ToolSharpeningVo> queryWrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundDetailMapper.java
new file mode 100644
index 0000000..06f3982
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundDetailMapper.java
@@ -0,0 +1,41 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.tms.entity.ToolsClassify;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+
+import java.util.List;
+
+public interface ToolsStocktakingBoundDetailMapper extends BaseMapper<ToolsStocktakingBoundDetail> {
+
+	/**
+	 * 閫氳繃涓昏〃id鍒犻櫎瀛愯〃鏁版嵁
+	 *
+	 * @param mainId 涓昏〃id
+	 * @return boolean
+	 */
+	public boolean deleteByMainId(@Param("mainId") String mainId);
+
+
+	/**
+	 * 閫氳繃涓昏〃id鍒犻櫎瀛愯〃鏁版嵁
+	 *
+	 * @param mainId 涓昏〃id
+	 * @return boolean
+	 */
+	public String getParamaTableNameByMainId(@Param("mainId") String mainId);
+  /**
+   * 閫氳繃涓昏〃id鏌ヨ瀛愯〃鏁版嵁
+   *
+   * @param
+   * @return List<ToolsStocktakingBoundDetail>
+   */
+	IPage<ToolsStocktakingBoundDetail> selectByMainId(Page<ToolsStocktakingBoundDetail> page,
+									   @Param(Constants.WRAPPER) Wrapper<ToolsStocktakingBoundDetail> queryWrapper);
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundMapper.java
new file mode 100644
index 0000000..3bdf757
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: jeecg-boot
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+public interface ToolsStocktakingBoundMapper extends BaseMapper<ToolsStocktakingBound> {
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStoreEarlyWarningMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStoreEarlyWarningMapper.java
new file mode 100644
index 0000000..588c7ad
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStoreEarlyWarningMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.ToolsStoreEarlyWarning;
+
+/**
+ * @Description: tools_store_early warning
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+public interface ToolsStoreEarlyWarningMapper extends BaseMapper<ToolsStoreEarlyWarning> {
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
index 6cd55f0..4e099e2 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
@@ -59,43 +59,47 @@
             t2.adapt_holder adaptHolder,
             t2.remark,
             t3.classify_id classifyNum,
-            t3.type_name classifyName
-            from tms_base_tools t
-        left join tms_tools_config_property t1 on t1.tool_code = t.id
-        left join tms_para_hole_tools t2 on t2.tool_code = t.id
-        left join tms_tools_classify t3 on t3.id = t.classify_id
-        ${ew.customSqlSegment}
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
+        from tms_base_tools t
+                 left join tms_tools_config_property t1 on t1.tool_code = t.id
+                 left join tms_para_hole_tools t2 on t2.tool_code = t.id
+                 left join tms_tools_classify t3 on t3.id = t.classify_id
+                 left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
+            ${ew.customSqlSegment}
     </select>
     <select id="paraCommonToolList" resultType="org.jeecg.modules.tms.entity.vo.ParaCommonToolVo">
-    select
-    t.id,
-    t.classify_id classifyId,
-    t.tool_code toolCode,
-    t.sign_code signCode,
-    t.chinese_name chineseName,
-    t.foreign_language_name foreignLanguageName,
-    t.standard_level standardLevel,
-    t.standard_code standardCode,
-    t.tool_model toolModel,
-    t.parama_table_name paramaTableName,
-    t1.application_type applicationType,
-    t1.supplier_id supplierId,
-    t1.province_city provinceCity,
-    t1.position_code positionCode,
-    t1.storage_location storageLocation,
-    t1.main_unit mainUnit,
-    t1.auxiliary_unit auxiliaryUnit,
-    t1.auxiliary_unit_flag auxiliaryUnitFlag,
-    t1.price,
-    t1.lower_inventory lowerInventory,
-    t1.highest_inventory highestInventory,
-    t3.classify_id classifyNum,
-    t3.type_name classifyName
-    from tms_base_tools t
-    left join tms_tools_config_property t1 on t1.tool_code = t.id
-    left join tms_tools_classify t3 on t3.id = t.classify_id
-    ${ew.customSqlSegment}
-</select>
+        select
+            t.id,
+            t.classify_id classifyId,
+            t.tool_code toolCode,
+            t.sign_code signCode,
+            t.chinese_name chineseName,
+            t.foreign_language_name foreignLanguageName,
+            t.standard_level standardLevel,
+            t.standard_code standardCode,
+            t.tool_model toolModel,
+            t.parama_table_name paramaTableName,
+            t1.application_type applicationType,
+            t1.supplier_id supplierId,
+            t1.province_city provinceCity,
+            t1.position_code positionCode,
+            t1.storage_location storageLocation,
+            t1.main_unit mainUnit,
+            t1.auxiliary_unit auxiliaryUnit,
+            t1.auxiliary_unit_flag auxiliaryUnitFlag,
+            t1.price,
+            t1.lower_inventory lowerInventory,
+            t1.highest_inventory highestInventory,
+            t3.classify_id classifyNum,
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
+        from tms_base_tools t
+                 left join tms_tools_config_property t1 on t1.tool_code = t.id
+                 left join tms_tools_classify t3 on t3.id = t.classify_id
+                 left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
+            ${ew.customSqlSegment}
+    </select>
     <select id="paraThreadingToolList" resultType="org.jeecg.modules.tms.entity.vo.ParaThreadingToolVo">
         SELECT
             t.id,
@@ -144,12 +148,14 @@
             t2.connection_aperture connectionAperture,
             t2.connecting_keyway connectingKeyway,
             t3.classify_id classifyNum,
-            t3.type_name classifyName
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
         FROM
             tms_base_tools t
                 LEFT JOIN tms_tools_config_property t1 ON t1.tool_code = t.id
                 LEFT JOIN tms_para_threading_tool t2 ON t2.tool_code = t.id
                 LEFT JOIN tms_tools_classify t3 ON t3.id = t.classify_id
+                left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
             ${ew.customSqlSegment}
     </select>
     <select id="paraMillToolList" resultType="org.jeecg.modules.tms.entity.vo.ParaMillToolVo">
@@ -209,12 +215,14 @@
             t2.pitch,
             t2.recently_diameter recentlyDiameter,
             t3.classify_id classifyNum,
-            t3.type_name classifyName
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
         FROM
             tms_base_tools t
                 LEFT JOIN tms_tools_config_property t1 ON t1.tool_code = t.id
                 LEFT JOIN tms_para_mill_tool t2 ON t2.tool_code = t.id
                 LEFT JOIN tms_tools_classify t3 ON t3.id = t.classify_id
+                left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
             ${ew.customSqlSegment}
     </select>
     <select id="paraTurningToolsList" resultType="org.jeecg.modules.tms.entity.vo.ParaTurningToolsVo">
@@ -278,12 +286,14 @@
             t2.blade_thickness bladeThickness,
             t2.min_diameter minDiameter,
             t3.classify_id classifyNum,
-            t3.type_name classifyName
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
         FROM
             tms_base_tools t
                 LEFT JOIN tms_tools_config_property t1 ON t1.tool_code = t.id
                 LEFT JOIN tms_para_turning_tools t2 ON t2.tool_code = t.id
                 LEFT JOIN tms_tools_classify t3 ON t3.id = t.classify_id
+                left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
             ${ew.customSqlSegment}
     </select>
     <select id="paraBladeList" resultType="org.jeecg.modules.tms.entity.vo.ParaBladeVo">
@@ -335,12 +345,145 @@
             t2.pitch,
             t2.min_internal_thread minInternalThread,
             t3.classify_id classifyNum,
-            t3.type_name classifyName
+            t3.type_name classifyName,
+            t4.item_text applicationTypeName
         FROM
             tms_base_tools t
                 LEFT JOIN tms_tools_config_property t1 ON t1.tool_code = t.id
                 LEFT JOIN tms_para_blade t2 ON t2.tool_code = t.id
                 LEFT JOIN tms_tools_classify t3 ON t3.id = t.classify_id
+                left join (select * from v_sys_dict where dict_code = 'application_type') t4 on t4.item_value = t1.application_type
             ${ew.customSqlSegment}
     </select>
+
+    <select id="pageWithLedgerAndConfig" resultType="org.jeecg.modules.tms.entity.vo.StocktakingPoundVo">
+        SELECT
+        t.id,
+        t.classify_id AS classifyId,
+        t.tool_code AS toolCode,
+        t.foreign_language_name AS foreignLanguageName,
+        t.standard_level AS standardLevel,
+        t.standard_code AS standardCode,
+        t.tool_model AS toolModel,
+        t.parama_table_name AS paramaTableName,
+        t.tool_id AS toolId,
+        t1.total_count AS totalCount,
+        t1.available_count AS availableCount,
+        t4.position_code AS positionCode,
+        t3.application_type AS applicationType,
+        t3.chinese_name AS chineseName,
+        t3.supplier_id AS supplierId,
+        t3.storage_location AS storageLocation,
+        t3.main_unit AS mainUnit,
+
+        <!-- 鍔ㄦ�佸瓧娈甸�夋嫨锛屼娇鐢ㄨ〃鍒悕锛堥渶纭繚琛ㄥ凡鍏宠仈锛� -->
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                c.tool_material AS toolMaterial,
+                c.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                h.tool_material AS toolMaterial,
+                h.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                th.tool_material AS toolMaterial,
+                th.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                m.tool_material AS toolMaterial,
+                m.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                tr.tool_material AS toolMaterial,
+                tr.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                b.tool_material AS toolMaterial,
+                b.part_material AS partMaterial
+            </when>
+            <!-- 榛樿鎯呭喌锛歱aramaTableName 涓虹┖鎴栨湭浼犻�掓椂锛屽叧鑱� tms_para_common_tool 琛� -->
+            <otherwise>
+                c.tool_material AS toolMaterial,
+                c.part_material AS partMaterial
+            </otherwise>
+        </choose>
+
+        FROM tms_base_tools t
+        LEFT JOIN tms_tool_ledger t1 ON t1.tool_id = t.id
+        LEFT JOIN tms_tools_config_property t3 ON t3.tool_code = t.id
+        LEFT JOIN tms_tool_ledger_detail t4 ON t4.tool_code = t.id
+
+        <!-- 鍔ㄦ�佽〃鍏宠仈锛岀‘淇濇墍鏈夋儏鍐甸兘鏈夊搴旂殑 LEFT JOIN -->
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                LEFT JOIN tms_para_common_tool c ON c.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                LEFT JOIN tms_para_hole_tools h ON h.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                LEFT JOIN tms_para_threading_tool th ON th.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                LEFT JOIN tms_para_mill_tool m ON m.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                LEFT JOIN tms_para_turning_tools tr ON tr.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                LEFT JOIN tms_para_blade b ON b.tool_code = t.id
+            </when>
+            <!-- 榛樿鎯呭喌锛氭坊鍔� LEFT JOIN tms_para_common_tool c -->
+            <otherwise>
+                LEFT JOIN tms_para_common_tool c ON c.tool_code = t.id
+            </otherwise>
+        </choose>
+
+        <where>
+            <if test="ew.paramNameValuePairs.toolCode != null and ew.paramNameValuePairs.toolCode != ''">
+                AND t.tool_code LIKE CONCAT('%', #{ew.paramNameValuePairs.toolCode}, '%')
+            </if>
+        </where>
+
+        ORDER BY t.create_time DESC
+    </select>
+
+
+    <select id="pageWithSharpedAndConfig" resultType="org.jeecg.modules.tms.entity.vo.SharpeeningVo">
+        SELECT
+        t.id,
+        t.classify_id AS classifyId,
+        t.tool_code AS toolCode,
+        t.foreign_language_name AS foreignLanguageName,
+        t.standard_level AS standardLevel,
+        t.standard_code AS standardCode,
+        t.tool_model AS toolModel,
+        t.parama_table_name AS paramaTableName,
+        t.tool_id AS toolId,
+        t1.total_count AS totalCount,
+        t1.available_count AS availableCount,
+        t4.position_code AS positionCode,
+        t3.application_type AS applicationType,
+        t3.chinese_name AS chineseName,
+        t3.supplier_id AS supplierId,
+        t3.storage_location AS storageLocation,
+        t3.main_unit AS mainUnit,
+        t4.warehouse_id AS warehouseId,
+        t3.province_city AS provinceCity
+
+        FROM tms_base_tools t
+        LEFT JOIN tms_tool_ledger t1 ON t1.tool_id = t.id
+        LEFT JOIN tms_tools_config_property t3 ON t3.tool_code = t.id
+        LEFT JOIN tms_tool_ledger_detail t4 ON t4.tool_code = t.id
+
+        <where>
+            <if test="ew.paramNameValuePairs.toolCode != null and ew.paramNameValuePairs.toolCode != ''">
+                AND t.tool_code LIKE CONCAT('%', #{ew.paramNameValuePairs.toolCode}, '%')
+            </if>
+        </where>
+
+        ORDER BY t.create_time DESC
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InStoreDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InStoreDetailMapper.xml
new file mode 100644
index 0000000..79cf799
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InStoreDetailMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.InStoreDetailMapper">
+
+    <select id="queryPageList" resultType="map" parameterType="String">
+        SELECT
+            t.id,
+            t.tool_id onlyCode,
+            t.in_storehouse_type inStorehouseType,
+            t.goods_shelves_id goodsShelvesId,
+            t.in_number inNumber,
+            t.in_storehouse_id inStorehouseId,
+            t.inbound_time inboundTime,
+            t.create_by createBy,
+            t.create_time createTime,
+            t.update_by updateBy,
+            t.update_time updateTime,
+            t1.tool_code toolCode,
+            t1.chinese_name chineseName,
+            t1.tool_model toolModel,
+            t2.classify_id classifyNum,
+            t3.inbound_num inboundNum,
+            t3.application_reason applicationReason,
+            t3.approval_date approvalDate,
+            t3.approval_opinion approvalOpinion,
+            t4.item_text operateType,
+            t5.realname handler,
+            t6.realname reviewer,
+            t7.item_value inStatus,
+            t8.item_value orderStatus
+        FROM tms_in_store_detail t
+                 LEFT JOIN tms_base_tools t1 on t.tool_code = t1.id
+                 LEFT JOIN tms_tools_classify t2 on t2.id = t1.classify_id
+                 LEFT JOIN tms_inbound_order t3 on t3.id = t.in_storehouse_id
+                 LEFT JOIN (select * from v_sys_dict where dict_code='inbound_operate_type') t4 on t4.item_value = t.operate_type
+                 LEFT JOIN sys_user t5 on t5.username = t3.handler
+                 LEFT JOIN sys_user t6 on t6.username = t3.reviewer
+                 LEFT JOIN (select * from v_sys_dict where dict_code='in_status') t7 on t7.item_value = t3.in_status
+                 LEFT JOIN (select * from v_sys_dict where dict_code='in_bill_status') t8 on t8.item_value = t3.order_status
+            ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundDetailMapper.xml
new file mode 100644
index 0000000..49ef0c6
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundDetailMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.InboundDetailMapper">
+
+    <select id="findPageList" resultType="map" parameterType="String">
+        select
+            t1.id,
+            t3.id toolCodeId,
+            t1.in_storage_quantity inStorageQuantity,
+            t1.in_actual_count inActualCount,
+            t3.tool_code toolCode,
+            t3.chinese_name chineseName,
+            t3.tool_model toolModel,
+            t5.item_text applicationType,
+            t6.classify_id classifyNum
+            from tms_inbound_detail t1
+            left join tms_inbound_order t2 on t1.in_storehouse_id = t2.id
+            left join tms_base_tools t3 on t3.id = t1.tool_code
+            left join tms_tools_config_property t4 on t4.tool_code = t1.tool_code
+            left join (select * from v_sys_dict where dict_code = 'application_type') t5 on t5.item_value = t4.application_type
+            left join tms_tools_classify t6 on t6.id = t3.classify_id
+            ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundOrderMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundOrderMapper.xml
new file mode 100644
index 0000000..241d212
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/InboundOrderMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.InboundOrderMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml
new file mode 100644
index 0000000..4956f45
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.OutStoreDetailMapper">
+
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.vo.OutStoreDetailVo">
+        SELECT
+            t1.id,
+            t1.tool_code toolCode,
+            t1.tool_id toolId,
+            t1.out_storehouse_type outStorehouseType,
+            t1.goods_shelves_code goodsShelvesCode,
+            t1.out_number outNumber,
+            t1.out_storehouse_id outStorehouseId,
+            t1.operate_type operateType,
+            t1.create_by createBy,
+            t1.create_time createTime,
+            t2.chinese_name chineseName,
+            t2.tool_model toolModel,
+            t2.parama_table_name paramaTableName,
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                t4.tool_material toolMaterial,
+                t4.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                t5.tool_material toolMaterial,
+                t5.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                t6.tool_material toolMaterial,
+                t6.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                t7.tool_material toolMaterial,
+                t7.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                t8.tool_material toolMaterial,
+                t8.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                t9.tool_material toolMaterial,
+                t9.part_material partMaterial
+            </when>
+            <otherwise>
+                t10.tool_material toolMaterial,
+                t10.part_material partMaterial
+            </otherwise>
+        </choose>
+        FROM tms_out_store_detail t1
+        LEFT JOIN tms_base_tools t2 on t1.tool_code = t2.id
+        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
+        LEFT JOIN tms_tools_classify t11 on t11.id = t2.classify_id
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                LEFT JOIN tms_para_common_tool t4 on t4.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                LEFT JOIN tms_para_hole_tools t5 on t5.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                LEFT JOIN tms_para_threading_tool t6 on t6.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                LEFT JOIN tms_para_mill_tool t7 on t7.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                LEFT JOIN tms_para_turning_tools t8 on t8.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                LEFT JOIN tms_para_blade t9 on t9.tool_code = t2.id
+            </when>
+            <otherwise>
+                LEFT JOIN tms_para_common_tool t10 on t10.tool_code = t2.id
+            </otherwise>
+        </choose>
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundDetailMapper.xml
new file mode 100644
index 0000000..40abda6
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundDetailMapper.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsLossBoundDetailMapper">
+    <delete id="deleteByMainId" parameterType="java.lang.String">
+        DELETE
+        FROM tms_loss_bound_detail
+        WHERE loss_bound_id = #{mainId}
+    </delete>
+
+    <select id="selectByMainId" parameterType="java.lang.String"
+            resultType="org.jeecg.modules.tms.entity.ToolsLossBoundDetail">
+        SELECT *
+        FROM tms_loss_bound_detail
+        WHERE loss_bound_id = #{mainId}
+    </select>
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.ToolsLossBoundDetail">
+        SELECT
+        t1.*,
+        t2.chinese_name chineseName,
+        t2.tool_model toolModel,
+        t2.classify_id  classifyId,
+        t2.parama_table_name paramaTableName,
+        t3.application_type applicationType,
+        t3.supplier_id supplierId,
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                t4.tool_material toolMaterial,
+                t4.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                t5.tool_material toolMaterial,
+                t5.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                t6.tool_material toolMaterial,
+                t6.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                t7.tool_material toolMaterial,
+                t7.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                t8.tool_material toolMaterial,
+                t8.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                t9.tool_material toolMaterial,
+                t9.part_material partMaterial
+            </when>
+            <otherwise>
+                t10.tool_material toolMaterial,
+                t10.part_material partMaterial
+            </otherwise>
+        </choose>
+        FROM tms_loss_bound_detail t1
+        LEFT JOIN tms_base_tools t2 on t1.tool_id = t2.id
+        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
+
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                LEFT JOIN tms_para_common_tool t4 on t4.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                LEFT JOIN tms_para_hole_tools t5 on t5.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                LEFT JOIN tms_para_threading_tool t6 on t6.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                LEFT JOIN tms_para_mill_tool t7 on t7.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                LEFT JOIN tms_para_turning_tools t8 on t8.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                LEFT JOIN tms_para_blade t9 on t9.tool_code = t2.id
+            </when>
+            <otherwise>
+                LEFT JOIN tms_para_common_tool t10 on t10.tool_code = t2.id
+            </otherwise>
+        </choose>
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundMapper.xml
new file mode 100644
index 0000000..10f01fa
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundMapper.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsLossBoundMapper">
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.ToolsLossBound">
+        SELECT
+            t.*
+        FROM tms_loss_bound t
+            ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsSharpeningMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsSharpeningMapper.xml
new file mode 100644
index 0000000..34e329a
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsSharpeningMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsSharpeningMapper">
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.vo.ToolSharpeningVo">
+        SELECT
+            t.*,
+            t1.classify_id AS classifyId,
+            t1.parama_table_name AS paramaTableName,
+            t2.type_name AS typeName,
+            t3.application_type AS applicationType,
+            t3.tool_model AS toolModel,
+            t3.province_city AS provinceCity,
+            t3.chinese_name AS chineseName,
+            t3.supplier_id AS supplierId,
+            t3.storage_location AS storageLocation,
+            t3.main_unit AS mainUnit,
+            t4.position_code AS positionCode,
+            t4.warehouse_id AS warehouseId
+        FROM tms_tool_sharpening t
+                 LEFT JOIN tms_base_tools t1 ON t1.id = t.tool_code
+                 LEFT JOIN tms_tools_classify t2 ON t1.classify_id = t2.id
+                 LEFT JOIN tms_tools_config_property t3 ON t3.tool_code = t.tool_id
+                 LEFT JOIN tms_tool_ledger_detail t4 ON t4.tool_code = t.tool_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml
new file mode 100644
index 0000000..214d4dd
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsStocktakingBoundDetailMapper">
+
+    <delete id="deleteByMainId" parameterType="java.lang.String">
+        DELETE
+        FROM tools_stocktaking_bound_detail
+        WHERE goods_shelves_id = #{mainId}
+    </delete>
+    <select id="getParamaTableNameByMainId" parameterType="string" resultType="string">
+        SELECT t1.parama_table_name
+        FROM tools_stocktaking_bound_detail t
+                 LEFT JOIN tms_base_tools t1 ON t1.tool_id = t.id
+        WHERE t.goods_shelves_id = #{mainId}
+    </select>
+
+    <select id="selectByMainId" resultType="org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail">
+        SELECT
+        t.*,
+        t2.tool_code AS toolCode,  <!-- 淇锛氬皢t1鏀逛负t2 -->
+        t2.parama_table_name paramaTableName,
+        t2.classify_id AS classifyId,
+        t3.storage_location AS storageLocation,
+        t3.chinese_name AS chineseName,
+        t2.tool_model AS toolModel,
+        t3.supplier_id AS supplierId,
+
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                c.tool_material AS toolMaterial,
+                c.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                h.tool_material AS toolMaterial,
+                h.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                th.tool_material AS toolMaterial,
+                th.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                m.tool_material AS toolMaterial,
+                m.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                tr.tool_material AS toolMaterial,
+                tr.part_material AS partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                b.tool_material AS toolMaterial,
+                b.part_material AS partMaterial
+            </when>
+            <!-- 榛樿鎯呭喌锛歱aramaTableName 涓虹┖鎴栨湭浼犻�掓椂锛屽叧鑱� tms_para_common_tool 琛� -->
+            <otherwise>
+                c.tool_material AS toolMaterial,
+                c.part_material AS partMaterial
+            </otherwise>
+        </choose>
+        FROM tms_stocktaking_bound_detail t
+        LEFT JOIN tms_base_tools t2 on t.tool_id = t2.id
+        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
+
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                LEFT JOIN tms_para_common_tool c ON c.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                LEFT JOIN tms_para_hole_tools h ON h.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                LEFT JOIN tms_para_threading_tool th ON th.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                LEFT JOIN tms_para_mill_tool m ON m.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                LEFT JOIN tms_para_turning_tools tr ON tr.tool_code = t.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                LEFT JOIN tms_para_blade b ON b.tool_code = t.id
+            </when>
+            <!-- 榛樿鎯呭喌锛氭坊鍔� LEFT JOIN tms_para_common_tool c -->
+            <otherwise>
+                LEFT JOIN tms_para_common_tool c ON c.tool_code = t.id
+            </otherwise>
+        </choose>
+
+            ${ew.customSqlSegment}
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundMapper.xml
new file mode 100644
index 0000000..2014953
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsStocktakingBoundMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStoreEarlyWarningMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStoreEarlyWarningMapper.xml
new file mode 100644
index 0000000..72cacd0
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStoreEarlyWarningMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.tms.mapper.ToolsStoreEarlyWarningMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java
index 93291c0..b01cbed 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.tms.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.jeecg.modules.tms.entity.BaseTools;
@@ -28,4 +29,6 @@
     IPage<ParaTurningToolsVo> paraTurningToolsList(Page<ParaTurningToolsVo> page, Map<String, String[]> parameterMap);
 
     IPage<ParaBladeVo> paraBladeList(Page<ParaBladeVo> page, Map<String, String[]> parameterMap);
+    IPage<StocktakingPoundVo> pageWithLedgerAndConfig(Page<StocktakingPoundVo> page, QueryWrapper<StocktakingPoundVo> queryWrapper);
+    IPage<SharpeeningVo> pageWithSharpedAndConfig(Page<SharpeeningVo> page, QueryWrapper<SharpeeningVo> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInStoreDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInStoreDetailService.java
new file mode 100644
index 0000000..fbf6b9d
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInStoreDetailService.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.InStoreDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * @Description: 鍏ュ簱鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface IInStoreDetailService extends IService<InStoreDetail> {
+
+    IPage<Map<String, Object>> findPageList(Integer pageNo, Integer pageSize, Map<String, String> query);
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundDetailService.java
new file mode 100644
index 0000000..ea88f9b
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundDetailService.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.jeecg.modules.tms.entity.InboundDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface IInboundDetailService extends IService<InboundDetail> {
+
+    IPage<Map<String, Object>> findPageList(Integer pageNo, Integer pageSize, Map<String, String> query);
+
+    public boolean deleteByInboundOrderId(String inboundOrderId);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundOrderService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundOrderService.java
new file mode 100644
index 0000000..e8ac09e
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IInboundOrderService.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.tms.service;
+
+import org.jeecg.modules.tms.entity.InboundOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.dto.InboundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鍗�
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+public interface IInboundOrderService extends IService<InboundOrder> {
+
+    boolean submit(String id);
+
+    void approvalProcess(InboundOrderFlowDto inboundOrderFlowDto);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutStoreDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutStoreDetailService.java
new file mode 100644
index 0000000..ef66d57
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutStoreDetailService.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.OutStoreDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.vo.OutStoreDetailVo;
+
+import java.util.Map;
+
+/**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+public interface IOutStoreDetailService extends IService<OutStoreDetail> {
+
+    IPage<OutStoreDetailVo> queryPageList(Page<OutStoreDetailVo> page, Map<String, String[]> parameterMap);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java
index b1171e7..f055c95 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java
@@ -6,6 +6,7 @@
 import org.jeecg.modules.tms.entity.OutboundOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundRequestDto;
 import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import java.io.Serializable;
@@ -45,4 +46,6 @@
     void submit(String id);
 
 	void approvalProcess(OutBoundOrderFlowDto outBoundOrderFlowDto);
+
+    void outBound(List<OutBoundRequestDto> outBoundRequestList);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundDetailService.java
new file mode 100644
index 0000000..30a5be5
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundDetailService.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.tms.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
+
+import java.util.Map;
+
+/**
+ * @Description: 鎹熻�楀崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+public interface IToolsLossBoundDetailService extends IService<ToolsLossBoundDetail> {
+    IPage<ToolsLossBoundDetail> queryPageList(Page<ToolsLossBoundDetail> page, Map<String, String[]> parameterMap);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java
new file mode 100644
index 0000000..9964c40
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java
@@ -0,0 +1,53 @@
+package org.jeecg.modules.tms.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * @Description: 鎹熻�楀崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+public interface IToolsLossBoundService extends IService<ToolsLossBound> {
+
+
+    /**
+     * 鍒犻櫎涓�瀵瑰
+     *
+     * @param id
+     */
+    public void delMain (String id);
+
+    /**
+     * 鎵归噺鍒犻櫎涓�瀵瑰
+     *
+     * @param idList
+     */
+    public void delBatchMain (Collection<? extends Serializable> idList);
+
+
+    void addTotal(ToolsLossBound toolsLossBound);
+
+    IPage<ToolsLossBound> queryPageList(Page<ToolsLossBound> page, Map<String, String[]> parameterMap);
+
+    void editTotal(ToolsLossBound toolsLossBound);
+
+    /**
+     * 鎻愪氦鎶ユ崯鍗�
+     * @param id
+     * @return
+     */
+    boolean submintOrder(String id);
+
+
+    void  approvalProcess(LossBoundFlowDto lossBoundFlowDto);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java
new file mode 100644
index 0000000..060d369
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.vo.ToolSharpeningVo;
+
+import java.util.Map;
+
+/**
+ * @Description: 鍒�鍏峰垉纾ㄨ褰� Service 鎺ュ彛
+ * @Author: 渚澃
+ * @Date:   2025-05-10
+ */
+public interface IToolsSharpeningService extends IService<ToolSharpening> {
+    IPage<ToolSharpeningVo> queryPageList(Page<ToolSharpeningVo> page, Map<String, String[]> parameterMap);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundDetailService.java
new file mode 100644
index 0000000..da0bde5
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundDetailService.java
@@ -0,0 +1,31 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鐩樼偣鍗曟槑缁�
+ * @Author: houjie
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+public interface IToolsStocktakingBoundDetailService extends IService<ToolsStocktakingBoundDetail> {
+
+
+    /**
+     * 閫氳繃涓昏〃id鏌ヨ瀛愯〃鏁版嵁
+     *
+     * @param
+     * @return List<ToolsStocktakingBoundDetail>
+     */
+    public   IPage<ToolsStocktakingBoundDetail> selectByMainId(Page<ToolsStocktakingBoundDetail> page, Map<String, String[]> parameterMap);
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java
new file mode 100644
index 0000000..84f5c52
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java
@@ -0,0 +1,65 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.entity.dto.StocktakingBoundFlowDto;
+import org.jeecg.modules.tms.entity.vo.StocktakingPoundVo;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: houjie
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+public interface IToolsStocktakingBoundService extends IService<ToolsStocktakingBound> {
+
+    /**
+     * 娣诲姞涓�瀵瑰
+     *
+     * @param toolsStocktakingBound
+     * @param toolsStocktakingBoundDetailList
+     */
+    public void saveMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList);
+
+    /**
+     * 淇敼涓�瀵瑰
+     *
+     * @param toolsStocktakingBound
+     * @param toolsStocktakingBoundDetailList
+     */
+    public void updateMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList);
+
+    /**
+     * 鍒犻櫎涓�瀵瑰
+     *
+     * @param id
+     */
+    public void delMain(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎涓�瀵瑰
+     *
+     * @param idList
+     */
+    public void delBatchMain(Collection<? extends Serializable> idList);
+
+    /**
+     * 鎻愪氦鐩樼偣鍗�
+     * @param id
+     * @return
+     */
+    boolean submintOrder(String id);
+
+    /**
+     * 瀹℃壒娴佺▼
+     * @param stocktakingBoundFlowDto
+     */
+    void  approvalProcess(StocktakingBoundFlowDto stocktakingBoundFlowDto);
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStoreEarlyWarningService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStoreEarlyWarningService.java
new file mode 100644
index 0000000..24d4f3e
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStoreEarlyWarningService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.ToolsStoreEarlyWarning;
+
+/**
+ * @Description: tools_store_early warning
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+public interface IToolsStoreEarlyWarningService extends IService<ToolsStoreEarlyWarning> {
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java
index 53466da..fdcb8d4 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java
@@ -4,14 +4,12 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.modules.tms.entity.BaseTools;
-import org.jeecg.modules.tms.entity.ParaCommonTool;
 import org.jeecg.modules.tms.entity.vo.*;
 import org.jeecg.modules.tms.mapper.BaseToolsMapper;
 import org.jeecg.modules.tms.service.IBaseToolsService;
 import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import java.util.Map;
 
@@ -137,4 +135,13 @@
         queryWrapper.orderByDesc("t.create_time");
         return this.baseMapper.paraBladeList(page, queryWrapper);
     }
+    @Override
+    public IPage<StocktakingPoundVo> pageWithLedgerAndConfig(Page<StocktakingPoundVo> page, QueryWrapper<StocktakingPoundVo> queryWrapper) {
+        return baseMapper.pageWithLedgerAndConfig(page, queryWrapper);
+    }
+
+    @Override
+    public IPage<SharpeeningVo> pageWithSharpedAndConfig(Page<SharpeeningVo> page, QueryWrapper<SharpeeningVo> queryWrapper) {
+        return baseMapper.pageWithSharpedAndConfig(page, queryWrapper);
+    }
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InStoreDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InStoreDetailServiceImpl.java
new file mode 100644
index 0000000..49fe595
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InStoreDetailServiceImpl.java
@@ -0,0 +1,50 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.exception.ExceptionCast;
+import org.jeecg.modules.tms.entity.InStoreDetail;
+import org.jeecg.modules.tms.entity.ToolsClassify;
+import org.jeecg.modules.tms.mapper.InStoreDetailMapper;
+import org.jeecg.modules.tms.service.IInStoreDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鍏ュ簱鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Service
+public class InStoreDetailServiceImpl extends ServiceImpl<InStoreDetailMapper, InStoreDetail> implements IInStoreDetailService {
+
+    @Override
+    public IPage<Map<String, Object>> findPageList(Integer pageNo, Integer pageSize, Map<String, String> query) {
+        if (pageNo == null || pageNo < 1 || pageSize == null || pageSize < 1) {
+            ExceptionCast.cast("鍙傛暟閿欒");
+        }
+        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
+        QueryWrapper<Map> queryWrapper = Wrappers.query();
+        if (null != query) {
+            String classifyId = query.get("classifyId");
+            if (StringUtils.isNotBlank(classifyId)) {
+                queryWrapper.eq("t2.id", classifyId);
+            }
+            // 鎺掑簭鍐欐硶
+            List<OrderItem> orderItems = new ArrayList<>();
+            orderItems.add(OrderItem.desc("t1.create_time"));
+            ((Page<Map>) pageData).setOrders(orderItems);
+        }
+        return super.getBaseMapper().findPageList(pageData,queryWrapper);
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundDetailServiceImpl.java
new file mode 100644
index 0000000..c40515c
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundDetailServiceImpl.java
@@ -0,0 +1,55 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.exception.ExceptionCast;
+import org.jeecg.modules.tms.entity.InboundDetail;
+import org.jeecg.modules.tms.mapper.InboundDetailMapper;
+import org.jeecg.modules.tms.service.IInboundDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Service
+public class InboundDetailServiceImpl extends ServiceImpl<InboundDetailMapper, InboundDetail> implements IInboundDetailService {
+
+    @Override
+    public IPage<Map<String, Object>> findPageList(Integer pageNo, Integer pageSize, Map<String, String> query) {
+        if (pageNo == null || pageNo < 1 || pageSize == null || pageSize < 1) {
+            ExceptionCast.cast("鍙傛暟閿欒");
+        }
+        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
+        QueryWrapper<Map> queryWrapper = Wrappers.query();
+        if (null != query) {
+            String inboundOrderId = query.get("inboundOrderId");
+            if (StringUtils.isNotBlank(inboundOrderId)) {
+                queryWrapper.eq("t1.in_storehouse_id", inboundOrderId);
+            }
+            // 鎺掑簭鍐欐硶
+            List<OrderItem> orderItems = new ArrayList<>();
+            orderItems.add(OrderItem.desc("t1.create_time"));
+            ((Page<Map>) pageData).setOrders(orderItems);
+        }
+        return super.getBaseMapper().findPageList(pageData,queryWrapper);
+    }
+
+    @Override
+    public boolean deleteByInboundOrderId(String inboundOrderId) {
+        return this.baseMapper.deleteByInboundOrderId(inboundOrderId);
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
new file mode 100644
index 0000000..8eddc4a
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
@@ -0,0 +1,209 @@
+package org.jeecg.modules.tms.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.tms.entity.InboundOrder;
+import org.jeecg.modules.tms.entity.dto.InboundOrderFlowDto;
+import org.jeecg.modules.tms.mapper.InboundOrderMapper;
+import org.jeecg.modules.tms.service.IInboundOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * @Description: 鍏ュ簱鐢宠鍗�
+ * @Author: jeecg-boot
+ * @Date:   2025-05-19
+ * @Version: V1.0
+ */
+@Service("IInboundOrderService")
+public class InboundOrderServiceImpl extends ServiceImpl<InboundOrderMapper, InboundOrder> implements IInboundOrderService, FlowCallBackServiceI {
+
+    @Autowired
+    private FlowCommonService flowCommonService;
+    @Autowired
+    private IFlowDefinitionService flowDefinitionService;
+
+    @Autowired
+    private IFlowTaskService flowTaskService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Override
+    public boolean submit(String id) {
+        InboundOrder inboundOrder = this.getById(id);
+        //鍙戣捣瀹℃壒娴佺▼
+        this.triggerProcess(inboundOrder);
+        //鏇存柊鍏ュ簱鍗曞鎵圭姸鎬佷负宸叉彁浜�
+        inboundOrder.setOrderStatus("2");
+        this.updateById(inboundOrder);
+        return true;
+    }
+
+    /**
+     * 瑙﹀彂娴佺▼
+     *
+     * @param inboundOrder
+     * @return
+     */
+    public boolean triggerProcess(InboundOrder inboundOrder) {
+
+        flowCommonService.initActBusiness("鍏ュ簱鐢宠鍗曞彿锛�" + inboundOrder.getInboundNum()+"鍙戣捣瀹℃壒娴佺▼",
+                inboundOrder.getId(), "IInboundOrderService", "tool_in_storage", null);
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("dataId", inboundOrder.getId());
+        variables.put("organization", "鏂板鍏ュ簱鐢宠鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+        variables.put("comment", "鏂板鍏ュ簱鐢宠鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+        variables.put("proofreading", true);
+        List<String> usernames = new ArrayList<>();
+        usernames.add(inboundOrder.getHandler());
+        variables.put("NextAssignee", usernames);
+        Result result = flowDefinitionService.startProcessInstanceByKey("tool_in_storage", variables);
+        return result.isSuccess();
+    }
+
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();//鍓嶇浼犺繘鏉ョ殑鍙傛暟
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞�
+        //鑾峰彇涓嬩竴姝ュ鐞嗕汉
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void approvalProcess(InboundOrderFlowDto inboundOrderFlowDto) {
+        if (StrUtil.isBlank(inboundOrderFlowDto.getTaskId()) || StrUtil.isBlank(inboundOrderFlowDto.getDataId())) {
+            throw new JeecgBootException("闈炴硶鍙傛暟锛�");
+        }
+
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = getCurrentUser();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("璐﹀彿涓嶅瓨鍦�");
+        }
+
+        //鑾峰彇鍏ュ簱鐢宠鍗曚俊鎭�
+        InboundOrder inboundOrder = getById(inboundOrderFlowDto.getDataId());
+        if (inboundOrder == null) {
+            throw new JeecgBootException("鏈壘鍒板搴旂殑鍑哄簱鐢宠鍗曪紒");
+        }
+
+        //鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = getFlowMyBusiness(inboundOrderFlowDto.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼璁板綍涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ョ敤鎴锋槸鍚︽湁鏉冮檺鎿嶄綔浠诲姟
+        if (!isUserAuthorized(flowMyBusiness, user)) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+        }
+
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰�");
+        }
+
+        //璁剧疆娴佺▼鍙橀噺
+        setupProcessVariables(inboundOrderFlowDto, inboundOrder, user);
+
+        //瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(inboundOrderFlowDto);
+
+        //鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
+        if (result.isSuccess()) {
+            inboundOrder.setOrderStatus(inboundOrderFlowDto.getStatus());
+            if ("3".equals(inboundOrderFlowDto.getStatus())) {
+                inboundOrder.setInStatus("1");
+            }
+            inboundOrder.setReviewer(user.getUsername());
+            inboundOrder.setApprovalDate(new Date());
+            inboundOrder.setApprovalOpinion(inboundOrderFlowDto.getApprovalOpinion());
+            updateById(inboundOrder);
+        }
+    }
+
+    private LoginUser getCurrentUser() {
+        // 鑾峰彇褰撳墠璁よ瘉鐨勭櫥褰曠敤鎴蜂俊鎭�
+        Subject currentUser = SecurityUtils.getSubject();
+        if (currentUser != null && currentUser.isAuthenticated()) {
+            Object principal = currentUser.getPrincipal();
+            if (principal instanceof LoginUser) {
+                return (LoginUser) principal;
+            }
+        }
+        return null;
+    }
+
+    private FlowMyBusiness getFlowMyBusiness(String instanceId) {
+        List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                new LambdaQueryWrapper<FlowMyBusiness>().eq(FlowMyBusiness::getProcessInstanceId, instanceId));
+        return businessList.isEmpty() ? null : businessList.get(0);
+    }
+
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
+    }
+
+    private void setupProcessVariables(InboundOrderFlowDto inboundOrderFlowDto, InboundOrder inboundOrder, LoginUser user) {
+        if ("2".equals(inboundOrder.getOrderStatus()) && user.getUsername().equals(inboundOrder.getReviewer())) {
+            Map<String, Object> values = new HashMap<>();
+            values.put("dataId", inboundOrder.getId());
+            values.put("organization", inboundOrderFlowDto.getApprovalOpinion());
+            values.put("comment", inboundOrderFlowDto.getApprovalOpinion());
+            values.put("status", inboundOrderFlowDto.getStatus());
+            values.put("NextAssignee", Collections.singletonList(inboundOrder.getReviewer()));
+            inboundOrderFlowDto.setValues(values);
+        }
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutStoreDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutStoreDetailServiceImpl.java
new file mode 100644
index 0000000..8087404
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutStoreDetailServiceImpl.java
@@ -0,0 +1,36 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.OutStoreDetail;
+import org.jeecg.modules.tms.entity.vo.OutStoreDetailVo;
+import org.jeecg.modules.tms.mapper.OutStoreDetailMapper;
+import org.jeecg.modules.tms.service.IOutStoreDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.Map;
+
+/**
+ * @Description: 宸ュ叿鍑哄簱娴佹按
+ * @Author: jeecg-boot
+ * @Date:   2025-05-23
+ * @Version: V1.0
+ */
+@Service
+public class OutStoreDetailServiceImpl extends ServiceImpl<OutStoreDetailMapper, OutStoreDetail> implements IOutStoreDetailService {
+
+    @Override
+    public IPage<OutStoreDetailVo> queryPageList(Page<OutStoreDetailVo> page, Map<String, String[]> parameterMap) {
+        QueryWrapper<OutStoreDetailVo> queryWrapper = Wrappers.query();
+        String[] classifyIds = parameterMap.get("classifyId");
+        if (classifyIds != null && classifyIds.length > 0) {
+            queryWrapper.eq("t11.classify_id", classifyIds[0]);
+        }
+        queryWrapper.orderByDesc("create_time");
+        return this.baseMapper.queryPageList(page, queryWrapper);
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
index d0f5668..f5cdf56 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -26,22 +26,25 @@
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
-import org.jeecg.modules.tms.entity.OutboundOrder;
-import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.*;
 import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundRequestDto;
 import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
 import org.jeecg.modules.tms.enums.OutBillStatus;
 import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
+import org.jeecg.modules.tms.enums.OutStorehouseType;
+import org.jeecg.modules.tms.enums.ToolCirculationStatus;
 import org.jeecg.modules.tms.mapper.OutboundDetailMapper;
 import org.jeecg.modules.tms.mapper.OutboundOrderMapper;
-import org.jeecg.modules.tms.service.IOutboundDetailService;
-import org.jeecg.modules.tms.service.IOutboundOrderService;
+import org.jeecg.modules.tms.service.*;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: tms_outbound_order
@@ -55,6 +58,12 @@
 
 	@Autowired
 	private IOutboundDetailService outboundDetailService;
+	@Autowired
+	private IToolLedgerService toolLedgerService;
+	@Autowired
+	private IToolLedgerDetailService toolLedgerDetailService;
+	@Autowired
+	private IOutStoreDetailService outStoreDetailService;
 	@Autowired
 	private ISysBusinessCodeRuleService businessCodeRuleService;
 	@Autowired
@@ -207,9 +216,13 @@
 
 		//鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
 		if (result.isSuccess()) {
-			outboundOrder.setOrderStatus(outBoundOrderFlowDto.getStatus());
 			if (OutBillStatus.APPROVED.getValue().equals(outBoundOrderFlowDto.getStatus())) {
 				outboundOrder.setOutStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue());
+				outboundOrder.setOrderStatus(OutBillStatus.APPROVED.getValue());
+			}
+			if (OutBillStatus.REJECTED.getValue().equals(outBoundOrderFlowDto.getStatus())) {
+				//濡傛灉椹冲洖锛屽鎵瑰崟鐘舵�佸洖鍒拌崏绋�
+				outboundOrder.setOrderStatus(OutBillStatus.DRAFT.getValue());
 			}
 			outboundOrder.setAuditDate(new Date());
 			outboundOrder.setApprovalOpinion(outBoundOrderFlowDto.getApprovalOpinion());
@@ -217,6 +230,158 @@
 		}
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void outBound(List<OutBoundRequestDto> outBoundRequestList) {
+		//鏍¢獙鏄惁鏉ヨ嚜涓�涓敵璇峰崟
+		if (!fromOneApply(outBoundRequestList)) {
+			throw new JeecgBootException("鍑哄簱鏄庣粏蹇呴』鏉ヨ嚜鍚屼竴鍑哄簱鐢宠鍗曪紒");
+		}
+		//鏄惁鍙嚭搴撴牎楠�
+		if (!readyToOutbound(outBoundRequestList)) {
+			throw new JeecgBootException("鏈粡瀹℃壒閫氳繃鐨勭敵璇峰崟涓嶈兘鍑哄簱锛�");
+		}
+		//寮�濮嬪嚭搴�
+		OutboundOrder outboundOrder = getById(outBoundRequestList.get(0).getOutBoundOrderId());
+		List<String> detailIds = outBoundRequestList.stream().map(OutBoundRequestDto::getOutboundDetailId).collect(Collectors.toList());
+		List<OutboundDetail> outboundDetailList = outboundDetailService.listByIds(detailIds);
+		List<String> toolIdList = outboundDetailList.stream().map(OutboundDetail::getToolCode).collect(Collectors.toList());
+
+		Map<String, BigDecimal> outBoundRequestMap = outBoundRequestList.stream()
+				.collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, OutBoundRequestDto::getOutboundQuantity));
+		//澶勭悊搴撳瓨鍙拌处鍙婂彴璐︽槑缁�
+		Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, toolIdList)).stream()
+				.collect(Collectors.toMap(ToolLedger::getToolId, item -> item, (k1, k2) -> k1));
+
+		LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
+		for (int i = 0; i < outboundDetailList.size(); i++) {
+			if (i > 0) {
+				queryWrapper.or();
+			}
+			OutboundDetail detail = outboundDetailList.get(i);
+			queryWrapper.and(wrapper ->
+					wrapper.eq(ToolLedgerDetail::getToolCode, detail.getToolCode())
+							.eq(ToolLedgerDetail::getToolId, detail.getToolId()) //濡傛灉涓嶇鍒版妸锛岃瀛楁涓虹┖
+			);
+		}
+		List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(queryWrapper);
+		List<ToolLedger> toolLedgerUpdateList = CollectionUtil.newArrayList();
+		List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
+		List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
+		List<OutboundDetail> outboundDetailUpdateList = CollectionUtil.newArrayList();
+
+		for (OutboundDetail detail : outboundDetailList) {
+			//鏇存柊搴撳瓨鍙拌处
+			ToolLedger toolLedger = toolLedgerMap.get(detail.getToolCode());
+			BigDecimal outboundQuantity = outBoundRequestMap.get(detail.getId());
+			OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(outboundOrder.getOutStorehouseType());
+			switch (outStorehouseType) {
+				case TOOL_BORROW:
+					toolLedger.setLendCount(toolLedger.getLendCount().add(outboundQuantity));
+					break;
+				case MAINTENANCE_OUTBOUND:
+					toolLedger.setRepairCount(toolLedger.getRepairCount().add(outboundQuantity));
+					break;
+				case CALIBRATION_OUTBOUND:
+					toolLedger.setDetectionCount(toolLedger.getDetectionCount().add(outboundQuantity));
+					break;
+				case GRINDING_OUTBOUND:
+					toolLedger.setSharpeningCount(toolLedger.getSharpeningCount().add(outboundQuantity));
+					break;
+				default:
+					throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+			}
+			toolLedgerUpdateList.add(toolLedger);
+
+			//鏇存柊鍙拌处鏄庣粏
+			toolLedgerDetailList.stream().filter(item -> item.getToolCode().equals(detail.getToolCode()) && item.getToolId().equals(detail.getToolId()))
+					.findFirst().ifPresent(item -> {
+						if (StrUtil.isNotBlank(item.getToolId())) {
+							item.setQuantity(BigDecimal.ZERO);
+							switch (outStorehouseType) {
+								case TOOL_BORROW:
+									item.setStatus(ToolCirculationStatus.BORROWED.getValue());
+									break;
+								case MAINTENANCE_OUTBOUND:
+									item.setStatus(ToolCirculationStatus.REPAIRING.getValue());
+									break;
+								case CALIBRATION_OUTBOUND:
+									item.setStatus(ToolCirculationStatus.INSPECTING.getValue());
+									break;
+								case GRINDING_OUTBOUND:
+									item.setStatus(ToolCirculationStatus.GRINDING.getValue());
+									break;
+								default:
+									throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+							}
+						} else {
+							item.setQuantity(item.getQuantity().subtract(outboundQuantity));
+						}
+						toolLedgerDetailUpdateList.add(item);
+					});
+
+			//璁板綍鍑哄簱娴佹按
+			OutStoreDetail outStoreDetail = new OutStoreDetail()
+					.setToolCode(detail.getToolCode())
+					.setToolId(detail.getToolId())
+					.setOutStorehouseType(outboundOrder.getOutStorehouseType())
+					.setGoodsShelvesCode(detail.getOutboundLocation())
+					.setOutNumber(outboundQuantity)
+					.setOutStorehouseId(outboundOrder.getId())
+					.setOperateType("1");//1锛氭寜鐢宠鍗�
+			outStoreAddList.add(outStoreDetail);
+
+			//鏇存柊鐢宠鍗曟槑缁�
+			detail.setOutActualCount(detail.getOutActualCount().add(outboundQuantity));
+			detail.setOutboundTime(new Date());
+			if (detail.getOutActualCount().compareTo(detail.getOutboundQuantity()) == 0) {
+				detail.setStatus(OutBoundStatusEnum.COMPLETED.getValue());
+			} else {
+				detail.setStatus(OutBoundStatusEnum.PARTIAL_OUTBOUND.getValue());
+			}
+			outboundDetailUpdateList.add(detail);
+		}
+		toolLedgerService.updateBatchById(toolLedgerUpdateList);
+		toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
+		outStoreDetailService.saveBatch(outStoreAddList);
+		outboundDetailService.updateBatchById(outboundDetailUpdateList);
+
+		//鏇存柊鐢宠鍗�
+		boolean allMatch = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+						.eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()))
+				.stream().filter(i -> !detailIds.contains(i.getId()))
+				.allMatch(i -> i.getStatus().equals(OutBoundStatusEnum.COMPLETED.getValue()));
+		List<OutboundDetail> partialOutboundList = outboundDetailUpdateList.stream()
+				.filter(i -> !i.getStatus().equals(OutBoundStatusEnum.COMPLETED.getValue())).collect(Collectors.toList());
+		if (allMatch && partialOutboundList.isEmpty()) {
+			outboundOrder.setOutStatus(OutBoundStatusEnum.COMPLETED.getValue());
+		} else {
+			outboundOrder.setOutStatus(OutBoundStatusEnum.PARTIAL_OUTBOUND.getValue());
+		}
+		outboundOrder.setOutboundTime(new Date());
+		updateById(outboundOrder);
+	}
+
+	private boolean fromOneApply(List<OutBoundRequestDto> outBoundRequestList) {
+		long count = outBoundRequestList.stream().map(OutBoundRequestDto::getOutBoundOrderId).distinct().count();
+		if (count > 1) {
+			return false;
+		}
+		List<String> outDetailIds = outBoundRequestList.stream().map(OutBoundRequestDto::getOutboundDetailId).collect(Collectors.toList());
+		String outboundDetailId = outBoundRequestList.get(0).getOutboundDetailId();
+		OutboundDetail outboundDetail = outboundDetailService.getById(outboundDetailId);
+		List<String> detailIds = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+				.eq(OutboundDetail::getOutStorehouseId, outboundDetail.getOutStorehouseId())).stream()
+				.map(OutboundDetail::getId).collect(Collectors.toList());
+        return new HashSet<>(detailIds).containsAll(outDetailIds);
+    }
+
+	private boolean readyToOutbound(List<OutBoundRequestDto> outBoundRequestList) {
+		String outBoundOrderId = outBoundRequestList.get(0).getOutBoundOrderId();
+		OutboundOrder outboundOrder = getById(outBoundOrderId);
+        return OutBillStatus.APPROVED.getValue().equals(outboundOrder.getOrderStatus());
+    }
+
 	public boolean triggerProcess(OutboundOrder outboundOrder) {
 		flowCommonService.initActBusiness("鍗曞彿涓猴細" + outboundOrder.getOutNum() + " 鐨勫嚭搴撶敵璇凤紝寮�濮嬭繘琛屽鎵�",
 				outboundOrder.getId(), "outboundOrderServiceImpl", "tool_out_storage", null);
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsClassifyServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsClassifyServiceImpl.java
index 8cabb60..cee90e8 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsClassifyServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsClassifyServiceImpl.java
@@ -78,7 +78,7 @@
         return this.baseMapper.queryPageList(page, queryWrapper);
     }
     public List<CommonGenericTree> loadTree() {
-        List<ToolsClassify> toolsClassifyList = this.list();
+        List<ToolsClassify> toolsClassifyList = this.lambdaQuery().orderByAsc(ToolsClassify::getId).list();
         List<CommonGenericTree> commonGenericTreeList = loadTree(toolsClassifyList);
         return commonGenericTreeList;
     }
@@ -87,54 +87,39 @@
         @SuppressWarnings("unused") ToolsClassify toolsClassify = new ToolsClassify();
         List<CommonGenericTree> list = new ArrayList<>();
         Map<String, CommonGenericTree> map = new HashMap<>();
-        CommonGenericTree<ToolsClassify> node = new CommonGenericTree<>();
-        node.setKey("-1");
-        node.setTitle("宸ュ叿鍒嗙被");
-        node.setRField1("");
-        node.setRField2("");
-        node.setEntity(new ToolsClassify().setId("-1").setClassifyId("0").setTypeName("宸ュ叿鍒嗙被").setLeafFlag("2"));
-        list.add(node);
         if (CollectionUtils.isNotEmpty(toolsClassifyList)) {
             CommonGenericTree<ToolsClassify> tcNode;
+            CommonGenericTree<ToolsClassify> childNode;
             for (ToolsClassify tc : toolsClassifyList) {
-                if (StrUtils.isBlankOrNull(tc.getParentId()) || tc.getParentId().equals("-1")) {
+                ToolsClassify child = tc;
+                if (StrUtils.isBlankOrNull(tc.getParentId())) {
                     tcNode = new CommonGenericTree<>();
                     tcNode.setKey(tc.getId());
                     tcNode.setTitle(tc.getClassifyId() + "/" + tc.getTypeName());
-                    tcNode.setParentId(node.getKey());
                     tcNode.setIcon("");
                     tcNode.setType(1);
                     tcNode.setValue(tc.getId());
                     tcNode.setDisabled(CommonConstant.STATUS_0.equals(tc.getStatus()) ? true : false);
                     tcNode.setRField1(tc.getClassifyId());
-                    tcNode.setRField2(getBaseParent(tc.getId(), 0).getClassifyId());
+                    //tcNode.setRField2(getBaseParent(tc.getId(), 0).getClassifyId());
                     tcNode.setEntity(tc);
-                    node.addChildren(tcNode);
+                    list.add(tcNode);
                     map.put(tc.getId(), tcNode);
-                }
-            }
-            CommonGenericTree<ToolsClassify> childNode;
-            for (ToolsClassify tc : toolsClassifyList) {
-                ToolsClassify child = tc;
-                if (map.containsKey(child.getParentId())) {
-                    if (StrUtils.isBlankOrNull(tc.getParentId()) || tc.getParentId().equals("-1")) {
-                        toolsClassify = tc;
-                    } else {
-                        tcNode = map.get(child.getParentId());
-                        childNode = new CommonGenericTree<>();
-                        childNode.setKey(tc.getId());
-                        childNode.setTitle(tc.getClassifyId() + "/" + tc.getTypeName());
-                        childNode.setParentId(tc.getParentId());
-                        childNode.setIcon("");
-                        childNode.setType(0);
-                        childNode.setValue(tc.getId());
-                        childNode.setDisabled(CommonConstant.STATUS_0.equals(tc.getStatus()) ? true : false);
-                        childNode.setRField1(tc.getClassifyId());
-                        childNode.setRField2(getBaseParent(tc.getId(), 0).getClassifyId());
-                        childNode.setEntity(tc);
-                        tcNode.addChildren(childNode);
-                        map.put(child.getId(), childNode);
-                    }
+                } else {
+                    tcNode = map.get(child.getParentId());
+                    childNode = new CommonGenericTree<>();
+                    childNode.setKey(tc.getId());
+                    childNode.setTitle(tc.getClassifyId() + "/" + tc.getTypeName());
+                    childNode.setParentId(tc.getParentId());
+                    childNode.setIcon("");
+                    childNode.setType(0);
+                    childNode.setValue(tc.getId());
+                    childNode.setDisabled(CommonConstant.STATUS_0.equals(tc.getStatus()) ? true : false);
+                    childNode.setRField1(tc.getClassifyId());
+                    //childNode.setRField2(getBaseParent(tc.getId(), 0).getClassifyId());
+                    childNode.setEntity(tc);
+                    tcNode.addChildren(childNode);
+                    map.put(child.getId(), childNode);
                 }
             }
         }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundDetailServiceImpl.java
new file mode 100644
index 0000000..2d44481
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundDetailServiceImpl.java
@@ -0,0 +1,38 @@
+package org.jeecg.modules.tms.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
+import org.jeecg.modules.tms.mapper.ToolsLossBoundDetailMapper;
+import org.jeecg.modules.tms.service.IToolsLossBoundDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.Map;
+
+/**
+ * @Description: 鎹熻�楀崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-05-21
+ * @Version: V1.0
+ */
+@Service
+public class ToolsLossBoundDetailServiceImpl extends ServiceImpl<ToolsLossBoundDetailMapper, ToolsLossBoundDetail> implements IToolsLossBoundDetailService {
+
+    @Override
+    public IPage<ToolsLossBoundDetail> queryPageList(Page<ToolsLossBoundDetail> page, Map<String, String[]> parameterMap) {
+        QueryWrapper<ToolsLossBoundDetail> queryWrapper = Wrappers.query();
+        String[] outStorehouseIds = parameterMap.get("lossBoundId");
+        if (outStorehouseIds != null && outStorehouseIds.length > 0) {
+            queryWrapper.eq("t1.loss_bound_id", outStorehouseIds[0]);
+        }
+        return this.baseMapper.queryPageList(page, queryWrapper);
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java
new file mode 100644
index 0000000..534804b
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java
@@ -0,0 +1,347 @@
+package org.jeecg.modules.tms.service.impl;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.jeecg.modules.tms.entity.ToolLedger;
+import org.jeecg.modules.tms.entity.ToolLedgerDetail;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
+import org.jeecg.modules.tms.mapper.ToolsLossBoundDetailMapper;
+import org.jeecg.modules.tms.mapper.ToolsLossBoundMapper;
+import org.jeecg.modules.tms.service.IToolLedgerDetailService;
+import org.jeecg.modules.tms.service.IToolLedgerService;
+import org.jeecg.modules.tms.service.IToolsLossBoundDetailService;
+import org.jeecg.modules.tms.service.IToolsLossBoundService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @Description: 鎹熻�楀崟
+ * @Author: jeecg-boot
+ * @Date: 2025-05-21
+ * @Version: V1.0
+ */
+@Service("IToolsLossBoundService")
+public class ToolsLossBoundServiceImpl extends ServiceImpl<ToolsLossBoundMapper, ToolsLossBound> implements IToolsLossBoundService, FlowCallBackServiceI {
+
+    @Autowired
+    private ToolsLossBoundMapper baseMapper;
+
+    @Autowired
+    private ToolsLossBoundDetailMapper baseDetailMapper;
+    @Autowired
+    private IToolsLossBoundDetailService toolsLossBoundDetailService;
+    @Resource
+    private FlowCommonService flowCommonService;
+    @Resource
+    private IFlowDefinitionService flowDefinitionService;
+    @Autowired
+    private IFlowTaskService flowTaskService;
+    @Autowired
+    private ISysBusinessCodeRuleService businessCodeRuleService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private IToolLedgerService toolLedgerService;
+
+    @Autowired
+    private IToolLedgerDetailService toolLedgerDetailService;
+
+    @Override
+    public void delMain(String id) {
+        baseDetailMapper.deleteByMainId(id);
+        baseMapper.deleteById(id);
+    }
+
+    @Override
+    public void delBatchMain(Collection<? extends Serializable> idList) {
+        for (Serializable id : idList) {
+            baseDetailMapper.deleteByMainId(id.toString());
+            baseMapper.deleteById(id);
+        }
+    }
+
+    @Override
+    public void addTotal(ToolsLossBound toolsLossBound) {
+        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (loginUser != null) {
+            toolsLossBound.setHandler(loginUser.getId());
+        }
+        toolsLossBound.setOrderCode(businessCodeRuleService.generateBusinessCodeSeq("LossBound"));
+        toolsLossBound.setOrderStatus(OutBillStatus.DRAFT.getValue());
+        save(toolsLossBound);
+
+        List<ToolsLossBoundDetail> detailList = toolsLossBound.getToolsLossBoundDetailList();
+        List<ToolsLossBoundDetail> newDetailList = new ArrayList<>();
+
+        if (CollectionUtils.isNotEmpty(detailList)) {
+            detailList.forEach(item -> {
+                item.setLossBoundId(toolsLossBound.getId());
+                newDetailList.add(item);
+            });
+
+            toolsLossBoundDetailService.saveBatch(newDetailList);
+        }
+    }
+
+
+    @Override
+    public IPage<ToolsLossBound> queryPageList(Page<ToolsLossBound> page, Map<String, String[]> parameterMap) {
+        QueryWrapper<ToolsLossBound> queryWrapper = Wrappers.query();
+        String[] orderCode = parameterMap.get("orderCode");
+        if (orderCode != null && orderCode.length > 0) {
+            queryWrapper.like("t.order_code", orderCode[0]);
+        }
+        String[] statuses = parameterMap.get("orderStatus");
+        if (statuses != null && statuses.length > 0) {
+            queryWrapper.eq("t.order_status", statuses[0]);
+        }
+        return this.baseMapper.queryPageList(page, queryWrapper);
+    }
+
+    @Override
+    public void editTotal(ToolsLossBound toolsLossBound) {
+        //鍒犻櫎鎵�鏈夋槑缁�
+        toolsLossBoundDetailService.remove(new LambdaQueryWrapper<ToolsLossBoundDetail>().eq(ToolsLossBoundDetail::getLossBoundId, toolsLossBound.getId()));
+        ToolsLossBound toolsLossBound1 = BeanUtil.copyProperties(toolsLossBound, ToolsLossBound.class);
+        this.baseMapper.updateById(toolsLossBound1);
+        List<ToolsLossBoundDetail> detailList = CollectionUtil.newArrayList();
+        toolsLossBound.getToolsLossBoundDetailList().forEach(item -> {
+            item.setLossBoundId(toolsLossBound1.getId());
+            detailList.add(item);
+        });
+        toolsLossBoundDetailService.saveBatch(detailList);
+
+    }
+
+    @Override
+    public boolean submintOrder(String id) {
+
+        ToolsLossBound toolsLossBound = this.getById(id);
+        if (toolsLossBound == null) {
+            return false;
+        } else {
+            toolsLossBound.setReviewer(toolsLossBound.getReviewer());
+
+            flowCommonService.initActBusiness("鎶ユ崯鍗曞彿:" + toolsLossBound.getOrderCode() + ";鎶ユ崯浜�: " + toolsLossBound.getLosser() + ";杩涜鎶ユ崯", toolsLossBound.getId(), "IToolsStocktakingBoundService", "tools_Loss_Approval", null);
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("dataId", toolsLossBound.getId());
+            if (StrUtil.isEmpty(toolsLossBound.getReviewer())) {
+                variables.put("organization", "鏂板宸ュ叿鎶ユ崯鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+                variables.put("comment", "鏂板宸ュ叿鎶ユ崯鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+            } else {
+                variables.put("organization", toolsLossBound.getLossReason());
+                variables.put("comment", toolsLossBound.getLossReason());
+            }
+            variables.put("proofreading", true);
+            List<String> usernames = new ArrayList<>();
+            usernames.add(toolsLossBound.getReviewer());
+            variables.put("NextAssignee", usernames);
+            Result result = flowDefinitionService.startProcessInstanceByKey("tools_Loss_Approval", variables);
+            if (result != null) {
+                toolsLossBound.setLossTime(new Date());
+                toolsLossBound.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
+                //淇濆瓨宸ュ崟
+                baseMapper.updateById(toolsLossBound);
+                return result.isSuccess();
+            }
+            return true;
+        }
+    }
+
+    @Override
+    public void approvalProcess(LossBoundFlowDto lossBoundFlowDto) {
+        if (StrUtil.isBlank(lossBoundFlowDto.getTaskId()) || StrUtil.isBlank(lossBoundFlowDto.getDataId())) {
+            throw new JeecgBootException("闈炴硶鍙傛暟锛�");
+        }
+
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("璐﹀彿涓嶅瓨鍦�");
+        }
+
+        //鑾峰彇鎶ユ崯鍗曚俊鎭�
+        ToolsLossBound toolsLossBound = getById(lossBoundFlowDto.getDataId());
+        if (toolsLossBound == null) {
+            throw new JeecgBootException("鏈壘鍒板搴旂殑鍑哄簱鐢宠鍗曪紒");
+        }
+
+        //鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = getFlowMyBusiness(lossBoundFlowDto.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼璁板綍涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ョ敤鎴锋槸鍚︽湁鏉冮檺鎿嶄綔浠诲姟
+        if (!isUserAuthorized(flowMyBusiness, user)) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+        }
+
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰�");
+        }
+
+        //璁剧疆娴佺▼鍙橀噺
+        setupProcessVariables(lossBoundFlowDto, toolsLossBound, user);
+
+        //瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(lossBoundFlowDto);
+
+        //鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
+        if (result.isSuccess()) {
+            toolsLossBound.setOrderStatus(lossBoundFlowDto.getStatus());
+            if (OutBillStatus.APPROVED.getValue().equals(lossBoundFlowDto.getStatus())) {
+                toolsLossBound.setOrderStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue());
+            }
+            /**
+             * 鏇存柊瀹℃壒鏃堕棿銆佸鎵规剰瑙� 鏇存柊搴撳瓨鎵e噺 搴撳瓨鎬绘暟
+             * 鑾峰彇宸ュ叿鏄庣粏鍒楄〃锛岄亶鍘嗘瘡涓伐鍏锋槑缁嗭紝鏇存柊瀵瑰簲鐨勫伐鍏峰簱瀛樿褰曘��
+             * 瀵逛簬姣忎釜宸ュ叿锛岃幏鍙栧搴旂殑宸ュ叿搴撳瓨璁板綍锛圱oolLedger锛夛紝骞舵洿鏂版�诲簱瀛樻暟閲忥紙totalCount锛夊拰鎹熷け鏁伴噺锛坙ossCount锛夈��
+             * 纭繚鍦ㄦ洿鏂版�诲簱瀛樻暟閲忎箣鍓嶏紝妫�鏌ユ�诲簱瀛樻暟閲忔槸鍚﹀ぇ浜庢垨绛変簬鎹熷け鏁伴噺銆傚鏋滀笉婊¤冻鏉′欢锛屾姏鍑哄紓甯告垨杩涜鍏朵粬澶勭悊銆�
+             * 鏈�鍚庯紝淇濆瓨鏇存柊鍚庣殑宸ュ叿搴撳瓨璁板綍銆�
+             */
+
+            List<ToolsLossBoundDetail> detailList = toolsLossBound.getToolsLossBoundDetailList();
+
+            if (CollectionUtils.isEmpty(detailList)) {
+                throw new JeecgBootException("鎶ユ崯鏄庣粏涓虹┖锛屾棤娉曡繘琛屽簱瀛樻墸鍑�");
+            }
+            Map<String, BigDecimal> toolLossMap = new HashMap<>();
+            for (ToolsLossBoundDetail item : detailList) {
+                if (item.getToolId() == null || item.getLossNumber() == null) {
+                    continue; //
+                }
+                toolLossMap.put(item.getToolId(), toolLossMap.getOrDefault(item.getToolId(), BigDecimal.ZERO).add(item.getLossNumber()));
+            }
+            /**
+             * 閬嶅巻姣忎釜 toolId锛屾洿鏂板搴旂殑 ToolLedger
+             */
+            for (Map.Entry<String, BigDecimal> entry : toolLossMap.entrySet()) {
+                String toolId = entry.getKey();
+                BigDecimal totalLossNumber = entry.getValue();
+
+                ToolLedger toolLedger = toolLedgerService.getOne(new QueryWrapper<ToolLedger>().eq("id", toolId));
+                if (toolLedger == null) {
+                    throw new JeecgBootException("鏈壘鍒板搴旂殑宸ュ叿搴撳瓨璁板綍锛宼oolId锛�" + toolId);
+                }
+
+                // 鎵e噺鎬诲簱瀛�
+                if (toolLedger.getTotalCount() != null && toolLedger.getTotalCount().compareTo(totalLossNumber) >= 0) {
+                    toolLedger.setTotalCount(toolLedger.getTotalCount().subtract(totalLossNumber));
+                    toolLedger.setLossCount(toolLedger.getLossCount().add(totalLossNumber));
+                } else {
+                    throw new JeecgBootException("搴撳瓨涓嶈冻锛屾棤娉曞畬鎴愭姤鎹熸搷浣滐紝toolId锛�" + toolId);
+                }
+
+                // 鏇存柊鏁版嵁搴撲腑鐨� ToolLedger
+                toolLedgerService.updateById(toolLedger);
+                /**
+                 * 鏂板閫昏緫锛氭洿鏂板彴璐︽槑缁嗚〃 ToolLedgerDetail 涓殑鐘舵�佸瓧娈典负 6
+                 */
+                UpdateWrapper<ToolLedgerDetail> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.eq("tool_id", toolId)
+                        .set("status", 6);         // 鐘舵�佽缃负 6
+
+                toolLedgerDetailService.update(updateWrapper);
+            }
+
+            toolsLossBound.setApprovalDate(new Date());
+            toolsLossBound.setApprovalOpinion(lossBoundFlowDto.getApprovalOpinion());
+            updateById(toolsLossBound);
+        }
+    }
+
+    private void setupProcessVariables(LossBoundFlowDto lossBoundFlowDto, ToolsLossBound toolsLossBound, LoginUser user) {
+        if (OutBillStatus.SUBMITTED.getValue().equals(toolsLossBound.getOrderStatus()) && user.getUsername().equals(toolsLossBound.getReviewer())) {
+            Map<String, Object> values = new HashMap<>();
+            values.put("dataId", toolsLossBound.getId());
+            values.put("organization", lossBoundFlowDto.getApprovalOpinion());
+            values.put("comment", lossBoundFlowDto.getApprovalOpinion());
+            values.put("status", lossBoundFlowDto.getStatus());
+            values.put("NextAssignee", Collections.singletonList(toolsLossBound.getReviewer()));
+            lossBoundFlowDto.setValues(values);
+        }
+    }
+
+    private FlowMyBusiness getFlowMyBusiness(String instanceId) {
+        List<FlowMyBusiness> businessList = flowMyBusinessService.list(new LambdaQueryWrapper<FlowMyBusiness>().eq(FlowMyBusiness::getProcessInstanceId, instanceId));
+        return businessList.isEmpty() ? null : businessList.get(0);
+    }
+
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
+    }
+
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();//鍓嶇浼犺繘鏉ョ殑鍙傛暟
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java
new file mode 100644
index 0000000..f05572d
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java
@@ -0,0 +1,52 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.entity.vo.ToolSharpeningVo;
+import org.jeecg.modules.tms.mapper.ToolsSharpeningMapper;
+import org.jeecg.modules.tms.service.IToolsSharpeningService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.Map;
+
+/**
+ * @Description: 鍒�鍏峰垉纾ㄨ褰� Service 瀹炵幇绫�
+ * @Author: yourName
+ * @Date:   2025-05-10
+ */
+@Service
+public class ToolsSharpeningServiceImpl extends ServiceImpl<ToolsSharpeningMapper, ToolSharpening> implements IToolsSharpeningService {
+    @Override
+    public IPage<ToolSharpeningVo> queryPageList(Page<ToolSharpeningVo> page, Map<String, String[]> parameterMap) {
+        QueryWrapper<ToolSharpeningVo> queryWrapper = Wrappers.query();
+        String[] ids = parameterMap.get("id");
+        if (ids != null && ids.length > 0) {
+            queryWrapper.like("t.id", ids[0]);
+        }
+        String[] toolIds = parameterMap.get("toolId");
+        if (toolIds != null && toolIds.length > 0) {
+            queryWrapper.like("t.tool_id", toolIds[0]);
+        }
+        String[] sharpeningResults = parameterMap.get("sharpeningResult");
+        if (sharpeningResults != null && sharpeningResults.length > 0) {
+            queryWrapper.like("t.sharpening_result", sharpeningResults[0]);
+        }
+        String[] startTimes = parameterMap.get("sharpeningTimeBegin ");
+        if (startTimes != null && startTimes.length > 0) {
+            queryWrapper.ge("t.sharpening_time", startTimes[0]);
+        }
+        String[] endTimes = parameterMap.get("sharpeningTimeEnd");
+        if (endTimes != null && endTimes.length > 0) {
+            queryWrapper.le("t.sharpening_time", endTimes[0]);
+        }
+        queryWrapper.orderByDesc("t.create_time");
+        return this.baseMapper.queryPageList(page, queryWrapper);
+    }
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundDetailServiceImpl.java
new file mode 100644
index 0000000..d3e4149
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundDetailServiceImpl.java
@@ -0,0 +1,39 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundDetailMapper;
+import org.jeecg.modules.tms.service.IToolsStocktakingBoundDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鐩樼偣鍗曟槑缁�
+ * @Author: houjie
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+@Service
+public class ToolsStocktakingBoundDetailServiceImpl extends ServiceImpl<ToolsStocktakingBoundDetailMapper, ToolsStocktakingBoundDetail> implements IToolsStocktakingBoundDetailService {
+
+    @Autowired
+    private ToolsStocktakingBoundDetailMapper toolsStocktakingBoundDetailMapper;
+
+    public IPage<ToolsStocktakingBoundDetail> selectByMainId(Page<ToolsStocktakingBoundDetail> page, Map<String, String[]> parameterMap) {
+        QueryWrapper<ToolsStocktakingBoundDetail> queryWrapper = Wrappers.query();
+
+        String[] stocktakingBoundIds = parameterMap.get("stocktakingBoundId");
+        if (stocktakingBoundIds != null && stocktakingBoundIds.length > 0) {
+            queryWrapper.eq("t.stocktaking_bound_id", stocktakingBoundIds[0]);
+        }
+        return toolsStocktakingBoundDetailMapper.selectByMainId(page, queryWrapper);
+    }
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java
new file mode 100644
index 0000000..d263f68
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java
@@ -0,0 +1,266 @@
+package org.jeecg.modules.tms.service.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.tms.entity.BaseTools;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.entity.dto.StocktakingBoundFlowDto;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundDetailMapper;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundMapper;
+import org.jeecg.modules.tms.service.IToolsStocktakingBoundService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: jeecg-boot
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+
+@Service("IToolsStocktakingBoundService")
+public class ToolsStocktakingBoundServiceImpl extends ServiceImpl<ToolsStocktakingBoundMapper, ToolsStocktakingBound> implements IToolsStocktakingBoundService, FlowCallBackServiceI {
+
+
+    @Autowired
+    private ISysUserService systemUserService;
+    @Autowired
+    private ToolsStocktakingBoundMapper toolsStocktakingBoundMapper;
+    @Autowired
+    private ToolsStocktakingBoundDetailMapper toolsStocktakingBoundDetailMapper;
+    @Resource
+    private FlowCommonService flowCommonService;
+    @Resource
+    private IFlowDefinitionService flowDefinitionService;
+    @Autowired
+    private IFlowTaskService flowTaskService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Autowired
+    private TaskService taskService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList) {
+        toolsStocktakingBoundMapper.insert(toolsStocktakingBound);
+        if (toolsStocktakingBoundDetailList != null && toolsStocktakingBoundDetailList.size() > 0) {
+            for (ToolsStocktakingBoundDetail entity : toolsStocktakingBoundDetailList) {
+                //澶栭敭璁剧疆
+                entity.setGoodsShelvesId(toolsStocktakingBound.getId());
+                toolsStocktakingBoundDetailMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList) {
+        toolsStocktakingBoundMapper.updateById(toolsStocktakingBound);
+
+        //1.鍏堝垹闄ゅ瓙琛ㄦ暟鎹�
+        toolsStocktakingBoundDetailMapper.deleteByMainId(toolsStocktakingBound.getId());
+
+        //2.瀛愯〃鏁版嵁閲嶆柊鎻掑叆
+        if (toolsStocktakingBoundDetailList != null && toolsStocktakingBoundDetailList.size() > 0) {
+            for (ToolsStocktakingBoundDetail entity : toolsStocktakingBoundDetailList) {
+                //澶栭敭璁剧疆
+                entity.setGoodsShelvesId(toolsStocktakingBound.getId());
+                toolsStocktakingBoundDetailMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delMain(String id) {
+        toolsStocktakingBoundDetailMapper.deleteByMainId(id);
+        toolsStocktakingBoundMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delBatchMain(Collection<? extends Serializable> idList) {
+        for (Serializable id : idList) {
+            toolsStocktakingBoundDetailMapper.deleteByMainId(id.toString());
+            toolsStocktakingBoundMapper.deleteById(id);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submintOrder(String id) {
+
+        ToolsStocktakingBound toolsStocktakingBound = this.getById(id);
+        if (toolsStocktakingBound == null) {
+            return false;
+        } else {
+            toolsStocktakingBound.setReviewer(toolsStocktakingBound.getReviewer());
+            //淇敼鐘舵��
+//            toolsStocktakingBound.setApprovalStatus(OutBillStatus.SUBMITTED.getValue());
+            flowCommonService.initActBusiness("鐩樼偣鍗曞彿:" + toolsStocktakingBound.getOrderCode() + ";鐩樼偣鍚嶇О: " + toolsStocktakingBound.getStocktakingName() + ";杩涜鐩樼偣",
+                    toolsStocktakingBound.getId(), "IToolsStocktakingBoundService", "tools_stocktaking_bound", null);
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("dataId", toolsStocktakingBound.getId());
+            if (StrUtil.isEmpty(toolsStocktakingBound.getReviewer())) {
+                variables.put("organization", "鏂板宸ュ叿鐩樼偣鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+                variables.put("comment", "鏂板宸ュ叿鐩樼偣鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+            } else {
+                variables.put("organization", toolsStocktakingBound.getRemark());
+                variables.put("comment", toolsStocktakingBound.getRemark());
+            }
+            variables.put("proofreading", true);
+            List<String> usernames = new ArrayList<>();
+            usernames.add(toolsStocktakingBound.getReviewer());
+            variables.put("NextAssignee", usernames);
+            Result result = flowDefinitionService.startProcessInstanceByKey("tools_stocktaking_bound", variables);
+            if (result != null) {
+                toolsStocktakingBound.setInventoryTime(new Date());
+                toolsStocktakingBound.setApprovalStatus(OutBillStatus.SUBMITTED.getValue());
+                //淇濆瓨宸ュ崟
+                toolsStocktakingBoundMapper.updateById(toolsStocktakingBound);
+                return result.isSuccess();
+            }
+            return true;
+        }
+
+
+    }
+
+
+    @Override
+    public void approvalProcess(StocktakingBoundFlowDto stocktakingBoundFlowDto) {
+        if (StrUtil.isBlank(stocktakingBoundFlowDto.getTaskId()) || StrUtil.isBlank(stocktakingBoundFlowDto.getDataId())) {
+            throw new JeecgBootException("闈炴硶鍙傛暟锛�");
+        }
+
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("璐﹀彿涓嶅瓨鍦�");
+        }
+
+        //鑾峰彇鎶ユ崯鍗曚俊鎭�
+        ToolsStocktakingBound toolsStocktakingBound = getById(stocktakingBoundFlowDto.getDataId());
+        if (toolsStocktakingBound == null) {
+            throw new JeecgBootException("鏈壘鍒板搴旂殑鍑哄簱鐢宠鍗曪紒");
+        }
+
+        //鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = getFlowMyBusiness(stocktakingBoundFlowDto.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼璁板綍涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ョ敤鎴锋槸鍚︽湁鏉冮檺鎿嶄綔浠诲姟
+        if (!isUserAuthorized(flowMyBusiness, user)) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+        }
+
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰�");
+        }
+
+        //璁剧疆娴佺▼鍙橀噺
+        setupProcessVariables(stocktakingBoundFlowDto, toolsStocktakingBound, user);
+
+        //瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(stocktakingBoundFlowDto);
+
+        //鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
+        if (result.isSuccess()) {
+            toolsStocktakingBound.setApprovalStatus(stocktakingBoundFlowDto.getStatus());
+            if (OutBillStatus.APPROVED.getValue().equals(stocktakingBoundFlowDto.getStatus())) {
+                toolsStocktakingBound.setApprovalStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue());
+            }
+            toolsStocktakingBound.setApprovalDate(new Date());
+            toolsStocktakingBound.setApprovalOpinion(stocktakingBoundFlowDto.getApprovalOpinion());
+            updateById(toolsStocktakingBound);
+        }
+    }
+
+    private void setupProcessVariables(StocktakingBoundFlowDto stocktakingBoundFlowDto, ToolsStocktakingBound toolsStocktakingBound, LoginUser user) {
+        if (OutBillStatus.SUBMITTED.getValue().equals(toolsStocktakingBound.getApprovalStatus()) && user.getUsername().equals(toolsStocktakingBound.getReviewer())) {
+            Map<String, Object> values = new HashMap<>();
+            values.put("dataId", toolsStocktakingBound.getId());
+            values.put("organization", stocktakingBoundFlowDto.getApprovalOpinion());
+            values.put("comment", stocktakingBoundFlowDto.getApprovalOpinion());
+            values.put("status", stocktakingBoundFlowDto.getStatus());
+            values.put("NextAssignee", Collections.singletonList(toolsStocktakingBound.getReviewer()));
+            stocktakingBoundFlowDto.setValues(values);
+        }
+    }
+
+    private FlowMyBusiness getFlowMyBusiness(String instanceId) {
+        List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                new LambdaQueryWrapper<FlowMyBusiness>().eq(FlowMyBusiness::getProcessInstanceId, instanceId));
+        return businessList.isEmpty() ? null : businessList.get(0);
+    }
+
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
+    }
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStoreEarlyWarningServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStoreEarlyWarningServiceImpl.java
new file mode 100644
index 0000000..6d29a80
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStoreEarlyWarningServiceImpl.java
@@ -0,0 +1,18 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.tms.entity.ToolsStoreEarlyWarning;
+import org.jeecg.modules.tms.mapper.ToolsStoreEarlyWarningMapper;
+import org.jeecg.modules.tms.service.IToolsStoreEarlyWarningService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: tools_store_early warning
+ * @Author: houjie
+ * @Date:   2025-05-16
+ * @Version: V1.0
+ */
+@Service
+public class ToolsStoreEarlyWarningServiceImpl extends ServiceImpl<ToolsStoreEarlyWarningMapper, ToolsStoreEarlyWarning> implements IToolsStoreEarlyWarningService {
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodePrinterUtils.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodePrinterUtils.java
new file mode 100644
index 0000000..bde5895
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodePrinterUtils.java
@@ -0,0 +1,74 @@
+package org.jeecg.modules.tms.utils;
+
+import javax.print.*;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import java.awt.print.*;
+import java.awt.image.BufferedImage;
+import java.awt.*;
+
+public class QrCodePrinterUtils implements Printable {
+
+    private final BufferedImage image;
+
+    public QrCodePrinterUtils(BufferedImage image) {
+        this.image = image;
+    }
+
+    /**
+     * 鎵撳嵃浜岀淮鐮�
+     */
+    public void print() {
+        PrinterJob job = PrinterJob.getPrinterJob();
+        job.setPrintable(this);
+
+        // 寮瑰嚭鎵撳嵃瀵硅瘽妗嗭紙鍙�夛級
+        if (job.printDialog()) {
+            try {
+                job.print();
+            } catch (PrinterException e) {
+                System.err.println("鎵撳嵃澶辫触: " + e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 瀹炵幇 Printable 鎺ュ彛鐨勬墦鍗版柟娉�
+     */
+    @Override
+    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
+        if (pageIndex > 0) {
+            return NO_SUCH_PAGE;
+        }
+
+        Graphics2D g2d = (Graphics2D) graphics;
+        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
+
+        // 璁$畻灞呬腑鍧愭爣
+        double pageWidth = pageFormat.getImageableWidth();
+        double pageHeight = pageFormat.getImageableHeight();
+        double imgWidth = image.getWidth();
+        double imgHeight = image.getHeight();
+
+        double scale = Math.min(pageWidth / imgWidth, pageHeight / imgHeight);
+        g2d.scale(scale, scale);
+        g2d.drawImage(image, 0, 0, null);
+
+        return PAGE_EXISTS;
+    }
+
+    /**
+     * 浣跨敤榛樿鎵撳嵃鏈烘墦鍗帮紝涓嶅脊瀵硅瘽妗�
+     */
+    public static void noDialogPrint(){
+        BufferedImage qrImage = QrCodeUtils.generateQrCode("Silent Print", 300, 300);
+        QrCodePrinterUtils printer = new QrCodePrinterUtils(qrImage);
+        PrinterJob job = PrinterJob.getPrinterJob();
+        job.setPrintable(printer);
+        try {
+            job.print();
+        } catch (PrinterException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodeUtils.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodeUtils.java
new file mode 100644
index 0000000..34b9c38
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/utils/QrCodeUtils.java
@@ -0,0 +1,121 @@
+package org.jeecg.modules.tms.utils;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+
+import javax.print.*;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.standard.Copies;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.awt.print.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class QrCodeUtils {
+    /**
+     * 鐢熸垚浜岀淮鐮佸浘鐗�
+     * @param content 浜岀淮鐮佸唴瀹�
+     * @param width   鍥剧墖瀹藉害
+     * @param height  鍥剧墖楂樺害
+     * @return BufferedImage 瀵硅薄
+     */
+    public static BufferedImage generateQrCode(String content, int width, int height) {
+        try {
+            Map<EncodeHintType, Object> hints = new HashMap<>();
+            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+            QRCodeWriter writer = new QRCodeWriter();
+            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+            return MatrixToImageWriter.toBufferedImage(bitMatrix);
+        } catch (Exception e) {
+            throw new RuntimeException("鐢熸垚浜岀淮鐮佸け璐�", e);
+        }
+    }
+
+    /**
+     * 鎵撳嵃浜岀淮鐮�
+     */
+    public static void printBarcode(final BufferedImage image) {
+        PrinterJob job = PrinterJob.getPrinterJob();
+
+        // 璁剧疆鎵撳嵃椤甸潰
+        PageFormat pf = job.defaultPage();
+        Paper paper = pf.getPaper();
+
+        // 璁剧疆绾稿紶澶у皬鍖归厤鏉″舰鐮佸浘鍍�
+        paper.setSize(image.getWidth(), image.getHeight() + 50);
+        paper.setImageableArea(0, 0, image.getWidth(), image.getHeight() + 50);
+        pf.setPaper(paper);
+
+        // 璁剧疆鎵撳嵃鍐呭
+        job.setPrintable(new Printable() {
+            @Override
+            public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
+                if (pageIndex > 0) {
+                    return NO_SUCH_PAGE;
+                }
+
+                Graphics2D g2d = (Graphics2D) graphics;
+                g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
+                g2d.drawImage(image, 0, 0, null);
+
+                return PAGE_EXISTS;
+            }
+        }, pf);
+
+        // 鏄剧ず鎵撳嵃瀵硅瘽妗�
+        if (job.printDialog()) {
+            try {
+                job.print();
+                JOptionPane.showMessageDialog(null, "鎵撳嵃浠诲姟宸插彂閫佸埌鎵撳嵃鏈�");
+            } catch (PrinterException e) {
+                JOptionPane.showMessageDialog(null, "鎵撳嵃澶辫触: " + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    /**
+     * 榛樿鎵撳嵃鏈烘墦鍗颁簩缁寸爜
+     */
+    private static void printBarcode2(BufferedImage image) throws Exception {
+        // 1. 灏咮ufferedImage杞崲涓哄瓧鑺傛暟缁�
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        javax.imageio.ImageIO.write(image, "png", baos);
+        byte[] imageData = baos.toByteArray();
+
+        // 2. 鏌ユ壘鎵撳嵃鏈嶅姟
+        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
+        if (services.length == 0) {
+            throw new Exception("娌℃湁鎵惧埌鍙敤鐨勬墦鍗版満");
+        }
+
+        // 3. 閫夋嫨榛樿鎵撳嵃鏈�(涔熷彲浠ヨ鐢ㄦ埛閫夋嫨)
+        PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();
+        if (defaultPrinter == null) {
+            defaultPrinter = services[0]; // 浣跨敤绗竴涓壘鍒扮殑鎵撳嵃鏈�
+        }
+
+        // 4. 鍒涘缓鎵撳嵃浣滀笟
+        DocPrintJob job = defaultPrinter.createPrintJob();
+
+        // 5. 璁剧疆鎵撳嵃灞炴��
+        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
+        attributes.add(new Copies(1)); // 鎵撳嵃浠芥暟
+
+        // 6. 鍒涘缓鎵撳嵃鏂囨。
+        DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
+        Doc doc = new SimpleDoc(new ByteArrayInputStream(imageData), flavor, null);
+
+        // 7. 鎵ц鎵撳嵃
+        job.print(doc, attributes);
+    }
+}

--
Gitblit v1.9.3