| | |
| | | package com.vci.web.service.impl; |
| | | |
| | | import com.sun.jnlp.ApiDialog; |
| | | import com.vci.client.mw.ClientContextVariable; |
| | | import com.vci.common.qt.object.QTConstants; |
| | | import com.vci.common.utility.ObjectUtility; |
| | | import com.vci.corba.common.PLException; |
| | | import com.vci.corba.portal.PortalService; |
| | | import com.vci.corba.portal.data.*; |
| | | import com.vci.model.PLDefination; |
| | | import com.vci.pagemodel.PLDefinationVO; |
| | | import com.vci.pagemodel.PLUILayoutCloneVO; |
| | | import com.vci.starter.web.exception.VciBaseException; |
| | | import com.vci.starter.web.pagemodel.BaseQueryObject; |
| | | import com.vci.starter.web.pagemodel.BaseResult; |
| | | import com.vci.starter.web.pagemodel.DataGrid; |
| | | import com.vci.starter.web.pagemodel.SessionInfo; |
| | | import com.vci.starter.web.util.VciBaseUtil; |
| | |
| | | import com.vci.web.util.Func; |
| | | import com.vci.web.util.PlatformClientUtil; |
| | | import com.vci.web.util.UITools; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.NoArgsConstructor; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.swing.*; |
| | | import javax.swing.text.JTextComponent; |
| | | import java.io.IOException; |
| | | import java.util.Arrays; |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.regex.Pattern; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * UI定义服务界面相关接口 |
| | |
| | | */ |
| | | @Resource |
| | | private PlatformClientUtil platformClientUtil; |
| | | |
| | | /** |
| | | * 日志 |
| | | */ |
| | |
| | | try { |
| | | //ui上下文对象校验 |
| | | canContinue(pluiLayout); |
| | | |
| | | String code = pluiLayout.plCode; |
| | | String name = pluiLayout.plName; |
| | | boolean isExist = nameOrCodeIsExist(pluiLayout, false); |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean delUIContextData(String[] oids) throws PLException { |
| | | public boolean delUIContextData(String[] oids,String plRelatedType) throws PLException { |
| | | VciBaseUtil.alertNotNull(oids,"待删除的对象列表"); |
| | | //删除方法中有关联数据删除的操作逻辑 |
| | | //删除方法中有关联数据删除的操作逻辑,但是这个方法存在问题就是删除的数据并没有将缓存的东西清理干净 |
| | | return platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids); |
| | | } |
| | | |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean cloneUiContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException { |
| | | public boolean cloneUIContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException { |
| | | VciBaseUtil.alertNotNull( |
| | | pluiLayoutCloneVO,"克隆参数对象", |
| | | pluiLayoutCloneVO.getSourcePLUILayout(),"克隆的源对象信息", |
| | |
| | | ); |
| | | PLUILayout pluiLayout = new PLUILayout(); |
| | | PLUILayout sourcePLUILayout = pluiLayoutCloneVO.getSourcePLUILayout(); |
| | | pluiLayout.plRelatedType = pluiLayoutCloneVO.getCloneTargetName(); |
| | | //如果选择克隆目标,则克隆到选择的类型下,如果没有选择克隆目标,则克隆到当前类型下 |
| | | if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetOid())){ |
| | | if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetName())){ |
| | | pluiLayout.plRelatedType = sourcePLUILayout.plRelatedType; |
| | | } |
| | | //克隆的名称和ui上下文编号查重 |
| | |
| | | this.checkCodeName(pluiLayout); |
| | | //1、先保存ui上下文 |
| | | boolean res = platformClientUtil.getUIService().savePLUILayout(pluiLayout); |
| | | if(!res){ |
| | | return res; |
| | | } |
| | | //2、再考虑子节点的克隆 |
| | | PLTabPage[] pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(sourcePLUILayout.plOId); //控制区节点及其子节点的克隆 |
| | | if(pages == null){ |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 导出ui上下文(勾选的要导出的控制区的数据) |
| | | * oids |
| | | * @return |
| | | */ |
| | | @Override |
| | | public void expUiContextData(String[] oids, HttpServletResponse response) throws PLException, IOException { |
| | | public void expUIContextData(String[] oids, HttpServletResponse response) throws PLException, IOException { |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 导入UI上下文 |
| | | * @param file |
| | | * @return |
| | | */ |
| | | @Override |
| | | public BaseResult impUIContextData(MultipartFile file) { |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 根据上下文ID和区域类型,按顺序获取当前区域的tab页 |
| | | */ |
| | | @Override |
| | | public List<PLTabPage> getTabByContextIdAndType(String contextId, int areaType) throws PLException { |
| | | VciBaseUtil.alertNotNull(contextId,"上下文主键",areaType,"区域类型"); |
| | | PLTabPage[] plTabPages = platformClientUtil.getUIService().getTabPagesByContextIdAndType(contextId, (short) areaType); |
| | | return Arrays.asList(plTabPages); |
| | | } |
| | | |
| | | /** |
| | | * 添加区域数据 |
| | | * @param plTabPage |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean addTabData(PLTabPage plTabPage) throws PLException { |
| | | VciBaseUtil.alertNotNull(plTabPage,"添加区域数据"); |
| | | SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); |
| | | plTabPage.plCreateUser = sessionInfo.getUserId(); |
| | | plTabPage.plModifyUser = sessionInfo.getUserId(); |
| | | plTabPage.plOId = ObjectUtility.getNewObjectID36(); |
| | | //新增和修改前检查,出错直接抛出异常 |
| | | checkEdit(plTabPage); |
| | | |
| | | return platformClientUtil.getUIService().savePLTabPage(plTabPage); |
| | | } |
| | | |
| | | /** |
| | | * 修改区域数据 |
| | | * @param plTabPage |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean updateTabData(PLTabPage plTabPage) throws PLException { |
| | | VciBaseUtil.alertNotNull(plTabPage,"添加区域数据"); |
| | | SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); |
| | | plTabPage.plModifyUser = sessionInfo.getUserId(); |
| | | |
| | | //新增和修改前检查,出错直接抛出异常 |
| | | checkEdit(plTabPage); |
| | | |
| | | return platformClientUtil.getUIService().updatePLTabPage(plTabPage); |
| | | } |
| | | |
| | | /** |
| | | * 删除区域数据 |
| | | * @param oids |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean deleteTabData(String[] oids) throws PLException { |
| | | VciBaseUtil.alertNotNull(oids,"待删除的主键列表"); |
| | | return platformClientUtil.getUIService().deletePLTabPageByOidsForCascade(oids); |
| | | } |
| | | |
| | | /** |
| | | * 扩展属性合规检测 |
| | | * @param extAttr |
| | | * @return |
| | | */ |
| | | public BaseResult checkTabPageExtAttrIsOk(String extAttr){ |
| | | // 数据格式:ext1:xx;ext2;ext3:xx;ext4:xxx;extn:xxx; |
| | | boolean res = checkExtValIsOk(extAttr); |
| | | return res ? BaseResult.success(true,"扩展属性数据格式正确!"):BaseResult.fail("扩展属性数据格式不正确!!"); |
| | | } |
| | | |
| | | /** |
| | | * 查询页面设计定义 |
| | | * @param plPageContextOId |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<PLPageDefination> getPLPageDefinations(String plPageContextOId) { |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 添加页面定义 |
| | | * @param pdVO |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean addPageDefination(PLDefinationVO pdVO) throws Throwable { |
| | | VciBaseUtil.alertNotNull(pdVO,"页面定义对象",pdVO.getSeq(),"编号",pdVO.getName(),"名称"); |
| | | |
| | | PLDefination d = new PLDefination(); |
| | | PLPageDefination pd = new PLPageDefination(); |
| | | pd.plTabPageOId = pdVO.getTabPageOId(); |
| | | pd.plOId = ObjectUtility.getNewObjectID36(); |
| | | //不能为空属性检查 |
| | | if(!this.baseInfoIsOk(pd,false)){ |
| | | return false; |
| | | } |
| | | |
| | | pd.name = pdVO.getName().trim(); |
| | | pd.seq = Short.valueOf(pdVO.getSeq().trim()); |
| | | pd.desc = pdVO.getDescription(); |
| | | pd.plType = Short.parseShort(pdVO.getTemplateType()); |
| | | |
| | | d.setName(pdVO.getName().trim()); |
| | | d.setUiParser(pdVO.getUiParser().trim()); |
| | | d.setExtAttr(pdVO.getExtAttr().trim()); |
| | | d.setTemplateType(pdVO.getTemplateType()); |
| | | |
| | | //名称和编号查重 |
| | | newPLDefinationIsOk(pdVO, false); |
| | | |
| | | // 检查各个类型下的数据是否输入或有效,一共6种类型按类型检验 |
| | | short plType = pd.plType; |
| | | switch (plType){ |
| | | //Table(表格) |
| | | case 1: |
| | | //From(表单) |
| | | case 4: |
| | | TableComptCheckInput tci = new TableComptCheckInput( |
| | | pdVO.getSearchTarger() |
| | | ,pdVO.getBtmType() |
| | | ,pdVO.getLinkType() |
| | | ,pdVO.getTemplateId() |
| | | ,pdVO.getQueryTemplateName() |
| | | ); |
| | | if(!tci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = tci.getNewPLDefination(d); |
| | | break; |
| | | //Custom(自定义模板) |
| | | case 2: |
| | | //只检查控制路径不能为空,有问题会直接报错 |
| | | CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath()); |
| | | if(!ccci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ccci.getNewPLDefination(d); |
| | | break; |
| | | //TreeTable(树表) |
| | | case 3: |
| | | TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput( |
| | | pdVO.getSearchTarger() |
| | | ,pdVO.getBtmType() |
| | | ,pdVO.getLinkType() |
| | | ,pdVO.getTemplateId() |
| | | ,pdVO.getQueryTemplateName() |
| | | ,pdVO.getExpandCols() |
| | | ,pdVO.getExpandMode() |
| | | ); |
| | | if(!ttcci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ttcci.getNewPLDefination(d); |
| | | break; |
| | | //Tree(树) |
| | | case 5: |
| | | TreeComptCheckInput tcci = new TreeComptCheckInput( |
| | | pdVO.getBtmType(), |
| | | pdVO.getLinkType(), |
| | | pdVO.getQueryTemplateName(), |
| | | pdVO.getShowExpressionRoot(), |
| | | pdVO.getShowExpression(), |
| | | pdVO.getRefTreeSet(), |
| | | pdVO.getSeparator(), |
| | | pdVO.getExpandMode() |
| | | ); |
| | | if(!tcci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = tcci.getNewPLDefination(d); |
| | | break; |
| | | //UILayout(UI定义) |
| | | case 6: |
| | | UILayoutComptCheckInput ulci = new UILayoutComptCheckInput( |
| | | pdVO.getSearchTarger(), |
| | | pdVO.getBtmType(), |
| | | pdVO.getUiLayout(), |
| | | pdVO.getQueryTemplateName(), |
| | | pdVO.getQryType() |
| | | ); |
| | | if(!ulci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ulci.getNewPLDefination(d); |
| | | break; |
| | | } |
| | | |
| | | d = setEventDataToPLDefination(d,pdVO); |
| | | //转xml赋值到plDefination中 |
| | | pd.plDefination = UITools.getPLDefinationText(d); |
| | | |
| | | //执行保存 |
| | | return platformClientUtil.getUIService().savePLPageDefination(pd); |
| | | } |
| | | |
| | | /** |
| | | * 修改页面定义 |
| | | * @param pdVO |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean updatePageDefination(PLDefinationVO pdVO) throws Throwable { |
| | | /*PLPageDefination pd = getPageDefination(); |
| | | |
| | | PLDefination d = UITools.getPLDefination(pd.plDefination); |
| | | |
| | | //不能为空属性检查 |
| | | if(!this.baseInfoIsOk(pd,true)){ |
| | | return false; |
| | | } |
| | | setUIValueToObject(pd, d); |
| | | |
| | | this.newPLDefinationIsOk(pdVO, true); |
| | | |
| | | // 检查各个组件内部的数据是否有效 |
| | | int plType = pdVO.getType(); |
| | | switch (plType){ |
| | | //Table(表格) |
| | | case 1: |
| | | //From(表单) |
| | | case 4: |
| | | TableComptCheckInput tci = new TableComptCheckInput( |
| | | pdVO.getSearchTarger() |
| | | ,pdVO.getBtmType() |
| | | ,pdVO.getLinkType() |
| | | ,pdVO.getTemplateId() |
| | | ,pdVO.getQueryTemplateName() |
| | | ); |
| | | if(!tci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = tci.getNewPLDefination(d); |
| | | break; |
| | | //Custom(自定义模板) |
| | | case 2: |
| | | //只检查控制路径不能为空,有问题会直接报错 |
| | | CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath()); |
| | | if(!ccci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ccci.getNewPLDefination(d); |
| | | break; |
| | | //TreeTable(树表) |
| | | case 3: |
| | | TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput( |
| | | pdVO.getSearchTarger() |
| | | ,pdVO.getBtmType() |
| | | ,pdVO.getLinkType() |
| | | ,pdVO.getTemplateId() |
| | | ,pdVO.getQueryTemplateName() |
| | | ,pdVO.getExpandCols() |
| | | ,pdVO.getExpandMode() |
| | | ); |
| | | if(!ttcci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ttcci.getNewPLDefination(d); |
| | | break; |
| | | //Tree(树) |
| | | case 5: |
| | | TreeComptCheckInput tcci = new TreeComptCheckInput( |
| | | pdVO.getBtmType(), |
| | | pdVO.getLinkType(), |
| | | pdVO.getQueryTemplateName(), |
| | | pdVO.getShowExpressionRoot(), |
| | | pdVO.getShowExpression(), |
| | | pdVO.getRefTreeSet(), |
| | | pdVO.getSeparator(), |
| | | pdVO.getExpandMode() |
| | | ); |
| | | if(!tcci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = tcci.getNewPLDefination(d); |
| | | break; |
| | | //UILayout(UI定义) |
| | | case 6: |
| | | UILayoutComptCheckInput ulci = new UILayoutComptCheckInput( |
| | | pdVO.getSearchTarger(), |
| | | pdVO.getBtmType(), |
| | | pdVO.getUiLayout(), |
| | | pdVO.getQueryTemplateName(), |
| | | pdVO.getQryType() |
| | | ); |
| | | if(!ulci.checkInputIsOk()){ |
| | | return false; |
| | | } |
| | | d = ulci.getNewPLDefination(d); |
| | | break; |
| | | } |
| | | |
| | | d = comptPanel.getNewPLDefination(d); |
| | | d = setEventDataToPLDefination(d,pdVO); |
| | | pd.plDefination = UITools.getPLDefinationText(d);*/ |
| | | |
| | | boolean res = true;//platformClientUtil.getUIService().updatePLPageDefination(pd); |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 处理配置的event事件 |
| | | * @param d |
| | | * @param pdVO |
| | | * @return |
| | | */ |
| | | private PLDefination setEventDataToPLDefination(PLDefination d,PLDefinationVO pdVO){ |
| | | Map<String, String> eventMap = pdVO.getEventMap(); |
| | | if(Func.isNotEmpty(eventMap)){ |
| | | String eventKey = eventMap.keySet().stream().collect(Collectors.joining(",")); |
| | | d.setEventKey(eventKey); |
| | | String eventValue = eventMap.values().stream().collect(Collectors.joining(",")); |
| | | d.setEventValue(eventValue); |
| | | }else{ |
| | | d.setEventKey(""); |
| | | d.setEventValue(""); |
| | | } |
| | | return d; |
| | | } |
| | | |
| | | private boolean baseInfoIsOk(PLPageDefination pd, boolean isEdit) throws PLException{ |
| | | boolean res = false; |
| | | if(!checkRequiredIsOk("名称", pd.name)){ |
| | | return false; |
| | | } |
| | | //short类型的就不用检查了 |
| | | /*else if(!checkRequiredIsOk("编号", pd.seq)){ |
| | | return false; |
| | | }*/ |
| | | res = true; |
| | | return res; |
| | | } |
| | | |
| | | private boolean checkRequiredIsOk(String tip, String txt) throws PLException { |
| | | boolean res = false; |
| | | if(Func.isBlank(txt)){ |
| | | throw new PLException("500", new String[]{tip + " 不能为空!"}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 删除页面定义 |
| | | * @param oids |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean delPageDefination(String[] oids) throws PLException { |
| | | VciBaseUtil.alertNotNull(oids,"删除的页面定义主键"); |
| | | boolean res = platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids); |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 页面定义名称和编号查重 |
| | | * @param pd |
| | | * @param isEdit |
| | | * @throws PLException |
| | | */ |
| | | private void newPLDefinationIsOk(PLDefinationVO pd, boolean isEdit) throws PLException{ |
| | | boolean res = false; |
| | | boolean nameExist = false; |
| | | boolean seqExist = false; |
| | | PLPageDefination[] pds = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(pd.getTabPageOId()); |
| | | for (PLPageDefination pdGet : pds) { |
| | | if(!isEdit){ |
| | | if(pd.getName().equals(pdGet.name)){ |
| | | nameExist = true; |
| | | } else if(Short.parseShort(pd.getSeq()) == pdGet.seq){ |
| | | seqExist = true; |
| | | } |
| | | } else { |
| | | if(!pd.getId().equals(pdGet.plOId)){ |
| | | if(pd.getName().equals(pdGet.name)){ |
| | | nameExist = true; |
| | | } else if(Short.parseShort(pd.getSeq()) == pdGet.seq){ |
| | | seqExist = true; |
| | | } |
| | | } |
| | | } |
| | | if(nameExist || seqExist){ |
| | | break; |
| | | } |
| | | } |
| | | if(nameExist){ |
| | | throw new VciBaseException("名称已经存在!"); |
| | | } |
| | | |
| | | if(seqExist){ |
| | | throw new VciBaseException("编号已经存在!"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 给区域中添加数据前校验 |
| | | * @param plTabPage |
| | | * @return |
| | | */ |
| | | private void checkEdit(PLTabPage plTabPage) throws PLException { |
| | | /*if(plTabPage.plSeq >= 0){ |
| | | throw new VciBaseException("序号不能为空!"); |
| | | }else if(!isNumber(plseq.getText().trim())){ |
| | | throw new VciBaseException("序号只能是数字,请重新填写!"); |
| | | }*/ |
| | | if(!checkTabPageUIParserIsOk(plTabPage)){ |
| | | throw new VciBaseException("UI解析类格式不正确,请重新填写!"); |
| | | } |
| | | //独立出来单独做一个接口让前端进行调用 |
| | | /*else if(!checkTabPageExtAttrIsOk(plTabPage)){ |
| | | //给出提示,对于mpm配置可以允许其保存,具体解析mpm自己控制 by liucq |
| | | int confirm = VCIOptionPane.showConfirmDialog(PLTApplication.frame, "扩展属性数据格式不正确\n是否继续保存?", "系统提示", JOptionPane.YES_NO_OPTION); |
| | | }*/ |
| | | |
| | | PLTabPage[] tps = platformClientUtil.getUIService().getTabPagesByContextIdAndType(plTabPage.plContextOId, plTabPage.plAreaType); |
| | | for (PLTabPage tp : tps) { |
| | | if(tp.plSeq == plTabPage.plSeq && !tp.plOId.equals(plTabPage.plOId)){ |
| | | throw new VciBaseException("序号重复!"); |
| | | } |
| | | if(tp.plName.equalsIgnoreCase(plTabPage.plName) && !tp.plOId.equals(plTabPage.plOId)){ |
| | | throw new VciBaseException("名称重复!"); |
| | | } |
| | | if(tp.plCode.equalsIgnoreCase(plTabPage.plCode) && !tp.plOId.equals(plTabPage.plOId)){ |
| | | throw new VciBaseException("页面编码重复!"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 检查UI解析类是否合规 |
| | | * @param tabPage |
| | | * @return |
| | | */ |
| | | private boolean checkTabPageUIParserIsOk(PLTabPage tabPage){ |
| | | // 数据格式: java_cs:xxx;java_bs:xxx;net_cs:xxx;net_bs:xxx;mobile_cs:xx;mobile_bs:xxx; |
| | | String uiParser = tabPage.plUIParser; |
| | | return checkExtValIsOk(uiParser); |
| | | } |
| | | |
| | | /** |
| | | * UI解析类正则检查 |
| | | * @param value |
| | | * @return |
| | | */ |
| | | private boolean checkExtValIsOk(String value){ |
| | | boolean res = true; |
| | | if(value == null || "".equals(value)){ |
| | | return res; |
| | | } |
| | | Pattern ptn = Pattern.compile("([\\w\\.\\_\\-\\+]+:[\\w\\.\\_\\-\\+]+(;)?)+"); |
| | | res = ptn.matcher(value).matches(); |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | |
| | | //查询同一业务类型下的ui上下文,然后查重 |
| | | PLUILayout[] plpagelayoutdefinations = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(pluiLayout.plRelatedType); |
| | | int length = plpagelayoutdefinations.length; |
| | | for (int i =0;i<length;i++){ |
| | | for (int i =0; i<length; i++){ |
| | | String code = plpagelayoutdefinations[i].plCode; |
| | | String name = plpagelayoutdefinations[i].plName; |
| | | String ids = plpagelayoutdefinations[i].plOId; |
| | |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else { |
| | | if (code.equalsIgnoreCase(code) || name.equals(name)){ |
| | | }else { |
| | | if (code.equalsIgnoreCase(pluiLayout.plCode) || name.equals(pluiLayout.plName)){ |
| | | res = true; |
| | | break; |
| | | } |
| | |
| | | return res; |
| | | } |
| | | |
| | | //基础公共检查接口 |
| | | private abstract class BaseComptInter { |
| | | |
| | | /** |
| | | * 公共校验方法 |
| | | * @return |
| | | * @throws PLException |
| | | */ |
| | | public abstract boolean checkInputIsOk() throws PLException; |
| | | |
| | | /** |
| | | * 根据类型不同设置不同的属性 |
| | | * @param d |
| | | * @return |
| | | */ |
| | | public abstract PLDefination getNewPLDefination(PLDefination d); |
| | | |
| | | /** |
| | | * 非空检查 |
| | | * @param tip |
| | | * @param txt |
| | | * @return |
| | | */ |
| | | protected boolean checkRequiredIsOk(String tip, String txt){ |
| | | boolean res = false; |
| | | if(Func.isBlank(txt)){ |
| | | throw new VciBaseException(tip + " 不能为空!"); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查BtmType输入是否有效 |
| | | * @param tipName 提示的信息 |
| | | * @param btmName 业务类型名 |
| | | * @return |
| | | */ |
| | | protected boolean checkBtmTypeTxtIsOk(String tipName, String btmName) throws PLException { |
| | | boolean res = false; |
| | | if(tipName == null) return true; |
| | | if(btmName == null) return true; |
| | | if(!checkRequiredIsOk(tipName, btmName)){ |
| | | res = false; |
| | | } else if(!checkBtmNameIsExist(tipName, btmName)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查业务类型是否存在 |
| | | * @param tip |
| | | * @param btmName |
| | | * @return |
| | | */ |
| | | protected boolean checkBtmNameIsExist(String tip, String btmName) throws PLException { |
| | | boolean res = false; |
| | | String sql = "select count(1) count_ from plbtmtype bt where bt.name='" + btmName.trim() + "'"; |
| | | res = checkCountNotEqualZero(sql); |
| | | if(!res){ |
| | | throw new PLException("500", |
| | | new String[]{String.format("%s %s 无效!", tip, btmName)}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 执行sql,检查是否有返回值 |
| | | * @param sql |
| | | * @return |
| | | */ |
| | | protected boolean checkCountNotEqualZero(String sql){ |
| | | boolean res = false; |
| | | try{ |
| | | String[][] kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql); |
| | | res = Integer.valueOf(kvss[0][0]) > 0; |
| | | }catch(Exception ex){ |
| | | ex.printStackTrace(); |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查表单输入是否有效 |
| | | * @param tip |
| | | * @param txtVIName |
| | | * @param btmLinkType |
| | | * @return |
| | | */ |
| | | protected boolean checkPortalVITxtIsOk(String tip, String txtVIName, String btmLinkType) throws PLException { |
| | | boolean res = false; |
| | | if(tip == null) return true; |
| | | if(txtVIName == null) return true; |
| | | if(!checkRequiredIsOk(tip, txtVIName)){ |
| | | res = false; |
| | | } else if(!checkPortalVIIsExist(tip, txtVIName, btmLinkType)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查模板 |
| | | * @param tip |
| | | * @param txtVIName |
| | | * @param btmLinkType |
| | | * @return |
| | | */ |
| | | protected boolean checkPortalVIIsExist(String tip, String txtVIName, String btmLinkType) throws PLException { |
| | | boolean res = false; |
| | | String sql = "select count(1) count_ from plportalvi vi " + |
| | | "where vi.typename='" + btmLinkType.trim() + "' " + |
| | | "and vi.viname='" + txtVIName.trim() + "'"; |
| | | res = checkCountNotEqualZero(sql); |
| | | if(!res){ |
| | | throw new PLException("500", |
| | | new String[]{String.format("%s %s 无效!", tip, txtVIName)}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查查询模板输入是否有效 |
| | | * @param tip 输入框的名称,用来提示 |
| | | * @param txtQTName 查询模板 |
| | | * @param btmLinkType |
| | | * @return |
| | | */ |
| | | protected boolean checkQTNameTxtIsOk(String tip, String txtQTName, String btmLinkType) throws PLException { |
| | | boolean res = false; |
| | | if(tip == null) return true; |
| | | if(txtQTName == null) return true; |
| | | if(!checkRequiredIsOk(tip, txtQTName)){ |
| | | res = false; |
| | | } else if(Func.isBlank(txtQTName) && !checkQTIsExist(tip, txtQTName, btmLinkType)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查表单输入是否有效 |
| | | * @param tip |
| | | * @param uiName |
| | | * @param btmLinkType |
| | | * @return |
| | | */ |
| | | protected boolean checkUILayoutTxtIsOk(String tip, String uiName, String btmLinkType) throws PLException { |
| | | boolean res = false; |
| | | if(tip == null) return true; |
| | | if(uiName == null) return true; |
| | | if(!checkRequiredIsOk(tip, uiName)){ |
| | | res = false; |
| | | } else if(!checkUILayoutIsExist(tip, uiName, btmLinkType)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | private boolean checkUILayoutIsExist(String tip, String uiName, String txtType) throws PLException { |
| | | boolean res = false; |
| | | String sql = "select count(1) count_ from PLUILAYOUT ui " + |
| | | "where ui.PLRELATEDTYPE='" + txtType.trim() + "' " + |
| | | "and ui.plcode='" + uiName.trim() + "'"; |
| | | res = checkCountNotEqualZero(sql); |
| | | if(!res){ |
| | | throw new PLException("500", |
| | | new String[]{String.format("%s %s 无效!", tip, uiName)}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查当前输入的查询模板是否存在 |
| | | * @param tip |
| | | * @param txtQTName |
| | | * @param txtType |
| | | * @return |
| | | */ |
| | | protected boolean checkQTIsExist(String tip, String txtQTName, String txtType) throws PLException { |
| | | boolean res = false; |
| | | |
| | | String sql = "select count(1) count_ from PL_QTEMPLATE qt " + |
| | | "where qt.btmname ='" + txtType.trim() + "' " + |
| | | "and qt.qtname='" + txtQTName.trim() + "'"; |
| | | |
| | | if(!res){ |
| | | throw new PLException("500", |
| | | new String[]{String.format("%s %s 无效!", tip, txtQTName)}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查LinkType输入是否有效 |
| | | * @param tip |
| | | * @param linkTypeName |
| | | * @return |
| | | */ |
| | | protected boolean checkLinkTypeTxtIsOk(String tip, String linkTypeName) throws PLException { |
| | | boolean res = false; |
| | | if(tip == null) return true; |
| | | if(linkTypeName == null) return true; |
| | | if(!checkRequiredIsOk(tip, linkTypeName)){ |
| | | res = false; |
| | | } else if(!checkLinkTypeIsExist(tip, linkTypeName)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | private boolean checkLinkTypeIsExist(String tip, String linkTypeName) throws PLException { |
| | | boolean res = false; |
| | | String sql = "select count(1) count_ from pllinktype lt " + |
| | | "where lt.name ='" + linkTypeName.trim() + "'"; |
| | | res = checkCountNotEqualZero(sql); |
| | | if(!res){ |
| | | throw new PLException("500", |
| | | new String[]{String.format("%s %s 无效!", tip, linkTypeName)}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | } |
| | | |
| | | //模板类型为Custom类型时校验输入 |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | private class CustomComptCheckInput extends BaseComptInter{ |
| | | |
| | | /** |
| | | * 控制路径 |
| | | */ |
| | | private String ctrlPath; |
| | | |
| | | @Override |
| | | public boolean checkInputIsOk() throws PLException { |
| | | boolean res = true; |
| | | if(!checkRequiredIsOk(this.ctrlPath)){ |
| | | res = false; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 控制路径必输检查 |
| | | * @param ctrlPath |
| | | * @return |
| | | */ |
| | | protected boolean checkRequiredIsOk(String ctrlPath) throws PLException { |
| | | boolean res = false; |
| | | String text = ctrlPath.trim(); |
| | | |
| | | if(Func.isBlank(text)){ |
| | | throw new PLException("500", new String[]{"控制路径不能为空!"}); |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | @Override |
| | | public PLDefination getNewPLDefination(PLDefination d) { |
| | | if(d == null){ |
| | | d = new PLDefination(); |
| | | } |
| | | d.setControlPath(ctrlPath); |
| | | return d; |
| | | } |
| | | |
| | | } |
| | | |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | private class TableComptCheckInput extends BaseComptInter{ |
| | | |
| | | /** |
| | | * 搜索类型:本对象属性:1,关联对象属性:2 |
| | | */ |
| | | private String searchTarger; |
| | | |
| | | /** |
| | | * 业务类型 |
| | | */ |
| | | private String btmType; |
| | | |
| | | /** |
| | | * 链接类型 |
| | | */ |
| | | private String linkType; |
| | | |
| | | /** |
| | | * 选择模板 |
| | | */ |
| | | private String txtVIName; |
| | | |
| | | /** |
| | | * 查询模板 |
| | | */ |
| | | private String txtQTName; |
| | | |
| | | @Override |
| | | public boolean checkInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if(searchTarger.equals("1")){ |
| | | res = checkBtmTypeInputIsOk(btmType,txtVIName,txtQTName); |
| | | } else if(searchTarger.equals("2")){ |
| | | res = checkLinkTypeInputIsOk(txtVIName,txtQTName,btmType); |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | @Override |
| | | public PLDefination getNewPLDefination(PLDefination d) { |
| | | if(d == null){ |
| | | d = new PLDefination(); |
| | | } |
| | | if("1".equals(searchTarger)){ |
| | | d.setSearchTarger("1"); |
| | | d.setShowType(btmType.trim()); |
| | | d.setTemplateId(txtVIName); |
| | | d.setQueryTemplateName(txtQTName); |
| | | |
| | | } else if("2".equals(searchTarger)){ |
| | | d.setSearchTarger("2"); |
| | | |
| | | d.setShowType(btmType); |
| | | d.setLinkType(linkType); |
| | | d.setTemplateId(txtVIName); |
| | | d.setQueryTemplateName(txtQTName); |
| | | } |
| | | return d; |
| | | } |
| | | |
| | | /** |
| | | * 检查业务类型是否输入,是否存在 |
| | | * @param txtVIName |
| | | * @param btmType |
| | | * @param txtQTName |
| | | * @return |
| | | */ |
| | | private boolean checkBtmTypeInputIsOk(String btmType,String txtVIName/*选择模板*/,String txtQTName/*查询模板*/) throws PLException { |
| | | boolean res = false; |
| | | if(!super.checkBtmTypeTxtIsOk("业务类型", btmType)){ |
| | | res = false; |
| | | } else if(!super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType)){ |
| | | res = false; |
| | | } else if(!super.checkQTNameTxtIsOk("查询模板", txtQTName, btmType)){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 检查链接类型是否输入,是否存在 |
| | | * @param txtVIName |
| | | * @param txtQTName |
| | | * @param btmType |
| | | * @return |
| | | */ |
| | | private boolean checkLinkTypeInputIsOk(String txtVIName/*选择的模板*/,String txtQTName/*查询模板*/,String btmType) throws PLException { |
| | | boolean res = false; |
| | | if(!(this.checkBtmTypeTxtIsOk("目标对象", linkType))){ |
| | | res = false; |
| | | } else if(!(this.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){ |
| | | res = false; |
| | | } else if(!(this.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | } |
| | | |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | private class TreeTableComptCheckInput extends BaseComptInter{ |
| | | |
| | | /** |
| | | * 搜索类型:本对象属性:1,关联对象属性:2 |
| | | */ |
| | | private String searchTarger; |
| | | |
| | | /** |
| | | * 业务类型 |
| | | */ |
| | | private String btmType; |
| | | |
| | | /** |
| | | * 链接类型 |
| | | */ |
| | | private String linkType; |
| | | |
| | | /** |
| | | * 选择模板 |
| | | */ |
| | | private String txtVIName; |
| | | |
| | | /** |
| | | * 查询模板 |
| | | */ |
| | | private String txtQTName; |
| | | |
| | | /** |
| | | * 树形结构展开列 |
| | | */ |
| | | private String expandCols; |
| | | |
| | | /** |
| | | * 展开形式:逐级展开 1,全部展开 0 |
| | | */ |
| | | private String expandMode; |
| | | |
| | | @Override |
| | | public boolean checkInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if(searchTarger.equals("1")){ |
| | | res = this.checkBtmTypeInputIsOk(); |
| | | } else if(searchTarger.equals("2")){ |
| | | res = checkLinkTypeInputIsOk(); |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | @Override |
| | | public PLDefination getNewPLDefination(PLDefination d) { |
| | | if(d == null){ |
| | | d = new PLDefination(); |
| | | } |
| | | //属性赋值重叠,所以这儿改变了逻辑 |
| | | d.setSearchTarger(searchTarger); |
| | | d.setShowType(btmType); |
| | | d.setTemplateId(txtVIName); |
| | | d.setQueryTemplateName(txtQTName); |
| | | d.setExpandCols(expandCols); |
| | | d.setExpandMode(expandMode); |
| | | if("2".equals(searchTarger)){ |
| | | d.setLinkType(linkType); |
| | | } |
| | | return d; |
| | | } |
| | | |
| | | private boolean checkBtmTypeInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", btmType))){ |
| | | res = false; |
| | | } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType))){ |
| | | res = false; |
| | | } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName , btmType))){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | private boolean checkLinkTypeInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", linkType))){ |
| | | res = false; |
| | | } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){ |
| | | res = false; |
| | | } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){ |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | } |
| | | |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | private class TreeComptCheckInput extends BaseComptInter{ |
| | | |
| | | /** |
| | | * 业务类型 |
| | | */ |
| | | private String btmType; |
| | | |
| | | /** |
| | | * 链接类型 |
| | | */ |
| | | private String linkType; |
| | | |
| | | /** |
| | | * 查询模板 |
| | | */ |
| | | private String queryTemplateName; |
| | | |
| | | /** |
| | | * 根节点显示表达式 |
| | | */ |
| | | private String showExpressionRoot; |
| | | |
| | | /** |
| | | * 树节点显示表达式 |
| | | */ |
| | | private String showExpression; |
| | | |
| | | /** |
| | | * 参照树设置 |
| | | */ |
| | | private String refTreeSet; |
| | | |
| | | |
| | | /** |
| | | * 分隔符 |
| | | */ |
| | | private String splitChar; |
| | | |
| | | /** |
| | | * 展开方式:逐级展开 1,全部展开 0 |
| | | */ |
| | | private String expandMode; |
| | | |
| | | @Override |
| | | public boolean checkInputIsOk() throws PLException { |
| | | return checkBtmTypeInputIsOk(); |
| | | } |
| | | |
| | | @Override |
| | | public PLDefination getNewPLDefination(PLDefination d) { |
| | | if(d == null){ |
| | | d = new PLDefination(); |
| | | } |
| | | d.setShowType(btmType); |
| | | d.setLinkType(linkType); |
| | | d.setTemplateId(queryTemplateName); |
| | | d.setRootContent(showExpressionRoot.trim()); |
| | | d.setShowAbs(showExpression.trim()); |
| | | d.setShowLinkAbs(refTreeSet.trim()); |
| | | d.setSeparator(splitChar.trim()); |
| | | d.setExpandMode(expandMode); |
| | | return d; |
| | | } |
| | | |
| | | private boolean checkBtmTypeInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if(!(super.checkBtmTypeTxtIsOk("业务类型", btmType))){ |
| | | res = false; |
| | | return res; |
| | | } |
| | | // 链接类型不为空时,需要同时检查链接类型及链接类型下的查询模板是否有效 |
| | | if(Func.isBlank(linkType)){ |
| | | if(!(super.checkLinkTypeTxtIsOk("链接类型", linkType))){ |
| | | res = false; |
| | | return res; |
| | | } else if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, linkType))){ |
| | | res = false; |
| | | return res; |
| | | } |
| | | } else { |
| | | // 链接类型为空时,只需要检查业务类型下的查询模板是否有效 |
| | | if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, btmType))){ |
| | | res = false; |
| | | return res; |
| | | } |
| | | } |
| | | |
| | | if(!super.checkRequiredIsOk("根节点显示表达式", showExpressionRoot)){ |
| | | res = false; |
| | | } |
| | | else if(!super.checkRequiredIsOk("树节点显示表达式", showExpression)){ |
| | | res = false; |
| | | } |
| | | else if(!super.checkRequiredIsOk("参照树设置", refTreeSet)){ |
| | | res = false; |
| | | } |
| | | else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | } |
| | | |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | private class UILayoutComptCheckInput extends BaseComptInter{ |
| | | |
| | | /** |
| | | * 搜索类型:本对象属性:1,关联对象属性:2 |
| | | * 查询类型也是赋值到这个属性上: 业务类型:1,链接类型:2 |
| | | */ |
| | | private String searchTarger; |
| | | |
| | | /** |
| | | * 对象类型 |
| | | */ |
| | | private String uiBtmType; |
| | | |
| | | /** |
| | | * UI定义 |
| | | */ |
| | | private String uiLayout; |
| | | |
| | | /** |
| | | * 查询模板 |
| | | */ |
| | | private String queryTemplateName; |
| | | |
| | | /** |
| | | * 查询对象类型 |
| | | */ |
| | | private String qryType; |
| | | |
| | | @Override |
| | | public boolean checkInputIsOk() throws PLException{ |
| | | return checkUILayoutInputIsOk(); |
| | | } |
| | | |
| | | @Override |
| | | public PLDefination getNewPLDefination(PLDefination d) { |
| | | if (d == null) { |
| | | d = new PLDefination(); |
| | | } |
| | | |
| | | d.setSearchTarger(searchTarger); |
| | | d.setSubUiObjType(uiBtmType.trim()); |
| | | d.setSubUILayout(uiLayout.trim()); |
| | | |
| | | if (searchTarger.equals("1")) { |
| | | d.setShowType(qryType.trim()); |
| | | } else { |
| | | d.setLinkType(qryType.trim()); |
| | | } |
| | | d.setQueryTemplateName(queryTemplateName.trim()); |
| | | |
| | | return d; |
| | | } |
| | | |
| | | private boolean checkUILayoutInputIsOk() throws PLException { |
| | | boolean res = false; |
| | | if (!(super.checkBtmTypeTxtIsOk("对象类型", uiBtmType))) { |
| | | res = false; |
| | | } else if (!(super.checkUILayoutTxtIsOk("UI定义", uiLayout, uiBtmType))) { |
| | | res = false; |
| | | } else if (!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, qryType))) { |
| | | res = false; |
| | | } else { |
| | | res = true; |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |