Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -5,16 +5,26 @@
import com.vci.corba.omd.lcm.Bound;
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.corba.omd.lcm.TransitionVO;
import com.vci.corba.omd.lcm.TransitionVOEvent;
import com.vci.corba.omd.vrm.VersionRule;
import com.vci.dto.OsLifeCycleDTO;
import com.vci.dto.OsLifeCycleLineDTO;
import com.vci.dto.OsLifeCycleLineEventDTO;
import com.vci.dto.OsRevisionRuleDTO;
import com.vci.pagemodel.*;
import com.vci.starter.web.annotation.log.VciUnLog;
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.util.VciBaseUtil;
import com.vci.starter.web.util.VciDateUtil;
import com.vci.web.model.OsLifeCycleDO;
import com.vci.web.pageModel.*;
import com.vci.model.OsLifeCycleDO;
import com.vci.starter.web.util.WebThreadLocalUtil;
import com.vci.web.service.OsLifeCycleServiceI;
import com.vci.web.service.OsStatusServiceI;
import com.vci.web.service.WebBoServiceI;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
@@ -25,12 +35,14 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.swing.*;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_ROUTER_NULL;
import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_TRANS_ERROR;
import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
import static com.vci.constant.WebLangCodeConstant.LIFE_CYCLE_ROUTER_NULL;
import static com.vci.constant.WebLangCodeConstant.LIFE_CYCLE_TRANS_ERROR;
/**
 * 生命周期服务
@@ -88,7 +100,7 @@
    * @throws VciBaseException 如果目标生命周期和当前生命周期状态没有连接线时抛出异常
    */
   @Override
   public void transStatus(com.vci.corba.omd.data.BusinessObject bo, String targetStatus)
   public void transStatus(BusinessObject bo, String targetStatus)
         throws VciBaseException {
      WebUtil.alertNotNull(bo,"业务数据对象",bo.lctId,"生命周期编码",bo.lcStatus,"当前生命周期状态",targetStatus,"目标生命周期状态");
      OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus);
@@ -109,7 +121,7 @@
    * @throws VciBaseException 转换生命周期出错的时候抛出异常
    */
   @Override
   public void transStatus(List<com.vci.corba.omd.data.BusinessObject> boList, String targetStatus)
   public void transStatus(List<BusinessObject> boList, String targetStatus)
         throws VciBaseException {
      WebUtil.alertNotNull(boList,"业务数据对象",targetStatus,"目标对象");
      transStatus(boList.toArray(new com.vci.corba.omd.data.BusinessObject[0]), targetStatus);
@@ -122,13 +134,13 @@
    * @throws VciBaseException 转换生命周期出错的时候抛出异常
    */
   @Override
   public void transStatus(com.vci.corba.omd.data.BusinessObject[] bos, String targetStatus)
   public void transStatus(BusinessObject[] bos, String targetStatus)
         throws VciBaseException {
      WebUtil.alertNotNull(bos,"业务数据对象",targetStatus,"目标对象");
      List<OsLifeCycleLineVO> transVOList = new ArrayList<>();
      List<com.vci.corba.omd.data.BusinessObject> transBOs = new ArrayList<>();
      List<BusinessObject> transBOs = new ArrayList<>();
      for(int i = 0 ; i < bos.length ; i ++){
         com.vci.corba.omd.data.BusinessObject bo = bos[i];
         BusinessObject bo = bos[i];
         WebUtil.alertNotNull(bo,"业务数据对象",bo.lctId,"生命周期编码",bo.lcStatus,"当前生命周期状态");
         OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus);
         if(transVO!=null){
@@ -141,7 +153,7 @@
         }
      }
      if(!CollectionUtils.isEmpty(transBOs)) {
         batchTransVo(transBOs.toArray(new com.vci.corba.omd.data.BusinessObject[0]), transVOList.toArray(new OsLifeCycleLineVO[0]));
         batchTransVo(transBOs.toArray(new BusinessObject[0]), transVOList.toArray(new OsLifeCycleLineVO[0]));
      }
   }
