ludc
2024-08-06 daf9ff33f0a36c9037af70f574697d80174915f8
生命周期所有接口上传(待联调)
已修改11个文件
已添加1个文件
463 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsLifeCycleLineBoundVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsLifeCycleVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsEnumPO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsLifeCyclePO.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsLifeCycleLineBoundVO.java
@@ -1,7 +1,7 @@
package com.vci.pagemodel;
/**
 * ç”Ÿå‘½å‘¨æœŸçš„连接线
 * ç”Ÿå‘½å‘¨æœŸçš„图标大小和坐标
 * @author weidy
 * @date 2022-1-12
 */
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsLifeCycleVO.java
@@ -92,7 +92,7 @@
    private List<OsLifeCycleLineVO> lines ;
    /**
     * é“¾æŽ¥çº¿
     * ç”Ÿå‘½å‘¨æœŸçš„图标大小和坐标
     */
    private OsLifeCycleLineBoundVO[] bounds;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsEnumPO.java
@@ -32,7 +32,7 @@
    private String rowIndex;
    /**
     * å±žæ€§è‹±æ–‡åç§°
     * è‹±æ–‡åç§°
     */
    @ExcelColumn(value="枚举名称",nullable = false)
    private String id;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsLifeCyclePO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.vci.po;
import com.vci.dto.OsEnumItemDTO;
import com.vci.dto.OsLifeCycleLineDTO;
import com.vci.pagemodel.OsLifeCycleLineBoundVO;
import com.vci.pagemodel.OsLifeCycleLineVO;
import com.vci.starter.poi.annotation.ExcelColumn;
import com.vci.starter.web.pagemodel.BaseModelVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
 * ç”Ÿå‘½å‘¨æœŸå¯¼å…¥å¯¹è±¡
 * @author ludc
 * @date 2024/7/19 11:11
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OsLifeCyclePO extends BaseModelVO {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = -2239512786206928201L;
    /**
     * æ‰€åœ¨æ•°æ®è¡Œ
     */
    @ExcelColumn(rowIndexColumn = true,value = "")
    private String rowIndex;
    /**
     * ç”Ÿå‘½å‘¨æœŸè‹±æ–‡åç§°
     */
    @ExcelColumn(value="名称",nullable = false)
    private String id;
    /**
     * æ ‡ç­¾
     */
    @ExcelColumn(value="标签")
    private String name;
    /**
     * èµ·å§‹çŠ¶æ€
     */
    @ExcelColumn(value="起始状态",nullable = false)
    private String startStatus;
    /**
     * æè¿°
     */
    @ExcelColumn(value="描述")
    private String description;
    /**
     * è¿žæŽ¥çº¿åç§°
     */
    /*@ExcelColumn(value="连接线名称")
    private String lineName;*/
    /**
     * è¿žæŽ¥çº¿èµ·å§‹çŠ¶æ€
     */
    @ExcelColumn(value="连接线起始状态")
    private String sourceLifeStatus;
    /**
     * è¿žæŽ¥çº¿ç›®æ ‡çŠ¶æ€
     */
    @ExcelColumn(value="连接线目标状态")
    private String targetLifeStatus;
    /**
     * äº‹ä»¶
     */
    @ExcelColumn(value="事件(;间隔)")
    private String events;
    /**
     * ç”¨äºŽæ•´ç†æˆ1对多关系时使用,不针对导入使用
     */
    private List<OsLifeCycleLineVO> lineItems = new ArrayList<>();
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
@@ -924,7 +924,7 @@
            });
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",e.getMessage());
                logger.error("读取excel内容时或保存部门时出现了错误,具体原因:",e.getMessage());
            }
            e.printStackTrace();
            return BaseResult.fail(LangBaseUtil.getErrorMsg(e),new String[]{},e);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java
