fs-danaus
2023-09-14 31400fffd7b31397d6d8882d3927e7b870924233
提交 | 用户 | age
a6a76f 1 /*
F 2  * (#)TreeGrid.java 1.0 2011-3-3 2011-3-3
3  */
4 package com.yc.action.grid;
5
6 import com.yc.action.BaseAction;
7 import com.yc.exception.ApplicationException;
8 import com.yc.factory.FactoryBean;
9 import com.yc.multiData.SpObserver;
10 import com.yc.service.build.type.T_22_Ifc;
11 import com.yc.service.grid.GridServiceIfc;
12 import com.yc.service.impl.DBHelper;
13 import com.yc.utils.EncodeUtil;
14 import com.yc.utils.FileUtil;
15 import com.yc.utils.YCBase64;
16 import org.apache.commons.lang.StringUtils;
17 import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.dao.DataAccessException;
19 import org.springframework.dao.EmptyResultDataAccessException;
20 import org.springframework.jdbc.support.rowset.SqlRowSet;
21 import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
22 import org.springframework.stereotype.Service;
23
24 import java.io.File;
25 import java.io.UnsupportedEncodingException;
26 import java.sql.SQLException;
0e86df 27 import java.util.*;
a6a76f 28 import java.util.regex.Pattern;
F 29
30
31 /***
32  * TreeGrid表格生成,
33  *
34  *
35  * @author 邓文峰 2011-3-3
36  **/
37 @SuppressWarnings("all")
38 @Service("treeGrid")
39 public class TreeGrid extends BaseAction implements TreeGridIfc {
40     private static final int GRID_HEIGHT = 300;
41     /**
42      * 表格处理的业务类
43      */
44     @Autowired
45     private GridServiceIfc gridService;//表格处理的业务类
46
47     //static  String domain= AttachmentConfig.get("attachment.server");
48
49     /**
50      * 取得与树设置有关的字段名,
51      * 格式:树1字段1;树1字段2,树2字段1;树2字段2
52      * by danaus 2018-11-20 支持3类型显示多树功能而修改
53      **/
54     private synchronized String getTreeFields(int formid, String dbid) {
55         try {
56             SpObserver.setDBtoInstance("_" + dbid);
57             return gridService.getSimpleJdbcTemplate().queryForObject("SELECT stuff((SELECT',' + CONVERT(VARCHAR, nodeid) FROM _systreeset  where formid=? FOR XML PATH ('')),1,1,'') ", new Object[]{formid}, String.class);
58         } finally {
59             SpObserver.setDBtoInstance();
60         }
61     }
62
63     /**
64      * 根据功能号取得格线高度
65      **/
66     public synchronized int getGrigHieght(int formID, int type, String dbid) {
67         if (type != 8) {
68             try {
69                 SpObserver.setDBtoInstance("_" + dbid);
70                 Integer in = gridService.getSimpleJdbcTemplate().queryForObject("select GridHeight from  gform where formid=" + formID, Integer.class);
71                 return in == null ? 0 : in;
72             } finally {
73                 SpObserver.setDBtoInstance();
74             }
75         } else if (type == 8) {//3表结构
76             int temp = 0;
77             int tg = 0;
78             List<Map> list = null;
79             try {
80                 SpObserver.setDBtoInstance("_" + dbid);
81                 list = gridService.getThreeTableInfo(formID);
82             } finally {
83                 SpObserver.setDBtoInstance();
84             }
85             if (list.size() == 0) {
86                 throw new ApplicationException("三表关联未设置好--9825");
87             }
88             for (Map map : list) {
89                 temp = (Integer) map.get("DetailFormID");
90                 tg = (map.get("gridHeight") == null) ? 0 : (Integer) map.get("gridHeight");
91             }
92             list = null;
93             try {
94                 SpObserver.setDBtoInstance("_" + dbid);
95                 int h = gridService.getSimpleJdbcTemplate().queryForObject("select GridHeight from  gform where formid=" + formID, Integer.class);
96                 if (tg == 0)
97                     tg = gridService.getSimpleJdbcTemplate().queryForObject("select GridHeight from  gform where formid=" + temp, Integer.class);
98                 return (tg == 0 ? GRID_HEIGHT : tg) + (h == 0 ? GRID_HEIGHT : h);
99             } finally {
100                 SpObserver.setDBtoInstance();
101             }
102         } else {
103             return 0;
104         }
105     }
106
107     /**
108      * 根据类型选用不同的字段作为排序
109      *
110      * @return 1表示清单,2表示明细
111      **/
112     private int setOrderName(TreeGridDTO dto) {
113
114         switch (dto.winType) {
115             case 9:
116             case 15:
117             case 17:
118             case 499:
119             case 497:
120                 if (dto.conNum == 0) {
121                     //isList=t
122                     return 1;
123                 } else
124                     return 2;
125             case 1:
126                 if (dto.b497 || dto.b499)
127                     return 2;
128                 else
129                     return 1;
130             default:
131                 return 1;
132         }
133     }
134
135     private int setToolAdd(TreeGridDTO dto) {
136         switch (dto.winType) {
137             case 9:
138             case 15:
139             case 17:
140             case 499:
141             case 497:
142                 if (dto.conNum == 0)
143                     return 1;
144                 else
145                     return 2;
146             case 18:
147             case 38:
148             case 19:
149                 return 1;
150             default:
151                 return 2;
152         }
153     }
154
155     //只有明细表才需要执行,其他的都只是输出{}
156     private String setToolAddForNew(TreeGridDTO dto) {
157         if (dto.postStatusAddNew) return "<%=bdMap.toString()%>";
158         switch (dto.winType) {
159             case 9:
160             case 15:
161             case 17:
162             case 499:
163             case 497:
164                 if (dto.conNum == 0)
165                     return "{}";
166                 else
167                     return "<%=bdMap.toString()%>";
168             case 18:
169             case 38:
170             case 19:
171                 return "{}";
172             default:
173                 return "{}";
174         }
175     }
176
177     /**
178      * 根据窗体类型取得应当读取哪一个表的数据.
179      **/
180     private synchronized int setGetPrivaryTable(int winType) {
181         switch (winType) {
182             case 5:
183             case 9:
02a0e6 184             case 20:
a6a76f 185             case 30:
F 186             case 301:
187             case 10:
188             case 19:
189             case 304:
190                 return 1;//从表
191             case 8://三表
192                 return 2;
193             default:
194                 return 0;
195         }
196     }
197
198     /**
199      * 是否为单据类型,
200      **/
201     private synchronized boolean isDanJun(TreeGridDTO dto) {
202         if (dto.winType == 15 || dto.winType == 9 || dto.winType == 17 || dto.winType == 499 || dto.winType == 497)
203             return true;
204         else
205             return false;
206     }
207
208     /**
209      * 根据功能号取得主从表名称 -----9801信息---增加新窗体类型都需要增加相应判断
210      **/
211     public String getTableName(int formid, String winType, TreeGridDTO dto) {
212         SqlRowSet gform = null;
213         try {
214             SpObserver.setDBtoInstance("_" + dto.dbid);
215             gform = gridService.getGformByFormID(formid);
216         } finally {
217             SpObserver.setDBtoInstance();
218         }
219         String[] temp = winType.split("\\|");
220         dto.winType = Integer.parseInt(temp[0]);
221         dto.conNum = temp.length > 1 ? Integer.parseInt(temp[1]) : 0;
222         if (!gform.wasNull()) {
223             gform.first();
224             dto.HDTable = gform.getString("hdtable");
225             dto.dataformid = (gform.getString("dataformid") == null || gform.getString("dataformid").length() == 0 || gform.getString("dataformid").equalsIgnoreCase("0")) ? "" : (gform.getString("dataformid") + (!this.isDanJun(dto) ? "" : "@p@" + gform.getInt("predocstatus")));
226             dto.tranformid = (gform.getString("dataformid") == null || gform.getString("dataformid").length() == 0 || gform.getString("dataformid").equalsIgnoreCase("0")) ? "" : (gform.getString("dataformid"));
227             dto.DTtable = gform.getString("dttable");
228             dto.frozencols = gform.getInt("frozencols");
229             dto.formname = gform.getString("formname");
230             dto.gantt = gform.getBoolean("isGantt");//是否为甘特图类型的功能号
231             dto.predocstatus = gform.getInt("predocstatus");//确认前状态,为了给格线在确认后不能再修改(新增,修改,删除) by 2013-02-01
493df4 232             dto.postDocStatus = gform.getInt("postdocstatus");//确认后状态,为了给格线在确认后不能再修改(新增,修改,删除) by 2013-02-01
a6a76f 233             dto.rowcopyfields = gform.getString("rowcopyfields");//行复制时排除字段
F 234             dto.pageSize = gform.getInt("pageSize");//页记录数
235             dto.autopaging = gform.getInt("autopaging");//是否分页
236             dto.optype = gform.getInt("optype");//功能号权限
237             dto.lockGridSort = gform.getInt("LockGridSort");//冻结列排序
238             dto.colset = gform.getInt("isShowCell");//是否显示列过滤
239             dto.mainCol = gform.getString("byGroup");//树分组显示字段
240             dto.isFilter = gform.getInt("isFilter");//是否打开过滤功能
241             boolean blactions = gform.getBoolean("addNewRow");//直接增行
242 //         try {
243 //         dto.postStatusAddNew=gform.getInt("PostStatusGridAddNew");//根据状态值是否可以显示增行按钮,用在OA审核中
244 //         }catch(Exception e) {
245 //             dto.postStatusAddNew=0;
246 //         }
247             if (blactions) dto.actions = "<Actions OnClickButtonAdd=\"AddRowEnd\" />";
248             dto.defaultRowCount = gform.getInt("DefaultRowCount");//格线默认加载时显示行数
249             if (!"".equalsIgnoreCase(dto.tolkey) && (dto.b497 || dto.b499) && dto.PriFormID > 0) {//是多表的情况 且是第一个子功能号
250
251                 SqlRowSet f = null;
252                 try {
253                     SpObserver.setDBtoInstance("_" + dto.dbid);
254                     f = gridService.getGformByFormID(dto.PriFormID);
255                 } finally {
256                     SpObserver.setDBtoInstance();
257                 }
258                 if (!f.wasNull()) {
259                     f.first();
260                     dto.rowcopyformids = f.getString("rowcopyformids");//复单时排除功能号
261                 }
262
263             } else {
264                 dto.rowcopyformids = gform.getString("rowcopyformids");//复单时排除功能号
265             }
266             if (dto.gridHeight == 0) dto.gridHeight = gform.getInt("GridHeight");//表格高度
267             dto.glcodefield = gform.getString("glcodefield");//会计科目需要的字段
268             if (!this.isNullOrEmptry(dto.glcodefield)) {//格式:主表汇总,明细表汇总|平衡字段|平衡值公式字段
269                 List<Map<String, Object>> map = null;
270                 try {
271                     SpObserver.setDBtoInstance("_" + dto.dbid);
272                     map = gridService.getSimpleJdbcTemplate().queryForList("select MasterSumFields,DetailSumFields from _sysmasterdetail where FormID=?", dto.formID);
273                 } finally {
274                     SpObserver.setDBtoInstance();
275                 }
276                 if (map.size() > 0) {
277                     Map<String, Object> m = map.get(0);
278                     dto.gltotal = m.get("MasterSumFields") + "," + m.get("DetailSumFields") + "|" + gform.getString("checkblncfields") + "|" + gform.getString("chkFormula");
279                     m = null;
280                 }
281                 map = null;
282             }
283             dto.index1 = gform.getString("index1");//列表的排序字段-9类型
284             dto.index2 = gform.getString("index2");//明细表的排序字段-5类型
285             dto.formdatafilters = gform.getString("formdatafilters") == null ? "" : this.replaceBlank(gform.getString("formdatafilters"));
286             dto.ProcGroupafterSavedoc = gform.getString("ProcGroupafterSavedoc") == null ? "" : this.replaceBlank(gform.getString("ProcGroupafterSavedoc"));
287             dto.trangroup = gform.getString("transgroupcode") == null ? "" : gform.getString("transgroupcode");
288             dto.DealAfterDocSave = gform.getString("DealAfterDocSave") == null ? "" : this.replaceBlank(gform.getString("DealAfterDocSave"));
289
290             dto.cancelProc = gform.getString("CancelBtnProcName") == null ? "" : this.replaceBlank(gform.getString("CancelBtnProcName"));
291
292             dto.revokeProc = gform.getString("RevokeBtnProcName") == null ? "" : this.replaceBlank(gform.getString("RevokeBtnProcName"));
293
294             dto.cancelisSave = gform.getBoolean("CancelIsSave") ? 1 : 0;
295             dto.isExchangeDataWithHost = gform.getBoolean("isExchangeDataWithHost") ? 1 : 0;
296
297             if (dto.winType == 0 || dto.winType == 7 || dto.winType == 1 || dto.winType == 5 || (dto.winType == 9 && dto.conNum == 0) || dto.winType == 3 || dto.winType == 4 ||
298                     dto.winType == 17 || dto.winType == 302 || dto.winType == 19 ||
299                     (dto.winType == 499 && dto.conNum == 0) ||
300                     (dto.winType == 497 && dto.conNum == 0) ||
301                     (dto.winType == 15 && (dto.conNum == 0 || dto.conNum == 2))) {
302                 dto.table = dto.HDTable;
303                 dto.isList = true;
304             } else {
305                 dto.table = dto.DTtable;
306             }
307
308             gform = null;
309             return dto.table;
310         } else
311             return null;
312     }
313
2e60c6 314     public void getFirstField(TreeGridDTO dto) throws DataAccessException, SQLException {
a6a76f 315
2e60c6 316         List<String> keys = null;
a6a76f 317         try {
F 318             SpObserver.setDBtoInstance("_" + dto.dbid);
b2156e 319             String tableName=dto.table;
F 320             if(tableName.contains("|")){//18,19类型
321                 tableName=tableName.split("\\|")[0];
322             }
323             keys = gridService.getPrimaryKey(tableName);
a6a76f 324         } finally {
F 325             SpObserver.setDBtoInstance();
326         }
2e5389 327         if(keys!=null&&keys.size()>0) {
a6a76f 328             for (String str : keys) {
F 329                 if ("".equals(dto.field))
330                     dto.field += str;
331                 else
332                     dto.field += ";" + str;
333             }
334         }
2e5389 335         /*else {
F 336             throw new ApplicationException("由于表名称是函数或视图获取不到主键,请到9807设置表关键字");
337         }*/
a6a76f 338         dto.primeKey = dto.field;
F 339     }
340
341     private void print(String root, TreeGridDTO dto) throws DataAccessException, SQLException {//输出表格
342         String sql = "select top 1 fieldid from gfield where formid=? and HeadFlag=? and ShowOnGrid=1 order by statisid desc";
343         if (dto.winType != 9 && dto.winType != 15) {//针对只生成一个表格的情况,17类型由于第二个没有表格所以也存在这里了
344             try {
345                 SpObserver.setDBtoInstance("_" + dto.dbid);
346                 dto.gfields = gridService.getGfiledByFormID9(dto.formID, this.setGetPrivaryTable(dto.winType));//取得所有字段信息 增加类型
347             } finally {
348                 SpObserver.setDBtoInstance();
349             }
350         } else {
351             if (dto.winType == 15 && dto.conNum == 1) {
352                 List<Map> list = null;
353                 try {
354                     SpObserver.setDBtoInstance("_" + dto.dbid);
355                     list = gridService.getThreeTableInfo(dto.formID);
356                 } finally {
357                     SpObserver.setDBtoInstance();
358                 }
359                 if (list.size() == 0) {
ba6749 360                     throw new ApplicationException(";;" + dto.formID + "-三表关联未设置好,请在9825功能号维护好");
F 361                 }
362                 if (list.size() >1) {
363                     throw new ApplicationException(";;" + dto.formID + "-三表关联存在多条记录,请在9825功能号维护好");
a6a76f 364                 }
F 365                 for (Map map : list) {
366                     int temp = (Integer) map.get("DetailFormID");
367                     dto.masterKey = (String) map.get("MasterKeys");
368                     dto.detailKey = (String) map.get("DetailKeys");
369                     dto.formID3 = temp;
370                     dto.tempGridHeight = (map.get("gridHeight") == null) ? 0 : (Integer) map.get("gridHeight");
371                 }
372                 list = null;
373             }
374             if (dto.conNum < 2) {
375                 try {
376                     SpObserver.setDBtoInstance("_" + dto.dbid);
377                     dto.gfields = gridService.getGfiledByFormID9(dto.formID, dto.conNum);//取得所有字段信息
378                     dto.lastField = gridService.getSimpleJdbcTemplate().queryForObject(sql, new Object[]{dto.formID, 1}, String.class);
379                 } catch (DataAccessException e) {
380                     dto.lastField = "";
381                     throw new ApplicationException(dto.formID + "-列表没设置需要显示的字段,请在9802重新设置");
382
383                 } finally {
384                     SpObserver.setDBtoInstance();
385                 }
386             } else {//三表中的第三张表
387                 dto.minID = dto.formID;//为了生成页面时取第一表的功能号
388                 dto.formID = dto.formID3;
389                 try {
390                     SpObserver.setDBtoInstance("_" + dto.dbid);
391                     dto.gfields = gridService.getGfiledByFormID9(dto.formID, 0);//取得所有 字段信息
392                     dto.lastField = gridService.getSimpleJdbcTemplate().queryForObject(sql, new Object[]{dto.formID, 0}, String.class);
393                 } finally {
394                     SpObserver.setDBtoInstance();
395                 }
396             }
397         }
398         //try {
399         this.getTableName(dto.formID, dto.winType + "|" + dto.conNum, dto);// 增加类型
400         if (dto.table == null) throw new ApplicationException(dto.formID + "--未设置明细表,请在9802设置后重新生成!");
493df4 401         if (dto.winType == 1 && ("".equals(dto.table) || dto.table == null)) {
F 402             throw new ApplicationException(dto.formID + ",类型:" + dto.winType + "--未设置主表,请在9801设置后重新生成!");
525df2 403         }
b2156e 404       //  if (dto.isTable) {
a6a76f 405             this.getFirstField(dto);
b2156e 406        // }
a6a76f 407         if (dto.conNum >= 2)
F 408             if (dto.tempGridHeight != 0) dto.gridHeight = dto.tempGridHeight;
409
410         gridConfig(root, dto);
411         createCoumtHeader(dto);
412         //} catch (Exception e) {
413         //    e.printStackTrace();
414         //}
415     }
416
417     private synchronized void fillColumnNumTree(int num, TreeGridDTO dto) {//根据最大行值填充列
418         StringBuilder mps = new StringBuilder();
419         int j = 0;
420         //dto.gfields.first();
421         try {
422             //do{
423             for (Map<String, Object> map : dto.gfields) {
424
425                 if ("1".equalsIgnoreCase(map.get("ShowOnGrid") + "")) {
426                     String dec = map.get("gridcaption") == null ? "" : map.get("gridcaption") + "";//表格描述
427                     String fieldname = map.get("fieldname") == null ? "" : map.get("fieldname") + "";//字段描述
428                     String id = map.get("fieldid") + "";//字段名
429                     if (id.equalsIgnoreCase("id")) id = "_ycid_";//避免id与格线中的id冲突而增加,页面返回时需要转换
430                     String cap = (dec == null || "".equalsIgnoreCase(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
431                     if (cap == null || cap == "" || cap.length() == 0) cap = id;
432                     String[] temp = cap.split("\\|");//分割字符串,外表|接收数据|外表字段
433                     int tempN = this.getColumnNumOf(temp[0], dto.tempStr, 0, dto);//取得当前列最大行数是多少.
434                     int colNum = this.getColumnNum(temp[0], dto.tempStr, 0, temp[0], 0, dto);//跨列值
435                     int ts = num - temp.length;
436                     StringBuilder mp = new StringBuilder();
437                     if (j != 0) mps.append("&#039;");
438                     if (tempN == num && temp.length < num) {//全行都有但长度不够需要在后面补足
439                         for (int i = 0; i < ts; i++) {
440                             mp.append("|¥");
441                         }
442                         mps.append(cap + mp.toString());
443
444                     } else {
445                         if (colNum > 1) {
446                             for (int i = 0; i < ts; i++) {
447                                 mp.append("|¥");
448                             }
449                             mps.append(cap + mp.toString());
450                         } else {
451                             for (int i = 0; i < ts; i++) {
452                                 mp.append("¥|");
453                             }
454                             mps.append(mp.toString() + cap);
455                         }
456                     }
457                     j++;
458                     mp = null;
459                 }
460             }
461             //while(dto.gfields.next());
462         } catch (Exception e) {
463             //System.out.println(e+"错误3");
464         }
465         dto.tempStr = mps.toString();
466         mps = null;
467     }
468
469     /**
470      * 获取当前表定义的列格式最大数,作为自定义表头列分割的依据
471      * 循环gfields集合中{表格|描述}字段值,分割”|”生成数组,返回最大数组长度,及取得表所有字段描述和长度分布情况
472      *
473      * @return int 最大值
474      */
475     private synchronized int getMaxColumnNum(TreeGridDTO dto) {
476         int num = 0;
477         int j = 0;
478         //dto.gfields.first();
479         try {
480             //do{
481             for (Map<String, Object> map : dto.gfields) {
482                 if (GridUtils.prossRowSetDataType_Int(map, "ShowOnGrid") > 0) {
483                     String dec = map.get("gridcaption") == null ? "" : map.get("gridcaption") + "";//表格描述
484                     String fieldname = map.get("fieldname") == null ? "" : map.get("fieldname") + "";//字段描述
485                     String id = map.get("fieldid") + "";//字段名
486                     if (id.equalsIgnoreCase("id")) id = "_ycid_";//避免id与格线中的id冲突而增加,页面返回时需要转换
487                     String cap = (dec == null || "".equals(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
488                     if (cap == null || cap == "" || cap.length() == 0) cap = id;
489                     String[] temp = cap.split("\\|");//分割字符串,外表|接收数据|外表字段
490                     if (j != 0) dto.tempStr += "&#039;";//特殊分隔符
491                     dto.tempStr += cap;
492                     if (!dto.decMap.containsKey(temp[0])) {//不存在这个key时放到map保存
493                         dto.decMap.put(temp[0], temp.length);//保存字段分割最大长度
494                     } else if (temp.length > dto.decMap.get(temp[0])) {//当前值比map里的值大时候,换为新值
495                         dto.decMap.remove(temp[0]);
496                         dto.decMap.put(temp[0], temp.length);
497                     }
498                     if (num < temp.length) {
499                         num = temp.length;
500                     }
501                     j++;
502                 }
503             }
504             //while(dto.gfields.next());
505         } catch (Exception e) {
506             //System.out.println(e+"错误4");
507         }
508         return num;
509     }
510
511     /**
512      * 查找类似“表格|显示,表格|描述,表格|类型,表格|长度”中表格出现的次数
513      *
514      * @param String colName---列名称
515      * @param String gridcaption---列名称的组合串,在getMaxColumnNum方法生成
516      */
517     private synchronized int getColumnNum(String colName, String gridcaption, int index, String per, int m, TreeGridDTO dto) {
518         if (colName.equalsIgnoreCase("¥")) return 0;
519         int num = 0;
520         String temp1 = colName;
521         String temp2 = dto.tempStr;
522         String[] temp3 = temp2.split("&#039;");
523         String temp4 = "";//保存前一个值
524         int j = 0;
525         for (int k = 0; k < temp3.length; k++) {
526             j++;
527             String s = temp3[k];
528             String[] ts = s.split("\\|");
529             if (ts.length < index + 1) continue;
530             if (ts[index].equalsIgnoreCase(temp1.toLowerCase()) && per.equals(ts[index == 0 ? 0 : index - 1]) && j >= m) {//判断需要计算的列的前一个值与当前列的前一个列是否相同
531                 num++;
532                 temp4 = ts[index];
533             } else if (temp4 != "" && !temp4.equals(ts[index])) {//不匹配时
534                 break;
535             } else {
536                 continue;
537             }
538         }
539         temp3 = null;
540         temp1 = null;
541         temp2 = null;
542         return num;
543     }
544
545     /**
546      * 查找类似“表格|显示,表格|描述,表格|类型,表格|长度”中在表格所属的最大行数
547      *
548      * @param String colName---列名称
549      * @param String gridcaption---列名称的组合串,在getMaxColumnNum方法生成
550      */
551     private synchronized int getColumnNumOf(String colName, String gridcaption, int index, TreeGridDTO dto) {
552         int num = 0;
553         int temp = 0;//临时值
554         String temp1 = colName;//列名
555         String temp2 = dto.tempStr;//列串
556         String[] temp3 = temp2.split("&#039;");//分割为数组
557         String temp4 = "";//保存前一个值
558         int j = 0;
559         for (int k = 0; k < temp3.length; k++) {
560             String s = temp3[k];
561             String[] ts = s.split("\\|");
562             if (ts.length < index + 1) continue;
563             if (ts[index].equalsIgnoreCase(temp1) && (temp4 == "" || temp4.equalsIgnoreCase(ts[index]))) {
564                 temp = ts.length;
565                 temp4 = ts[index];
566                 if (temp > num) num = temp;
567             } else if (temp4 != "" && !temp4.equalsIgnoreCase(ts[index])) {//不匹配时
568                 break;
569             } else {
570                 continue;
571             }
572         }
573         temp3 = null;
574         temp1 = null;
575         temp2 = null;
576         return num;
577     }
578
579     /**
493df4 580      * 判断当前生成的表格是属于列表还是明细,因为只有是明细表的标题才需要加必填星号
F 581      *
582      * @param dto
583      * @return
584      */
585     private String getDetailGridTitle(TreeGridDTO dto, boolean keyInput, String id) {
586         if (!keyInput) return " ";
587         boolean isDeatail = false;
588         switch (dto.winType) {
589             case 1:
590             case 10:
591             case 3:
592             case 7:
593             case 301:
594             case 302:
595             case 304:
596                 isDeatail = true;
597                 break;
598             case 9:
599                 if (dto.conNum == 1) isDeatail = true;
600                 break;
601             case 15:
602                 if (dto.conNum > 0) isDeatail = true;
603                 break;
604             case 497:
605                 if (dto.conNum == 1) isDeatail = true;
606                 break;
607         }
608         return isDeatail ? (id.toLowerCase() + "HtmlPostfix=\"&lt;span style='color:white;'> *&lt;/span>\"") : " ";
609     }
610
611     /**
a6a76f 612      * 动态根据表描述字段的如下规律
F 613      * 表格|显示|表格|描述|表格|类型|表格|长度
614      * 外表|表号|外表|类型|外表|清空关联
615      * 生成跨行跨列的表头格式生成
616      * 首先是查找最大跨行数,由最大跨行数得到需要输出多少行
617      * 再一行行的输出每列信息,在每列输出时需要根据表描述字段决定跨行跨列设置
618      * 全局控制都是根据分割表描述字段所得的数组来处理
619      *
620      * @return String 表头html代码
621      **/
622     private void createCoumtHeader(TreeGridDTO dto) throws DataAccessException { //生成自定义表头
623         StringBuilder gridHeader = new StringBuilder();//表头html
624         int num = getMaxColumnNum(dto);//返回需要分行,分列的值
625         this.fillColumnNumTree(num, dto);
626         String temID = "";//保存之前字段描述值,以便当下一次与这个值相等时可以跳过不输出
627         String temPa = "";//temID的上级值,区分{外表|接收数据|自身字段,外表|条件|自身字段 }情况
628         String top = "";
629         String[] str = dto.tempStr.split("&#039;");//填充后的列格式
630         for (int i = 0; i < num; i++) {//循环分行取值
631             int k = 0;
632             //dto.gfields.first();
633             if (dto.gantt && !dto.isList && i == 0)
634                 gridHeader.append("<Header id='id' ");
635             else
636                 gridHeader.append("<Header " + ((i == num - 1) ? "id='Header' " : " Spanned='1' "));
637             //do{
638             for (int y = 0; y < dto.gfields.size(); y++) {
639                 Map<String, Object> map = dto.gfields.get(y);
640                 if (GridUtils.prossRowSetDataType_Boolean(map, "ShowOnGrid")) {//设置为隐藏
641                     String dec = GridUtils.prossRowSetDataType_String(map, "gridcaption");//表格描述
642                     String fieldname = GridUtils.prossRowSetDataType_String(map, "fieldname");//字段描述
493df4 643                     boolean keyInput = GridUtils.prossRowSetDataType_Boolean(map, "KeyInput");//是否必填
176de8 644                     String id = (map.get("fieldid") + "").trim();//字段名,去掉空格
a6a76f 645                     if (id.equalsIgnoreCase("id") && (!dto.gantt)) id = "_ycid_";//避免id与格线中的id冲突而增加,页面返回时需要转换
F 646                     String temp = (dec == null || "".equalsIgnoreCase(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
647                     if (temp == null || temp == "" || temp.length() == 0) temp = id;
648                     String[] capf = temp.split("\\|");//分割字符串,外表|接收数据|外表字段    去掉 .replaceAll("'", "\\\\'"),因为用""括进来了,为的就是动态标题传参数有单引号的情况
649                     String[] cap = str[k].split("\\|");
650                     if (cap[i].trim().indexOf("!") == 0) {//动态标题,替换参数
651                         if (k > 0 && dto.setInfo_dy.length() > 1 && cap[i].indexOf("@") > -1) dto.setInfo_dy += ",";
652                         this.prossIntoSessionForFilter_dy(cap[i], dto);
653
654                     }
655                     k++;
656                     boolean flag = false;//标记是否需要隐藏
657                     String show = "";
658                     String hidden = "";
659                     int colNum = 0;
660                     if (i > 0 && cap.length > 1 && i < cap.length) {
661                         if (!cap[i].equalsIgnoreCase("¥") && temID.equalsIgnoreCase(cap[i]) && temPa.equalsIgnoreCase(cap[i - 1]) && top.equalsIgnoreCase(cap[0])) {
662                             continue;//只输出一个,表格|显示,表格|描述,表格|类型,表格|长度
663                         }
664                     }
665                     try {
666                         colNum = this.getColumnNum(cap[i], dto.tempStr, i, i == 0 ? cap[0] : cap[i - 1], k, dto);//取得跨列值
667                         if (colNum == 0) flag = true;//表示存在¥,则不需要显示
668
493df4 669                         show = id.toLowerCase() + "=\"" + this.getFormCap(cap[i]) + "\" " + getDetailGridTitle(dto, keyInput, id) + id.toLowerCase() + "Align='Center' " + (colNum > 1 ? (" " + id.toLowerCase() + "Span='" + colNum + "' ") : "");
a6a76f 670                         hidden = id.toLowerCase() + "Visible='-1' ";
F 671                         if (flag)
672                             gridHeader.append(hidden);
673                         else
674                             gridHeader.append(show);
675                     } catch (Exception e) {
676                         throw new ApplicationException(dto.formID + "-字段设置有问题-" + id);
677                     }
678                     flag = false;
679                     top = capf[0];//取得第一个字段值
680                     if (i < capf.length) temID = capf[i];
681                     if (i > 0 && i < capf.length) temPa = capf[i - 1];//得到上级值
682                 }
683             }
684             //while(dto.gfields.next());
685             if (!dto.isList && dto.gantt) gridHeader.append("  G='Gantt'");
686             gridHeader.append(" />\n");
687         }
688         try {
689             if (gridHeader.length() > 0) dto.header = gridHeader.substring(0, gridHeader.length() - 1);
690
691         } catch (Exception e) {
692             throw new ApplicationException("生成格线表头出错,因为格线所有栏位都设为不显示");
693         } finally {
694             gridHeader = null;
695             dto.gfields = null;
696         }
697     }
698
699     ;
700
701     /**
702      * 根据当前值是否有特定标记@day,@moth,@year,等。以替换成真实值
703      */
704     private synchronized String getFormCap(String id) {
705         String s = id.toLowerCase().trim();
706         String[] day = null;
707         if (s.indexOf("@day") > -1) {//日
708
709             if (s.indexOf("+") > -1) {
710                 day = s.split("\\+");
711             } else if (s.indexOf("-") > -1) {//-号
712                 day = s.split("\\-");
713                 day[1] = "-" + day[1];
714             } else {
715                 day = s.split("\\+");
716             }
717             if (day.length > 1) {
718                 return "#GT.getDay(" + Integer.parseInt(day[1]) + ")";
719             } else {
720                 return "#GT.getDay(0)";
721             }
722
723         } else if (id.toLowerCase().indexOf("@month") > -1) {//月
724             if (s.indexOf("+") > -1) {
725                 day = s.split("\\+");
726             } else if (s.indexOf("-") > -1) {//-号
727                 day = s.split("\\-");
728                 day[1] = "-" + day[1];
729             } else {
730                 day = s.split("\\+");
731             }
732             if (day.length > 1) {
733                 return "#GT.getMonth(" + Integer.parseInt(day[1]) + ")";
734             } else {
735                 return "#GT.getMonth(0)";
736             }
737         } else if (id.toLowerCase().indexOf("@quarter") > -1) {//季
738             return id;
739         } else if (id.toLowerCase().indexOf("@year") > -1) {//年
740
741             if (s.indexOf("+") > -1) {
742                 day = s.split("\\+");
743             } else if (s.indexOf("-") > -1) {//-号
744                 day = s.split("\\-");
745                 day[1] = "-" + day[1];
746             } else {
747                 day = s.split("\\+");
748             }
749             if (day.length > 1) {
750                 return "#GT.getYear(" + Integer.parseInt(day[1]) + ")";
751             } else {
752                 return "#GT.getYear(0)";
753             }
754         } else {
755             return id.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
756         }
757
758     }
759
760     /**
761      * 取得自动编号的类型
762      */
763     private synchronized List getAutoCodeType(int formid, String dbid) {
764         try {
765             SpObserver.setDBtoInstance("_" + dbid);
766             String sql = "select precodetype,codelength,preFixcode from gform where formid=?";
767             return gridService.getJdbcTemplate().queryForList(sql, new Object[]{formid});
768         } finally {
769             SpObserver.setDBtoInstance();
770         }
771     }
772
773     private List getCodeInfo(int formid, String dbid) {
774         try {
775             SpObserver.setDBtoInstance("_" + dbid);
776             String sql = "select g.formid,g.codelength,g.preFixcode,g.precodetype,c.Formtype,c.Curcode,c.Fieldid from gform g,_sysautocode c where g.formid=c.formid and g.formid=?";
777             return gridService.getJdbcTemplate().queryForList(sql, new Object[]{formid});
778         } finally {
779             SpObserver.setDBtoInstance();
780         }
781     }
782
783     /**
784      * 查找字符串中是否存在指定的内容
785      * 返回需要替换的字段名
786      */
787     private synchronized String getString(String str) {
788         Pattern p = Pattern.compile("@\\w+");
789         String s = "";
790         java.util.regex.Matcher propsMatcher = p.matcher(str != null ? str.toLowerCase() : "");
791         while (propsMatcher.find()) {
792             s += propsMatcher.group() + ";";
793         }
794         return s;
795     }
796
797     /**
798      * 填充参数值列表,下拉列表控件时,需要填充数据,用作2类型控件
799      *
800      * @param type 控件类型
801      * @param ft   --参数号
802      * @return
803      */
804     private StringBuilder fillFT(int type, int ft, String sql, TreeGridDTO dto) {
805         StringBuilder sb = new StringBuilder();
806         SqlRowSet rst = null;
0e86df 807         String enumMenu="";
a6a76f 808         try {
F 809             SpObserver.setDBtoInstance("_" + dto.dbid);
810             rst = gridService.getFTData(ft);
811         } finally {
812             SpObserver.setDBtoInstance();
813         }
814         sb.append("");
815         boolean flag = false;
a58a39 816         if (type == 31 || type == 2 || type == 35 || type == 43 || type == 30 || type == 32|| type == 46) {//2,类型,31类型下拉列表控件时,为三种情况,一个是静态sql,一个是动态sql,需要用页面的值替换再用ajax提交返回,另一个就是表号生成
a6a76f 817             StringBuilder id = new StringBuilder();
F 818             StringBuilder value = new StringBuilder();
819             if (type != 30 && type != 32) {
125603 820             if(dto.isSuppressBlankLineForDropDown==0) {
F 821                 //只有为0才需要增加空白列
a6a76f 822                 id.append("| ");
F 823                 value.append("| ");
125603 824             }
a6a76f 825             }
F 826             try {
827                 if (sql != null && sql != "" && sql.length() > 0) {//有sql参数
828                     if (sql.indexOf("&") > -1 || sql.indexOf("@") > -1) {//表示需要在页面替换参数,取页面值,ajax提交填充
829                         this.prossIntoSession(getString(sql), dto);
830                         sb.append("dySql=\"" + sql + "\"");
831                     } else {
832                         if (type == 2) {
833                             SqlRowSet set = null;
834                             try {
835                                 SpObserver.setDBtoInstance("_" + dto.dbid);
836                                 set = gridService.getJdbcTemplate().queryForRowSet(sql);
837                             } finally {
838                                 SpObserver.setDBtoInstance();
839                             }
840                             if (!set.wasNull()) {
0e86df 841                                 enumMenu=getEnumMenu(dto,set,null);
a6a76f 842                                 while (set.next()) {
F 843                                     id.append("|").append(this.replaceBlank(set.getString(1)));
844                                     value.append("|").append(this.replaceBlank(set.getString(2)));
845                                 }
846                                 set = null;
847                             }
848                         } else {//31,35
849                             sb.append("dySql=\"" + sql + "\"");
850                         }
851                     }
852
853
854                     flag = true;
855                 }
856                 if (!flag) {
857                     if (!rst.wasNull()) {
0e86df 858                         enumMenu=getEnumMenu(dto,rst,"interValue");
a6a76f 859                         while (rst.next()) {
F 860                             id.append("|").append(this.replaceBlank(rst.getString("interValue")));
a58a39 861                             if(type==46){
F 862                                 value.append("|").append("<div style=&quot;background:").append(rst.getString("interValue")).append("&quot;>").append("&nbsp;</div>");
863                             }else {
864                                 value.append("|").append(this.replaceBlank(rst.getString("dictvalue")));
865                             }
a6a76f 866                         }
F 867                     }
868                 }
869
870             } catch (Exception e) {
493df4 871                 throw new ApplicationException(e.getMessage());
a6a76f 872             } finally {
F 873                 rst = null;
874             }
2f7b5e 875             if (type == 31) {
0e86df 876                 if (ft != 0) {//有表号才会有新增选项
a6a76f 877                     sb.append("  EnumKeys='").append(id.toString() + "|-add-").append("' Enum='").append(value.toString() + "|&lt;&lt;新增&gt;&gt;").append("' ");
0e86df 878                 } else {//当没表号表示不需要新增选项
a6a76f 879                     sb.append("  EnumKeys='").append(id.toString()).append("' Enum='").append(value.toString()).append("' ");
0e86df 880                     if (org.apache.commons.lang3.StringUtils.isNotBlank(id.toString()) && org.apache.commons.lang3.StringUtils.isNotBlank(enumMenu)) {
F 881                         sb.append("EnumMenu=\"").append(enumMenu).append("\" ");
882                     }
883                 }
2f7b5e 884             }else {
a6a76f 885                 if (type != 35) {
F 886                     sb.append("  EnumKeys='").append(id.toString()).append("' Enum='").append(value.toString()).append("' ");
2f7b5e 887                     if(type==2) {//43类型增加EnumMenu输出会有问题
F 888                         if (org.apache.commons.lang3.StringUtils.isNotBlank(id.toString()) && org.apache.commons.lang3.StringUtils.isNotBlank(enumMenu)) {
889                             sb.append("EnumMenu=\"").append(enumMenu).append("\" ");
890                         }
0e86df 891                     }
a6a76f 892                 }
F 893             }
894             if (type == 35) {//可编辑列表,值与键需要一样
493df4 895                 sb.append("  Button='Defaults' Defaults='").append(("|".equals(value.toString().trim()) ? "" : value.toString())).append("' ");
a6a76f 896             }
F 897             if (type == 43 || type == 30) {
898                 sb.append("  Range='1' ");
899             }
900
901             id = null;
902             value = null;
903         }
904         return sb;
905     }
906
0e86df 907     /**
F 908      * 生成下拉列表的enumMenu,主要是为了能显示-号的情况
909      * @param dto
910      * @param rst
911      * @return
912      */
913     private String getEnumMenu(TreeGridDTO dto,SqlRowSet rst,String colName){
914         String menu="{Items:[";//{Value:''},{Value:'-',Text:'-'},{Value:'+',Text:'+'}
915     StringJoiner joiner=new StringJoiner(",");
916     if(dto.isSuppressBlankLineForDropDown==0){
917         //有留白列
918         joiner.add("{Value:'',Text:''}");
919     }
920     while (rst.next()) {
921         if(colName==null)
922             joiner.add("{Value:'"+rst.getString(1)+"',Text:'"+rst.getString(2)+"'}");
923         else
924             joiner.add("{Value:'"+rst.getString(colName)+"',Text:'"+rst.getString("dictvalue")+"'}");
925
926     }
927     rst.beforeFirst();
928     return menu+=joiner.toString()+"]}";
929 }
a6a76f 930     private synchronized String setJsName(TreeGridDTO dto) {
F 931         return "grid_" + dto.formID + "_" + dto.winType + ".xml";
932     }
933
934     /**
935      * 生成页面时需要检查的关键字段名,避免生成格线有问题
936      */
937     private synchronized boolean checkKey(String id) {
938         String[] keys = {"_ycid_", "added", "Deleted", "Changed", "Moved", "Panel", "Prev", "Next", "id"};
939         for (String k : keys) {
940             if (k.equalsIgnoreCase(id)) {
941                 return true;
942             }
943         }
944         return false;
945     }
946
947     private String getFileter(TreeGridDTO dto) {
948         StringBuffer temp = new StringBuffer();
949         temp.append("");
950         try {
951             // dto.gfields.first();
952             // do{
953             for (int y = 0; y < dto.gfields.size(); y++) {
954                 Map<String, Object> map = dto.gfields.get(y);
955                 String top = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SeekGroupID") + "".toLowerCase());
956                 String sf = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkSPremissField") + "".toLowerCase());
957                 String ft = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT") + "".toLowerCase());
958                 String initValue = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "initValue") + "");
959
960                 if (top.length() > 0)
961                     temp.append(top).append(";");
962                 if (sf.length() > 0)
963                     temp.append(sf).append(";");
964                 if (ft.length() > 0)
965                     temp.append(ft).append(";");
966                 if (initValue.length() > 0)
967                     temp.append(initValue).append(";");
968             }
969             //while(dto.gfields.next());
970         } catch (ArrayIndexOutOfBoundsException e) {
971             throw new ApplicationException("读取不到" + dto.formID + "在9802里面的字段信息,请检查9802是否已做了相关设置");
972         }
973         return temp.toString();
974     }
975
976     /**
977      * sugg--列表显示的字段
978      * backFilds-取外表字段,以便选择后返回哪些值。
979      * tp ---自表字段,返回给哪些字段
980      */
981     public String getSuggestFilds(String fromid, int type, String sugg, String backFilds, String to, String form, boolean one, int rod, String dbid, String sf, String df) {//取得需要的字段名称
982         int flg = this.setGetPrivaryTable(type);
5f1f90 983 //        StringBuffer sb = new StringBuffer(); //舍弃这属性 xin 2021-3-23 14:42:37
a6a76f 984         StringBuffer exps = new StringBuffer();
9c5581 985         String sql = " select FieldID,fieldname,GridCaption,ShowOnGrid,showFieldValueExpression,displayformat,isnull(GridControlType,0) as GridControlType from gfield where formid=? and HeadFlag=?  order by statisid asc";
a6a76f 986         List<Map<String, Object>> list = null;
F 987         try {
988             SpObserver.setDBtoInstance("_" + dbid);
989             list = gridService.getSimpleJdbcTemplate().queryForList(sql, new Object[]{fromid, flg});
990         } finally {
991             SpObserver.setDBtoInstance();
992         }
993         String[] tem = sugg.replaceAll(",", ";").split(";");
994         int i = 0;
995         String str = "";//保存哪些字段是隐藏的
996
5f1f90 997         //下面添加的titleLis属性用来处理层的标题 xin 2021-3-23 14:39:52
493df4 998         List<Map<String, Object>> titleLis = new ArrayList<>();
a6a76f 999         for (String s : tem) {
F 1000             for (Map<String, Object> map : list) {
b9e8fc 1001                 if (s.trim().equalsIgnoreCase((String) map.get("FieldID"))) {
493df4 1002                     Map<String, Object> titleMap = new HashMap<>();
5f1f90 1003                     titleMap.put("field", s.toLowerCase());
X 1004                     titleMap.put("title", map.get("fieldname") == null
1005                             ? (String) map.get("GridCaption") : (String) map.get("fieldname"));
b2d631 1006 //                    titleMap.put("width", 100);
5f1f90 1007                     titleMap.put("align", "center");
9c5581 1008                     titleMap.put("displayformat", (String) map.get("displayformat"));
F 1009                     int controlType=GridUtils.prossRowSetDataType_Int(map,"GridControlType");
1010                     titleMap.put("controlType", controlType);
5f1f90 1011                     if ((Integer) (map.get("ShowOnGrid") == null ? 0 : map.get("ShowOnGrid")) == 1) {
X 1012 //                        sb.append("<th width=\"\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
493df4 1013                     } else {
5f1f90 1014                         if (str == "") {
a6a76f 1015                             str += map.get("FieldID");
493df4 1016                         } else {
a6a76f 1017                             str += ";" + map.get("FieldID");
5f1f90 1018                         }
X 1019 //                        sb.append("<th width=\"\" style=\"display:none;\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
1020                         titleMap.put("hide", true);//隐藏字段
a6a76f 1021                     }
5f1f90 1022                     titleLis.add(titleMap);//获取标题信息
a6a76f 1023                     //取权限表达式输出到页面
F 1024                     String strexp = GridUtils.prossRowSetDataType_String(map, "showFieldValueExpression");
1025                     if (!"".equalsIgnoreCase(strexp)) {
1026
1027                         if (exps.length() == 0)
1028                             exps.append(s + "|").append(strexp).append(";");
1029                         else
1030                             exps.append(";").append(s + "|").append(strexp);
1031                     }
1032
1033                     break;
1034                 }
1035             }
1036
1037             i++;
1038         }
1039         String strexps = "";
1040         try {
1041             strexps = new String(YCBase64.encode(exps.toString().getBytes()));
1042         } catch (Exception e) {
1043             // TODO Auto-generated catch block
1044             e.printStackTrace();
1045         }
1046         String json = "{\"data\":\";" + str + ";\",\"backfilds\":\"" + backFilds + "\",\"sf\":\"" + sf + "\",\"df\":\"" + df + "\",\"to\":\"" + to + "\",\"form\":\"" + form + "\",\"exp\":\"" + strexps + "\",\"one\":\"" + (one ? 1 : 0) + "\"}";
5f1f90 1047         //        注释这个返回值,重新返回一个 xin 2021-3-23 14:32:35
X 1048 //        return "<div id=\"T_" + fromid + "_10" + rod + "div\" style=\"z-index:9999;display:none;position:absolute;height:300px;overflow:auto;\"><table  data='" + json + "' id=\"T_" + fromid + "_10" + rod + "CDiv\" class=\"hovertable\"><tr>" +
1049 //                sb.toString() + "</tr></table></div>\t\n";
1050         return "<div id=\"T_" + fromid + "_10" + rod + "div\" style=\"z-index:9999;display:none;position:absolute;height:320px;overflow:auto;\">" +
493df4 1051                 "<table  data-datas=\"" + json.replaceAll("\"", "'") + "\" data-title=\"" + GridUtils.toJson(titleLis).replaceAll("\"", "'") + "\"  " +
5f1f90 1052                 "id=\"T_" + fromid + "_10" + rod + "CDiv\" lay-filter=\"T_" + fromid + "_10" + rod + "CDiv\" class=\"hovertable\">" +
X 1053                 "</table></div>\t\n";
a6a76f 1054     }
F 1055
1056     /**
1057      * 处理9802里面设置了取值的字段但又不需要显示的所有字段
1058      * 针对超链接的参数进行处理
1059      */
1060     private Map<String, String> prossDisable(TreeGridDTO dto) {
1061         Map<String, String> map = new HashMap<String, String>();
1062         //dto.gfields.first();
1063         //do{
1064         for (int y = 0; y < dto.gfields.size(); y++) {
1065             Map<String, Object> map1 = dto.gfields.get(y);
1066             String ft = GridUtils.prossRowSetDataType_String(map1, "HyperlinkFT");
1067             String type = GridUtils.prossRowSetDataType_String(map1, "HyperlinkFTFormType");
1068             String field = GridUtils.prossRowSetDataType_String(map1, "HyperlinkSPremissField");
1069             String filter = GridUtils.prossRowSetDataType_String(map1, "HyperlinkEFilter");
1070             pullValue(map, ft);
1071             pullValue(map, type);
1072             pullValue(map, field);
1073             pullValue(map, filter);
1074
1075         }
1076         //while(dto.gfields.next());
1077         return map;
1078
1079     }
1080
1081     private void pullValue(Map<String, String> m, String ft) {
1082         if (ft != null && !"".equalsIgnoreCase(ft)) {
1083             ft = ft.replaceAll(",", ";");
1084             String[] str = ft.split(";");
1085             for (String s : str) {
1086                 m.put(s, "1");
1087             }
1088         }
1089     }
1090
1091     /**
1092      * grid定义数据集及列定义
1093      */
1094     private void gridConfig(String root, TreeGridDTO dto) throws DataAccessException {
1095
1096         StringBuilder left = new StringBuilder();//leftcols定义
1097         StringBuilder cols = new StringBuilder();//列定义json
1098         StringBuilder formn = new StringBuilder();//自定义公式
1099         StringBuilder values = new StringBuilder();//初始值
1100         StringBuilder sumfu = new StringBuilder();//统计公式
1101         StringBuilder valExp = new StringBuilder();//权限控制值
1102         StringBuilder cssExp = new StringBuilder();//css控制值
1103         StringBuilder tipsExp = new StringBuilder();//提示信息
1104         StringBuilder msgInfo = new StringBuilder();//错误提示信息
1105         StringBuilder exportInfo = new StringBuilder();//保存导出字段
1106         StringBuilder rowCopys = new StringBuilder();//保存复单时排除字段,读9802
1107         //StringBuilder exportTitle=new StringBuilder();//保存导出文件名称,在生成下载的excel文件时候用到
1108
1109         //List<Integer>  sugId=new ArrayList<Integer>();//保存生成div的功能号,以便排队生成相同的div
1110         dto.filter = new StringBuilder();//过滤设置,读9802
1111         dto.filter.append("<Filter  id=\"Filter1\" Height=\"22\" ");
1112         //
1113         exportInfo.append(dto.formname.replaceAll("-", "_")).append("-");//取得功能号名称
1114         StringBuilder SumFieldInfo = new StringBuilder();
1115         int rod = 0;//42类型生成的索引值,由于分布式部署的原因,需要确保生成的索引值都是一样才能在页面加载时,不管加载到那一个节点也是正确的
1116         try {
1117             int index = 0;//标记当前位置
1118             String firstID = "";//第一个字段名称
1119             SqlRowSetMetaData metaData = null;
1120             if (dto.winType != 18 && dto.winType != 38 && dto.winType != 19) {
1121                 try {
1122                     SpObserver.setDBtoInstance("_" + dto.dbid);
1123                     metaData = gridService.getMetaData(dto.table.split("\\|")[0]);//元数据
1124                 } finally {
1125                     SpObserver.setDBtoInstance();
1126                 }
1127             }
1128             List typeInfo = null;
1129             try {
1130                 SpObserver.setDBtoInstance("_" + dto.dbid);
1131                 typeInfo = gridService.getColumnsTypeInfo(dto.table.split("\\|")[0]);
1132             } finally {
1133                 SpObserver.setDBtoInstance();
1134             }
1135             Map<String, String> len = new HashMap<String, String>();
1136             if (!dto.isList) {//只有是有明细表才需要有长度限制
1137                 String lengthInfo = null;
1138                 try {
1139                     SpObserver.setDBtoInstance("_" + dto.dbid);
1140                     lengthInfo = gridService.getTypeLengthInfo(dto.table.split("\\|")[0]);
1141                 } finally {
1142                     SpObserver.setDBtoInstance();
1143                 }
1144                 if (lengthInfo != null) {
1145                     String[] tem = lengthInfo.split(",");
1146                     for (String s : tem) {
1147                         String[] ss = s.split("-");
1148                         if (ss.length < 3)
1149                             len.put(ss[0].toLowerCase(), ss[1]);
1150                         else
1151                             len.put(ss[0].toLowerCase(), ss[2]);
1152                     }
1153                 }
1154             }
1155             //String fileter=this.getFileter();//保存需要隐藏输出的字段,只取自身字段
1156             boolean iscopy = false;//标记当前9802是否有复制时排除字段,为了兼用不存在出错的情况
1157             boolean isref = false;//标记当前9802是否有自动刷新和加载到页面的字段,为了兼用不存在出错的情况
1158             int fumIndex = 0;//标记导出时候字段位置
d89677 1159             int tabColIndex = 0;//标记导出字段在汇总列的位置
a6a76f 1160             Map<String, String> vMap = this.prossDisable(dto);
F 1161             //dto.gfields.first();
1162             //    do{
1163             for (int i = 0; i < dto.gfields.size(); i++) {
1164                 boolean fileterID = false;//标记为需要隐藏输出
1165                 Map<String, Object> map = dto.gfields.get(i);
1166 //                  //----处理动态sql
1167 //            Map<String,String> map9801= SqlFormatUtils.createSQLFormat(map,9801);
1168 //            Map<String,String> map9802= SqlFormatUtils.createSQLFormat(map,9802);
1169 //                //-----
176de8 1170                 String id = org.apache.commons.lang3.StringUtils.trim(GridUtils.prossRowSetDataType_String(map, "fieldid"));//字段名
a6a76f 1171                 String dec = GridUtils.prossRowSetDataType_String(map, "gridcaption");//表格描述
F 1172                 String fieldname = GridUtils.prossRowSetDataType_String(map, "fieldname");//字段描述
1173                 String temp = (dec == null || "".equalsIgnoreCase(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
1174                 if (this.checkKey(id.toLowerCase())) {
1175                     msgInfo.append("警告:格线所用字段不能使用[" + id + "]关键字!");
1176                 }
1177                 if (id.equalsIgnoreCase("id") && (!dto.gantt)) id = "_ycid_";//避免id与格线中的id冲突而增加,页面返回时需要转换
1178                 if (temp == null || "".equalsIgnoreCase(temp) || temp.length() == 0) temp = id;
1179                 if (firstID == "") firstID = id;
1180                 int type = GridUtils.prossRowSetDataType_Int(map, "gridcontroltype");//表格单元格控件类型
1181                 int ft = GridUtils.prossRowSetDataType_Int(map, "ft");//外表|表号
1182                 int wiType = GridUtils.prossRowSetDataType_Int(map, "FTFormType");//外表|窗体类型
1183                 int width = GridUtils.prossRowSetDataType_Int(map, "GridLength");//单元格宽度
1184                 if (width == 0) {
1185                     width = 100;
1186                 } else {
1187                     width *= 10;
1188                 }
1189                 if (width < 100 && width > 50) width = 100;
1190                 if (width < 50) width = 50;
1191                 int calcuField = GridUtils.prossRowSetDataType_Int(map, "calcuField");//自定义公式|1,表示是否当前字段变化后需要重新计算包括有这个字段的所有公式内容
1192                 String fua = GridUtils.prossRowSetDataType_String(map, "formula");//自定义公式
1193                 if (fua != null && !"".equalsIgnoreCase(fua)) {
1194                     this.prossIntoSessionForFilter(fua, dto);
1195                 }
1196                 String value = GridUtils.prossRowSetDataType_String(map, "initValue");//初始值
1197                 String emptyrefdata = GridUtils.prossRowSetDataType_String(map, "emptyrefdata");//清空关联
1198                 int SumField = GridUtils.prossRowSetDataType_Int(map, "SumField");//统计方式
1199                 String funclinkname = GridUtils.prossRowSetDataType_String(map, "funclinkname");//自定义统计公式
1200                 boolean activefuns = GridUtils.prossRowSetDataType_Boolean(map, "activefuns");//公式是否生效
1201                 boolean ShowOnGrid = GridUtils.prossRowSetDataType_Boolean(map, "ShowOnGrid");//是否显示
1202                 boolean KeyInput = GridUtils.prossRowSetDataType_Boolean(map, "KeyInput");//是否必录
1203                 String passwordchar = GridUtils.prossRowSetDataType_String(map, "passwordchar");//是否为密码字符
1204                 String displayformat = GridUtils.prossRowSetDataType_String(map, "displayformat");//数字格式
1205                 String ef = GridUtils.prossRowSetDataType_String(map, "eFilter");
1206                 boolean readOnly = GridUtils.prossRowSetDataType_Boolean(map, "ReadOnly");//只读
1207                 boolean dataLink = GridUtils.prossRowSetDataType_Boolean(map, "DataLink");//感应字段
1208                 boolean uppercase = GridUtils.prossRowSetDataType_Boolean(map, "uppercase");//大写
1209                 String ValueExp = GridUtils.prossRowSetDataType_String(map, "showFieldValueExpression");//权限控制是否显示该值
1210                 String editStatus = GridUtils.prossRowSetDataType_String(map, "editStatus");//权限控制是否显示该值
1211                 boolean oneRec = GridUtils.prossRowSetDataType_Boolean(map, "return_one_record");//是否返回到单记录
1212                 boolean onlyOne = GridUtils.prossRowSetDataType_Boolean(map, "onlyOne");//只返回单条记录
1213                 String sqlScript = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SqlScript"));// 控件sql
1214                 String sqlWhere = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "sqlWhere"));// 下拉控件(31),编辑状态时需要附加这个条件
1215                 this.prossIntoSessionForFilter_dy(sqlWhere, dto);
1216                 boolean rowspan = GridUtils.prossRowSetDataType_Boolean(map, "rowSpan");//是否合并行
1217                 boolean isExport = GridUtils.prossRowSetDataType_Boolean(map, "isExport");//是否导出
1218                 boolean statisFlag = GridUtils.prossRowSetDataType_Boolean(map, "StatisFlag");//是否可查询
1219                 boolean cpltrow = GridUtils.prossRowSetDataType_Boolean(map, "copyfromlastrow");//插入时从上行复制
1220                 String cs = GridUtils.prossRowSetDataType_String(map, "stylecss");//css样式
1221                 String tips = GridUtils.prossRowSetDataType_String(map, "TipsExpression");
125603 1222                 int isSuppressBlankLineForDropDown = GridUtils.prossRowSetDataType_Int(map, "isSuppressBlankLineForDropDown");
a6a76f 1223                 valExp.append((ValueExp != null && !"".equalsIgnoreCase(ValueExp)) ? id + "|" + this.replaceBlank(ValueExp) + ";" : "");
F 1224                 cssExp.append((cs != null && !"".equalsIgnoreCase(cs)) ? id + "|" + this.replaceBlank(cs.replaceAll(";", "~")) + ";" : "");
1225                 tipsExp.append((tips != null && !"".equalsIgnoreCase(tips)) ? id + "|" + this.replaceBlank(tips.replaceAll(";", "~")) + ";" : "");
1226                 String cellAlign = GridUtils.prossRowSetDataType_String(map, "cellAlign");//单元格对齐属性
1227                 //int expTitle=GridUtils.prossRowSetDataType_Int(map,"exportTitle");//下载文件名称
1228                 String dataType = "";
1229                 int dIndex = 1;
1230                 if (metaData != null) {
1231                     dIndex = this.getType(metaData, id);//取得每个字段的数据类型,1数字 ,3字符,4日期
1232                     switch (dIndex) {
1233                         case 1:
1234                             dataType = "n";//数值
1235                             break;
1236                         case 3:
1237                             dataType = "s";//字符串
1238                             break;
1239                         case 4:
1240                             dataType = "d";//时间
1241                             break;
1242                     }
1243                 }
1244
1245                 int isAudit = 0;
1246                 //if(ShowOnGrid&&statisFlag)//可显示且可查询
1247                 setFilter(id.toLowerCase(), type, dto.filter, dIndex);
1248                 try {
1249                     if (!iscopy) {
1250                         boolean isCopyExclude = GridUtils.prossRowSetDataType_Boolean(map, "isCopyExclude");//复单时是否排除
1251                         if (isCopyExclude)
1252                             rowCopys.append(id.toLowerCase()).append(";");
1253                     }
1254                     //是否审计,1:
1255                     //表示当前字段分二种情况来处理,
1256                     //第一个情况是值没变化的 情况 下只作为后期审计查询的唯一条件,附加进有变化的审计字段的行,插入数据表
1257                     //第二个情况是值有变化的情况下,除了作为后期审计查询的唯一条件,附加进有变化的审计字段的行,也需要记录本身的新旧值变化的情况
1258                     //第三种情况是删行的情况下,也需要记录本身的新旧值变化的情况
1259                     //2:
1260                     //只作为有变化的情况的审计字段,记录新旧值插入数据表
1261                     isAudit = GridUtils.prossRowSetDataType_Int(map, "audit");
1262                 } catch (Exception e) {
1263                     iscopy = true;
1264                     isAudit = 0;
1265                 }
1266                 boolean isLoad = false;
1267                 try {
1268                     if (!isref) {
1269                         if (dto.order == 1//表示是列表的情况(很少存在需要取隐藏字段值的情况) by 2015-4-7 去掉这个限制
1270                                 && (type == 33 || type == 34 || type == 36 || type == 38 || type == 41))
1271                             isLoad = false;
1272                         else
1273                             isLoad = GridUtils.prossRowSetDataType_Boolean(map, "isLoad");//是否加载到页面
1274                     }
1275                     //在超接连中有参数,需要再判断是否需要加载到页面
1276                     if (vMap.containsKey(id.toLowerCase())) {
1277                         isLoad = true;
1278
1279                     }
1280                 } catch (Exception e) {
1281                     isref = true;
1282                 }
1283
1284                 if (cellAlign == null || cellAlign.length() == 0) cellAlign = "Center";
1285
1286                 if (!this.checkFormat(displayformat))
1287                     msgInfo.append(id + "-的格式设置不正确,存在连续二个分隔符,[" + displayformat + "]");
1288
1289                 if (displayformat != null && displayformat.contains("#"))
1290                     msgInfo.append(id + "-的格式设置不正确,不能以#号分隔,[" + displayformat + "]");
1291
1292                 //上面的都是读取9802的设置信息,接下来的才是逻辑处理
1293
1294                 boolean listShow = ((dto.order == 1//表示是列表的情况(很少存在需要取隐藏字段值的情况) by 2015-4-7 去掉这个限制
1295                         // &&(type==33||type==34||type==36||type==38||type==41)
1296                         && (dto.winType == 9 || dto.winType == 15 || dto.winType == 17 ||
1297                         dto.winType == 499 || dto.winType == 497)
1298                 )) ? true : false;
1299                 //增加作为主键时,但没勾选上加载到页面时,也需要生成出来。
1300                 boolean isprimeKey = false;
1301                 if ((";" + dto.primeKey.toLowerCase()).contains(";" + id.toLowerCase() + ";"))
1302                     isprimeKey = true;//判断是主键,不管有没选上加载到页面都需要生成到页面
1303
1304                 if (!isprimeKey && (!isLoad || listShow)) {//不加载到页面或是列表的情况
1305                     if ((!isref && !isLoad
1306                             && !id.equalsIgnoreCase("doccode")//这二个字段特殊,需要区别对待,需要取出来
1307                             && !id.equalsIgnoreCase("docdate"))
1308                             //||
1309                             //(!ShowOnGrid&&listShow)//表示不选显示,但又是列情的情况则不需要理会是否加载到页面的选项,也就是在列表的情况下,不选显示的优先级高
1310                             ||
1311                             (dto.winType != 18 && !dataLink && !ShowOnGrid)
1312                     ) continue;//条件为在9802中设置不显示且是在明细表的情况下才输出显示
1313
1314
1315                 }
1316                 //检查当前是否有会计科目设置
1317                 if (!this.isNullOrEmptry(dto.glcodefield)) {
1318                     if (id.toLowerCase().matches("cv\\d{1}") || id.toLowerCase().matches("cv\\d{1}name")) {
1319                         type = -3;//会计核算之用
1320                     }
1321                 }
1322
1323                 if (dto.order == 1 && "".equalsIgnoreCase(dto.orderFiled)) {//排序字段
1324                     if (id.equalsIgnoreCase("doccode")) {
1325                         dto.orderFiled = id + " desc";
1326                     }
1327                     if (id.equalsIgnoreCase("docdate")) {
1328                         dto.orderFiled = dto.orderFiled.length() == 0 ? id + " desc" : "," + id + " desc";
1329                     }
1330                 } else if (dto.order == 2 && "".equalsIgnoreCase(dto.orderFiled)) {
1331                     if (id.equalsIgnoreCase("docitem"))
1332                         dto.orderFiled = id + " asc";
1333                 }
1334                 if (!dataLink) {//不感应但可能数据库存在有字段
1335                     if (gridService.getColumnInfo(dto.table, id.toLowerCase()) == 1) {//存在,表示要在页面显示出来,但在新增,修改时需要过滤
1336                         dataLink = true;
1337                         dto.columns = id.toLowerCase() + ",";
1338                     }
1339                 }
1340
493df4 1341                 if (fua != null && !fua.equalsIgnoreCase("") && activefuns && calcuField != 0) {
a6a76f 1342                     formn.append(id.toLowerCase()).append("@p@").append(fua).append(":");
F 1343                 }
1344                 if (value != null && !value.equalsIgnoreCase("")) {//自动编号功能
1345                     if (value.equalsIgnoreCase("autocode")) {
1346                         List<Map> ct = this.getAutoCodeType(dto.formID, dto.dbid);
1347                         if (ct.size() == 0) msgInfo.append(id + "字段设置autocode,但没在9801进行相关设置!");
1348                         Map ma = ct.get(0);
7edaee 1349                         if (ma.get("precodetype") == null || ma.get("codelength") == null )
F 1350                             msgInfo.append(id + "-字段设置autocode,但没在9801对【precodetype,codelength】进行相关设置!");
1351
1352                        /* List<Map<String, Object>> li = this.getCodeInfo(dto.formID, dto.dbid);
1353                         if (li.size() == 0) msgInfo.append(id + "字段设置autocode,但没在[_sysautocode]表进行相关设置!");
1354                         Map map1 = li.get(0);*/
1355                         value = "autocode|" +dto.formID + "," + dto.winType + ",~"  ;
1356
1357                         /*if ((Integer) ma.get("precodetype") == 1) {
a6a76f 1358                             List<Map<String, Object>> li = this.getCodeInfo(dto.formID, dto.dbid);
F 1359                             if (li.size() == 0) msgInfo.append(id + "字段设置autocode,但没在[_sysautocode]表进行相关设置!");
1360                             Map map1 = li.get(0);
7edaee 1361                             value = "autocode|1|" + (Integer) map1.get("formid") + "," + (Integer) map1.get("Formtype") + "," + (String) map1.get("Fieldid") ;
a6a76f 1362                             map1 = null;
F 1363                         } else if ((Integer) ma.get("precodetype") == 2) {
1364                             try {
1365                                 SpObserver.setDBtoInstance("_" + dto.dbid);
1366                                 String table = gridService.getTreeTable(dto.formID);//TODO 暂时只取第一个,以后需要修正能处理多树的情况
1367                                 String[] strings = table.split(";");//TODO 以后去掉
1368                                 value = "autocode|2|~," + (Integer) ma.get("codelength") + ",#," + (String) ma.get("preFixcode") + "," + strings[0];
1369                             } finally {
1370                                 SpObserver.setDBtoInstance();
1371                             }
7edaee 1372                         }*/
a6a76f 1373                         values.append(id.toLowerCase()).append("#").append(value).append("&p&");
F 1374                         ma = null;
1375                     } else if (!value.equalsIgnoreCase("@now") && (value.indexOf("@") > -1 || value.indexOf("!") > -1)) {//替换成当前session的值
1376                         //@now 表示需要取当前时间,所以通过js调用
1377                         String temp1 = DBHelper.getValRep(value, false);
1378                         values.append(id.toLowerCase()).append("#").append(temp1).append("&p&");
1379                     } else
1380                         values.append(id.toLowerCase()).append("#").append(value).append("&p&");
1381                 }
d89677 1382                 if (SumField != 0) {
a6a76f 1383                     sumfu.append(id.toLowerCase()).append("#").append(SumField).append(":").append(funclinkname.replaceAll(",", "@p@")).append(",");//自定义公式有可能存在有,号需要处理
d89677 1384                     tabColIndex++;
F 1385                 }
1386                 if (isExport) {
1387                     if (displayformat != null && !displayformat.isEmpty()) {
1388                         exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append("#").append(displayformat.replaceAll("-", "~")).append(";");//-转成~是为了兼容之前的代码
1389                     }else {
1390                         exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append(";");
31400f 1391                         if(type==9||type==19||type==40){
F 1392                             exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")+"下载").append(";");
1393                         }
d89677 1394                     }
F 1395                     if (SumField > 0) {
1396                         SumFieldInfo.append(id.toLowerCase()).append("#").append(SumField).append("|").append(funclinkname).append("|").append(fumIndex).append("_T_").append(tabColIndex-1).append("|").append((displayformat != null && !displayformat.isEmpty()) ? displayformat.replaceAll("-", "~") : "0").append(";");
1397                     }
1398                     fumIndex++;
1399                 }
1400
1401                 if ((passwordchar != null && !"".equalsIgnoreCase(passwordchar) && "1".equalsIgnoreCase(passwordchar))) {
a6a76f 1402                     type = 101;
d89677 1403                 }
a6a76f 1404                 //控件类型
F 1405                 String typeName = Control.getTypeName(type == 0 ? 1 : type, typeInfo, id, displayformat, dto.winType);
1406                 StringBuilder sb = new StringBuilder();
1407                 if (type == 9 || type == 40) {
1408                     if (dto.picFild != null && dto.picFild != "") {
1409                         if (!dto.picFild.contains(id + ";"))
1410                             dto.picFild += id.toLowerCase() + ";";//保存是哪一个字段是图片字段
1411                     } else {
a58a39 1412                         dto.picFild += id.toLowerCase() + ";";//用来保存是哪一个字段是图片字段
a6a76f 1413                     }
F 1414                     sb.append(" CanFocus='0' ");//图片不需要取得焦点,避免在进入编辑状态时上传图片,返回不显示的问题
1415                     sb.append(" showType='" + (type == 9 ? 0 : 2) + "' ");//以后增加格线支持多附件显示需要用到,区别出到时应该取哪一个附件表(_sys_Attachment9,_sys_Attachment)的数据
1416                 }
a58a39 1417                 if (type == 2 || type == 35 || type == 31 || type == 43 || type == 30 || type == 32|| type == 46) {
125603 1418                     dto.isSuppressBlankLineForDropDown=isSuppressBlankLineForDropDown;
a58a39 1419                     if(!(type==46&&ft==0&&org.apache.commons.lang3.StringUtils.isBlank(sqlScript))){
F 1420                         //46控件没有2,31的设置选项则不用在这里生成下拉列表
1421                         sb = fillFT(type, ft, sqlScript, dto);//2类型
1422                         sb.append(" CanEmpty='0' ");
1423                         dto.foot2 += id.toLowerCase() + ";";//解决针对2,35类型有值时候统计列会显示出来的问题
1424                         dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
1425                     }
a6a76f 1426                 }
F 1427                 if (isAudit != 0) sb.append(" audit='").append(isAudit).append("'");//增加审计标记
a58a39 1428                 if (rowspan) {//合并行q
a6a76f 1429                     sb.append(" Spanned='1' ");//表示需要合并
F 1430                     dto.rowspanStr += id + ";";//保存需要合并的字段,加载时需要用到
1431                 }
a58a39 1432                 if (type == 3 || type == 31 || type == -3 || type == 42) { //3类型
a6a76f 1433                     String suggest = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SuggestFileds").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
F 1434                     String RelationField = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "RelationField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
1435                     if ("".equalsIgnoreCase(suggest) && type == 42)
1436                         msgInfo.append(temp + "字段为42类型控件,但列表字段[SuggestFileds]未设置");
1437                     //String path="/"+dto.verNo+ft+"/"+wiType+"/";
1438                     String path = "app#spellPath#" + ft + "/" + wiType + "/index.jsp";//#spellPath#在页面js替换, 解决定制页面生成时,数据源用了当前而造成移植到其他系统不对的问题
1439                     String top = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SeekGroupID").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
1440                     String form = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "FK").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
1441                     String sf = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "sPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
1442                     String df = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "dPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
493df4 1443                     int scanCodeField = GridUtils.prossRowSetDataType_Int(map, "ScanCodeField");//APP扫码|3类型控件扫码录入功能
F 1444                     if (StringUtils.isNotBlank(top) && StringUtils.isBlank(form)) {
1445                         throw new ApplicationException("【9802】里【" + id + "】设置了【外表|接收自身字段名】,则【外表|接收外表字段名】不能为空");
a6a76f 1446                     }
493df4 1447                     if (StringUtils.isNotBlank(sf) && StringUtils.isBlank(df)) {
F 1448                         throw new ApplicationException("【9802】里【" + id + "】设置了【外表|自身条件字段名】,则【外表|外表条件字段名】不能为空");
a6a76f 1449                     }
F 1450                     sb.append(" formid='").append(ft)
1451                             .append("' toParm=\"").append(top)
1452                             .append("\" formParm=\"").append(form)
1453                             .append("\" sField=\"").append(sf)
1454                             .append("\" dField=\"").append(df)
1455                             .append("\" id='").append(id.toLowerCase())
1456                             .append("' wtype='").append(wiType)
1457                             .append("' oneRec='").append(oneRec ? 1 : 0)
1458                             .append("' onlyOne='").append(onlyOne ? 1 : 0)
125603 1459                             .append("' isSuppressBlankLineForDropDown='").append(isSuppressBlankLineForDropDown)
a6a76f 1460                             .append("' sqlWhere=\"").append(sqlWhere)// by danaus 2019/12/20 15:28
F 1461                             .append("\" path='").append(path)
0b5ba8 1462                             .append("' scanCodeField='").append(scanCodeField)
a6a76f 1463                             .append(uppercase ? "'  uppercase='" + uppercase : "")
F 1464                             .append("' eFilter=\"").append(ef == null ? "" : (ef.replaceAll("'", "\\\\'").replaceAll("\n\t", ""))).append("\"");
1465                     String sug = "";
1466                     if (!"".equalsIgnoreCase(suggest)) {//加上自动补全功能
1467                         if (!"".equalsIgnoreCase(RelationField)) {//关联查询字段
1468                             sb.append(" refield='").append(RelationField + "'");
1469                         }
1470                         //去掉重复字段
1471                         String[] temp1 = suggest.toLowerCase().split(";");
1472
1473                         for (String s : temp1) {
1474                             if (sug.indexOf(s + ";") < 0) {
1475                                 sug += s + ";";
1476
1477                             }
1478                         }
1479                         sug = sug.substring(0, sug.length() - 1);
1480                         sb.append(" suggest='" + sug + "'");
1481                         //生成显示的数据名称
1482                         rod++;//生成100之内的随机数
1483                         sb.append(" rand='10" + rod + "'");
1484                         dto.sugList.append(this.getSuggestFilds(ft + "", wiType, sug, sug, top, form, oneRec, rod, dto.dbid, sf, df));
1485                     }
29a282 1486                     if (type == -3) {//表示为辅助核算
a6a76f 1487                         sb.append(" curType='gl' ");
29a282 1488                     }
F 1489                     if (type == 3 || type == -3) {
a6a76f 1490                         sb.append(" Button='/images/ppp.gif'  WidthPad='20'");
29a282 1491                     }
d24ea3 1492
a6a76f 1493                     this.prossIntoSession(top, dto);
F 1494                     this.prossIntoSession(form, dto);
1495                     this.prossIntoSession(sf, dto);
1496                     this.prossIntoSession(df, dto);
1497                     this.prossIntoSessionForFilter(ef, dto);
1498                     dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
1499
1500                 } else if (type == 6) {
1501                     sb.append(" CanEmpty='0' ");//解决在只读时候,没值会显示不正确的情况
1502                     dto.footb.append(id.toLowerCase()).append("Type='Text' ");//汇总页需要屏蔽单元格类型为Text
1503                 } else if (type == 1 || type == 0 || type == 7) {
1504                     sb.append(uppercase ? "  uppercase='" + uppercase + "'" : "");
1505
1506                 } else if (type == 9) {//图片控件
1507                     sb.append(" Button='/images/d.jpg'  WidthPad='20' ");
d24ea3 1508                     dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
F 1509                 }else if (type == 46) {//颜色控件
1510                     sb.append("  colType='46' ");
1511                     dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
1512                 }else if (type == 47) {//进度条控件
1513                     sb.append(" colType='47' ");
a6a76f 1514                     dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
F 1515                 }
1516                 if (type != 2 && type != 31) {//下拉类型的不需要显示
1517                     if (len.get(id.toLowerCase()) != null && Integer.parseInt(len.get(id.toLowerCase())) > 0) { //存在varchar(max),nvarchar(max)的情况
1518
1519                         String rep = "^\\\\\\s*[\\\\\\s\\\\\\S]{0," + len.get(id.toLowerCase()) + "}\\\\\\s*\\$";
1520                         sb.append(" EditMask='").append(rep).append("' ")
1521                                 .append(" Tsize='").append(len.get(id.toLowerCase())).append("' ")
1522                                 .append(" Tip='").append("最长").append(len.get(id.toLowerCase()))
1523                                 .append("个字符(每汉字占2个字符)'");
1524                     }
1525                 }
1526                 sb.append(calcuField != 0 ? "  calcuField='" + calcuField + "'" : "");
1527                 sb.append(KeyInput ? "  KeyIn='1'" : "").append(" dataType='").append(dataType).append("' ");
1528                 if (emptyrefdata != null && !emptyrefdata.equalsIgnoreCase("") && !emptyrefdata.equalsIgnoreCase("0") && type != 6)
1529                     sb.append(" emptyrefdata='").append(this.replaceBlank(emptyrefdata)).append("'");//增加清空关联
1530                 if (!this.isNullOrEmptry(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT")) && !this.isNullOrEmptry(GridUtils.prossRowSetDataType_String(map, "HyperlinkFTFormType"))) {
1531                     //判断22类型的主表是不是自定义.do。
1532                     String execdo = "";
1533                     if ("22".equals(GridUtils.prossRowSetDataType_String(map, "HyperlinkFTFormType"))
1534                             && org.apache.commons.lang.StringUtils.isNumeric(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT"))) {
1535                         T_22_Ifc t22ifc = (T_22_Ifc) FactoryBean.getBean("T_22_Impl");
1536                         execdo = t22ifc.getProcName(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT"));
1537                         if (execdo != null && !"".equals(execdo)) {
1538                             execdo = (execdo.indexOf(".do") != -1 ? execdo : "");
1539                         }
1540                     }
1541                     String efl = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkEFilter").toLowerCase());
1542                     String op = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "Hyperlinkmode").toLowerCase());
1543                     int save = GridUtils.prossRowSetDataType_Int(map, "isAutoSaved");
1544 //                    String openType=this.prossRowSetDataType_String(map,"openType")==null?"0":this.replaceBlank(this.prossRowSetDataType_String(map,"openType").toLowerCase());
1545                     String sf = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkSPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
1546                     String df = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkDPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
e1b640 1547                     int autoref = 0;
a6a76f 1548                     try {
e1b640 1549                         autoref = GridUtils.prossRowSetDataType_Int(map, "isAutoRefresh");
a6a76f 1550                     } catch (Exception e) {
F 1551
1552                     }
1553                     sb.append("  Fformid='").append(this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT").toLowerCase()))
1554                             .append("' FsField=\"").append(sf)
1555                             .append("\" FdField=\"").append(df)
e1b640 1556                             .append("\" Fref=\"").append(autoref)
a6a76f 1557 //                        .append("\" FopenType=\"").append(openType)//增加弹出层的功能 1表示正常的页卡,2表示弹出层显示
F 1558                             .append("\" Fwtype='").append(GridUtils.prossRowSetDataType_String(map, "HyperlinkFTFormType"))
1559                             .append("' Fop='").append(op == null ? "0" : (op.replaceAll("'", "\\\\'").replaceAll("\n\t", "")))
1560                             .append("' Fsave='").append(save)
1561                             .append("' Fexec='").append(execdo)
1562                             .append("' FeFilter=\"").append(efl == null ? "" : (efl.replaceAll("'", "\\\\'").replaceAll("\n\t", ""))).append("\"");
1563                     this.prossIntoSession(sf, dto);
1564                     this.prossIntoSession(df, dto);
1565                     this.prossIntoSessionForFilter(efl, dto);
1566                 }
1567                 if ((dto.order == 1 && id.equalsIgnoreCase("doccode") && this.isNullOrEmptry(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT")) && this.isNullOrEmptry(GridUtils.prossRowSetDataType_String(map, "HyperlinkFTFormType")))//当是单据时候增加对doccode字段自动超链接
1568                 ) {
1569                     sb.append("  Fformid='").append(dto.formID)
1570                             .append("' FsField=\"").append("doccode")
1571                             .append("\" FdField=\"").append("doccode")
1572                             .append("\" Fwtype='").append(dto.othType)
1573                             .append("' FeFilter=\"").append("\"");
1574                 }
1575                 if (ShowOnGrid && id.equalsIgnoreCase(dto.lastField.toLowerCase())) sb.append(" ent='1' ");//增加标记为最后一个字段
1576                 if (index < dto.frozencols) {//
493df4 1577                     left.append("<C " + showMenuName(dec, dto.colset) + " CaseSensitive='0' Name='").append(id.toLowerCase()).append("'").append(" cpltrow='").append(cpltrow ? 1 : 0).append("' CanEdit='").append(readOnly ? 0 : 1).append("' Type='").append(typeName).append("' ")
a6a76f 1578                             .append((editStatus == "" || editStatus == null) ? "" : " editStatus='" + editStatus + "'")
a58a39 1579                             .append(ShowOnGrid ? "" : " Visible='0' noItemShow='1' ")//noItemShow用于格线列显示
a6a76f 1580                             .append(fileterID ? " Visible='0' " : "");
F 1581                     if (!dto.isList && dto.gantt && "subtask".equalsIgnoreCase(id.toLowerCase()))
1582                         left.append(" CanGroup='2' GroupChar='/' GroupEmpty='0' ");
1583                     left.append((displayformat != null && !"".equalsIgnoreCase(displayformat) && !"0".equalsIgnoreCase(displayformat)) ? ("  Format='" + displayformat + "'" + ("Date".equalsIgnoreCase(typeName) ? " EditFormat='" + displayformat + "'" : "")) : ("Date".equalsIgnoreCase(typeName) ? " Format='yyyy-MM-dd' EditFormat='yyyy-MM-dd'" : ""))
1584                             .append("  CanEmpty='1' Align='").append(cellAlign).append("' Width='").append(width).append("' ").append(sb.toString() + "/>\n");
1585                     if (ValueExp != null && !"".equalsIgnoreCase(ValueExp)) {//增加一个有权限控制的关联字段
1586                         left.append("<C CaseSensitive='0' Name='").append(id.toLowerCase()).append("_expr'")
1587                                 .append(" Visible='0' ")
1588                                 .append(" />\n");
1589                     }
493df4 1590                     if (!fileterID && ShowOnGrid) index++;
a6a76f 1591                 } else {
493df4 1592                     cols.append("<C " + showMenuName(dec, dto.colset) + " CaseSensitive='0' Name='").append(id.toLowerCase()).append("'").append(" cpltrow='").append(cpltrow ? 1 : 0).append("' CanEdit='").append(readOnly ? 0 : 1).append("' Type='").append(typeName).append("' ")
a6a76f 1593                             .append((editStatus == "" || editStatus == null) ? "" : " editStatus='" + editStatus + "'")
a58a39 1594                             .append(ShowOnGrid ? "" : " Visible='0' noItemShow='1' ")
a6a76f 1595
F 1596                             .append(fileterID ? " Visible='0' " : "");
1597                     if (!dto.isList && dto.gantt && "subtask".equalsIgnoreCase(id.toLowerCase()))
1598                         cols.append(" CanGroup='2' GroupChar='/' GroupEmpty='0' ");
1599                     cols.append((displayformat != null && !"".equalsIgnoreCase(displayformat) && !"0".equalsIgnoreCase(displayformat)) ? ("  Format='" + displayformat + "'" + ("Date".equalsIgnoreCase(typeName) ? " EditFormat='" + displayformat + "'" : "")) : ("Date".equalsIgnoreCase(typeName) ? " Format='yyyy-MM-dd' EditFormat='yyyy-MM-dd'" : ""))
1600                             .append("  CanEmpty='1' Align='").append(cellAlign).append("' Width='").append(width).append("' ").append(sb.toString() + "/>\n");
1601                     if (ValueExp != null && !"".equalsIgnoreCase(ValueExp)) {//增加一个有权限控制的关联字段
1602                         cols.append("<C CaseSensitive='0' Name='").append(id.toLowerCase()).append("_expr'")
1603                                 .append(" Visible='0' ")
1604                                 .append(" />\n");
1605
1606                     }
1607                 }
1608
1609             }
1610             //while(dto.gfields.next());
1611             if ("".equalsIgnoreCase(dto.orderFiled)) dto.orderFiled = firstID + " desc";
1612             dto.expr = valExp.length() > 0 ? valExp.substring(0, valExp.length() - 1) : "";
1613             dto.cspr = cssExp.length() > 0 ? cssExp.substring(0, cssExp.length() - 1) : "";
1614             dto.tipspr = tipsExp.length() > 0 ? tipsExp.substring(0, tipsExp.length() - 1) : "";
1615             if (cols.length() == 0 && !dto.gantt) {
1616                 msgInfo.append(dto.formID + "-格线未设置显示字段或9801定义的冻结列数大于需要显示的列数或加载项(isLoad)未勾选!");
1617             }
1618             if (cols.length() > 0)
1619                 dto.colsConfig = cols.substring(0, cols.length() - 1);
1620             dto.LeftCols = left.length() > 0 ? "<LeftCols>" + left.substring(0, left.length() - 1) + "</LeftCols>" : "";
1621             dto.formula = formn.length() > 1 ? formn.substring(0, formn.length() - 1) : "";
1622             dto.initValue = values.length() > 1 ? values.substring(0, values.length() - 3) : "";
1623             dto.totalCols = sumfu.length() > 1 ? sumfu.substring(0, sumfu.length() - 1) : "";
1624             if (!iscopy && rowCopys != null) {
1625                 dto.rowcopyfields = rowCopys.length() > 1 ? rowCopys.substring(0, rowCopys.length() - 1) : "";
1626             }
1627             if (dto.totalCols == "") {
1628                 dto.foot = "";
1629                 dto.foot2 = "";
1630             }//当没有统计列时候不需要显示
1631             else {
1632                 dto.foot = "<Foot><I id=\"Fix1\" CanEdit='0' " + dto.footb.toString() + "/></Foot>";
1633             }
1634
1635             if ((exportInfo.lastIndexOf("-") + 1) < exportInfo.length()) {
1636                 int tsm = dto.conNum == 0 ? dto.winType : dto.othType;
1637                 exportInfo.append("-").append(tsm).append("-").append(SumFieldInfo.toString());//后面跟窗体类型
1638                 // String titles="";
1639 //            if(exportTitle.length()>0) {
1640 //             titles=exportTitle.toString();
1641 //            if(titles.lastIndexOf(";")>0) titles=titles.substring(0, titles.length()-1);
1642 //            }
1643                 // titles=titles+"@p@"+exportInfo.toString();
1644                 FileUtil.writeFile(exportInfo.toString(), root.replaceAll("\\\\", "/") + File.separator + dto.verNo + "/" + dto.formID + "/" + tsm + "/data");//写到文件里面
1645             }
1646             if (msgInfo.length() > 0) throw new ApplicationException(msgInfo.toString());
1647         } catch (ArrayIndexOutOfBoundsException e1) {
1648             throw new ApplicationException("读取不到" + dto.formID + "在9802里面的字段信息,请检查9802是否已做了相关设置");
1649         } catch (Exception e) {
1650             e.printStackTrace();
1651             throw new ApplicationException(e.getCause() == null ? e.getMessage() + "\n" + msgInfo.toString() + "_" + dto.dbid : e.getCause().getMessage() + "\n" + msgInfo.toString() + "_" + dto.dbid);
1652         } finally {
1653             left = null;
1654             cols = null;
1655             formn = null;
1656             values = null;
1657             sumfu = null;
1658             valExp = null;
1659             msgInfo = null;
1660         }
493df4 1661     }
F 1662
1663     private String showMenuName(String caption, int isShowCell) {
1664         //设置了显示列功能才执行
1665         return (isShowCell == 1 && org.apache.commons.lang3.StringUtils.isNotBlank(caption)) ? (" MenuName='" + caption + "' ") : " ";
a6a76f 1666     }
F 1667
1668     private void setFilter(String id, int type, StringBuilder filter, int dIndex) {
1669         switch (type) {
1670
1671             case 1:
1672             case 7:
1673                 if (dIndex == 4)//是日期类型,虽然定义为1类型也显示日期
1674                     filter.append(id).append("Range=\"1\" ")
1675                             .append(id).append("Filter=\"0\" ")
1676                             .append(id).append("ShowMenu=\"0\" ");
1677                 else
1678                     filter.append(id).append("Range=\"1\" ")
1679                             .append(id).append("Filter=\"0\" ")
1680                             .append(id).append("ShowMenu=\"1\" ");
1681                 break;
1682             case 5:
1683                 filter.append(id).append("Range=\"1\" ")
1684                         .append(id).append("Filter=\"0\" ")
1685                         .append(id).append("ShowMenu=\"0\" ");
1686                 break;
1687             case 2:
1688             case 31:
1689             case 35:
a58a39 1690             case 46:
a6a76f 1691                 filter.append(id).append("Range=\"1\"  ")
F 1692
a58a39 1693                         .append(id).append("Type='Text' ")
a6a76f 1694                         .append(id).append("ShowMenu=\"1\"  ");
F 1695                 break;
1696             case 3:
1697                 filter.append(id).append("Range=\"1\" ")
1698                         .append(id).append("Button='' ")
a58a39 1699                         .append(id).append("Type='Text' ")
a6a76f 1700                         .append(id).append("ShowMenu=\"1\" ");
F 1701                 break;
1702             case 9:
1703             case 19:
1704             case 40:
1705                 filter.append(id).append("CanEdit='0' ")
1706                         .append(id).append("Button=''  ")
1707                         .append(id).append("Type='Text' ")
1708                         .append(id).append("ShowMenu='0' ");
1709                 break;
1710             case 6:
29a282 1711                 filter.append(id).append("CanEmpty=\"1\" ")
a6a76f 1712                         .append(id).append("ShowMenu=\"0\" ");
F 1713                 break;
1714         }
1715
1716     }
1717
1718     /**
1719      * 把需要从会话中替换的值写到页面里
1720      **/
1721     private void prossIntoSession(String str, TreeGridDTO dto) {
1722         if (str != null && str.length() > 0) {
1723             StringBuilder sb = new StringBuilder();
1724             String[] s = str.split(";");
1725             int index = 0;
1726             String kk = "";//中间变量
1727             for (String te : s) {
1728                 if (te.indexOf("@") == 0) {//需要从会话里读
1729                     //处理会话值为空的情况,导致页面js的json对象出现脚本错误
1730                     String temp = "<%=(session.getAttribute(\"" + te.toLowerCase() + "\")==null||((String)session.getAttribute(\"" + te.toLowerCase() + "\")).length()==0)?\"\":session.getAttribute(\"" + te.toLowerCase() + "\")%>";//DBHelper.getValRep(te.toLowerCase(),false);
1731
1732                     if (te.equalsIgnoreCase(kk)) continue;
1733                     kk = te;
1734                     if (index > 0) sb.append(",");
1735                     if (dto.setInfo != null && dto.setInfo.trim().length() > 0 && index == 0) dto.setInfo += ",";
1736                     sb.append(te.replaceAll("'", "").replaceAll("@", "").toLowerCase())
1737                             .append(":")
1738                             .append("'")
1739                             .append(temp)
1740                             .append("'");//还原引号是因为需要引号括起来,在页面才不会出现脚本错误
1741                     index++;
1742                 }
1743             }
1744
1745             dto.setInfo += sb.toString();
1746         }
1747     }
1748
1749     /**
1750      * 把需要从会话中替换的值写到页面里 ,适用是自定义条件的情况
1751      * 也就是一条sql语句中需要查出来替换,isnull(cccode,'')='@cccode'
1752      **/
1753     private void prossIntoSessionForFilter(String str, TreeGridDTO dto) {
1754         if (str != null && str.length() > 0) {
1755             StringBuilder sb = new StringBuilder();
1756             Pattern p = Pattern.compile("@.*?\\w+");// 匹配以@开头的单词
1757             java.util.regex.Matcher propsMatcher = p.matcher(str);
1758             int index = 0;
1759             String kk = "";
1760             String kt = "";
1761             while (propsMatcher.find()) {
1762                 String te = propsMatcher.group();
1763
1764                 String temp = "<%=(session.getAttribute(\"" + te.toLowerCase() + "\")==null||((String)session.getAttribute(\"" + te.toLowerCase() + "\")).length()==0)?\"\":session.getAttribute(\"" + te.toLowerCase() + "\")%>";//DBHelper.getValRep(te.toLowerCase(),false);
1765                 if (te.equalsIgnoreCase(kk)) continue;
1766                 if (dto.setInfo.indexOf(kt + ":") > 0) continue;
1767                 kk = te;
1768                 if (index > 0) sb.append(",");
1769                 if (dto.setInfo != null && dto.setInfo.trim().length() > 0 && index == 0) dto.setInfo += ",";
1770                 kt = te.replaceAll("@", "").toLowerCase();
1771                 sb.append(te.replaceAll("@", "").toLowerCase())
1772                         .append(":")
1773                         .append("'")
1774                         .append(temp)
1775                         .append("'");
1776                 index++;
1777             }
1778
1779             dto.setInfo += sb.toString();
1780         }
1781     }
1782
1783     private void prossIntoSessionForFilter_dy(String str, TreeGridDTO dto) {
1784         if (str != null && str.length() > 0) {
1785             StringBuilder sb = new StringBuilder();
1786             Pattern p = Pattern.compile("@.*?\\w+");// 匹配以@开头的单词
1787             java.util.regex.Matcher propsMatcher = p.matcher(str);
1788             int index = 0;
1789             String kk = "";
1790             while (propsMatcher.find()) {
1791                 String te = propsMatcher.group();
1792
1793                 String temp = "<%=(session.getAttribute(\"" + te.toLowerCase() + "\")==null||((String)session.getAttribute(\"" + te.toLowerCase() + "\")).length()==0)?\"\":session.getAttribute(\"" + te.toLowerCase() + "\")%>";//DBHelper.getValRep(te.toLowerCase(),false);
1794                 if (te.equalsIgnoreCase(kk)) continue;
1795                 kk = te;
1796                 if (index > 0) sb.append(",");
1797                 sb.append(te.replaceAll("@", "").toLowerCase())
1798                         .append(":")
1799                         .append("'")
1800                         .append(temp)
1801                         .append("'");
1802                 index++;
176de8 1803             }
F 1804             if (org.apache.commons.lang3.StringUtils.isNotBlank(sb.toString())) {
1805                 if(!"".equalsIgnoreCase(dto.setInfo_dy)) {
493df4 1806                     dto.setInfo_dy += ",";
a6a76f 1807                 }
176de8 1808                 dto.setInfo_dy += sb.toString();
a6a76f 1809             }
F 1810         }
1811     }
1812
1813     /**
1814      * 处理生成多表结构中的多表格
1815      **/
1816     public void setTabPage(int formType, int height, int count, TreeGridDTO dto) {
1817         dto.tabPage = formType;
1818         dto.gridHeight = height;
1819         dto.masterKey = count == 0 ? "" : count + "";
1820         dto.b499 = true;
1821     }
1822
1823     public void setTabPage497(int type, int height1, String indexs, String tolkey, int formid, int index, TreeGridDTO dto) {
1824         dto.tabPage = type;
1825         dto.gridHeight = height1;
1826         dto.masterKey = indexs;
1827         dto.b497 = true;
1828         dto.b499 = true;
1829         dto.tolkey = tolkey;
1830         dto.PriFormID = formid;//取得主功能号里面的排除功能号和字段列表用 by 11-5-28
1831         dto.PriIndex = index;
1832     }
1833
1834     /**
1835      * 根据不同类型决定不同的排序规则
1836      * //1,读取9801设置,
1837      * //2,根据不同类型再进行不同的设置(单据清单desc,明细 以docitem asc,)
1838      * //3,对于不是上面的二种情况不用排序
1839      */
1840     private String setOrderBy(TreeGridDTO dto) {
1841         String temp = "";
1842         if (dto.order == 1 && dto.index1 != null && !dto.index1.isEmpty()) { //9801 主表
1843             temp = setSqlOrderBy(dto.index1, " asc");
1844         } else if (dto.order == 2 && dto.index2 != null && !dto.index2.isEmpty()) {//明细表
1845             temp = setSqlOrderBy(dto.index2, " asc");
1846         } else {
1847             if (dto.field.isEmpty())
1848                 temp = dto.orderFiled;
1849             else {
1850                 //处理8类型第三表的排序不是默认的docitm的情况,也就是9801定义有排序
493df4 1851                 if (dto.winType == 15 && dto.order == 2 && org.apache.commons.lang3.StringUtils.isNotBlank(dto.index1)) {
a6a76f 1852                     temp = setSqlOrderBy(dto.index1, " asc");
493df4 1853                 } else {
a6a76f 1854                     temp = setSqlOrderBy(dto.field, dto.order == 1 ? " desc" : " asc");
F 1855                 }
1856             }
1857         }
1858         dto.field = "";
1859         if ("".equalsIgnoreCase(temp)) return "";
1860         String[] s = temp.replaceAll(",", " ").split("\\s+");//
1861         String cols = "SortCols='";
1862         String types = "SortTypes='";
1863         for (int j = 0; j < s.length; j += 2) {
1864             if (j > 0) {
1865                 cols += ",";
1866                 types += ",";
1867             }
1868             cols += s[j].equalsIgnoreCase("_ycid_") ? "id" : s[j];
1869             types += "asc".equalsIgnoreCase(s[j + 1]) ? "0" : "1";
1870         }
1871         return cols + "' " + types + "'";
1872
1873     }
1874
1875     private String setSqlOrderBy(String index22, String x) {//x为desc,asc
1876         String temp = "";
1877         index22 = index22.replaceAll(";", ",");
1878         String[] sorts = index22.split(",");
1879         int index = 0;
1880         for (String s : sorts) {
1881             String[] str = s.split("\\s");
1882             if (str.length == 2) {
1883                 if (index > 0)
1884                     temp += "," + str[0] + " " + str[1];
1885                 else
1886                     temp += str[0] + " " + str[1];
1887             } else {
1888                 if (index > 0)
1889                     temp += "," + str[0] + " " + x;
1890                 else
1891                     temp += str[0] + " " + x;
1892             }
1893             index++;
1894         }
1895         return temp;
1896     }
1897
1898     /**
1899      * 设置表格高度
1900      */
1901     private String setGridHight(TreeGridDTO dto) {
1902         if (((dto.winType != 1 || dto.winType != 10) && dto.order == 2) && dto.gridHeight == 0)
1903             dto.gridHeight = GRID_HEIGHT;
1904         String temp = dto.gridHeight > 0 ? dto.gridHeight + "px" : GRID_HEIGHT + "px";
1905         dto.gridHeight = 0;
1906         return temp;
1907     }
1908
1909     /* (non-Javadoc)
1910      * @see com.yc.action.grid.TreeGridIfc#createGrid(int, int, java.lang.String, java.lang.String, java.lang.String[])
1911      */
1912     @Override
1913     public void createGrid(int type, int formID, String root, String path, String fileName[], String tempPath, String pst, TMuiDTO dt, String dbid) throws DataAccessException, SQLException {
1914         try {
1915             StringBuilder sb = new StringBuilder();//总的js
1916             StringBuilder jsp = new StringBuilder();//总的jsp
1917             StringBuilder main = new StringBuilder();//临时main标记
1918             StringBuilder hd = new StringBuilder();//临时header标记
1919             TreeGridDTO dto = new TreeGridDTO();
1920             String refgrid = "";//保存需要引用多少个grid
1921             dto.verNo = path.replaceAll("\\\\", "/");//系统号+版本号+语言
1922             dto.formID = formID;
1923             dto.winType = type;
1924             dto.othType = 0;
1925             dto.dbid = dbid;
1926             if (dt != null) {//把多表的值传过来填充
493df4 1927                 this.setTabPage497(dt.type, dt.height1, dt.indexs, dt.tolkey, dt.fromid, dt.index, dto);
a6a76f 1928                 this.setXxk(dt.xxk, dto);
493df4 1929                 dto.formTabName = dt.formTabName;
a6a76f 1930             }
F 1931             if (dt != null && dt.addnew)
1932                 dto.postStatusAddNew = dt.addnew;
1933             int ty = gridService.getwinType(dto.winType);
1934             if (ty == 4 || ty == 5) {
1935                 dto.isTable = false;
1936                 dto.action = ty == 4 ? "func" : "proc";
1937             }
1938             String hasGrid = "";
1939             int num = 1;//循环次数
1940             if (dto.winType == 9) {
1941                 num = 2;
1942                 dto.othType = 5;
1943             }
1944             if (dto.winType == 17) {
1945                 num = 1;
1946                 dto.othType = 16;
1947                 hasGrid = "0";
1948             }
1949             if (dto.winType == 15) {
1950                 num = 3;
1951                 dto.othType = 8;
1952                 dto.muilGrid = true;
1953             }//三表有关联
1954             if (dto.winType == 152) {
1955                 num = 3;
1956                 dto.othType = 151;
1957                 dto.muilGrid = true;
1958             }//三表无关联
1959             if (dto.winType == 499 || dto.winType == 498) {
1960                 dto.othType = 498;
1961                 hasGrid = "many";
1962             }//多表
1963             if (dto.winType == 497 || dto.winType == 496) {
1964                 dto.othType = 496;
1965                 hasGrid = "many";
1966             }//多表且有关联
1967
1968             for (int i = 0; i < num; i++) {
1969                 if (dto.winType == 3 || dto.winType == 4 || dto.winType == 30 || dto.winType == 301) {//树类型,需要生成与树相关的值
1970                     dto.treefield = this.getTreeFields(formID, dto.dbid);
1971                 }
1972                 String str = FileUtil.readFile(tempPath + "/grid.jsp");//页面模板
1973                 if (dto.muilGrid && i == 0) jsp.append(str).append("\n");    //先保存好模板,以便生成多表时候用
1974                 dto.conNum = i;
1975                 dto.order = setOrderName(dto);
1976                 this.print(root, dto);
1977                 String strJs = FileUtil.readFile(tempPath + (((dto.gantt && dto.order == 2) || (dto.gantt && dto.winType == 18)) ? "/grid_Gantt.js" : "/grid.js"));//页面js
1978                 String[] ver = dto.verNo.split("/");
1979                 String ddsave = "";
1980                 try {
1981                     if (dto.DealAfterDocSave != null && dto.DealAfterDocSave.trim().length() > 0)
1982                         ddsave = "&DealAfterDocSave=" + this.replaceBlank(EncodeUtil.base64Encode(dto.DealAfterDocSave));
1983                 } catch (UnsupportedEncodingException e) {
1984                     throw new ApplicationException("加密保存后执行组出错-" + dto.DealAfterDocSave);
1985                 }
1986                 try {
1987                     String js = FileUtil.readFile(tempPath + (((dto.gantt && dto.order == 2) || (dto.gantt && dto.winType == 18)) ? "/gridDef_Gantt.xml" : "/gridDef.xml"));//js结构
1988                     js = js
1989                             .replaceAll("@id", "T_" + dto.formID)//功能号
1990                             .replaceAll("@lang", ver[ver.length - 1])//语言
1991                             .replaceAll("@Cols", dto.colsConfig + "")//列定义
1992                             .replaceAll("@LeftCols", dto.LeftCols + "")//列定义
1993                             .replaceAll("@Header", dto.header.replaceAll("\\$", "\\\\\\$") + "")//列标题,转义$为\$
1994                             .replaceAll("@minHeight", GRID_HEIGHT + "")//最小高度
1995                             .replaceAll("@formidType", dto.winType + "|" + i)//当前grid的窗体类型
1996                             .replaceAll("@formid", dto.formID + "")//当前grid的功能号
1997                             .replaceAll("@formula", this.replaceBlank(dto.formula))//自定义公式 //增加判断是否存在死循环的可能
1998                             .replaceAll("@rowSpan", this.replaceBlank(dto.rowspanStr))//合并行的字段
1999                             .replaceAll("@totalCols", this.replaceBlank(dto.totalCols))//统计列
2000                             .replaceAll("@rowcopyfields", dto.rowcopyfields == null ? "" : this.replaceBlank(dto.rowcopyfields))
2001                             .replaceAll("@rowcopyformids", dto.rowcopyformids == null ? "" : this.replaceBlank(dto.rowcopyformids))
2002                             .replaceAll("@t302", dto.winType == 302 ? true + "" : false + "")//302类型
2003                             .replaceAll("@t15", (dto.winType == 15 && dto.conNum == 1) ? true + "" : false + "")//15类型中单击查询第二个grid
2004                             .replaceAll("@gType", (dto.tabPage > 0) ? ((dto.tabPage == 77 || dto.tabPage == 7) ? "77" : (dto.b497 ? 497 : 499) + "") : dto.winType + "")//当前grid的窗体类型
2005                             .replaceAll("@Disabled", (dto.winType == 18 && dto.gantt) ? "GanttDisabled=\"2\"" : "")
2006                             .replaceAll("@glcodefield", dto.glcodefield == null ? "" : dto.glcodefield + "")
2007                             .replaceAll("@treefield", this.replaceBlank(dto.treefield))//用在格线对应字段没设置初始值时,需要从树里取得值,所以需要在这里
2008                             .replaceAll("@expr", this.replaceBlank(dto.expr.replaceAll("<", "&lt;").replaceAll(">", "&gt;")))
2009                             .replaceAll("@css", this.replaceBlank(dto.cspr))
2010                             .replaceAll("@tips", this.replaceBlank(dto.tipspr))
2011                             .replaceAll("@tolkey", this.replaceBlank(dto.tolkey))
2012                             .replaceAll("@colns", this.replaceBlank(dto.columns))
2013                             .replaceAll("@MainCol", (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol)) ? "" : "MainCol='" + dto.mainCol.toLowerCase() + "'")
2014                             .replaceAll("@isNine", ((dto.othType > 0) && i == 0) ? ("/" + dto.verNo + dto.formID + "/" + dto.othType + "/index.jsp") : "null")//双击打开
2015                             .replaceAll("@nineType", dto.othType + "")////双击打开页面指定的类型
2016                             .replaceAll("@keyid", (dto.b499 || dto.b497) ? (dto.masterKey.trim().equalsIgnoreCase(",") ? "" : dto.masterKey.trim()) : (dto.masterKey + "," + dto.detailKey).trim().equalsIgnoreCase(",") ? "" : (dto.masterKey + "," + dto.detailKey))
2017                             .replaceAll("@Sorting", (dto.lockGridSort == 0 ? 1 : 0) + "")//取相反值,因为是冻结排序
2018                             .replaceAll("@Sort", this.replaceBlank(this.setOrderBy(dto)))//主键列,可以有多个,以"|"分隔
2019                             .replaceAll("@foot", this.replaceBlank(dto.foot))//汇总列
2020                             .replaceAll("@panelID", dto.PriIndex + "")//针对77类型取哪一个面板数据进行过滤
2021                             .replaceAll("@ycadd", this.setToolAdd(dto) == 2 ? "Add, " : "")//清单和查询页面不需要增行和删行
2022                             .replaceAll("@predocstatus", dto.predocstatus + "")//确认前状态值
493df4 2023                             .replaceAll("@postdocstatus", dto.postDocStatus + "")//确认后状态值
a6a76f 2024                             .replaceAll("@Columns", dto.colset == 1 ? "Columns," : "")//列过滤
F 2025                             .replaceAll("@Actions", dto.actions)//
2026                             .replace("@Tree", (dto.conNum == 0 || (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol))) ? "" : " AddChild,")//
2027                             .replace("@isTree", (dto.conNum == 0 || (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol))) ? "0" : "1")
2028                             .replace("@formTabName", dto.formTabName)
2029                             .replaceAll("@primeKey", (dto.primeKey == null || "".equalsIgnoreCase(dto.primeKey)) ? "" : dto.primeKey + ";")
2030                             .replaceAll("@Filter", (dto.isFilter == 1) ? dto.filter.append(" />").toString() : "")//DIV
2031                             .replaceAll("@defaultRowCount", dto.order == 2 ? dto.defaultRowCount + "" : "0")//格线默认行数
2032                             .replaceAll("@gltotal", this.replaceBlank(dto.gltotal));//辅助核算需要的汇兑,平衡字段
2033                     strJs = strJs
2034                             .replaceAll("@dataformid", (i == 0) ? (dto.dataformid != "" ? "&dataformid=" + this.replaceBlank(dto.dataformid) : "") : "")//dataformid功能,i==0表示只有单据清单才需要过滤
2035
2036                             .replaceAll("@tranformid", (dto.tranformid != "" ? "&tranformid=" + this.replaceBlank(dto.tranformid) : ""))//dataformid功能,确认时候调用来断定
2037                             .replaceAll("@action", dto.action)
2038                             .replaceAll("@lang", ver[ver.length - 1])//语言
2039                             .replaceAll("@foot2", this.replaceBlank(dto.foot2))
2040                             .replaceAll("@_ycaddnew_@", this.setToolAddForNew(dto))//当前用户是否存在OA审核按钮,其中有为1的则格线需要显示增行按钮
2041                             //.replaceAll("@_attachment_server_@", domain==null?"":domain)//附件服务器地址
2042                             .replaceAll("@picFild", this.replaceBlank("&picFild=" + dto.picFild))
2043                             .replaceAll("@TBCols", "&tbCols=" + EncodeUtil.base64Encode(this.replaceBlank(dto.totalCols)))//统计列
2044                             .replaceAll("@initValue", this.replaceBlank(dto.initValue))//初始值
2045                             .replaceAll("@verNo", this.replaceBlank(dto.verNo))//系统号+版本号+语言
2046                             .replaceAll("@setInfo", this.replaceBlank(dto.setInfo_dy.length() > 0 ? (dto.setInfo.length() > 0 ? dto.setInfo + "," + dto.setInfo_dy : dto.setInfo_dy) : dto.setInfo))//会话信息
2047                             .replaceAll("@optype", this.replaceBlank(dto.optype + ""))//权限信息
2048                             .replaceAll("@num", setGridNum(dto))
2049                             .replaceAll("@fileTime", this.setFilePath(path.replaceAll("\\\\", "/"), this.setJsName(dto), pst, dto))
2050                             .replaceAll("@divID", "T_" + dto.formID)//div所在的id
2051                             .replaceAll("@trangroup", dto.trangroup)//过帐类型
2052                             .replaceAll("@layout", this.setJsName(dto))//js文件名称
2053                             .replaceAll("@hasGrid", hasGrid)//js文件名称
2054                             .replaceAll("@isTree", (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol)) ? "" : "&isTree=1")
2055                             .replaceAll("@winType", dto.winType + "@p@" + i)//表的顺序 0表示读取主表 1表示读取从表
2056                             .replaceAll("@id", dto.formID + "")//功能号
2057                             .replaceAll("@DealAfterDocSave", ddsave)//保存时执行
2058                             .replaceAll("@CancelProc", "&cancelProc=" + this.replaceBlank(EncodeUtil.base64Encode(dto.cancelProc)) + "&cancelisSave=" + dto.cancelisSave + "&isExchangeDataWithHost=" + dto.isExchangeDataWithHost)//取消确认
2059                             .replaceAll("@revokeProc", "&revokeProc=" + this.replaceBlank(EncodeUtil.base64Encode(dto.revokeProc)))//审核撤回
2060                             .replaceAll("@pageSize", this.replaceBlank(dto.pageSize + ""))//
2061                             .replaceAll("@paging", "&autopaging=" + this.replaceBlank((dto.autopaging == 1 ? 3 : 2) + ""))//
2062                             .replaceAll("@formdatafilters", this.replaceBlank(i == 0 ? dto.formdatafilters.replaceAll("'", "\\\\'").replaceAll("%", "@~") : ""))//i==0表示只有单据清单才需要过滤
2063                             .replaceAll("@ProcGroupafterSavedoc", (dto.othType > 0 && i > 0 && dto.ProcGroupafterSavedoc != null && dto.ProcGroupafterSavedoc.trim().length() > 0) ? "&ProcGroupafterSavedoc=" + dto.ProcGroupafterSavedoc : "");
2064                     String tableType = null;
2065                     try {
2066                         SpObserver.setDBtoInstance("_" + dto.dbid);
2067                         tableType = this.gridService.getSimpleJdbcTemplate().queryForObject("select TABLE_TYPE from information_schema.TABLES where table_name=?", new Object[]{dto.table.split("\\|")[0]}, String.class);
2068                     } catch (DataAccessException e) {
2069                         if (e instanceof EmptyResultDataAccessException) {
2070                             tableType = "";
2071                         } else {
2072                             throw e;
2073                         }
2074
2075                     } finally {
2076                         SpObserver.setDBtoInstance();
2077                     }
2078                     if (dto.conNum != 0 && ("BASE TABLE".equals(tableType) || "VIEW".equals(tableType))) {//表示为基本表,需要有主键
2079                         if ((dto.primeKey == null || "".equalsIgnoreCase(dto.primeKey)))
2080                             throw new ApplicationException(dto.formID + "-" + dto.table + "表没有设置主键!");
2081                     }
2082
2083                     //--------------------
2084                     String hi = this.setGridHight(dto);
ac6f6a 2085                     dto.headerDiv = "\n<div id=\"T_" + dto.formID + "\" style=\"margin:5px 10px 0px 10px;width: 98%; height: " + hi + ";" + ((dto.b497 && dto.PriFormID == 0 || dto.b499 && dto.PriFormID == 0) && dto.xxk == 0 ? "display:none" : "") + "\"></div>";//增加多表加载时不显示所有格线
a6a76f 2086                     if ((i <= 1 && !dto.muilGrid) || (dto.muilGrid && i < 1 && num < 4)) {//不是多表,只需要生成一个gt-grid   单表,清单表(二表,三表,多表)
F 2087                         if ((dto.winType != 7 && dto.winType != 77) && (dto.b497 && dto.PriFormID == -1 || dto.b499 && dto.PriFormID == -1)) {//表示496,498多表的第一个表
2088                             int value = Integer.parseInt(dto.tolkey);
2089                             String create = "";
2090                             for (int v = 1; v <= value; v++)
2091                                 create += "create" + v + "(where,flag,cp);";//为了引用其它grid,3表
2092                             strJs = strJs.replaceAll("@create", create);
2093                         } else {
2094                             if (dto.winType == 15) {//表示15类型的第二表需要增加一个定时执行功能,以便处理第三表的过滤问题
2095                                 //create1(where,flag,cp);
2096                                 if (i == 1) {
2097                                     strJs = strJs.replaceAll("@create", "var def=jQuery.Deferred();\n setTimeout(function() {def.resolve('ok');}, 3000);");
2098
2099                                 }
2100                             }
2101                             //前端处理,通过从表调用过滤 避免主表还没加载完的情况 by danaus 2021/1/28 16:05
2102 //                            else if (dto.b497) {//表示多表增加一个定时执行功能,以便处理关联表的过滤问题
2103 //                                strJs = strJs.replaceAll("@create", "setTimeout(function() {mygrid" + setGridNum(dto) + ".setFilter496();}, 3000);");
2104 //                            }
2105                             strJs = strJs.replaceAll("@create", "");
2106
2107                         }
2108                         str = str
2109                                 .replaceAll("@main", strJs)
2110                                 .replaceAll("@head", dto.headerDiv)//DIV
2111                                 .replaceAll("@suggstDiv", dto.sugList.toString())//自动补全
2112                                 .replaceAll("@gridconnum", String.valueOf(dto.conNum));//判断单表用来计算grid高度需要。。。替换grid.jsp里面的@gridconnum
2113                         FileUtil.writeFile(js, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), this.setJsName(dto), pst, dto));//生成新页面js
2114                         FileUtil.writeFile(str, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), fileName[0], pst, dto));//生成新页面
2115                     } else {//多表,整个页面生成多个表格
2116                         if (refgrid != "") refgrid += ",";
2117                         refgrid += ("T_" + dto.formID);//为了引用其它grid,3表
2118                         if (!"".equalsIgnoreCase(setGridNum(dto))) {
2119                             if (dto.winType == 15) {//表示15类型的第二表需要增加一个定时执行功能,以便处理第三表的过滤问题
2120                                 if (i == 2) {
2121                                     strJs = strJs.replaceAll("@create", " var def=jQuery.Deferred(); \n setTimeout(function() { def.resolve('ok');}, 3000);");
2122                                     strJs = strJs.replaceAll("@jspromise", " return def;");
2123                                 }
2124                             }
2125
2126                             strJs = strJs.replaceAll("@create", "");
2127
2128                             //create+="setTimeout(function() {create"+setGridNum()+"(where,flag,cp);}, 1000);";
2129                             if (Integer.parseInt(setGridNum(dto)) == 1 && dto.winType == 15) {
2130                                 // dto.create+=" setTimeout(function() {create"+setGridNum(dto)+"(where,flag,cp);}, 500);";
2131                                 dto.create += " var def=jQuery.Deferred(); setTimeout(function() {def.resolve('ok');}, 2000);";
2132
2133                             } else
2134                                 dto.create += "create" + setGridNum(dto) + "(where,flag,cp);";//为了引用其它grid,3表
2135
2136                         }
2137                         main.append(strJs).append("\n");
2138                         hd.append(dto.headerDiv).append("\n");
2139
2140                         FileUtil.writeFile(js, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), this.setJsName(dto), pst, dto));//生成各个表的js
2141                     }
2142                     dto.gfields = null;
2143                 } catch (Exception e) {
2144                     throw new ApplicationException(e.toString());
2145                 }
2146             }
2147             if (dto.muilGrid && dto.conNum > 1) {//多表,需要把几个gt-grid生成在同一个页面
2148                 String strd = jsp.toString()
2149
2150                         .replaceAll("@main", main.toString().replaceAll("@refgrid", refgrid)).replaceAll("@create", dto.create)
2151                         .replaceAll("@head", hd.toString())//自定义表头
2152                         .replaceAll("@suggstDiv", dto.sugList.toString())//自动补全
2153                         .replaceAll("@gridconnum", String.valueOf(dto.conNum));//判断多表用来计算grid高度需要。。。替换grid.jsp里面的@gridconnum
2154                 FileUtil.writeFile(strd, root.replaceAll("\\\\", "/") + this.setFilePath(path.replaceAll("\\\\", "/"), fileName[0], pst, dto));//生成新页面
2155             }
2156             sb = null;
2157             jsp = null;
2158             main = null;
2159             hd = null;
2160         } catch (DataAccessException e) {
2161             throw new ApplicationException(e.toString());
2162         }
2163     }
2164
2165     /**
2166      * 解决5,9 16,17 8,15的关联生成问题
2167      *
2168      * @param root TODO
2169      **/
2170     private String setFilePath(String p, String name, String root, TreeGridDTO dto) {
2171         StringBuilder sb = new StringBuilder();
2172         if (!dto.b497 || !dto.b499)
2173             root = sb.append("/").append(dto.minID == 0 ? dto.formID : dto.minID).append("/").append(dto.conNum == 0 ? dto.winType : dto.othType).append("/").toString();
2174         return new StringBuilder().append(p).append(root).append(name).toString();
2175     }
2176
2177     /**
2178      * 根据当前grid的次数而生成需要的标记,以区别同一页面不同grid的引用
2179      */
2180     private String setGridNum(TreeGridDTO dto) {
2181         if (dto.b497 || dto.b499)
2182             return dto.PriIndex == 0 ? "" : dto.PriIndex + "";
2183         else
2184             return dto.conNum <= 1 ? "" : (dto.conNum - 1) + "";
2185     }
2186
2187     @Override
2188     public void setTabPage(int type, int height1, String indexs, String tolkey, int formid, int index, TreeGridDTO dto) {
2189         dto.tabPage = type;
2190         dto.gridHeight = height1;
2191         dto.masterKey = indexs;
2192         dto.b497 = true;
2193         dto.tolkey = tolkey;
2194         dto.PriFormID = formid;//取得主功能号里面的排除功能号和字段列表用 by 11-5-28
2195         dto.PriIndex = index;
2196     }
2197
2198     @Override
2199     public Grid getGridInfo(int formid, String type, boolean excel, TreeGridDTO dto) {
2200         Grid grid = new Grid();
2201         this.getTableName(formid, type, dto);//type:"9|0"
2202         grid.setFormID(formid);
2203         grid.setWinType(type);
2204         String ddsave = "";
2205         grid.setExcel(excel);
2206         try {
2207             if (dto.DealAfterDocSave != null && dto.DealAfterDocSave.trim().length() > 0)
2208                 ddsave = EncodeUtil.base64Encode(dto.DealAfterDocSave);
2209         } catch (UnsupportedEncodingException e) {
2210             throw new ApplicationException("加密保存后执行组出错-" + dto.DealAfterDocSave);
2211         }
2212         grid.setDealAfterDocSave(ddsave);
2213         if (dto.ProcGroupafterSavedoc != null && !"".equals(dto.ProcGroupafterSavedoc)) {
2214             grid.setProcGroupafterSavedoc(Integer.parseInt(dto.ProcGroupafterSavedoc));
2215         }
2216         grid.setTrangroup(dto.trangroup);//过账逻辑号
2217         return grid;
2218     }
2219
2220     @Override
2221     public void setXxk(int xxk, TreeGridDTO dto) {
2222         // TODO Auto-generated method stub
2223         dto.xxk = xxk;
2224     }
2225 }