فهرست منبع

合同服务上:销售不需要首月单价;采购任何情况下都有首月成本,需要单独计算金额,但是不要单独作为一个周期。

zhangyao 1 ماه پیش
والد
کامیت
cde2f906a5

+ 2 - 78
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -1160,35 +1160,6 @@ public class contractService {
         if (periodList != null && periodList.size() > 0) {
             String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
 
-            BigDecimal UNIT_PRICE_1STMONTH = BigDecimal.ZERO;
-            BigDecimal UNIT_COST_1STMONTH = BigDecimal.ZERO;
-            String firstBeginDate = null;
-
-            //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
-            if (periodList.size() > 0 && service.get("CALC_METHOD_1STPERIOD").equals("4591")) {
-                //firstRate<1
-                PeriodCalculationUtil.Period period = periodList.get(0);
-                if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
-                    //首月成本需要单独计算
-                    UNIT_PRICE_1STMONTH = toBigDecimal(service.get("UNIT_PRICE_1STMONTH"));
-                    UNIT_PRICE_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_PRICE_1STMONTH);
-
-                    //首期成本怎么算?  在同一个月 和不在 同一个月
-                    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")))) {
-                        UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
-                        UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
-                        UNIT_COST_1STMONTH = period.getRate().multiply(UNIT_COST_1STMONTH);
-                    } else {
-                        UNIT_COST_1STMONTH = period.getRate().multiply(SERVICE_TOTAL_COST);
-                    }
-
-                    firstBeginDate = period.getPeriodBeginDateStr();
-                }
-            }
-
-
             int i = 0;
             for (PeriodCalculationUtil.Period period : periodList) {
 
@@ -1198,58 +1169,11 @@ public class contractService {
                 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("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) {
-
-                        //跳过
-                        //首月成本需要单独计算
-                        /*
-                        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);
-
-                        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));
-                        }
-
-                        */
-
-                        if (periodList.size() == 1) {
-                            csp.set("PERIOD_PRICE", UNIT_PRICE_1STMONTH);
-                            csp.set("PERIOD_COST", UNIT_COST_1STMONTH);
-                        } else {
-                            continue;
-                        }
-                    } else {
-                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
-                        csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
-                    }
-
-                } else {
-                    if (i == 2 && UNIT_PRICE_1STMONTH.compareTo(BigDecimal.ZERO) > 0) {
-                        csp.set("PERIOD_BEGIN_DATE", firstBeginDate);//首期开始日期
-                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE).add(UNIT_PRICE_1STMONTH));
-                        csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST).add(UNIT_COST_1STMONTH));
-                    } else {
-                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
-                        csp.set("PERIOD_COST", period.getRate().multiply(SERVICE_TOTAL_COST));
-                    }
-                }
+                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"));
 

+ 61 - 64
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -139,47 +139,9 @@ public class contractServiceAdj {
             BigDecimal SERVICE_UNIT_PRICE = null;
             BigDecimal SERVICE_TOTAL_PRICE = null;
 
-            boolean teshuchuli = false;//需要特殊处理
-            BigDecimal PRICE_1STMONTH = null;
-            String teshuchuliBeginDate = null;
             if (StringUtils.isNotBlank(lastPeriodId)) {
-
-
-                //首月+12月为第一周期的情况
-                if (contractService.get("CALC_METHOD_1STPERIOD").equals("4591")) {
-
-                    //获取第一笔
-                    RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by EFFECTIVE_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
-
-                    LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("EFFECTIVE_DATE"));
-
-                    if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
-                        teshuchuli = true;
-                        teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
-
-                        SERVICE_UNIT_PRICE = TypeUtil.convert(contractService.get("UNIT_PRICE_1STMONTH"), BigDecimal.class);
-                        SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, contractService.get("QUANTITY"));
-                        SERVICE_TOTAL_PRICE = multiply(SERVICE_TOTAL_PRICE, 12);
-
-                        BigDecimal periodRate = PeriodCalculationUtil.divideToBigDecimal(getDateRate(EFFECTIVE_DATE, EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1).minusDays(1), false), GetPeriodMonth(contractService.getString("PERIOD_TYPE")));
-
-                        PRICE_1STMONTH = SERVICE_TOTAL_PRICE.multiply(periodRate);
-
-                        EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
-                    }
-                }
-
-                //需要使用首月单价
-                if (teshuchuli) {
-                    SERVICE_UNIT_PRICE = TypeUtil.convert(lastContractService.get("UNIT_PRICE_1STMONTH"), BigDecimal.class);
-                    SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, lastContractService.get("QUANTITY"));
-                    SERVICE_TOTAL_PRICE = multiply(SERVICE_TOTAL_PRICE, 12);
-                } else {
-                    //正常处理
-                    SERVICE_UNIT_PRICE = TypeUtil.convert(lastContractService.get("UNIT_PRICE"), BigDecimal.class);
-                    SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, lastContractService.get("QUANTITY"));
-                }
-
+                SERVICE_UNIT_PRICE = TypeUtil.convert(lastContractService.get("UNIT_PRICE"), BigDecimal.class);
+                SERVICE_TOTAL_PRICE = multiply(SERVICE_UNIT_PRICE, lastContractService.get("QUANTITY"));
 
                 BO lastServicePeriod = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", lastPeriodId);
 
