Просмотр исходного кода

1、合同服务的付款计划增加 采购单开始日期;
2、合同服务自动续约功能;

zhangyao 1 месяц назад
Родитель
Сommit
832d322e1a

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

@@ -0,0 +1,114 @@
+package com.awspaas.user.apps.donenow_ctt.job;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.sdk.local.SDK;
+import com.actionsoft.sdk.local.api.Logger;
+import com.awspaas.user.apps.donenow_ctt.service.contractService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.LocalDateYYYYMMDD;
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
+
+
+public class AutoRenewJob implements Job {
+    private static final Logger jobLogger = SDK.getLogAPI().getLogger(AutoRenewJob.class);//记录日志
+
+    /**
+     * 合同服务定数续约
+     * @param jobExecutionContext
+     * @throws JobExecutionException
+     */
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        /*
+        定期服务合同上加了自动续约功能,如果勾选,则其下的定期服务(不是一次性服务),需要自动修改计费结束时间,延长一年。触发时机:最后一个完整周期的开始日期
+         */
+
+        //当前日期
+        String nowDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+        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 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)<=2 ORDER BY PERIOD_BEGIN_DATE DESC");
+
+        UserContext uc = UserContext.fromUID("admin");
+        contractService serviceOp = contractService.getInstance();
+
+        for (RowMap rowMap : list) {
+            String contractId = rowMap.getString("ID");
+            String bindId = rowMap.getString("BINDID");
+            String startDate = rowMap.getString("START_DATE");
+            String endDate = rowMap.getString("END_DATE");
+            String effectiveDate = rowMap.getString("EFFECTIVE_DATE");
+            String contractServiceId = rowMap.getString("CONTRACT_SERVICE_ID");
+            String periodBeginDate = rowMap.getString("PERIOD_BEGIN_DATE");
+            String periodEndDate = rowMap.getString("PERIOD_END_DATE");
+            int cnt = rowMap.getInt("CNT");
+
+            System.out.println("contractId:" + contractId);
+            BO contract = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", contractId);
+
+            if (contract != null) {
+                LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
+                LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
+                END_DATE = END_DATE.plusYears(1);
+                if (END_DATE.isBefore(next2Year)) {
+                    contract.set("END_DATE", LocalDateYYYYMMDD(END_DATE));
+                    SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", contract);
+
+                    jobLogger.info("合同:" + contract.getString("NAME") + "[" + contract.getString("NO") + "]开始续约");
+
+                    jobLogger.info("原结束日期:" + endDate + "----新结束日期:" + LocalDateYYYYMMDD(END_DATE));
+
+                    Connection conn = null;
+                    try {
+                        conn = DBSql.open();
+                        conn.setAutoCommit(false);
+
+                        //获取服务列表
+                        List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("CONTRACT_ID =", contract.get("ID")).list();
+
+                        for (BO service : serviceList) {
+
+                            boolean isAutoRenew = serviceOp.ServiceAutoRenew(uc, service, END_DATE, conn);
+
+                        }
+
+                        conn.commit();
+                    } catch (SQLException e) {
+
+                        jobLogger.info("AddServiceServiceBundle--error--失败。。。" + e.getMessage());
+
+                        e.printStackTrace();
+
+                        try {
+                            conn.rollback();
+                        } catch (SQLException ex) {
+                            throw new RuntimeException(ex);
+                        }
+
+                    } finally {
+                        if (conn != null) DBSql.close(conn);
+                    }
+
+                    jobLogger.info("合同:" + contract.getString("NAME") + "[" + contract.getString("NO") + "]结束续约");
+                }
+            }
+
+
+        }
+
+
+    }
+}

+ 162 - 140
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -341,174 +341,196 @@ public class contractService {
 
             for (BO service : serviceList) {
                 AddServiceServiceBundleOne(uc, conn, contract, service);
-                //一次性收费服务 不受开始日期或结束日期影响
-                if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
-                    continue;
-                }
-                contractServiceLogger.info("判断合同结束日期是否修改");
-                //如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
-                String PERIOD = service.getString("PERIOD");//服务起止日期
-                String ADJUST_PERIOD = service.getString("ADJUST_PERIOD");//服务调整的起止日期
 
-                contractServiceLogger.info("PERIOD---" + PERIOD);
-                contractServiceLogger.info("ADJUST_PERIOD---" + ADJUST_PERIOD);
+                ServiceAutoRenew(uc, service, END_DATE, conn);
+            }
 
-                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);
-                        }
-                    }
-                }
+            conn.commit();
+            return true;
+        } catch (SQLException e) {
 
-                contractServiceLogger.info("服务周期结束日期--" + LocalDateYYYYMMDD(PERIOD_END));
-                contractServiceLogger.info("合同结束日期--" + LocalDateYYYYMMDD(END_DATE));
+            contractServiceLogger.info("AddServiceServiceBundle--error--失败。。。" + e.getMessage());
 
+            e.printStackTrace();
 
-                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.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(PERIOD_END)).orderBy("PERIOD_BEGIN_DATE").desc().list();
+            conn.rollback();
 
