|
|
@@ -838,24 +838,34 @@ public class contractServiceAdj {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 将合同服务的采购成本按照服务周期进行分摊处理。
|
|
|
+ * <p>
|
|
|
+ * 该方法根据合同服务ID查询相关的付款计划和服务周期数据,
|
|
|
+ * 并根据不同服务类型(如一次性收费或分期服务)将付款金额分摊至各个服务周期中。
|
|
|
+ * 分摊结果会更新到服务周期表中的 PERIOD_COST 字段。
|
|
|
+ *
|
|
|
+ * @param uc 当前用户上下文信息,用于权限控制等用途(当前未使用)
|
|
|
+ * @param contractServiceId 合同服务ID,作为主键用于查询相关数据
|
|
|
+ */
|
|
|
//合同服务采购成本平摊到服务周期上面
|
|
|
public void paySplitServiceMonth(UserContext uc, String contractServiceId) {
|
|
|
|
|
|
RowMap service = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE where ID=?", new Object[]{contractServiceId});
|
|
|
|
|
|
- //付款计划
|
|
|
+ // 查询与该合同服务关联的所有付款计划,并按开始时间排序
|
|
|
List<RowMap> payPlanList = DBSql.getMaps("select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
|
|
|
|
|
|
if (payPlanList.isEmpty() || payPlanList.size() == 0)
|
|
|
return;
|
|
|
|
|
|
- //收款
|
|
|
+ // 查询与该合同服务对应的服务周期记录,并按开始时间排序
|
|
|
List<RowMap> contractServicePeriodList = DBSql.getMaps("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
|
|
|
|
|
|
if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0)
|
|
|
return;
|
|
|
|
|
|
- //服务:一次性收费
|
|
|
+ // 处理“一次性收费”类型的合同服务:所有付款计划总和直接赋给第一个服务周期的成本
|
|
|
if (service.getString("PERIOD_TYPE").equals("609")) {
|
|
|
BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
|
|
|
for (RowMap payPlan : payPlanList) {
|
|
|
@@ -867,37 +877,40 @@ public class contractServiceAdj {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- LocalDate LAST_PERIOD_END_DATE = null;
|
|
|
+ LocalDate LAST_DATE = null;
|
|
|
for (RowMap servicePeriod : contractServicePeriodList) {
|
|
|
- //服务周期
|
|
|
- LocalDate PERIOD_BEGIN_DATE = TypeUtil.convert(servicePeriod.get("PERIOD_BEGIN_DATE"), LocalDate.class);//开始日期
|
|
|
- LocalDate PERIOD_END_DATE = TypeUtil.convert(servicePeriod.get("PERIOD_END_DATE"), LocalDate.class);//结束日期
|
|
|
+ // 获取当前服务周期的结束日期
|
|
|
+ LocalDate PERIOD_END_DATE = TypeUtil.convert(servicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
|
|
|
|
|
|
BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
|
|
|
for (RowMap payPlan : payPlanList) {
|
|
|
- LocalDate PAY_PERIOD_BEGIN_DATE = TypeUtil.convert(payPlan.get("PERIOD_BEGIN_DATE"), LocalDate.class);//开始日期
|
|
|
- LocalDate PAY_PERIOD_END_DATE = TypeUtil.convert(payPlan.get("PERIOD_END_DATE"), LocalDate.class);//结束日期
|
|
|
+ LocalDate PAY_PERIOD_BEGIN_DATE = TypeUtil.convert(payPlan.get("PERIOD_BEGIN_DATE"), LocalDate.class);
|
|
|
|
|
|
- if (PAY_PERIOD_END_DATE.isAfter(PERIOD_END_DATE)) {
|
|
|
+ // 跳过已处理过的付款计划(通过上一个周期末日期+1判断)
|
|
|
+ if (LAST_DATE != null && PAY_PERIOD_BEGIN_DATE.isBefore(LAST_DATE)) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (LAST_PERIOD_END_DATE != null && PAY_PERIOD_END_DATE.isAfter(LAST_PERIOD_END_DATE) == false) {
|
|
|
+ // 若付款计划起始日在当前服务周期之后,则跳过
|
|
|
+ if (PERIOD_END_DATE.isBefore(PAY_PERIOD_BEGIN_DATE)) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //合计付款计划
|
|
|
+ // 累加符合时间段内的付款计划金额
|
|
|
SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
|
|
|
|
|
|
}
|
|
|
+ // 更新当前服务周期的成本字段
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set PERIOD_COST=? where ID=? ", new Object[]{SUM_PLAN_AMOUNT, servicePeriod.getString("ID")});
|
|
|
|
|
|
- contractServiceLogger.info("服务周期:" + servicePeriod.getString("ID") + ":" + SUM_PLAN_AMOUNT);
|
|
|
+ SDK.getLogAPI().consoleInfo("服务周期:" + servicePeriod.getString("ID") + ":" + SUM_PLAN_AMOUNT);
|
|
|
|
|
|
- LAST_PERIOD_END_DATE = PERIOD_END_DATE;
|
|
|
+ // 设置下一轮比较的时间起点为当前周期结束后一天
|
|
|
+ LAST_DATE = PERIOD_END_DATE.plusDays(1);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
}
|