Răsfoiți Sursa

待审批应收款模糊查询

HULEI 2 săptămâni în urmă
părinte
comite
3cb539a396

BIN
com.awspaas.user.apps.donenow_ctt/com.awspaas.user.apps.donenow_ctt.jar


+ 86 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/postedForm.java

@@ -0,0 +1,86 @@
+package com.awspaas.user.apps.donenow_ctt.event;
+
+import com.actionsoft.bpms.dw.design.event.DataWindowFormatSQLEventInterface;
+import com.actionsoft.bpms.dw.exec.component.DataView;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.sdk.local.SDK;
+import com.actionsoft.sdk.local.api.Logger;
+import com.alibaba.fastjson.JSON;
+
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * 已过账服务数据窗口SQL格式化类
+ * 功能:处理SEARCH_FIELD多字段模糊查询,自动补全通配符,彻底清理原单字段查询条件
+ */
+public class postedForm implements DataWindowFormatSQLEventInterface {
+    // 日志实例(修正类名驼峰命名)
+    private static final Logger LOGGER = SDK.getLogAPI().getLogger(postedForm.class);
+    // 统一表名常量
+    private static final String TABLE_NAME = "VIEW_EU_DNV_POSTED_SERIVE";
+    // 查询参数名常量
+    private static final String SEARCH_PARAM_NAME = "SEARCH_FIELD";
+    // 正则匹配原SEARCH_FIELD相关条件(兼容等值/模糊、大小写、多空格)
+    private static final Pattern OLD_CONDITION_PATTERN = Pattern.compile(
+            "AND\\s+UPPER?\\(?\\s*" + TABLE_NAME + "\\.SEARCH_FIELD\\s*\\)?\\s+(=|like|LIKE)\\s+:" + SEARCH_PARAM_NAME,
+            Pattern.CASE_INSENSITIVE
+    );
+
+    @Override
+    public String formatSQL(UserContext userContext, DataView dataView, String sql) {
+        try {
+            Map<String, Object> sqlParam = dataView.getDatagrid().getSqlParams();
+            LOGGER.info("【初始SQL】" + sql);
+            LOGGER.info("【查询参数】" + JSON.toJSONString(sqlParam));
+
+            // 初始化基础条件
+            String sql1 = " 1=1 ";
+
+            // 处理SEARCH_FIELD(多字段OR模糊查询)
+            if (sqlParam.containsKey(SEARCH_PARAM_NAME)) {
+                Object searchObj = sqlParam.get(SEARCH_PARAM_NAME);
+                if (searchObj != null) {
+                    String searchValue = searchObj.toString().trim();
+                    if (!searchValue.isEmpty()) {
+                        // 1. 自动补全%通配符 + 转义单引号
+                        if (!searchValue.contains("%")) {
+                            searchValue = "%" + searchValue + "%";
+                        }
+                        searchValue = searchValue.replace("'", "''");
+                        sqlParam.put(SEARCH_PARAM_NAME, searchValue);
+                        LOGGER.info("【处理后SEARCH_FIELD参数】" + searchValue);
+
+                        // 2. 拼接多字段OR模糊查询条件
+                        sql1 += " AND (" +
+                                TABLE_NAME + ".POSTED_DATE LIKE :" + SEARCH_PARAM_NAME + " OR " +
+                                TABLE_NAME + ".CONTRACT_NAME LIKE :" + SEARCH_PARAM_NAME + " OR " +
+                                TABLE_NAME + ".CONTRACT_NO LIKE :" + SEARCH_PARAM_NAME + " OR " +
+                                TABLE_NAME + ".ITEM_TYPE LIKE :" + SEARCH_PARAM_NAME + " OR " +
+                                TABLE_NAME + ".BILL_ACCOUNT_ID LIKE :" + SEARCH_PARAM_NAME + ") ";
+
+                        // 3. 彻底删除原SQL中所有SEARCH_FIELD相关条件(解决残留问题)
+                        sql = OLD_CONDITION_PATTERN.matcher(sql).replaceAll("");
+                        LOGGER.info("【删除所有旧条件后SQL】" + sql);
+                    }
+                }
+            }
+
+            // 替换占位符(清理多余空格)+ 修正表名
+            sql = sql.replace("1=1", sql1)
+                    // 清理拼接后可能出现的多余空格(如AND  AND)
+                    .replaceAll("AND\\s+AND", "AND")
+                    // 兼容旧表名替换(若有)
+                    .replace("VIEW_EU_dnv_PENDING_RECURRING_CONTRACT", TABLE_NAME);
+
+            // 最终SQL日志
+            LOGGER.info("【拼接后最终SQL】" + sql);
+
+        } catch (Exception e) {
+            LOGGER.error("SQL拼接失败", e);
+            e.printStackTrace();
+        }
+
+        return sql;
+    }
+}

+ 34 - 33
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/testForm.java

