Forráskód Böngészése

合同服务调整

zhangyao 2 hónapja
szülő
commit
5766f785d9

+ 1 - 1
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/controller/accountController.java

@@ -23,7 +23,7 @@ import java.util.List;
 import java.util.Map;
 
 @Controller
-public class AccountController extends BaseController {
+public class accountController extends BaseController {
     /**
      * 删除客户
      * @param uc

+ 14 - 2
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCreateController.java

@@ -272,6 +272,14 @@ public class contractCreateController {
         }
         selSql = selSql.substring(0, selSql.length() - 1) + ")";
         List<RowMap> serviceList = DBSql.getMaps(selSql, Arrays.stream(costIdArr).toArray());
+
+        //已审批的合同服务不能删除
+        for (RowMap service : serviceList) {
+            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=? ", new Object[]{service.get("CONTRACT_ID"), service.get("ID")}) > 0) {
+                return ResponseObject.newErrResponse("已审批合同服务,无法删除!");
+            }
+        }
+
         for (RowMap service : serviceList) {
             //删除关联的服务调整
             List<String> csaIdList = DBSql.getList("select ID from BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST where CONTRACT_ID=? and CONTRACT_SERVICE_ID=?", String.class, new Object[]{service.get("CONTRACT_ID"), service.get("ID")});
@@ -289,10 +297,10 @@ public class contractCreateController {
             }
             DBSql.update("delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_ID=? and OBJECT_ID=? and CONTRACT_SERVICE_ID=?", new Object[]{service.get("CONTRACT_ID"), service.get("OBJECT_ID"), service.get("ID")});
 
-
             DBSql.update("delete from BO_EU_DNCTT_CONTRACT_SERVICE where  ID=?", new Object[]{service.get("ID")});
-        }
 
+            DBSql.update("delete from BO_EU_DNCTT_CONTRACT_SERVICE_EDIT where  CONTRACT_SERVICE_ID=?", new Object[]{service.get("ID")});
+        }
 
         return ResponseObject.newOkResponse();
     }
@@ -310,6 +318,10 @@ public class contractCreateController {
         ProcessInstance contractInstance = SDK.getProcessAPI().createBOProcessInstance("obj_e4b0c7ae587c406b808f3a4785f05e23", uc.getUID(), "服务调整-" + contractService.getString("NAME") + "-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
 
         BO editBO = new BO();
+
+        contractService.remove("CREATEDATE");
+        contractService.remove("CREATEUSER");
+
         editBO.setAll(contractService);
         editBO.set("CONTRACT_SERVICE_ID", serviceId);
         editBO.set("OLD_UNIT_PRICE", contractService.get("UNIT_PRICE"));

+ 21 - 8
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/contractCreateFormAfterSave.java

@@ -11,7 +11,6 @@ import com.awspaas.user.apps.donenow_ctt.service.contractService;
 
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.Map;
 
 public class contractCreateFormAfterSave extends ExecuteListener {
 
@@ -41,6 +40,7 @@ public class contractCreateFormAfterSave extends ExecuteListener {
         if (boName.equals("BO_EU_DNCTT_CONTRACT") && processExecutionContext.getProcessInstance().getProcessDefId().equals("obj_4bac3fd23814406c8d224ef2094ac274"))
             contractService.getInstance().SaveContract(processExecutionContext.getUserContext(), bindid, false);//保存合同
 
+        //合同上面服务子表
         if (boName.equals("BO_EU_DNCTT_CONTRACT_SERVICE") && processExecutionContext.getProcessInstance().getProcessDefId().equals("obj_4bac3fd23814406c8d224ef2094ac274")) {
             System.out.println("保存合同服务--BO_EU_DNCTT_CONTRACT_SERVICE");
             BO formData = (BO) processExecutionContext.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
@@ -58,7 +58,7 @@ public class contractCreateFormAfterSave extends ExecuteListener {
 
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
 
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto, conn);//新增服务或者服务包--关联产品
 
                     conn.commit();
                 } catch (SQLException e) {
@@ -88,12 +88,12 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                     conn.setAutoCommit(false);
 
                     BO contractBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", formData.getString("CONTRACT_ID"));
-                   // formData.set("BINDID", contractBO.getBindId());
-                   // SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", formData);
+                    // formData.set("BINDID", contractBO.getBindId());
+                    // SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", formData);
 
                     RowMap dto = new RowMap(contractBO.asMap());
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto, conn);//新增服务或者服务包--关联产品
                     conn.commit();
                 } catch (SQLException e) {
                     e.printStackTrace();
@@ -110,16 +110,26 @@ public class contractCreateFormAfterSave extends ExecuteListener {
         if (boName.equals("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT") && processExecutionContext.getProcessInstance().getProcessDefId().equals("obj_e4b0c7ae587c406b808f3a4785f05e23")) {
             System.out.println("保存合同服务--BO_EU_DNCTT_CONTRACT_SERVICE");
             BO formData = (BO) processExecutionContext.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
+
+
             if (formData != null)
                 formData = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_EDIT", formData.getId());
+
+            String IS_EFFECTIVE = formData.getString("IS_EFFECTIVE");
+            if (!IS_EFFECTIVE.equals("未执行"))
+                return;
+
             if (formData != null) {
                 Connection conn = null;
                 try {
                     conn = DBSql.open();
                     conn.setAutoCommit(false);
 
-                    BO contractServiceBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", formData.getString("CONTRACT_SERVICE_ID"));
+                    //  BO contractServiceBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", formData.getString("CONTRACT_SERVICE_ID"));
+                    BO contractBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", formData.getString("CONTRACT_ID"));
+                    RowMap dto = new RowMap(contractBO.asMap());
 
+                    /*
                     Map<String, Object> contractServiceMap = formData.asMap();
 
                     for (String key : excludesArray) {
@@ -134,8 +144,11 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                     RowMap dto = new RowMap(contractBO.asMap());
 
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, contractServiceBO);//保存合同
-
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
+                     */
+                    //2、服务调整:生效日期在合同开始日期和合同结束日期之间;已审批服务周期之后的日期;
+                    // 3、服务周期分为调整前和调整后两个周期;生效日期之后按照新的数量、单价重新生成服务周期;
+                    contractService.getInstance().EditServiceServiceBundle(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto, conn);//新增服务或者服务包--关联产品
 
                     conn.commit();
                 } catch (SQLException e) {

+ 78 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/contractFormBeforeSave.java

@@ -0,0 +1,78 @@
+package com.awspaas.user.apps.donenow_ctt.event;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
+import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener;
+import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.exception.BPMNError;
+import com.actionsoft.sdk.local.SDK;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
+
+public class contractFormBeforeSave extends InterruptListener {
+    public String getDescription() {
+        return "合同表单保存前的事件测试";
+    }
+
+    /**
+     *数据验证
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean execute(ProcessExecutionContext param) throws Exception {
+
+        String boId = param.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BOID);
+        String boName = param.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BONAME);
+        BO formData = (BO) param.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
+
+        //合同编辑
+        if (boName.equals("BO_EU_DNCTT_CONTRACT") && param.getProcessInstance().getProcessDefId().equals("obj_4bac3fd23814406c8d224ef2094ac274")) {
+            //数据库原始数据
+            BO orgData = SDK.getBOAPI().get(boName, boId);
+            if (orgData != null) {
+                LocalDate ORG_START_DATE = getLocalDate(orgData.get("START_DATE"));//合同开始日期
+                LocalDate ORG_END_DATE = getLocalDate(orgData.get("END_DATE"));//合同结束日期
+
+
+                LocalDate START_DATE = getLocalDate(formData.get("START_DATE"));//合同开始日期
+                LocalDate END_DATE = getLocalDate(formData.get("END_DATE"));//合同结束日期
+
+                //修改了合同开始日期
+                if (START_DATE.isEqual(ORG_START_DATE) == false) {
+                    //已审批服务周期,则不能修改合同开始时间
+                    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=? ", new Object[]{orgData.getId()}) > 0) {
+                        throw new BPMNError("500", "已审批服务周期,则不能修改合同开始时间");
+                    }
+                }
+
+                //修改了合同结束日期
+                if (END_DATE.isEqual(ORG_END_DATE) == false) {
+
+                    String END_DATE_STR = END_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+                    String lastPeriodEndDate = DBSql.getString("SELECT MAX(PERIOD_END_DATE) 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=? ", new Object[]{orgData.getId()});
+
+                    //已审批服务周期,则不能修改合同开始时间
+                    if (StringUtils.isNotEmpty(lastPeriodEndDate)) {
+                        LocalDate lastPeriodEndDate1 = getLocalDate(lastPeriodEndDate);
+                        if (!END_DATE.isAfter(lastPeriodEndDate1)) {
+                            String lastPeriodEndDate_STR = lastPeriodEndDate1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                            throw new BPMNError("500", lastPeriodEndDate_STR + "之后的服务周期已被审批,则合同结束日期不能修改到" + END_DATE_STR + "。");
+                        }
+                    }
+                }
+            }
+        }
+
+        dn.recordFormChanges.execute(param);
+
+        return true;
+    }
+}

+ 47 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/editServiceFormBeforeSave.java

@@ -0,0 +1,47 @@
+package com.awspaas.user.apps.donenow_ctt.event;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
+import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener;
+import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.exception.BPMNError;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
+
+public class editServiceFormBeforeSave extends InterruptListener {
+    public String getDescription() {
+        return "合同服务调整保存前的事件测试";
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean execute(ProcessExecutionContext param) throws Exception {
+
+        String boId = param.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BOID);
+        String boName = param.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BONAME);
+        BO formData = (BO) param.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
+
+        LocalDate EFFECTIVE_DATE = getLocalDate(formData.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[]{formData.get("CONTRACT_ID"), formData.get("CONTRACT_SERVICE_ID"), EFFECTIVE_DATE_STR}) > 0) {
+            throw new BPMNError("500", EFFECTIVE_DATE_STR + "之后的服务周期已被审批,则不能修改到当前日期");
+        }
+
+        String IS_EFFECTIVE = formData.getString("IS_EFFECTIVE");
+        if (!IS_EFFECTIVE.equals("未执行"))
+            return false;
+
+        dn.recordFormChanges.execute(param);
+        return true;
+    }
+}

+ 551 - 100
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -164,9 +164,7 @@ public class contractService {
                     boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
 
                     AddContractServiceProduct(uc, dto);//新增服务或者服务包--关联产品
-
                     //更新服务产品价格
-
                     if (!flag) {
                         resultDto.put("success", false);
                         resultDto.put("msg", "新增服务或服务包失败!");
@@ -266,11 +264,146 @@ public class contractService {
             conn = DBSql.open();
             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("BINDID =", contract.get("BINDID")).list();
 
             for (BO service : serviceList) {
                 AddServiceServiceBundleOne(uc, conn, contract, service);
+
+                //如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
+                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);
+                        }
+                    }
+                }
+
+                if (PERIOD_END.isEqual(END_DATE)) {
+                    if (PERIOD_END.isBefore(END_DATE)) {
+                        //延长
+                        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 {
+                        //缩短
+                        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")});
+                }
+
             }
 
 
@@ -342,6 +475,7 @@ public class contractService {
             }
         }
 
+        /*
         String effectiveDateStr = EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         effectiveDateStr = "%" + effectiveDateStr + "%";
         //生效日期修改了
@@ -350,7 +484,7 @@ public class contractService {
         }
 
 
-        //2、服务单价或数量变化???
+        //2、服务单价或数量变化
         if (service.get("ADJUSTED_PRICE") == null || StringUtils.isBlank(service.getString("ADJUSTED_PRICE"))) {
             isCreate = true;
         } else {
@@ -362,6 +496,7 @@ public class contractService {
                 isCreate = true;
             }
         }
+         */
 
         if (!isCreate)
             return true;
@@ -369,28 +504,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) {
-                    /*
-                    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_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;
+        }
+        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)) {
@@ -483,10 +612,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")});
         }
 
-
         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号开始
         if (StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601") && START_DATE.getDayOfMonth() != 1) {
             //本月底日期
@@ -497,7 +623,7 @@ public class contractService {
 
         // 计算首周期起止日期,并判断是否需要新增服务调整记录
         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 end = getLocalDate(firstPeriodDate.get("periodEnd"));
@@ -507,29 +633,33 @@ public class contractService {
 
         //增加服务周期调整
         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();//合同服务调整
             csa.set("CONTRACT_ID", contract.get("ID"));
             csa.set("OBJECT_ID", service.get("OBJECT_ID"));
             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("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);
 
-            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.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
             if (service.getString("OBJECT_TYPE").equals("2"))//服务包
@@ -540,15 +670,16 @@ public class contractService {
                 if (sbsList != null) {
                     for (String sbs : sbsList) {
                         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("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"));
-                        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);     // 周期开始日期指
         }
 
@@ -625,12 +756,342 @@ public class contractService {
      * 调整服务
      * @param uc
      * @param contract
-     * @param service
+     * @param editService
      * @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"));
+
+        contractServiceBO.set("EFFECTIVE_DATE", editService.get("EFFECTIVE_DATE"));
+
+        SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", contractServiceBO, conn);
+
+        contractServiceLogger.info("服务调整成功");
+
         return true;
     }
 
@@ -644,8 +1105,8 @@ public class contractService {
      */
     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)
             serviceList = new ArrayList<BO>();
@@ -812,13 +1273,13 @@ public class contractService {
         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()) {
             //成本子类:合同成本
@@ -931,14 +1392,19 @@ public class contractService {
                 }
                 LocalDate periodEnd;
                 if (svcPeriod > cttPeriod) {
-                    // 如果服务周期大于合同周期,计算服务周期的结束日期???
+                    // 如果服务周期大于合同周期,计算服务周期的结束日期
                     periodEnd = getNextPeriodStart(start, servicePeriod).minusDays(1);
                 } else {
                     // 否则,服务周期结束日期与合同周期相同
                     periodEnd = end;
                 }
+
+                //不能超过合同结束日期
+                if (periodEnd.isAfter(contractEnd)) {
+                    periodEnd = contractEnd;
+                }
+
                 // 判断是否为服务周期的起始日期
-                // 将结果存入Map中
                 dto.put("periodStart", start);
                 dto.put("periodEnd", periodEnd);
                 dto.put("isStartOfPeriod", start.isEqual(serviceEffect));
@@ -1013,6 +1479,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
      */
@@ -1188,27 +1680,27 @@ public class contractService {
                         //SDK.getBOAPI().get("BO_EU_DND_COST_CODE", bo.getString("SETUP_FEE_COST_CODE_ID"), "TAX_CATEGORY_ID").toString();
                     }
                 } 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) {
                         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_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("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("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("ADJUST_PRORATED_PRICE_CHANGE"));
+                        cad.set("EXTENDED_PRICE", bo.get("PERIOD_ADJUSTED_PRICE"));
 
                         String costCodeId = null;
                         if (bo.getString("OBJECT_TYPE").equals("1")) {
@@ -1216,45 +1708,11 @@ public class contractService {
                         } 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) {
+                        if (taxCategoryId != null)
                             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 +1979,14 @@ public class contractService {
 
                 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_USER_ID", null);
                     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)) //类型:初始费用
                 {
-                    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_DATE", null);
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
@@ -1579,7 +2030,7 @@ public class contractService {
                 BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
                 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);
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_MILESTONES", ccm, connUpdate);
                 }
@@ -1775,7 +2226,7 @@ public class contractService {
                 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));//税额
                     cad.set("TAX_DOLLARS", tax_dollars);
                 }