Ver código fonte

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

HULEI 1 semana atrás
pai
commit
cc7bc4d807

+ 21 - 7
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/PeriodCalculationUtil.java

@@ -29,7 +29,7 @@ public class PeriodCalculationUtil {
     public static final String PERIOD_TYPE_HALFYEAR = "612"; // 按半年支付
     public static final String PERIOD_TYPE_YEAR = "613";       // 按年支付
 
-    public static final String PERIOD_TYPE_TWOYEAR = "614";       // 按2年支付
+    public static final String PERIOD_TYPE_TWOYEAR = "10614";       // 按2年支付
 
     // 日期格式化器(复用避免重复创建)
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -65,7 +65,7 @@ public class PeriodCalculationUtil {
      * 613	按年支付	4592	开通日期后的完整一年 isNaturalMonth=false CALC_METHOD_1STYEAR=4637 userMonthDay=false 或者 CALC_METHOD_1STYEAR=4638 userMonthDay=true monthDayType=0 startMonth=0
      *
      *
-     * 614 按两年付  4603/4604/4605
+     * 614 按两年付  14603/14604/14605
      *
      *CALC_METHOD_1STYEAR
      * 4637	(拆机时实际计费天数/当年天数(如365))*年费用
@@ -120,7 +120,7 @@ public class PeriodCalculationUtil {
             case "4596":
             case "4593":
             case "4590":
-            case "4603":
+            case "14603":
                 monthDayType = -1;
                 break;
 
@@ -128,7 +128,7 @@ public class PeriodCalculationUtil {
             case "4597":
             case "4594":
             case "4591":
-            case "4604":
+            case "14604":
                 monthDayType = -2;
                 break;
         }
@@ -275,11 +275,11 @@ public class PeriodCalculationUtil {
 
             case PERIOD_TYPE_TWOYEAR://2年
                 if (isNaturalMonth) {
-                    currLastDay = getNaturalYearLastDay(periodBeginDate);
-                    totalPeriodDays = periodBeginDate.lengthOfYear();
+                    currLastDay = getNaturalTwoYearLastDay(periodBeginDate);
+                    totalPeriodDays = periodBeginDate.lengthOfYear()+currLastDay.lengthOfYear();
                 } else {
                     currLastDay = getActualTWOYearFirstEndDay(contractStartDate, periodBeginDate, periodEndDate);
-                    totalPeriodDays = getActualYearTotalDays(contractStartDate, periodBeginDate);
+                    totalPeriodDays = getActualTwoYearTotalDays(contractStartDate, periodBeginDate);
                 }
                 break;
             default:
@@ -548,6 +548,12 @@ public class PeriodCalculationUtil {
                 : periodBeginDate.plusYears(1).minusDays(1);
     }
 
+    private static LocalDate getNaturalTwoYearLastDay(LocalDate periodBeginDate) {
+        return (periodBeginDate.getDayOfMonth() != 1 || periodBeginDate.getMonthValue() != 1)
+                ? LocalDate.of(periodBeginDate.getYear()+1, 12, 31)
+                : periodBeginDate.plusYears(2).minusDays(1);
+    }
+
     // ------------------------------ 私有工具方法:实际月模式计算 ------------------------------
 
     /**
@@ -716,6 +722,14 @@ public class PeriodCalculationUtil {
         }
     }
 
+    private static int getActualTwoYearTotalDays(LocalDate contractStartDate, LocalDate periodBeginDate) {
+        if (contractStartDate.isAfter(periodBeginDate)) {
+            return getPeriodDays(contractStartDate.minusMonths(24), contractStartDate.minusDays(1));
+        } else {
+            return getPeriodDays(contractStartDate, contractStartDate.plusMonths(24).minusDays(1));
+        }
+    }
+
     // ------------------------------ 私有工具方法:通用计算 ------------------------------
 
     /**

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

@@ -793,9 +793,9 @@ public class contractServiceAdj {
 
             //生效日期之后的服务周期删除
             if (PERIOD_TYPE.equals("609")) {
-                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? ", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? AND IS_END=0 ", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
             } else {
-                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE >=? and (PAY_AMOUNT=0 or PAY_AMOUNT is NULL)", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
+                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE >=? and (PAY_AMOUNT=0 or PAY_AMOUNT is NULL) AND IS_END=0 ", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
             }
 
             String lastPeriodId = DBSql.getString(conn, "select ID from " + boName + " where CONTRACT_SERVICE_ID=? and PERIOD_END_DATE >=? order by PERIOD_BEGIN_DATE asc", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});

+ 31 - 9
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -626,8 +626,7 @@ public class ivtOrderController {
         sql = sql.substring(0, sql.length() - 1) + ")";
         List<RowMap> costList = DBSql.getMaps(sql, Arrays.stream(serviceArr).toArray());
 
-        if (costList.isEmpty())
-            return ResponseObject.newErrResponse("没有找到对应的合同产品");
+        if (costList.isEmpty()) return ResponseObject.newErrResponse("没有找到对应的合同产品");
 
 
         String costIds = costList.stream().map(cost -> cost.getString("ID")).collect(Collectors.joining(","));
@@ -685,8 +684,7 @@ public class ivtOrderController {
         for (RowMap service : services) {
 
             String orderId = service.getString("ORDER_ID");
-
-            PaymentPlanService.getInstance().createPaymentPlan(uc, orderId);
+            PaymentPlanService.getInstance().createPaymentPlan(uc, orderId, null);
 
         }
 
@@ -1011,6 +1009,32 @@ public class ivtOrderController {
         return ResponseObject.newOkResponse();
     }
 
+    /**
+     * 根据服务ID重新生成采购计划
+     * @param uc
+     * @param serviceId
+     * @return
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.ivt_createPaymentPlanByServiceId")
+    public ResponseObject createPaymentPlanByServiceId(UserContext uc, String serviceId) {
+
+        if (StringUtils.isBlank(serviceId)) return ResponseObject.newErrResponse("服务ID不能为空");
+
+        String orderId = DBSql.getString("select ORDER_ID from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_SERVICE_ID=?", new Object[]{serviceId});
+        if (StringUtils.isBlank(orderId)) return ResponseObject.newErrResponse("请创建采购订单!");
+
+        if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ?  and CONTRACT_SERVICE_ID=?  AND PAY_AMOUNT is NOT null AND PAY_AMOUNT<>0", new Object[]{orderId, serviceId}) > 0) {
+            return ResponseObject.newErrResponse("付款计划已经开始付款,不能重新生成");
+        }
+
+        if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ?  and CONTRACT_SERVICE_ID=?  ", new Object[]{orderId, serviceId}) == 0) {
+            return ResponseObject.newErrResponse("请创建采购订单!");
+        }
+
+        PaymentPlanService.getInstance().createPaymentPlan(uc, orderId, serviceId);
+
+        return ResponseObject.newOkResponse();
+    }
 
     /**
      * 创建付款计划
@@ -1074,7 +1098,7 @@ public class ivtOrderController {
             }
         }
 
-        PaymentPlanService.getInstance().createPaymentPlan(uc, orderId);
+        PaymentPlanService.getInstance().createPaymentPlan(uc, orderId, null);
 
         //检查 是否创建成功
         if (DBSql.getInt("select count(1) CNT from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID=?", new Object[]{orderId}) == 0)
@@ -1132,8 +1156,7 @@ public class ivtOrderController {
 
         List<RowMap> list = DBSql.getMaps("select * from BO_EU_DNIVT_PAY_REQUEST_DETAIL where BINDID=?", new Object[]{requestBindidId});
 
-        if (list.isEmpty())
-            return ResponseObject.newOkResponse();
+        if (list.isEmpty()) return ResponseObject.newOkResponse();
 
         for (RowMap detail : list) {
             String PAYMENT_PLAN_ID = detail.getString("PAYMENT_PLAN_ID");
@@ -1188,8 +1211,7 @@ public class ivtOrderController {
      */
     @Mapping("com.awspaas.user.apps.donenow_ivt.ivt_reactivate_pu")
     public ResponseObject reactivate_pu(UserContext uc, String bindId) {
-        if (StringUtils.isBlank(bindId))
-            return ResponseObject.newErrResponse("参数错误");
+        if (StringUtils.isBlank(bindId)) return ResponseObject.newErrResponse("参数错误");
         if (SDK.getProcessAPI().isEndById(bindId)) {
 
             //未进行 过接收才能 复活

+ 1 - 2
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -157,8 +157,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
 
 /*****************************************2025年10月24日  张耀 生成付款计划********************************************/
         logger.info("生成付款计划");
-
-        PaymentPlanService.getInstance().createPaymentPlan(uc, orderId);
+        PaymentPlanService.getInstance().createPaymentPlan(uc, orderId,null);
 
 
     }

+ 17 - 9
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -54,10 +54,18 @@ public class PaymentPlanService {
      * 创建付款计划
      * @param uc
      * @param orderId
+     * @param serviceId
      */
-    public void createPaymentPlan(UserContext uc, String orderId) {
+    public void createPaymentPlan(UserContext uc, String orderId, String serviceId) {
         BO purchaseOrder = SDK.getBOAPI().get("BO_EU_DNIVT_ORDER", orderId);
-        List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").bindId(purchaseOrder.getBindId()).list();
+        List<BO> orderProducts = null;
+
+        if (StringUtils.isNotBlank(serviceId)) {
+            orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").bindId(purchaseOrder.getBindId()).addQuery("CONTRACT_SERVICE_ID=", serviceId).list();
+        } else {
+            orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").bindId(purchaseOrder.getBindId()).list();
+        }
+
         String VENDOR_ACCOUNT_ID = purchaseOrder.getString("VENDOR_ACCOUNT_ID");//供应商账户ID
         List<String> serviceIds = new ArrayList<>();
         Connection conn = null;
@@ -85,9 +93,9 @@ public class PaymentPlanService {
                 }
             }
 
-            if (isOnlyOne) {
+            if (isOnlyOne && StringUtils.isBlank(serviceId)) {
                 total += 1;
-                String sql = "delete from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and (PAY_AMOUNT is null or PAY_AMOUNT = 0)";
+                String sql = "delete from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and (PAY_AMOUNT is null or PAY_AMOUNT = 0) AND IS_END=0 ";
                 DBSql.update(conn, sql, new Object[]{orderId});
                 //全部采购项 合并生成一条采购计划
                 ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
@@ -170,7 +178,7 @@ public class PaymentPlanService {
 
         if (RULE_CATE.equals("609")) {   //一次性付费
 
-            String sql = "delete from " + boName + " where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=? and (PAY_AMOUNT is null or PAY_AMOUNT = 0)";
+            String sql = "delete from " + boName + " where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=? and (PAY_AMOUNT is null or PAY_AMOUNT = 0) AND IS_END=0 ";
             DBSql.update(conn, sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
 
             BO paymentPlan = new BO();
@@ -206,14 +214,14 @@ public class PaymentPlanService {
         LocalDate START_DATE = PERIOD_BEGIN_DATE;
         LocalDate PERIOD_END_DATE = service.get("PURCHASE_END_DATE", LocalDate.class);//新增采购结束时间
 
-        LocalDate YS_EFFECTIVE_DATE=PERIOD_BEGIN_DATE;
-        LocalDate YS_END_DATE=PERIOD_END_DATE;
+        LocalDate YS_EFFECTIVE_DATE = PERIOD_BEGIN_DATE;
+        LocalDate YS_END_DATE = PERIOD_END_DATE;
 
         String PURCHASE_CALC_METHOD_1STPERIOD = service.getString("PURCHASE_CALC_METHOD_1STPERIOD");
 
         if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
 
-        }else{
+        } else {
             //固定价格,按照整个月计算
             if (service.getString("FIXED_PRICE").equals("1")) {
                 PERIOD_BEGIN_DATE = (PERIOD_BEGIN_DATE.withDayOfMonth(1)); //当月1号
@@ -405,7 +413,7 @@ public class PaymentPlanService {
             for (RowMap payPlan : payPlanList) {
                 LocalDate PAY_PERIOD_BEGIN_DATE = TypeUtil.convert(payPlan.get("PERIOD_BEGIN_DATE"), LocalDate.class);
 
-              //  SDK.getLogAPI().consoleInfo("PAY_PERIOD_BEGIN_DATE:" + PAY_PERIOD_BEGIN_DATE.toString());
+                //  SDK.getLogAPI().consoleInfo("PAY_PERIOD_BEGIN_DATE:" + PAY_PERIOD_BEGIN_DATE.toString());
 
                 // 跳过已处理过的付款计划(通过上一个周期末日期+1判断)
                 if (LAST_DATE != null && PAY_PERIOD_BEGIN_DATE.isBefore(LAST_DATE)) {

+ 23 - 8
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/utils/PeriodCalculationUtil.java

@@ -1,5 +1,4 @@
 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;
@@ -29,7 +28,7 @@ public class PeriodCalculationUtil {
     public static final String PERIOD_TYPE_HALFYEAR = "612"; // 按半年支付
     public static final String PERIOD_TYPE_YEAR = "613";       // 按年支付
 
-    public static final String PERIOD_TYPE_TWOYEAR = "614";       // 按2年支付
+    public static final String PERIOD_TYPE_TWOYEAR = "10614";       // 按2年支付
 
     // 日期格式化器(复用避免重复创建)
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -65,7 +64,7 @@ public class PeriodCalculationUtil {
      * 613	按年支付	4592	开通日期后的完整一年 isNaturalMonth=false CALC_METHOD_1STYEAR=4637 userMonthDay=false 或者 CALC_METHOD_1STYEAR=4638 userMonthDay=true monthDayType=0 startMonth=0
      *
      *
-     * 614 按两年付  4603/4604/4605
+     * 614 按两年付  14603/14604/14605
      *
      *CALC_METHOD_1STYEAR
      * 4637	(拆机时实际计费天数/当年天数(如365))*年费用
@@ -120,7 +119,7 @@ public class PeriodCalculationUtil {
             case "4596":
             case "4593":
             case "4590":
-            case "4603":
+            case "14603":
                 monthDayType = -1;
                 break;
 
@@ -128,7 +127,7 @@ public class PeriodCalculationUtil {
             case "4597":
             case "4594":
             case "4591":
-            case "4604":
+            case "14604":
                 monthDayType = -2;
                 break;
         }
@@ -275,11 +274,11 @@ public class PeriodCalculationUtil {
 
             case PERIOD_TYPE_TWOYEAR://2年
                 if (isNaturalMonth) {
-                    currLastDay = getNaturalYearLastDay(periodBeginDate);
-                    totalPeriodDays = periodBeginDate.lengthOfYear();
+                    currLastDay = getNaturalTwoYearLastDay(periodBeginDate);
+                    totalPeriodDays = periodBeginDate.lengthOfYear()+currLastDay.lengthOfYear();
                 } else {
                     currLastDay = getActualTWOYearFirstEndDay(contractStartDate, periodBeginDate, periodEndDate);
-                    totalPeriodDays = getActualYearTotalDays(contractStartDate, periodBeginDate);
+                    totalPeriodDays = getActualTwoYearTotalDays(contractStartDate, periodBeginDate);
                 }
                 break;
             default:
@@ -288,8 +287,10 @@ public class PeriodCalculationUtil {
 
         // 3.2 处理首个周期
         if (currLastDay != null) {
+
             if(currLastDay.isAfter(periodEndDate))
                 currLastDay=periodEndDate;
+
             if (userMonthDay) {
                 Period period = new Period();
                 period.setPeriodBeginDate(periodBeginDate);
@@ -546,6 +547,12 @@ public class PeriodCalculationUtil {
                 : periodBeginDate.plusYears(1).minusDays(1);
     }
 
+    private static LocalDate getNaturalTwoYearLastDay(LocalDate periodBeginDate) {
+        return (periodBeginDate.getDayOfMonth() != 1 || periodBeginDate.getMonthValue() != 1)
+                ? LocalDate.of(periodBeginDate.getYear()+1, 12, 31)
+                : periodBeginDate.plusYears(2).minusDays(1);
+    }
+
     // ------------------------------ 私有工具方法:实际月模式计算 ------------------------------
 
     /**
@@ -714,6 +721,14 @@ public class PeriodCalculationUtil {
         }
     }
 
+    private static int getActualTwoYearTotalDays(LocalDate contractStartDate, LocalDate periodBeginDate) {
+        if (contractStartDate.isAfter(periodBeginDate)) {
+            return getPeriodDays(contractStartDate.minusMonths(24), contractStartDate.minusDays(1));
+        } else {
+            return getPeriodDays(contractStartDate, contractStartDate.plusMonths(24).minusDays(1));
+        }
+    }
+
     // ------------------------------ 私有工具方法:通用计算 ------------------------------
 
     /**