|
@@ -23,6 +23,7 @@ import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
|
|
|
|
import static com.awspaas.user.apps.donenow_ctt.service.CityAbbreviationUtil.getCityAbbreviation;
|
|
import static com.awspaas.user.apps.donenow_ctt.service.CityAbbreviationUtil.getCityAbbreviation;
|
|
|
|
|
+import static org.apache.fop.fonts.type1.AdobeStandardEncoding.period;
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -341,11 +342,16 @@ public class contractService {
|
|
|
List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("CONTRACT_ID =", contract.get("ID")).list();
|
|
List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("CONTRACT_ID =", contract.get("ID")).list();
|
|
|
|
|
|
|
|
for (BO service : serviceList) {
|
|
for (BO service : serviceList) {
|
|
|
- AddServiceServiceBundleOne(uc, conn, contract, service);
|
|
|
|
|
|
|
+ // AddServiceServiceBundleOne(uc, conn, contract, service);
|
|
|
|
|
|
|
|
- ServiceAutoRenew(uc, service, END_DATE, conn);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ //新增服务周期
|
|
|
|
|
+ AddService(uc, conn, contract, service);
|
|
|
|
|
+
|
|
|
|
|
+ // ServiceAutoRenew(uc, service, END_DATE, conn);
|
|
|
|
|
|
|
|
|
|
+ //修改合同结束日期
|
|
|
|
|
+ ServiceAdjustEndDate(uc, service, END_DATE, conn);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
conn.commit();
|
|
conn.commit();
|
|
|
return true;
|
|
return true;
|
|
@@ -444,10 +450,20 @@ public class contractService {
|
|
|
SATRT_DATE = firstPeriodEnd.plusDays(1);
|
|
SATRT_DATE = firstPeriodEnd.plusDays(1);
|
|
|
}
|
|
}
|
|
|
servicePeriod.set("PERIOD_END_DATE", new_period_end_date);
|
|
servicePeriod.set("PERIOD_END_DATE", new_period_end_date);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
|
|
servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(DateRateCalculator(period_begin_date, new_period_end_date, false), (GetPeriodMonth(maxPeriod)));
|
|
|
|
|
+
|
|
|
|
|
+ servicePeriod.set("PERIOD_PRICE", multiply(service.get("TOTAL_COST"), periodRate));
|
|
|
|
|
+ servicePeriod.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRate));
|
|
|
|
|
+ servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
|
|
|
|
|
+
|
|
|
servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
} else {
|
|
} else {
|
|
@@ -468,8 +484,10 @@ public class contractService {
|
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
|
LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
|
- periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
|
|
|
|
+ // periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
periodEnd = END_DATE;
|
|
periodEnd = END_DATE;
|
|
|
|
|
+
|
|
|
|
|
+ periodRate = divideToBigDecimal(DateRateCalculator(SATRT_DATE, periodEnd, false), (GetPeriodMonth(maxPeriod)));
|
|
|
}
|
|
}
|
|
|
BO csp = new BO();//服务周期
|
|
BO csp = new BO();//服务周期
|
|
|
csp.setAll(servicePeriod.asMap());
|
|
csp.setAll(servicePeriod.asMap());
|
|
@@ -517,10 +535,19 @@ public class contractService {
|
|
|
servicePeriod.set("PERIOD_END_DATE", END_DATE);
|
|
servicePeriod.set("PERIOD_END_DATE", END_DATE);
|
|
|
LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
|
|
LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
+ /*
|
|
|
BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, period_end_date));
|
|
BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
|
|
|
servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
|
|
|
servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
|
|
servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(DateRateCalculator(period_begin_date, END_DATE, false), (GetPeriodMonth(service.getString("PERIOD_TYPE"))));
|
|
|
|
|
+
|
|
|
|
|
+ servicePeriod.set("PERIOD_PRICE", multiply(service.get("TOTAL_COST"), periodRate));
|
|
|
|
|
+ servicePeriod.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRate));
|
|
|
|
|
+ servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
|
|
|
|
|
+
|
|
|
servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
|
|
|
|
@@ -559,9 +586,12 @@ public class contractService {
|
|
|
new_period_end_date = firstPeriodEnd;
|
|
new_period_end_date = firstPeriodEnd;
|
|
|
SATRT_DATE = firstPeriodEnd.plusDays(1);
|
|
SATRT_DATE = firstPeriodEnd.plusDays(1);
|
|
|
}
|
|
}
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
|
|
|
|
+ // BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
|
|
|
|
|
+ // payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(DateRateCalculator(period_begin_date, new_period_end_date, false), (GetPeriodMonth(maxPeriod)));
|
|
|
|
|
|
|
|
- payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
|
|
|
|
|
|
|
+ payPeriod.set("PLAN_AMOUNT", multiply(SERVICE_TOTAL_COST, periodRate));//计划付款金额
|
|
|
payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
|
|
payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
|
|
|
SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
|
|
SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
|
|
|
} else {
|
|
} else {
|
|
@@ -575,8 +605,11 @@ public class contractService {
|
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
|
LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
|
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
|
- periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
|
|
|
|
+ //periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
|
|
|
periodEnd = END_DATE;
|
|
periodEnd = END_DATE;
|
|
|
|
|
+
|
|
|
|
|
+ periodRate = divideToBigDecimal(DateRateCalculator(SATRT_DATE, END_DATE, false), (GetPeriodMonth(maxPeriod)));
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
|
|
ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
|
|
@@ -602,8 +635,13 @@ public class contractService {
|
|
|
|
|
|
|
|
BO payPeriod = payPeriodList.get(0);
|
|
BO payPeriod = payPeriodList.get(0);
|
|
|
LocalDate period_begin_date = getLocalDate(payPeriod.get("PLAN_DATE"));
|
|
LocalDate period_begin_date = getLocalDate(payPeriod.get("PLAN_DATE"));
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, PERIOD_END));
|
|
|
|
|
- payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, PERIOD_END));
|
|
|
|
|
+ // payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal periodRate = divideToBigDecimal(DateRateCalculator(period_begin_date, END_DATE, false), (GetPeriodMonth(service.getString("PURCHASE_PERIOD_TYPE"))));
|
|
|
|
|
+ payPeriod.set("PLAN_AMOUNT", multiply(SERVICE_TOTAL_COST, periodRate));//计划付款金额
|
|
|
|
|
+
|
|
|
payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
|
|
payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
|
|
|
SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
|
|
SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
|
|
|
|
|
|
|
@@ -834,8 +872,14 @@ public class contractService {
|
|
|
//如果不是从一号开始,则需要调整到从1号开始
|
|
//如果不是从一号开始,则需要调整到从1号开始
|
|
|
if (StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601") && START_DATE.getDayOfMonth() != 1) {
|
|
if (StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601") && START_DATE.getDayOfMonth() != 1) {
|
|
|
//本月底日期
|
|
//本月底日期
|
|
|
|
|
+ /*
|
|
|
LocalDate currMontLastDay = START_DATE.with(TemporalAdjusters.lastDayOfMonth());
|
|
LocalDate currMontLastDay = START_DATE.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
- if (currMontLastDay.isBefore(END_DATE)) START_DATE = currMontLastDay.plusDays(1);//周期开始日期
|
|
|
|
|
|
|
+ if (currMontLastDay.isBefore(END_DATE))
|
|
|
|
|
+ START_DATE = currMontLastDay.plusDays(1);//周期开始日期
|
|
|
|
|
+
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ START_DATE = START_DATE.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
|
|
BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
|
|
@@ -899,12 +943,17 @@ public class contractService {
|
|
|
if (!isStartOfPeriod) {
|
|
if (!isStartOfPeriod) {
|
|
|
BigDecimal periodRate;
|
|
BigDecimal periodRate;
|
|
|
//如果生效日期在合同开始日期之前
|
|
//如果生效日期在合同开始日期之前
|
|
|
|
|
+ /*
|
|
|
if (EFFECTIVE_DATE.isBefore(START_DATE)) {
|
|
if (EFFECTIVE_DATE.isBefore(START_DATE)) {
|
|
|
int priodDays = GetPeriodDays(getPreviousPeriodStart(end.plusDays(1), String.valueOf(maxPeriod)), end);
|
|
int priodDays = GetPeriodDays(getPreviousPeriodStart(end.plusDays(1), String.valueOf(maxPeriod)), end);
|
|
|
periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), priodDays);
|
|
periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), priodDays);
|
|
|
} else {
|
|
} else {
|
|
|
periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), GetPeriodDays(start, end)); // 首周期占整周期比例
|
|
periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), GetPeriodDays(start, end)); // 首周期占整周期比例
|
|
|
- }
|
|
|
|
|
|
|
+ }*/
|
|
|
|
|
+
|
|
|
|
|
+ //计算日期之间的比例值
|
|
|
|
|
+ periodRate = divideToBigDecimal(DateRateCalculator(EFFECTIVE_DATE, end, false), (GetPeriodMonth(String.valueOf(maxPeriod))));
|
|
|
|
|
+
|
|
|
BO csa = new BO();//合同服务调整
|
|
BO csa = new BO();//合同服务调整
|
|
|
csa.set("CONTRACT_ID", contract.get("ID"));
|
|
csa.set("CONTRACT_ID", contract.get("ID"));
|
|
|
csa.set("OBJECT_ID", service.get("OBJECT_ID"));
|
|
csa.set("OBJECT_ID", service.get("OBJECT_ID"));
|
|
@@ -959,8 +1008,11 @@ public class contractService {
|
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
BigDecimal periodRate = BigDecimal.ONE;
|
|
|
LocalDate periodEnd = getNextPeriodStart(start, String.valueOf(maxPeriod)).minusDays(1);//本周期结束时间
|
|
LocalDate periodEnd = getNextPeriodStart(start, String.valueOf(maxPeriod)).minusDays(1);//本周期结束时间
|
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
|
|
|
- periodRate = divideToBigDecimal(GetPeriodDays(start, END_DATE), GetPeriodDays(start, periodEnd));
|
|
|
|
|
|
|
+ // periodRate = divideToBigDecimal(GetPeriodDays(start, END_DATE), GetPeriodDays(start, periodEnd));
|
|
|
|
|
+
|
|
|
periodEnd = END_DATE;
|
|
periodEnd = END_DATE;
|
|
|
|
|
+ //计算日期之间的比例值
|
|
|
|
|
+ periodRate = divideToBigDecimal(DateRateCalculator(start, periodEnd, false), (GetPeriodMonth(String.valueOf(maxPeriod))));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BO csp = new BO();//服务周期
|
|
BO csp = new BO();//服务周期
|
|
@@ -1021,6 +1073,282 @@ public class contractService {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 添加合同服务
|
|
|
|
|
+ * @param uc
|
|
|
|
|
+ * @param contract
|
|
|
|
|
+ * @param service
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public boolean AddService(UserContext uc, Connection conn, RowMap contract, BO service) {
|
|
|
|
|
+ // 1、合同开始日期或结束日期变化
|
|
|
|
|
+ LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
|
|
|
|
|
+ LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
|
|
|
|
|
+ LocalDate EFFECTIVE_DATE = getLocalDate(service.get("EFFECTIVE_DATE"));//服务生效日期
|
|
|
|
|
+
|
|
|
|
|
+ //已经审批并提交则不能重新生成服务
|
|
|
|
|
+ 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 BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")}) > 0) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //删除历史数据
|
|
|
|
|
+ List<String> cspIdList = DBSql.getList(conn, "select ID from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where BINDID=? and CONTRACT_ID=? and OBJECT_ID=? and CONTRACT_SERVICE_ID=?", String.class, new Object[]{service.get("BINDID"), contract.get("ID"), service.get("OBJECT_ID"), service.get("ID")});
|
|
|
|
|
+ for (String cspId : cspIdList) {
|
|
|
|
|
+ DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE where BINDID=? and CONTRACT_SERVICE_PERIOD_ID=? ", new Object[]{service.get("BINDID"), cspId});
|
|
|
|
|
+ }
|
|
|
|
|
+ DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where BINDID=? and CONTRACT_ID=? and OBJECT_ID=? and CONTRACT_SERVICE_ID=?", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("OBJECT_ID"), service.get("ID")});
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ String PERIOD_TYPE = service.getString("PERIOD_TYPE");//服务周期类型
|
|
|
|
|
+ String vendor_account_id = DBSql.getString(conn, "select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});//供应商账号
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
|
|
|
|
|
+ //需要采购
|
|
|
|
|
+ if (service.getString("NEED_PURCHASE").equals("1")) {
|
|
|
|
|
+ BigDecimal prate = GetPeriodRate(service.getString("PERIOD_TYPE"), service.getString("PURCHASE_PERIOD_TYPE"));
|
|
|
|
|
+ SERVICE_UNIT_COST = SERVICE_UNIT_COST.multiply(prate);
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));//服务总成本
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal SERVICE_UNIT_PRICE = service.get("UNIT_PRICE", BigDecimal.class);
|
|
|
|
|
+ BigDecimal SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, service.get("QUANTITY"));
|
|
|
|
|
+
|
|
|
|
|
+ List<String> sbsList = null;
|
|
|
|
|
+ String serviceIds = DBSql.getString("select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.get("OBJECT_ID")});
|
|
|
|
|
+ if (StringUtils.isNotBlank(serviceIds)) {
|
|
|
|
|
+ sbsList = Arrays.asList(serviceIds.split(","));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //获取服务周期
|
|
|
|
|
+ List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, END_DATE, true, true, -1);
|
|
|
|
|
+
|
|
|
|
|
+ String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
|
|
|
|
|
+
|
|
|
|
|
+ for (PeriodCalculationUtil.Period period : periodList) {
|
|
|
|
|
+
|
|
|
|
|
+ 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", period.getPeriodBeginDateStr());
|
|
|
|
|
+ csp.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("QUANTITY", service.get("QUANTITY"));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //更新合同服务上的
|
|
|
|
|
+ DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, StringUtils.EMPTY, service.get("ID"), service.get("BINDID")});
|
|
|
|
|
+ service.set("PERIOD", PERIOD);
|
|
|
|
|
+ service.set("ADJUST_PERIOD", StringUtils.EMPTY);
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 调整服务的结束日期(延长周期或是缩短周期)
|
|
|
|
|
+ * @param uc
|
|
|
|
|
+ * @param service
|
|
|
|
|
+ * @param END_DATE
|
|
|
|
|
+ * @param conn
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public boolean ServiceAdjustEndDate(UserContext uc, BO service, LocalDate END_DATE, Connection conn) {
|
|
|
|
|
+
|
|
|
|
|
+ String PERIOD_TYPE = service.getString("PERIOD_TYPE");//服务周期类型
|
|
|
|
|
+ //已经审批并提交则不能重新生成服务
|
|
|
|
|
+ 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 BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{service.get("BINDID"), service.get("CONTRACT_ID"), service.get("ID"), LocalDateYYYYMMDD(END_DATE)}) > 0) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //获取最后一笔
|
|
|
|
|
+ RowMap lastPeriod = DBSql.getMap(conn, "select * from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_ID=? and CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE<=? order by PERIOD_BEGIN_DATE desc", new Object[]{service.get("CONTRACT_ID"), service.get("ID"), LocalDateYYYYMMDD(END_DATE)});
|
|
|
|
|
+
|
|
|
|
|
+ if (lastPeriod != null) {
|
|
|
|
|
+ LocalDate lastPeriodBeginDate = getLocalDate(lastPeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
|
|
+ LocalDate lastPeriodEndDate = getLocalDate(lastPeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
+
|
|
|
|
|
+ //删除 新结束日期之后的服务周期
|
|
|
|
|
+ List<String> periodIds = DBSql.getList(conn, "select ID from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_ID=? and CONTRACT_SERVICE_ID=? AND PERIOD_BEGIN_DATE>?", String.class, new Object[]{service.get("CONTRACT_ID"), service.get("ID"), LocalDateYYYYMMDD(END_DATE)});
|
|
|
|
|
+ if (periodIds.isEmpty() == false && periodIds.size() > 0) {
|
|
|
|
|
+ DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_ID=? and CONTRACT_SERVICE_ID=? AND PERIOD_BEGIN_DATE>?", new Object[]{service.get("CONTRACT_ID"), service.get("ID"), LocalDateYYYYMMDD(END_DATE)});
|
|
|
|
|
+
|
|
|
|
|
+ for (String periodId : periodIds) {
|
|
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID=?", new Object[]{periodId});
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //修改周期
|
|
|
|
|
+ if (END_DATE.equals(lastPeriodEndDate) == false) {
|
|
|
|
|
+ //获取服务周期
|
|
|
|
|
+ List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getAdjustPeriodList(PERIOD_TYPE, lastPeriodBeginDate, lastPeriodEndDate, true, END_DATE);
|
|
|
|
|
+ BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
|
|
|
|
|
+ //需要采购
|
|
|
|
|
+ if (service.getString("NEED_PURCHASE").equals("1")) {
|
|
|
|
|
+ BigDecimal prate = GetPeriodRate(service.getString("PERIOD_TYPE"), service.getString("PURCHASE_PERIOD_TYPE"));
|
|
|
|
|
+ SERVICE_UNIT_COST = SERVICE_UNIT_COST.multiply(prate);
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));//服务总成本
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal SERVICE_UNIT_PRICE = service.get("UNIT_PRICE", BigDecimal.class);
|
|
|
|
|
+ BigDecimal SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, service.get("QUANTITY"));
|
|
|
|
|
+
|
|
|
|
|
+ List<String> sbsList = null;
|
|
|
|
|
+ String serviceIds = DBSql.getString("select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.get("OBJECT_ID")});
|
|
|
|
|
+ if (StringUtils.isNotBlank(serviceIds)) {
|
|
|
|
|
+ sbsList = Arrays.asList(serviceIds.split(","));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String vendor_account_id = lastPeriod.getString("VENDOR_ACCOUNT_ID");
|
|
|
|
|
+
|
|
|
|
|
+ for (PeriodCalculationUtil.Period period : periodList) {
|
|
|
|
|
+
|
|
|
|
|
+ //第一个周期 更新
|
|
|
|
|
+ if (period.getPeriodBeginDateStr().equals(LocalDateYYYYMMDD(lastPeriodBeginDate))) {
|
|
|
|
|
+
|
|
|
|
|
+ BO lastPeriodBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", lastPeriod.getString("ID"));
|
|
|
|
|
+ lastPeriodBO.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
|
|
|
|
|
+ lastPeriodBO.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
|
|
|
|
|
+ lastPeriodBO.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
|
|
|
|
|
+ lastPeriodBO.set("PERIOD_ADJUSTED_PRICE", lastPeriodBO.get("PERIOD_PRICE"));
|
|
|
|
|
+ lastPeriodBO.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", lastPeriodBO, conn);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ //新增
|
|
|
|
|
+ BO csp = new BO();//服务周期
|
|
|
|
|
+ csp.set("CONTRACT_ID", service.get("CONTRACT_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", period.getPeriodBeginDateStr());
|
|
|
|
|
+ csp.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("QUANTITY", service.get("QUANTITY"));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
|
|
|
|
|
+
|
|
|
|
|
+ csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ RowMap lastPayPeriod = DBSql.getMap(conn, "select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE<=? order by PLAN_DATE desc", new Object[]{service.get("ID"), LocalDateYYYYMMDD(END_DATE)});
|
|
|
|
|
+ if (lastPayPeriod != null) {
|
|
|
|
|
+
|
|
|
|
|
+ PERIOD_TYPE = service.getString("PURCHASE_PERIOD_TYPE");//采购周期类型
|
|
|
|
|
+ LocalDate lastPeriodBeginDate = getLocalDate(lastPayPeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
|
|
+ LocalDate lastPeriodEndDate = getLocalDate(lastPayPeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
+
|
|
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE>? and (PLAN_AMOUNT=0 or PLAN_AMOUNT is NULL)", new Object[]{service.getString("ID"), LocalDateYYYYMMDD(END_DATE)});
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
|
|
|
|
|
+ BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));//服务总成本
|
|
|
|
|
+
|
|
|
|
|
+ String CONTRACT_COST_ID = lastPayPeriod.getString("CONTRACT_COST_ID");
|
|
|
|
|
+ String PAY_DESC = lastPayPeriod.getString("PAY_DESC");
|
|
|
|
|
+ String ACCOUNT_PAYEE = lastPayPeriod.getString("ACCOUNT_PAYEE");
|
|
|
|
|
+
|
|
|
|
|
+ List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getAdjustPeriodList(PERIOD_TYPE, lastPeriodBeginDate, lastPeriodEndDate, true, END_DATE);
|
|
|
|
|
+ for (PeriodCalculationUtil.Period period : periodList) {
|
|
|
|
|
+
|
|
|
|
|
+ //第一个周期 更新
|
|
|
|
|
+ if (period.getPeriodBeginDateStr().equals(LocalDateYYYYMMDD(lastPeriodBeginDate))) {
|
|
|
|
|
+
|
|
|
|
|
+ BO lastPeriodBO = SDK.getBOAPI().get("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", lastPayPeriod.getString("ID"));
|
|
|
|
|
+ lastPeriodBO.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
|
|
|
|
|
+ lastPeriodBO.set("PLAN_AMOUNT", period.getRate().multiply(SERVICE_TOTAL_COST));
|
|
|
|
|
+ lastPeriodBO.set("REMAIN_AMOUNT", lastPeriodBO.get("PLAN_AMOUNT"));
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", lastPeriodBO, conn);
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
|
|
|
|
|
+
|
|
|
|
|
+ BO paymentPlan = new BO();
|
|
|
|
|
+ paymentPlan.setBindId(processInstance.getId());
|
|
|
|
|
+ paymentPlan.set("ORDER_ID", null);
|
|
|
|
|
+ paymentPlan.set("PLAN_DATE", period.getPeriodBeginDateStr());
|
|
|
|
|
+ paymentPlan.set("PLAN_AMOUNT", period.getRate().multiply(SERVICE_TOTAL_COST));
|
|
|
|
|
+ paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PLAN_AMOUNT"));
|
|
|
|
|
+ paymentPlan.set("CONTRACT_COST_ID", CONTRACT_COST_ID);
|
|
|
|
|
+ paymentPlan.set("CONTRACT_SERVICE_ID", service.getId());
|
|
|
|
|
+ paymentPlan.set("PAY_DESC", PAY_DESC);
|
|
|
|
|
+ paymentPlan.set("PERIOD_BEGIN_DATE", period.getPeriodBeginDateStr());
|
|
|
|
|
+ paymentPlan.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
|
|
|
|
|
+ paymentPlan.set("ACCOUNT_PAYEE", ACCOUNT_PAYEE);//收款单位
|
|
|
|
|
+
|
|
|
|
|
+ SDK.getBOAPI().create("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", paymentPlan, processInstance, uc);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 调整服务
|
|
* 调整服务
|
|
|
* @param uc
|
|
* @param uc
|
|
@@ -1029,6 +1357,9 @@ public class contractService {
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
public boolean EditServiceServiceBundle(UserContext uc, Connection conn, RowMap contract, BO editService) {
|
|
public boolean EditServiceServiceBundle(UserContext uc, Connection conn, RowMap contract, BO editService) {
|
|
|
|
|
+
|
|
|
|
|
+ //2025年10月30日 计算有问题 后续 在修改
|
|
|
|
|
+
|
|
|
//2、服务调整:生效日期在合同开始日期和合同结束日期之间;已审批服务周期之后的日期;
|
|
//2、服务调整:生效日期在合同开始日期和合同结束日期之间;已审批服务周期之后的日期;
|
|
|
// 3、服务周期分为调整前和调整后两个周期;生效日期之后按照新的数量、单价重新生成服务周期;
|
|
// 3、服务周期分为调整前和调整后两个周期;生效日期之后按照新的数量、单价重新生成服务周期;
|
|
|
contractServiceLogger.info("调整服务");
|
|
contractServiceLogger.info("调整服务");
|
|
@@ -1639,7 +1970,7 @@ public class contractService {
|
|
|
contractServiceLogger.info("计算合同成本周期:" + service);
|
|
contractServiceLogger.info("计算合同成本周期:" + service);
|
|
|
|
|
|
|
|
// 需要通过采购计算总成本
|
|
// 需要通过采购计算总成本
|
|
|
- List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(service.get("PURCHASE_PERIOD_TYPE"), LocalDate.parse(service.get("CONTRACT_START_DATE").substring(0, 10)), LocalDate.parse(service.get("PURCHASE_START_DATE").substring(0, 10)), LocalDate.parse(service.get("CONTRACT_END_DATE").substring(0, 10)), service.get("PURCHASE_PERIOD_TYPE").equals("610"));
|
|
|
|
|
|
|
+ List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(service.get("PURCHASE_PERIOD_TYPE"), LocalDate.parse(service.get("CONTRACT_START_DATE").substring(0, 10)), LocalDate.parse(service.get("PURCHASE_START_DATE").substring(0, 10)), LocalDate.parse(service.get("CONTRACT_END_DATE").substring(0, 10)), service.get("PURCHASE_PERIOD_TYPE").equals("610"), true, -1);
|
|
|
|
|
|
|
|
BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
EXTENDED_COST = EXTENDED_COST.multiply(rate);
|
|
EXTENDED_COST = EXTENDED_COST.multiply(rate);
|
|
@@ -1976,6 +2307,71 @@ public class contractService {
|
|
|
return num.divide(den, 10, RoundingMode.HALF_UP); // 保留 10 位小数
|
|
return num.divide(den, 10, RoundingMode.HALF_UP); // 保留 10 位小数
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算日期区间的比例值
|
|
|
|
|
+ * @param start 起始日期
|
|
|
|
|
+ * @param end 结束日期
|
|
|
|
|
+ * @param use30DaysPerMonth 是否按每月30天计算(true=固定30天,false=实际天数)
|
|
|
|
|
+ * @return 比例值(起始月剩余比例 + 中间完整月数 + 结束月已过比例)
|
|
|
|
|
+ */
|
|
|
|
|
+ public static BigDecimal DateRateCalculator(LocalDate start, LocalDate end, boolean use30DaysPerMonth) {
|
|
|
|
|
+ // 校验日期合法性:start不能晚于end
|
|
|
|
|
+ if (start.isAfter(end)) {
|
|
|
|
|
+ return BigDecimal.ZERO; // 或抛出异常
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ int startYear = start.getYear();
|
|
|
|
|
+ int startMonth = start.getMonthValue();
|
|
|
|
|
+ int endYear = end.getYear();
|
|
|
|
|
+ int endMonth = end.getMonthValue();
|
|
|
|
|
+
|
|
|
|
|
+ // 情况1:start和end在同一个月
|
|
|
|
|
+ if (startYear == endYear && startMonth == endMonth) {
|
|
|
|
|
+ int totalDaysInMonth = use30DaysPerMonth ? 30 : start.lengthOfMonth();
|
|
|
|
|
+ int daysBetween = end.getDayOfMonth() - start.getDayOfMonth() + 1; // 包含首尾
|
|
|
|
|
+ return BigDecimal.valueOf(daysBetween).divide(BigDecimal.valueOf(totalDaysInMonth), 10, RoundingMode.HALF_UP);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 情况2:start和end在不同月份
|
|
|
|
|
+ // 1. 起始月剩余比例:(当月剩余天数)÷ 当月总天数
|
|
|
|
|
+ int startMonthTotalDays = use30DaysPerMonth ? 30 : start.lengthOfMonth();
|
|
|
|
|
+ int startRemainingDays = startMonthTotalDays - start.getDayOfMonth() + 1; // 包含start当天
|
|
|
|
|
+ BigDecimal startRatio = BigDecimal.valueOf(startRemainingDays).divide(BigDecimal.valueOf(startMonthTotalDays), 10, RoundingMode.HALF_UP);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 中间完整月数:start的下一个月 到 end的上一个月之间的完整月份
|
|
|
|
|
+ int fullMonths = 0;
|
|
|
|
|
+ int currentYear = startYear;
|
|
|
|
|
+ int currentMonth = startMonth + 1;
|
|
|
|
|
+ if (currentMonth > 12) { // 处理跨年(如12月→次年1月)
|
|
|
|
|
+ currentMonth = 1;
|
|
|
|
|
+ currentYear++;
|
|
|
|
|
+ }
|
|
|
|
|
+ int endPrevYear = endYear;
|
|
|
|
|
+ int endPrevMonth = endMonth - 1;
|
|
|
|
|
+ if (endPrevMonth < 1) { // 处理跨年(如1月→上年12月)
|
|
|
|
|
+ endPrevMonth = 12;
|
|
|
|
|
+ endPrevYear--;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 累加中间完整月数
|
|
|
|
|
+ while (currentYear < endPrevYear || (currentYear == endPrevYear && currentMonth <= endPrevMonth)) {
|
|
|
|
|
+ fullMonths++;
|
|
|
|
|
+ currentMonth++;
|
|
|
|
|
+ if (currentMonth > 12) {
|
|
|
|
|
+ currentMonth = 1;
|
|
|
|
|
+ currentYear++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 结束月已过比例:(当月已过天数)÷ 当月总天数
|
|
|
|
|
+ int endMonthTotalDays = use30DaysPerMonth ? 30 : end.lengthOfMonth();
|
|
|
|
|
+ int endPassedDays = end.getDayOfMonth(); // 从1日到end当天的天数
|
|
|
|
|
+ BigDecimal endRatio = BigDecimal.valueOf(endPassedDays).divide(BigDecimal.valueOf(endMonthTotalDays), 10, RoundingMode.HALF_UP);
|
|
|
|
|
+
|
|
|
|
|
+ // 总和:起始比例 + 完整月数 + 结束比例
|
|
|
|
|
+ return startRatio.add(BigDecimal.valueOf(fullMonths)).add(endRatio);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 相除
|
|
* 相除
|
|
|
* @param numerator
|
|
* @param numerator
|