Browse Source

Merge branch 'master' of http://210.51.45.41:3000/itcat_admin/aws_donenow

HULEI 1 tháng trước cách đây
mục cha
commit
34ba4db0d5

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

@@ -42,7 +42,8 @@ public class accountController extends BaseController {
 
         //引用校验
         String result = verifyDel(tableName, ids);
-        if (result != null) return ResponseObject.newErrResponse(result);
+        if (result != null)
+            return ResponseObject.newErrResponse(result);
 
         Connection conn = null;
         try {

+ 22 - 9
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/PeriodCalculationUtil.java

@@ -2,6 +2,7 @@ package com.awspaas.user.apps.donenow_ctt;
 
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
+import com.alibaba.fastjson.JSON;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
@@ -177,7 +178,9 @@ public class PeriodCalculationUtil {
         LOGGERU.info("周期开始日期--计算前:" + contractStartDate);
 
         // 1. 参数校验:避免空指针和非法参数
-        validateParams(ruleCate, contractStartDate, periodBeginDate, periodEndDate);
+        if (validateParams(ruleCate, contractStartDate, periodBeginDate, periodEndDate) == false) {
+            return null;
+        }
 
         List<Period> periodList = new ArrayList<>();
         // 2. 一次性收费:直接生成单个周期
@@ -269,7 +272,7 @@ public class PeriodCalculationUtil {
         }
 
         // 3.2 处理首个周期
-        if (currLastDay != null) {
+        if (currLastDay != null && currLastDay.equals(periodBeginDate) == false) {
 
             if (userMonthDay) {
                 Period period = new Period();
@@ -321,6 +324,8 @@ public class PeriodCalculationUtil {
             }
         }
 
+        LOGGERU.info("周期列表个数:" + periodList.size());
+        LOGGERU.info("周期列表:" + JSON.toJSONString(periodList));
         return periodList;
     }
 
@@ -459,27 +464,34 @@ public class PeriodCalculationUtil {
     /**
      * 参数校验:防止空指针和非法日期范围
      */
-    private static void validateParams(
+    private static boolean validateParams(
             String ruleCate,
             LocalDate contractStartDate,
             LocalDate periodBeginDate,
             LocalDate periodEndDate
     ) {
         if (StringUtils.isBlank(ruleCate)) {
-            throw new IllegalArgumentException("周期类型(ruleCate)不能为空");
+            LOGGERU.info("周期类型(ruleCate)不能为空");
+            return false;
         }
         if (contractStartDate == null) {
-            throw new IllegalArgumentException("合同开始日期(contractStartDate)不能为空");
+            LOGGERU.info("合同开始日期(contractStartDate)不能为空");
+            return false;
         }
         if (periodBeginDate == null) {
-            throw new IllegalArgumentException("服务开始日期(periodBeginDate)不能为空");
+            LOGGERU.info("服务开始日期(periodBeginDate)不能为空");
+            return false;
         }
         if (periodEndDate == null) {
-            throw new IllegalArgumentException("服务结束日期(periodEndDate)不能为空");
+            LOGGERU.info("服务结束日期(periodEndDate)不能为空");
+            return false;
         }
         if (periodBeginDate.isAfter(periodEndDate)) {
-            throw new IllegalArgumentException("服务开始日期不能晚于服务结束日期");
+            LOGGERU.info("服务开始日期不能晚于服务结束日期");
+            return false;
         }
+
+        return true;
     }
 
     // ------------------------------ 私有工具方法:自然月模式计算 ------------------------------
@@ -748,7 +760,8 @@ public class PeriodCalculationUtil {
      */
     public static BigDecimal toBigDecimal(Object obj) {
         if (obj == null) {
-            throw new IllegalArgumentException("对象不能为null");
+            //throw new IllegalArgumentException("对象不能为null");
+            return BigDecimal.ZERO;
         }
 
         if (obj instanceof BigDecimal) {

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

@@ -18,10 +18,13 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
+
 /**
  * 合同创建时,使用的接口
  */
@@ -284,8 +287,7 @@ public class contractCreateController {
             if (StringUtils.isNotBlank(CONTRACT_COST_ID)) {
                 //采购订单相关也有删除
                 List<BO> costProducts = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_COST_PRODUCT").addQuery("CONTRACT_COST_ID =", CONTRACT_COST_ID).list();
-                if (costProducts.size() > 0)
-                    return ResponseObject.newErrResponse("已经生成采购订单,请先删除采购订单");
+                if (costProducts.size() > 0) return ResponseObject.newErrResponse("已经生成采购订单,请先删除采购订单");
             }
         }
 
@@ -359,4 +361,85 @@ public class contractCreateController {
         return responseObject;
     }
 
+
+    /**
+     * 生成合同服务周期
+     * @param uc
+     * @param contractId
+     * @param serviceIds
+     * @return
+     */
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.contract_service_period")
+    public ResponseObject servicePeriod(UserContext uc, String contractId, String serviceIds) {
+
+        if (StringUtils.isBlank(contractId))
+            return ResponseObject.newErrResponse("请选择合同");
+        if (StringUtils.isBlank(serviceIds))
+            return ResponseObject.newErrResponse("请选择合同服务");
+
+        BO contractBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", contractId);
+
+        // 1、合同开始日期或结束日期变化
+        LocalDate START_DATE = getLocalDate(contractBO.get("START_DATE"));//服务开始日期
+        LocalDate END_DATE = getLocalDate(contractBO.get("END_DATE"));//合同结束日期
+
+        if (END_DATE == null || START_DATE == null) {
+            return ResponseObject.newErrResponse("请先设置合同计费开始日期和计费结束日期");
+        }
+
+        if (START_DATE.isAfter(END_DATE)) {
+            return ResponseObject.newErrResponse("合同开始日期不能大于结束日期");
+        }
+
+        List<BO> services = new ArrayList<>();
+        for (String serviceId : serviceIds.split(",")) {
+            BO contraService = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("CONTRACT_ID =", contractId).addQuery("ID =", serviceId).detail();
+
+            LocalDate EFFECTIVE_DATE = getLocalDate(contractBO.get("EFFECTIVE_DATE"));//服务生效日期
+            if (EFFECTIVE_DATE == null) {
+                return ResponseObject.newErrResponse("请先设置服务生效日期");
+            }
+            if (EFFECTIVE_DATE.isBefore(START_DATE) || EFFECTIVE_DATE.isAfter(END_DATE)) {
+                return ResponseObject.newErrResponse("服务生效日期必须在合同计费开始日期和结束日期之间");
+            }
+            services.add(contraService);
+        }
+
+        Connection conn = null;
+        try {
+            conn = DBSql.open();
+            conn.setAutoCommit(false);
+
+            RowMap dto = new RowMap(contractBO.asMap());
+            for (BO contraService : services) {
+                //2、服务调整:生效日期在合同开始日期和合同结束日期之间;已审批服务周期之后的日期;
+                // 3、服务周期分为调整前和调整后两个周期;生效日期之后按照新的数量、单价重新生成服务周期;
+                contractService.getInstance().AddService(uc, conn, dto, contraService);//保存合同
+                contractService.getInstance().AddContractServiceProductOne(uc, dto, contraService, conn);//新增服务或者服务包--关联产品
+
+
+                if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? ", new Object[]{contraService.get("ID")}) > 0) {
+
+                } else {
+                    return ResponseObject.newErrResponse("生成服务周期失败!");
+                }
+            }
+
+            conn.commit();
+        } catch (SQLException e) {
+
+            e.printStackTrace();
+            try {
+                conn.rollback();
+            } catch (SQLException e1) {
+                e1.printStackTrace();
+            }
+        } finally {
+            if (conn != null)
+                DBSql.close(conn);
+        }
+
+        return ResponseObject.newOkResponse();
+    }
+
 }

+ 13 - 3
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/contractCreateFormAfterSave.java

@@ -43,6 +43,9 @@ public class contractCreateFormAfterSave extends ExecuteListener {
         //合同上面服务子表
         if (boName.equals("BO_EU_DNCTT_CONTRACT_SERVICE") && processExecutionContext.getProcessInstance().getProcessDefId().equals("obj_4bac3fd23814406c8d224ef2094ac274")) {
             System.out.println("保存合同服务--BO_EU_DNCTT_CONTRACT_SERVICE");
+
+            //2025年11月3日 去除服务保存后自动生成服务周期
+            /*
             BO formData = (BO) processExecutionContext.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
             if (formData != null)
                 formData = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", formData.getId());
@@ -56,8 +59,6 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                         contractBO = SDK.getBOAPI().getByProcess("BO_EU_DNCTT_CONTRACT_APPLY", bindid);
                     RowMap dto = new RowMap(contractBO.asMap());
 
-                    //contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
-
                     //2025年10月30日 修改新增服务
                     contractService.getInstance().AddService(processExecutionContext.getUserContext(), conn, dto, formData);
 
@@ -75,12 +76,17 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                 }
             }
 
+             */
+
         }
 
 
         //新增服务
         if (boName.equals("BO_EU_DNCTT_CONTRACT_SERVICE") && processExecutionContext.getProcessInstance().getProcessDefId().equals("obj_58693e03feac4879901430440b42efd9")) {
             System.out.println("保存合同服务--BO_EU_DNCTT_CONTRACT_SERVICE");
+            //2025年11月3日 去除服务保存后自动生成服务周期
+            /*
+
             BO formData = (BO) processExecutionContext.getParameter(ListenerConst.FORM_EVENT_PARAM_FORMDATA);
             if (formData != null)
                 formData = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", formData.getId());
@@ -99,9 +105,11 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                    // contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
 
                     //2025年10月30日 修改新增服务
-                    contractService.getInstance().AddService(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
+                   contractService.getInstance().AddService(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
 
                     contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto, conn);//新增服务或者服务包--关联产品
+
+
                     conn.commit();
                 } catch (SQLException e) {
                     e.printStackTrace();
@@ -112,6 +120,8 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                 }
             }
 
+
+             */
         }
 
         //修改服务

+ 180 - 159
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -144,7 +144,7 @@ public class contractService {
                         contractNo = orgContractNo + "-S" + String.format("%03d", Integer.parseInt(lastNo) + 1);
                         contractBO.set("NO", contractNo);
                     } else {
-                        contractNo = orgContractNo + "-SOO1";
+                        contractNo = orgContractNo + "-S001";
                         contractBO.set("NO", contractNo);
                     }
                 } else {
@@ -167,8 +167,7 @@ public class contractService {
                 }
             }
 
-            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);
@@ -198,7 +197,8 @@ public class contractService {
             //更新合同产品上面的客户ID
             DBSql.update("update BO_EU_DNCTT_CONTRACT_COST set ACCOUNT_ID=?,BILL_ACCOUNT_ID=? where CONTRACT_ID=?", new Object[]{dto.getString("ACCOUNT_ID"), dto.getString("BILL_ACCOUNT_ID"), dto.getString("ID")});
 
-
+//2025年11月3日 新增服务后,不再自动生成服务周期
+/*
             if (TYPE_ID.equals(cttConstant.CONTRACT_TYPE_SERVICE)) // 如果是服务合同
             {
                 try {
@@ -227,7 +227,7 @@ public class contractService {
                     return resultDto;
                 }
             }
-
+*/
             resultDto.put("success", true);
 
             return resultDto;
@@ -1106,10 +1106,13 @@ public class contractService {
         LocalDate START_DATE = getLocalDate(contract.get("START_DATE"));//服务开始日期
         LocalDate END_DATE = getLocalDate(contract.get("END_DATE"));//合同结束日期
         LocalDate EFFECTIVE_DATE = getLocalDate(service.get("EFFECTIVE_DATE"));//服务生效日期
+        if (END_DATE == null) {
+            return 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  BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")}) > 0) {
-            return true;
+            return false;
         }
 
         //删除历史数据
@@ -1145,87 +1148,86 @@ public class contractService {
 
         List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, END_DATE, service.getString("CALC_METHOD_1STPERIOD"), service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
+        if (periodList != null && periodList.size() > 0) {
+            String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
+            int i = 0;
+            for (PeriodCalculationUtil.Period period : periodList) {
 
-        String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
-
-        int i = 0;
-        for (PeriodCalculationUtil.Period period : periodList) {
-
-            i++;
-            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"));
+                i++;
+                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", period.getPeriodBeginDateStr());
-            csp.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
+                csp.set("PERIOD_BEGIN_DATE", period.getPeriodBeginDateStr());
+                csp.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
 
-            csp.set("QUANTITY", service.get("QUANTITY"));
+                csp.set("QUANTITY", service.get("QUANTITY"));
 
-            //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
-            if (i == 1 && service.get("CALC_METHOD_1STPERIOD").equals("4591")) {
-                //firstRate<1
-                if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
+                //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
+                if (i == 1 && service.get("CALC_METHOD_1STPERIOD").equals("4591")) {
+                    //firstRate<1
+                    if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
 
-                    //首月成本需要单独计算
-                    BigDecimal UNIT_PRICE_1STMONTH = toBigDecimal(service.get("UNIT_PRICE_1STMONTH"));
-                    UNIT_PRICE_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_PRICE_1STMONTH);
-                    csp.set("PERIOD_PRICE", UNIT_PRICE_1STMONTH);
+                        //首月成本需要单独计算
+                        BigDecimal UNIT_PRICE_1STMONTH = toBigDecimal(service.get("UNIT_PRICE_1STMONTH"));
+                        UNIT_PRICE_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_PRICE_1STMONTH);
+                        csp.set("PERIOD_PRICE", UNIT_PRICE_1STMONTH);
 
-                    //首期成本怎么算?  在同一个月 和不在 同一个月
-                    LocalDate PURCHASE_START_DATE = service.get("PURCHASE_START_DATE", LocalDate.class);
+                        //首期成本怎么算?  在同一个月 和不在 同一个月
+                        LocalDate PURCHASE_START_DATE = service.get("PURCHASE_START_DATE", LocalDate.class);
 
-                    if (EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyyMM")).equals(PURCHASE_START_DATE.format(DateTimeFormatter.ofPattern("yyyyMM")))) {
-                        BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
-                        UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
-                        csp.set("PERIOD_COST", period.getRate().multiply(UNIT_COST_1STMONTH));
+                        if (EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyyMM")).equals(PURCHASE_START_DATE.format(DateTimeFormatter.ofPattern("yyyyMM")))) {
+                            BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
+                            UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
+                            csp.set("PERIOD_COST", period.getRate().multiply(UNIT_COST_1STMONTH));
+                        } else {
+                            csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
+                        }
                     } else {
+                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
                         csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
                     }
+
                 } else {
                     csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
+
                     csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
                 }
 
-            } else {
-                csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
-
-                csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
-            }
-
-            csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
+                csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
 
-            csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
+                csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
 
-            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);
+                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);
+                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);
+                        }
                     }
                 }
             }
-        }
-
-        //更新合同服务上的
-        DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, StringUtils.EMPTY, service.get("ID"), service.get("BINDID")});
-        service.set("PERIOD", PERIOD);
-        service.set("ADJUST_PERIOD", StringUtils.EMPTY);
 
