From 32bf2bed7dc2a14afeb50b72723570eaf295e316 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 28 五月 2026 09:53:35 +0800
Subject: [PATCH] feat(purchase): 新增采购草稿简易新增功能并完善生产订单库存数量显示

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  203 +++++++++++++++++++++++++++++++++++---------------
 1 files changed, 141 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index cdf80f9..ffc617b 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -10,6 +10,7 @@
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.common.enums.ApprovalStatusEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
@@ -30,17 +31,12 @@
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerImportDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto;
-import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
-import com.ruoyi.purchase.mapper.ProductRecordMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
-import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
-import com.ruoyi.purchase.pojo.PaymentRegistration;
-import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
-import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityInspectParamMapper;
@@ -51,11 +47,9 @@
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
 import com.ruoyi.sales.mapper.CommonFileMapper;
-import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.CommonFile;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
@@ -99,10 +93,6 @@
     private final ProductMapper productMapper;
     private final ProductModelMapper productModelMapper;
     private final SysUserMapper sysUserMapper;
-    private final TicketRegistrationMapper ticketRegistrationMapper;
-    private final ProductRecordMapper productRecordMapper;
-    private final PaymentRegistrationMapper paymentRegistrationMapper;
-    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
     private final StringRedisTemplate redisTemplate;
     private final QualityInspectMapper qualityInspectMapper;
     private final CommonFileServiceImpl commonFileService;
@@ -111,6 +101,7 @@
     private final QualityInspectParamMapper qualityInspectParamMapper;
     private final ApproveProcessServiceImpl approveProcessService;
     private final ProcurementRecordMapper procurementRecordStorageMapper;
+    private final ISysNoticeService sysNoticeService;
     private final FileUtil fileUtil;
 
     @Override
@@ -186,7 +177,91 @@
         return 1;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long saveShortagePurchaseDraft(PurchaseLedgerDto purchaseLedgerDto) throws Exception {
+        if (purchaseLedgerDto == null) {
+            throw new BaseException("閲囪喘鍙拌处鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(purchaseLedgerDto.getSalesContractNo())) {
+            throw new BaseException("閿�鍞鍗曞彿涓嶈兘涓虹┖");
+        }
+        if (CollectionUtils.isEmpty(purchaseLedgerDto.getProductData())) {
+            throw new BaseException("閲囪喘浜у搧淇℃伅涓嶈兘涓虹┖");
+        }
 
+        SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+                .eq(SalesLedger::getSalesContractNo, purchaseLedgerDto.getSalesContractNo())
+                .last("limit 1"));
+        if (salesLedger == null) {
+            throw new BaseException("閿�鍞鍗曚笉瀛樺湪");
+        }
+
+        PurchaseLedger purchaseLedger = new PurchaseLedger();
+        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+        purchaseLedger.setSalesLedgerId(salesLedger.getId());
+        purchaseLedger.setSalesContractNo(salesLedger.getSalesContractNo());
+        purchaseLedger.setProjectName(salesLedger.getProjectName());
+        if (purchaseLedger.getEntryDate() == null) {
+            purchaseLedger.setEntryDate(salesLedger.getEntryDate() != null ? salesLedger.getEntryDate() : new Date());
+        }
+        if (!StringUtils.hasText(purchaseLedger.getPurchaseContractNumber())) {
+            purchaseLedger.setPurchaseContractNumber(getPurchaseNo());
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        Long currentUserId = loginUser != null && loginUser.getUserId() != null ? loginUser.getUserId() : null;
+        if (loginUser != null && loginUser.getTenantId() != null) {
+            purchaseLedger.setTenantId(loginUser.getTenantId());
+        }
+
+        SysUser recorderUser = resolveShortagePurchaseRecorderUser(purchaseLedgerDto, currentUserId);
+        if (ObjectUtils.isNotEmpty(recorderUser)) {
+            purchaseLedger.setRecorderId(recorderUser.getUserId());
+            purchaseLedger.setRecorderName(recorderUser.getNickName());
+            purchaseLedger.setPhoneNumber(recorderUser.getPhonenumber());
+        }
+
+//        String originalApplicantName = resolveOriginalApplicantName(salesLedger); // 婧簮閿�鍞敵璇蜂汉
+        String originalApplicantName = SecurityUtils.getLoginUser().getNickName();  // 褰撳墠鐧诲綍鐢ㄦ埛
+        purchaseLedger.setRemarks(mergeShortagePurchaseRemark(
+                purchaseLedger.getRemarks(),
+                originalApplicantName,
+                ObjectUtils.isNotEmpty(recorderUser) ? recorderUser.getNickName() : null
+        ));
+
+        purchaseLedger.setApprovalStatus(ApprovalStatusEnum.DRAFT.getCode());
+
+        boolean isNewDraft = purchaseLedger.getId() == null;
+        if (isNewDraft) {
+            purchaseLedgerMapper.insert(purchaseLedger);
+        } else {
+            PurchaseLedger dbPurchaseLedger = purchaseLedgerMapper.selectById(purchaseLedger.getId());
+            if (dbPurchaseLedger == null) {
+                throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+            }
+            if (!ApprovalStatusEnum.DRAFT.getCode().equals(dbPurchaseLedger.getApprovalStatus())) {
+                throw new BaseException("闈炶崏绋跨姸鎬佺殑閲囪喘鍙拌处涓嶅厑璁搁�氳繃绠�鏄撴柊澧炰慨鏀�");
+            }
+            purchaseLedgerMapper.updateById(purchaseLedger);
+        }
+
+        handleSalesLedgerProducts(purchaseLedger.getId(), purchaseLedgerDto.getProductData(), purchaseLedgerDto.getType());
+        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
+
+        if (isNewDraft) {
+            Long noticeUserId = resolveShortagePurchaseCopyUserId(purchaseLedgerDto, currentUserId);
+            if (noticeUserId != null && noticeUserId > 0) {
+                sysNoticeService.simpleNoticeByUser(
+                        "閲囪喘鐢宠鎻愰啋",
+                        "閿�鍞鍗曞彿 " + salesLedger.getSalesContractNo() + " 鐨勯噰璐敵璇峰凡鍒涘缓锛岃琛ュ叏閲囪喘璁㈠崟淇℃伅鍚庢彁浜ゅ鏍搞��",
+                        Collections.singletonList(noticeUserId),
+                        "/procurementManagement/procurementLedger?purchaseContractNumber=" + purchaseLedger.getPurchaseContractNumber()
+                );
+            }
+        }
+        return purchaseLedger.getId();
+    }
     public void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
         QualityInspect qualityInspect = new QualityInspect();
         qualityInspect.setInspectType(0);
@@ -283,9 +358,6 @@
 
                 LocalDateTime localDateTime = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
                 salesLedgerProduct.setRegisterDate(localDateTime);
-                salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
-                salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
-                salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
             }
         }
