From 2e60c6034fdfbcfbc4d7a91f0a84926688a50009 Mon Sep 17 00:00:00 2001
From: fs-danaus <danaus314@qq.com>
Date: 星期五, 13 五月 2022 09:29:29 +0800
Subject: [PATCH] 优化主键处理避免更新删除时条件不带主键

---
 src/com/yc/action/panval/PanelCommitAction.java         |   12 ++
 src/com/yc/ionic/build/BuildListPage.java               |   16 ----
 src/com/yc/action/grid/GTGrid.java                      |   61 ++++++++++----
 src/com/yc/action/grid/TreeGrid.java                    |   29 +------
 src/com/yc/service/grid/GridServiceImpl.java            |   41 +++++----
 src/com/yc/app/v2/service/impl/BaseFormServiceImpl.java |   19 ++--
 src/com/yc/api/controller/ApiController.java            |   44 ++--------
 7 files changed, 97 insertions(+), 125 deletions(-)

diff --git a/src/com/yc/action/grid/GTGrid.java b/src/com/yc/action/grid/GTGrid.java
index 6db12fd..cfc89f6 100644
--- a/src/com/yc/action/grid/GTGrid.java
+++ b/src/com/yc/action/grid/GTGrid.java
@@ -1981,7 +1981,7 @@
             //m = md2;
         }
         if (list != null && list.size() > 0) {
-            this.checkPrimKey(g, name);
+            this.checkPrimKey(g, name, list);
             String[] keys = (this.keyid != null && this.keyid.length() > 0) ? this.keyid.split(",") : null;
             for (HashMap map : list) {
                 StringBuilder key = new StringBuilder();
@@ -2034,14 +2034,14 @@
                 }
                 getPicInfo(map);
                 //澧炲姞鍒犻櫎鍙仮澶嶅鐞嗭紝2琛�
-                if (key1.toString().length() == 0)
+                if (key1.toString().length() == 0) {
                     sqlDel.add(proccSql(name) + ",' 1=1 " + key.toString().replaceAll("&amp;", "&").replaceAll("'", "''") + "'");
-                else
+                }else {
                     sqlDel.add(proccSql(name) + ",' 1=1 " + key1.toString().replaceAll("&amp;", "&").replaceAll("'", "''") + "'");
-
-                sqlDel.add(" delete " + name + " where 1=1 " + key1.toString().replaceAll("&amp;", "&"));
-                //澧炲姞鍒犻櫎
-                //this.getProcValues(map,str);
+                }
+                if(org.apache.commons.lang3.StringUtils.isNotBlank(key1.toString())) {
+                    sqlDel.add(" delete " + name + " where 1=1 " + key1.toString().replaceAll("&amp;", "&"));
+                }
             }
             keys = null;
         }