@@ -227,12 +189,7 @@ public class contractServiceAdj {
                     csp.set("QUANTITY", contractService.get("QUANTITY"));
 
                     //第一条
-                    if (teshuchuli && i == 1) {
-                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE).add(PRICE_1STMONTH));
-                        csp.set("PERIOD_BEGIN_DATE", teshuchuliBeginDate);
-                    } else {
-                        csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
-                    }
+                    csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
 
                     csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
                     csp.set("PARTYA_PERIOD_PRICE", multiply(contractService.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
@@ -274,6 +231,51 @@ public class contractServiceAdj {
             orgContractService.set("CALC_METHOD_1STPERIOD", contractService.get("CALC_METHOD_1STPERIOD"));
             orgContractService.set("MONTH_1STQUARTER", contractService.get("MONTH_1STQUARTER"));
 
+            //计算各种不含税金额
+            // 确定周期对应的月数
+            int periodMonths;
+            switch (contractService.getString("PERIOD_TYPE")) {
+                case "610":
+                    periodMonths = 1; // 按月
+                    break;
+                case "611":
+                    periodMonths = 3; // 按季度
+                    break;
+                case "612":
+                    periodMonths = 6; // 按半年
+                    break;
+                case "613":
+                    periodMonths = 12; // 按年
+                    break;
+                default:
+                    periodMonths = 1;
+                    break;
+            }
+
+
+            //月单价  UNIT_PRICE_MONTH
+            orgContractService.set("SERVICE_UNIT_PRICE", SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)));
+
+            RowMap taxCate = DBSql.getMap("SELECT OID,NAME,ORGID,GENERAL_TABLE_ID,EXT1,CLOSED,IS_ACTIVE FROM BO_EU_DND_GENERAL WHERE  GENERAL_TABLE_ID=44 AND ORGID=? AND OID=?", new Object[]{uc.getCompanyModel().getId(), orgContractService.getString("TAX_CATEGORY_ID")}); //税种
+
+            if (taxCate != null) {
+                BigDecimal taxRate = new BigDecimal(taxCate.getString("EXT1"));
+                //月不含税单价 UNIT_PRICE_MONTH_NOTAX
+                BigDecimal taxExcluded = SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)).divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP); // 保留4位小数
+                orgContractService.set("SERVICE_UNIT_PRICE_NOTAX", taxExcluded);
+
+                //周期不含税单价 UNIT_PRICE_NOTAX
+
+                orgContractService.set("UNIT_PRICE_NOTAX", SERVICE_UNIT_PRICE.divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP));
+
+                //周期不含税总价 TOTAL_PRICE_NOTAX
+                orgContractService.set("TOTAL_PRICE_NOTAX", SERVICE_TOTAL_PRICE.divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP));
+            } else {
+                orgContractService.set("SERVICE_UNIT_PRICE_NOTAX", null);
+                orgContractService.set("UNIT_PRICE_NOTAX", null);
+                orgContractService.set("TOTAL_PRICE_NOTAX", null);
+            }
+
             //如果合同服务上面的生效日期小于服务调整的生效日期,则将合同服务生效日期改为服务调整的生效日期
             if (orgContractService.get("EFFECTIVE_DATE", LocalDate.class).compareTo(contractService.get("EFFECTIVE_DATE", LocalDate.class)) < 0)
                 orgContractService.set("EFFECTIVE_DATE", contractService.get("EFFECTIVE_DATE"));