@@ -7,12 +7,12 @@ import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
 import com.alibaba.fastjson.JSON;
 
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
 
 public class testForm implements DataWindowFormatSQLEventInterface {
     private static final Logger LOGGER = SDK.getLogAPI().getLogger(testForm.class);
+    // 统一表名(全大写,和FROM中的表名一致)
+    private static final String TABLE_NAME = "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT";
 
     @Override
     public String formatSQL(UserContext userContext, DataView dataView, String sql) {
@@ -21,46 +21,47 @@ public class testForm implements DataWindowFormatSQLEventInterface {
             LOGGER.info("【初始SQL】" + sql);
             LOGGER.info("【查询参数】" + JSON.toJSONString(sqlParam));
 
-            String paramName = "SEARCH_FIELD";
-            if (sqlParam.containsKey(paramName)) {
-                String paramValue = sqlParam.get(paramName).toString().trim();
-                if (!paramValue.contains("%")) {
-                    sqlParam.put(paramName, "%" + paramValue + "%");
-                    LOGGER.info("【处理后参数】" + JSON.toJSONString(sqlParam));
+            // 1. 初始化条件
+            String sql1 = " 1=1 ";
+
+                // 2. 处理ITEM_MONTH
+            if (sqlParam.containsKey("ITEM_MONTH")) {
+                String itemMonth = sqlParam.get("ITEM_MONTH").toString().trim();
+                if (!itemMonth.isEmpty()) {
+                    sql1 += " AND " + TABLE_NAME + ".ITEM_MONTH LIKE :ITEM_MONTH ";
+                    sql = sql.replace("AND UPPER(" + TABLE_NAME + ".ITEM_MONTH) like :ITEM_MONTH", "");
                 }
             }
 
-            // 定义需要模糊搜索的目标字段列表
-            List<String> targetFields = Arrays.asList(
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.ACCOUNT_NAME",
-                    "VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.CONTRACT_NAME",
-                    "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)) {
-                String oldCondition = "AND VIEW_EU_DNV_PENDING_RECURRING_CONTRACT.SEARCH_FIELD = :" + paramName;
-                sql = sql.replace(oldCondition, "");
-                LOGGER.info("【删除旧条件后SQL】" + sql);
-
-                StringBuilder orConditions = new StringBuilder();
-                for (int i = 0; i < targetFields.size(); i++) {
-                    String field = targetFields.get(i);
-                    orConditions.append("UPPER(").append(field).append(") LIKE :").append(paramName);
-                    if (i != targetFields.size() - 1) {
-                        orConditions.append(" OR ");
+            // 3. 处理SEARCH_FIELD(多字段OR)
+            if (sqlParam.containsKey("SEARCH_FIELD")) {
+                String searchValue = sqlParam.get("SEARCH_FIELD").toString().trim();
+                if (!searchValue.isEmpty()) {
+                    if (!searchValue.contains("%")) {
+                        searchValue = "%" + searchValue + "%";
                     }
-                }
+                    searchValue = searchValue.replace("'", "''");
+                    sqlParam.put("SEARCH_FIELD", searchValue);
 
-                sql = sql + " AND (" + orConditions + ")";
+                    sql1 += " AND (" +
+                            TABLE_NAME + ".ACCOUNT_NAME LIKE :SEARCH_FIELD OR " +
+                            TABLE_NAME + ".CONTRACT_NAME LIKE :SEARCH_FIELD OR " +
+                            TABLE_NAME + ".NO LIKE :SEARCH_FIELD OR " +
+                            TABLE_NAME + ".ITEM_SUBCATE_ID LIKE :SEARCH_FIELD OR " +
+                            TABLE_NAME + ".BILL_ACCOUNT_ID LIKE :SEARCH_FIELD) ";
+                    sql = sql.replace("AND " + TABLE_NAME + ".SEARCH_FIELD = :SEARCH_FIELD", "");
+                }
             }
 
-            LOGGER.info("【最终拼接后SQL】" + sql);
+            // 4. 替换占位符,并修复ORDER BY表名大小写
+            sql = sql.replace("1=1", sql1)
+                    // 统一ORDER BY中的表名(全大写)
+                    .replace("VIEW_EU_dnv_PENDING_RECURRING_CONTRACT", TABLE_NAME);
+
+            LOGGER.info("【拼接后最终SQL】" + sql);
 
         } catch (Exception e) {
-            LOGGER.error("SQL条件拼接失败", e);
+            LOGGER.error("SQL拼接失败", e);
             e.printStackTrace();
         }
 

+ 9 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -2622,6 +2622,11 @@ public class contractService {
             connUpdate = DBSql.open();
             connUpdate.setAutoCommit(false);
 
+            String feeDate = null;
+            if (StringUtils.isNotBlank(approveDate)) {
+                // 简单替换分隔符后拼接(如2025-11-19 → 202511)
+                feeDate = approveDate.replace("-", "").substring(0, 6);
+            }
             for (String approveId : approveIds.split(",")) {
 
                 BO cad = new BO();// crm_account_deduction();//审批并提交表实体对象
@@ -2762,6 +2767,10 @@ public class contractService {
                 if (StringUtils.isBlank(cad.getString("BILL_ACCOUNT_ID")) && StringUtils.isNotBlank(cad.getString("ACCOUNT_ID")))
                     cad.set("BILL_ACCOUNT_ID", cad.get("ACCOUNT_ID"));
 
+                if (feeDate != null) {
+                    cad.set("FEE_DATE", feeDate);
+                }
+
                 SDK.getBOAPI().createDataBO("BO_EU_DNCRM_ACCOUNT_DEDUCTION", cad, uc, connUpdate);
                 dn.recordFormChanges.record(uc, cad, "提交服务费费用");
             }