فهرست منبع

feat:新增告警详情,fix:修复安全责任书模块问题

sunqijun 1 ماه پیش
والد
کامیت
3f58125cc1

+ 9 - 8
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/hiddenTroubleAccountManagement/hiddenTroubleAccountManagement.vue

@@ -13,9 +13,7 @@
             <el-button plain class="search-table-container--button" @click="handleImport">
               导入
             </el-button>
-            <el-button plain class="search-table-container--button" @click="handleDownload">
-              导出
-            </el-button>
+            
           </div>
 
           <div class="act-search">
@@ -56,6 +54,9 @@
             <section class="search-btn">
               <el-button type="primary" @click="handleSearch">查询</el-button>
               <el-button @click="handleReset">重置</el-button>
+              <el-button plain @click="handleDownload">
+              导出
+            </el-button>
             </section>
           </div>
         </header>
@@ -352,7 +353,7 @@
         downloadByData(response, fileName);
         ElMessage.success('导出成功');
       }
-    } catch (e) {
+    } catch (e:any) {
       console.error('导出隐患台账失败:', e);
       ElMessage.error(e?.message || e?.data || '导出失败,请重试');
     }
@@ -385,7 +386,7 @@
       await deleteHiddenDanger(id);
       ElMessage.success('删除成功');
       getTableData();
-    } catch (e) {
+    } catch (e:any) {
       console.error('删除隐患台账失败:', e);
       ElMessage.error(e?.message || e?.data || '删除失败,请重试');
     }
@@ -424,7 +425,7 @@
       const fullTree = (deptRes as DeptTree[]) ?? [];
       issueDeptTree.value = Array.isArray(fullTree) && fullTree[0]?.children ? fullTree[0].children : [];
       issueUserList.value = (userRes as any)?.records ?? [];
-    } catch (e) {
+    } catch (e:any) {
       console.error('获取部门/用户列表失败:', e);
       ElMessage.error(e?.message || e?.data || '加载部门或负责人列表失败');
       issueDeptTree.value = [];
@@ -481,7 +482,7 @@
       ElMessage.success('下发成功');
       showIssueDialog.value = false;
       getTableData();
-    } catch (e) {
+    } catch (e:any) {
       console.error('下发失败:', e);
       ElMessage.error(e?.message || e?.data || '下发失败,请重试');
     }
@@ -566,7 +567,7 @@
       ElMessage.success('扣分记录成功');
       showDeductDialog.value = false;
       getTableData();
-    } catch (e) {
+    } catch (e:any) {
       console.error('扣分失败:', e);
       ElMessage.error(e?.message || e?.data || '扣分失败,请重试');
     }

+ 39 - 6
src/views/production-safety/implement-safety-duty/components/IssueSafetyResponsibility.vue

@@ -22,8 +22,37 @@
           :clearable="false"
         />
       </el-form-item>
+      <!-- 如果是院领导直接选择人,不用选分组 -->
+      <el-form-item label="选择部门下的人员" prop="userIds" v-if="currentRowData.departmentName === '院领导'">
+        <!-- <el-select
+          multiple
+          size="large"
+          v-model="formData.userIds"
+          placeholder="请选择部门下的人员"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="group in groupList"
+            :disabled="originUserGroupId.includes(group.id)"
+            :key="group.id"
+            :label="group.name"
+            :value="group.id"
+          />
+        </el-select> -->
+        <el-select
+            size="large"
+            v-model="formData.userIds"
+            placeholder="请选择部门下的人员"
+            style="width: 100%"
+            filterable
+            multiple
+            remote
+            :remote-method="(q) => remoteMethod(q, 'leader1List')">
+            <el-option v-for="l in userList.leader1List" :key="l.value" :label="l.label" :value="l.value" />
+          </el-select>
+      </el-form-item>
 
-      <el-form-item label="下发分组名称" prop="userGroupId">
+      <el-form-item label="下发分组名称" prop="userGroupId" v-else>
         <el-select
           multiple
           size="large"
@@ -73,7 +102,7 @@
             remote
             :remote-method="(q) => remoteMethod(q, 'leader1List')"
           >
-            <el-option v-for="l in userList.leader1List" :key="l.value" :label="l.label" :value="l.value" />
+            <el-option v-for="l in userList.leader1List" :key="l.value" :label="`${l.label}(${l.staffNo})`" :value="l.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="院长" prop="leader2">
@@ -86,7 +115,7 @@
             remote
             :remote-method="(q) => remoteMethod(q, 'leader2List')"
           >