@@ -474,7 +476,6 @@ public class contractServiceAdj {
                 adjBO.set("PURCHASE_CALC_METHOD_1STPERIOD", lastContractServiceAdj.getString("PURCHASE_CALC_METHOD_1STPERIOD"));
                 adjBO.set("MONTH_1STQUARTER", lastContractServiceAdj.getString("MONTH_1STQUARTER"));
                 adjBO.set("UNIT_COST_1STMONTH", lastContractServiceAdj.getString("UNIT_COST_1STMONTH"));
-
             }
 
         } else {
@@ -535,32 +536,28 @@ public class contractServiceAdj {
             BigDecimal COST_1STMONTH = null;
             if (StringUtils.isNotBlank(lastPeriodId)) {
 
-                //首月+12月为第一周期的情况
-                if (contractService.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
-
-                    //获取第一笔
-                    RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+                //获取第一笔
 
-                    LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
+                //首月成本
+                RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
 
-                    if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
-                        teshuchuli = true;
-                        teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
+                LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
 
-                        SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
-                        SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
-                        SERVICE_TOTAL_COST = multiply(SERVICE_TOTAL_COST, 12);
+                if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
+                    teshuchuli = true;
+                    teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
+                    SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
+                    SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
 
-                        BigDecimal periodRate = PeriodCalculationUtil.divideToBigDecimal(getDateRate(EFFECTIVE_DATE, EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1).minusDays(1), false), GetPeriodMonth(contractService.getString("PURCHASE_PERIOD_TYPE")));
+                    BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.getDayOfMonth()).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
+                    ratio = BigDecimal.ONE.subtract(ratio);
 
-                        COST_1STMONTH = SERVICE_TOTAL_COST.multiply(periodRate);
+                    COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
 
-                        EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
-                    }
+                    EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
                 }
 
                 // 首月单独计费
-
                 if (teshuchuli) {
                     SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
                     SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));

+ 75 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -1013,4 +1013,79 @@ public class ivtOrderController {
     }
 
 
