From b2af5f5f3360cd95674d828b83dc696d1f5ff3fa Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期二, 11 十一月 2025 18:02:09 +0800
Subject: [PATCH] yys  1.仓储物流增加分类管理      2.仓储物流分类管理导出接口      4.新疆生产管控定制化

---
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java |  153 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 144 insertions(+), 9 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 103d809..0bfe363 100644
--- a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -5,20 +5,21 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
-import com.ruoyi.production.dto.ProcessSchedulingDto;
-import com.ruoyi.production.dto.ProductionDispatchAddDto;
-import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
-import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+import com.ruoyi.production.dto.*;
 import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
 import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+import com.ruoyi.production.mapper.SpeculativeTradingInfoMapper;
 import com.ruoyi.production.pojo.SalesLedgerScheduling;
 import com.ruoyi.production.pojo.SalesLedgerWork;
+import com.ruoyi.production.pojo.SpeculativeTradingInfo;
 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.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -26,8 +27,12 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -61,6 +66,12 @@
                     .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
                     .map(SalesLedgerWork::getFinishedNum)
                     .reduce(BigDecimal.ZERO, BigDecimal::add));
+            // 鐘舵�� = 鏁伴噺鍜屽畬宸ユ暟閲忔瘮杈�
+            if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){
+                i.setStatus("宸插畬鎴�");
+            }else{
+                i.setStatus("鏈畬鎴�");
+            }
         });
         return list;
     }
@@ -90,13 +101,46 @@
 
     private final SysUserMapper sysUserMapper;
 
+    private final SpeculativeTradingInfoMapper speculativeTradingInfoMapper;
+
     @Override
     public int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto) {
         SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId());
         if(sysUser == null) throw new RuntimeException("鎺掍骇浜轰笉瀛樺湪");
+        // 鑾峰彇绌轰綑鐐掓満
+        String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(",");
+        if(split != null && split.length == 0){
+            throw new RuntimeException("鐢熶骇鐐掓満涓嶈兘涓虹┖");
+        }
+        List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>()
+                .in(SpeculativeTradingInfo::getName, Arrays.asList(split))
+                .orderByAsc(SpeculativeTradingInfo::getSort));
+        if(CollectionUtils.isEmpty(speculativeTradingInfos)){
+            throw new RuntimeException("鏃犵┖浣欑倰鏈�,璇锋鏌ョ倰鏈鸿〃");
+        }
+        AtomicReference<String> name = new AtomicReference<>("");  //闇�瑕佺粦瀹氱殑鐐掓満
+        //閫氳繃瑙勬牸鍨嬪彿鍜屾帓浜ф暟閲忚绠楁湰娆$敓浜т骇閲�
+        String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*");
+        if(split1.length != 2) throw new RuntimeException("瑙勬牸鍨嬪彿鏍煎紡閿欒");
+        // 鏈鐢熶骇浜ч噺
+        BigDecimal productionNum = new BigDecimal(split1[0])
+                .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum()));
+        // 澶氫釜鐐掓満鎯呭喌
+        if(speculativeTradingInfos.size() > 1){
+            speculativeTradingInfos.forEach(item ->{
+                // 鑾峰彇璇ョ倰鏈烘鍦ㄦ帓浜ч噺
+                BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(item.getName());
+                // 濡傛灉璇ョ倰鏈烘�婚噺 - 姝e湪鎺掍骇閲� >=鏈鐢熶骇浜ч噺灏卞垎閰嶆鐐掓満
+                if(item.getWorkLoad().subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){
+                    name.set(item.getName());
+                }
+            });
+        }
+        if(name.get().isEmpty()) throw new RuntimeException("鏃犵┖浣欑倰鏈�,璇锋鏌ョ倰鏈鸿〃");
         SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder()
                 .salesLedgerId(productionDispatchAddDto.getSalesLedgerId())
                 .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId())
+                .speculativeTradingName(name.get())
                 .schedulingUserId(productionDispatchAddDto.getSchedulingUserId())
                 .schedulingUserName(sysUser.getNickName())
                 .schedulingNum(productionDispatchAddDto.getSchedulingNum())
@@ -104,6 +148,75 @@
                 .status(1)
                 .build();
         return salesLedgerSchedulingMapper.insert(salesLedgerScheduling);
