From 38aaf481e936881b79671548d122d27e10997a72 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 12 十二月 2025 16:33:52 +0800
Subject: [PATCH] yys  库存分析

---
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java |  152 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 103 insertions(+), 49 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
index f9d6105..7c96246 100644
--- a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -18,17 +18,22 @@
 import com.ruoyi.production.service.SalesLedgerSchedulingService;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.sales.mapper.LossMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.Loss;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -53,6 +58,11 @@
 
     @Override
     public IPage<SalesLedgerSchedulingDto> listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(!"admin".equals(loginUser.getUsername())){
+            salesLedgerSchedulingDto.setProductionUserId(SecurityUtils.getLoginUser().getUser().getUserId());
+            salesLedgerSchedulingDto.setProductionUserName(SecurityUtils.getLoginUser().getUser().getNickName());
+        }
         IPage<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.listPage(page, salesLedgerSchedulingDto);
         if(list.getTotal() == 0){
             return list;
@@ -77,8 +87,30 @@
             }else{
                 i.setStatus("鐢熶骇涓�");
             }
+            // 璁$畻鐢熶骇鎬婚噺 = 瑙勬牸 * 鏁伴噺 / 1000
+            String[] split = i.getSpecificationModel().split("\\*");
+            if(split.length == 2 && isNumeric(split[0]) && isNumeric(split[1])){
+                BigDecimal multiply = new BigDecimal(split[0])
+                        .multiply(new BigDecimal(split[1])
+                                .multiply(i.getQuantity()).divide(new BigDecimal(1000),2, RoundingMode.CEILING));
+                i.setTotalProduction(multiply);
+            }
+
         });
         return list;
+    }
+
+    public static boolean isNumeric(String str) {
+        if (str == null || str.isEmpty()) {
+            return false;
+        }
+        // 閬嶅巻瀛楃涓茬殑姣忎釜瀛楃锛屾鏌ユ槸鍚︿负鏁板瓧
+        for (int i = 0; i < str.length(); i++) {
+            if (!Character.isDigit(str.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
     }
 
     @Override
@@ -119,52 +151,60 @@
                 i++;
                 continue;
             }
-            // 鑾峰彇绌轰綑鐐掓満
-            String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(",");
-            if(split != null && split.length == 0){
+            SysUser sysUser1 = sysUserMapper.selectUserById(productionDispatchAddDto.getProductionUserId() == null ? loginUser.getUser().getUserId() : productionDispatchAddDto.getSchedulingUserId());
+            if(sysUser1 == null){
                 i++;
                 continue;
             }
-            List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>()
-                    .in(SpeculativeTradingInfo::getName, Arrays.asList(split))
-                    .orderByAsc(SpeculativeTradingInfo::getSort));
-            if(CollectionUtils.isEmpty(speculativeTradingInfos)){
-                i++;
-                continue;
-            }
-            AtomicReference<String> name = new AtomicReference<>("");  //闇�瑕佺粦瀹氱殑鐐掓満
-            //閫氳繃瑙勬牸鍨嬪彿鍜屾帓浜ф暟閲忚绠楁湰娆$敓浜т骇閲�
-            String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*");
-            if(split1.length != 2){
-                i++;
-                continue;
-            }
-            // 鏈鐢熶骇浜ч噺
-            BigDecimal productionNum = new BigDecimal(split1[0])
-                    .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum()));
-            // 澶氫釜鐐掓満鎯呭喌
-            if(speculativeTradingInfos.size() > 1){
-                for (SpeculativeTradingInfo speculativeTradingInfo : speculativeTradingInfos) {
-                    // 鑾峰彇璇ョ倰鏈烘鍦ㄦ帓浜ч噺
-                    BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(speculativeTradingInfo.getName());
-                    // 濡傛灉璇ョ倰鏈烘�婚噺(鍗曚綅kg闇�瑕佷箻1000) - 姝e湪鎺掍骇閲� >=鏈鐢熶骇浜ч噺灏卞垎閰嶆鐐掓満
-                    if(speculativeTradingInfo.getWorkLoad().multiply(new BigDecimal(1000)).subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){
-                        name.set(speculativeTradingInfo.getName());
-                        break;
-                    }
-                }
-            }else{
-                // 鍗曚釜鐐掓満鎯呭喌
-                name.set(speculativeTradingInfos.get(0).getName());
-            }
-            if(name.get().isEmpty()){
-                i++;
-                continue;
-            }
+//            // 鑾峰彇绌轰綑鐐掓満
+//            String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(",");
+//            if(split != null && split.length == 0){
+//                i++;
+//                continue;
+//            }
+//            List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>()
+//                    .in(SpeculativeTradingInfo::getName, Arrays.asList(split))
+//                    .orderByAsc(SpeculativeTradingInfo::getSort));
+//            if(CollectionUtils.isEmpty(speculativeTradingInfos)){
+//                i++;
+//                continue;
+//            }
+//            AtomicReference<String> name = new AtomicReference<>("");  //闇�瑕佺粦瀹氱殑鐐掓満
+//            //閫氳繃瑙勬牸鍨嬪彿鍜屾帓浜ф暟閲忚绠楁湰娆$敓浜т骇閲�
+//            String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*");
+//            if(split1.length != 2){
+//                i++;
+//                continue;
+//            }
+//            // 鏈鐢熶骇浜ч噺
+//            BigDecimal productionNum = new BigDecimal(split1[0])
+//                    .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum()));
+//            // 澶氫釜鐐掓満鎯呭喌
+//            if(speculativeTradingInfos.size() > 1){
+//                for (SpeculativeTradingInfo speculativeTradingInfo : speculativeTradingInfos) {
+//                    // 鑾峰彇璇ョ倰鏈烘鍦ㄦ帓浜ч噺
+//                    BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(speculativeTradingInfo.getName());
+//                    // 濡傛灉璇ョ倰鏈烘�婚噺(鍗曚綅kg闇�瑕佷箻1000) - 姝e湪鎺掍骇閲� >=鏈鐢熶骇浜ч噺灏卞垎閰嶆鐐掓満
+//                    if(speculativeTradingInfo.getWorkLoad().multiply(new BigDecimal(1000)).subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){
+//                        name.set(speculativeTradingInfo.getName());
+//                        break;
+//                    }
+//                }
+//            }else{
+//                // 鍗曚釜鐐掓満鎯呭喌
+//                name.set(speculativeTradingInfos.get(0).getName());
+//            }
+//            if(name.get().isEmpty()){
+//                i++;
+//                continue;
+//            }
             SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder()
                     .salesLedgerId(productionDispatchAddDto.getSalesLedgerId())
                     .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId())
