package com.yc.service.build.type.v2; import com.yc.action.grid.GridUtils; import com.yc.action.grid.TreeGridIfc; import com.yc.service.BaseService; import com.yc.service.build.BuildFuncIfc; import com.yc.service.build.top.v2.BuildTopIfc; import com.yc.service.commons.GformIfc; import com.yc.service.impl.DBHelper; import com.yc.service.panel.v2.PanelServiceIfc; import com.yc.utils.HtmlUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.stereotype.Service; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * 窗体类型生成基类V2 * by danaus 2020/2/13 17:47 */ @Service("VbaseImpl") public class BaseImpl extends BaseService implements BaseIfc { @Autowired protected BuildFuncIfc BFI; @Autowired protected TreeGridIfc treeGrid; @Autowired protected GformIfc gformIfc; @Autowired private BuildTopIfc buildTopIfc; @Autowired protected PanelServiceIfc pIfc; public static String BEAN_INFO = "beaninfo"; private static String GFORM_SQL = " isTitle,formname,showdetail,isopenFuncshowpwdedit,isshowpwdedit,optype,HDTable,version,dataformid,formdatafilters,panellabellayout,CancelBtnProcName,CancelBtnExpression,CancelBtnEditStatus,CancelBtnName,RevokeBtnProcName,RevokeBtnExpression,RevokeBtnEditStatus,isShowOnlineMsg,isShowProcessTracking,autoOpen,predocstatus,procgroupaftersavedoc,dealafterdocsave,transgroupcode,dttable,isShowNewDocButton,isshowinserialbtn,inserialbtneditstatus,isshowoutserialbtn ,outserialbtneditstatus,isshowonlinepaymentbutton,isshowgridstyleforapp "; protected Map getGformInfo(String formid) { return gformIfc.getGformInfo(GFORM_SQL, Integer.parseInt(formid)); } // public String getTitle() { // return "【<%=session.getAttribute(\""+SessionKey.USERNAME+"\")%>】" + this.formName[0] + "-" + this.formID; // } // // public String getTitle2() {// 针对5,8,16类型 // return "【<%=session.getAttribute(\""+SessionKey.USERNAME+"\")%>】" + this.formName[1] + "-" + this.formID; // } // 查找哪些功能号把当前功能号作为主表使用 // 格式:引用的功能号|外表的关联字段;当前表的关联字段,...... protected String[] getPrIndex(String formid, List> list, String type) { String ind = ""; int index = 0; for (Map map : list) { if (type.equalsIgnoreCase((Integer) map.get("formtype") + "") && !formid.equalsIgnoreCase((Integer) map.get("formid") + "")) { index++; if (formid.equalsIgnoreCase((Integer) map.get("FT") + "")) { ind += "T_" + map.get("formid") + "|" + ((((String) map.get("SeekGroupID")).split(";").length > 1) ? ((String) map.get("SeekGroupID")).split(";")[1] : "") + ";" + ((((String) map.get("FK")).split(";").length > 1) ? ((String) map.get("FK")).split(";")[1] : "") + ","; } } } return new String[]{(ind != "" || !ind.isEmpty()) ? ind.substring(0, ind.length() - 1) : "", index + ""}; } // 去除字符串中的换行符等 public String replaceBlank(String str) { if (str == null) { return ""; } Pattern p = Pattern.compile("\t|\r|\n"); Matcher m = p.matcher(str); return m.replaceAll(""); } @Override public int build(BaseBean baseBean) throws Exception { return 0; } protected Map init(BaseBean baseBean) { Map gformInfo = this.getGformInfo(baseBean.getFormID()); gformInfo.put(BEAN_INFO, baseBean);//把传进去的参数值加到map,再传给各个方法调用,避免出现并发问题 return gformInfo; } protected String getValue(Map map, String col) { return (map.get(col) == null) ? "" : map.get(col).toString(); } protected String getValueInt(Map map, String col) { return (map.get(col) == null) ? "0" : map.get(col).toString(); } protected String getToPath(BaseBean baseBean) { String path1 = ""; try { path1 = baseBean.URI + File.separator + "app" + File.separator + BFI.getPath(baseBean.formID, baseBean.type, baseBean.versionId, baseBean.dataBaseId, baseBean.language) + File.separator; } catch (Exception e) { e.printStackTrace(); } return path1; } /** * 根据是否存在主功能号做相应的处理 * * @return */ private String getFormidCreate(BaseBean baseBean) { if (baseBean.mainformid != null) return baseBean.mainformid + "_" + baseBean.formID; else return baseBean.formID; } /** * 生成panel页面 * * @throws Exception */ public void buildPanel(Map gformInfo) throws Exception { BaseBean baseBean = (BaseBean) gformInfo.get(BEAN_INFO); String fileName = "panel.jsp"; String[] data = new String[2]; data[0] = FileUtils.readFileToString(new File(getBuildPath(baseBean) + fileName), "utf-8"); data[1] = FileUtils.readFileToString(new File(getTemPath(baseBean) + "panelControl.jsp"), "utf-8"); // ---------------- Map map = pIfc.getPanelHtml(Integer.parseInt(baseBean.formID), baseBean.type, data, gformInfo); buildPageCode(map.get("panHTML"), fileName, baseBean); buildPageCode(map.get("panelControl"), "panelControl" + baseBean.formID + ".jsp", baseBean); if(map!=null&&map.get("zhu")!=null){ baseBean.zhu=map.get("zhu"); } } /** * --生成功能号时,要检查单据表头必须的字段是否存在,如果不存在,则需要新增 xin 2022-3-14 09:28:17 */ public void getDoesItExist(Integer formId){ try { String sql="--生成功能号时,要检查单据表头必须的字段是否存在,如果不存在,则需要新增\n" + " --Author : Johns Wang,2022-03-11 \n"+ " set nocount on \n" + " declare @tableName varchar(50) ,@formid int =" +formId+" \n"+ " declare @sql nvarchar(max) = ' set nocount on; '\n" + " declare @fieldid varchar(50),@fieldtype varchar(50)\n" + " declare @objName varchar(50) ,@createOrAlter varchar(50)\n" + " declare @uploadFieldId varchar(2000),@formType int\n" + " if isnull(@formid,0) = 0 \n" + " begin \n" + " raiserror('请传递@formid参数',16,1) \n" + " return \n" + " end \n" + " select @formType = formType from _sysmenu a where a.formid = @formid \n" + " if @@ROWCOUNT = 0 \n" + " begin \n" + " raiserror('请在9810功能号中为此功能号%d设置菜单',16,1,@formid) \n" + " return \n" + " end \n" + " if @formtype not in (5,9,8,15,16,17,496,497,498,499) \n" + " begin \n" + " raiserror('请在9810功能号中为此功能号%d设置【窗体类型】,肯该字段值只能是【5,9,8,15,16,17,496,497,498,499】',16,1,@formid) \n" + " return \n" + " end \n" + " select @tableName = a.hdtable \n" + " from gform a \n" + " join INFORMATION_SCHEMA.TABLES c on a.hdtable = c.TABLE_NAME \n" + " where a.formid = @formid \n" + " and c.TABLE_TYPE = 'BASE TABLE' \n" + " and isnull(a.hdtable,'') <> '' \n" + " if @@ROWCOUNT = 0 or isnull(@tableName,'') = '' return \n" + " declare mycurFieldType cursor for \n" + " select fieldid,fieldtype \n" + " from _sys_DocTableExistsField where TableType = '单据主表' \n" + " order by num asc \n" + " open mycurFieldType \n" + " fetch next from mycurFieldType into @fieldid,@fieldtype \n" + " while @@FETCH_STATUS = 0 \n" + " begin \n" + " if not exists(select 1 from INFORMATION_SCHEMA.COLUMNS a where a.TABLE_NAME = isnull(@tableName,'') and a.COLUMN_NAME = isnull(@fieldid,'')) \n" + " begin \n" + " set @sql = isnull(@sql,'') + ' alter table ' + isnull(@tableName,'') + ' add ' + isnull(@fieldid,'') + ' ' + isnull(@fieldtype,'') +'; ' \n" + " end \n" + " fetch next from mycurFieldType into @fieldid,@fieldtype\n" + " end \n" + " close mycurFieldType\n" + " deallocate mycurFieldType \n" + " if isnull(@sql,'') <> ''\n" + " begin\n" + " exec(@sql)\n" + " end \n" + " set @sql = ' set nocount on; declare @StatisID int ; ' +char(13)+\n" + " ' if not exists(select 1 from INFORMATION_SCHEMA.COLUMNS a where a.TABLE_NAME = ''' + isnull(@tableName,'') + ''' and a.COLUMN_NAME = ''DocVersion'') '+char(13)+\n" + " ' and exists(select 1 from INFORMATION_SCHEMA.COLUMNS a where a.TABLE_NAME = ''' + isnull(@tableName,'') + ''' and a.COLUMN_NAME = ''DocCode'') ' + char(13)+\n" + " ' begin ' + char(13)+\n" + " ' alter table ' + isnull(@tableName,'') + ' add DocVersion int ' + char(13)+\n" + " ' end ' + char(13) +\n" + " ' if exists(select 1 from INFORMATION_SCHEMA.COLUMNS a where a.TABLE_NAME = ''' + isnull(@tableName,'') + ''' and a.COLUMN_NAME = ''DocVersion'')'+char(13)+\n" + " ' begin \n" + " if not exists(select 1 from gfield where formid = ' + cast(isnull(@formid,0) as varchar(20)) + ' and headflag = 0 and fieldid = ''DocVersion'') \n" + " begin \n" + " select @StatisID = max(StatisID) from gfield where formid = ' + cast(isnull(@formid,0) as varchar(20)) + ' and headflag = 0 \n" + " insert into gfield(formid,headflag,fieldid,fieldname,statisId,DataLink,isLoad,MasterFieldShowLocation)\n" + " values('+cast(isnull(@formid,0) as varchar(20)) + ',0,''DocVersion'',''单据版本号'',cast(isnull(@StatisID,0) as varchar(20)) ,1,1,0 )\n" + " end \n" + " end '\n" + " if isnull(@sql,'') <> ''\n" + " begin\n" + " exec(@sql)\n" + " end \n" + " if exists(select 1 from INFORMATION_SCHEMA.COLUMNS a where a.TABLE_NAME = isnull(@tableName,'') and a.COLUMN_NAME = 'DocVersion')\n" + " begin \n" + " set @objName = isnull(@tableName,'') + 'UpdateDocVersion'\n" + " if OBJECT_ID(isnull(@objName,'')) is null \n" + " begin\n" + " set @createOrAlter = ' create '\n" + " end else \n" + " begin\n" + " set @createOrAlter = ' alter '\n" + " end \n" + " set @uploadFieldId = 'not UPDATE(DocVersion)'\n" + " select @uploadFieldId = isnull(@uploadFieldId,'') + case when isnull(@uploadFieldId,'') <> '' then ' and ' else '' end \n" + " + 'not UPDATE(' + isnull(fieldid,'') + ')' \n" + " from gfield where formid = @formid and headflag = 0 and ControlType = 9 \n" + " select @uploadFieldId = isnull(@uploadFieldId,'') + case when isnull(@uploadFieldId,'') <> '' then ' and ' else '' end \n" + " + 'not UPDATE(' + isnull(fieldid,'') + ')' \n" + " from gfield where formid = @formid and headflag = 0 and ControlType = 19\n" + " set @sql = isnull(@createOrAlter,'') + ' trigger [dbo].['+ isnull(@objName,'') + '] on [dbo].['+ isnull(@tableName,'') + '] after update \n" + " --目的:单据表头更新时,将版本号 DocVersion 字段值自动+1, 此触发器脚本为自动生成,请不要尝试修改它 \n" + " --Author : Johns Wang,' + convert(varchar(19),getdate(),120) + '\n" + " as\n" + " begin \n" + " set nocount on\n" + " declare @DocVersionTable table(DocCode varchar(50) primary key,DocVersion int) ' + char(13)+\n" + " case when isnull(@uploadFieldId,'') <> '' then ' if ' + isnull(@uploadFieldId,'') else '' end +char(13)+\n" + " --if not UPDATE(DocVersion) --不能加此条件,因为加了之后,如果更新DocVersion字段时,同时更新其它字段,则会导致DocVersion不能自动+1\n" + " ' begin\n" + " insert into @DocVersionTable (DocCode,DocVersion)\n" + " select DocCode,DocVersion from inserted \n" + " --int 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。\n" + " update a set DocVersion = 0 from @DocVersionTable a where DocVersion > 2147483000 --避免数字溢出\n" + " update a set DocVersion = isnull(b.DocVersion,0) + 1 from '+isnull(@tableName,'')+' a join @DocVersionTable b on a.DocCode = b.DocCode \n" + " end \n" + " end '\n" + " if isnull(@sql,'') <> ''\n" + " begin\n" + " exec(@sql)\n" + " end \n" + " end \n"; jdbcTemplate.update(sql); }catch (Exception e){ throw e; } } protected String getDomainUrl(BaseBean baseBean) { if (baseBean.hostUrl == "") return ""; String str = HtmlUtil.getDomain(baseBean.hostUrl); int inx = str.indexOf("."); if (inx == -1) { int y = str.indexOf(":"); return y == -1 ? str : str.substring(0, y); } return str.substring(0, inx); } /** * 生成主页面 * * @throws Exception */ public void buildIndex(Map gformInfo) throws Exception { BaseBean baseBean = (BaseBean) gformInfo.get(BEAN_INFO); String fileName = "index.jsp"; String data = getPageCode(fileName, baseBean); //--------从gform表获取是否显示大标题字段值(isTitle)判断是否显示大标题,并替换标识符-2012-02-20-syz--------[begin]---------------------- if (GridUtils.prossRowSetDataType_Int(gformInfo, "isTitle") == 1) {//如果配置了显示大标题 String TopAndTitle_str = "\n" + "\n" + "\n" + // "\n" + // "\n" + // "\n" + "\n" + "
\n" + "
[?title]
\n" + "
\n" + // "
\n" + // "
\n" + "
\n" + "\t\t\t<%@ include file=\"top.jsp\" %>\n" + "\t\t
\n" + "
\n"; data = data.replace("[?TopAndTitle]", TopAndTitle_str);//替换功能号标识符 } else {//如果没有配置显示大标题 String TopAndTitle_str = "
\n" + "\t\t\t<%@ include file=\"top.jsp\" %>\n" + "
\n"; data = data.replace("[?TopAndTitle]", TopAndTitle_str);//替换功能号标识符 } //--------从gform表获取是否显示大标题字段值(isTitle)判断是否显示大标题,并替换标识符-2012-02-20-syz-----[end]-------------------------// // ---------------- data = data.replace("[?title]", gformInfo.get("formname") + ""); data = data.replaceAll("@gridJsp@", baseBean.formID + "_grid.jsp"); data = data.replace("[?treewidth]", gformInfo.get("treewidth")+""); buildPageCode(data, fileName, baseBean); } /** * 生成foolter页面(资源释放页) * * @throws Exception */ public void buildFoolter(BaseBean baseBean) throws Exception { String fileName = "foolter.jsp"; String data = getPageCode(fileName, baseBean); // ---------------- buildPageCode(data, fileName, baseBean); } /** * 生成Grid页面 * * @throws Exception */ public void buildGrid(BaseBean baseBean) throws Exception { treeGrid.createGrid(baseBean.type, Integer.parseInt(baseBean.formID), baseBean.URI, "app/" + baseBean.gPath + "/", new String[]{baseBean.formID + "_grid.jsp"}, getTemPath(baseBean), "/" + baseBean.formID + "/" + baseBean.type + "/", null, baseBean.dataBaseId); } /** * 生成js css 导入的页面 * * @throws Exception */ protected void buildJsCssHead(BaseBean baseBean) throws Exception { String fileName = "jsCssHead.jsp"; String data = getPageCode(fileName, baseBean); buildPageCode(data, fileName, baseBean); } /** * 生成帮助页面 * * @throws Exception */ public void buildHelpPage(Map gformInfo) throws Exception { BaseBean baseBean = (BaseBean) gformInfo.get(BEAN_INFO); buildTopIfc.build(Integer.parseInt(baseBean.formID), baseBean.type, getTemPath(baseBean) + "help.jsp", getToPath(baseBean) + "help.jsp", gformInfo, this); } /** * 生成top页面 * * @throws Exception */ public void buildTop(Map gformInfo) throws Exception { BaseBean baseBean = (BaseBean) gformInfo.get(BEAN_INFO); buildTopIfc.build(Integer.parseInt(baseBean.formID), baseBean.type, getBuildPath(baseBean) + "top.jsp", getToPath(baseBean) + "top.jsp", gformInfo, this); } @Override public void buildPageCode(String data, String targetFileName, BaseBean baseBean) throws Exception { File file = new File(baseBean.URI + File.separator + "app" + File.separator + BFI.getPath(baseBean.formID, baseBean.type, baseBean.versionId, baseBean.dataBaseId, baseBean.language) + File.separator); //处理上传控件需要增加js,css的导出,根据功能号是否设置有9,19,40控件决定加不加上这些页面,从而优化页面加载 by danaus 17-11-23 //根据formid查找9802中是不是有包括上面所说的控件,有则加载。 SqlRowSet row = this.getRowSet(" set nocount on ; select count(1) as a from gfield where formid=" + baseBean.formID + " and (gridcontroltype in(9,19,40) or controltype in(9,19,40))"); row.next(); int num = row.getInt(1); String js_css = "\n"; js_css += "\">\n" + "\">\n" + "\n" + "\n"; if (num != 0) {//表示存在有上传控件 js_css += // "\">\n" + // "\">\n" + // "\">\n" + // "\n" + // "\n" + // "\n"; "\">\n" + "\">\n" + "\n" + "\n" + ""; } data = data.replace("@_add_js_css_@", js_css); if (!file.exists() || !file.isDirectory()) file.mkdirs(); file = new File(file.getPath() + File.separator + targetFileName); FileUtils.writeStringToFile(file, data, "utf-8"); } @Override public String getPageCode(String templateFileName, BaseBean baseBean) throws IOException { return FileUtils.readFileToString(new File(baseBean.URI + File.separator + "public" + File.separator + "template" + File.separator + baseBean.versionId + File.separator + baseBean.type + File.separator + templateFileName), "utf-8"); } @Override public String toString(Object str) { return str == null ? "" : str.toString(); } @Override public String getBuildPath(BaseBean baseBean) { return getTemPath(baseBean) + baseBean.type + File.separator; } public String getTemPath(BaseBean baseBean) { return baseBean.URI + File.separator + "public" + File.separator + "template" + File.separator + baseBean.versionId + File.separator; } /** * 生成jsp数据处理头页面 * * @throws Exception */ public String buildDataHead(Map gformInfo) throws Exception { BaseBean baseBean = (BaseBean) gformInfo.get(BEAN_INFO); String fileName = "dataHead.jsp"; String tmpJsp = getPageCode(fileName, baseBean); tmpJsp = tmpJsp.replace("[?formId]", baseBean.formID); tmpJsp = tmpJsp.replace("[?table]", toString(gformInfo.get("HDTable"))); tmpJsp = tmpJsp.replace("[?formType]", baseBean.type + ""); tmpJsp = tmpJsp.replace("[?canelProc]",toString(gformInfo.get("CancelBtnProcName")));//取消确认 tmpJsp = tmpJsp.replace("[?revokeProc]",toString(gformInfo.get("RevokeBtnProcName")));//撤回 tmpJsp= tmpJsp.replace("[?zhu]", baseBean.zhu); tmpJsp = tmpJsp.replace("[?sousuo]", baseBean.sous); tmpJsp = tmpJsp.replace("@doc", baseBean.doc); tmpJsp = tmpJsp.replace("@id_info", baseBean.id_info); tmpJsp = tmpJsp.replace("[?predocstatus]", gformInfo.get("predocstatus") + ""); tmpJsp = tmpJsp.replace("[?isShowOnlineMsg]", gformInfo.get("isShowOnlineMsg") + ""); tmpJsp = tmpJsp.replace("[?isShowProcessTracking]", gformInfo.get("isShowProcessTracking") + ""); tmpJsp = tmpJsp.replace("[?isOpenFuncShowPwdEdit]", toString(gformInfo.get("isopenFuncshowpwdedit"))); tmpJsp = tmpJsp.replace("[?version]", ("".equalsIgnoreCase(toString(gformInfo.get("version"))) ? "0" : toString(gformInfo.get("version")))); // 序列号扫码 xin 2021-8-2 17:45:43 //入库 tmpJsp = tmpJsp.replace("[?isshowinserialbtn]", DBHelper.getValueInt(gformInfo,"isshowinserialbtn")+""); tmpJsp = tmpJsp.replace("[?inserialbtneditstatus]", DBHelper.getValue(gformInfo,"inserialbtneditstatus")); //出库 tmpJsp = tmpJsp.replace("[?isshowoutserialbtn]", DBHelper.getValueInt(gformInfo,"isshowoutserialbtn")+""); tmpJsp = tmpJsp.replace("[?outserialbtneditstatus]", DBHelper.getValue(gformInfo,"outserialbtneditstatus")); //农行支付收付款控制 xin 2021-8-23 14:30:39 //在线收 tmpJsp = tmpJsp.replace("[?isshowonlinepaymentbutton]", DBHelper.getValueInt(gformInfo,"isshowonlinepaymentbutton")+""); //--操作类型 if (gformInfo.get("optype") != null && !StringUtils.isBlank(gformInfo.get("optype").toString())) { tmpJsp = tmpJsp.replace("[?formOptType]", gformInfo.get("optype").toString().equalsIgnoreCase("0") ? "-1" : gformInfo.get("optype").toString()); } else { tmpJsp = tmpJsp.replace("[?formOptType]", "-1"); } tmpJsp = replaceGform(tmpJsp, gformInfo); buildPageCode(tmpJsp, fileName, baseBean); return tmpJsp; } public String replaceGform(String tmpJsp, Map formInfo) { String dataformid = DBHelper.getValue(formInfo, "dataformid"); tmpJsp = tmpJsp.replaceAll("#dataformid#", (dataformid.equals("")) ? "" : ("," + dataformid));//" or formid in(" + dataformid + ")" String formdatafilters = DBHelper.getValue(formInfo, "formdatafilters"); tmpJsp = tmpJsp.replaceAll("#formdatafilters#", (formdatafilters.equals("")) ? "" : " and " + formdatafilters); return tmpJsp; } public String trim(Object str) { if (str == null) { return ""; } return str.toString().trim().replaceAll("\\r\\n|\\n|\\r", ""); } }