@@ -1,9 +1,7 @@
package com.vci.web.controller;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.dto.OsAttributeDTO;
import com.vci.dto.OsLifeCycleDTO;
import com.vci.pagemodel.OsAttributeVO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.annotation.log.VciBusinessLog;
import com.vci.starter.web.exception.VciBaseException;
@@ -213,4 +211,20 @@
        }
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰è·ƒè¿äº‹ä»¶key
     * @return
     */
    @GetMapping("/getLCEventKeys")
    public BaseResult getLCEventKeys(){
        try {
            return BaseResult.dataList(lifeCycleService.getLCEventKeys());
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "跃迁事件查询时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java
@@ -3,7 +3,6 @@
import com.vci.corba.common.PLException;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.dto.OsAttributeDTO;
import com.vci.dto.OsLifeCycleDTO;
import com.vci.pagemodel.*;
import com.vci.starter.web.exception.VciBaseException;
@@ -89,7 +88,7 @@
     * @param lifeCycleVO æ˜¾ç¤ºå¯¹è±¡
     * @return æ•°æ®å¯¹è±¡
     */
    LifeCycle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO);
    LifeCycle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO) throws PLException;
    /**
     * æŸ¥è¯¢æ‰€æœ‰ç”Ÿå‘½å‘¨æœŸçŠ¶æ€
@@ -148,6 +147,13 @@
     * @return çŠ¶æ€çš„æ˜¾ç¤ºå¯¹è±¡
     */
    List<OsStatusVO> listStatusById(String lifeCycleId);
    /**
     * ä½¿ç”¨å¤šä¸ªç¼–号获取生命周期的对象
     * @param lcIdList ç¼–号
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    List<OsLifeCycleVO> getLifeCycleByIds(Collection<String> lcIdList);
    /**
     * æ‰¹é‡æ·»åŠ ç”Ÿå‘½å‘¨æœŸ
@@ -240,4 +246,10 @@
     */
    OsERVO listLinesPic(String id);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è·ƒè¿äº‹ä»¶key
     * @return
     */
    List<String> getLCEventKeys() throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -1091,7 +1091,7 @@
            });
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
                logger.error("读取excel内容时或保存属性时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            }
            e.printStackTrace();
            return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java
@@ -642,7 +642,7 @@
            }
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
                logger.error("读取excel内容时或保存枚举时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            }
            e.printStackTrace();
            return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -6,21 +6,21 @@
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.dto.*;
import com.vci.pagemodel.*;
import com.vci.po.OsLifeCyclePO;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.starter.poi.util.ExcelUtil;
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.starter.web.util.*;
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;
@@ -28,6 +28,7 @@
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -76,6 +77,11 @@
     */
    @Autowired
    private WebBoServiceI boService;
    /**
     *  å¿…填列
     */
    private List<Integer> ColumnNameisRed = new ArrayList<Integer>();
    /**
     * æ—¥å¿—
@@ -226,6 +232,23 @@
                e.printStackTrace();
            }
            life.setOid(lifeCycle.oid);
            Bound[] bounds = lifeCycle.bounds;
            if(bounds != null && bounds.length>0){
                List<OsLifeCycleLineBoundVO> boundVOList = new ArrayList<>();
                Arrays.stream(bounds).forEach(bound->{
                    OsLifeCycleLineBoundVO boundVO = new OsLifeCycleLineBoundVO();
                    boundVO.setId(bound.id);
                    boundVO.setCellx(bound.cellx);
                    boundVO.setCelly(bound.celly);
                    boundVO.setCellh(bound.cellh);
                    boundVO.setCellw(bound.cellw);
                    boundVO.setCellicon(bound.cellicon);
                    boundVOList.add(boundVO);
                });
                life.setBounds(boundVOList.toArray(new OsLifeCycleLineBoundVO[boundVOList.size()]));
            }else{
                life.setBounds(new OsLifeCycleLineBoundVO[0]);
            }
            List<OsLifeCycleLineVO> lineVOS = new ArrayList<>();
            if(lifeCycle.routes!=null&& lifeCycle.routes.length>0){
                Arrays.stream(lifeCycle.routes).forEach(route->{
@@ -271,17 +294,17 @@
     * @return æ•°æ®å¯¹è±¡
     */
    @Override
    public LifeCycle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO){
    public LifeCycle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO) throws PLException {
        LifeCycle lifeCyle = new LifeCycle();
        lifeCyle.name = lifeCycleVO.getId();
        lifeCyle.tag = lifeCycleVO.getName();
        lifeCyle.oid = lifeCycleVO.getOid();
        String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        String userId = "developer";//WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        lifeCyle.creator = Func.isBlank(lifeCycleVO.getCreator()) ? userId:lifeCycleVO.getCreator();
        lifeCyle.description = lifeCycleVO.getDescription();
        lifeCyle.modifier = Func.isBlank(lifeCycleVO.getLastModifier()) ? userId:lifeCycleVO.getLastModifier();
        lifeCyle.modifyTime = System.currentTimeMillis();
        lifeCyle.createTime = lifeCycleVO.getCreateTime() != null ? lifeCycleVO.getCreateTime().getTime():null;
        lifeCyle.createTime = lifeCycleVO.getCreateTime() != null ? lifeCycleVO.getCreateTime().getTime():System.currentTimeMillis();
        lifeCyle.startState =lifeCycleVO.getStartStatus();
        lifeCyle.ts = VciDateUtil.date2Str(lifeCycleVO.getTs(),VciDateUtil.DateTimeMillFormat);
        if(lifeCycleVO.getBounds() !=null && lifeCycleVO.getBounds().length>0) {
@@ -302,7 +325,7 @@
        }else{
            lifeCyle.bounds = new Bound[0];
        }
        //加链接线
        //加连接线
        List<TransitionVO> lines = new ArrayList<>();
        for (int i = 0; i < lifeCycleVO.getLines().size(); i++) {
            OsLifeCycleLineVO lineVO = lifeCycleVO.getLines().get(i);
@@ -398,7 +421,7 @@
     * @param lineVO è¿žæŽ¥çº¿å¯¹è±¡
     * @return å¹³å°çš„连接线对象
     */
    private TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){
    private TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO) throws PLException {
        com.vci.corba.omd.lcm.TransitionVO transitionVO = new com.vci.corba.omd.lcm.TransitionVO();
        transitionVO.id = lineVO.getOid();
        transitionVO.source = lineVO.getSourceLifeStatus();
@@ -414,7 +437,8 @@
                OsLifeCycleLineEventVO eventVO = lineVO.getEvents()[j];
                TransitionVOEvent event = new TransitionVOEvent();
                event.id = eventVO.getOid();
                event.name = eventVO.getEventFullName();
                event.name = Func.isBlank(eventVO.getEventFullName()) ?
                        platformClientUtil.getLifeCycleService().getLCEventValueByKey(eventVO.getOid()):eventVO.getEventFullName();
                events[j] = event;
            }
        }
