Pārlūkot izejas kodu

计算一次性收费服务

zhangyao 2 mēneši atpakaļ
vecāks
revīzija
a6a662e5a0

+ 319 - 255
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -273,9 +273,11 @@ 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");//服务调整的起止日期
@@ -301,6 +303,8 @@ public class contractService {
 
                 contractServiceLogger.info("服务周期结束日期--" + LocalDateYYYYMMDD(PERIOD_END));
                 contractServiceLogger.info("合同结束日期--" + LocalDateYYYYMMDD(END_DATE));
+
+
                 if (PERIOD_END.isEqual(END_DATE)) {
                     if (PERIOD_END.isBefore(END_DATE)) {
                         contractServiceLogger.info("服务周期延长--" + service.getString("NAME"));
@@ -581,17 +585,15 @@ public class contractService {
             service.set("UNIT_COST", unit_cost);
             unit_price = unit_price.multiply(rate);
             service.set("UNIT_PRICE", unit_price);
-
-            service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
+            // service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
+            service.set("PERIOD_TYPE", maxPeriod);
         }
 
         contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
-
         service.set("TOTAL_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
         service.set("ADJUSTED_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
         service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
 
-
         SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", service, conn);//保存
 
         List<String> sbsList = null;
@@ -633,6 +635,45 @@ public class contractService {
                 START_DATE = currMontLastDay.plusDays(1);//周期开始日期
         }
 
+
+        //2025年10月15日 一次性收费服务
+        if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
+            BO csp = new BO();//服务周期
+            csp.set("CONTRACT_ID", contract.get("ID"));
+            csp.set("OBJECT_ID", service.get("OBJECT_ID"));
+            csp.set("OBJECT_TYPE", service.get("OBJECT_TYPE"));
+            csp.set("CONTRACT_SERVICE_ID", service.get("ID"));
+            csp.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
+            csp.set("PERIOD_END_DATE", END_DATE);
+            csp.set("QUANTITY", service.get("QUANTITY"));
+            BigDecimal period_price = multiply(service.get("UNIT_PRICE"), service.get("QUANTITY"));
+            csp.set("PERIOD_PRICE", period_price);
+            BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
+            csp.set("PERIOD_COST", period_cost);
+            csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
+            csp.set("VENDOR_ACCOUNT_ID", vendor_account_id);
+            csp.setBindId(service.getString("BINDID"));
+            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", vendor_account_id);
+                        cspbs.set("PERIOD_COST", prorated_cost_change);
+                        cspbs.setBindId(service.getString("BINDID"));
+                        SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE", cspbs, uc, conn);
+                    }
+                }
+            }
+            return true;
+        }
+
         // 计算首周期起止日期,并判断是否需要新增服务调整记录
         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");//是否需要服务调整
@@ -782,309 +823,332 @@ public class contractService {
         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;
-        }
+        //2025年10月15日 一次性收费服务
+        if (editService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
 
-        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 (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[]{contract.get("ID"), editService.get("CONTRACT_SERVICE_ID")}) > 0) {
+                return false;
+            }
+        } else {
+            //生效日期之后有审批通过的;
+            if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_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;
             }
         }
 
-        //服务调整的生效日期,是按照日期顺序创建的
-        if (needDel == false) {
 
-            contractServiceLogger.info("服务调整的生效日期,是按照日期顺序创建的");
+        //一次性收费服务
+        if (editService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
+            BO servicePeriod = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).detail();
+            servicePeriod.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
+            servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
+            servicePeriod.set("PERIOD_PRICE", editService.get("TOTAL_PRICE"));
+            servicePeriod.set("PERIOD_COST", editService.get("TOTAL_COST"));
 
-            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();
+            servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
+            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
 
-            if (servicePeriodList != null && servicePeriodList.size() > 0) {
+        } else {
 
-                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);
-                            }
+            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();
 
-                        //旧的计费周期更新
-                        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);
-                    }
+            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);
                 }
             }
 
-        } 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);
-                    }
+            //服务调整的生效日期,是按照日期顺序创建的
+            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) {
 
-                //旧的计费周期更新
-                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);
+                    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);
+                        }
+                    }
+                }
 
-                SATRT_DATE = period_end_date.plusDays(1);
             } 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);
+                        }
+
 
-                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);
+                    //旧的计费周期更新
+                    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 {
 
-                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();
+                    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);
 
-                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});
+                    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});
 
-                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"));
+                    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 servicePeriodAdj = new BO();
 
-                servicePeriodAdj.setAll(firstServicePeriod.asMap());
-                servicePeriodAdj.setId(null);
+                    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"));
 
-                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);
+                    //新的计费周期
+                    BO servicePeriodAdj = new BO();
 
-                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.setAll(firstServicePeriod.asMap());
+                    servicePeriodAdj.setId(null);
 
-                servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
-                SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, uc, conn);
+                    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));
 
-                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);
-                    }
+                    servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
+                    SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriodAdj, 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});
+                    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);
+                        }
 
-            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});
+                    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});
 
-            LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
-            String maxPeriod = editService.getString("PERIOD_TYPE");
+                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});
 
-            //服务包上的服务
-            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)) {
+                LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
+                String maxPeriod = editService.getString("PERIOD_TYPE");
 
-                    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;
-                    }
+                //服务包上的服务
+                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);
+                        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);
+                        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);
-            }
+                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);
+                //缩短
+                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")});
             }
-            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"));