Browse Source

feat(eoeg): 添加锁变更申请单Word预览功能- 在TEoegLockChangeController中集成Poi-Tl库实现Word模板渲染
- 新增wordView接口用于生成并返回Word文件路径
- 实现签名图片和文本数据的动态填充
- 增加勾选框状态渲染逻辑
- 前端页面添加预览按钮及PDF/Word文件预览对话框
- 修改锁状态更新逻辑,拆锁后自动将状态设为已完成
-修复锁列表查询条件,只显示未完成状态的锁
- 优化用户选择器的数值类型处理

jiangbiao 2 months ago
parent
commit
a1114cf89a

+ 257 - 0
master/src/main/java/com/ruoyi/project/eoeg/controller/TEoegLockChangeController.java

@@ -1,10 +1,17 @@
 package com.ruoyi.project.eoeg.controller;
 
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.Pictures;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.Texts;
+import com.deepoove.poi.data.style.Style;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
 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.config.RuoYiConfig;
 import com.ruoyi.framework.interceptor.annotation.RepeatSubmit;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
@@ -19,6 +26,7 @@ import com.ruoyi.project.eoeg.service.ITEoegLockService;
 import com.ruoyi.project.plant.domain.TStaffmgr;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.service.ISysUserService;
+import io.jsonwebtoken.lang.Assert;
 import org.activiti.engine.ProcessEngine;
 import org.activiti.engine.ProcessEngines;
 import org.activiti.engine.RuntimeService;
@@ -30,6 +38,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -286,6 +297,9 @@ public class TEoegLockChangeController extends BaseController {
                 change.setResetConfirm(form.getResetConfirm());
                 change.setStatus(1L);
                 change.setApproveStatus("2");
+                //修改锁状态
+                lock.setStatus(0L);//将锁状态改为已拆锁
+                tEoegLockService.updateTEoegLock(lock);
                 break;
         }
         param.put("condition", devTask.getCondition());
@@ -354,4 +368,247 @@ public class TEoegLockChangeController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(tEoegLockChangeService.deleteTEoegLockChangeByIds(ids));
     }