-            <el-option v-for="l in userList.leader2List" :key="l.value" :label="l.label" :value="l.value" />
+            <el-option v-for="l in userList.leader2List" :key="l.value" :label="`${l.label}(${l.staffNo})`" :value="l.value" />
           </el-select>
         </el-form-item>
       </template>
@@ -101,7 +130,7 @@
             remote
             :remote-method="(q) => remoteMethod(q, 'leader1List')"
           >
-            <el-option v-for="l in userList.leader1List" :key="l.value" :label="l.label" :value="l.value" />
+            <el-option v-for="l in userList.leader1List" :key="l.value" :label="`${l.label}(${l.staffNo})`" :value="l.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="院长" prop="leader2">
@@ -114,7 +143,7 @@
             remote
             :remote-method="(q) => remoteMethod(q, 'leader2List')"
           >
-            <el-option v-for="l in userList.leader2List" :key="l.value" :label="l.label" :value="l.value" />
+            <el-option v-for="l in userList.leader2List" :key="l.value" :label="`${l.label}(${l.staffNo})`" :value="l.value" />
           </el-select>
         </el-form-item>
       </template>
@@ -231,6 +260,7 @@
 
   const formData = reactive<any>({
     signConfig: 0,
+    userIds: [],
     userGroupId: [],
     signPerson: [],
     leader1: null,
@@ -317,7 +347,7 @@
   const rules = reactive({
     deptId: [{ required: true, message: '请选择下发部门', trigger: 'change' }],
     userGroupId: [{ required: true, message: '请选择下发分组', trigger: 'change' }],
-
+    userIds:[{ required: true, message: '请选择部门下的人员', trigger: 'change' }],
     signOrder: [
       {
         validator: (_: any, value: any, callback: any) => {
@@ -388,12 +418,14 @@
           userList[key] = (res.records || [])?.map((u: any) => ({
             value: u.id,
             label: u.realname,
+            staffNo: u.staffNo
           }));
         });
       } else {
         userList[dataName] = (res.records || [])?.map((u: any) => ({
           value: u.id,
           label: u.realname,
+          staffNo: u.staffNo
         }));
       }
     });
@@ -403,6 +435,7 @@
     ruleFormRef.value?.resetFields();
     Object.assign(formData, {
       signConfig: 0,
+      userIds: [],
       userGroupId: [],
       signPerson: [],
       leader1: null,

+ 1 - 0
src/views/production-safety/implement-safety-duty/edit-responsibility-agree.vue

@@ -86,6 +86,7 @@
   import { onMounted, ref, nextTick, reactive, shallowRef } from 'vue';
   import dayjs from 'dayjs';
   import { ElMessage } from 'element-plus';
+    // @ts-ignore: missing type declarations for CSS side-effect import
   import '@wangeditor/editor/dist/css/style.css';
   import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
   import { useRouter, useRoute } from 'vue-router';

+ 66 - 7
src/views/production-safety/implement-safety-duty/view-recipients.vue

@@ -57,12 +57,30 @@
         <el-table :data="tableData.data">
           <el-table-column label="责任书名称" prop="responsibilityName" width="180" />
           <el-table-column label="状态" prop="statusName" width="100" />
-          <el-table-column label="类别名称" prop="departmentName" />
-          <el-table-column label="分组名称" prop="userGroupName" />
+          <el-table-column label="类别名称" prop="departmentName" width="200"/>
+          <el-table-column label="分组名称" prop="userGroupName" width="200"/>
+          <el-table-column label="责任人姓名" prop="responsiblePersonName" width="200"/>
+          <el-table-column label="是否并签" prop="signConfigName" width="200"/>
+          <el-table-column label="责任书文档" width="200">
+            <template #default="scope">
+                <div class="file-list" v-if="scope.row.attachment.length > 0">
+                    <div v-for="file in scope.row.attachment" :key="file.fileId" class="file-item">
 
-          <el-table-column label="责任人姓名" prop="responsiblePersonName" />
-          <el-table-column label="是否并签" prop="signConfigName" />
-          <el-table-column label="计划完成时间" prop="planEndTime" />
+                        <div class="file-info" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">
+                            <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
+                            <span class="file-name file-container--div__name">{{ file.fileName }}</span>
+                        </div>
+                        <img
+                            class="file-container--div__download"
+                            :src="DownloadIcon"
+                            @click="downloadFile(file.fileUrl, file.fileName)"
+                        />
+                    </div>
+                </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="计划完成时间" width="160" prop="planEndTime" />
+          <el-table-column label="当前节点" prop="nodeDescription" width="200"/>
           <el-table-column fixed="right" width="200" label="操作">
             <template #default="scope">
               <el-popconfirm
@@ -110,6 +128,7 @@
         />
       </div>
     </main>
+  <PreviewOnline ref="previewOnlineRef" />
   </div>
 </template>
 <script lang="ts" setup>
@@ -126,10 +145,12 @@
     safetyResponsibilityAdminDeleteIssuedObject,
     safetyResponsibilityAdminScrap,
   } from '@/api/production-safety/responsibility-implementation';
+  import DownloadIcon from '@/views/disaster/disaster-control/src/svg/download.svg';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
   import { downloadByData } from '@/utils/file/download';
   import { unformatAttachment } from '@/components/UploadFiles/utils';
   import { downloadFile } from '@/views/disaster/utils';
-
+  import { FILE_TYPE_ICON } from '@/components/UploadFiles/constants';
   const router = useRouter();
   const route = useRoute();
   const activeTab = ref<any>(route.query.status ? Number(route.query.status) : '');
@@ -189,6 +210,14 @@
     });
   };
 
