新购列表接口优化

This commit is contained in:
sxu 2024-11-08 15:51:14 +08:00
parent 9411a2777f
commit f4f830d7ff
3 changed files with 55 additions and 57 deletions

View File

@ -20,7 +20,7 @@ public interface PurchaseCheckDetailsMapper {
* @param taskId * @param type 1-验收2-入库 * @param taskId * @param type 1-验收2-入库
* @return String类型多个物资类型根据逗号分割 * @return String类型多个物资类型根据逗号分割
*/ */
String selectMaTypeNameByTaskId(@Param("taskId") Long taskId, @Param("type") String type); String selectMaTypeNameByTaskId(@Param("taskId") Long taskId, @Param("status") String status);
/** /**
@ -35,7 +35,7 @@ public interface PurchaseCheckDetailsMapper {
* 根据任务id查询新购验收任务详细列表--Join查询 * 根据任务id查询新购验收任务详细列表--Join查询
* @param taskId 任务id * @param taskId 任务id
*/ */
List<PurchaseCheckDetails> selectPurchaseCheckDetailsListByTaskId(Long taskId); List<PurchaseCheckDetails> selectPurchaseCheckDetailsListByTaskId(@Param("taskId") Long taskId, @Param("status") String status);
/** /**
* 根据任务id查询新购验收任务详细列表--Join查询 * 根据任务id查询新购验收任务详细列表--Join查询

View File

@ -2,6 +2,7 @@ package com.bonus.material.purchase.service.impl;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -82,65 +83,50 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
/** /**
* 查询新购验收任务列表 * 查询新购验收任务列表
* *
* @param purchaseCheckInfoDto 新购验收任务请求参数 * @param purchaseCheckInfo 新购验收任务请求参数
* @return 新购验收任务 * @return 新购验收任务
*/ */
@Override @Override
public List<PurchaseCheckInfo> selectPurchaseCheckInfoList(PurchaseCheckInfo purchaseCheckInfoDto) { public List<PurchaseCheckInfo> selectPurchaseCheckInfoList(PurchaseCheckInfo purchaseCheckInfo) {
// 查询新购info列表并用stream流过滤掉info列表中空的对象 taskId为空的对象 List<PurchaseCheckInfo> purchaseCheckInfoResult = new ArrayList<>();
List<PurchaseCheckInfo> purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseCheckInfoDto) List<PurchaseCheckInfo> purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseCheckInfo)
.stream() .stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(purchaseCheckInfo -> purchaseCheckInfo.getTaskId() != null) .filter(purchaseInfo -> purchaseInfo.getTaskId() != null)
.collect(Collectors.toList()); .collect(Collectors.toList());
// ----------- for循环开始 ------------- for (PurchaseCheckInfo purchaseInfo : purchaseCheckInfos) {
for (PurchaseCheckInfo purchaseCheckInfo : purchaseCheckInfos) { String purchaseMaName = purchaseCheckDetailsMapper.selectMaTypeNameByTaskId(purchaseInfo.getTaskId(), purchaseCheckInfo.getTaskStatus());
// 查询details表获取详细的采购物资名称 purchaseInfo.setPurchaseMaTypeName(purchaseMaName != null ? purchaseMaName : "");
String purchaseMaName = purchaseCheckDetailsMapper.selectMaTypeNameByTaskId(purchaseCheckInfo.getTaskId(), null); List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(purchaseInfo.getTaskId(), purchaseCheckInfo.getTaskStatus())
purchaseCheckInfo.setPurchaseMaTypeName(purchaseMaName != null ? purchaseMaName : ""); .stream()
.filter(Objects::nonNull)
// 查询details表获取详细的采购物资数量价格 .collect(Collectors.toList());
List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(purchaseCheckInfo.getTaskId()) if (!CollectionUtils.isEmpty(purchaseCheckDetails)) {
.stream() AtomicLong purchaseMaTotalNumber = new AtomicLong(0L);
.filter(Objects::nonNull) AtomicReference<BigDecimal> purchaseMaTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
.collect(Collectors.toList()); // 执行for循环统计采购物资数量价格
for (PurchaseCheckDetails detail : purchaseCheckDetails) {
// 定义初始化统计变量,使用 AtomicLong AtomicBigDecimal 来替代同步块提高性能 if (detail.getPurchaseNum() == null || detail.getPurchasePrice() == null) {
// 采购物资数量 continue;
AtomicLong purchaseMaTotalNumber = new AtomicLong(0L); }
// 采购物资不含税价格 if (detail.getPurchaseNum() < 0 || detail.getPurchasePrice().compareTo(BigDecimal.ZERO) < 0) {
AtomicReference<BigDecimal> purchaseMaTotalPrice = new AtomicReference<>(BigDecimal.ZERO); throw new IllegalArgumentException("采购数量和价格必须为非负数");
}
// 执行for循环统计采购物资数量价格 purchaseMaTotalNumber.addAndGet(detail.getPurchaseNum());
for (PurchaseCheckDetails detail : purchaseCheckDetails) { purchaseMaTotalPrice.updateAndGet(v -> v.add(new BigDecimal(detail.getPurchaseNum()).multiply(detail.getPurchasePrice())));
if (detail.getPurchaseNum() == null || detail.getPurchasePrice() == null) {
continue;
} }
if (detail.getPurchaseNum() < 0 || detail.getPurchasePrice().compareTo(BigDecimal.ZERO) < 0) { purchaseInfo.setPurchaseMaNumber(purchaseMaTotalNumber.get());
throw new IllegalArgumentException("采购数量和价格必须为非负数"); purchaseInfo.setPurchasePrice(purchaseMaTotalPrice.get());
if (purchaseInfo.getTaxRate() != null && purchaseInfo.getPurchasePrice() != null) {
purchaseInfo.setPurchaseTaxPrice(
calculateTaxPrice(purchaseMaTotalPrice.get(), purchaseInfo.getTaxRate())
);
} }
// 原代码块使用sync确保线程安全现更改为AtomicLong来替代同步块 purchaseCheckInfoResult.add(purchaseInfo);
// 统计采购数量
purchaseMaTotalNumber.addAndGet(detail.getPurchaseNum());
// 采购物资数量乘以采购不含税价格
purchaseMaTotalPrice.updateAndGet(v -> v.add(new BigDecimal(detail.getPurchaseNum()).multiply(detail.getPurchasePrice())));
}
// 赋值统计出来的采购物资数量不含税价格
purchaseCheckInfo.setPurchaseMaNumber(purchaseMaTotalNumber.get());
purchaseCheckInfo.setPurchasePrice(purchaseMaTotalPrice.get());
// 通过不含税价格及税率计算出含税价格并赋值
if (purchaseCheckInfo.getTaxRate() != null && purchaseCheckInfo.getPurchasePrice() != null) {
purchaseCheckInfo.setPurchaseTaxPrice(
calculateTaxPrice(purchaseMaTotalPrice.get(), purchaseCheckInfo.getTaxRate())
);
} }
} }
// ------------- for循环结束 ------------- return purchaseCheckInfoResult;
return purchaseCheckInfos;
} }
/** /**
@ -280,7 +266,7 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
if (result != null) { if (result != null) {
// 执行SQL查询内层信息 // 执行SQL查询内层信息
List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(taskId); List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(taskId, null);
// 过滤掉空数据 // 过滤掉空数据
purchaseCheckDetails.removeIf(Objects::isNull); purchaseCheckDetails.removeIf(Objects::isNull);
result.setMaterialList(purchaseCheckDetails); result.setMaterialList(purchaseCheckDetails);

View File

@ -85,9 +85,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id} where id = #{id}
</select> </select>
<select id="selectPurchaseCheckDetailsListByTaskId" parameterType="Long" resultMap="PurchaseCheckDetailsResult"> <select id="selectPurchaseCheckDetailsListByTaskId" resultMap="PurchaseCheckDetailsResult">
<include refid="selectPurchaseCheckDetailsJoinVo"/> <include refid="selectPurchaseCheckDetailsJoinVo"/>
where pcd.task_id = #{taskId} where 1=1
<if test="status != null">
and pcd.status = #{status}
</if>
<if test="taskId != null">
and pcd.task_id = #{taskId}
</if>
</select> </select>
<select id="selectPurchaseCheckDetailsListByQueryDto" parameterType="com.bonus.material.purchase.domain.dto.PurchaseQueryDto" resultMap="PurchaseCheckDetailsResult"> <select id="selectPurchaseCheckDetailsListByQueryDto" parameterType="com.bonus.material.purchase.domain.dto.PurchaseQueryDto" resultMap="PurchaseCheckDetailsResult">
@ -239,7 +245,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join left join
ma_type mt1 on mt.parent_id = mt1.type_id ma_type mt1 on mt.parent_id = mt1.type_id
where where
pcd.task_id = #{taskId} 1=1
<if test="status != null">
and pcd.status = #{status}
</if>
<if test="taskId != null">
and pcd.task_id = #{taskId}
</if>
) t ) t
GROUP BY task_id GROUP BY task_id
</select> </select>