修复跨区间租赁数据统计问题
-优化了 SltAgreementInfoMapper.xml 中的时间范围过滤逻辑,增加了对跨区间租赁的处理 - 更新了 SltAgreementInfoServiceImpl 中的数据过滤方法,与 SQL逻辑保持一致 - 通过多种情况判断,准确筛选出与查询区间有交集的租赁记录
This commit is contained in:
parent
fdd2df4576
commit
d8dc3a5ad5
|
|
@ -1145,19 +1145,19 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService {
|
|||
queryDto.setSltManageType(settlementType);
|
||||
}
|
||||
|
||||
// 从数据库查询基础数据
|
||||
// 从数据库查询【基础数据】
|
||||
List<PeriodCostResultVo> rawResults = sltAgreementInfoMapper.selectLeasePeriodCostList(queryDto);
|
||||
|
||||
// 从数据库查询冲账数据,冲账查询的时候直接过滤了协议和限制具体日期,所以不需要再进行范围过滤
|
||||
// 从数据库查询【冲账数据】,冲账查询的时候直接过滤了协议和限制具体日期,所以不需要再进行范围过滤
|
||||
List<PeriodCostResultVo> markResults = sltAgreementInfoMapper.selectPeriodCostListForCharge(queryDto);
|
||||
|
||||
// 先过滤掉不在查询范围内的数据
|
||||
// 先过滤掉【基础数据】不在查询范围内的数据
|
||||
List<PeriodCostResultVo> filteredResults = filterDataInRange(rawResults, queryDto.getStartDate(), queryDto.getEndDate());
|
||||
|
||||
// 进行时间及费用计算统计
|
||||
List<PeriodCostResultVo> periodCostResultVos = calculatePeriodCosts(filteredResults, queryDto.getStartDate(), queryDto.getEndDate());
|
||||
|
||||
// 添加冲账数据
|
||||
// 冲账数据不进行计算,直接计入结果
|
||||
periodCostResultVos.addAll(markResults);
|
||||
|
||||
// 返回结果
|
||||
|
|
@ -1175,8 +1175,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService {
|
|||
* @param inputEndDate 前端输入的结束日期
|
||||
* @return 过滤后的结果列表
|
||||
*/
|
||||
private List<PeriodCostResultVo> filterDataInRange(List<PeriodCostResultVo> rawResults,
|
||||
Date inputStartDate, Date inputEndDate) {
|
||||
private List<PeriodCostResultVo> filterDataInRange(List<PeriodCostResultVo> rawResults, Date inputStartDate, Date inputEndDate) {
|
||||
List<PeriodCostResultVo> 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1192,20 +1192,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="companyId != null">
|
||||
AND bai.company_id = #{companyId}
|
||||
</if>
|
||||
<!-- 数据库层面的时间范围过滤 -->
|
||||
<!-- 数据库层面的时间范围过滤 - 修正跨区间租赁逻辑 -->
|
||||
AND (
|
||||
<!-- 已结算协议:领料时间、退料时间、结算时间中至少有一个在查询范围内 -->
|
||||
<!-- 已结算协议:租赁期间与查询区间有交集 -->
|
||||
(bai.is_slt = 1 AND (
|
||||
<!-- 情况1:领料时间在查询区间内 -->
|
||||
(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
|
||||
<!-- 情况2:退料时间在查询区间内 -->
|
||||
(sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate})
|
||||
OR
|
||||
<!-- 情况3:结算时间在查询区间内 -->
|
||||
(sai.slt_time IS NOT NULL AND sai.slt_time BETWEEN #{startDate} AND #{endDate})
|
||||
OR
|
||||
<!-- 情况4:跨区间租赁(领料在区间前,退料/结算在区间后) -->
|
||||
(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 (
|
||||
<!-- 情况1:领料时间在查询区间内 -->
|
||||
(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
|
||||
<!-- 情况2:退料时间在查询区间内 -->
|
||||
(sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate})
|
||||
OR
|
||||
<!-- 情况3:跨区间租赁(领料在区间前,退料在区间后或未退料) -->
|
||||
(sai.start_time IS NOT NULL AND sai.start_time < #{startDate} AND (sai.end_time IS NULL OR sai.end_time > #{endDate}))
|
||||
OR
|
||||
<!-- 情况4:设备状态为在用(未退料)且领料时间不晚于查询结束时间 -->
|
||||
(sai.status = '0' AND sai.start_time IS NOT NULL AND sai.start_time <= #{endDate})
|
||||
))
|
||||
)
|
||||
</where>
|
||||
|
|
|
|||
Loading…
Reference in New Issue