Explorar el Código

服务周期修改

zhangyao hace 3 semanas
padre
commit
531ca740b1

+ 15 - 5
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCreateController.java

@@ -622,14 +622,24 @@ public class contractCreateController {
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.contract_service_exec", session = false, noSessionEvaluate = "无安全隐患", noSessionReason = "批量生产")
     public String contractServicExec() {
 
-        List<RowMap> services = DBSql.getMaps("SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE a.NAME LIKE '%历峰%' AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599' AND b.CREATEUSER='hulei'");
+        List<RowMap> services = DBSql.getMaps("SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE b.BILL_TO_ACCOUNT_ID = 'e9358570-f6f3-4a43-9268-ae265f3cc030' AND b.`NAME` LIKE '%普通宽带%' AND a.CLOSED=0");
+
+        //SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE a.NAME LIKE '%历峰%' AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599' AND b.CREATEUSER='hulei'
 
         UserContext uc = UserContext.fromUID("hulei");
         for (RowMap service : services) {
-            String contractId = service.getString("CONTRACT_ID");
-            String serviceIds = service.getString("ID");
-            servicePeriod(uc, contractId, serviceIds);
-            serviceCost(uc, contractId, serviceIds);
+            try {
+                contractLogger.info("开始处理合同服务:" + service.getString("NAME") + "(" + service.getString("ID") + ")");
+
+                String contractId = service.getString("CONTRACT_ID");
+                String serviceIds = service.getString("ID");
+                servicePeriod(uc, contractId, serviceIds);
+                serviceCost(uc, contractId, serviceIds);
+
+            } catch (Exception e) {
+
+                contractLogger.error("处理合同服务出错:" + service.getString("NAME"), e);
+            }
         }
         return "ok";
     }

+ 143 - 2
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractServiceController.java

@@ -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();
+    }
+
 }

+ 1 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/job/AutoRenewJob.java

