From 8beb176e14312b8e7ca43a25f8ec1386157502f9 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 28 五月 2026 14:40:42 +0800
Subject: [PATCH] feat:采购批量审核-质检-入库

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  749 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 519 insertions(+), 230 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 a7d5765..7a70435 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,73 +1,78 @@
 package com.ruoyi.purchase.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 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.account.pojo.AccountExpense;
-import com.ruoyi.account.pojo.AccountIncome;
-import com.ruoyi.account.service.AccountExpenseService;
-import com.ruoyi.account.service.AccountIncomeService;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
+import com.ruoyi.approve.pojo.ApprovalInstance;
+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.approve.vo.ApproveProcessVO;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
-import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.enums.ApprovalStatusEnum;
+import com.ruoyi.common.enums.ReviewStatusEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.other.mapper.TempFileMapper;
-import com.ruoyi.other.pojo.TempFile;
 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.mapper.*;
-import com.ruoyi.purchase.pojo.*;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
-import com.ruoyi.quality.mapper.*;
-import com.ruoyi.quality.pojo.*;
-import com.ruoyi.sales.dto.SalesLedgerImportDto;
-import com.ruoyi.sales.dto.SalesLedgerProductImportDto;
-import com.ruoyi.sales.mapper.*;
-import com.ruoyi.sales.pojo.CommonFile;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityInspectParamMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardParamMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
+import com.ruoyi.quality.service.IQualityInspectService;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -83,53 +88,34 @@
  * @date 2025-05-09
  */
 @Service
-@RequiredArgsConstructor
 @Slf4j
+@RequiredArgsConstructor
 public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
-    private final AccountExpenseService accountExpenseService;
-    private final PurchaseLedgerMapper purchaseLedgerMapper;
 
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
     private final SalesLedgerMapper salesLedgerMapper;
     private final SalesLedgerProductMapper salesLedgerProductMapper;
-
     private final SysUserMapper userMapper;
-
     private final TempFileMapper tempFileMapper;
-
     private final CommonFileMapper commonFileMapper;
-
     private final SupplierManageMapper supplierManageMapper;
-
     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 QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
+    private final CommonFileServiceImpl commonFileService;
     private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
     private final QualityTestStandardMapper qualityTestStandardMapper;
     private final QualityInspectParamMapper qualityInspectParamMapper;
-
     private final ApproveProcessServiceImpl approveProcessService;
-
     private final ProcurementRecordMapper procurementRecordStorageMapper;
-
-    private final PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
-
-    private final SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
-    @Value("${file.upload-dir}")
-    private String uploadDir;
+    private final FileUtil fileUtil;
+    private final ApprovalInstanceService approvalInstanceService;
+    private final IQualityInspectService qualityInspectService;
+    private final StockInRecordService stockInRecordService;
+    private final StockUtils stockUtils;
+    private final ApprovalTemplateMapper approvalTemplateMapper;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -137,22 +123,35 @@
         if (StringUtils.isNotBlank(purchaseLedger.getPurchaseContractNumber())) {
             queryWrapper.like(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber());
         }
+        if(purchaseLedger.getSupplierId()!=null){
+            queryWrapper.eq(PurchaseLedger::getSupplierId, purchaseLedger.getSupplierId());
+        }
+        if (purchaseLedger.getApprovalStatus() != null) {
+            queryWrapper.eq(PurchaseLedger::getApprovalStatus, purchaseLedger.getApprovalStatus());
+        }
         return purchaseLedgerMapper.selectList(queryWrapper);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception {
-
+        PurchaseLedger purchaseLedger = new PurchaseLedger();
+        // DTO杞珽ntity
+        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
         SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
         //褰曞叆浜�
         SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
+        if (ObjectUtils.isNotEmpty(sysUser)) {
+            purchaseLedger.setRecorderName(sysUser.getNickName());
+            purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
+        }else {
+            purchaseLedger.setRecorderName(SecurityUtils.getLoginUser().getNickName());
+            SysUser sysUser1 = userMapper.selectUserById(SecurityUtils.getUserId());
+            purchaseLedger.setPhoneNumber(sysUser1.getPhonenumber());
+        }
 
         SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId());
 