+  // 预览
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
+  const previewOnline = (url: string | undefined, type: keyof typeof FILE_TYPE_ICON) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   // const handleExport = () => {
   //   safetyResponsibilityAdminExportIssuedObject({
   //     ...omit(queryParams.queryParam, 'date'),
@@ -227,6 +256,10 @@
           : undefined,
       },
     }).then((res) => {
+
+      res.pages.records.forEach((item:any)=>{
+        item.attachment = JSON.parse(item.attachment) || []
+      })
       tableData.data = res.pages.records;
       tableData.total = res.pages.totalPage;
       Object.keys(detailData).forEach((item) => {
@@ -234,7 +267,7 @@
           detailData[item] = res[item];
         }
       });
-      console.log(detailData);
+        console.log(tableData.data)
     });
   };
   const handleRestParams = () => {
@@ -360,4 +393,30 @@
     font-weight: 600;
     color: rgba(0, 0, 0, 0.85);
   }
+  .file-item {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    .file-info{
+        display: flex;
+        align-items: center;
+        gap: 10px;
+        img {
+            width: 28px;
+            cursor: pointer;
+        }
+        .file-name {
+            min-width: 0;
+            max-width: 100px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            cursor: pointer;
+        }
+    }
+    .file-container--div__download {
+        width: 28px;
+        cursor: pointer;
+    }
+  }
 </style>

+ 39 - 1
src/views/production-safety/risk-identification-and-control/equipment-high-alert/configs/form.ts

@@ -2,7 +2,7 @@
  * @Author: liuJie
  * @Date: 2026-03-05 10:11:20
  * @LastEditors: liuJie
- * @LastEditTime: 2026-03-12 14:51:48
+ * @LastEditTime: 2026-03-17 10:31:07
  * @Describe: file describe
  */
 import type { FormConfig } from '@/types/basic-form';
@@ -30,7 +30,45 @@ export const ALARM_TYPE = {
     safe_alarm:'安全告警',
     communicate_alarm: '通讯告警',
     other_alarm: '其他告警',
+
+}
+export const ALARM_STATUS = {
+    to_solve:'待解决',
+    solved:'已解决'
+}
+
+export const HANDLE_STATUS = {
+    to_handle:'待处理',
+    handled:'已处理'
 }
