From e0529614c187a5457ca3f587a16edeec51d69d15 Mon Sep 17 00:00:00 2001
From: cuijian <cuijian@xalxzn.com>
Date: 星期一, 16 六月 2025 10:41:16 +0800
Subject: [PATCH] 刀具寿命

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundAddDto.java             |    8 ++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java         |   13 ++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml        |    3 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java            |    3 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java                 |   15 +++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedgerDetail.java               |   15 +++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java            |   15 +++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java |   51 +++++++++++++++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java  |    6 ++
 9 files changed, 129 insertions(+), 0 deletions(-)

diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java
index 02d5c01..47a26e8 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutStoreDetail.java
@@ -84,4 +84,19 @@
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
     private Date updateTime;
+
+    /**棰濆畾瀵垮懡*/
+    @Excel(name = "棰濆畾瀵垮懡", width = 15)
+    @ApiModelProperty(value = "棰濆畾瀵垮懡")
+    private BigDecimal ratedLife;
+
+    /**浣跨敤瀵垮懡*/
+    @Excel(name = "浣跨敤瀵垮懡", width = 15)
+    @ApiModelProperty(value = "浣跨敤瀵垮懡")
+    private BigDecimal useLife;
+
+    /**鍓╀綑瀵垮懡*/
+    @Excel(name = "鍓╀綑瀵垮懡", width = 15)
+    @ApiModelProperty(value = "鍓╀綑瀵垮懡")
+    private BigDecimal remainingPercentage;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedgerDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedgerDetail.java
index 1406c3c..d00d0e8 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedgerDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolLedgerDetail.java
@@ -94,4 +94,19 @@
     @TableField(exist = false)
     @ApiModelProperty(value = "鍨嬪彿/鍥惧彿")
     private String toolModel;
+
+    /**棰濆畾瀵垮懡*/
+    @Excel(name = "棰濆畾瀵垮懡", width = 15)
+    @ApiModelProperty(value = "棰濆畾瀵垮懡")
+    private BigDecimal ratedLife;
+
+    /**浣跨敤瀵垮懡*/
+    @Excel(name = "浣跨敤瀵垮懡", width = 15)
+    @ApiModelProperty(value = "浣跨敤瀵垮懡")
+    private BigDecimal useLife;
+
+    /**鍓╀綑瀵垮懡*/
+    @Excel(name = "鍓╀綑瀵垮懡", width = 15)
+    @ApiModelProperty(value = "鍓╀綑瀵垮懡")
+    private BigDecimal remainingPercentage;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundAddDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundAddDto.java
index d02c1c2..3876d4b 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundAddDto.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundAddDto.java
@@ -28,4 +28,12 @@
     //搴撲綅鍙�
     @ApiModelProperty(value = "搴撲綅鍙�")
     private String outboundLocation;
+
+    //棰濆畾瀵垮懡
+    @ApiModelProperty(value = "棰濆畾瀵垮懡")
+    private BigDecimal ratedLife;
+
+    //浣跨敤瀵垮懡
+    @ApiModelProperty(value = "浣跨敤瀵垮懡")
+    private BigDecimal useLife;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java
index 5ce1ec5..4679347 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutBoundRequestDto.java
@@ -19,4 +19,17 @@
     //鍑哄簱鏁伴噺
     @ApiModelProperty(value = "鍑哄簱鏁伴噺")
     private BigDecimal outboundQuantity;
+
+    //棰濆畾瀵垮懡
+    @ApiModelProperty(value = "棰濆畾瀵垮懡")
+    private BigDecimal ratedLife;
+
+
+    //浣跨敤瀵垮懡
+    @ApiModelProperty(value = "浣跨敤瀵垮懡")
+    private BigDecimal useLife;
+
+
+
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java
index 1a393d3..a8c205f 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutStoreDetailVo.java
@@ -92,4 +92,19 @@
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     private Date createTime;
+
+    /**棰濆畾瀵垮懡*/
+    @Excel(name = "棰濆畾瀵垮懡", width = 15)
+    @ApiModelProperty(value = "棰濆畾瀵垮懡")
+    private BigDecimal ratedLife;
+
+    /**浣跨敤瀵垮懡*/
+    @Excel(name = "浣跨敤瀵垮懡", width = 15)
+    @ApiModelProperty(value = "浣跨敤瀵垮懡")
+    private BigDecimal useLife;
+
+    /**鍓╀綑瀵垮懡*/
+    @Excel(name = "鍓╀綑瀵垮懡", width = 15)
+    @ApiModelProperty(value = "鍓╀綑瀵垮懡")
+    private BigDecimal remainingPercentage;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java
index 182373b..64ab368 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java
@@ -96,4 +96,7 @@
     /**宸ュ叿鍒冪(琛ㄤ富閿甶d*/
     @ApiModelProperty(value = "宸ュ叿鍒冪(琛ㄤ富閿甶d,閫夋嫨鍒冪(宸ュ叿鏃跺幓閲嶇敤")
     private String toolSharpeningId;
