xinyb
2024-09-10 513b8e930844d01da9f74289771de1c1e1e15808
src/com/yc/action/grid/TreeGrid.java
@@ -8,6 +8,7 @@
import com.yc.factory.FactoryBean;
import com.yc.multiData.SpObserver;
import com.yc.service.build.type.T_22_Ifc;
import com.yc.service.customControl.ControlLayoutIfc;
import com.yc.service.grid.GridServiceIfc;
import com.yc.service.impl.DBHelper;
import com.yc.utils.EncodeUtil;
@@ -24,9 +25,7 @@
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Pattern;
@@ -45,7 +44,8 @@
     */
    @Autowired
    private GridServiceIfc gridService;//表格处理的业务类
    @Autowired
    ControlLayoutIfc controlLayoutIfc;
    //static  String domain= AttachmentConfig.get("attachment.server");
    /**
@@ -156,7 +156,7 @@
    //只有明细表才需要执行,其他的都只是输出{}
    private String setToolAddForNew(TreeGridDTO dto) {
        if (dto.postStatusAddNew) return "<%=bdMap.toString()%>";
        if (dto.postStatusAddNew) return "panMain[panIndex].buttonInfoByGrid";
        switch (dto.winType) {
            case 9:
            case 15:
@@ -166,7 +166,7 @@
                if (dto.conNum == 0)
                    return "{}";
                else
                    return "<%=bdMap.toString()%>";
                    return "panMain[panIndex].buttonInfoByGrid";
            case 18:
            case 38:
            case 19:
@@ -183,7 +183,7 @@
        switch (winType) {
            case 5:
            case 9:
            case 2:
            case 20:
            case 30:
            case 301:
            case 10:
@@ -231,6 +231,7 @@
            dto.formname = gform.getString("formname");
            dto.gantt = gform.getBoolean("isGantt");//是否为甘特图类型的功能号
            dto.predocstatus = gform.getInt("predocstatus");//确认前状态,为了给格线在确认后不能再修改(新增,修改,删除) by 2013-02-01
            dto.postDocStatus = gform.getInt("postdocstatus");//确认后状态,为了给格线在确认后不能再修改(新增,修改,删除) by 2013-02-01
            dto.rowcopyfields = gform.getString("rowcopyfields");//行复制时排除字段
            dto.pageSize = gform.getInt("pageSize");//页记录数
            dto.autopaging = gform.getInt("autopaging");//是否分页
@@ -312,44 +313,30 @@
            return null;
    }
    private void getFirstField(TreeGridDTO dto) throws DataAccessException, SQLException {
        //1先读表关键功能,如果没有相关的再读表结构
    public void getFirstField(TreeGridDTO dto) throws DataAccessException, SQLException {
        String keyfields = null;
        List<String> keys = null;
        try {
            SpObserver.setDBtoInstance("_" + dto.dbid);
            keyfields = gridService.getTableKeyFields(dto.table);
            String tableName=dto.table;
            if(tableName.contains("|")){//18,19类型
                tableName=tableName.split("\\|")[0];
            }
            keys = gridService.getPrimaryKey(tableName);
        } finally {
            SpObserver.setDBtoInstance();
        }
        if (keyfields == null || "".equals(keyfields)) {
            //2只取主表,主从表情况 及18,19类型,三表暂时不考虑
            List<String> keys = null;
            try {
                SpObserver.setDBtoInstance("_" + dto.dbid);
                keys = gridService.getPrimaryKey(dto.table);
            } finally {
                SpObserver.setDBtoInstance();
            }
        if(keys!=null&&keys.size()>0) {
            for (String str : keys) {
                if ("".equals(dto.field))
                    dto.field += str;
                else
                    dto.field += ";" + str;
            }
            keys = null;
        } else {
            String[] arry = keyfields.split(";");
            for (int i = 0; i < arry.length; i++) {
                if ("".equals(dto.field))
                    dto.field += arry[i].toLowerCase();
                else
                    dto.field += ";" + arry[i].toLowerCase();
            }
            arry = null;
        }
        /*else {
            throw new ApplicationException("由于表名称是函数或视图获取不到主键,请到9807设置表关键字");
        }*/
        dto.primeKey = dto.field;
    }
