|
|
@@ -2,21 +2,29 @@ package com.awspaas.user.apps.donenow_ctt.controller;
|
|
|
|
|
|
import com.actionsoft.bpms.bo.engine.BO;
|
|
|
import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
|
|
|
+import com.actionsoft.bpms.commons.database.RowMap;
|
|
|
import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
|
|
|
import com.actionsoft.bpms.server.UserContext;
|
|
|
import com.actionsoft.bpms.server.bind.annotation.Controller;
|
|
|
import com.actionsoft.bpms.server.bind.annotation.Mapping;
|
|
|
import com.actionsoft.bpms.util.DBSql;
|
|
|
+import com.actionsoft.bpms.util.TypeUtil;
|
|
|
import com.actionsoft.sdk.local.SDK;
|
|
|
import com.actionsoft.sdk.local.api.Logger;
|
|
|
+import com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil;
|
|
|
import com.awspaas.user.apps.donenow_ctt.cttConstant;
|
|
|
import com.awspaas.user.apps.donenow_ctt.service.contractServiceAdj;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.sql.Connection;
|
|
|
+import java.sql.SQLException;
|
|
|
import java.time.LocalDate;
|
|
|
|
|
|
-import static com.awspaas.user.apps.donenow_ctt.service.contractService.LocalDateYYYYMMDD;
|
|
|
-import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
|
|
|
+import static com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil.GetPeriodMonth;
|
|
|
+import static com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil.getDateRate;
|
|
|
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.*;
|
|
|
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.multiply;
|
|
|
|
|
|
@Controller
|
|
|
public class contractServiceController {
|
|
|
@@ -250,4 +258,137 @@ public class contractServiceController {
|
|
|
return ResponseObject.newOkResponse();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 终止合同服务
|
|
|
+ * @param uc
|
|
|
+ * @param serviceId
|
|
|
+ * @param TerminationDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Mapping(value = "com.awspaas.user.apps.donenow_ctt.termina_service")
|
|
|
+ public ResponseObject TerminationService(UserContext uc, String serviceId, String TerminationDate) {
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(serviceId) || StringUtils.isBlank(TerminationDate))
|
|
|
+ return ResponseObject.newErrResponse("参数错误");
|
|
|
+
|
|
|
+ BO contraService = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("ID =", serviceId).detail();
|
|
|
+
|
|
|
+ if (contraService == null)
|
|
|
+ return ResponseObject.newErrResponse("参数错误");
|
|
|
+
|
|
|
+ TerminationDate = TerminationDate.length() == 10 ? TerminationDate : TerminationDate.substring(0, 10);
|
|
|
+
|
|
|
+ LocalDate TerminationDateLocal = getLocalDate(TerminationDate);
|
|
|
+
|
|
|
+ String TERMINATION = contraService.get("TERMINATION") != null ? contraService.getString("TERMINATION") : "0";
|
|
|
+ String oldTerminationDate = contraService.get("TERMINATION_DATE") != null ? contraService.getString("TERMINATION_DATE") : "";
|
|
|
+
|
|
|
+ if (TERMINATION.equals("1") && StringUtils.isNotBlank(oldTerminationDate)) {
|
|
|
+ oldTerminationDate = oldTerminationDate.length() == 10 ? oldTerminationDate : oldTerminationDate.substring(0, 10);
|
|
|
+ LocalDate oldTerminationDateLocal = getLocalDate(oldTerminationDate);
|
|
|
+ if (!oldTerminationDateLocal.isAfter(TerminationDateLocal))
|
|
|
+ return ResponseObject.newErrResponse("终止日期不能晚于原终止日期");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //2025年10月15日 一次性收费服务
|
|
|
+ if (contraService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
|
|
|
+
|
|
|
+ //有审批通过的;
|
|
|
+ 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_SERVICE_ID=? ", new Object[]{serviceId}) > 0) {
|
|
|
+ return ResponseObject.newErrResponse("服务已审批不能再进行调整");
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //生效日期之后有审批通过的;
|
|
|
+ if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate}) > 0) {
|
|
|
+ return ResponseObject.newErrResponse("终止日期之后的合同服务已经进行审批!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Connection conn = null;
|
|
|
+ try {
|
|
|
+ conn = DBSql.open();
|
|
|
+ conn.setAutoCommit(false);
|
|
|
+
|
|
|
+ //生效日期之后的服务周期删除
|
|
|
+ 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_BEGIN_DATE >=?)", new Object[]{serviceId, TerminationDate});
|
|
|
+
|
|
|
+ DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_BEGIN_DATE>=?", new Object[]{serviceId, TerminationDate});
|
|
|
+
|
|
|
+ //如果生效日期之后有服务周期
|
|
|
+ String lastPeriodId = DBSql.getString(conn, "SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE >=? ORDER BY PERIOD_BEGIN_DATE ASC ", new Object[]{serviceId, TerminationDate});
|
|
|
+
|
|
|
+ BigDecimal SERVICE_UNIT_PRICE = null;
|
|
|
+ BigDecimal SERVICE_TOTAL_PRICE = null;
|
|
|
+
|
|
|
+
|
|
|
+ BigDecimal SERVICE_UNIT_COST = BigDecimal.ZERO;//服务单元成本
|
|
|
+
|
|
|
+//生效日期之前的一次调整
|
|
|
+ RowMap lastContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST where CONTRACT_SERVICE_ID=? and EFFECTIVE_DATE <=? and IS_EFFECTIVE='已执行' order by EFFECTIVE_DATE desc", new Object[]{serviceId, TerminationDate});
|
|
|
+
|
|
|
+ if (lastContractService == null) {
|
|
|
+ lastContractService = new RowMap(contraService.asMap());
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal SERVICE_TOTAL_COST = BigDecimal.ZERO;//服务总成本
|
|
|
+
|
|
|
+
|
|
|
+ if (StringUtils.isNotBlank(lastPeriodId)) {
|
|
|
+ SERVICE_UNIT_PRICE = TypeUtil.convert(lastContractService.get("UNIT_PRICE"), BigDecimal.class);
|
|
|
+ SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, lastContractService.get("QUANTITY"));
|
|
|
+
|
|
|
+ //无需采购
|
|
|
+ if (contraService.getString("NEED_PURCHASE").equals("1") == false) {
|
|
|
+ SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST"), BigDecimal.class);//服务单元成本
|
|
|
+ SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));//服务总成本
|
|
|
+ }
|
|
|
+
|
|
|
+ BO lastServicePeriod = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", lastPeriodId);
|
|
|
+
|
|
|
+ LocalDate last_period_begin_date = getLocalDate(lastServicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
+
|
|
|
+ lastServicePeriod.set("PERIOD_END_DATE", TerminationDate);
|
|
|
+
|
|
|
+ BigDecimal periodRate = PeriodCalculationUtil.divideToBigDecimal(getDateRate(last_period_begin_date, TerminationDateLocal, false), GetPeriodMonth(lastContractService.getString("PERIOD_TYPE")));
|
|
|
+
|
|
|
+ lastServicePeriod.set("PERIOD_PRICE", multiply(SERVICE_TOTAL_PRICE, periodRate));
|
|
|
+ lastServicePeriod.set("PARTYA_PERIOD_PRICE", multiply(lastContractService.get("PARTYA_TOTAL_PRICE"), periodRate));
|
|
|
+ lastServicePeriod.set("PERIOD_ADJUSTED_PRICE", lastServicePeriod.get("PERIOD_PRICE"));
|
|
|
+
|
|
|
+ lastServicePeriod.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRate));
|
|
|
+
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", lastServicePeriod, conn);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ contraService.set("TERMINATION", 1);
|
|
|
+ contraService.set("TERMINATION_DATE", TerminationDate);//服务终止日期
|
|
|
+ contraService.set("END_DATE", TerminationDate);//服务结束日期
|
|
|
+
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", contraService, conn);
|
|
|
+
|
|
|
+ conn.commit();
|
|
|
+
|
|
|
+ } catch (SQLException e) {
|
|
|
+
|
|
|
+ e.printStackTrace();
|
|
|
+ try {
|
|
|
+ conn.rollback();
|
|
|
+ } catch (SQLException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ if (conn != null) DBSql.close(conn);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return ResponseObject.newOkResponse();
|
|
|
+ }
|
|
|
+
|
|
|
}
|