+export interface DETAIL_DATA_TYPE {
+alarmContent?: string;
+alarmCount?: number;
+alarmStatus: string;
+alarmTitle?: string;
+alarmType?: string;
+deptId?: number;
+deptName?: string;
+deviceId?: number;
+deviceName?: string;
+deviceNo?: string;
+deviceType: string;
+firstAlarmTime?: string;
+firstAlarmTimeStr?: any;
+handleDesc?: string;
+handleResult?: any;
+handleStatus: string;
+handleTime?: string;
+handleUser?: number;
+handleUserName?: string;
+id?: number;
+lastAlarmTime?: string;
+location?: string;
+regionId?: number;
+regionName?: string;
+};
+
+
 
 export const SPECIAL_EQUIPMENT_FORM_DATA = {
   deviceId: '',

+ 76 - 4
src/views/production-safety/risk-identification-and-control/equipment-high-alert/list.vue

@@ -121,26 +121,84 @@
         </div>
       </div>
     </main>
+    <el-dialog v-model="DetailDialog" @close="DetailDialog = false" width="60%" title="告警详情">
+        <div class="title">设备信息</div>
+            <el-descriptions :column="2" border>
+                <el-descriptions-item label="设备类型" >
+                    {{ DEVICE_TYPE[detail.deviceType]}}
+                </el-descriptions-item>
+                <el-descriptions-item label="设备名称" >
+                    {{ detail.deviceName }}
+                </el-descriptions-item>
+                <el-descriptions-item label="设备编号" >
+                    {{ detail.deviceNo }}
+                </el-descriptions-item>
+                <el-descriptions-item label="所属部门" >
+                    {{ detail.deptName }}
+                </el-descriptions-item>
+                <el-descriptions-item label="所在位置" >
+                    {{ detail.regionName }}
+                </el-descriptions-item>
+            </el-descriptions>
+        <div class="title">告警信息</div>
+            <el-form label-width="150px" :inline="false">
+                <el-form-item label="问题状态:">
+                    <el-tag :type="detail.alarmStatus==='solved'?'primary':'warning'">
+                        {{ ALARM_STATUS[detail.alarmStatus]}}
+                    </el-tag>
+                </el-form-item>
+                <el-form-item label="告警时间:">
+                    {{detail.firstAlarmTime}}
+                </el-form-item>
+                <el-form-item label="告警次数:">
+                    {{detail.alarmCount}}
+                </el-form-item>
+                <el-form-item label="告警内容:">
+                    {{detail.alarmContent}}
+                </el-form-item>
+            </el-form>
+        <div class="title">处理信息</div>
+            <el-form label-width="150px" :inline="false">
+                <el-form-item label="处理人:">
+                    {{ detail.handleUserName}}
+                </el-form-item>
+                <el-form-item label="处理时间:">
+                    {{detail.handleTime}}
+                </el-form-item>
+                <el-form-item label="处理状态:">
+                    <el-tag :type="detail.handleStatus==='handled'?'primary':'warning'">
+                        {{HANDLE_STATUS[detail.handleStatus]}}
+                    </el-tag>
+                </el-form-item>
+                <el-form-item label="现场描述:">
+                    {{detail.handleDesc}}
+                </el-form-item>
+            </el-form>
+        <template #footer>
+            <el-button @click="DetailDialog = false">取消</el-button>
+        </template>
+    </el-dialog>
   </div>
 </template>
 
 <script lang="ts" setup>
   import { onMounted, reactive, ref } from 'vue';
-  import { ElMessage } from 'element-plus';
+  import { ElMessage, ElTag } from 'element-plus';
   import { getAllDepartments } from '@/api/auth/dept';
   import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
   import BasicTable from '@/components/BasicTable.vue';
   import useTableConfig from '@/hooks/useTableConfigHook';
   import ActionButton from '@/components/ActionButton.vue';
   import { TABLE_OPTIONS, SPECIAL_EQUIPMENT_TABLE_COLUMNS } from './configs/tables';
-  import { DEVICE_CATEGORY_OPTIONS, Alarm_TYPE_OPTIONS, DEVICE_TYPE, ALARM_TYPE} from './configs/form';
+  import { DEVICE_CATEGORY_OPTIONS, Alarm_TYPE_OPTIONS, DEVICE_TYPE, ALARM_TYPE, type DETAIL_DATA_TYPE, ALARM_STATUS, HANDLE_STATUS} from './configs/form';
   import {type QueryParamType, equipmentHighAlertList, deptList, exportTableData} from '@/api/equipment-high-alert-List'
   import { downloadByData } from '@/utils/file/download';
 
   import dayjs from 'dayjs';
   const loading = ref(false);
   const dateRange = ref<[string, string] | null>(null);
-  
+  const DetailDialog = ref<boolean>(false)
+  const detail = reactive({}) as DETAIL_DATA_TYPE
 
   // BasicTable
   const basicTableRef = ref<InstanceType<typeof BasicTable>>();
@@ -222,7 +280,8 @@
   };
 
   const handleView = (row)=>{
-    ElMessage.warning('请给跳转地址')
+    DetailDialog.value = true
+    Object.assign(detail, row)
   }
 
 
