|
|
@@ -99,6 +99,11 @@ public class contractServiceAdj {
|
|
|
|
|
|
SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST", editBO, contractInstance, uc);
|
|
|
|
|
|
+ if (editBO.get("END_DATE") == null) {
|
|
|
+ DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_SERVICE a JOIN BO_EU_DNCTT_CONTRACT b ON a.CONTRACT_ID=b.ID set a.END_DATE=b.END_DATE WHERE a.END_DATE IS NULL AND a.ID=?", new Object[]{serviceId});
|
|
|
+ DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST a JOIN BO_EU_DNCTT_CONTRACT b ON a.CONTRACT_ID=b.ID set a.END_DATE=b.END_DATE WHERE a.END_DATE IS NULL a.CONTRACT_SERVICE_ID=?", new Object[]{serviceId});
|
|
|
+ }
|
|
|
+
|
|
|
return contractInstance.getId();
|
|
|
|
|
|
}
|
|
|
@@ -196,6 +201,10 @@ public class contractServiceAdj {
|
|
|
//获取服务周期
|
|
|
List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, CALC_METHOD_1STPERIOD, "4638", contractService.getString("MONTH_1STQUARTER"));
|
|
|
|
|
|
+
|
|
|
+ contractServiceLogger.info("服务周期个数-------" + periodList.size());
|
|
|
+ contractServiceLogger.info(periodList.toString());
|
|
|
+
|
|
|
SERVICE_UNIT_PRICE = TypeUtil.convert(contractService.get("UNIT_PRICE"), BigDecimal.class);
|
|
|
|
|
|
SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, contractService.get("QUANTITY"));
|
|
|
@@ -636,7 +645,8 @@ public class contractServiceAdj {
|
|
|
if (StringUtils.isBlank(boName)) {
|
|
|
boName = "BO_EU_DNIVT_ORDER_PAYMENT_PLAN";
|
|
|
} else {
|
|
|
- if (PERIOD_TYPE.equals("609") == false) PERIOD_TYPE = "610";//按月
|
|
|
+ if (PERIOD_TYPE.equals("609") == false)
|
|
|
+ PERIOD_TYPE = "610";//按月
|
|
|
}
|
|
|
|
|
|
LocalDate EFFECTIVE_DATE = getLocalDate(contractService.get("PURCHASE_START_DATE"));//服务生效日期
|
|
|
@@ -648,6 +658,12 @@ public class contractServiceAdj {
|
|
|
//生效日期之前的一次调整
|
|
|
RowMap lastContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where CONTRACT_SERVICE_ID=? and PURCHASE_START_DATE <=? and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE desc", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
|
|
|
|
|
|
+ RowMap costProduct = DBSql.getMap("select * from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_SERVICE_ID=?", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
|
|
|
+
|
|
|
+ String orderId = costProduct.getString("ORDER_ID");
|
|
|
+ String CONTRACT_COST_ID = costProduct.getString("CONTRACT_COST_ID");
|
|
|
+ String VENDOR_ACCOUNT_ID = DBSql.getString("select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_ORDER where ID=?", new Object[]{orderId});//供应商账户ID
|
|
|
+
|
|
|
Connection conn = null;
|
|
|
try {
|
|
|
conn = DBSql.open();
|
|
|
@@ -669,64 +685,80 @@ public class contractServiceAdj {
|
|
|
String teshuchuliBeginDate = null;
|
|
|
BigDecimal COST_1STMONTH = null;
|
|
|
LocalDate START_DATE = EFFECTIVE_DATE;
|
|
|
- if (StringUtils.isNotBlank(lastPeriodId)) {
|
|
|
|
|
|
- //获取第一笔
|
|
|
|
|
|
- //首月成本
|
|
|
- if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
|
|
|
+ //获取第一笔
|
|
|
+ //首月成本
|
|
|
+ if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
|
|
|
|
|
|
- } else {
|
|
|
- RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where CONTRACT_SERVICE_ID=? and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
|
|
|
+ } else {
|
|
|
+ //首次调整日期
|
|
|
+ RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where CONTRACT_SERVICE_ID=? and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
|
|
|
+
|
|
|
+ LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
|
|
|
|
|
|
- LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
|
|
|
+ //在首月,则要使用首月成本
|
|
|
+ if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
|
|
|
+ teshuchuli = true;
|
|
|
+ teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
|
|
|
+ SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
|
|
|
+ SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
|
|
|
|
|
|
- if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
|
|
|
- teshuchuli = true;
|
|
|
- teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
|
|
|
- SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
|
|
|
- SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
|
|
|
+ BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.lengthOfMonth() - EFFECTIVE_DATE.getDayOfMonth() + 1).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
- BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.lengthOfMonth() - EFFECTIVE_DATE.getDayOfMonth() + 1).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
+ COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
|
|
|
|
|
|
- COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
|
|
|
+ EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
|
|
|
|
|
|
- EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
|
|
|
+ //首月单独一条
|
|
|
+ if (boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH") && !PERIOD_TYPE.equals("609")) {
|
|
|
+ BO paymentPlan = new BO();
|
|
|
+ paymentPlan.set("ORDER_ID", orderId);
|
|
|
+ paymentPlan.set("PLAN_AMOUNT", COST_1STMONTH);
|
|
|
+ paymentPlan.set("PLAN_DATE", teshuchuliBeginDate);
|
|
|
+ paymentPlan.set("PERIOD_BEGIN_DATE", teshuchuliBeginDate);
|
|
|
+ paymentPlan.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
|
|
|
+ paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PLAN_AMOUNT"));
|
|
|
+ paymentPlan.set("CONTRACT_COST_ID", CONTRACT_COST_ID);
|
|
|
+ paymentPlan.set("CONTRACT_SERVICE_ID", orgContractService.getId());
|
|
|
+ paymentPlan.set("PAY_DESC", orgContractService.getString("NAME"));
|
|
|
+ paymentPlan.set("ACCOUNT_PAYEE", VENDOR_ACCOUNT_ID);//收款单位
|
|
|
+ SDK.getBOAPI().createDataBO(boName, paymentPlan, uc, conn);
|
|
|
+
|
|
|
+ COST_1STMONTH = BigDecimal.ZERO;
|
|
|
+ teshuchuli = false;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ if (StringUtils.isNotBlank(lastPeriodId)) {
|
|
|
// 首月单独计费
|
|
|
if (teshuchuli) {
|
|
|
SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
|
|
|
SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));
|
|
|
} else {
|
|
|
SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST"), BigDecimal.class);
|
|
|
-
|
|
|
//拆算成月成本
|
|
|
if (boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH")) {
|
|
|
SERVICE_UNIT_COST = SERVICE_UNIT_COST.divide(new BigDecimal(periodMonths), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
}
|
|
|
-
|
|
|
SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
BO lastServicePeriod = SDK.getBOAPI().get(boName, lastPeriodId);
|
|
|
-
|
|
|
LocalDate last_period_begin_date = getLocalDate(lastServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
-
|
|
|
- lastServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
-
|
|
|
BigDecimal periodRate = getDateRate(last_period_begin_date, EFFECTIVE_DATE.minusDays(1), false);
|
|
|
-
|
|
|
- lastServicePeriod.set("PLAN_AMOUNT", multiply(SERVICE_TOTAL_COST, periodRate));
|
|
|
- lastServicePeriod.set("REMAIN_AMOUNT", lastServicePeriod.get("PLAN_AMOUNT"));
|
|
|
-
|
|
|
- SDK.getBOAPI().update(boName, lastServicePeriod, conn);
|
|
|
+ if (periodRate.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ lastServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
|
|
|
+ lastServicePeriod.set("PLAN_AMOUNT", multiply(SERVICE_TOTAL_COST, periodRate));
|
|
|
+ lastServicePeriod.set("REMAIN_AMOUNT", lastServicePeriod.get("PLAN_AMOUNT"));
|
|
|
+ SDK.getBOAPI().update(boName, lastServicePeriod, conn);
|
|
|
+ } else {
|
|
|
+ SDK.getBOAPI().remove(boName, lastPeriodId, conn);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//获取服务周期
|
|
|
List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, contractService.getString("PURCHASE_CALC_METHOD_1STPERIOD"), "4638", contractService.getString("MONTH_1STQUARTER"));
|
|
|
|
|
|
@@ -738,11 +770,7 @@ public class contractServiceAdj {
|
|
|
}
|
|
|
|
|
|
SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
|
|
|
- RowMap costProduct = DBSql.getMap("select * from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_SERVICE_ID=?", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
|
|
|
|
|
|
- String orderId = costProduct.getString("ORDER_ID");
|
|
|
- String CONTRACT_COST_ID = costProduct.getString("CONTRACT_COST_ID");
|
|
|
- String VENDOR_ACCOUNT_ID = DBSql.getString("select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_ORDER where ID=?", new Object[]{orderId});//供应商账户ID
|
|
|
if (periodList != null && periodList.size() > 0) {
|
|
|
|
|
|
int i = 0;
|