From 32e4f30a848e159081986f93d189f0e80fa56a77 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期五, 29 五月 2026 18:03:52 +0800
Subject: [PATCH] 采购手动入库

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  121 +++++++++++++++++++++++++++++++++++----
 1 files changed, 107 insertions(+), 14 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..b02ad7c 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,8 +6,11 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.approve.bean.vo.ApproveProcessVO;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
+import com.ruoyi.approve.pojo.ApprovalTemplate;
 import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
@@ -18,7 +21,7 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.utils.FileUtil;
-import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -28,11 +31,13 @@
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerImportDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto;
+import com.ruoyi.purchase.dto.PurchaseStockInDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
@@ -47,7 +52,6 @@
 import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
@@ -100,6 +104,9 @@
     private final ApproveProcessServiceImpl approveProcessService;
     private final ProcurementRecordMapper procurementRecordStorageMapper;
     private final FileUtil fileUtil;
+    private final ApprovalInstanceService approvalInstanceService;
+    private final ApprovalTemplateMapper approvalTemplateMapper;
+    private final StockUtils stockUtils;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -455,12 +462,13 @@
     }
 
     @Override
-    public String getPurchaseNo() {
+    public String getPurchaseNo(Date entryDate) {
+        LocalDate localDate = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
         // 鐢熸垚鏃ユ湡鍓嶇紑锛堜緥濡傦細CG20250405锛�
-        String purchaseNo = "CG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String purchaseNo = "CG" + localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
 
         // 鏋勫缓 Redis Key锛堟寜澶╁垎闅旓級
-        String redisKey = "purchase_no:" + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
+        String redisKey = "purchase_no:" + localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
 
         // 鑾峰彇褰撳墠搴忓彿骞堕�掑锛堝師瀛愭搷浣滐級
         Long sequence = redisTemplate.opsForValue().increment(redisKey);
@@ -616,14 +624,99 @@
         if (loginUser == null) {
             return;
         }
-        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
-        approveProcessVO.setApproveType(5);
-        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
-        approveProcessVO.setApproveReason(purchaseLedger.getPurchaseContractNumber());
-        approveProcessVO.setApproveUserIds(purchaseLedger.getApproveUserIds());
-        approveProcessVO.setApproveUser(loginUser.getUserId());
-        approveProcessVO.setApproveTime(LocalDate.now().toString());
-        approveProcessService.addApprove(approveProcessVO);
+        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
+        approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,5L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId());
+        approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,5L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName());
+        approvalInstance.setBusinessId(purchaseLedger.getId());
+        approvalInstance.setBusinessType(5L);
+        approvalInstance.setCurrentLevel(1);
+        approvalInstance.setApplicantId(loginUser.getUserId());
+        approvalInstance.setTitle(purchaseLedger.getPurchaseContractNumber()+"瀹℃壒");
+        approvalInstance.setApplicantName(loginUser.getNickName());
+        approvalInstance.setApplyTime(LocalDateTime.now());
+        approvalInstanceService.add(approvalInstance);
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int manualStockIn(PurchaseStockInDto purchaseStockInDto) {
+        if (purchaseStockInDto == null || purchaseStockInDto.getPurchaseLedgerId() == null) {
+            throw new BaseException("閲囪喘鍙拌处ID涓嶈兘涓虹┖");
+        }
+        if (CollectionUtils.isEmpty(purchaseStockInDto.getDetails())) {
+            throw new BaseException("璇烽�夋嫨鑷冲皯涓�涓骇鍝佽繘琛屽叆搴�");
+        }
+
+        // 鏌ヨ閲囪喘鍙拌处
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseStockInDto.getPurchaseLedgerId());
+        if (purchaseLedger == null) {
+            throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+        }
+
+        // 楠岃瘉閲囪喘鍙拌处鐘舵�佹槸鍚︿负宸插鎵�
+        if (!"3".equals(String.valueOf(purchaseLedger.getApprovalStatus()))) {
+            throw new BaseException("鍙湁宸插鎵归�氳繃鐨勯噰璐彴璐︽墠鑳藉叆搴�");
+        }
+
+        int count = 0;
+        for (PurchaseStockInDto.StockInProductItem item : purchaseStockInDto.getDetails()) {
+            if (item.getId() == null) {
+                continue;
+            }
+
+            // 鏌ヨ閲囪喘浜у搧
+            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(item.getId());
+            if (salesLedgerProduct == null) {
+                throw new BaseException("閲囪喘浜у搧涓嶅瓨鍦�");
+            }
+
+            // 鑾峰彇鐞嗚鍏ュ簱鏁伴噺锛堝墠绔紶鍏ョ殑inboundQuantity锛�
+            BigDecimal theoryStockInNum = item.getInboundQuantity();
+            if (theoryStockInNum == null) {
+                theoryStockInNum = salesLedgerProduct.getQuantity();
+            }
+            // 绌哄�煎拰闈炴鏁版牎楠�
+            if (theoryStockInNum == null || theoryStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BaseException("鐞嗚鍏ュ簱鏁伴噺蹇呴』澶т簬0");
+            }
+
+            // 鑾峰彇瀹為檯鍏ュ簱鏁伴噺锛堝墠绔紶鍏ョ殑actualInboundQuantity锛�
+            BigDecimal actualStockInNum = item.getActualInboundQuantity();
+            if (actualStockInNum == null) {
+                actualStockInNum = theoryStockInNum;
+            }
+            // 闈炴鏁版牎楠�
+            if (actualStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BaseException("瀹為檯鍏ュ簱鏁伴噺蹇呴』澶т簬0");
+            }
+
+            // 鑾峰彇鏄惁鍚按鍜屽惈姘撮噺
+            Boolean isContainsWater = item.getIsContainsWater();
+            BigDecimal waterContent = item.getWaterContent();
+            if (waterContent == null) {
+                waterContent = BigDecimal.ZERO;
+            }
+
+            // 璁$畻宸
+            BigDecimal difference = theoryStockInNum.subtract(actualStockInNum);
+
+            // 璋冪敤StockUtils杩涜鍏ュ簱锛堝甫鍚按閲忎俊鎭級
+            stockUtils.addStockWithBatchNo(
+                    salesLedgerProduct.getProductModelId(),
+                    actualStockInNum,
+                    StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
+                    purchaseLedger.getId(),
+                    purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId(),
+                    isContainsWater,
+                    waterContent,
+                    theoryStockInNum
+            );
+
+            count++;
+        }
+
+        return count;
     }
 
     /**

--
Gitblit v1.9.3