-        // DTO杞珽ntity
-        PurchaseLedger purchaseLedger = new PurchaseLedger();
-        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
         LoginUser loginUser = SecurityUtils.getLoginUser();
         if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
             purchaseLedger.setTenantId(loginUser.getTenantId());
@@ -161,8 +160,7 @@
         purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1);
         purchaseLedger.setSupplierName(supplierManage.getSupplierName());
         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
-        purchaseLedger.setRecorderName(sysUser.getNickName());
-        purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
+
         purchaseLedger.setApprovalStatus(1);
         // 3. 鏂板鎴栨洿鏂颁富琛�
         if (purchaseLedger.getId() == null) {
@@ -179,31 +177,203 @@
             }
             purchaseLedgerMapper.updateById(purchaseLedger);
         }
-        // 6.閲囪喘瀹℃牳鏂板
-        addApproveByPurchase(loginUser, purchaseLedger);
 
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
             handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
         }
-        //鏂板鍘熸潗鏂欐楠�
-        if (productList != null) {
-            for (SalesLedgerProduct saleProduct : productList) {
-                //鏄惁鎺ㄩ�佽川妫�锛屽鏋渢rue灏辨坊鍔�
-                if (saleProduct.getIsChecked()) {
-                    addQualityInspect(purchaseLedger, saleProduct);
-                }
-            }
-        }
+        // 6.閲囪喘瀹℃牳鏂板锛涘鎵圭鐞嗘湭閰嶇疆閲囪喘瀹℃壒浜烘椂锛屽鎵规湇鍔′細鑷姩缃负瀹℃壒閫氳繃銆�
+        addApproveByPurchase(loginUser, purchaseLedger);
         // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
-        if (purchaseLedgerDto.getTempFileIds() != null && !purchaseLedgerDto.getTempFileIds().isEmpty()) {
-            migrateTempFilesToFormal(purchaseLedger.getId(), purchaseLedgerDto.getTempFileIds());
-        }
+        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
         return 1;
     }
 
