Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -1,20 +1,30 @@
package com.vci.web.service.impl;
import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.data.BusinessObject;
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]));
      }
   }
@@ -152,12 +164,12 @@
    * @throws VciBaseException 转换生命周期出错的时候抛出异常
    */
   @Override
   public void transCboStatus(List<com.vci.client.bof.ClientBusinessObject> cboList,
   public void transCboStatus(List<BusinessObject> cboList,
         String targetStatus) throws VciBaseException {
      WebUtil.alertNotNull(cboList,"业务数据对象",targetStatus,"目标对象");
      com.vci.corba.omd.data.BusinessObject[] bos = new com.vci.corba.omd.data.BusinessObject[cboList.size()];
      BusinessObject[] bos = new BusinessObject[cboList.size()];
      for(int i = 0 ; i < cboList.size() ; i ++){
         bos[i] = cboList.get(i).getBusinessObject();
         bos[i] = cboList.get(i);
      }
      transStatus(bos, targetStatus);
   }
@@ -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);
@@ -309,12 +322,11 @@
   @VciUnLog
   public List<OsLifeCycleVO> selectAllLifeCycle() throws VciBaseException {
      try {
//         LifeCyle[] lifeCyles = platformClientUtil.getLifeCycleService().getLifeCyles();
         LifeCycle[] lifeCyles = ServiceProvider.getOMDService().getLifeCycleService().getLifeCycles();
         LifeCycle[] lifeCyles = platformClientUtil.getLifeCycleService().getLifeCycles();
         return lifeCycleDO2VOs(Arrays.stream(lifeCyles).collect(Collectors.toList()));
      } catch (PLException vciError) {
          if(logger.isErrorEnabled()){
//             logger.error(vciError.error_code,vciError);
             logger.error(vciError.code,vciError);
          }
          throw WebUtil.getVciBaseException(vciError);
      }
@@ -361,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 业务类型数据对象
@@ -369,12 +380,11 @@
    * @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);
//            platformClientUtil.getBOFactoryService().transferBusinessObject(new BusinessObjectHolder(obj), transitionVO);
            ServiceProvider.getBOFService().transferBusinessObject(obj, transitionVO.destination);
            TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO);
            platformClientUtil.getBOFService().transferBusinessObject(obj, transitionVO.destination);
         } catch (PLException e) {
            throw WebUtil.getVciBaseException(e);
         }
@@ -388,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;
@@ -419,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);
   }
@@ -458,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);
@@ -476,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);
@@ -485,7 +499,7 @@
   }
   /**
    * 状态在生命周期中使用的勤快
    * 状态在生命周期中使用的范围
    *
    * @param statusOid 状态的主键
    * @return 生命周期的信息
@@ -539,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 编号
@@ -582,7 +780,6 @@
      return ervo;
   }
   /**
    * 批量执行跃迁操作,要求必须是同一个业务类型下的
    * @param bos 业务类型数据对象
@@ -591,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){
@@ -604,9 +801,7 @@
            for(int i = 0 ; i < lineVOs.length; i ++){
               vos[i] = lifeCycleLineVO2DO(lineVOs[i]);
            }
//            platformClientUtil.getBOFactoryService().batchTransferBusinessObjectAndRelease(
//                  bos, vos, releaseStatus);
            ServiceProvider.getBOFService().batchTransferBusinessObjectAndRelease(
            platformClientUtil.getBOFService().batchTransferBusinessObjectAndRelease(
                  bos, vos, releaseStatus);
         } catch (PLException e) {
            throw WebUtil.getVciBaseException(e);