|
@@ -161,12 +161,13 @@ public class contractService {
|
|
|
{
|
|
{
|
|
|
try {
|
|
try {
|
|
|
|
|
|
|
|
|
|
+ contractServiceLogger.info("服务---服务");
|
|
|
|
|
+
|
|
|
boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
|
|
boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
|
|
|
|
|
|
|
|
|
|
+ contractServiceLogger.info("服务产品---服务产品");
|
|
|
AddContractServiceProduct(uc, dto);//新增服务或者服务包--关联产品
|
|
AddContractServiceProduct(uc, dto);//新增服务或者服务包--关联产品
|
|
|
-
|
|
|
|
|
//更新服务产品价格
|
|
//更新服务产品价格
|
|
|
-
|
|
|
|
|
if (!flag) {
|
|
if (!flag) {
|
|
|
resultDto.put("success", false);
|
|
resultDto.put("success", false);
|
|
|
resultDto.put("msg", "新增服务或服务包失败!");
|
|
resultDto.put("msg", "新增服务或服务包失败!");
|
|
@@ -258,19 +259,158 @@ public class contractService {
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
public boolean AddServiceServiceBundle(UserContext uc, RowMap contract) throws SQLException {
|
|
public boolean AddServiceServiceBundle(UserContext uc, RowMap contract) throws SQLException {
|
|
|
-
|
|
|
|
|
contractServiceLogger.info("新增服务或服务包");
|
|
contractServiceLogger.info("新增服务或服务包");
|
|
|
-
|
|
|
|
|
Connection conn = null;
|
|
Connection conn = null;
|
|
|
try {
|
|
try {
|
|
|
conn = DBSql.open();
|
|
conn = DBSql.open();
|
|
|
conn.setAutoCommit(false);
|
|
conn.setAutoCommit(false);
|
|
|
|
|
|
|
|
|
|
+ LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
|
|
|
|
|
+ LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
|
|
|
|
|
+
|
|
|
//获取服务列表
|
|
//获取服务列表
|
|
|
- List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).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);
|
|
|
|
|
+
|
|
|
|
|
+ contractServiceLogger.info("判断合同结束日期是否修改");
|
|
|
|
|
+
|
|
|
|
|
+ //如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
|
|
|
|
|
+ String PERIOD = service.getString("PERIOD");//服务起止日期
|
|
|
|
|
+ String ADJUST_PERIOD = service.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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ 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"));
|
|
|
|
|
+ //延长
|
|
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", PERIOD_END).orderBy("PERIOD_BEGIN_DATE").desc().list();
|
|
|
|
|
+
|
|
|
|
|
+ BO servicePeriod = servicePeriodList.get(0);
|
|
|
|
|
+ LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
|
|
+ LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
|
|
|
|
|
+
|
|
|
|
|
+ String maxPeriod = servicePeriod.getString("PERIOD_TYPE");
|
|
|
|
|
+ LocalDate firstPeriodEnd = getNextPeriodStart(period_begin_date, maxPeriod).minusDays(1);//本周期结束时间
|
|
|
|
|
+ LocalDate SATRT_DATE = null;
|
|
|
|
|
+ if (period_end_date.isBefore(firstPeriodEnd)) {
|
|
|
|
|
+ LocalDate new_period_end_date;
|
|
|
|
|
+ if (END_DATE.isBefore(firstPeriodEnd)) {
|
|
|
|
|
+ new_period_end_date = END_DATE;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ new_period_end_date = firstPeriodEnd;
|
|
|
|
|
+ SATRT_DATE = firstPeriodEnd.plusDays(1);
|
|
|
|
|
+ }
|
|
|
|
|
+ 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));
|
|
|
|
|
+ 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"));
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ SATRT_DATE = period_end_date.plusDays(1);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (SATRT_DATE != null && SATRT_DATE.isBefore(END_DATE)) {
|
|
|
|
|
+
|
|
|
|
|
+ //服务包上的服务
|
|
|
|
|
+ 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(","));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //循环添加全部周期
|
|
|
|
|
+ while (!SATRT_DATE.isAfter(END_DATE)) {
|
|
|
|
|
+ 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(servicePeriod.asMap());
|
|
|
|
|
+ csp.set("PERIOD_BEGIN_DATE", SATRT_DATE);
|
|
|
|
|
+ csp.set("PERIOD_END_DATE", periodEnd);
|
|
|
|
|
+ BigDecimal period_price = multiply(service.get("UNIT_PRICE"), service.get("QUANTITY"));
|
|
|
|
|
+ period_price = periodRate.multiply(period_price);
|
|
|
|
|
+ csp.set("PERIOD_PRICE", period_price);
|
|
|
|
|
+ BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.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 (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", 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ contractServiceLogger.info("服务周期缩短--" + service.getString("NAME"));
|
|
|
|
|
+ //缩短
|
|
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", END_DATE).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
|
|
+
|
|
|
|
|
+ BO servicePeriod = servicePeriodList.get(0);
|
|
|
|
|
+ servicePeriod.set("PERIOD_END_DATE", END_DATE);
|
|
|
|
|
+ LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_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));
|
|
|
|
|
+ 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"));
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
|
|
|
|
|
+
|
|
|
|
|
+ for (BO period : servicePeriodList) {
|
|
|
|
|
+ //删除
|
|
|
|
|
+ if (period.getString("ID").equals(servicePeriod.getString("ID")) == false) {
|
|
|
|
|
+
|
|
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID=?", new Object[]{period.getString("ID")});
|
|
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE ID=?", new Object[]{period.getString("ID")});
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, ADJUST_PERIOD, service.get("ID"), service.get("BINDID")});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -301,6 +441,9 @@ public class contractService {
|
|
|
public boolean AddServiceServiceBundleOne(UserContext uc, Connection conn, RowMap contract, BO service) {
|
|
public boolean AddServiceServiceBundleOne(UserContext uc, Connection conn, RowMap contract, BO service) {
|
|
|
if (service == null)
|
|
if (service == null)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
+
|
|
|
|
|
+ contractServiceLogger.info("AddServiceServiceBundleOne--开始");
|
|
|
|
|
+
|
|
|
boolean isCreate = false;
|
|
boolean isCreate = false;
|
|
|
// 1、合同开始日期或结束日期变化
|
|
// 1、合同开始日期或结束日期变化
|
|
|
LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
|
|
LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
|
|
@@ -342,6 +485,7 @@ public class contractService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
String effectiveDateStr = EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
String effectiveDateStr = EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
effectiveDateStr = "%" + effectiveDateStr + "%";
|
|
effectiveDateStr = "%" + effectiveDateStr + "%";
|
|
|
//生效日期修改了
|
|
//生效日期修改了
|
|
@@ -350,7 +494,7 @@ public class contractService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- //2、服务单价或数量变化???
|
|
|
|
|
|
|
+ //2、服务单价或数量变化
|
|
|
if (service.get("ADJUSTED_PRICE") == null || StringUtils.isBlank(service.getString("ADJUSTED_PRICE"))) {
|
|
if (service.get("ADJUSTED_PRICE") == null || StringUtils.isBlank(service.getString("ADJUSTED_PRICE"))) {
|
|
|
isCreate = true;
|
|
isCreate = true;
|
|
|
} else {
|
|
} else {
|
|
@@ -362,6 +506,7 @@ public class contractService {
|
|
|
isCreate = true;
|
|
isCreate = true;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ */
|
|
|
|
|
|
|
|
if (!isCreate)
|
|
if (!isCreate)
|
|
|
return true;
|
|
return true;
|
|
@@ -369,28 +514,22 @@ public class contractService {
|
|
|
//服务已经审批并提交则不需要重新生成
|
|
//服务已经审批并提交则不需要重新生成
|
|
|
// 暂时不考虑 审批并提交之后修改服务,不需要重新生成
|
|
// 暂时不考虑 审批并提交之后修改服务,不需要重新生成
|
|
|
if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST 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) {
|
|
if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST 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) {
|
|
|
- /*
|
|
|
|
|
- boolean flag = EditServiceServiceBundle(conn, uc, contract, (RowMap) service.asMap());//调整未审批的服务
|
|
|
|
|
- if (!flag) {
|
|
|
|
|
- conn.rollback();
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- */
|
|
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //暂时不考虑 审批并提交之后,修改服务,不需要重新生成
|
|
|
|
|
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) {
|
|
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) {
|
|
|
- /*
|
|
|
|
|
- boolean flag = EditServiceServiceBundle(conn, uc, contract, (RowMap) service.asMap());//调整未审批的服务
|
|
|
|
|
- if (!flag) {
|
|
|
|
|
- conn.rollback();
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
- */
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")}) > 0) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")}) > 0) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ */
|
|
|
|
|
|
|
|
//删除历史数据
|
|
//删除历史数据
|
|
|
if (StringUtils.isNotBlank(ADJUST_PERIOD)) {
|
|
if (StringUtils.isNotBlank(ADJUST_PERIOD)) {
|
|
@@ -402,6 +541,8 @@ public class contractService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST where BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=?", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")});
|
|
DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST where BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=?", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")});
|
|
|
|
|
+
|
|
|
|
|
+ DBSql.update("delete from BO_EU_DNCTT_CONTRACT_SERVICE_EDIT where CONTRACT_SERVICE_ID=?", new Object[]{service.get("ID")});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(PERIOD)) {
|
|
if (StringUtils.isNotBlank(PERIOD)) {
|
|
@@ -483,10 +624,7 @@ public class contractService {
|
|
|
BILL_METHOD_ID = DBSql.getString(conn, "select BILL_METHOD_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});
|
|
BILL_METHOD_ID = DBSql.getString(conn, "select BILL_METHOD_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
String vendor_account_id = DBSql.getString(conn, "select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});//供应商账号
|
|
String vendor_account_id = DBSql.getString(conn, "select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});//供应商账号
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
//如果不是从一号开始,则需要调整到从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) {
|
|
|
//本月底日期
|
|
//本月底日期
|
|
@@ -497,7 +635,7 @@ public class contractService {
|
|
|
|
|
|
|
|
// 计算首周期起止日期,并判断是否需要新增服务调整记录
|
|
// 计算首周期起止日期,并判断是否需要新增服务调整记录
|
|
|
Map<String, Object> firstPeriodDate = getFirstPeriodDate(START_DATE, END_DATE, EFFECTIVE_DATE, contract.getString("PERIOD_TYPE"), service.getString("PERIOD_TYPE"));
|
|
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");
|
|
|
|
|
|
|
+ boolean isStartOfPeriod = (boolean) firstPeriodDate.get("isStartOfPeriod");//是否需要服务调整
|
|
|
// 合同服务的周期起止日期
|
|
// 合同服务的周期起止日期
|
|
|
LocalDate start = getLocalDate(firstPeriodDate.get("periodStart"));
|
|
LocalDate start = getLocalDate(firstPeriodDate.get("periodStart"));
|
|
|
LocalDate end = getLocalDate(firstPeriodDate.get("periodEnd"));
|
|
LocalDate end = getLocalDate(firstPeriodDate.get("periodEnd"));
|
|
@@ -507,29 +645,33 @@ public class contractService {
|
|
|
|
|
|
|
|
//增加服务周期调整
|
|
//增加服务周期调整
|
|
|
if (!isStartOfPeriod) {
|
|
if (!isStartOfPeriod) {
|
|
|
- LocalDate periodEnd = getNextPeriodStart(start, String.valueOf(maxPeriod)).minusDays(1);//周期结束日期
|
|
|
|
|
- BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), GetPeriodDays(start, periodEnd)); // 首周期占整周期比例
|
|
|
|
|
|
|
+ BigDecimal periodRate;
|
|
|
|
|
+ //如果生效日期在合同开始日期之前
|
|
|
|
|
+ if (EFFECTIVE_DATE.isBefore(START_DATE)) {
|
|
|
|
|
+ int priodDays = GetPeriodDays(getPreviousPeriodStart(end.plusDays(1), String.valueOf(maxPeriod)), end);
|
|
|
|
|
+ periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), priodDays);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ periodRate = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, end), GetPeriodDays(start, end)); // 首周期占整周期比例
|
|
|
|
|
+ }
|
|
|
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"));
|
|
|
csa.set("OBJECT_TYPE", service.get("OBJECT_TYPE"));
|
|
csa.set("OBJECT_TYPE", service.get("OBJECT_TYPE"));
|
|
|
- csa.set("QUANTITY_CHANGE", service.get("QUANTITY"));
|
|
|
|
|
|
|
+ csa.set("QUANTITY", service.get("QUANTITY"));
|
|
|
csa.set("CONTRACT_SERVICE_ID", service.get("ID"));
|
|
csa.set("CONTRACT_SERVICE_ID", service.get("ID"));
|
|
|
- csa.set("EFFECTIVE_DATE", EFFECTIVE_DATE);
|
|
|
|
|
- csa.set("END_DATE", end);
|
|
|
|
|
|
|
+ csa.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
|
|
|
|
|
+ csa.set("PERIOD_END_DATE", end);
|
|
|
|
|
|
|
|
ADJUST_PERIOD = LocalDateYYYYMMDD(EFFECTIVE_DATE) + "~" + LocalDateYYYYMMDD(end);
|
|
ADJUST_PERIOD = LocalDateYYYYMMDD(EFFECTIVE_DATE) + "~" + LocalDateYYYYMMDD(end);
|
|
|
|
|
|
|
|
- contractServiceLogger.info("计算-csa-ADJUST_PRORATED_PRICE_CHANGE");
|
|
|
|
|
- csa.set("ADJUST_PRORATED_PRICE_CHANGE", multiply(service.get("ADJUSTED_PRICE"), periodRate));
|
|
|
|
|
- csa.set("PRORATED_PRICE_CHANGE", csa.get("ADJUST_PRORATED_PRICE_CHANGE"));
|
|
|
|
|
|
|
+ csa.set("PERIOD_ADJUSTED_PRICE", multiply(service.get("ADJUSTED_PRICE"), periodRate));
|
|
|
|
|
+ csa.set("PERIOD_PRICE", csa.get("PERIOD_ADJUSTED_PRICE"));
|
|
|
csa.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
csa.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
|
csa.setBindId(service.getString("BINDID"));
|
|
csa.setBindId(service.getString("BINDID"));
|
|
|
|
|
|
|
|
//服务周期成本
|
|
//服务周期成本
|
|
|
- csa.set("PRORATED_COST_CHANGE", multiply(service.get("TOTAL_COST"), periodRate));
|
|
|
|
|
-
|
|
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", csa, uc, conn);
|
|
|
|
|
|
|
+ csa.set("PERIOD_COST", multiply(service.get("TOTAL_COST"), periodRate));
|
|
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csa, uc, conn);
|
|
|
|
|
|
|
|
// 插入服务调整表包含的服务ctt_contract_service_adjust_bundle_service
|
|
// 插入服务调整表包含的服务ctt_contract_service_adjust_bundle_service
|
|
|
if (service.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
if (service.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
@@ -540,15 +682,16 @@ public class contractService {
|
|
|
if (sbsList != null) {
|
|
if (sbsList != null) {
|
|
|
for (String sbs : sbsList) {
|
|
for (String sbs : sbsList) {
|
|
|
BO csabs = new BO();
|
|
BO csabs = new BO();
|
|
|
- csabs.set("CONTRACT_SERVICE_ADJUST_ID", csa.getId());
|
|
|
|
|
|
|
+ csabs.set("CONTRACT_SERVICE_PERIOD_ID", csa.getId());
|
|
|
csabs.set("SERVICE_ID", sbs);
|
|
csabs.set("SERVICE_ID", sbs);
|
|
|
csabs.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
csabs.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
|
- csabs.set("PRORATED_COST_CHANGE", prorated_cost_change);
|
|
|
|
|
|
|
+ csabs.set("PERIOD_COST", prorated_cost_change);
|
|
|
csabs.setBindId(service.getString("BINDID"));
|
|
csabs.setBindId(service.getString("BINDID"));
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST_BUNDLE_SERVICE", csabs, uc, conn);
|
|
|
|
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", csabs, uc, conn);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
start = end.plusDays(1); // 周期开始日期指
|
|
start = end.plusDays(1); // 周期开始日期指
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -625,11 +768,338 @@ public class contractService {
|
|
|
* 调整服务
|
|
* 调整服务
|
|
|
* @param uc
|
|
* @param uc
|
|
|
* @param contract
|
|
* @param contract
|
|
|
- * @param service
|
|
|
|
|
|
|
+ * @param editService
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
- public boolean EditServiceServiceBundle(Connection conn, UserContext uc, RowMap contract, RowMap service) {
|
|
|
|
|
|
|
+ public boolean EditServiceServiceBundle(UserContext uc, Connection conn, RowMap contract, BO editService) {
|
|
|
|
|
+ //2、服务调整:生效日期在合同开始日期和合同结束日期之间;已审批服务周期之后的日期;
|
|
|
|
|
+ // 3、服务周期分为调整前和调整后两个周期;生效日期之后按照新的数量、单价重新生成服务周期;
|
|
|
|
|
+ contractServiceLogger.info("调整服务");
|
|
|
|
|
+
|
|
|
|
|
+ String IS_EFFECTIVE = editService.getString("IS_EFFECTIVE");
|
|
|
|
|
+ if (!IS_EFFECTIVE.equals("未执行"))
|
|
|
|
|
+ return false;
|
|
|
|
|
+ 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();
|
|
|
|
|
+
|
|
|
|
|
+ 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 (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) {
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } 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);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
+ //旧的计费周期更新
|
|
|
|
|
+ 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);
|
|
|
|
|
+
|
|
|
|
|
+ SATRT_DATE = period_end_date.plusDays(1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ 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();
|
|
|
|
|
+
|
|
|
|
|
+ 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});
|
|
|
|
|
+
|
|
|
|
|
+ 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});
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ 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"));
|
|
|
|
|
+
|
|
|
|
|
+ //新的计费周期
|
|
|
|
|
+ BO servicePeriodAdj = new BO();
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ 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});
|
|
|
|
|
+
|
|
|
|
|
+ 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});
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
|
|
|
|
|
+ String maxPeriod = editService.getString("PERIOD_TYPE");
|
|
|
|
|
+
|
|
|
|
|
+ //服务包上的服务
|
|
|
|
|
+ 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)) {
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ 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"));
|
|
|
|
|
+ contractServiceBO.set("OLD_TOTAL_PRICE", editService.get("OLD_TOTAL_PRICE"));
|
|
|
|
|
+ contractServiceBO.set("OLD_UNIT_COST", editService.get("OLD_UNIT_COST"));
|
|
|
|
|
+ contractServiceBO.set("OLD_TOTAL_COST", editService.get("OLD_TOTAL_COST"));
|
|
|
|
|
+
|
|
|
|
|
+ contractServiceBO.set("QUANTITY", editService.get("QUANTITY"));
|
|
|
|
|
+ contractServiceBO.set("UNIT_PRICE", editService.get("UNIT_PRICE"));
|
|
|
|
|
+ contractServiceBO.set("TOTAL_PRICE", editService.get("TOTAL_PRICE"));
|
|
|
|
|
+ contractServiceBO.set("UNIT_COST", editService.get("UNIT_COST"));
|
|
|
|
|
+ contractServiceBO.set("TOTAL_COST", editService.get("TOTAL_COST"));
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", contractServiceBO, conn);
|
|
|
|
|
+
|
|
|
|
|
+ contractServiceLogger.info("服务调整成功");
|
|
|
|
|
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -644,8 +1114,8 @@ public class contractService {
|
|
|
*/
|
|
*/
|
|
|
public boolean AddContractServiceProduct(UserContext uc, RowMap contract, Connection conn) throws SQLException {
|
|
public boolean AddContractServiceProduct(UserContext uc, RowMap contract, Connection conn) throws SQLException {
|
|
|
//获取服务列表
|
|
//获取服务列表
|
|
|
- List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).list();
|
|
|
|
|
- List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID!=", contract.get("BINDID")).addQuery("CONTRACT_ID=", contract.get("ID")).list();
|
|
|
|
|
|
|
+ List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID =", contract.get("BINDID")).list();
|
|
|
|
|
+ List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID !=", contract.get("BINDID")).addQuery("CONTRACT_ID =", contract.get("ID")).list();
|
|
|
|
|
|
|
|
if (serviceList == null)
|
|
if (serviceList == null)
|
|
|
serviceList = new ArrayList<BO>();
|
|
serviceList = new ArrayList<BO>();
|
|
@@ -748,7 +1218,7 @@ public class contractService {
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
|
|
public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
|
|
|
- contractServiceLogger.info("新增服务或服务包");
|
|
|
|
|
|
|
+ contractServiceLogger.info("一个服务对应添加一个合同产品");
|
|
|
|
|
|
|
|
Connection conn = null;
|
|
Connection conn = null;
|
|
|
try {
|
|
try {
|
|
@@ -812,13 +1282,13 @@ public class contractService {
|
|
|
contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
|
|
contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
|
|
|
|
|
|
|
|
//数量
|
|
//数量
|
|
|
- contractCost.set("QUANTITY", DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT") + DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"));
|
|
|
|
|
|
|
+ contractCost.set("QUANTITY", DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"));
|
|
|
|
|
|
|
|
//总成本
|
|
//总成本
|
|
|
- contractCost.set("EXTENDED_COST", DBSql.getDouble(conn, "SELECT SUM(PERIOD_COST) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST") + DBSql.getDouble(conn, "SELECT SUM(PRORATED_COST_CHANGE) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST"));
|
|
|
|
|
|
|
+ contractCost.set("EXTENDED_COST", DBSql.getDouble(conn, "SELECT SUM(PERIOD_COST) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST"));
|
|
|
|
|
|
|
|
//总价格
|
|
//总价格
|
|
|
- contractCost.set("EXTENDED_PRICE", DBSql.getDouble(conn, "SELECT SUM(PERIOD_ADJUSTED_PRICE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE") + DBSql.getDouble(conn, "SELECT SUM(ADJUST_PRORATED_PRICE_CHANGE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE"));
|
|
|
|
|
|
|
+ contractCost.set("EXTENDED_PRICE", DBSql.getDouble(conn, "SELECT SUM(PERIOD_ADJUSTED_PRICE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE"));
|
|
|
|
|
|
|
|
if (contractCost.isNew()) {
|
|
if (contractCost.isNew()) {
|
|
|
//成本子类:合同成本
|
|
//成本子类:合同成本
|
|
@@ -931,14 +1401,19 @@ public class contractService {
|
|
|
}
|
|
}
|
|
|
LocalDate periodEnd;
|
|
LocalDate periodEnd;
|
|
|
if (svcPeriod > cttPeriod) {
|
|
if (svcPeriod > cttPeriod) {
|
|
|
- // 如果服务周期大于合同周期,计算服务周期的结束日期???
|
|
|
|
|
|
|
+ // 如果服务周期大于合同周期,计算服务周期的结束日期
|
|
|
periodEnd = getNextPeriodStart(start, servicePeriod).minusDays(1);
|
|
periodEnd = getNextPeriodStart(start, servicePeriod).minusDays(1);
|
|
|
} else {
|
|
} else {
|
|
|
// 否则,服务周期结束日期与合同周期相同
|
|
// 否则,服务周期结束日期与合同周期相同
|
|
|
periodEnd = end;
|
|
periodEnd = end;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ //不能超过合同结束日期
|
|
|
|
|
+ if (periodEnd.isAfter(contractEnd)) {
|
|
|
|
|
+ periodEnd = contractEnd;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 判断是否为服务周期的起始日期
|
|
// 判断是否为服务周期的起始日期
|
|
|
- // 将结果存入Map中
|
|
|
|
|
dto.put("periodStart", start);
|
|
dto.put("periodStart", start);
|
|
|
dto.put("periodEnd", periodEnd);
|
|
dto.put("periodEnd", periodEnd);
|
|
|
dto.put("isStartOfPeriod", start.isEqual(serviceEffect));
|
|
dto.put("isStartOfPeriod", start.isEqual(serviceEffect));
|
|
@@ -1013,6 +1488,32 @@ public class contractService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算上一个周期开始时间
|
|
|
|
|
+ * @param end
|
|
|
|
|
+ * @param periodType
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public static LocalDate getPreviousPeriodStart(LocalDate end, String periodType) {
|
|
|
|
|
+ switch (periodType) {
|
|
|
|
|
+ case cttConstant.PERIOD_TYPE_MONTH:
|
|
|
|
|
+ // 如果是月周期,则在当前时间基础上减少1个月
|
|
|
|
|
+ return end.minus(1, ChronoUnit.MONTHS);
|
|
|
|
|
+ case cttConstant.PERIOD_TYPE_QUARTER:
|
|
|
|
|
+ // 如果是季度周期,则在当前时间基础上减少3个月
|
|
|
|
|
+ return end.minus(3, ChronoUnit.MONTHS);
|
|
|
|
|
+ case cttConstant.PERIOD_TYPE_HALFYEAR:
|
|
|
|
|
+ // 如果是半年周期,则在当前时间基础上减少6个月
|
|
|
|
|
+ return end.minus(6, ChronoUnit.MONTHS);
|
|
|
|
|
+ case cttConstant.PERIOD_TYPE_YEAR:
|
|
|
|
|
+ // 如果是年周期,则在当前时间基础上减少1年
|
|
|
|
|
+ return end.minus(1, ChronoUnit.YEARS);
|
|
|
|
|
+ default:
|
|
|
|
|
+ // 如果周期类型不匹配任何已知类型,则返回原始开始时间
|
|
|
|
|
+ return end;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* object 转换成LocalDate
|
|
* object 转换成LocalDate
|
|
|
*/
|
|
*/
|
|
@@ -1188,27 +1689,27 @@ public class contractService {
|
|
|
//SDK.getBOAPI().get("BO_EU_DND_COST_CODE", bo.getString("SETUP_FEE_COST_CODE_ID"), "TAX_CATEGORY_ID").toString();
|
|
//SDK.getBOAPI().get("BO_EU_DND_COST_CODE", bo.getString("SETUP_FEE_COST_CODE_ID"), "TAX_CATEGORY_ID").toString();
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
- //BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST
|
|
|
|
|
- bo = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", approveId);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ //BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD
|
|
|
|
|
+ bo = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", approveId);
|
|
|
if (bo != null) {
|
|
if (bo != null) {
|
|
|
CONTRACT_SERVICE_ID = bo.getString("CONTRACT_SERVICE_ID");
|
|
CONTRACT_SERVICE_ID = bo.getString("CONTRACT_SERVICE_ID");
|
|
|
CONTRACT_ID = bo.getString("CONTRACT_ID");
|
|
CONTRACT_ID = bo.getString("CONTRACT_ID");
|
|
|
|
|
|
|
|
bo.set("APPROVE_AND_POST_DATE", approveDate);
|
|
bo.set("APPROVE_AND_POST_DATE", approveDate);
|
|
|
bo.set("SETUP_FEE_APPROVE_POST_USER_ID", uc.getUID());
|
|
bo.set("SETUP_FEE_APPROVE_POST_USER_ID", uc.getUID());
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", bo, connUpdate);
|
|
|
|
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", bo, connUpdate);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- cad.set("TYPE_ID", cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE_AJUST);//类型(服务调整)
|
|
|
|
|
|
|
+ cad.set("TYPE_ID", cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE);//类型(服务)
|
|
|
cad.set("OBJECT_ID", approveId);
|
|
cad.set("OBJECT_ID", approveId);
|
|
|
cad.set("CONTRACT_ID", bo.getString("CONTRACT_ID"));
|
|
cad.set("CONTRACT_ID", bo.getString("CONTRACT_ID"));
|
|
|
- cad.set("QUANTITY", bo.get("QUANTITY_CHANGE"));
|
|
|
|
|
|
|
+ cad.set("QUANTITY", bo.get("QUANTITY"));
|
|
|
|
|
|
|
|
cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
|
|
cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
|
|
|
cad.set("ACCOUNT_ID", DBSql.getString("SELECT ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
cad.set("ACCOUNT_ID", DBSql.getString("SELECT ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
|
cad.set("BILL_ACCOUNT_ID", DBSql.getString("SELECT BILL_TO_ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
cad.set("BILL_ACCOUNT_ID", DBSql.getString("SELECT BILL_TO_ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
|
|
|
|
|
|
- cad.set("EXTENDED_PRICE", bo.get("ADJUST_PRORATED_PRICE_CHANGE"));
|
|
|
|
|
|
|
+ cad.set("EXTENDED_PRICE", bo.get("PERIOD_ADJUSTED_PRICE"));
|
|
|
|
|
|
|
|
String costCodeId = null;
|
|
String costCodeId = null;
|
|
|
if (bo.getString("OBJECT_TYPE").equals("1")) {
|
|
if (bo.getString("OBJECT_TYPE").equals("1")) {
|
|
@@ -1216,45 +1717,11 @@ public class contractService {
|
|
|
} else {
|
|
} else {
|
|
|
costCodeId = DBSql.getString("SELECT COST_CODE_ID FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID = ?", new Object[]{bo.getString("OBJECT_ID")});
|
|
costCodeId = DBSql.getString("SELECT COST_CODE_ID FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID = ?", new Object[]{bo.getString("OBJECT_ID")});
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
Object taxCategoryId = DBSql.getString("select TAX_CATEGORY_ID from BO_EU_DND_COST_CODE where OID=? and ORGID=?", new Object[]{costCodeId, ORGID}); //SDK.getBOAPI().get("BO_EU_DND_COST_CODE", costCodeId, "TAX_CATEGORY_ID");
|
|
Object taxCategoryId = DBSql.getString("select TAX_CATEGORY_ID from BO_EU_DND_COST_CODE where OID=? and ORGID=?", new Object[]{costCodeId, ORGID}); //SDK.getBOAPI().get("BO_EU_DND_COST_CODE", costCodeId, "TAX_CATEGORY_ID");
|
|
|
- if (taxCategoryId != null) {
|
|
|
|
|
|
|
+ if (taxCategoryId != null)
|
|
|
TAX_CATEGORY_ID = taxCategoryId.toString();
|
|
TAX_CATEGORY_ID = taxCategoryId.toString();
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- } else {
|
|
|
|
|
- //BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD
|
|
|
|
|
- bo = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", approveId);
|
|
|
|
|
- if (bo != null) {
|
|
|
|
|
- CONTRACT_SERVICE_ID = bo.getString("CONTRACT_SERVICE_ID");
|
|
|
|
|
- CONTRACT_ID = bo.getString("CONTRACT_ID");
|
|
|
|
|
-
|
|
|
|
|
- bo.set("APPROVE_AND_POST_DATE", approveDate);
|
|
|
|
|
- bo.set("SETUP_FEE_APPROVE_POST_USER_ID", uc.getUID());
|
|
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", bo, connUpdate);
|
|
|
|
|
-
|
|
|
|
|
- cad.set("TYPE_ID", cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE);//类型(服务)
|
|
|
|
|
- cad.set("OBJECT_ID", approveId);
|
|
|
|
|
- cad.set("CONTRACT_ID", bo.getString("CONTRACT_ID"));
|
|
|
|
|
- cad.set("QUANTITY", bo.get("QUANTITY"));
|
|
|
|
|
-
|
|
|
|
|
- cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
|
|
|
|
|
- cad.set("ACCOUNT_ID", DBSql.getString("SELECT ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
|
|
|
- cad.set("BILL_ACCOUNT_ID", DBSql.getString("SELECT BILL_TO_ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
|
|
|
|
|
-
|
|
|
|
|
- cad.set("EXTENDED_PRICE", bo.get("PERIOD_ADJUSTED_PRICE"));
|
|
|
|
|
-
|
|
|
|
|
- String costCodeId = null;
|
|
|
|
|
- if (bo.getString("OBJECT_TYPE").equals("1")) {
|
|
|
|
|
- costCodeId = DBSql.getString("SELECT COST_CODE_ID FROM BO_EU_DNIVT_SERVICE WHERE ID = ?", new Object[]{bo.getString("OBJECT_ID")});
|
|
|
|
|
- } else {
|
|
|
|
|
- costCodeId = DBSql.getString("SELECT COST_CODE_ID FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID = ?", new Object[]{bo.getString("OBJECT_ID")});
|
|
|
|
|
- }
|
|
|
|
|
- Object taxCategoryId = DBSql.getString("select TAX_CATEGORY_ID from BO_EU_DND_COST_CODE where OID=? and ORGID=?", new Object[]{costCodeId, ORGID}); //SDK.getBOAPI().get("BO_EU_DND_COST_CODE", costCodeId, "TAX_CATEGORY_ID");
|
|
|
|
|
- if (taxCategoryId != null)
|
|
|
|
|
- TAX_CATEGORY_ID = taxCategoryId.toString();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1521,21 +1988,14 @@ public class contractService {
|
|
|
|
|
|
|
|
if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE)) //类型:服务
|
|
if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE)) //类型:服务
|
|
|
{
|
|
{
|
|
|
- BO ccsp = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").addQuery("CONTRACT_ID=", bo.getString("CONTRACT_ID")).addQuery("ID=", bo.getString("OBJECT_ID")).detail();
|
|
|
|
|
|
|
+ BO ccsp = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").addQuery("CONTRACT_ID =", bo.getString("CONTRACT_ID")).addQuery("ID =", bo.getString("OBJECT_ID")).detail();
|
|
|
ccsp.set("APPROVE_AND_POST_DATE", null);
|
|
ccsp.set("APPROVE_AND_POST_DATE", null);
|
|
|
ccsp.set("APPROVE_AND_POST_USER_ID", null);
|
|
ccsp.set("APPROVE_AND_POST_USER_ID", null);
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", ccsp, connUpdate);
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", ccsp, connUpdate);
|
|
|
|
|
|
|
|
- } else if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE_AJUST)) //类型:服务调整
|
|
|
|
|
- {
|
|
|
|
|
- BO ccsa = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST").addQuery("CONTRACT_ID=", bo.getString("CONTRACT_ID")).addQuery("ID=", bo.getString("OBJECT_ID")).detail();
|
|
|
|
|
- ccsa.set("APPROVE_AND_POST_DATE", null);
|
|
|
|
|
- ccsa.set("APPROVE_AND_POST_USER_ID", null);
|
|
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", ccsa, connUpdate);
|
|
|
|
|
-
|
|
|
|
|
} else if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST)) //类型:初始费用
|
|
} else if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST)) //类型:初始费用
|
|
|
{
|
|
{
|
|
|
- BO ccc = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT").addQuery("ID=", bo.getString("CONTRACT_ID")).detail();
|
|
|
|
|
|
|
+ BO ccc = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT").addQuery("ID =", bo.getString("CONTRACT_ID")).detail();
|
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_USER_ID", null);
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_USER_ID", null);
|
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_DATE", null);
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_DATE", null);
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
|
|
@@ -1579,7 +2039,7 @@ public class contractService {
|
|
|
BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
|
|
BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
|
|
|
if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_MILESTONES)) //类型:里程碑
|
|
if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_MILESTONES)) //类型:里程碑
|
|
|
{
|
|
{
|
|
|
- BO ccm = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_MILESTONES").addQuery("CONTRACT_ID=", bo.getString("CONTRACT_ID")).addQuery("ID=", bo.getString("OBJECT_ID")).detail();
|
|
|
|
|
|
|
+ BO ccm = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_MILESTONES").addQuery("CONTRACT_ID =", bo.getString("CONTRACT_ID")).addQuery("ID =", bo.getString("OBJECT_ID")).detail();
|
|
|
ccm.set("STATUS_ID", 1266);
|
|
ccm.set("STATUS_ID", 1266);
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_MILESTONES", ccm, connUpdate);
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_MILESTONES", ccm, connUpdate);
|
|
|
}
|
|
}
|
|
@@ -1775,7 +2235,7 @@ public class contractService {
|
|
|
cad.set("EFFECTIVE_TAX_RATE", tax_rate);
|
|
cad.set("EFFECTIVE_TAX_RATE", tax_rate);
|
|
|
|
|
|
|
|
//是否免税
|
|
//是否免税
|
|
|
- if (ca != null &&!ca.getString("IS_TAX_EXEMPT").equals("1") && ca.get("EXTENDED_PRICE") != null && tax_rate > 0) {
|
|
|
|
|
|
|
+ if (ca != null && !ca.getString("IS_TAX_EXEMPT").equals("1") && ca.get("EXTENDED_PRICE") != null && tax_rate > 0) {
|
|
|
double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
|
|
double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
|
|
|
cad.set("TAX_DOLLARS", tax_dollars);
|
|
cad.set("TAX_DOLLARS", tax_dollars);
|
|
|
}
|
|
}
|