瀏覽代碼

Merge branch 'dev' of https://gogs.tjp.com.cn/maoming/yjhtgl-web into dev

# Conflicts:
#	src/types/components.d.ts
#	src/views/duty/eventing/index.vue
libushang 9 月之前
父節點
當前提交
65d9074d57

+ 1 - 1
.env.production

@@ -14,7 +14,7 @@ VITE_APP_MONITOR_ADMIN = '/admin/applications'
 VITE_APP_SNAILJOB_ADMIN = '/snail-job'
 
 # 生产环境
-VITE_APP_BASE_API = '/prod_api'
+VITE_APP_BASE_API = 'http://19.155.220.206:80'
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS = gzip

+ 10 - 1
src/api/duty/eventing.ts

@@ -1,5 +1,6 @@
 import request from '@/utils/request';
 
+// 获取事件列表
 export function getEvent(params) {
   return request({
     url: '/api/event/list',
@@ -8,7 +9,7 @@ export function getEvent(params) {
   });
 }
 
-// 获取路由
+// 新建事件
 export function addEvent(data) {
   return request({
     url: '/api/event/create',
@@ -24,3 +25,11 @@ export function getEventDetail(params) {
     params: params
   });
 }
+
+export function closeEvent(data) {
+  return request({
+    url: '/api/event/close',
+    method: 'post',
+    data: data
+  });
+}

+ 4 - 3
src/api/riskPrevention/planManage.ts

@@ -15,10 +15,11 @@ export function getTrainingList(params) {
   });
 }
 
-export function getPlanDetail(planId) {
+export function getPlanDetail(params) {
   return request({
-    url: '/api/emergency_plan/plan/' + planId,
-    method: 'get'
+    url: '/api/emergency_plan/plan/list',
+    method: 'get',
+    params: params
   });
 }
 

+ 2 - 2
src/api/system/user/planList.ts

@@ -8,11 +8,11 @@ export const fetchReports = (params: PlanForm): AxiosPromise<FetchPlanResponse>
     url: '/api/emergency_plan/plan/list',
     method: 'get',
     params: {
-      page: params.pageNum, // 分页参数中的页码
+      /*page: params.pageNum, // 分页参数中的页码
       page_size: params.pageSize, // 分页参数中的每页大小
       plan_type: params.planType, // 预案类型(可选)
       publish_date: params.publish_date, // 发布日期范围(可选)
-      plan_name: params.planName // 预案名称(可选)
+      plan_name: params.planName // 预案名称(可选)*/
     }
   });
 };

+ 25 - 6
src/api/system/user/types.ts

