zhangyao 2 hónapja
szülő
commit
9be530b3c0

+ 18 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -609,7 +609,7 @@ public class ivtOrderController {
     @Mapping(value = "com.awspaas.user.apps.donenow_ivt.createPurchaseOrderByServiceId")
     public ResponseObject createPurchaseOrderByServiceId(UserContext uc, String serviceIds) throws SQLException {
         String[] serviceArr = serviceIds.split(",");
-        String sql = "SELECT ID FROM BO_EU_DNCTT_CONTRACT_COST WHERE SERVICE_ID IN(";
+        String sql = "SELECT ID,STATUS_ID FROM BO_EU_DNCTT_CONTRACT_COST WHERE SERVICE_ID IN(";
         for (int i = 0; i < serviceArr.length; i++) {
             sql += "?,";
         }
@@ -653,6 +653,23 @@ public class ivtOrderController {
 
             for (RowMap cost : costList) {
                 String account_id = cost.getString("ACCOUNT_ID");
+
+                String status_id = cost.getString("STATUS_ID");
+
+                /*待采购/待拣货*/
+                if (StringUtils.isNotBlank(status_id) && !"1234".equals(status_id)) {
+                    continue;
+                }
+
+                List<String> bindids = DBSql.getList("select BINDID from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=? or CONTRACT_SERVICE_ID=?", String.class, new Object[]{cost.getString("ID"), cost.getString("SERVICE_ID")});
+                if (!bindids.isEmpty()) {
+                    for (String bindid : bindids) {
+                        if (!SDK.getProcessAPI().isEndById(bindid)) {
+                            return ResponseObject.newErrResponse("有订单正在处理中,请勿重复提交");
+                        }
+                    }
+                }
+
                 if (StringUtils.isNotBlank(account_id)) {
                     PURCHASE_ACCOUNT_ID.add(account_id);
                 } else {

+ 44 - 61
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -93,7 +93,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                 }
 
                 //更新采购订单号
-                String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{cost.getString("ID")});
+                String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ISEND=1 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{cost.getString("ID")});
                 DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_COST SET PURCHASE_ORDER_NO=? WHERE ID=?", new Object[]{PURCHASE_ORDER_NO, cost.getString("ID")});
 
             }
@@ -111,6 +111,12 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                 String SERVICE_ID = DBSql.getString("select SERVICE_ID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{orderProduct.getString("CONTRACT_COST_ID")});
                 if (StringUtils.isNotBlank(SERVICE_ID)) {
 
+                    if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=?  AND PAY_AMOUNT is NOT null AND PAY_AMOUNT<>0", new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID}) > 0) {
+                        continue;
+                    }
+                    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(sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
+
                     logger.info("生成付款计划SERVICE_ID--" + SERVICE_ID);
 
                     BO service = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", SERVICE_ID);
@@ -124,42 +130,40 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
 
                     String RULE_CATE = service.getString("PURCHASE_PERIOD_TYPE");//采购周期
                     LocalDate PERIOD_BEGIN_DATE = service.get("EFFECTIVE_DATE", LocalDate.class);
-                    LocalDate START_DATE = TypeUtil.convert(DBSql.getString("select START_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}), LocalDate.class);
-                    LocalDate PERIOD_END_DATE = TypeUtil.convert(DBSql.getString("select END_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}), LocalDate.class);
+
+                    LocalDate START_DATE = TypeUtil.convert(DBSql.getString("select START_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
+
+                    LocalDate PERIOD_END_DATE = TypeUtil.convert(DBSql.getString("select END_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
 
                     List<PERIOD> periods = getPeriodList(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601"));
 
                     if (periods.isEmpty())
                         continue;
 
-                    BigDecimal COST_TOTAL = service.get("COST_TOTAL", BigDecimal.class);//总金额
+                    BigDecimal COST_TOTAL = orderProduct.get("COST_TOTAL", BigDecimal.class);//总金额
 
                     BigDecimal RATE_TOTAL = periods.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-                    if (RATE_TOTAL.equals(BigDecimal.ZERO))
+                    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);
                     for (PERIOD period : periods) {
                         total++;
-                        ProcessInstance processInstance = SDK.getProcessAPI()
-                                .createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d",
-                                        uc.getUID(),
-                                        "付款计划");
+                        ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
 
                         BO paymentPlan = new BO();
                         paymentPlan.setBindId(processInstance.getId());
                         paymentPlan.set("ORDER_ID", orderId);
                         paymentPlan.set("PLAN_DATE", period.getPeriodBeginDateStr());
-                        paymentPlan.set("PAY_AMOUNT", UNIT_COST.multiply(period.getRate()));
-                        paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PAY_AMOUNT"));
+                        paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()));
+                        paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PLAN_AMOUNT"));
                         paymentPlan.set("CONTRACT_COST_ID", orderProduct.getString("CONTRACT_COST_ID"));
                         paymentPlan.set("CONTRACT_SERVICE_ID", service.getId());
                         SDK.getBOAPI().create("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", paymentPlan, processInstance, uc);
 
-                        System.out.println("==== 创建付款计划:" + paymentPlan.get("PLAN_DATE") + ",金额:" + paymentPlan.get("PAY_AMOUNT") + " ====");
+                        System.out.println("==== 创建付款计划:" + paymentPlan.get("PLAN_DATE") + ",金额:" + paymentPlan.get("PLAN_AMOUNT") + " ====");
                     }
-
                 }
             }
         }
@@ -181,11 +185,10 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             System.out.println("==== 订单类型判断:" + (isServiceOrder ? "服务类" : "非服务类") + ",服务类计划数量:" + servicePlanData.size() + " ====");
 
             List<Map<String, Object>> payAmounts = queryPayAmount(uc, orderId);
-            boolean hasValidPayment = payAmounts.stream()
-                    .anyMatch(amountMap -> {
-                        Double amount = (Double) amountMap.get("实际付款金额");
-                        return amount != null && amount > 0;
-                    });
+            boolean hasValidPayment = payAmounts.stream().anyMatch(amountMap -> {
+                Double amount = (Double) amountMap.get("实际付款金额");
+                return amount != null && amount > 0;
+            });
             System.out.println("==== 有效付款检查结果:" + (hasValidPayment ? "存在有效付款" : "无有效付款") + " ====");
 
             if (hasValidPayment) {
@@ -240,15 +243,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             return Collections.emptyList();
         }
 
-        String mainSql = "SELECT " +
-                "a.order_id 采购订单id, " +
-                "a.CONTRACT_SERVICE_ID 合同服务ID, " +
-                "b.PERIOD_END_DATE 计划付款时间, " +
-                "b.PERIOD_COST 计划付款金额 " +
-                "FROM `BO_EU_DNIVT_ORDER_PRODUCT` a " +
-                "JOIN `BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD` b " +
-                "ON a.CONTRACT_SERVICE_ID = b.CONTRACT_SERVICE_ID " +
-                "WHERE a.ORDER_ID = ?";
+        String mainSql = "SELECT " + "a.order_id 采购订单id, " + "a.CONTRACT_SERVICE_ID 合同服务ID, " + "b.PERIOD_END_DATE 计划付款时间, " + "b.PERIOD_COST 计划付款金额 " + "FROM `BO_EU_DNIVT_ORDER_PRODUCT` a " + "JOIN `BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD` b " + "ON a.CONTRACT_SERVICE_ID = b.CONTRACT_SERVICE_ID " + "WHERE a.ORDER_ID = ?";
         List<RowMap> mainRowMaps = DBSql.getMaps(mainSql, new Object[]{orderId});
 
         List<Map<String, Object>> resultList = new ArrayList<>();
@@ -266,11 +261,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                 if (StringUtils.isNotBlank(contractServiceId) && !processedServiceIds.contains(contractServiceId)) {
                     processedServiceIds.add(contractServiceId);
 
-                    String adjustSql = "SELECT " +
-                            "effective_date 计划付款时间, " +
-                            "prorated_cost_change 计划付款金额 " +
-                            "FROM `BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST` " +
-                            "WHERE CAST(CONTRACT_SERVICE_ID AS CHAR) = ?";
+                    String adjustSql = "SELECT " + "effective_date 计划付款时间, " + "prorated_cost_change 计划付款金额 " + "FROM `BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST` " + "WHERE CAST(CONTRACT_SERVICE_ID AS CHAR) = ?";
                     List<RowMap> adjustRowMaps = DBSql.getMaps(adjustSql, new Object[]{contractServiceId});
 
                     if (adjustRowMaps != null && !adjustRowMaps.isEmpty()) {
@@ -293,11 +284,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             return Collections.emptyList();
         }
 
-        String sql = "select " +
-                "ORDER_ID 采购订单id, " +
-                "PAY_AMOUNT 实际付款金额 " +
-                "from `BO_EU_DNIVT_ORDER_PAYMENT_PLAN` " +
-                "where ORDER_ID = ?";
+        String sql = "select " + "ORDER_ID 采购订单id, " + "PAY_AMOUNT 实际付款金额 " + "from `BO_EU_DNIVT_ORDER_PAYMENT_PLAN` " + "where ORDER_ID = ?";
         List<RowMap> rowMaps = DBSql.getMaps(sql, new Object[]{orderId});
 
         List<Map<String, Object>> resultList = new ArrayList<>();
@@ -318,9 +305,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             return 0;
         }
 
-        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)";
         return DBSql.update(sql, new Object[]{orderId});
     }
 
@@ -341,10 +326,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
         System.out.println("==== 查询订单表成功,VENDOR_ACCOUNT_ID=" + vendorAccountId + " ====");
 
         // 3. 原有流程实例创建(保持不变)
-        ProcessInstance processInstance = SDK.getProcessAPI()
-                .createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d",
-                        uc.getUID(),
-                        "付款计划");
+        ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
         System.out.println("==== 付款计划流程实例创建成功,bindId=" + processInstance.getId() + " ====");
 
         // 4. 构建BO对象(新增:设置ACCOUNT_PAYEE=查询到的VENDOR_ACCOUNT_ID)
@@ -367,9 +349,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             return null;
         }
 
-        String sql = "select EXPECTED_SHIP_DATE " +
-                "from `BO_EU_DNIVT_ORDER` " +
-                "where id = ? ";
+        String sql = "select EXPECTED_SHIP_DATE " + "from `BO_EU_DNIVT_ORDER` " + "where id = ? ";
         String expectedShipDate = DBSql.getString(sql, new Object[]{orderId});
 
         if (StringUtils.isBlank(expectedShipDate)) {
@@ -390,9 +370,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
         }
 
         // SQL查询:求和 cost_total 字段(数据库字段正确,无需修改)
-        String sql = "select sum(`cost_total`) " +
-                "from `BO_EU_DNIVT_ORDER_PRODUCT` " +
-                "where order_id = ? ";
+        String sql = "select sum(`cost_total`) " + "from `BO_EU_DNIVT_ORDER_PRODUCT` " + "where order_id = ? ";
         String totalCostStr = DBSql.getString(sql, new Object[]{orderId});
 
         // 空值处理:查询结果为空返回null(与日期方法风格一致)
@@ -428,9 +406,17 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
      * @return
      */
     private List<PERIOD> getPeriodList(String RULE_CATE, LocalDate CONTRACT_START_DATE, LocalDate PERIOD_BEGIN_DATE, LocalDate PERIOD_END_DATE, boolean isNaturalMonth) {
+
+        logger.info("获取周期列表");
+        logger.info("RULE_CATE:" + RULE_CATE);
+        logger.info("CONTRACT_START_DATE:" + CONTRACT_START_DATE);
+        logger.info("PERIOD_BEGIN_DATE:" + PERIOD_BEGIN_DATE);
+        logger.info("PERIOD_END_DATE:" + PERIOD_END_DATE);
+        logger.info("isNaturalMonth:" + isNaturalMonth);
+
         List<PERIOD> periodList = new ArrayList<>();
         //一次性收费
-        if (RULE_CATE.equals(IVTConstant.PERIOD_TYPE_MONTH)) {
+        if (RULE_CATE.equals(IVTConstant.PERIOD_TYPE_ONE_TIME)) {
             PERIOD period = new PERIOD();
             period.setPeriodBeginDate(PERIOD_BEGIN_DATE);
             period.setPeriodEndDate(PERIOD_END_DATE);
@@ -513,11 +499,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                         // 若不是半年第一天,计算本半年剩余天数作为首个周期
                         if (PERIOD_BEGIN_DATE.getDayOfMonth() != 1 || (PERIOD_BEGIN_DATE.getMonthValue() - 1) % 6 != 0) {
                             Month endMonth = getHalfYearEndMonth(PERIOD_BEGIN_DATE.getMonth());
-                            currLastDay = LocalDate.of(
-                                    PERIOD_BEGIN_DATE.getYear(),
-                                    endMonth,
-                                    endMonth.length(PERIOD_BEGIN_DATE.isLeapYear())
-                            );
+                            currLastDay = LocalDate.of(PERIOD_BEGIN_DATE.getYear(), endMonth, endMonth.length(PERIOD_BEGIN_DATE.isLeapYear()));
                             periodDays = getDaysInCurrentHalfYear(PERIOD_BEGIN_DATE);
                         }
                     } else {
@@ -581,6 +563,8 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                     return null;
                 }
             }
+            logger.info("currLastDay:" + currLastDay);
+            logger.info("periodDays:" + periodDays);
 
             if (currLastDay != null) {
                 if (currLastDay.isBefore(PERIOD_END_DATE)) {
@@ -607,6 +591,9 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
             } else {
                 START_DATE = PERIOD_BEGIN_DATE;
             }
+
+            logger.info("START_DATE:" + START_DATE);
+
             //循环
             if (START_DATE != null && START_DATE.isBefore(PERIOD_END_DATE)) {
 
@@ -740,11 +727,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
         Month endMonth = getHalfYearEndMonth(currentMonth);
 
         LocalDate halfYearStart = LocalDate.of(date.getYear(), startMonth, 1);
-        LocalDate halfYearEnd = LocalDate.of(
-                date.getYear(),
-                endMonth,
-                endMonth.length(date.isLeapYear())
-        );
+        LocalDate halfYearEnd = LocalDate.of(date.getYear(), endMonth, endMonth.length(date.isLeapYear()));
 
         return GetPeriodDays(halfYearStart, halfYearEnd);
     }