From 4f38e5827b848298de8e95f59e0ba9b24951e615 Mon Sep 17 00:00:00 2001
From: lixiangyu <lixiangyu@xalxzn.com>
Date: 星期二, 16 九月 2025 18:01:18 +0800
Subject: [PATCH] refactor(cms): 优化刀具管理功能和性能 刀具报废功能 - 新增 提交(/subumit)接口 刀具报废功能 - 修改完善其删除功能,同时删除报废单和报废明细 刀具报废功能 - (/add)接口中增加逻辑判断禁制同一个刀具重复申请报废 刀具领用功能 - 完善刀具寿命计算 刀具领用功能 - 完善其删除功能,同时删除领用单和领用明细 刀具入库功能 - 完善其删除功能,同时删除入库单和入库明细 把刀具库存中的库存状态,从“正常”改为“在库”。

---
 src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java |    5 
 src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java   |   39 ++++---
 src/main/java/org/jeecg/modules/cms/service/ICuttingScrapDetailService.java       |    3 
 src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveMapper.xml           |    2 
 src/main/java/org/jeecg/modules/cms/controller/CuttingScrapController.java        |   51 +++++++--
 src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java   |    2 
 src/main/java/org/jeecg/modules/cms/service/ICuttingScrapService.java             |    2 
 src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java           |    1 
 src/main/java/org/jeecg/modules/cms/service/impl/CuttingScrapServiceImpl.java     |   69 +++++++++++++
 src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java      |    6 +
 src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java                  |    4 
 src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java      |   67 +------------
 12 files changed, 150 insertions(+), 101 deletions(-)

diff --git a/src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java b/src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java
index 59b2736..5066561 100644
--- a/src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java
+++ b/src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java
@@ -10,10 +10,7 @@
 import io.micrometer.core.annotation.Timed;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.modules.cms.entity.CuttingInbound;
-import org.jeecg.modules.cms.entity.CuttingInboundDetail;
-import org.jeecg.modules.cms.entity.CuttingInboundInventory;
-import org.jeecg.modules.cms.entity.CuttingInventory;
+import org.jeecg.modules.cms.entity.*;
 import org.jeecg.modules.cms.mapper.CuttingInboundMapper;
 import org.jeecg.modules.cms.service.ICuttingInboundDetailService;
 import org.jeecg.modules.cms.service.ICuttingInboundInventoryService;
@@ -142,6 +139,9 @@
     @DeleteMapping(value = "/delete")
     public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
         cuttingInboundService.removeById(id);
+        //鍒犻櫎鍒�鍏烽鐢ㄦ槑缁嗚〃鐨勬暟鎹�
+        cuttingInboundDetailService.remove
+                (new QueryWrapper<CuttingInboundDetail>().eq("order_id", id));
         return Result.OK("鍒犻櫎鎴愬姛!");
     }
 