@@ -108,7 +108,7 @@ export interface DrillVO {
 export interface DrillForm {
   pageNum: number;
   pageSize: number;
-  planId?: string;
+  planId?: number;
 }
 export interface DrillInfoVO {
   drill: DrillVO;
@@ -118,11 +118,30 @@ export interface FetchDrillResponse {
   data: DrillVO[];
   total: number;
 }
-// 定义获取预案列表接口的请求参数类型
-export interface QueryParams {
+//响应
+/**响应查询对象类型**/
+
+export interface ResponseQuery {
+  responseId?: string;
+}
+/**
+ * 响应返回对象
+ */
+export interface ResponseVO {
+  responseId: string;
+  eventName: string;
+  eventType: string;
+  responseUnit: string;
+  eventAddress: string;
+  responseLevel: string;
+  responseStartTime: string;
+  responseEndTime: string;
+}
+/**
+ * 响应表单类型
+ */
+export interface responseForm {
   pageNum: number;
   pageSize: number;
-  eventType?: string;
-  publishDate?: [string, string];
-  keyword?: string;
+  planId?: string;
 }

+ 2 - 0
src/components/ChunkUpload/index.vue

@@ -116,6 +116,7 @@ export default defineComponent({
       }
     };
 
+    // 合并文件分片
     const mergeChunks = async (identifier: string, filename: string) => {
       try {
         const response = await axios.post("/api/file/upload/mergefile", null, {
@@ -139,6 +140,7 @@ export default defineComponent({
       return uuidv1();  // 生成一个固定的 UUID1
     };
 
+    // 获取已上传的文件名
     const getUploadedFileNames = () => {
       return uploadedFileNames.value;
     };

+ 2 - 2
src/components/DictTag/index.vue

@@ -3,7 +3,7 @@
     <template v-for="(item, index) in options">
       <template v-if="values.includes(item.value)">
         <span
-          v-if="(item.elTagType === 'default' || item.elTagType === '') && (item.elTagClass === '' || item.elTagClass == null)"
+          v-if="(item.elTagType === 'default' || item.elTagType === '')"
           :key="item.value"
           :index="index"
           :class="item.elTagClass"
@@ -22,7 +22,7 @@
             item.elTagType === 'warning' ||
             item.elTagType === 'danger'
               ? item.elTagType
-              : 'primary'
+              : 'default'
           "
           :class="item.elTagClass"
         >

+ 113 - 30
src/components/FileUpload/index.vue

@@ -12,6 +12,7 @@
       :on-success="handleUploadSuccess"
       :show-file-list="false"
       :headers="headers"
+      :http-request="uploadFile"
       class="upload-file-uploader"
     >
       <!-- 上传按钮 -->
@@ -31,7 +32,7 @@
     <!-- 文件列表 -->
     <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
       <li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
-        <el-link :href="`${file.url}`" :underline="false" target="_blank">
+        <el-link :underline="false" target="_blank" @click="handleDownload(file)">
           <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
         </el-link>
         <div class="ele-upload-list__item-content-action">
@@ -42,10 +43,11 @@
   </div>
 </template>
 
-<script setup lang="ts">
+<script setup lang="ts" name="FileUpload">
 import { propTypes } from '@/utils/propTypes';
-import { delOss, listByIds } from '@/api/system/oss';
-import { globalHeaders } from '@/utils/request';
+import { download2, globalHeaders } from '@/utils/request';
+import { v1 as uuidv1 } from 'uuid';
+import axios from 'axios';
 
 const props = defineProps({
   modelValue: {
@@ -82,22 +84,12 @@ watch(
     if (val) {
       let temp = 1;
       // 首先将值转为数组
-      let list: any[] = [];
-      if (Array.isArray(val)) {
-        list = val;
-      } else {
-        const res = await listByIds(val);
-        list = res.data.map((oss) => {
-          return {
-            name: oss.originalName,
-            url: oss.url,
-            ossId: oss.ossId
-          };
-        });
-      }
+      const list = Array.isArray(val) ? val : props.modelValue.split(',');
       // 然后将数组转为对象数组
       fileList.value = list.map((item) => {
-        item = { name: item.name, url: item.url, ossId: item.ossId };
+        if (typeof item === 'string') {
+          item = { name: item, url: item };
+        }
         item.uid = item.uid || new Date().getTime() + temp++;
         return item;
       });
@@ -144,13 +136,100 @@ const handleUploadError = () => {
   proxy?.$modal.msgError('上传文件失败');
 };
 
+const uploadFile = async ({ data, file }) => {
+  // data是上传时附带的额外参数,file是文件
+  let url = baseUrl + '/api/file/upload/uploadfile'; //上传文件接口
+  try {
+    // 如果文件大于等于5MB,分片上传
+    data.file = file;
+    const res = await uploadByPieces(url, data);
+    // 分片上传后操作
+    return res;
+  } catch (e) {
+    return e;
+  }
+};
+
+//分片上传
+const uploadByPieces = async (url, { fileName, file }) => {
+  // 上传过程中用到的变量
+  const chunkSize = 5 * 1024 * 1024; // 5MB一片
+  const chunkCount = Math.ceil(file.size / chunkSize); // 总片数
+  // 获取当前chunk数据
+  const identifier = uuidv1();
+  const getChunkInfo = (file, index) => {
+    let start = index * chunkSize;
+    let end = Math.min(file.size, start + chunkSize);
+    let chunknumber = file.slice(start, end);
+    const fileName = file.name;
+    return { chunknumber, fileName };
+  };
+  // 分片上传接口
+  const uploadChunk = (data, params) => {
+    return new Promise((resolve, reject) => {
+      axios({
+        url,
+        method: 'post',
+        data,
+        params,
+        headers: {
+          'Content-Type': 'multipart/form-data'
+        }
+      })
+        .then((res) => {
+          return resolve(res.data);
+        })
+        .catch((err) => {
+          return reject(err);
+        });
+    });
+  };
+  // 针对单个文件进行chunk上传
+  const readChunk = (index) => {
+    const { chunknumber } = getChunkInfo(file, index);
+    let fetchForm = new FormData();
+    fetchForm.append('file', chunknumber);
+    return uploadChunk(fetchForm, {
+      chunknumber: index,
+      identifier: identifier
+    });
+  };
+  // 针对每个文件进行chunk处理
+  const promiseList = [];
+  try {
+    for (let index = 0; index < chunkCount; ++index) {
+      promiseList.push(readChunk(index));
+    }
+    await Promise.all(promiseList);
+    // 文件分片上传完成后,调用合并接口
+    const res = await mergeChunks(identifier, file.name);
+    res.originalName = file.name;
+    return res;
+  } catch (e) {
+    return e;
+  }
+};
+const mergeChunks = async (identifier: string, filename: string) => {
+  try {
+    const response = await axios.post(baseUrl + '/api/file/upload/mergefile', null, {
+      params: {
+        identifier: identifier,
+        filename: filename,
+        chunkstar: 0 // 假设所有分片的开始序号为0
+      }
+    });
+
+    return response.data;
+  } catch (error) {
+    throw new Error('合并请求失败');
+  }
+};
 // 上传成功回调
 const handleUploadSuccess = (res: any, file: UploadFile) => {
   if (res.code === 200) {
     uploadList.value.push({
-      name: res.data.fileName,
-      url: res.data.url,
-      ossId: res.data.ossId
+      name: res.originalName,
+      url: res.filename
     });
     uploadedSuccessfully();
   } else {
@@ -164,10 +243,8 @@ const handleUploadSuccess = (res: any, file: UploadFile) => {
 
 // 删除文件
 const handleDelete = (index: number) => {
-  let ossId = fileList.value[index].ossId;
-  delOss(ossId);
   fileList.value.splice(index, 1);
-  emit('update:modelValue', listToString(fileList.value));
+  emit('update:modelValue', fileList.value);
 };
 
 // 上传结束处理
@@ -176,7 +253,7 @@ const uploadedSuccessfully = () => {
     fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value);
     uploadList.value = [];
     number.value = 0;
-    emit('update:modelValue', listToString(fileList.value));
+    emit('update:modelValue', fileList.value);
     proxy?.$modal.closeLoading();
   }
 };
@@ -195,12 +272,17 @@ const getFileName = (name: string) => {
 const listToString = (list: any[], separator?: string) => {
   let strs = '';
   separator = separator || ',';
-  list.forEach((item) => {
-    if (item.ossId) {
-      strs += item.ossId + separator;
+  for (let i in list) {
+    if (list[i].url) {
+      strs += list[i].url + separator;
     }
-  });
-  return strs != '' ? strs.substring(0, strs.length - 1) : '';
+  }
+  return strs != '' ? strs.substr(0, strs.length - 1) : '';
+};
+
+// 下载方法
+const handleDownload = (file: any) => {
+  download2('/api/file/download/' + file.url, file.name);
 };
 </script>
 
@@ -214,6 +296,7 @@ const listToString = (list: any[], separator?: string) => {
   line-height: 2;
   margin-bottom: 10px;
   position: relative;
+  padding: 3px 5px;
 }
 
 .upload-file-list .ele-upload-list__item-content {

+ 15 - 6
src/components/Map/company-map.vue

@@ -33,12 +33,13 @@
         <el-pagination background small :hide-on-single-page="true" layout="prev, pager, next" :total="total" :page-size="pageSize" :current-page="pageNum" style="margin-top: 10px;" @current-change="handleChangePage">
         </el-pagination>
       </div>
-
-      <span slot="footer" class="dialog-footer">
-          <el-button @click="handleClose">取 消</el-button>
-          <el-button type="primary" @click="sureMark">确 定</el-button>
-      </span>
     </div>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="sureMark">确 定</el-button>
+      </div>
+    </template>
   </el-dialog>
 </template>
 
@@ -163,13 +164,21 @@ export default {
     },
     // 地图中心的平移至指定点位置
     handlePanTo(index) {
-      this.closeSearchList()
       let lnglat = this.searchList[index].lnglat
+      this.form = {
+        longitude: lnglat[0],
+        latitude: lnglat[1]
+      }
       this.map.panTo(lnglat)
       this.setMarks(lnglat);
+      this.closeSearchList()
     },
     async initMap() {
       let position = this.latAndLong.length ? this.latAndLong : [110.93154257997, 21.669064031332];
+      this.form = {
+        longitude: position[0],
+        latitude: position[1]
+      }
       const AMap = await AMapLoader.load({
         key: '30d3d8448efd68cb0b284549fd41adcf',     // 申请好的Web端开发者Key,首次调用 load 时必填
         version: '2.0',      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15

+ 2 - 2
src/router/index.ts

@@ -1,4 +1,4 @@
-import { createWebHistory, createRouter, RouteRecordRaw } from 'vue-router';
+import { createWebHashHistory, createRouter, RouteRecordRaw } from 'vue-router';
 /* Layout */
 import Layout from '@/layout/index.vue';
 
@@ -197,7 +197,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
  * 创建路由
  */
 const router = createRouter({
-  history: createWebHistory(import.meta.env.VITE_APP_CONTEXT_PATH),
+  history: createWebHashHistory(import.meta.env.VITE_APP_CONTEXT_PATH),
   routes: constantRoutes,
   // 刷新时,滚动条位置还原
   scrollBehavior(to, from, savedPosition) {

+ 15 - 0
src/types/components.d.ts

@@ -16,6 +16,8 @@ declare module 'vue' {
     CompanyMap: typeof import('./../components/Map/company-map.vue')['default']
     DictTag: typeof import('./../components/DictTag/index.vue')['default']
     Editor: typeof import('./../components/Editor/index.vue')['default']
+    ElAnchor: typeof import('element-plus/es')['ElAnchor']
+    ElAnchorLink: typeof import('element-plus/es')['ElAnchorLink']
     ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
@@ -23,10 +25,16 @@ declare module 'vue' {
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElCol: typeof import('element-plus/es')['ElCol']
+    ElCollapse: typeof import('element-plus/es')['ElCollapse']
+    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElContainer: typeof import('element-plus/es')['ElContainer']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
+    ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
+    ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
     ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDrawer: typeof import('element-plus/es')['ElDrawer']
@@ -36,10 +44,13 @@ declare module 'vue' {
     ElEmpty: typeof import('element-plus/es')['ElEmpty']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElHeader: typeof import('element-plus/es')['ElHeader']
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
     ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
+    ElLink: typeof import('element-plus/es')['ElLink']
+    ElMain: typeof import('element-plus/es')['ElMain']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
@@ -47,10 +58,12 @@ declare module 'vue' {
     ElPopover: typeof import('element-plus/es')['ElPopover']
     ElProgress: typeof import('element-plus/es')['ElProgress']
     ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
     ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSpace: typeof import('element-plus/es')['ElSpace']
     ElStep: typeof import('element-plus/es')['ElStep']
     ElSteps: typeof import('element-plus/es')['ElSteps']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
@@ -60,6 +73,7 @@ declare module 'vue' {
     ElTabPane: typeof import('element-plus/es')['ElTabPane']
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
+    ElText: typeof import('element-plus/es')['ElText']
     ElTimeline: typeof import('element-plus/es')['ElTimeline']
     ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
@@ -72,6 +86,7 @@ declare module 'vue' {
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
     IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
     IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
+    IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']

+ 25 - 0
src/utils/request.ts

@@ -197,5 +197,30 @@ export function download(url: string, params: any, fileName: string) {
       downloadLoadingInstance.close();
     });
 }
+
+// 通用下载方法
+export function download2(url: string, fileName: string) {
+  downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' });
+  return service.get(url, {}, {
+    headers: { 'Content-Type': 'application/octet-stream' },
+    responseType: 'blob'
+  }).then(async (resp: any) => {
+    const isLogin = blobValidate(resp);
+    if (isLogin) {
+      const blob = new Blob([resp]);
+      FileSaver.saveAs(blob, fileName);
+    } else {
+      const resText = await resp.data.text();
+      const rspObj = JSON.parse(resText);
+      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
+      ElMessage.error(errMsg);
+    }
+    downloadLoadingInstance.close();
+  }).catch((r: any) => {
+    console.error(r);
+    ElMessage.error('下载文件出现错误,请联系管理员!');
+    downloadLoadingInstance.close();
+  });
+}
 // 导出 axios 实例
 export default service;

+ 111 - 0
src/views/duty/eventing/CloseEventDialog.vue

@@ -0,0 +1,111 @@
+<template>
+  <el-dialog ref="formDialogRef" :model-value="visible" title="关闭事件" width="750px" append-to-body @close="closeDialog">
+    <el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px">
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="伤亡情况">
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="死亡" prop="deaths">
+                  <el-input v-model="form.deaths">
+                    <template #append>人</template>
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="受伤" prop="injuries">
+                  <el-input v-model="form.injuries">
+                    <template #append>人</template>
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="失联" prop="missing">
+                  <el-input v-model="form.missing">
+                    <template #append>人</template>
+                  </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="总结报告" prop="fileNames">
+            <FileUpload v-model="form.fileNames" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="closeDialog">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { closeEvent } from '@/api/duty/eventing';
+
+interface Form {
+  eventId: string;
+  deaths: string;
+  injuries: string;
+  missing: string;
+  fileNames?: any;
+}
+interface Props {
+  modelValue: boolean;
+  eventId: string;
+  data: Form;
+}
+const props = withDefaults(defineProps<Props>(), {
+  modelValue: false
+});
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const emits = defineEmits(['update:modelValue']);
+watch(
+  () => props.modelValue,
+  () => {
+    if (props.modelValue) {
+      form.value = props.data;
+    }
+    visible.value = props.modelValue;
+  }
+);
+const router = useRouter();
+const visible = ref(false);
+const form = ref<Form>({
+  deaths: '',
+  injuries: '',
+  missing: '',
+  fileNames: []
+});
+const rules = reactive({
+  deaths: [{ required: true, message: '死亡人数不能为空', trigger: 'blur' }],
+  injuries: [{ required: true, message: '受伤人数不能为空', trigger: 'blur' }],
+  missing: [{ required: true, message: '失踪人数不能为空', trigger: 'blur' }]
+});
+const formRef = ref();
+const buttonLoading = ref(false);
+
+// 关闭事件
+const submitForm = () => {
+  formRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      closeEvent({ eventId: props.eventId, ...form.value }).then(() => {
+        proxy?.$modal.msgSuccess('关闭事件成功');
+        router.go(-1);
+      });
+    };
+  });
+};
+
+const closeDialog = () => {
+  emits('update:modelValue', false);
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 75 - 17
src/views/duty/eventing/eventDetails.vue

@@ -9,7 +9,7 @@
       <div class="flex">
         <el-button type="primary">编辑</el-button>
         <el-button type="primary">开始指挥</el-button>
-        <el-button type="danger">关闭事件</el-button>
+        <el-button type="danger" @click="handleCloseEvent">关闭事件</el-button>
         <el-button type="danger">删除事件</el-button>
       </div>
     </div>
@@ -22,19 +22,21 @@
       <div class="line-item">
         <div class="item-label">事件类型:</div>
         <div class="item-value">
-<!--          <dict-tag-->
+          <dict-tag :options="mm_event_type" :value="detailData.eventType" />
         </div>
       </div>
       <div class="line-item">
         <div class="item-label">事件等级:</div>
-        <div class="item-value">
-          特别重大
+        <div class="item-value" style="display: flex; align-items: center">
+          <dict-tag :options="mm_event_level" :value="detailData.eventLevel" />
           <el-icon style="cursor: pointer" @click="handleEventLevelOpen"><Fold /></el-icon>
         </div>
       </div>
       <div class="line-item">
         <div class="item-label">事件状态:</div>
-        <div class="item-value">已登记</div>
+        <div class="item-value">
+          <dict-tag :options="mm_event_state" :value="detailData.eventStatus" />
+        </div>
       </div>
     </div>
     <div class="line2">
@@ -112,22 +114,24 @@
           :timestamp="item.timestamp + '&nbsp;&nbsp;&nbsp;&nbsp;' + item.name"
           placement="top"
         >
-          <div>
+          <div class="dict-item">
             <dict-tag :options="mm_event_level" :value="item.levelStatus" />
           </div>
         </el-timeline-item>
       </el-timeline>
     </el-dialog>
+    <CloseEventDialog v-model="closeDialogState.show" :data="closeDialogState.form" :eventId="eventId" />
   </div>
 </template>
 
 <script lang="ts" setup>
 import { getEventDetail } from '@/api/duty/eventing';
+import CloseEventDialog from './CloseEventDialog.vue';
 
 const route = useRoute();
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { mm_event_level } = toRefs<any>(proxy?.useDict('mm_event_level'));
+const { mm_event_type, mm_event_level, mm_event_state, region } = toRefs<any>(proxy?.useDict('mm_event_type', 'mm_event_level', 'mm_event_state', 'region'));
 // 事件等级数据
 const eventLevelState = reactive({
   show: false,
@@ -188,13 +192,38 @@ const eventTrackState = reactive({
 const handleBack = () => {
   router.go(-1);
 };
-let eventId = ref('')
-let detailData = ref({})
+let eventId = ref('');
+let detailData = ref({
+  eventId: '',
+  eventTitle: '',
+  eventType: '',
+  eventLevel: '',
+  eventStatus: '',
+  eventTime: '',
+  address: '',
+  reportTime: '',
+  eventSource: '',
+  reportedBy: ''
+});
+
+const closeDialogState = reactive({
+  show: false,
+  form: {
+    deaths: '',
+    injuries: '',
+    missing: ''
+  }
+});
+
+// 关闭事件
+const handleCloseEvent = () => {
+  closeDialogState.show = true;
+};
 onMounted(() => {
-  eventId.value = route.query.eventId
-  getEventDetail({eventId: eventId.value}).then(res => {
-    detailData.value = res.data
-  })
+  eventId.value = route.query.eventId;
+  getEventDetail({ eventId: eventId.value }).then((res) => {
+    detailData.value = res.data;
+  });
 });
 </script>
 
@@ -227,6 +256,10 @@ onMounted(() => {
       display: flex;
       .item-label {
         width: 80px;
+        flex-shrink: 0;
+      }
+      .item-label {
+        margin-right: 5px;
       }
     }
   }
@@ -281,10 +314,35 @@ onMounted(() => {
     cursor: pointer;
   }
 }
-:deep(.warning2) {
-  background-color: #fdfbe2;
-  border-color: #fad400 !important;
-  color: #fad400;
+.dict-item {
+  :deep(.warning2) {
+    background-color: #fdfbe2;
+    border: 1px solid #fad400;
+    color: #fad400;
+    padding: 5px 12px;
+    border-radius: 5px;
+  }
+  :deep(.primary2) {
+    background-color: #ecf5ff;
+    border: 1px solid #409eff;
+    color: #409eff;
+    padding: 5px 12px;
+    border-radius: 5px;
+  }
+  :deep(.danger2) {
+    background-color: #fef0f0;
+    border: 1px solid #f56c6c;
+    color: #f56c6c;
+    padding: 5px 12px;
+    border-radius: 5px;
+  }
+  :deep(.warning3) {
+    background-color: #fdf6ec;
+    border: 1px solid #e6a23c;
+    color: #e6a23c;
+    padding: 5px 12px;
+    border-radius: 5px;
+  }
 }
 .back-btn {
   cursor: pointer;

+ 63 - 93
src/views/duty/eventing/index.vue

@@ -10,10 +10,10 @@
                 <el-select v-model="queryParams.eventType" placeholder="全部" clearable>
                   <el-option label="全部" value=""></el-option>
                   <el-option
-                    v-for="item in data.eventTypeSelection"
-                    :key="item.dictValue"
-                    :label="item.dictLabel"
-                    :value="item.dictValue"
+                    v-for="item in mm_event_type"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
                   ></el-option>
                 </el-select>
               </el-form-item>
@@ -23,10 +23,10 @@
                 <el-select v-model="queryParams.eventLevel" placeholder="全部" clearable>
                   <el-option label="全部" value=""></el-option>
                   <el-option
-                    v-for="item in data.eventLevelSelection"
-                    :key="item.dictValue"
-                    :label="item.dictLabel"
-                    :value="item.dictValue"
+                    v-for="item in mm_event_level"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
                   ></el-option>
                 </el-select>
               </el-form-item>
@@ -36,10 +36,10 @@
                 <el-select v-model="queryParams.eventStatus" placeholder="全部" clearable>
                   <el-option label="全部" value=""></el-option>
                   <el-option
-                    v-for="item in data.eventStatusSelection"
-                    :key="item.dictValue"
-                    :label="item.dictLabel"
-                    :value="item.dictValue"
+                    v-for="item in mm_event_state"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
                   ></el-option>
                 </el-select>
               </el-form-item>
@@ -48,7 +48,7 @@
               <el-form-item label="行政区划" prop="regionCode">
                 <el-select v-model="queryParams.regionCode" placeholder="全部" clearable>
                   <el-option label="全部" value=""></el-option>
-                  <el-option v-for="item in data.regionSelection" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
+                  <el-option v-for="item in region" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
                 </el-select>
               </el-form-item>
             </el-col>
@@ -83,16 +83,27 @@
         <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete(selectedRow)">删除事件 </el-button>
       </el-col>
     </el-row>
-
-    <!-- 表格组w件 -->
+    <!-- 表格组件 -->
     <el-table v-loading="loading" :data="eventList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="事件编号" align="center" prop="eventId" />
       <el-table-column label="事件标题" align="center" prop="eventTitle" />
-      <el-table-column label="事件类型" align="center" prop="eventType" />
-      <el-table-column label="事件等级" align="center" prop="eventLevel" />
+      <el-table-column label="事件类型" align="center" prop="eventType">
+        <template #default="scope">
+          <dict-tag :options="mm_event_type" :value="scope.row.eventType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="事件等级" align="center" prop="eventLevel">
+        <template #default="scope">
+          <dict-tag :options="mm_event_level" :value="scope.row.eventLevel" />
+        </template>
+      </el-table-column>
       <el-table-column label="事件地点" align="center" prop="address" />
-      <el-table-column label="事件状态" align="center" prop="eventStatus" />
+      <el-table-column label="事件状态" align="center" prop="eventStatus">
+        <template #default="scope">
+          <dict-tag :options="mm_event_state" :value="scope.row.eventStatus" />
+        </template>
+      </el-table-column>
       <el-table-column label="事件时间" align="center" prop="eventTime" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
@@ -112,31 +123,30 @@
     <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
 
     <!-- 新增/修改弹窗 -->
-    <el-dialog v-model="dialog.visible" :title="dialog.title" width="750px" append-to-body>
+    <el-dialog v-model="dialog.visible" :title="dialog.title" width="650px" append-to-body>
       <el-form ref="eventFormRef" :model="form" :rules="rules" label-width="80px">
-        
         <el-form-item label="事件标题" prop="eventTitle">
           <el-input v-model="form.eventTitle" placeholder="请输入事件标题" />
         </el-form-item>
-        
         <el-form-item label="事件类型" prop="eventType">
           <el-select v-model="form.eventType" placeholder="请选择事件类型" clearable>
-            <el-option v-for="item in data.eventTypeSelection" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
+            <el-option v-for="item in mm_event_type" :key="item.value" :label="item.label" :value="item.value"></el-option>
           </el-select>
         </el-form-item>
-
         <el-form-item label="事件等级" prop="eventLevel">
-          <el-select v-model="form.eventLevel" placeholder="请选择事件等级" clearable style="width:calc(100% - 30px)">
-            <el-option @click.native v-for="item in data.eventLevelSelection" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
+          <el-select v-model="form.eventLevel" placeholder="请选择事件等级" clearable>
+            <el-option v-for="item in mm_event_level" :key="item.value" :label="item.label" :value="item.value"></el-option>
           </el-select>
-          <el-icon @click="eventLevelDialogVisible = true" size="large" style="margin-left:8px"><WarningFilled /></el-icon>
         </el-form-item>
-        
         <el-form-item label="事件状态" prop="eventStatus">
           <el-select v-model="form.eventStatus" placeholder="请选择事件状态" clearable>
-            <el-option v-for="item in data.eventStatusSelection" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
+            <el-option v-for="item in mm_event_state" :key="item.value" :label="item.label" :value="item.value"></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="事件地点" prop="address">
+          <el-button type="primary" @click="openMapDialog">地图定位</el-button>
+          <el-input v-model="form.address" placeholder="请输入事件地点" readonly />
+        </el-form-item>
         <el-form-item label="事发时间" prop="eventTime">
           <el-date-picker v-model="form.eventTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择事发时间"></el-date-picker>
         </el-form-item>
@@ -145,15 +155,6 @@
         </el-form-item>
         <el-form-item label="伤亡情况">
           <el-row :gutter="10">
-            <el-col :span="3">
-              <el-switch
-                size="large"
-                v-model="form.casualty"
-                inline-prompt
-                active-text="已上报"
-                inactive-text="未上报"
-              />
-            </el-col>
             <el-col :span="6">
               <el-input v-model="form.deaths" placeholder="死亡">
                 <template #suffix>人</template>
@@ -174,16 +175,8 @@
         <el-form-item label="事件来源" prop="eventSource">
           <el-input v-model="form.eventSource" placeholder="请输入事件来源" />
         </el-form-item>
-        <el-form-item label="事件地点" prop="address">
-          <el-input v-model="form.address" placeholder="请输入事件地点" readonly >
-            <template #append>
-            <el-button @click="openMapDialog">地图定位</el-button>
-          </template>
-          </el-input> 
-          
-        </el-form-item>
-        <el-form-item label="事件概要" prop="event_description">
-          <el-input v-model="form.event_description" placeholder="请输入事件概要描述" type="textarea" :rows="5" />
+        <el-form-item label="事件描述" prop="eventDescription">
+          <el-input type="textarea" v-model="form.eventDescription" placeholder="请输入事件描述" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -196,27 +189,15 @@
 
     <!-- 地图弹窗 -->
     <company-map v-model:visible="mapDialogVisible" :address="form.address" @confirm="handleMapChange"></company-map>
-
-    <el-dialog v-model="eventLevelDialogVisible" title="突发事故分级标准" width="450px" append-to-body>
-      <p><strong>一般突发事故:</strong>是指造成3人以下死亡(含失踪),或者10人以下重伤,或者1000万元以下直接经济损失,或产生一定社会影响的。</p>
-      <p><strong>较大突发事故:</strong>是指造成3人以上10人以下死亡(含失踪),或者10人以上50人以下重伤,或者1000万元以上5000万元以下直接经济损失,或产生较大社会影响的。</p>
-      <p><strong>重大突发事故:</strong>是指造成10人以上30人以下死亡(含失踪),或者50人以上100人以下重伤,或者5000万元以上1亿元以下直接经济损失,或产生重大社会影响的。</p>
-      <p><strong>特别重大突发事故:</strong>是指造成30人以上死亡(含失踪),或者100人以上重伤(包括急性工业中毒),或者1亿元以上直接经济损失,或产生特别重大社会影响的。</p>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="eventLevelDialogVisible = false">关闭</el-button>
-        </div>
-      </template>
-    </el-dialog>
   </div>
 </template>
 
 <script setup lang="ts">
 import { ref, reactive, toRefs, onMounted } from 'vue';
-import { getDicts } from '@/api/system/dict/data';
 import { addEvent, getEvent } from '@/api/duty/eventing';
-import { WarningFilled } from '@element-plus/icons-vue';
 
+const proxy = getCurrentInstance()?.proxy;
+const { mm_event_type, mm_event_level, mm_event_state, region } = toRefs<any>(proxy?.useDict('mm_event_type', 'mm_event_level', 'mm_event_state', 'region'));
 const router = useRouter();
 const eventList = ref([]);
 const buttonLoading = ref(false);
@@ -235,26 +216,25 @@ const dialog = reactive({
   visible: false,
   title: ''
 });
-
+ // 表单初始数据
 const initFormData = {
-  eventId: '',
-  eventTitle: '',
-  eventType: '',
-  eventLevel: '',
-  eventStatus: '',
-  address: '',
-  longitude: '',
-  latitude: '',
-  eventTime: '',
-  reportTime: '',
-  casualty: false,
+  // eventId: '',
+  eventTitle: '', // 事件标题
+  eventType: '', // 事件类型
+  eventLevel: '', // 事件等级
+  eventStatus: '', // 事件状态
+  address: '', // 事件地点
+  longitude: '', // 经度
+  latitude: '', // 纬度
+  eventTime: '',// 事发时间
+  reportTime: '',// 上报时间
   deaths: '',
   injuries: '',
   missing: '',
-  eventSource: '',
-  event_description: ''
+  eventSource: '', // 事件来源
+  eventDescription: '' // 事件描述
 };
-
+// 表单数据
 const data = reactive({
   form: { ...initFormData },
   queryParams: {
@@ -276,9 +256,8 @@ const data = reactive({
     eventTime: [{ required: true, message: '事发时间不能为空', trigger: 'blur' }],
     reportTime: [{ required: true, message: '上报时间不能为空', trigger: 'blur' }],
     eventSource: [{ required: true, message: '事件来源不能为空', trigger: 'blur' }],
-    event_description: [{ required: true, message: '事件概要不能为空', trigger: 'blur' }]
+    eventDescription: [{ required: true, message: '事件描述不能为空', trigger: 'blur' }]
   },
-  eventTypeSelection: [],
   eventLevelSelection: [],
   eventStatusSelection: [],
   regionSelection: []
@@ -313,6 +292,7 @@ const handleQuery = () => {
   getList();
 };
 
+// 重置查询条件
 const resetQuery = () => {
   queryParams.value = { page: 1, pageSize: 10, eventType: '', eventLevel: '', eventStatus: '', eventTime: '', regionCode: '', keyword: '' };
   handleQuery();
@@ -346,6 +326,8 @@ const submitForm = () => {
   eventFormRef.value?.validate((valid) => {
     if (valid) {
       buttonLoading.value = true;
+      // 打印表单数据
+      console.log('表单数据', form.value);
       addEvent(form.value)
         .then(() => {
           dialog.visible = false;
@@ -393,7 +375,6 @@ const handleView = (row) => {
 
 // 地图定位
 const mapDialogVisible = ref(false);
-const eventLevelDialogVisible = ref(false);
 
 const openMapDialog = () => {
   mapDialogVisible.value = true;
@@ -401,24 +382,13 @@ const openMapDialog = () => {
 
 const handleMapChange = (data) => {
   form.value.address = data.address;
-  form.value.longitude = data.lnglat[0].toString();
-  form.value.latitude = data.lnglat[1].toString();
-  mapDialogVisible.value = false;
-};
-
-const confirmMapLocation = () => {
+  form.value.longitude = data.lnglat[0];
+  form.value.latitude = data.lnglat[1];
   mapDialogVisible.value = false;
 };
 
 onMounted(() => {
   getList();
-  Promise.all([getDicts('mm_event_type'), getDicts('mm_event_level'), getDicts('mm_event_state'), getDicts('region')]).then(
-    ([eventTypeRes, eventLevelRes, eventStatusRes, regionRes]) => {
-      data.eventTypeSelection = eventTypeRes.data;
-      data.eventLevelSelection = eventLevelRes.data;
-      data.eventStatusSelection = eventStatusRes.data;
-      data.regionSelection = regionRes.data;
-    }
-  );
 });
+
 </script>

+ 1 - 1
src/views/knowledge/knowledge-management/detail.vue

@@ -156,7 +156,7 @@ onMounted(async () => {
       sourceUnit: data.publishingUnit,
       notificationType: data.notificationType,
       summary: data.summary,
-      attachmentName: data.file.length > 0 ? data.file[0].name : '',
+      attachmentName: data.file.length > 0 ? data.file[0].content : '',
       attachmentUrl: data.file.length > 0 ? data.file[0].url : ''
     };
   } catch (error) {

+ 0 - 5
src/views/knowledge/knowledge-management/index.vue

@@ -205,10 +205,7 @@ const getList = async () => {
     const [startDate, endDate] = queryParams.publishDate;
     const formattedStartDate = startDate ? startDate.replace(/-/g, '/') : '';
     const formattedEndDate = endDate ? endDate.replace(/-/g, '/') : '';
-    console.log('startDate:', startDate, 'endDate:', endDate);
     const publishDateRange = formattedStartDate && formattedEndDate ? `${formattedStartDate}-${formattedEndDate}` : '';
-    console.log('publishDateRange:', publishDateRange);
-
 
     // 构建新的请求参数对象
     const requestParams = {
@@ -242,8 +239,6 @@ const getList = async () => {
 };
 
 
-
-
 const handleQuery = () => {
   queryParams.pageNum = 1;
   getList();

+ 17 - 10
src/views/riskPrevention/planManage/index.vue

@@ -120,6 +120,7 @@ import ChunkUpload from '@/components/ChunkUpload/index.vue';
 import { getDicts } from '@/api/system/dict/data';
 
 import { useRouter } from 'vue-router';
+import { getPlanDetail, getTrainingList } from "@/api/riskPrevention/planManage";
 
 const router = useRouter();
 const demoFormRef = ref(null);
@@ -167,19 +168,25 @@ const dialog = reactive({
   title: ''
 });
 
+// const getList = async () => {
+//   loading.value = true;
+//   try {
+//     const response = await fetchReports(planForm);
+//     demoList.value = response.data;
+//     total.value = response.total;
+//   } catch (error) {
+//     console.error('获取数据时出错:', error);
+//   } finally {
+//     loading.value = false;
+//   }
+// };
 const getList = async () => {
   loading.value = true;
-  try {
-    const response = await fetchReports(planForm);
-    demoList.value = response.data;
-    total.value = response.total;
-  } catch (error) {
-    console.error('获取数据时出错:', error);
-  } finally {
-    loading.value = false;
-  }
+  const res = await getPlanDetail(planForm);
+  loading.value = false;
+  demoList.value = res.data;
+  total.value = res.total;
 };
-
 const handleQuery = () => {
   planForm.pageNum = 1;
   getList();

+ 45 - 76
src/views/riskPrevention/planManage/planList.vue

@@ -180,7 +180,7 @@
                   删除
                 </el-button>
               </el-col>
-              <right-toolbar v-model:showSearch="showSearch" :columns="columns0" :search="true" @query-table="getList"></right-toolbar>
+              <right-toolbar v-model:showSearch="showSearch" :columns="columns0" :search="true" @query-table="getList2"></right-toolbar>
             </el-row>
             <drill :id="dialog3.id" v-model="dialog3.visible" @getlist="getList2" />
           </template>
@@ -253,13 +253,7 @@
             </el-table-column>
           </el-table>
 
-          <pagination
-            v-show="total2 > 0"
-            v-model:page="drillForm.pageNum"
-            v-model:limit="drillForm.pageSize"
-            :total="total2"
-            @pagination="getList2"
-          />
+          <pagination v-show="total2 > 0" v-model:page="drillForm.page" v-model:limit="drillForm.pageSize" :total="total2" @pagination="getList2" />
         </el-card>
       </el-col>
       <el-col :lg="30" :xs="24">
@@ -321,10 +315,10 @@
             </el-table-column>
           </el-table>
           <pagination
-            v-show="total > 0"
+            v-show="total4 > 0"
             v-model:page="queryParams.pageNum"
             v-model:limit="queryParams.pageSize"
-            :total="total"
+            :total="total4"
             @pagination="getListResponse"
           />
         </el-card>
@@ -509,7 +503,7 @@
 
 <script setup name="User" lang="ts">
 import api from '@/api/system/user';
-import { UserForm, UserQuery, UserVO, PlanVO, DrillVO, PlanForm } from '@/api/system/user/types';
+import { UserForm, UserQuery, UserVO, PlanVO, DrillVO, ResponseVO, PlanForm } from '@/api/system/user/types';
 import { DeptVO } from '@/api/system/dept/types';
 import { RoleVO } from '@/api/system/role/types';
 import { PostQuery, PostVO } from '@/api/system/post/types';
@@ -521,8 +515,9 @@ import type { TabsPaneContext } from 'element-plus';
 import { ArrowLeft } from '@element-plus/icons-vue';
 import { useRouter } from 'vue-router';
 import { reactive } from 'vue';
-import { getDrillList, getPlanDetail, getResponseDetail, getTrainingList } from "@/api/riskPrevention/planManage";
+import { getDrillList, getPlanDetail, getResponseDetail, getTrainingList } from '@/api/riskPrevention/planManage';
 import drill from './drill.vue';
+import { fetchReportDetail } from "@/api/kenowledge";
 const router = useRouter();
 
 const goBack = () => {
@@ -576,7 +571,6 @@ const loading4 = ref(false);
 const loading3 = ref(false);
 const total4 = ref(0);
 const total3 = ref(0);
-const planList = ref<PlanVO[]>();
 const drillList = ref<DrillVO[]>();
 const loading2 = ref(false);
 const total2 = ref(0);
@@ -589,10 +583,8 @@ const multiple = ref(true);
 const total = ref(0);
 const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 const Content = ref('');
-const deptOptions = ref<DeptVO[]>([]);
 const initPassword = ref<string>('');
 const postOptions = ref<PostVO[]>([]);
-const roleOptions = ref<RoleVO[]>([]);
 /*** 用户导入参数 */
 const upload = reactive<ImportOption>({
   // 是否显示弹出层(用户导入)
@@ -728,33 +720,25 @@ const initData: PageData<UserForm, UserQuery> = {
 };
 const data = reactive<PageData<UserForm, UserQuery>>(initData);
 
+
 const { queryParams, form2, rules } = toRefs<PageData<UserForm, UserQuery>>(data);
-const drillForm = reactive({
-  page: 1,
+//演练
+const drillForm = reactive<DrillForm>({
+  pageNum: 1,
   pageSize: 10,
-  planNum: ''
+  planNum: 'YJYA0000000001'
 });
+//培训
 const queryParams3 = reactive({
   page: 1,
   pageSize: 10,
-  planNum: ''
+  planNum: 'YJYA0000000001'
 });
+//响应
 const responseParams = reactive({
-  page: 1,
+  pageNum: 1,
   pageSize: 10,
-  planNum: ''
-});
-
-const form = reactive<DrillVO>({
-  drillId: '',
-  drillName: '',
-  drillUnit: '',
-  year: '',
-  drillTime: '',
-  drillAddress: '',
-  drillProject: '',
-  drillVideo: '',
-  drillPicture: ''
+  planId: 'YJYA0000000001'
 });
 
 /** 通过条件过滤节点  */
@@ -772,44 +756,34 @@ watchEffect(
   }
 );
 
-/** 查询培训内容下拉树结构 */
-const getTreeSelect = async () => {
-  const res = await api.deptTreeSelect();
-  deptOptions.value = res.data;
-};
-
 /** 查询培训列表 */
-const getList = async () => {
-  loading.value = true;
-  const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
-  loading.value = false;
-  userList.value = res.rows;
-  total.value = res.total;
+const getList3 = async () => {
+  loading3.value = true;
+  const res = await getTrainingList(queryParams3);
+  loading3.value = false;
+  userList.value = res.data;
+  total3.value = res.total;
 };
 /** 查询演练列表 */
+/*const getList2 = async () => {
+  loading2.value = true;
+  const res = await api.listDrill(proxy?.addDateRange(drillForm.value, dateRange.value));
+  loading2.value = false;
+  drillList.value = res.rows;
+  total2.value = res.total;
+};*/
 const getList2 = async () => {
   loading2.value = true;
   const res = await getDrillList(drillForm);
   loading2.value = false;
   res.data.forEach((item) => {
-    item.drillPicture = item.drillPicture[0].file_name_desc;
-    item.drillVideo = item.drillVideo[0].file_name_desc;
+    item.drillPicture = item.drillPicture[0]?.file_name_desc;
+    item.drillVideo = item.drillVideo[0]?.file_name_desc;
   });
   drillList.value = res.data;
   total2.value = res.total;
 };
-/** 查询培训列表 */
-const getList3 = async () => {
-  loading3.value = true;
-  const res = await getTrainingList(queryParams3);
-  loading3.value = false;
-  // res.data.forEach(item => {
-  //   item.drillPicture = item.drillPicture[0].file_name_desc
-  //   item.drillVideo = item.drillVideo[0].file_name_desc
-  // })
-  userList.value = res.data;
-  total3.value = res.total;
-};
+
 /** 查询响应列表 */
 /**const getListResponse = async () => {
   loading4.value = true;
@@ -835,7 +809,7 @@ const handleDelete = async (row?: UserVO) => {
   const [err] = await to(proxy?.$modal.confirm('是否确认删除记录编号为"' + textIds + '"的数据项?') as any);
   if (!err) {
     await api.delUser(textIds);
-    await getList();
+    await getList3();
     proxy?.$modal.msgSuccess('删除成功');
   }
 };
@@ -888,7 +862,7 @@ const handleFileSuccess = (response: any, file: UploadFile) => {
   ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', {
     dangerouslyUseHTMLString: true
   });
-  getList();
+  getList3();
 };
 
 /** 提交上传文件 */
@@ -896,15 +870,6 @@ function submitFileForm() {
   uploadRef.value?.submit();
 }
 
-/** 初始化培训内容数据 */
-const initTreeData = async () => {
-  // 判断培训内容的数据是否存在,存在不获取,不存在则获取
-  if (deptOptions.value === undefined) {
-    const { data } = await treeselect();
-    deptOptions.value = data;
-  }
-};
-
 /** 重置操作表单 */
 const reset = () => {
   form.value = { ...initFormData };
@@ -923,7 +888,6 @@ const handleUpdate = async (row?: UserForm) => {
   //const { data } = await api.getUser(textId);
   dialog.visible = true;
   dialog.title = '修改培训记录';
-  await initTreeData();
   Object.assign(form.value, data.user);
 };
 
@@ -934,7 +898,7 @@ const submitForm = () => {
       form.value.textId ? await api.updateUser(form.value) : await api.addUser(form.value);
       proxy?.$modal.msgSuccess('操作成功');
       dialog.visible = false;
-      await getList();
+      await getList3();
     }
   });
 };
@@ -962,9 +926,16 @@ const handleAdd = async () => {
   dialog.visible = true;
   dialog.title = '新增培训记录';
 };
+
 let detailData = ref({
-  file_list: []
+  planId: '',
+  planName: '',
+  planType: '',
+  publish_date: '',
+  organUnit: '',
+  document: '',
 });
+
 onMounted(() => {
   const planId = route.query.planId;
   drillForm.planNum = planId;
@@ -972,8 +943,6 @@ onMounted(() => {
   getPlanDetail(planId).then((res) => {
     detailData.value = res.data;
   });
-  getTreeSelect(); // 初始化培训内容数据
-  getList(); // 初始化列表数据
   getList2(); // 初始化列表数据
   getList3(); // 初始化列表数据
   proxy?.getConfigKey('sys.user.initPassword').then((response) => {
@@ -1023,7 +992,7 @@ const drillDelete = async (row?: DrillVO) => {
   const [err] = await to(proxy?.$modal.confirm('是否确认删除记录编号为"' + drillIds + '"的数据项?') as any);
   if (!err) {
     await api.delPlan(drillIds);
-    await getList();
+    await getList3();
     proxy?.$modal.msgSuccess('删除成功');
   }
 };