From bd63dcea170b3ceb86851f56a7a53b85b77027c2 Mon Sep 17 00:00:00 2001
From: yinrw <2030349650@qq.com>
Date: 星期四, 23 七月 2026 15:03:25 +0800
Subject: [PATCH] 修改销售台账和生产订单绑定逻辑,修复销售台账和生产订单页面展示数据bug

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |  248 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 185 insertions(+), 63 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index e2c11cf..40836c8 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,6 +9,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.account.service.AccountIncomeService;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.IApproveProcessService;
+import com.ruoyi.approve.vo.ApproveProcessVO;
 import com.ruoyi.basic.dto.CustomerPrivatePoolDto;
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.mapper.CustomerPrivatePoolMapper;
@@ -28,6 +31,7 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.service.ProductionProductMainService;
 import com.ruoyi.project.system.domain.SysDept;
@@ -41,6 +45,7 @@
 import com.ruoyi.sales.mapper.*;
 import com.ruoyi.sales.pojo.*;
 import com.ruoyi.sales.service.ISalesLedgerService;
+import com.ruoyi.sales.service.SalesLedgerProductionRefService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FilenameUtils;
@@ -85,34 +90,64 @@
     private static final String LOCK_PREFIX = "contract_no_lock:";
     private static final long LOCK_WAIT_TIMEOUT = 10; // 閿佺瓑寰呰秴鏃舵椂闂达紙绉掞級
     private static final long LOCK_EXPIRE_TIME = 30;  // 閿佽嚜鍔ㄨ繃鏈熸椂闂达紙绉掞級
-    private final AccountIncomeService accountIncomeService;
-    private final SalesLedgerMapper salesLedgerMapper;
-    private final CustomerMapper customerMapper;
-    private final SalesLedgerProductMapper salesLedgerProductMapper;
-    private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
-    private final CommonFileMapper commonFileMapper;
-    private final TempFileMapper tempFileMapper;
-    private final ReceiptPaymentMapper receiptPaymentMapper;
-    private final ShippingInfoServiceImpl shippingInfoServiceImpl;
-    private final CommonFileServiceImpl commonFileService;
-    private final ShippingInfoMapper shippingInfoMapper;
-    private final InvoiceLedgerMapper invoiceLedgerMapper;
-    private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
-    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
-    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
-    private final InvoiceRegistrationMapper invoiceRegistrationMapper;
-    private final ProductOrderMapper productOrderMapper;
-    private final ProcessRouteMapper processRouteMapper;
-    private final ProductProcessRouteMapper productProcessRouteMapper;
-    private final ProcessRouteItemMapper processRouteItemMapper;
-    private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
-    private final ProductWorkOrderMapper productWorkOrderMapper;
-    private final ProductionProductMainMapper productionProductMainMapper;
-    private final ProductionProductOutputMapper productionProductOutputMapper;
-    private final ProductionProductInputMapper productionProductInputMapper;
-    private final QualityInspectMapper qualityInspectMapper;
-    private final RedisTemplate<String, String> redisTemplate;
+    @Autowired
+    private AccountIncomeService accountIncomeService;
+    @Autowired
+    private SalesLedgerMapper salesLedgerMapper;
+    @Autowired
+    private CustomerMapper customerMapper;
+    @Autowired
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+    @Autowired
+    private SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
+    @Autowired
+    private CommonFileMapper commonFileMapper;
+    @Autowired
+    private TempFileMapper tempFileMapper;
+    @Autowired
+    private ReceiptPaymentMapper receiptPaymentMapper;
+    @Autowired
+    private ShippingInfoServiceImpl shippingInfoServiceImpl;
+    @Autowired
+    private CommonFileServiceImpl commonFileService;
+    @Autowired
+    private ShippingInfoMapper shippingInfoMapper;
+    @Autowired
+    private InvoiceLedgerMapper invoiceLedgerMapper;
+    @Autowired
+    private SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
+    @Autowired
+    private SalesLedgerWorkMapper salesLedgerWorkMapper;
+    @Autowired
+    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+    @Autowired
+    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+    @Autowired
+    private InvoiceRegistrationMapper invoiceRegistrationMapper;
+    @Autowired
+    private ProductOrderMapper productOrderMapper;
+    @Autowired
+    private ProcessRouteMapper processRouteMapper;
+    @Autowired
+    private ProductProcessRouteMapper productProcessRouteMapper;
+    @Autowired
+    private ProcessRouteItemMapper processRouteItemMapper;
+    @Autowired
+    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+    @Autowired
+    private ProductWorkOrderMapper productWorkOrderMapper;
+    @Autowired
+    private ProductionProductMainMapper productionProductMainMapper;
+    @Autowired
+    private ProductionProductOutputMapper productionProductOutputMapper;
+    @Autowired
+    private ProductionProductInputMapper productionProductInputMapper;
+    @Autowired
+    private QualityInspectMapper qualityInspectMapper;
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+    @Autowired
+    private IApproveProcessService approveProcessService;
     @Autowired
     private SysDeptMapper sysDeptMapper;
     @Value("${file.upload-dir}")
