zhangyao hai 2 meses
pai
achega
8e5f616c7e

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

@@ -9,6 +9,7 @@ import com.actionsoft.bpms.server.bind.annotation.Controller;
 import com.actionsoft.bpms.server.bind.annotation.Mapping;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
+import com.actionsoft.sdk.local.api.Logger;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.awspaas.user.apps.donenow_crm.constant.CrmConstant;
@@ -24,6 +25,8 @@ import java.util.Map;
 
 @Controller
 public class accountController extends BaseController {
+    private static final Logger logger = SDK.getLogAPI().getLogger(accountController.class);//记录日志
+
     /**
      * 删除客户
      * @param uc
@@ -315,10 +318,18 @@ public class accountController extends BaseController {
                 if (StringUtils.isBlank(id) || id.length() < 2)
                     continue;
                 String sqlById = sql.replace("**id**", "'" + id + "'");
+
+                logger.info("BO_EU_DNSYS_DELETE_VERIFY----" + sqlById);
+
                 List<RowMap> list = DBSql.getMaps(sqlById);
                 if (!list.isEmpty()) {
                     String errMsg = null;
                     for (RowMap rowMap : list) {
+                        if (rowMap.containsKey("name"))
+                            rowMap.put("NAME", rowMap.get("name"));
+                        if (rowMap.containsKey("num"))
+                            rowMap.put("NUM", rowMap.get("num"));
+
                         errMsg += rowMap.getString("NAME") + rowMap.getString("NUM") + "\r\n";
                     }
                     return "删除失败,被以下数据引用:\r\n" + errMsg;

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

@@ -300,6 +300,8 @@ public class contractCreateController {
             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")});
+
+            DBSql.update("delete from BO_EU_DNCTT_CONTRACT_COST where  IS_SERVICE_PRODUCT=1 AND SERVICE_ID=?", new Object[]{service.get("ID")});
         }
 
         return ResponseObject.newOkResponse();

+ 14 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/invoiceController.java

@@ -4,6 +4,7 @@ import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.server.bind.annotation.Controller;
 import com.actionsoft.bpms.server.bind.annotation.Mapping;
+import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
 import com.awspaas.user.apps.donenow_ctt.service.InvoiceDealDto;
 import com.awspaas.user.apps.donenow_ctt.service.InvoiceService;
@@ -83,4 +84,17 @@ public class invoiceController {
         return ResponseObject.newOkResponse();
     }
 
+
+    /**
+     * 获取税率
+     * @param uc
+     * @param taxCategoryId
+     * @return
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ctt.getTaxRate")
+    public ResponseObject getTaxRate(UserContext uc, String taxCategoryId) {
+        String taxRate = DBSql.getString("select EXT1 from bo_eu_dnd_general where is_active=1 and closed=0 and general_table_id=44 AND OID=? AND ORGID=?", new Object[]{taxCategoryId, uc.getCompanyModel().getId()});
+        return ResponseObject.newOkResponse().put("taxRate", taxRate);
+    }
+
 }

+ 188 - 151
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -66,10 +66,8 @@ public class contractService {
             if (contractBO.getString("IS_SUBMIT").equals("1"))//已提交
                 isSubmit = true;
             String TYPE_ID = contractBO.getString("TYPE_ID");//合同类型
-            if (isSubmit)
-                contractBO.set("IS_SUBMIT", 1);
-            else
-                contractBO.set("IS_SUBMIT", 0);
+            if (isSubmit) contractBO.set("IS_SUBMIT", 1);
+            else contractBO.set("IS_SUBMIT", 0);
 
             if (TYPE_ID.equals(cttConstant.CONTRACT_TYPE_SERVICE)) // 如果是服务合同
             {
@@ -81,34 +79,33 @@ public class contractService {
                 Date END_DATE = contractBO.get("END_DATE", Date.class);
 
                 //通过 合同周期个数和合同周期类型计算结束日期
-                if (END_DATE == null || END_DATE.before(START_DATE))
-                    if (OCCURRENCES != null && OCCURRENCES > 0) {
-                        // 使用 Calendar 进行日期操作
-                        Calendar calendar = Calendar.getInstance();
-                        calendar.setTime(START_DATE);
-                        if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_HALFYEAR)) {
-                            calendar.add(Calendar.MONTH, OCCURRENCES * 6);
-                            calendar.add(Calendar.DAY_OF_MONTH, -1);
-                            END_DATE = calendar.getTime();
-                        } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_MONTH)) {
-                            calendar.add(Calendar.MONTH, OCCURRENCES);
-                            calendar.add(Calendar.DAY_OF_MONTH, -1);
-                            END_DATE = calendar.getTime();
-                        } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_QUARTER)) {
-                            calendar.add(Calendar.MONTH, OCCURRENCES * 3);
-                            calendar.add(Calendar.DAY_OF_MONTH, -1);
-                            END_DATE = calendar.getTime();
-                        } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_YEAR)) {
-                            calendar.add(Calendar.MONTH, OCCURRENCES * 12);
-                            calendar.add(Calendar.DAY_OF_MONTH, -1);
-                            END_DATE = calendar.getTime();
-                        } else {
-                            resultDto.put("success", false);
-                            resultDto.put("msg", "周期类型输入错误!");
-                            return resultDto;
-                        }
-                        contractBO.set("END_DATE", END_DATE);
+                if (END_DATE == null || END_DATE.before(START_DATE)) if (OCCURRENCES != null && OCCURRENCES > 0) {
+                    // 使用 Calendar 进行日期操作
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(START_DATE);
+                    if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_HALFYEAR)) {
+                        calendar.add(Calendar.MONTH, OCCURRENCES * 6);
+                        calendar.add(Calendar.DAY_OF_MONTH, -1);
+                        END_DATE = calendar.getTime();
+                    } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_MONTH)) {
+                        calendar.add(Calendar.MONTH, OCCURRENCES);
+                        calendar.add(Calendar.DAY_OF_MONTH, -1);
+                        END_DATE = calendar.getTime();
+                    } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_QUARTER)) {
+                        calendar.add(Calendar.MONTH, OCCURRENCES * 3);
+                        calendar.add(Calendar.DAY_OF_MONTH, -1);
+                        END_DATE = calendar.getTime();
+                    } else if (PERIOD_TYPE.equals(cttConstant.PERIOD_TYPE_YEAR)) {
+                        calendar.add(Calendar.MONTH, OCCURRENCES * 12);
+                        calendar.add(Calendar.DAY_OF_MONTH, -1);
+                        END_DATE = calendar.getTime();
+                    } else {
+                        resultDto.put("success", false);
+                        resultDto.put("msg", "周期类型输入错误!");
+                        return resultDto;
                     }
+                    contractBO.set("END_DATE", END_DATE);
+                }
             }
 
             contractBO.set("ADJUST_SETUP_FEE", contractBO.get("SETUP_FEE"));
@@ -124,8 +121,7 @@ public class contractService {
                 DBSql.update("update BO_EU_DNCTT_CONTRACT set IS_SDT_DEFAULT=0 where ACCOUNT_ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
             }
 
-            if (idApply)
-                SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
+            if (idApply) SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
             else {
                 dn.recordFormChanges.record(uc, contractBO, "合同编辑");
                 SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", contractBO);
@@ -139,8 +135,7 @@ public class contractService {
 
             RowMap dto = new RowMap(contractBO.asMap());//合同对象
 
-            if (idApply)
-                insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
+            if (idApply) insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
             else {
                 //更新
                 DBSql.update("update BO_EU_DNCTT_CONTRACT_RATE set CONTRACT_ID=? where BINDID=?", new Object[]{dto.getString("ID"), dto.getString("BINDID")});
@@ -330,6 +325,7 @@ public class contractService {
                             BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
                             servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
                             servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
+                            servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
                             servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
                             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
                         } else {
@@ -364,6 +360,9 @@ public class contractService {
                                 period_cost = periodRate.multiply(period_cost);
                                 csp.set("PERIOD_COST", period_cost);
                                 csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
+
+                                csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
+
                                 SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csp, uc, conn);
 
                                 if (service.getString("OBJECT_TYPE").equals("2"))//服务包
@@ -399,6 +398,7 @@ public class contractService {
                         BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, period_end_date));
                         servicePeriod.set("PERIOD_PRICE", multiply(servicePeriod.get("PERIOD_PRICE"), periodRate));
                         servicePeriod.set("PERIOD_COST", multiply(servicePeriod.get("PERIOD_COST"), periodRate));
+                        servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
                         servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
                         SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
 
@@ -427,8 +427,7 @@ public class contractService {
             contractServiceLogger.error("AddServiceServiceBundle--error--失败。。。", e);
 
         } finally {
-            if (conn != null)
-                DBSql.close(conn);
+            if (conn != null) DBSql.close(conn);
         }
         return false;
     }
@@ -443,8 +442,7 @@ public class contractService {
      * @return
      */
     public boolean AddServiceServiceBundleOne(UserContext uc, Connection conn, RowMap contract, BO service) {
-        if (service == null)
-            return false;
+        if (service == null) return false;
 
         contractServiceLogger.info("AddServiceServiceBundleOne--开始");
 
@@ -512,8 +510,7 @@ public class contractService {
         }
          */
 
-        if (!isCreate)
-            return true;
+        if (!isCreate) return true;
 
         //服务已经审批并提交则不需要重新生成
         // 暂时不考虑 审批并提交之后修改服务,不需要重新生成
@@ -587,6 +584,14 @@ public class contractService {
             service.set("UNIT_PRICE", unit_price);
             // service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
             service.set("PERIOD_TYPE", maxPeriod);
+
+            //2025年10月24日 新增 三方合同甲方含税单价
+            service.set("UNIT_PRICE_NOTAX", multiply(service.get("UNIT_PRICE_NOTAX"), rate));
+            service.set("TOTAL_PRICE_NOTAX", multiply(service.get("TOTAL_PRICE_NOTAX"), rate));
+            service.set("PARTYA_UNIT_PRICE", multiply(service.get("PARTYA_UNIT_PRICE"), rate));
+            service.set("PARTYA_UNIT_PRICE_NOTAX", multiply(service.get("PARTYA_UNIT_PRICE_NOTAX"), rate));
+            service.set("PARTYA_TOTAL_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), rate));//三方合同甲方含税总价
+            service.set("PARTYA_TOTAL_PRICE_NOTAX", multiply(service.get("PARTYA_TOTAL_PRICE_NOTAX"), rate));
         }
 
         contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
@@ -631,8 +636,7 @@ public class contractService {
         if (StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601") && START_DATE.getDayOfMonth() != 1) {
             //本月底日期
             LocalDate currMontLastDay = START_DATE.with(TemporalAdjusters.lastDayOfMonth());
-            if (currMontLastDay.isBefore(END_DATE))
-                START_DATE = currMontLastDay.plusDays(1);//周期开始日期
+            if (currMontLastDay.isBefore(END_DATE)) START_DATE = currMontLastDay.plusDays(1);//周期开始日期
         }
 
 
@@ -651,6 +655,7 @@ public class contractService {
             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("PARTYA_PERIOD_PRICE", service.get("PARTYA_TOTAL_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);
@@ -707,6 +712,9 @@ public class contractService {
 
             csa.set("PERIOD_ADJUSTED_PRICE", multiply(service.get("ADJUSTED_PRICE"), periodRate));
             csa.set("PERIOD_PRICE", csa.get("PERIOD_ADJUSTED_PRICE"));
+
+            csa.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));//三方合同甲方含税总价
+
             csa.set("VENDOR_ACCOUNT_ID", vendor_account_id);
             csa.setBindId(service.getString("BINDID"));
 
@@ -771,6 +779,8 @@ public class contractService {
 
                 csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
 
+                csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));//三方合同甲方含税总价
+
                 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);
@@ -818,8 +828,7 @@ public class contractService {
         contractServiceLogger.info("调整服务");
 
         String IS_EFFECTIVE = editService.getString("IS_EFFECTIVE");
-        if (!IS_EFFECTIVE.equals("未执行"))
-            return false;
+        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"));
 
@@ -837,7 +846,10 @@ public class contractService {
             }
         }
 
+        //原合同服务
+        BO contractServiceBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", editService.getString("CONTRACT_SERVICE_ID"));
 
+        String maxPeriod = editService.getString("PERIOD_TYPE");
         //一次性收费服务
         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();
@@ -846,6 +858,8 @@ public class contractService {
             servicePeriod.set("PERIOD_PRICE", editService.get("TOTAL_PRICE"));
             servicePeriod.set("PERIOD_COST", editService.get("TOTAL_COST"));
 
+            servicePeriod.set("PARTYA_PERIOD_PRICE", editService.get("PARTYA_TOTAL_PRICE"));//三方合同甲方含税总价
+
             servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
 
@@ -893,46 +907,69 @@ public class contractService {
                             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();
+                            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);
+                            int priodDays = GetPeriodDays(getPreviousPeriodStart(period_end_date.plusDays(1), editService.getString("PERIOD_TYPE")), period_end_date);
+                            BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), priodDays);
 
-                            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_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"));
+
+                            //三方合同甲方含税总价
+                            servicePeriodAdj.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRateAdj));
+
                             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 (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("PARTYA_PERIOD_PRICE", multiply(servicePeriod.get("PARTYA_PERIOD_PRICE"), 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));
+
+                             */
+
+                            BigDecimal periodRate = BigDecimal.ONE;
+                            LocalDate periodEnd = getNextPeriodStart(period_begin_date, maxPeriod).minusDays(1);//本周期结束时间
+                            if (periodEnd.isAfter(period_end_date)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
+                                periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, period_end_date), GetPeriodDays(period_begin_date, periodEnd));
+                            }
+
+                            servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
+                            servicePeriod.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRate));
+                            servicePeriod.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRate));
+                            servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
+                            //三方合同甲方含税总价
+                            servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRate));
+
                             servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
                             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", servicePeriod, conn);
                         }