+            //更新合同服务上的
+            DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, StringUtils.EMPTY, service.get("ID"), service.get("BINDID")});
+            service.set("PERIOD", PERIOD);
+            service.set("ADJUST_PERIOD", StringUtils.EMPTY);
+        }
         return true;
     }
 
@@ -1239,6 +1241,7 @@ public class contractService {
      * @return
      */
     public boolean ServiceAdjustEndDate(UserContext uc, BO service, LocalDate END_DATE, Connection conn) {
+        if (END_DATE == null) return true;
 
         String PERIOD_TYPE = service.getString("PERIOD_TYPE");//服务周期类型
         //已经审批并提交则不能重新生成服务
@@ -1838,104 +1841,78 @@ public class contractService {
         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 (serviceList2 != null && serviceList2.size() > 0) for (BO service : serviceList2) {
+            serviceList.add(service);
+        }
 
         for (BO service : serviceList) {
+            AddContractServiceProductOne(uc, contract, service, conn);
+        }
+        return true;
+    }
 
-            String PRODUCT_ID = null;
-            if (service.getString("OBJECT_TYPE").equals("2"))//服务包
-            {
-                // String serviceIDS = DBSql.getString(conn, "select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
-                RowMap serviceBUNDLE = DBSql.getMap(conn, "SELECT SERVICE_ID,UNIT_COST,UNIT_PRICE FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID=?", new Object[]{service.getString("OBJECT_ID")});
-                String serviceIDS = serviceBUNDLE.getString("SERVICE_ID");
 
-                Double BUNDLE_UNIT_COST = serviceBUNDLE.getDouble("UNIT_COST");
-                Double BUNDLE_UNIT_PRICE = serviceBUNDLE.getDouble("UNIT_PRICE");
+    /**
+     * 增加服务产品
+     * @param uc
+     * @param contract
+     * @param service
+     * @param conn
+     * @return
+     * @throws SQLException
+     */
+    public boolean AddContractServiceProductOne(UserContext uc, RowMap contract, BO service, Connection conn) throws SQLException {
 
-                List<RowMap> ivtServiceList = DBSql.getMaps(conn, "select ID,UNIT_COST,UNIT_PRICE from BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
+        String PRODUCT_ID = null;
+        if (service.getString("OBJECT_TYPE").equals("2"))//服务包
+        {
+            // String serviceIDS = DBSql.getString(conn, "select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
+            RowMap serviceBUNDLE = DBSql.getMap(conn, "SELECT SERVICE_ID,UNIT_COST,UNIT_PRICE FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID=?", new Object[]{service.getString("OBJECT_ID")});
+            String serviceIDS = serviceBUNDLE.getString("SERVICE_ID");
 
-                RowMap ivtServiceSum = DBSql.getMap(conn, "SELECT SUM(UNIT_COST) AS SUM_COST,SUM(UNIT_PRICE) AS SUM_PRICE  FROM BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
+            Double BUNDLE_UNIT_COST = serviceBUNDLE.getDouble("UNIT_COST");
+            Double BUNDLE_UNIT_PRICE = serviceBUNDLE.getDouble("UNIT_PRICE");
 
-                Map<String, Double> unitPriceMap = new HashMap<String, Double>();
-                Map<String, Double> unitCostMap = new HashMap<String, Double>();
-                for (RowMap ivtService : ivtServiceList) {
-                    Double UNIT_PRICE = ivtService.getDouble("UNIT_PRICE");
-                    Double UNIT_COST = ivtService.getDouble("UNIT_COST");
+            List<RowMap> ivtServiceList = DBSql.getMaps(conn, "select ID,UNIT_COST,UNIT_PRICE from BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
 
-                    UNIT_PRICE = ivtServiceSum.getDouble("SUM_PRICE") == 0 ? 0.0 : BUNDLE_UNIT_PRICE * UNIT_PRICE / ivtServiceSum.getDouble("SUM_PRICE");
-                    unitPriceMap.put(ivtService.getString("ID"), UNIT_PRICE);
+            RowMap ivtServiceSum = DBSql.getMap(conn, "SELECT SUM(UNIT_COST) AS SUM_COST,SUM(UNIT_PRICE) AS SUM_PRICE  FROM BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
 
-                    UNIT_COST = ivtServiceSum.getDouble("SUM_COST") == 0 ? 0.0 : BUNDLE_UNIT_COST * UNIT_COST / ivtServiceSum.getDouble("SUM_COST");
-                    unitCostMap.put(ivtService.getString("ID"), UNIT_COST);
-                }
+            Map<String, Double> unitPriceMap = new HashMap<String, Double>();
+            Map<String, Double> unitCostMap = new HashMap<String, Double>();
+            for (RowMap ivtService : ivtServiceList) {
+                Double UNIT_PRICE = ivtService.getDouble("UNIT_PRICE");
+                Double UNIT_COST = ivtService.getDouble("UNIT_COST");
 
-                for (String serviceID : serviceIDS.split(",")) {
-                    String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND  CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
-
-                    String NEED_PURCHASE = service.getString("NEED_PURCHASE");
-                    if (NEED_PURCHASE.equals("1")) {
-                        Map<String, String> contractCost = new HashMap<String, String>();
-                        contractCost.put("ID", contractCostId);
-                        contractCost.put("SERVICE_ID", service.getString("ID"));
-                        contractCost.put("SERVICE_NAME", service.getString("NAME"));
-                        contractCost.put("serviceID", serviceID);
-                        contractCost.put("CONTRACT_ID", contract.getString("ID"));
-                        contractCost.put("QUANTITY", service.getString("QUANTITY"));
-
-                        contractCost.put("UNIT_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
-                        contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
-
-                        //采购
-                        contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));//采购周期
-                        String PURCHASE_START_DATE = service.getString("PURCHASE_START_DATE");
-                        if (StringUtils.isBlank(PURCHASE_START_DATE))
-                            PURCHASE_START_DATE = contract.getString("START_DATE");
-
-                        contractCost.put("PURCHASE_START_DATE", PURCHASE_START_DATE);//采购开始日期
-                        contractCost.put("CONTRACT_START_DATE", contract.getString("START_DATE"));
-                        contractCost.put("CONTRACT_END_DATE", contract.getString("END_DATE"));//采购结束日期
-
-                        contractCost.put("PURCHASE_CALC_METHOD_1STPERIOD", service.getString("PURCHASE_CALC_METHOD_1STPERIOD"));
-                        contractCost.put("CALC_METHOD_1STYEAR", service.getString("CALC_METHOD_1STYEAR"));
-                        contractCost.put("MONTH_1STQUARTER", service.getString("MONTH_1STQUARTER"));
-
-                        PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
-                    } else {
-                        //是否 删除 contractCostId  没有采购 没有拣货时可删除
-                        if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
-                            String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
-                            SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
-                            DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
-                        }
-                    }
+                UNIT_PRICE = ivtServiceSum.getDouble("SUM_PRICE") == 0 ? 0.0 : BUNDLE_UNIT_PRICE * UNIT_PRICE / ivtServiceSum.getDouble("SUM_PRICE");
+                unitPriceMap.put(ivtService.getString("ID"), UNIT_PRICE);
+
+                UNIT_COST = ivtServiceSum.getDouble("SUM_COST") == 0 ? 0.0 : BUNDLE_UNIT_COST * UNIT_COST / ivtServiceSum.getDouble("SUM_COST");
+                unitCostMap.put(ivtService.getString("ID"), UNIT_COST);
+            }
+
+            for (String serviceID : serviceIDS.split(",")) {
+                String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND  CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
 
-                }
-            } else {
-                String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
                 String NEED_PURCHASE = service.getString("NEED_PURCHASE");
                 if (NEED_PURCHASE.equals("1")) {
                     Map<String, String> contractCost = new HashMap<String, String>();
                     contractCost.put("ID", contractCostId);
                     contractCost.put("SERVICE_ID", service.getString("ID"));
                     contractCost.put("SERVICE_NAME", service.getString("NAME"));
-                    contractCost.put("serviceID", service.getString("OBJECT_ID"));
+                    contractCost.put("serviceID", serviceID);
                     contractCost.put("CONTRACT_ID", contract.getString("ID"));
                     contractCost.put("QUANTITY", service.getString("QUANTITY"));
 
-                    contractCost.put("UNIT_PRICE", service.getString("UNIT_PRICE"));
-                    contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
+                    contractCost.put("UNIT_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
+                    contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
 
                     //采购
                     contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));//采购周期
-
                     String PURCHASE_START_DATE = service.getString("PURCHASE_START_DATE");
                     if (StringUtils.isBlank(PURCHASE_START_DATE))
                         PURCHASE_START_DATE = contract.getString("START_DATE");
-                    contractCost.put("PURCHASE_START_DATE", PURCHASE_START_DATE);//采购开始日期
 
+                    contractCost.put("PURCHASE_START_DATE", PURCHASE_START_DATE);//采购开始日期
                     contractCost.put("CONTRACT_START_DATE", contract.getString("START_DATE"));
                     contractCost.put("CONTRACT_END_DATE", contract.getString("END_DATE"));//采购结束日期
 
@@ -1945,21 +1922,63 @@ public class contractService {
 
                     PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
                 } else {
-                    //是否 删除 contractCostId
                     //是否 删除 contractCostId  没有采购 没有拣货时可删除
                     if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
                         String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
                         SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
                         DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
                     }
-
                 }
+
             }
+        } else {
+            String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
+            String NEED_PURCHASE = service.getString("NEED_PURCHASE");
+            if (NEED_PURCHASE.equals("1")) {
+                Map<String, String> contractCost = new HashMap<String, String>();
+                contractCost.put("ID", contractCostId);
+                contractCost.put("SERVICE_ID", service.getString("ID"));
+                contractCost.put("SERVICE_NAME", service.getString("NAME"));
+                contractCost.put("serviceID", service.getString("OBJECT_ID"));
+                contractCost.put("CONTRACT_ID", contract.getString("ID"));
+                contractCost.put("QUANTITY", service.getString("QUANTITY"));
+
+                contractCost.put("UNIT_PRICE", service.getString("UNIT_PRICE"));
+                contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
+
+                //采购
+                contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));//采购周期
+
+                String PURCHASE_START_DATE = service.getString("PURCHASE_START_DATE");
+                if (StringUtils.isBlank(PURCHASE_START_DATE))
+                    PURCHASE_START_DATE = contract.getString("START_DATE");
+                contractCost.put("PURCHASE_START_DATE", PURCHASE_START_DATE);//采购开始日期
+
+                contractCost.put("CONTRACT_START_DATE", contract.getString("START_DATE"));
+                contractCost.put("CONTRACT_END_DATE", contract.getString("END_DATE"));//采购结束日期
+
+                contractCost.put("PURCHASE_CALC_METHOD_1STPERIOD", service.getString("PURCHASE_CALC_METHOD_1STPERIOD"));
+                contractCost.put("CALC_METHOD_1STYEAR", service.getString("CALC_METHOD_1STYEAR"));
+                contractCost.put("MONTH_1STQUARTER", service.getString("MONTH_1STQUARTER"));
+
+                PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
+            } else {
+                //是否 删除 contractCostId
+                //是否 删除 contractCostId  没有采购 没有拣货时可删除
+                if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
+                    String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
+                    SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
+                    DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
+                }
 
+            }
         }
+
+
         return true;
     }
 
+
     /**
      * 一个服务对应添加一个合同产品
      * @param uc
@@ -2036,42 +2055,43 @@ public class contractService {
 
         List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(service.get("PURCHASE_PERIOD_TYPE"), LocalDate.parse(service.get("CONTRACT_START_DATE").substring(0, 10)), LocalDate.parse(service.get("PURCHASE_START_DATE").substring(0, 10)), LocalDate.parse(service.get("CONTRACT_END_DATE").substring(0, 10)), service.get("PURCHASE_CALC_METHOD_1STPERIOD"), service.get("CALC_METHOD_1STYEAR"), service.get("MONTH_1STQUARTER"));
 
+        if (periodList != null && periodList.size() > 0) {
+            //首月成本单独计算  613	按年支付	4591	开通日期所在月
+            if (service.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
+                BigDecimal firstRate = periodList.get(0).getRate();
+                //firstRate<1
+                if (firstRate.compareTo(BigDecimal.ONE) < 0) {
 
-        //首月成本单独计算  613	按年支付	4591	开通日期所在月
-        if (service.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
-            BigDecimal firstRate = periodList.get(0).getRate();
-            //firstRate<1
-            if (firstRate.compareTo(BigDecimal.ONE) < 0) {
+                    //首月成本需要单独计算
+                    BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
 
-                //首月成本需要单独计算
-                BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
+                    UNIT_COST_1STMONTH = firstRate.multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
 
-                UNIT_COST_1STMONTH = firstRate.multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
+                    BigDecimal rate = periodList.stream().skip(1).map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    EXTENDED_COST = EXTENDED_COST.multiply(rate);
 
-                BigDecimal rate = periodList.stream().skip(1).map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
-                EXTENDED_COST = EXTENDED_COST.multiply(rate);
+                    EXTENDED_COST = EXTENDED_COST.add(UNIT_COST_1STMONTH);
 
-                EXTENDED_COST = EXTENDED_COST.add(UNIT_COST_1STMONTH);
+                    contractCost.set("EXTENDED_COST", EXTENDED_COST);
 
-                contractCost.set("EXTENDED_COST", EXTENDED_COST);
 
+                } else {
+                    BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    EXTENDED_COST = EXTENDED_COST.multiply(rate);
+                    contractCost.set("EXTENDED_COST", EXTENDED_COST);
+                }
 
             } else {
-                BigDecimal rate = periodList.stream().skip(1).map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
                 EXTENDED_COST = EXTENDED_COST.multiply(rate);
                 contractCost.set("EXTENDED_COST", EXTENDED_COST);
             }
-
-        } else {
-            BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
-            EXTENDED_COST = EXTENDED_COST.multiply(rate);
-            contractCost.set("EXTENDED_COST", EXTENDED_COST);
+            //单元成本
+            contractCost.set("UNIT_COST", divideToBigDecimal(contractCost.get("EXTENDED_COST"), contractCost.get("QUANTITY")));
+            contractServiceLogger.info("计算合同成本周期结束:" + EXTENDED_COST);
         }
 
 
-        //单元成本
-        contractCost.set("UNIT_COST", divideToBigDecimal(contractCost.get("EXTENDED_COST"), contractCost.get("QUANTITY")));
-
         //总价格
         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"));
 
@@ -2127,7 +2147,8 @@ public class contractService {
      */
     public static BigDecimal toBigDecimal(Object obj) {
         if (obj == null) {
-            throw new IllegalArgumentException("对象不能为null");
+            // throw new IllegalArgumentException("对象不能为null");
+            return BigDecimal.ZERO;
         }
 
         if (obj instanceof BigDecimal) {

+ 15 - 3
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -108,11 +108,23 @@ public class PaymentPlanService {
 
                     BigDecimal RATE_TOTAL = periods.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
 
+                    //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
+                    if (service.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
+                        PeriodCalculationUtil.Period period = periods.get(0);
+                        if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
+                            BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
+                            UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
+                            RATE_TOTAL = RATE_TOTAL.subtract(period.getRate());//减去首月
+                            COST_TOTAL = COST_TOTAL.subtract(UNIT_COST_1STMONTH);//减去首月
+                        }
+                    }
+
+
                     if (RATE_TOTAL.equals(BigDecimal.ZERO) || COST_TOTAL == null || COST_TOTAL.equals(BigDecimal.ZERO))
                         continue;
 
                     BigDecimal UNIT_COST = COST_TOTAL.divide(RATE_TOTAL, 10, RoundingMode.HALF_UP);
-                    int i=0;
+                    int i = 0;
                     for (PeriodCalculationUtil.Period period : periods) {
                         total++;
                         ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
@@ -128,11 +140,11 @@ public class PaymentPlanService {
                             if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
                                 BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
                                 UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
-                                paymentPlan.set("PLAN_AMOUNT",  period.getRate().multiply(UNIT_COST_1STMONTH));
+                                paymentPlan.set("PLAN_AMOUNT", period.getRate().multiply(UNIT_COST_1STMONTH));
                             } else {
                                 paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()));
                             }
-                        }else{
+                        } else {
                             paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()));
                         }
 

+ 6 - 3
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/utils/PeriodCalculationUtil.java

@@ -2,6 +2,7 @@ package com.awspaas.user.apps.donenow_ivt.utils;
 
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
+import com.alibaba.fastjson.JSON;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
@@ -269,7 +270,7 @@ public class PeriodCalculationUtil {
         }
 
         // 3.2 处理首个周期
-        if (currLastDay != null) {
+        if (currLastDay != null && currLastDay.equals(periodBeginDate) == false) {
 
             if (userMonthDay) {
                 Period period = new Period();
@@ -320,7 +321,8 @@ public class PeriodCalculationUtil {
                 startDate = periodEnd.plusDays(1);
             }
         }
-
+        LOGGERU.info("周期列表个数:" + periodList.size());
+        LOGGERU.info("周期列表:" + JSON.toJSONString(periodList));
         return periodList;
     }
 
@@ -748,7 +750,8 @@ public class PeriodCalculationUtil {
      */
     public static BigDecimal toBigDecimal(Object obj) {
         if (obj == null) {
-            throw new IllegalArgumentException("对象不能为null");
+            //throw new IllegalArgumentException("对象不能为null");
+            return BigDecimal.ZERO;
         }
 
         if (obj instanceof BigDecimal) {