+
+
+
+    /**
+     * @param id
+     * @return
+     * @throws IOException
+     */
+    @GetMapping("/wordView/{id}")
+    public AjaxResult wordView(@PathVariable Long id) throws IOException {
+        //根据ID查询并生成
+        String url = PreView(id);
+        return AjaxResult.success(url);
+    }
+
+    /**
+     * @param id 生成文件名
+     * @return
+     * @throws IOException
+     */
+    public String PreView(Long id) throws IOException {
+        //根据ID查询并生成
+        TEoegLockChange tEoegLockChange = tEoegLockChangeService.selectTEoegLockChangeById(id);
+        return this.createEoegLockChangeWord(tEoegLockChange);
+    }
+
+    /**
+     * 生成word
+     */
+    public String createEoegLockChangeWord(TEoegLockChange tEoegLockChange) throws IOException {
+        //生成word
+        //渲染文本
+        Map<String, Object> params = getWordData(tEoegLockChange);
+        // 模板路径
+        String templatePath = "static/word/apply/applyEoegLock.docx";
+        // 生成word的路径
+        String fileDir = RuoYiConfig.getProfile() + "/" + "apply/eoegLockChange";
+        // 生成word的文件名称
+        String fileName = tEoegLockChange.getId() + ".docx";
+        return this.createWord(templatePath, fileDir, fileName, params);
+    }
+
+    /**
+     * 获取word数据
+     */
+    public Map<String, Object> getWordData(TEoegLockChange tEoegLockChange) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("lockNo", Texts.of(tEoegLockChange.getLockNo()).fontSize(10).bold().create());
+        params.put("changeDescribe", Texts.of(tEoegLockChange.getChangeDescribe()).fontSize(10).bold().create());
+        params.put("changeReason", Texts.of(tEoegLockChange.getChangeReason()).fontSize(10).bold().create());
+        if (StringUtils.isNotEmpty(tEoegLockChange.getApplicant())) {//申请人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getApplicant()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("applicantP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("applicant", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getApplicationTime() != null) {//申请时间
+            params.put("applicationTime", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getApplicationTime())).fontSize(9).bold().create());
+        }
+        params.put("safa", Texts.of(tEoegLockChange.getSafa()).fontSize(10).bold().create());
+        if (StringUtils.isNotEmpty(tEoegLockChange.getSafaer())) {//安全评估人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getSafaer()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("safaerP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("safaer", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+
+        if (tEoegLockChange.getSafaTime() != null) {//安全评估时间
+            params.put("safaTime", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getSafaTime())).fontSize(9).bold().create());
+        }
+        if (StringUtils.isNotEmpty(tEoegLockChange.getApprover())) {//批准人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getApprover()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("approverP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("approver", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getApproveTime() != null) {//批准时间
+            params.put("approveTime", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getApproveTime())).fontSize(9).bold().create());
+        }
+        if (StringUtils.isNotEmpty(tEoegLockChange.getChangeConfirmer())) {//变更确认人人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getChangeConfirmer()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("chconP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("chcon", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getChangeConfirmTime() != null) {//变更确认时间
+            params.put("chconT", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getChangeConfirmTime())).fontSize(9).bold().create());
+        }
+//        if (StringUtils.isNotEmpty(tEoegLockChange.getMonitor())) {//班长
+//            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getMonitor()));
+//            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+//                params.put("monP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+//            } else {
+//                params.put("mon", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+//            }
+//        }
+//        if (tEoegLockChange.getMonitorTime() != null) {//班长确认时间
+//            params.put("monT", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getMonitorTime())).fontSize(9).bold().create());
+//        }
+        if (StringUtils.isNotEmpty(tEoegLockChange.getExecutor())) {//临时安全措施执行人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getExecutor()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("exeP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("exe", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getExecutionTime() != null) {//临时安全措施执行(时间)
+            params.put("exeT", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getExecutionTime())).fontSize(9).bold().create());
+        }
+        if (StringUtils.isNotEmpty(tEoegLockChange.getConfirmer())) {//临时安全措施确认人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getConfirmer()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("conP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("con", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getConfirmTime() != null) {//临时安全措施确认(时间)
+            params.put("conT", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getConfirmTime())).fontSize(9).bold().create());
+        }
+        params.put("changeExecution", Texts.of(tEoegLockChange.getChangeExecution()).fontSize(10).bold().create());
+
+        if (StringUtils.isNotEmpty(tEoegLockChange.getChangeExecutor())) {//执行人
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getChangeExecutor()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("cEP", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("cE", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getChangeExecutorTime() != null) {//执行时间)
+            params.put("cET", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getChangeExecutorTime())).fontSize(9).bold().create());
+        }
+        getCheck(params, tEoegLockChange.getResetConfirm(), "resetConfirm1", "resetConfirm2");
+
+        if (StringUtils.isNotEmpty(tEoegLockChange.getResetConfirmer1())) {//状态恢复,确认人1
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getResetConfirmer1()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("resetConfirmer1P", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("resetConfirmer1", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getResetConfirmTime1() != null) {//状态恢复,确认人1时间)
+            params.put("resetConfirmTime1", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getResetConfirmTime1())).fontSize(9).bold().create());
+        }
+        if (StringUtils.isNotEmpty(tEoegLockChange.getResetConfirmer2())) {//状态恢复,确认人2
+            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tEoegLockChange.getResetConfirmer2()));
+            if (sysUser.getSignUrl() != null && new File(fileName(sysUser.getSignUrl())).exists()) {
+                params.put("resetConfirmer2P", Pictures.ofLocal(fileName(sysUser.getSignUrl())).size(50, 20).create());
+            } else {
+                params.put("resetConfirmer2", Texts.of(sysUser.getNickName()).fontSize(10).bold().create());
+            }
+        }
+        if (tEoegLockChange.getResetConfirmTime2() != null) {//状态恢复,确认人2时间)
+            params.put("resetConfirmTime2", Texts.of(DateUtils.dateTimeMin(tEoegLockChange.getResetConfirmTime2())).fontSize(9).bold().create());
+        }
+
+        getCheck(params, tEoegLockChange.getRevokeConfirm(), "revoke1", "revoke2");
+        getCheck(params, tEoegLockChange.getRevokeConfirm(), "revoke3");
+        params.put("remarks", Texts.of(tEoegLockChange.getRemarks()).fontSize(10).bold().create());
+
+        // 渲染文本
+        return params;
+    }
+
+    /**
+     * @param templatePath word模板文件路径
+     * @param fileDir      生成的文件存放地址
+     * @param fileName     生成的文件名
+     * @param paramMap     参数集合
+     * @return 返回word生成的路径
+     */
+    public String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) throws IOException {
+        Assert.notNull(templatePath, "word模板文件路径不能为空");
+        Assert.notNull(fileDir, "生成的文件存放地址不能为空");
+        Assert.notNull(fileName, "生成的文件名不能为空");
+        File dir = new File(fileDir);
+        if (!dir.exists()) {
+            logger.info("目录不存在,创建文件夹{}!", fileDir);
+            dir.mkdirs();
+        }
+        fileName = fileName.replaceAll("/", "_"); //替换文件中敏感字段
+        logger.info("目录文件{}!", fileName);
+        String filePath = fileDir + "/" + fileName;
+        logger.info("目录{}!", filePath);
+        // 读取模板渲染参数
+        InputStream is = getClass().getClassLoader().getResourceAsStream(templatePath);
+        XWPFTemplate template = XWPFTemplate.compile(is).render(paramMap);
+        try {
+            // 将模板参数写入路径
+            template.writeToFile(filePath);
+            template.close();
+        } catch (Exception e) {
+            logger.error("生成word异常{}", e.getMessage());
+            e.printStackTrace();
+        }
+        String pathFileName = FileUploadUtils.getPathFileName(RuoYiConfig.getFilePath("/" + "apply/EoegLockChange"), fileName);
+        return pathFileName;
+    }
+
+    // 勾选框判断渲染
+    public void getCheck(Map<String, Object> params, String value, String check1, String check2) {
+        if ("是".equals(value)) {
+            params.put(check1, new TextRenderData("\u00FE", new Style("Wingdings", 9)));
+            params.put(check2, new TextRenderData("\u006F", new Style("Wingdings", 9)));
+        } else if ("否".equals(value)) {
+            params.put(check1, new TextRenderData("\u006F", new Style("Wingdings", 9)));
+            params.put(check2, new TextRenderData("\u00FE", new Style("Wingdings", 9)));
+        } else {
+            params.put(check1, new TextRenderData("\u006F", new Style("Wingdings", 9)));
+            params.put(check2, new TextRenderData("\u006F", new Style("Wingdings", 9)));
+        }
+    }
+
+    // 勾选框判断渲染
+    public void getCheck(Map<String, Object> params, String value, String check1) {
+        if ("NA".equals(value)) {
+            params.put(check1, new TextRenderData("\u00FE", new Style("Wingdings", 9)));
+        } else {
+            params.put(check1, new TextRenderData("\u006F", new Style("Wingdings", 9)));
+        }
+    }
+
+    /**
+     * @param
+     * @return 映射签名的文件名
+     * @throws IOException
+     */
+    public String fileName(String filepath) {
+        String newFilePath = filepath.replace("/profile", "");
+        String pathName = RuoYiConfig.getProfile() + newFilePath;
+        return pathName;
+    }
 }