@@ -264,10 +276,11 @@
      lifeCyle.name = lifeCycleVO.getId();
      lifeCyle.tag = lifeCycleVO.getName();
      lifeCyle.oid = lifeCycleVO.getOid();
      lifeCyle.creator = lifeCycleVO.getCreator();
      String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
      lifeCyle.creator = Func.isBlank(lifeCycleVO.getCreator()) ? userId:lifeCycleVO.getCreator();
      lifeCyle.description = lifeCycleVO.getDescription();
      lifeCyle.modifier = lifeCycleVO.getLastModifier();
      lifeCyle.modifyTime = lifeCycleVO.getLastModifyTime() != null ? lifeCycleVO.getLastModifyTime().getTime():null;
      lifeCyle.modifier = Func.isBlank(lifeCycleVO.getLastModifier()) ? userId:lifeCycleVO.getLastModifier();
      lifeCyle.modifyTime = System.currentTimeMillis();
      lifeCyle.createTime = lifeCycleVO.getCreateTime() != null ? lifeCycleVO.getCreateTime().getTime():null;
      lifeCyle.startState =lifeCycleVO.getStartStatus();
      lifeCyle.ts = VciDateUtil.date2Str(lifeCycleVO.getTs(),VciDateUtil.DateTimeMillFormat);
