From d8dc3a5ad5d2109e7ad3a5aca74a48037a724c25 Mon Sep 17 00:00:00 2001 From: syruan <15555146157@163.com> Date: Fri, 5 Sep 2025 15:52:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B7=A8=E5=8C=BA=E9=97=B4?= =?UTF-8?q?=E7=A7=9F=E8=B5=81=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -优化了 SltAgreementInfoMapper.xml 中的时间范围过滤逻辑,增加了对跨区间租赁的处理 - 更新了 SltAgreementInfoServiceImpl 中的数据过滤方法,与 SQL逻辑保持一致 - 通过多种情况判断,准确筛选出与查询区间有交集的租赁记录 --- .../impl/SltAgreementInfoServiceImpl.java | 69 +++++++++++++++---- .../settlement/SltAgreementInfoMapper.xml | 34 ++++++--- 2 files changed, 80 insertions(+), 23 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java index 3b5bcaef..f3dab667 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java @@ -1145,19 +1145,19 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { queryDto.setSltManageType(settlementType); } - // 从数据库查询基础数据 + // 从数据库查询【基础数据】 List rawResults = sltAgreementInfoMapper.selectLeasePeriodCostList(queryDto); - // 从数据库查询冲账数据,冲账查询的时候直接过滤了协议和限制具体日期,所以不需要再进行范围过滤 + // 从数据库查询【冲账数据】,冲账查询的时候直接过滤了协议和限制具体日期,所以不需要再进行范围过滤 List markResults = sltAgreementInfoMapper.selectPeriodCostListForCharge(queryDto); - // 先过滤掉不在查询范围内的数据 + // 先过滤掉【基础数据】不在查询范围内的数据 List filteredResults = filterDataInRange(rawResults, queryDto.getStartDate(), queryDto.getEndDate()); // 进行时间及费用计算统计 List periodCostResultVos = calculatePeriodCosts(filteredResults, queryDto.getStartDate(), queryDto.getEndDate()); - // 添加冲账数据 + // 冲账数据不进行计算,直接计入结果 periodCostResultVos.addAll(markResults); // 返回结果 @@ -1175,8 +1175,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { * @param inputEndDate 前端输入的结束日期 * @return 过滤后的结果列表 */ - private List filterDataInRange(List rawResults, - Date inputStartDate, Date inputEndDate) { + private List filterDataInRange(List rawResults, Date inputStartDate, Date inputEndDate) { List filteredResults = new ArrayList<>(); for (PeriodCostResultVo result : rawResults) { @@ -1189,7 +1188,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { } /** - * 判断数据是否在查询范围内 + * 判断数据是否在查询范围内(与SQL逻辑保持一致) * * @param result 数据记录 * @param inputStartDate 前端输入的开始日期 @@ -1200,19 +1199,59 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { Date leaseStartTime = result.getStartTime(); // 领料时间 Date returnTime = result.getEndTime(); // 退料时间 Date settlementTime = result.getSettlementTime(); // 结算时间 - String status = result.getStatus(); // 状态 + String status = result.getStatus(); // 设备状态 // 如果是已结算协议 - boolean leaseInRange = isDateInRange(leaseStartTime, inputStartDate, inputEndDate); - boolean returnInRange = isDateInRange(returnTime, inputStartDate, inputEndDate); if ("1".equals(result.getIsSettled())) { - // 检查领料时间、退料时间、结算时间是否有任何一个在查询范围内 - boolean settlementInRange = isDateInRange(settlementTime, inputStartDate, inputEndDate); - return leaseInRange || returnInRange || settlementInRange; + // 情况1:领料时间在查询区间内 + if (isDateInRange(leaseStartTime, inputStartDate, inputEndDate)) { + return true; + } + + // 情况2:退料时间在查询区间内 + if (isDateInRange(returnTime, inputStartDate, inputEndDate)) { + return true; + } + + // 情况3:结算时间在查询区间内 + if (isDateInRange(settlementTime, inputStartDate, inputEndDate)) { + return true; + } + + // 情况4:跨区间租赁(领料在区间前,退料/结算在区间后) + if (leaseStartTime != null && leaseStartTime.before(inputStartDate)) { + if ((returnTime != null && returnTime.after(inputEndDate)) || + (settlementTime != null && settlementTime.after(inputEndDate))) { + return true; + } + } + + return false; } else { // 如果是未结算协议 - // 检查领料时间、退料时间是否有任何一个在查询范围内、或者是在用状态的设备(未退还) - return leaseInRange || returnInRange || ("0").equals(status); + // 情况1:领料时间在查询区间内 + if (isDateInRange(leaseStartTime, inputStartDate, inputEndDate)) { + return true; + } + + // 情况2:退料时间在查询区间内 + if (isDateInRange(returnTime, inputStartDate, inputEndDate)) { + return true; + } + + // 情况3:跨区间租赁(领料在区间前,退料在区间后或未退料) + if (leaseStartTime != null && leaseStartTime.before(inputStartDate)) { + if (returnTime == null || returnTime.after(inputEndDate)) { + return true; + } + } + + // 情况4:设备状态为在用(未退料)且领料时间不晚于查询结束时间 + if ("0".equals(status) && leaseStartTime != null && !leaseStartTime.after(inputEndDate)) { + return true; + } + + return false; } } diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml index 949f490f..a0d76323 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml @@ -1192,20 +1192,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND bai.company_id = #{companyId} - + AND ( - + (bai.is_slt = 1 AND ( + (sai.start_time IS NOT NULL AND sai.start_time BETWEEN #{startDate} AND #{endDate}) - OR (sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate}) - OR (sai.slt_time IS NOT NULL AND sai.slt_time BETWEEN #{startDate} AND #{endDate}) + OR + + (sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate}) + OR + + (sai.slt_time IS NOT NULL AND sai.slt_time BETWEEN #{startDate} AND #{endDate}) + OR + + (sai.start_time IS NOT NULL AND sai.start_time < #{startDate} AND + ((sai.end_time IS NOT NULL AND sai.end_time > #{endDate}) OR + (sai.slt_time IS NOT NULL AND sai.slt_time > #{endDate}))) )) OR - - ((bai.is_slt = 0 or bai.is_slt IS NULL) AND ( + + ((bai.is_slt = 0 OR bai.is_slt IS NULL) AND ( + (sai.start_time IS NOT NULL AND sai.start_time BETWEEN #{startDate} AND #{endDate}) - OR (sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate}) - OR (sai.status = '0') + OR + + (sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate}) + OR + + (sai.start_time IS NOT NULL AND sai.start_time < #{startDate} AND (sai.end_time IS NULL OR sai.end_time > #{endDate})) + OR + + (sai.status = '0' AND sai.start_time IS NOT NULL AND sai.start_time <= #{endDate}) )) )