@@ -3017,7 +3017,7 @@
             colns = g.getColns();
         }
         if (update1 != null && update1.size() > 0) {
-            checkPrimKey(g, tableName);
+            checkPrimKey(g, tableName,vss);
             for (int i = 0; i < update1.size(); i++) {
                 StringBuilder key = new StringBuilder();
                 StringBuilder value = new StringBuilder();
@@ -3151,9 +3151,19 @@
         vss = null;
     }
 
-    private void checkPrimKey(com.yc.utils.Grid g, String name) {//妫�鏌ユ槸鍚﹁〃鏄惁璁剧疆浜嗕富閿紝鏇存柊锛屽垹闄ゆ搷浣滈兘闇�瑕佽繖涓潵浣滀负鍞竴鏉′欢
+    private void checkPrimKey(com.yc.utils.Grid g, String name, List<HashMap<String, String>> update1) {//妫�鏌ユ槸鍚﹁〃鏄惁璁剧疆浜嗕富閿紝鏇存柊锛屽垹闄ゆ搷浣滈兘闇�瑕佽繖涓潵浣滀负鍞竴鏉′欢
         if (g.getPrimeKey() == null || "".equalsIgnoreCase(g.getPrimeKey()))
             throw new ApplicationException(name + "琛ㄦ病鏈夎缃富閿紒");
+        //---瀛樺湪涓婚敭璁剧疆锛屼絾鍓嶇娌′紶涓婚敭瀵瑰簲鐨勫�硷紝涔熼渶瑕佹彁绀�
+        final String[] keys = g.getPrimeKey().split(";");
+        if(update1!=null&&update1.size()>0){
+            Arrays.stream(keys).forEach(key->{
+                final String object = update1.get(0).get(key.toLowerCase());
+                if(org.apache.commons.lang3.StringUtils.isBlank(object)){
+                    throw new ApplicationException(name + "涓婚敭瀛楁"+key+"娌℃湁浼犲�硷紝涓嶈兘鎵ц鎿嶄綔锛岃В鍐虫柟娉曪細璇峰湪9802鍕鹃�変笂姝ゅ瓧娈电殑鎰熷簲灞炴��");
+                }
+            });
+        }
     }
 
     private boolean checkDocType() {
@@ -3530,7 +3540,7 @@
      * @param isPramyPan TODO
      */
     private void convertPanelSQL(Map<String, TableMetaData> tableMetaDatas, List<HashMap<String, String>> update1, String tableName, String isPramyPan, String dbid) {
-        if (update1 != null) {
+        if (update1 != null&&update1.size()>0) {
             List<String> primaryKey = null;
             //496瀛愰潰鏉垮湪鏂板崟浣嗗張鍦ㄨ繖閲屾墽琛屾椂璺宠繃涓婚敭妫�鏌�
             boolean sub496=false;
@@ -3545,13 +3555,6 @@
                                 (org.apache.commons.lang3.StringUtils.isNotBlank(update1.get(0).get("doccode"))?true:false)
                 ) {
                     primaryKey = gridService.getPrimaryKey(tableName);
-                    //澧炲姞闈㈡澘璇诲彇琛ㄤ负瑙嗗浘锛屼粠鎸囧畾琛ㄥ叧閿瓧璁剧疆閲岃鍙栦俊鎭�
-                    if (primaryKey == null || primaryKey.size() == 0) {
-                        String keyfields = gridService.getTableKeyFields(tableName);
-                        if (org.apache.commons.lang3.StringUtils.isNotBlank(keyfields)) {
-                            primaryKey = Arrays.asList(keyfields.split(";"));
-                        }
-                    }
                 }else{
                     sub496=true;
                 }
@@ -3560,6 +3563,20 @@
             }finally {
                 SpObserver.setDBtoInstance();
             }
+            //鍙栧緱涓婚敭锛屽垽鏂富閿病鍊兼椂瑙﹀彂寮傚父
+            if (primaryKey == null || primaryKey.size() ==0) {
+                throw new ApplicationException(tableName + "娌℃湁瀹氫箟涓婚敭锛屼笉鑳芥墽琛屾洿鏂�(update)鎿嶄綔");
+            }
+            //----娴嬭瘯bug鎵�鍔犱唬鐮侊紝娴嬭瘯瀹岃娉ㄩ噴鎺�
+//            if(tableName.equals("v110520")){
+//                ((Map) update1.get(0)).remove("doccode");
+//            }
+            primaryKey.forEach(key->{
+                final Object object = ((Map) update1.get(0)).get(key.toLowerCase());
+                if(object==null){
+                    throw new ApplicationException(tableName + "涓婚敭瀛楁"+key+"娌℃湁浼犲�硷紝涓嶈兘鎵ц鏇存柊(update)鎿嶄綔锛岃В鍐虫柟娉曪細璇峰湪9802鍕鹃�変笂姝ゅ瓧娈电殑鎰熷簲灞炴��");
+                }
+            });
 
             for (int i = 0; i < update1.size(); i++) {
                 StringBuilder key = new StringBuilder();
@@ -3568,6 +3585,7 @@
                 key.append(" set ");
                 value.append(" where 1=1");
                 HashMap<String, String> up = update1.get(i);
+
                 if (this.isTaobao) {// 鍘绘帀鐗瑰畾ERP鐨勫瓧娈靛唴瀹�
                     up.remove("doccode");
                     up.remove("enterdate");
@@ -3714,11 +3732,16 @@
                             " end \n";
                 }
                 if (!this.type496.equals("update")) {
-                    if (isPramyPan != null && "1".equalsIgnoreCase(isPramyPan))
+                    if (isPramyPan != null && "1".equalsIgnoreCase(isPramyPan)) {
                         this.updatesql.add(0, updateSql);
-                    else
+                    }else {
                         this.updatesql.add(updateSql);
+                    }
                 } else {// 496绫诲瀷鐨剈pdate璋冪敤
+                    //---澧炲姞澶勭悊value鐨勫�兼病鏈墂here鏉′欢锛屽彧鏄痸alue=where 1=1鐨勬儏鍐碉紝浼氬鑷存洿鏂版墍鏈夋暟鎹紝濡傛灉鍑虹幇杩欑鎯呭喌锛岄渶瑕佹姏鍑洪敊璇�
+                    if(value.toString().trim().equals("where 1=1")){
+                        throw new ApplicationException(tableName + "娌℃湁瀹氫箟涓婚敭锛屼笉鑳芥墽琛屾洿鏂�(update)鎿嶄綔");
+                    }
                     this.wherepan496 = "if exists(select top 1 1 from " + tableName + value.toString() + ")\n  begin\n";
                     this.wherepan496 += updateSql;
                     this.wherepan496 += " end \n";
diff --git a/src/com/yc/action/grid/TreeGrid.java b/src/com/yc/action/grid/TreeGrid.java
index cb03e13..37ba84e 100644
--- a/src/com/yc/action/grid/TreeGrid.java
+++ b/src/com/yc/action/grid/TreeGrid.java
@@ -314,43 +314,22 @@
             return null;
     }
 
-    private void getFirstField(TreeGridDTO dto) throws DataAccessException, SQLException {
-        //1鍏堣琛ㄥ叧閿姛鑳斤紝濡傛灉娌℃湁鐩稿叧鐨勫啀璇昏〃缁撴瀯
+    public void getFirstField(TreeGridDTO dto) throws DataAccessException, SQLException {
 
-        String keyfields = null;
+        List<String> keys = null;
         try {
             SpObserver.setDBtoInstance("_" + dto.dbid);
-            keyfields = gridService.getTableKeyFields(dto.table);
+            keys = gridService.getPrimaryKey(dto.table);
         } finally {
             SpObserver.setDBtoInstance();
         }
-
-        if (keyfields == null || "".equals(keyfields)) {
-            //2鍙彇涓昏〃,涓讳粠琛ㄦ儏鍐� 鍙�18,19绫诲瀷锛屼笁琛ㄦ殏鏃朵笉鑰冭檻
-            List<String> keys = null;
-            try {
-                SpObserver.setDBtoInstance("_" + dto.dbid);
-                keys = gridService.getPrimaryKey(dto.table);
-            } finally {
-                SpObserver.setDBtoInstance();
-            }
+        if(keys!=null) {
             for (String str : keys) {
                 if ("".equals(dto.field))
                     dto.field += str;
                 else
                     dto.field += ";" + str;
             }
-            keys = null;
-        } else {
-            String[] arry = keyfields.split(";");
-            for (int i = 0; i < arry.length; i++) {
-                if ("".equals(dto.field))
-                    dto.field += arry[i].toLowerCase();
-                else
-                    dto.field += ";" + arry[i].toLowerCase();
-
-            }
-            arry = null;
         }
         dto.primeKey = dto.field;
     }
diff --git a/src/com/yc/action/panval/PanelCommitAction.java b/src/com/yc/action/panval/PanelCommitAction.java
index d03f930..b5b7b77 100644
--- a/src/com/yc/action/panval/PanelCommitAction.java
+++ b/src/com/yc/action/panval/PanelCommitAction.java
@@ -12,6 +12,7 @@
 import com.yc.service.panel.SqlDBHelperIfc;
 import com.yc.service.panel.SystemSettingsDao;
 import com.yc.utils.SessionKey;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.dao.IncorrectResultSizeDataAccessException;
@@ -172,11 +173,18 @@
 	public String PostDeleteDocSql(String formid, String doccode,String docstatus,String dbid,String formtype,
 								String userName,String userCode,String no,Map<String, String> env) {
 		Map<String, Object> map =null;
+		CallBackMessage callBackMessage=new CallBackMessage();
 		try {
 			SpObserver.setDBtoInstance("_"+dbid);
 			map = sDao.getFormIdInTable(Integer.parseInt(formid));
-		}finally {
+		}catch (Exception e){
+			return callBackMessage.sendErrorMessage(e.getCause() != null ? e.getCause().getMessage():e.getMessage());
+		}
+		finally {
 			SpObserver.setDBtoInstance();
+		}
+		if(StringUtils.isBlank(doccode)){
+			return callBackMessage.sendErrorMessage("涓嶈兘鍒犻櫎鍗曞彿涓虹┖鐨勫崟鎹�!");
 		}
 		env.put("doccode",doccode);
 		List<String> listSql=new ArrayList<String>();
@@ -192,7 +200,7 @@
 		int formType_int = (strTi != null) ? Integer.parseInt(strTi) : 0;//
 		strTi = no;
 		int no496 = (strTi != null) ? Integer.parseInt(strTi) : -1;// 閽堝499鐩稿悓绫诲瀷
-		CallBackMessage callBackMessage=new CallBackMessage();
+
 		try {
 			SpObserver.setDBtoInstance("_"+dbid);
 			List<Map<String, Object>> selshandan = sDbHelperIfc.getselectshandan("select  1 from " + HDTable
diff --git a/src/com/yc/api/controller/ApiController.java b/src/com/yc/api/controller/ApiController.java
index 1c7b14a..dd00ec1 100644
--- a/src/com/yc/api/controller/ApiController.java
+++ b/src/com/yc/api/controller/ApiController.java
@@ -1145,53 +1145,29 @@
 
     private void getFirstField(TreeGridDTO dto) {
         //1鍏堣琛ㄥ叧閿姛鑳斤紝濡傛灉娌℃湁鐩稿叧鐨勫啀璇昏〃缁撴瀯
-
-        String keyfields = null;
+        List<String> keys = null;
         try {
             SpObserver.setDBtoInstance("_" + dto.dbid);
             String taleName=dto.table;
             if(dto.winType==18||dto.winType==19){
                 taleName=dto.table.split("\\|")[0];
             }
-            keyfields = gridService.getTableKeyFields(taleName);
-        } finally {
-            SpObserver.setDBtoInstance();
-        }
-        if (keyfields == null || "".equalsIgnoreCase(keyfields)) {
-            //2鍙彇涓昏〃,涓讳粠琛ㄦ儏鍐�
-            List<String> keys = null;
-            try {
-                SpObserver.setDBtoInstance("_" + dto.dbid);
-                try {
-                    keys = gridService.getPrimaryKey(dto.table);
-                } catch (SQLException e) {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            } finally {
-                SpObserver.setDBtoInstance();
-            }
-            if (keys != null) {
+            keys = gridService.getPrimaryKey(taleName);
+            if(keys!=null) {
                 for (String str : keys) {
-                    if (dto.field == "")
+                    if ("".equals(dto.field))
                         dto.field += str;
                     else
                         dto.field += ";" + str;
                 }
-                keys = null;
             }
-        } else {
-            String[] arry = keyfields.split(";");
-            for (int i = 0; i < arry.length; i++) {
-                if ("".equals(dto.field))
-                    dto.field += arry[i].toLowerCase();
-                else
-                    dto.field += ";" + arry[i].toLowerCase();
-
-            }
-            arry = null;
+            dto.primeKey = dto.field;
+        }catch (SQLException e){
+                throw new ApplicationException(e.getMessage());
+        }finally {
+            SpObserver.setDBtoInstance();
         }
-        dto.primeKey = dto.field;
+
     }
 
     public void getTableName(int formid, String winType, TreeGridDTO dto) {
diff --git a/src/com/yc/app/v2/service/impl/BaseFormServiceImpl.java b/src/com/yc/app/v2/service/impl/BaseFormServiceImpl.java
index 9bc847c..b534663 100644
--- a/src/com/yc/app/v2/service/impl/BaseFormServiceImpl.java
+++ b/src/com/yc/app/v2/service/impl/BaseFormServiceImpl.java
@@ -1332,31 +1332,28 @@
     public String orderBySql(GformEntity gformEntity, FormVOEntity formVOEntity, String orderbyStr) {
 
         try {
-            String keys = "";
+            String primaryStr = "";
             String tableName = this.setTableName(gformEntity);
             //----鍙栬〃鍏抽敭瀛楄缃�
-            keys = gridService.getTableKeyFields(tableName);
+            //keys = gridService.getTableKeyFields(tableName);
             //-----鍙栬〃涓婚敭
             final List<String> primaryKey = gridService.getPrimaryKey(tableName);
-            String primaryStr = "";
             if (primaryKey != null && primaryKey.size() > 0) {
                 primaryStr = String.join(";", primaryKey);
             }
             //---鎶婅〃鍚嶏紝涓婚敭淇濆瓨杈撳嚭
             formVOEntity.setPrimaryKey(primaryStr);
             formVOEntity.setTableName(tableName);
-            if (StringUtils.isBlank(keys)) {
+            if (StringUtils.isBlank(primaryStr)) {
                 //-----鍙�9801璁剧疆
                 String indexField = gformEntity.isGetHeadTabe() ? gformEntity.getIndex1() : gformEntity.getIndex2();
                 if (StringUtils.isNotBlank(indexField)) {//鍙�9801鐨勬帓搴忚缃�
-                    keys = indexField;
+                    primaryStr = indexField;
 
-                } else if (StringUtils.isBlank(keys)) {
-                    keys = primaryStr;
                 }
             }
-            if (StringUtils.isNotBlank(keys)) {
-                String orderFields = keys.replaceAll(";", ",");
+            if (StringUtils.isNotBlank(primaryStr)) {
+                String orderFields = primaryStr.replaceAll(";", ",");
                 String newOrderFiled = "";
                 String[] sorts = orderFields.split(",");
                 int index = 0;
@@ -1376,9 +1373,9 @@
                     }
                     index++;
                 }
-                keys = newOrderFiled;// keys.replace(";"," desc, ")+" desc";
+                primaryStr = newOrderFiled;// keys.replace(";"," desc, ")+" desc";
             }
-            return keys;
+            return primaryStr;
         } catch (SQLException e) {
             return "";
         }
diff --git a/src/com/yc/ionic/build/BuildListPage.java b/src/com/yc/ionic/build/BuildListPage.java
index ba67ecc..87d0b75 100644
--- a/src/com/yc/ionic/build/BuildListPage.java
+++ b/src/com/yc/ionic/build/BuildListPage.java
@@ -3,7 +3,6 @@
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.yc.action.grid.GridUtils;
-import com.yc.exception.ApplicationException;
 import com.yc.ionic.control.*;
 import com.yc.service.grid.GridServiceIfc;
 import com.yc.service.panel.GetDataTypeIfc;
@@ -102,9 +101,6 @@
 }
     private String getFirstField(String table,PageInfo page,String firstID) {
 	String field="";
-	//1,鍏堣琛ㄥ叧閿姛鑳斤紝濡傛灉娌℃湁鐩稿叧鐨勫啀璇昏〃缁撴瀯
-	String keyfields=gridService.getTableKeyFields(table);
-	if(keyfields==null||"".equals(keyfields)){
 	//2,鍙彇涓昏〃,涓讳粠琛ㄦ儏鍐� 鍙�18,19绫诲瀷锛屼笁琛ㄦ殏鏃朵笉鑰冭檻
 	List<String> keys;
 	try {
@@ -118,18 +114,6 @@
 	} catch (SQLException e) {
 	    // TODO Auto-generated catch block
 	    e.printStackTrace();
-	}
-	
-	keys=null;
-	}else{
-		String[] arry=keyfields.split(";");
-		for(int i=0;i<arry.length;i++){
-			if("".equals(field))
-			    field+=arry[i].toLowerCase();
-			else
-			    field+=";"+arry[i].toLowerCase();	
-		}
-		arry=null;
 	}
 	if(field==null||"".equalsIgnoreCase(field)){
 	    field=firstID;
diff --git a/src/com/yc/service/grid/GridServiceImpl.java b/src/com/yc/service/grid/GridServiceImpl.java
index cee5806..0a6e70a 100644
--- a/src/com/yc/service/grid/GridServiceImpl.java
+++ b/src/com/yc/service/grid/GridServiceImpl.java
@@ -34,7 +34,9 @@
 import javax.servlet.http.HttpSession;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
-import java.sql.*;
+import java.sql.CallableStatement;
+import java.sql.SQLException;
+import java.sql.Types;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.regex.Matcher;
@@ -2033,29 +2035,32 @@
     }
 
     /**
-     * 鏍规嵁琛ㄥ悕鍙栧緱琛ㄤ富閿悕
+     * 鏍规嵁琛ㄥ悕鍙栧緱琛ㄤ富閿悕,鏌ユ壘琛ㄧ粨鏋勫拰9807璁剧疆
      *
      * @return int
      * @throws SQLException
      */
+    @Override
     public List<String> getPrimaryKey(String tableName) throws DataAccessException, SQLException {
-
-        Connection con = null;
-        ResultSet rs = null;
         List<String> key = new ArrayList<String>();
-        try {
-            con = this.jdbcTemplate.getDataSource().getConnection();
-            rs = con.getMetaData().getPrimaryKeys(null, null, tableName);
-            while (rs.next()) {
-                key.add(rs.getString(4));
-            }
-        } catch (Exception e) {
-            throw new ApplicationException(e.getMessage());
-        } finally {
-            if (rs != null)
-                rs.close();
-            if (con != null)
-                con.close();
+       String sql="declare @key varchar(1000),@tableName varchar(100)=?\n" +
+               " SELECT @key=stuff((SELECT';' + CONVERT(VARCHAR, column_name)\n" +
+               " FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC\n" +
+               " INNER JOIN\n" +
+               "     INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU\n" +
+               "           ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND\n" +
+               "              TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND \n" +
+               "              KU.table_name=@tableName\n" +
+               " ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION\n" +
+               " FOR XML PATH ('')),1,1,'')\n" +
+               "  if isnull(@key,'')=''\n" +
+               "  begin\n" +
+               "    select @key=keyfields  from _systablekey where tableid=@tableName\n" +
+               " end\n" +
+               " select lower(@key)";
+        final String result = this.getSimpleJdbcTemplate().queryForObject(sql, String.class, tableName);
+        if(result!=null){
+            key=Arrays.asList(result.split(";"));
         }
         return key;
     }

--
Gitblit v1.8.0