-    private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
+    @Override
+    public R batchInsertPurchaseSteps(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return R.fail("璇烽�夋嫨閲囪喘鍙拌处");
+        }
+
+        List<Long> distinctIds = ids.stream()
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(distinctIds)) {
+            return R.fail("璇烽�夋嫨閲囪喘鍙拌处");
+        }
+
+        PurchaseLedgerDto queryDto = new PurchaseLedgerDto();
+        queryDto.setIds(distinctIds);
+        IPage<PurchaseLedgerDto> pageResult = this.selectPurchaseLedgerListPage(
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(1, distinctIds.size()),
+                queryDto
+        );
+        List<PurchaseLedgerDto> ledgerDtos = pageResult == null || pageResult.getRecords() == null
+                ? Collections.emptyList()
+                : pageResult.getRecords();
+
+        Map<Long, PurchaseLedgerDto> ledgerDtoMap = ledgerDtos.stream()
+                .filter(item -> item.getId() != null)
+                .collect(Collectors.toMap(PurchaseLedgerDto::getId, item -> item, (left, right) -> left, LinkedHashMap::new));
+
+        List<Map<String, Object>> details = new ArrayList<>();
+        int successCount = 0;
+        int skipCount = 0;
+        int failCount = 0;
+        int autoApprovedCount = 0;
+
+        for (Long id : distinctIds) {
+            Map<String, Object> detail = new LinkedHashMap<>();
+            detail.put("purchaseLedgerId", id);
+            PurchaseLedgerDto purchaseLedgerDto = ledgerDtoMap.get(id);
+            if (purchaseLedgerDto == null) {
+                failCount++;
+                detail.put("status", "FAIL");
+                detail.put("message", "閲囪喘鍙拌处涓嶅瓨鍦ㄦ垨鏈煡璇㈠埌");
+                details.add(detail);
+                continue;
+            }
+
+            detail.put("purchaseContractNumber", purchaseLedgerDto.getPurchaseContractNumber());
+            detail.put("approvalStatus", purchaseLedgerDto.getApprovalStatus());
+            detail.put("stockInStatus", purchaseLedgerDto.getStockInStatus());
+
+            if (ApprovalStatusEnum.REJECTED.getCode().equals(purchaseLedgerDto.getApprovalStatus())) {
+                skipCount++;
+                detail.put("status", "SKIP");
+                detail.put("message", "閲囪喘鍗曞凡椹冲洖");
+                details.add(detail);
+                continue;
+            }
+
+            if ("瀹屽叏鍏ュ簱".equals(purchaseLedgerDto.getStockInStatus())) {
+                skipCount++;
+                detail.put("status", "SKIP");
+                detail.put("message", "閲囪喘鍗曞凡瀹屽叏鍏ュ簱");
+                details.add(detail);
+                continue;
+            }
+
+            try {
+                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+                if (purchaseLedger == null) {
+                    failCount++;
+                    detail.put("status", "FAIL");
+                    detail.put("message", "閲囪喘鍙拌处涓嶅瓨鍦�");
+                    details.add(detail);
+                    continue;
+                }
+
+                if (!ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
+                    ApprovalInstance approvalInstance = approvalInstanceService.getOne(
+                            Wrappers.<ApprovalInstance>lambdaQuery()
+                                    .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
+                                    .eq(ApprovalInstance::getBusinessType, 5L)
+                                    .eq(ApprovalInstance::getDeleted, 0)
+                                    .orderByDesc(ApprovalInstance::getId)
+                                    .last("limit 1")
+                    );
+                    if (approvalInstance == null) {
+                        failCount++;
+                        detail.put("status", "FAIL");
+                        detail.put("message", "鏈壘鍒板搴旂殑閲囪喘瀹℃壒瀹炰緥");
+                        details.add(detail);
+                        continue;
+                    }
+
+                    if ("APPROVED".equals(approvalInstance.getStatus())
+                            && !ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
+                        purchaseLedger.setApprovalStatus(ApprovalStatusEnum.APPROVED.getCode());
+                        purchaseLedgerMapper.updateById(purchaseLedger);
+                    } else if (!"APPROVED".equals(approvalInstance.getStatus())) {
+                        R autoApproveResult = approvalInstanceService.autoApprove(approvalInstance.getId());
+                        if (autoApproveResult == null || !R.isSuccess(autoApproveResult)) {
+                            failCount++;
+                            detail.put("status", "FAIL");
+                            detail.put("message", autoApproveResult == null ? "閲囪喘瀹℃壒鑷姩閫氳繃澶辫触" : autoApproveResult.getMsg());
+                            details.add(detail);
+                            continue;
+                        }
+                        autoApprovedCount++;
+                    }
+
+                    purchaseLedger = purchaseLedgerMapper.selectById(id);
+                    if (purchaseLedger == null || !ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
+                        failCount++;
+                        detail.put("status", "FAIL");
+                        detail.put("message", "閲囪喘鍗曞鎵圭姸鎬佹湭鏇存柊涓哄凡閫氳繃");
+                        details.add(detail);
+                        continue;
+                    }
+                }
+
+                List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
+                        Wrappers.<SalesLedgerProduct>lambdaQuery()
+                                .eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
+                                .eq(SalesLedgerProduct::getType, 2)
+                                .orderByAsc(SalesLedgerProduct::getId)
+                );
+                if (CollectionUtils.isEmpty(products)) {
+                    skipCount++;
+                    detail.put("status", "SKIP");
+                    detail.put("message", "閲囪喘鍗曟病鏈変骇鍝佹槑缁�");
+                    details.add(detail);
+                    continue;
+                }
+
+                int processedProductCount = 0;
+                int skippedProductCount = 0;
+                int failedProductCount = 0;
+                for (SalesLedgerProduct product : products) {
+                    try {
+                        boolean processed;
+                        if (Boolean.TRUE.equals(product.getIsChecked())) {
+                            processed = processPurchaseQualityProduct(purchaseLedger, product);
+                        } else {
+                            processed = processPurchaseDirectProduct(purchaseLedger, product);
+                        }
+                        if (processed) {
+                            processedProductCount++;
+                        } else {
+                            skippedProductCount++;
+                        }
+                    } catch (Exception ex) {
+                        failedProductCount++;
+                        log.error("鎵归噺鎺ㄨ繘閲囪喘鍙拌处澶辫触, purchaseLedgerId={}, productId={}, productModelId={}",
+                                purchaseLedger.getId(), product.getId(), product.getProductModelId(), ex);
+                    }
+                }
+
+                successCount++;
+                detail.put("status", failedProductCount > 0 ? "PARTIAL" : "SUCCESS");
+                detail.put("processedProductCount", processedProductCount);
+                detail.put("skippedProductCount", skippedProductCount);
+                detail.put("failedProductCount", failedProductCount);
+                detail.put("message", failedProductCount > 0 ? "閮ㄥ垎浜у搧澶勭悊澶辫触" : "澶勭悊瀹屾垚");
+                details.add(detail);
+            } catch (Exception ex) {
+                failCount++;
+                detail.put("status", "FAIL");
+                detail.put("message", ex.getMessage());
+                details.add(detail);
+                log.error("鎵归噺鎺ㄨ繘閲囪喘鍙拌处澶辫触, purchaseLedgerId={}", id, ex);
+            }
+        }
+
+        Map<String, Object> summary = new LinkedHashMap<>();
+        summary.put("totalCount", distinctIds.size());
+        summary.put("successCount", successCount);
+        summary.put("skipCount", skipCount);
+        summary.put("failCount", failCount);
+        summary.put("autoApprovedCount", autoApprovedCount);
+        summary.put("details", details);
+        return R.ok(summary, "鎵归噺鎺ㄨ繘閲囪喘姝ラ瀹屾垚");
+    }
+
+
+    public void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
         QualityInspect qualityInspect = new QualityInspect();
         qualityInspect.setInspectType(0);
         qualityInspect.setSupplier(purchaseLedger.getSupplierName());