@@ -289,64 +289,7 @@
     @GetMapping("/submit")
     @Timed(value = "cutting.inbound.submit", description = "鍒�鍏峰叆搴撴彁浜よ�楁椂")
     public Result<?> submit(@RequestParam("orderId") String orderId) {
-//        long startTime = System.currentTimeMillis();
-//        try {
-//            // 1. 鏇存柊鍏ュ簱鍗曠姸鎬�
-//            CuttingInbound cuttingInbound = cuttingInboundService.getById(orderId);
-//            if (cuttingInbound == null) {
-//                return Result.error("鏈壘鍒板搴旂殑鍏ュ簱鍗�");
-//            }
-//            cuttingInbound.setOrderStatus("2");
-//            cuttingInboundService.updateById(cuttingInbound);
-//
-//            // 2. 鑾峰彇鍏ュ簱鏄庣粏
-//            List<CuttingInboundDetail> detailList = cuttingInboundDetailService.lambdaQuery()
-//                    .eq(CuttingInboundDetail::getOrderId, orderId)
-//                    .list();
-//
-//            // 3. 鏀堕泦鎵�鏈夐渶瑕佷繚瀛樼殑鏁版嵁
-//            List<CuttingInventory> inventoryList = new ArrayList<>();
-//            List<CuttingInboundInventory> inboundInventoryList = new ArrayList<>();
-//
-//            for (CuttingInboundDetail detail : detailList) {
-//                int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber().intValue() : 0;
-//
-//                for (int i = 0; i < quantity; i++) {
-//                    // 鐢熸垚搴撳瓨璁板綍
-//                    CuttingInventory cuttingInventory = new CuttingInventory();
-//                    cuttingInventory.setCuttingId(detail.getCuttingId());
-//                    cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i));
-//                    cuttingInventory.setInventoryStatus("姝e父");
-//                    cuttingInventory.setCurrentLife(BigDecimal.valueOf(100));
-//                    inventoryList.add(cuttingInventory);
-//                }
-//            }
-//
-//            // 4. 鎵归噺淇濆瓨搴撳瓨璁板綍锛堜竴娆℃�ф搷浣滐級
-//            if (!inventoryList.isEmpty()) {
-//                cuttingInventoryService.saveBatch(inventoryList);
-//
-//                // 5. 涓烘瘡涓繚瀛樼殑搴撳瓨璁板綍鍒涘缓鍏宠仈鍏崇郴
-//                for (CuttingInventory inventory : inventoryList) {
-//                    CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory();
-//                    cuttingInboundInventory.setOrderId(orderId);
-//                    cuttingInboundInventory.setInventoryId(inventory.getId());
-//                    inboundInventoryList.add(cuttingInboundInventory);
-//                }
-//
-//                // 6. 鎵归噺淇濆瓨鍏宠仈鍏崇郴锛堜竴娆℃�ф搷浣滐級
-//                cuttingInboundInventoryService.saveBatch(inboundInventoryList);
-//            }
-//
-//            long endTime = System.currentTimeMillis();
-//            log.info("鍒�鍏峰叆搴撴彁浜ゅ畬鎴愶紝鑰楁椂: {} s", (endTime - startTime)/1000);
-//            return Result.ok("鎻愪氦鎴愬姛");
-//
-//        } catch (Exception e) {
-//            long endTime = System.currentTimeMillis();
-//            log.error("鎻愪氦鍏ュ簱鍗曞け璐ワ紝orderId: " + orderId + "锛岃�楁椂: " + (endTime - startTime) + " ms", e);
-//            return Result.error("鎻愪氦澶辫触: " + e.getMessage());
-//        }
+
         return cuttingInboundService.submit(orderId);
     }
 }
diff --git a/src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java b/src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
index 8c93b00..7c9cb87 100644
--- a/src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
+++ b/src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
@@ -159,6 +159,11 @@
             cuttingInventoryService.restoreStatus(inventoryIds);
         }
 
+        //鍒犻櫎鍒�鍏烽鐢ㄦ槑缁嗚〃鐨勬暟鎹�
+        cuttingReceiveDetailService.remove
+                (new QueryWrapper<CuttingReceiveDetail>().eq("order_id", id));
+
+
         return Result.OK("鍒犻櫎鎴愬姛!");
     }
 
@@ -171,7 +176,6 @@
     @DeleteMapping(value = "/deleteBatch")
     public Result<String> deleteBatch(@RequestParam(name = "ids") String ids) {
         this.cuttingReceiveService.removeByIds(Arrays.asList(ids.split(",")));
-        //FIXME: 鎵归噺鍒犻櫎鏃讹紝搴撳瓨鐘舵�佹湭鎭㈠銆備篃闇�瑕佹壒閲忔仮澶嶅簱瀛樼姸鎬併��
         return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
     }
 
diff --git a/src/main/java/org/jeecg/modules/cms/controller/CuttingScrapController.java b/src/main/java/org/jeecg/modules/cms/controller/CuttingScrapController.java
index 1d4790b..cb634e8 100644
--- a/src/main/java/org/jeecg/modules/cms/controller/CuttingScrapController.java
+++ b/src/main/java/org/jeecg/modules/cms/controller/CuttingScrapController.java
@@ -107,25 +107,40 @@
         JSONArray jsonArray = jSONObject.getJSONArray("detailData");
         List<CuttingScrapDetail> list = jsonArray.toJavaList(CuttingScrapDetail.class);
 