@@ -358,12 +345,12 @@
        if (dto.winType != 9 && dto.winType != 15) {//针对只生成一个表格的情况,17类型由于第二个没有表格所以也存在这里了
            try {
                SpObserver.setDBtoInstance("_" + dto.dbid);
                dto.gfields = gridService.getGfiledByFormID9(dto.formID, this.setGetPrivaryTable(dto.winType));//取得所有字段信息 增加类型
                dto.gfields = gridService.getGfiledByFormID9(dto.formID,dto.winType, this.setGetPrivaryTable(dto.winType),dto.userCode);//取得所有字段信息 增加类型
            } finally {
                SpObserver.setDBtoInstance();
            }
        } else {
            if (dto.winType == 15 && dto.conNum == 1) {
            if ((dto.winType == 15||dto.winType == 9) && dto.conNum == 1) {
                List<Map> list = null;
                try {
                    SpObserver.setDBtoInstance("_" + dto.dbid);
@@ -371,13 +358,18 @@
                } finally {
                    SpObserver.setDBtoInstance();
                }
                if (list.size() == 0) {
                    throw new ApplicationException(";;" + dto.formID + "-三表关联未设置好--9825");
                if (list.size() == 0&&dto.winType == 15) {
                    throw new ApplicationException(";;" + dto.formID + "-三表关联未设置好,请在9825功能号维护好");
                }
                if (list.size() >1) {
                    throw new ApplicationException(";;" + dto.formID + "-存在多条记录,请在9825功能号维护好");
                }
                for (Map map : list) {
                    int temp = (Integer) map.get("DetailFormID");
                    dto.masterKey = (String) map.get("MasterKeys");
                    dto.detailKey = (String) map.get("DetailKeys");
                    dto.masterSumFields = (String) map.get("MasterSumFields");
                    dto.detailSumFields = (String) map.get("DetailSumFields");
                    dto.formID3 = temp;
                    dto.tempGridHeight = (map.get("gridHeight") == null) ? 0 : (Integer) map.get("gridHeight");
                }
@@ -386,7 +378,21 @@
            if (dto.conNum < 2) {
                try {
                    SpObserver.setDBtoInstance("_" + dto.dbid);
                    dto.gfields = gridService.getGfiledByFormID9(dto.formID, dto.conNum);//取得所有字段信息
                    //9,15明细转成对应的从表
                    int formType=dto.winType;
                    if(formType==9&&dto.conNum==1) {
                        //处理自定义布局
                        formType=5;
                        boolean hasControlLayout = controlLayoutIfc.hasControlLayout(dto.formID+"", dto.userCode, formType, ExprotType.Grid, false);
                        dto.hasControlLayout=hasControlLayout;
                    }
                    if(formType==15&&dto.conNum==1){
                        //处理自定义布局
                        formType=8;
                        boolean hasControlLayout = controlLayoutIfc.hasControlLayout(dto.formID+"", dto.userCode, formType, ExprotType.Grid, false);
                        dto.hasControlLayout=hasControlLayout;
                    }
                    dto.gfields = gridService.getGfiledByFormID9(dto.formID,formType, dto.conNum,dto.userCode);//取得所有字段信息
                    dto.lastField = gridService.getSimpleJdbcTemplate().queryForObject(sql, new Object[]{dto.formID, 1}, String.class);
                } catch (DataAccessException e) {
                    dto.lastField = "";
@@ -400,27 +406,23 @@
                dto.formID = dto.formID3;
                try {
                    SpObserver.setDBtoInstance("_" + dto.dbid);
                    dto.gfields = gridService.getGfiledByFormID9(dto.formID, 0);//取得所有 字段信息
                    dto.gfields = gridService.getGfiledByFormID9(dto.formID,1, 0,dto.userCode);//取得所有 字段信息
                    dto.lastField = gridService.getSimpleJdbcTemplate().queryForObject(sql, new Object[]{dto.formID, 0}, String.class);
                } finally {
                    SpObserver.setDBtoInstance();
                }
            }
        }
        //try {
        this.getTableName(dto.formID, dto.winType + "|" + dto.conNum, dto);// 增加类型
        if (dto.table == null) throw new ApplicationException(dto.formID + "--未设置明细表,请在9802设置后重新生成!");
        if (dto.isTable) {
            this.getFirstField(dto);
        if (dto.winType == 1 && ("".equals(dto.table) || dto.table == null)) {
            throw new ApplicationException(dto.formID + ",类型:" + dto.winType + "--未设置主表,请在9801设置后重新生成!");
        }
        this.getFirstField(dto);
        if (dto.conNum >= 2)
            if (dto.tempGridHeight != 0) dto.gridHeight = dto.tempGridHeight;
        gridConfig(root, dto);
        createCoumtHeader(dto);
        //} catch (Exception e) {
        //   e.printStackTrace();
        //}
    }
    private synchronized void fillColumnNumTree(int num, TreeGridDTO dto) {//根据最大行值填充列
@@ -586,6 +588,39 @@
    }
    /**
     * 判断当前生成的表格是属于列表还是明细,因为只有是明细表的标题才需要加必填星号
     *
     * @param dto
     * @return
     */
    private String getDetailGridTitle(TreeGridDTO dto, boolean keyInput, String id) {
        if (!keyInput) return " ";
        boolean isDetail = false;
        switch (dto.winType) {
            case 1:
            case 10:
            case 3:
            case 30:
            case 7:
            case 301:
            case 302:
            case 304:
                isDetail = true;
                break;
            case 9:
                if (dto.conNum == 1) isDetail = true;
                break;
            case 15:
                if (dto.conNum > 0) isDetail = true;
                break;
            case 497:
                if (dto.conNum == 1) isDetail = true;
                break;
        }
        return isDetail ? (id.toLowerCase() + "HtmlPostfix=\"&lt;span style='color:white;'> *&lt;/span>\" ") : " ";
    }
    /**
     * 动态根据表描述字段的如下规律
     * 表格|显示|表格|描述|表格|类型|表格|长度
     * 外表|表号|外表|类型|外表|清空关联
@@ -617,7 +652,8 @@
                if (GridUtils.prossRowSetDataType_Boolean(map, "ShowOnGrid")) {//设置为隐藏
                    String dec = GridUtils.prossRowSetDataType_String(map, "gridcaption");//表格描述
                    String fieldname = GridUtils.prossRowSetDataType_String(map, "fieldname");//字段描述
                    String id = map.get("fieldid") + "".trim();//字段名,去掉空格
                    boolean keyInput = GridUtils.prossRowSetDataType_Boolean(map, "KeyInput");//是否必填
                    String id = (map.get("fieldid") + "").trim();//字段名,去掉空格
                    if (id.equalsIgnoreCase("id") && (!dto.gantt)) id = "_ycid_";//避免id与格线中的id冲突而增加,页面返回时需要转换
                    String temp = (dec == null || "".equalsIgnoreCase(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
                    if (temp == null || temp == "" || temp.length() == 0) temp = id;
@@ -642,7 +678,7 @@
                        colNum = this.getColumnNum(cap[i], dto.tempStr, i, i == 0 ? cap[0] : cap[i - 1], k, dto);//取得跨列值
                        if (colNum == 0) flag = true;//表示存在¥,则不需要显示
                        show = id.toLowerCase() + "=\"" + this.getFormCap(cap[i]) + "\" " + id.toLowerCase() + "Align='Center' " + (colNum > 1 ? (" " + id.toLowerCase() + "Span='" + colNum + "' ") : "");
                        show = id.toLowerCase() + "=\"" + this.getFormCap(cap[i]) + "\" " + getDetailGridTitle(dto, keyInput, id) + id.toLowerCase() + "Align='Center' " + (colNum > 1 ? (" " + id.toLowerCase() + "Span='" + colNum + "' ") : "");
                        hidden = id.toLowerCase() + "Visible='-1' ";
                        if (flag)
                            gridHeader.append(hidden);
@@ -780,6 +816,7 @@
    private StringBuilder fillFT(int type, int ft, String sql, TreeGridDTO dto) {
        StringBuilder sb = new StringBuilder();
        SqlRowSet rst = null;
        String enumMenu="";
        try {
            SpObserver.setDBtoInstance("_" + dto.dbid);
            rst = gridService.getFTData(ft);
@@ -788,12 +825,15 @@
        }
        sb.append("");
        boolean flag = false;
        if (type == 31 || type == 2 || type == 35 || type == 43 || type == 30 || type == 32) {//2,类型,31类型下拉列表控件时,为三种情况,一个是静态sql,一个是动态sql,需要用页面的值替换再用ajax提交返回,另一个就是表号生成
        if (type == 31 || type == 2 || type == 35 || type == 43 || type == 30 || type == 32|| type == 46) {//2,类型,31类型下拉列表控件时,为三种情况,一个是静态sql,一个是动态sql,需要用页面的值替换再用ajax提交返回,另一个就是表号生成
            StringBuilder id = new StringBuilder();
            StringBuilder value = new StringBuilder();
            if (type != 30 && type != 32) {
                id.append("| ");
                value.append("| ");
                if(dto.isSuppressBlankLineForDropDown==0) {
                    //只有为0才需要增加空白列
                    id.append("| ");
                    value.append("| ");
                }
            }
            try {
                if (sql != null && sql != "" && sql.length() > 0) {//有sql参数
@@ -810,6 +850,7 @@
                                SpObserver.setDBtoInstance();
                            }
                            if (!set.wasNull()) {
                                enumMenu=getEnumMenu(dto,set,null);
                                while (set.next()) {
                                    id.append("|").append(this.replaceBlank(set.getString(1)));
                                    value.append("|").append(this.replaceBlank(set.getString(2)));
@@ -826,30 +867,44 @@
                }
                if (!flag) {
                    if (!rst.wasNull()) {
                        enumMenu=getEnumMenu(dto,rst,"interValue");
                        while (rst.next()) {
                            id.append("|").append(this.replaceBlank(rst.getString("interValue")));
                            value.append("|").append(this.replaceBlank(rst.getString("dictvalue")));
                            if(type==46){
                                value.append("|").append("<div style=&quot;background:").append(rst.getString("interValue")).append("&quot;>").append("&nbsp;</div>");
                            }else {
                                value.append("|").append(this.replaceBlank(rst.getString("dictvalue")));
                            }
                        }
                    }
                }
            } catch (Exception e) {
                sb.append("");
                throw new ApplicationException(e.getMessage());
            } finally {
                rst = null;
            }
            if (type == 31)
                if (ft != 0)//有表号才会有新增选项
            if (type == 31) {
                if (ft != 0) {//有表号才会有新增选项
                    sb.append("  EnumKeys='").append(id.toString() + "|-add-").append("' Enum='").append(value.toString() + "|&lt;&lt;新增&gt;&gt;").append("' ");
                else//当没表号表示不需要新增选项
                } else {//当没表号表示不需要新增选项
                    sb.append("  EnumKeys='").append(id.toString()).append("' Enum='").append(value.toString()).append("' ");
            else {
                    if (org.apache.commons.lang3.StringUtils.isNotBlank(id.toString()) && org.apache.commons.lang3.StringUtils.isNotBlank(enumMenu)) {
                        sb.append("EnumMenu=\"").append(enumMenu).append("\" ");
                    }
                }
            }else {
                if (type != 35) {
                    sb.append("  EnumKeys='").append(id.toString()).append("' Enum='").append(value.toString()).append("' ");
                    if(type==2) {//43类型增加EnumMenu输出会有问题
                        if (org.apache.commons.lang3.StringUtils.isNotBlank(id.toString()) && org.apache.commons.lang3.StringUtils.isNotBlank(enumMenu)) {
                            sb.append("EnumMenu=\"").append(enumMenu).append("\" ");
                        }
                    }
                }
            }
            if (type == 35) {//可编辑列表,值与键需要一样
                sb.append("  Button='Defaults' Defaults='").append(("|".equals(value.toString().trim())?"":value.toString())).append("' ");
                sb.append("  Button='Defaults' Defaults='").append(("|".equals(value.toString().trim()) ? "" : value.toString())).append("' ");
            }
            if (type == 43 || type == 30) {
                sb.append("  Range='1' ");
@@ -858,29 +913,44 @@
            id = null;
            value = null;
        }
//      else if(type==35){//可编辑列表,值与键相同
//         StringBuilder value=new StringBuilder();
//         try{
//         if(!rst.wasNull()){
//         while(rst.next()){
//            value.append("|").append(this.replaceBlank(rst.getString("dictvalue")));
//            }
//         }
//         }catch(Exception e){
//            sb.append("");
//         }finally{
//            rst=null;
//         }
//          sb.append("  Button='Defaults' Defaults='").append(value.toString()).append("' ");
//          value=null;
//      }
        return sb;
    }
    private synchronized String setJsName(TreeGridDTO dto) {
        return "grid_" + dto.formID + "_" + dto.winType + ".xml";
    }
    /**
     * 生成下拉列表的enumMenu,主要是为了能显示-号的情况
     * @param dto
     * @param rst
     * @return
     */
    private String getEnumMenu(TreeGridDTO dto,SqlRowSet rst,String colName){
        String menu="{Items:[";//{Value:''},{Value:'-',Text:'-'},{Value:'+',Text:'+'}
        StringJoiner joiner=new StringJoiner(",");
        if(dto.isSuppressBlankLineForDropDown==0){
            //有留白列
            joiner.add("{Value:'',Text:''}");
        }
        while (rst.next()) {
            if(colName==null)
                joiner.add("{Value:'"+rst.getString(1)+"',Text:'"+rst.getString(2)+"'}");
            else
                joiner.add("{Value:'"+rst.getString(colName)+"',Text:'"+rst.getString("dictvalue")+"'}");
        }
        rst.beforeFirst();
        return menu+=joiner.toString()+"]}";
    }
    private synchronized String setJsName(TreeGridDTO dto) {
        return "grid_" + dto.formID +(dto.hasControlLayout?("_"+dto.userCode):"")+ "_" + dto.winType + ".xml";
    }
    private synchronized String setFileName(TreeGridDTO dto) {
        //由于8类型的二三表共用一个页面,且用2表的功能号作为文件名称,所以这里需要特殊处理
        int formid= dto.formID;
        if(dto.winType==15&&dto.conNum!=0){
            formid=dto.minID;
        }
        return  formid +(dto.hasControlLayout?("_"+dto.userCode):"") + "_grid.jsp";
    }
    /**
     * 生成页面时需要检查的关键字段名,避免生成格线有问题
     */
@@ -930,9 +1000,9 @@
     */
    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) {//取得需要的字段名称
        int flg = this.setGetPrivaryTable(type);
        StringBuffer sb = new StringBuffer();
//        StringBuffer sb = new StringBuffer(); //舍弃这属性 xin 2021-3-23 14:42:37
        StringBuffer exps = new StringBuffer();
        String sql = " select FieldID,fieldname,GridCaption,ShowOnGrid,showFieldValueExpression from gfield where formid=? and HeadFlag=?  order by statisid asc";
        String sql = " select FieldID,fieldname,GridCaption,ShowOnGrid,showFieldValueExpression,displayformat,isnull(GridControlType,0) as GridControlType from gfield where formid=? and HeadFlag=?  order by statisid asc";
        List<Map<String, Object>> list = null;
        try {
            SpObserver.setDBtoInstance("_" + dbid);
@@ -944,18 +1014,32 @@
        int i = 0;
        String str = "";//保存哪些字段是隐藏的
        //下面添加的titleLis属性用来处理层的标题 xin 2021-3-23 14:39:52
        List<Map<String, Object>> titleLis = new ArrayList<>();
        for (String s : tem) {
            for (Map<String, Object> map : list) {
                if (s.trim().equalsIgnoreCase((String) map.get("FieldID"))) {
                    if ((Integer) (map.get("ShowOnGrid") == null ? 0 : map.get("ShowOnGrid")) == 1)
                        sb.append("<th width=\"\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
                    else {
                        if (str == "")
                    Map<String, Object> titleMap = new HashMap<>();
                    titleMap.put("field", s.toLowerCase());
                    titleMap.put("title", map.get("fieldname") == null
                            ? (String) map.get("GridCaption") : (String) map.get("fieldname"));
//                    titleMap.put("width", 100);
                    titleMap.put("align", "center");
                    titleMap.put("displayformat", (String) map.get("displayformat"));
                    int controlType=GridUtils.prossRowSetDataType_Int(map,"GridControlType");
                    titleMap.put("controlType", controlType);
                    if ((Integer) (map.get("ShowOnGrid") == null ? 0 : map.get("ShowOnGrid")) == 1) {
//                        sb.append("<th width=\"\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
                    } else {
                        if (str == "") {
                            str += map.get("FieldID");
                        else
                        } else {
                            str += ";" + map.get("FieldID");
                        sb.append("<th width=\"\" style=\"display:none;\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
                        }
//                        sb.append("<th width=\"\" style=\"display:none;\">").append(map.get("fieldname") == null ? (String) map.get("GridCaption") : (String) map.get("fieldname")).append("</th>");
                        titleMap.put("hide", true);//隐藏字段
                    }
                    titleLis.add(titleMap);//获取标题信息
                    //取权限表达式输出到页面
                    String strexp = GridUtils.prossRowSetDataType_String(map, "showFieldValueExpression");
                    if (!"".equalsIgnoreCase(strexp)) {
@@ -980,8 +1064,13 @@
            e.printStackTrace();
        }
        String json = "{\"data\":\";" + str + ";\",\"backfilds\":\"" + backFilds + "\",\"sf\":\"" + sf + "\",\"df\":\"" + df + "\",\"to\":\"" + to + "\",\"form\":\"" + form + "\",\"exp\":\"" + strexps + "\",\"one\":\"" + (one ? 1 : 0) + "\"}";
        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>" +
                sb.toString() + "</tr></table></div>\t\n";
        //        注释这个返回值,重新返回一个 xin 2021-3-23 14:32:35
//        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>" +
//                sb.toString() + "</tr></table></div>\t\n";
        return "<div id=\"T_" + fromid + "_10" + rod + "div\" style=\"z-index:9999;display:none;position:absolute;height:320px;overflow:auto;\">" +
                "<table  data-datas=\"" + json.replaceAll("\"", "'") + "\" data-title=\"" + GridUtils.toJson(titleLis).replaceAll("\"", "'") + "\"  " +
                "id=\"T_" + fromid + "_10" + rod + "CDiv\" lay-filter=\"T_" + fromid + "_10" + rod + "CDiv\" class=\"hovertable\">" +
                "</table></div>\t\n";
    }
    /**
@@ -1087,6 +1176,7 @@
            boolean iscopy = false;//标记当前9802是否有复制时排除字段,为了兼用不存在出错的情况
            boolean isref = false;//标记当前9802是否有自动刷新和加载到页面的字段,为了兼用不存在出错的情况
            int fumIndex = 0;//标记导出时候字段位置
            int tabColIndex = 0;//标记导出字段在汇总列的位置
            Map<String, String> vMap = this.prossDisable(dto);
            //dto.gfields.first();
            //   do{
@@ -1097,7 +1187,7 @@
//         Map<String,String> map9801= SqlFormatUtils.createSQLFormat(map,9801);
//         Map<String,String> map9802= SqlFormatUtils.createSQLFormat(map,9802);
//            //-----
                String id = GridUtils.prossRowSetDataType_String(map, "fieldid");//字段名
                String id = org.apache.commons.lang3.StringUtils.trim(GridUtils.prossRowSetDataType_String(map, "fieldid"));//字段名
                String dec = GridUtils.prossRowSetDataType_String(map, "gridcaption");//表格描述
                String fieldname = GridUtils.prossRowSetDataType_String(map, "fieldname");//字段描述
                String temp = (dec == null || "".equalsIgnoreCase(dec)) ? fieldname : dec;//如果没定义表描述就取字段名称作为表格显示字段
@@ -1138,6 +1228,11 @@
                boolean uppercase = GridUtils.prossRowSetDataType_Boolean(map, "uppercase");//大写
                String ValueExp = GridUtils.prossRowSetDataType_String(map, "showFieldValueExpression");//权限控制是否显示该值
                String editStatus = GridUtils.prossRowSetDataType_String(map, "editStatus");//权限控制是否显示该值
                if(org.apache.commons.lang3.StringUtils.isNotBlank(editStatus)){
                    if(editStatus.contains("'")){
                        throw new ApplicationException(id+"-editStatus参数值["+editStatus+"】不能存在单引号");
                    }
                }
                boolean oneRec = GridUtils.prossRowSetDataType_Boolean(map, "return_one_record");//是否返回到单记录
                boolean onlyOne = GridUtils.prossRowSetDataType_Boolean(map, "onlyOne");//只返回单条记录
                String sqlScript = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SqlScript"));// 控件sql
@@ -1149,6 +1244,7 @@
                boolean cpltrow = GridUtils.prossRowSetDataType_Boolean(map, "copyfromlastrow");//插入时从上行复制
                String cs = GridUtils.prossRowSetDataType_String(map, "stylecss");//css样式
                String tips = GridUtils.prossRowSetDataType_String(map, "TipsExpression");
                int isSuppressBlankLineForDropDown = GridUtils.prossRowSetDataType_Int(map, "isSuppressBlankLineForDropDown");
                valExp.append((ValueExp != null && !"".equalsIgnoreCase(ValueExp)) ? id + "|" + this.replaceBlank(ValueExp) + ";" : "");
                cssExp.append((cs != null && !"".equalsIgnoreCase(cs)) ? id + "|" + this.replaceBlank(cs.replaceAll(";", "~")) + ";" : "");
                tipsExp.append((tips != null && !"".equalsIgnoreCase(tips)) ? id + "|" + this.replaceBlank(tips.replaceAll(";", "~")) + ";" : "");
@@ -1219,16 +1315,6 @@
                    msgInfo.append(id + "-的格式设置不正确,不能以#号分隔,[" + displayformat + "]");
                //上面的都是读取9802的设置信息,接下来的才是逻辑处理
                if (isExport) {
                    //if(expTitle==1)   exportTitle.append(id.toLowerCase()).append(";");//拼接所有需要组成的id
                    if (displayformat != null && !displayformat.isEmpty())
                        exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append("#").append(displayformat.replaceAll("-", "~")).append(";");//-转成~是为了兼容之前的代码
                    else
                        exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append(";");
                    if (SumField > 0)
                        SumFieldInfo.append(id.toLowerCase()).append("#").append(SumField).append("|").append(funclinkname).append("|").append(fumIndex).append("|").append((displayformat != null && !displayformat.isEmpty()) ? displayformat.replaceAll("-", "~") : "0").append(";");
                    fumIndex++;
                }
                boolean listShow = ((dto.order == 1//表示是列表的情况(很少存在需要取隐藏字段值的情况) by 2015-4-7 去掉这个限制
                        // &&(type==33||type==34||type==36||type==38||type==41)
@@ -1259,12 +1345,16 @@
                    }
                }
                if (dto.order == 1 && "".equalsIgnoreCase(dto.orderFiled)) {//排序字段
                if (dto.order == 1) {//排序字段
                    String sybmol="";
                    if(org.apache.commons.lang3.StringUtils.isNotBlank(dto.orderFiled)){
                        sybmol=",";
                    }
                    if (id.equalsIgnoreCase("doccode")) {
                        dto.orderFiled = id + " desc";
                        dto.orderFiled += sybmol+id + " desc";
                    }
                    if (id.equalsIgnoreCase("docdate")) {
                        dto.orderFiled = dto.orderFiled.length() == 0 ? id + " desc" : "," + id + " desc";
                        dto.orderFiled += sybmol + id + " desc";
                    }
                } else if (dto.order == 2 && "".equalsIgnoreCase(dto.orderFiled)) {
                    if (id.equalsIgnoreCase("docitem"))
@@ -1277,7 +1367,7 @@
                    }
                }
                if (fua != null && !fua.equalsIgnoreCase("") && activefuns&&calcuField!=0) {
                if (fua != null && !fua.equalsIgnoreCase("") && activefuns && calcuField != 0) {
                    formn.append(id.toLowerCase()).append("@p@").append(fua).append(":");
                }
                if (value != null && !value.equalsIgnoreCase("")) {//自动编号功能
@@ -1285,13 +1375,19 @@
                        List<Map> ct = this.getAutoCodeType(dto.formID, dto.dbid);
                        if (ct.size() == 0) msgInfo.append(id + "字段设置autocode,但没在9801进行相关设置!");
                        Map ma = ct.get(0);
                        if (ma.get("precodetype") == null || ma.get("codelength") == null || ma.get("preFixcode") == null)
                            msgInfo.append(id + "-字段设置autocode,但没在9801对【precodetype,preFixcode,codelength】进行相关设置!");
                        if ((Integer) ma.get("precodetype") == 1) {
                        if (ma.get("precodetype") == null || ma.get("codelength") == null )
                            msgInfo.append(id + "-字段设置autocode,但没在9801对【precodetype,codelength】进行相关设置!");
                       /* List<Map<String, Object>> li = this.getCodeInfo(dto.formID, dto.dbid);
                        if (li.size() == 0) msgInfo.append(id + "字段设置autocode,但没在[_sysautocode]表进行相关设置!");
                        Map map1 = li.get(0);*/
                        value = "autocode|" +dto.formID + "," + dto.winType + ",~"  ;
                        /*if ((Integer) ma.get("precodetype") == 1) {
                            List<Map<String, Object>> li = this.getCodeInfo(dto.formID, dto.dbid);
                            if (li.size() == 0) msgInfo.append(id + "字段设置autocode,但没在[_sysautocode]表进行相关设置!");
                            Map map1 = li.get(0);
                            value = "autocode|1|" + (Integer) map1.get("formid") + "," + (Integer) map1.get("Formtype") + "," + (String) map1.get("Fieldid") + "," + (Integer) map1.get("codelength") + "," + (String) map1.get("preFixcode");
                            value = "autocode|1|" + (Integer) map1.get("formid") + "," + (Integer) map1.get("Formtype") + "," + (String) map1.get("Fieldid") ;
                            map1 = null;
                        } else if ((Integer) ma.get("precodetype") == 2) {
                            try {
@@ -1302,7 +1398,7 @@
                            } finally {
                                SpObserver.setDBtoInstance();
                            }
                        }
                        }*/
                        values.append(id.toLowerCase()).append("#").append(value).append("&p&");
                        ma = null;
                    } else if (!value.equalsIgnoreCase("@now") && (value.indexOf("@") > -1 || value.indexOf("!") > -1)) {//替换成当前session的值
@@ -1312,35 +1408,57 @@
                    } else
                        values.append(id.toLowerCase()).append("#").append(value).append("&p&");
                }
                if (SumField != 0)
                if (SumField != 0) {
                    sumfu.append(id.toLowerCase()).append("#").append(SumField).append(":").append(funclinkname.replaceAll(",", "@p@")).append(",");//自定义公式有可能存在有,号需要处理
                if ((passwordchar != null && !"".equalsIgnoreCase(passwordchar) && "1".equalsIgnoreCase(passwordchar)))
                    tabColIndex++;
                }
                if (isExport) {
                    if (displayformat != null && !displayformat.isEmpty()) {
                        exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append("#").append(displayformat.replaceAll("-", "~")).append(";");//-转成~是为了兼容之前的代码
                    }else {
                        exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")).append(";");
                        if(type==9||type==19||type==40){
                            exportInfo.append(id.toLowerCase()).append("#").append(temp.replaceAll("-", "_")+"下载").append(";");
                        }
                    }
                    if (SumField > 0) {
                        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(";");
                    }
                    fumIndex++;
                }
                if ((passwordchar != null && !"".equalsIgnoreCase(passwordchar) && "1".equalsIgnoreCase(passwordchar))) {
                    type = 101;
                }
                //控件类型
                String typeName = Control.getTypeName(type == 0 ? 1 : type, typeInfo, id, displayformat, dto.winType);
                StringBuilder sb = new StringBuilder();
                if (type == 9 || type == 40) {
                if (type == 9 || type == 40 || type == 19) {
                    if (dto.picFild != null && dto.picFild != "") {
                        if (!dto.picFild.contains(id + ";"))
                            dto.picFild += id.toLowerCase() + ";";//保存是哪一个字段是图片字段
                    } else {
                        dto.picFild += id.toLowerCase() + ";";//保存是哪一个字段是图片字段
                        dto.picFild += id.toLowerCase() + ";";//用来保存是哪一个字段是图片字段
                    }
                    sb.append(" CanFocus='0' ");//图片不需要取得焦点,避免在进入编辑状态时上传图片,返回不显示的问题
                    sb.append(" ImgType='" + type + "' ");//区分是9,还是19
                    sb.append(" showType='" + (type == 9 ? 0 : 2) + "' ");//以后增加格线支持多附件显示需要用到,区别出到时应该取哪一个附件表(_sys_Attachment9,_sys_Attachment)的数据
                }
                if (type == 2 || type == 35 || type == 31 || type == 43 || type == 30 || type == 32) {
                    sb = fillFT(type, ft, sqlScript, dto);//2类型
                    sb.append(" CanEmpty='0' ");
                    dto.foot2 += id.toLowerCase() + ";";//解决针对2,35类型有值时候统计列会显示出来的问题
                    dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                if (type == 2 || type == 35 || type == 31 || type == 43 || type == 30 || type == 32|| type == 46) {
                    dto.isSuppressBlankLineForDropDown=isSuppressBlankLineForDropDown;
                    if(!(type==46&&ft==0&&org.apache.commons.lang3.StringUtils.isBlank(sqlScript))){
                        //46控件没有2,31的设置选项则不用在这里生成下拉列表
                        sb = fillFT(type, ft, sqlScript, dto);//2类型
                        sb.append(" CanEmpty='0' ");
                        dto.foot2 += id.toLowerCase() + ";";//解决针对2,35类型有值时候统计列会显示出来的问题
                        dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                    }
                }
                if (isAudit != 0) sb.append(" audit='").append(isAudit).append("'");//增加审计标记
                if (rowspan) {//合并行
                    sb.append(" Spanned='1' ");//表示需要合并
                    dto.rowspanStr += id + ";";//保存需要合并的字段,加载时需要用到
                }
                if (type == 3 || type == 31 || type == -3 || type == 42) { //3类型
                    String suggest = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "SuggestFileds").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    String RelationField = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "RelationField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
@@ -1352,11 +1470,12 @@
                    String form = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "FK").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    String sf = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "sPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    String df = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "dPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    if(StringUtils.isNotBlank(top)&&StringUtils.isBlank(form)){
                        throw new ApplicationException("【9802】里【"+id+"】设置了【外表|接收自身字段名】,则【外表|接收外表字段名】不能为空");
                    int scanCodeField = GridUtils.prossRowSetDataType_Int(map, "ScanCodeField");//APP扫码|3类型控件扫码录入功能
                    if (StringUtils.isNotBlank(top) && StringUtils.isBlank(form)) {
                        throw new ApplicationException("【9802】里【" + id + "】设置了【外表|接收自身字段名】,则【外表|接收外表字段名】不能为空");
                    }
if(StringUtils.isNotBlank(sf)&&StringUtils.isBlank(df)){
    throw new ApplicationException("【9802】里【"+id+"】设置了【外表|自身条件字段名】,则【外表|外表条件字段名】不能为空");
                    if (StringUtils.isNotBlank(sf) && StringUtils.isBlank(df)) {
                        throw new ApplicationException("【9802】里【" + id + "】设置了【外表|自身条件字段名】,则【外表|外表条件字段名】不能为空");
                    }
                    sb.append(" formid='").append(ft)
                            .append("' toParm=\"").append(top)
@@ -1367,9 +1486,10 @@
                            .append("' wtype='").append(wiType)
                            .append("' oneRec='").append(oneRec ? 1 : 0)
                            .append("' onlyOne='").append(onlyOne ? 1 : 0)
                            .append("' isSuppressBlankLineForDropDown='").append(isSuppressBlankLineForDropDown)
                            .append("' sqlWhere=\"").append(sqlWhere)// by danaus 2019/12/20 15:28
                            .append("\" path='").append(path)
                            .append("' scanCodeField='").append(scanCodeField)
                            .append(uppercase ? "'  uppercase='" + uppercase : "")
                            .append("' eFilter=\"").append(ef == null ? "" : (ef.replaceAll("'", "\\\\'").replaceAll("\n\t", ""))).append("\"");
                    String sug = "";
@@ -1389,18 +1509,17 @@
                        sug = sug.substring(0, sug.length() - 1);
                        sb.append(" suggest='" + sug + "'");
                        //生成显示的数据名称
                        //if(!sugId.contains(ft)){
                        //   sugId.add(ft);
                        rod++;//生成100之内的随机数
                        sb.append(" rand='10" + rod + "'");
                        dto.sugList.append(this.getSuggestFilds(ft + "", wiType, sug, sug, top, form, oneRec, rod, dto.dbid, sf, df));
                        //   }
                    }
                    if (type == -3)//表示为辅助核算
                    if (type == -3) {//表示为辅助核算
                        sb.append(" curType='gl' ");
                    if (type == 3 || type == -3)
                    }
                    if (type == 3 || type == -3) {
                        sb.append(" Button='/images/ppp.gif'  WidthPad='20'");
                    }
                    this.prossIntoSession(top, dto);
                    this.prossIntoSession(form, dto);
                    this.prossIntoSession(sf, dto);
@@ -1414,8 +1533,17 @@
                } else if (type == 1 || type == 0 || type == 7) {
                    sb.append(uppercase ? "  uppercase='" + uppercase + "'" : "");
                } else if (type == 9) {//图片控件
                } else if (type == 9 || type == 19) {//图片控件
                    sb.append(" Button='/images/d.jpg'  WidthPad='20' ");
                    dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                } else if (type == 46) {//颜色控件
                    sb.append("  colType='46' ");
                    dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                } else if (type == 47) {//进度条控件
                    sb.append(" colType='47' ");
                    dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                } else if (type == 48) {//css样式选择器
                    sb.append(" CanEmpty='0' Button='/images/ppp.gif'  WidthPad='20' colType='48' ");
                    dto.footb.append(id.toLowerCase()).append("Type='Text' ").append(id.toLowerCase()).append("Button='' ");//汇总页需要屏蔽单元格类型为Text
                }
                if (type != 2 && type != 31) {//下拉类型的不需要显示
@@ -1449,16 +1577,16 @@
//               String openType=this.prossRowSetDataType_String(map,"openType")==null?"0":this.replaceBlank(this.prossRowSetDataType_String(map,"openType").toLowerCase());
                    String sf = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkSPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    String df = this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkDPremissField").replaceAll("\\bid\\b", "_ycid_").toLowerCase());
                    boolean autoref = false;
                    int autoref = 0;
                    try {
                        autoref = GridUtils.prossRowSetDataType_Boolean(map, "isAutoRefresh");
                        autoref = GridUtils.prossRowSetDataType_Int(map, "isAutoRefresh");
                    } catch (Exception e) {
                    }
                    sb.append("  Fformid='").append(this.replaceBlank(GridUtils.prossRowSetDataType_String(map, "HyperlinkFT").toLowerCase()))
                            .append("' FsField=\"").append(sf)
                            .append("\" FdField=\"").append(df)
                            .append("\" Fref=\"").append(autoref ? 1 : 0)
                            .append("\" Fref=\"").append(autoref)
//                  .append("\" FopenType=\"").append(openType)//增加弹出层的功能 1表示正常的页卡,2表示弹出层显示
                            .append("\" Fwtype='").append(GridUtils.prossRowSetDataType_String(map, "HyperlinkFTFormType"))
                            .append("' Fop='").append(op == null ? "0" : (op.replaceAll("'", "\\\\'").replaceAll("\n\t", "")))
@@ -1479,9 +1607,9 @@
                }
                if (ShowOnGrid && id.equalsIgnoreCase(dto.lastField.toLowerCase())) sb.append(" ent='1' ");//增加标记为最后一个字段
                if (index < dto.frozencols) {//
                    left.append("<C CaseSensitive='0' Name='").append(id.toLowerCase()).append("'").append(" cpltrow='").append(cpltrow ? 1 : 0).append("' CanEdit='").append(readOnly ? 0 : 1).append("' Type='").append(typeName).append("' ")
                    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("' ")
                            .append((editStatus == "" || editStatus == null) ? "" : " editStatus='" + editStatus + "'")
                            .append(ShowOnGrid ? "" : " Visible='0' ")
                            .append(ShowOnGrid ? "" : " Visible='0' noItemShow='1' ")//noItemShow用于格线列显示
                            .append(fileterID ? " Visible='0' " : "");
                    if (!dto.isList && dto.gantt && "subtask".equalsIgnoreCase(id.toLowerCase()))
                        left.append(" CanGroup='2' GroupChar='/' GroupEmpty='0' ");
@@ -1492,11 +1620,11 @@
                                .append(" Visible='0' ")
                                .append(" />\n");
                    }
                    if (!fileterID&&ShowOnGrid) index++;
                    if (!fileterID && ShowOnGrid) index++;
                } else {
                    cols.append("<C CaseSensitive='0' Name='").append(id.toLowerCase()).append("'").append(" cpltrow='").append(cpltrow ? 1 : 0).append("' CanEdit='").append(readOnly ? 0 : 1).append("' Type='").append(typeName).append("' ")
                    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("' ")
                            .append((editStatus == "" || editStatus == null) ? "" : " editStatus='" + editStatus + "'")
                            .append(ShowOnGrid ? "" : " Visible='0' ")
                            .append(ShowOnGrid ? "" : " Visible='0' noItemShow='1' ")
                            .append(fileterID ? " Visible='0' " : "");
                    if (!dto.isList && dto.gantt && "subtask".equalsIgnoreCase(id.toLowerCase()))
@@ -1513,7 +1641,7 @@
            }
            //while(dto.gfields.next());
            if ("".equalsIgnoreCase(dto.orderFiled)) dto.orderFiled = firstID + " desc";
            if ("".equalsIgnoreCase(dto.primeKey)) dto.orderFiled = firstID + " desc";
            dto.expr = valExp.length() > 0 ? valExp.substring(0, valExp.length() - 1) : "";
            dto.cspr = cssExp.length() > 0 ? cssExp.substring(0, cssExp.length() - 1) : "";
            dto.tipspr = tipsExp.length() > 0 ? tipsExp.substring(0, tipsExp.length() - 1) : "";
@@ -1565,6 +1693,11 @@
        }
    }
    private String showMenuName(String caption, int isShowCell) {
        //设置了显示列功能才执行
        return (isShowCell == 1 && org.apache.commons.lang3.StringUtils.isNotBlank(caption)) ? (" MenuName='" + caption + "' ") : " ";
    }
    private void setFilter(String id, int type, StringBuilder filter, int dIndex) {
        switch (type) {
@@ -1587,15 +1720,16 @@
            case 2:
            case 31:
            case 35:
            case 46:
                filter.append(id).append("Range=\"1\"  ")
                        .append(id).append("Type='Text'")
                        .append(id).append("Type='Text' ")
                        .append(id).append("ShowMenu=\"1\"  ");
                break;
            case 3:
                filter.append(id).append("Range=\"1\" ")
                        .append(id).append("Button='' ")
                        .append(id).append("Type='Text'")
                        .append(id).append("Type='Text' ")
                        .append(id).append("ShowMenu=\"1\" ");
                break;
            case 9:
@@ -1607,9 +1741,7 @@
                        .append(id).append("ShowMenu='0' ");
                break;
            case 6:
                filter.append(id).append("Range=\"1\" ")
                        .append(id).append("Button=\"Defaults\" ")
                        .append(id).append("Defaults=\"|*FilterOff|*RowsAll\" ")
                filter.append(id).append("CanEmpty=\"1\" ")
                        .append(id).append("ShowMenu=\"0\" ");
                break;
        }
@@ -1701,11 +1833,13 @@
                        .append(temp)
                        .append("'");
                index++;
                if(!"".equalsIgnoreCase(dto.setInfo_dy)){
                    dto.setInfo_dy +=",";
                }
            }
            dto.setInfo_dy += sb.toString();
            if (org.apache.commons.lang3.StringUtils.isNotBlank(sb.toString())) {
                if(!"".equalsIgnoreCase(dto.setInfo_dy)) {
                    dto.setInfo_dy += ",";
                }
                dto.setInfo_dy += sb.toString();
            }
        }
    }
@@ -1743,14 +1877,18 @@
        } else if (dto.order == 2 && dto.index2 != null && !dto.index2.isEmpty()) {//明细表
            temp = setSqlOrderBy(dto.index2, " asc");
        } else {
            if (dto.field.isEmpty())
            if (!dto.orderFiled.isEmpty()) {
                temp = dto.orderFiled;
            else {
                //处理8类型第三表的排序不是默认的docitm的情况,也就是9801定义有排序
                if(dto.winType==15&&dto.order==2&& org.apache.commons.lang3.StringUtils.isNotBlank(dto.index1)){
                    temp = setSqlOrderBy(dto.index1, " asc");
            } else {
                if (dto.field.isEmpty()) {
                    temp = dto.orderFiled;
                }else {
                    temp = setSqlOrderBy(dto.field, dto.order == 1 ? " desc" : " asc");
                    //处理8类型第三表的排序不是默认的docitm的情况,也就是9801定义有排序
                    if (dto.winType == 15 && dto.order == 2 && dto.conNum == 2 && org.apache.commons.lang3.StringUtils.isNotBlank(dto.index1)) {
                        temp = setSqlOrderBy(dto.index1, " asc");
                    } else {
                        temp = setSqlOrderBy(dto.field, dto.order == 1 ? " desc" : " asc");
                    }
                }
            }
        }
@@ -1809,7 +1947,7 @@
     * @see com.yc.action.grid.TreeGridIfc#createGrid(int, int, java.lang.String, java.lang.String, java.lang.String[])
     */
    @Override
    public void createGrid(int type, int formID, String root, String path, String fileName[], String tempPath, String pst, TMuiDTO dt, String dbid) throws DataAccessException, SQLException {
    public void createGrid(int type, int formID, String root, String path, String fileName[], String tempPath, String pst, TMuiDTO dt, String dbid,String userCode,boolean isCustomLayout) throws DataAccessException, SQLException {
        try {
            StringBuilder sb = new StringBuilder();//总的js
            StringBuilder jsp = new StringBuilder();//总的jsp
@@ -1822,10 +1960,12 @@
            dto.winType = type;
            dto.othType = 0;
            dto.dbid = dbid;
            dto.userCode=userCode;
            dto.hasControlLayout=isCustomLayout;
            if (dt != null) {//把多表的值传过来填充
                this.setTabPage497(dt.type, dt.height1, dt.indexs, dt.tolkey, dt.fromid, dt.index,dto);
                this.setTabPage497(dt.type, dt.height1, dt.indexs, dt.tolkey, dt.fromid, dt.index, dto);
                this.setXxk(dt.xxk, dto);
                dto.formTabName=dt.formTabName;
                dto.formTabName = dt.formTabName;
            }
            if (dt != null && dt.addnew)
                dto.postStatusAddNew = dt.addnew;
@@ -1869,9 +2009,14 @@
                    dto.treefield = this.getTreeFields(formID, dto.dbid);
                }
                String str = FileUtil.readFile(tempPath + "/grid.jsp");//页面模板
                if(dto.b497){
                    //多表页面不需要这个,因为页面是用静态包含,其他用动态包含<jsp:include page="......" />
                    str=str.replace("<%@ include file=\"dataHead.jsp\" %>","");
                }
                if (dto.muilGrid && i == 0) jsp.append(str).append("\n");    //先保存好模板,以便生成多表时候用
                dto.conNum = i;
                dto.order = setOrderName(dto);
                dto.orderFiled="";//还原到初始状态
                this.print(root, dto);
                String strJs = FileUtil.readFile(tempPath + (((dto.gantt && dto.order == 2) || (dto.gantt && dto.winType == 18)) ? "/grid_Gantt.js" : "/grid.js"));//页面js
                String[] ver = dto.verNo.split("/");
@@ -1896,6 +2041,7 @@
                            .replaceAll("@formula", this.replaceBlank(dto.formula))//自定义公式 //增加判断是否存在死循环的可能
                            .replaceAll("@rowSpan", this.replaceBlank(dto.rowspanStr))//合并行的字段
                            .replaceAll("@totalCols", this.replaceBlank(dto.totalCols))//统计列
                            .replaceAll("@sumFields", org.apache.commons.lang3.StringUtils.isNotBlank(dto.masterSumFields)?(this.replaceBlank(dto.masterSumFields).toLowerCase()+","+this.replaceBlank(dto.detailSumFields).toLowerCase()):"")//主表汇总字段,明细表统计列汇总字段
                            .replaceAll("@rowcopyfields", dto.rowcopyfields == null ? "" : this.replaceBlank(dto.rowcopyfields))
                            .replaceAll("@rowcopyformids", dto.rowcopyformids == null ? "" : this.replaceBlank(dto.rowcopyformids))
                            .replaceAll("@t302", dto.winType == 302 ? true + "" : false + "")//302类型
@@ -1919,7 +2065,7 @@
                            .replaceAll("@panelID", dto.PriIndex + "")//针对77类型取哪一个面板数据进行过滤
                            .replaceAll("@ycadd", this.setToolAdd(dto) == 2 ? "Add, " : "")//清单和查询页面不需要增行和删行
                            .replaceAll("@predocstatus", dto.predocstatus + "")//确认前状态值
                            //.replaceAll("@PostStatusGridAddNew",dto.postStatusAddNew+"")//确认前状态值
                            .replaceAll("@postdocstatus", dto.postDocStatus + "")//确认后状态值
                            .replaceAll("@Columns", dto.colset == 1 ? "Columns," : "")//列过滤
                            .replaceAll("@Actions", dto.actions)//
                            .replace("@Tree", (dto.conNum == 0 || (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol))) ? "" : " AddChild,")//
@@ -1937,6 +2083,7 @@
                            .replaceAll("@lang", ver[ver.length - 1])//语言
                            .replaceAll("@foot2", this.replaceBlank(dto.foot2))
                            .replaceAll("@_ycaddnew_@", this.setToolAddForNew(dto))//当前用户是否存在OA审核按钮,其中有为1的则格线需要显示增行按钮
                            .replaceAll("@_isCustomLayout_@", dto.hasControlLayout?(true+""):(false+""))//当前用户是否存在OA审核按钮,其中有为1的则格线需要显示增行按钮
                            //.replaceAll("@_attachment_server_@", domain==null?"":domain)//附件服务器地址
                            .replaceAll("@picFild", this.replaceBlank("&picFild=" + dto.picFild))
                            .replaceAll("@TBCols", "&tbCols=" + EncodeUtil.base64Encode(this.replaceBlank(dto.totalCols)))//统计列
@@ -1951,7 +2098,7 @@
                            .replaceAll("@layout", this.setJsName(dto))//js文件名称
                            .replaceAll("@hasGrid", hasGrid)//js文件名称
                            .replaceAll("@isTree", (dto.mainCol == null || "".equalsIgnoreCase(dto.mainCol)) ? "" : "&isTree=1")
                            .replaceAll("@winType", dto.winType + "@p@" + i)//表的顺序 0表示读取主表 1表示读取从表
                            .replaceAll("@winType", dto.winType + "@p@" + (dto.winType==19?1:i))//表的顺序 0表示读取主表 1表示读取从表,19类型特定为1
                            .replaceAll("@id", dto.formID + "")//功能号
                            .replaceAll("@DealAfterDocSave", ddsave)//保存时执行
                            .replaceAll("@CancelProc", "&cancelProc=" + this.replaceBlank(EncodeUtil.base64Encode(dto.cancelProc)) + "&cancelisSave=" + dto.cancelisSave + "&isExchangeDataWithHost=" + dto.isExchangeDataWithHost)//取消确认
@@ -1981,7 +2128,7 @@
                    //--------------------
                    String hi = this.setGridHight(dto);
                    dto.headerDiv = "\n<div id=\"T_" + dto.formID + "\" style=\"margin-left:10px;margin-top:10px;width: 96%; height: " + hi + ";" + ((dto.b497 && dto.PriFormID == 0 || dto.b499 && dto.PriFormID == 0) && dto.xxk == 0 ? "display:none" : "") + "\"></div>" + ("90%".equalsIgnoreCase(hi) ? "" : "<div style=\"height:10px;\"></div>");//增加多表加载时不显示所有格线
                    dto.headerDiv = "\n<div id=\"T_" + dto.formID + "\" style=\"margin:5px 10px 15px 10px;width: 98%; height: " + hi + ";" + ((dto.b497 && dto.PriFormID == 0 || dto.b499 && dto.PriFormID == 0) && dto.xxk == 0 ? "display:none" : "") + "\"></div>";//增加多表加载时不显示所有格线
                    if ((i <= 1 && !dto.muilGrid) || (dto.muilGrid && i < 1 && num < 4)) {//不是多表,只需要生成一个gt-grid   单表,清单表(二表,三表,多表)
                        if ((dto.winType != 7 && dto.winType != 77) && (dto.b497 && dto.PriFormID == -1 || dto.b499 && dto.PriFormID == -1)) {//表示496,498多表的第一个表
                            int value = Integer.parseInt(dto.tolkey);
@@ -2010,7 +2157,7 @@
                                .replaceAll("@suggstDiv", dto.sugList.toString())//自动补全
                                .replaceAll("@gridconnum", String.valueOf(dto.conNum));//判断单表用来计算grid高度需要。。。替换grid.jsp里面的@gridconnum
                        FileUtil.writeFile(js, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), this.setJsName(dto), pst, dto));//生成新页面js
                        FileUtil.writeFile(str, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), fileName[0], pst, dto));//生成新页面
                        FileUtil.writeFile(str, root.replaceAll("\\\\", "/") + File.separatorChar + this.setFilePath(path.replaceAll("\\\\", "/"), this.setFileName(dto), pst, dto));//生成新页面
                    } else {//多表,整个页面生成多个表格
                        if (refgrid != "") refgrid += ",";
                        refgrid += ("T_" + dto.formID);//为了引用其它grid,3表
@@ -2050,7 +2197,7 @@
                        .replaceAll("@head", hd.toString())//自定义表头
                        .replaceAll("@suggstDiv", dto.sugList.toString())//自动补全
                        .replaceAll("@gridconnum", String.valueOf(dto.conNum));//判断多表用来计算grid高度需要。。。替换grid.jsp里面的@gridconnum
                FileUtil.writeFile(strd, root.replaceAll("\\\\", "/") + this.setFilePath(path.replaceAll("\\\\", "/"), fileName[0], pst, dto));//生成新页面
                FileUtil.writeFile(strd, root.replaceAll("\\\\", "/") + this.setFilePath(path.replaceAll("\\\\", "/"), this.setFileName(dto), pst, dto));//生成新页面
            }
            sb = null;
            jsp = null;