ソースを参照

feat(process): 新增盲板清单管理功能

- 新增盲板清单实体类TPlantBlind及其相关字段定义
- 实现盲板清单的增删改查接口及服务层逻辑
- 添加盲板清单控制器,支持列表查询、详情获取、新增、修改和删除操作
- 支持通过Excel批量导入盲板清单数据,并处理重复数据更新逻辑
- 在CommonController中增加盲板清单导入模板下载功能
- 在TPssrAboveallController中集成根据盲板清单生成PSSR盲板数据的功能
- 更新ImageCompressionTask中的图片压缩目录配置,新增多个PS巡检相关文件夹路径
- 完善MyBatis映射文件,支持盲板清单相关数据库操作及部门关联查询
- 增加对unitNos集合参数的支持,便于按单元编号筛选盲板数据
jiangbiao 3 日 前
コミット
3dc14085df

+ 62 - 38
master/src/main/java/com/ruoyi/framework/task/ImageCompressionTask.java

@@ -6,7 +6,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -30,43 +29,68 @@ public class ImageCompressionTask extends BaseController {
         try {
             // 需要压缩的文件夹路径列表
             List<String> directories = Arrays.asList(
-                "/u03/cpmsfile/uploadPath/upload/eyewash",
-                "/u03/cpmsfile/uploadPath/upload/annihilator",
-                // H110-H118,H130
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass9",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass10",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass11",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass12",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass13",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass14",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass15",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass16",
-                // H109
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7B",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8A",
-                "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8B"
-                // 在这里添加更多需要压缩的文件夹路径
+                    //bcc巡检照片
+                    "/u03/cpmsfile/uploadPath/upload/eyewash",
+                    "/u03/cpmsfile/uploadPath/upload/annihilator",
+                    //ps-* 巡检上传文件夹
+                    "/u03/cpmsfile/uploadPath/ps-alarm",
+                    "/u03/cpmsfile/uploadPath/ps-cabinet",
+                    "/u03/cpmsfile/uploadPath/ps-callsystem",
+                    "/u03/cpmsfile/uploadPath/ps-coffer",
+                    "/u03/cpmsfile/uploadPath/ps-curtain",
+                    "/u03/cpmsfile/uploadPath/ps-extinguisher",
+                    "/u03/cpmsfile/uploadPath/ps-eyewash",
+                    "/u03/cpmsfile/uploadPath/ps-fgs",
+                    "/u03/cpmsfile/uploadPath/ps-firedoor",
+                    "/u03/cpmsfile/uploadPath/ps-hydrant",
+                    "/u03/cpmsfile/uploadPath/ps-lift",
+                    "/u03/cpmsfile/uploadPath/ps-monitor",
+                    "/u03/cpmsfile/uploadPath/ps-pit",
+                    "/u03/cpmsfile/uploadPath/ps-rainvalve",
+                    "/u03/cpmsfile/uploadPath/ps-steam",
+                    "/u03/cpmsfile/uploadPath/ps-sump",
+                    "/u03/cpmsfile/uploadPath/ps-utilitystation",
+                    "/u03/cpmsfile/uploadPath/ps-ventvalve",
+                    "/u03/cpmsfile/uploadPath/ps-wardrobe",
+                    // pssr
+                    "/u03/cpmsfile/uploadPath/upload/pssr/picture",
+                    "/u03/cpmsfile/uploadPath/upload/pssr/pictures",
+
+                    // H110-H118,H130
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass9",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass10",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass11",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass12",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass13",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass14",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass15",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass16",
+                    // H109
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass1B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass2B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass3B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass4B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass5B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass6B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass7B",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8A",
+                    "/u03/cpmsfile/uploadPath/upload/furnancePressurePass8B"
+                    // 在这里添加更多需要压缩的文件夹路径
             );
 
             if (directories.isEmpty()) {

+ 3 - 0
master/src/main/java/com/ruoyi/project/common/CommonController.java

@@ -538,6 +538,9 @@ public class CommonController extends BaseController
         }else if( type.equals("utilitystation") ) {
             downloadname = "公用站基础信息导入模板.xlsx";
             url = "static/template/ps/dev/utilitystation.xlsx";
+        }else if( type.equals("blindList") ) {
+            downloadname = "盲板清单导入模板.xlsx";
+            url = "static/template/process/blind.xlsx";
         }
 
         InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(url);

+ 206 - 0
master/src/main/java/com/ruoyi/project/process/controller/TPlantBlindController.java

@@ -0,0 +1,206 @@
+package com.ruoyi.project.process.controller;
+
+import com.ruoyi.common.utils.file.ExcelUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.process.domain.TPlantBlind;
+import com.ruoyi.project.process.service.ITPlantBlindService;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 盲板清单Controller
+ *
+ * @author ssy
+ * @date 2025-12-19
+ */
+@RestController
+@RequestMapping("/process/blind")
+public class TPlantBlindController extends BaseController
+{
+    @Autowired
+    private ITPlantBlindService tPlantBlindService;
+
+    /**
+     * 查询盲板清单列表
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TPlantBlind tPlantBlind)
+    {
+        startPage();
+        List<TPlantBlind> list = tPlantBlindService.selectTPlantBlindList(tPlantBlind);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出盲板清单列表
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:list')")
+    @Log(title = "盲板清单", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TPlantBlind tPlantBlind)
+    {
+        List<TPlantBlind> list = tPlantBlindService.selectTPlantBlindList(tPlantBlind);
+        ExcelUtil<TPlantBlind> util = new ExcelUtil<TPlantBlind>(TPlantBlind.class);
+        return util.exportExcel(list, "blind");
+    }
+
+    /**
+     * 获取盲板清单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(tPlantBlindService.selectTPlantBlindById(id));
+    }
+
+    /**
+     * 新增盲板清单
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:add')")
+    @Log(title = "盲板清单", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TPlantBlind tPlantBlind)
+    {
+        return toAjax(tPlantBlindService.insertTPlantBlind(tPlantBlind));
+    }
+
+    /**
+     * 修改盲板清单
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:edit')")
+    @Log(title = "盲板清单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TPlantBlind tPlantBlind)
+    {
+        return toAjax(tPlantBlindService.updateTPlantBlind(tPlantBlind));
+    }
+
+    /**
+     * 删除盲板清单
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:remove')")
+    @Log(title = "盲板清单", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tPlantBlindService.deleteTPlantBlindByIds(ids));
+    }
+
+    /**
+     * 批量导入盲板清单
+     */
+    @PreAuthorize("@ss.hasPermi('process:blind:edit')")
+    @Log(title = "盲板清单", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws IOException {
+        // 获取操作人员ID
+        Long userId = getUserId();
+        // 报错行数统计
+        List<Integer> failRow = new ArrayList<Integer>();
+        Workbook workbook = ExcelUtils.getWorkBook(file);
+        Sheet sheet = workbook.getSheetAt(0);
+        List<TPlantBlind> list = new ArrayList<TPlantBlind>();
+        int rowNum = sheet.getPhysicalNumberOfRows();
+        int failNumber = 0;
+        for (int i = 1; i < rowNum; i++) {
+            try {
+                logger.info("读取行数:" + i);
+                Row row = sheet.getRow(i);
+                if (row == null) {
+                    continue;
+                }
+                int cellNum = row.getLastCellNum();
+                TPlantBlind entity = new TPlantBlind();
+                for (int j = 0; j < cellNum; j++) {
+                    Cell cell = row.getCell(j);
+                    if (cell == null) {
+                        continue;
+                    }
+                    String cellValue = ExcelUtils.getCellValue(cell);
+                    // 按列表顺序: 区域、单元、盲板编号、尺寸、压力等级、介质、PID、位置、隔离类型、盲板类型、当前状态
+                    if (j == 0) {
+                        entity.setRegion(cellValue);
+                    } else if (j == 1) {
+                        entity.setUnitNo(cellValue);
+                    } else if (j == 2) {
+                        entity.setBlindNo(cellValue);
+                    } else if (j == 3) {
+                        entity.setBlindSize(cellValue);
+                    } else if (j == 4) {
+                        entity.setPressureRate(cellValue);
+                    } else if (j == 5) {
+                        entity.setMedium(cellValue);
+                    } else if (j == 6) {
+                        entity.setPidNo(cellValue);
+                    } else if (j == 7) {
+                        entity.setLocation(cellValue);
+                    } else if (j == 8) {
+                        entity.setIsoType(cellValue);
+                    } else if (j == 9) {
+                        entity.setBlindType(cellValue);
+                    } else if (j == 10) {
+                        entity.setStartupStatus(cellValue);
+                    } else if (j == 11) {
+                        entity.setRemarks(cellValue);
+                    }
+                }
+                entity.setCreaterCode(userId.toString());
+                entity.setCreatedate(new Date());
+                list.add(entity);
+            } catch (Exception e) {
+                failNumber++;
+                failRow.add(i + 1);
+                logger.error("导入第" + (i + 1) + "行数据失败", e);
+            }
+        }
+        int successNumber = 0;
+        int failNum = 0;
+        for (TPlantBlind t : list) {
+            failNum++;
+            try {
+                // 检查是否存在相同的盲板编号
+                TPlantBlind exist = new TPlantBlind();
+                exist.setBlindNo(t.getBlindNo());
+                List<TPlantBlind> existList = tPlantBlindService.selectTPlantBlindList(exist);
+                if (existList != null && !existList.isEmpty()) {
+                    // 更新已存在的数据
+                    t.setId(existList.get(0).getId());
+                    t.setUpdaterCode(userId.toString());
+                    t.setUpdatedate(new Date());
+                    tPlantBlindService.updateTPlantBlind(t);
+                } else {
+                    // 新增数据
+                    tPlantBlindService.insertTPlantBlind(t);
+                }
+                successNumber++;
+            } catch (Exception e) {
+                failNumber++;
+                logger.info("e:" + e);
+                failRow.add(failNum + 1);
+            }
+        }
+        logger.info("list:" + list.size());
+        logger.info("successNumber:" + successNumber);
+        logger.info("failNumber:" + failNumber);
+        logger.info("failRow:" + failRow);
+        return AjaxResult.success(String.valueOf(successNumber), failRow);
+    }
+}

+ 373 - 0
master/src/main/java/com/ruoyi/project/process/domain/TPlantBlind.java

@@ -0,0 +1,373 @@
+package com.ruoyi.project.process.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 盲板清单对象 t_plant_blind
+ *
+ * @author ssy
+ * @date 2025-12-19
+ */
+public class TPlantBlind extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 唯一标识ID */
+    private Long id;
+
+    /** 区域 */
+    @Excel(name = "区域")
+    private String region;
+
+    /** 单元 */
+    @Excel(name = "单元")
+    private String unitNo;
+    private List<String> unitNos;
+
+    /** 盲板编号 */
+    @Excel(name = "盲板编号")
+    private String blindNo;
+
+    /** 尺寸 */
+    @Excel(name = "尺寸")
+    private String blindSize;
+
+    /** 压力等级 */
+    @Excel(name = "压力等级")
+    private String pressureRate;
+
+    /** 介质 */
+    @Excel(name = "介质")
+    private String medium;
+
+    /** PID */
+    @Excel(name = "PID")
+    private String pidNo;
+
+    /** 位置 */
+    @Excel(name = "位置")
+    private String location;
+
+    /** 隔离类型 */
+    @Excel(name = "隔离类型")
+    private String isoType;
+
+    /** 被隔离设备/管线位号 */
+    private String tagNo;
+    /** 盲板类型 */
+    @Excel(name = "盲板类型")
+    private String blindType;
+
+    /** 开车前状态 */
+    @Excel(name = "当前状态")
+    private String startupStatus;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /** 是否承压 */
+    private String pressurized;
+
+    /** 删除状态 */
+    private Long delFlag;
+
+    /** 创建人 */
+    private String createrCode;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    private Date createdate;
+
+    /** 修改人 */
+    private String updaterCode;
+
+    /** 修改时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    private Date updatedate;
+
+    /** 部门编号 */
+    private Long deptId;
+
+    /** 审批状态 */
+    private Long approveStatus;
+
+    /** 安装状态 */
+    private String installStatus;
+
+    /** 拆除状态 */
+    private String removeStatus;
+
+    private String deptName;
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public List<String> getUnitNos() {
+        return unitNos;
+    }
+
+    public void setUnitNos(List<String> unitNos) {
+        this.unitNos = unitNos;
+    }
+
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setRegion(String region)
+    {
+        this.region = region;
+    }
+
+    public String getRegion()
+    {
+        return region;
+    }
+    public void setUnitNo(String unitNo)
+    {
+        this.unitNo = unitNo;
+    }
+
+    public String getUnitNo()
+    {
+        return unitNo;
+    }
+    public void setPidNo(String pidNo)
+    {
+        this.pidNo = pidNo;
+    }
+
+    public String getPidNo()
+    {
+        return pidNo;
+    }
+    public void setMedium(String medium)
+    {
+        this.medium = medium;
+    }
+
+    public String getMedium()
+    {
+        return medium;
+    }
+    public void setBlindNo(String blindNo)
+    {
+        this.blindNo = blindNo;
+    }
+
+    public String getBlindNo()
+    {
+        return blindNo;
+    }
+    public void setLocation(String location)
+    {
+        this.location = location;
+    }
+
+    public String getLocation()
+    {
+        return location;
+    }
+    public void setIsoType(String isoType)
+    {
+        this.isoType = isoType;
+    }
+
+    public String getIsoType()
+    {
+        return isoType;
+    }
+    public void setTagNo(String tagNo)
+    {
+        this.tagNo = tagNo;
+    }
+
+    public String getTagNo()
+    {
+        return tagNo;
+    }
+    public void setBlindSize(String blindSize)
+    {
+        this.blindSize = blindSize;
+    }
+
+    public String getBlindSize()
+    {
+        return blindSize;
+    }
+    public void setPressureRate(String pressureRate)
+    {
+        this.pressureRate = pressureRate;
+    }
+
+    public String getPressureRate()
+    {
+        return pressureRate;
+    }
+    public void setPressurized(String pressurized)
+    {
+        this.pressurized = pressurized;
+    }
+
+    public String getPressurized()
+    {
+        return pressurized;
+    }
+    public void setDelFlag(Long delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Long getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setCreaterCode(String createrCode)
+    {
+        this.createrCode = createrCode;
+    }
+
+    public String getCreaterCode()
+    {
+        return createrCode;
+    }
+    public void setCreatedate(Date createdate)
+    {
+        this.createdate = createdate;
+    }
+
+    public Date getCreatedate()
+    {
+        return createdate;
+    }
+    public void setUpdaterCode(String updaterCode)
+    {
+        this.updaterCode = updaterCode;
+    }
+
+    public String getUpdaterCode()
+    {
+        return updaterCode;
+    }
+    public void setUpdatedate(Date updatedate)
+    {
+        this.updatedate = updatedate;
+    }
+
+    public Date getUpdatedate()
+    {
+        return updatedate;
+    }
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+    public void setRemarks(String remarks)
+    {
+        this.remarks = remarks;
+    }
+
+    public String getRemarks()
+    {
+        return remarks;
+    }
+    public void setApproveStatus(Long approveStatus)
+    {
+        this.approveStatus = approveStatus;
+    }
+
+    public Long getApproveStatus()
+    {
+        return approveStatus;
+    }
+    public void setInstallStatus(String installStatus)
+    {
+        this.installStatus = installStatus;
+    }
+
+    public String getInstallStatus()
+    {
+        return installStatus;
+    }
+    public void setRemoveStatus(String removeStatus)
+    {
+        this.removeStatus = removeStatus;
+    }
+
+    public String getRemoveStatus()
+    {
+        return removeStatus;
+    }
+    public void setBlindType(String blindType)
+    {
+        this.blindType = blindType;
+    }
+
+    public String getBlindType()
+    {
+        return blindType;
+    }
+    public void setStartupStatus(String startupStatus)
+    {
+        this.startupStatus = startupStatus;
+    }
+
+    public String getStartupStatus()
+    {
+        return startupStatus;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("region", getRegion())
+            .append("unitNo", getUnitNo())
+            .append("pidNo", getPidNo())
+            .append("medium", getMedium())
+            .append("blindNo", getBlindNo())
+            .append("location", getLocation())
+            .append("isoType", getIsoType())
+            .append("tagNo", getTagNo())
+            .append("blindSize", getBlindSize())
+            .append("pressureRate", getPressureRate())
+            .append("pressurized", getPressurized())
+            .append("delFlag", getDelFlag())
+            .append("createrCode", getCreaterCode())
+            .append("createdate", getCreatedate())
+            .append("updaterCode", getUpdaterCode())
+            .append("updatedate", getUpdatedate())
+            .append("deptId", getDeptId())
+            .append("remarks", getRemarks())
+            .append("approveStatus", getApproveStatus())
+            .append("installStatus", getInstallStatus())
+            .append("removeStatus", getRemoveStatus())
+            .append("blindType", getBlindType())
+            .append("startupStatus", getStartupStatus())
+            .toString();
+    }
+}

+ 56 - 0
master/src/main/java/com/ruoyi/project/process/mapper/TPlantBlindMapper.java

@@ -0,0 +1,56 @@
+package com.ruoyi.project.process.mapper;
+
+import com.ruoyi.project.process.domain.TPlantBlind;
+
+import java.util.List;
+
+/**
+ * 盲板清单Mapper接口
+ * 
+ * @author ssy
+ * @date 2025-12-19
+ */
+public interface TPlantBlindMapper 
+{
+    /**
+     * 查询盲板清单
+     * 
+     * @param id 盲板清单ID
+     * @return 盲板清单
+     */
+    public TPlantBlind selectTPlantBlindById(Long id);
+
+    public List<TPlantBlind> selectTPlantBlindList(TPlantBlind tPlantBlind);
+
+    /**
+     * 新增盲板清单
+     * 
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    public int insertTPlantBlind(TPlantBlind tPlantBlind);
+
+    /**
+     * 修改盲板清单
+     * 
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    public int updateTPlantBlind(TPlantBlind tPlantBlind);
+
+    /**
+     * 删除盲板清单
+     * 
+     * @param id 盲板清单ID
+     * @return 结果
+     */
+    public int deleteTPlantBlindById(Long id);
+
+    /**
+     * 批量删除盲板清单
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTPlantBlindByIds(Long[] ids);
+}

+ 61 - 0
master/src/main/java/com/ruoyi/project/process/service/ITPlantBlindService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.process.service;
+
+import java.util.List;
+import com.ruoyi.project.process.domain.TPlantBlind;
+
+/**
+ * 盲板清单Service接口
+ * 
+ * @author ssy
+ * @date 2025-12-19
+ */
+public interface ITPlantBlindService 
+{
+    /**
+     * 查询盲板清单
+     * 
+     * @param id 盲板清单ID
+     * @return 盲板清单
+     */
+    public TPlantBlind selectTPlantBlindById(Long id);
+
+    /**
+     * 查询盲板清单列表
+     * 
+     * @param tPlantBlind 盲板清单
+     * @return 盲板清单集合
+     */
+    public List<TPlantBlind> selectTPlantBlindList(TPlantBlind tPlantBlind);
+
+    /**
+     * 新增盲板清单
+     * 
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    public int insertTPlantBlind(TPlantBlind tPlantBlind);
+
+    /**
+     * 修改盲板清单
+     * 
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    public int updateTPlantBlind(TPlantBlind tPlantBlind);
+
+    /**
+     * 批量删除盲板清单
+     * 
+     * @param ids 需要删除的盲板清单ID
+     * @return 结果
+     */
+    public int deleteTPlantBlindByIds(Long[] ids);
+
+    /**
+     * 删除盲板清单信息
+     * 
+     * @param id 盲板清单ID
+     * @return 结果
+     */
+    public int deleteTPlantBlindById(Long id);
+}

+ 93 - 0
master/src/main/java/com/ruoyi/project/process/service/impl/TPlantBlindServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.project.process.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.process.mapper.TPlantBlindMapper;
+import com.ruoyi.project.process.domain.TPlantBlind;
+import com.ruoyi.project.process.service.ITPlantBlindService;
+
+/**
+ * 盲板清单Service业务层处理
+ *
+ * @author ssy
+ * @date 2025-12-19
+ */
+@Service
+public class TPlantBlindServiceImpl implements ITPlantBlindService
+{
+    @Autowired
+    private TPlantBlindMapper tPlantBlindMapper;
+
+    /**
+     * 查询盲板清单
+     *
+     * @param id 盲板清单ID
+     * @return 盲板清单
+     */
+    @Override
+    public TPlantBlind selectTPlantBlindById(Long id)
+    {
+        return tPlantBlindMapper.selectTPlantBlindById(id);
+    }
+
+    /**
+     * 查询盲板清单列表
+     *
+     * @param tPlantBlind 盲板清单
+     * @return 盲板清单
+     */
+    @Override
+    public List<TPlantBlind> selectTPlantBlindList(TPlantBlind tPlantBlind)
+    {
+        return tPlantBlindMapper.selectTPlantBlindList(tPlantBlind);
+    }
+
+    /**
+     * 新增盲板清单
+     *
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    @Override
+    public int insertTPlantBlind(TPlantBlind tPlantBlind)
+    {
+        return tPlantBlindMapper.insertTPlantBlind(tPlantBlind);
+    }
+
+    /**
+     * 修改盲板清单
+     *
+     * @param tPlantBlind 盲板清单
+     * @return 结果
+     */
+    @Override
+    public int updateTPlantBlind(TPlantBlind tPlantBlind)
+    {
+        return tPlantBlindMapper.updateTPlantBlind(tPlantBlind);
+    }
+
+    /**
+     * 批量删除盲板清单
+     *
+     * @param ids 需要删除的盲板清单ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTPlantBlindByIds(Long[] ids)
+    {
+        return tPlantBlindMapper.deleteTPlantBlindByIds(ids);
+    }
+
+    /**
+     * 删除盲板清单信息
+     *
+     * @param id 盲板清单ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTPlantBlindById(Long id)
+    {
+        return tPlantBlindMapper.deleteTPlantBlindById(id);
+    }
+}

+ 37 - 2
master/src/main/java/com/ruoyi/project/pssr/controller/TPssrAboveallController.java

@@ -13,6 +13,8 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.process.domain.TPlantBlind;
+import com.ruoyi.project.process.service.ITPlantBlindService;
 import com.ruoyi.project.pssr.domain.*;
 import com.ruoyi.project.pssr.service.*;
 import com.ruoyi.project.reliability.domain.TSafetyvavle;
@@ -186,6 +188,9 @@ public class TPssrAboveallController extends BaseController {
 
     @Autowired
     private ISysMessageService sysMessageService;
+
+    @Autowired
+    private ITPlantBlindService tPlantBlindService;
     //endregion
 
     //region 系统方法
@@ -369,6 +374,8 @@ public class TPssrAboveallController extends BaseController {
                         genJdjdkj(subcontent.getId(), userId);
                     } else if (subcontent.getForShort().equals("zdj")) {
                         genZdj(subcontent.getId(), subcontent.getUnit(), userId);
+                    } else if (subcontent.getForShort().equals("mb")) {
+                        genMbByBlindList(subcontent.getId(), subcontent.getRegion(), subcontent.getUnit(), userId);
                     }
                 }, "新增子表数据").start();
             }
@@ -381,9 +388,37 @@ public class TPssrAboveallController extends BaseController {
 
         new Thread(() -> {
             sendEmail(userIds, tPssrAboveall);
-        },"新增pssr开始发邮件").start();
+        }, "新增pssr开始发邮件").start();
         return AjaxResult.success();
     }
+
+    /**
+     * 根据盲板清单生成pssr盲板数据
+     * */
+    private void genMbByBlindList(Long id, String region, String unit, String userId) {
+        TPlantBlind tPlantBlind = new TPlantBlind();
+        tPlantBlind.setRegion(region);
+        tPlantBlind.setUnitNos(Arrays.asList(unit.split(",")));
+        for (TPlantBlind blind : tPlantBlindService.selectTPlantBlindList(tPlantBlind)) {
+            TPssrBlind item = new TPssrBlind();
+            item.setSubId(id);
+            item.setUnitNo(blind.getUnitNo());
+            item.setBlindNo(blind.getBlindNo());
+            item.setBlindSize(blind.getBlindSize());
+            item.setPressureRate(blind.getPressureRate());
+            item.setMedium(blind.getMedium());
+            item.setPidNo(blind.getPidNo());
+            item.setLocation(blind.getLocation());
+            item.setIsoType(blind.getIsoType());
+            item.setBlindType(blind.getBlindType());
+            item.setStartupStatus(blind.getStartupStatus());
+            item.setFigure("✔");
+            item.setApproveStatus(0L);
+            item.setCreatedate(new Date());
+            item.setCreaterCode(userId);
+            tPssrBlindService.insertTPssrBlind(item);
+        }
+    }
     //endregion
 
     //region 生成固定内容数据
@@ -1167,7 +1202,7 @@ public class TPssrAboveallController extends BaseController {
                 String three = two.replace("loginName", loginName);
                 String four = three.replace("region", tPssrAboveall.getRegion());
                 String five = four.replace("unit", "," + tPssrAboveall.getUnit() + "单元");
-                String six = five.replace("aboveallId", tPssrAboveall.getId().toString() );
+                String six = five.replace("aboveallId", tPssrAboveall.getId().toString());
                 String seven = six.replaceFirst("startDate", DateUtils.dateTime(tPssrAboveall.getDrivingTime()));
                 String result = seven.replaceFirst("date", DateUtils.dateTime());
                 prime = prime + result;

+ 181 - 0
master/src/main/resources/mybatis/process/TPlantBlindMapper.xml

@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.project.process.mapper.TPlantBlindMapper">
+    
+    <resultMap type="TPlantBlind" id="TPlantBlindResult">
+        <result property="id"    column="id"    />
+        <result property="region"    column="region"    />
+        <result property="unitNo"    column="unit_no"    />
+        <result property="pidNo"    column="pid_no"    />
+        <result property="medium"    column="medium"    />
+        <result property="blindNo"    column="blind_no"    />
+        <result property="location"    column="location"    />
+        <result property="isoType"    column="iso_type"    />
+        <result property="tagNo"    column="tag_no"    />
+        <result property="blindSize"    column="blind_size"    />
+        <result property="pressureRate"    column="pressure_rate"    />
+        <result property="pressurized"    column="pressurized"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createrCode"    column="creater_code"    />
+        <result property="createdate"    column="createdate"    />
+        <result property="updaterCode"    column="updater_code"    />
+        <result property="updatedate"    column="updatedate"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="remarks"    column="remarks"    />
+        <result property="approveStatus"    column="approve_status"    />
+        <result property="installStatus"    column="install_status"    />
+        <result property="removeStatus"    column="remove_status"    />
+        <result property="blindType"    column="blind_type"    />
+        <result property="startupStatus"    column="startup_status"    />
+        <result property="deptName" column="dept_name" />
+    </resultMap>
+
+    <sql id="selectTPlantBlindVo">
+        select d.id, d.region, d.unit_no, d.pid_no, d.medium, d.blind_no, d.location, d.iso_type, d.tag_no, d.blind_size, d.pressure_rate, d.pressurized, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.dept_id, d.remarks, d.approve_status, d.install_status, d.remove_status, d.blind_type, d.startup_status ,s.dept_name from t_plant_blind d
+      left join sys_dept s on s.dept_id = d.dept_id
+    </sql>
+
+    <select id="selectTPlantBlindList" parameterType="TPlantBlind" resultMap="TPlantBlindResult">
+        <include refid="selectTPlantBlindVo"/>
+        <where>  
+            <if test="region != null  and region != ''"> and region = #{region}</if>
+            <if test="unitNo != null  and unitNo != ''"> and unit_no = #{unitNo}</if>
+            <if test="pidNo != null  and pidNo != ''"> and pid_no = #{pidNo}</if>
+            <if test="medium != null  and medium != ''"> and medium = #{medium}</if>
+            <if test="blindNo != null  and blindNo != ''"> and blind_no = #{blindNo}</if>
+            <if test="location != null  and location != ''"> and location = #{location}</if>
+            <if test="isoType != null  and isoType != ''"> and iso_type = #{isoType}</if>
+            <if test="tagNo != null  and tagNo != ''"> and tag_no = #{tagNo}</if>
+            <if test="blindSize != null  and blindSize != ''"> and blind_size = #{blindSize}</if>
+            <if test="pressureRate != null  and pressureRate != ''"> and pressure_rate = #{pressureRate}</if>
+            <if test="pressurized != null  and pressurized != ''"> and pressurized = #{pressurized}</if>
+            <if test="createrCode != null  and createrCode != ''"> and creater_code = #{createrCode}</if>
+            <if test="createdate != null "> and createdate = #{createdate}</if>
+            <if test="updaterCode != null  and updaterCode != ''"> and updater_code = #{updaterCode}</if>
+            <if test="updatedate != null "> and updatedate = #{updatedate}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+            <if test="approveStatus != null "> and approve_status = #{approveStatus}</if>
+            <if test="installStatus != null  and installStatus != ''"> and install_status = #{installStatus}</if>
+            <if test="removeStatus != null  and removeStatus != ''"> and remove_status = #{removeStatus}</if>
+            <if test="blindType != null  and blindType != ''"> and blind_type = #{blindType}</if>
+            <if test="startupStatus != null  and startupStatus != ''"> and startup_status = #{startupStatus}</if>
+            <if test="unitNos != null">and unit_no in
+                <foreach item="unitNo" collection="unitNos" open="(" separator="," close=")">
+                    #{unitNo}
+                </foreach>
+            </if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+    
+    <select id="selectTPlantBlindById" parameterType="Long" resultMap="TPlantBlindResult">
+        <include refid="selectTPlantBlindVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertTPlantBlind" parameterType="TPlantBlind">
+        <selectKey keyProperty="id" resultType="long" order="BEFORE">
+            SELECT seq_t_plant_blind.NEXTVAL as id FROM DUAL
+        </selectKey>
+        insert into t_plant_blind
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="region != null">region,</if>
+            <if test="unitNo != null">unit_no,</if>
+            <if test="pidNo != null">pid_no,</if>
+            <if test="medium != null">medium,</if>
+            <if test="blindNo != null">blind_no,</if>
+            <if test="location != null">location,</if>
+            <if test="isoType != null">iso_type,</if>
+            <if test="tagNo != null">tag_no,</if>
+            <if test="blindSize != null">blind_size,</if>
+            <if test="pressureRate != null">pressure_rate,</if>
+            <if test="pressurized != null">pressurized,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createrCode != null">creater_code,</if>
+            <if test="createdate != null">createdate,</if>
+            <if test="updaterCode != null">updater_code,</if>
+            <if test="updatedate != null">updatedate,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="remarks != null">remarks,</if>
+            <if test="approveStatus != null">approve_status,</if>
+            <if test="installStatus != null">install_status,</if>
+            <if test="removeStatus != null">remove_status,</if>
+            <if test="blindType != null">blind_type,</if>
+            <if test="startupStatus != null">startup_status,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="region != null">#{region},</if>
+            <if test="unitNo != null">#{unitNo},</if>
+            <if test="pidNo != null">#{pidNo},</if>
+            <if test="medium != null">#{medium},</if>
+            <if test="blindNo != null">#{blindNo},</if>
+            <if test="location != null">#{location},</if>
+            <if test="isoType != null">#{isoType},</if>
+            <if test="tagNo != null">#{tagNo},</if>
+            <if test="blindSize != null">#{blindSize},</if>
+            <if test="pressureRate != null">#{pressureRate},</if>
+            <if test="pressurized != null">#{pressurized},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createrCode != null">#{createrCode},</if>
+            <if test="createdate != null">#{createdate},</if>
+            <if test="updaterCode != null">#{updaterCode},</if>
+            <if test="updatedate != null">#{updatedate},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="remarks != null">#{remarks},</if>
+            <if test="approveStatus != null">#{approveStatus},</if>
+            <if test="installStatus != null">#{installStatus},</if>
+            <if test="removeStatus != null">#{removeStatus},</if>
+            <if test="blindType != null">#{blindType},</if>
+            <if test="startupStatus != null">#{startupStatus},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTPlantBlind" parameterType="TPlantBlind">
+        update t_plant_blind
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="region != null">region = #{region},</if>
+            <if test="unitNo != null">unit_no = #{unitNo},</if>
+            <if test="pidNo != null">pid_no = #{pidNo},</if>
+            <if test="medium != null">medium = #{medium},</if>
+            <if test="blindNo != null">blind_no = #{blindNo},</if>
+            <if test="location != null">location = #{location},</if>
+            <if test="isoType != null">iso_type = #{isoType},</if>
+            <if test="tagNo != null">tag_no = #{tagNo},</if>
+            <if test="blindSize != null">blind_size = #{blindSize},</if>
+            <if test="pressureRate != null">pressure_rate = #{pressureRate},</if>
+            <if test="pressurized != null">pressurized = #{pressurized},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createrCode != null">creater_code = #{createrCode},</if>
+            <if test="createdate != null">createdate = #{createdate},</if>
+            <if test="updaterCode != null">updater_code = #{updaterCode},</if>
+            <if test="updatedate != null">updatedate = #{updatedate},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+            <if test="approveStatus != null">approve_status = #{approveStatus},</if>
+            <if test="installStatus != null">install_status = #{installStatus},</if>
+            <if test="removeStatus != null">remove_status = #{removeStatus},</if>
+            <if test="blindType != null">blind_type = #{blindType},</if>
+            <if test="startupStatus != null">startup_status = #{startupStatus},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTPlantBlindById" parameterType="Long">
+        update t_plant_blind set del_flag = 2 where id = #{id}
+    </update>
+
+    <update id="deleteTPlantBlindByIds" parameterType="String">
+        update t_plant_blind set del_flag = 2 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+    
+</mapper>

BIN
master/src/main/resources/static/template/process/blind.xlsx


+ 53 - 0
ui/src/api/process/blind.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询盲板清单列表
+export function listBlind(query) {
+  return request({
+    url: '/process/blind/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询盲板清单详细
+export function getBlind(id) {
+  return request({
+    url: '/process/blind/' + id,
+    method: 'get'
+  })
+}
+
+// 新增盲板清单
+export function addBlind(data) {
+  return request({
+    url: '/process/blind',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改盲板清单
+export function updateBlind(data) {
+  return request({
+    url: '/process/blind',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除盲板清单
+export function delBlind(id) {
+  return request({
+    url: '/process/blind/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出盲板清单
+export function exportBlind(query) {
+  return request({
+    url: '/process/blind/export',
+    method: 'get',
+    params: query
+  })
+}

+ 502 - 0
ui/src/views/process/blind/index.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="区域" prop="region">
+        <el-input
+          v-model="queryParams.region"
+          placeholder="请输入区域"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="单元" prop="unitNo">
+        <el-input
+          v-model="queryParams.unitNo"
+          placeholder="请输入单元"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="PID" prop="pidNo">
+        <el-input
+          v-model="queryParams.pidNo"
+          placeholder="请输入PID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="介质" prop="medium">
+        <el-input
+          v-model="queryParams.medium"
+          placeholder="请输入介质"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="盲板编号" prop="blindNo">
+        <el-input
+          v-model="queryParams.blindNo"
+          placeholder="请输入盲板编号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="location">
+        <el-input
+          v-model="queryParams.location"
+          placeholder="请输入位置"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['process:blind:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['process:blind:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['process:blind:remove']"
+        >删除</el-button>
+      </el-col>
+        <el-col :span="1.5">
+            <el-button
+                    type="info"
+                    icon="el-icon-upload2"
+                    size="mini"
+                    @click="handleImport"
+                    v-hasPermi="['process:blind:edit']"
+            >导入</el-button>
+        </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['process:blind:list']"
+        >导出</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="blindList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="区域" align="center" prop="region" :show-overflow-tooltip="true"/>
+      <el-table-column label="单元" align="center" prop="unitNo" :show-overflow-tooltip="true"/>
+      <el-table-column label="盲板编号" align="center" prop="blindNo" :show-overflow-tooltip="true"/>
+      <el-table-column label="尺寸" align="center" prop="blindSize" :show-overflow-tooltip="true"/>
+      <el-table-column label="压力等级" align="center" prop="pressureRate" :show-overflow-tooltip="true"/>
+      <el-table-column label="介质" align="center" prop="medium" :show-overflow-tooltip="true"/>
+      <el-table-column label="PID" align="center" prop="pidNo" :show-overflow-tooltip="true"/>
+      <el-table-column label="位置" align="center" prop="location" :show-overflow-tooltip="true"/>
+      <el-table-column label="隔离类型" align="center" prop="isoType" :show-overflow-tooltip="true"/>
+      <el-table-column label="盲板类型" align="center" prop="blindType" :show-overflow-tooltip="true"/>
+      <el-table-column label="当前状态" align="center" prop="startupStatus" :show-overflow-tooltip="true"/>
+      <el-table-column label="备注" align="center" prop="remarks" :show-overflow-tooltip="true"/>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['process:blind:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['process:blind:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改盲板清单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <!-- 按列表顺序排列字段 -->
+        <el-form-item label="区域" prop="region">
+          <el-input v-model="form.region" placeholder="请输入区域" />
+        </el-form-item>
+        <el-form-item label="单元" prop="unitNo">
+          <el-input v-model="form.unitNo" placeholder="请输入单元" />
+        </el-form-item>
+        <el-form-item label="盲板编号" prop="blindNo">
+          <el-input v-model="form.blindNo" placeholder="请输入盲板编号" />
+        </el-form-item>
+        <el-form-item label="尺寸" prop="blindSize">
+          <el-input v-model="form.blindSize" placeholder="请输入尺寸" />
+        </el-form-item>
+        <el-form-item label="压力等级" prop="pressureRate">
+          <el-input v-model="form.pressureRate" placeholder="请输入压力等级" />
+        </el-form-item>
+        <el-form-item label="介质" prop="medium">
+          <el-input v-model="form.medium" placeholder="请输入介质" />
+        </el-form-item>
+        <el-form-item label="PID" prop="pidNo">
+          <el-input v-model="form.pidNo" placeholder="请输入PID" />
+        </el-form-item>
+        <el-form-item label="位置" prop="location">
+          <el-input v-model="form.location" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="隔离类型" prop="isoType">
+          <el-input v-model="form.isoType" placeholder="请输入隔离类型" />
+        </el-form-item>
+        <el-form-item label="盲板类型" prop="blindType">
+          <el-input v-model="form.blindType" placeholder="请输入盲板类型" />
+        </el-form-item>
+        <el-form-item label="当前状态" prop="startupStatus">
+          <el-radio-group v-model="form.startupStatus">
+            <el-radio label="盲">盲</el-radio>
+            <el-radio label="通">通</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+      <!-- 用户导入对话框 -->
+      <el-dialog :close-on-click-modal="false" v-dialogDrag :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+          <el-upload
+                  ref="upload"
+                  :limit="1"
+                  accept=".xlsx, .xls"
+                  :headers="upload.headers"
+                  :action="upload.url"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :auto-upload="false"
+                  drag
+          >
+              <i class="el-icon-upload"></i>
+              <div class="el-upload__text">
+                  将文件拖到此处,或
+                  <em>点击上传</em>
+              </div>
+              <div class="el-upload__tip" slot="tip">
+                  <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+              </div>
+              <form ref="downloadFileForm" :action="upload.downloadAction" target="FORMSUBMIT">
+                  <input name="type" :value="upload.type" hidden/>
+              </form>
+              <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+          </el-upload>
+          <div slot="footer" class="dialog-footer">
+              <el-button type="primary" @click="submitFileForm">确 定</el-button>
+              <el-button @click="upload.open = false">取 消</el-button>
+          </div>
+      </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listBlind, getBlind, delBlind, addBlind, updateBlind, exportBlind } from "@/api/process/blind";
+import { treeselect } from "@/api/system/dept";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Blind",
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 盲板清单表格数据
+      blindList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            downloadAction: process.env.VUE_APP_BASE_API + '/common/template',
+            // 下载模板类型
+            type: 'blindList',
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/process/blind/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        region: null,
+        unitNo: null,
+        pidNo: null,
+        medium: null,
+        blindNo: null,
+        location: null,
+        isoType: null,
+        tagNo: null,
+        blindSize: null,
+        pressureRate: null,
+        pressurized: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        remarks: null,
+        approveStatus: null,
+        installStatus: null,
+        removeStatus: null,
+        blindType: null,
+        startupStatus: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        id: [
+          { required: true, message: "唯一标识ID不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  watch: {
+        // 根据名称筛选部门树
+        deptName(val) {
+            this.$refs.tree.filter(val);
+        }
+   },
+  created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+          this.clientHeight = document.body.clientHeight -250
+      })
+    this.getList();
+    this.getTreeselect();
+  },
+  methods: {
+    /** 查询盲板清单列表 */
+    getList() {
+      this.loading = true;
+      listBlind(this.queryParams).then(response => {
+        this.blindList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+          treeselect().then(response => {
+              this.deptOptions = response.data;
+          });
+     },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        region: null,
+        unitNo: null,
+        pidNo: null,
+        medium: null,
+        blindNo: null,
+        location: null,
+        isoType: null,
+        tagNo: null,
+        blindSize: null,
+        pressureRate: null,
+        pressurized: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        remarks: null,
+        approveStatus: 0,
+        installStatus: null,
+        removeStatus: null,
+        blindType: null,
+        startupStatus: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加盲板清单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getBlind(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改盲板清单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateBlind(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addBlind(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delBlind(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有盲板清单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportBlind(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+    },
+      /** 导入按钮操作 */
+      handleImport() {
+          this.upload.title = "数据导入";
+          this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+          this.$refs['downloadFileForm'].submit()
+      },
+      // 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+          this.upload.isUploading = true;
+      },
+      // 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+          this.upload.open = false;
+          this.upload.isUploading = false;
+          this.$refs.upload.clearFiles();
+          if (response.data[0] != null) {
+              this.$alert('成功导入' + response.msg + '条数据,' + '第' + response.data + '行数据出现错误导入失败' + '。', '导入结果', {dangerouslyUseHTMLString: true});
+          } else {
+              this.$alert('成功导入' + response.msg + '条数据', '导入结果', {dangerouslyUseHTMLString: true});
+          }
+          this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+          this.$refs.upload.submit();
+      }
+  }
+};
+</script>