2 Commits 3be0768700 ... 9ebdc320ac

Autor SHA1 Mensagem Data
  HULEI 9ebdc320ac Merge branch 'master' of http://210.51.45.41:3000/itcat_admin/aws_donenow 1 mês atrás
  HULEI 8344bf357a 待审批应收款格式化sql 1 mês atrás

+ 76 - 72
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractApproveController.java

@@ -2079,58 +2079,68 @@ public class contractApproveController {
             if (planIds.length == 0) {
                 return ResponseObject.newErrResponse("支付计划ID不能为空");
             }
-            String planId = planIds[0];
 
-            // 检查是否已存在
-            String checkSql = "SELECT BINDID " +
-                    "FROM BO_EU_DNIVT_PAY_REQUEST_DETAIL " +
-                    "WHERE PAYMENT_PLAN_ID = ?";
-            Map<String, Object> existingBind = DBSql.getMap(checkSql, new Object[]{planId});
-
-            if (existingBind != null) {
-                String existingBindId = existingBind.get("BINDID").toString();
-                Map<String, Object> result = new HashMap<>();
-                result.put("isCreated", false);
-                result.put("mainBindId", existingBindId);
-                result.put("message", "已创建请求单主表:bindId");
-                ResponseObject responseObject = ResponseObject.newOkResponse();
-                responseObject.setData(result);
-
-                if(DBSql.getInt("select count(1) from wfc_task where processinstid=?",new Object[]{existingBindId})==0)
-                    SDK.getProcessAPI().startById(existingBindId);
+            // -------------------------- 关键修正 --------------------------
+            // 1. 首先检查所有待创建的支付计划ID是否已存在于明细表中
+            List<String> existingPlanIds = new ArrayList<>();
+            for (String pid : planIds) {
+                String checkSql = "SELECT PAYMENT_PLAN_ID FROM BO_EU_DNIVT_PAY_REQUEST_DETAIL WHERE PAYMENT_PLAN_ID = ?";
+                Map<String, Object> existingDetail = DBSql.getMap(checkSql, new Object[]{pid});
+                if (existingDetail != null) {
+                    existingPlanIds.add(pid);
+                }
+            }
 
-                return responseObject;
+            // 如果有任何一个ID已存在,则不创建任何记录,并返回错误信息
+            if (!existingPlanIds.isEmpty()) {
+                return ResponseObject.newErrResponse("支付计划ID " + String.join(", ", existingPlanIds) + " 已存在于支付请求明细中,无法重复创建。");
             }
+            // -------------------------- 关键修正结束 --------------------------
 
-            // 新增:计算所有选中计划的PLAN_AMOUNT总和
+            // 2. 计算所有选中支付计划的总金额
             BigDecimal requestAmountTotal = BigDecimal.ZERO;
+            Map<String, Map<String, Object>> allPlanData = new HashMap<>();
+
             for (String pid : planIds) {
-                String amountSql = "SELECT PLAN_AMOUNT FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE ID = ?";
-                Map<String, Object> amountData = DBSql.getMap(amountSql, new Object[]{pid});
-                if (amountData != null && amountData.get("PLAN_AMOUNT") != null) {
-                    // 兼容不同数字类型(BigDecimal/Double等)
-                    if (amountData.get("PLAN_AMOUNT") instanceof BigDecimal) {
-                        requestAmountTotal = requestAmountTotal.add((BigDecimal) amountData.get("PLAN_AMOUNT"));
-                    } else if (amountData.get("PLAN_AMOUNT") instanceof Number) {
-                        requestAmountTotal = requestAmountTotal.add(
-                                BigDecimal.valueOf(((Number) amountData.get("PLAN_AMOUNT")).doubleValue())
-                        );
+                String querySql = "SELECT " +
+                        "PROJECT_LOCATION, PERIOD_BEGIN_DATE, PERIOD_END_DATE, LOCATION, " +
+                        "PAY_DESC, PLAN_AMOUNT, PURCHASE_ORDER_NO, REFERENCE_NUMBER, PLAN_DATE, PAY_AMOUNT, REMARK, " +
+                        "PLAN_NO, ORDER_ID, CONTRACT_SERVICE_ID, CONTRACT_COST_ID " +
+                        "FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE ID = ?";
+                Map<String, Object> planData = DBSql.getMap(querySql, new Object[]{pid});
+
+                if (planData == null) {
+                    return ResponseObject.newErrResponse("支付计划ID " + pid + " 不存在或已被删除。");
+                }
+
+                allPlanData.put(pid, planData); // 缓存查询结果,pid作为键
+
+                // 累加总金额
+                Object amountObj = planData.get("PLAN_AMOUNT");
+                if (amountObj != null) {
+                    BigDecimal amount;
+                    if (amountObj instanceof BigDecimal) {
+                        amount = (BigDecimal) amountObj;
+                    } else if (amountObj instanceof Number) {
+                        amount = BigDecimal.valueOf(((Number) amountObj).doubleValue());
+                    } else {
+                        continue;
                     }
+                    requestAmountTotal = requestAmountTotal.add(amount);
                 }
             }
 
-            String payRequestId = planId;
+            // 3. 创建支付请求单主表(Process Instance + BO)
+            String mainPayRequestId = planIds[0];
             ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance(
                     "obj_8cf0923593b7465490c4e1f73e98d4d3",
                     uc.getUID(),
-                    "支付请求单-" + payRequestId
+                    "支付请求单-" + mainPayRequestId
             );
 
-            // 创建主表时设置REQUEST_AMOUNT字段(存总和)
             BO mainPayRequestBO = new BO();
             mainPayRequestBO.setBindId(processInstance.getId());
-            mainPayRequestBO.set("REQUEST_AMOUNT", requestAmountTotal); // 关键修改:存入总和
-
+            mainPayRequestBO.set("REQUEST_AMOUNT", requestAmountTotal);
             SDK.getBOAPI().create("BO_EU_DNIVT_PAY_REQUEST", mainPayRequestBO, processInstance, uc);
             SDK.getProcessAPI().start(processInstance);
 
@@ -2138,55 +2148,49 @@ public class contractApproveController {
             String mainBindId = mainPayRequestBO.getBindId();
             List<String> detailIds = new ArrayList<>();
 
-            // 明细创建逻辑保持不变
             for (String pid : planIds) {
-                String querySql = "SELECT " +
-                        "PROJECT_LOCATION, PERIOD_BEGIN_DATE, PERIOD_END_DATE, LOCATION, " +
-                        "PAY_DESC, PLAN_AMOUNT, PURCHASE_ORDER_NO, REFERENCE_NUMBER, PLAN_DATE, PAY_AMOUNT, REMARK, " +
-                        "PLAN_NO, ORDER_ID, CONTRACT_SERVICE_ID, CONTRACT_COST_ID " +
-                        "FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN " +
-                        "WHERE ID = ?";
-                Map<String, Object> planData = DBSql.getMap(querySql, new Object[]{pid});
-
-                if (planData != null) {
-                    BO detailBO = new BO();
-                    detailBO.setBindId(mainBindId);
-                    detailBO.set("PAYMENT_PLAN_ID", pid);
-                    detailBO.set("PROJECT_LOCATION", planData.get("PROJECT_LOCATION"));
-                    detailBO.set("PERIOD_BEGIN_DATE", planData.get("PERIOD_BEGIN_DATE"));
-                    detailBO.set("PERIOD_END_DATE", planData.get("PERIOD_END_DATE"));
-                    detailBO.set("LOCATION", planData.get("LOCATION"));
-                    detailBO.set("PAY_DESC", planData.get("PAY_DESC"));
-                    detailBO.set("PLAN_AMOUNT", planData.get("PLAN_AMOUNT"));
-                    detailBO.set("PLAN_DATE", planData.get("PLAN_DATE"));
-                    detailBO.set("AMOUNT", planData.get("PLAN_AMOUNT"));
-                    detailBO.set("REMARK", planData.get("REMARK"));
-                    detailBO.set("PLAN_NO", planData.get("PLAN_NO"));
-                    detailBO.set("ORDER_ID", planData.get("ORDER_ID"));
-                    detailBO.set("CONTRACT_SERVICE_ID", planData.get("CONTRACT_SERVICE_ID"));
-                    detailBO.set("CONTRACT_COST_ID", planData.get("CONTRACT_COST_ID"));
-                    detailBO.set("ORDER_NO", planData.get("PURCHASE_ORDER_NO"));
-                    detailBO.set("EXTTEXT3", planData.get("REFERENCE_NUMBER"));
-
-                    SDK.getBOAPI().createDataBO("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detailBO, uc);
-                    detailIds.add(detailBO.getId());
-                }
-            }
-
+                Map<String, Object> planData = allPlanData.get(pid);
+
+                BO detailBO = new BO();
+                detailBO.setBindId(mainBindId);
+
+                detailBO.set("PAYMENT_PLAN_ID", pid);
+
+                detailBO.set("PROJECT_LOCATION", planData.get("PROJECT_LOCATION"));
+                detailBO.set("PERIOD_BEGIN_DATE", planData.get("PERIOD_BEGIN_DATE"));
+                detailBO.set("PERIOD_END_DATE", planData.get("PERIOD_END_DATE"));
+                detailBO.set("LOCATION", planData.get("LOCATION"));
+                detailBO.set("PAY_DESC", planData.get("PAY_DESC"));
+                detailBO.set("PLAN_AMOUNT", planData.get("PLAN_AMOUNT"));
+                detailBO.set("PLAN_DATE", planData.get("PLAN_DATE"));
+                detailBO.set("AMOUNT", planData.get("PLAN_AMOUNT"));
+                detailBO.set("REMARK", planData.get("REMARK"));
+                detailBO.set("PLAN_NO", planData.get("PLAN_NO"));
+                detailBO.set("ORDER_ID", planData.get("ORDER_ID"));
+                detailBO.set("CONTRACT_SERVICE_ID", planData.get("CONTRACT_SERVICE_ID"));
+                detailBO.set("CONTRACT_COST_ID", planData.get("CONTRACT_COST_ID"));
+                detailBO.set("ORDER_NO", planData.get("PURCHASE_ORDER_NO"));
+                detailBO.set("EXTTEXT3", planData.get("REFERENCE_NUMBER"));
+
+                SDK.getBOAPI().createDataBO("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detailBO, uc);
+                detailIds.add(detailBO.getId());
+            }
+
+            // 5. 组织并返回成功结果
             Map<String, Object> result = new HashMap<>();
             result.put("isCreated", true);
             result.put("mainRecordId", mainRecordId);
             result.put("mainBindId", mainBindId);
             result.put("detailRecordIds", detailIds);
-            result.put("requestAmountTotal", requestAmountTotal); // 新增:返回总和
-            result.put("message", "成功创建支付请求单及" + detailIds.size() + "条明细记录,请求总金额:" + requestAmountTotal);
+            result.put("requestAmountTotal", requestAmountTotal);
+            result.put("message", String.format("成功创建支付请求单及 %d 条明细记录,请求总金额:%s", detailIds.size(), requestAmountTotal));
 
             ResponseObject responseObject = ResponseObject.newOkResponse();
             responseObject.setData(result);
             return responseObject;
 
         } catch (Exception e) {
-            e.printStackTrace();
+            e.printStackTrace(); // 在生产环境中,建议使用日志框架记录异常
             return ResponseObject.newErrResponse("创建支付请求单及明细失败:" + e.getMessage());
         }
     }

+ 7 - 12
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/testForm.java

@@ -21,8 +21,7 @@ public class testForm implements DataWindowFormatSQLEventInterface {
             LOGGER.info("【初始SQL】" + sql);
             LOGGER.info("【查询参数】" + JSON.toJSONString(sqlParam));
 
-            String paramName = "SEARCH_KEY"; // 自定义参数名,需与前端保持一致
-            // 处理参数值:自动添加前后%实现模糊匹配
+            String paramName = "SEARCH_FIELD";
             if (sqlParam.containsKey(paramName)) {
                 String paramValue = sqlParam.get(paramName).toString().trim();
                 if (!paramValue.contains("%")) {
@@ -31,24 +30,21 @@ public class testForm implements DataWindowFormatSQLEventInterface {
                 }
             }
 
-            // 定义需要进行模糊匹配的目标字段列表
+            // 定义需要模糊搜索的目标字段列表
             List<String> targetFields = Arrays.asList(
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.CONTRACT_NO",
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.CUSTOMER_NAME",
+                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.ACCOUNT_NAME",
                     "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.CONTRACT_NAME",
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.REMARK",
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.EXT_FIELD1",
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.EXT_FIELD2"
-                    // 可根据实际视图字段继续补充
+                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.NO",
+                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.ITEM_SUBCATE_ID",
+                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.BILL_ACCOUNT_ID"
+                    // 补充其他要搜索的字段
             );
 
             if (sqlParam.containsKey(paramName)) {
-                // 移除原SQL中可能存在的单字段精确条件(示例,需根据实际SQL调整)
                 String oldCondition = "AND VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.SEARCH_FIELD = :" + paramName;
                 sql = sql.replace(oldCondition, "");
                 LOGGER.info("【删除旧条件后SQL】" + sql);
 
-                // 拼接多字段OR的模糊匹配条件
                 StringBuilder orConditions = new StringBuilder();
                 for (int i = 0; i < targetFields.size(); i++) {
                     String field = targetFields.get(i);
@@ -58,7 +54,6 @@ public class testForm implements DataWindowFormatSQLEventInterface {
                     }
                 }
 
-                // 将多字段OR条件追加到SQL中
                 sql = sql + " AND (" + orConditions + ")";
             }