+        //鍋氬垽鏂紝鐢宠鎶ュ簾鐨勬椂鍊欎竴涓垁鍏峰彧鑳界敵璇蜂竴娆�
+        for (CuttingScrapDetail temp : list) {
+            //鍒ゆ柇鍒�鍏锋槸鍚﹀凡缁忕敵璇锋姤搴�
+            QueryWrapper<CuttingScrapDetail> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("inventory_id", temp.getInventoryId());
+            // 妫�鏌ユ暟鎹簱涓槸鍚﹀凡瀛樺湪鐩稿悓inventoryId鐨勬姤搴熺敵璇�
+            if (cuttingScrapDetailService.count(queryWrapper) > 0) {
+                cuttingScrapService.removeById(cuttingScrap.getId());//鍚屾椂鍒犻櫎鏈〃鍗�
+                return Result.error("鍒�鍏�" + temp.getInventoryId() + "宸茬粡鐢宠鎶ュ簾锛岃涓嶈閲嶅鐢宠");
+            }
+        }
+        // 鎵�鏈夋鏌ラ�氳繃鍚庯紝淇濆瓨鎵�鏈夋槑缁嗘暟鎹�
         for (CuttingScrapDetail temp : list) {
             temp.setOrderId(cuttingScrap.getId());
             cuttingScrapDetailService.save(temp);
         }
 
-        // 鏇存柊搴撳瓨鍒�鍏风姸鎬佷负"宸插嚭搴�"
-        if (!list.isEmpty()) {
-            // 鏀堕泦鎵�鏈夐渶瑕佹洿鏂扮姸鎬佺殑搴撳瓨ID
-            List<String> inventoryIds = list.stream()
-                    .map(CuttingScrapDetail::getInventoryId) // 鍋囪CuttingScrapDetail涓湁inventoryId瀛楁
-                    .filter(id -> id != null && !id.isEmpty())
-                    .collect(Collectors.toList());
-
-            if (!inventoryIds.isEmpty()) {
-                // 鏇存柊搴撳瓨鐘舵�佷负"宸插嚭搴�"
-                cuttingInventoryService.updateStatus(inventoryIds, "寰呮姤搴�");
-            }
-        }
         return Result.OK("娣诲姞鎴愬姛锛�");