-                    .speculativeTradingName(name.get())
+//                    .speculativeTradingName(name.get())
+                    .productionUserId(sysUser1.getUserId())
+                    .productionUserName(sysUser1.getNickName())
+                    .productionLineId(productionDispatchAddDto.getLineId())
                     .schedulingUserId(sysUser.getUserId())
                     .schedulingUserName(sysUser.getNickName())
                     .schedulingNum(productionDispatchAddDto.getSchedulingNum())
@@ -210,8 +250,14 @@
                 totalNum.addAndGet(productionNum.intValue());
             }
         });
-        return new BigDecimal(totalNum.get());
+        // 闇�瑕� / 鎹熻�楃巼
+        Loss loss = lossMapper.selectOne(new LambdaQueryWrapper<Loss>().last("limit 1"));
+        BigDecimal lossNum = loss == null ? new BigDecimal(6) : loss.getRate(); //娌℃湁鎹熻�楃巼鍒欓粯璁や负6
+
+        return new BigDecimal(totalNum.get()).multiply(new BigDecimal(100)).divide(lossNum, 2,RoundingMode.HALF_UP);
     }
+
+    private final LossMapper lossMapper;
 
 
     /**
@@ -249,6 +295,10 @@
 
     @Override
     public IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(!"admin".equals(loginUser.getUsername())){
+            salesLedgerSchedulingDto.setProductionUserId(loginUser.getUserId());
+        }
         IPage<SalesLedgerSchedulingProcessDto> list = salesLedgerSchedulingMapper.listPageProcess(page, salesLedgerSchedulingDto);
 //        Set<Long> collect = list.getRecords().stream().map(SalesLedgerSchedulingProcessDto::getId).collect(Collectors.toSet());
 //        if(CollectionUtils.isEmpty(collect)) return list;
@@ -256,14 +306,16 @@
 //        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerSchedulingId, collect)
 //                .ne(SalesLedgerWork::getStatus, 1);
 //        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
-//        list.getRecords().forEach(i -> {
-//            // 鑾峰彇瀹屾垚鏁伴噺
-//            i.setSuccessNum(salesLedgerWorks
-//                    .stream()
-//                    .filter(j -> j.getSalesLedgerSchedulingId().equals(i.getId()))
-//                    .map(SalesLedgerWork::getFinishedNum)
-//                    .reduce(BigDecimal.ZERO, BigDecimal::add));
-//        });
+        list.getRecords().forEach(i -> {
+            // 璁$畻鐢熶骇鎬婚噺 = 瑙勬牸 * 鏁伴噺 / 1000
+            String[] split = i.getSpecificationModel().split("\\*");
+            if(split.length == 2 && isNumeric(split[0]) && isNumeric(split[1])){
+                BigDecimal multiply = new BigDecimal(split[0])
+                        .multiply(new BigDecimal(split[1])
+                                .multiply(i.getSuccessNum()).divide(new BigDecimal(1000),2, RoundingMode.CEILING));
+                i.setTotalProduction(multiply);
+            }
+        });
         return list;
     }
 
@@ -304,6 +356,8 @@
             SalesLedgerWork.SalesLedgerWorkBuilder salesLedgerWorkBuilder = SalesLedgerWork.builder()
                     .salesLedgerSchedulingId(salesLedgerScheduling.getId())
                     .salesLedgerId(salesLedgerScheduling.getSalesLedgerId())
+                    .productionUserId(salesLedgerScheduling.getProductionUserId())
+                    .productionUserName(salesLedgerScheduling.getProductionUserName())
                     .remark(processSchedulingDto.getRemark())
                     .type(processSchedulingDto.getType())
                     .loss(processSchedulingDto.getLoss())

--
Gitblit v1.9.3