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 |  140 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 140 insertions(+), 0 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 09d5d20..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,6 +31,7 @@
 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;
@@ -99,6 +101,7 @@
     private final QualityInspectParamMapper qualityInspectParamMapper;
     private final ApproveProcessServiceImpl approveProcessService;
     private final ProcurementRecordMapper procurementRecordStorageMapper;
+    private final ISysNoticeService sysNoticeService;
     private final FileUtil fileUtil;
 
     @Override
@@ -174,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);
@@ -626,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