@@ -350,4 +409,17 @@
   .dateRange {
     align-items: flex-end;
   }
+  .title {
+    margin:10px;
+    position: relative;
+    &::after{
+        content: '';
+        position: absolute;
+        left: -8px;
+        top: 3px;
+        width:4px;
+        height: 14px;
+        background-color: #409eff;
+    }
+  }
 </style>

+ 15 - 8
src/views/production-safety/risk-identification-and-control/hazard-manage/add.vue

@@ -184,10 +184,10 @@
                 placeholder="请选择固有风险等级"
                 style="width: 280px"
               >
-                <!-- <el-option label="A" value="A" /> -->
+                <el-option label="A" value="A" />
                 <el-option label="B" value="B" />
                 <el-option label="C" value="C" />
-                <!-- <el-option label="D" value="D" /> -->
+                <el-option label="D" value="D" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -264,7 +264,14 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="完成期限" prop="completionDeadline">
-              <el-date-picker
+                <el-input
+                size="large"
+                placeholder="请输入完成期限"
+                v-model="formValue.completionDeadline"
+                style="width: 280px"
+              />
+              <!-- 改为可输入 -->
+              <!-- <el-date-picker
                 v-model="formValue.completionDeadline"
                 type="date"
                 size="large"
@@ -272,7 +279,7 @@
                 format="YYYY-MM-DD"
                 value-format="YYYY-MM-DD"
                 style="width: 280px"
-              />
+              /> -->
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -358,9 +365,9 @@
           <el-col :span="12">
             <el-form-item label="控制风险等级" prop="controlRiskLevel">
               <el-select v-model="formValue.controlRiskLevel" size="large" placeholder="请选择控制风险等级" style="width: 280px">
-                <!-- <el-option label="A" value="A" />
-            <el-option label="B" value="B" />
-            <el-option label="C" value="C" /> -->
+                <el-option label="A" value="A" />
+                <el-option label="B" value="B" />
+                <el-option label="C" value="C" />
                 <el-option label="D" value="D" />
               </el-select>
             </el-form-item>
@@ -468,7 +475,7 @@
     controlRiskS: [{ required: true, message: '请选择控制风险评估(S)', trigger: 'change' }],
     controlRiskR: [{ required: true, message: '请输入控制风险评估(R)', trigger: 'change' }],
     controlRiskLevel: [{ required: true, message: '请选择剩余风险等级', trigger: 'change' }],
