|
|
@@ -273,9 +273,11 @@ public class contractService {
|
|
|
|
|
|
for (BO service : serviceList) {
|
|
|
AddServiceServiceBundleOne(uc, conn, contract, service);
|
|
|
-
|
|
|
+ //一次性收费服务 不受开始日期或结束日期影响
|
|
|
+ if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
contractServiceLogger.info("判断合同结束日期是否修改");
|
|
|
-
|
|
|
//如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
|
|
|
String PERIOD = service.getString("PERIOD");//服务起止日期
|
|
|
String ADJUST_PERIOD = service.getString("ADJUST_PERIOD");//服务调整的起止日期
|
|
|
@@ -301,6 +303,8 @@ public class contractService {
|
|
|
|
|
|
contractServiceLogger.info("服务周期结束日期--" + LocalDateYYYYMMDD(PERIOD_END));
|
|
|
contractServiceLogger.info("合同结束日期--" + LocalDateYYYYMMDD(END_DATE));
|
|
|
+
|
|
|
+
|
|
|
if (PERIOD_END.isEqual(END_DATE)) {
|
|
|
if (PERIOD_END.isBefore(END_DATE)) {
|
|
|
contractServiceLogger.info("服务周期延长--" + service.getString("NAME"));
|
|
|
@@ -581,17 +585,15 @@ public class contractService {
|
|
|
service.set("UNIT_COST", unit_cost);
|
|
|
unit_price = unit_price.multiply(rate);
|
|
|
service.set("UNIT_PRICE", unit_price);
|
|
|
-
|
|
|
- service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
|
|
|
+ // service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
|
|
|
+ service.set("PERIOD_TYPE", maxPeriod);
|
|
|
}
|
|
|
|
|
|
contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
|
|
|
-
|
|
|
service.set("TOTAL_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
|
|
|
service.set("ADJUSTED_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
|
|
|
service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
|
|
|
|
|
|
-
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", service, conn);//保存
|
|
|
|
|
|
List<String> sbsList = null;
|
|
|
@@ -633,6 +635,45 @@ public class contractService {
|
|
|
START_DATE = currMontLastDay.plusDays(1);//周期开始日期
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ //2025年10月15日 一次性收费服务
|
|
|
+ if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
|
|
|
+ BO csp = new BO();//服务周期
|
|
|
+ csp.set("CONTRACT_ID", contract.get("ID"));
|
|
|
+ csp.set("OBJECT_ID", service.get("OBJECT_ID"));
|
|
|
+ csp.set("OBJECT_TYPE", service.get("OBJECT_TYPE"));
|
|
|
+ csp.set("CONTRACT_SERVICE_ID", service.get("ID"));
|
|
|
+ csp.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
+ csp.set("PERIOD_END_DATE", END_DATE);
|
|
|
+ csp.set("QUANTITY", service.get("QUANTITY"));
|
|
|
+ BigDecimal period_price = multiply(service.get("UNIT_PRICE"), service.get("QUANTITY"));
|
|
|
+ csp.set("PERIOD_PRICE", period_price);
|
|
|
+ BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
|
|
|
+ csp.set("PERIOD_COST", period_cost);
|
|
|
+ csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
|
|
|
+ csp.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
|
+ csp.setBindId(service.getString("BINDID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csp, uc, conn);
|
|
|
+
|
|
|
+ if (service.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
|
+ {
|
|
|
+ //本周期成本
|
|
|
+ String prorated_cost_change = DBSql.getString(conn, "select UNIT_COST from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});//供应商账号
|
|
|
+ if (sbsList != null) {
|
|
|
+ for (String sbs : sbsList) {
|
|
|
+ BO cspbs = new BO();
|
|
|
+ cspbs.set("CONTRACT_SERVICE_PERIOD_ID", csp.getId());
|
|
|
+ cspbs.set("SERVICE_ID", sbs);
|
|
|
+ cspbs.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
|
+ cspbs.set("PERIOD_COST", prorated_cost_change);
|
|
|
+ cspbs.setBindId(service.getString("BINDID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", cspbs, uc, conn);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
// 计算首周期起止日期,并判断是否需要新增服务调整记录
|
|
|
Map<String, Object> firstPeriodDate = getFirstPeriodDate(START_DATE, END_DATE, EFFECTIVE_DATE, contract.getString("PERIOD_TYPE"), service.getString("PERIOD_TYPE"));
|
|
|
boolean isStartOfPeriod = (boolean) firstPeriodDate.get("isStartOfPeriod");//是否需要服务调整
|
|
|
@@ -782,309 +823,332 @@ public class contractService {
|
|
|
LocalDate EFFECTIVE_DATE = getLocalDate(editService.get("EFFECTIVE_DATE"));//服务生效日期
|
|
|
String EFFECTIVE_DATE_STR = EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
|
|
|
- //生效日期之后有审批通过的;
|
|
|
- if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{contract.get("ID"), editService.get("CONTRACT_SERVICE_ID"), EFFECTIVE_DATE_STR}) > 0) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- List<BO> editServiceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("IS_EFFECTIVE =", "已执行").addQuery("EFFECTIVE_DATE >", EFFECTIVE_DATE_STR).orderBy("EFFECTIVE_DATE").asc().list();
|
|
|
+ //2025年10月15日 一次性收费服务
|
|
|
+ if (editService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
|
|
|
|
|
|
- boolean needDel = false;//是否需要删除重新生成
|
|
|
- if (editServiceList != null && editServiceList.size() > 0) {
|
|
|
- needDel = true;
|
|
|
- //在此次调整之后有新的
|
|
|
- for (BO editServiceOld : editServiceList) {
|
|
|
- editServiceOld.set("IS_EFFECTIVE", "作废");
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT", editServiceOld, conn);
|
|
|
+ //有审批通过的;
|
|
|
+ if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{contract.get("ID"), editService.get("CONTRACT_SERVICE_ID")}) > 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //生效日期之后有审批通过的;
|
|
|
+ if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{contract.get("ID"), editService.get("CONTRACT_SERVICE_ID"), EFFECTIVE_DATE_STR}) > 0) {
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //服务调整的生效日期,是按照日期顺序创建的
|
|
|
- if (needDel == false) {
|
|
|
|
|
|
- contractServiceLogger.info("服务调整的生效日期,是按照日期顺序创建的");
|
|
|
+ //一次性收费服务
|
|
|
+ if (editService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
|
|
|
+ BO servicePeriod = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).detail();
|
|
|
+ servicePeriod.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
+ servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+ servicePeriod.set("PERIOD_PRICE", editService.get("TOTAL_PRICE"));
|
|
|
+ servicePeriod.set("PERIOD_COST", editService.get("TOTAL_COST"));
|
|
|
|
|
|
- List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
+ servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
|
|
|
- if (servicePeriodList != null && servicePeriodList.size() > 0) {
|
|
|
+ } else {
|
|
|
|
|
|
- for (BO servicePeriod : servicePeriodList) {
|
|
|
- LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
- LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
|
- //调整日期之前,不用修改
|
|
|
- if (period_end_date.isBefore(EFFECTIVE_DATE)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- //处于调整日期之后的
|
|
|
- if (period_begin_date.isBefore(EFFECTIVE_DATE) && !period_end_date.isBefore(EFFECTIVE_DATE)) {
|
|
|
- //分成调整前和调整后 两条计费周期
|
|
|
- //新的计费周期
|
|
|
- BO servicePeriodAdj = new BO();
|
|
|
- servicePeriodAdj.setAll(servicePeriod.asMap());
|
|
|
- servicePeriodAdj.setId(null);
|
|
|
- servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
- servicePeriodAdj.set("PERIOD_END_DATE", period_end_date);
|
|
|
- servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
-
|
|
|
- String ORG_PERIOD_ID = servicePeriod.getString("ORG_PERIOD_ID");
|
|
|
- if (StringUtils.isBlank(ORG_PERIOD_ID))
|
|
|
- ORG_PERIOD_ID = servicePeriod.getId();
|
|
|
- servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
-
|
|
|
- BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
-
|
|
|
- BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
- BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
-
|
|
|
- servicePeriodAdj.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), multiply(periodRateAdj, priceRate)));
|
|
|
- servicePeriodAdj.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), multiply(periodRateAdj, costRate)));
|
|
|
- servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
-
|
|
|
-
|
|
|
- List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
- if (sbsList != null && sbsList.size() > 0)
|
|
|
- for (BO sbs : sbsList) {
|
|
|
- BO newSbs = new BO();
|
|
|
- newSbs.setAll(sbs.asMap());
|
|
|
- newSbs.setId(null);
|
|
|
- newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
- }
|
|
|
+ List<BO> editServiceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("IS_EFFECTIVE =", "已执行").addQuery("EFFECTIVE_DATE >", EFFECTIVE_DATE_STR).orderBy("EFFECTIVE_DATE").asc().list();
|
|
|
|
|
|
- //旧的计费周期更新
|
|
|
- servicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
- servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
- servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
- servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
- servicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
- } else {
|
|
|
- //重新计算
|
|
|
- BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
- BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
- servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
- servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), priceRate));
|
|
|
- servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), costRate));
|
|
|
- servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
- }
|
|
|
+ boolean needDel = false;//是否需要删除重新生成
|
|
|
+ if (editServiceList != null && editServiceList.size() > 0) {
|
|
|
+ needDel = true;
|
|
|
+ //在此次调整之后有新的
|
|
|
+ for (BO editServiceOld : editServiceList) {
|
|
|
+ editServiceOld.set("IS_EFFECTIVE", "作废");
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT", editServiceOld, conn);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
- contractServiceLogger.info("本次服务调整生效日期之后的服务调整全部作废");
|
|
|
-
|
|
|
- //生效日期之后的
|
|
|
- List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", EFFECTIVE_DATE_STR).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
-
|
|
|
- BO firstServicePeriod = servicePeriodList.get(0);
|
|
|
- //判断是不是个整周期
|
|
|
- String ORG_PERIOD_ID = firstServicePeriod.getString("ORG_PERIOD_ID");
|
|
|
-
|
|
|
- LocalDate SATRT_DATE = null;
|
|
|
- if (StringUtils.isBlank(ORG_PERIOD_ID)) {
|
|
|
- ORG_PERIOD_ID = firstServicePeriod.getString("ORG_PERIOD_ID");
|
|
|
- LocalDate period_begin_date = getLocalDate(firstServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
- LocalDate period_end_date = getLocalDate(firstServicePeriod.get("PERIOD_END_DATE"));
|
|
|
-
|
|
|
- //新的计费周期
|
|
|
- BO servicePeriodAdj = new BO();
|
|
|
-
|
|
|
- servicePeriodAdj.setAll(firstServicePeriod.asMap());
|
|
|
- servicePeriodAdj.setId(null);
|
|
|
-
|
|
|
- servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
- servicePeriodAdj.set("PERIOD_END_DATE", period_end_date);
|
|
|
- servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
- servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
-
|
|
|
- BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
-
|
|
|
- BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
- BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
-
|
|
|
- servicePeriodAdj.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), multiply(periodRateAdj, priceRate)));
|
|
|
- servicePeriodAdj.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), multiply(periodRateAdj, costRate)));
|
|
|
- servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
- List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
- if (sbsList != null && sbsList.size() > 0)
|
|
|
- for (BO sbs : sbsList) {
|
|
|
- BO newSbs = new BO();
|
|
|
- newSbs.setAll(sbs.asMap());
|
|
|
- newSbs.setId(null);
|
|
|
- newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
- }
|
|
|
+ //服务调整的生效日期,是按照日期顺序创建的
|
|
|
+ if (needDel == false) {
|
|
|
+
|
|
|
+ contractServiceLogger.info("服务调整的生效日期,是按照日期顺序创建的");
|
|
|
+
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
|
|
|
+ if (servicePeriodList != null && servicePeriodList.size() > 0) {
|
|
|
|
|
|
- //旧的计费周期更新
|
|
|
- firstServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
- firstServicePeriod.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
- firstServicePeriod.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
- firstServicePeriod.set("PERIOD_ADJUSTED_PRICE", firstServicePeriod.get("PERIOD_PRICE"));
|
|
|
- firstServicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", firstServicePeriod, conn);
|
|
|
+ for (BO servicePeriod : servicePeriodList) {
|
|
|
+ LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
+ LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
|
|
|
+
|
|
|
+ //调整日期之前,不用修改
|
|
|
+ if (period_end_date.isBefore(EFFECTIVE_DATE)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //处于调整日期之后的
|
|
|
+ if (period_begin_date.isBefore(EFFECTIVE_DATE) && !period_end_date.isBefore(EFFECTIVE_DATE)) {
|
|
|
+ //分成调整前和调整后 两条计费周期
|
|
|
+ //新的计费周期
|
|
|
+ BO servicePeriodAdj = new BO();
|
|
|
+ servicePeriodAdj.setAll(servicePeriod.asMap());
|
|
|
+ servicePeriodAdj.setId(null);
|
|
|
+ servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
+ servicePeriodAdj.set("PERIOD_END_DATE", period_end_date);
|
|
|
+ servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+
|
|
|
+ String ORG_PERIOD_ID = servicePeriod.getString("ORG_PERIOD_ID");
|
|
|
+ if (StringUtils.isBlank(ORG_PERIOD_ID))
|
|
|
+ ORG_PERIOD_ID = servicePeriod.getId();
|
|
|
+ servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+
|
|
|
+ BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
+
|
|
|
+ BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ servicePeriodAdj.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), multiply(periodRateAdj, priceRate)));
|
|
|
+ servicePeriodAdj.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), multiply(periodRateAdj, costRate)));
|
|
|
+ servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
+
|
|
|
+
|
|
|
+ List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
+ if (sbsList != null && sbsList.size() > 0)
|
|
|
+ for (BO sbs : sbsList) {
|
|
|
+ BO newSbs = new BO();
|
|
|
+ newSbs.setAll(sbs.asMap());
|
|
|
+ newSbs.setId(null);
|
|
|
+ newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
+ }
|
|
|
+
|
|
|
+ //旧的计费周期更新
|
|
|
+ servicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
+ servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
+ servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
+ servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
+ servicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
+ } else {
|
|
|
+ //重新计算
|
|
|
+ BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+ servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+ servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), priceRate));
|
|
|
+ servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), costRate));
|
|
|
+ servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- SATRT_DATE = period_end_date.plusDays(1);
|
|
|
} else {
|
|
|
+ contractServiceLogger.info("本次服务调整生效日期之后的服务调整全部作废");
|
|
|
+
|
|
|
+ //生效日期之后的
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", EFFECTIVE_DATE_STR).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
+
|
|
|
+ BO firstServicePeriod = servicePeriodList.get(0);
|
|
|
+ //判断是不是个整周期
|
|
|
+ String ORG_PERIOD_ID = firstServicePeriod.getString("ORG_PERIOD_ID");
|
|
|
+
|
|
|
+ LocalDate SATRT_DATE = null;
|
|
|
+ if (StringUtils.isBlank(ORG_PERIOD_ID)) {
|
|
|
+ ORG_PERIOD_ID = firstServicePeriod.getString("ORG_PERIOD_ID");
|
|
|
+ LocalDate period_begin_date = getLocalDate(firstServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
+ LocalDate period_end_date = getLocalDate(firstServicePeriod.get("PERIOD_END_DATE"));
|
|
|
+
|
|
|
+ //新的计费周期
|
|
|
+ BO servicePeriodAdj = new BO();
|
|
|
+
|
|
|
+ servicePeriodAdj.setAll(firstServicePeriod.asMap());
|
|
|
+ servicePeriodAdj.setId(null);
|
|
|
+
|
|
|
+ servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
+ servicePeriodAdj.set("PERIOD_END_DATE", period_end_date);
|
|
|
+ servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+ servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+
|
|
|
+ BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
+
|
|
|
+ BigDecimal priceRate = editService.get("TOTAL_PRICE", BigDecimal.class).divide(editService.get("OLD_TOTAL_PRICE", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal costRate = editService.get("TOTAL_COST", BigDecimal.class).divide(editService.get("OLD_TOTAL_COST", BigDecimal.class), 10, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ servicePeriodAdj.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), multiply(periodRateAdj, priceRate)));
|
|
|
+ servicePeriodAdj.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), multiply(periodRateAdj, costRate)));
|
|
|
+ servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
+ List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
+ if (sbsList != null && sbsList.size() > 0)
|
|
|
+ for (BO sbs : sbsList) {
|
|
|
+ BO newSbs = new BO();
|
|
|
+ newSbs.setAll(sbs.asMap());
|
|
|
+ newSbs.setId(null);
|
|
|
+ newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
+ }
|
|
|
|
|
|
- LocalDate period_begin_date = getLocalDate(firstServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
- LocalDate period_end_date = getLocalDate(firstServicePeriod.get("PERIOD_END_DATE"));
|
|
|
- firstServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
- firstServicePeriod.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
- firstServicePeriod.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
- firstServicePeriod.set("PERIOD_ADJUSTED_PRICE", firstServicePeriod.get("PERIOD_PRICE"));
|
|
|
- firstServicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", firstServicePeriod, conn);
|
|
|
|
|
|
+ //旧的计费周期更新
|
|
|
+ firstServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
+ firstServicePeriod.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
+ firstServicePeriod.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
+ firstServicePeriod.set("PERIOD_ADJUSTED_PRICE", firstServicePeriod.get("PERIOD_PRICE"));
|
|
|
+ firstServicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", firstServicePeriod, conn);
|
|
|
|
|
|
- List<BO> servicePeriodList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("ORG_PERIOD_ID =", ORG_PERIOD_ID).orderBy("PERIOD_BEGIN_DATE").desc().list();
|
|
|
+ SATRT_DATE = period_end_date.plusDays(1);
|
|
|
+ } else {
|
|
|
|
|
|
- DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID IN (SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE ORG_PERIOD_ID=? AND PERIOD_END_DATE>=?)", new Object[]{ORG_PERIOD_ID, EFFECTIVE_DATE_STR});
|
|
|
+ LocalDate period_begin_date = getLocalDate(firstServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
+ LocalDate period_end_date = getLocalDate(firstServicePeriod.get("PERIOD_END_DATE"));
|
|
|
+ firstServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, EFFECTIVE_DATE.minusDays(1)), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
+ firstServicePeriod.set("PERIOD_PRICE", multiply(firstServicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
+ firstServicePeriod.set("PERIOD_COST", multiply(firstServicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
+ firstServicePeriod.set("PERIOD_ADJUSTED_PRICE", firstServicePeriod.get("PERIOD_PRICE"));
|
|
|
+ firstServicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", firstServicePeriod, conn);
|
|
|
|
|
|
- DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE ORG_PERIOD_ID=? AND PERIOD_END_DATE>=?", new Object[]{ORG_PERIOD_ID, EFFECTIVE_DATE_STR});
|
|
|
|
|
|
+ List<BO> servicePeriodList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).addQuery("ORG_PERIOD_ID =", ORG_PERIOD_ID).orderBy("PERIOD_BEGIN_DATE").desc().list();
|
|
|
|
|
|
- BO lastServicePeriod = servicePeriodList2.get(0);
|
|
|
- LocalDate last_period_begin_date = getLocalDate(lastServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
- LocalDate last_period_end_date = getLocalDate(lastServicePeriod.get("PERIOD_END_DATE"));
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID IN (SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE ORG_PERIOD_ID=? AND PERIOD_END_DATE>=?)", new Object[]{ORG_PERIOD_ID, EFFECTIVE_DATE_STR});
|
|
|
|
|
|
- //新的计费周期
|
|
|
- BO servicePeriodAdj = new BO();
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE ORG_PERIOD_ID=? AND PERIOD_END_DATE>=?", new Object[]{ORG_PERIOD_ID, EFFECTIVE_DATE_STR});
|
|
|
|
|
|
- servicePeriodAdj.setAll(firstServicePeriod.asMap());
|
|
|
- servicePeriodAdj.setId(null);
|
|
|
|
|
|
- servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
- servicePeriodAdj.set("PERIOD_END_DATE", last_period_end_date);
|
|
|
- servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
- servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
+ BO lastServicePeriod = servicePeriodList2.get(0);
|
|
|
+ LocalDate last_period_begin_date = getLocalDate(lastServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
+ LocalDate last_period_end_date = getLocalDate(lastServicePeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
|
- LocalDate start = getPreviousPeriodStart(last_period_end_date.plusDays(1), editService.getString("PERIOD_TYPE"));
|
|
|
- BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, last_period_end_date), GetPeriodDays(start, last_period_end_date)); // 首周期占整周期比例
|
|
|
- servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
|
|
|
- servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
|
|
|
+ //新的计费周期
|
|
|
+ BO servicePeriodAdj = new BO();
|
|
|
|
|
|
- servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
+ servicePeriodAdj.setAll(firstServicePeriod.asMap());
|
|
|
+ servicePeriodAdj.setId(null);
|
|
|
|
|
|
+ servicePeriodAdj.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
+ servicePeriodAdj.set("PERIOD_END_DATE", last_period_end_date);
|
|
|
+ servicePeriodAdj.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+ servicePeriodAdj.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
|
|
|
|
|
|
- List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
- if (sbsList != null && sbsList.size() > 0)
|
|
|
- for (BO sbs : sbsList) {
|
|
|
- BO newSbs = new BO();
|
|
|
- newSbs.setAll(sbs.asMap());
|
|
|
- newSbs.setId(null);
|
|
|
- newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
- }
|
|
|
+ LocalDate start = getPreviousPeriodStart(last_period_end_date.plusDays(1), editService.getString("PERIOD_TYPE"));
|
|
|
+ BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, last_period_end_date), GetPeriodDays(start, last_period_end_date)); // 首周期占整周期比例
|
|
|
+ servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
|
|
|
+ servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
|
|
|
+
|
|
|
+ servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
|
|
|
|
|
|
- SATRT_DATE = last_period_end_date.plusDays(1);
|
|
|
- }
|
|
|
|
|
|
- String SATRT_DATE_STR = SATRT_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
- //SATRT_DATE 之后,全部删除,重新计算
|
|
|
- DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID IN (SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?)", new Object[]{editService.getString("CONTRACT_SERVICE_ID"), SATRT_DATE_STR});
|
|
|
+ List<BO> sbsList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE").connection(conn).addQuery("CONTRACT_SERVICE_PERIOD_ID =", ORG_PERIOD_ID).list();
|
|
|
+ if (sbsList != null && sbsList.size() > 0)
|
|
|
+ for (BO sbs : sbsList) {
|
|
|
+ BO newSbs = new BO();
|
|
|
+ newSbs.setAll(sbs.asMap());
|
|
|
+ newSbs.setId(null);
|
|
|
+ newSbs.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriodAdj.getId());
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", newSbs, uc, conn);
|
|
|
+ }
|
|
|
|
|
|
- DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{editService.getString("CONTRACT_SERVICE_ID"), SATRT_DATE_STR});
|
|
|
+ SATRT_DATE = last_period_end_date.plusDays(1);
|
|
|
+ }
|
|
|
|
|
|
+ String SATRT_DATE_STR = SATRT_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ //SATRT_DATE 之后,全部删除,重新计算
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID IN (SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?)", new Object[]{editService.getString("CONTRACT_SERVICE_ID"), SATRT_DATE_STR});
|
|
|
|
|
|
- LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
|
|
|
- String maxPeriod = editService.getString("PERIOD_TYPE");
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{editService.getString("CONTRACT_SERVICE_ID"), SATRT_DATE_STR});
|
|
|
|
|
|
- //服务包上的服务
|
|
|
- List<String> sbsList = null;
|
|
|
- String serviceIds = DBSql.getString("select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{editService.get("OBJECT_ID")});
|
|
|
- if (StringUtils.isNotBlank(serviceIds)) {
|
|
|
- sbsList = Arrays.asList(serviceIds.split(","));
|
|
|
- }
|
|
|
|
|
|
- //生成服务周期
|
|
|
- if (SATRT_DATE.isBefore(END_DATE)) {
|
|
|
- //循环添加全部周期
|
|
|
- while (!SATRT_DATE.isAfter(END_DATE)) {
|
|
|
+ LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
|
|
|
+ String maxPeriod = editService.getString("PERIOD_TYPE");
|
|
|
|
|
|
- BigDecimal periodRate = BigDecimal.ONE;
|
|
|
- LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
|
- if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
|
- periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
- periodEnd = END_DATE;
|
|
|
- }
|
|
|
+ //服务包上的服务
|
|
|
+ List<String> sbsList = null;
|
|
|
+ String serviceIds = DBSql.getString("select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{editService.get("OBJECT_ID")});
|
|
|
+ if (StringUtils.isNotBlank(serviceIds)) {
|
|
|
+ sbsList = Arrays.asList(serviceIds.split(","));
|
|
|
+ }
|
|
|
+
|
|
|
+ //生成服务周期
|
|
|
+ if (SATRT_DATE.isBefore(END_DATE)) {
|
|
|
+ //循环添加全部周期
|
|
|
+ while (!SATRT_DATE.isAfter(END_DATE)) {
|
|
|
|
|
|
- BO csp = new BO();//服务周期
|
|
|
-
|
|
|
- csp.setAll(firstServicePeriod.asMap());
|
|
|
- csp.set("PERIOD_BEGIN_DATE", SATRT_DATE);
|
|
|
- csp.set("PERIOD_END_DATE", periodEnd);
|
|
|
- csp.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
-
|
|
|
- BigDecimal period_price = multiply(editService.get("UNIT_PRICE"), editService.get("QUANTITY"));
|
|
|
- period_price = periodRate.multiply(period_price);
|
|
|
- csp.set("PERIOD_PRICE", period_price);
|
|
|
- contractServiceLogger.info("计算-csp-PERIOD_COST");
|
|
|
- BigDecimal period_cost = multiply(editService.get("UNIT_COST"), editService.get("QUANTITY"));
|
|
|
- period_cost = periodRate.multiply(period_cost);
|
|
|
- csp.set("PERIOD_COST", period_cost);
|
|
|
- csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csp, uc, conn);
|
|
|
-
|
|
|
- if (editService.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
|
- {
|
|
|
- //本周期成本
|
|
|
- String prorated_cost_change = DBSql.getString(conn, "select UNIT_COST from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{editService.getString("OBJECT_ID")});//供应商账号
|
|
|
- if (sbsList != null) {
|
|
|
- for (String sbs : sbsList) {
|
|
|
- BO cspbs = new BO();
|
|
|
- cspbs.set("CONTRACT_SERVICE_PERIOD_ID", csp.getId());
|
|
|
- cspbs.set("SERVICE_ID", sbs);
|
|
|
- cspbs.set("VENDOR_ACCOUNT_ID", csp.get("VENDOR_ACCOUNT_ID"));
|
|
|
- cspbs.set("PERIOD_COST", prorated_cost_change);
|
|
|
- cspbs.setBindId(csp.getString("BINDID"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", cspbs, uc, conn);
|
|
|
+ BigDecimal periodRate = BigDecimal.ONE;
|
|
|
+ LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
|
+ if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
|
+ periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
+ periodEnd = END_DATE;
|
|
|
+ }
|
|
|
+
|
|
|
+ BO csp = new BO();//服务周期
|
|
|
+
|
|
|
+ csp.setAll(firstServicePeriod.asMap());
|
|
|
+ csp.set("PERIOD_BEGIN_DATE", SATRT_DATE);
|
|
|
+ csp.set("PERIOD_END_DATE", periodEnd);
|
|
|
+ csp.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
+
|
|
|
+ BigDecimal period_price = multiply(editService.get("UNIT_PRICE"), editService.get("QUANTITY"));
|
|
|
+ period_price = periodRate.multiply(period_price);
|
|
|
+ csp.set("PERIOD_PRICE", period_price);
|
|
|
+ contractServiceLogger.info("计算-csp-PERIOD_COST");
|
|
|
+ BigDecimal period_cost = multiply(editService.get("UNIT_COST"), editService.get("QUANTITY"));
|
|
|
+ period_cost = periodRate.multiply(period_cost);
|
|
|
+ csp.set("PERIOD_COST", period_cost);
|
|
|
+ csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csp, uc, conn);
|
|
|
+
|
|
|
+ if (editService.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
|
+ {
|
|
|
+ //本周期成本
|
|
|
+ String prorated_cost_change = DBSql.getString(conn, "select UNIT_COST from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{editService.getString("OBJECT_ID")});//供应商账号
|
|
|
+ if (sbsList != null) {
|
|
|
+ for (String sbs : sbsList) {
|
|
|
+ BO cspbs = new BO();
|
|
|
+ cspbs.set("CONTRACT_SERVICE_PERIOD_ID", csp.getId());
|
|
|
+ cspbs.set("SERVICE_ID", sbs);
|
|
|
+ cspbs.set("VENDOR_ACCOUNT_ID", csp.get("VENDOR_ACCOUNT_ID"));
|
|
|
+ cspbs.set("PERIOD_COST", prorated_cost_change);
|
|
|
+ cspbs.setBindId(csp.getString("BINDID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", cspbs, uc, conn);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if (periodEnd != null) {
|
|
|
- SATRT_DATE = periodEnd.plusDays(1);
|
|
|
+ if (periodEnd != null) {
|
|
|
+ SATRT_DATE = periodEnd.plusDays(1);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- String PERIOD = editService.getString("PERIOD");//服务起止日期
|
|
|
- String ADJUST_PERIOD = editService.getString("ADJUST_PERIOD");//服务调整的起止日期
|
|
|
- LocalDate PERIOD_END;
|
|
|
- if (StringUtils.isNotBlank(PERIOD)) {
|
|
|
- PERIOD_END = getLocalDate(PERIOD.split("~")[1]);
|
|
|
- PERIOD = PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
- } else {
|
|
|
- PERIOD_END = getLocalDate(ADJUST_PERIOD.split("~")[1]);
|
|
|
- ADJUST_PERIOD = ADJUST_PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
- }
|
|
|
+ String PERIOD = editService.getString("PERIOD");//服务起止日期
|
|
|
+ String ADJUST_PERIOD = editService.getString("ADJUST_PERIOD");//服务调整的起止日期
|
|
|
+ LocalDate PERIOD_END;
|
|
|
+ if (StringUtils.isNotBlank(PERIOD)) {
|
|
|
+ PERIOD_END = getLocalDate(PERIOD.split("~")[1]);
|
|
|
+ PERIOD = PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
+ } else {
|
|
|
+ PERIOD_END = getLocalDate(ADJUST_PERIOD.split("~")[1]);
|
|
|
+ ADJUST_PERIOD = ADJUST_PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
+ }
|
|
|
|
|
|
- //缩短
|
|
|
- if (PERIOD_END.isAfter(END_DATE)) {
|
|
|
- if (StringUtils.isNotBlank(ADJUST_PERIOD)) {
|
|
|
- LocalDate ADJUST_PERIOD_END = getLocalDate(ADJUST_PERIOD.split("~")[1]);
|
|
|
- if (ADJUST_PERIOD_END.isAfter(END_DATE)) {
|
|
|
- PERIOD = null;
|
|
|
- ADJUST_PERIOD = ADJUST_PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
+ //缩短
|
|
|
+ if (PERIOD_END.isAfter(END_DATE)) {
|
|
|
+ if (StringUtils.isNotBlank(ADJUST_PERIOD)) {
|
|
|
+ LocalDate ADJUST_PERIOD_END = getLocalDate(ADJUST_PERIOD.split("~")[1]);
|
|
|
+ if (ADJUST_PERIOD_END.isAfter(END_DATE)) {
|
|
|
+ PERIOD = null;
|
|
|
+ ADJUST_PERIOD = ADJUST_PERIOD.split("~")[0] + "~" + LocalDateYYYYMMDD(END_DATE);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, ADJUST_PERIOD, editService.get("CONTRACT_SERVICE_ID"), editService.get("BINDID")});
|
|
|
}
|
|
|
- DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, ADJUST_PERIOD, editService.get("CONTRACT_SERVICE_ID"), editService.get("BINDID")});
|
|
|
}
|
|
|
-
|
|
|
editService.set("IS_EFFECTIVE", "已执行");
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT", editService, conn);
|
|
|
|
|
|
//如果在此次调整之后还有调整,则设为失效状态
|
|
|
-
|
|
|
BO contractServiceBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", editService.getString("CONTRACT_SERVICE_ID"));
|
|
|
contractServiceBO.set("OLD_QUANTITY", editService.get("OLD_QUANTITY"));
|
|
|
contractServiceBO.set("OLD_UNIT_PRICE", editService.get("OLD_UNIT_PRICE"));
|
|
|
@@ -1330,6 +1394,54 @@ public class contractService {
|
|
|
return BigDecimal.ZERO; // 返回默认值 0
|
|
|
}
|
|
|
|
|
|
+ // 误差范围:0.00001
|
|
|
+ private static final BigDecimal EPSILON = new BigDecimal("0.00001");
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将Object转换为BigDecimal
|
|
|
+ * @param obj 待转换的对象(支持Number、String等可转换为数字的类型)
|
|
|
+ * @return 转换后的BigDecimal
|
|
|
+ * @throws IllegalArgumentException 若对象无法转换为BigDecimal
|
|
|
+ */
|
|
|
+ public static BigDecimal toBigDecimal(Object obj) {
|
|
|
+ if (obj == null) {
|
|
|
+ throw new IllegalArgumentException("对象不能为null");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (obj instanceof BigDecimal) {
|
|
|
+ return (BigDecimal) obj;
|
|
|
+ } else if (obj instanceof Number) {
|
|
|
+ // 处理数字类型(Integer、Double、Long等)
|
|
|
+ return new BigDecimal(obj.toString());
|
|
|
+ } else if (obj instanceof String) {
|
|
|
+ // 处理字符串类型(需符合数字格式)
|
|
|
+ try {
|
|
|
+ return new BigDecimal((String) obj);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ throw new IllegalArgumentException("字符串无法转换为BigDecimal: " + obj, e);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("不支持的类型转换: " + obj.getClass().getName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断两个Object转换后的BigDecimal是否在0.00001误差范围内相等
|
|
|
+ * @param obj1 第一个对象
|
|
|
+ * @param obj2 第二个对象
|
|
|
+ * @return true(误差范围内相等),false(不相等)
|
|
|
+ */
|
|
|
+ public static boolean isApproximatelyEqual(Object obj1, Object obj2) {
|
|
|
+ BigDecimal bd1 = toBigDecimal(obj1);
|
|
|
+ BigDecimal bd2 = toBigDecimal(obj2);
|
|
|
+
|
|
|
+ // 计算两个数的差值绝对值
|
|
|
+ BigDecimal difference = bd1.subtract(bd2).abs();
|
|
|
+
|
|
|
+ // 比较差值是否小于等于误差范围
|
|
|
+ return difference.compareTo(EPSILON) <= 0;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 返回合同周期天数除以服务周期天数的比例,保留8位小数
|
|
|
* @param contractPeriod
|