@@ -227,7 +397,219 @@
                         param.setId(null);
                         param.setInspectId(qualityInspect.getId());
                         qualityInspectParamMapper.insert(param);
-                    });
+            });
+        }
+    }
+
+    private boolean processPurchaseQualityProduct(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
+        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
+            return false;
+        }
+
+        QualityInspect qualityInspect = findLatestPurchaseQualityInspect(purchaseLedger.getId(), product.getProductModelId());
+        if (qualityInspect == null) {
+            addQualityInspect(purchaseLedger, product);
+            qualityInspect = findLatestPurchaseQualityInspect(purchaseLedger.getId(), product.getProductModelId());
+        }
+        if (qualityInspect == null) {
+            return false;
+        }
+
+        LocalDateTime purchaseInspectTime = toStartOfDayPlusDays(purchaseLedger.getEntryDate(), 1);
+        if (purchaseInspectTime != null && (qualityInspect.getCheckTime() == null
+                || !DateUtils.toLocalDate(qualityInspect.getCheckTime()).equals(purchaseInspectTime.toLocalDate()))) {
+            qualityInspect.setCheckTime(DateUtils.toDate(purchaseInspectTime.toLocalDate()));
+            qualityInspectMapper.updateById(qualityInspect);
+        }
+
+        List<StockInRecord> stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
+        if (hasApprovedStockRecord(stockRecords)) {
+            return true;
+        }
+
+        if (!Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            R autoSubmitResult = qualityInspectService.autoSubmit(qualityInspect.getId());
+            if (autoSubmitResult == null || !R.isSuccess(autoSubmitResult)) {
+                return false;
+            }
+            qualityInspect = qualityInspectMapper.selectById(qualityInspect.getId());
+        }
+
+        stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
+        if (CollectionUtils.isEmpty(stockRecords)
+                && qualityInspect.getQualifiedQuantity() != null
+                && qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
+            stockUtils.addStockWithBatchNo(
+                    product.getProductModelId(),
+                    qualityInspect.getQualifiedQuantity(),
+                    StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode(),
+                    qualityInspect.getId(),
+                    null,
+                    purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1)
+            );
+            stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
+        }
+
+        StockInRecord targetStockRecord = findLatestUnapprovedStockRecord(stockRecords);
+        if (targetStockRecord == null) {
+            return false;
+        }
+
+        LocalDateTime qualityStockCreateTime = resolveQualityStockCreateTime(qualityInspect);
+        if (qualityStockCreateTime != null && (targetStockRecord.getCreateTime() == null
+                || !qualityStockCreateTime.equals(targetStockRecord.getCreateTime()))) {
+            targetStockRecord.setCreateTime(qualityStockCreateTime);
+            stockInRecordService.updateById(targetStockRecord);
+        }
+
+        approveStockRecords(Collections.singletonList(targetStockRecord));
+        stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
+        return hasApprovedStockRecord(stockRecords);
+    }
+
+    private boolean processPurchaseDirectProduct(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
+        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
+            return false;
+        }
+        if (product.getQuantity() == null) {
+            return false;
+        }
+        if (!StringUtils.hasText(purchaseLedger.getPurchaseContractNumber())) {
+            return false;
+        }
+
+        LocalDateTime stockCreateTime = toStartOfDayPlusDays(purchaseLedger.getEntryDate(), 1);
+
+        List<StockInRecord> stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
+        if (hasApprovedStockRecord(stockRecords)) {
+            return true;
+        }
+
+        if (CollectionUtils.isEmpty(stockRecords)) {
+            stockUtils.addStockWithBatchNo(
+                    product.getProductModelId(),
+                    product.getQuantity(),
+                    StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
+                    purchaseLedger.getId(),
+                    purchaseLedger.getPurchaseContractNumber() + "-" + product.getId(),
+                    stockCreateTime
+            );
+            stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
+        }
+
+        if (CollectionUtils.isEmpty(stockRecords)) {
+            return false;
+        }
+
+        StockInRecord targetStockRecord = findLatestUnapprovedStockRecord(stockRecords);
+        if (targetStockRecord == null) {
+            return false;
+        }
+
+        if (stockCreateTime != null && (targetStockRecord.getCreateTime() == null
+                || !stockCreateTime.equals(targetStockRecord.getCreateTime()))) {
+            targetStockRecord.setCreateTime(stockCreateTime);
+            stockInRecordService.updateById(targetStockRecord);
+        }
+
+        approveStockRecords(Collections.singletonList(targetStockRecord));
+        stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
+        return hasApprovedStockRecord(stockRecords);
+    }
+
+    private LocalDateTime toStartOfDayPlusDays(Date date, int days) {
+        if (date == null) {
+            return null;
+        }
+        return DateUtils.toLocalDate(date).plusDays(days).atStartOfDay();
+    }
+
+    private LocalDateTime resolveQualityStockCreateTime(QualityInspect qualityInspect) {
+        if (qualityInspect == null || qualityInspect.getCheckTime() == null) {
+            return null;
+        }
+        return DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1).atStartOfDay();
+    }
+
+    private QualityInspect findLatestPurchaseQualityInspect(Long purchaseLedgerId, Long productModelId) {
+        if (purchaseLedgerId == null || productModelId == null) {
+            return null;
+        }
+        return qualityInspectMapper.selectOne(
+                Wrappers.<QualityInspect>lambdaQuery()
+                        .eq(QualityInspect::getInspectType, 0)
+                        .eq(QualityInspect::getPurchaseLedgerId, purchaseLedgerId)
+                        .eq(QualityInspect::getProductModelId, productModelId)
+                        .orderByDesc(QualityInspect::getId)
+                        .last("limit 1")
+        );
+    }
+
+    private List<StockInRecord> findQualityStockRecords(Long qualityInspectId, Long productModelId) {
+        if (qualityInspectId == null || productModelId == null) {
+            return Collections.emptyList();
+        }
+        return stockInRecordService.list(
+                Wrappers.<StockInRecord>lambdaQuery()
+                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())
+                        .eq(StockInRecord::getRecordId, qualityInspectId)
+                        .eq(StockInRecord::getProductModelId, productModelId)
+                        .orderByDesc(StockInRecord::getId)
+        );
+    }
+
+    private List<StockInRecord> findDirectStockRecords(Long purchaseLedgerId, String purchaseContractNumber, Long productModelId, Long purchaseProductId) {
+        if (purchaseLedgerId == null || productModelId == null || purchaseProductId == null || !StringUtils.hasText(purchaseContractNumber)) {
+            return Collections.emptyList();
+        }
+        String batchNo = purchaseContractNumber + "-" + purchaseProductId;
+        return stockInRecordService.list(
+                Wrappers.<StockInRecord>lambdaQuery()
+                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode())
+                        .eq(StockInRecord::getRecordId, purchaseLedgerId)
+                        .eq(StockInRecord::getProductModelId, productModelId)
+                        .eq(StockInRecord::getBatchNo, batchNo)
+                        .orderByDesc(StockInRecord::getId)
+        );
+    }
+
+    private boolean hasApprovedStockRecord(List<StockInRecord> stockRecords) {
+        return stockRecords != null && stockRecords.stream()
+                .anyMatch(item -> ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()));
+    }
+
+    private StockInRecord findLatestUnapprovedStockRecord(List<StockInRecord> stockRecords) {
+        if (CollectionUtils.isEmpty(stockRecords)) {
+            return null;
+        }
+        return stockRecords.stream()
+                .filter(item -> !ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()))
+                .findFirst()
+                .orElse(null);
+    }
+
+    private void approveStockRecords(List<StockInRecord> stockRecords) {
+        if (CollectionUtils.isEmpty(stockRecords)) {
+            return;
+        }
+        List<Long> rejectedIds = stockRecords.stream()
+                .filter(item -> ReviewStatusEnum.REJECTED.getCode().equals(item.getApprovalStatus()))
+                .map(StockInRecord::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (!rejectedIds.isEmpty()) {
+            stockInRecordService.batchReAudit(rejectedIds);
+        }
+
+        List<Long> pendingIds = stockRecords.stream()
+                .filter(item -> item.getApprovalStatus() == null
+                        || ReviewStatusEnum.PENDING_REVIEW.getCode().equals(item.getApprovalStatus())
+                        || ReviewStatusEnum.REJECTED.getCode().equals(item.getApprovalStatus()))
+                .map(StockInRecord::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (!pendingIds.isEmpty()) {
+            stockInRecordService.batchApprove(pendingIds, ReviewStatusEnum.APPROVED.getCode());
         }
     }
 
@@ -235,6 +617,7 @@
         if (products == null || products.isEmpty()) {
             throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�");
         }
+        Integer ledgerType = type == null ? 2 : type;
 
         // 鎻愬墠鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑ID
         Set<Long> productIds = products.stream()
@@ -286,21 +669,18 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
-                product.setType(type);
+                product.setType(ledgerType);
                 salesLedgerProductMapper.updateById(product);
             }
         }
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
-                salesLedgerProduct.setType(type);
+                salesLedgerProduct.setType(ledgerType);
                 Date entryDate = purchaseLedger.getEntryDate();
 
                 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);
             }
         }