@@ -133,6 +168,10 @@
     private SysUserMapper sysUserMapper;
     @Autowired
     private CustomerPrivatePoolMapper customerPrivatePoolMapper;
+    @Autowired
+    private SalesLedgerProductionRefService salesLedgerProductionRefService;
+    @Autowired
+    private SalesLedgerProductionRefMapper salesLedgerProductionRefMapper;
 
     @Override
     public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -159,7 +198,7 @@
             // 鏌ヨ閫�璐т俊鎭�
             List<Long> productIds = salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList());
             List<SimpleReturnOrderGroupDto> groupListByProductIds = new ArrayList<>();
-            if(CollectionUtils.isNotEmpty(productIds)){
+            if (CollectionUtils.isNotEmpty(productIds)) {
                 groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
             }
             Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getSalesLedgerProductId, SimpleReturnOrderGroupDto::getSumReturnQuantity));
@@ -179,7 +218,8 @@
         if (salesLedger == null) {
             throw new BaseException("鍙拌处涓嶅瓨鍦�");
         }
-
+        List<ProductOrderDto> productionOrdersBySalesLedgerId = getProductionOrdersBySalesLedgerId(salesLedger.getId());
+        salesLedger.setProductionOrders(productionOrdersBySalesLedgerId);
         // 2. 鏌ヨ瀛愯〃
         LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
@@ -465,41 +505,75 @@
     }
 
     @Override
-    public IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page) {
-        IPage<SalesLedgerDto> salesLedgerDtoIPage = salesLedgerMapper.listSalesLedgerAndShipped(page, salesLedgerDto);
-        for (SalesLedgerDto salesLedger : salesLedgerDtoIPage.getRecords()) {
-            LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
-            productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
-            productWrapper.eq(SalesLedgerProduct::getType, 1);
-            List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
-            for (SalesLedgerProduct product : products) {
-                product.setOriginalNoInvoiceNum(product.getNoInvoiceNum());
-                // 鎻愪緵涓存椂鏈紑绁ㄦ暟锛屾湭寮�绁ㄩ噾棰濅緵鍓嶆璁$畻
-                product.setTempnoInvoiceAmount(product.getNoInvoiceAmount());
-                product.setTempNoInvoiceNum(product.getNoInvoiceNum());
-                product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
-                product.setRegisterDate(LocalDateTime.now());
-                // 鍙戣揣淇℃伅
-                ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
-                        .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
-                        .orderByDesc(ShippingInfo::getCreateTime)
-                        .last("limit 1"));
-                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
-                product.setShippingDate(shippingInfo.getShippingDate());
-                if (shippingInfo != null) {
-                    product.setShippingStatus(shippingInfo.getStatus());
-                }
+    public IPage<AfterSalesLedgerDto> listSalesLedger(AfterSalesLedgerDto salesLedgerDto, Page page) {
+        IPage<AfterSalesLedgerDto> salesLedgerDtoIPage = salesLedgerMapper.listSalesLedgerAndShipped(page, salesLedgerDto);
+        for (AfterSalesLedgerDto salesLedger : salesLedgerDtoIPage.getRecords()) {
+            SalesLedgerProduct product = salesLedgerProductMapper.selectById(salesLedger.getSalesLedgerProductId());
+            product.setOriginalNoInvoiceNum(product.getNoInvoiceNum());
+            // 鎻愪緵涓存椂鏈紑绁ㄦ暟锛屾湭寮�绁ㄩ噾棰濅緵鍓嶆璁$畻
+            product.setTempnoInvoiceAmount(product.getNoInvoiceAmount());
+            product.setTempNoInvoiceNum(product.getNoInvoiceNum());
+            product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
+            product.setRegisterDate(LocalDateTime.now());
+            // 鍙戣揣淇℃伅
+            ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+                    .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
+                    .orderByDesc(ShippingInfo::getCreateTime)
+                    .last("limit 1"));
+            product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+            product.setShippingDate(shippingInfo.getShippingDate());
+            if (shippingInfo != null) {
+                product.setShippingStatus(shippingInfo.getStatus());
             }
-            // 杩囨护鍙繚鐣欏彂璐ц褰�
-            products = products.stream().filter(product -> "宸插彂璐�".equals(product.getShippingStatus())).collect(Collectors.toList());
-            if (!products.isEmpty()) {
-                salesLedger.setHasChildren(true);
-                salesLedger.setProductData(products);
-            }
+            List<SalesLedgerProduct> afterSalesLedgerDtos = new ArrayList<>();
+            afterSalesLedgerDtos.add(product);
+            salesLedger.setProductData(afterSalesLedgerDtos);
+        }
+        return salesLedgerDtoIPage;
+    }
+
+    @Override
+    public SalesLedgerDto getSalesByCode(SalesLedgerDto salesLedgerDto) {
+        // 1. 鏌ヨ涓昏〃
+        SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+                .eq(SalesLedger::getSalesContractNo, salesLedgerDto.getSalesContractNo())
+                .last("LIMIT 1"));
+        if (salesLedger == null) {
+            throw new BaseException("閿�鍞彴璐︿笉瀛樺湪");
         }
 
+        // 2. 鏌ヨ瀛愯〃
+        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+        productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId())
+                .eq(SalesLedgerProduct::getType, 1);
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
 
-        return salesLedgerDtoIPage;
+        // 4. 杞崲 DTO
+        SalesLedgerDto resultDto = new SalesLedgerDto();
+        BeanUtils.copyProperties(salesLedger, resultDto);
+        if (!products.isEmpty()) {
+            resultDto.setHasChildren(true);
+            resultDto.setProductData(products);
+        }
+        return resultDto;
+    }
+
+    @Override
+    public List<ProductOrderDto> getProductionOrdersBySalesLedgerId(Long salesLedgerId) {
+        List<Long> productOrderIds = salesLedgerProductionRefMapper.getProductionOrderIdsBySalesLedgerId(salesLedgerId);
+        if (productOrderIds == null || productOrderIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return productOrderMapper.listByProductOrderId(productOrderIds);
+    }
+
+    @Override
+    public void getProductionOrders(List<SalesLedger> records) {
+        List<Long> ledgerIdList = records.stream()
+                .map(SalesLedger::getId)
+                .collect(Collectors.toList());
+
+
     }
 
     /**
@@ -614,9 +688,21 @@
                 salesLedger.setSalesContractNo(contractNo);
                 salesLedgerMapper.insert(salesLedger);
             } else {
+                ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
+                        .eq(ApproveProcess::getApproveType, 9)
+                        .eq(ApproveProcess::getApproveReason, salesLedger.getSalesContractNo())
+                        .eq(ApproveProcess::getApproveDelete, 0)
+                        .last("limit 1"));
+                if (one != null) {
+                    approveProcessService.delByIds(Collections.singletonList(one.getId()));
+                }
                 salesLedgerMapper.updateById(salesLedger);
             }
+            LoginUser loginUser = SecurityUtils.getLoginUser();
+            addApproveByPurchase(loginUser, salesLedger);
 
+            salesLedger.setApprovalStatus(1);
+            this.updateById(salesLedger);
             // 4. 澶勭悊瀛愯〃鏁版嵁
             List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
             if (productList != null && !productList.isEmpty()) {
@@ -630,14 +716,50 @@
                 );
             }
 
-            // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
+            //5. 缁戝畾閿�鍞鍗曞拰鐢熶骇璁㈠崟
+            bindSalesOrderAndProductionOrder(salesLedgerDto.getProductionOrderIds(), salesLedger.getId());
+
+            // 6. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
             if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) {
                 migrateTempFilesToFormal(salesLedger.getId(), salesLedgerDto.getTempFileIds());
             }
             return 1;
         } catch (IOException e) {
             throw new BaseException("鏂囦欢杩佺Щ澶辫触: " + e.getMessage());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
         }
+    }
+
+    private void bindSalesOrderAndProductionOrder(List<Long> productionOrderIds, Long salesLedgerId) {
+        // 鍏堝垹闄よ閿�鍞彴璐︽墍鏈夋棫鍏宠仈
+        LambdaQueryWrapper<SalesLedgerProductionRef> deleteWrapper = Wrappers.lambdaQuery();
+        deleteWrapper.eq(SalesLedgerProductionRef::getSalesLedgerId, salesLedgerId);
+        salesLedgerProductionRefMapper.delete(deleteWrapper);
+
+        if (productionOrderIds == null || productionOrderIds.isEmpty()) {
+            return;
+        }
+        List<SalesLedgerProductionRef> refList = productionOrderIds.stream()
+                .map(productOrderId -> {
+                    SalesLedgerProductionRef ref = new SalesLedgerProductionRef();
+                    ref.setSalesLedgerId(salesLedgerId);
+                    ref.setProductOrderId(productOrderId);
+                    return ref;
+                })
+                .collect(Collectors.toList());
+        salesLedgerProductionRefService.saveBatch(refList);
+    }
+
+    public void addApproveByPurchase(LoginUser loginUser, SalesLedger salesLedger) throws Exception {
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(9);
+        approveProcessVO.setApproveDeptId(loginUser.getDeptIds()[0]);
+        approveProcessVO.setApproveReason(salesLedger.getSalesContractNo());
+        approveProcessVO.setApproveUserIds(salesLedger.getApproveUserIds());
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessService.addApprove(approveProcessVO);
     }
 
     /**
@@ -743,7 +865,7 @@
                 salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
                 // 娣诲姞鐢熶骇鏁版嵁
-                salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
+                //salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
             }
         }
     }

--
Gitblit v1.9.3