@@ -41,7 +41,7 @@ public class AutoRenewJob implements Job {
 
         LocalDate next2Year = LocalDate.now().plusYears(2);//两年后
 
-        List<RowMap> list = DBSql.getMaps("SELECT a.ID, a.BINDID, a.START_DATE, a.END_DATE, b.EFFECTIVE_DATE, c.CONTRACT_SERVICE_ID, MIN(c.PERIOD_BEGIN_DATE) AS PERIOD_BEGIN_DATE, MIN(c.PERIOD_END_DATE) AS PERIOD_END_DATE, COUNT(c.ID) AS CNT FROM bo_eu_dnctt_contract a JOIN bo_eu_dnctt_contract_service b ON a.ID = b.CONTRACT_ID JOIN bo_eu_dnctt_contract_service_period c ON b.ID = c.CONTRACT_SERVICE_ID WHERE a.AUTO_RENEW=1 AND c.PERIOD_END_DATE>='" + nowDate + "' GROUP BY a.ID, a.BINDID, a.START_DATE, a.END_DATE, b.EFFECTIVE_DATE, c.CONTRACT_SERVICE_ID HAVING COUNT(c.ID)<=1 ORDER BY PERIOD_BEGIN_DATE DESC");
+        List<RowMap> list = DBSql.getMaps("SELECT a.ID, a.BINDID, a.START_DATE, a.END_DATE, b.EFFECTIVE_DATE, c.CONTRACT_SERVICE_ID, MIN(c.PERIOD_BEGIN_DATE) AS PERIOD_BEGIN_DATE, MIN(c.PERIOD_END_DATE) AS PERIOD_END_DATE, COUNT(c.ID) AS CNT FROM bo_eu_dnctt_contract a JOIN bo_eu_dnctt_contract_service b ON a.ID = b.CONTRACT_ID JOIN bo_eu_dnctt_contract_service_period c ON b.ID = c.CONTRACT_SERVICE_ID WHERE a.AUTO_RENEW=1 AND b.TERMINATION=0  AND c.PERIOD_END_DATE>='" + nowDate + "' GROUP BY a.ID, a.BINDID, a.START_DATE, a.END_DATE, b.EFFECTIVE_DATE, c.CONTRACT_SERVICE_ID HAVING COUNT(c.ID)<=1 ORDER BY PERIOD_BEGIN_DATE DESC");
 
         UserContext uc = UserContext.fromUID("admin");
         contractService serviceOp = contractService.getInstance();

+ 1 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/job/ServiceAutoRenewJob.java

@@ -27,7 +27,7 @@ public class ServiceAutoRenewJob implements Job {
         //当前日期
         UserContext uc = UserContext.fromUID("admin");
 
-        List<RowMap> sales = DBSql.getMaps("SELECT c.CONTRACT_SERVICE_ID, MAX( c.PERIOD_BEGIN_DATE) AS PERIOD_BEGIN_DATE, MAX( c.PERIOD_END_DATE) AS  PERIOD_END_DATE FROM bo_eu_dnctt_contract a JOIN bo_eu_dnctt_contract_service b ON a.ID = b.CONTRACT_ID JOIN bo_eu_dnctt_contract_service_period c ON b.ID = c.CONTRACT_SERVICE_ID WHERE a.AUTO_RENEW = 1  AND b.PERIOD_TYPE<>'609'  GROUP BY c.CONTRACT_SERVICE_ID HAVING MAX( c.PERIOD_BEGIN_DATE)<=DATE_ADD(NOW(), INTERVAL 1 MONTH)");
+        List<RowMap> sales = DBSql.getMaps("SELECT c.CONTRACT_SERVICE_ID, MAX( c.PERIOD_BEGIN_DATE) AS PERIOD_BEGIN_DATE, MAX( c.PERIOD_END_DATE) AS  PERIOD_END_DATE FROM bo_eu_dnctt_contract a JOIN bo_eu_dnctt_contract_service b ON a.ID = b.CONTRACT_ID JOIN bo_eu_dnctt_contract_service_period c ON b.ID = c.CONTRACT_SERVICE_ID WHERE a.AUTO_RENEW = 1 AND b.TERMINATION=0 AND b.PERIOD_TYPE<>'609'  GROUP BY c.CONTRACT_SERVICE_ID HAVING MAX( c.PERIOD_BEGIN_DATE)<=DATE_ADD(NOW(), INTERVAL 1 MONTH)");
         for (RowMap sale : sales) {
             String contractServiceId = sale.getString("CONTRACT_SERVICE_ID");
             LocalDate EFFECTIVE_DATE = TypeUtil.convert(sale.getDate("PERIOD_END_DATE"), LocalDate.class);

+ 19 - 4
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -1122,12 +1122,27 @@ public class contractService {
         LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
         LocalDate EFFECTIVE_DATE = getLocalDate(service.get("EFFECTIVE_DATE"));//服务生效日期
         LocalDate EFFECTIVE_END_DATE = getLocalDate(service.get("END_DATE"));//服务结束日期
+
+        if (EFFECTIVE_DATE == null) {
+            return false;
+        }
         if (END_DATE == null && EFFECTIVE_END_DATE == null) {
             return false;
         }
+
         if (EFFECTIVE_END_DATE != null)
             END_DATE = EFFECTIVE_END_DATE;
 
+
+        //已终止
+        if (service.getString("TERMINATION").equals("1")) {
+            END_DATE = getLocalDate(service.get("TERMINATION_DATE"));//终止日期
+        }
+
+        //生效日期在结束日期之后
+        if (EFFECTIVE_DATE.isAfter(END_DATE))
+            return false;
+
         //做过服务调整
         if (DBSql.getInt("SELECT count(1) AS CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? ", new Object[]{service.get("ID")}) > 0) {
             return false;
@@ -2666,7 +2681,7 @@ public class contractService {
 
                 String ORGID = uc.getCompanyModel().getId();
 
-                String BILL_TO_ACCOUNT_ID=DBSql.getString("select BILL_ACCOUNT_ID from VIEW_EU_DNV_PENDING_RECURRING_CONTRACT where ID=?",new Object[]{approveId});
+                String BILL_TO_ACCOUNT_ID = DBSql.getString("select BILL_ACCOUNT_ID from VIEW_EU_DNV_PENDING_RECURRING_CONTRACT where ID=?", new Object[]{approveId});
 
                 //BO_EU_DNCTT_CONTRACT
                 BO bo = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", approveId);//合同初始费用
@@ -2682,9 +2697,9 @@ public class contractService {
                     cad.set("QUANTITY", 1);
                     cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
                     cad.set("ACCOUNT_ID", bo.getString("ACCOUNT_ID"));
-                   // cad.set("BILL_ACCOUNT_ID", bo.getString("BILL_TO_ACCOUNT_ID"));
+                    // cad.set("BILL_ACCOUNT_ID", bo.getString("BILL_TO_ACCOUNT_ID"));
 
-                    cad.set("BILL_ACCOUNT_ID",BILL_TO_ACCOUNT_ID);
+                    cad.set("BILL_ACCOUNT_ID", BILL_TO_ACCOUNT_ID);
 
                     cad.set("EXTENDED_PRICE", bo.get("ADJUST_SETUP_FEE"));
 
@@ -2713,7 +2728,7 @@ public class contractService {
                         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",BILL_TO_ACCOUNT_ID);
+                        cad.set("BILL_ACCOUNT_ID", BILL_TO_ACCOUNT_ID);
 
                         cad.set("EXTENDED_PRICE", bo.get("PERIOD_ADJUSTED_PRICE"));
                         cad.set("EXTENDED_COST", bo.get("PERIOD_COST"));

+ 10 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -126,6 +126,16 @@ public class contractServiceAdj {
         //合同服务
         BO orgContractService = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", contractService.getString("CONTRACT_SERVICE_ID"));
 
+        //已终止
+        if(orgContractService.getString("TERMINATION").equals("1"))
+        {
+            EFFECTIVE_END_DATE=getLocalDate(orgContractService.get("TERMINATION_DATE"));//终止日期
+        }
+
+        //生效日期在结束日期之后
+        if (EFFECTIVE_DATE.isAfter(EFFECTIVE_END_DATE))
+            return false;
+
         LocalDate YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
         LocalDate YS_END_DATE = EFFECTIVE_END_DATE;
         String CALC_METHOD_1STPERIOD = contractService.getString("CALC_METHOD_1STPERIOD");