+
+//        // 鏇存柊搴撳瓨鍒�鍏风姸鎬佷负"寰呮姤搴�"
+//        if (!list.isEmpty()) {
+//            // 鏀堕泦鎵�鏈夐渶瑕佹洿鏂扮姸鎬佺殑搴撳瓨ID
+//            List<String> inventoryIds = list.stream()
+//                    .map(CuttingScrapDetail::getInventoryId) // 鍋囪CuttingScrapDetail涓湁inventoryId瀛楁
+//                    .filter(id -> id != null && !id.isEmpty())
+//                    .collect(Collectors.toList());
+//
+//            if (!inventoryIds.isEmpty()) {
+//                // 鏇存柊搴撳瓨鐘舵�佷负"寰呮姤搴�"
+//                cuttingInventoryService.updateStatus(inventoryIds, "寰呮姤搴�");
+//            }
+//        }
+
+
     }
 
     /**
@@ -154,7 +169,10 @@
     //@RequiresPermissions("org.jeecg.modules:cms_cutting_scrap:delete")
     @DeleteMapping(value = "/delete")
     public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
-        cuttingScrapService.removeById(id);
+        cuttingScrapService.removeById(id);//鍒犻櫎涓昏〃鏁版嵁
+        //鍒犻櫎鍒�鍏锋姤搴熸槑缁嗚〃鐨勬暟鎹�
+        cuttingScrapDetailService.remove
+                (new QueryWrapper<CuttingScrapDetail>().eq("order_id", id));
         return Result.OK("鍒犻櫎鎴愬姛!");
     }
 
@@ -238,4 +256,9 @@
         return Result.ok(inventoryTooList);
     }
 
+    @GetMapping("/submit")
+    public Result<?> submit(@RequestParam("orderId") String orderId) {
+        return cuttingScrapService.submit(orderId);
+    }
+
 }
diff --git a/src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java b/src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
index 196cbe4..1ef6958 100644
--- a/src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
+++ b/src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
@@ -78,8 +78,8 @@
     @TableField(exist = false) // 琛ㄧず杩欎笉鏄暟鎹簱瀛楁
     private String cuttingBarcodeSearch;
 
-    @TableField(exist = false) // 琛ㄧず杩欎笉鏄暟鎹簱瀛楁
-    private String workpieceMaterial;
+//    @TableField(exist = false) // 琛ㄧず杩欎笉鏄暟鎹簱瀛楁
+//    private String workpieceMaterial;
 
     @TableField(exist = false) // 琛ㄧず杩欎笉鏄暟鎹簱瀛楁
     private BigDecimal ratedLife;
diff --git a/src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveMapper.xml b/src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveMapper.xml
index 57a8969..4352701 100644
--- a/src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveMapper.xml
+++ b/src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveMapper.xml
@@ -15,7 +15,7 @@
         FROM cms_cutting_inventory t1
         LEFT JOIN cms_cutting_tool t2 ON t1.cutting_id = t2.id
         LEFT JOIN (select * from v_sys_dict where dict_code = 'cutting_category') t3 on t3.item_value = t2.cutting_category
-        WHERE t1.inventory_status = '姝e父'
+        WHERE t1.inventory_status = '鍦ㄥ簱'
         AND t2.del_flag = 0
     </select>
 
diff --git a/src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java b/src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java
index df221a7..105cff3 100644
--- a/src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java
+++ b/src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java
@@ -16,6 +16,7 @@
 public interface ICuttingReceiveService extends IService<CuttingReceive> {
 
     IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params);
+
     Result<?> submit(String orderId);
 
     Result<?> handleBack(String orderId);
diff --git a/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapDetailService.java b/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapDetailService.java
index 54c7685..647c940 100644
--- a/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapDetailService.java
+++ b/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapDetailService.java
@@ -1,8 +1,10 @@
 package org.jeecg.modules.cms.service;
 
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import org.jeecg.modules.cms.entity.CuttingScrapDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
@@ -15,4 +17,5 @@
 public interface ICuttingScrapDetailService extends IService<CuttingScrapDetail> {
 
     public List<Map<String, Object>> detailList(String orderId);
+
 }
diff --git a/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapService.java b/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapService.java
index 02593f5..9dbcbbd 100644
--- a/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapService.java
+++ b/src/main/java/org/jeecg/modules/cms/service/ICuttingScrapService.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.cms.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.cms.entity.CuttingScrap;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -15,5 +16,6 @@
 public interface ICuttingScrapService extends IService<CuttingScrap> {
 
     IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params);
+    Result<?> submit(String orderId);
 
 }
diff --git a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
index 18a80ad..4b21b3f 100644
--- a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
@@ -135,7 +135,7 @@
                     CuttingInventory cuttingInventory = new CuttingInventory();
                     cuttingInventory.setCuttingId(detail.getCuttingId());
                     cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i));
-                    cuttingInventory.setInventoryStatus("姝e父");
+                    cuttingInventory.setInventoryStatus("鍦ㄥ簱");
                     cuttingInventory.setCurrentLife(BigDecimal.valueOf(100));
                     inventoryList.add(cuttingInventory);
                 }
diff --git a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
index 7816739..e4ca00f 100644
--- a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
@@ -67,14 +67,13 @@
             // 鏂瑰紡1: 鏌ヨ褰撳墠鐘舵�佸苟鏍规嵁鐘舵�佸喅瀹氭仮澶嶅埌鍝釜鐘舵��
             List<CuttingInventory> inventoryList = this.listByIds(ids);
             List<String> toRestoreIds = inventoryList.stream()
-                    .filter(inv -> "寰呭嚭搴�".equals(inv.getInventoryStatus())) // 鍙鐞�"寰呭嚭搴�"鐘舵�佺殑
+                    .filter(inv -> "寰呭嚭搴�".equals(inv.getInventoryStatus())) // 鍑哄簱鍗曚綔搴熺殑鎯呭喌涓嬶紝鍙細鏈夊緟鍑哄簱閫�鍥炴甯哥姸鎬佺殑鎯呭喌銆�
                     .map(CuttingInventory::getId)
                     .collect(Collectors.toList());
-            //FIXME:鍦ㄦ姤搴熷墠鏈夊涓姸鎬侊紝濡傛灉鎶ュ簾浣滃簾锛屽垁鍏峰簱瀛樼姸鎬佸浣曢��鍥炲師鏉ョ殑鐘舵�併��
             if (!toRestoreIds.isEmpty()) {
                 UpdateWrapper<CuttingInventory> updateWrapper = new UpdateWrapper<>();
                 updateWrapper.in("id", toRestoreIds);
-                updateWrapper.set("inventory_status", "姝e父");
+                updateWrapper.set("inventory_status", "鍦ㄥ簱");
                 updateWrapper.set("update_time", new Date());
                 updateWrapper.set("update_by", username);
                 this.update(updateWrapper);
diff --git a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java
index 69edf6b..dd1cf54 100644
--- a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.micrometer.core.annotation.Timed;
+import liquibase.pro.packaged.C;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.cms.entity.CuttingInventory;
@@ -20,6 +21,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -95,8 +97,10 @@
         }
     }
 
+
     @Override
     public synchronized Result<?> handleBack(String orderId) {
+        //FIXME锛氬垁鍏峰綊杩� 鐩墠璁捐鐨勬槸浠ラ鐢ㄥ崟涓虹淮搴﹁繘琛岃繕搴擄紱鑻ユ槸闇�瑕佷互鍒�鍏蜂负缁村害杩涜褰掕繕鐨勫垯闇�瑕佸彟琛岃璁�
         long startTime = System.currentTimeMillis();
         try {
             // 1. 鏇存柊棰嗙敤鍗曠姸鎬佷负宸插綊杩�
@@ -129,32 +133,35 @@
                 }
             }
 
-            // 4. 鎵归噺鏇存柊搴撳瓨鐘舵�佷负"姝e父"
-            if (!inventoryIds.isEmpty()) {
-                cuttingInventoryService.updateStatus(inventoryIds, "姝e父");
-            }
-            // 5. 瀵垮懡鎵e噺
+            // 4. 瀵垮懡鎵e噺
             for (CuttingReceiveDetail detail : detailList) {
                 if (detail.getInventoryId() != null && !detail.getInventoryId().isEmpty()) {
+                    CuttingReceiveDetail cuttingReceiveDetail = cuttingReceiveDetailService.getById(detail.getInventoryId());
                     CuttingInventory inventory = cuttingInventoryService.getById(detail.getInventoryId());
-                    //FIXME:ratedLife绌烘寚閽�
-                    RatedLife ratedLife = ratedLifeService.lambdaQuery() //棰濆畾瀵垮懡
-                            .eq(RatedLife::getCuttingId, inventory.getCuttingId())
-                            .eq(RatedLife::getWorkpieceMaterial, inventory.getWorkpieceMaterial())
-                            .one();
 
-                    BigDecimal currentLife = inventory.getCurrentLife().divide(BigDecimal.valueOf(100),java.math.RoundingMode.HALF_UP);//褰撳墠瀵垮懡鐧惧垎姣�
+                    RatedLife ratedLife = ratedLifeService.lambdaQuery()
+                            .eq(RatedLife::getCuttingId, detail.getCuttingId())
+                            .eq(RatedLife::getWorkpieceMaterial, detail.getWorkpieceMaterial())
+                            .one();//棰濆畾瀵垮懡
+
                     Integer useLife = detail.getUsedLife();//浣跨敤瀵垮懡
-                    //璁$畻鍏紡: (ratedLife * currentLife - useLife) * 100
-                    BigDecimal newLife = ratedLife.getRatedLife()
-                            .multiply(currentLife)
-                            .subtract(BigDecimal.valueOf(useLife))
-                            .multiply(BigDecimal.valueOf(100));
+                    //浼樺寲锛�(1-浣跨敤瀵垮懡/棰濆畾瀵垮懡)*100
+                    BigDecimal usageRatio = BigDecimal.valueOf(useLife).divide(ratedLife.getRatedLife(), 4, RoundingMode.HALF_UP);
+                    BigDecimal newLife = BigDecimal.valueOf(1)
+                            .subtract(usageRatio)
+                            .multiply(BigDecimal.valueOf(100))
+                            .setScale(2, RoundingMode.HALF_UP);
                     // 鏇存柊搴撳瓨瀵垮懡
                     inventory.setCurrentLife(newLife);
                     cuttingInventoryService.updateById(inventory);
                 }
             }
+
+            // 5. 鎵归噺鏇存柊搴撳瓨鐘舵�佷负"姝e父"
+            if (!inventoryIds.isEmpty()) {
+                cuttingInventoryService.updateStatus(inventoryIds, "鍦ㄥ簱");
+            }
+
             long endTime = System.currentTimeMillis();
             log.info("鍒�鍏峰綊杩樺鐞嗗畬鎴愶紝鑰楁椂: {} ms", (endTime - startTime));
             return Result.ok("褰掕繕鎴愬姛");
diff --git a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingScrapServiceImpl.java b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingScrapServiceImpl.java
index 7dd15e8..fb54435 100644
--- a/src/main/java/org/jeecg/modules/cms/service/impl/CuttingScrapServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/cms/service/impl/CuttingScrapServiceImpl.java
@@ -2,13 +2,22 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.jeecg.modules.cms.entity.CuttingScrap;
+import io.micrometer.core.annotation.Timed;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.cms.entity.*;
 import org.jeecg.modules.cms.mapper.CuttingScrapMapper;
+import org.jeecg.modules.cms.service.ICuttingInventoryService;
+import org.jeecg.modules.cms.service.ICuttingScrapDetailService;
 import org.jeecg.modules.cms.service.ICuttingScrapService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,12 +26,70 @@
  * @Date:   2025-07-28
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class CuttingScrapServiceImpl extends ServiceImpl<CuttingScrapMapper, CuttingScrap> implements ICuttingScrapService {
+
+    @Autowired
+    private ICuttingScrapDetailService cuttingScarpDetailService;
+    @Autowired
+    private ICuttingInventoryService cuttingInventoryService;
+
     @Override
     public IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params) {
         IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
         return super.getBaseMapper().getInventoryToolList(pageData,params);
     }
 
+    @Override
+    @Timed(value = "cutting.scrap.submit", description = "鍒�鍏烽鐢ㄦ彁浜よ�楁椂")
+    public synchronized Result<?> submit(String orderId) {
+        long startTime = System.currentTimeMillis();
+        try {
+            // 1. 鏇存柊棰嗙敤鍗曠姸鎬�
+            CuttingScrap cuttingScrap = this.getById(orderId);
+            if (cuttingScrap == null) {
+                return Result.error("鏈壘鍒板搴旂殑棰嗙敤鍗�");
+            }
+
+            // 妫�鏌ラ鐢ㄥ崟鐘舵�侊紝鍙厑璁哥姸鎬佷负"1"鐨勯鐢ㄥ崟鎻愪氦
+            if (!"1".equals(cuttingScrap.getOrderStatus())) {
+                return Result.error("鍙湁鐘舵�佷负鏈彁浜ょ殑棰嗙敤鍗曟墠鑳芥墽琛屾彁浜ゆ搷浣�");
+            }
+
+            cuttingScrap.setOrderStatus("2"); // 鎶ュ簾鐢宠鍗曞彉涓� 宸叉彁浜� 鐘舵��
+            boolean updateResult = this.updateById(cuttingScrap);
+            if (!updateResult) {
+                return Result.error("鏇存柊棰嗙敤鍗曠姸鎬佸け璐ワ紝鍙兘宸茶鍏朵粬鐢ㄦ埛澶勭悊");
+            }
+
+            // 2. 鑾峰彇棰嗙敤鏄庣粏
+            List<CuttingScrapDetail> detailList = cuttingScarpDetailService.lambdaQuery()
+                    .eq(CuttingScrapDetail::getOrderId, orderId)
+                    .list();
+
+            // 3. 鏀堕泦鎵�鏈夐渶瑕佹洿鏂扮姸鎬佺殑搴撳瓨ID
+            List<String> inventoryIds = new ArrayList<>();
+            for (CuttingScrapDetail detail : detailList) {
+                if (detail.getInventoryId() != null && !detail.getInventoryId().isEmpty()) {
+                    inventoryIds.add(detail.getInventoryId());
+                }
+            }
+
+            // 4. 鎵归噺鏇存柊搴撳瓨鐘舵�佷负"宸叉姤搴�"
+            if (!inventoryIds.isEmpty()) {
+                cuttingInventoryService.updateStatus(inventoryIds, "宸叉姤搴�");
+            }
+
+            long endTime = System.currentTimeMillis();
+            log.info("鍒�鍏烽鐢ㄦ彁浜ゅ畬鎴愶紝鑰楁椂: {} ms", (endTime - startTime));
+            return Result.ok("鎻愪氦鎴愬姛");
+
+        } catch (Exception e) {
+            long endTime = System.currentTimeMillis();
+            log.error("鎻愪氦棰嗙敤鍗曞け璐ワ紝orderId: " + orderId + "锛岃�楁椂: " + (endTime - startTime) + " ms", e);
+            return Result.error("鎻愪氦澶辫触: " + e.getMessage());
+        }
+    }
+
 }

--
Gitblit v1.9.3