|
@@ -289,67 +289,78 @@ public class PaymentPlanService {
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 分摊采购成本
|
|
* 分摊采购成本
|
|
|
- * @param uc
|
|
|
|
|
- * @param contractServiceId
|
|
|
|
|
|
|
+ * 将合同服务的采购成本按照服务周期进行分摊。对于一次性收费的服务,
|
|
|
|
|
+ * 直接将所有付款计划金额汇总后赋给唯一的服务周期;对于其他类型服务,
|
|
|
|
|
+ * 按照服务周期的时间范围匹配对应的付款计划,并计算该周期内的总费用。
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param uc 当前用户上下文信息
|
|
|
|
|
+ * @param contractServiceId 合同服务ID,用于查询相关服务、付款计划和服务周期数据
|
|
|
*/
|
|
*/
|
|
|
|
|
+ //合同服务采购成本平摊到服务周期上面
|
|
|
public void paySplitServiceMonth(UserContext uc, String contractServiceId) {
|
|
public void paySplitServiceMonth(UserContext uc, String contractServiceId) {
|
|
|
|
|
|
|
|
RowMap service = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE where ID=?", new Object[]{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});
|
|
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)
|
|
if (payPlanList.isEmpty() || payPlanList.size() == 0)
|
|
|
return;
|
|
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});
|
|
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)
|
|
if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
- //服务:一次性收费
|
|
|
|
|
|
|
+ // 处理“一次性收费”类型的合同服务(标识码为"609")
|
|
|
if (service.getString("PERIOD_TYPE").equals("609")) {
|
|
if (service.getString("PERIOD_TYPE").equals("609")) {
|
|
|
BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
|
|
BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
|
|
|
for (RowMap payPlan : payPlanList) {
|
|
for (RowMap payPlan : payPlanList) {
|
|
|
- //合计付款计划
|
|
|
|
|
SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
|
|
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, contractServicePeriodList.get(0).getString("ID")});
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set PERIOD_COST=? where ID=? ", new Object[]{SUM_PLAN_AMOUNT, contractServicePeriodList.get(0).getString("ID")});
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- LocalDate LAST_PERIOD_END_DATE = null;
|
|
|
|
|
|
|
+ LocalDate LAST_DATE = null;
|
|
|
for (RowMap servicePeriod : contractServicePeriodList) {
|
|
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;
|
|
BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
|
|
|
for (RowMap payPlan : payPlanList) {
|
|
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)) {
|
|
|
|
|
|
|
+ // 若上一处理周期已覆盖此付款计划起始日,则跳过
|
|
|
|
|
+ if (LAST_DATE != null && PAY_PERIOD_BEGIN_DATE.isBefore(LAST_DATE)) {
|
|
|
continue;
|
|
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;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //合计付款计划
|
|
|
|
|
|
|
+ // 累加属于当前服务周期的付款计划金额
|
|
|
SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
|
|
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")});
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set PERIOD_COST=? where ID=? ", new Object[]{SUM_PLAN_AMOUNT, servicePeriod.getString("ID")});
|
|
|
- LAST_PERIOD_END_DATE = PERIOD_END_DATE;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ SDK.getLogAPI().consoleInfo("服务周期:" + servicePeriod.getString("ID") + ":" + SUM_PLAN_AMOUNT);
|
|
|
|
|
+
|
|
|
|
|
+ // 设置下一个服务周期应排除的最早付款日期起点
|
|
|
|
|
+ LAST_DATE = PERIOD_END_DATE.plusDays(1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 获取周期列表
|
|
* 获取周期列表
|
|
|
* @param RULE_CATE
|
|
* @param RULE_CATE
|