+    /**
+     * 检查付款计划是否修改
+     * @param uc
+     * @param requestBindidId
+     * @return
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.checkPaymentPlans")
+    public ResponseObject checkPaymentPlans(UserContext uc, String requestBindidId) {
+
+        List<RowMap> list = DBSql.getMaps("select * from BO_EU_DNIVT_PAY_REQUEST_DETAIL where BINDID=?", new Object[]{requestBindidId});
+
+        if (list.isEmpty()) return ResponseObject.newOkResponse();
+
+        StringBuilder sb = new StringBuilder();
+        for (RowMap detail : list) {
+            String PAYMENT_PLAN_ID = detail.getString("PAYMENT_PLAN_ID");
+            BigDecimal PLAN_AMOUNT = TypeUtil.convert(detail.get("PLAN_AMOUNT"), BigDecimal.class);
+
+            RowMap plan = DBSql.getMap("select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ID=?", new Object[]{PAYMENT_PLAN_ID});
+
+            BigDecimal PLAN_AMOUNT0 = TypeUtil.convert(plan.get("PLAN_AMOUNT"), BigDecimal.class);
+
+            //比较是否相等
+            if (PLAN_AMOUNT.compareTo(PLAN_AMOUNT0) != 0) {
+                ivtLogger.info("付款计划已修改:" + plan.getString("PAY_DESC") + ":" + PLAN_AMOUNT0 + ":" + PLAN_AMOUNT);
+                sb.append(plan.getString("PAY_DESC")).append(":").append(PLAN_AMOUNT0).append(",");
+            }
+        }
+
+        if (sb.length() > 0) {
+            return ResponseObject.newOkResponse("付款计划已修改");
+        }
+
+        return ResponseObject.newOkResponse();
+    }
+
+
+    /**
+     * 同步付款计划金额
+     * @param uc
+     * @param requestBindidId
+     * @return
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.asnyPaymentPlans")
+    public ResponseObject asnyPaymentPlans(UserContext uc, String requestBindidId) {
+
+        List<RowMap> list = DBSql.getMaps("select * from BO_EU_DNIVT_PAY_REQUEST_DETAIL where BINDID=?", new Object[]{requestBindidId});
+
+        if (list.isEmpty())
+            return ResponseObject.newOkResponse();
+
+        for (RowMap detail : list) {
+            String PAYMENT_PLAN_ID = detail.getString("PAYMENT_PLAN_ID");
+            BigDecimal PLAN_AMOUNT = TypeUtil.convert(detail.get("PLAN_AMOUNT"), BigDecimal.class);
+
+            RowMap plan = DBSql.getMap("select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ID=?", new Object[]{PAYMENT_PLAN_ID});
+
+            BigDecimal PLAN_AMOUNT0 = TypeUtil.convert(plan.get("PLAN_AMOUNT"), BigDecimal.class);
+
+            //比较是否相等
+            if (PLAN_AMOUNT.compareTo(PLAN_AMOUNT0) != 0) {
+
+                BO detailBO = SDK.getBOAPI().get("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detail.getString("ID"));
+
+                detailBO.set("PLAN_AMOUNT", PLAN_AMOUNT0);
+
+                SDK.getBOAPI().update("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detailBO);
+
+            }
+        }
+
+        return ResponseObject.newOkResponse();
+    }
+
+
 }

+ 3 - 3
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/payRequestProcessAfterComplete.java

@@ -34,14 +34,14 @@ public class payRequestProcessAfterComplete extends ExecuteListener {
         if (details != null && details.size() > 0)
             for (BO detail : details) {
                 String PAYMENT_PLAN_ID = detail.getString("PAYMENT_PLAN_ID");
-                BigDecimal PLAN_AMOUNT = detail.get("PLAN_AMOUNT", BigDecimal.class);
+                BigDecimal AMOUNT = detail.get("AMOUNT", BigDecimal.class);//时间付款金额
 
                 BO paymentPlan = SDK.getBOAPI().get("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", PAYMENT_PLAN_ID);
 
                 BigDecimal PLAN_AMOUNT_OLD = paymentPlan.get("PLAN_AMOUNT", BigDecimal.class);
-                BigDecimal PAY_AMOUNT = paymentPlan.get("PAY_AMOUNT", BigDecimal.class);
+                BigDecimal PAY_AMOUNT = paymentPlan.get("PAY_AMOUNT", BigDecimal.class);//已付金额
 
-                PAY_AMOUNT = PAY_AMOUNT.add(PLAN_AMOUNT);
+                PAY_AMOUNT = PAY_AMOUNT.add(AMOUNT);
 
                 BigDecimal REMAIN_AMOUNT = PLAN_AMOUNT_OLD.subtract(PAY_AMOUNT);
                 paymentPlan.set("REMAIN_AMOUNT", REMAIN_AMOUNT);

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

@@ -132,35 +132,17 @@ public class PaymentPlanService {
                         String sql = "delete from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=? and (PAY_AMOUNT is null or PAY_AMOUNT = 0)";
                         DBSql.update(conn, sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
 
-                        List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, PURCHASE_CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
+                        //首月单独计算
+                        BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
+                        BigDecimal ratio = new BigDecimal(PERIOD_BEGIN_DATE.getDayOfMonth()).divide(new BigDecimal(PERIOD_BEGIN_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
+                        ratio=BigDecimal.ONE.subtract(ratio);
+                        UNIT_COST_1STMONTH = ratio.multiply(UNIT_COST_1STMONTH);
+                        String firstPeriodBeginDate = PERIOD_BEGIN_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 
-                        if (periods.isEmpty())
-                            continue;
-
-                        //2025年11月5日
-                    /*
-                    BigDecimal COST_TOTAL = orderProduct.get("COST_TOTAL", BigDecimal.class);//总金额
-                    BigDecimal RATE_TOTAL = periods.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
-                     */
-
-                        BigDecimal UNIT_COST_1STMONTH = BigDecimal.ZERO;
-                        String firstPeriodBeginDate = null;
-                        //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
-                        if (periods.size() > 0 && service.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
-                            PeriodCalculationUtil.Period period = periods.get(0);
-                            if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
-                                UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
-                                UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
-                                firstPeriodBeginDate = period.getPeriodBeginDateStr();
-                                //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);
+                        //下月一号
+                        LocalDate firstDayOfNextMonth = PERIOD_BEGIN_DATE.plusMonths(1).withDayOfMonth(1);
 
+                        List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, firstDayOfNextMonth, firstDayOfNextMonth, PERIOD_END_DATE, PURCHASE_CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
                         int i = 0;
                         for (PeriodCalculationUtil.Period period : periods) {
@@ -175,26 +157,13 @@ public class PaymentPlanService {
                             paymentPlan.set("PERIOD_BEGIN_DATE", period.getPeriodBeginDateStr());
                             paymentPlan.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
 
-                            //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
-                            if (i == 1 && service.get("PURCHASE_CALC_METHOD_1STPERIOD").equals("4591")) {
-                                //firstRate<1
-                                if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
-                                    if (periods.size() == 1) {
-                                        paymentPlan.set("PLAN_AMOUNT", UNIT_COST_1STMONTH);
-                                    } else {
-                                        continue;
-                                    }
-                                } else {
-                                    paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()));
-                                }
+                            //第一条周期要加上首月成本
+                            if (i == 1 && UNIT_COST_1STMONTH.compareTo(BigDecimal.ZERO) > 0) {
+                                paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()).add(UNIT_COST_1STMONTH));
+                                paymentPlan.set("PLAN_DATE", firstPeriodBeginDate);
+                                paymentPlan.set("PERIOD_BEGIN_DATE", firstPeriodBeginDate);
                             } else {
-                                if (i == 2 && UNIT_COST_1STMONTH.compareTo(BigDecimal.ZERO) > 0) {
-                                    paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()).add(UNIT_COST_1STMONTH));
-                                    paymentPlan.set("PLAN_DATE", firstPeriodBeginDate);
-                                    paymentPlan.set("PERIOD_BEGIN_DATE", firstPeriodBeginDate);
-                                } else {
-                                    paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()));
-                                }
+                                paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()));
                             }
 
                             paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PLAN_AMOUNT"));