田源
2024-07-31 93cfe891a02766e0c56c5781eb6ca8a5cc5fb16f
Merge remote-tracking branch 'origin/master'
已修改15个文件
已添加1个文件
1022 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsStatusDTO.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsStatusVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsAttributePO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsStatusPO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciOsStatusController.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsStatusServiceI.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java 300 ●●●● 补丁 | 查看 | 原始文档 | 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/dto/OsStatusDTO.java
@@ -33,10 +33,75 @@
    private String description;
    /**
     * å›¾ç‰‡è·¯å¾„
     */
    public String imagePath;
    /**
     * åˆ›å»ºäºº
     */
    private String creator;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * æœ€åŽä¿®æ”¹äºº
     */
    private String lastModifier;
    /**
     * æœ€åŽä¿®æ”¹æ—¶é—´ï¼Œæ ¼å¼æ˜¯yyyy-MM-dd HH:mm:ss
     */
    private Date lastModifyTime;
    /**
     * æ—¶é—´æˆ³ï¼Œç”¨äºŽæ ¡éªŒæ˜¯å¦æœ€æ–°æ•°æ®
     */
    private Date ts;
    public void setCreator(String creator) {
        this.creator = creator;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public void setLastModifier(String lastModifier) {
        this.lastModifier = lastModifier;
    }
    public void setLastModifyTime(Date lastModifyTime) {
        this.lastModifyTime = lastModifyTime;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public String getLastModifier() {
        return lastModifier;
    }
    public Date getLastModifyTime() {
        return lastModifyTime;
    }
    public String getCreator() {
        return creator;
    }
    public String getImagePath() {
        return imagePath;
    }
    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }
    public String getOid() {
        return oid;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsStatusVO.java
@@ -36,6 +36,11 @@
    private String description;
    /**
     * å›¾ç‰‡è·¯å¾„
     */
    public String imagePath;
    /**
     * ä¸šåŠ¡ç±»åž‹åç§°
     */
    private String btmname;
@@ -70,6 +75,14 @@
     */
    private Date ts;
    public String getImagePath() {
        return imagePath;
    }
    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }
    public String getOid() {
        return oid;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsAttributePO.java
@@ -52,7 +52,7 @@
    /**
     * å±žæ€§ç±»åž‹
     */
    @ExcelColumn(value="属性类型",nullable = false)
    @ExcelColumn(value="属性类型(请参照新增界面的属性类型填写)",nullable = false)
    private String attributeDataType;
    /**
@@ -112,7 +112,7 @@
    /**
     * å±žæ€§é•¿åº¦
     */
    @ExcelColumn(value="取值范围")
    @ExcelColumn(value="取值范围)")
    private String range;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsStatusPO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.vci.po;
import com.vci.starter.poi.annotation.ExcelColumn;
import com.vci.starter.web.pagemodel.BaseModelVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * å±žæ€§æ± å¯¼å…¥å¯¹è±¡
 * @author ludc
 * @date 2024/7/19 11:11
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OsStatusPO 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="图片(路径)")
    private String imagePath;
    /**
     * æè¿°
     */
    @ExcelColumn(value="描述(可以为空)")
    private String description;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -117,7 +117,7 @@
    /**
     * å¿…填列
     */
    private ArrayList<Integer> ColumnNameisRed = new ArrayList<Integer>();
    private List<Integer> ColumnNameisRed = new ArrayList<Integer>();
    /**
     * ç”¨æˆ·åˆ†é¡µæŸ¥è¯¢æ—¶èŽ·å–éƒ¨é—¨æ”¾åˆ°è¿™é‡Œé¿å…é‡å¤æŸ¥è¯¢
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java
@@ -52,7 +52,7 @@
     * @return å±žæ€§çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/gridAttribute")
    @VciUnCheckRight
    @VciBusinessLog(operateName = "属性列表")
    public BaseResult<OsAttributeVO> gridAttribute(BaseQueryObject baseQueryObject){
        try {
            return BaseResult.dataGrid(attributeService.gridAttribute(baseQueryObject));
@@ -107,7 +107,6 @@
     */
    @PutMapping( "/updateAttribute")
    @VciBusinessLog(operateName = "修改属性")
    @VciUnCheckRight
    public BaseResult updateAttribute(@RequestBody OsAttributeDTO osAttributeDTO) {
        try {
            return attributeService.updateAttribute(osAttributeDTO) ? BaseResult.success("属性修改成功!"):BaseResult.fail("属性修改失败!");
@@ -208,7 +207,7 @@
     * @return
     */
    @PostMapping("/importAttributes")
    @VciUnCheckRight
    @VciBusinessLog(operateName = "导入属性")
    public BaseResult importAttributes(MultipartFile file){
        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
        File file1 = new File(excelFileName);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
@@ -18,8 +18,11 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -57,7 +60,6 @@
     * @return é“¾æŽ¥ç±»åž‹çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/getAllLtName")
    @VciUnCheckRight
    public BaseResult getAllLtName(){
        try {
            return BaseResult.dataList(linkTypeService.getAllLtName());
@@ -155,4 +157,74 @@
            return objectBaseResult;
        }
    }
    /**
     * é“¾æŽ¥ç±»åž‹åˆ é™¤
     * linkType é“¾æŽ¥ç±»åž‹å¯¹è±¡
     * @return åˆ é™¤ç»“æžœ
     */
    @DeleteMapping("/deleteLink")
    public BaseResult deleteLink(@RequestBody LinkType linkType){
        try {
            return linkTypeService.deleteLink(linkType);
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        }
    }
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥
     * @return åˆ é™¤ç»“æžœ
     */
    @GetMapping("/checkLinkType")
    public BaseResult checkLinkType(){
        try {
            return linkTypeService.checkLinkType();
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        }
    }
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥ä¿®å¤æ•°æ®åº“表
     * repairData éœ€è¦ä¿®å¤çš„æ•°æ®
     * @return ä¿®å¤ç»“æžœ
     */
    @PostMapping("/repairTable")
    public BaseResult repairTable(@RequestBody String repairData){
        try {
            return linkTypeService.repairTable(repairData);
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        } catch (IOException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(500);
            objectBaseResult.setMsg(e.getMessage());
            return objectBaseResult;
        }
    }
    /**
     * åˆ›å»ºè§†å›¾
     * @return åˆ›å»ºç»“æžœ
     */
    @PostMapping("/createView")
    public BaseResult createView(){
        try {
            return linkTypeService.createView();
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/VciOsStatusController.java
@@ -1,16 +1,33 @@
package com.vci.web.controller;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.dto.OsAttributeDTO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.annotation.log.VciBusinessLog;
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.dto.OsStatusDTO;
import com.vci.pagemodel.OsLifeCycleVO;
import com.vci.pagemodel.OsStatusVO;
import com.vci.starter.web.util.ControllerUtil;
import com.vci.starter.web.util.LocalFileUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.web.service.OsLifeCycleServiceI;
import com.vci.web.service.OsStatusServiceI;
import com.vci.web.util.Func;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
/**
 * çŠ¶æ€çš„æŽ§åˆ¶å™¨
@@ -35,14 +52,27 @@
    private OsLifeCycleServiceI lifeCycleService;
    /**
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * çŠ¶æ€çš„åˆ—è¡¨
     * @param queryObject æŸ¥è¯¢å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/gridStatus")
    @VciBusinessLog(operateName = "查看状态列表")
    public DataGrid<OsStatusVO> gridStatus(BaseQueryObject queryObject){
        return statusService.gridStatus(queryObject.getConditionMap(),queryObject.getPageHelper());
    @VciUnCheckRight
    public BaseResult<OsStatusVO> gridStatus(BaseQueryObject queryObject){
        try {
            return BaseResult.dataGrid(statusService.gridStatus(queryObject.getConditionMap(),queryObject.getPageHelper()));
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "属性管理列表查询时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
@@ -51,8 +81,17 @@
     * @return ä½¿ç”¨çš„生命周期的对象
     */
    @GetMapping("/listUsed")
    public DataGrid<OsLifeCycleVO> listUsed(String oid){
        return lifeCycleService.listStatusUsed(oid);
    @VciBusinessLog(operateName = "查询状态池的应用范围")
    @VciUnCheckRight
    public BaseResult<OsLifeCycleVO> listUsed(String oid){
        try {
            return BaseResult.dataGrid(lifeCycleService.listStatusUsed(oid));
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "属性管理列表查询时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
@@ -61,9 +100,15 @@
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping("/addSave")
    public BaseResult addSave(OsStatusDTO statusDTO){
        statusService.addSave(statusDTO);
        return BaseResult.success();
    public BaseResult addSave(@RequestBody OsStatusDTO statusDTO){
        try {
            return statusService.addSave(statusDTO) ? BaseResult.success("添加状态成功!"):BaseResult.fail("添加状态失败!");
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "添加状态时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
@@ -72,20 +117,32 @@
     * @return æ‰§è¡Œç»“æžœ
     */
    @PutMapping("/editSave")
    public BaseResult editSave(OsStatusDTO statusDTO){
        statusService.editSave(statusDTO);
        return BaseResult.success();
    public BaseResult editSave(@RequestBody OsStatusDTO statusDTO){
        try {
            return statusService.editSave(statusDTO) ? BaseResult.success("修改状态成功!"):BaseResult.fail("修改状态失败!");
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "修改状态时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * åˆ é™¤çŠ¶æ€
     * @param oids çŠ¶æ€çš„ä¸»é”®
     * @param osStatusDTOS çŠ¶æ€çš„DTO对象
     * @return æ‰§è¡Œç»“æžœ
     */
    @DeleteMapping("/delete")
    public BaseResult delete(String oids){
        statusService.delete(oids);
        return BaseResult.success();
    @DeleteMapping("/deleteStatus")
    public BaseResult deleteStatus(@RequestBody List<OsStatusDTO> osStatusDTOS){
        try {
            return statusService.deleteStatus(osStatusDTOS) ? BaseResult.success("删除状态成功!"):BaseResult.fail("删除状态失败!");
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "删除状态时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
@@ -98,4 +155,75 @@
        return BaseResult.success(statusService.getObjectByOid(oid));
    }
    /**
     * å¯¼å‡ºçŠ¶æ€
     * @param exportFileName
     * @param statusOids
     * @param response
     */
    @GetMapping( "/exportStatus")
    @VciBusinessLog(operateName = "导出状态")
    public void exportStatus(String exportFileName,String statusOids, HttpServletResponse response){
        try {
            String excelPath = statusService.exportStatus(exportFileName,statusOids);
            ControllerUtil.writeFileToResponse(response,excelPath);
        } catch (Exception e) {
            String msg = "导出状态时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            try {
                //出错时
                e.printStackTrace();
                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
    /**
     * ä¸‹è½½çŠ¶æ€å¯¼å…¥æ¨¡æ¿
     * @param exportFileName
     * @param response
     */
    @GetMapping( "/downloadStatusTemplate")
    @VciBusinessLog(operateName = "导出状态")
    public void downloadStatusTemplate(String exportFileName, HttpServletResponse response){
        try {
            String excelPath = statusService.downloadStatusTemplate(exportFileName);
            ControllerUtil.writeFileToResponse(response,excelPath);
        } catch (Exception e) {
            String msg = "下载枚举导入模板时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            try {
                //出错时
                e.printStackTrace();
                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
    /**
     * å¯¼å…¥çŠ¶æ€
     * @param file
     * @return
     */
    @PostMapping("/importStatus")
    @VciBusinessLog(operateName = "导入状态")
    public BaseResult importStatus(MultipartFile file){
        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
        File file1 = new File(excelFileName);
        try {
            file.transferTo(new File(excelFileName));
            if (file != null) {
                return statusService.importStatus(file1);
            } else {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
            }
        }catch (Throwable e) {
            throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
        }finally {
            file1.delete();
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java
@@ -9,6 +9,7 @@
import com.vci.pagemodel.OsLinkTypeAttributeVO;
import com.vci.pagemodel.OsLinkTypeVO;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -122,4 +123,26 @@
     * @return ä¿å­˜ç»“æžœ
     */
    BaseResult addAndEditLink(LinkType linkType, Boolean addFlag) throws PLException;
    /**
     * é“¾æŽ¥ç±»åž‹åˆ é™¤
     * linkType é“¾æŽ¥ç±»åž‹å¯¹è±¡
     * @return åˆ é™¤ç»“æžœ
     */
    BaseResult deleteLink(LinkType linkType) throws PLException;
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥
     * @return åˆ é™¤ç»“æžœ
     */
    BaseResult checkLinkType() throws PLException;
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥ä¿®å¤æ•°æ®åº“表
     * repairData éœ€è¦ä¿®å¤çš„æ•°æ®
     * @return ä¿®å¤ç»“æžœ
     */
    BaseResult repairTable(String repairData) throws PLException, IOException;
    /**
     * åˆ›å»ºè§†å›¾
     * @return åˆ›å»ºç»“æžœ
     */
    BaseResult createView() throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsStatusServiceI.java
@@ -1,11 +1,14 @@
package com.vci.web.service;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.stm.StatePool;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.PageHelper;
import com.vci.dto.OsStatusDTO;
import com.vci.pagemodel.OsStatusVO;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -54,13 +57,13 @@
     * æ‰¹é‡æ·»åŠ çŠ¶æ€
     * @param statePoolList çŠ¶æ€å†…å®¹
     */
    void batchAddStatus(List<StatePool> statePoolList);
    boolean batchAddStatus(List<StatePool> statePoolList) throws Exception;
    /**
     * æ‰¹é‡ä¿®æ”¹çŠ¶æ€
     * @param statePoolList çŠ¶æ€å†…å®¹
     */
    void batchEditSave(List<StatePool> statePoolList);
    boolean batchEditSave(List<StatePool> statePoolList) throws Exception;
    /**
     * çŠ¶æ€åˆ—è¡¨
@@ -88,19 +91,19 @@
     * æ·»åŠ çŠ¶æ€
     * @param statusDTO çŠ¶æ€çš„æ•°æ®ä¼ è¾“å¯¹è±¡
     */
    void addSave(OsStatusDTO statusDTO);
    boolean addSave(OsStatusDTO statusDTO) throws Exception;
    /**
     * ç¼–辑状态
     * @param statusDTO çŠ¶æ€çš„æ•°æ®ä¼ è¾“å¯¹è±¡
     */
    void editSave(OsStatusDTO statusDTO);
    boolean editSave(OsStatusDTO statusDTO)throws Exception ;
    /**
     * åˆ é™¤çŠ¶æ€
     * @param oids ä¸»é”®
     * @param osStatusDTOS
     */
    void delete(String oids);
    boolean deleteStatus(List<OsStatusDTO> osStatusDTOS) throws PLException;
    /**
     * çŠ¶æ€çš„æ•°æ®ä¼ è¾“å¯¹è±¡è½¬æ¢ä¸ºæ•°æ®å¯¹è±¡
@@ -108,4 +111,28 @@
     * @return å¹³å°çš„æ•°æ®å¯¹è±¡
     */
    StatePool statusDTO2DO(OsStatusDTO statusDTO);
    /**
     * å¯¼å‡ºé€‰ä¸­çš„状态
     * @param exportFileName å¯¼å‡ºçš„æ–‡ä»¶å
     * @param statusOids éœ€è¦å¯¼å‡ºçš„属性名称
     * @return
     */
    String exportStatus(String exportFileName,String statusOids) throws PLException;
    /**
     * ä¸‹è½½çŠ¶æ€å¯¼å…¥æ¨¡æ¿
     * @param exportFileName
     * @return
     * @throws PLException
     */
    String downloadStatusTemplate(String exportFileName) throws Exception;
    /**
     * å¯¼å…¥çŠ¶æ€
     * @param file
     * @return
     */
    BaseResult importStatus(File file) throws Exception;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -33,6 +33,7 @@
import com.vci.web.properties.UsedNames;
import com.vci.web.service.OsAttributeServiceI;
import com.vci.web.service.OsBaseServiceI;
import com.vci.web.service.OsEnumServiceI;
import com.vci.web.service.OsLinkTypeServiceI;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
@@ -111,6 +112,13 @@
    @Autowired(required = false)
    @Lazy
    private OsBtmServiceImpl osBtmService;
    /**
     * æžšä¸¾çš„æœåŠ¡
     */
    @Autowired
    @Lazy
    private OsEnumServiceI  enumService;
    /**
     *  å¿…填列
@@ -511,7 +519,7 @@
        if(hasInstance && !compatible){
            throw new PLException("500",new String[]{"无效变更, ä¸å…¼å®¹å·²äº§ç”Ÿçš„æ•°æ®ï¼"});
        }
        String userId = "developer";//WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        osAttributeDTO.setLastModifier(userId);
        osAttributeDTO.setCreator(osAttributeVO.getCreator());
        osAttributeDTO.setCreateTime(osAttributeVO.getCreateTime());
@@ -557,9 +565,9 @@
            attributeDef.rage = osAttributeDTO.getRange().replace("<","&lt;");
        }
        attributeDef.ts = Func.format((Func.isNotEmpty(osAttributeDTO.getTs()) ? osAttributeDTO.getTs():new Date()),VciDateUtil.DateTimeMillFormat);
        attributeDef.creator = "developer";//Func.isBlank(osAttributeDTO.getCreator()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getCreator();
        attributeDef.creator = Func.isBlank(osAttributeDTO.getCreator()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getCreator();
        attributeDef.createTime = Func.isEmpty(osAttributeDTO.getCreateTime()) ? System.currentTimeMillis():osAttributeDTO.getCreateTime().getTime();
        attributeDef.modifier = "developer";//Func.isBlank(osAttributeDTO.getLastModifier()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getLastModifier();
        attributeDef.modifier = Func.isBlank(osAttributeDTO.getLastModifier()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getLastModifier();
        attributeDef.modifyTime = System.currentTimeMillis();
        //other需要自行处理
        StringBuffer sb = new StringBuffer();
@@ -600,6 +608,7 @@
                if(StringUtils.isNotBlank(osAttributeDTO.getLinkTypeName())){
                    //参照链接类型
                    sb.append(LINKTYPENAME).append(" = ").append(osAttributeDTO.getLinkTypeName()).append(";");
                    sb.append(VERSION).append(" = ").append(osAttributeDTO.getVersion()).append(";");
                }
                sb.append(LENGTH).append(" = ").append(length > osAttributeDTO.getAttrLength()?length:osAttributeDTO.getAttrLength()).append(";");
                if (StringUtils.isNotBlank(osAttributeDTO.getEnumId())) {
@@ -812,7 +821,7 @@
            if(Func.isBlank(oid) || Func.isBlank(name) || Func.isEmpty(ts)){
                throw new PLException("500",new String[]{"待删除的属性列表中主键【oid】、调整时间【ts】、属性名【name】不能为空!"});
            }
            //判断枚举是否有被引用
            //判断属性是否有被引用
            List<Map<String, String>> usedAttrList = this.getUsedAttributeList(name);
            if(Func.isNotEmpty(usedAttrList)){
                throw new PLException("500",new String[]{"删除的属性中,属性名称为:【" + name + "】,已被引用!"});
@@ -934,7 +943,7 @@
        //设置列名
        List<String> columns = new ArrayList<>(
                Arrays.asList("属性名", "标签", "描述",
                        "属性类型", "允许为空(是/否)", "默认值", "使用的枚举英文名称", "参照的业务类型编号",
                        "属性类型(请参照新增界面的属性类型填写)", "允许为空(是/否)", "默认值", "使用的枚举英文名称", "参照的业务类型编号",
                        "参照的链接类型编号","版本版次","属性长度", "小数精度位数","小数刻度位数","取值范围")
        );
        //设置必填列
@@ -1010,6 +1019,22 @@
                //属性名excel中判重处理
                excelReapeat.put(osAttributePO.getId(),osAttributePO.getRowIndex());
                OsAttributeDTO osAttributeDTO = new OsAttributeDTO();
                //查询枚举是否存在,填写了枚举但没填写取值范围,这时候直接使用枚举项值作为默认的range
                if(Func.isNotBlank(osAttributePO.getEnumId()) && Func.isBlank(osAttributePO.getRange())){
                    try {
                        OsEnumVO enumVO = enumService.getEnumTypeById(osAttributePO.getEnumId());
                        if(Func.isEmpty(enumVO)){
                            throw new VciBaseException("第【" + osAttributePO.getRowIndex() + "】行数据,通过枚举名称【" + osAttributePO.getEnumId()
                                    + "】未获取到枚举信息!");
                        }
                        String itemValues = enumVO.getItemMaps().values().stream().collect(Collectors.joining(";"));
                        osAttributeDTO.setRange(itemValues);
                    } catch (PLException e) {
                        e.printStackTrace();
                        throw new VciBaseException("枚举查询失败,原因:"+e.getMessage());
                    }
                    osAttributeDTO.setBtmTypeId(osAttributePO.getEnumId());
                }
                osAttributeDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
                osAttributeDTO.setId(osAttributePO.getId());
                osAttributeDTO.setName(osAttributePO.getName());
@@ -1045,7 +1070,7 @@
                    }
                } catch (PLException e) {
                    e.printStackTrace();
                    throw new VciBaseException("执行保存时出现错误,错误属性对象名为:【" + dto.getId() + "】,原因:"+e.getMessage());
                    throw new VciBaseException("执行保存时出现错误,错误属性对象名为:【" + dto.getId() + "】,原因:"+VciBaseUtil.getExceptionMessage(e));
                }
            });
        }catch (Exception e){
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java
@@ -392,7 +392,7 @@
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "枚举类型导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = new ArrayList<>(Arrays.asList("枚举名称", "标签", "返回类型", "长度", "枚举项名称", "枚举值", "描述"));
        List<String> columns = new ArrayList<>(Arrays.asList("枚举名称", "标签", "返回类型", "长度","创建时间", "枚举项名称", "枚举值", "描述"));
        //写excel
        String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + exportFileName +  ".xls";
@@ -433,9 +433,9 @@
                //处理枚举项写入
                for (int j = 0; j < enumVOItems.size(); j++) {
                    OsEnumItemVO osEnumItemVO = enumVOItems.get(j);
                    excelDataList.add(new WriteExcelData(startRow+j,7, true,osEnumItemVO.getName()));
                    excelDataList.add(new WriteExcelData(startRow+j,8, true, osEnumItemVO.getValue()));
                    excelDataList.add(new WriteExcelData(startRow+j,9, true, osEnumItemVO.getDescription()));
                    excelDataList.add(new WriteExcelData(startRow+j,5, true,osEnumItemVO.getName()));
                    excelDataList.add(new WriteExcelData(startRow+j,6, true, osEnumItemVO.getValue()));
                    excelDataList.add(new WriteExcelData(startRow+j,7, true, osEnumItemVO.getDescription()));
                }
                startRow += enumVOItems.size();
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -483,7 +483,7 @@
    }
    /**
     * çŠ¶æ€åœ¨ç”Ÿå‘½å‘¨æœŸä¸­ä½¿ç”¨çš„å‹¤å¿«
     * çŠ¶æ€åœ¨ç”Ÿå‘½å‘¨æœŸä¸­ä½¿ç”¨çš„èŒƒå›´
     *
     * @param statusOid çŠ¶æ€çš„ä¸»é”®
     * @return ç”Ÿå‘½å‘¨æœŸçš„信息
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
@@ -1,7 +1,10 @@
package com.vci.web.service.impl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
import com.vci.corba.omd.btm.BizType;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.ltm.LinkType;
import com.vci.omd.utils.ObjectTool;
@@ -26,6 +29,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@@ -369,6 +373,236 @@
        platformClientUtil.getLinkTypeService().modifyLinkType(linkType);
        return BaseResult.success(null,"保存成功!");
    }
    /**
     * é“¾æŽ¥ç±»åž‹åˆ é™¤
     * linkType é“¾æŽ¥ç±»åž‹å¯¹è±¡
     * @return åˆ é™¤ç»“æžœ
     */
    @Override
    public BaseResult deleteLink(LinkType linkType) throws PLException {
        if(platformClientUtil.getLinkTypeService().hasData(linkType.name)){
            throw new PLException("500",new String[] {"类型已有实例, ä¸è¿›è¡Œåˆ é™¤æ“ä½œ"});
        }
        boolean flag = platformClientUtil.getLinkTypeService().deleteLinkType(linkType);
        if(!flag){
            throw new PLException("500",new String[] {"删除失败"});
        }else{
            return BaseResult.success();
        }
    }
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥
     * @return åˆ é™¤ç»“æžœ
     */
    @Override
    public BaseResult checkLinkType() throws PLException {
        String[] result = platformClientUtil.getLinkTypeService().linkTypeConsistencyCheck();
        Map<String, String> dbCheckMap = new HashMap<String, String>();
        for(int i = 0; i < result.length; i++){
            String info = result[i];
            if(info.equals("")){
                continue;
            }
            String[] infos = info.split("/DML");
            String typeName = infos[0];
            String dml = infos[1];
            dbCheckMap.put(typeName, dml);
        }
        Map<String, List<String>> btmCheckMap = usedBtmCheck();
        if(dbCheckMap.size() < 1 && (btmCheckMap == null || btmCheckMap.size() < 1)){
            return BaseResult.successMsg("数据库中的表结构与类型一致, é“¾æŽ¥ç±»åž‹å¼•用的业务类型全部正确存在,无需修复!!");
        }else{
            Map<String,Object> returnData = new HashMap<>();
            returnData.put("dbCheckMap",dbCheckMap);
            returnData.put("btmCheckMap",btmCheckMap);
            List<Map> list = new ArrayList<>();
            list.add(returnData);
            return BaseResult.dataList(500,list,"需要进行列的修复!!");
        }
    }
    /**
     * ä¸€è‡´æ€§æ£€æŸ¥ä¿®å¤æ•°æ®åº“表
     * repairData éœ€è¦ä¿®å¤çš„æ•°æ®
     * @return ä¿®å¤ç»“æžœ
     */
    @Override
    public BaseResult repairTable(String repairData) throws PLException, IOException {
        Map<String, Object> map = new ObjectMapper().readValue(repairData, new TypeReference<Map<String,Object>>(){});
        HashMap<String,Object> dbCheckMap = (HashMap<String, Object>) map.get("dbCheckMap");
        HashMap<String,List<String>> btmCheckMap = (HashMap<String, List<String>>) map.get("btmCheckMap");
        List returnList = new ArrayList<>();
        Map returnMap = new HashMap();
        if(dbCheckMap.size() > 0){
            List<String> list = getRepairDML(dbCheckMap);
            if(list.size() < 1){
                return BaseResult.success();
            }
            String[] result = platformClientUtil.getLinkTypeService().executeRepair(list.toArray(new String[0]));
            List<String> resultList = Arrays.asList(result);
            for (String typeName : resultList) {
                if(dbCheckMap.containsKey(typeName)){
                    dbCheckMap.remove(typeName);
                }else if(dbCheckMap.containsKey(typeName + "_ADD")){
                    String sql = String.valueOf(dbCheckMap.get(typeName));
                    sql = sql.substring(sql.indexOf(";") + 1, sql.length());
                    dbCheckMap.put(typeName, sql);
                }else if(dbCheckMap.containsKey(typeName + "_DROP")){
                    String sql = String.valueOf(dbCheckMap.get(typeName));
                    sql = sql.substring(0, sql.indexOf(";"));
                    dbCheckMap.put(typeName, sql);
                }
            }
            if(!dbCheckMap.isEmpty()){
                returnMap.put("dbCheckMap",dbCheckMap);
            }
        }
        if(btmCheckMap.size() > 0){
            List<String> result = repairXml(btmCheckMap);
            for(int i = 0; i < result.size(); i++){
                String typeName = result.get(i);
                if(btmCheckMap.containsKey(typeName)){
                    btmCheckMap.remove(typeName);
                }
            }
            if(!btmCheckMap.isEmpty()){
                returnMap.put("btmCheckMap",btmCheckMap);
            }
        }
        returnList.add(returnMap);
        return BaseResult.success(returnList);
    }
    /**
     * åˆ›å»ºè§†å›¾
     * @return åˆ›å»ºç»“æžœ
     */
    @Override
    public BaseResult createView() throws PLException {
        boolean f = platformClientUtil.getLinkTypeService().createView();
        if(f){
            return BaseResult.success("创建视图成功");
        }else{
            return BaseResult.success("创建视图失败");
        }
    }
    /**
     * ä¿®å¤é“¾æŽ¥ç±»åž‹çš„xml文件
     * @return
     */
    private List<String> repairXml(HashMap<String, List<String>> btmCheckMap){
        List<String> result = new ArrayList<String>();
        for(Iterator<String> ite = btmCheckMap.keySet().iterator(); ite.hasNext();){
            String linkName = ite.next();
            List<String> list = btmCheckMap.get(linkName);
            LinkType link = null;
            try {
                link = platformClientUtil.getLinkTypeService().getLinkType(linkName);
            } catch (PLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
                continue;
            }
            //将list中包含的F_btm移除, é‡æ–°è®¾ç½®btmItemsFrom
            String[] btms_ = link.btmItemsFrom;
            List<String> btms = new ArrayList<String>();
            for(int i = 0; i < btms_.length; i++){
                if(!list.contains("F_" + btms_[i])){
                    btms.add(btms_[i]);
                }else{
                    if(link.primitivesFrom.equals(btms_[i])){
                        link.primitivesFrom = "";
                    }
                }
            }
            link.btmItemsFrom = btms.toArray(new String[0]);
            //将list中包含的T_btm移除, é‡æ–°è®¾ç½®btmItemsTo
            btms_ = link.btmItemsTo;
            btms = new ArrayList<String>();
            for(int i = 0; i < btms_.length; i++){
                if(!list.contains("T_" + btms_[i])){
                    btms.add(btms_[i]);
                }else{
                    if(link.primitivesTo.equals(btms_[i])){
                        link.primitivesTo = "";
                    }
                }
            }
            link.btmItemsTo = btms.toArray(new String[0]);
            link.id = link.name;
            try {
                if(platformClientUtil.getLinkTypeService().modifyLinkType(link)){
                    result.add(linkName);
                }
            } catch (PLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    /**
     * èŽ·å–éœ€è¦ä¿®å¤çš„ä¼ªsql
     * @return
     */
    private List<String> getRepairDML(HashMap<String, Object> dbCheckMap) {
        List<String> list = new ArrayList<String>();
        for(Iterator<String> ite = dbCheckMap.keySet().iterator(); ite.hasNext();){
            String type = ite.next();
            String dml = String.valueOf(dbCheckMap.get(type));
            list.add(type + "/DML" + dml);
        }
        return list;
    }
    /**
     * æ£€æŸ¥æ‰€æœ‰çš„链接类型, å½“链接类型中引用的业务类型已经不存在时, åˆ é™¤è¯¥é“¾æŽ¥ç±»åž‹ä¸­å¯¹ä¸šåŠ¡ç±»åž‹çš„å¼•ç”¨
     * @return
     */
    private Map<String, List<String>> usedBtmCheck(){
        try {
            Map<String, List<String>> map = new HashMap<String, List<String>>();
            LinkType[] links = platformClientUtil.getLinkTypeService().getLinkTypes();
            for(int i = 0; i < links.length; i++){
                LinkType link = links[i];
                String[] btms = link.btmItemsFrom;
                for(int k = 0; k < btms.length; k++){
                    String btmName = btms[k];
                    BizType btm = platformClientUtil.getBtmService().getBizTypeByName(btmName);
                    if(btm == null || btm.name.equals("")){
                        List<String> list = map.get(link.name);
                        if(list == null){
                            list = new ArrayList<String>();
                            list.add("F_" + btmName);
                        }else{
                            list.add("F_" + btmName);
                        }
                        map.put(link.name, list);
                    }
                }
                btms = link.btmItemsTo;
                for(int k = 0; k < btms.length; k++){
                    String btmName = btms[k];
                    BizType btm = platformClientUtil.getBtmService().getBizTypeByName(btmName);
                    if(btm == null || btm.name.equals("")){
                        List<String> list = map.get(link.name);
                        if(list == null){
                            list = new ArrayList<String>();
                            list.add("T_" + btmName);
                        }else{
                            list.add("T_" + btmName);
                        }
                        map.put(link.name, list);
                    }
                }
            }
            return map;
        } catch (PLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
@@ -1,24 +1,35 @@
package com.vci.web.service.impl;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
import com.vci.corba.omd.stm.StatePool;
import com.vci.dto.OsAttributeDTO;
import com.vci.pagemodel.OsEnumVO;
import com.vci.po.OsAttributePO;
import com.vci.po.OsStatusPO;
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.pagemodel.PageHelper;
import com.vci.starter.web.util.LangBaseUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.VciDateUtil;
import com.vci.starter.web.util.*;
import com.vci.dto.OsStatusDTO;
import com.vci.model.OsStatusDO;
import com.vci.pagemodel.OsStatusVO;
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;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,7 +37,9 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.File;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
@@ -65,6 +78,11 @@
    private OsLifeCycleServiceI lifeCycleService;
    /**
     *  å¿…填列
     */
    private List<Integer> ColumnNameisRed = new ArrayList<Integer>();
    /**
     * åŠ è½½è‡ªèº«
     */
    @Autowired(required = false)
@@ -78,11 +96,12 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public OsStatusVO statusDO2VO(com.vci.corba.omd.stm.StatePool statePool) {
    public OsStatusVO statusDO2VO(StatePool statePool) {
        OsStatusVO statusVO = new OsStatusVO();
        if(statePool!=null){
            statusVO.setOid(statePool.oid);
            statusVO.setCreator(statePool.creator);
            statusVO.setImagePath(statePool.imagePath);
            statusVO.setLastModifier(statePool.modifier);
            try {
                statusVO.setCreateTime(new Date(statePool.createTime));
@@ -105,7 +124,7 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<OsStatusVO> statusDO2VOs(Collection<com.vci.corba.omd.stm.StatePool> statePools) {
    public List<OsStatusVO> statusDO2VOs(Collection<StatePool> statePools) {
        List<OsStatusVO> statusVOS = new ArrayList<>();
        if(!CollectionUtils.isEmpty(statePools)){
            statePools.stream().forEach(statePool -> {
@@ -169,7 +188,7 @@
     * @param statePoolList çŠ¶æ€å†…å®¹
     */
    @Override
    public void batchAddStatus(List<StatePool> statePoolList) {
    public boolean batchAddStatus(List<StatePool> statePoolList) throws Exception{
        if(!CollectionUtils.isEmpty(statePoolList)){
            for(StatePool statePool : statePoolList) {
                try {
@@ -178,7 +197,9 @@
                    throw WebUtil.getVciBaseException(e);
                }
            }
            return true;
        }
        return false;
    }
    /**
@@ -186,7 +207,7 @@
     * @param statePoolList çŠ¶æ€å†…å®¹
     */
    @Override
    public void batchEditSave(List<StatePool> statePoolList) {
    public boolean batchEditSave(List<StatePool> statePoolList) {
        if(!CollectionUtils.isEmpty(statePoolList)){
            for(StatePool statePool : statePoolList) {
                try {
@@ -196,6 +217,7 @@
                }
            }
        }
        return true;
    }
    /**
@@ -255,57 +277,100 @@
     * @param statusDTO çŠ¶æ€çš„æ•°æ®ä¼ è¾“å¯¹è±¡
     */
    @Override
    public void addSave(OsStatusDTO statusDTO) {
        VciBaseUtil.alertNotNull(statusDTO,"状态的信息",statusDTO.getId(),"状态的英文名称",statusDTO.getName(),"状态的中文名称");
        statusDTO.setOid(VciBaseUtil.getPk());
        StatePool pool = statusDTO2DO(statusDTO);
        List<StatePool> poolList = new ArrayList<>();
        poolList.add(pool);
        batchAddStatus(poolList);
        clearCache();
        self.selectAllStatusMap();
    public boolean addSave(OsStatusDTO statusDTO) throws Exception {
        VciBaseUtil.alertNotNull(
            statusDTO,"状态的信息",
            statusDTO.getId(),"状态的英文名称",
            statusDTO.getName(),"状态的中文名称"
        );
        StatePool dbStatePool = platformClientUtil.getStatePoolService().getStatePool(statusDTO.getId());
        if (Func.isNotEmpty(dbStatePool) && Func.isNotBlank(dbStatePool.oid)) {
            throw new PLException("500",new String[]{"名称重复请更换名称!"});
        }
        // çŠ¶æ€æ± åç§°åªèƒ½ä¸ºè‹±æ–‡å­—æ¯
        String regex = "[a-z A-Z]*";
        if ((!statusDTO.getId().matches(regex))) {
            throw new PLException("500",new String[]{"名称只能为英文!"});
        }
        //虽然会自动生成oid,但是这儿设置主键,避免放入缓存的数据是没有oid的
        statusDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
        try {
            boolean res = batchAddStatus(Arrays.asList(statusDTO2DO(statusDTO)));
            self.selectAllStatusMap();
            return res;
        }catch (Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
            return false;
        }
    }
    /**
     * ç¼–辑状态
     * @param statusDTO çŠ¶æ€çš„æ•°æ®ä¼ è¾“å¯¹è±¡
     */
    @Override
    public void editSave(OsStatusDTO statusDTO){
        VciBaseUtil.alertNotNull(statusDTO,"状态的信息",statusDTO.getId(),"状态的英文名称",statusDTO.getName(),"状态的中文名称",statusDTO.getOid(),"主键");
    public boolean editSave(OsStatusDTO statusDTO) throws Exception {
        VciBaseUtil.alertNotNull(statusDTO,"状态的信息",
                statusDTO.getId(),"状态的英文名称",
                statusDTO.getName(),"状态的中文名称",
                statusDTO.getOid(),"主键");
        OsStatusVO statusVO = getObjectByOid(statusDTO.getOid());
        if(Func.isEmpty(statusVO) || Func.isBlank(statusVO.getOid())){
            throw new PLException("500",new String[]{"修改的状态对象不存在!"});
        }
        StatePool pool = statusDTO2DO(statusDTO);
        pool.creator = statusVO.getCreator();
        pool.createTime = VciDateUtil.getTime(statusVO.getCreateTime());
        List<StatePool> poolList = new ArrayList<>();
        poolList.add(pool);
        batchEditSave(poolList);
        clearCache();
        self.selectAllStatusMap();
        try {
            boolean res = batchEditSave(Arrays.asList(pool));
            self.selectAllStatusMap();
            return res;
        }catch (Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
            return false;
        }
    }
    /**
     * åˆ é™¤çŠ¶æ€
     * @param oids ä¸»é”®
     * @param osStatusDTOS
     */
    @Override
    public void delete(String oids){
        VciBaseUtil.alertNotNull(oids,"主键");
        //判断是否被引用
        List<OsStatusVO> statusVOList1 = selectByOidCollection(VciBaseUtil.str2List(oids));
        if(statusVOList1.stream().anyMatch(statusVO -> lifeCycleService.checkStatusUsed(statusVO))){
    public boolean deleteStatus(List<OsStatusDTO> osStatusDTOS) throws PLException {
        VciBaseUtil.alertNotNull(osStatusDTOS,"待删除的属性列表");
        Set<String> oids = osStatusDTOS.stream().map(OsStatusDTO::getOid).collect(Collectors.toSet());
        List<OsStatusVO> osStatusVOList = selectByOidCollection(oids);
        //判断枚举是否有被引用
        if(osStatusVOList.stream().anyMatch(statusVO -> lifeCycleService.checkStatusUsed(statusVO))){
            throw new VciBaseException("状态在生命周期中被使用,不能删除");
        }
        statusVOList1.stream().forEach(statusVO -> {
            try {
                platformClientUtil.getStatePoolService().deleteStatePool(statusVO2DO(statusVO));
            }catch (Throwable e){
                throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
        //平台的deleteStatus方法必传三个参数,oid、name和ts
        List<StatePool> statePoolList = new ArrayList<>();
        for(OsStatusDTO statusDTO : osStatusDTOS){
            //oid和ts判空
            String oid = statusDTO.getOid();
            //name主要用来对缓存数据删除
            String name = statusDTO.getName();
            //后台会用ts进行数据一致性校验
            Date ts = statusDTO.getTs();
            if(Func.isBlank(oid) || Func.isBlank(name) || Func.isEmpty(ts)){
                throw new PLException("500",new String[]{"待删除的状态列表中主键【oid】、调整时间【ts】、状态名称【name】不能为空!"});
            }
        });
        clearCache();
            StatePool statePool = new StatePool();
            statePool.oid = oid;
            statePool.name = name;
            statePool.ts = Func.format(ts,VciDateUtil.DateTimeMillFormat);
            statePoolList.add(statePool);
            boolean res = platformClientUtil.getStatePoolService().deleteStatePool(statePool);
            if(!res){
                throw new PLException("500",new String[]{"删除状态名称为【" + name + "】的数据时出现错误!"});
            }
        }
        //clearCache();
        self.selectAllStatusMap();
        return true;
    }
    /**
@@ -319,16 +384,171 @@
        statePool.oid = statusDTO.getOid();
        statePool.id = "";
        statePool.name = statusDTO.getId();
        statePool.imagePath = statusDTO.getImagePath();
        statePool.description = statusDTO.getDescription()==null?"":statusDTO.getDescription();
        String userId = VciBaseUtil.getCurrentUserId();
        String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        long now = VciDateUtil.getNowTime();
        statePool.creator = userId;
        statePool.creator = Func.isBlank(statusDTO.getCreator()) ? userId:statusDTO.getCreator();
        statePool.createTime = now;
        statePool.modifier = userId;
        statePool.modifyTime = now;
        statePool.ts = statusDTO.getTs()==null?VciDateUtil.getNowString(VciDateUtil.DateTimeMillFormat):VciDateUtil.date2Str(statusDTO.getTs(),VciDateUtil.DateTimeMillFormat);
        statePool.tag = statusDTO.getName();
        return statePool;
    }
    /**
     * å¯¼å‡ºé€‰ä¸­çš„状态
     * @param exportFileName å¯¼å‡ºçš„æ–‡ä»¶å
     * @param statusOids éœ€è¦å¯¼å‡ºçš„属性名称
     * @return
     */
    @Override
    public String exportStatus(String exportFileName, String statusOids) throws PLException {
        if(Func.isBlank(statusOids)){
            throw new PLException("500",new String[]{"请勾选要导出的属性!"});
        }
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "状态池状态导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = new ArrayList<>(Arrays.asList("名称", "标签", "图片", "描述"));
        //写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> statusOidList = Func.toStrList(statusOids);
        AtomicInteger i = new AtomicInteger(1);
        statusOidList.stream().forEach(oid->{
            OsStatusVO osStatusVO = this.getObjectByOid(oid);
            excelDataList.add(new WriteExcelData(i.get(),0, osStatusVO.getId()));
            excelDataList.add(new WriteExcelData(i.get(),1, osStatusVO.getName()));
            excelDataList.add(new WriteExcelData(i.get(),2, osStatusVO.getImagePath()));
            excelDataList.add(new WriteExcelData(i.get(),3, osStatusVO.getDescription()));
            i.getAndIncrement();
        });
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
     * ä¸‹è½½çŠ¶æ€å¯¼å…¥æ¨¡æ¿
     * @param exportFileName
     * @return
     * @throws PLException
     */
    @Override
    public String downloadStatusTemplate(String exportFileName) throws Exception {
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "状态池导入模板_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = new ArrayList<>(
                Arrays.asList("名称(不能为空)", "标签(对名称的解释)","图片(路径)", "描述(可以为空)")
        );
        //设置必填列
        ColumnNameisRed.clear();
        ColumnNameisRed.add(0);
        //写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;
    }
    /**
     * å¯¼å…¥çŠ¶æ€
     * @param file
     * @return
     */
    @Override
    public BaseResult importStatus(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<OsStatusPO> poList = ExcelUtil.readDataObjectFromExcel(file, OsStatusPO.class,excelOption,(value, po, fieldName)->{});
            //去除都是空的情况
            if(CollectionUtils.isEmpty(poList)){
                return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
            }
            //excel判重,数据校验,dto对象转换,存储对象转换,执行保存
            List<StatePool> statePoolList = new ArrayList<>();
            //当前excel中是否重复用的判重Map:(key:判重属性,value:行号)
            Map<String, String> excelReapeat = new HashMap<>();
            //判断必填属性是否为空,用户是否已存在,以及部门是否填错等校验逻辑
            poList.stream().forEach(osStatusPO -> {
                try {
                    StatePool dbStatePool = platformClientUtil.getStatePoolService().getStatePool(osStatusPO.getId());
                    if(Func.isNotEmpty(dbStatePool) && Func.isNotBlank(dbStatePool.oid)){
                        throw new VciBaseException("第【"+osStatusPO.getRowIndex()+"】行,名称在系统中已经存在,请修改!");
                    }
                } catch (PLException e) {
                    e.printStackTrace();
                    logger.error(e.getMessage());
                    throw new VciBaseException(e.getMessage());
                }
                if(Func.isBlank(osStatusPO.getId())){//属性名判空
                    throw new VciBaseException("第【"+osStatusPO.getRowIndex()+"】行,enumnameerror");
                }else if(!osStatusPO.getId().matches("[a-z A-Z]*")){
                    // çŠ¶æ€æ± åç§°åªèƒ½ä¸ºè‹±æ–‡å­—æ¯
                    throw new VciBaseException("名称只能为英文!");
                }else if(excelReapeat.containsKey(osStatusPO.getId())){//属性名表格中判重
                    throw new VciBaseException("第【"+excelReapeat.get(osStatusPO.getId())+"】行和第【"+osStatusPO.getRowIndex()+"】行数据,名称重复");
                }
                //状态名excel中判重处理
                excelReapeat.put(osStatusPO.getId(),osStatusPO.getRowIndex());
                OsStatusDTO osStatusDTO = new OsStatusDTO();
                osStatusDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
                osStatusDTO.setId(osStatusPO.getId());
                osStatusDTO.setName(osStatusPO.getName());
                osStatusDTO.setImagePath(osStatusPO.getImagePath());
                osStatusDTO.setDescription(osStatusPO.getDescription());
                statePoolList.add(statusDTO2DO(osStatusDTO));
            });
            //执行保存操作
            batchAddStatus(statePoolList);
        }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("枚举导入成功!");
    }
    /**
@@ -352,7 +572,5 @@
        statePool.tag = statusVO.getName();
        return statePool;
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
@@ -201,7 +201,7 @@
     * @param statusDTOList è¦å¯¼å…¥çš„状态的数据传输对象列表
     * @throws VciBaseException æŸ¥è¯¢æˆ–者执行出错的时候会抛出异常
     */
    private void importStatus( Collection<OsStatusDTO> statusDTOList) throws VciBaseException{
    private void importStatus( Collection<OsStatusDTO> statusDTOList) throws Exception {
        //要导入的状态的所有英文名称
        List<String> statusIdList = new ArrayList<String>();
        Iterator<OsStatusDTO> iterator = statusDTOList.iterator();