-    remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }],
+    // remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }], 改为非必填
   });
 
   const handleChangeDept = (prop) => {

+ 13 - 7
src/views/production-safety/risk-identification-and-control/hazard-manage/edit.vue

@@ -164,10 +164,10 @@
             placeholder="请选择固有风险等级"
             style="width: 330px"
           >
-            <!-- <el-option label="A" value="A" /> -->
+            <el-option label="A" value="A" />
             <el-option label="B" value="B" />
             <el-option label="C" value="C" />
-            <!-- <el-option label="D" value="D" /> -->
+            <el-option label="D" value="D" />
           </el-select>
         </el-form-item>
         <el-form-item label="固有风险升级" prop="inherentRiskUpgrade">
@@ -232,7 +232,13 @@
           />
         </el-form-item>
         <el-form-item label="完成期限" prop="completionDeadline">
-          <el-date-picker
+            <el-input
+            size="large"
+            placeholder="请输入完成期限"
+            v-model="formValue.completionDeadline"
+            style="width: 330px"
+          />
+          <!-- <el-date-picker
             v-model="formValue.completionDeadline"
             type="date"
             size="large"
@@ -240,7 +246,7 @@
             format="YYYY-MM-DD"
             value-format="YYYY-MM-DD"
             style="width: 330px"
-          />
+          /> -->
         </el-form-item>
         <el-form-item label="完成情况" prop="completionStatus">
           <el-input
@@ -310,9 +316,9 @@
         </el-form-item>
         <el-form-item label="控制风险等级" prop="controlRiskLevel">
           <el-select v-model="formValue.controlRiskLevel" size="large" placeholder="请选择控制风险等级" style="width: 330px">
-            <!-- <el-option label="A" value="A" />
+            <el-option label="A" value="A" />
             <el-option label="B" value="B" />
-            <el-option label="C" value="C" /> -->
+            <el-option label="C" value="C" />
             <el-option label="D" value="D" />
           </el-select>
         </el-form-item>
@@ -418,7 +424,7 @@
     controlRiskS: [{ required: true, message: '请选择控制风险评估(S)', trigger: 'change' }],
     controlRiskR: [{ required: true, message: '请输入控制风险评估(R)', trigger: 'change' }],
     controlRiskLevel: [{ required: true, message: '请选择剩余风险等级', trigger: 'change' }],
-    remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }],
+    // remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }], 改为非必填
   });
 
   const handleChangeDept = (prop) => {

+ 14 - 5
src/views/production-safety/risk-identification-and-control/hazard-manage/view.vue

@@ -176,8 +176,10 @@
             placeholder="请选择"
             style="width: 330px"
           >
+            <el-option label="A" value="A" />
             <el-option label="B" value="B" />
             <el-option label="C" value="C" />
+            <el-option label="D" value="D" />
           </el-select>
         </el-form-item>
         <el-form-item label="固有风险升级" prop="inherentRiskUpgrade">
@@ -248,7 +250,14 @@
           />
         </el-form-item>
         <el-form-item label="完成期限" prop="completionDeadline">
-          <el-date-picker
+            <el-input
+            disabled
+            v-model="formValue.completionDeadline"
+            size="large"
+            placeholder="请输入"
+            style="width: 330px"
+          />
+          <!-- <el-date-picker
             disabled
             v-model="formValue.completionDeadline"
             type="date"
@@ -257,7 +266,7 @@
             format="YYYY-MM-DD"
             value-format="YYYY-MM-DD"
             style="width: 330px"
-          />
+          /> -->
         </el-form-item>
         <el-form-item label="完成情况" prop="completionStatus">
           <el-input
@@ -336,9 +345,9 @@
             placeholder="请选择"
             style="width: 330px"
           >
-            <!-- <el-option label="A" value="A" />
+            <el-option label="A" value="A" />
             <el-option label="B" value="B" />
-            <el-option label="C" value="C" /> -->
+            <el-option label="C" value="C" />
             <el-option label="D" value="D" />
           </el-select>
         </el-form-item>
@@ -450,7 +459,7 @@
     controlRiskS: [{ required: true, message: '请选择控制风险评估(S)', trigger: 'change' }],
     controlRiskR: [{ required: true, message: '请输入控制风险评估(R)', trigger: 'change' }],
     controlRiskLevel: [{ required: true, message: '请选择剩余风险等级', trigger: 'change' }],
-    remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }],
+    // remarks: [{ required: true, message: '请输入备注', trigger: 'blur' }],
   });
 
   const handleChangeDept = (prop) => {

+ 1 - 1
src/views/production-safety/risk-identification-and-control/risk-manage/add.vue

@@ -294,7 +294,7 @@
   const rules = reactive({
     buildingArea: [{ required: true, message: '请输入楼号', trigger: 'blur' }],
     buildingName: [{ required: true, message: '请输入楼宇/区域', trigger: 'blur' }],
-    safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],
+    // safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],  改为非必填
     floorLocation: [{ required: true, message: '请输入名称/功能', trigger: 'blur' }],
     safetyResponsibleFloor: [{ required: true, message: '请选择安全责任所/中心', trigger: 'change' }],
     roomName: [{ required: true, message: '请选择安全责任所/中心负责人', trigger: 'change' }],

+ 1 - 1
src/views/production-safety/risk-identification-and-control/risk-manage/edit.vue

@@ -296,7 +296,7 @@
   const rules = reactive({
     buildingArea: [{ required: true, message: '请输入楼号', trigger: 'blur' }],
     buildingName: [{ required: true, message: '请输入楼宇/区域', trigger: 'blur' }],
-    safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],
+    // safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }], 改为非必填
     floorLocation: [{ required: true, message: '请输入名称/功能', trigger: 'blur' }],
     safetyResponsibleFloor: [{ required: true, message: '请选择安全责任所/中心', trigger: 'change' }],
     roomName: [{ required: true, message: '请选择安全责任所/中心负责人', trigger: 'change' }],

+ 2 - 2
src/views/production-safety/risk-identification-and-control/risk-manage/view.vue

@@ -29,7 +29,7 @@
         <el-form-item label="安全责任人" prop="safetyResponsibleBuilding">
           <el-select
             v-model="formValue.safetyResponsibleBuilding"
-            placeholder="请选择"
+            placeholder="请选择安全责任人"
             size="large"
             style="width: 330px"
             filterable
@@ -327,7 +327,7 @@
   const rules = reactive({
     buildingArea: [{ required: true, message: '请输入楼号', trigger: 'blur' }],
     buildingName: [{ required: true, message: '请输入楼宇/区域', trigger: 'blur' }],
-    safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],
+    // safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],
     floorLocation: [{ required: true, message: '请输入名称/功能', trigger: 'blur' }],
     safetyResponsibleFloor: [{ required: true, message: '请选择安全责任所/中心', trigger: 'change' }],
     roomName: [{ required: true, message: '请选择安全责任所/中心负责人', trigger: 'change' }],

+ 23 - 9
src/views/production-safety/safetyTrainingAndEducation/educationTrainingPlanManagementDept/components/addTrainingInformation.vue

@@ -130,9 +130,6 @@ const openState = ref(false)
     }
   };
   
-
-
-
   const editorConfig = computed(() => ({
     placeholder: '请输入培训课程简述',
     MENU_CONF: {},
@@ -147,7 +144,6 @@ const openState = ref(false)
 
   //  上传图片
   const handleImageUploadChange = async (file: any, fileLists: any) => {
-    
     if(file.raw){
         try {
             const res = await formatAttachment(file.raw);
@@ -186,6 +182,12 @@ const openState = ref(false)
     dialogVisible.value = true;
   };
 
+  const handlePictureCardDelete = (file, fileLists)=>{
+    courseImgRef.value = fileLists.filter(f => f.uid !== file.uid);
+    console.log(courseImgRef.value)
+    form.courseImg = JSON.stringify(courseImgRef.value);
+  }
+
 // 图片格式校验
   const validateImage = (file) => {
     const validMIME = [
@@ -256,6 +258,7 @@ const openState = ref(false)
   };
 
 
+
   // 课程内容文件上传
   const handleFileChange = async (file, fileLists) => {
     
@@ -289,6 +292,11 @@ const openState = ref(false)
     }
 
   };
+  // 移除事件
+  const handleFileRemove = (file, fileLists)=>{
+    fileList.value = fileLists.filter(f => f.uid !== file.uid);
+    form.courseContent = JSON.stringify(fileList.value); 
+  }
 
   // 提交保存/编辑
   const handleValidate = async () => {
@@ -436,6 +444,7 @@ const openState = ref(false)
             :disabled="isViewMode"
             v-if="!isViewMode"
             :on-change="handleFileChange"
+            :on-remove="handleFileRemove"
             accept=".rar, .zip, .doc, .docx, .pdf, .mp4"
             :file-list="fileList"
           >
@@ -476,24 +485,29 @@ const openState = ref(false)
             :auto-upload="false"
             accept="image/*"
             :on-change="handleImageUploadChange"
+            :on-remove="handlePictureCardDelete"
+            :on-preview="handlePictureCardPreview"
             :before-upload="validateImage"
             list-type="picture-card">
-            <el-icon>
-              <Plus />
-            </el-icon>
+                <el-icon>
+                    <Plus />
+                </el-icon>
             <template #tip>
               <div class="el-upload__tip"> 支持格式:.jpg .png .jpeg,单个文件不能超过300k,设置一个默认图片。</div>
             </template>
-            <template #file="{ file }">
+            <!-- <template #file="{ file }">
               <div>
                 <img class="el-upload-list__item-thumbnail courseImg" :src="file.url" alt="" />
                 <span class="el-upload-list__item-actions">
                   <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                     <el-icon><zoom-in /></el-icon>
                   </span>
+                  <span class="el-upload-list__item-preview" @click="handlePictureCardDelete(file, courseImgList)">
+                    <el-icon><Delete /></el-icon>
+                  </span>
                 </span>
               </div>
-            </template>
+            </template> -->
           </el-upload>
           <el-dialog v-model="dialogVisible">
             <img w-full :src="dialogImageUrl" alt="Preview Image" style="width: 100%;" />