+    }
+
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+
+    /**
+     *閫氳繃鐐掓満鍚嶇О鑾峰彇褰撳ぉ姝e湪鎺掍骇閲�
+     * @return
+     */
+    public BigDecimal getSchedulingNumBySpeculativeTradingName(String speculativeTradingName){
+        LambdaQueryWrapper<SalesLedgerScheduling> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SalesLedgerScheduling::getSpeculativeTradingName, speculativeTradingName)
+                .eq(SalesLedgerScheduling::getSchedulingDate, LocalDate.now());
+        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(queryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgerSchedulings)){
+            return BigDecimal.ZERO;
+        }
+        List<Long> collect = salesLedgerSchedulings.stream().map(SalesLedgerScheduling::getSalesLedgerProductId).collect(Collectors.toList());
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .in(SalesLedgerProduct::getId, collect));
+        if(CollectionUtils.isEmpty(salesLedgerProducts)) return BigDecimal.ZERO;
+        AtomicInteger totalNum = new AtomicInteger(0); //鎬绘暟
+        salesLedgerSchedulings.forEach(item ->{
+            List<SalesLedgerProduct> collect1 = salesLedgerProducts.stream()
+                    .filter(j -> j.getId().equals(item.getSalesLedgerProductId()))
+                    .collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(collect1)){
+                SalesLedgerProduct salesLedgerProduct = collect1.get(0);
+                // 鏍规嵁浜у搧瑙勬牸 * 鎺掍骇鏁伴噺 鑾峰彇鏈鐢熶骇浜ч噺骞剁疮璁�
+                String[] split = salesLedgerProduct.getSpecificationModel().split("\\*");
+                BigDecimal productionNum = new BigDecimal(split[0])
+                        .multiply(new BigDecimal(split[1]).multiply(item.getSchedulingNum()));
+                totalNum.addAndGet(productionNum.intValue());
+            }
+        });
+        return new BigDecimal(totalNum.get());
+    }
+
+
+    /**
+     *閫氳繃鎵归噺鐐掓満鍚嶇О鑾峰彇褰撳ぉ姝e湪鎺掍骇閲�
+     * @return
+     */
+    public BigDecimal getSchedulingNumBySpeculativeTradingNameList(List<String> speculativeTradingName){
+        LambdaQueryWrapper<SalesLedgerScheduling> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(SalesLedgerScheduling::getSpeculativeTradingName, speculativeTradingName)
+                .eq(SalesLedgerScheduling::getSchedulingDate, LocalDate.now());
+        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(queryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgerSchedulings)){
+            return BigDecimal.ZERO;
+        }
+        List<Long> collect = salesLedgerSchedulings.stream().map(SalesLedgerScheduling::getSalesLedgerProductId).collect(Collectors.toList());
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .in(SalesLedgerProduct::getId, collect));
+        if(CollectionUtils.isEmpty(salesLedgerProducts)) return BigDecimal.ZERO;
+        AtomicInteger totalNum = new AtomicInteger(0); //鎬绘暟
+        salesLedgerSchedulings.forEach(item ->{
+            List<SalesLedgerProduct> collect1 = salesLedgerProducts.stream()
+                    .filter(j -> j.getId().equals(item.getSalesLedgerProductId()))
+                    .collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(collect1)){
+                SalesLedgerProduct salesLedgerProduct = collect1.get(0);
+                // 鏍规嵁浜у搧瑙勬牸 * 鎺掍骇鏁伴噺 鑾峰彇鏈鐢熶骇浜ч噺骞剁疮璁�
+                String[] split = salesLedgerProduct.getSpecificationModel().split("\\*");
+                BigDecimal productionNum = new BigDecimal(split[0])
+                        .multiply(new BigDecimal(split[1]).multiply(item.getSchedulingNum()));
+                totalNum.addAndGet(productionNum.intValue());
+            }
+        });
+        return new BigDecimal(totalNum.get());
     }
 
     @Override
@@ -147,10 +260,10 @@
             SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId());
             if(sysUser == null) throw new RuntimeException("鎺掍骇浜轰笉瀛樺湪");
             salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum()));
-            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
-                    .ne(SalesLedgerWork::getStatus, 1);
-            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
+//            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
+//                    .ne(SalesLedgerWork::getStatus, 1);
+//            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
             if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) < 0){
                 throw new RuntimeException("褰撳墠鎺掍骇鏁伴噺澶т簬寰呮帓浜ф暟閲忥紝璇蜂粩缁嗘牳瀵癸紒");
             }
@@ -163,6 +276,10 @@
             SalesLedgerWork.SalesLedgerWorkBuilder salesLedgerWorkBuilder = SalesLedgerWork.builder()
                     .salesLedgerSchedulingId(salesLedgerScheduling.getId())
                     .salesLedgerId(salesLedgerScheduling.getSalesLedgerId())
+                    .remark(processSchedulingDto.getRemark())
+                    .type(processSchedulingDto.getType())
+                    .loss(processSchedulingDto.getLoss())
+                    .receive(processSchedulingDto.getReceive())
                     .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
                     .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
                     .schedulingUserName(sysUser.getNickName())
@@ -175,4 +292,22 @@
         }
         return 0;
     }
+
+    @Override
+    public void exportOne(HttpServletResponse response) {
+        List<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.list();
+        if(CollectionUtils.isEmpty(list)){
+            throw new RuntimeException("鏃犲鍑烘暟鎹�");
+        }
+        List<DaiDto> dais = new ArrayList<>();
+        list.forEach(i -> {
+            DaiDto daiDto = new DaiDto();
+            BeanUtils.copyProperties(i, daiDto);
+            // 鑾峰彇寰呮帓浜ф暟閲�
+            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSchedulingNum()));
+            dais.add(daiDto);
+        });
+        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
+        util.exportExcel(response, dais, "鐢熶骇娲惧伐");
+    }
 }

--
Gitblit v1.9.3