@@ -966,6 +1003,7 @@ public class contractService {
                     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);
@@ -975,15 +1013,26 @@ public class contractService {
                     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);
+                     */
+
+                    int priodDays = GetPeriodDays(getPreviousPeriodStart(period_end_date.plusDays(1), editService.getString("PERIOD_TYPE")), period_end_date);
+                    BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), priodDays);
+                    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"));
+                    //三方合同甲方含税总价
+                    servicePeriodAdj.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRateAdj));
+                    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 (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);
+                    }
 
 
                     //旧的计费周期更新
@@ -992,6 +1041,7 @@ public class contractService {
                     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("PARTYA_PERIOD_PRICE", multiply(firstServicePeriod.get("PARTYA_PERIOD_PRICE"), periodRate));
                     firstServicePeriod.set("ORG_PERIOD_ID", ORG_PERIOD_ID);
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", firstServicePeriod, conn);
 
@@ -1004,6 +1054,9 @@ public class contractService {
                     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("PARTYA_PERIOD_PRICE", multiply(firstServicePeriod.get("PARTYA_PERIOD_PRICE"), 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);
@@ -1036,19 +1089,20 @@ public class contractService {
                     servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
                     servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
 
+                    servicePeriodAdj.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), 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);
-                        }
+                    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);
                 }