@@ -318,85 +698,17 @@
         }
     }
 
-    /**
-     * 灏嗕复鏃舵枃浠惰縼绉诲埌姝e紡鐩綍
-     *
-     * @param businessId  涓氬姟ID锛堥攢鍞彴璐D锛�
-     * @param tempFileIds 涓存椂鏂囦欢ID鍒楄〃
-     * @throws IOException 鏂囦欢鎿嶄綔寮傚父
-     */
-    private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException {
-        if (CollectionUtils.isEmpty(tempFileIds)) {
-            return;
-        }
-
-        // 鏋勫缓姝e紡鐩綍璺緞锛堟寜涓氬姟绫诲瀷鍜屾棩鏈熷垎缁勶級
-        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
-
-        Path formalDirPath = Paths.get(formalDir);
-
-        // 纭繚姝e紡鐩綍瀛樺湪锛堥�掑綊鍒涘缓锛�
-        if (!Files.exists(formalDirPath)) {
-            Files.createDirectories(formalDirPath);
-        }
-
-        for (String tempFileId : tempFileIds) {
-            // 鏌ヨ涓存椂鏂囦欢璁板綍
-            TempFile tempFile = tempFileMapper.selectById(tempFileId);
-            if (tempFile == null) {
-                log.warn("涓存椂鏂囦欢涓嶅瓨鍦紝璺宠繃澶勭悊: {}", tempFileId);
-                continue;
-            }
-
-            // 鏋勫缓姝e紡鏂囦欢鍚嶏紙鍖呭惈涓氬姟ID鍜屾椂闂存埑锛岄伩鍏嶅啿绐侊級
-            String originalFilename = tempFile.getOriginalName();
-            String fileExtension = FilenameUtils.getExtension(originalFilename);
-            String formalFilename = businessId + "_" +
-                    System.currentTimeMillis() + "_" +
-                    UUID.randomUUID().toString().substring(0, 8) +
-                    (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
-
-            Path formalFilePath = formalDirPath.resolve(formalFilename);
-
-            try {
-                // 鎵ц鏂囦欢杩佺Щ锛堜娇鐢ㄥ師瀛愭搷浣滅‘淇濆畨鍏ㄦ�э級
-//                Files.move(
-//                        Paths.get(tempFile.getTempPath()),
-//                        formalFilePath,
-//                        StandardCopyOption.REPLACE_EXISTING,
-//                        StandardCopyOption.ATOMIC_MOVE
-//                );
-                // 鍘熷瓙绉诲姩澶辫触锛屼娇鐢ㄥ鍒�+鍒犻櫎
-                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
-                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
-                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
-
-                // 鏇存柊鏂囦欢璁板綍锛堝叧鑱斿埌涓氬姟ID锛�
-                CommonFile fileRecord = new CommonFile();
-                fileRecord.setCommonId(businessId);
-                fileRecord.setName(originalFilename);
-                fileRecord.setUrl(formalFilePath.toString());
-                fileRecord.setCreateTime(LocalDateTime.now());
-                fileRecord.setType(FileNameType.PURCHASE.getValue());
-                commonFileMapper.insert(fileRecord);
-
-                // 鍒犻櫎涓存椂鏂囦欢璁板綍
-                tempFileMapper.deleteById(tempFile);
-
-                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
-            } catch (IOException e) {
-                log.error("鏂囦欢杩佺Щ澶辫触: {}", tempFile.getTempPath(), e);
-                // 鍙�夋嫨鍥炴粴浜嬪姟鎴栬褰曞け璐ユ枃浠�
-                throw new IOException("鏂囦欢杩佺Щ寮傚父", e);
-            }
-        }
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int deletePurchaseLedgerByIds(Long[] ids) {
         if (ids == null || ids.length == 0) {
            throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
+        }
+        for (Long id : ids) {
+            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+            if (purchaseLedger.getApprovalStatus().equals(3)) {
+                throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"宸茬粡瀹℃壒閫氳繃锛屼笉鍏佽鍒犻櫎");
+            }
         }
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐叆搴撹褰�
         LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>();
@@ -416,21 +728,10 @@
         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);
+
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
         qualityInspects.stream().forEach(qualityInspect -> {
             if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState())&&qualityInspect.getInspectState().equals(1)) {
@@ -462,6 +763,8 @@
         }
         //鎵归噺鍒犻櫎鍘熸潗鏂欐楠屾暟鎹�
         qualityInspectMapper.delete(materialInspectLambdaQueryWrapper);
+        //鍒犻櫎闄勪欢
+        commonFileService.deleteByBusinessIds(Arrays.asList(ids), 2);
         // 鎵归噺鍒犻櫎閲囪喘鍙拌处
         return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
     }