-                        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"));
+        } finally {
+            if (conn != null) DBSql.close(conn);
+        }
+        return false;
+    }
 
-                        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("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), 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)) {
+    /**
+     * 服务自动线续约
+     * @param uc
+     * @param service
+     * @param END_DATE
+     * @param conn
+     * @return
+     * @throws SQLException
+     */
+    public boolean ServiceAutoRenew(UserContext uc, BO service, LocalDate END_DATE, Connection conn) {
+        try {
+
+            //一次性收费服务 不受开始日期或结束日期影响
+            if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
+                return true;
+            }
+            contractServiceLogger.info("判断合同结束日期是否修改");
+            //如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
+            String PERIOD = service.getString("PERIOD");//服务起止日期
+            String ADJUST_PERIOD = service.getString("ADJUST_PERIOD");//服务调整的起止日期
+
+            contractServiceLogger.info("PERIOD---" + PERIOD);
+            contractServiceLogger.info("ADJUST_PERIOD---" + 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);
+            }
 
-                            //服务包上的服务
-                            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(","));
-                            }
+            //缩短
+            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);
+                    }
+                }
+            }
 
-                            //循环添加全部周期
-                            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"));
-
-                                csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
-
-                                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 if (PERIOD_END.isAfter(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.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(END_DATE)).orderBy("PERIOD_BEGIN_DATE").asc().list();
+            contractServiceLogger.info("服务周期结束日期--" + LocalDateYYYYMMDD(PERIOD_END));
+            contractServiceLogger.info("合同结束日期--" + LocalDateYYYYMMDD(END_DATE));
 
-                        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));
+
+            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.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(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("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), 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);
+                    }
 
-                        for (BO period : servicePeriodList) {
-                            //删除
-                            if (period.getString("ID").equals(servicePeriod.getString("ID")) == false) {
+                    if (SATRT_DATE != null && SATRT_DATE.isBefore(END_DATE)) {
 
-                                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")});
+                        //服务包上的服务
+                        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"));
+
+                            csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
+
+                            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);
                             }
                         }
                     }
-
-                    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")});
+                } else if (PERIOD_END.isAfter(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.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(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("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), 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")});
             }
 
 
-            conn.commit();
-            return true;
-        } catch (SQLException e) {
-
-            contractServiceLogger.info("AddServiceServiceBundle--error--失败。。。" + e.getMessage());
-
-            e.printStackTrace();
-
-            conn.rollback();
+        } catch (Exception e) {
 
-        } finally {
-            if (conn != null) DBSql.close(conn);
         }
-        return false;
+        return true;
     }
 
 
@@ -1525,7 +1547,7 @@ public class contractService {
         return contractCost.getId();
     }
 
-    private static String LocalDateYYYYMMDD(LocalDate date) {
+    public static String LocalDateYYYYMMDD(LocalDate date) {
         return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
     }
 

+ 4 - 9
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -20,19 +20,13 @@ import com.awspaas.user.apps.donenow_ivt.cache.formStatusCache;
 import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import org.apache.commons.lang3.StringUtils;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.awspaas.user.apps.donenow_ivt.utils.CityAbbreviationUtil.getCityAbbreviation;
 
 @Controller
 public class ivtOrderController {
@@ -679,7 +673,7 @@ public class ivtOrderController {
                     continue;
                 }
 
-                List<String> bindids = DBSql.getList("select BINDID from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=? or CONTRACT_SERVICE_ID=?", String.class, new Object[]{cost.getString("ID"), cost.getString("SERVICE_ID")});
+                List<String> bindids = DBSql.getList("select BINDID from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=? or (CONTRACT_SERVICE_ID=? AND CONTRACT_SERVICE_ID IS NOT NULL AND CONTRACT_SERVICE_ID<>'') ", String.class, new Object[]{cost.getString("ID"), cost.getString("SERVICE_ID")});
                 if (!bindids.isEmpty()) {
                     for (String bindid : bindids) {
                         if (!SDK.getProcessAPI().isEndById(bindid)) {
@@ -695,6 +689,7 @@ public class ivtOrderController {
                     if (StringUtils.isNotBlank(account_id)) {
                         DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_COST SET ACCOUNT_ID=? WHERE ID=?", new Object[]{account_id, cost.getString("ID")});
                         PURCHASE_ACCOUNT_ID.add(account_id);
+                        cost.put("ACCOUNT_ID", account_id);
                     }
                 }
                 System.out.println("处理的account_id: " + account_id);

+ 5 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -194,6 +194,11 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
 
                     LocalDate PERIOD_END_DATE = TypeUtil.convert(DBSql.getString("select END_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
 
+                    //采购单开始日期
+                    if (service.get("PURCHASE_START_DATE") != null) {
+                        START_DATE = TypeUtil.convert(service.get("PURCHASE_START_DATE").toString().substring(0, 10), LocalDate.class);
+                    }
+
                     List<PERIOD> periods = getPeriodList(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601"));
 
                     if (periods.isEmpty())