From cae863f681a84b968b646d2522c4f5678ef76d9c Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期五, 14 八月 2026 16:51:47 +0800
Subject: [PATCH] fix: 优化采购台账数据导入逻辑,增强数据校验和处理
---
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | 889 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 880 insertions(+), 9 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 a209ccb..1972f03 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,15 +1,78 @@
package com.ruoyi.purchase.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.approve.bean.vo.ApproveProcessVO;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+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.Product;
+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.exception.base.BaseException;
+import com.ruoyi.common.utils.AmountUtils;
+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.other.mapper.TempFileMapper;
+import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
+import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+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.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
-import lombok.AllArgsConstructor;
+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.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;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+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.util.Arrays;
-import java.util.List;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
/**
* 閲囪喘鍙拌处Service涓氬姟灞傚鐞�
@@ -18,27 +81,835 @@
* @date 2025-05-09
*/
@Service
-@AllArgsConstructor
+@Slf4j
+@RequiredArgsConstructor
public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
- private PurchaseLedgerMapper purchaseLedgerMapper;
+ private static final Long IMPORT_PRODUCT_PARENT_ID = 3L;
+
+ 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 SysDeptMapper sysDeptMapper;
+ private final SupplierManageMapper supplierManageMapper;
+ private final ProductMapper productMapper;
+ private final ProductModelMapper productModelMapper;
+ private final SysUserMapper sysUserMapper;
+ private final StringRedisTemplate redisTemplate;
+ private final QualityInspectMapper qualityInspectMapper;
+ 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 FileUtil fileUtil;
@Override
public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
- return purchaseLedgerMapper.selectList(new LambdaQueryWrapper<>());
+ LambdaQueryWrapper<PurchaseLedger> queryWrapper = new LambdaQueryWrapper<>();
+ 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
- public int addOrEditPurchase(PurchaseLedger purchaseLedger) {
+ @Transactional(rollbackFor = Exception.class)
+ public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception {
+ PurchaseLedger purchaseLedger = new PurchaseLedger();
+ // DTO杞珽ntity
+ BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+ AmountUtils.normalizeContractAmount(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());
+
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
+ purchaseLedger.setTenantId(loginUser.getTenantId());
+ }
+ purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : "");
+ purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1);
+ purchaseLedger.setSupplierName(supplierManage.getSupplierName());
+ purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
+
+ purchaseLedger.setApprovalStatus(1);
+ // 3. 鏂板鎴栨洿鏂颁富琛�
if (purchaseLedger.getId() == null) {
- return purchaseLedgerMapper.insert(purchaseLedger);
+ purchaseLedgerMapper.insert(purchaseLedger);
} else {
- return purchaseLedgerMapper.updateById(purchaseLedger);
+ // 鍒犻櫎閲囪喘瀹℃牳锛岄噸鏂版彁浜�
+ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
+ .eq(ApproveProcess::getApproveType, 5)
+ .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber())
+ .eq(ApproveProcess::getApproveDelete, 0)
+ .last("limit 1"));
+ if (one != null) {
+ approveProcessService.delByIds(Collections.singletonList(one.getId()));
+ }
+ purchaseLedgerMapper.updateById(purchaseLedger);
+ }
+
+ // 4. 澶勭悊瀛愯〃鏁版嵁
+ List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
+ if (productList != null && !productList.isEmpty()) {
+ handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
+ }
+ // 6.閲囪喘瀹℃牳鏂板锛涘鎵圭鐞嗘湭閰嶇疆閲囪喘瀹℃壒浜烘椂锛屽鎵规湇鍔′細鑷姩缃负瀹℃壒閫氳繃銆�
+ addApproveByPurchase(loginUser, purchaseLedger);
+ // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
+ fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
+ return 1;
+ }
+
+
+ public void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
+ QualityInspect qualityInspect = new QualityInspect();
+ qualityInspect.setInspectType(0);
+ qualityInspect.setSupplier(purchaseLedger.getSupplierName());
+ qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
+ qualityInspect.setProductId(saleProduct.getProductId());
+ qualityInspect.setProductName(saleProduct.getProductCategory());
+ qualityInspect.setModel(saleProduct.getSpecificationModel());
+ qualityInspect.setProductModelId(saleProduct.getProductModelId());
+ qualityInspect.setUnit(saleProduct.getUnit());
+ qualityInspect.setQuantity(saleProduct.getQuantity());
+ qualityInspectMapper.insert(qualityInspect);
+ List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null);
+ if (qualityTestStandard.size()>0){
+ qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
+ qualityInspectMapper.updateById(qualityInspect);
+ qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+ .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandard.get(0).getId()))
+ .forEach(qualityTestStandardParam -> {
+ QualityInspectParam param = new QualityInspectParam();
+ com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param);
+ param.setId(null);
+ param.setInspectId(qualityInspect.getId());
+ qualityInspectParamMapper.insert(param);
+ });
+ }
+ }
+
+ private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+ if (products == null || products.isEmpty()) {
+ throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�");
+ }
+ Integer ledgerType = type == null ? 2 : type;
+
+ // 鎻愬墠鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑ID
+ Set<Long> productIds = products.stream()
+ .map(SalesLedgerProduct::getProductId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+
+ Set<Long> modelIds = products.stream()
+ .map(SalesLedgerProduct::getProductModelId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+
+ // 涓�娆℃�ф煡璇骇鍝佸拰鍨嬪彿淇℃伅
+ Map<Long, String> productMap = new HashMap<>();
+ if (!productIds.isEmpty()) {
+ List<Product> productList = productMapper.selectBatchIds(productIds);
+ productList.forEach(p -> productMap.put(p.getId(), p.getProductName()));
+ }
+
+ Map<Long, String> modelMap = new HashMap<>();
+ if (!modelIds.isEmpty()) {
+ List<ProductModel> modelList = productModelMapper.selectBatchIds(modelIds);
+ modelList.forEach(m -> modelMap.put(m.getId(), m.getModel()));
+ }
+
+ // 璁剧疆瀛楁
+ for (SalesLedgerProduct product : products) {
+ AmountUtils.normalizeSalesLedgerProduct(product);
+ product.setSalesLedgerId(salesLedgerId);
+
+ Long productId = product.getProductId();
+ if (productId != null && productMap.containsKey(productId)) {
+ product.setProductCategory(productMap.get(productId));
+ }
+
+ Long productModelId = product.getProductModelId();
+ if (productModelId != null && modelMap.containsKey(productModelId)) {
+ product.setSpecificationModel(modelMap.get(productModelId));
+ }
+ }
+
+ // 鍒嗙粍澶勭悊
+ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
+ .collect(Collectors.partitioningBy(p -> p.getId() != null));
+
+ List<SalesLedgerProduct> updateList = partitionedProducts.get(true);
+ List<SalesLedgerProduct> insertList = partitionedProducts.get(false);
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(salesLedgerId);
+
+ // 鎵ц鏇存柊鎿嶄綔
+ if (!updateList.isEmpty()) {
+ for (SalesLedgerProduct product : updateList) {
+ product.setType(ledgerType);
+ salesLedgerProductMapper.updateById(product);
+ }
+ }
+ // 鎵ц鎻掑叆鎿嶄綔
+ if (!insertList.isEmpty()) {
+ for (SalesLedgerProduct salesLedgerProduct : insertList) {
+ salesLedgerProduct.setType(ledgerType);
+ Date entryDate = purchaseLedger.getEntryDate();
+
+ LocalDateTime localDateTime = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+ salesLedgerProduct.setRegisterDate(localDateTime);
+ salesLedgerProductMapper.insert(salesLedgerProduct);
+ }
+ }
+
+ // 璁$畻鎬诲惈绋庨噾棰�
+ BigDecimal totalTaxInclusiveAmount = AmountUtils.scaleAmount(products.stream()
+ .map(SalesLedgerProduct::getTaxInclusiveTotalPrice)
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+ // 鏇存柊涓昏〃鐨勬�婚噾棰濆瓧娈�
+ if (salesLedgerId != null) {
+ // 鐩存帴鏇存柊鎸囧畾ID鐨勮褰曠殑contractAmount瀛楁涓簍otalTaxInclusiveAmount
+ purchaseLedgerMapper.updateContractAmountById(salesLedgerId, totalTaxInclusiveAmount);
}
}
@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<>();
+ salesLedgerProductQueryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
+ .eq(SalesLedgerProduct::getType, 2);
+ List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductQueryWrapper);
+ if (CollectionUtils.isNotEmpty(salesLedgerProducts)) {
+ salesLedgerProducts.stream().forEach(salesLedgerProduct -> {
+ // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
+ LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProduct.getId());
+ procurementRecordStorageMapper.delete(queryWrapper);
+ });
+ }
+ // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
+ LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
+ .eq(SalesLedgerProduct::getType, 2);
+ salesLedgerProductMapper.delete(queryWrapper);
+ //鎵归噺鍒犻櫎妫�楠屾爣鍑�
+ 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)) {
+ throw new BaseException("宸叉彁浜ょ殑妫�楠屽崟涓嶈兘鍒犻櫎");
+ }
+ });
+ List<Long> inspectIds = qualityInspects.stream()
+ .map(QualityInspect::getId)
+ .collect(Collectors.toList());
+
+ if (inspectIds.size() > 0) {
+ LambdaQueryWrapper<QualityInspectParam> qualityStandardLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ qualityStandardLambdaQueryWrapper.in(QualityInspectParam::getInspectId, inspectIds);
+ qualityInspectParamMapper.delete(qualityStandardLambdaQueryWrapper);
+ }
+ // 鍒犻櫎閲囪喘瀹℃壒璁板綍
+ for (Long id : ids) {
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+ if(purchaseLedger != null){
+ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
+ .eq(ApproveProcess::getApproveType, 5)
+ .eq(ApproveProcess::getApproveDelete, 0)
+ .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber())
+ .last("limit 1"));
+ if (one != null) {
+ approveProcessService.delByIds(Collections.singletonList(one.getId()));
+ }
+ }
+ }
+ //鎵归噺鍒犻櫎鍘熸潗鏂欐楠屾暟鎹�
+ qualityInspectMapper.delete(materialInspectLambdaQueryWrapper);
+ //鍒犻櫎闄勪欢
+ commonFileService.deleteByBusinessIds(Arrays.asList(ids), 2);
+ // 鎵归噺鍒犻櫎閲囪喘鍙拌处
return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
}
+
+ @Override
+ public PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto) {
+ // 1. 鏌ヨ涓昏〃
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerDto.getId());
+ if (purchaseLedger == null) {
+ throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+ }
+
+ // 2. 鏌ヨ瀛愯〃
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
+ .eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType());
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+
+
+ // 4. 杞崲 DTO
+ PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
+ BeanUtils.copyProperties(purchaseLedger, resultDto);
+ AmountUtils.normalizeContractAmount(resultDto);
+ if (!products.isEmpty()) {
+ AmountUtils.normalizeSalesLedgerProducts(products);
+ resultDto.setHasChildren(true);
+ resultDto.setProductData(products);
+ resultDto.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId()));
+ }
+ return resultDto;
+ }
+
+ @Override
+ public List getProduct(PurchaseLedgerDto purchaseLedgerDto) {
+ LambdaQueryWrapper<PurchaseLedger> queryWrapper = Wrappers.lambdaQuery();
+ queryWrapper.select(PurchaseLedger::getId, PurchaseLedger::getPurchaseContractNumber);
+
+ // 鑾峰彇鍘熷鏌ヨ缁撴灉
+ List<Map<String, Object>> result = purchaseLedgerMapper.selectMaps(queryWrapper);
+
+ // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
+ return result.stream().map(map -> map.entrySet().stream()
+ .collect(Collectors.toMap(
+ entry -> underlineToCamel(entry.getKey()),
+ Map.Entry::getValue))
+ ).collect(Collectors.toList());
+ }
+
+ @Override
+ public PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto) {
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerDto.getId());
+ if (purchaseLedger == null) {
+ throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+ }
+ // 鍒涘缓骞跺~鍏匘TO
+ PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
+ resultDto.setSalesLedgerId(purchaseLedger.getSalesLedgerId());
+ resultDto.setSalesContractNoId(purchaseLedger.getSalesLedgerId());
+ resultDto.setSalesContractNo(purchaseLedger.getSalesContractNo());
+ resultDto.setSupplierName(purchaseLedger.getSupplierName());
+ resultDto.setProjectName(purchaseLedger.getProjectName());
+
+ // 鏌ヨ骞惰缃叧鑱斾骇鍝�
+ LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
+ .eq(SalesLedgerProduct::getType, 2);
+ List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
+ AmountUtils.normalizeSalesLedgerProducts(productList);
+ resultDto.setProductData(productList);
+ return resultDto;
+ }
+
+ @Override
+ public List getPurchasesNo() {
+ LambdaQueryWrapper<PurchaseLedger> queryWrapper = Wrappers.lambdaQuery();
+ queryWrapper.select(PurchaseLedger::getId, PurchaseLedger::getPurchaseContractNumber, PurchaseLedger::getSupplierId);
+
+ // 鑾峰彇鍘熷鏌ヨ缁撴灉
+ List<Map<String, Object>> result = purchaseLedgerMapper.selectMaps(queryWrapper);
+
+ // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
+ return result.stream().map(map -> map.entrySet().stream()
+ .collect(Collectors.toMap(
+ entry -> underlineToCamel(entry.getKey()),
+ Map.Entry::getValue))
+ ).collect(Collectors.toList());
+ }
+
+ @Override
+ public PurchaseLedgerDto getPurchaseNoById(Long id) {
+ PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto();
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+
+ BeanUtils.copyProperties(purchaseLedger, purchaseLedgerDto);
+ return purchaseLedgerDto;
+ }
+
+ @Override
+ public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
+ IPage<PurchaseLedgerDto> page = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
+ if (!CollectionUtils.isEmpty(page.getRecords())) {
+ page.getRecords().forEach(record -> {
+ AmountUtils.normalizeContractAmount(record);
+ AmountUtils.normalizeSalesLedgerProducts(record.getProductData());
+ });
+ }
+ return page;
+ }
+
+ @Override
+ public String getPurchaseNo() {
+ // 鐢熸垚鏃ユ湡鍓嶇紑锛堜緥濡傦細CG20250405锛�
+ String purchaseNo = "CG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+ // 鏋勫缓 Redis Key锛堟寜澶╁垎闅旓級
+ String redisKey = "purchase_no:" + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
+
+ // 鑾峰彇褰撳墠搴忓彿骞堕�掑锛堝師瀛愭搷浣滐級
+ Long sequence = redisTemplate.opsForValue().increment(redisKey);
+
+ // 璁剧疆杩囨湡鏃堕棿锛堟鏃ュけ鏁堬紝闃叉鍐椾綑鏁版嵁锛�
+ if (sequence == 1) {
+ redisTemplate.expire(redisKey, 1, TimeUnit.DAYS);
+ }
+
+ // 杩斿洖瀹屾暣缂栧彿锛堝 CG202504050001锛�
+ return purchaseNo + String.format("%03d", sequence);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public AjaxResult importData(MultipartFile file) {
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ try (InputStream inputStream = file.getInputStream()) {
+ ExcelUtil<PurchaseLedgerImportDto> excelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class);
+ Map<String, List<PurchaseLedgerImportDto>> sheetData = excelUtil.importExcelMultiSheet(
+ Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
+ if (CollectionUtils.isEmpty(sheetData)) {
+ return AjaxResult.error("閲囪喘琛ㄦ牸涓虹┖锛�");
+ }
+
+ List<PurchaseLedgerImportDto> purchaseImports = sheetData.get("閲囪喘鍙拌处鏁版嵁");
+ if (CollectionUtils.isEmpty(purchaseImports)) {
+ return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
+ }
+ List<PurchaseLedgerImportDto> productImports = sheetData.get("閲囪喘浜у搧鏁版嵁");
+ if (CollectionUtils.isEmpty(productImports)) {
+ return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
+ }
+
+ List<String> supplierNames = purchaseImports.stream()
+ .map(PurchaseLedgerImportDto::getSupplierName)
+ .filter(StringUtils::hasText)
+ .map(StringUtils::trim)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<String, SupplierManage> supplierMap = CollectionUtils.isEmpty(supplierNames)
+ ? Collections.emptyMap()
+ : supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>()
+ .in(SupplierManage::getSupplierName, supplierNames))
+ .stream()
+ .collect(Collectors.toMap(
+ supplier -> StringUtils.trim(supplier.getSupplierName()),
+ supplier -> supplier,
+ (first, ignored) -> first));
+
+ List<String> recorderNames = purchaseImports.stream()
+ .map(PurchaseLedgerImportDto::getRecorderName)
+ .filter(StringUtils::hasText)
+ .map(StringUtils::trim)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<String, SysUser> recorderMap = CollectionUtils.isEmpty(recorderNames)
+ ? Collections.emptyMap()
+ : sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
+ .in(SysUser::getNickName, recorderNames))
+ .stream()
+ .collect(Collectors.toMap(
+ user -> StringUtils.trim(user.getNickName()),
+ user -> user,
+ (first, ignored) -> first));
+
+ Map<String, ProductModel> importedProductModelCache = new HashMap<>();
+ int addedCount = 0;
+ int overwrittenCount = 0;
+ int skippedCount = 0;
+
+ for (PurchaseLedgerImportDto purchaseImport : purchaseImports) {
+ String purchaseContractNumber = requireImportText(
+ purchaseImport.getPurchaseContractNumber(), "閲囪喘鍗曞彿涓嶈兘涓虹┖锛�");
+ purchaseImport.setPurchaseContractNumber(purchaseContractNumber);
+ purchaseImport.setSupplierName(StringUtils.trim(purchaseImport.getSupplierName()));
+ purchaseImport.setProjectName(StringUtils.trim(purchaseImport.getProjectName()));
+ purchaseImport.setRecorderName(StringUtils.trim(purchaseImport.getRecorderName()));
+
+ List<PurchaseLedgerProductImportDto> purchaseProducts = productImports.stream()
+ .filter(productImport -> sameImportText(
+ productImport.getPurchaseContractNumber(), purchaseContractNumber))
+ .map(productImport -> (PurchaseLedgerProductImportDto) productImport)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(purchaseProducts)) {
+ throw new BaseException("閲囪喘鍗曞彿:" + purchaseContractNumber + ",鏃犲搴斾骇鍝佹暟鎹紒");
+ }
+
+ List<PurchaseLedger> existingLedgers = purchaseLedgerMapper.selectList(
+ new LambdaQueryWrapper<PurchaseLedger>()
+ .eq(PurchaseLedger::getPurchaseContractNumber, purchaseContractNumber));
+ PurchaseLedger ledgerToOverwrite = existingLedgers.stream()
+ .filter(existing -> Objects.equals(existing.getApprovalStatus(), 1))
+ .filter(existing -> isSameImportedPurchase(existing, purchaseImport))
+ .findFirst()
+ .orElse(null);
+ if (ledgerToOverwrite == null && CollectionUtils.isNotEmpty(existingLedgers)) {
+ skippedCount++;
+ continue;
+ }
+
+ PurchaseLedger purchaseLedger = buildImportedPurchaseLedger(
+ purchaseImport, purchaseProducts, supplierMap, recorderMap);
+ boolean overwrite = ledgerToOverwrite != null;
+ if (overwrite) {
+ purchaseLedger.setId(ledgerToOverwrite.getId());
+ purchaseLedger.setApprovalStatus(1);
+ updateImportedPurchaseLedger(purchaseLedger);
+ clearImportedPurchaseContents(purchaseLedger.getId(), purchaseContractNumber);
+ overwrittenCount++;
+ } else {
+ purchaseLedger.setApprovalStatus(1);
+ purchaseLedgerMapper.insert(purchaseLedger);
+ addedCount++;
+ }
+
+ for (PurchaseLedgerProductImportDto productImport : purchaseProducts) {
+ ProductModel productModel = findOrCreateImportedProductModel(
+ productImport, importedProductModelCache);
+ SalesLedgerProduct purchaseProduct = new SalesLedgerProduct();
+ BeanUtils.copyProperties(productImport, purchaseProduct);
+ purchaseProduct.setSalesLedgerId(purchaseLedger.getId());
+ purchaseProduct.setType(2);
+ purchaseProduct.setProductId(productModel.getProductId());
+ purchaseProduct.setProductModelId(productModel.getId());
+ AmountUtils.normalizeSalesLedgerProduct(purchaseProduct);
+ purchaseProduct.setTaxExclusiveTotalPrice(
+ AmountUtils.calcTaxExclusiveTotalPrice(
+ purchaseProduct.getTaxInclusiveTotalPrice(),
+ purchaseProduct.getTaxRate()));
+ purchaseProduct.setRegister(loginUser.getNickName());
+ purchaseProduct.setRegisterDate(LocalDateTime.now());
+ purchaseProduct.setApproveStatus(0);
+ purchaseProduct.setIsChecked(Objects.equals(productImport.getIsChecked(), 1));
+ salesLedgerProductMapper.insert(purchaseProduct);
+ if (Boolean.TRUE.equals(purchaseProduct.getIsChecked())) {
+ addQualityInspect(purchaseLedger, purchaseProduct);
+ }
+ }
+
+ if (!overwrite) {
+ addApproveByPurchase(loginUser, purchaseLedger);
+ }
+ }
+
+ return AjaxResult.success(String.format(
+ "瀵煎叆鎴愬姛锛氭柊澧�%d鏉★紝瑕嗙洊%d鏉★紝璺宠繃%d鏉�", addedCount, overwrittenCount, skippedCount));
+ } catch (BaseException e) {
+ log.error("瀵煎叆閲囪喘鍙拌处澶辫触锛歿}", e.getMessage(), e);
+ throw e;
+ } catch (Exception e) {
+ log.error("瀵煎叆閲囪喘鍙拌处澶辫触", e);
+ throw new BaseException("瀵煎叆澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ private PurchaseLedger buildImportedPurchaseLedger(
+ PurchaseLedgerImportDto purchaseImport,
+ List<PurchaseLedgerProductImportDto> purchaseProducts,
+ Map<String, SupplierManage> supplierMap,
+ Map<String, SysUser> recorderMap) {
+ PurchaseLedger purchaseLedger = new PurchaseLedger();
+ BeanUtils.copyProperties(purchaseImport, purchaseLedger);
+
+ SupplierManage supplier = supplierMap.get(purchaseLedger.getSupplierName());
+ purchaseLedger.setSupplierId(supplier == null ? null : supplier.getId());
+
+ SysUser recorder = recorderMap.get(purchaseLedger.getRecorderName());
+ if (recorder == null) {
+ throw new BaseException("褰曞叆浜�:" + purchaseLedger.getRecorderName() + ",鏃犲搴旂敤鎴凤紒");
+ }
+ purchaseLedger.setRecorderId(recorder.getUserId());
+ purchaseLedger.setContractAmount(purchaseProducts.stream()
+ .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+ if (StringUtils.hasText(purchaseLedger.getSalesContractNo())) {
+ SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+ .eq(SalesLedger::getSalesContractNo, purchaseLedger.getSalesContractNo())
+ .last("LIMIT 1"));
+ purchaseLedger.setSalesLedgerId(salesLedger == null ? null : salesLedger.getId());
+ } else {
+ purchaseLedger.setSalesLedgerId(null);
+ }
+ purchaseLedger.setApproveUserIds(convertImportedApproverNames(purchaseLedger.getApproveUserIds()));
+ return purchaseLedger;
+ }
+
+ private String convertImportedApproverNames(String approverNames) {
+ if (!StringUtils.hasText(approverNames)) {
+ return approverNames;
+ }
+ List<Long> userIds = new ArrayList<>();
+ for (String approverName : approverNames.split("[锛�,]")) {
+ String trimmedName = StringUtils.trim(approverName);
+ if (!StringUtils.hasText(trimmedName)) {
+ continue;
+ }
+ SysUser user = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+ .eq(SysUser::getNickName, trimmedName)
+ .last("LIMIT 1"));
+ if (user != null) {
+ userIds.add(user.getUserId());
+ }
+ }
+ return userIds.stream().map(String::valueOf).collect(Collectors.joining(","));
+ }
+
+ private ProductModel findOrCreateImportedProductModel(
+ PurchaseLedgerProductImportDto productImport,
+ Map<String, ProductModel> cache) {
+ String productCategory = requireImportText(
+ productImport.getProductCategory(), "閲囪喘浜у搧鐨勪骇鍝佸ぇ绫讳笉鑳戒负绌猴紒");
+ String specificationModel = StringUtils.trim(productImport.getSpecificationModel());
+ if (!StringUtils.hasText(specificationModel)) {
+ specificationModel = productCategory;
+ }
+ productImport.setProductCategory(productCategory);
+ productImport.setSpecificationModel(specificationModel);
+ productImport.setUnit(StringUtils.trim(productImport.getUnit()));
+
+ String cacheKey = productCategory + "::" + specificationModel;
+ ProductModel cachedModel = cache.get(cacheKey);
+ if (cachedModel != null) {
+ return cachedModel;
+ }
+
+ List<Product> sameNameProducts = productMapper.selectList(new LambdaQueryWrapper<Product>()
+ .eq(Product::getProductName, productCategory));
+ for (Product product : sameNameProducts) {
+ ProductModel existingModel = productModelMapper.selectOne(new LambdaQueryWrapper<ProductModel>()
+ .eq(ProductModel::getProductId, product.getId())
+ .eq(ProductModel::getModel, specificationModel)
+ .last("LIMIT 1"));
+ if (existingModel != null) {
+ cache.put(cacheKey, existingModel);
+ return existingModel;
+ }
+ }
+
+ Product product = sameNameProducts.stream()
+ .filter(item -> Objects.equals(item.getParentId(), IMPORT_PRODUCT_PARENT_ID))
+ .findFirst()
+ .orElse(null);
+ if (product == null) {
+ product = new Product();
+ product.setParentId(IMPORT_PRODUCT_PARENT_ID);
+ product.setProductName(productCategory);
+ productMapper.insert(product);
+ }
+
+ ProductModel productModel = new ProductModel();
+ productModel.setProductId(product.getId());
+ productModel.setModel(specificationModel);
+ productModel.setUnit(productImport.getUnit());
+ productModel.setProductCode(specificationModel + "-001");
+ productModelMapper.insert(productModel);
+ cache.put(cacheKey, productModel);
+ return productModel;
+ }
+
+ private void updateImportedPurchaseLedger(PurchaseLedger purchaseLedger) {
+ purchaseLedgerMapper.update(null, new LambdaUpdateWrapper<PurchaseLedger>()
+ .eq(PurchaseLedger::getId, purchaseLedger.getId())
+ .set(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber())
+ .set(PurchaseLedger::getSupplierId, purchaseLedger.getSupplierId())
+ .set(PurchaseLedger::getSupplierName, purchaseLedger.getSupplierName())
+ .set(PurchaseLedger::getRecorderId, purchaseLedger.getRecorderId())
+ .set(PurchaseLedger::getRecorderName, purchaseLedger.getRecorderName())
+ .set(PurchaseLedger::getSalesContractNo, purchaseLedger.getSalesContractNo())
+ .set(PurchaseLedger::getProjectName, purchaseLedger.getProjectName())
+ .set(PurchaseLedger::getEntryDate, purchaseLedger.getEntryDate())
+ .set(PurchaseLedger::getExecutionDate, purchaseLedger.getExecutionDate())
+ .set(PurchaseLedger::getRemarks, purchaseLedger.getRemarks())
+ .set(PurchaseLedger::getSalesLedgerId, purchaseLedger.getSalesLedgerId())
+ .set(PurchaseLedger::getContractAmount, purchaseLedger.getContractAmount())
+ .set(PurchaseLedger::getPaymentMethod, purchaseLedger.getPaymentMethod())
+ .set(PurchaseLedger::getApproveUserIds, purchaseLedger.getApproveUserIds())
+ .set(PurchaseLedger::getApprovalStatus, 1)
+ .set(PurchaseLedger::getUpdatedAt, new Date()));
+ }
+
+ private void clearImportedPurchaseContents(Long purchaseLedgerId, String purchaseContractNumber) {
+ List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+ new LambdaQueryWrapper<QualityInspect>()
+ .eq(QualityInspect::getPurchaseLedgerId, purchaseLedgerId));
+ boolean hasSubmittedInspect = qualityInspects.stream()
+ .anyMatch(inspect -> Objects.equals(inspect.getInspectState(), 1));
+ if (hasSubmittedInspect) {
+ throw new BaseException("閲囪喘鍗曞彿:" + purchaseContractNumber + ",瀛樺湪宸叉彁浜ょ殑妫�楠屽崟锛屼笉鑳借鐩栵紒");
+ }
+ List<Long> inspectIds = qualityInspects.stream()
+ .map(QualityInspect::getId)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isNotEmpty(inspectIds)) {
+ qualityInspectParamMapper.delete(new LambdaQueryWrapper<QualityInspectParam>()
+ .in(QualityInspectParam::getInspectId, inspectIds));
+ qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>()
+ .eq(QualityInspect::getPurchaseLedgerId, purchaseLedgerId));
+ }
+
+ List<SalesLedgerProduct> existingProducts = salesLedgerProductMapper.selectList(
+ new LambdaQueryWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedgerId)
+ .eq(SalesLedgerProduct::getType, 2));
+ for (SalesLedgerProduct existingProduct : existingProducts) {
+ procurementRecordStorageMapper.delete(new LambdaQueryWrapper<ProcurementRecordStorage>()
+ .eq(ProcurementRecordStorage::getSalesLedgerProductId, existingProduct.getId()));
+ }
+ salesLedgerProductMapper.delete(new LambdaQueryWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedgerId)
+ .eq(SalesLedgerProduct::getType, 2));
+ }
+
+ private boolean isSameImportedPurchase(
+ PurchaseLedger existingLedger, PurchaseLedgerImportDto purchaseImport) {
+ return sameImportText(existingLedger.getPurchaseContractNumber(), purchaseImport.getPurchaseContractNumber())
+ && sameImportText(existingLedger.getSupplierName(), purchaseImport.getSupplierName())
+ && sameImportText(existingLedger.getProjectName(), purchaseImport.getProjectName())
+ && sameImportDate(existingLedger.getExecutionDate(), purchaseImport.getExecutionDate())
+ && sameImportDate(existingLedger.getEntryDate(), purchaseImport.getEntryDate());
+ }
+
+ private boolean sameImportText(String left, String right) {
+ return Objects.equals(StringUtils.trim(left), StringUtils.trim(right));
+ }
+
+ private boolean sameImportDate(Date left, Date right) {
+ if (left == null || right == null) {
+ return left == null && right == null;
+ }
+ LocalDate leftDate = Instant.ofEpochMilli(left.getTime())
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ LocalDate rightDate = Instant.ofEpochMilli(right.getTime())
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ return leftDate.equals(rightDate);
+ }
+
+ private String requireImportText(String value, String message) {
+ String trimmedValue = StringUtils.trim(value);
+ if (!StringUtils.hasText(trimmedValue)) {
+ throw new BaseException(message);
+ }
+ return trimmedValue;
+ }
+
+ @Override
+ public PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto) {
+ // 1. 鏌ヨ涓昏〃
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+ .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedgerDto.getPurchaseContractNumber())
+ .last("LIMIT 1"));
+ if (purchaseLedger == null) {
+ throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+ }
+
+ // 2. 鏌ヨ瀛愯〃
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
+ .eq(SalesLedgerProduct::getType, 2);
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+
+ // 4. 杞崲 DTO
+ PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
+ BeanUtils.copyProperties(purchaseLedger, resultDto);
+ AmountUtils.normalizeContractAmount(resultDto);
+ if (!products.isEmpty()) {
+ AmountUtils.normalizeSalesLedgerProducts(products);
+ resultDto.setHasChildren(true);
+ resultDto.setProductData(products);
+ }
+ return resultDto;
+ }
+
+ public void addApproveByPurchase(LoginUser loginUser,PurchaseLedger purchaseLedger) throws Exception {
+ 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());
+ approveProcessVO.setPrice(AmountUtils.scaleAmount(purchaseLedger.getContractAmount()));
+ approveProcessService.addApprove(approveProcessVO);
+ }
+
+ /**
+ * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
+ */
+ private String underlineToCamel(String param) {
+ if (param == null || "".equals(param.trim())) {
+ return "";
+ }
+ int len = param.length();
+ StringBuilder sb = new StringBuilder(len);
+ for (int i = 0; i < len; i++) {
+ char c = param.charAt(i);
+ if (c == '_') {
+ if (++i < len) {
+ sb.append(Character.toUpperCase(param.charAt(i)));
+ }
+ } else {
+ sb.append(Character.toLowerCase(c));
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public Map<String, Object> getPrintData(Long id) {
+ PurchaseLedger purchaseLedger = getById(id);
+ if (purchaseLedger == null) {
+ return null;
+ }
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
+ new LambdaQueryWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getSalesLedgerId, id)
+ .eq(SalesLedgerProduct::getType, 2)
+ );
+ SysDept dept = sysDeptMapper.selectDeptById(100L);
+ Map<String, Object> result = new HashMap<>();
+ result.put("companyName", dept != null ? dept.getDeptName() : "");
+ result.put("ledger", purchaseLedger);
+ result.put("products", products);
+ return result;
+ }
}
--
Gitblit v1.9.3