@@ -480,11 +783,6 @@
                 .eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType());
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
 
-        // 3.鏌ヨ涓婁紶鏂囦欢
-        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
-        salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId())
-                .eq(CommonFile::getType,FileNameType.PURCHASE.getValue());
-        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
 
         // 4. 杞崲 DTO
         PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
@@ -492,7 +790,7 @@
         if (!products.isEmpty()) {
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
-            resultDto.setSalesLedgerFiles(salesLedgerFiles);
+            resultDto.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId()));
         }
         return resultDto;
     }
@@ -532,14 +830,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;
     }
@@ -566,44 +856,22 @@
         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;
+        return purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
     }
 
     @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;
-    }
-
-    @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);
@@ -639,6 +907,12 @@
             List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
                     salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getRecorderName).collect(Collectors.toList())));
             for (PurchaseLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
+                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+                        .eq(PurchaseLedger::getPurchaseContractNumber, salesLedgerImportDto.getPurchaseContractNumber())
+                        .last("limit 1"));
+                if(purchaseLedger != null){
+                    continue;
+                }
                 PurchaseLedger salesLedger = new PurchaseLedger();
                 BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
                 // 閫氳繃渚涘簲鍟嗗悕绉版煡璇D
@@ -671,20 +945,21 @@
                 if(salesLedger1 != null){
                     salesLedger.setSalesLedgerId(salesLedger1.getId());
                 }