@@ -434,7 +458,7 @@
    }
    /**
     * ä½¿ç”¨ç”Ÿå‘½å‘¨æœŸçš„编号回去包含的状态显示对象
     * ä½¿ç”¨ç”Ÿå‘½å‘¨æœŸçš„编号获取包含的状态显示对象
     *
     * @param lifeCycleId ç”Ÿå‘½å‘¨æœŸçš„编号
     * @return çŠ¶æ€çš„æ˜¾ç¤ºå¯¹è±¡
@@ -456,6 +480,27 @@
            statusVOList.add(statusVOMap.getOrDefault(statusId,new OsStatusVO()));
        });
        return statusVOList;
    }
    /**
     * ä½¿ç”¨å¤šä¸ªç¼–号获取生命周期的对象
     * @param lcIdList ç¼–号
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<OsLifeCycleVO> getLifeCycleByIds(Collection<String> lcIdList) {
        if(Func.isEmpty(lcIdList)){
            return null;
        }
        Map<String, OsLifeCycleVO> lifeCycleVOMap = self.selectAllLifeCycleMap();
        List<OsLifeCycleVO> lifeCycleVOList = new ArrayList<>();
        lcIdList.stream().forEach(vrId->{
            OsLifeCycleVO lifeCycleVO = lifeCycleVOMap.getOrDefault(vrId,null);
            if(lifeCycleVO != null){
                lifeCycleVOList.add(lifeCycleVO);
            }
        });
        return lifeCycleVOList;
    }
    /**
@@ -663,9 +708,81 @@
     */
    @Override
    public String exportLifeCycles(String exportFileName, String lcNames, boolean flag) throws PLException {
        if(Func.isBlank(lcNames)){
            throw new PLException("500",new String[]{"请勾选要导出的生命周期模板!"});
        }
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "版本规则导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = this.getCloumns(flag);
        //写excel
        String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + exportFileName +  ".xls";
        try {
            new File(excelPath).createNewFile();
        } catch (Throwable e) {
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelPath}, e);
        }
        //设置列
        List<WriteExcelData> excelDataList = new ArrayList<>();
        //设置列头
        for (int index = 0; index < columns.size(); index++) {
            excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
        }
        //按照版本规则名查询,然后处理版本规则导出
        List<String> lcIdList = Func.toStrList(lcNames);
        List<OsLifeCycleVO> lifeCycleVOList = this.getLifeCycleByIds(lcIdList);
        if(Func.isEmpty(lifeCycleVOList)){
            excelDataList.add(new WriteExcelData(1,1, "根据名称未查询到生命周期信息,请刷新后尝试重新导出!"));
        }else{
            int row = 1;
            for (int i = 0; i < lifeCycleVOList.size(); i++) {
                OsLifeCycleVO lifeCycleVO = lifeCycleVOList.get(i);
                List<OsLifeCycleLineVO> lines = lifeCycleVO.getLines();
                if(Func.isNotEmpty(lines)){
                    for (int j = 0; j < lines.size(); j++) {
                        int start = row + j;
                        excelDataList.add(new WriteExcelData(start,0, lifeCycleVO.getId()));
                        excelDataList.add(new WriteExcelData(start,1, lifeCycleVO.getName()));
                        excelDataList.add(new WriteExcelData(start,2, lifeCycleVO.getStartStatus()));
                        excelDataList.add(new WriteExcelData(start,3, lifeCycleVO.getDescription()));
                        OsLifeCycleLineVO osLifeCycleLineVO = lines.get(j);
                        //按照导出模板列填数据
                        if(!flag){
                            excelDataList.add(new WriteExcelData(start,4, osLifeCycleLineVO.getName()));
                            excelDataList.add(new WriteExcelData(start,5, osLifeCycleLineVO.getSourceLifeStatus()));
                            excelDataList.add(new WriteExcelData(start,6, osLifeCycleLineVO.getSourceLifeStatusName()));
                            excelDataList.add(new WriteExcelData(start,7, osLifeCycleLineVO.getTargetLifeStatus()));
                            excelDataList.add(new WriteExcelData(start,8, osLifeCycleLineVO.getTargetLifeStatusName()));
                            //处理连接线包含的事件
                            OsLifeCycleLineEventVO[] events = osLifeCycleLineVO.getEvents();
                            if(events != null && events.length > 0){
                                String collect = Arrays.stream(events).map(OsLifeCycleLineEventVO::getOid).collect(Collectors.joining(";"));
                                excelDataList.add(new WriteExcelData(start,9, collect));
                            }
                            excelDataList.add(new WriteExcelData(start,10, Func.format(lifeCycleVO.getCreateTime(),"yyyyå¹´MM月dd日 hh:mm:ss")));
                        }else{
                            excelDataList.add(new WriteExcelData(start,4, osLifeCycleLineVO.getSourceLifeStatus()));
                            excelDataList.add(new WriteExcelData(start,5, osLifeCycleLineVO.getTargetLifeStatus()));
                        }
                    }
                    row = row+lines.size();
                }else{
                    excelDataList.add(new WriteExcelData(row,0, lifeCycleVO.getId()));
                    excelDataList.add(new WriteExcelData(row,1, lifeCycleVO.getName()));
                    excelDataList.add(new WriteExcelData(row,2, lifeCycleVO.getStartStatus()));
                    excelDataList.add(new WriteExcelData(row,3, lifeCycleVO.getDescription()));
                    if(!flag){
                        excelDataList.add(new WriteExcelData(row,10, Func.format(lifeCycleVO.getCreateTime(),"yyyyå¹´MM月dd日 hh:mm:ss")));
                    }
                    row++;
                }
        return null;
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
@@ -676,7 +793,38 @@
     */
    @Override
    public String downloadLifeCycleTemplate(String exportFileName) throws Exception {
        return null;
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "生命周期导入模板_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = this.getCloumns(true);
        //设置必填列
        ColumnNameisRed.clear();
        ColumnNameisRed.add(0);
        ColumnNameisRed.add(2);
        //写excel
        String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + exportFileName +  ".xls";
        try {
            new File(excelPath).createNewFile();
        } catch (Throwable e) {
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelPath}, e);
        }
        //设置列
        List<WriteExcelData> excelDataList = new ArrayList<>();
        //设置列头
        for (int index = 0; index < columns.size(); index++) {
            //判断是否为必填列,给必填列设置颜色
            if(ColumnNameisRed.contains(index)){
                WriteExcelData excelData = new WriteExcelData(0, index, columns.get(index));
                excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
                excelDataList.add(excelData);
            }else{
                excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
@@ -686,9 +834,139 @@
     */
    @Override
    public BaseResult importLifeCycles(File file) throws Exception {
        VciBaseUtil.alertNotNull(file,"excel文件");
        if(!file.exists()){
            throw new VciBaseException("导入的excel文件不存在,{0}",new String[]{file.getPath()});
        }
        try{
            //1、读取excel中的数据,组成对象
            ReadExcelOption excelOption = new ReadExcelOption();
            List<OsLifeCyclePO> poList = ExcelUtil.readDataObjectFromExcel(file, OsLifeCyclePO.class,excelOption,(value, po, fieldName)->{});
            //去除都是空的情况
            if(CollectionUtils.isEmpty(poList)){
                return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
            }
            //将枚举和枚举项处理成一对多关系的对象
            Map<String, OsLifeCyclePO> groupPOMap = new HashMap<>();
            //默认的生命周期图标的坐标和宽度等信息
            List<OsLifeCycleLineBoundVO> defaultBoundList = new ArrayList<>();
            for (OsLifeCyclePO po : poList) {
                //拼接用来作为分组的key
                String key = po.getId() + "_" + po.getName() + "_" + po.getStartStatus();
                OsLifeCyclePO group = groupPOMap.get(key);
                if (group == null) {
                    group = new OsLifeCyclePO();
                    //拿出现的首行做后续的提示行
                    group.setRowIndex(po.getRowIndex());
                    group.setId(po.getId());
                    group.setName(po.getName());
                    group.setStartStatus(po.getStartStatus());
                    group.setDescription(po.getDescription());
                    groupPOMap.put(key, group);
                    //处理生命周期图标的默认的坐标信息
                    OsLifeCycleLineBoundVO boundVO = new OsLifeCycleLineBoundVO();
                    boundVO.setCellh("30.0");
                    boundVO.setCellw("80.0");
                    boundVO.setCellx(String.valueOf(200+(Integer.parseInt(po.getRowIndex())*60)));
                    boundVO.setCelly(String.valueOf(300+(Integer.parseInt(po.getRowIndex())*60)));
                    boundVO.setCellicon("");
                    defaultBoundList.add(boundVO);
                }
        return null;
                OsLifeCycleLineVO lineItemVO = new OsLifeCycleLineVO();
                lineItemVO.setName("line"+po.getRowIndex());
                lineItemVO.setSourceLifeStatus(po.getSourceLifeStatus());
                lineItemVO.setTargetLifeStatus(po.getTargetLifeStatus());
                //处理连接线包含的事件
                String[] eventArr = po.getEvents().split(";");
                if(eventArr != null & eventArr.length > 0){
                    List<OsLifeCycleLineEventVO> eventVOList = new ArrayList<>();
                    for (int i = 0; i < eventArr.length; i++) {
                        OsLifeCycleLineEventVO osLCLineEventVO = new OsLifeCycleLineEventVO();
                        osLCLineEventVO.setOid(eventArr[i]);
                        String lcEventValueByKey = platformClientUtil.getLifeCycleService().getLCEventValueByKey(eventArr[i]);
                        osLCLineEventVO.setEventFullName(lcEventValueByKey);
                        eventVOList.add(osLCLineEventVO);
                    }
                    lineItemVO.setEvents(eventVOList.toArray(new OsLifeCycleLineEventVO[eventVOList.size()]));
                }
                group.getLineItems().add(lineItemVO);
            }
            Collection<OsLifeCyclePO> newPOList = groupPOMap.values();
            //数据库查询是否有已存在的生命周期名,方便后续做判重处理
            List<OsLifeCycleVO> lifeCycleVOList = this.getLifeCycleByIds(poList.stream().map(OsLifeCyclePO::getId).collect(Collectors.toSet()));
            List<String> repeatLCId = new ArrayList<>();
            if(Func.isNotEmpty(lifeCycleVOList)){
                repeatLCId = lifeCycleVOList.stream().map(OsLifeCycleVO::getId).collect(Collectors.toList());
            }
            //当前excel中是否重复用的判重Map:(key:判重属性,value:行号)
            Map<String, String> excelReapeat = new HashMap<>();
            //判断必填属性是否为空等等
            List<String> finalRepeatLCId = repeatLCId;
            newPOList.stream().forEach(lcPO -> {
                if(Func.isBlank(lcPO.getId())){
                    throw new VciBaseException("第【"+lcPO.getRowIndex()+"】行,lcnameerror");
                }else if(Func.isEmpty(lcPO.getStartStatus())){
                    throw new VciBaseException("第【"+lcPO.getRowIndex()+"】行,startstatuserror");
                }else if(!lcPO.getId().matches("^[A-Za-z]+$")){
                    throw new VciBaseException("第【"+lcPO.getRowIndex()+"】行数据,名称只能为英文字母");
                }else if(excelReapeat.containsKey(lcPO.getId())){//名称表格中判重
                    throw new VciBaseException("第【"+excelReapeat.get(lcPO.getId())+"】行和第【"+lcPO.getRowIndex()+"】行数据,名称重复");
                }else if (Func.isNotEmpty(finalRepeatLCId) && finalRepeatLCId.contains(lcPO.getId())){//2、判断名称是否与系统中重复
                    throw new VciBaseException("第【"+lcPO.getRowIndex()+"】行,名称在系统中已经存在,请修改!");
                }
                //先对枚举名excel中需要判重处理
                excelReapeat.put(lcPO.getId(),lcPO.getRowIndex());
            });
            //保存逻辑
            for (OsLifeCyclePO osLifeCyclePO : newPOList) {
                OsLifeCycleVO osLifeCycleVO = new OsLifeCycleVO();
                //生成存储的DTO对象
                osLifeCycleVO.setId(osLifeCyclePO.getId());
                osLifeCycleVO.setName(osLifeCyclePO.getName());
                osLifeCycleVO.setDescription(osLifeCyclePO.getDescription());
                osLifeCycleVO.setStartStatus(osLifeCyclePO.getStartStatus());
                osLifeCycleVO.setLines(osLifeCyclePO.getLineItems());
                osLifeCycleVO.setBounds(defaultBoundList.toArray(new OsLifeCycleLineBoundVO[defaultBoundList.size()]));
                //调用新增枚举方法
                boolean addBoolean = platformClientUtil.getLifeCycleService().addLifeCycle(lifeCycleVO2DO(osLifeCycleVO));
                if(!addBoolean){
                    throw new PLException("500",new String[]{"保存生命周期名,为【" + osLifeCycleVO.getId() + "】的数据时出现错误!"});
                }
            }
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存生命周期信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            }
            e.printStackTrace();
            return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
        }
        return BaseResult.success("生命周期导入成功!");
    }
    /**
     * èŽ·å–å¯¼å‡ºæˆ–å¯¼å…¥æ¨¡æ¿çš„åˆ—å
     * @param flag æ˜¯å¦èŽ·å–å¯¼å…¥æ¨¡æ¿åˆ—å
     * @return
     */
    private List<String> getCloumns(boolean flag){
        if(flag){
            return new ArrayList<>(
                    Arrays.asList(
                            "名称", "标签", "起始状态", "描述",
                            "连接线起始状态", "连接线目标状态", "事件(;间隔)"
                    )
            );
        }
        return new ArrayList<>(
                Arrays.asList(
                        "名称", "标签", "起始状态", "描述",
                        "连接线名称", "连接线起始状态英文名称","连接线起始状态中文名称",
                        "连接线目标状态英文名称","连接线目标状态中文名称", "事件", "创建时间"
                )
        );
    }
    /**
@@ -781,6 +1059,15 @@
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰è·ƒè¿äº‹ä»¶key
     * @return
     */
    @Override
    public List<String> getLCEventKeys() throws PLException {
        return Arrays.asList(platformClientUtil.getLifeCycleService().getLCEventKeys());
    }
    /**
     * æ‰¹é‡æ‰§è¡Œè·ƒè¿æ“ä½œï¼Œè¦æ±‚必须是同一个业务类型下的
     * @param bos ä¸šåŠ¡ç±»åž‹æ•°æ®å¯¹è±¡
     * @param lineVOs è·ƒè¿å¯¹è±¡
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java
@@ -539,7 +539,7 @@
            });
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
                logger.error("读取excel内容时或保存版本规则时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            }
            e.printStackTrace();
            return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
@@ -243,7 +243,7 @@
     * @param lifeCycleDTOList è¦å¯¼å…¥çš„生命周期数据传输对象列表
     * @throws VciBaseException æŸ¥è¯¢æˆ–者保存出错的时候,会抛出异常
     */
    private void importLifeCycles(Collection<OsLifeCycleDTO> lifeCycleDTOList) throws VciBaseException{
    private void importLifeCycles(Collection<OsLifeCycleDTO> lifeCycleDTOList) throws VciBaseException, PLException {
        Set<String> existLifeCycleIds = lifeCycleService.selectAllLifeCycleMap().keySet();
        //生命周期的名称没有转为小写,但是平台又区分大小写
        List<String> existLifeCycleLowIds = existLifeCycleIds.stream().map(s->s.toLowerCase(Locale.ROOT)).collect(Collectors.toList());