diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java index 4f23e0bf..1046e808 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java @@ -22,6 +22,12 @@ public interface SignProcessMapper */ List getPurchaseSignRecordByTask(Long taskId); + /** + * 批量查询采购任务的会签记录 + * @param taskIds 任务id列表 + */ + List getPurchaseSignRecordByTasksBatch(List taskIds); + /** * 查询采新购验收任务已进行会签的签名地址 * @param taskId 任务id diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java index a50f18f6..6fa86bfe 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java @@ -24,6 +24,14 @@ public interface PurchaseCheckDetailsMapper { String selectMaTypeNameByTaskAndStatusList(@Param("taskId") Long taskId, @Param("statusList") List statusList); + /** + * 批量查询任务的物资类型名称 + * + * @param taskIds 任务ID列表 + * @param statusList 状态列表 + * @return Map 任务ID对应的物资类型名称 + */ + List selectMaTypeNameByTaskIdsBatch(@Param("taskIds") List taskIds, @Param("statusList") List statusList); /** * 查询新购验收任务详细 @@ -39,6 +47,13 @@ public interface PurchaseCheckDetailsMapper { */ List selectPurchaseCheckDetailsListByTaskId(@Param("taskId") Long taskId, @Param("status") Integer status, @Param("userId") Long userId); + /** + * 批量查询多个任务的验收任务详细列表 + * @param taskIds 任务ID列表 + * @param userId 用户ID + */ + List selectPurchaseCheckDetailsListByTaskIdsBatch(@Param("taskIds") List taskIds, @Param("userId") Long userId); + /** * 根据任务id查询新购验收任务详细列表--Join查询 * @param obj 新购验收任务请求参数封装dto diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java index 1fe0e519..8456915a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java @@ -5,8 +5,10 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.stream.Collectors; +import com.bonus.common.biz.config.DateTimeHelper; import com.bonus.common.biz.constant.BmConfigItems; import com.bonus.common.biz.enums.MaTypeManageTypeEnum; import com.bonus.common.biz.enums.PurchaseTaskStageEnum; @@ -186,13 +188,248 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService { } /** - * 查询新购验收任务列表 + * 查询新购验收任务列表 - 性能优化版本 * * @param purchaseQueryDto 新购验收任务请求参数 * @return 新购验收任务 */ @Override public List selectPurchaseCheckInfoList(PurchaseQueryDto purchaseQueryDto) { + log.info("=== MaterialLeaseInfoServiceImpl.selectPurchaseCheckInfoList开始执行,purchaseQueryDto: {}", purchaseQueryDto); + + final List purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseQueryDto); + if (CollectionUtils.isEmpty(purchaseCheckInfos)) { + return Collections.emptyList(); + } + + // 检查 SecurityUtils.getLoginUser() 是否为 null + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + log.error("当前用户未登录或登录信息丢失,无法获取用户ID"); + return Collections.emptyList(); + } + + final Long loginUserId = loginUser.getUserid(); + if (Objects.isNull(loginUserId) || Objects.isNull(purchaseQueryDto.getTaskStage())) { + return Collections.emptyList(); + } + + // 提取所有任务ID,用于批量查询 + List taskIds = purchaseCheckInfos.stream() + .map(PurchaseCheckInfo::getTaskId) + .collect(Collectors.toList()); + + // 批量查询所有任务的明细信息 + List allDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskIdsBatch(taskIds, loginUserId); + Map> detailsMap = allDetails.stream() + .filter(detail -> detail.getTaskId() != null) + .collect(Collectors.groupingBy(PurchaseCheckDetails::getTaskId)); + + // 批量查询任务状态信息 + List tmTasks = tmTaskMapper.selectTmTaskByTaskIdsBatch(taskIds); + Map taskMap = tmTasks.stream() + .filter(task -> task.getTaskId() != null) + .collect(Collectors.toMap(TmTask::getTaskId, Function.identity())); + + // 批量查询物资类型名称 + final boolean isAllowPartTransfer = bmConfigService.isBmConfigEnabledWithDefaultFalse(BmConfigItems.BOOLEAN_ALLOW_PURCHASE_PART_TRANSFER); + List maTypeNames; + if (isAllowPartTransfer) { + maTypeNames = purchaseCheckDetailsMapper.selectMaTypeNameByTaskIdsBatch(taskIds, purchaseQueryDto.getStatusList()); + } else { + maTypeNames = purchaseCheckDetailsMapper.selectMaTypeNameByTaskIdsBatch(taskIds, new ArrayList<>()); + } + Map maTypeNameMap = maTypeNames.stream() + .filter(info -> info.getTaskId() != null) + .collect(Collectors.toMap(PurchaseCheckInfo::getTaskId, + info -> info.getPurchaseMaTypeName() != null ? info.getPurchaseMaTypeName() : "")); + + // 批量查询会签记录 + List allSignRecords = signProcessMapper.getPurchaseSignRecordByTasksBatch(taskIds); + Map> signRecordsMap = allSignRecords.stream() + .filter(record -> record.getTaskId() != null) + .collect(Collectors.groupingBy(PurchaseSignRecord::getTaskId)); + + // 查询会签配置(这个查询量小,可以保持原样) + List signProcessVoList = signProcessMapper.getList(new SignProcessVo()); + + List purchaseCheckInfoResult = new ArrayList<>(); + + for (final PurchaseCheckInfo purchaseInfo : purchaseCheckInfos) { + Long taskId = purchaseInfo.getTaskId(); + + // 获取采购物资明细 + List purchaseCheckDetails = detailsMap.getOrDefault(taskId, Collections.emptyList()); + if (CollectionUtils.isEmpty(purchaseCheckDetails)) { + continue; + } + + // 过滤掉数量管理并且是待绑定状态或者驳回后待绑定状态的物资 + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !(MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(o.getManageType()) && + (o.getStatus().equals(PurchaseTaskStatusEnum.TO_BIND.getStatus()) || + o.getStatus().equals(PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus())))).collect(Collectors.toList()); + + if (isAllowPartTransfer) { + // 根据任务阶段过滤 + switch (purchaseQueryDto.getTaskStage()) { + case PURCHASE_TASK_STAGE_MANAGE: + // 新购管理阶段展示全部任务、不进行过滤 + break; + case PURCHASE_TASK_STAGE_CHECK: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus())).collect(Collectors.toList()); + break; + case PURCHASE_TASK_STAGE_BIND: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus().equals(o.getStatus()) + ).collect(Collectors.toList()); + break; + case PURCHASE_TASK_STAGE_STORE: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + PurchaseTaskStatusEnum.IN_STORE.getStatus().equals(o.getStatus()) || + PurchaseTaskStatusEnum.TO_STORE.getStatus().equals(o.getStatus()) || + PurchaseTaskStatusEnum.TASK_FINISHED.getStatus().equals(o.getStatus()) || + (PurchaseTaskStatusEnum.TO_BIND.getStatus().equals(o.getStatus()) && null != o.getBindNum() && 0 < o.getBindNum().compareTo(BigDecimal.ZERO)) || + (PurchaseTaskStatusEnum.TO_STORE_AFTER_REJECT.getStatus().equals(o.getStatus()) && null != o.getBindNum() && 0 < o.getBindNum().compareTo(BigDecimal.ZERO)) + ).collect(Collectors.toList()); + break; + default: + System.err.println("未知的新购任务阶段:" + purchaseQueryDto.getTaskStage()); + return Collections.emptyList(); + } + } + + // 设置物资类型名称 + purchaseInfo.setPurchaseMaTypeName(maTypeNameMap.get(taskId)); + + if (!CollectionUtils.isEmpty(purchaseCheckDetails)) { + // 计算数量和金额 + BigDecimal purchaseMaTotalNumber = BigDecimal.ZERO; + BigDecimal checkMaTotalNumber = BigDecimal.ZERO; + BigDecimal bindMaTotalNumber = BigDecimal.ZERO; + BigDecimal inputMaTotalNumber = BigDecimal.ZERO; + BigDecimal purchaseMaTotalPrice = BigDecimal.ZERO; + BigDecimal purchaseTaxPriceTotal = BigDecimal.ZERO; + + boolean isIncludeStage = false; + for (final PurchaseCheckDetails detail : purchaseCheckDetails) { + if (null == detail.getPurchaseNum() || null == detail.getPurchasePrice()) { + continue; + } + if (0 > detail.getPurchaseNum().compareTo(BigDecimal.ZERO) || 0 > detail.getPurchasePrice().compareTo(BigDecimal.ZERO)) { + throw new IllegalArgumentException("采购数量和价格必须为非负数"); + } + if (!isIncludeStage) { + isIncludeStage = PurchaseTaskStatusEnum.isStatusOfStage(detail.getStatus(), PurchaseTaskStageEnum.getByCode(purchaseQueryDto.getTaskStage()), detail.getManageType()); + } + + purchaseMaTotalNumber = purchaseMaTotalNumber.add(Optional.of(detail.getPurchaseNum()).orElse(BigDecimal.ZERO)); + checkMaTotalNumber = checkMaTotalNumber.add(Optional.ofNullable(detail.getCheckNum()).orElse(BigDecimal.ZERO)); + bindMaTotalNumber = bindMaTotalNumber.add(Optional.ofNullable(detail.getBindNum()).orElse(BigDecimal.ZERO)); + inputMaTotalNumber = inputMaTotalNumber.add(Optional.ofNullable(detail.getInputNum()).orElse(BigDecimal.ZERO)); + purchaseMaTotalPrice = purchaseMaTotalPrice.add(detail.getPurchaseNum().multiply(detail.getPurchasePrice()).setScale(10, RoundingMode.HALF_DOWN)); + purchaseTaxPriceTotal = purchaseTaxPriceTotal.add(detail.getPurchaseNum().multiply(detail.getPurchaseTaxPrice()).setScale(10, RoundingMode.HALF_DOWN)); + } + + purchaseInfo.setPurchaseMaNumber(purchaseMaTotalNumber); + purchaseInfo.setPurchasePrice(purchaseMaTotalPrice); + purchaseInfo.setPurchaseTaxPrice(purchaseTaxPriceTotal); + purchaseInfo.setBindMaNumber(bindMaTotalNumber); + purchaseInfo.setCheckMaNumber(checkMaTotalNumber); + purchaseInfo.setInputMaNumber(inputMaTotalNumber); + purchaseInfo.setWaitInputNumber(purchaseMaTotalNumber.subtract(inputMaTotalNumber)); + + // 设置任务状态 + final TmTask tmTask = taskMap.get(taskId); + purchaseInfo.setTaskStatusName(isIncludeStage ? "未完成" : "已完成"); + if (null != purchaseQueryDto.getIsFinish()) { + if (1 == purchaseQueryDto.getIsFinish()) { + if (isIncludeStage) {continue;} + } else { + if (!isIncludeStage) {continue;} + } + } + + // 设置采购状态 + List statusList = purchaseCheckDetails.stream() + .map(PurchaseCheckDetails::getStatus) + .collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(statusList)) { + if (statusList.contains(PurchaseTaskStatusEnum.TO_BIND.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_STORE.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_STORE_AFTER_REJECT.getStatus())) { + purchaseInfo.setPurchaseStatus(PurchaseTaskStatusEnum.TO_BIND.getStatus()); + } else if (statusList.contains(PurchaseTaskStatusEnum.IN_STORE.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TASK_IN_PROGRESS.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TASK_FINISHED.getStatus())) { + purchaseInfo.setPurchaseStatus(PurchaseTaskStatusEnum.IN_STORE.getStatus()); + } else { + purchaseInfo.setPurchaseStatus(0); + } + } + + if (tmTask != null) { + purchaseInfo.setTaskStatus(tmTask.getTaskStatus()); + } + + // 检查是否应该加入结果列表 + if (isAllowPartTransfer) { + purchaseCheckInfoResult.add(purchaseInfo); + } else { + final OptionalInt minStatus = purchaseCheckDetails.stream().mapToInt(PurchaseCheckDetails::getStatus).min(); + if (minStatus.isPresent() && purchaseQueryDto.getStatusList().contains(minStatus.getAsInt())) { + purchaseCheckInfoResult.add(purchaseInfo); + } + } + } + } + + if (!CollectionUtils.isEmpty(purchaseCheckInfoResult)) { + // 设置会签级别 + for (PurchaseCheckInfo purchaseCheckInfo : purchaseCheckInfoResult) { + List purchaseSignRecordList = signRecordsMap.getOrDefault(purchaseCheckInfo.getTaskId(), Collections.emptyList()); + + if (!CollectionUtils.isEmpty(purchaseSignRecordList) && !CollectionUtils.isEmpty(signProcessVoList)) { + Set configSignOrgSet = signProcessVoList.stream().map(SignProcessVo::getOrgId).collect(Collectors.toSet()); + Set signedOrgSet = purchaseSignRecordList.stream().map(PurchaseSignRecord::getOrgId).collect(Collectors.toSet()); + configSignOrgSet.removeAll(signedOrgSet); + + if (signedOrgSet.size() == 1) { + purchaseCheckInfo.setSignLevel("2"); + } else { + purchaseCheckInfo.setSignLevel("3"); + } + } + } + + // 关键字过滤 + String keyWord = purchaseQueryDto.getKeyWord(); + if (!StringUtils.isBlank(keyWord)) { + purchaseCheckInfoResult = purchaseCheckInfoResult.stream() + .filter(item -> containsKeyword(item, keyWord)) + .collect(Collectors.toList()); + } + } + + return purchaseCheckInfoResult; + } + + /** + * 查询新购验收任务列表 - 原始版本(保留作为备份) + * + * @param purchaseQueryDto 新购验收任务请求参数 + * @return 新购验收任务 + */ + public List selectPurchaseCheckInfoListOriginal(PurchaseQueryDto purchaseQueryDto) { + log.info("=== MaterialLeaseInfoServiceImpl.selectPurchaseCheckInfoList开始执行,purchaseQueryDto: {}", purchaseQueryDto); + final List purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseQueryDto); if (CollectionUtils.isEmpty(purchaseCheckInfos)) { return Collections.emptyList(); @@ -226,9 +463,6 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService { if (isAllowPartTransfer) { // 2024-12-23日 取消状态过滤,修改由任务阶段来过滤 --- by 阮世耀 -// if (!CollectionUtils.isEmpty(purchaseQueryDto.getStatusList())) { -// purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> purchaseQueryDto.getStatusList().contains(o.getStatus())).collect(Collectors.toList()); -// } switch (purchaseQueryDto.getTaskStage()) { case PURCHASE_TASK_STAGE_MANAGE: // 新购管理阶段展示全部任务、不进行过滤 diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java index e8596e63..0d10ea28 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java @@ -22,6 +22,14 @@ public interface TmTaskMapper { */ TmTask selectTmTaskByTaskId(Long taskId); + /** + * 批量查询任务 + * + * @param taskIds 任务主键列表 + * @return 任务列表 + */ + List selectTmTaskByTaskIdsBatch(List taskIds); + /** * 查询当年当月最大任务序号,用于生成任务编号 by 分类型查询 * @param year 年 diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml index 5e59e7c9..2e3a4e1e 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml @@ -179,6 +179,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" par.task_id = #{taskId} + + + insert into purchase_audit_record(task_id, auditor, audit_time, audit_status, org_id, creator, create_time, audit_remark) values(#{taskId}, #{userId}, #{createTime}, #{auditStatus} ,#{orgId}, #{userId}, #{createTime}, #{auditRemark}) diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml index 4e11cf99..206ca029 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml @@ -295,6 +295,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY task_id + + + + + + insert into purchase_check_details(task_id,type_id,purchase_price,purchase_tax_price, purchase_num,check_num,bind_num,check_result,supplier_id, diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml index 0120c985..4a7cf37a 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml @@ -41,6 +41,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where task_id = #{taskId} + + + insert into tm_task