-                // 閲囪喘瀹℃牳
-                // 閫氳繃鏄电О鑾峰彇鐢ㄦ埛ID
-                String[] split = salesLedger.getApproveUserIds().split("锛�");
-                List<Long> ids = new ArrayList<>();
-                for (int i = 0; i < split.length; i++) {
-                    SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, split[i])
-                            .last("LIMIT 1"));
-                    if (sysUser != null) {
-                        ids.add(sysUser.getUserId());
+                if (StringUtils.hasText(salesLedger.getApproveUserIds())) {
+                    // 閲囪喘瀹℃牳锛氬巻鍙插鍏ユā鏉夸紶瀹℃壒浜哄鍚嶆椂锛岀户缁吋瀹硅浆鎹负鐢ㄦ埛ID銆�
+                    String[] split = salesLedger.getApproveUserIds().split("锛�");
+                    List<Long> ids = new ArrayList<>();
+                    for (int i = 0; i < split.length; i++) {
+                        SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, split[i])
+                                .last("LIMIT 1"));
+                        if (sysUser != null) {
+                            ids.add(sysUser.getUserId());
+                        }
                     }
+                    // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
+                    String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
+                    salesLedger.setApproveUserIds(collect);
                 }
-                // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
-                String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
-                salesLedger.setApproveUserIds(collect);
                 purchaseLedgerMapper.insert(salesLedger);
 
                 for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
@@ -694,8 +969,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()
@@ -706,7 +979,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){
@@ -752,14 +1024,31 @@
     }
 
     public void addApproveByPurchase(LoginUser loginUser,PurchaseLedger purchaseLedger) throws Exception {
-        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);
+        if (loginUser == null) {
+            return;
+        }
+        ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
+                new LambdaQueryWrapper<ApprovalTemplate>()
+                        .eq(ApprovalTemplate::getBusinessType, 5L)
+                        .orderByDesc(ApprovalTemplate::getId)
+                        .last("LIMIT 1")
+        );
+        if (approvalTemplate == null) {
+            throw new BaseException("璇峰厛閰嶇疆閲囪喘瀹℃壒妯℃澘");
+        }
+
+        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
+        approvalInstance.setTemplateId(approvalTemplate.getId());
+        approvalInstance.setTemplateName(approvalTemplate.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);
+
     }
 
     /**

--
Gitblit v1.9.3