+
+    @ApiModelProperty(value = "鍙傛暟妯℃澘缂栧彿")
+    private String paramaTableName;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml
index 3cf8653..834d642 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutStoreDetailMapper.xml
@@ -18,6 +18,9 @@
             end operateType,
             t1.create_by createBy,
             t1.create_time createTime,
+            t1.rated_life ratedLife,
+            t1.use_life useLife,
+            t1.remaining_percentage remainingPercentage,
             t2.chinese_name chineseName,
             t2.tool_model toolModel,
             t2.parama_table_name paramaTableName,
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
index 36f8868..ea6a3a7 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
@@ -278,6 +278,7 @@
                         toolLedgerDetail.setToolCode(inboundDetailVo.getToolCodeId());
                         toolLedgerDetail.setToolId(inboundDetailVo.getToolCode()+"-"+result);
                         toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                        toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                         toolLedgerDetail.setStatus("1");
                         toolLedgerDetailService.save(toolLedgerDetail);
                         //鏇存柊褰撳墠缂栫爜
@@ -328,6 +329,7 @@
                             .eq(ToolLedgerDetail::getToolCode,inboundDetailVo.getToolCodeId())
                             .eq(ToolLedgerDetail::getToolId,inboundDetailVo.getOnlyCode()).one();
                     toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                    toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                     toolLedgerDetail.setStatus("1");
                     toolLedgerDetailService.updateById(toolLedgerDetail);
                     //淇濆瓨鍏ュ簱娴佹按
@@ -377,6 +379,7 @@
                             .eq(ToolLedgerDetail::getToolCode,inboundDetailVo.getToolCodeId())
                             .eq(ToolLedgerDetail::getToolId,inboundDetailVo.getOnlyCode()).one();
                     toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                    toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                     toolLedgerDetail.setStatus("1");
                     toolLedgerDetailService.updateById(toolLedgerDetail);
                     //淇濆瓨鍏ュ簱娴佹按
@@ -474,6 +477,7 @@
                         toolLedgerDetail.setToolCode(inboundDetailVo.getToolCodeId());
                         toolLedgerDetail.setToolId(inboundDetailVo.getToolCode()+"-"+result);
                         toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                        toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                         toolLedgerDetail.setStatus("1");
                         toolLedgerDetailService.save(toolLedgerDetail);
                         //鏇存柊褰撳墠缂栫爜
@@ -530,6 +534,7 @@
                             .eq(ToolLedgerDetail::getToolCode,inboundDetailVo.getToolCodeId())
                             .eq(ToolLedgerDetail::getToolId,inboundDetailVo.getOnlyCode()).one();
                     toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                    toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                     toolLedgerDetail.setStatus("1");
                     toolLedgerDetailService.updateById(toolLedgerDetail);
                     //淇濆瓨鍏ュ簱娴佹按
@@ -585,6 +590,7 @@
                             .eq(ToolLedgerDetail::getToolCode,inboundDetailVo.getToolCodeId())
                             .eq(ToolLedgerDetail::getToolId,inboundDetailVo.getOnlyCode()).one();
                     toolLedgerDetail.setQuantity(BigDecimal.ONE);
+                    toolLedgerDetail.setRemainingPercentage(BigDecimal.ONE);
                     toolLedgerDetail.setStatus("1");
                     toolLedgerDetailService.updateById(toolLedgerDetail);
                     //淇濆瓨鍏ュ簱娴佹按
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
index cc05fae..1a8fef7 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -8,6 +8,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
@@ -42,6 +43,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -383,6 +385,10 @@
 
 		Map<String, BigDecimal> outBoundRequestMap = outBoundRequestList.stream()
 				.collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, OutBoundRequestDto::getOutboundQuantity));