@@ -360,7 +373,6 @@
      return Optional.ofNullable(life.getLines()).orElseGet(()->new ArrayList<>()).stream().filter(s->s.getSourceLifeStatus().equalsIgnoreCase(currentStatus) && s.getTargetLifeStatus().equalsIgnoreCase(targetStatus)).findFirst().orElseGet(()->null);
   }
   /**
    * 跃迁业务类型的生命周期状态
    * @param obj 业务类型数据对象
@@ -368,10 +380,10 @@
    * @throws VciBaseException 跃迁出错的是会抛出异常
    */
   @Override
   public void doTransVO(com.vci.corba.omd.data.BusinessObject obj,OsLifeCycleLineVO lineVO) throws VciBaseException {
   public void doTransVO(BusinessObject obj,OsLifeCycleLineVO lineVO) throws VciBaseException {
      if(lineVO!=null){
         try {
            com.vci.corba.omd.lcm.TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO);
            TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO);
            platformClientUtil.getBOFService().transferBusinessObject(obj, transitionVO.destination);
         } catch (PLException e) {
            throw WebUtil.getVciBaseException(e);
@@ -386,21 +398,21 @@
    * @param lineVO 连接线对象
    * @return 平台的连接线对象
    */
   private com.vci.corba.omd.lcm.TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){
   private TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){
      com.vci.corba.omd.lcm.TransitionVO transitionVO = new com.vci.corba.omd.lcm.TransitionVO();
      transitionVO.id = lineVO.getOid();
      transitionVO.source = lineVO.getSourceLifeStatus();
      transitionVO.destination = lineVO.getTargetLifeStatus();
      transitionVO.connect = lineVO.getName() == null?"":lineVO.getName();
         //加事件
      com.vci.corba.omd.lcm.TransitionVOEvent[] events;
      TransitionVOEvent[] events;
      if(lineVO.getEvents() == null || lineVO.getEvents().length == 0){
         events = new com.vci.corba.omd.lcm.TransitionVOEvent[0];
         events = new TransitionVOEvent[0];
      }else{
         events = new com.vci.corba.omd.lcm.TransitionVOEvent[lineVO.getEvents().length];
         events = new TransitionVOEvent[lineVO.getEvents().length];
         for (int j = 0; j < lineVO.getEvents().length; j++) {
            OsLifeCycleLineEventVO eventVO = lineVO.getEvents()[j];
            com.vci.corba.omd.lcm.TransitionVOEvent event = new com.vci.corba.omd.lcm.TransitionVOEvent();
            TransitionVOEvent event = new TransitionVOEvent();
            event.id = eventVO.getOid();
            event.name = eventVO.getEventFullName();
            events[j] = event;
@@ -417,7 +429,7 @@
    * @throws VciBaseException 跃迁出错的是会抛出异常
    */
   @Override
   public void batchTransVo(com.vci.corba.omd.data.BusinessObject[] bos,OsLifeCycleLineVO[] vos) throws VciBaseException{
   public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] vos) throws VciBaseException{
      batchTransVo(bos,vos,null);
   }
@@ -456,6 +468,8 @@
      if(!CollectionUtils.isEmpty(lifeCyleList)){
         lifeCyleList.stream().forEach(lifeCyle -> {
            try {
               //校验生命周期是否合规
               this.checkLifeCycle(lifeCyle,true);
               platformClientUtil.getLifeCycleService().addLifeCycle(lifeCyle);
            } catch (PLException e) {
               throw WebUtil.getVciBaseException(e);
@@ -474,6 +488,8 @@
      if(!CollectionUtils.isEmpty(lifeCycleList)){
         lifeCycleList.stream().forEach(lifeCyle -> {
            try {
               //校验生命周期是否合规
               this.checkLifeCycle(lifeCyle,false);
               platformClientUtil.getLifeCycleService().modifyLifeCycle(lifeCyle);
            } catch (PLException e) {
               throw WebUtil.getVciBaseException(e);
@@ -483,7 +499,7 @@
   }
   /**
    * 状态在生命周期中使用的勤快
    * 状态在生命周期中使用的范围
    *
    * @param statusOid 状态的主键
    * @return 生命周期的信息
@@ -537,6 +553,190 @@
   }
   /**
    * 新增单条生命周期
    * @param osLifeCycleVO
    * @return
    */
   @Override
   public boolean addLifeCycle(OsLifeCycleVO osLifeCycleVO) throws PLException {
      VciBaseUtil.alertNotNull(osLifeCycleVO,"生命周期模板");
      LifeCycle lifeCycle = lifeCycleVO2DO(osLifeCycleVO);
      //生命周期合规校验
      checkLifeCycle(lifeCycle,true);
      return platformClientUtil.getLifeCycleService().addLifeCycle(lifeCycle);
   }
   /**
    * 修改生命周期
    * @param osLifeCycleVO
    * @return
    */
   @Override
   public boolean updateLifeCycle(OsLifeCycleVO osLifeCycleVO) throws PLException {
      VciBaseUtil.alertNotNull(osLifeCycleVO,"生命周期模板");
      //查询修改的生命周期是否存在
      LifeCycle dbLifeCycle = platformClientUtil.getLifeCycleService().getLifeCycle(osLifeCycleVO.getId());
      if(Func.isEmpty(dbLifeCycle) || Func.isBlank(dbLifeCycle.oid)){
         throw new PLException("500",new String[]{"修改生命周期模板不存在!"});
      }
      osLifeCycleVO.setCreator(dbLifeCycle.creator);
      osLifeCycleVO.setCreateTime(new Date(dbLifeCycle.createTime));
      LifeCycle lifeCycle = lifeCycleVO2DO(osLifeCycleVO);
      //检查生命周期修改是否和规
      checkLifeCycle(lifeCycle,false);
      return platformClientUtil.getLifeCycleService().modifyLifeCycle(lifeCycle);
   }
   /**
    * 删除生命周期
    * @param lifeCycleDTOS
    * @return
    */
   @Override
   public boolean deleteLifeCycles(List<OsLifeCycleDTO> lifeCycleDTOS) throws PLException {
      VciBaseUtil.alertNotNull(lifeCycleDTOS,"待删除的生命周期列表");
      //判断要删除的生命周期是否有被引用
      lifeCycleDTOS.stream().forEach(item->{
         String lifeCycleName = item.getId();
         try {
            List<Map<String, String>> usedLifeCycleList = this.getUsedLifeCycleList(lifeCycleName);
            if(Func.isNotEmpty(usedLifeCycleList)){
               throw new VciBaseException("该生命周期已被使用不允许删除");
            }
         } catch (PLException e) {
            logger.error(e.getMessage());
            e.printStackTrace();
            throw new VciBaseException(e.getMessage());
         }
      });
      //平台的deleteStatus方法必传三个参数,oid、name和ts
      List<LifeCycle> lcList = new ArrayList<>();
      for(OsLifeCycleDTO lcDTO : lifeCycleDTOS){
         //oid和ts判空
         String oid = lcDTO.getOid();
         //id主要用来对缓存数据删除
         String id = lcDTO.getId();
         //后台会用ts进行数据一致性校验
         Date ts = lcDTO.getTs();
         if(Func.isBlank(oid) || Func.isBlank(id) || Func.isEmpty(ts)){
            throw new PLException("500",new String[]{"待删除的生命周期列表中主键【oid】、调整时间【ts】、状态名称【name】不能为空!"});
         }
         LifeCycle vr = new LifeCycle();
         vr.oid = oid;
         vr.name = id;
         vr.ts = Func.format(ts,VciDateUtil.DateTimeMillFormat);
         lcList.add(vr);
      }
      return platformClientUtil.getLifeCycleService().deleteLifeCycles(lcList.toArray(new LifeCycle[lcList.size()]));
   }
   /**
    * 查看生命周期的使用范围
    * @return
    */
   @Override
   public List<Map<String, String>> getUsedLifeCycleList(String lifeCycleName) throws PLException {
      if(Func.isBlank(lifeCycleName)){
         throw new PLException("500",new String[]{"请选择要查询使用范围的生命周期模板!"});
      }
      String[] btNames = platformClientUtil.getBtmService().getBTNamesByLCName(lifeCycleName);
      if(Func.isEmpty(btNames)){
         return new ArrayList<>();
      }
      List<Map<String,String>> btmNameMapList = new ArrayList<>();
      Arrays.stream(btNames).forEach(btName->{
         Map<String, String> itemMap = new HashMap<>();
         itemMap.put("lifeCycleName",lifeCycleName);
         itemMap.put("source",btName);
         btmNameMapList.add(itemMap);
      });
      return btmNameMapList;
   }
   /**
    * 导出选中的生命周期
    * @param exportFileName 导出的文件名
    * @param lcNames 需要导出的生命周期名称
    * @param flag 控制导出的列名是否和导入模板一致
    * @return
    */
   @Override
   public String exportLifeCycles(String exportFileName, String lcNames, boolean flag) throws PLException {
      return null;
   }
   /**
    * 下载生命周期导入模板
    * @param exportFileName
    * @return
    * @throws PLException
    */
   @Override
   public String downloadLifeCycleTemplate(String exportFileName) throws Exception {
      return null;
   }
   /**
    * 导入生命周期
    * @param file
    * @return
    */
   @Override
   public BaseResult importLifeCycles(File file) throws Exception {
      return null;
   }
   /**
    * 检查生命周期名称是否已存在
    * @param name
    * @return
    */
   public boolean checkLCExist(String name) {
      try {
         LifeCycle lc = platformClientUtil.getLifeCycleService().getLifeCycle(name);
         if (lc != null && !lc.name.equals("")) {
            return true;
         }
      } catch (PLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         logger.error(VciBaseUtil.getExceptionMessage(e));
      }
      return false;
   }
   /**
    * 检查生命周期是否合规
    * @param lifeCycle
    * @param isAdd 是否为新增
    * @throws PLException
    */
   public void checkLifeCycle(LifeCycle lifeCycle,boolean isAdd) throws PLException {
      String name = lifeCycle.name;
      if (Func.isBlank(name)) {
         throw new PLException("500", new String[]{"请输入生命周期名称!"});
      }
      if (!name.matches("[a-z A-Z]*")) {
         throw new PLException("500", new String[]{"生命周期名称只能为英文字母!"});
      }
      if (isAdd && checkLCExist(name)) {
         throw new PLException("500", new String[]{"该生命周期名称已经存在!"});
      }
      if (Func.isBlank(lifeCycle.startState)) {
         throw new PLException("500", new String[]{"请选择开始状态!"});
      }
   }
   /**
    * 生命周期的链接线
    *
    * @param id 编号
@@ -580,7 +780,6 @@
      return ervo;
   }
   /**
    * 批量执行跃迁操作,要求必须是同一个业务类型下的
    * @param bos 业务类型数据对象
@@ -589,7 +788,7 @@
    * @throws VciBaseException  跃迁出错的是会抛出异常
    */
   @Override
   public void batchTransVo(com.vci.corba.omd.data.BusinessObject[] bos,OsLifeCycleLineVO[] lineVOs,String[] releaseStatus) throws VciBaseException{
   public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] lineVOs,String[] releaseStatus) throws VciBaseException{
      if(bos!=null && lineVOs != null && lineVOs.length == bos.length){
         try {
            if(releaseStatus == null){