From c5daf9399f292e5b21deff9d5a8ac60fb4c377ab Mon Sep 17 00:00:00 2001
From: Houjie <714924425@qq.com>
Date: 星期五, 23 五月 2025 18:18:43 +0800
Subject: [PATCH] 库存预警/刀具刃磨、工具盘点、工具报损

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java          |  273 +++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundDetailService.java         |   31 
 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                 |   92 +
 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                     |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundDetailService.java                |   22 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java               |   56 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java              |  189 ++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java             |   17 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java                  |  137 ++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java                 |  316 ++++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IBaseToolsService.java                           |    2 
 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/ToolsLossBoundMapper.java                         |   21 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStoreEarlyWarningMapper.java                 |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/BaseToolsServiceImpl.java                   |    8 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java                        |   93 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsLossBoundDetailMapper.xml                |   84 +
 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/StocktakingPoundVo.java                        |   35 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsLossBoundDetail.java                         |  154 +++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java                               |   77 +
 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/ToolsStocktakingVo.java                        |   87 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java                     |   13 
 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                      |   13 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsStocktakingBoundMapper.java                  |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java                        |   13 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java                      |   49 +
 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/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       |  168 +++
 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                              |    1 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml                           |   93 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStoreEarlyWarningService.java              |   14 
 41 files changed, 2,794 insertions(+), 3 deletions(-)

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..66165f8 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,18 @@
 			 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);
+	 }
 }
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..fde6ac2
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
@@ -0,0 +1,92 @@
+package org.jeecg.modules.tms.controller;
+
+import java.util.List;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+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;
+
+/**
+ * @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);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夋暟鎹�
+     */
+    @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);
+    }
+
+    /**
+     * 鏂板
+     */
+    @PostMapping
+    @ApiOperation(value = "鏂板", notes = "鏂板")
+    public Result<ToolSharpening> add(@RequestBody ToolSharpening toolSharpening) {
+        toolSharpeningService.save(toolSharpening);
+        return Result.OK(toolSharpening);
+    }
+
+    /**
+     * 淇敼
+     */
+    @PutMapping
+    @ApiOperation(value = "淇敼", notes = "淇敼")
+    public Result<ToolSharpening> edit(@RequestBody ToolSharpening toolSharpening) {
+        toolSharpeningService.updateById(toolSharpening);
+        return Result.OK(toolSharpening);
+    }
+
+    /**
+     * 鍒犻櫎
+     */
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "鍒犻櫎", notes = "鍒犻櫎")
+    public Result<String> delete(@PathVariable 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..68f23ea
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsLossBoundController.java
@@ -0,0 +1,316 @@
+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.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("鎻愪氦鎴愬姛");
+	}
+
+	/**
+	 * 鎵归噺鍒犻櫎
+	 * @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);
+  }
+
+
+	/*--------------------------------瀛愯〃澶勭悊-鍑哄簱鐢宠鍗曟槑缁�-begin----------------------------------------------*/
+	/**
+	 * 閫氳繃涓昏〃ID鏌ヨ
+	 * @return
+	 */
+	//@AutoLog(value = "鍑哄簱鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ")
+	@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..a8da7df
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
@@ -0,0 +1,273 @@
+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.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 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/ToolSharpening.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java
new file mode 100644
index 0000000..f34ede7
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolSharpening.java
@@ -0,0 +1,77 @@
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @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;
+
+    /** 鍒冪(鏃堕棿 */
+    @ApiModelProperty(value = "鍒冪(鏃堕棿")
+    private Date sharpeningTime;
+
+    /** 鍒冪(缁撴灉鍙婂缓璁� */
+    @ApiModelProperty(value = "鍒冪(缁撴灉鍙婂缓璁�")
+    private String sharpeningResult;
+
+    /** 璐d换浜� */
+    @ApiModelProperty(value = "璐d换浜�")
+    private String responsiblePerson;
+
+    /** 澶囨敞 */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    /** 绉熸埛鍙� */
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+
+    /** 鍒涘缓浜� */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    /** 鏇存柊浜� */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
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..076f61c
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBound.java
@@ -0,0 +1,93 @@
+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;
+
+    @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..df4da66
--- /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("tools_store_early warning")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="tms_tools_config_property瀵硅薄", description="tools_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/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/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/mapper/BaseToolsMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/BaseToolsMapper.java
index 6a0ef0c..f5bb4bf 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,5 @@
     IPage<ParaBladeVo> paraBladeList(Page<ParaBladeVo> page,
                                                @Param(Constants.WRAPPER) Wrapper<ParaBladeVo> queryWrapper);
 
+    IPage<StocktakingPoundVo> pageWithLedgerAndConfig(Page<StocktakingPoundVo> page, @Param(Constants.WRAPPER) Wrapper<StocktakingPoundVo> wrapper);
 }
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..458ed7e
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ToolsSharpeningMapper.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.tms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.ToolSharpening;
+
+/**
+ * @Description: tms_tool_sharpening Mapper 鎺ュ彛
+ * @Author: 渚澃
+ * @Date:   2025-05-10
+ */
+public interface ToolsSharpeningMapper extends BaseMapper<ToolSharpening> {
+    // 鍙嚜瀹氫箟鏌ヨ鏂规硶
+}
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..a8d4349 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
@@ -343,4 +343,97 @@
                 LEFT JOIN tms_tools_classify t3 ON t3.id = t.classify_id
             ${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>
+
 </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..481ae06
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsSharpeningMapper.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.ToolsSharpeningMapper">
+
+</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..eeb5752 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,5 @@
     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);
 }
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..a197313
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsLossBoundService.java
@@ -0,0 +1,49 @@
+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 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);
+}
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..d06399d
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsSharpeningService.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.tms.service;
+
+import org.jeecg.modules.tms.entity.ToolSharpening;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 鍒�鍏峰垉纾ㄨ褰� Service 鎺ュ彛
+ * @Author: 渚澃
+ * @Date:   2025-05-10
+ */
+public interface IToolsSharpeningService extends IService<ToolSharpening> {
+
+}
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..717c9b1
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IToolsStocktakingBoundService.java
@@ -0,0 +1,56 @@
+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 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);
+
+}
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..595cfcb 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,8 @@
         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);
+    }
 }
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..b789be8
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsLossBoundServiceImpl.java
@@ -0,0 +1,189 @@
+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.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.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+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.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsLossBoundDetail;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.mapper.ToolsLossBoundDetailMapper;
+import org.jeecg.modules.tms.mapper.ToolsLossBoundMapper;
+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.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;
+
+
+    @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 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..3831e2d
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsSharpeningServiceImpl.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.tms.service.impl;
+
+import org.jeecg.modules.tms.entity.ToolSharpening;
+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;
+
+/**
+ * @Description: 鍒�鍏峰垉纾ㄨ褰� Service 瀹炵幇绫�
+ * @Author: yourName
+ * @Date:   2025-05-10
+ */
+@Service
+public class ToolsSharpeningServiceImpl extends ServiceImpl<ToolsSharpeningMapper, ToolSharpening> implements IToolsSharpeningService {
+    // 濡傞渶鎵╁睍閫昏緫鍙湪姝ゆ坊鍔�
+}
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..1548e1d
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java
@@ -0,0 +1,168 @@
+package org.jeecg.modules.tms.service.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+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.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.ToolsStocktakingBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+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;
+    @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 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 {
+
+}

--
Gitblit v1.9.3