+ 1 - 1
master/src/main/resources/mybatis/eoeg/TEoegLockMapper.xml

@@ -48,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="valveSize != null  and valveSize != ''"> and valve_size = #{valveSize}</if>
             <if test="reasons != null  and reasons != ''"> and reasons = #{reasons}</if>
             <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
-            <if test="status != null "> and status = #{status}</if>
+            <if test="status != null "> and d.status = #{status}</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 updater_code = #{updaterCode}</if>

BIN
master/src/main/resources/static/word/apply/applyEoegLock.docx


+ 10 - 0
ui/src/api/eoeg/eoegChange.js

@@ -59,3 +59,13 @@ export function exportEoegChange(query) {
     params: query
   })
 }
+
+
+
+//获取word url
+export function wordView(id) {
+  return request({
+    url: '/eoeg/eoegChange/wordView/' + id,
+    method: 'get',
+  })
+}

+ 186 - 68
ui/src/views/eoeg/eoegChange/index.vue

@@ -112,12 +112,19 @@
       <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-document"
-          @click="openDetail(scope.row)"
+            size="mini"
+            type="text"
+            icon="el-icon-document"
+            @click="openDetail(scope.row)"
           >详情
           </el-button>
+          <el-button v-if="scope.row.approveStatus == 2"
+                     size="mini"
+                     type="text"
+                     icon="el-icon-document"
+                     @click="wordView(scope.row)"
+          >预览
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -131,36 +138,78 @@
     />
 
     <el-dialog title="详情" :visible.sync="detail.open" width="70%" append-to-body close-on-click-modal>
