package com.yc.action.grid; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.yc.action.build.buildFunc; import com.yc.action.panval.DataCheck; import com.yc.api.bean.T112002; import com.yc.api.service.QrServiceIfc; import com.yc.app.v2.controller.APPController; import com.yc.currentThreadInfo.CurrentLocal; import com.yc.entity.AttachmentConfig; import com.yc.entity.DataSourceEntity; import com.yc.entity.TableColumnsDataTypeEntity; import com.yc.exception.ApplicationException; import com.yc.exception.CallBackMessage; import com.yc.factory.FactoryBean; import com.yc.factory.InitSystem; import com.yc.multiData.MultiDataSource; import com.yc.multiData.SpObserver; import com.yc.open.init.CheckPointType; import com.yc.open.mutual.controller.MutualController; import com.yc.open.mutual.schedule.Gate; import com.yc.open.mutual.schedule.GateEntity; import com.yc.open.utils.HttpClientUtil; import com.yc.open.wms.controller.WMSController; import com.yc.sdk.shopping.util.SettingKey; import com.yc.security.Base64Utils; import com.yc.service.BaseService; import com.yc.service.grid.DoExecuteParameter; import com.yc.service.grid.GridServiceIfc; import com.yc.service.grid.TableMetaData; import com.yc.service.impl.DBHelper; import com.yc.service.new38type.Type38Ifc; import com.yc.service.panel.GfieldApprovedButtonIfc; import com.yc.service.panel.PanelServiceIfc; import com.yc.service.sqlformat.entity.SqlFormatEntity; import com.yc.service.sqlformat.service.CreateSQLFormatIfc; import com.yc.service.sys.SysIfc; import com.yc.utils.*; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.Base64; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import static java.util.stream.Collectors.joining; /*** * 表格处理代码, gt-grid提交所有变化过的数据 * * @author 邓文峰 2010-3-24 **/ @Controller("GTGrid") @Scope("prototype") @RequestMapping("/gtGrid.do") public class GTGrid extends com.yc.action.BaseAction { private static ThreadLocal> local = new ThreadLocal>(); @Autowired Type38Ifc type38Ifc; @Autowired ThreadPoolTaskExecutor threadPoolExecutor; @Autowired MutualController mutualController; @Autowired WMSController wmsController; @Autowired APPController appController; @Autowired Gate gate; private static final int MAX_RECORD = 1048576;//数据导出的最大数据量,excel2007 /** * 功能号 */ private static String exwheres; private int formID; private String wherepan = ""; private String type496 = ""; private String wherepan496 = ""; private String zhupan496 = ""; private String doc496 = ""; private SqlRowSetMetaData md; private int cont = 1;//累计数 // private String insertsql496 ="";// 保存496临时主sql语句 /** * 面板的表结构数据 */ private SqlRowSetMetaData md1; /** * 表格处理的业务类 */ @Autowired private GridServiceIfc gridService;// 表格处理的业务类 /** * 保存所有新增sql语句 */ List insertsql = new ArrayList();// 保存所有sql语句(新增) /** * 保存所有修改sql语句 */ List updatesql = new ArrayList();// 保存所有sql语句(修改) /** * 保存所有删除sql语句 */ List sqlDel = new ArrayList();// 保存所有sql语句(删除) private int winType; private long docitem; private String doccode; List add = new ArrayList(); List update = new ArrayList(); List del = new ArrayList(); List add_p = new ArrayList(); List update_p = new ArrayList(); List del_p = new ArrayList(); List totalProc = new ArrayList();//保存所有已处理过的过程,传到后台执行 public String getDoccode() { return doccode; } // 单据保存组 /** * 保存组的存储过程参数值 */ private List saveProc = new ArrayList();// 存储过程参数值 /** * 保存组的存储过程参数 */ private List tempProc = new ArrayList();// 存储过程参数 /** * 保存组的存储过程名称 */ private List procName = new ArrayList();// 存储过程名称 /** * 审核,通过等操作的存储过程的存储过程名称 */ private String PerProc = "";// 存储过程名 /** * 审核,通过等操作的存储过程的存储过程参数列表 */ private String PerProcPram = "";// 存储过程参数列表 private boolean isSave = true; // 保存时执行 /** * 保存时执行的存储过程的存储过程名 */ private String DProc = "";// 保存时执行的存储过程名 /** * 保存时执行的存储过程的存储过程参数列表 */ private String DProcPram = "";// 保存时执行的存储过程参数列表 /** * 自定义生成单号参数列表 */ private String docPram = "";// 自定义生成单号参数列表 private SqlRowSetMetaData md2; /** * 面板处理业务类 */ @Autowired PanelServiceIfc panels; @Autowired GfieldApprovedButtonIfc button; @Autowired private SysIfc sys; /** * 保存三表结构关联表的关系ID */ private String keyid; /** * 三表结构中第二个表格的所有的删除sql语句 */ private List otherDel = new ArrayList(); /** * 三表结构中第二个表格的docitm值 */ private long docitem2; private String conls = ""; private String status = ""; private String tableName; private String taboth; private String oldCode = ""; /** * 功能链接调用的过程 **/ private String FunLinkProc = ""; private String FunLinkPram = ""; private List>> taobaoAPI = new ArrayList>>(); private String flag; private Map> insert = new HashMap>(); private int totalNum = 0;//计算新增有多少条数据,方便后面计算长度 private String TbkeyID = ""; private boolean isTaobao; private String temcode = ""; private boolean flag_panel = false;//用在excel导入,只导主表时候需要根据 每条记录生成一个单号 private String temCode = "";//提供给手机调用确定功能需要的doccode. private String picFild = ""; private List picList = new ArrayList<>(); private String page_formid = ""; private String ExcelProc = ""; private String canelProc = ""; private String revokeProc = ""; private String[] oaExternalURL = null; private boolean isDoccode; public String getTemcode() { return temcode; } /** * 简化版确定功能 * * @param formid 功能号 * @param docCode 单号 * @param HttpServletRequest request * @param HttpServletResponse resp **/ @RequestMapping(params = "m=newTran") @ResponseBody public Object newTran(Integer formid,String docCode, HttpServletRequest request, HttpServletResponse resp) { final CallBackMessage callBackMessage =new CallBackMessage(); String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; String userCode = request.getSession().getAttribute(SessionKey.USERCODE) + ""; String userName = request.getSession().getAttribute(SessionKey.USERNAME) + ""; try{ SpObserver.setDBtoInstance("_" + dbid); if(formid==null){ throw new ApplicationException("功能号不能为空"); } if(formid.intValue()<=0){ throw new ApplicationException("功能号不能小于0"); } if(org.apache.commons.lang3.StringUtils.isBlank(docCode)){ throw new ApplicationException("单号不能为空"); } gridService.doNewTran(formid,docCode,userCode,userName); callBackMessage.sendSuccessMessageByDefault(); return callBackMessage.toJSONObject(); }catch(Exception ex){ callBackMessage.sendErrorMessage(this.getErrorMsg(ex)); return callBackMessage.toJSONObject(); }finally { SpObserver.setDBtoInstance(); } } /** * 确定功能,执行单据的业务过账逻辑 * * @param Gird 封装请求对象 * @param HttpServletRequest request * @param HttpServletResponse resp **/ @RequestMapping(params = "m=tran") public void tran(Grid grid, HttpServletRequest request, HttpServletResponse resp) { resp.setContentType("text/html;charset=utf-8"); this.checkSession(request, resp); GTJson json = null; // PrintWriter out = null; String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { GtTranInfo info = null; if (request.getHeader("x-app-type") != null && "ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) {//手机端传过来 try { String s = IOUtils.toString(request.getInputStream(), "utf-8"); info = JOSNUtils.fromJosn2(s); } catch (IOException e) { e.printStackTrace(); throw new ApplicationException("提交出错"); } } else { info = JOSNUtils.fromJosn2(request.getParameter("_gt_json"));// 取得gt-grid返回的信息 } if (info == null) { throw new ApplicationException("服务端未收到传过来的数据 _gt_json ,如果传递的内容太大,请修改 tomcat 在conf/server.xml下的配置,请增加,如果启用 nginx,请在 location 位置增加 \"client_max_body_size 2000m;\",此参数表示post的消息最大限制大小 "); } json = info.getTran(); json.process(); request.setAttribute("isTran", true); GTJson jsave = info.getSave(); jsave.setClickTran(1); request.setAttribute("_gt_json", GridUtils.toJson(jsave)); List sqlinfo = this.save(grid, request, resp); //组装新增,修改,删除等功能所需要的数据,请求业务类执行 String code = sqlinfo.size() > 0 ? sqlinfo.get(0).getDoccode() : ""; //out = resp.getWriter(); String jcode = ""; boolean pan496 = false; if (json.getPanels() != null && json.getPanels().size() > 1 && "497".equalsIgnoreCase(json.getgType())) { pan496 = true; } if (this.doccode == null || "".equalsIgnoreCase(this.doccode)) { this.doccode = code; } int formid = 0; int tranid = 0; if ("499".equalsIgnoreCase(json.getgType()) || "497".equalsIgnoreCase(json.getgType())) { if (pan496) { formid = Integer.parseInt(json.getPanels().get(0).getPanelTable().split(";")[0]); } else { formid = Integer.parseInt(json.getPanelTable().split(";")[0]); } try { SpObserver.setDBtoInstance("_" + dbid); tranid = gridService.getTranID(formid); } catch (DataAccessException e) { throw new ApplicationException("请在9801维护【" + formid + "】过账类型设置,才能执行确定操作"); } finally { SpObserver.setDBtoInstance(); } } else { formid = grid.getFormID(); try { tranid = Integer.parseInt(grid.getTrangroup()); } catch (NumberFormatException e) {// xin 2020-11-2 16:58:03 throw new ApplicationException("请在9801维护【" + formid + "】过账类型设置,才能执行确定操作"); } } String tabname = ""; if (pan496) { tabname = this.getPannelTalbe(json.getPanels().get(0).getPanelTable(), dbid); } else { tabname = this.getPannelTalbe(json.getPanelTable(), dbid); } CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用 CurrentLocal.setCurrentFormid(this.formID + ""); String doccode = null; try { //---执行前,推送入口,不管设置什么执行点(审核前或审核后)也会执行【起草人提交】的推送 gate.enterGate(new GateEntity(formid, winType, CheckPointType.EXECUTE_BEFORE_POST, this.doccode, dbid, "提交")); }catch (Exception ex){ StringBuffer mes_ = new StringBuffer(); SqlInfo sqlInfo =new SqlInfo(); sqlInfo.setDoccode(this.doccode); showPushGateException(request, resp, mes_, sqlInfo, ex); return; } try { SpObserver.setDBtoInstance("_" + dbid); doccode = gridService.doTarnType(tranid, this.doccode, tabname, formid, (String) request.getSession().getAttribute(SessionKey.HRCODE), (String) request.getSession().getAttribute(SessionKey.HRNAME), request.getSession(), sqlinfo); } finally { SpObserver.setDBtoInstance(); } //--增加处理单据确认后生成二维码,线程处理 if (org.apache.commons.lang3.StringUtils.isNotBlank(doccode)) this.doccode = doccode; int winType = getType(json.getgType()); threadPoolExecutor.execute(new QrCodeRunable(formid, winType, this.doccode , (String) request.getSession().getAttribute(SessionKey.HRCODE) , (String) request.getSession().getAttribute(SessionKey.HRNAME) , dbid)); try { //---执行后,推送入口,不管设置什么执行点(审核前或审核后)也会执行【起草人提交】的推送 gate.enterGate(new GateEntity(formid, winType, CheckPointType.EXECUTE_AFTER_POST, this.doccode, dbid, "提交")); }catch (Exception ex){ StringBuffer mes_ = new StringBuffer(); SqlInfo sqlInfo =new SqlInfo(); sqlInfo.setDoccode(this.doccode); showPushGateException(request, resp, mes_, sqlInfo, ex); return; } String msg1 = this.replaceBlank(EncodeUtil.base64Encode(this.doccode)).trim() + "#|#@success#|#2#|#" + EncodeUtil.base64Encode("doccode='" + this.doccode + "'&fl=" + json.getFl()); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { AppJson app = new AppJson(); app.setInfo(msg1); this.printJson(resp, GridUtils.toJson(app)); } else { this.print(resp, msg1); } } catch (DataAccessException e) { clearDuplicateSubmitUNID(); List checkinfo = null; try { //增加确认出错,需要刷新当前页,避免再次确认生成重复单 String error = this.getErrorMsg(e); String msg = ""; String onlinePay = "0"; if (error.startsWith("datacheckError")) { StringBuffer sb = new StringBuffer(); sb.append(error); String[] str = error.split("#t#"); String[] checkFlg = str[0].split("_"); if (checkFlg.length > 1) { onlinePay = checkFlg[1]; } error = error.replace("_" + checkFlg[1], ""); sb = new StringBuffer(error); checkinfo = this.prossDataCheck(sb); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) {//原生APP msg = "datacheckError#|#" + GridUtils.toJson((checkinfo != null ? checkinfo : "")); } else { if (sb.length() > 0) { msg = sb.toString(); //在线支付标记 msg += ";pb#onlinePay=" + onlinePay; } } } else { msg = "tranError#|#" + error + "#|#1#|#@error#|#" + EncodeUtil.base64Encode("doccode='" + this.doccode + "'&fl=" + json.getFl()); } if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) {//原生APP AppJson app = new AppJson(); app.setInfo(msg); this.printJson(resp, GridUtils.toJson(app)); } else { this.print(resp, msg); } } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } catch (Exception e1) { clearDuplicateSubmitUNID(); e1.printStackTrace(); try { String infos = "tranError#|#" + this.getErrorMsg(e1) + "#|#1#|#@error#|#" + EncodeUtil.base64Encode("doccode='" + this.doccode + "'&fl=" + json.getFl()); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { AppJson app = new AppJson(); app.setInfo(infos); this.printJson(resp, GridUtils.toJson(app)); } else { this.print(resp, infos); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } finally { json = null; local.remove(); } } private int getType(String type) { switch (type) { case "9": return 5; case "17": return 16; case "497": return 496; case "499": return 498; default: return Integer.parseInt(type); } } public String getPannelTalbe(String str, String dbid) { String[] st = str.split(";"); String tab = null; try { SpObserver.setDBtoInstance("_" + dbid); tab = panels.getPannelTalbe(Integer.parseInt(st[0]), Integer.parseInt(st[1])); } catch (NumberFormatException e) { } catch (Exception e) { } finally { st = null; SpObserver.setDBtoInstance(); } return tab; } /** * 判断会话是否过期,过期则直接返回 **/ private void checkSession(HttpServletRequest request, HttpServletResponse resp) { if (request == null) return; HttpSession se = request.getSession(); if (se.getAttribute(SessionKey.HRCODE) == null) { this.print(resp, "会话过期,请重新登录!"); } } //执行外部url private void prossOaExternalURL(String[] str, int flag, HttpServletRequest request) { if (str == null) { return; }//没设置直接返回 if (str[1] != null && str[1].contains("&")) { throw new ApplicationException("外部URL参数替换不完整:" + str[1]); } if (Integer.valueOf(str[0]) == flag) { try { String hostUrl = SettingKey.getHostUrl(request); final CloseableHttpClient client = HttpClientUtil.getClient(); String url = str[1].replaceAll("\\|", "&"); if (!url.startsWith("http")) { url = hostUrl + url; } Cookie[] cookies = null; if (url.toLowerCase().startsWith(hostUrl.toLowerCase())) { // 获得登陆后的Cookie cookies = request.getCookies(); } final HttpGet httpGet = HttpClientUtil.CreateHttpGet(url, cookies); final CloseableHttpResponse response = client.execute(httpGet); if (response.getStatusLine().getStatusCode() != 200) { throw new ApplicationException("调用外部【" + url + "】执行出错"); } } catch (Exception e) { throw new ApplicationException(e.getMessage()); } } } @RequestMapping(params = "m=save") public void saveFinal(Grid grid, HttpServletRequest request, HttpServletResponse resp) throws DataAccessException { StringBuffer mes_ = new StringBuffer(); SqlInfo info = null; List sqls = null; GTJson json = null; String dbid = null; boolean isactionCanel = false; try { sqls = this.save(grid, request, resp); StringBuffer sb = new StringBuffer(); if (sqls.size() > 0) info = sqls.get(0); for (SqlInfo s : sqls) { sb.append(s.getSql()); } String sql = sb.toString(); if ((this.formID == 9801 || this.formID == 9842 || this.formID == 9802 || this.formID == 9843 || this.formID == 9816||this.formID == 9685) && !"".equalsIgnoreCase(this.page_formid)) {//每次修改都更新版本号 sql = info.getSql() + "\n update gform set version=isnull(version,0)+1 where formid=" + this.page_formid + ";"; } dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; if (info.isDoccode() && grid.getCanPric() == 1) { try { //----取消确认前检查是否需要执行内部推送功能 //检查当前表头的callBackMsg不为空表示已内部推送成功,需要先执行删除对方的单据 String formidByCanel = info.getJson().getFormid(); if (org.apache.commons.lang3.StringUtils.isBlank(formidByCanel)) { formidByCanel = grid.getFormID() + ""; } mutualController.proccessCanelProc(dbid, Integer.parseInt(formidByCanel), info.getDoccode(), "del",CheckPointType.EXECUTE_BEFORE_POST); //----推送金屋的取消确认 //是金屋系统才执行 final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid); if ( ("wms_test".equalsIgnoreCase(dataSourceMap.getDb()) ||"KeLe_SuZhou".equalsIgnoreCase(dataSourceMap.getDb()) ) ) { wmsController.proccessCancelProc(dbid, Integer.parseInt(formidByCanel), info.getDoccode(), resp); } //表示在出错处理里判断是执行了取消确认出的错 isactionCanel = true; //---- } catch (Exception e1) { throw new ApplicationException(this.getErrorMsg(e1)); } }else { if (info.isDoccode() && org.apache.commons.lang3.StringUtils.isNotBlank(info.getDoccode())) { try { //----推送入口 gate.enterGate(new GateEntity(this.formID, winType, CheckPointType.EXECUTE_BEFORE_POST, info.getDoccode(), dbid, info.getOaExternalURL() == null ? "" : info.getOaExternalURL()[2])); }catch (Exception ex){ showPushGateException(request, resp, mes_, info, ex); return; } } } //----执行前,调用OA审核的外部URL this.prossOaExternalURL(info.getOaExternalURL(), 0, request); try { SpObserver.setDBtoInstance("_" + dbid); if (info.isDoccode()) { if (grid.getCanPric() == 1 || grid.getRevokePric() == 1) { sql += "\n insert into @table (docCode,rowid,detailRowid,Memo,LinkDocInfo,onlinePay,onlineRefund) values(isnull(@newDoccode1,''),'','','','',-1,-1)\n" + " select docCode,rowid,detailRowid,Memo,LinkDocInfo,onlinePay,onlineRefund from @table \n";//设置返回值 } else { //增加是否需要执行在线支付 if(info.getOnlinePay()==1){ sql+=" \n select @onlinePay=case when isnull(OnlinePaymentAmount,0) > 0 then 1 else 0 end from "+info.getTableName()+" where doccode=@newDoccode1 \n"; } sql += "\n insert into @table (docCode,rowid,detailRowid,Memo,LinkDocInfo,onlinePay,onlineRefund) values(isnull(@newDoccode1,''),isnull(@rowid1,''),isnull(@detailrowid1,''),'','',@onlinePay,@onlineRefund)\n" + " select docCode,rowid,detailRowid,Memo,LinkDocInfo,onlinePay,onlineRefund from @table \n";//设置返回值 } //gridService.getSimpleJdbcTemplate().execute(" Set ARITHABORT ON "); Map map = gridService.doSave(" Set ARITHABORT ON \n "+sql); if (map != null) { if(map.containsKey("docCode")) { String docCode = GridUtils.prossRowSetDataType_String(map, "docCode"); info.setDoccode(docCode); } if(map.containsKey("rowid")) { info.setRowid(GridUtils.prossRowSetDataType_String(map, "rowid")); } if(map.containsKey("detailRowid")) { info.setDetailRowid(GridUtils.prossRowSetDataType_String(map, "detailRowid")); } if(map.containsKey("onlinePay")) { info.setOnlinePay(GridUtils.prossRowSetDataType_Int(map, "onlinePay")); } if(map.containsKey("onlineRefund")) { info.setOnlineRefund(GridUtils.prossRowSetDataType_Int(map, "onlineRefund")); } } } else { //gridService.getSimpleJdbcTemplate().execute(" Set ARITHABORT ON "); gridService.doSaveNoResult(" Set ARITHABORT ON \n "+sql); } //-----执行后,调用OA审核的外部URL this.prossOaExternalURL(info.getOaExternalURL(), 1, request); try { //----推送入口 gate.enterGate(new GateEntity(this.formID, winType, CheckPointType.EXECUTE_AFTER_POST, info.getDoccode(), dbid,info.getOaExternalURL()==null?"":info.getOaExternalURL()[2])); }catch (Exception ex){ showPushGateException(request, resp, mes_, info, ex); return; } } catch (Exception e){ e.printStackTrace(); throw e; }finally { SpObserver.setDBtoInstance(); // log.error("----------------------start sql-------------"); // log.error("dateTime:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // log.error("dbid:" + dbid); // log.error("doccode:" + info.getDoccode()); // log.error("sql:【" + sql + "】"); // log.error("----------------------end sql-------------"); } json = info.getJson(); String canelStr = ""; //"canel#"+temcode+"#"+(returnValue==null?"":returnValue) if ("canel#".equalsIgnoreCase(info.getCanel())) { //表示返回取消确认的内容 this.doccode = info.getDoccode();//单号 canelStr = "";//TODO 有问题 code.split("#")[2];//内容 }else if("revoke#".equalsIgnoreCase(info.getCanel())){ //表示返回撤回内容 this.doccode = info.getDoccode();//单号 canelStr = "";//TODO 有问题 code.split("#")[2];//内容 } else { this.doccode = info.getDoccode(); } if (this.formID == 9802) { InitSystem.getInstance().getPages().add(this.page_formid); } int i = 0; if (json.getCp()) // 复单 i = 1; else if (this.oldCode != "" && this.oldCode.equalsIgnoreCase(this.doccode)) // 修改 i = 2; else // 新增 i = 3; temCode = this.doccode; String success="#|#@success#|#"; if(info.getOnlinePay()!=-1||info.getOnlineRefund()!=-1){ //只有是设置了在线支付,退款的才需要 success="#|#@success"+ EncodeUtil.base64Encode("{\"onlinePay\":"+info.getOnlinePay()+",\"onlineRefund\":"+info.getOnlineRefund()+"}")+"#|#"; } if (this.doccode != null && this.doccode.length() > 0) { mes_.append(EncodeUtil.base64Encode(this.doccode) + success + i + "#|#" + EncodeUtil.base64Encode("doccode='" + this.doccode + "'&fl=" + json.getFl()) + "#|#" + this.doccode + ("".equalsIgnoreCase(canelStr) ? "" : "#|#" + canelStr)); } else if (grid.getDoccode() != "") { String tt = EncodeUtil.base64Decode(grid.getDoccode()); String str = "1".equalsIgnoreCase(json.getgType()) ? tt : tt.replaceAll("\\|", "");// 只处理一个参数的情况 if ("10".equalsIgnoreCase(json.getgType())) {// 10类型需要参数转换 mastercode String master = json.getMasterCode();// 格式 a,b;c,d if (master != null && master.length() > 0) { String[] s = master.split(":"); for (int it = 0; it < s.length; it++) { String[] st = s[it].split(","); if (str.indexOf(st[1]) > -1) { str = str.replaceAll(st[1] + "=", st[0] + "="); } } } } else if ("30".equalsIgnoreCase(json.getgType())) {//针对30类型返回作处理 str = (str.split(";").length == 7) ? str.split(";")[6] : ""; } String[] codes = str.split("="); if (codes.length < 2) codes = str.split("like"); if (codes.length < 2) { mes_.append(success + i + "#|#"); } else mes_.append(EncodeUtil.base64Encode(codes[1]) + success + i + "#|#" + "where=" + str + "#|#" + this.doccode); } else { mes_.append(success + i + "#|#"); } if (info.isOutBoo()) { //clearDuplicateSubmitUNID(); //PrintWriter out = resp.getWriter(); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { AppJson app = new AppJson(); app.setInfo(mes_.toString()); app.setRowid(info.getRowid()); app.setDetailRowid(info.getDetailRowid()); app.setOnlinePay(info.getOnlinePay()); app.setOnlineRefund(info.getOnlineRefund()); this.printJson(resp, GridUtils.toJson(app)); } else { this.print(resp, this.replaceBlank(mes_.toString())); } } } catch (Exception e) { clearDuplicateSubmitUNID(); List checkinfo = null; try { mes_ = new StringBuffer(); if (grid.isImport()) {//导入 // mes_.append(e.getMessage().replaceAll("\\'", "'")); CurrentLocal.setExeclInfo(e.getCause().getMessage()); } else { if (isactionCanel) { //--取消确认失败需要还原之前删除对方的单据数据,因为存在一种情况是又不想取消确认了 String formidByCanel = info.getJson().getFormid(); if (org.apache.commons.lang3.StringUtils.isBlank(formidByCanel)) { formidByCanel = grid.getFormID() + ""; } mutualController.proccessCanelProc(dbid, Integer.parseInt(formidByCanel), info.getDoccode(), "reduction", CheckPointType.EXECUTE_BEFORE_POST); } mes_.append(this.getErrorMsg(e)); } //处理数据范围检查中,取在线支付的标记,传回前端 if (mes_.toString().startsWith("datacheckError")) { String temp = mes_.toString(); String[] str = temp.split("#t#"); String[] checkFlg = str[0].split("_"); if (checkFlg.length > 1) { info.setOnlinePay(Integer.parseInt(checkFlg[1])); } temp = temp.replace("_" + checkFlg[1], ""); mes_ = new StringBuffer(temp); } checkinfo = prossDataCheck(mes_);//转换给app使用 if (info != null && info.isOutBoo()) { // PrintWriter out = resp.getWriter(); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { if (checkinfo != null) { clearDuplicateSubmitUNID(); AppJson app = new AppJson(); app.setOnlinePay(info.getOnlinePay()); app.setInfo("datacheckError#|#" + GridUtils.toJson(checkinfo)); this.printJson(resp, GridUtils.toJson(app)); } else { AppJson app = new AppJson(); app.setInfo(mes_.toString()); this.print(resp, GridUtils.toJson(app)); } } else { if (checkinfo != null) { if ("canel#".equals(info.getCanel())) { mes_.append(";pb#").append("canel"); } else if ("revoke#".equals(info.getCanel())) { mes_.append(";pb#").append("revoke"); } //在线支付标记 mes_.append(";pb#onlinePay=").append(info.getOnlinePay()); } this.print(resp, mes_.toString()); } } } catch (Exception e1) { e1.printStackTrace(); } } finally { this.page_formid = ""; } // return mes_.toString(); } private void showPushGateException(HttpServletRequest request, HttpServletResponse resp, StringBuffer mes_, SqlInfo info, Exception ex) { clearDuplicateSubmitUNID(); if (request.getHeader("x-app-type") != null && !"ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { AppJson app = new AppJson(); app.setInfo(ex.getMessage()); app.setRowid(info.getRowid()); app.setDetailRowid(info.getDetailRowid()); this.printJson(resp, GridUtils.toJson(app)); } else { //针对确认后推送失败,不会刷新界面的处理 if (org.apache.commons.lang3.StringUtils.isNotBlank(info.getDoccode())) { mes_.append("pushError#|#" + ex.getMessage() + "#|#" + info.getDoccode()); } this.print(resp, this.replaceBlank(mes_.toString())); } } private List prossDataCheck(StringBuffer mes_) { String temp = mes_.toString(); if (temp.startsWith("datacheckError#t#")) {//数据范围检查返回 List checkinfo = new ArrayList(); String[] str = temp.split("#t#"); if (str.length >= 3) {//取出返回的信息,以#e#分隔 String[] str1 = str[2].split("#e#"); for (String s : str1) { if (s.length() > 0) { String[] str2 = s.split("#p#"); DataCheckInfo dc = new DataCheckInfo(); if (str2.length == 3) {//有提示内容且数据完整,因为当返回内容太大,数据库脚本中raiserror执行会截断,造成数据格式不完整 dc.setWarnflag(Integer.valueOf(str2[0])); dc.setErrorflag(Integer.valueOf(str2[1])); if (str2[2].startsWith("#_")) {//表示需要替换 String key = str2[2].replaceAll("#_", ""); dc.setInfomessage(CurrentLocal.getDataCheckMap().get(key)); } else { dc.setInfomessage(str2[2]); } } else { dc.setInfomessage(""); } checkinfo.add(dc); } } } List linfo = this.getDataCheckInfo(checkinfo); mes_.delete(0, mes_.length()); mes_.append("datacheckError#|#" + linfo.get(1) + ";pb#" + linfo.get(0)); CurrentLocal.ClearDataCheckMap(); return checkinfo; } return null; } /** * @param formid 功能号ID * @param check 1:未改 2:新增 3: 修改 * @param point 检查点:2表示保存时检查,3表示确定时检查。 * @param mapList 页面给定所需信息(List>)Map key为字段 value 即为当前所需值 * @return List 集合长度为2 ,1:table网页代码(StringBuffer) 2:布尔,是否有禁止(int) -1:完全正确 1:出错 0:警告 */ public List getDataCheckInfo(List list) { int jinzhi = -1; List listObjects = new ArrayList(); StringBuffer sBuffer = new StringBuffer(); sBuffer.append(""); sBuffer.append(""); sBuffer.append(""); sBuffer.append(""); sBuffer.append(""); sBuffer.append(""); for (DataCheckInfo map : list) { sBuffer.append("\r\n "); sBuffer.append("\r\n "); sBuffer.append("\r\n "); sBuffer.append("\r\n ");// 还得去除网页中不能见到的特殊符啊 sBuffer.append("\r\n "); } //sBuffer.append("
禁止警告提示信息
" + map.getInfomessage().trim().replaceAll("<", "<").replaceAll(">", ">") + "
" + sqlErr + "
"); listObjects.add(sBuffer);// 添加进集合,为外面调用直接就获得代码字符串 listObjects.add(jinzhi);// 处理int,禁止,警告,无 return listObjects; //sBuffer.toString(); } @RequestMapping(params = "m=save_Perm")//处理权限分配 public String save_pem(Grid grid, HttpServletRequest request, HttpServletResponse resp) throws DataAccessException, UnsupportedEncodingException, JSONException { StringBuffer mes_ = new StringBuffer(); boolean outBoo = true; String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; GTJson json = JOSNUtils.fromJosn(request.getParameter("_gt_json")); TbkeyID = json.getKeyID(); try { this.formID = grid.getFormID(); this.winType = Integer.parseInt(grid.getWinType().split("\\|")[0]); String table = "_sys_UserPermissions"; if (this.formID == 9654) table = "_sys_UserPermissionsColumn"; try { SpObserver.setDBtoInstance("_" + dbid); md = gridService.getMetaData(table); } finally { SpObserver.setDBtoInstance(); } String gcode = ""; String code = ""; try { gcode = EncodeUtil.base64Decode(grid.getDoccode()); } catch (Exception e) { gcode = null; } this.doccode = gcode.split("=").length > 1 ? (gcode.split("=")[0].equalsIgnoreCase("doccode") ? gcode.split("=")[1].replaceAll("'", "") : "").trim() : ""; if (this.doccode.equalsIgnoreCase("null")) this.doccode = ""; if (this.doccode == "") { docitem = 0; } else { try { SpObserver.setDBtoInstance("_" + dbid); if (!"16".equalsIgnoreCase(json.getgType()) || !"17".equalsIgnoreCase(json.getgType())) docitem = gridService.getMaxID(table, gcode); } catch (Exception e) { docitem = 0L; } finally { SpObserver.setDBtoInstance(); } } setProcParm(grid, dbid); setDocSaveParm(grid, dbid); this.setOAProcParm(json.getOa()); this.setFunLinkProcParm(json.getFunlink(), dbid); this.docPram = json.getCudoc(); if (request == null) { env = grid.getEnv(); local.set(env); } else { this.picFild = grid.getPicFild();//取得图片字段 env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); } try { code = EncodeUtil.base64Decode(json.getDoccode()); } catch (Exception e) { code = ""; } if (this.doccode.trim().length() == 0 && json.getDoccode() != null) this.doccode = code;// 为了避免先 保存主表再增加从表的情况 if (json.getCp()) this.doccode = ""; oldCode = this.doccode; List temp = null; try { SpObserver.setDBtoInstance("_" + dbid); temp = gridService.getComputedColumns(table); } finally { SpObserver.setDBtoInstance(); } keyid = json.getOtherKey(); conls = json.getColns(); if (this.formID == 9654) this.convert2SQL_pem9654(temp, json, table, 1, null); else this.convert2SQL_pem(temp, json, table, 1, null); //---------------- CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用 CurrentLocal.setCurrentFormid(this.formID + ""); } catch (Exception e) { this.print(resp, this.getErrorMsg(e)); return null; } finally { this.flag_panel = false; } try { String doc = ""; if (this.doccode.length() == 0) { doc = this.temcode + "";//需要加生成的单号传过去 } else { doc = this.doccode; } this.cont = 1; //调用审计组装数据 this.convert2AuditSQL(json.getAuditRecords(), this.cont); //------- //执行自定义单号替换 if (this.docPram != "" && this.docPram.length() > 0) { String sql = "declare @curcode varchar(100) exec " + this.docPram.replaceAll("''$", "@curcode output ") + " select @curcode "; try { SpObserver.setDBtoInstance("_" + dbid); doc = gridService.getSimpleJdbcTemplate().queryForObject(sql, String.class); } finally { SpObserver.setDBtoInstance(); } for (int i = 0; i < this.insertsql.size(); i++) { this.insertsql.add(i, this.insertsql.get(i).replaceAll("#docceod", doc)); } } //------ SqlInfo info = null; try { SpObserver.setDBtoInstance("_" + dbid); info = gridService.doExecute(new DoExecuteParameter(doc, this.winType, this.formID, this.insertsql, updatesql, this.procName, this.saveProc, this.DProc, this.DProcPram, sqlDel, null, null, this.PerProc, this.PerProcPram, this.isSave, this.docPram, this.status, tableName, this.FunLinkProc, this.FunLinkPram, json, this.totalProc, this.ExcelProc, this.canelProc, this.revokeProc), request, resp, this.picList, grid, this.formID + "", this.docPram, this.cont); } finally { SpObserver.setDBtoInstance(); } String sql = info.getSql(); try { SpObserver.setDBtoInstance("_" + dbid); if (info.isDoccode() && "".equalsIgnoreCase(info.getDoccode())) { sql = info.getSql() + "\n insert into @table (docCode,rowid,detailRowid,Memo,LinkDocInfo) values(isnull(@newDoccode1,''),'','','','')\n select docCode,rowid,detailRowid,Memo,LinkDocInfo from @table \n";//设置返回值 Map map = gridService.doSave(sql); info.setDoccode(GridUtils.prossRowSetDataType_String(map, "docCode")); } else gridService.doSaveNoResult(sql); } finally { SpObserver.setDBtoInstance(); } this.doccode = info.getDoccode(); if (this.formID == 9802) InitSystem.getInstance().getPages().add(this.page_formid); int i = 0; if (json.getCp()) // 复单 i = 1; else if (this.oldCode != "" && this.oldCode.equalsIgnoreCase(this.doccode)) // 修改 i = 2; else // 新增 i = 3; temCode = this.doccode; if (this.doccode != null && this.doccode.length() > 0) mes_.append(EncodeUtil.base64Encode(this.doccode) + "#|#@success," + i + "#|#" + EncodeUtil.base64Encode("doccode='" + this.doccode + "'&fl=" + json.getFl()) + "," + this.doccode); else if (grid.getDoccode() != "") { String tt = EncodeUtil.base64Decode(grid.getDoccode()); String str = "1".equalsIgnoreCase(json.getgType()) ? tt : tt.replaceAll("\\|", "");// 只处理一个参数的情况 String[] codes = str.split("="); if (codes.length < 2) codes = str.split("like"); if (codes.length < 2) { mes_.append("#|#@success#|#" + i + "#|#"); } else mes_.append(EncodeUtil.base64Encode(codes[1]) + "#|#@success#|#" + i + "#|#" + "where=" + str + "#|#" + this.doccode); codes = null; } else { mes_.append("#|#@success#|#" + i + "#|#"); } if (outBoo) { // PrintWriter out = resp.getWriter(); this.print(resp, this.replaceBlank(mes_.toString())); return null; } } catch (DataAccessException e) { if (outBoo) { // PrintWriter out = resp.getWriter(); this.print(resp, this.getErrorMsg(e)); } // this.printJson(resp, e instanceof ApplicationException?e.getMessage(): (e.getCause()==null?e.getMessage():e.getCause().getMessage())); } catch (IOException e) { } finally { this.insert.clear(); this.totalNum = 0; this.updatesql.clear(); this.procName.clear(); this.saveProc.clear(); this.tempProc.clear(); this.docitem = 0; this.DProc = ""; this.DProcPram = ""; this.PerProc = ""; this.isSave = true; this.PerProcPram = ""; this.sqlDel.clear(); if (this.env != null) this.env.clear(); this.otherDel.clear(); this.doccode = ""; this.status = ""; this.tableName = ""; this.oldCode = ""; this.FunLinkPram = ""; this.FunLinkProc = ""; json = null; if (this.add != null) this.add.clear(); if (this.add_p != null) this.add_p.clear(); if (this.update != null) this.update.clear(); if (this.update_p != null) this.update_p.clear(); if (this.del != null) this.del.clear(); if (this.totalProc != null) this.totalProc.clear(); this.page_formid = ""; local.remove(); } return mes_.toString(); } /** * 组装新增,修改,删除等功能所需要的数据,请求业务类执行 * * @param gird 封装请求对象 * @param request * @param resp * @throws UnsupportedEncodingException * @throws JSONException **/ public List save(Grid grid, HttpServletRequest request, HttpServletResponse resp) throws DataAccessException, UnsupportedEncodingException, JSONException { GTJson json = null;// 原来是只需要一个 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; List jsons = new ArrayList();// 新增了淘宝接口和excel导入,扩展成一次保存多个数据 List sqls = new ArrayList();// 每个元素是每一张单的所有sql StringBuffer mes_ = new StringBuffer(); boolean outBoo = true; boolean isNewDoc = false;// 是否为新单 // boolean flag = false;// 标记需要为每一条主表数据生成一个单号 if ((request != null && request.getParameter("_gt_json") != null && request.getAttribute("_gt_json") == null) ) {// 原有的功能 // json = JOSNUtils.fromJosn(request.getParameter("_gt_json"));// // 取得gt-grid返回的信息 try { //输出前端的原始数据,方便查找问题 log.info("_gt_json:"+ request.getParameter("_gt_json")); jsons.add(JOSNUtils.fromJosn(request.getParameter("_gt_json"))); } catch (Exception e) { this.print(resp, e.getMessage()); } } else if ((request.getAttribute("_gt_json") != null && request.getAttribute("isTran") != null)) { jsons.add(JOSNUtils.fromJosn((String) request.getAttribute("_gt_json"))); } else if ("ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) {// 手机端传过来 try { String s = IOUtils.toString(request.getInputStream(), "utf-8"); jsons.add(JOSNUtils.fromJosn(s)); } catch (IOException e) { e.printStackTrace(); throw new ApplicationException("提交出错"); } } else {// Excel导入情况 outBoo = false; if (request != null && request.getAttribute("_gt_json") != null) {// excel导入 flag_panel = true; jsons = (List) request.getAttribute("_gt_json"); } else {// 淘宝接口 jsons = grid.getTaobaoData(); } } for (GTJson js : jsons) {// 循环读取 json = js; TbkeyID = json.getKeyID(); try { //--------检查是否存在重复提交 if (request.getHeader("x-app-type") == null) checkDuplicateSubmit(json.getDisableDuplicateSubmitUUID()); //------------ this.formID = grid.getFormID(); //-----检查设置了哪些端口禁止保存9802配置 checkDisablePortInfo(request); this.winType = Integer.parseInt(grid.getWinType().split("\\|")[0]); if ("499".equalsIgnoreCase(json.getgType()) || "497".equalsIgnoreCase(json.getgType())) {// 多表 this.winType = Integer.parseInt(json.getgType()); if (json.getFormid() == null) { throw new ApplicationException("_gt_json找不到formid"); } this.formID = Integer.parseInt(json.getFormid().split(";")[0]);// 得到主功能号 Map map = null; try { SpObserver.setDBtoInstance("_" + dbid); map = gridService.getDealAfterDocSave(this.formID); }catch (Exception e){ e.printStackTrace(); throw e; }finally { SpObserver.setDBtoInstance(); } grid.setDealAfterDocSave(EncodeUtil.base64Encode((String) map.get("DealAfterDocSave"))); grid.setCancelProc(EncodeUtil.base64Encode((String) map.get("CancelBtnProcName")));// 取消确认 grid.setRevokeProc(EncodeUtil.base64Encode((String) map.get("RevokeBtnProcName")));// 撤回 grid.setProcGroupafterSavedoc( (map.get("ProcGroupafterSavedoc") == null || "".equals(map.get("ProcGroupafterSavedoc"))) ? 0 : Integer.parseInt((String) map.get("ProcGroupafterSavedoc"))); map = null; } if ((this.winType == 9 || this.winType == 17 || this.winType == 15)) { if (!this.isPanelUpdate((json.getPanelRecords() != null && json.getPanelRecords().size() > 0) ? json.getPanelRecords().get(0) : null, null) || // 一个的面板 json.getInsertedRecords() != null && json.getInsertedRecords().size() > 0) // createCode(grid, request); isNewDoc = true; } if (this.winType == 499 || this.winType == 497) { if (!this.isPanelUpdate( (json.getPanels() != null && json.getPanels().size() > 0) ? json.getPanels().get(0).getPanelRecords() : null, json.getPanels().get(0).getPanelAction()) || // 多表的面板 ((json.getGrids() != null && json.getGrids().size() > 0) ? json.getGrids().get(0).getInsertedRecords().size() > 0 : false)) // 判断当数据是否需要增加单号 { isNewDoc = true; } } if ("499".equalsIgnoreCase(json.getgType()) || "497".equalsIgnoreCase(json.getgType())) {// 切换回来原有的功能号,之前是因为要取得主功能号 this.formID = grid.getFormID(); } String table = null; //9801数据 SqlRowSet gform = null; Map tableMetaData = null; try { SpObserver.setDBtoInstance("_" + dbid); gform = gridService.getGformByFormID(this.formID); table = gridService.getTableNameByType(gform, grid.getWinType()); tableMetaData = gridService.getTableMetaData(table); //table = gridService.getTableName(this.formID, grid.getWinType()); //md = gridService.getMetaData(table); }catch (Exception e){ e.printStackTrace(); throw e; } finally{ SpObserver.setDBtoInstance(); } String gcode = ""; String code = ""; try { gcode = EncodeUtil.base64Decode(grid.getDoccode()); } catch (Exception e) { e.printStackTrace(); gcode = null; } this.doccode = gcode.split("=").length > 1 ? (gcode.split("=")[0].equalsIgnoreCase("doccode") ? gcode.split("=")[1].replaceAll("'", "") : "").trim() : ""; if (this.doccode.equalsIgnoreCase("null")) this.doccode = ""; if ("".equalsIgnoreCase(this.doccode)) { docitem = 0; } else { try { SpObserver.setDBtoInstance("_" + dbid); if (!"16".equalsIgnoreCase(json.getgType()) || !"17".equalsIgnoreCase(json.getgType())) docitem = gridService.getMaxID(table, gcode); } catch (Exception e) { e.printStackTrace(); docitem = 0L; } finally { SpObserver.setDBtoInstance(); } } if ("499".equalsIgnoreCase(json.getgType()) || "497".equalsIgnoreCase(json.getgType())) {// 多表 this.winType = Integer.parseInt(json.getgType()); this.formID = Integer.parseInt(json.getFormid().split(";")[0]);// 得到主功能号 } setProcParm(grid, dbid); setDocSaveParm(grid, dbid); oaExternalURL = this.setOAProcParm(json.getOa()); this.setFunLinkProcParm(json.getFunlink(), dbid); if (grid.getCanPric() == 1) {// 触发取消确认 this.isSave = true;// grid.getCancelisSave()==1?true:false; String str = (grid.getCancelProc() != null && !"".equalsIgnoreCase(grid.getCancelProc())) ? grid.getCancelProc().replaceAll("%2B", "+").replaceAll("%2F", "/").replaceAll("%3D", "=") : ""; this.canelProc = EncodeUtil.base64Decode(str); if (grid.getIsExchangeDataWithHost() == 1) { final ExternalURLAction externalURLAction = (ExternalURLAction) FactoryBean.getBean("externalURLAction"); String doccode = json.getDoccode(); if ("17".equals(json.getgType())) { doccode = json.getPanelRecords().get(0).get("doccode"); } String htableName = gridService.getTableNameByType(gform, json.getgType()); String dtableName = gridService.getTableNameByType(gform, grid.getWinType()); externalURLAction.processExternalURL(request, this.formID + "", dbid, doccode, htableName, dtableName, 0); } } if (grid.getRevokePric() == 1) {// 触发撤回 this.isSave = true;// grid.getCancelisSave()==1?true:false; String str = (grid.getRevokeProc() != null && !"".equalsIgnoreCase(grid.getRevokeProc())) ? grid.getRevokeProc().replaceAll("%2B", "+").replaceAll("%2F", "/").replaceAll("%3D", "=") : ""; this.revokeProc = EncodeUtil.base64Decode(str); } this.docPram = json.getCudoc(); if (request == null) { env = grid.getEnv(); } else { this.picFild = grid.getPicFild();// 取得图片字段 synchronized (env) { env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); } } try { if (org.apache.commons.lang3.StringUtils.isNotBlank(json.getDoccode()) && isBase64(json.getDoccode())) { code = EncodeUtil.base64Decode(json.getDoccode()); } } catch (Exception e) { e.printStackTrace(); code = ""; } if (this.doccode.trim().length() == 0 && json.getDoccode() != null) this.doccode = code;// 为了避免先保存主表再增加从表的情况 if (json.getCp()) { this.doccode = ""; } oldCode = this.doccode; keyid = json.getOtherKey(); conls = json.getColns(); com.yc.utils.Grid gt = new com.yc.utils.Grid(); gt.setPrimeKey(json.getPrimeKey()); gt.setTableType(json.getgType()); json.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); this.convert2InsertSQL(tableMetaData, json, table, 1, gt, dbid); this.convert2UpdateSQL(tableMetaData, json, table, 1, gt); this.convert2DeleteSQL(tableMetaData, json, table, 1, gt); if ("499".equalsIgnoreCase(json.getgType()) || "497".equalsIgnoreCase(json.getgType())) {// 多表 List grids = json.getGrids(); List panels = json.getPanels(); if (grids != null && grids.size() > 0) { for (com.yc.utils.Grid g : grids) {// 表格 g.process();// 把数据写到对应的地方 //审计数据 json.getAuditRecords().addAll(g.getAuditRecords()); if (g.getDeletedRecords().size() > 0 || g.getUpdatedRecords().size() > 0 || g.getInsertedRecords().size() > 0) { String otherT = null; try { SpObserver.setDBtoInstance("_" + dbid); otherT = gridService.getTableName(g.getFormid(), g.getTableType()); } finally { SpObserver.setDBtoInstance(); } Fill2SQL(json, otherT, g, 3, dbid); } } } Map> panel496 = new HashMap>(); if (panels != null && panels.size() > 0) { for (com.yc.utils.Panel p : panels) {// 面板 //审计数据 json.getAuditRecords().addAll(p.getAuditRecords()); if (p.getPanelRecords().size() > 0) { if (org.apache.commons.lang3.StringUtils.isBlank(p.getPanelTable())) { throw new ApplicationException("面板子功能号PanelTable值不能为空"); } String tab = this.getPannelTalbe(p.getPanelTable(), dbid); String action = p.getPanelAction(); List> panel = new ArrayList>(); panel.add(p.getPanelRecords()); panel496.put(tab.replaceAll("[a-zA-Z]", ""), p.getPanelRecords());// 子功能号的字段集合。 if (p.getWherepan() != null || p.getPanelRecords() != null) {// 判断是否全是496面板没有格线 if (p.getWherepan() == null) { this.wherepan = (p.getPanelRecords().get("doccode") == null ? p.getDoccode() : p.getPanelRecords().get("doccode")); } else { Map whmap = wherepan496(panel496, p.getWherepan());// 处理多面板关联关系 panel.get(0).putAll(whmap); } if (!action.equals("add")) { if (panel.get(0).get("doccode") == null) { this.doc496 = this.wherepan; } else { this.doccode = panel.get(0).get("doccode"); } } } // TODO if(this.flag_panel) // temcode=sys.getDocCode(this.formID+"", // null);//因为是多表 if (this.winType == 497 && p.getIsPrimaryPan() == 1) { this.taboth = tab;// 多表用到这个属性 } Fill2Panel(tab, action, panel, p.getIsPrimaryPan() + "", dbid); } } } this.tableName = this.taboth.equals("") ? this.tableName : this.taboth;// 解决多表(496)的 // 数据检查 // 获取的主表 // 不执行这个 // 那么得到的表为多表的从表 // 有些sql执行就报错。xin--2016-4-20 // 16:34:17 if (!this.zhupan496.equals("")) { this.insertsql.add(0, this.zhupan496);// 针对496的主表最后添加进去 this.zhupan496 = ""; } // this.insertsql496="";//清空 grids = null; panels = null; } if (json.getOtherTable() != null) {// 3表 String otherT = null; try { SpObserver.setDBtoInstance("_" + dbid); otherT = gridService.getTableName(json.getOtherFormid(), json.getOtherTable()); docitem2 = gridService.getMaxID(otherT, gcode); } catch (Exception e) { e.printStackTrace(); docitem2 = 0; } finally { SpObserver.setDBtoInstance(); } Fill2SQL(json, otherT, null, 2, dbid); this.convert3DeleteSQL(otherT); } // ------------ if (this.winType == 9 || this.winType == 15 || this.winType == 17 || this.winType == 10) { // ----------处理面板 List> panel = json.getPanelRecords(); if (panel != null && panel.size() > 0 && panel.get(0) != null) { String tab = this.getPannelTalbe(json.getPanelTable(), dbid); String action = json.getPanelAction(); Fill2Panel(tab, action, panel, 1 + "", dbid); } } // ---------------- CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用 CurrentLocal.setCurrentFormid(this.formID + ""); //CurrentLocal prossTaoBao(); if (!grid.isCallback()) { json.setFormid(this.formID + ""); json.setgType(this.winType + ""); json.setTaobao(this.taobaoAPI); } // ----- try { String doc = ""; if (this.doccode.length() != 0) doc = this.doccode; try { SpObserver.setDBtoInstance("_" + dbid); // 调用审计组装数据 this.convert2AuditSQL(json.getAuditRecords(), this.cont); } catch (Exception e) { e.printStackTrace(); throw e; } finally { SpObserver.setDBtoInstance(); } // ----因为有可能需要替换参数而出错,因为提交数据为空,保存后需要排除保存时执行 by 2014-5-19 if (this.insertsql.size() == 0 && this.updatesql.size() == 0 && this.sqlDel.size() == 0) { this.DProc = ""; this.ExcelProc=""; } grid.setIsDoccode(isDoccode); SqlInfo info = null; try { SpObserver.setDBtoInstance("_" + dbid); info = gridService.doExecute( new DoExecuteParameter(doc, this.winType, this.formID, this.insertsql, updatesql, this.procName, this.saveProc, this.DProc, this.DProcPram, sqlDel, null, null, this.PerProc, this.PerProcPram, this.isSave, this.docPram, this.status, tableName, this.FunLinkProc, this.FunLinkPram, json, this.totalProc, this.ExcelProc, this.canelProc, this.revokeProc), request, resp, this.picList, grid, this.formID + "", this.docPram, this.cont); }catch (Exception e) { e.printStackTrace(); throw e; }finally { SpObserver.setDBtoInstance(); } String datacheck = ""; // 数据范围检查 if (isDoccode && json.getDcFlag() == 0) { DataCheck checkBean = (DataCheck) FactoryBean.getBean("dataCheck"); grid.setHasGrid(winType == 497 ? "many" : grid.getHasGrid());// 多表情况用到 if (org.apache.commons.lang3.StringUtils.isBlank(json.getDoccode())) { json.setDoccode(doc); } json.setTableName(this.tableName); try { SpObserver.setDBtoInstance("_" + dbid); datacheck = checkBean.excelDataCheck(this.formID, json, request, resp, cont); }catch (Exception e) { e.printStackTrace(); throw e; }finally { SpObserver.setDBtoInstance(); } } info.setSql(info.getSql() + datacheck); info.setDoccode(doc); info.setJson(json); info.setOutBoo(outBoo); info.setIsDoccode((json.getIs497() == 1 || isDoccode) ? true : false); info.setOaExternalURL(this.oaExternalURL); info.setTableName(this.tableName); info.setOnlinePay(json.getOnlinePay()); info.setOnlineRefund(json.getOnlineRefund()); sqls.add(info); this.cont++; } catch (Exception e) { e.printStackTrace(); clearDuplicateSubmitUNID(); this.print(resp, this.getErrorMsg(e)); return null; } finally { this.insertsql.clear(); this.insert.clear(); this.totalNum = 0; this.updatesql.clear(); this.procName.clear(); this.saveProc.clear(); this.tempProc.clear(); this.docitem = 0; this.DProc = ""; this.DProcPram = ""; this.PerProc = ""; this.isSave = true; this.PerProcPram = ""; this.sqlDel.clear(); if (this.env != null) this.env.clear(); this.otherDel.clear(); this.doccode = ""; this.status = ""; this.tableName = ""; this.oldCode = ""; this.FunLinkPram = ""; this.FunLinkProc = ""; json = null; if (this.add != null) this.add.clear(); if (this.add_p != null) this.add_p.clear(); if (this.update != null) this.update.clear(); if (this.update_p != null) this.update_p.clear(); if (this.del != null) this.del.clear(); if (this.totalProc != null) this.totalProc.clear(); local.remove(); // this.page_fromid=""; } // ----- } catch (Exception e) { e.printStackTrace(); clearDuplicateSubmitUNID(); this.print(resp, this.getErrorMsg(e)); } finally { this.flag_panel = false; } } // 组装完所有的sql,一次传到后台执行 this.cont = 1; return sqls; } public void checkDisablePortInfo(HttpServletRequest request) { if (this.formID == 9802 || this.formID == 9801) { if (AttachmentConfig.getInstanse().get("DisablePort") != null && AttachmentConfig.getInstanse().get("DisablePort").contains(";" + request.getServerPort() + ";")) { File file = new File(request.getServletContext().getRealPath("/") + "v.txt"); if (file.exists()) throw new ApplicationException("禁止在" + request.getServerPort() + "端口上操作" + this.formID); } } } /** * 496全是面板保存问题 9770功能号设置的关联关系条件 * * @param map * @param wpan * @return */ private Map wherepan496(Map> map, String wpan) { String where = ""; Map map2 = new HashMap(); if (!wpan.equals("")) { String[] pan496 = wpan.split(";"); String[] zzdwhere; String[] czdwhere; if (pan496.length == 3) { zzdwhere = pan496[1].toString().split(","); czdwhere = pan496[2].toString().split(","); for (int i = 0; i < czdwhere.length; i++) { where = map.get(pan496[0]).get(zzdwhere[i]); this.wherepan += czdwhere[i] + "='" + where + "' and "; map2.put(czdwhere[i], where); } this.wherepan = this.wherepan.substring(0, this.wherepan.length() - 4); if (this.wherepan.indexOf("@newDoccode") != -1) { this.wherepan = this.wherepan.replace("'", ""); } } } return map2; } /** * 把保存组和功能链接中有关taobao的选出来放在taobaoAPI集合里面 **/ private void prossTaoBao() { if (this.procName.size() > 0) { List temp = new ArrayList(); for (int i = 0; i < this.procName.size(); i++) {//保存组 if (this.procName.get(i).toLowerCase().startsWith("taobao.")) { HashMap> hm = new HashMap>(); if (this.saveProc.size() > 0) { hm.put(this.procName.get(i), prossParm(this.saveProc.get(i), this.tempProc.get(i))); this.tempProc.remove(i); this.saveProc.remove(i); } else hm.put(this.replaceBlank(this.procName.get(i)), prossParm("", "")); this.taobaoAPI.add(hm); //this.procName.remove(i); } else temp.add(this.procName.get(i)); } this.procName = temp; } } /** * 处理通过功能链接调用 的存储过程 **/ private void setFunLinkProcParm(String funlink, String dbid) { if (funlink != "" && funlink.length() > 0) { List list = null; try { SpObserver.setDBtoInstance("_" + dbid); list = gridService.getFunLinkPro(funlink); } finally { SpObserver.setDBtoInstance(); } if (list != null) { Map map = (Map) list.get(0); this.FunLinkProc = ((String) map.get("procs")).trim(); this.FunLinkPram = (String) map.get("origfields"); } } } /*** * 判断面板是否为修改状态 * **/ private boolean isPanelUpdate(HashMap hm, String action) { if (hm != null) { if (action != null && (this.winType == 497 || this.winType == 499)) { if (action.equalsIgnoreCase("add")) return false; else return true; } if (((hm.get("doccode") == null || hm.get("doccode") == "" || hm.get("doccode").length() == 0) && this.winType != 10)) {// by danaus 2020/9/23 16:58 return false; } } return true; } /** * /** 组装面板的sql语句 * * @param isPrimaryPan TODO * @param String tab 表名 * @param String action 新增还是修改状态 * @param List panel 面板数据 */ private void Fill2Panel(String tab, String action, List> panel, String isPrimaryPan, String dbid) { if (panel.size() == 0) return; Map tableMetaData = null; try { SpObserver.setDBtoInstance("_" + dbid); tableMetaData = gridService.getTableMetaData(tab); } finally { SpObserver.setDBtoInstance(); } HashMap hm = panel.get(0); this.tableName = tab; this.status = hm.get("docstatus") == null ? (this.winType == 497 && !this.status.equals("") ? this.status : "") : (String) hm.get("docstatus");// 为了防止确认后还能提交数据 if (hm != null) { // List temp1 = null; if (tab.equals("_sys_formid_Help")) {// 处理帮助文档保存 2014-9-25 List> hepList = null; try { SpObserver.setDBtoInstance("_" + dbid); hepList = gridService.getComputedHelp(hm.get("doccode").toString()); } finally { SpObserver.setDBtoInstance(); } if (!panel.get(0).get("webcontent").equals("")) {// 处理帮助文档图片保存问题 try { String content = panel.get(0).get("webcontent"); String imageurl = content.substring(content.indexOf("src=\"") + 5, content.indexOf(".jpg")); if (!imageurl.equals("")) { panel.get(0).put("ImagePath", imageurl + ".jpg"); panel.get(0).put("ImageBinary", "ImageBinaryvalue"); } } catch (Exception e) { e.printStackTrace(); } } if (hepList.size() > 0) { final Map sys_formid_help = gridService.getTableMetaData("_sys_formid_Help"); this.convertPanelSQL(sys_formid_help, panel, tab, isPrimaryPan, dbid); } else { // try { // SpObserver.setDBtoInstance("_" + dbid); // temp1 = gridService.getComputedColumns(tab); // } finally { // SpObserver.setDBtoInstance(); // } this.convert2PanelInsertSQL(tableMetaData, panel, tab, isPrimaryPan, dbid); //temp1 = null; } } else { if (!this.isPanelUpdate(hm, action) || this.winType == 497) {// 496类型进入 // try { // SpObserver.setDBtoInstance("_" + dbid); // temp1 = gridService.getComputedColumns(tab); // } finally { // SpObserver.setDBtoInstance(); // } this.type496 = ""; if (this.winType == 497) { this.type496 = action; } if (action.equals("add")) {// this.wherepan.equalsIgnoreCase("") // && this.convert2PanelInsertSQL(tableMetaData, panel, tab, isPrimaryPan, dbid); } else { // //if(this.wherepan.equals("")){this.wherepan="doccode="+this.doccode;} this.convertPanelSQL(tableMetaData, panel, tab, isPrimaryPan, dbid);// 针对496修改保存(修改) this.convert2PanelInsertSQL(tableMetaData, panel, tab, isPrimaryPan, dbid);//// 针对496修改保存(保存) if (isPrimaryPan.equals("1")) { this.zhupan496 = this.wherepan496; } else { this.insertsql.add(0, this.wherepan496); } this.wherepan496 = ""; } // temp1 = null; this.wherepan = ""; } else { if (action.equals("add")) {// this.wherepan.equalsIgnoreCase("") // && //temp1 = gridService.getComputedColumns(tab); this.convert2PanelInsertSQL(tableMetaData, panel, tab, isPrimaryPan, dbid); } else { this.convertPanelSQL(tableMetaData, panel, tab, isPrimaryPan, dbid); } } } } // hm = null; } /** * 组装表格的SQL语句 * * @param json json数据 * @param otherT 表名 * @param Grid json数据 * @param int fl 标记 0表示正常一个表格的数据, 1-表示多表中的数据, 2-表示是3表结构中的第二个表的数据 * @throws Exception */ private void Fill2SQL(com.yc.utils.GTJson json, String otherT, com.yc.utils.Grid g, int fl, String dbid) throws Exception { Map tableMetaData = null; try { SpObserver.setDBtoInstance("_" + dbid); //TODO 合并取数 tableMetaData = gridService.getTableMetaData(otherT); // oTemp = gridService.getComputedColumns(otherT); // md2 = gridService.getMetaData(otherT); } finally { SpObserver.setDBtoInstance(); } this.convert2InsertSQL(tableMetaData, json, otherT, fl, g, dbid); this.convert2UpdateSQL(tableMetaData, json, otherT, fl, g); this.convert2DeleteSQL(tableMetaData, json, otherT, fl, g); //this.convert2AuditSQL(g.getAuditRecords()); } /** * 获取保存组的存储过程参数和名称 * * @param grid */ private void setProcParm(Grid grid, String dbid) { if (grid.getProcGroupafterSavedoc() == 0) { grid.setProcGroupafterSavedoc(this.formID); } List> parms = null; try { SpObserver.setDBtoInstance("_" + dbid); parms = gridService.getSaveProcGroup(grid.getProcGroupafterSavedoc()); } finally { SpObserver.setDBtoInstance(); } if (parms.size() != 0) { for (Map str : parms) { String key = (String) str.get("action");//新增,修改,删除 String type = (String) str.get("objectType");//表头,还是表体 if (type == null) throw new ApplicationException("执行对象未有设置"); if (type.equals("header")) {//表头 if (key.equalsIgnoreCase("insert")) { add_p.add((String) str.get("ProcName")); } else if (key.equalsIgnoreCase("update")) { update_p.add((String) str.get("ProcName")); } } else {//表体 if (key.equalsIgnoreCase("insert")) { add.add((String) str.get("ProcName")); } else if (key.equalsIgnoreCase("update")) { update.add((String) str.get("ProcName")); } else { del.add((String) str.get("ProcName")); } } } } parms = null; } /** * 获取保存时执行的存储过程的参数和名称 * * @param grid */ private void setDocSaveParm(Grid grid, String dbid) { String[] temp = null; if (grid.getDealAfterDocSave() != "" && grid.getDealAfterDocSave() != null) { try { temp = EncodeUtil.base64Decode(grid.getDealAfterDocSave()).split("\\s+"); } catch (UnsupportedEncodingException e) { throw new ApplicationException("解密保存后执行过程设置出错-" + grid.getDealAfterDocSave()); } } Map map = null; if (temp == null) { try { SpObserver.setDBtoInstance("_" + dbid); map = gridService.getDealAfterDocSave(this.formID); temp = ((String) map.get("DealAfterDocSave") != "" && (String) map.get("DealAfterDocSave") != null) ? ((String) map.get("DealAfterDocSave")).split("\\s+") : null; this.ExcelProc = GridUtils.prossRowSetDataType_String(map, "importProcName"); } finally { SpObserver.setDBtoInstance(); } } if (temp != null && temp.length > 1) { this.DProc = temp[0]; this.DProcPram = temp[1]; } //增加读取导入时执行过程 if (grid.isExcel()) { try { if (map == null) { //表示 SpObserver.setDBtoInstance("_" + dbid); this.ExcelProc = gridService.getImportExcelProc(this.formID); } } finally { SpObserver.setDBtoInstance(); } } temp = null; } /** * 获取审核,通过等需要的存储过程的参数和名称 * * @param grid */ private String[] setOAProcParm(String oa) { if (oa != "" && oa.length() > 0) { String[] temp = oa.split(";"); Map map = button.getButtonIs(this.formID, temp[0], Integer.parseInt(temp[1])); if (map != null) { String pr = (String) map.get("ProcName"); if (pr != null || pr != "") { String[] parm = pr.split("\\s+"); this.PerProc = parm[0]; if (parm.length > 1) this.PerProcPram = parm[1]; } //* 去掉是否保存设置,永远都是需要执行保存再执行OA Integer men = (Integer) map.get("isAutoSaved"); if (men == null || men == 0) { this.isSave = false; } } String url = GridUtils.prossRowSetDataType_String(map, "ExternalURL"); String[] str = new String[3]; str[0] = GridUtils.prossRowSetDataType_Int(map, "UrlShowLocation") + ""; str[1] = url; str[2] = GridUtils.prossRowSetDataType_String(map, "ButtonName");//GridUtils.prossRowSetDataType_Int(map,"editStatus")+"_"+ return str; } return null; } private void convert3DeleteSQL(String name) { for (int i = 0; i < otherDel.size(); i++) { String where = this.keyid.split(",")[0] + "='" + otherDel.get(i) + "'"; sqlDel.add(0, proccSql(name) + ",'" + where.replaceAll("'", "''") + "'"); sqlDel.add(1, "delete " + name + " where " + (where != null ? (where + " and doccode='" + this.doccode + "' ") : where)); } } /** * 把客户端json提交转换为delete数据库格式 */ private void convert2DeleteSQL(Map tableMetaData, GTJson json, String name, int fl, com.yc.utils.Grid g) { List> list = null; if (fl == 2) { list = json.getOtherDeleteds(); //m = md2; g = new com.yc.utils.Grid(); g.setPrimeKey(json.getOtherPrimeKey()); } else if (fl == 1) { list = json.getDeletedRecords(); //m = md; } else { list = g.getDeletedRecords(); //m = md2; } if (list != null && list.size() > 0) { this.checkPrimKey(g, name, list); String[] keys = (this.keyid != null && this.keyid.length() > 0) ? this.keyid.split(",") : null; for (HashMap map : list) { StringBuilder key = new StringBuilder(); StringBuilder key1 = new StringBuilder(); if (this.winType == 15 && fl == 1) { if (map.containsKey(keys[0].toLowerCase())) {// 处理删除关联第三表数据 otherDel.add((String) map.get(keys[0])); } } if (this.winType == 77 && fl == 1) {// fl==1表示第一个表格才执行这样的操作 if (map.containsKey(keys[0].toLowerCase())) {// 处理删除关联第三表数据 otherDel.add((String) map.get(keys[0])); } } if (this.winType == 2 && "1".equals(map.get("isDeletes"))) {//表示2类型时删除父节点,需要把它的子节点也删除 key1.append(" and treeControl like (select treeControl from ") .append(name).append(" where rowid='").append(map.get("rowid")) .append("'").append(" and 1=1 ").append(")+'").append("%'"); } else { for (Object k : map.keySet()) {//key1是为了删除操作,作为where条件 String str = g.getPrimeKey().toLowerCase(); if (!str.endsWith(";")) str += ";"; if ((";" + str).contains(";" + ((String) k).toLowerCase() + ";")) { if (map.get(k) == null || "".equals(map.get(k)) || "null".equals(map.get(k))) {//判断主键有没值,避免没主键的删除 throw new ApplicationException("主键【" + k + "】值不能为空,禁止删除操作"); } else { key1.append(" and ("); parserTypeInfo(map, k, key1, tableMetaData); } } else {//key的值是为了给可以恢复的sql用 boolean flag = true; flag = checkExpressionColumn(map, k, flag);// 更新时有权限控制的字段不需要更新 if ("_RowNo".equalsIgnoreCase((String) k) || "_ConstWidth".equalsIgnoreCase((String) k) || "id".equalsIgnoreCase((String) k) || ((String) k).lastIndexOf("Orig") > 0) continue;// 新版grid传多这个字段 flag = checkFileds((String) k, flag); if (flag) { key.append(" and ("); if ("_ycid_".equalsIgnoreCase((String) k)) {// 转换成id字段 HashMap ts = new HashMap(); ts.put("id", (String) map.get((String) k)); parserTypeInfo(ts, "id", key, tableMetaData); } else { parserTypeInfo(map, k, key, tableMetaData); } } } } } getPicInfo(map); //增加删除可恢复处理,2表 if (key1.toString().length() == 0) { sqlDel.add(proccSql(name) + ",' 1=1 " + key.toString().replaceAll("&", "&").replaceAll("'", "''") + "'"); }else { sqlDel.add(proccSql(name) + ",' 1=1 " + key1.toString().replaceAll("&", "&").replaceAll("'", "''") + "'"); } if(org.apache.commons.lang3.StringUtils.isNotBlank(key1.toString())) { sqlDel.add(" delete " + name + " where 1=1 " + key1.toString().replaceAll("&", "&")); } } keys = null; } if (del != null && del.size() > 0) { for (String str : del) { for (HashMap map : list) this.getProcValues(map, str); } } else { if (list != null && list.size() > 0) this.getProcValues(list.get(0), ""); } list = null; } /** * 增加可恢复功能,需要在删除前调用下面这个过程 * exec pSaveRecForDeleted @UserCode='system',@UserName='系统管理员',@OrgDocCode = 'DD00016', * * @OrgFormID = 120201,@OrgFormName='销售订单',@TableName='t120201D', * @SqlWhere = 'doccode=''DD00016'' and rowid = ''003555'' */ private String proccSql(String tabname) { StringBuffer sb = new StringBuffer(); sb.append("exec pSaveRecForDeleted '") .append(local.get().get("@usercode")).append("','") .append(local.get().get("@username")).append("',"); if (this.winType == 9 || this.winType == 17 || this.winType == 497 || this.winType == 499 || this.winType == 15)//单据类型的单号 sb.append("'" + this.doccode).append("','"); else sb.append("null").append(",'"); sb.append(this.formID).append("',") .append("null").append(",'") .append(tabname).append("'"); return sb.toString(); } private void getPicInfo(HashMap map) { String[] temp = picFild.split(";"); for (String s : temp) { if (map.containsKey(s) && map.get(s) != null) { String t = (String) map.get(s); PicEntity picEntity=new PicEntity(); Pattern p = Pattern.compile("type=\\w.*?\\|");// |/getImage.do?type=0&uuid=0A283B93-07ED-46B6-A66C-7223A71D94FE;9458|48|48|, java.util.regex.Matcher propsMatcher = p.matcher(t); boolean isfound = false; while (propsMatcher.find()) { picEntity.setContext(propsMatcher.group()); isfound = true; } if (!isfound) { picEntity.setContext(t); } picEntity.setFormId(this.formID+""); picEntity.setDocCode(this.doccode); picEntity.setRowid(map.get("rowid")==null?null:map.get("rowid")+""); picEntity.setField(s); picList.add(picEntity); } } } private boolean checkFileds(String key, boolean falg) { if (key.equalsIgnoreCase("Next") || key.equalsIgnoreCase("Deleted") || key.equalsIgnoreCase("Added") || key.equalsIgnoreCase("Changed") || key.equalsIgnoreCase("Moved") || key.equalsIgnoreCase("Panel") || key.equalsIgnoreCase("Prev") || key.equalsIgnoreCase("_YC_option_")) falg = false; return falg; } /** * 取得存储过程的参数值 * * @param map */ private void getProcValues(HashMap map, List temp, List list) { int i = 0; //if(list.size()==0&&temp.size()!=list.size()) return; for (String tem : temp) { String st = ""; String[] ts = tem.split(","); for (String t : ts) { boolean flag = false; for (Object k : map.keySet()) { if (t.equalsIgnoreCase((String) k)) { st += "'" + ((String) map.get(k)) + "',"; flag = true; break; } } if (!flag) { String en = local.get().get(t); if (en != null) st += en + ",";// 是系统变量 else st += t + ",";// 直接的值 } } list.add(i, (st.lastIndexOf(",") == st.length() - 1) ? st.substring(0, st.length() - 1) : st); i++; } } /** * 在执行格式转换时调用这个方法替换存储过程里的参数值 * * @param map */ private void getProcValues(HashMap map, String li) { //this.getProcValues(map, this.tempProc, this.saveProc); String s = ""; // if(this.formID!=9646||(this.formID==9646&& "1".equals((String)map.get("treetype"))))//只有是菜单时候才执行设置大图标, 2是角色,现在角色也可以设置大图标 by2015-5-13, s = getRecordValues(map, li); if (s != null && !"".equalsIgnoreCase(s) && !this.checkProcSame(s, totalProc)) this.totalProc.add(s); this.DProcPram = getRecordValues(map, this.DProcPram); this.PerProcPram = getRecordValues(map, this.PerProcPram); this.ExcelProc = getRecordValues(map, this.ExcelProc); this.canelProc = getRecordValues(map, this.canelProc); this.revokeProc = getRecordValues(map, this.revokeProc); this.oaExternalURL = getRecordValuesByExternalURL(map, this.oaExternalURL); String temp = ""; if (this.FunLinkProc.startsWith("taobao.")) {//只有一条记录 temp = this.FunLinkPram; this.FunLinkPram = getRecordValues(map, this.FunLinkPram);// 增加功能链接 HashMap> hm = new HashMap>(); hm.put(this.FunLinkProc, prossParm(this.FunLinkPram, temp)); this.taobaoAPI.add(hm); this.FunLinkPram = ""; this.FunLinkProc = ""; } else this.FunLinkPram = getRecordValues(map, this.FunLinkPram);// 增加功能链接 if (this.docPram != null && this.docPram != "" && !this.docPram.isEmpty()) { String[] docs = this.docPram.split("\\s+"); this.docPram = docs[0] + " " + getRecordValues(map, docs[1]); docs = null; } } private String[] getRecordValuesByExternalURL(HashMap map, String[] oaExternalURL) { //url :/xxx.do?formid=&formid&|doccode=&doccode& if (oaExternalURL != null && oaExternalURL[1].contains("&")) {//存在&表示需要替换参数 final List parms = gridService.getString(oaExternalURL[1]); for (String str : parms) { String value = GridUtils.prossRowSetDataType_String(map, str.replaceAll("&", "").toLowerCase()); if (StringUtils.isNotBlank(value)) { oaExternalURL[1] = oaExternalURL[1].replaceAll(str, value); } } } return oaExternalURL; } private boolean checkProcSame(String s, List totalProc) { for (String str : totalProc) { if (str.equalsIgnoreCase(s)) return true; } return false; } /*** * 组合参数成集合形式 * */ private Map prossParm(String values, String keys) { HashMap map = new HashMap(); if (values != null && values.length() > 0) { String[] vl = values.split(";"); String[] key = keys.split(";"); for (int i = 0; i < vl.length; i++) { map.put(key[i], vl[i].replaceAll("'", "")); } } return map; } public String getDataGroupInfo(int formid, String usercode, int flag, HttpSession session) {//组装数据组权限 List> list = null; try { SpObserver.setDBtoInstance("_" + session.getAttribute(SessionKey.DATA_BASE_ID)); list = gridService.getDataGroupInfo(formid, usercode, flag); } finally { SpObserver.setDBtoInstance(); } if (list.size() == 0) { return ""; } boolean isoneGroup = true;//表示只有一种分组情况 boolean isother = false; String fieldIds = list.stream().map(x -> x.get("fieldid") + "").collect(joining(","));//取所有字段以,号串成字符串 List tableColumnsDataTypeEntities = gridService.getTableColumnsDataTypes(formid, flag, fieldIds); //保存所有分组拼接的sql Map sql = new HashMap<>(8); //保存分组号和所用的连接符 Map JionFlagMap = new HashMap<>(8); int indexdx = 0; int tempJionFlagGroup = 0;//临时保存分组号 //1.把每一行设置的拼接成sql,保存到一个以分组号为key的map,相同的就加到一起拼接,达到同一数据组放在一起 for (Map map : list) { StringBuffer havingstr = new StringBuffer(); //针对 between and 或 not between and 的情况 作判断 ,因为需要取第二个值来组装sql boolean isbetween = false; //分组号 int jionFlagGroup = GridUtils.prossRowSetDataType_Int(map, "jionFlagGroup"); //关系符 String jionflag = GridUtils.prossRowSetDataType_String(map, "jionFlag"); //连接符 String conFlag = GridUtils.prossRowSetDataType_String(map, "conFlag"); //数据组号,会存在多个数据组的情况 String accessid = GridUtils.prossRowSetDataType_String(map, "accessid"); //字段名称 final String fieldid = GridUtils.prossRowSetDataType_String(map, "fieldid"); //没有设置有关系符和连接符,表明关联不成立,不需要生成权限sql,提示需要进行相关设置 if (jionflag.trim().equals("") && conFlag.trim().equals("")) { throw new ApplicationException(fieldid + "中jionFlag,conFlag没进行设置,请检查[功能号:9654(维护数据显示权限)]设置"); } String newFieldid = fieldid; if (tableColumnsDataTypeEntities != null && tableColumnsDataTypeEntities.stream().filter( x -> fieldid.equalsIgnoreCase(x.getFieldId()) && ("int".equalsIgnoreCase(x.getDataType())) || ("money".equalsIgnoreCase(x.getDataType())) || ("decimal".equalsIgnoreCase(x.getDataType())) || ("double".equalsIgnoreCase(x.getDataType())) || ("float".equalsIgnoreCase(x.getDataType())) || ("real".equalsIgnoreCase(x.getDataType())) || ("numeric".equalsIgnoreCase(x.getDataType())) || ("bigint".equalsIgnoreCase(x.getDataType())) || ("bit".equalsIgnoreCase(x.getDataType())) || ("smallint".equalsIgnoreCase(x.getDataType())) || ("smallmoney".equalsIgnoreCase(x.getDataType())) || ("tinyint".equalsIgnoreCase(x.getDataType())) ).count() > 0) { newFieldid = " isnull(" + fieldid + ",0) "; } else { newFieldid = " isnull(" + fieldid + ",'') "; } havingstr.append(" ( ").append(newFieldid);//字段名; Pattern p = Pattern.compile("@.*?\\w+");// 匹配以@开头的单词 String modfvalues = GridUtils.prossRowSetDataType_String(map, "modfvalues"); String modfvalues2 = GridUtils.prossRowSetDataType_String(map, "modfvalues2"); if (modfvalues.length() == 0) { throw new ApplicationException("功能号:9654(维护数据显示权限)值1不能为空"); } java.util.regex.Matcher propsMatcher = p.matcher(modfvalues); while (propsMatcher.find()) { try { String tem = (String) session.getAttribute(propsMatcher.group().toLowerCase()); modfvalues = modfvalues.replaceAll(propsMatcher.group(), tem); } catch (Exception e) { throw new ApplicationException("要替换的变量【" + propsMatcher.group() + "】未定义,请检查数据组权限设置时该变量名称拼写是否正确?"); } } if (conFlag.toLowerCase().indexOf("between") > -1 || conFlag.toLowerCase().indexOf("not between") > -1 ) { isbetween = true; } if (isbetween && (modfvalues2 == null || modfvalues2.length() == 0)) { throw new ApplicationException("between and 或 not between and 的第二个值没有设置,请检查[功能号:9654(维护数据显示权限)]里面设置"); } if (isbetween) { propsMatcher = p.matcher(modfvalues2); while (propsMatcher.find()) { modfvalues2 = modfvalues2.replaceAll(propsMatcher.group(), (String) session.getAttribute(propsMatcher.group().toLowerCase())); } havingstr.append(" " + conFlag) .append(" " + modfvalues) .append(" and ") .append(modfvalues2); } else if (conFlag.toLowerCase().indexOf("like") > -1 || conFlag.toLowerCase().indexOf("not like") > -1) { //处理有单引号情况 'dddd' modfvalues = modfvalues.replaceAll("'", ""); havingstr.append(" " + conFlag) .append(" '%" + modfvalues + "%'"); } else if (conFlag.toLowerCase().indexOf("in") > -1 || conFlag.toLowerCase().indexOf("not in") > -1) { //*****处理广陶 CS版兼容问题,增加单引号 by 2016-3-4 String temp = ""; String[] arr = modfvalues.replaceAll(";", ",").split(","); for (String r : arr) { if (r.startsWith("'") && r.endsWith("'")) { temp += r + ","; } else { if (r.startsWith("'") || r.endsWith("'")) {//存在一种情况需要去掉单引号 temp += "'" + r.replaceAll("'", "") + "',"; } else { temp += "'" + r + "',"; } } } havingstr.append(" " + conFlag) .append(" (" + temp.substring(0, temp.length() - 1) + ")"); } else { havingstr.append(" " + conFlag) .append(" " + modfvalues); } havingstr.append(" ) ");//当前项结束 String temp = sql.get(accessid.trim()); //1,拼接同一数据组的sql,前提条件是数据已按照数据组,分组号排好序 // temp为空表示是一个数据组里面的第一个sql if (temp == null) { sql.put(accessid.trim(), "( " + havingstr.toString()); JionFlagMap.put(accessid.trim(), "".equals(jionflag.trim()) ? " and " : jionflag.trim()); tempJionFlagGroup = jionFlagGroup; } else { //中间连接符不能为空,不填则用默认用and连接 if ("".equals(jionflag.trim())) { jionflag = " and "; } String str = sql.get(accessid.trim()) + "" + jionflag + havingstr.toString(); if (tempJionFlagGroup != jionFlagGroup) { tempJionFlagGroup = jionFlagGroup; //处理下一个分组 str = sql.get(accessid.trim()) + " ) " + jionflag + " (" + havingstr.toString(); } sql.put(accessid.trim(), str); } //处理数据组结束时加上闭合 if ( //1,最后一条数据时,要闭合 indexdx == list.size() - 1 || //2,判断下一个的数据组号是不是和当前在同一个组,不是则表明也需要闭合起来 ((indexdx + 1) <= list.size() && list.get(indexdx + 1) != null && !accessid.trim().equals((list.get(indexdx + 1).get("accessid") + "").trim())) ) { String strs = sql.get(accessid.trim()); strs += " )"; sql.put(accessid.trim(), strs); } indexdx++; } //2.再拼接最终sql的顺序,根据数据组用or拼接起来 StringBuilder st = new StringBuilder(); int index = 0; String temAccessid = ""; boolean isFrist = false; boolean other = false; for (Map.Entry entry : sql.entrySet()) { String temJionFlag = ""; if ("".equals(temAccessid)) { temAccessid = entry.getKey(); isFrist = true; } else { isFrist = false; if (!temAccessid.equals(entry.getKey())) { //表明这里是另一个数据组的开始,需要闭合,且用or 连接起来 st.append(" ) or ( "); temAccessid = entry.getKey(); isFrist = true; other = true; } } if (!isFrist) { temJionFlag = JionFlagMap.get(entry.getKey()); st.append(" " + temJionFlag + " (" + entry.getValue() + ")"); } else { //other=true表示已经不是第一个数据组,不需要加开始括号 st.append((other ? "" : " ( ") + entry.getValue()); } } st.append(" )"); return " and (" + st.toString() + ")"; } /** * @param map 通过传需要替换的参数列表,取得当前记录集对应的值 */ private String getRecordValues(HashMap map, String prams) { if (StringUtils.isBlank(prams)) { return ""; } //多表的情况,会执行多次,所以在这里判断一下 if (prams.trim().startsWith("exec")) { return prams; } String[] temp = null; String[] ss = prams.trim().split("\\s+"); boolean flg = false; if (ss.length == 1) { prams = ss[0]; flg = true; } else { prams = ss[1]; } if (prams.indexOf(",") > -1) { temp = prams.split(","); } else if (prams.indexOf(";") > -1) { temp = prams.split(";"); } else { temp = prams.split(";"); } String str = ""; for (String s : temp) { if (s.trim().equalsIgnoreCase("''") || s.matches("'\\s+'")) { str += s + ","; continue; } boolean fg = s.matches("'.*'");// 存在''号的情况 boolean flag = false; if (fg) s = s.substring(1, s.length() - 1);// 去除''号 String key = s.trim().toLowerCase(); if (map.containsKey(key)) { String obj = (String) map.get(key) == null ? "" : (String) map.get(key);//取到对应值 if (this.checkSqlVar(map.get(key))) { str += obj.replaceAll("\\s", "") + ","; } else { str += "'" + obj.replaceAll("\\s", "") + "',"; } flag = true; } // for (Object k : map.keySet()) { // if (s.trim().equalsIgnoreCase(((String) k).trim())) { // if(this.checkSqlVar(map.get(k))) // str += ((String) map.get(k)).replaceAll("\\s", "") + ","; // else // str += "'" + ((String) map.get(k)).replaceAll("\\s", "") + "',"; // flag = true; // break; // } // } if (!flag) {// 在当前表格数据找不到则查找以@开头的变量 if (local.get().get(s.toLowerCase()) != null) str += "'" + local.get().get(s.toLowerCase().trim()) + "',"; else {// 参数本身就是作为值传过去 if (fg) // 已经去除''号,所以要再加上 str += "'" + s + "',"; else str += s + ","; } } } if (flg) return (str.lastIndexOf(",") == str.length() - 1) ? str.substring(0, str.length() - 1) : str; else return (str.lastIndexOf(",") == str.length() - 1) ? " exec " + ss[0] + " " + str.substring(0, str.length() - 1) : " exec " + ss[0] + " " + str; } /** * //值为sql变量 @newDoccode,@rowid,@detailrowid,不需要加单引号 **/ private boolean checkSqlVar(Object k) { String varsql = ",@newDoccode" + cont + ",@rowid" + cont + ",@detailrowid" + cont + ","; if (k != null && varsql.contains("," + (k) + ",")) //cont代表计算循环 return true; else return false; } /** * sql语句的值是不是需要加上双引号,通过当前的列名查找表结构里的列数据类型 */ private void parserType(HashMap map, StringBuilder key, Object k, Map tableMetaDatas) { Object obj = null; if (this.checkSqlVar(map.get(k))) { key.append(map.get(k)); return; } int i = this.getTypeByMetaData(tableMetaDatas, (String) k); if (i == 3 || i == 2 || i == 4) {// 类型为varchar date if (map.get(k) == null || map.get(k).toString().length() == 0) { if (i == 4 || i == 2) key.append(obj); else key.append("''"); } else { if ((((String) k).equalsIgnoreCase("enterdate") && ((String) map.get("enterdate")).equalsIgnoreCase("getdate()")) || (((String) k).equalsIgnoreCase("modifydate") && ((String) map.get("modifydate")).equalsIgnoreCase("getdate()"))|| (((String) k).equalsIgnoreCase("periodid") && ((String) map.get("periodid")).startsWith("dbo.getPeriodid")) ) {// 为了把getdate(),getPeriodid作为 一个function而增加,不加单引号 key.append(map.get(k)); } else if (((String) k).equalsIgnoreCase("treecontrol")) {//是为了不需要加上单引号 if (map.get(k) != null && map.get(k).toString().length() > 0){ key.append(" N'"+map.get(k)+"'"); }else { key.append(map.get(k)); } } else { if ("null".equalsIgnoreCase((String) map.get(k))) { key.append(obj); } else { if (((String) k).equalsIgnoreCase("ImageBinary")) { key.append("'"); InputStream photoStream = null; try { String url = this.getClass().getResource("/").getPath(); url = url.substring(0, url.indexOf("WEB-INF")); photoStream = new FileInputStream(url + map.get("ImagePath")); String imagebyte = input2bytet(photoStream); key.append(imagebyte); key.append("'"); } catch (Exception e) { e.printStackTrace(); } finally { try { photoStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else { key.append("N'");//处理国际化 if (i == 3) { String s = map.get(k) + ""; if (s.lastIndexOf(JsonUtil.IMGRANG) > 0) {//处理图片格式问题,去掉|100|100 String ls = s.split("\\|")[1]; s = ls.replaceAll(".*uuid=", ""); s = s.replaceAll("&.*r=.*+", ""); } key.append(s.replaceAll("'", "''").replaceAll(">", ">").replaceAll("<", "<").replaceAll("&", "&")); } else //text,ntext类型 key.append(((String) map.get(k)).replaceAll("'", "''").replaceAll(">", ">").replaceAll("<", "<").replaceAll("&", "&")); key.append("'"); } } } } } else if (i == 5) { key.append("1".equalsIgnoreCase(((String) map.get(k))) ? 1 : 0); } else { String kk = (String) k; if (kk.equalsIgnoreCase("docitem")) { key.append(map.get(k).toString().length() == 0 ? obj : map.get(k) != null ? map.get(k) : this.docitem); } else { key.append((map.get(k) == null || map.get(k).toString().trim().length() == 0) ? obj : map.get(k)); } } } /** * 通过读取当前表结构分析当前列的数据类型,进而确定用什么格式转换 **/ private void parserTypeInfo(HashMap map, Object k, StringBuilder key, Map tableMetaData) { try { Object obj = null; int i = this.getTypeByMetaData(tableMetaData, (String) k); if (i == 3 || i == 2 || i == 4) {// 类型为varchar date if (map.get(k) == null || map.get(k).toString().length() == 0) {// 生成(rowcopyfields is null or rowcopyfields ='')格式,因为null 与''无法识别 if (i == 2) // text,ntext,image类型 key.append("[").append(k).append("]").append(" is ").append(obj).append(" )"); else if (i == 3 || i == 4) key.append("[").append(k).append("]").append("='").append(map.get(k)).append("' ").append(" or ").append("[").append(k).append("]").append(" is ").append(obj).append(" )"); } else { if (i == 3 || i == 2) { if (i == 2) { key.append("[").append(k).append("]").append("='").append((map.get(k) + "").replaceAll("'", "''")).append("' )"); } else { String s = map.get(k) + ""; if (s.lastIndexOf(JsonUtil.IMGRANG) > 0) {//处理图片格式问题,去掉|100|100 String ls = s.split("\\|")[1]; s = ls.replaceAll(".*uuid=", ""); s = s.replaceAll("&r=.*+", ""); } key.append("[").append(k).append("]").append("='").append(s.replaceAll("'", "''").replaceAll(">", ">").replaceAll("<", "<")).append("' )"); } } else { key.append("[").append(k).append("]").append(" = '").append((map.get(k) + "").replaceAll("'", "''")).append("' )"); } } } else if (i == 1) {// 数值型 if (map.get(k)==null||map.get(k).toString().length() == 0) { key.append("[").append(k).append("]").append(" is ").append(obj).append(" )"); }else { key.append("[").append(k).append("]").append(" = ").append(map.get(k)).append(" )"); } } else { key.append("[").append(k).append("]").append(" is ").append(obj).append(" )"); } } catch (Exception e) { throw e; } } /** * 把客户端面板的json提交转换为insert into数据库格式 * * @param isPramyPan TODO */ private void convert2PanelInsertSQL(Map tableMetaDatas, List> PanelDataList, String tableName, String isPramyPan, String dbid) { if (PanelDataList != null) { for (HashMap map : PanelDataList) { StringBuilder keyList = new StringBuilder(); StringBuilder value = new StringBuilder(); keyList.append("("); value.append(" values("); // ---by danaus 16-3-15 增加中间变量是因为map在增加了key和value再通过keySet()会出现 // 错误,所以把初始map的数据保存在中间变量里面 HashMap tempDataMap = new HashMap(); tempDataMap = (HashMap) map.clone(); Set set = tempDataMap.keySet(); // --- for (Object key : set) { boolean isPass = true; if ("__gridKey__".equalsIgnoreCase((String) key) || "enterdate".equalsIgnoreCase((String) key) || "entername".equalsIgnoreCase((String) key) || "entercode".equalsIgnoreCase((String) key) || "modifydate".equalsIgnoreCase((String) key) || "modifyname".equalsIgnoreCase((String) key) ) { continue;//这几个字段值不需要从前端取值,所以去掉 } isPass = tableMetaDatas.containsKey(key);//计算字段 isPass = checkExpressionColumn(map, key, isPass); if (isPass) { if ("doccode".equalsIgnoreCase((String) key) && checkDocType()) { isDoccode = true; if (this.doccode.length() == 0) // 没有单号的情况 { map.put(key, "@newDoccode" + cont);// 先占位,然后插入时候再换成真正的doccode } else { // 已有单号,再重新增加新的数据 map.put(key, this.doccode);// 使用事先已有单号 } } if ("companyid".equalsIgnoreCase((String) key)) { if (map.get("companyid") == null || ((String) map.get("companyid")).length() == 0) map.put(key, local.get().get("@companyid")); } if ("docdate".equalsIgnoreCase((String) key)) { if (map.get("docdate") == null || ((String) map.get("docdate")).length() == 0) map.put(key, DateUtil.toDayDate()); } if ("periodid".equalsIgnoreCase((String) key)) { if (map.get("companyid") == null || ((String) map.get("companyid")).length() == 0) { map.put("companyid", local.get().get("@companyid")); } map.put(key,"dbo.getPeriodid("+map.get("formid")+","+GridUtils.prossSqlParm((String) map.get("companyid"))+","+GridUtils.prossSqlParm((String) map.get("docdate"))+")"); // try { // int fromid = Integer.parseInt((String) map.get("formid")); // SpObserver.setDBtoInstance("_" + dbid); // map.put(key, gridService.getPeriodID(fromid, (String) map.get("companyid"), // (String) map.get("docdate"))); // } catch (Exception e) { // throw new ApplicationException( // "生成凭证出错!formid=[" + map.get("formid") + "],原因:" + getErrorMsg(e)); // } finally { // SpObserver.setDBtoInstance(); // } } keyList.append("[").append(key); parserType(map, value, key, tableMetaDatas); keyList.append("],"); value.append(","); } } // ---- if (this.winType == 9 || this.winType == 15 || this.winType == 17 || ((this.winType == 497 || this.winType == 499) && "1".equalsIgnoreCase(isPramyPan))) {// by // danaus // 单据类型需要提交修改赶时间,修改人 // 或多表时是主面板才需要 keyList.append("[enterdate],[entername],[entercode],[ModifyName],[ModifyDate] "); value.append("getdate(),'") .append(local.get().get("@hrname")).append("','") .append(local.get().get("@hrcode")).append("','") .append(local.get().get("@hrname")).append("',getdate(),"); } if (!this.type496.equals("update")) {// 针对496的从表 if (this.type496.equals("add") && "1".equalsIgnoreCase(isPramyPan)) {// 496的主表先临时存放在this.zhupan496 // 循环完所有从表后再保存回this.insertsql。 this.zhupan496 += "\n insert into " + tableName + keyList.substring(0, keyList.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"; this.type496 = ""; } else { if (isPramyPan != null && "1".equalsIgnoreCase(isPramyPan)) this.insertsql.add(0, "insert into " + tableName + keyList.substring(0, keyList.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"); else this.insertsql.add("insert into " + tableName + keyList.substring(0, keyList.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"); } } else {// 这个是主从不是一个视图情况添加到对应的表里。 this.wherepan496 += "insert into " + tableName + keyList.substring(0, keyList.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"; this.type496 = ""; } } if (add_p != null && add_p.size() > 0) { for (String str : add_p) { for (HashMap map : PanelDataList) this.getProcValues(map, str); } } else { if (PanelDataList != null && PanelDataList.size() > 0) this.getProcValues(PanelDataList.get(0), ""); } } } /** * 把客户端json转换为insert into格式 */ private void convert2InsertSQL(Map tableMetaData, GTJson json, String tableName, int fl, com.yc.utils.Grid g, String dbid) { List> list = null; // List m = null; String colns = ""; if (fl == 2) { list = json.getOtherInserteds(); // m = md2; colns = json.getOtherColns();//三表中的第二表 } else if (fl == 1) { list = json.getInsertedRecords(); //m = tableMetaData; colns = json.getColns();//取格线作为主功能号,或第一表 } else { list = g.getInsertedRecords(); //m = md2; colns = g.getColns();//各个子功能号 } if (list != null) { for (HashMap map : list) { // if (this.TbkeyID != null && this.TbkeyID.length() > 0) { // //淘宝接口,先判断当前数据库是否已存在,存在则转换成更新操作,否则是新增 // String id = this.TbkeyID.split(",")[1];//主表的主键 // String sql = "declare @num" + cont + " integer \n select @num" + cont + "=count([" + id + "]) from " + name + " where [" + id + "]=? \n select @num" + cont + " "; // // int cont = 0; // try { // SpObserver.setDBtoInstance("_" + dbid); // cont = gridService.getSimpleJdbcTemplate().queryForObject(sql, new Object[]{map.get(id.toLowerCase())}, Integer.class); // } finally { // SpObserver.setDBtoInstance(); // } // if (cont > 0) {//表示已存在,需要转换成更新sql // GTJson js = new GTJson(); // List> temp1 = new ArrayList>(); // temp1.add(map); // if (fl == 2) // js.setOtherUpdateds(temp1); // else // js.setUpdatedRecords(temp1); // convert2UpdateSQL(tableMetaData, js, name, fl, g); // temp1 = null; // js = null; // continue; // } // } StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); String rowidCreate = ""; String detailrowidCreate = ""; key.append("("); value.append("values("); if (this.formID == 9802 || this.formID == 9801 || this.formID == 9843 || this.formID == 9844 || this.formID == 9816||this.formID==9685) { if ("".equalsIgnoreCase(page_formid)) page_formid = (String) map.get("formid"); } if (this.formID == 9842) { //功能链接 if ("".equalsIgnoreCase(page_formid)) page_formid = (String) map.get("origformid"); } for (Object k : map.keySet()) { boolean flag = true;// false; flag = tableMetaData.containsKey(k + ""); flag = checkEnableColumns(colns, k, flag);// 检查不需要更新的字段 flag = checkExpressionColumn(map, k, flag);// 增加时有权限控制的字段不需要更新,只需要判断是否值为6个*。其他的都需要写入数据库 if ("_ConstWidth".equalsIgnoreCase((String) k) || "_version".equalsIgnoreCase((String) k) || (((String) k).endsWith("Orig") && map.containsKey(((String) k).substring(0, ((String) k).length() - 4)))//by2016-4-25 增加判断在新增的情况,以Orig结尾的都不应该写入数据库 ) continue; if (flag) { if ("doccode".equalsIgnoreCase((String) k) && checkDocType()) { isDoccode = true; if (this.doccode.length() == 0) {// 没有单号的情况 //统一放在sql执行生成单号 map.put(k, "@newDoccode" + cont);// 先占位,然后插入时候再换成真正的doccode } else // 已有单号,再重新增加新的数据 map.put(k, this.doccode);// 使用事先已有单号 } if ("docitem".equalsIgnoreCase((String) k) && map.get(k) == null) {// web层没传入docitem才需要在后台自动生成 if (fl == 2) {// 表示为三表的第二表 this.docitem2 += 10; map.put(k, this.docitem2); } else { this.docitem += 10; map.put(k, this.docitem); } } //增加手机APP对2类型保存的支持, if (g != null && "2".equalsIgnoreCase(g.getTableType()) && "treecontrol".equalsIgnoreCase((String) k) && (map.get(k) == null || "".equals(map.get(k)) || ((String) map.get(k)).length() == 0)) { if ("".equals(map.get("parentrowid"))) { //value.append("'").append(map.get("rowid")).append("'"); map.put(k, "@rowid" + cont); } else { BaseService bs = (BaseService) FactoryBean.getBean("BaseService"); try { SpObserver.setDBtoInstance("_" + dbid); String tcontrol = bs.getSimpleJdbcTemplate().queryForObject("select top 1 treeControl from " + tableName + " where rowid='" + map.get("parentrowid") + "'", String.class); //value.append("'").append(tcontrol).append(map.get("rowid")).append("'"); map.put(k, "'" + tcontrol + "'+@rowid" + cont); } finally { SpObserver.setDBtoInstance(); } } } if ("rowid".equalsIgnoreCase((String) k) && (map.get(k) == null || "".equals(map.get(k)) || ((String) map.get(k)).length() == 0)) { rowidCreate = " exec getXXXX @rowid" + cont + " output; \n"; map.put(k, "@rowid" + cont); // if(json.getRefKeyMap().get(g.getFormid()+"")!=null){//有值表明rowid生成直接取上一行 // // }else { // rowidCreate = " exec getXXXX @rowid" + cont + " output; \n"; // map.put(k, "@rowid" + cont); // } // //处理496多表子功能号之间有关联的情况(rowid) by danaus 2020/1/18 11:31 //// if(g.getKeyid()!=null&&!"".equals(g.getKeyid())){ //// //T_180212|RowId;rowid //// String refFormid=g.getKeyid().split("|")[0].replace("T_","");//取得180212 //// json.getRefKeyMap().put(refFormid,cont+""); //// } } if ("detailrowid".equalsIgnoreCase((String) k) && (map.get(k) == null || "".equals(map.get(k)) || ((String) map.get(k)).length() == 0)) { detailrowidCreate = " exec getXXXX @detailrowid" + cont + " output;\n "; map.put(k, "@detailrowid" + cont); } if ("id".equalsIgnoreCase((String) k)) {// 转换成id字段 if (!String.valueOf(map.get(k)).startsWith("__YC") && !String.valueOf(map.get(k)).startsWith("AR")) {//且id不为自增 key.append("[").append("id"); HashMap ts = new HashMap(); ts.put("id", (String) map.get(k)); parserType(ts, value, "id", tableMetaData); ts = null; } else { continue; } } if ("_version".equalsIgnoreCase((String) k)) {//存在有版本号,处理并发问题 map.put(k, 1); } if ("_ycid_".equalsIgnoreCase((String) k)) {// 转换成id字段 // if(tableMetaData.stream().noneMatch(x->!x.getColumnName().toLowerCase().equalsIgnoreCase("id"))){ if (tableMetaData.containsKey("id")) {//且id不为自增 key.append("[").append("id"); HashMap ts = new HashMap(); ts.put("id", (String) map.get(k)); parserType(ts, value, "id", tableMetaData); ts = null; } else { continue; } } else { key.append("[").append(k); parserType(map, value, k, tableMetaData); } key.append("],"); value.append(","); } } this.insertsql.add(rowidCreate + detailrowidCreate + " insert into " + tableName + key.substring(0, key.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"); rowidCreate = ""; detailrowidCreate = ""; } } if (add != null && add.size() > 0) { for (String str : add) { for (HashMap map : list) this.getProcValues(map, str); } } else { if (list != null && list.size() > 0) this.getProcValues(list.get(0), ""); } } /** * 组装审计数据成inert into后提交到数据库 */ private void convert2AuditSQL(List> list, int count) { final Map sysAudit = gridService.getTableMetaData("_sysAudit"); if (list != null) { for (HashMap map : list) { StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); key.append("("); value.append("values("); for (Object k : map.keySet()) { boolean flag = true;// false; if ("_ConstWidth".equalsIgnoreCase((String) k) || "_YCAUDIT_".equalsIgnoreCase((String) k)) continue; if (flag) { if ("doccode".equalsIgnoreCase((String) k)) { if (this.doccode.length() == 0) {// 没有单号的情况 // if(this.docPram!=""&&this.docPram.length()>0)//自定义单号 // map.put(k, "#doccode"); // else map.put(k, "@newDoccode" + count);// 先占位,然后插入时候再换成真正的doccode } else // 已有单号,再重新增加新的数据 map.put(k, this.doccode);// 使用事先已有单号 } if ("usercode".equalsIgnoreCase((String) k)) { map.put("usercode", local.get().get(SessionKey.USERCODE)); } if ("username".equalsIgnoreCase((String) k)) { map.put("username", local.get().get(SessionKey.USERNAME)); } key.append("[").append(k); parserType(map, value, k, sysAudit); key.append("],"); value.append(","); } } this.insertsql.add("insert into _sysAudit" + key.substring(0, key.length() - 1) + ")" + value.substring(0, value.length() - 1) + ")"); } } // list = null; } /** * 把客户端json提交转换为update数据库格式 */ private void convert2UpdateSQL(Map tableMetaData, GTJson json, String tableName, int fl, com.yc.utils.Grid g) { List> update1 = null; List> vss = null; // SqlRowSetMetaData m = null; String colns = ""; if (fl == 2) { update1 = json.getOtherUpdateds(); vss = json.getOtherVss(); // m = md2; g = new com.yc.utils.Grid(); g.setPrimeKey(json.getOtherPrimeKey()); colns = json.getOtherColns(); } else if (fl == 1) { update1 = json.getUpdatedRecords(); vss = json.getVssRecords(); // m = md; colns = json.getColns(); } else if (fl == 3) { update1 = g.getUpdatedRecords(); vss = g.getVssRecords(); // m = md2; colns = g.getColns(); } if (update1 != null && update1.size() > 0) { checkPrimKey(g, tableName,vss); for (int i = 0; i < update1.size(); i++) { StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); boolean isNul = false;// 标记是否有更新的字段,存在当只更新一个字段,但这个字段又设置为不用更新的情况 key.append(" set "); value.append(" where 1=1 "); HashMap up = update1.get(i); HashMap vs = null; if (vss != null && vss.size() > 0) vs = vss.get(i); boolean isVersion = false; for (Object k : up.keySet()) { if (((String) k).equalsIgnoreCase("doccode") && checkDocType()) {//docitem需要能修改,|| ((String) k).equalsIgnoreCase("docitem") isDoccode = true; continue; } boolean flag = true;// false; flag = tableMetaData.containsKey(k + "");// 去除计算列,自增ID flag = checkEnableColumns(colns, k, flag);// 检查不需要更新的字段 flag = checkExpressionColumn(up, k, flag);// 更新时有权限控制的字段不需要更新 if (flag) { if ("_ycid_".equalsIgnoreCase((String) k)) {// 转换成id字段 // if(tableMetaData.stream().noneMatch(x->!x.getColumnName().toLowerCase().equalsIgnoreCase("id"))){ if (tableMetaData.containsKey("id")) {//且id不为自增 key.append("[").append("id"); HashMap ts = new HashMap(); ts.put("id", up.get(k)); key.append("]="); parserType(ts, key, "id", tableMetaData); ts = null; } else { continue; } } else { if ("docversion".equalsIgnoreCase((String) k)) {//版本号不更新 continue; } key.append("[").append(k); key.append("]="); parserType(up, key, k, tableMetaData); } key.append(","); isNul = true; } } if (!isNul) continue;// 跳出,不用写进去,因为不存在需要更新的字段 String versionStr = ""; if (!isVersion && vs != null && vs.size() > 0 && vs.containsKey("docversion")) {//存在有版本号,用来处理并发问题 versionStr = " and isnull(docversion,0)=isnull(" + (("null".equals(vs.get("docversion")) || org.apache.commons.lang3.StringUtils.isBlank(vs.get("docversion"))) ? "0" : vs.get("docversion")) + ",0) \n" + " if @@rowcount=0 \n " + " begin \n" + " raiserror('当前单据内容已发生变化,请刷新页面然后重试此操作',16,1) \n" + " return \n" + " end \n"; isVersion = true; } //有了版本号,但为了兼容以前的 where后面的全匹配 ,取是主键字段作为where条件,而不是全匹配 by2015-12-19 if (vss != null && vss.size() > 0) { vs = vss.get(i); if (this.formID == 9802 || this.formID == 9801 || this.formID == 9843 || this.formID == 9816||this.formID==9685) { if ("".equalsIgnoreCase(page_formid)) page_formid = vs.get("formid"); } if (this.formID == 9842) { //功能链接 if ("".equalsIgnoreCase(page_formid)) page_formid = vs.get("origformid"); } for (Object k : vs.keySet()) {// 取where后面的全匹配 //取出主键字段 // if((";"+g.getPrimeKey().toLowerCase()).contains(";"+(String)k+";")){ if (org.apache.commons.lang3.StringUtils.isBlank(g.getPrimeKey())) { throw new ApplicationException("前端没有传递主键或" + tableName + "没有设置主键,不能执行更新(update)操作"); } String str = g.getPrimeKey().toLowerCase(); if (!str.endsWith(";")) str += ";"; if ((";" + str).contains(";" + ((String) k).toLowerCase() + ";")) { if (org.apache.commons.lang3.StringUtils.isBlank(vs.get(k)) || "null".equalsIgnoreCase(vs.get(k))) { throw new ApplicationException(tableName + "表update更新时主键【" + k + "】值不能为空"); } else { value.append(" and ("); parserTypeInfo(vs, k, value, tableMetaData); } } //1,3类型存在ModifyDate,ModifyName,需要更新 by by danaus 2021/6/7 11:09 if ("modifydate".equalsIgnoreCase((String) k) && (this.winType == 1 || this.winType == 3)) { key.append("[").append(k); key.append("]=getdate(),"); } if ("modifyname".equalsIgnoreCase((String) k) && (this.winType == 1 || this.winType == 3)) { key.append("[").append(k); key.append("]='" + json.getUserName() + "',"); } } } else {//淘宝接口 where条件 value.append(" and ("); parserTypeInfo(up, this.TbkeyID.split(",")[1], value, tableMetaData); } //通过版本号判断数据是否已更新,版本号不一致则显示提示信息,刷新页面再提交 by danaus 2022/3/11 11:11 String updateSql = "update " + tableName + (key.lastIndexOf(",") == (key.length() - 1) ? key.substring(0, key.length() - 1) : key.toString()) + value.toString() + versionStr; //增加处理因为少了主键造成更新多条记录的情况 by danaus 2020/4/24 15:26 this.updatesql.add(updateSql + "\n if @@rowcount > 1 \n" + " begin \n" + " raiserror('由于表/视图缺少正确的主键(Primary Key),将导致多条记录被更新(update)为相同的值,解决办法:为表/视图【" + tableName + "】设置正确的主键(Primary Key)',16,1)\n" + "\t return \n" + " end \n"); up = null; vs = null; } } if (update != null && update.size() > 0) {//处理保存时执行 for (String str : update) { for (int k = 0; k < update1.size(); k++) { HashMap m1 = update1.get(k); HashMap m2 = vss.get(k); m1.putAll(m2); this.getProcValues(m1, str); } } } else { if (update1 != null && update1.size() > 0) this.getProcValues(update1.get(0), ""); if (vss != null && vss.size() > 0) this.getProcValues(vss.get(0), ""); } update = null; vss = null; } private void checkPrimKey(com.yc.utils.Grid g, String name, List> update1) {//检查是否表是否设置了主键,更新,删除操作都需要这个来作为唯一条件 if (g.getPrimeKey() == null || "".equalsIgnoreCase(g.getPrimeKey())) throw new ApplicationException(name + "表没有设置主键!"); //---存在主键设置,但前端没传主键对应的值,也需要提示 final String[] keys = g.getPrimeKey().split(";"); if(update1!=null&&update1.size()>0){ Arrays.stream(keys).forEach(key->{ final String object = update1.get(0).get(key.toLowerCase()); if(org.apache.commons.lang3.StringUtils.isBlank(object)){ throw new ApplicationException(name + "主键字段"+key+"没有传值,不能执行操作,解决方法:请在9802勾选上此字段的感应属性"); } }); } } private boolean checkDocType() { return this.winType == 9 || this.winType == 15 || this.winType == 17 || this.winType == 497 || this.winType == 499; } /*** * * @param temp * @param json * @param name * @param fl * @param g * 处理权限管理sql转换,需要判断新增和修改的情况 * */ private void convert2SQL_pem(List temp, GTJson json, String name, int fl, com.yc.utils.Grid g) { List> update1 = null; List> vss = null; SqlRowSetMetaData m = null; vss = json.getUpdatedRecords(); update1 = json.getVssRecords(); m = md2; if (update1 != null) { for (int i = 0; i < update1.size(); i++) {//从全匹配里面组装 StringBuilder sb = new StringBuilder(); HashMap up = update1.get(i); HashMap v = vss.get(i);//取出修改过的值,填充回去,再组装 for (Map.Entry en : v.entrySet()) { if (Integer.parseInt(up.get("treetype")) == 2 && !"".equalsIgnoreCase(up.get("profilename"))) { up.put("profileid", up.get("profileid")); up.put("profilename", up.get("profilename")); } up.put(en.getKey(), en.getValue()); if(en.getKey().equals("statisids")) { up.put(en.getKey(), en.getValue()); } } if (up.get("formid") != null && "".equalsIgnoreCase(up.get("formid"))) continue;//防止只是修改大图标,提交时没有formid而出错 int treetype = Integer.parseInt(up.get("treetype")); if (treetype != 2) { int p1 = ((up.get("isreportdesign") == null || "".equalsIgnoreCase(up.get("isreportdesign"))) ? 0 : Integer.valueOf(up.get("isreportdesign"))) == 1 ? 8192 : 0; int p2 = ((up.get("isnewdoc") == null || "".equalsIgnoreCase(up.get("isnewdoc"))) ? 0 : Integer.valueOf(up.get("isnewdoc"))) == 1 ? 4096 : 0; int p3 = ((up.get("ispostdoc") == null || "".equalsIgnoreCase(up.get("ispostdoc"))) ? 0 : Integer.valueOf(up.get("ispostdoc"))) == 1 ? 2048 : 0; int p4 = ((up.get("isdeldoc") == null || "".equalsIgnoreCase(up.get("isdeldoc"))) ? 0 : Integer.valueOf(up.get("isdeldoc"))) == 1 ? 1024 : 0; int p5 = ((up.get("iscancelpostdoc") == null || "".equalsIgnoreCase(up.get("iscancelpostdoc"))) ? 0 : Integer.valueOf(up.get("iscancelpostdoc"))) == 1 ? 256 : 0; int p7 = ((up.get("isopenquery") == null || "".equalsIgnoreCase(up.get("isopenquery"))) ? 0 : Integer.valueOf(up.get("isopenquery"))) == 1 ? 128 : 0; int p8 = ((up.get("isexecsp") == null || "".equalsIgnoreCase(up.get("isexecsp"))) ? 0 : Integer.valueOf(up.get("isexecsp"))) == 1 ? 64 : 0; int p9 = ((up.get("isaddrow") == null || "".equalsIgnoreCase(up.get("isaddrow"))) ? 0 : Integer.valueOf(up.get("isaddrow"))) == 1 ? 32 : 0; int p10 = ((up.get("iscopyrow") == null || "".equalsIgnoreCase(up.get("iscopyrow"))) ? 0 : Integer.valueOf(up.get("iscopyrow"))) == 1 ? 16 : 0; int p11 = ((up.get("isdelrow") == null || "".equalsIgnoreCase(up.get("isdelrow"))) ? 0 : Integer.valueOf(up.get("isdelrow"))) == 1 ? 8 : 0; int p12 = ((up.get("issave") == null || "".equalsIgnoreCase(up.get("issave"))) ? 0 : Integer.valueOf(up.get("issave"))) == 1 ? 4 : 0; int p13 = ((up.get("isprint") == null || "".equalsIgnoreCase(up.get("isprint"))) ? 0 : Integer.valueOf(up.get("isprint"))) == 1 ? 2 : 0; int p14 = ((up.get("isexport") == null || "".equalsIgnoreCase(up.get("isexport"))) ? 0 : Integer.valueOf(up.get("isexport"))) == 1 ? 1 : 0; int p15 = ((up.get("iscopydoc") == null || "".equalsIgnoreCase(up.get("iscopydoc"))) ? 0 : Integer.valueOf(up.get("iscopydoc"))) == 1 ? 16384 : 0; int p16 = ((up.get("isimport") == null || "".equalsIgnoreCase(up.get("isimport"))) ? 0 : Integer.valueOf(up.get("isimport"))) == 1 ? 32768 : 0; int p17 = ((up.get("islistdoc") == null || "".equalsIgnoreCase(up.get("islistdoc"))) ? 0 : Integer.valueOf(up.get("islistdoc"))) == 1 ? 65536 : 0; int p18 = ((up.get("isrevokepostdoc") == null || "".equalsIgnoreCase(up.get("isrevokepostdoc"))) ? 0 : Integer.valueOf(up.get("isrevokepostdoc"))) == 1 ? 131072 : 0; int p19 = ((up.get("is38formtype") == null || "".equalsIgnoreCase(up.get("is38formtype"))) ? 0 : Integer.valueOf(up.get("is38formtype"))) == 1 ? 262144 : 0; int optype = p1 + p2 + p3 + p4 + p5 + p7 + p8 + p9 + p10 + p11 + p12 + p13 + p14 + p15 + p16 + p17 + p18+p19; //新增和修改的都需要组装出来,通过判断再执行那条 String usercode = up.get("usercode"); String formid = up.get("formid"); int isopen = (up.get("isopen") == null || "".equals(up.get("isopen"))) ? 0 : Integer.valueOf(up.get("isopen")); if (treetype == 1) {//写入到用户 if (optype > 0 || isopen == 1)//修改 sb.append(" \n if not exists(select usercode from _sys_UserPermissions where usercode='" + usercode + "' and formid=" + formid) .append(") \n begin \n")//新增 .append("insert into _sys_UserPermissions(UserCode,UserName,FormID,FormName,optype,statisids)values('") .append(usercode).append("','") .append(up.get("username").trim()).append("','") .append(up.get("formid")).append("','") .append(up.get("formname")).append("',") .append(optype).append(",'"+up.get("statisids")+"') ") .append("end \n else begin \n") .append(" update _sys_UserPermissions set optype=") .append(optype) .append(" ,statisids='"+up.get("statisids")+"' where usercode='" + usercode + "' and formid=" + formid).append(" end "); else//删除 sb.append(" \n delete _sys_UserPermissions ") .append(" where usercode='" + usercode + "' and formid=" + formid); } else {//角 色写入菜单权限 if (optype > 0 || isopen == 1)//修改 sb.append(" \n if not exists(select ProfileID from gProfileFormOP where ProfileID='" + usercode + "' and formid=" + formid) .append(") begin \n")//新增 .append("insert into gProfileFormOP(ProfileID,FormID,FormName,FormOP,optype,statisids)values('") .append(usercode).append("','") .append(up.get("formid")).append("','") .append(up.get("formname")).append("','',") .append(optype).append(",'"+up.get("statisids")+"') ") .append("\n end else begin \n") .append(" update gProfileFormOP set optype=") .append(optype) .append(" ,statisids='"+up.get("statisids")+"' where ProfileID='" + usercode + "' and formid=" + formid).append(" end "); else sb.append(" \n delete gProfileFormOP ") .append(" where ProfileID='" + usercode + "' and formid=" + formid); } } else {//=2的情况,直接写到gUserProfile 角色表 //isrol=1,新增记录 //isrol=0 ,删除记录 int isrol = ("1".equalsIgnoreCase(up.get("isrol"))) ? 1 : 0; if (isrol == 1 && !"".equalsIgnoreCase(up.get("profilename"))) { sb.append(" \n if not exists(select ProfileID from gUserProfile where UserCode='" + up.get("usercode") + "' and ProfileID='" + up.get("profileid") + "'"); sb.append(") begin \n")//新增 .append("insert into gUserProfile(ProfileID,usercode,username,ProfileName)values('") .append(up.get("profileid")).append("','") .append(up.get("usercode")).append("','") .append(up.get("username")).append("','") .append(up.get("profilename")).append("') ") .append("end \n"); } else {//删除 if (!"".equalsIgnoreCase(up.get("profilename"))) sb.append(" \n delete gUserProfile where UserCode='" + up.get("usercode") + "' and ProfileID='" + up.get("profileid") + "'"); } } this.updatesql.add(sb.toString()); } if (update1.size() == 0) {//没数据,表示需要把之前的保存时执行过程清空,针对9646才需要这样 this.DProc = ""; this.DProcPram = ""; } } if (update != null && update.size() > 0) {//保存时触发每一行 for (String str : update) { for (HashMap map : update1) this.getProcValues(map, str); } } else { if (update1 != null && update1.size() > 0) this.getProcValues(update1.get(0), ""); else this.isSave = false; } update = null; vss = null; m = null; } private String procc(Object obj) {//转义'号 return String.valueOf(obj).replaceAll("'", "''").replaceAll(">", ">").replaceAll("<", "<").replaceAll("&", "&"); } /*** * * @param temp * @param json * @param name * @param fl * @param g * 处理9654的sql转换,需要判断新增和修改的情况 * */ private void convert2SQL_pem9654(List temp, GTJson json, String name, int fl, com.yc.utils.Grid g) { List> update1 = null; List> vss = null; SqlRowSetMetaData m = null; vss = json.getUpdatedRecords(); update1 = json.getVssRecords(); m = md2; if (update1 != null) { for (int i = 0; i < update1.size(); i++) {//从全匹配里面组装 StringBuilder sb = new StringBuilder(); HashMap up = update1.get(i); HashMap v = vss.get(i);//取出修改过的值,填充回去,再组装 for (Map.Entry en : v.entrySet()) { up.put(en.getKey(), en.getValue()); } /* * LeftTreeType int default 1 , ----1.点击了左侧树“用户”选项,2.点击了左侧树“数据组”, TreeType int default 1, -- 用来判断当前节点:1:“菜单” , 2:“数据组” 保存时: 如果 LeftTreeType = 1 and TreeType = 1, 则将字段 UserCode,UserName,FormID,FormName,HeadFlag,FieldID,FieldName,RowConFlag, owValues,RowValues2,RowValueExpression,ColValue,InActived,ItemMemo 写入表 _sys_UserPermissionsColumn 中 如果 LeftTreeType = 1 and TreeType = 2, 则将字段值 AccessID ,AccessName ,UserCode,UserName,1 插入 _sysdataaccess_user 表对应字段 AccessID ,AccessName ,UserCode,UserName,actived 如果 LeftTreeType = 2 and TreeType = 1, 则将字段 UserCode,UserName,FormID,FormName,HeadFlag,FieldID,FieldName,RowConFlag, RowValues,RowValues2,RowValueExpression,ColValue,InActived,ItemMemo, AccessID ,AccessName 写入表 _sys_UserPermissionsColumn 中 * */ if(org.apache.commons.lang3.StringUtils.isBlank(up.get("fieldid"))||org.apache.commons.lang3.StringUtils.isBlank(up.get("headflag"))){ //kaisheng.onbus.cn 系统,前端9654的数据组,选某个且是第一次提交存在传多一条这二个字段没值的空白数据,造成提交不了,所以这里判断下,是这种情况,则跳过这条数据 by danaus 2021/10/28 11:20 continue; } String usercode = up.get("usercode"); String formid = up.get("formid"); int isopen = (up.get("rowconflag") == null || " ".equalsIgnoreCase(up.get("rowconflag"))) ? 0 : 1; String where = "usercode='" + procc(usercode) + "' and formid=" + formid + " and FieldID='" + procc(up.get("fieldid")) + "' and HeadFlag='" + up.get("headflag") + "'"; int treetype = Integer.parseInt(up.get("treetype")); int lefttreetype = Integer.parseInt(up.get("lefttreetype")); if (lefttreetype == 1) { //用户 if (treetype == 1) { if (isopen == 1)//修改 sb.append(" if not exists(select usercode from _sys_UserPermissionsColumn where " + where) .append(") begin ")//新增 .append("insert into _sys_UserPermissionsColumn(UserCode,username,FormID,formname,HeadFlag,FieldID,fieldname,RowConFlag,RowValues,RowValues2,RowValueExpression,ColValue,InActived,jionflag,jionFlagGroup,ColValueExpression)values('") .append(procc(usercode)).append("','") .append(procc(up.get("username"))).append("','") .append(up.get("formid")).append("','") .append(procc(up.get("formname"))).append("','") .append(up.get("headflag")).append("','") .append(procc(up.get("fieldid"))).append("','") .append(procc(up.get("fieldname"))).append("','") .append(up.get("rowconflag")).append("','") .append(procc(up.get("rowvalues"))).append("','") .append(procc(up.get("rowvalues2"))).append("',") .append("null").append(",")//TODO RowValueExpression 留空 .append("".equals(up.get("colvalue")) ? null : up.get("colvalue")).append(",'") .append(up.get("inactived")).append("',") .append("".equals(up.get("jionflag")) ? null : "'" + up.get("jionflag") + "'").append(",") .append("".equals(up.get("jionflaggroup")) ? null : up.get("jionflaggroup")).append(",") .append("".equals(up.get("colvalueexpression")) ? null : "'" + up.get("colvalueexpression").replaceAll("'", "''") + "'").append("") .append(") ") .append("end else begin") .append(" update _sys_UserPermissionsColumn set rowconflag='") .append(up.get("rowconflag")) .append("',username='") .append(procc(up.get("username"))) .append("',rowvalues='") .append(procc(up.get("rowvalues"))) .append("',rowvalues2='") .append(procc(up.get("rowvalues2"))) .append("',colvalue=") .append("".equals(up.get("colvalue")) ? null : up.get("colvalue")) .append(",inactived='") .append(up.get("inactived")) .append("',jionflag=") .append("".equals(up.get("jionflag")) ? null : "'" + up.get("jionflag") + "'") .append(",jionflaggroup=") .append("".equals(up.get("jionflaggroup")) ? null : "'" + up.get("jionflaggroup") + "'") .append(",colvalueexpression=") .append("".equals(up.get("colvalueexpression")) ? null : "'" + up.get("colvalueexpression").replaceAll("'", "''") + "'") .append(" where " + where).append(" end "); else//删除 sb.append(" delete _sys_UserPermissionsColumn ") .append(" where " + where); } else {//用户的数据组权限设置 int isopen2 = (up.get("haspermission") == null || "".equalsIgnoreCase(up.get("haspermission"))) ? 0 : (Integer.parseInt(up.get("haspermission"))); if (isopen2 == 1)// sb.append(" if not exists(select AccessID from _sysdataaccess_user where usercode='" + usercode + "' and AccessID='" + up.get("accessid") + "'") .append(") begin ")//新增 .append("insert into _sysdataaccess_user(AccessID ,AccessName ,UserCode,UserName,actived)values('") .append(procc(up.get("accessid"))).append("','") .append(procc(up.get("accessname"))).append("','") .append(procc(up.get("usercode"))).append("','") .append(procc(up.get("username"))) .append("',") .append("1) ") .append("end "); else sb.append(" delete _sysdataaccess_user ") .append(" where AccessID='" + procc(up.get("accessid")) + "' and usercode='" + procc(up.get("usercode")) + "'"); } } else { if (treetype == 1) { if (isopen == 1)//修改 sb.append(" if not exists(select usercode from _sys_UserPermissionsColumn where " + where) .append(") begin ")//新增 .append("insert into _sys_UserPermissionsColumn(UserCode,username,FormID,HeadFlag,FieldID,fieldname,RowConFlag,RowValues,RowValues2,RowValueExpression,ColValue,InActived,AccessID,AccessName,jionflag,jionFlagGroup,ColValueExpression)values('") .append(procc(usercode)).append("','") .append(procc(up.get("username"))).append("','") .append(up.get("formid")).append("','") .append(up.get("headflag")).append("','") .append(procc(up.get("fieldid"))).append("','") .append(procc(up.get("fieldname"))).append("','") .append(procc(up.get("rowconflag"))).append("','") .append(procc(up.get("rowvalues"))).append("','") .append(procc(up.get("rowvalues2"))).append("',") .append("null").append(",")//TODO RowValueExpression 留空 .append("".equals(up.get("colvalue")) ? null : up.get("colvalue")).append(",'") .append(up.get("inactived")).append("','") .append(procc(up.get("accessid"))).append("','") .append(procc(up.get("accessname"))).append("',") .append("".equals(up.get("jionflag")) ? null : "'" + up.get("jionflag") + "'").append(",") .append("".equals(up.get("jionflaggroup")) ? null : up.get("jionflaggroup")).append(",") .append("".equals(up.get("colvalueexpression")) ? null : "'" + up.get("colvalueexpression").replaceAll("'", "''") + "'").append("") .append(") ") .append("end else begin") .append(" update _sys_UserPermissionsColumn set rowconflag='") .append(procc(up.get("rowconflag"))) .append("',username='") .append(procc(up.get("username"))) .append("',rowvalues='") .append(procc(up.get("rowvalues"))) .append("',rowvalues2='") .append(procc(up.get("rowvalues2"))) .append("',colvalue=") .append("".equals(up.get("colvalue")) ? null : up.get("colvalue")) .append(",inactived='") .append(up.get("inactived")) .append("',accessid='") .append(procc(up.get("accessid"))) .append("',accessname='") .append(procc(up.get("accessname"))) .append("',jionflag=") .append("".equals(up.get("jionflag")) ? null : "'" + up.get("jionflag") + "'") .append(",jionflaggroup=") .append("".equals(up.get("jionflaggroup")) ? null : "'" + up.get("jionflaggroup") + "'") .append(",colvalueexpression=") .append("".equals(up.get("colvalueexpression")) ? null : "'" + up.get("colvalueexpression").replaceAll("'", "''") + "'") .append(" where " + where).append(" end "); else//删除 sb.append(" delete _sys_UserPermissionsColumn ") .append(" where " + where); } } this.updatesql.add(sb.toString()); } if (update1.size() == 0) {//没数据,表示需要把之前的保存时执行过程清空,针对9646才需要这样 this.DProc = ""; this.DProcPram = ""; } } if (update != null && update.size() > 0) {//保存时触发每一行 for (String str : update) { for (HashMap map : update1) this.getProcValues(map, str); } } else { if (update1 != null && update1.size() > 0) this.getProcValues(update1.get(0), ""); else this.isSave = false; } update = null; vss = null; m = null; } /** * 检查不需要更新的字段 */ private boolean checkEnableColumns(String str, Object k, boolean flag) { String[] temp = str.split(","); for (String st : temp) { if (st.equalsIgnoreCase((String) k)) { flag = false; break; } } return flag; } /** * 把客户端面板内容json提交转换为update数据库格式 * * @param isPramyPan TODO */ private void convertPanelSQL(Map tableMetaDatas, List> update1, String tableName, String isPramyPan, String dbid) { if (update1 != null&&update1.size()>0) { List primaryKey = null; //496子面板在新单但又在这里执行时跳过主键检查 try { SpObserver.setDBtoInstance("_" + dbid); //by danaus 2020/11/26 16:47 primaryKey = gridService.getPrimaryKey(tableName); } catch (SQLException e) { throw new ApplicationException(this.getErrorMsg(e)); }finally { SpObserver.setDBtoInstance(); } //取得主键,判断主键没值时触发异常 if (primaryKey == null || primaryKey.size() ==0) { throw new ApplicationException(tableName + "没有定义主键,不能执行更新(update)操作"); } primaryKey.forEach(key->{ final Object object = ((Map) update1.get(0)).get(key.toLowerCase()); if(object==null){ throw new ApplicationException(tableName + "主键字段"+key+"没有传值,不能执行更新(update)操作,解决方法:请在9802勾选上此字段的感应属性"); } }); for (int i = 0; i < update1.size(); i++) { StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); int contNum = 0; key.append(" set "); value.append(" where 1=1"); HashMap up = update1.get(i); if (this.isTaobao) {// 去掉特定ERP的字段内容 up.remove("doccode"); up.remove("enterdate"); up.remove("entername"); up.remove("entercode"); up.remove("periodid"); up.remove("docdate"); up.remove("companyid"); up.remove("docstatus"); up.remove("formid"); } for (Object k : up.keySet()) { if (!this.isTaobao) { if (((String) k).equalsIgnoreCase("entercode") || // 这些字段值不需要更新 ((String) k).equalsIgnoreCase("entername") || ((String) k).equalsIgnoreCase("enterdate") || ((String) k).equalsIgnoreCase("modifydate") || ((String) k).equalsIgnoreCase("modifyname") || ((String) k).equalsIgnoreCase("curchecker") || ((String) k).equalsIgnoreCase("curchecked") || ((String) k).equalsIgnoreCase("docversion")) continue; //取得主键,判断主键没值时触发异常 if (this.winType == 10) { if (primaryKey != null && primaryKey.size() > 0) { for (String ks : primaryKey) { if (ks.toLowerCase().equalsIgnoreCase(k + "")) { //10类型时把主键附加到where后面作为update的条件 value.append(" and " + ks + "='" + up.get(k) + "' "); break; } } } } if (this.wherepan.length() != 0) { if (contNum == 0) { if (this.wherepan.indexOf("doccode") != -1) { value.append(" and " + this.wherepan); } else { value.append(" and doccode='" + this.wherepan + "'"); } contNum++; } } else { if (((String) k).equalsIgnoreCase("doccode") && checkDocType()) { isDoccode = true; if (!up.get(k).equals("@newDoccode") && this.doccode.length() != 0) { value.append(" and doccode='" + up.get(k) + "'"); } else { value.append(" and doccode=@newDoccode" + this.cont);// + // up.get(k)); } continue; } if (!this.doc496.equals("")) { value.append(" and " + this.doc496); this.doc496 = ""; } } if (((String) k).equalsIgnoreCase("formid") && this.winType != 497) {// 496窗体进行保存时出现if // exist(...)语句错误问题,formid后台没有。--10类型 value.append(" and formid='" + up.get(k) + "'"); continue; } if ("docstatus".equalsIgnoreCase((String) k)) { if (up.get(k) != null && !up.get(k).equals("") && !up.get(k).equals("0")) {// 对docstatus如果是空值的情况处理。2014-7-15 // 16:31:53 // 出错的例子: // 帮助文档保存出错 value.append(" and docstatus=" + up.get(k));// 添加&& // !up.get(k).equals("0")是为了区分不是新单 // 解决页面的docstatus的值是""但传过来的是0的问题 // 2016-3-31 // 11:51:05--xin } continue;// 排除docstatus } /* * if ("modifydate".equalsIgnoreCase((String) k)) { * up.put((String) k, "getdate()"); } if * ("modifyname".equalsIgnoreCase((String) k)) { * up.put((String) k, env.get("@hrname")); } */ if ("periodid".equalsIgnoreCase((String) k)&& org.apache.commons.lang3.StringUtils.isBlank(up.get((String) k))) { up.put((String) k,"dbo.getPeriodid("+up.get("formid")+","+GridUtils.prossSqlParm( up.get("companyid"))+","+GridUtils.prossSqlParm( up.get("docdate"))+")"); // try { // SpObserver.setDBtoInstance("_" + dbid); // up.put((String) k, gridService.getPeriodID(Integer.parseInt(up.get("formid")), // up.get("companyid"), up.get("docdate"))); // } finally { // SpObserver.setDBtoInstance(); // } } } else {// 淘宝接口where条件 value.append(" and "); value.append("[").append(this.TbkeyID.split(",")[0]); value.append("]="); parserType(up, value, this.TbkeyID.split(",")[0], tableMetaDatas); } boolean isPass = true; isPass = tableMetaDatas.containsKey(k + "");// 去除计算列 isPass = checkExpressionColumn(up, k, isPass);// 更新时有权限控制的字段不需要更新 if (isPass) { key.append("[").append(k); key.append("]="); parserType(up, key, k, tableMetaDatas); key.append(","); } } if (this.winType == 9 || this.winType == 15 || this.winType == 17 || ((this.winType == 497 || this.winType == 499) && "1".equalsIgnoreCase(isPramyPan))) {// by // danaus // 单据类型需要提交修改赶时间,修改人 // 且多表时是主面板才需要 key.append("[").append("modifydate"); key.append("]=").append("getdate() , "); key.append("[").append("modifyname"); key.append("]='").append(local.get().get("@hrname")).append("',"); } String updateSql = " update " + tableName + key.substring(0, key.length() - 1) + value.toString(); //通过版本号判断数据是否已更新,版本号不一致则显示提示信息,刷新页面再提交 by danaus 2022/3/11 11:11 if (up.containsKey("docversion")) { updateSql += " and isnull(docversion,0)=isnull(" + (("null".equals(up.get("docversion")) || org.apache.commons.lang3.StringUtils.isBlank(up.get("docversion"))) ? "0" : up.get("docversion")) + ",0) \n" + " if @@rowcount=0 \n " + " begin \n" + " raiserror('当前单据内容已发生变化,请刷新页面然后重试此操作',16,1) \n" + " return \n" + " end \n"; } if (!this.type496.equals("update")) { if (isPramyPan != null && "1".equalsIgnoreCase(isPramyPan)) { this.updatesql.add(0, updateSql); }else { this.updatesql.add(updateSql); } } else {// 496类型的update调用 //---增加处理value的值没有where条件,只是value=where 1=1的情况,会导致更新所有数据,如果出现这种情况,需要抛出错误 if(value.toString().trim().equals("where 1=1")){ throw new ApplicationException(tableName + "没有定义主键,不能执行更新(update)操作"); } this.wherepan496 = "if exists(select top 1 1 from " + tableName + value.toString() + ")\n begin\n"; this.wherepan496 += updateSql; this.wherepan496 += " end \n"; this.wherepan496 += " else \n"; } } } if (update_p != null && update_p.size() > 0) { for (String str : update_p) { for (HashMap map : update1) this.getProcValues(map, str); } } else { if (update1 != null && update1.size() > 0) this.getProcValues(update1.get(0), ""); } } /** * 检查权限字段,0,1只读,2可根据状态编辑 */ private boolean checkExpressionColumn(HashMap up, Object k, boolean flag) { if (((String) k).endsWith("_expr")) flag = false;// 不是权限字段,不是以_exp结尾且当前集合也没有k_expr的值。 所以不是权限的字段 else {//有权限更新,新增 if (up.get(k + "_expr") != null) { if ("0".equalsIgnoreCase(up.get(k + "_expr")) || "1".equalsIgnoreCase(up.get(k + "_expr"))) { flag = false; } else { flag = true; } } } return flag; } private boolean checkExpressionColumnForAdd(HashMap up, Object k, boolean flag) { if (((String) k).indexOf("_expr") > -1) flag = false;// 不是权限字段 else {// 正常字段但需要判断当前用户是否有权限更新,新增 if (up.get(k + "_expr") != null) { if (up.get(k) != null && "******".equals(up.get(k))) flag = false; else flag = true; } } return flag; } /** * 31类型控件ajax取数据 */ @RequestMapping(params = "m=dy") public void getDySqlData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } ThreeJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); int formID = json.getFormID(); String sql = json.getValue(); //判断是否存在危险的sql,只执行select类型 if (checkSql(resp, sql)) return; SqlRowSet set = null; try { try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); set = gridService.getJdbcTemplate().queryForRowSet(sql.replaceAll("<", "<").replaceAll(">", ">").replaceAll("/\\\\t"," "));// /\t 处理有\t的情况 } finally { SpObserver.setDBtoInstance(); } // 以key,value组装返回,格式为:key|key|;value|value if (request.getHeader("x-app-type") != null) {//返回给APP List> list = new ArrayList>(); Gson gs = new GsonBuilder().disableHtmlEscaping().create(); if (!set.wasNull()) { Map map = new HashMap(); // if(json.getType()==0){ // map.put("fieldid", ""); // map.put("fieldname", ""); // list.add(map); // } while (set.next()) { map = new HashMap(); // Map map=new HashMap(); map.put("fieldid", set.getString(1)); try {//有可能 存在sql只取一个字段的情况,需要在这里加一个异常捕捉 map.put("fieldname", set.getString(2)); } catch (Exception e) { // map.put("fieldname", set.getString(1)); } list.add(map); } } set = null; if (formID != 0) {//TODO 增加处理31类型 } if ("ionic".equalsIgnoreCase(request.getHeader("x-app-type"))) { if (json.getParm() != null && !"".equals(json.getParm())) {//不为空表示需要返回前端指定的字段 Map map = new HashMap(); map.put("key", json.getParm());//返回前端指定的字段,由前端传过来 map.put("data", list); this.printJson(resp, gs.toJson(map)); } else this.printJson(resp, gs.toJson(list)); } else { this.printJson(resp, gs.toJson(list)); } } else { StringBuilder keys = new StringBuilder(); StringBuilder values = new StringBuilder(); if (json.getType() == 0) {//这二种情况不需要有空列,只有是下拉列表才需要 keys.append("| "); values.append("| "); } if (!set.wasNull()) { while (set.next()) { keys.append("|").append(this.replaceBlank(set.getString(1))); values.append("|").append(this.replaceBlank(set.getString(2))); } set = null; } String key = ""; String value = ""; if (formID == 0) { key = keys.toString() + "|'"; value = values.toString(); } else { key = keys.toString() + "|-add-'"; value = values.toString() + "|<<新增>>"; } this.printJson(resp, key + value); } } catch (DataAccessException e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { gson = null; set = null; json = null; } } /** * 3类型控件自动补全取数据 */ @RequestMapping(params = "m=suggest") public void getAutoSuggest(HttpServletRequest request, HttpServletResponse resp) { try { if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } Gson gson = new GsonBuilder().serializeNulls().create(); ThreeJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); String value = json.getValue();// 当前录入的字段及值以逗号分开,需要处理匹配问题,如 : d61568% String[] str = json.getParm().replaceAll(" ", " ").replaceAll("&", "").replaceAll("nbsp;", " ").replaceAll("%20", " ").split(";"); String fileds = json.getParm().replaceAll(" ", " ").replaceAll("&", "").replaceAll("nbsp;", " ").replaceAll("%20", " ").replaceAll(";", ",").replaceAll("\\b_ycid_\\b", "id"); //APP的分页处理 int pageNumber = 1; int page = 1;//页码从1开始 int limit = 20; pageNumber = request.getParameter("pageNumber") == null ? 1 : Integer.parseInt(request.getParameter("pageNumber"));//页码 page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page"));//页码 limit = request.getParameter("limit") == null ? 20 : Integer.parseInt(request.getParameter("limit"));//每页大小 List> set = null; String temp = json.getExp(); if (StringUtils.isNotBlank(temp)) { if (YCBase64.isBase64(temp.getBytes())) { try { temp = new String(YCBase64.decode(temp.getBytes())); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }//base64解密 } } if (request.getHeader("x-app-type") != null){ //app调用时page取pageNumber page=pageNumber; } String jwhere = json.getWhere().replaceAll(">", ">").replaceAll("<", "<").replaceAll(" ", " ").replaceAll("&", "").replaceAll("nbsp;", " ").replaceAll("\\b_ycid_\\b", "id").replaceAll("@P@", ""); //----由于新增全码扫描功能,这里传过来的只是二维码id,而这里要查的是物料编号matcode, // 所以为了统一,需要读取t112002表返回实际对应的matcode if (request.getHeader("x-app-type") != null && org.apache.commons.lang3.StringUtils.isNotBlank(value) && json.getQrCode() == 1 ) { try { //APP才需要这样处理 QrServiceIfc qrServiceIfc = (QrServiceIfc) FactoryBean.getBean("qrService"); final T112002 t112002 = qrServiceIfc.getT112002(value); if (t112002 == null) { this.printJson(resp, "error;在112002查找不到【" + value + "】对应的物料编码"); return; } //替换参数,把传过来的二维码id替换成查出来的matcode jwhere = jwhere.replaceAll(value, t112002.getMatCode()); } catch (EmptyResultDataAccessException ex) { this.printJson(resp, "error;在112002查找不到【" + value + "】对应的物料编码"); return; } catch (Exception e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); return; } } try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); //读取功能号信息,取表单过滤dataformidFilter和dataformid String where = getDataGroupByWhere(request, json); set = gridService.getDataByAjaxBy42( gridService.getTableName(json.getFormID(), json.getType() + "|" + 0), this.exprTOSql(temp, fileds, request.getSession()), where,limit ,page,value );// by danaus 15-7-21 去掉%20,是因为传过来的值有可能是20开头的情况,17-3-14 加回%20的处理 } finally { SpObserver.setDBtoInstance(); } Map m = new HashMap(); if (request.getHeader("x-app-type") == null) {//APP不需要增加这个标记 m.put("data", set); m.put("count", (set!=null&&set.size()>0)?set.get(0).get("TotalRowCount"):0); this.printJson(resp, gson.toJson(m)); }else{ this.printJson(resp, gson.toJson(set)); } } catch (DataAccessException e) { if (request.getHeader("x-app-type") == null) { this.printJson(resp, "{\"msg\":\""+this.getErrorMsg(e).replaceAll("\"","\\\\\"")+"\"}"); }else { this.printJson(resp, "error;" + this.getErrorMsg(e)); } } } /** * 3类型控件ajax取数据 */ @RequestMapping(params = "m=get") public void getData(HttpServletRequest request, HttpServletResponse resp) { List> set = null; String[] str = null; try { if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } Gson gson = new Gson(); ThreeJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); String value = json.getValue();// 当前录入的字段及值以逗号分开,需要处理匹配问题,如 : d61568% str = json.getParm().replaceAll(" ", " ").replaceAll("&", "").replaceAll("nbsp;", " ").replaceAll("%20", " ").split(";"); try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); //读取功能号信息,取表单过滤dataformidFilter和dataformid String where = getDataGroupByWhere(request, json); set = gridService.getDataByAjax(gridService.getTableName(json.getFormID(), json.getType() + "|" + 0), json.getParm().replaceAll(" ", " ").replaceAll("&", "").replaceAll("nbsp;", " ") .replaceAll("%20", " ").replaceAll(";", ",").replaceAll("\\b_ycid_\\b", "id"), where); } catch (DataAccessException e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } StringBuilder sb = new StringBuilder(); if (set.size() == 1) { Map map = set.get(0); for (int i = 0; i < str.length; i++) { if (i != 0) sb.append("@p@"); if ("_ycid_".equalsIgnoreCase(str[i])) sb.append(map.get("id")); else sb.append("".equalsIgnoreCase(map.get(str[i]) + "") ? null : map.get(str[i]) + ""); } if (request.getHeader("x-app-type") != null) { LinkedHashMap ma = new LinkedHashMap(); if (set.size() == 1) { Map ma1 = set.get(0); for (int i = 0; i < str.length; i++) { if ("_ycid_".equalsIgnoreCase(str[i])) ma.put(str[i], ma1.get("id")); else ma.put(str[i], ma1.get(str[i])); } } this.printJson(resp, GridUtils.toJson(ma)); } else this.printJson(resp, sb.toString()); map = null; } else if (set.size() > 1) {// 大于1,表示有多条记录,需要通过弹出页面进行选择 String[] vs = value.split(";"); if (vs[1].indexOf("@~") < 0) {// 不存在%匹配问题才需要进行查找 int num = 0; for (Map map : set) { if (num > 1) { // 表示有二条符合条件时候 也需要弹出页面选择 break; } Object temp = map.get(vs[0]); if (vs[1].equalsIgnoreCase(temp != null ? temp.toString() : null)) {// 是否有全匹配,则直接返回值,不需要弹出页面 for (int i = 0; i < str.length; i++) { if (i != 0) sb.append("@p@"); if ("_ycid_".equalsIgnoreCase(str[i])) sb.append(map.get("id")); else sb.append(map.get(str[i])); } num++; } } if (num == 1) this.printJson(resp, sb.toString()); else this.printJson(resp, "#"); } this.printJson(resp, "#"); vs = null; } else this.printJson(resp, "error;查找不到相关信息"); } catch (Exception e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } } @NotNull private String getDataGroupByWhere(HttpServletRequest request, ThreeJSON json) { Map map = gridService.getSimpleJdbcTemplate().queryForMap(" select formdatafilters,dataformid from gform where formid=?", json.getFormID()); String filter = GridUtils.prossRowSetDataType_String(map, "formdatafilters"); filter = this.prossFormdatafilters(filter, request); if (filter == null) { filter = ""; } String dataformid = GridUtils.prossRowSetDataType_String(map, "dataformid"); if (StringUtils.isNotBlank(dataformid) && !"0".equals(dataformid)) { dataformid = " or formid in(" + dataformid + ")"; } else { dataformid = ""; } //增加数据组权限 String dataGroup = this.prossDataGroup(request, json.getFormID(), 0); String jwhere = json.getWhere().replaceAll(">", ">").replaceAll("<", "<").replaceAll(" ", " ") .replaceAll("&", "").replaceAll("nbsp;", " ").replaceAll("\\b_ycid_\\b", "id").replaceAll("@P@", ""); String where = jwhere + (filter.length() == 0 ? "" : (jwhere.length() > 0 ? " and (" + filter + ")" : "(" + filter + ")")) + dataformid + dataGroup; return where; } /** * 组装3类型控件ajax取数据时参数,把自身参数换成对应的外表参数 */ private String companAJAX(String where) { if ("".equalsIgnoreCase(where)) return ""; else return where.indexOf("and\b") > -1 ? where : " and " + where; } /** * 取rowID数据 */ @RequestMapping(params = "m=rowid") public void getRowIDData(HttpServletRequest request, HttpServletResponse resp) { try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); this.printJson(resp, gridService.getRowID());// 第三步,通过Response向页面转换为json格式输出Page类数据 } finally { SpObserver.setDBtoInstance(); } } /** * 通过执行存储过程取自定义标题 */ @RequestMapping(params = "m=heand") public void getHeandData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); FormulaJSON json = null; String data = ""; int type = 0; String format=""; if (request.getParameter("controltype") != null) { type = Integer.parseInt(request.getParameter("controltype")); } if(!StringUtils.isBlank(request.getParameter("format"))){////数字各式 xin 2022-4-22 09:06:22 format=request.getParameter("format"); } try { if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); String st = ""; try { String s = json.getParm().replaceAll("%2B", "+").replaceAll("%2F", "/").replaceAll("%3D", "="); if (org.apache.commons.codec.binary.Base64.isBase64(s)) { st = EncodeUtil.base64Decode(s).replaceAll("%2B", "+").replaceAll("%2F", "/").replaceAll("%3D", "="); } else { if (request.getHeader("x-app-type") != null && "ionic".equals(request.getHeader("x-app-type"))) st = s; else st = java.net.URLDecoder.decode(s, "utf-8"); } SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); SqlRowSet list = this.gridService.getJdbcTemplate().queryForRowSet(st); if (list != null) { if (type == 43) {//43控件初始值处理 JsonArray dArray = new JsonArray(); while (list.next()) { dArray.add(list.getString(1)); } data = dArray.toString(); } else { list.first(); if (list.getRow() == 0) { // throw new ApplicationException("结果集为空,请确定sql是否正确【"+st+"】"); data = ""; } else { data = list.getString(1); } } if (data == null || "null".equalsIgnoreCase(data)) data = ""; if(!StringUtils.isBlank(data) && !StringUtils.isBlank(format)){//数字各式 xin 2022-4-22 09:06:22 data=DBHelper.getToFormat(data,format,type); } } } catch (UnsupportedEncodingException e1) { this.printJson(resp, "error;" + this.getErrorMsg(e1)); // TODO Auto-generated catch block e1.printStackTrace(); } if (request.getHeader("x-app-type") != null) {//返回给APP Map map = new HashMap(); map.put("data", data); map.put("id", json.getFields()); this.printJson(resp, GridUtils.toJson(map)); } else { if (isContainChinese(data)) {//判断是否是中文 this.print(resp, data);// 第三步,通过Response向页面转换为text格式输出Page类数据 } else { this.printJson(resp, data);// 第三步,通过Response向页面转换为son格式输出Page类数据 } } } catch (Exception e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { gson = null; json = null; SpObserver.setDBtoInstance(); } } /** * 判断是否是中文 * * @param str * @return */ public static boolean isContainChinese(String str) { if (str == null || "".equalsIgnoreCase(str)) return false; Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); Matcher m = p.matcher(str); if (m.find()) { return true; } return false; } /** * 自动编号 autoCode ajax取数据 */ @RequestMapping(params = "m=auto") public void getAutoCodeData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); FormulaJSON json = null; String[] code = null; String data = ""; try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); code = json.getAutoCode().split(","); if (code.length < 5) throw new ApplicationException("[" + json.getAutoCode() + "]9824中自动编号设置少了参数,请重新设置"); if (json.getFlag() == 1) { data = gridService.getAutoCode(Integer.parseInt(code[0]), Integer.parseInt(code[1]), code[2], Integer.parseInt(code[3]), code[4]);// 第二步,调用相对应业务类取得数据 } else data = gridService.getAutoCode2(code[0], Integer.parseInt(code[1]), code[2], code[3], code[4]);// 第二步,调用相对应业务类取得数据 this.printJson(resp, data);// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { gson = null; json = null; code = null; SpObserver.setDBtoInstance(); } } @RequestMapping(params = "m=initExpr") public void getExprData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); FormulaJSON json = null; try { if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); env = this.initEnv(request, 0, "", false); local.set(env); String sql = this.getExprTOSql(json.getParm()); if (checkSql(resp, sql)) return; SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); Map map = this.gridService.getSimpleJdbcTemplate().queryForMap(sql); Gson gsons = new GsonBuilder().setDateFormat( "yyyy-MM-dd").disableHtmlEscaping().create(); this.print(resp, gsons.toJson(map)); } catch (DataAccessException e) { this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { gson = null; json = null; local.remove(); SpObserver.setDBtoInstance(); } } public boolean checkSql(HttpServletResponse resp, String sql) { //判断是否存在危险的sql,只执行select类型 if (sql.toLowerCase().indexOf("update ") >= 0 || sql.toLowerCase().indexOf("insert ") >= 0 || sql.toLowerCase().indexOf("delete ") >= 0) { this.printJson(resp, "error;只能执行查询类型sql语句【" + sql + "】"); return true; } return false; } /** * 自定义公式 ajax取数据 */ @RequestMapping(params = "m=formula") public void getFormulaData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } FormulaJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); Page page = new Page(); try { page.setTableName(json.getFunName()); if (request.getHeader("x-app-type") != null && !"".equalsIgnoreCase(json.getFields())) page.setSql(json.getFields().replaceAll(";", ",")); else page.setSql("*");// 取所有 page.setWhere(json.getParm()); page.setParms(json.getFields()); SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); gridService.loadAllByFunc_for(page);// 第二步,调用相对应业务类取得数据 String data = JsonUtil.list2json(page.getData()); if (request.getHeader("x-app-type") != null) { Gson gsons = new GsonBuilder().setDateFormat( "yyyy-MM-dd").disableHtmlEscaping().create(); this.print(resp, gsons.toJson(page.getData())); } else this.printJson(resp, data);// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { if (request.getHeader("x-app-type") != null && "ionic".equals(request.getHeader("x-app-type"))) { resp.setStatus(500); this.printJson(resp, "{\"error\":\"" + this.getErrorMsg(e) + "\"}"); } else this.printJson(resp, "error;" + this.getErrorMsg(e)); } finally { gson = null; json = null; page = null; SpObserver.setDBtoInstance(); } } /** * 根据会计科目取得辅助核算信息 */ @RequestMapping(params = "m=gl") public void getGlData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); List> set = null; try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } FormulaJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); set = gridService.getGlfiledInfo(json.getParm()); int index = json.getFlag();// 取哪一行的数据 int i = 0; StringBuffer outData = new StringBuffer(); if (set.size() > 0) { for (Map map : set) { if (index != 0) { i++; if (index == (Integer) map.get("docitem")) {//表示是哪一个辅助核算项 outData.append(map.get("FT")).append(",")// 表号 .append(map.get("ftformtype")).append(",")// 类型 .append(map.get("fk")).append(",")// 外表|接收数据|外表字段 .append(map.get("seekgroupid")).append(",")// 外表|接收数据|自身字段 .append(map.get("spremissfield")).append(",")// 外表|条件|自身字段 .append(map.get("dpremissfield"));// 外表|条件|外表字段 break; } } else { outData.append("check"); } } } this.printJson(resp, outData.toString()); } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } finally { set = null; gson = null; SpObserver.setDBtoInstance(); } } /** * 保存时查询会计科目是否有设置辅助核算,有则提示输入才能保存 */ @RequestMapping(params = "m=gl_check") public void getGlDataCheck(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); List set = null; try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } FormulaJSON json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); set = gridService.getGlfiledInfoCheck(json.getParm()); int i = 0; StringBuffer outData = new StringBuffer(); outData.append(""); if (set.size() > 0) { for (Integer map : set) { outData.append(map).append(";"); } } this.printJson(resp, outData.toString()); } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } finally { set = null; gson = null; SpObserver.setDBtoInstance(); } } /** * 根据会计科目取得辅助核算信息,通过回车,tab键触发 */ @RequestMapping(params = "m=gl_tab") public void getGlTabData(HttpServletRequest request, HttpServletResponse resp) { List> set1 = null; StringBuffer outData = new StringBuffer(); Gson gson = new Gson(); FormulaJSON json = null; List> set = null; String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { try { SpObserver.setDBtoInstance("_" + dbid); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); set = gridService.getGlfiledInfo(json.getParm()); } finally { SpObserver.setDBtoInstance(); } int index = json.getFlag();// 取哪一行的数据 int i = 0; Map maps = null; if (set.size() > 0) { for (Map map : set) { i++; if (i == index) { maps = map; outData.append(map.get("FT")).append(",")// 表号 .append(map.get("ftformtype")).append(",")// 类型 .append(map.get("fk")).append(",")// 外表|接收数据|外表字段 .append(map.get("seekgroupid")).append(",")// 外表|接收数据|自身字段 .append(map.get("spremissfield")).append(",")// 外表|条件|自身字段 .append(map.get("dpremissfield"));// 外表|条件|外表字段 break; } } // -----下面是取得上面的数据进行组装查询,确实有多少条记录,有一条直接返回,多条就弹出窗口 int formID = (Integer) maps.get("FT"); String[] str = ((String) maps.get("fk")).split(";"); String where = str[Integer.parseInt(json.getFunName())] + " like '%" + json.getFields() + "%'";// try { SpObserver.setDBtoInstance("_" + dbid); set1 = gridService.getDataByAjax(gridService.getTableName(formID, (maps.get("ftformtype")) + "|" + 0), ((String) maps.get("fk")).replaceAll(";", ","), where); } finally { SpObserver.setDBtoInstance(); } if (set1.size() == 1) { Map map = set1.get(0); StringBuilder sb = new StringBuilder(); for (int j = 0; j < str.length; j++) { if (j != 0) sb.append(","); sb.append(map.get(str[j])); } this.printJson(resp, sb.toString()); } else if (set1.size() > 1) {// 大于1,表示有多条记录,需要通过弹出页面进行选择 this.printJson(resp, "#|" + outData.toString()); } else this.printJson(resp, ""); } this.printJson(resp, ""); } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } catch (NullPointerException e1) { this.printJson(resp, "error;辅助核算必要的参数未设置"); } finally { json = null; outData = null; set = null; set1 = null; } } /** * 3表结构复单时获取rowid的 ajax */ @RequestMapping(params = "m=rowids") public void getRowData(HttpServletRequest request, HttpServletResponse resp) { Gson gson = new Gson(); FormulaJSON json = null; try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); if (org.apache.commons.lang3.StringUtils.isBlank(request.getParameter("_pop_json"))) { throw new ApplicationException("提交数据不能为空"); } json = gson.fromJson(request.getParameter("_pop_json").replaceAll("\\\\", "/\\\\\\\\"), new com.google.gson.reflect.TypeToken() { }.getType()); this.printJson(resp, gridService.getByProc(json.getParm()));// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { this.printJson(resp, e.getMessage()); } finally { gson = null; json = null; SpObserver.setDBtoInstance(); } } /** * 页面第一个加载时调用,返回一个空的数据集,作用是计算当前的总页数,作为页面显示分页用 */ @RequestMapping(params = "m=fload") public void firstLoad(Grid grid, HttpServletRequest request, HttpServletResponse resp) { StringBuffer outData = new StringBuffer(); Page page = new Page(); try { page = this.setPageInfoTree(request);// 第一步,照写 this.formID = grid.getFormID(); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setPageSize(grid.getPageSize()); page.setAutopaging(grid.getAutopaging()); page = this.ParseWhere(page, grid, request, resp, type); boolean flg = false; int count = 1; String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; if ("func".equalsIgnoreCase(grid.getAction())) {// 18类型情况 if (this.isShowTree(dbid) || page.getAutopaging() == 2 || page.getWhere().endsWith("!1=2"))//!1=2表示18类型不会自动加载数据 count = 1; else { this.getFunc(grid, request, resp, page); count = page.getTotalPageNum();// 总页数 } flg = true; } if ("proc".equalsIgnoreCase(grid.getAction())) {// 19类型 TODO if (this.isShowTree(dbid) || page.getAutopaging() == 2 || page.getWhere().endsWith("!1=2"))//!1=2表示19类型不会自动加载数据 count = 1; else { this.getProc(grid, request, resp, page); count = page.getTotalPageNum();// 总页数 } flg = true; } if (flg || ("".equalsIgnoreCase(grid.getWhere()) && grid.getFlag() == 0) || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) { outData.append(""); for (int i = 0; i < count; i++) outData.append(""); outData.append(""); } else { if ("".equalsIgnoreCase(page.getWhere()) && page.getFlag() == 1) page.setWhere(" 1=1"); if (page.getFlag() == -2 || ("".equalsIgnoreCase(page.getWhere()) && page.getFlag() == 0) || (page.isNull && page.getFlag() != 1)) page.setWhere(" 1=2"); try { SpObserver.setDBtoInstance("_" + dbid); if (page.getWhere().trim().startsWith("and")) page.setWhere("1=1 " + page.getWhere()); count = gridService.getSimpleJdbcTemplate().queryForObject("select count(1) from " + page.getTableName() + " where " + page.getWhere(), Integer.class); if (count == 0) count = 1; } catch (Exception e) { count = 1; } finally { SpObserver.setDBtoInstance(); } count = (count + page.getPageSize() - 1) / page.getPageSize();// 计算总页数 // if(this.formID==9802) count=1;//特殊处理 outData.append(""); for (int i = 0; i < count; i++) outData.append(""); outData.append(""); } this.print(resp, outData.toString()); } catch (DataAccessException e) { e.printStackTrace(); this.printJson(resp, e.getCause() == null ? e.getMessage() : e.getCause().getMessage()); } finally { outData = null; page = null; grid = null; } } /** * 加载处理用户权限 * 对应是9646及9654的权限管理 */ @RequestMapping(params = "m=load_Perm") public void loadPerm(Grid grid, HttpServletRequest request, HttpServletResponse resp) { Page page = this.setPageInfoTree(request);// 第一步,照写 this.formID = grid.getFormID(); env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setId(page.getOrderBy().split("\\s+")[0]);// 以空格分割取排序中的第一个字段作为分页的ID //这二个字段在过程不存在,需要排除 if(this.formID==9654) { page.setSql(page.getSql().replace(",[isrol],[isopen]", "")); }else{ page.setSql(page.getSql().replace(",[issave],[isaddrow],[isdelrow],[iscopyrow],[isnewdoc],[ispostdoc],[iscancelpostdoc],[isrevokepostdoc],[isprint],[isdeldoc],[iscopydoc],[isexecsp],[isopenquery],[isimport],[isexport],[isreportdesign],[islistdoc],[isrol],[username],[isopen]", "")); } page.setSql(this.exprTOSql(page, this.FieldsTOSql(grid.getField().split("\\s+")[0], page.getSql()))); page = this.ParseWhere(page, grid, request, resp, type); try { if (-1 == page.getFlag() || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) page.setPageSize(MAX_RECORD); /** * 权限加载的步骤: * 1,权限模块先从一个过程读取模块,exec pSysMenuAndPermissions @UserCode = 'system' , @RowID = '1202ZZ' *这个过程里已包括用户本身和所属角色的所有权限内容,只需要组装成treegrid所需要显示格式就可以 * gUserProfile 用户职责表 * gprofile 职责定义 */ if ("".equalsIgnoreCase(grid.getWhere())) { this.printJson(resp, ""); return; } if (this.formID == 9654) page.setTableName("pSysMenuAndPermissionsColumn"); else page.setTableName("pSysMenuAndPermissions"); page.setWhere(grid.getWhere().trim()); page.setPageSize(MAX_RECORD); String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { SpObserver.setDBtoInstance("_" + dbid); gridService.loadAllByPROC(page, local.get(),false);//1,查询出_sysMenu的所有显示模块 } catch (DataAccessException e1) { this.print(resp, this.getErrorMsg(e1)); } finally { SpObserver.setDBtoInstance(); } //2,判断当前用户是否有角色 //组装权限,并集 StringBuffer sb1 = new StringBuffer(); StringBuffer sb = new StringBuffer(); //=1调用这个 1表示是角色,只有菜单 //取得是否展开 String expanded = getExpanded(dbid); page.setExpanded(expanded); if (page.getWhere().trim().endsWith("1")) { for (int i = 0; i < page.getData().size(); i++) { Map map = (Map) page.getData().get(i); if (map.get("parentrowid") == null || "".equalsIgnoreCase((String) map.get("parentrowid"))) { String pid = (String) map.get("parentrowid");//上级节点ID int TreeType = (Integer) map.get("TreeType");//当前节点:1:“菜单” , 2:“角色” /数据组 if (this.formID == 9654) this.prossMap9654(map, sb, expanded); else this.prossMap(map, sb, expanded); if (map.get("rowid") != null) prossList(sb, page, (String) map.get("rowid"), TreeType, 0); } } //=2表示是用户,是角色+菜单 } else { for (int i = 0; i < page.getData().size(); i++) { Map map = (Map) page.getData().get(i); if (map.get("parentrowid") == null || "".equalsIgnoreCase((String) map.get("parentrowid"))) { String pid = (String) map.get("parentrowid");//上级节点ID int TreeType = (Integer) map.get("TreeType");//当前节点:1:“菜单” , 2:“角色” /数据组 prossList(sb, page, (String) map.get("rowid"), TreeType, 0); } } } sb1.append(""); sb1.append(sb.toString()); sb1.append(""); this.printJson(resp, sb1.toString());// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } finally { page = null; env = null; grid = null; local.remove(); } } private Object str = "";//保存上一次的字段值 private int span = 0; private boolean imgflg = false;//标记当前行是否为图片或文件,以便增加行高 /** * 转换成树的格式内容输出 */ private void prossTree2Execl(Page page) { if (page.getData().size() > 0) { // if (page.getIsTree() == 1) {//表示需要作为树结构显示出来 page.setData(prossListTree2Execl(page)); // } } } /** * 生成树结构的数据,主要是18类型需要用到 * 需要数据事先排好序,及指明到哪一行记录是子节点的结束,用hassubtree标记 * parentrowid,rowid,hassubtree是必需有 * hassubtree=null或=0表示没下级,需要闭合 */ private String prossTree(Page page, HttpServletRequest request) { StringBuffer sb1 = new StringBuffer(); StringBuffer sb = new StringBuffer(); sb.append(""); if (page.getData() != null && page.getData().size() > 0) { if (page.getIsTree() == 1) {//表示需要作为树结构显示出来 //取得是否展开 String expanded = getExpanded(request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""); page.setExpanded(expanded); boolean hasParentNode=false; for (int i = 0; i < page.getData().size(); i++) { Map map = (Map) page.getData().get(i); String pid = (String) map.get("parentrowid");//上级节点ID,从这里开始组装 String rowid = (String) map.get("rowid"); if (pid == null || "".equalsIgnoreCase(pid)) {//取每颗树的父节点作为第一个节点进行组装 hasParentNode=true; this.prossMapTree(page, map, sb, 0); //取属于当前节点的数据 List list = ((List>) page.getData()).stream().filter(x -> (x.get("parentrowid") != null && !"".equalsIgnoreCase((String) x.get("parentrowid"))) && rowid.equalsIgnoreCase((String) x.get("parentrowid"))).collect(Collectors.toList()); prossListTree(page, sb, list, rowid, 0); } } if(!hasParentNode){ Map map = new HashMap<>(); map.put(SessionKey.DATA_BASE_ID, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""); page.setEnv(map); sb.append(JsonUtil.list2Xml(page)); } } else {//不存在树结构按正常输出 Map map = new HashMap<>(); map.put(SessionKey.DATA_BASE_ID, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""); page.setEnv(map); sb.append(JsonUtil.list2Xml(page)); } } sb1.append(""); sb1.append(sb.toString()); sb1.append(""); //---page.getFirstIndex=1 表示为第一次加载,需要把页码返回 if(page.getFirstIndex()==1) { for(int i=1;i"); } } sb1.append(""); return sb1.toString(); } private String getExpanded(String dbid) { String expanded = ""; try { SpObserver.setDBtoInstance("_" + dbid); expanded = gridService.getSimpleJdbcTemplate().queryForObject("select case when isnull(Expanded,0)=1 then 'Expanded=''1''' else 'Expanded=''0''' end from gform where formid=?", new Object[]{this.formID}, String.class); } finally { SpObserver.setDBtoInstance(); } return expanded; } private boolean isShowTree(String dbid) { String group = ""; try { SpObserver.setDBtoInstance("_" + dbid); group = gridService.getSimpleJdbcTemplate().queryForObject("select byGroup from gform where formid=?", new Object[]{this.formID}, String.class); } finally { SpObserver.setDBtoInstance(); } if (group == null || "".equalsIgnoreCase(group)) return false; else return true; } private void prossMapTree(Page page, Map map, StringBuffer sb1, int i) {//组装每行数据 StringBuffer sb = new StringBuffer();//isopen=1表示菜单有打开权限 imgflg = false; sb.append(" entry : map.entrySet()) { //处理18类型统计列,在这里把数据写到第一行对应列_RowNo // if ("_rowno".equalsIgnoreCase(entry.getKey()) && !rowFlg) { // map.put(entry.getKey(), page.getTbColsOut()); // rowFlg = true; // } if (i==0) { sb.append("_rowno='"+ (page.getTbColsOut()==null?"":page.getTbColsOut())+"' "); } rowFlg=false; if (page.getIsCp() == 1) { //如果是复单操作,需要进行排除字段的操作 String s = page.getCp() + ";doccode";//需要排除的字段 String[] t = s.split(";"); for (String st : t) { if (entry.getKey().equalsIgnoreCase(st)) entry.setValue(""); } } //每个字段,合并行时,不输出,跳出for //第一次 if (JsonUtil.checkRowSpan(entry.getKey(), page.getRowSpan()) && str != null && str.equals(entry.getValue())) {//表示当前字段还在跨行中,跳出来 continue; } //取得跨行数 span = JsonUtil.getRowSpanV2(page.getData(), entry, page.getRowSpan(), i); if (span > 1) {//跨二行或以上时,输出 if (!str.equals(entry.getValue())) str = entry.getValue(); sb.append(entry.getKey() + "RowSpan='" + span + "' "); } else { span = 0; } sb.append((("id".equalsIgnoreCase(entry.getKey()) && page.getIsGantt() == 0) ? "_ycid_" : entry.getKey()).toLowerCase())//增加对字段id转为treegrid的_ycid_ .append("='"); if (entry.getValue() instanceof String) { boolean flg = JsonUtil.CheckImage(page.getPicFild(), entry); if (flg) imgflg = flg; sb.append(entry.getValue() == null ? "" : JsonUtil.filterImage(flg, entry, page.getEnv())); } else if (entry.getValue() instanceof Integer) { if ((Integer) entry.getValue() == 0) sb.append(0); else sb.append(entry.getValue() == null ? "" : entry.getValue()); } else if (entry.getValue() instanceof Float) { if ((Float) entry.getValue() == 0) sb.append(0); else sb.append(entry.getValue() == null ? "" : entry.getValue()); } else if (entry.getValue() instanceof Double) { if ((Double) entry.getValue() == 0) sb.append(0); else sb.append(entry.getValue() == null ? "" : entry.getValue()); } else if (entry.getValue() instanceof BigDecimal) { if (((BigDecimal) entry.getValue()).floatValue() == 0) sb.append(0); else sb.append(entry.getValue() == null ? "" : entry.getValue()); } else sb.append(entry.getValue() == null ? "" : entry.getValue()); sb.append("' "); } if (imgflg) sb.append(JsonUtil.IMGROWHIGHT); sb.append(">"); sb1.append(sb.toString()); } private List> prossListTree2Execl(Page page) {//list是所有的内容 List> execl = new ArrayList>(); List list = page.getData(); List list1 = page.getData(); for (Object obj1 : list1) { Map map1 = (Map) obj1; if (map1.get("parentrowid") != null && !"".equalsIgnoreCase((String) map1.get("parentrowid"))) { continue; }else {//只有是父节点才进入下一层 execl.add(map1);//1-----加入父节点 //2--取出当前父节点的所有子节点,子节点有可能还有子节点,需要用递归处理。第一层子节点 List> parentList = ((List>)list).stream().filter(y -> y.get("parentrowid")!=null&&(((String)y.get("parentrowid")).startsWith((String) map1.get("rowid")))).collect(Collectors.toList()); getChildData(parentList,execl); } } return execl; } private void getChildData(final List> list,List> execl){ list.stream().forEach(map->{ if(GridUtils.prossRowSetDataType_Int(map,"hassubtree")==1){ execl.add(map); List> list1 = list.stream().filter(y -> y.get("parentrowid")!=null&&(((String)y.get("parentrowid")).startsWith((String)map.get("rowid") ))).collect(Collectors.toList()); if(list1.size()>0) { getChildData(list1, execl); } }else{ execl.add(map); } }); } /** * @param rootList 根结点 * @param listAll 所有结点 * @param parentId 父子集依赖关系 * @param spread 有子结点是否展开 *
true 展开 *
false 不展开 * @return 树形结构的字符串 */ public String getTreeByStack(List rootList, List listAll, String parentId, boolean spread) { JSONArray jsonRootList = JSONArray.fromObject(rootList); JSONArray jsonListAll = JSONArray.fromObject(listAll); Stack stack = new Stack(); for (int i = 0; i < jsonRootList.size(); i++) { JSONObject root = jsonRootList.getJSONObject(i); stack.push(root); } while (!stack.isEmpty()) { JSONObject parentNode = stack.pop(); JSONArray children = new JSONArray(); for (int j = 0; j < jsonListAll.size(); j++) { JSONObject jsonObject = jsonListAll.getJSONObject(j); if (jsonObject.getInt(parentId) == parentNode.getInt("id")) { children.add(jsonObject); } } if (children.size() > 0) { parentNode.put("children", children); parentNode.put("spread", spread); JSONArray sunJsonArray = parentNode.getJSONArray("children"); for (int k = 0; k < sunJsonArray.size(); k++) { stack.push(sunJsonArray.getJSONObject(k)); } } } String tree = jsonRootList.toString(); return tree; } private String prossListTree(Page page, StringBuffer sb, List list, String pid, int index) {//list是所有的内容 //pid是上一级的rowid;11zzzz if (pid == null && page.getType().startsWith("18|")) { throw new ApplicationException("上级rowid不能为空,请检查树结构");//只处理18类型的树显示 } int i = -1; boolean flg = false;//表示没有符合条件,返回上一级 boolean topflg = true;//只有一条的情况 for (Object obj : list) {//循环list,取得treetype=1的菜单模块 Map map = (Map) obj; i++; if (!"".equalsIgnoreCase(tempPid)) pid = tempPid; // if ((map.get("parentrowid") != null && !"".equalsIgnoreCase((String) map.get("parentrowid"))) && pid.equalsIgnoreCase((String) map.get("parentrowid"))) {//取到符合条件的集合,也就是属于上级的节点 //递归调用, flg = true; prossMapTree(page, map, sb, i); if ((map.get("hassubtree") != null && (Integer) map.get("hassubtree") == 0)) {//没子树,则闭合当前节点 tempPid = pid; sb.append("
"); } else {//继续递归下去 tempPid = ""; levelNum++; list = ((List>) page.getData()).stream().filter(x -> (map.get("rowid").equals((String) x.get("parentrowid")))).collect(Collectors.toList()); prossListTree(page, sb, list, (String) map.get("rowid"), i); } //} } if (flg || topflg) {//循环所有,返回上层 tempPid = ""; return sb.append("").toString(); } return sb.toString(); } private String tempPid = ""; private int levelNum = 0;//层数 private void prossMap9654(Map map, StringBuffer sb, String expaned) {//组装权限数据设置 StringBuffer sb1 = new StringBuffer();//isopen=1表示菜单有打开权限 sb1.append(""); sb.append(sb1.toString()); } private void prossMap(Map map, StringBuffer sb, String expaned) {//组装权限值 StringBuffer sb1 = new StringBuffer();//isopen=1表示菜单有打开权限 sb1.append(" 0)) || (hasSubPermission == 1 && (Integer) map.get("HasSubMenu") == 1)) checked = " formnameChecked='2' ischecked='1' isopen='1' ";//部分权限,下级节点有部分选上 if ((hasSubPermission == 2 && ((map.get("formid") == null && map.get("optype") == null) || optype > 0)) || (hasSubPermission == 2 && (Integer) map.get("HasSubMenu") == 1)) checked = " formnameChecked='1' ischecked='1' isopen='1' ";//全部权限 sb1.append(checked) //设置树节点全部为折叠 .append(" Expanded='0' "); if (hasSubPermission == 0) {//表示当前自己没权限 sb1.append((map.get("HasPermission") == null || (Integer) map.get("HasPermission") == 0) ? " " : " formnameChecked='1' HasPermission='1' isopen='1' "); //if(optype>0)//为0则表示全为空,也应该不勾选 // sb1.append(" formnameChecked='1' ischecked='1' "); } if ((Integer) map.get("treetype") == 2) {//角色时候 if (hasSubPermission == 1) sb1.append(" formnameChecked='2' "); else if (hasSubPermission == 2) sb1.append(" formnameChecked='1' "); else sb1.append((map.get("HasPermission") == null || (Integer) map.get("HasPermission") == 0) ? " isrol='0' isrolCanEdit='1' " : " formnameChecked='1' isrol='1' isrolCanEdit='1' "); sb1.append(" profileid='" + map.get("profileid") + "' ").append(" profilename='" + map.get("profilename") + "' "); } //是上级节点表示不需要勾选权限,当前行所有的checkbox变为只读 HasSubMenu if (map.get("formid") == null || (Integer) map.get("formid") == 0) {//父节点,不需要勾选,针对主功能号 sb1.append(" CanEdit='0' isroot='1' ").append(expaned).append(" "); } else {//可以设置权限 // sb.append(" CanEdit='0' isopenqueryCanEdit='1' "); //根据窗体类型,设置哪些是只读,避免让客户多选 prossFormType(map, sb1); //根据权限值,设置对应的权限,选 上 // if(ch>0) //if(optype>0) prossOpType(map, sb1, optype); } sb1.append(" >"); sb.append(sb1.toString()); } private void prossOpType(Map map, StringBuffer sb, int optype) { String s = " isexport='0' isprint='0' issave='0' isdelrow='0' " + " iscopyrow='0' isaddrow='0' isexecsp='0' " + " isopenquery='0' iscancelpostdoc='0' isrevokepostdoc='0' isdeldoc='0' ispostdoc='0' isnewdoc='0' " + " isreportdesign='0' iscopydoc='0' isimport='0' islistdoc='0' is38formtype='0' "; if ((optype & 1) == 1) { if (sb.indexOf("isexportCanEdit='0'") < 0) s = s.replaceFirst("isexport='0'", " isexport='1' "); } if ((optype & 2) == 2) { if (sb.indexOf("isprintCanEdit='0'") < 0) s = s.replaceFirst("isprint='0'", " isprint='1' "); } if ((optype & 4) == 4) { if (sb.indexOf("issaveCanEdit='0'") < 0) s = s.replaceFirst("issave='0'", " issave='1' "); } if ((optype & 8) == 8) { if (sb.indexOf("isdelrowCanEdit='0'") < 0) s = s.replaceFirst("isdelrow='0'", " isdelrow='1' "); } if ((optype & 16) == 16) { if (sb.indexOf("iscopyrowCanEdit='0'") < 0) s = s.replaceFirst("iscopyrow='0'", " iscopyrow='1' "); } if ((optype & 32) == 32) { if (sb.indexOf("isaddrowCanEdit='0'") < 0) s = s.replaceFirst("isaddrow='0'", " isaddrow='1' "); } if ((optype & 64) == 64) { if (sb.indexOf("isexecspCanEdit='0'") < 0) s = s.replaceFirst("isexecsp='0'", " isexecsp='1' "); } if ((optype & 128) == 128) { if (sb.indexOf("isopenqueryCanEdit='0'") < 0) s = s.replaceFirst("isopenquery='0'", " isopenquery='1' "); } if ((optype & 256) == 256) { if (sb.indexOf("iscancelpostdocCanEdit='0'") < 0) s = s.replaceFirst("iscancelpostdoc='0'", " iscancelpostdoc='1' "); } // if((optype&512)==512){ // sb.append(" iswriteoffdoc='1' "); // } if ((optype & 1024) == 1024) { if (sb.indexOf("isdeldocCanEdit='0'") < 0) s = s.replaceFirst("isdeldoc='0'", " isdeldoc='1' "); } if ((optype & 2048) == 2048) { if (sb.indexOf("ispostdocCanEdit='0'") < 0) s = s.replaceFirst("ispostdoc='0'", " ispostdoc='1' "); } if ((optype & 4096) == 4096) { if (sb.indexOf("isnewdocCanEdit='0'") < 0) s = s.replaceFirst("isnewdoc='0'", " isnewdoc='1' "); } if ((optype & 8192) == 8192) { if (sb.indexOf("isreportdesignCanEdit='0'") < 0) s = s.replaceFirst("isreportdesign='0'", " isreportdesign='1' "); } if ((optype & 16384) == 16384) { if (sb.indexOf("iscopydocCanEdit='0'") < 0) s = s.replaceFirst("iscopydoc='0'", " iscopydoc='1' "); } if ((optype & 32768) == 32768) { if (sb.indexOf("isimportCanEdit='0'") < 0) s = s.replaceFirst("isimport='0'", " isimport='1' "); } if ((optype & 65536) == 65536) { if (sb.indexOf("islistdocCanEdit='0'") < 0) s = s.replaceFirst("islistdoc='0'", " islistdoc='1' "); } if ((optype & 131072) == 131072) { if (sb.indexOf("isrevokepostdocCanEdit='0'") < 0) s = s.replaceFirst("isrevokepostdoc='0'", " isrevokepostdoc='1' "); } if ((optype & 262144) == 262144) { if (sb.indexOf("is38formtypeCanEdit='0'") < 0) s = s.replaceFirst("is38formtype='0'", " is38formtype='1' "); } sb.append(s); } private void prossFormType(Map map, StringBuffer sb) { int formtype =GridUtils.prossRowSetDataType_Int(map,"formtype"); int subformtype =GridUtils.prossRowSetDataType_Int(map,"subformtype"); switch (formtype) { case 1: case 2: case 3: case 4: case 7: case 10: case 20: case 30: case 301: case 302: case 303: sb.append(" isreportdesignCanEdit='1' isprintCanEdit='1' isexportCanEdit='1' isimportCanEdit='1' isaddrowCanEdit='1' iscopyrowCanEdit='1' isdelrowCanEdit='1' issaveCanEdit='1' isnewdocCanEdit='0' ispostdocCanEdit='0' isdeldocCanEdit='0' iscancelpostdocCanEdit='0' isrevokepostdocCanEdit='0' isopenqueryCanEdit='1' isexecspCanEdit='0' iscopydocCanEdit='0' islistdocCanEdit='0' "); break; case 5: case 8: case 16: case 496: case 498: case 9: case 15: case 17: case 497: case 499: sb.append(" isreportdesignCanEdit='1' isprintCanEdit='1' isexportCanEdit='1' isimportCanEdit='1' isaddrowCanEdit='1' iscopyrowCanEdit='1' isdelrowCanEdit='1' issaveCanEdit='1' isnewdocCanEdit='1' ispostdocCanEdit='1' isdeldocCanEdit='1' iscancelpostdocCanEdit='1' isrevokepostdocCanEdit='1' isopenqueryCanEdit='1' isexecspCanEdit='0' iscopydocCanEdit='1' islistdocCanEdit='1' "); break; // sb.append(" ispostdocCanEdit='0' islistdocCanEdit='0' isaddrowCanEdit='0' iscopyrowCanEdit='0' isdelrowCanEdit='0' issaveCanEdit='0' "); //break; case 18: case 38: case 238: if(subformtype==5)//表示38类型的汇总项 sb.append(" isaddrowCanEdit='0' isdelrowCanEdit='0' iscopyrowCanEdit='0' issaveCanEdit='0' isnewdocCanEdit='0' ispostdocCanEdit='0' isdeldocCanEdit='0' iscancelpostdocCanEdit='0' isrevokepostdocCanEdit='0' isexecspCanEdit='0' iscopydocCanEdit='0' islistdocCanEdit='0' isopenqueryCanEdit='0' isreportdesignCanEdit='0' isprintCanEdit='0' isexportCanEdit='0' isimportCanEdit='0' is38formtypeCanEdit='0'"); else sb.append(" isaddrowCanEdit='0' isdelrowCanEdit='0' iscopyrowCanEdit='0' issaveCanEdit='0' isnewdocCanEdit='0' ispostdocCanEdit='0' isdeldocCanEdit='0' iscancelpostdocCanEdit='0' isrevokepostdocCanEdit='0' isexecspCanEdit='0' iscopydocCanEdit='0' islistdocCanEdit='0' isopenqueryCanEdit='1' isreportdesignCanEdit='1' isprintCanEdit='1' isexportCanEdit='1' isimportCanEdit='0' is38formtypeCanEdit='1'"); break; case 19: sb.append(" isaddrowCanEdit='0' isdelrowCanEdit='0' iscopyrowCanEdit='0' issaveCanEdit='0' isnewdocCanEdit='0' ispostdocCanEdit='0' isdeldocCanEdit='0' iscancelpostdocCanEdit='0' isrevokepostdocCanEdit='0' isopenqueryCanEdit='0' iscopydocCanEdit='0' islistdocCanEdit='0' isexecspCanEdit='1' isreportdesignCanEdit='1' isprintCanEdit='1' isexportCanEdit='1' isimportCanEdit='0' "); break; case 22: sb.append(" isaddrowCanEdit='0' isdelrowCanEdit='0' iscopyrowCanEdit='0' issaveCanEdit='0' isnewdocCanEdit='0' ispostdocCanEdit='0' isdeldocCanEdit='0' iscancelpostdocCanEdit='0' isrevokepostdocCanEdit='0' isopenqueryCanEdit='0' iscopydocCanEdit='0' islistdocCanEdit='0' isexecspCanEdit='1' isreportdesignCanEdit='0' isprintCanEdit='0' isexportCanEdit='0' isimportCanEdit='0' "); break; default: } } private String prossList(StringBuffer sb, Page page, String pid, int type, int index) {//list是所有的内容 //pid是上一级的rowid;11zzzz List list = page.getData(); int i = -1; boolean flg = false;//表示没有符合条件,返回上一级 for (Object obj : list) {//循环list,取得treetype=1的菜单模块 Map map = (Map) obj; i++; if (!"".equalsIgnoreCase(tempPid)) pid = tempPid; if (pid.equalsIgnoreCase(map.get("parentrowid") != null ? (String) map.get("parentrowid") : "")) {//取到符合条件的集合 //递归调用, flg = true; // sb.append(""); if (this.formID == 9654) prossMap9654(map, sb, page.getExpanded()); else prossMap(map, sb, page.getExpanded()); // if(!pids.contains(map.get("rowid"))){//退出条件是当前的rowid是否存在于parenrowid,不存在则表示当前分支已到最后,需要退出递归 if ((map.get("HasSubMenu") != null && (Integer) map.get("HasSubMenu") == 0) || map.get("subformtype") != null) {//没子菜单,则关闭 或者 subformtype不为null表示是子功能号 tempPid = pid; //map.put("Pass", "1"); sb.append(""); //return sb.toString(); } else { tempPid = ""; levelNum++; prossList(sb, page, (String) map.get("rowid"), (Integer) map.get("TreeType"), i); // map.put("Pass", "1"); } } //tempPid=""; } if (flg) {//循环所有,返回上层 tempPid = ""; return sb.append("").toString(); } // Map map1=(Map)list.get(index) ; //sb.append("").append(""); return sb.toString(); } /** * 手机端调用分页显示 * * @param flag=1表示显示数据,默认0是不显示数据 */ public String loadForMobile(Grid grid, HttpServletRequest request, HttpServletResponse resp) { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用,作用是为了生成错误日志 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); Page page = this.setPageInfoTree(request);// 第一步,照写 this.formID = grid.getFormID(); env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setId(page.getOrderBy().split("\\s+")[0]);// 以空格分割取排序中的第一个字段作为分页的ID page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setSql(this.exprTOSql(page, this.FieldsTOSql(grid.getField().split("\\s+")[0], page.getSql()))); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page = this.ParseWhere(page, grid, request, resp, type); String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { if (-1 == page.getFlag() || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) page.setPageSize(MAX_RECORD); SpObserver.setDBtoInstance("_" + dbid); gridService.loadAll(page);// 第二步,调用相对应业务类取得数据,分页功能 return new com.google.gson.Gson().toJson(page.getData());// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { return e.getMessage(); } finally { page = null; env = null; grid = null; local.remove(); SpObserver.setDBtoInstance(); } } /** * 普通型窗体分页显示 * * @param flag=1表示显示数据,默认0是不显示数据 */ @RequestMapping(params = "m=load") public void load(Grid grid, HttpServletRequest request, HttpServletResponse resp) { Page page = this.setPageInfoTree(request);// 第一步,照写 try { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用,作用是为了生成错误日志 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); this.formID = grid.getFormID(); env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setId(page.getOrderBy().split("\\s+")[0]);// 以空格分割取排序中的第一个字段作为分页的ID page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setPicFild(grid.getPicFild()); page.setIsTree(grid.getIsTree());//增加树显示功能 page.setTbCols(grid.getTbCols()); page.setSql(this.exprTOSql(page, this.FieldsTOSql(grid.getField().split("\\s+")[0], page.getSql()))); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page = this.ParseWhere(page, grid, request, resp, type); String orgWhere = grid.getWhere();//保留原始where条件,方便之后做判断 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; //---写入到最近浏览记录,非单据类型 if(request.getHeader("x-app-type")!=null) { String formName=page.getFormName(); String where_str=org.apache.commons.lang3.StringUtils.isNotBlank(page.getWhere()) ? Base64.getEncoder().encodeToString(("where="+page.getWhere()).getBytes(StandardCharsets.UTF_8)) : null; appController.execRecentAccessFormid(new RecentAccessEntity( env.get(SessionKey.USERCODE)+"", env.get(SessionKey.USERNAME)+"", formID, Integer.parseInt(type), where_str, formName, null, dbid )); } //------ if (-1 == page.getFlag() || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) { page.isNull=false; if(page.getWhere().length() == 0){ page.setWhere(" 1=1 "); } page.setPageSize(MAX_RECORD); } if (-1 == page.getFlag() && (type.equalsIgnoreCase("2") || type.equalsIgnoreCase("17")))//2,16类型的导出执行这个 { if (page.getWhere() != null && page.getWhere().trim().indexOf("and") == 0) page.setWhere(" 1=1 " + page.getWhere()); try { SpObserver.setDBtoInstance("_" + dbid); String fields = gridService.getSimpleJdbcTemplate().queryForObject("select fields = stuff((select ','+cast(fieldid as varchar) from gField where formid=? and isnull(headflag,0)=0 and isnull(isExport,0)=1 for xml path('')),1,1,'') ", String.class, page.getFormid()); if (org.apache.commons.lang3.StringUtils.isBlank(fields)) { throw new ApplicationException(page.getFormid() + "-没有需要导出的字段,请在9802设置勾选需要导出的字段"); } page.setData(gridService.getSimpleJdbcTemplate().queryForList("select " + fields + " from " + page.getTableName() + ("".equalsIgnoreCase(page.getWhere()) ? "" : " where " + page.getWhere()))); } finally { SpObserver.setDBtoInstance(); } } else { try { SpObserver.setDBtoInstance("_" + dbid); page.setUserCode(request.getSession().getAttribute(SessionKey.USERCODE)+""); page.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); if (grid.getPaging() == 0)//不分页 gridService.loadAllNoPage(page);// else gridService.loadAll(page);// 第二步,调用相对应业务类取得数据,分页功能 } finally { SpObserver.setDBtoInstance(); } } page.setIsGantt(grid.getIsGantt()); if (-1 == page.getFlag()) {//导出execl //取面板的数据 String pd = ""; try { if ("1".equalsIgnoreCase(flag)) { pd = FileUtil.readFile(request.getSession().getAttribute(SessionKey.REAL_PATH) + "/" + formID + "/" + getFormType(grid) + "/panel_data");//面板 } } catch (Exception e) { pd = ""; } if (this.flag.equalsIgnoreCase("1")) { this.flag = "0";//在从表导出excel时候,主表的where条件应该取主表的,而不是从表where条件 page = this.ParseWhere(page, grid, request, resp, type); } Map map = null; if (pd.length() > 0) {//格式:内容-表名-字段-字段位置(列,行;列,行),(内容是指标题或有动态标题需要对应的字段) String table = pd.split("-")[1]; //取表名 String fields = pd.split("-")[2];//取字段名查询 try { SpObserver.setDBtoInstance("_" + dbid); List plist = gridService.getSimpleJdbcTemplate().queryForList("select " + fields + " from " + table + " where " + page.getWhere());//面板数据 map = new HashMap(); map.put("plist", plist); map.put("desc", pd); } finally { SpObserver.setDBtoInstance(); } } //-------处理3表,取得3表设置中第三表表名和关联字段 if ("15|1".equals(grid.getWinType())) {//15|1表示是8类型界面才需要读取第三表的数据 try { SpObserver.setDBtoInstance("_" + dbid); Map map3 = gridService.getSimpleJdbcTemplate().queryForMap(" select t.DetailFormID,g.hdtable,t.MasterKeys," + "t.DetailKeys from _sysmasterdetail t ,gform g where g.formid=t.DetailFormID " + "and t.FormID=? and isnull(t.MasterKeys,'')<>''", new Object[]{this.formID}); if (map3 != null) { //取3表的可导出字段 String exportFields = gridService.getSimpleJdbcTemplate().queryForObject("select exportFields" + "=(select fieldid +',' from gfield as b where b.formid = a.formid and" + " b.formid=? and b.isexport=1 for xml path('')) from gfield as a where " + " formid=? and isexport=1 group by a.formid ", String.class, map3.get("DetailFormID"), map3.get("DetailFormID")); if (exportFields != null && exportFields.toLowerCase().indexOf((map3.get("DetailKeys") + "").toLowerCase()) < 0 || exportFields.toLowerCase().indexOf("doccode") < 0) { throw new ApplicationException(this.formID + "第三表没有勾选与第二表相关联字段,请根据【9828】所设置的关联,在第三表勾选上所需字段"); } List grid3list = gridService.getSimpleJdbcTemplate().queryForList("select " + exportFields.substring(0, exportFields.length() - 1) + " from " + map3.get("hdtable") + " where " + page.getWhere());//3表数据 page.setGrid3Data(grid3list); page.setKeys(map3.get("MasterKeys") + "_" + map3.get("DetailKeys") + ""); } } catch (EmptyResultDataAccessException ex) { //TODO 第三表导出作为可选项时,要去掉下一行代码 // throw new ApplicationException("["+this.formID+"]第三表没有勾选导出字段"); } catch (DataAccessException e) { throw new ApplicationException(this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } } this.print2Excel(request, resp, page, map, this.formID, getFormType(grid));// 第三步,通过Response向页面输出Page类数据为excel } else { if (request.getHeader("x-app-type") != null) { List list = page.getData(); boolean isDanjun=false; if (list != null && list.size() > 0) { //---app端,打开单据时更新待办事宜为已读状态 isDanjun = getFormTYpeInfo(grid); if(isDanjun) { try { int winType=0; if("17".equals(type)) winType=16; if("15".equals(type)) winType=8; if("9".equals(type)) winType=5; if("497".equals(type)) winType=496; if("499".equals(type)) winType=498; SpObserver.setDBtoInstance("_" + dbid); gridService.getSimpleJdbcTemplate().update("set nocount on \n update a set a.isread=1 from t219001 a where a.usercode=? and a.formid=? and a.formtype=? and a."+grid.getWhere(), request.getSession().getAttribute(SessionKey.USERCODE), this.formID, winType); } catch (Exception e) { e.printStackTrace(); throw new ApplicationException("更新"+this.doccode+"单据为已读状态时出错:"+this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } } ((Map) list.get(0)).put("_RowNo", page.getTbColsOut()); } else { //单据面板的情况 isDanjun = getFormTYpeInfo(grid); if (isDanjun) { // 如果查询出来数据为空,需要判断是否是没权限造成,需要弹出提示 try { SpObserver.setDBtoInstance("_" + dbid); String enterName = gridService.getSimpleJdbcTemplate().queryForObject("select entername from " + page.getTableName() + " where " + orgWhere, String.class); if (enterName != null) { //表示存在有数据,只是没权限显示 this.printJson(resp, "@error-1003;您没有权限查看【" + orgWhere.toLowerCase().replace("doccode='", "").replace("'", "").toUpperCase() + "】单据内容,请联系制单人【" + enterName + "】"); return; } else { //单据已删除的情况 this.printJson(resp, "@error-1003;单据【" + orgWhere.toLowerCase().replace("doccode='", "").replace("'", "").toUpperCase() + "】已删除"); return; } } catch (DataAccessException e) { throw new ApplicationException(this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } } } this.print(resp, GridUtils.toJson(list)); } else { this.print(resp, this.prossTree(page, request)); } } } catch (Exception e) { e.printStackTrace(); this.printJson(resp, this.getErrorMsg(e)); } finally { page = null; env = null; local.remove(); } } private boolean getFormTYpeInfo(Grid grid) { String[] str = grid.getWinType().split("\\|"); boolean flg = false; switch (Integer.parseInt(str[0])) { case 17: case 15: case 497: case 9: if (Integer.parseInt(str[1]) == 0) { if (org.apache.commons.lang3.StringUtils.isNotBlank(grid.getWhere())) { //--判断是不是列表的情况 if (grid.getWhere().toLowerCase().replaceAll("[\\[\\]]", "").replaceAll("\\s+", "").indexOf("isnull(readerorganizations,'')") > 0 ) { flg = false; } else { flg = true; if(grid.getIs496()==1) flg=false;//496多表子功能号的16类型不作为单据 } } else { flg = true; } break; } default: flg = false; } return flg; } //全局statisid和formid static String statisid = ""; static int formid = 0; @RequestMapping(params = "m=ut") public void loadut(HttpServletRequest request, HttpServletResponse resp, String statiid, int forid) { statisid = statiid; formid = forid; this.printJson(resp, "{\"code\":\"" + formid + "\",\"info\":\"" + statisid + "\"}"); } @RequestMapping(params = "m=ut1") public void loadut1(HttpServletRequest request, HttpServletResponse resp) { if (formid != 0) { this.printJson(resp, "{\"code\":\"" + formid + "\",\"info\":\"" + statisid + "\"}"); } } @RequestMapping(params = "m=loads") public void loads(Grid grid, HttpServletRequest request, HttpServletResponse resp) { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用,作用是为了生成错误日志 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); Page page = this.setPageInfoTree(request);// 第一步,照写 this.formID = grid.getFormID(); env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setId(page.getOrderBy().split("\\s+")[0]);// 以空格分割取排序中的第一个字段作为分页的ID page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setPicFild(grid.getPicFild()); page.setIsTree(grid.getIsTree());//增加树显示功能 page.setSql(this.exprTOSql(page, this.FieldsTOSql(grid.getField().split("\\s+")[0], page.getSql()))); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page = this.ParseWhere(page, grid, request, resp, type); String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { if (-1 == page.getFlag() || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) page.setPageSize(MAX_RECORD); if (-1 == page.getFlag() && (type.equalsIgnoreCase("2") || type.equalsIgnoreCase("17") || type.equalsIgnoreCase("1")))//2,16类型的导出执行这个 { if (page.getWhere() != null && page.getWhere().trim().indexOf("and") == 0) page.setWhere("1=1 " + page.getWhere()); try { SpObserver.setDBtoInstance("_" + dbid); page.setData(gridService.getSimpleJdbcTemplate().queryForList("select * from " + page.getTableName() + ("".equalsIgnoreCase(page.getWhere()) ? "" : " where " + page.getWhere()))); } finally { SpObserver.setDBtoInstance(); } } else { try { SpObserver.setDBtoInstance("_" + dbid); page.setUserCode(request.getSession().getAttribute(SessionKey.USERCODE)+""); page.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); page.setFormid(grid.getFormID()); if (grid.getPaging() == 0)//不分页 gridService.loadAllNoPage(page);// else gridService.loadAlls(page, statisid, formid);// 第二步,调用相对应业务类取得数据,分页功能 } catch (Exception e) { e.printStackTrace(); this.print(resp, e.getMessage().split(";")[2]); } finally { SpObserver.setDBtoInstance(); } } page.setIsGantt(grid.getIsGantt()); if (-1 == page.getFlag()) {//导出execl //取面板的数据 String pd = ""; if ("1".equalsIgnoreCase(flag)) { pd = FileUtil.readFile(request.getSession().getAttribute(SessionKey.REAL_PATH) + "/" + formID + "/" + getFormType(grid) + "/panel_data");//面板 } if (this.flag.equalsIgnoreCase("1")) { this.flag = "0";//在从表导出excel时候,主表的where条件应该取主表的,而不是从表where条件 page = this.ParseWhere(page, grid, request, resp, type); } Map map = null; if (pd.length() > 0) {//格式:内容-表名-字段-字段位置(列,行;列,行),(内容是指标题或有动态标题需要对应的字段) String table = pd.split("-")[1]; //取表名 String fields = pd.split("-")[2];//取字段名查询 try { SpObserver.setDBtoInstance("_" + dbid); List plist = gridService.getSimpleJdbcTemplate().queryForList("select " + fields + " from " + table + " where " + page.getWhere());//面板数据 map = new HashMap(); map.put("plist", plist); map.put("desc", pd); } finally { SpObserver.setDBtoInstance(); } } // this.print2Excel(request, resp, page, map, this.formID, getFormType(grid));// 第三步,通过Response向页面输出Page类数据为excel } else { if (request.getHeader("x-app-type") != null) { List list = page.getData(); this.print(resp, GridUtils.toJson(list)); } else this.print(resp, this.prossTree(page, request)); } // this.printJsonInfo(resp, page, null);// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } finally { page = null; env = null; grid = null; local.remove(); } } //38类型的定制的数据方法 @RequestMapping(params = "m=loaddata") public void loaddata(Grid grid, HttpServletRequest request, HttpServletResponse resp) { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用,作用是为了生成错误日志 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); Page page = this.setPageInfoTree(request);// 第一步,照写 this.formID = grid.getFormID(); env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); String type = grid.getWinType().split("\\|")[0]; flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 page.setId(page.getOrderBy().split("\\s+")[0]);// 以空格分割取排序中的第一个字段作为分页的ID page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setPicFild(grid.getPicFild()); page.setIsTree(grid.getIsTree());//增加树显示功能 page.setSql(this.exprTOSql(page, this.FieldsTOSql(grid.getField().split("\\s+")[0], page.getSql()))); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page = this.ParseWhere(page, grid, request, resp, type); String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { if (-1 == page.getFlag() || (type.equalsIgnoreCase("15") && flag.equalsIgnoreCase("2"))) page.setPageSize(MAX_RECORD); if (-1 == page.getFlag() && (type.equalsIgnoreCase("2") || type.equalsIgnoreCase("17") || type.equalsIgnoreCase("1")))//2,16类型的导出执行这个 { if (page.getWhere() != null && page.getWhere().trim().indexOf("and") == 0) page.setWhere("1=1 " + page.getWhere()); try { SpObserver.setDBtoInstance("_" + dbid); page.setData(gridService.getSimpleJdbcTemplate().queryForList("select fieldid,case when isnull(gridcaption,'') <> '' then gridcaption else fieldname end as fieldcaption,displayformat,cellAlign,case when isnull(appCellAlign,'')<>'' then appCellAlign else cellAlign end as appCellAlign FROM gfield where formid=" + formID + " and headflag = 0 and (isnull(fieldname,'') <> '' or isnull(gridcaption,'') <> '' ) order by headflag desc ,statisid asc ")); } finally { SpObserver.setDBtoInstance(); } } else { try { SpObserver.setDBtoInstance("_" + dbid); if (grid.getPaging() == 0)//不分页 gridService.loadAllNoPage(page);// else gridService.loaddata(page, formID);// 第二步,调用相对应业务类取得数据,分页功能 } finally { SpObserver.setDBtoInstance(); } } page.setIsGantt(grid.getIsGantt()); if (-1 == page.getFlag()) {//导出execl //取面板的数据 String pd = ""; if ("1".equalsIgnoreCase(flag)) { pd = FileUtil.readFile(request.getSession().getAttribute(SessionKey.REAL_PATH) + "/" + formID + "/" + getFormType(grid) + "/panel_data");//面板 } if (this.flag.equalsIgnoreCase("1")) { this.flag = "0";//在从表导出excel时候,主表的where条件应该取主表的,而不是从表where条件 page = this.ParseWhere(page, grid, request, resp, type); } Map map = null; if (pd.length() > 0) {//格式:内容-表名-字段-字段位置(列,行;列,行),(内容是指标题或有动态标题需要对应的字段) String table = pd.split("-")[1]; //取表名 String fields = pd.split("-")[2];//取字段名查询 try { SpObserver.setDBtoInstance("_" + dbid); List plist = gridService.getSimpleJdbcTemplate().queryForList("select " + fields + " from " + table + " where " + page.getWhere());//面板数据 map = new HashMap(); map.put("plist", plist); map.put("desc", pd); } finally { SpObserver.setDBtoInstance(); } } // this.print2Excel(request, resp, page, map, this.formID, getFormType(grid));// 第三步,通过Response向页面输出Page类数据为excel } else { if (request.getHeader("x-app-type") != null) { List list = page.getData(); this.print(resp, GridUtils.toJson(list)); } else { this.print(resp, this.prossTree(page, request)); } } // this.printJsonInfo(resp, page, null);// 第三步,通过Response向页面转换为json格式输出Page类数据 } catch (DataAccessException e) { this.printJson(resp, this.getErrorMsg(e)); } finally { page = null; env = null; grid = null; local.remove(); } } private String getFormType(Grid grid) {// String[] type = grid.getWinType().split("\\|"); String ty = ""; if ("0".equalsIgnoreCase(type[1])) {//直接取 ty = type[0]; } else {//取对应的窗体类型,例如:9的话则取5. if ("9".equalsIgnoreCase(type[0])) ty = "5"; if ("15".equalsIgnoreCase(type[0])) ty = "8"; if ("499".equalsIgnoreCase(type[0])) ty = "498"; if ("497".equalsIgnoreCase(type[0])) ty = "496"; } return ty; } /** * 把各种不同的条件或窗体类型组合成sql的where 子句 **/ private Page ParseWhere(Page page, Grid grid, HttpServletRequest request, HttpServletResponse resp, String type) { String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; try { if ("YW5kIGRpc3BsYXlZTj0xIGFuZCBmb3JtaWQ9OTgyMg==".equals(grid.getWhere())) { } else { exwheres = grid.getWhere().toString(); } String temp = grid.getWhere(); if (org.apache.commons.codec.binary.Base64.isBase64(grid.getWhere())) { String exwhere = EncodeUtil.base64Decode(grid.getWhere());//base64解密所有请求where参数 if (org.apache.commons.codec.binary.Base64.isBase64(grid.getWhere())) exwhere = temp; if (exwhere.indexOf("%2B") != -1) { exwhere = exwhere.replaceAll("%2B", "+");//base64编码中包含+ / 等符号 所以要进行处理 } if (exwhere.indexOf("%2F") != -1) { exwhere = exwhere.replaceAll("%2F", "/"); } if (exwhere.indexOf("%3D") != -1) { exwhere = exwhere.replaceAll("%3D", "="); } grid.setWhere(exwhere); } else { String temp1 = java.net.URLDecoder.decode(grid.getWhere().replaceAll("\\+", "%2B").replaceAll("\\/", "%2F"), "utf-8"); grid.setWhere(temp1); } } catch (UnsupportedEncodingException e) { //e.printStackTrace(); grid.setWhere(grid.getWhere()); } catch (IllegalArgumentException e) { //e.printStackTrace(); grid.setWhere(grid.getWhere()); } try { SpObserver.setDBtoInstance("_" + dbid); page.setTableName(gridService.getTableName(this.formID, grid.getWinType())); } catch (DataAccessException e) { this.print(resp, "获取"+this.formID+"功能号数据出错:"+this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } //grid.setWhere(grid.getWhere().replaceAll("_ycid_", "id")); page.setFlag(grid.getFlag()); page.setType(grid.getWinType(), this.formID); if ("3".equalsIgnoreCase(type) || "4".equalsIgnoreCase(type) || "30".equalsIgnoreCase(type) || "301".equalsIgnoreCase(type)) {// 3,4类型 page.setWhere(this.setThreeType(grid.getWhere(), dbid, request,page.getTableName())); if ("".equalsIgnoreCase(page.getWhere())) page.setWhere(" 1=1 "); //处理组合条件查询, //((MatCode like '@~kt lyj@~' or matname like '@~kt lyj@~' ..............)) //转换为:(((MatCode = 'kt' or MatCode ='lyj') or( matname = 'kt' or MatCode ='lyj') ............)) if(page.getWhere().trim().contains("@~")){ //表示不是选中树节点传过来的条件,需要判断是否以空格分隔传的组合条件,是则需要进一步处理 page.setWhere(this.procssCompile(page.getWhere())); } } else if ("7".equalsIgnoreCase(type)) { page.setWhere(this.getTypeInfo7(this.formID, grid.getWhere(), dbid)); } else if ("2".equalsIgnoreCase(type)) { if (!"".equalsIgnoreCase(grid.getExwhere())) page.setWhere(grid.getExwhere()); else if ("".equalsIgnoreCase(grid.getWhere())) { page.setWhere(" 1=1 "); } else { page.setWhere(grid.getWhere()); } } else if ("1".equalsIgnoreCase(type)) { if (!"".equalsIgnoreCase(grid.getExwhere())) page.setWhere(grid.getExwhere()); else if (grid.getWhere() != null && grid.getWhere().trim().startsWith("flag=1")) page.setWhere(grid.getWhere().replaceAll("flag=1", "")); else page.setWhere(grid.getWhere()); } else if ("YW5kIGRpc3BsYXlZTj0xIGFuZCBmb3JtaWQ9OTgyMg==".equals(grid.getWhere())) { page.setWhere(exwheres); } else { page.setWhere(grid.getWhere()); } String filterStr = grid.getFormdatafilters().replaceAll("@~", "%"); page.setFilter(prossFormdatafilters(filterStr, request)); page.setDataformid(grid.getDataformid()); String temp = (page.getWhere() != null && !"".equalsIgnoreCase(page.getWhere())) ? page.getWhere().replaceAll("@~", "%").replaceAll("@_asterisk_@", "*") : "";// 3类型显示右边表格数据需要用,处理格线过滤内容存在*号 //处理可能存在编码了的内容,@_xxxx_@ //temp = proessFilterInfo(temp); if(org.apache.commons.lang3.StringUtils.isNotBlank(temp)&&!temp.trim().startsWith("and")){ //所传条件没用括号括起来且用or连接,需要补上,因为如果后面有其他条件时,会造成查询有问题 temp="( "+temp+" )"; } String dataGroup = prossDataGroup(request, this.formID, Integer.parseInt(this.flag)); page.setWhere(temp + (page.getFilter().length() == 0 ? "" : (temp.length() > 0 ? " and (" + page.getFilter() + ")" : "(" + page.getFilter() + ")")) + page.getDataformid() + page.getType() + dataGroup); return page; } private String procssCompile(String where){ //参数值以@~KT LYJ@~这种情况且里面有空格则表示这个是组合查询需要转换:((MatCode like ' @~ KT aa LYJ @~ ' or matname like '@~KT LYJ@~' or special like '@~KT LYJ@~' or MatGroup like '@~KT LYJ@~' or MatGroupname like '@~KT LYJ@~' or BaseUOM like '@~KT LYJ@~' or brand like '@~KT LYJ@~' or stcode like '@~KT LYJ@~' or stname like '@~KT LYJ@~')) Pattern p = Pattern.compile("@~.*?@~"); Matcher m = p.matcher(where); String andStr=null; StringJoiner joiner=new StringJoiner(" or "); if (m.find()){ if(m.group().split("\\s+").length>1){ String op=""; if(where.indexOf("'"+m.group()+"'")>0){ //参数值是字符串 op="'"; } where=where.replaceAll("\\(","").replaceAll("\\)",""); String orStr=""; String[] strArry=where.split("\\band\\b"); orStr = strArry[0]; if(strArry.length>1) { andStr =strArry[1]; } String[] arry=orStr.split("\\bor\\b"); for(String str:arry){ String[] names=str.replaceAll("@~","").trim().split("like"); String[] values=names[1].trim().replaceAll("^'","").replaceAll("'$","").split("\\s+"); for(String val:values) { if(org.apache.commons.lang3.StringUtils.isNotBlank(val)) { joiner.add("("+names[0].trim()+" like "+op+val+op+")"); } } } where=" ("+joiner+(andStr==null?")":(") and ("+andStr+")")); } } return where; } public static String proessFilterInfo(String temp) { Pattern p = Pattern.compile("@_.*?\\w+_@"); Matcher m = p.matcher(temp); while (m.find()) {//存在 String result = m.group().replace("@_", "").replace("_@", ""); try { result = new String(Base64Utils.decode(result), "utf-8"); } catch (Exception e) { e.printStackTrace(); } temp = temp.replaceAll(m.group(), result); } return temp; } private String prossFormdatafilters(String filter, HttpServletRequest request) { if ("".equals(filter)) return filter; Pattern p = Pattern.compile("@.*?\\w+"); Matcher m = p.matcher(filter); while (m.find()) {//存在 filter = filter.replaceAll(m.group(), request.getSession().getAttribute(m.group().toLowerCase()) + ""); } return filter; } /*** * * 取得数据组权限 返回 " and user='ssss'" * fomrid 功能号 * flag 主从表 0 主表,1 从表 * **/ public String prossDataGroup(HttpServletRequest request, int formid, int flag) { HttpSession session = request.getSession(); String usercode = (String) session.getAttribute(SessionKey.USERCODE); if (usercode == null) throw new ApplicationException("获取数据组时用户代码为空"); return this.getDataGroupInfo(formid, usercode, flag, session); } /** * 调整3类型树传递过来的值 **/ public String setThreeType(String s, String dbid, HttpServletRequest request,String tableName) { if ("".equalsIgnoreCase(s)) return " 1=1 "; if (s.indexOf(";") < 0) { if (s.indexOf("#PA#") > 0) { //表示有树过滤条件要处理 String[] filter = s.split("#PA#"); TreeBean treeBean = new TreeBean(); //需要去掉多出来的) String str = filter[1]; boolean isendMark = false; if (filter[1].endsWith(")")) { str = filter[1].substring(0, filter[1].length() - 1); isendMark = true; } treeBean.setTreefilterstr(str.equalsIgnoreCase("-1") ? null : str); String filterstr = this.getTreeFilter(request, treeBean); return filter[0] + filterstr + (isendMark ? ")" : ""); } else { return s; } } String where = null;// ----树传过来的值#p#页面传过来的条件, String[] toal = s.split("#p#"); if (toal.length > 1) { where = toal[1]; if (where != null && !"".equalsIgnoreCase(where)) { if (where.trim().startsWith("and")) { where = org.apache.commons.lang3.StringUtils.substring(where.trim(),3); } } } //String[] temp = toal[0].split(";"); TreeBean treeBean = new TreeBean(); treeBean.build(toal[0]); String treeTableName = ""; List> list = null; String filterSql = null; try { SpObserver.setDBtoInstance("_" + dbid); if (Integer.parseInt(treeBean.getTreeFormType()) == 20) // 20表示需要读从表数据,其它读主表 treeTableName = gridService.getTableName3(Integer.parseInt(treeBean.getTreeFormid()), "dttable");// 取得树的表名 else treeTableName = gridService.getTableName3(Integer.parseInt(treeBean.getTreeFormid()), "hdtable");// 取得树的表名 //-------------------2013-1-4 lqc----------- list = gridService.getTreeRowid(treeBean.getTreeControl(), treeTableName); // gridService.getSimpleJdbcTemplate().queryForObject(""); } finally { SpObserver.setDBtoInstance(); } StringBuffer sb = new StringBuffer(); for (Map map : list) { String rowid = map.get("rowid").toString(); sb.append(" or treecontrol like '" + rowid + "%'"); } //---------------------end-------------- //---处理树过滤条件的sql条件 String treefilterstr = getTreeFilter(request, treeBean); int type = Integer.parseInt(treeBean.getClassType()); String st = ""; switch (type) { case 0://当前类 st = " exists(select 1 from " + treeTableName + " b where rowid = '" + treeBean.getTreeControl() + "' and b." + treeBean.getTreeNodeFiled() + " in (select list from getinstr("+tableName+"." + treeBean.getDetailNodeFiled() + ")) " + treefilterstr + ")"; break; case 1://含子类 st = " exists(select 1 from " + treeTableName + " b where (treecontrol like '" + treeBean.getTreeControl() + "%' " + sb.toString() + " ) and b." + treeBean.getTreeNodeFiled() + " in (select list from getinstr("+tableName+"." + treeBean.getDetailNodeFiled() + "))" + treefilterstr + ")"; break; case 2://所有 st = treeBean.getQuery() + treefilterstr; break; case 3://不含当前 st = " not exists(select 1 from " + treeTableName + " b where (treecontrol like '" + treeBean.getTreeControl() + "%') and b." + treeBean.getTreeNodeFiled() + " in (select list from getinstr("+tableName+"." + treeBean.getDetailNodeFiled() + "))" + treefilterstr + ")"; break; } String stra = ""; boolean flg = false; if (treeBean.getWhere() != null) {//3,30类型中格线执行过滤会传多一个参数 stra += st + " and " + treeBean.getQuery() + " " + treeBean.getWhere(); flg = true; } else {//正常的树调用 stra += st + " and " + treeBean.getQuery(); flg = true; } return !flg ? st + (where == null ? "" : " and " + where) : stra + (where == null ? "" : " and " + where); } public String getTreeFilter(HttpServletRequest request, TreeBean treeBean) { String treefilterstr = ""; CreateSQLFormatIfc createSQLFormatIfc = (CreateSQLFormatIfc) FactoryBean.getBean("createSQLFormatImpl"); SqlFormatEntity sqlFormatEntity = GridUtils.fromJson(treeBean.getTreefilterstr(), SqlFormatEntity.class); //树过滤条件固定读取的字段名称 if (sqlFormatEntity != null) { sqlFormatEntity.setFieldid("treefilterstr"); treefilterstr = createSQLFormatIfc.processSQLFormat(sqlFormatEntity); treefilterstr = " and " + this.prossFormdatafilters(treefilterstr, request); } return treefilterstr; } /** * 由于treegrid实现分页机制问题,不是表的情况查不到页总数,因此需要先把符合条件的数据查出来 **/ public void getFunc(Grid grid, HttpServletRequest request, HttpServletResponse resp, Page page) { env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); this.formID = grid.getFormID(); page.setWhere(grid.getWhere()); page.setFlag(grid.getFlag()); flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; page.setDataGroup(prossDataGroup(request, this.formID, Integer.parseInt(this.flag))); String[] t = splitTable(grid.getWinType(), dbid); page.setTableName(t[0]); page.setParms(t[1]); page.setSql(this.exprTOSql(page, page.getSql())); //page.setOrderBy(grid.); //grid.getField() page.setAutopaging(1);//表示为初始打开,不需要查询数据,只取总记录数 try { SpObserver.setDBtoInstance("_" + dbid); page.setUserCode(request.getSession().getAttribute(SessionKey.USERCODE)+""); page.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); gridService.loadAllByFunc(page, local.get(), false);// 第二步,调用相对应业务类取得数据 原来true 现在用了分页功能,所以不需要,设置回flase } catch (Exception ex) { this.print(resp, this.getErrorMsg(ex)); } finally { SpObserver.setDBtoInstance(); env = null; local.remove(); } } /** * 18类型窗体调用函数 */ @RequestMapping(params = "m=func") public void loadByFunc(Grid grid, HttpServletRequest request, HttpServletResponse resp) { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); Page page = this.setPageInfoTree(request);// 第一步,照写 env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); this.formID = grid.getFormID(); page.setFlag(grid.getFlag()); if (-1 == page.getFlag()&& org.apache.commons.lang3.StringUtils.isNotBlank(grid.getTGData())){ //执行导出操作,需要从grid里取得TGData数据 page = JOSNUtils.getPage(request, JOSNUtils.prossBase64(grid.getTGData())); page.setFlag(grid.getFlag()); } page.setWhere(grid.getWhere()); flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; page.setDataGroup(prossDataGroup(request, this.formID, Integer.parseInt(this.flag))); String[] t = splitTable(grid.getWinType(), dbid); page.setTableName(t[0]); page.setParms(t[1]); page.setPicFild(grid.getPicFild()); page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setSql(this.exprTOSql(page, page.getSql())); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page.setIsTree(grid.getIsTree()); page.setTbCols(grid.getTbCols()); page.setAutopaging(grid.getAutopaging()); page.setType(grid.getWinType(), grid.getFormID()); //---写入到最近浏览记录,非单据类型 if(request.getHeader("x-app-type")!=null) { String formName=page.getFormName(); String where_str=org.apache.commons.lang3.StringUtils.isNotBlank(page.getWhere()) ? Base64.getEncoder().encodeToString(("where="+page.getWhere()).getBytes(StandardCharsets.UTF_8)) : null; appController.execRecentAccessFormid(new RecentAccessEntity( env.get(SessionKey.USERCODE)+"", env.get(SessionKey.USERNAME)+"", formID, 18, where_str, formName, null, dbid )); } //------ try { if (-1 == page.getFlag()) page.setPageSize(MAX_RECORD); if (this.isShowTree(dbid) && -1 != page.getFlag()) { page.setPageSize(MAX_RECORD); page.setFlag(-20);//表示为需要显示树形,所以需要把所有数据取出来,不分页 } try { SpObserver.setDBtoInstance("_" + dbid); page.setUserCode(request.getSession().getAttribute(SessionKey.USERCODE)+""); page.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); gridService.loadAllByFunc(page, local.get(), false);// 第二步,调用相对应业务类取得数据 } finally { SpObserver.setDBtoInstance(); } printDate(grid, request, resp, page, dbid); } catch (Exception e) { e.printStackTrace(); if(request.getHeader("x-app-type")!=null) { CallBackMessage callBackMessage=new CallBackMessage(); callBackMessage.sendErrorMessage(this.getErrorMsg(e)); this.printJson(resp, JSON.toJSONString(callBackMessage.toJSONObject())); }else { this.print(resp, this.getErrorMsg(e)); } } finally { page = null; env = null; grid = null; local.remove(); } } public void printDate(Grid grid, HttpServletRequest request, HttpServletResponse resp, Page page, String dbid) { if (-1 == page.getFlag()) {//导出excel //取面板的数据 String pd = ""; //if("1".equalsIgnoreCase(flag)){ try { String path = request.getSession().getAttribute(SessionKey.REAL_PATH) + "/" + formID + "/" + getFormType(grid) + "/panel_data"; File file = new File(path); if (file.exists()) { pd = FileUtil.readFile(path);//面板 } } catch (Exception e) { } Map map = null; if (pd.length() > 0) {//格式:内容-表名-字段-字段位置(列,行;列,行),(内容是指标题或有动态标题需要对应的字段) String fields = pd.split("-")[2];//取字段名查询 List plist = new ArrayList(); ;//面板数据 Map m = new HashMap(); String[] tes = JOSNUtils.prossBase64(grid.getWhere()).split("\\band\\b"); for (String s : tes) { String[] ss = s.split("="); m.put(ss[0].trim().toLowerCase(), ss[1].replaceAll("'", "")); } plist.add(m); map = new HashMap(); map.put("plist", plist); map.put("desc", pd); } // if (this.isShowTree(dbid)) {//表示是树形显示内容,需要格式化导出 prossTree2Execl(page); } this.print2Excel(request, resp, page, map, this.formID, getFormType(grid));// 第三步,通过Response向页面输出Page类数据为excel } else { if (request.getHeader("x-app-type") != null) { List list = page.getData(); if (list.size() > 0) { ((Map) list.get(0)).put("_RowNo", page.getTbColsOut()); } this.print(resp, GridUtils.toJson(list)); } else { String content = this.prossTree(page, request); this.print(resp, content); } } } private Page getProc(Grid grid, HttpServletRequest request, HttpServletResponse resp, Page page) { this.formID = grid.getFormID(); page.setWhere(grid.getWhere()); page.setFlag(grid.getFlag()); flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; page.setDataGroup(prossDataGroup(request, this.formID, Integer.parseInt(this.flag))); String[] t = splitTable(grid.getWinType(), dbid); page.setTableName(t[0]); page.setParms(t[1]); page.setSql(this.exprTOSql(page, page.getSql())); page.setOrderBy(grid.getField()); try { SpObserver.setDBtoInstance("_" + dbid); gridService.loadAllByPROC(page, env,true);// 第二步,调用相对应业务类取得数据 } finally { SpObserver.setDBtoInstance(); } return page; } /** * 19类型窗体调用存储过程 */ @RequestMapping(params = "m=proc") public void loadByProc(Grid grid, HttpServletRequest request, HttpServletResponse resp) { CurrentLocal.setCurrentDoccode(this.doccode);// 何晴需要用 CurrentLocal.setCurrentFormid(grid.getFormID() + ""); Page page = this.setPageInfoTree(request);// 第一步,照写 env = this.initEnv(request, this.formID, this.doccode, false); local.set(env); this.formID = grid.getFormID(); page.setWhere(grid.getWhere()); page.setFlag(grid.getFlag()); flag = grid.getWinType().split("\\|")[1];//表示当前是主表还是从表 String dbid = request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + ""; page.setDataGroup(prossDataGroup(request, this.formID, Integer.parseInt(this.flag))); String[] t = splitTable(grid.getWinType(), dbid); page.setTableName(t[0]); page.setParms(t[1]); page.setPicFild(grid.getPicFild()); page.setIsCp(grid.getCp()); page.setPageSize(grid.getPageSize()); page.setSql(this.exprTOSql(page, page.getSql())); page.setSql(this.cssexprTOSql(page.getCssexpr(), page.getSql(), "_cssexpr")); page.setSql(this.cssexprTOSql(page.getTipsexpr(), page.getSql(), "_tipsexpr")); page.setFormid(grid.getFormID()); //---写入到最近浏览记录,非单据类型 if(request.getHeader("x-app-type")!=null) { String formName=page.getFormName(); String where_str=org.apache.commons.lang3.StringUtils.isNotBlank(page.getWhere()) ? Base64.getEncoder().encodeToString(("where="+page.getWhere()).getBytes(StandardCharsets.UTF_8)) : null; appController.execRecentAccessFormid(new RecentAccessEntity( env.get(SessionKey.USERCODE)+"", env.get(SessionKey.USERNAME)+"", formID, 19, where_str, formName, null, dbid )); } //------ try { if (-1 == page.getFlag()) page.setPageSize(MAX_RECORD); page.setUserCode(request.getSession().getAttribute(SessionKey.USERCODE)+""); page.setUserName(request.getSession().getAttribute(SessionKey.USER_NAME)+""); SpObserver.setDBtoInstance("_" + dbid); page.setPROC_NAME("SP_viewPageV3"); gridService.loadAllByPROC(page, local.get(),false);// 第二步,调用相对应业务类取得数据 printDate(grid, request, resp, page, dbid); } catch (DataAccessException e) { this.print(resp, this.getErrorMsg(e)); } finally { SpObserver.setDBtoInstance(); } } /** * 把字符串进行分割处理 * * @param String field 形式:frptmatstorage|companyid;stcode;matcode; * @return String 形式:frptmatstorage */ private String[] splitTable(String winType, String dbid) { String name = ""; try { SpObserver.setDBtoInstance("_" + dbid); name = gridService.getTableName(this.formID, winType); } finally { SpObserver.setDBtoInstance(); } String[] temp = null; if (name.indexOf("|") > -1) { temp = name.split("\\|"); if (temp.length < 2) throw new ApplicationException("参数不全,【|】分隔符后面没参数"); } else temp = new String[]{name, ""}; return new String[]{temp[0], temp[1]}; } /** * 把页面传过来的主键列进行分割处理再组合page类的sql * * @param String field 形式:a|b|c * @return String 形式:a asc,b asc,c asc */ private String FieldsTOSql(String field, String st) { if (st == null || "".equalsIgnoreCase(st)) return ""; String[] temp = field.split("\\|"); String orderby = ""; for (String str : temp) { if (getColumnNum(str, st)) { continue; } if (!"".equalsIgnoreCase(str)) orderby += "[" + str + "],"; } return orderby + st; } /** * 查找7类型过滤条件进行组装成where条件 */ private String getTypeInfo7(int formid, String where, String dbid) { // where="cltname='' and beginday='2011-7-2' and cltcode='' and aa='' and bb='' and matcode='' and orther='' and endday='2011-7-29' and doccode='' "; // 处理77类型格线增加的参数 是以'分隔 String temp = ""; if (where.indexOf("'") > 0) { String[] ts = where.split("'"); temp = " and " + ts[1]; where = ts[0]; } if (where.indexOf("@F@") >= 0) {//格线过滤功能需要用到 String[] ts = where.split("@F@"); if (ts.length > 1) temp = ts[1]; where = ts[0]; } //解码where try { if (org.apache.commons.codec.binary.Base64.isBase64(where)) { where = EncodeUtil.base64Decode(where);//base64解密所有请求where参数 //if(org.apache.commons.codec.binary.Base64.isBase64(where)) where=temp; } else { where = java.net.URLDecoder.decode(where, "utf-8"); } } catch (Exception e) { where = where; } List> list = null; try { SpObserver.setDBtoInstance("_" + dbid); list = gridService.getFilter7(formid); }catch (Exception e){ throw e; }finally { SpObserver.setDBtoInstance(); } StringBuilder s = new StringBuilder();// 过滤组装后的where条件 s.append(" 1=1 "); if (list != null) { for (Map map : list) { if (map == null) continue; if (!"and".equalsIgnoreCase(((String) map.get("ConFlag")).trim())) s.append(" ").append(map.get("JoinFlag")).append(" "); String val = this.putValue(map, where); if ("".equalsIgnoreCase(val) || val == null) {// 空值时 if ("between".equalsIgnoreCase(((String) map.get("ConFlag")).trim())) s.append("((1=1 or 1 <> 1)) and "); else s.append("((1=1 or 1 <> 1))"); } else {// 有值时 if (!"and".equalsIgnoreCase(((String) map.get("ConFlag")).trim())) { s.append(" ").append(map.get("Fieldid")).append(" "); } if (map.get("NotFlag") != null && (Integer) map.get("NotFlag") == 1) s.append(" not ");// 取反 s.append(" ").append(map.get("ConFlag")).append(" "); if ("2".equalsIgnoreCase((String) map.get("FieldDatatype"))) s.append(val.replaceAll("'", "")); else { if ("like".equalsIgnoreCase((String) map.get("ConFlag"))) s.append("'%" + val.replaceAll("'", "").trim() + "%' ");//增加前面也加上% else s.append(val); } } } } list = null; return s.toString() + temp; } /** * 把面板传过来的where的值写到对应字段,以组成过条件 **/ private String putValue(Map map, String where) { String result = ""; String[] temp1 = where.split("\\band\\b"); for (String s : temp1) { String[] ss = s.split("="); if (ss[0].replaceAll("\\s+", "").equalsIgnoreCase(((String) map.get("CtrlFldid")).toLowerCase())) { if (!"''".equalsIgnoreCase(ss[1].replaceAll("\\s+", ""))) { result = ss[1]; break; } else { result = (String) map.get("DefValue"); break; } } } temp1 = null; return "''".equalsIgnoreCase(result) ? "" : result; } @RequestMapping(params = "m=c") public void check(int formid, int v, HttpServletRequest request, HttpServletResponse resp) { try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); int n = gridService.getJdbcTemplate().queryForObject("select version from gform where formid=?", new Object[]{formid}, Integer.class); if (n > v) { buildFunc b = (buildFunc) FactoryBean.getBean("buildFunc"); request.setAttribute("flaa", false); request.setAttribute("formID", formid + ""); // request.setAttribute("isver","1"); b.formTypeDistribute(request, resp); this.print(resp, "1"); } } catch (Exception e) { } finally { SpObserver.setDBtoInstance(); } } }