From 28e1505fa90c969b916d5e605e7a72b1df11cf8e Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 24 四月 2026 17:19:05 +0800
Subject: [PATCH] fix(purchase): 修复采购模块数据导入和查询问题
---
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | 281 ++++++++++++++++++++++++++++++++++---------------------
1 files changed, 173 insertions(+), 108 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 477aff7..3cf10e3 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.service.impl;
+import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -7,23 +8,19 @@
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.vo.ApproveProcessVO;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
-import com.ruoyi.approve.bean.vo.ApproveProcessVO;
+import com.ruoyi.basic.dto.ProductModelAnticlockwiseDto;
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.common.exception.base.BaseException;
-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;
@@ -39,19 +36,25 @@
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.pojo.PaymentRegistration;
+import com.ruoyi.purchase.pojo.ProductRecord;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.quality.mapper.*;
-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.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.InvoiceRegistrationProductMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.BeanUtils;
@@ -167,6 +170,7 @@
public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception {
PurchaseLedger purchaseLedger = new PurchaseLedger();
SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
+ BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
//褰曞叆浜�
SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
if (ObjectUtils.isNotEmpty(sysUser)) {
@@ -182,7 +186,7 @@
// DTO杞珽ntity
- BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
purchaseLedger.setTenantId(loginUser.getTenantId());
@@ -660,114 +664,175 @@
@Transactional(rollbackFor = Exception.class)
public AjaxResult importData(MultipartFile file) {
LoginUser loginUser = SecurityUtils.getLoginUser();
+ int successCount = 0;
+ int skipCount = 0;
+ List<String> errorMessages = new ArrayList<>();
+
try {
InputStream inputStream = file.getInputStream();
- ExcelUtil<PurchaseLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class);
- Map<String, List<PurchaseLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
+ ExcelUtil<PurchaseLedgerImportDto> excelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class);
+ Map<String, List<PurchaseLedgerImportDto>> stringListMap = excelUtil.importExcelMultiSheet(Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("閲囪喘琛ㄦ牸涓虹┖锛�");
- // 涓氬姟灞傚悎骞�
- List<PurchaseLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閲囪喘鍙拌处鏁版嵁");
- if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
- List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
- if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
- // 渚涘簲鍟嗘暟鎹�
- List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
- salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getSupplierName).collect(Collectors.toList())));
- List<Map<String,Object>> list = productModelMapper.getProductAndModelList();
- // 褰曞叆浜烘暟鎹�
+
+ List<PurchaseLedgerImportDto> ledgerList = stringListMap.get("閲囪喘鍙拌处鏁版嵁");
+ if (CollectionUtils.isEmpty(ledgerList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
+ List<PurchaseLedgerImportDto> productList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
+ if (CollectionUtils.isEmpty(productList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
+
+ List<SupplierManage> suppliers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
+ ledgerList.stream().map(PurchaseLedgerImportDto::getSupplierName).filter(StrUtil::isNotBlank).collect(Collectors.toList())));
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){
+ ledgerList.stream().map(PurchaseLedgerImportDto::getRecorderName).filter(StrUtil::isNotBlank).collect(Collectors.toList())));
+
+ for (int i = 0; i < ledgerList.size(); i++) {
+ PurchaseLedgerImportDto importDto = ledgerList.get(i);
+ int rowNum = i + 2;
+
+ if (StrUtil.isBlank(importDto.getPurchaseContractNumber())) {
+ errorMessages.add(String.format("绗�%d琛岋細閲囪喘鍗曞彿涓虹┖", rowNum));
+ skipCount++;
continue;
}
- PurchaseLedger salesLedger = new PurchaseLedger();
- BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
- // 閫氳繃渚涘簲鍟嗗悕绉版煡璇D
- salesLedger.setSupplierId(customers.stream()
- .filter(customer -> customer.getSupplierName().equals(salesLedger.getSupplierName()))
- .findFirst()
- .map(SupplierManage::getId)
- .orElse(null));
- Long aLong = sysUsers.stream()
- .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getRecorderName()))
- .findFirst()
- .map(SysUser::getUserId)
- .orElse(null);
- if (aLong == null)
- throw new RuntimeException("褰曞叆浜�:" + salesLedger.getRecorderName() + ",鏃犲搴旂敤鎴凤紒");
- salesLedger.setRecorderId(aLong);
- // 閲囪喘浜у搧鏁版嵁缁戝畾锛岄�氳繃閲囪喘鍗曞彿鑾峰彇瀵瑰簲閲囪喘浜у搧鏁版嵁
- List<PurchaseLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
- .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getPurchaseContractNumber().equals(salesLedger.getPurchaseContractNumber()))
- .collect(Collectors.toList());
- if (CollectionUtils.isEmpty(salesLedgerProductImportDtos))
- throw new RuntimeException("閲囪喘鍗曞彿:" + salesLedgerImportDto.getPurchaseContractNumber() + ",鏃犲搴斾骇鍝佹暟鎹紒");
- salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
- .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
- .reduce(BigDecimal.ZERO,BigDecimal::add));
- // 閫氳繃閿�鍞崟鍙风粦瀹氶攢鍞�
- SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
- .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo())
- .last("LIMIT 1"));
- 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());
- }
- }
- // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
- String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
- salesLedger.setApproveUserIds(collect);
- purchaseLedgerMapper.insert(salesLedger);
- for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
- SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
- BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
- salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
- 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()
- .ifPresent(map -> {
- salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
- salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
- });
- salesLedgerProduct.setRegister(loginUser.getNickName());
- salesLedgerProduct.setRegisterDate(LocalDateTime.now());
- salesLedgerProduct.setApproveStatus(0);
- salesLedgerProduct.setPendingTicketsTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
- // 鏄惁璐ㄦ鍒ゆ柇
- salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() == 1);
- if(salesLedgerProductImportDto.getIsChecked() == 1){
- addQualityInspect(salesLedger, salesLedgerProduct);
+ try {
+ PurchaseLedger existLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+ .eq(PurchaseLedger::getPurchaseContractNumber, importDto.getPurchaseContractNumber())
+ .last("limit 1"));
+ if (existLedger != null) {
+ errorMessages.add(String.format("绗�%d琛岋細閲囪喘鍗曞彿[%s]宸插瓨鍦�", rowNum, importDto.getPurchaseContractNumber()));
+ skipCount++;
+ continue;
}
- salesLedgerProductMapper.insert(salesLedgerProduct);
+
+ PurchaseLedger purchaseLedger = new PurchaseLedger();
+ BeanUtils.copyProperties(importDto, purchaseLedger);
+
+ purchaseLedger.setSupplierId(suppliers.stream()
+ .filter(s -> s.getSupplierName().equals(importDto.getSupplierName()))
+ .findFirst()
+ .map(SupplierManage::getId)
+ .orElse(null));
+
+ Long recorderId = sysUsers.stream()
+ .filter(u -> u.getNickName().equals(importDto.getRecorderName()))
+ .findFirst()
+ .map(SysUser::getUserId)
+ .orElse(null);
+ if (recorderId == null) {
+ throw new RuntimeException("褰曞叆浜�:" + importDto.getRecorderName() + "涓嶅瓨鍦�");
+ }
+ purchaseLedger.setRecorderId(recorderId);
+
+ List<PurchaseLedgerProductImportDto> productDtos = productList.stream()
+ .filter(p -> p.getPurchaseContractNumber().equals(importDto.getPurchaseContractNumber()))
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(productDtos)) {
+ throw new RuntimeException("鏃犲搴斾骇鍝佹暟鎹�");
+ }
+
+ purchaseLedger.setContractAmount(productDtos.stream()
+ .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
+ .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+ SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+ .eq(SalesLedger::getSalesContractNo, purchaseLedger.getSalesContractNo())
+ .last("LIMIT 1"));
+ if (salesLedger != null) {
+ purchaseLedger.setSalesLedgerId(salesLedger.getId());
+ }
+
+ purchaseLedgerMapper.insert(purchaseLedger);
+
+ for (PurchaseLedgerProductImportDto productDto : productDtos) {
+ SalesLedgerProduct product = new SalesLedgerProduct();
+ BeanUtils.copyProperties(productDto, product);
+ product.setSalesLedgerId(purchaseLedger.getId());
+ product.setType(2);
+ product.setTaxExclusiveTotalPrice(product.getTaxInclusiveTotalPrice()
+ .divide(new BigDecimal(1).add(product.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
+ product.setFutureTickets(product.getQuantity());
+ product.setFutureTicketsAmount(product.getTaxExclusiveTotalPrice());
+
+ ProductModelAnticlockwiseDto modelDto = new ProductModelAnticlockwiseDto();
+ modelDto.setProductName(product.getProductCategory());
+ modelDto.setModel(product.getSpecificationModel());
+ modelDto.setUnit(product.getUnit());
+ modelDto.setSubUnit(product.getUnit());
+ product.setProductModelId(productModelAnticlockwise(modelDto));
+
+ product.setRegister(loginUser.getNickName());
+ product.setRegisterDate(LocalDateTime.now());
+ product.setApproveStatus(0);
+ product.setPendingTicketsTotal(productDto.getTaxInclusiveTotalPrice());
+ product.setIsChecked(productDto.getIsChecked() == 1);
+
+ if (productDto.getIsChecked() == 1) {
+ addQualityInspect(purchaseLedger, product);
+ }
+ salesLedgerProductMapper.insert(product);
+ }
+
+ addApproveByPurchase(loginUser, purchaseLedger);
+ successCount++;
+
+ } catch (Exception e) {
+ log.error("绗瑊}琛岄噰璐崟[{}]瀵煎叆澶辫触锛歿}", rowNum, importDto.getPurchaseContractNumber(), e.getMessage(), e);
+ errorMessages.add(String.format("绗�%d琛岄噰璐崟[%s]锛氬け璐�-%s", rowNum, importDto.getPurchaseContractNumber(), e.getMessage()));
+ skipCount++;
}
- // 閲囪喘瀹℃牳
- addApproveByPurchase(loginUser,salesLedger);
}
- return AjaxResult.success("瀵煎叆鎴愬姛");
+ String message = String.format("瀵煎叆瀹屾垚锛佹垚鍔�%d鏉★紝璺宠繃%d鏉�", successCount, skipCount);
+ if (!errorMessages.isEmpty()) {
+ message += "銆傞敊璇鎯咃細" + String.join("锛�", errorMessages);
+ }
+ return AjaxResult.success(message);
} catch (Exception e) {
- e.printStackTrace();
+ log.error("閲囪喘瀵煎叆寮傚父", e);
+ return AjaxResult.error("瀵煎叆澶辫触锛�" + e.getMessage());
}
- return AjaxResult.success("瀵煎叆澶辫触");
+ }
+
+ public Long productModelAnticlockwise(ProductModelAnticlockwiseDto productModelDto) {
+ ProductModel oldProductModel = productModelMapper.selectOldProductModel(productModelDto.getModel(), productModelDto.getProductName());
+ //瀛樺湪灏辨洿鏂�
+ if (oldProductModel != null) {
+ oldProductModel.setModel(productModelDto.getModel());
+ oldProductModel.setUnit(productModelDto.getUnit());
+ oldProductModel.setSubUnit(productModelDto.getSubUnit());
+ oldProductModel.setDeptId(SecurityUtils.getDeptId()[0]);
+ productModelMapper.updateById(oldProductModel);
+ Product product = productMapper.selectById(oldProductModel.getProductId());
+ product.setProductName(productModelDto.getProductName());
+ productMapper.updateById(product);
+ return oldProductModel.getId();
+ }else {
+ //鎵惧埌鐖惰妭鐐�
+ Product productParent = productMapper.selectOne(new QueryWrapper<Product>().lambda().eq(Product::getProductName, "鍘熸枡").last("limit 1"));
+ if (ObjectUtils.isEmpty(productParent)) {
+ Product product = new Product();
+ product.setProductName("鍘熸枡");
+ product.setDeptId(SecurityUtils.getDeptId()[0]);
+ productMapper.insert(product);
+ productParent.setId(product.getId());
+ }
+ //鏂板浜у搧澶х被
+ Product product = new Product();
+ product.setProductName(productModelDto.getProductName());
+ product.setParentId(productParent.getId());
+ product.setDeptId(SecurityUtils.getDeptId()[0]);
+ productMapper.insert( product);
+ //鏂板浜у搧瑙勬牸
+ ProductModel productModel = new ProductModel();
+ productModel.setProductId(product.getId());
+ productModel.setModel(productModelDto.getModel());
+ productModel.setUnit(productModelDto.getUnit());
+ productModel.setSubUnit(productModelDto.getSubUnit());
+ productModel.setDeptId(SecurityUtils.getDeptId()[0]);
+ productModelMapper.insert(productModel);
+ return productModel.getId();
+
+ }
}
@Override
--
Gitblit v1.9.3