-      <el-descriptions class="margin-top"  :column="2"  border :label-style="{'width': '200px'}">
-        <el-descriptions-item label="申请状态"><el-tag size="small" :type="approveStatusFlag">{{ approveStatus[detail.detailData.approveStatus] }}</el-tag></el-descriptions-item>
-        <el-descriptions-item label="完成状态"><el-tag size="small" :type="statusFlag">{{ status[detail.detailData.status] }}</el-tag></el-descriptions-item>
+      <el-descriptions class="margin-top" :column="2" border :label-style="{'width': '200px'}">
+        <el-descriptions-item label="申请状态">
+          <el-tag size="small" :type="approveStatusFlag">{{ approveStatus[detail.detailData.approveStatus] }}</el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="完成状态">
+          <el-tag size="small" :type="statusFlag">{{ status[detail.detailData.status] }}</el-tag>
+        </el-descriptions-item>
         <el-descriptions-item label="锁编号">{{ detail.detailData.lockNo }}</el-descriptions-item>
         <el-descriptions-item label="措施变更描述">{{ detail.detailData.changeDescribe }}</el-descriptions-item>
         <el-descriptions-item label="状态变更原因">{{ detail.detailData.changeReason }}</el-descriptions-item>
         <el-descriptions-item label="评估及临时的安全措施">{{ detail.detailData.safa }}</el-descriptions-item>
         <el-descriptions-item label="申请人">{{ detail.detailData.applicantName }}</el-descriptions-item>