@@ -1059,9 +1113,7 @@ public class contractService {
 
                 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;
@@ -1097,6 +1149,9 @@ public class contractService {
                         period_cost = periodRate.multiply(period_cost);
                         csp.set("PERIOD_COST", period_cost);
                         csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
+
+                        csp.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRate));//三方合同甲方含税总价
+
                         SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csp, uc, conn);
 
                         if (editService.getString("OBJECT_TYPE").equals("2"))//服务包
@@ -1149,7 +1204,7 @@ public class contractService {
         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"));
@@ -1161,6 +1216,9 @@ public class contractService {
         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("PARTYA_TOTAL_PRICE", editService.get("PARTYA_TOTAL_PRICE"));
+
         SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", contractServiceBO, conn);
 
         contractServiceLogger.info("服务调整成功");
@@ -1181,12 +1239,10 @@ public class contractService {
         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>();
-        if (serviceList2 != null && serviceList2.size() > 0)
-            for (BO service : serviceList2) {
-                serviceList.add(service);
-            }
+        if (serviceList == null) serviceList = new ArrayList<BO>();
+        if (serviceList2 != null && serviceList2.size() > 0) for (BO service : serviceList2) {
+            serviceList.add(service);
+        }
 
         for (BO service : serviceList) {
 
@@ -1295,8 +1351,7 @@ public class contractService {
             e.printStackTrace();
             conn.rollback();
         } finally {
-            if (conn != null)
-                DBSql.close(conn);
+            if (conn != null) DBSql.close(conn);
         }
         return false;
     }
@@ -1400,8 +1455,7 @@ public class contractService {
      */
     public static BigDecimal multiply(Object obj1, Object obj2) {
         try {
-            if (obj1 == null || obj2 == null)
-                return BigDecimal.ZERO;
+            if (obj1 == null || obj2 == null) return BigDecimal.ZERO;
 
             BigDecimal num1 = new BigDecimal(String.valueOf(obj1));
             BigDecimal num2 = new BigDecimal(String.valueOf(obj2));
@@ -1654,13 +1708,11 @@ public class contractService {
      */
     public static LocalDate getLocalDate(Object obj) {
         try {
-            if (obj == null)
-                return null;
+            if (obj == null) return null;
             if (obj instanceof LocalDate) {
                 return (LocalDate) obj;
             } else if (obj instanceof String) {
-                if (StringUtils.isBlank(obj.toString()))
-                    return null;
+                if (StringUtils.isBlank(obj.toString())) return null;
                 // 定义日期格式
                 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                 // 解析字符串为 LocalDate
@@ -1873,8 +1925,7 @@ public class contractService {
                             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();
+                        if (taxCategoryId != null) TAX_CATEGORY_ID = taxCategoryId.toString();
                     }
 
                 }
@@ -1932,15 +1983,13 @@ public class contractService {
             connUpdate.commit();
         } catch (SQLException e) {
             e.printStackTrace();
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
 
         return true;
@@ -2010,15 +2059,13 @@ public class contractService {
             connUpdate.commit();
         } catch (SQLException e) {
             e.printStackTrace();
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
         return true;
     }
@@ -2106,15 +2153,13 @@ public class contractService {
             connUpdate.commit();
         } catch (SQLException e) {
             e.printStackTrace();
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
         return true;
     }
@@ -2162,16 +2207,14 @@ public class contractService {
             }
             connUpdate.commit();
         } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
             return e.getMessage();
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
 
         return null;
@@ -2206,16 +2249,14 @@ public class contractService {
 
             connUpdate.commit();
         } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
             return e.getMessage();
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
         return null;
     }
@@ -2249,16 +2290,14 @@ public class contractService {
             }
             connUpdate.commit();
         } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
             return e.getMessage();
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
         return null;
     }
@@ -2412,15 +2451,13 @@ public class contractService {
             connUpdate.commit();
         } catch (SQLException e) {
             e.printStackTrace();
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
+            if (connUpdate != null && !connUpdate.isClosed()) try {
+                connUpdate.rollback();
+            } catch (SQLException ex) {
+                ex.printStackTrace();
+            }
         } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
+            if (connUpdate != null && !connUpdate.isClosed()) DBSql.close(connUpdate);
         }
 
         return true;