@@ -333,18 +405,6 @@
         queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
                 .eq(SalesLedgerProduct::getType, 2);
         salesLedgerProductMapper.delete(queryWrapper);
-        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏
-        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId,ids);
-        ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
-        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏璁板綍
-        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
-        productRecordMapper.delete(productRecordLambdaQueryWrapper);
-        // 鎵归噺鍒犻櫎浠樻鐧昏
-        LambdaQueryWrapper<PaymentRegistration> paymentRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        paymentRegistrationLambdaQueryWrapper.in(PaymentRegistration::getPurchaseLedgerId, ids);
-        paymentRegistrationMapper.delete(paymentRegistrationLambdaQueryWrapper);
         //鎵归噺鍒犻櫎妫�楠屾爣鍑�
         LambdaQueryWrapper<QualityInspect> materialInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
         materialInspectLambdaQueryWrapper.in(QualityInspect::getPurchaseLedgerId, ids);
@@ -447,14 +507,6 @@
         queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
-        productList.forEach(product -> {
-            product.setFutureTickets(product.getFutureTickets() != null ? product.getFutureTickets() : product.getQuantity());
-            product.setFutureTicketsAmount(product.getFutureTicketsAmount() != null ? product.getFutureTicketsAmount() : product.getTaxInclusiveTotalPrice());
-            product.setTicketsNum(null);
-            product.setTicketsAmount(null);
-            product.setTempFutureTickets(product.getFutureTickets());
-            product.setTempFutureTicketsAmount(product.getFutureTicketsAmount());
-        });
         resultDto.setProductData(productList);
         return resultDto;
     }
@@ -481,35 +533,12 @@
         PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
 
         BeanUtils.copyProperties(purchaseLedger, purchaseLedgerDto);
-//        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getPurchaseLedgerId, id));
-//        if (ticketRegistration != null) {
-//            purchaseLedgerDto.setInvoiceNumber(ticketRegistration.getInvoiceNumber());
-//            purchaseLedgerDto.setInvoiceAmount(ticketRegistration.getInvoiceAmount());
-//            purchaseLedgerDto.setTicketRegistrationId(ticketRegistration.getId());
-//        }
         return purchaseLedgerDto;
     }
 
     @Override
     public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