-        <el-descriptions-item label="申请时间">{{ parseTime(detail.detailData.applicationTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="申请时间">{{
+            parseTime(detail.detailData.applicationTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="评估人">{{ detail.detailData.safaerName }}</el-descriptions-item>
-        <el-descriptions-item label="评估时间">{{ parseTime(detail.detailData.safaTime, '{y}-{m}-{d}') }}</el-descriptions-item>
-        <el-descriptions-item :span="2" label="组织保护措施状态变更执行">{{ detail.detailData.changeExecution }}</el-descriptions-item>
+        <el-descriptions-item label="评估时间">{{
+            parseTime(detail.detailData.safaTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item :span="2" label="组织保护措施状态变更执行">{{
+            detail.detailData.changeExecution
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="批准人">{{ detail.detailData.approverName }}</el-descriptions-item>
-        <el-descriptions-item label="批准时间">{{ parseTime(detail.detailData.approveTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="批准时间">{{
+            parseTime(detail.detailData.approveTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="措施确认人">{{ detail.detailData.confirmerName }}</el-descriptions-item>
-        <el-descriptions-item label="措施确认时间">{{ parseTime(detail.detailData.confirmTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="措施确认时间">{{
+            parseTime(detail.detailData.confirmTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="措施执行人">{{ detail.detailData.executorName }}</el-descriptions-item>
-        <el-descriptions-item label="措施执行时间">{{ parseTime(detail.detailData.executionTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="措施执行时间">{{
+            parseTime(detail.detailData.executionTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="变更确认人">{{ detail.detailData.changeConfirmerName }}</el-descriptions-item>
-        <el-descriptions-item label="变更确认人确认时间">{{ parseTime(detail.detailData.changeConfirmTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="变更确认人确认时间">
+          {{ parseTime(detail.detailData.changeConfirmTime, '{y}-{m}-{d}') }}
+        </el-descriptions-item>
         <el-descriptions-item label="变更执行人">{{ detail.detailData.changeExecutorName }}</el-descriptions-item>
-        <el-descriptions-item label="变更执行时间">{{ parseTime(detail.detailData.changeExecutorTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="变更执行时间">{{
+            parseTime(detail.detailData.changeExecutorTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="班长">{{ detail.detailData.monitorName }}</el-descriptions-item>
-        <el-descriptions-item label="班长确认时间">{{ parseTime(detail.detailData.monitorTime, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="班长确认时间">{{
+            parseTime(detail.detailData.monitorTime, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="确认人1">{{ detail.detailData.resetConfirmerName1 }}</el-descriptions-item>
-        <el-descriptions-item label="确认时间1">{{ parseTime(detail.detailData.resetConfirmTime1, '{y}-{m}-{d}') }}</el-descriptions-item>
+        <el-descriptions-item label="确认时间1">{{
+            parseTime(detail.detailData.resetConfirmTime1, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="确认人2">{{ detail.detailData.resetConfirmerName2 }}</el-descriptions-item>
-        <el-descriptions-item label="确认时间2">{{ parseTime(detail.detailData.resetConfirmTime2, '{y}-{m}-{d}') }}</el-descriptions-item>
-        <el-descriptions-item label="状态恢复后,之前采取的安全措施是否已撤销:">{{ detail.detailData.revokeConfirm }}</el-descriptions-item>
-        <el-descriptions-item label="组织保护措施是否已经恢复至变更前的状态">{{ detail.detailData.resetConfirm }}</el-descriptions-item>
+        <el-descriptions-item label="确认时间2">{{
+            parseTime(detail.detailData.resetConfirmTime2, '{y}-{m}-{d}')
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="状态恢复后,之前采取的安全措施是否已撤销:">{{
+            detail.detailData.revokeConfirm
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="组织保护措施是否已经恢复至变更前的状态">{{
+            detail.detailData.resetConfirm
+          }}
+        </el-descriptions-item>
         <el-descriptions-item :span="2" label="备注">{{ detail.detailData.remarks }}</el-descriptions-item>
       </el-descriptions>
       <div class="mt5">
@@ -231,35 +280,24 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-    <!-- 用户导入对话框 -->
-    <el-dialog :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 + '?updateSupport=' + upload.updateSupport"
-        :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-checkbox v-model="upload.updateSupport"/>
-          是否更新已经存在的用户数据
-          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
-        </div>
-        <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>
+
+    <el-dialog :close-on-click-modal="false" v-loading="loadingFlash" element-loading-background="rgba(0,0,0,0.2)"
+               v-dialogDrag :title="pdf.title"
+               :visible.sync="pdf.open" width="1300px" :center="true" append-to-body>
+      <div style="margin-top: -60px;float: right;margin-right: 40px;">
+        <el-button size="mini" type="text" @click="openPdf">{{ $t('新页面打开PDF') }}</el-button>
+      </div>
+      <div style="margin-top: -30px">
+        <iframe id="iFrame" class="iframe-html" :src="pdf.pdfUrl" frameborder="0" width="100%" height="700px"
+                v-if="ppt"></iframe>
+      </div>
+      <div style="padding: 30px; width: 100%; height: 100%;">
+        <el-carousel class="" ref="carousel" arrow="always" v-if="pptView"
+                     height="700px" trigger="click" :autoplay="false" indicator-position="outside">
+          <el-carousel-item class="lun_img" v-for="item in imgs" v-bind:key="item">
+            <img :src="item" width="100%" height="100%" object-fit="cover"/>
+          </el-carousel-item>
+        </el-carousel>
       </div>
     </el-dialog>
   </div>
@@ -273,7 +311,8 @@ import {
   addEoegChange,
   updateEoegChange,
   exportEoegChange,
-  importTemplate
+  importTemplate,
+  wordView
 } from "@/api/eoeg/eoegChange";
 import {treeselect} from "@/api/system/dept";
 import {getToken} from "@/utils/auth";
@@ -289,9 +328,18 @@ export default {
   components: {Treeselect},
   data() {
     return {
-      detail:{
-        open:false,
-        detailData:{}
+      detail: {
+        open: false,
+        detailData: {}
+      },
+      pdf: {
+        title: '',
+        pdfUrl: '',
+        numPages: null,
+        open: false,
+        pageNum: 1,
+        pageTotalNum: 1,
+        loadedRatio: 0,
       },
       statusFlag: '',
       approveStatusFlag: '',
@@ -399,28 +447,28 @@ export default {
       // 表单校验
       rules: {
         lockNo: [
-          { required: true, message: '锁编号不能为空', trigger: 'change' }
+          {required: true, message: '锁编号不能为空', trigger: 'change'}
         ],
         changeDescribe: [
-          { required: true, message: '组织保护措施变更描述不能为空', trigger: 'blur' }
+          {required: true, message: '组织保护措施变更描述不能为空', trigger: 'blur'}
         ],
         changeReason: [
-          { required: true, message: '状态变更原因不能为空', trigger: 'blur' }
+          {required: true, message: '状态变更原因不能为空', trigger: 'blur'}
         ],
         safa: [
-          { required: true, message: '安全评估及临时的安全措施不能为空', trigger: 'blur' }
+          {required: true, message: '安全评估及临时的安全措施不能为空', trigger: 'blur'}
         ],
         safaer: [
-          { required: true, message: '评估人不能为空', trigger: 'change' }
+          {required: true, message: '评估人不能为空', trigger: 'change'}
         ],
         executor: [
-          { required: true, message: '措施执行人不能为空', trigger: 'change' }
+          {required: true, message: '措施执行人不能为空', trigger: 'change'}
         ],
         changeExecutor: [
-          { required: true, message: '变更执行人不能为空', trigger: 'change' }
+          {required: true, message: '变更执行人不能为空', trigger: 'change'}
         ],
         changeConfirmer: [
-          { required: true, message: '变更确认人不能为空', trigger: 'change' }
+          {required: true, message: '变更确认人不能为空', trigger: 'change'}
         ],
       }
 
@@ -449,7 +497,77 @@ export default {
       this.approveStatusList = response.data;
     });
   },
-  methods: {// 字典翻译
+  methods: {
+    wordView(row) {
+      wordView(row.id).then(response => {
+        console.log(response.msg)
+        this.handleSee("申请单", response.msg)
+      });
+    },
+    handleSee(fileName, url) {
+      //office预览
+      this.loadingFlash = true
+      this.pdf.open = true
+      this.pdf.title = fileName
+      this.pdf.pdfUrl = ""
+      this.pptView = false
+      this.ppt = true
+      //如果是PDF等直接可以打开的就不调接口,否则调用接口
+      if (fileName.endsWith('pdf')) {
+        this.pdf.pdfUrl = process.env.VUE_APP_BASE_API + '/pdf/web/viewer.html?file=' + process.env.VUE_APP_BASE_API + url
+        this.loadingFlash = false
+      } else {
+        const formatDate = new FormData();
+        formatDate.append("filepath", url)
+        //调用文件预览api
+        let res = this.officeConvert.bookConvertCommon(formatDate)
+        //查看接受全局方法的返回结果 console.log(res)
+        //利用.then方法接受Promise对象
+        res.then((result) => {
+          //关闭加载中
+          this.loadingFlash = false
+          if (result.msg.includes("csv")) {
+            this.pdf.pdfUrl = process.env.VUE_APP_BASE_API + result.data
+            this.$alert(result.msg, this.$t('检查乱码'), {dangerouslyUseHTMLString: true});
+            //    this.$message({message: result.msg, center: true,type:'warning',  offset:400, });
+          } else if (result.msg.includes("不存在")) {
+            //文件不存在时提示
+            this.pdf.pdfUrl = ""
+            this.$alert(result.msg, this.$t('预览失败'), {dangerouslyUseHTMLString: true});
+            //    this.$message({message: result.msg, center: true,type:'warning',  offset:400, });
+            this.pdf.open = false
+          } else if (result.msg.includes("不支持此格式")) {
+            this.pdf.pdfUrl = ""
+            this.$alert(result.msg, this.$t('预览失败'), {dangerouslyUseHTMLString: true});
+            //    this.$message({message: result.msg, center: true,type:'warning',  offset:400, });
+            this.pdf.open = false
+          } else {
+            //成功时直接给地址
+            this.pdf.pdfUrl = process.env.VUE_APP_BASE_API + result.data
+          }
+        }).catch(result => {
+          //请求失败,关闭loading,pdf地址直接为为空,不显示
+          this.pdf.pdfUrl = ""
+          this.loadingFlash = false;
+        })
+      }
+    },
+    //文件预览
+    openPdf() {
+      //ppt就跳路由预览,office就直接打开文件新页面
+      const didi = {imgs: this.imgs}
+      if (this.pptView == true && this.ppt == false) {
+        let routeUrl = this.$router.resolve({
+          path: "/cpms/index.html#/pptyulan",
+          query: didi
+        });
+        window.open("/cpms/index.html#/pptyulan?id=" + this.pdf.pdfUrl, '_blank')
+        console.log(this.imgs)
+      } else {
+        window.open(this.pdf.pdfUrl)
+      }
+    },
+    // 字典翻译
     approveStatusFormat(row, column) {
       let s = this.selectDictLabel(this.approveStatusList, row.approveStatus)
       let type = '';
@@ -516,9 +634,9 @@ export default {
         this.classStaffOptions = response.data;
       });
     },
-    openDetail(row){
-      this.detail.open=true;
-      this.detail.detailData=row;
+    openDetail(row) {
+      this.detail.open = true;
+      this.detail.detailData = row;
       this.statusFlag = '';
       this.approveStatusFlag = '';
       if (row.status === 1) {
@@ -532,8 +650,8 @@ export default {
         this.approveStatusFlag = 'danger';
       }
       let processId;
-      listLockApply({changeId:row.id}).then(res=>{
-        processId=res.rows[0].processId;
+      listLockApply({changeId: row.id}).then(res => {
+        processId = res.rows[0].processId;
         getHistorylist({processId: processId}).then(response => {
           this.historyList = response.rows;
           this.historyLoading = false
@@ -541,7 +659,7 @@ export default {
       })
     },
     getLockList() {
-      listEoegLock({}).then(response => {
+      listEoegLock({status:0}).then(response => {
         this.lockList = response.rows;
       });
     },

+ 2 - 3
ui/src/views/training/bccnew/tsnew/index.vue

@@ -201,9 +201,9 @@
           <el-select v-model="form.staffId" filterable :placeholder="$t('请选择')+$t('培训员工')" :disabled="isEdit">
             <el-option
               v-for="item in userOption"
-              :key="item.staffid+''"
+              :key="item.staffid"
               :label="item.name +'  '+ item.deptName"
-              :value="item.staffid+''"
+              :value="item.staffid"
               :disabled="item.disabled">
             </el-option>
           </el-select>
@@ -753,7 +753,6 @@ export default {
         response.data.trainingDate = [];
         response.data.trainingDate[0] = new Date(response.data.startdate);
         response.data.trainingDate[1] = new Date(response.data.enddate);
-        response.data.staffId = parseInt(response.data.staffId);
         this.getTrainer(response.data.planStatus);
         this.form = response.data;
         this.open = true;