+		Map<String, BigDecimal> ratedLifeMap = outBoundRequestList.stream()
+				.collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, dto->dto.getRatedLife() != null ? dto.getRatedLife() : null));
+		Map<String, BigDecimal> useLifeMap = outBoundRequestList.stream()
+				.collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, dto->dto.getUseLife() != null ? dto.getUseLife() : null));
 		//澶勭悊搴撳瓨鍙拌处鍙婂彴璐︽槑缁�
 		Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, toolIdList)).stream()
 				.collect(Collectors.toMap(ToolLedger::getToolId, item -> item, (k1, k2) -> k1));
@@ -418,6 +424,14 @@
 			//鏇存柊搴撳瓨鍙拌处
 			ToolLedger toolLedger = toolLedgerMap.get(detail.getToolCode());
 			BigDecimal outboundQuantity = outBoundRequestMap.get(detail.getId());
+			BigDecimal ratedLife = ratedLifeMap.get(detail.getId());
+			BigDecimal useLife = useLifeMap.get(detail.getId());
+			//鍞竴缂栫爜涓嶄负绌烘椂锛堢鍒版妸锛�,璁$畻鍓╀綑瀵垮懡
+			BigDecimal remandLife = null;
+			if(StringUtils.isNotBlank(detail.getToolId())){
+				ToolLedgerDetail toolLedgerDetail = toolLedgerDetailService.lambdaQuery().eq(ToolLedgerDetail::getToolId,detail.getToolId()).one();
+				remandLife = (ratedLife.multiply(toolLedgerDetail.getRemainingPercentage()).subtract(useLife).max(BigDecimal.ZERO)).divide(ratedLife, 4, RoundingMode.HALF_UP);
+			}
 			OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(outboundOrder.getOutStorehouseType());
 			switch (outStorehouseType) {
 				case TOOL_BORROW:
@@ -438,20 +452,33 @@
 			toolLedgerUpdateList.add(toolLedger);
 
 			//鏇存柊鍙拌处鏄庣粏
+			BigDecimal finalRemandLife = remandLife;
 			toolLedgerDetailList.stream().filter(item -> item.getToolCode().equals(detail.getToolCode()) && item.getToolId().equals(detail.getToolId()))
 					.findFirst().ifPresent(item -> {
 						switch (outStorehouseType) {
 							case TOOL_BORROW:
 								item.setStatus(ToolCirculationStatus.BORROWED.getValue());
+								item.setRatedLife(ratedLife);
+								item.setUseLife(useLife);
+								item.setRemainingPercentage(finalRemandLife);
 								break;
 							case MAINTENANCE_OUTBOUND:
 								item.setStatus(ToolCirculationStatus.REPAIRING.getValue());
+								item.setRatedLife(ratedLife);
+								item.setUseLife(useLife);
+								item.setRemainingPercentage(finalRemandLife);
 								break;
 							case CALIBRATION_OUTBOUND:
 								item.setStatus(ToolCirculationStatus.INSPECTING.getValue());
+								item.setRatedLife(ratedLife);
+								item.setUseLife(useLife);
+								item.setRemainingPercentage(finalRemandLife);
 								break;
 							case GRINDING_OUTBOUND:
 								item.setStatus(ToolCirculationStatus.GRINDING.getValue());
+								item.setRatedLife(ratedLife);
+								item.setUseLife(useLife);
+								item.setRemainingPercentage(finalRemandLife);
 								break;
 							default:
 								throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
@@ -476,6 +503,9 @@
 					.setGoodsShelvesCode(detail.getOutboundLocation())
 					.setOutNumber(outboundQuantity)
 					.setOutStorehouseId(outboundOrder.getId())
+					.setRatedLife(ratedLife)
+					.setUseLife(useLife)
+					.setRemainingPercentage(remandLife)
 					.setOperateType("1");//1锛氭寜鐢宠鍗�
 			outStoreAddList.add(outStoreDetail);
 
@@ -562,6 +592,8 @@
 		for (String toolLedgerDetailId : boundAddDtoMap.keySet()) {
 			OutBoundAddDto outBoundAddDto = boundAddDtoMap.get(toolLedgerDetailId);
 			BigDecimal outboundQuantity = outBoundAddDto.getOutboundQuantity();
+			BigDecimal ratedLife = outBoundAddDto.getRatedLife();
+			BigDecimal useLife = outBoundAddDto.getUseLife();
 			ToolLedgerDetail toolLedgerDetail = toolLedgerDetailMap.get(toolLedgerDetailId);
 			if (Objects.isNull(toolLedgerDetail) || toolLedgerDetail.getQuantity().compareTo(outboundQuantity) < 0) {
 				BaseTools tools = baseToolsService.getById(outBoundAddDto.getToolCode());
@@ -573,20 +605,34 @@
 					toolLedgerDetail.setQuantity(toolLedgerDetail.getQuantity().subtract(outboundQuantity));
 				} else {
 					//鏈夊敮涓�缂栫爜锛岀閬撴妸鐨�
+					//璁$畻鍓╀綑瀵垮懡
+					BigDecimal remandLife = (ratedLife.multiply(toolLedgerDetail.getRemainingPercentage()).subtract(useLife).max(BigDecimal.ZERO)).divide(ratedLife, 4, RoundingMode.HALF_UP);
 					toolLedgerDetail.setQuantity(BigDecimal.ZERO);//鏁伴噺鍙細鏄�0鍜�1
 					OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(boundAddList.get(0).getOutStorehouseType());
 					switch (outStorehouseType) {
 						case TOOL_BORROW:
 							toolLedgerDetail.setStatus(ToolCirculationStatus.BORROWED.getValue());
+							toolLedgerDetail.setRatedLife(ratedLife);
+							toolLedgerDetail.setUseLife(useLife);
+							toolLedgerDetail.setRemainingPercentage(remandLife);
 							break;
 						case MAINTENANCE_OUTBOUND:
 							toolLedgerDetail.setStatus(ToolCirculationStatus.REPAIRING.getValue());
+							toolLedgerDetail.setRatedLife(ratedLife);
+							toolLedgerDetail.setUseLife(useLife);
+							toolLedgerDetail.setRemainingPercentage(remandLife);
 							break;
 						case CALIBRATION_OUTBOUND:
 							toolLedgerDetail.setStatus(ToolCirculationStatus.INSPECTING.getValue());
+							toolLedgerDetail.setRatedLife(ratedLife);
+							toolLedgerDetail.setUseLife(useLife);
+							toolLedgerDetail.setRemainingPercentage(remandLife);
 							break;
 						case GRINDING_OUTBOUND:
 							toolLedgerDetail.setStatus(ToolCirculationStatus.GRINDING.getValue());
+							toolLedgerDetail.setRatedLife(ratedLife);
+							toolLedgerDetail.setUseLife(useLife);
+							toolLedgerDetail.setRemainingPercentage(remandLife);
 							//鍚屾椂鏇存柊鍒冪(鍗曠姸鎬�
 							toolSharpeningList.stream().filter(item -> item.getToolCode().equals(outBoundAddDto.getToolCode())
 									&& item.getToolId().equals(outBoundAddDto.getToolId())).findFirst().ifPresent(item -> {
@@ -607,12 +653,17 @@
 		//璁板綍鍑哄簱娴佹按
 		List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
 		for (OutBoundAddDto outBoundAddDto : boundAddList) {
+			//鑾峰彇鍓╀綑瀵垮懡
+			ToolLedgerDetail toolLedgerDetail = toolLedgerDetailService.getById(outBoundAddDto.getToolLedgerDetailId());
 			OutStoreDetail outStoreDetail = new OutStoreDetail()
 					.setToolCode(outBoundAddDto.getToolCode())
 					.setToolId(outBoundAddDto.getToolId())
 					.setOutStorehouseType(outBoundAddDto.getOutStorehouseType())
 					.setGoodsShelvesCode(outBoundAddDto.getOutboundLocation())
 					.setOutNumber(outBoundAddDto.getOutboundQuantity())
+					.setRatedLife(outBoundAddDto.getRatedLife())
+					.setUseLife(outBoundAddDto.getUseLife())
+					.setRemainingPercentage(toolLedgerDetail.getRemainingPercentage())
 					.setOperateType("2");//2锛氭墜宸ユ搷浣�
 			outStoreAddList.add(outStoreDetail);
 		}

--
Gitblit v1.9.3