package com.vci.web.service.impl;
|
|
import com.sun.jnlp.ApiDialog;
|
import com.vci.client.mw.ClientContextVariable;
|
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.pagemodel.PLUILayoutCloneVO;
|
import com.vci.starter.web.exception.VciBaseException;
|
import com.vci.starter.web.pagemodel.BaseQueryObject;
|
import com.vci.starter.web.pagemodel.DataGrid;
|
import com.vci.starter.web.pagemodel.SessionInfo;
|
import com.vci.starter.web.util.VciBaseUtil;
|
import com.vci.starter.web.util.WebThreadLocalUtil;
|
import com.vci.web.service.UIManagerServiceI;
|
import com.vci.web.util.Func;
|
import com.vci.web.util.PlatformClientUtil;
|
import com.vci.web.util.UITools;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.util.Arrays;
|
import java.util.Comparator;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* UI定义服务界面相关接口
|
* @author ludc
|
* @date 2024/8/28 17:05
|
*/
|
@Service
|
public class UIManagerServiceImpl implements UIManagerServiceI {
|
|
/**
|
* 平台的调用工具类
|
*/
|
@Resource
|
private PlatformClientUtil platformClientUtil;
|
/**
|
* 日志
|
*/
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
/**
|
* 排序比较器
|
*/
|
private Comparator<PLUILayout> pageLayoutComparator = new Comparator<PLUILayout>() {
|
@Override
|
public int compare(PLUILayout o1, PLUILayout o2) {
|
return o1.plCode.compareTo(o2.plCode);
|
}
|
};
|
|
/**
|
* 根据业务类型名查询ui上下文数据
|
* @param baseQueryObject
|
* @return
|
* @throws PLException
|
*/
|
@Override
|
public DataGrid gridUIContextData(BaseQueryObject baseQueryObject) throws PLException {
|
VciBaseUtil.alertNotNull(baseQueryObject,"条件对象");
|
int page = baseQueryObject.getPage();
|
int limit = baseQueryObject.getLimit();
|
Map<String, String> conditionMap = baseQueryObject.getConditionMap();
|
String btmName = conditionMap.getOrDefault("btmName","");
|
if(Func.isEmpty(conditionMap) || Func.isBlank(btmName)){
|
throw new PLException("500",new String[]{"未获取到业务类型名称!"});
|
}
|
String txtName = conditionMap.getOrDefault("txtName","").trim();
|
String txtCode = conditionMap.getOrDefault("txtCode","").trim();
|
PortalService.GetPLUILayoutsByRelatedTypeAndQueryInfoResult result = platformClientUtil.getUIService()
|
.getPLUILayoutsByRelatedTypeAndQueryInfo(btmName, txtName, txtCode, page, limit);
|
DataGrid<PLUILayout> dataGrid = new DataGrid<>();
|
int total = (int)result.total;
|
dataGrid.setTotal(total);
|
dataGrid.setLimit(limit);
|
dataGrid.setPage(page);
|
PLUILayout[] res = result.returnValue;
|
Arrays.sort(res,pageLayoutComparator);
|
List<PLUILayout> pluiLayouts = Arrays.asList(res);
|
dataGrid.setData(pluiLayouts);
|
return dataGrid;
|
}
|
|
/**
|
* 给业务类型下添加ui上下文
|
* @param pluiLayout
|
* @return
|
* @throws PLException
|
*/
|
@Override
|
public boolean saveUIContextData(PLUILayout pluiLayout) throws VciBaseException {
|
try {
|
//ui上下文对象校验
|
canContinue(pluiLayout);
|
|
String code = pluiLayout.plCode;
|
String name = pluiLayout.plName;
|
boolean isExist = nameOrCodeIsExist(pluiLayout, false);
|
//是否存在校验
|
if (isExist){
|
throw new VciBaseException("上下文编码或名称已经存在,请检查!");
|
}
|
|
PLUILayout pld = new PLUILayout();
|
pld.plOId = ObjectUtility.getNewObjectID36();
|
pld.plCode = code;
|
pld.plName = name;
|
pld.plRelatedType = pluiLayout.plRelatedType;
|
pld.plDesc = pluiLayout.plDesc;
|
SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
|
pld.plCreateUser = sessionInfo.getUserId();
|
pld.plModifyUser = sessionInfo.getUserId();
|
//导航区
|
pld.plIsShowForm = pluiLayout.plIsShowForm;
|
//控制区
|
pld.plIsShowNavigator = pluiLayout.plIsShowNavigator;
|
//操作区
|
pld.plIsShowTab = pluiLayout.plIsShowTab;
|
//执行保存
|
return platformClientUtil.getUIService().savePLUILayout(pld);
|
} catch (PLException e) {
|
e.printStackTrace();
|
String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
|
logger.error(exceptionMessage);
|
throw new VciBaseException(exceptionMessage);
|
}
|
}
|
|
/**
|
* 修改ui上下文
|
* @param pluiLayout
|
* @return
|
* @throws PLException
|
*/
|
@Override
|
public boolean updateUIContextData(PLUILayout pluiLayout) throws VciBaseException {
|
this.canContinue(pluiLayout);
|
try {
|
String code = pluiLayout.plCode;
|
String name = pluiLayout.plName;
|
boolean isExist = nameOrCodeIsExist(pluiLayout, true);
|
if (isExist){
|
throw new VciBaseException("上下文编码或名称已经存在,请检查!");
|
}
|
|
PLUILayout pld = new PLUILayout();
|
pld.plOId = pluiLayout.plOId;
|
pld.plCode = code;
|
pld.plName = name;
|
pld.plRelatedType = pluiLayout.plRelatedType;
|
pld.plDesc = pluiLayout.plDesc;
|
pld.plCreateUser = pluiLayout.plCreateUser;
|
pld.plModifyUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
|
|
//导航区
|
pld.plIsShowForm = pluiLayout.plIsShowForm;
|
//控制区
|
pld.plIsShowNavigator = pluiLayout.plIsShowNavigator;
|
//操作区
|
pld.plIsShowTab = pluiLayout.plIsShowTab;
|
//执行修改
|
return platformClientUtil.getUIService().updatePLUILayout(pld);
|
} catch (PLException e) {
|
e.printStackTrace();
|
String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
|
logger.error(exceptionMessage);
|
throw new VciBaseException(exceptionMessage);
|
}
|
}
|
|
/**
|
* 根据主键和业务类型oid删除ui上下文数据
|
* @return
|
*/
|
@Override
|
public boolean delUIContextData(String[] oids) throws PLException {
|
VciBaseUtil.alertNotNull(oids,"待删除的对象列表");
|
//删除方法中有关联数据删除的操作逻辑
|
return platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids);
|
}
|
|
/**
|
* 克隆ui上下文(具备关联数据的克隆)
|
* @param pluiLayoutCloneVO
|
* @return
|
*/
|
@Override
|
public boolean cloneUiContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException {
|
VciBaseUtil.alertNotNull(
|
pluiLayoutCloneVO,"克隆参数对象",
|
pluiLayoutCloneVO.getSourcePLUILayout(),"克隆的源对象信息",
|
pluiLayoutCloneVO.getCloneName(),"克隆的对象名称",
|
pluiLayoutCloneVO.getCloneContextCode(),"克隆的对象上下文编码"
|
);
|
PLUILayout pluiLayout = new PLUILayout();
|
PLUILayout sourcePLUILayout = pluiLayoutCloneVO.getSourcePLUILayout();
|
//如果选择克隆目标,则克隆到选择的类型下,如果没有选择克隆目标,则克隆到当前类型下
|
if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetOid())){
|
pluiLayout.plRelatedType = sourcePLUILayout.plRelatedType;
|
}
|
//克隆的名称和ui上下文编号查重
|
String cloneName = pluiLayoutCloneVO.getCloneName();
|
String cloneContextCode = pluiLayoutCloneVO.getCloneContextCode();
|
pluiLayout.plOId = ObjectUtility.getNewObjectID36();
|
pluiLayout.plName = cloneName;
|
pluiLayout.plCode = cloneContextCode;
|
pluiLayout.plIsShowTab = sourcePLUILayout.plIsShowTab;
|
pluiLayout.plIsShowNavigator = sourcePLUILayout.plIsShowNavigator;
|
pluiLayout.plIsShowForm = sourcePLUILayout.plIsShowForm;
|
pluiLayout.plDesc = sourcePLUILayout.plDesc;
|
SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
|
pluiLayout.plCreateUser = sessionInfo.getUserId();
|
pluiLayout.plModifyUser = sessionInfo.getUserId();
|
//克隆目标下ui名称和编号查重
|
this.checkCodeName(pluiLayout);
|
//1、先保存ui上下文
|
boolean res = platformClientUtil.getUIService().savePLUILayout(pluiLayout);
|
//2、再考虑子节点的克隆
|
PLTabPage[] pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(sourcePLUILayout.plOId); //控制区节点及其子节点的克隆
|
if(pages == null){
|
return true;
|
}
|
try {
|
for (PLTabPage page : pages) {
|
savePlpageLayoutDefinationRelation(page,pluiLayout.plOId);
|
}
|
return true;
|
}catch (Exception e){
|
e.printStackTrace();
|
String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
|
logger.error(exceptionMessage);
|
throw new VciBaseException(exceptionMessage);
|
}
|
}
|
|
@Override
|
public void expUiContextData(String[] oids, HttpServletResponse response) throws PLException, IOException {
|
|
}
|
|
/**
|
* 控制区节点及其子节点的克隆
|
* @param obj
|
*/
|
private void savePlpageLayoutDefinationRelation(Object obj,String plUILayoutId) {
|
PLTabPage tabPage = (PLTabPage)obj;
|
try {
|
|
PLPageDefination[] pLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPage.plOId);
|
|
tabPage.plOId = ObjectUtility.getNewObjectID36();
|
tabPage.plContextOId = plUILayoutId;
|
//add by caill start 2016.8.15 导航区、控制区、操作区在没有子节点的情况下的克隆
|
if(pLPageDefinations.length==0){
|
platformClientUtil.getUIService().savePLTabPage(tabPage);
|
}
|
//add by caill end
|
for(int j=0;j<pLPageDefinations.length;j++){
|
PLPageDefination plPageDef = pLPageDefinations[j];
|
|
platformClientUtil.getUIService().savePLTabPage(tabPage);
|
PLTabButton[] pLTabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(plPageDef.plOId);
|
|
plPageDef.plOId = ObjectUtility.getNewObjectID36();
|
plPageDef.plTabPageOId = tabPage.plOId;
|
platformClientUtil.getUIService().savePLPageDefination(plPageDef);
|
|
for(int b=0;b<pLTabButtons.length;b++){
|
PLTabButton plTabButton = pLTabButtons[b];
|
PLCommandParameter[] pLCommandParameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(plTabButton.plOId);
|
|
plTabButton.plOId = ObjectUtility.getNewObjectID36();
|
plTabButton.plTableOId = plPageDef.plOId;
|
platformClientUtil.getUIService().savePLTabButton(plTabButton);
|
|
for(int c=0;c<pLCommandParameters.length;c++){
|
final PLCommandParameter plCommandParameter = pLCommandParameters[c];
|
plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
|
plCommandParameter.plCommandOId = plTabButton.plOId;
|
platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
|
}
|
}
|
}
|
} catch (PLException e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 未做判空处理,调用前请保证obj不为空
|
* @param obj
|
* @throws PLException
|
*/
|
public void checkCodeName(PLUILayout obj) throws PLException {
|
PLUILayout[] plUILayouts = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(obj.plRelatedType);
|
int length = plUILayouts.length;
|
String code = obj.plCode;
|
String name = obj.plName;
|
|
if (Func.isNotBlank(name) || Func.isNotBlank(code)){
|
for (int i =0;i<length;i++){//循环节点的UI上文和名称
|
if (plUILayouts[i].plCode.equalsIgnoreCase(code) || plUILayouts[i].plName.equals(name)){
|
throw new VciBaseException("业务类型下UI名称或UI上下文编码已存在!");
|
}
|
}
|
}
|
}
|
|
/**
|
* ui上下文新增修改前检查
|
* @param pluiLayout
|
*/
|
private void canContinue(PLUILayout pluiLayout){
|
String code = pluiLayout.plCode;
|
String name = pluiLayout.plName;
|
if(Func.isBlank(code)){
|
throw new VciBaseException("上下文编码不能为空!");
|
}
|
if(Func.isBlank(name)){
|
throw new VciBaseException("名称不能为空!");
|
}
|
if((pluiLayout.plIsShowNavigator == 0) && (pluiLayout.plIsShowForm == 0) && (pluiLayout.plIsShowTab == 0)){
|
throw new VciBaseException("上下文至少要包含一个区域!");
|
}
|
}
|
|
/**
|
* 检查名称或者编码是否已存在
|
* @param pluiLayout
|
* @param isEdit
|
* @return
|
* @throws VciBaseException
|
*/
|
private boolean nameOrCodeIsExist(PLUILayout pluiLayout, boolean isEdit) throws PLException {
|
boolean res = false;
|
//查询同一业务类型下的ui上下文,然后查重
|
PLUILayout[] plpagelayoutdefinations = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(pluiLayout.plRelatedType);
|
int length = plpagelayoutdefinations.length;
|
for (int i =0;i<length;i++){
|
String code = plpagelayoutdefinations[i].plCode;
|
String name = plpagelayoutdefinations[i].plName;
|
String ids = plpagelayoutdefinations[i].plOId;
|
if(isEdit){
|
if(!ids.equals(pluiLayout.plOId)){
|
if (pluiLayout.plCode.equalsIgnoreCase(code) || pluiLayout.plName.equals(name)){
|
res = true;
|
break;
|
}
|
}
|
}
|
else {
|
if (code.equalsIgnoreCase(code) || name.equals(name)){
|
res = true;
|
break;
|
}
|
}
|
}
|
return res;
|
}
|
|
}
|