-        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
-        purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> {
-            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, purchaseLedgerDto.getId()).eq(CommonFile::getType, FileNameType.PURCHASE.getValue()));
-            purchaseLedgerDto.setSalesLedgerFiles(commonFiles);
-        });
-        return purchaseLedgerDtoIPage;
-    }
-
-    @Override
-    public List<InvoiceRegistrationProduct> getProductBySalesNo(Long id) {
-        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
-                .select(InvoiceRegistrationProduct::getId, InvoiceRegistrationProduct::getProductCategory, InvoiceRegistrationProduct::getSpecificationModel,
-                        InvoiceRegistrationProduct::getUnit, InvoiceRegistrationProduct::getQuantity)
-                .eq(InvoiceRegistrationProduct::getSalesLedgerId, id));
-        if (invoiceRegistrationProducts.isEmpty()) {
-            return new ArrayList<>();
-        }
-        return invoiceRegistrationProducts;
+        return purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
     }
 
     @Override
@@ -616,8 +645,6 @@
                     salesLedgerProduct.setType(2);
                     // 璁$畻涓嶅惈绋庢�讳环
                     salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
-                    salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
-                    salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxExclusiveTotalPrice());
                     list.stream()
                             .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
                             .findFirst()
@@ -628,7 +655,6 @@
                     salesLedgerProduct.setRegister(loginUser.getNickName());
                     salesLedgerProduct.setRegisterDate(LocalDateTime.now());
                     salesLedgerProduct.setApproveStatus(0);
-                    salesLedgerProduct.setPendingTicketsTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
                     // 鏄惁璐ㄦ鍒ゆ柇
                     salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() == 1);
                     if(salesLedgerProductImportDto.getIsChecked() == 1){
@@ -687,6 +713,59 @@
         approveProcessService.addApprove(approveProcessVO);
     }
 
+    private Long resolveShortagePurchaseCopyUserId(PurchaseLedgerDto purchaseLedgerDto, Long currentUserId) {
+        if (purchaseLedgerDto != null && purchaseLedgerDto.getCcUserId() != null) {
+            return purchaseLedgerDto.getCcUserId();
+        }
+        return currentUserId;
+    }
+
+    private SysUser resolveShortagePurchaseRecorderUser(PurchaseLedgerDto purchaseLedgerDto, Long currentUserId) {
+        if (purchaseLedgerDto != null && purchaseLedgerDto.getCcUserId() != null) {
+            SysUser ccUser = sysUserMapper.selectUserById(purchaseLedgerDto.getCcUserId());
+            if (ccUser != null) {
+                return ccUser;
+            }
+        }
+        if (purchaseLedgerDto != null && StringUtils.isNotBlank(purchaseLedgerDto.getCcUserName())) {
+            SysUser ccUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getNickName, purchaseLedgerDto.getCcUserName())
+                    .last("limit 1"));
+            if (ccUser != null) {
+                return ccUser;
+            }
+        }
+        return currentUserId == null ? null : sysUserMapper.selectUserById(currentUserId);
+    }
+
+    private String resolveOriginalApplicantName(SalesLedger salesLedger) {
+        if (salesLedger == null) {
+            return null;
+        }
+        if (salesLedger.getCreateUser() != null) {
+            SysUser applicant = sysUserMapper.selectUserById(salesLedger.getCreateUser().longValue());
+            if (applicant != null && StringUtils.hasText(applicant.getNickName())) {
+                return applicant.getNickName();
+            }
+        }
+        if (StringUtils.hasText(salesLedger.getEntryPerson())) {
+            return salesLedger.getEntryPerson();
+        }
+        return null;
+    }
+
+    private String mergeShortagePurchaseRemark(String originalRemark, String applicantName, String recorderName) {
+        String sentence = "鍘熺敵璇蜂汉锛�" + (StringUtils.hasText(applicantName) ? applicantName : "鏈瘑鍒�")
+                + "锛岀敱鎶勯�佷汉" + (StringUtils.hasText(recorderName) ? recorderName : "鏈瘑鍒�")
+                + "琛ュ叏閲囪喘璁㈠崟淇℃伅鍚庢彁浜ゅ鏍搞��";
+        if (!StringUtils.hasText(originalRemark)) {
+            return sentence;
+        }
+        if (originalRemark.contains("鍘熺敵璇蜂汉锛�")) {
+            return originalRemark;
+        }
+        return originalRemark + "\\n" + sentence;
+    }
     /**
      * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
      */

--
Gitblit v1.9.3