refactor(sip): 重构订单配置信息导入逻辑

- 移除了 ProjectInfoMapper.xml 中的 province 字段映射
- 优化了 ProjectOrderConfigInfoServiceImpl 中的导入逻辑
- 增加了对产品库中不存在的产品的处理
- 改进了对折扣、单价和数量的校验- 优化了数据插入流程,提高了导入效率
master
chenhao 2025-06-04 14:13:02 +08:00
parent 1aad3630db
commit fd4dc6ce4d
2 changed files with 46 additions and 28 deletions

View File

@ -1,9 +1,13 @@
package com.ruoyi.sip.service.impl;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
@ -11,10 +15,13 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.ProductInfo;
import com.ruoyi.sip.domain.ProjectOrderFileLog;
import com.ruoyi.sip.service.IProductInfoService;
import com.ruoyi.sip.service.IProjectOrderFileLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -25,6 +32,8 @@ import com.ruoyi.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* Service
*
@ -34,11 +43,13 @@ import org.springframework.web.multipart.MultipartFile;
@Service
@Transactional(rollbackFor = Exception.class)
public class ProjectOrderConfigInfoServiceImpl implements IProjectOrderConfigInfoService {
@Autowired
@Resource
private ProjectOrderConfigInfoMapper projectOrderConfigInfoMapper;
@Autowired
private IProjectOrderFileLogService fileLogService;
@Autowired
private IProductInfoService productInfoService;
/**
*
@ -117,8 +128,37 @@ public class ProjectOrderConfigInfoServiceImpl implements IProjectOrderConfigInf
throw new ServiceException("导入失败,读取文件错误");
}
//只处理当前产品表有的数据
List<ProductInfo> productInfos = productInfoService.selectProductInfoList(new ProductInfo());
Map<String, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.toMap(ProductInfo::getProductCode, Function.identity(), (v1, v2) -> v1));
orderConfigInfoList = orderConfigInfoList.stream().filter(item -> item != null && StringUtils.isNotEmpty(item.getProductCode())
&& productInfoMap.containsKey(item.getProductBomCode()))
.collect(Collectors.toList());
//todo 需要产品型号和产品编码 使用或匹配
if (CollUtil.isEmpty(orderConfigInfoList)) {
return AjaxResult.error("文件为空或产品不在产品库中");
}
for (ProjectOrderConfigInfo configInfo : orderConfigInfoList) {
configInfo.setOrderId(orderId);
if (configInfo.getGuidanceDiscount() != null && (configInfo.getGuidanceDiscount().compareTo(BigDecimal.ONE) > 0 || configInfo.getGuidanceDiscount().compareTo(BigDecimal.ZERO) <= 0)) {
return AjaxResult.error("折扣区间需在0-1之间");
}
if (configInfo.getDiscount() == null){
configInfo.setDiscount(configInfo.getGuidanceDiscount());
}
if (configInfo.getCataloguePrice() == null) {
return AjaxResult.error("单价不能为空");
}
if (configInfo.getQuantity() == null) {
return AjaxResult.error("数量不能为空");
}
configInfo.setPrice(configInfo.getCataloguePrice().multiply(configInfo.getDiscount()).setScale(2, RoundingMode.HALF_UP));
configInfo.setAllPrice(configInfo.getPrice().multiply(BigDecimal.valueOf(configInfo.getQuantity())).setScale(2, RoundingMode.HALF_UP));
configInfo.setCatalogueAllPrice(configInfo.getCataloguePrice().multiply(BigDecimal.valueOf(configInfo.getQuantity())).setScale(2, RoundingMode.HALF_UP));
}
//保存文件
fileLogService.deleteProjectOrderFileLogByOrderIdList(Collections.singletonList( orderId));
fileLogService.deleteProjectOrderFileLogByOrderIdList(Collections.singletonList(orderId));
ProjectOrderFileLog projectOrderFileLog = new ProjectOrderFileLog();
try {
String upload = FileUploadUtils.upload(file);
@ -126,6 +166,8 @@ public class ProjectOrderConfigInfoServiceImpl implements IProjectOrderConfigInf
} catch (IOException e) {
throw new ServiceException("导入失败,上传文件错误");
}
projectOrderConfigInfoMapper.insertBatch(orderConfigInfoList);
//保存文件
projectOrderFileLog.setFileName(file.getOriginalFilename());
projectOrderFileLog.setFileType(ProjectOrderFileLog.FileTypeEnum.CONFIG.getCode());
projectOrderFileLog.setOrderId(orderId);
@ -133,30 +175,6 @@ public class ProjectOrderConfigInfoServiceImpl implements IProjectOrderConfigInf
projectOrderFileLog.setUploadUser(ShiroUtils.getUserId().toString());
fileLogService.insertProjectOrderFileLog(projectOrderFileLog);
if (CollUtil.isEmpty(orderConfigInfoList)) {
return AjaxResult.error("文件为空");
}
List<String> productCodeList = orderConfigInfoList.stream().map(ProjectOrderConfigInfo::getProductCode).filter(Objects::nonNull).collect(Collectors.toList());
if (productCodeList.isEmpty()) {
return AjaxResult.error("文件为空或产品编码为空");
}
// List<OrderList> orderLists = infoMapper.listOrderListByDeliveryId(deliveryId);
// if (orderLists.isEmpty()) {
// return AjaxResult.error("发货单中没有产品");
// }
// List<String> existsProductCodeList = orderLists.stream().map(OrderList::getProductCode).collect(Collectors.toList());
// List<String> notExistsProductCodeList = productCodeList.stream().filter(productCode -> !existsProductCodeList.contains(productCode)).distinct().collect(Collectors.toList());
// if (!notExistsProductCodeList.isEmpty()) {
// return AjaxResult.error(StringUtils.format("编码为[{}]的产品在合同请单中未找到,请确认后重试;", String.join(",", notExistsProductCodeList)));
// }
for (ProjectOrderConfigInfo configInfo : orderConfigInfoList) {
configInfo.setOrderId(orderId);
}
projectOrderConfigInfoMapper.insertBatch(orderConfigInfoList);
return AjaxResult.success("导入成功");
}

View File

@ -11,7 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="customerCode" column="customer_code" />
<result property="customerName" column="customer_name" />
<result property="industryType" column="industry_type" />
<result property="province" column="province" />
<result property="projectStage" column="project_stage" />
<result property="projectGraspDegree" column="project_grasp_degree" />
<result property="hzSupportUser" column="hz_support_user" />
@ -83,7 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="customerName != null and customerName != ''"> and t1.customer_name like concat('%', #{customerName}, '%')</if>
<if test="industryType != null and industryType != ''"> and t1.industry_type = #{industryType}</if>
<if test="bgProperty != null and bgProperty != ''"> and t1.bg_property = #{bgProperty}</if>
<if test="province != null and province != ''"> and t1.province = #{province}</if>
<if test="projectStage != null and projectStage != ''"> and t1.project_stage = #{projectStage}</if>
<if test="projectGraspDegree != null and projectGraspDegree != ''"> and t1.project_grasp_degree = #{projectGraspDegree}</if>
<if test="hzSupportUser != null and hzSupportUser != ''"> and t1.hz_support_user = #{hzSupportUser}</if>