Explorar o código

缺少编辑接口未联调完成

chauncey hai 11 meses
pai
achega
a99e6eac39

+ 22 - 14
src/api/disaster-warning/index.ts

@@ -6,6 +6,7 @@ import type {
   DefenseNoticeDetailResponse,
   DefenseNoticeListQuery,
 } from '@/types/disaster-warning';
+import type { DefenseNoticeRuleForm } from '@/views/disaster/disaster-warning/src/type';
 import type { QueryPageRequest, QueryPageResponse } from '@/api/disaster';
 /**
  * 获取预警信息列表
@@ -44,23 +45,30 @@ export function getWarningInfoDetail(id: number) {
     },
   );
 }
+
+/**
+ * 创建防御通知项
+ */
+export const createDefenseNoticeItem = (data: Omit<DefenseNoticeRuleForm, 'createUser'>) => {
+  return http.request({
+    url: '/defenseNotice/saveDefenseNoticeInfo',
+    method: 'post',
+    data,
+  });
+};
+
 /**
  * 查看防御通知详情
  */
-export function getDefenseNoticeDetail(id: number) {
-  return http.request<DefenseNoticeDetailResponse>(
-    {
-      url: 'admin/warning/getDefenseNoticeDetail',
-      method: 'get',
-      params: {
-        id,
-      },
-    },
-    {
-      ignoreTargetTenantId: true,
+export const getDefenseNoticeDetail = (defenseNoticeInfoId: number) => {
+  return http.request<DefenseNoticeDetailResponse>({
+    url: '/defenseNotice/queryDefenseNoticeInfo',
+    method: 'get',
+    params: {
+      defenseNoticeInfoId,
     },
-  );
-}
+  });
+};
 
 /**
  * 删除防御通知项
@@ -68,6 +76,6 @@ export function getDefenseNoticeDetail(id: number) {
 export const deleteDefenseNoticeItem = (defenseNoticeInfoIds: number) => {
   return http.request({
     url: '/defenseNotice/deleteDefenseNoticeInfos?defenseNoticeInfoIds=' + defenseNoticeInfoIds,
-    method: 'post'
+    method: 'post',
   });
 };

+ 16 - 0
src/api/minio/index.ts

@@ -0,0 +1,16 @@
+import { http } from '@/utils/http/axios';
+/**
+ * 上传文件到MINIO
+ */
+
+export const uploadFile = (bizType: string, fileName: string, File: File) => {
+  const formData = new FormData();
+  formData.append('bizType', bizType);
+  formData.append('fileName', fileName.split('.')[0]);
+  formData.append('file', File);
+  return http.request<{ url: string }>({
+    url: '/admin/minio/uploadFile',
+    method: 'post',
+    data: formData,
+  });
+};

+ 25 - 0
src/components/UploadLoading.vue

@@ -0,0 +1,25 @@
+<template>
+  <div
+    class="upload-loading"
+    v-loading="formLoading"
+    element-loading-text="表单上传中。。。"
+    element-loading-background="rgba(0,0,0, 0.2)"
+  />
+</template>
+
+<script setup lang="ts">
+defineProps<{
+  formLoading: boolean;
+}>();
+</script>
+
+<style lang="scss" scoped>
+  .upload-loading {
+    @include flex-center;
+    position: fixed;
+    left: 0;
+    top: 0;
+    width: 100vw;
+    height: 100vh;
+  }
+</style>

+ 7 - 12
src/types/disaster-warning/index.ts

@@ -1,10 +1,11 @@
+import type { FileItem } from '@/views/disaster/types';
 interface BasicResponse {
   id: number;
   disasterType: string;
   disasterLevel: string;
-  publishTime: string;
+  pushTime: string;
   effectState: number;
-  pushStatus: number;
+  isPush: number;
 }
 export interface WarningInfoListResponse extends BasicResponse {
   warningIcon: string;
@@ -23,7 +24,6 @@ export interface DefenseNoticeListResponse extends BasicResponse {
 }
 
 interface BasicDetailResponse {
-  isPush: boolean;
   userGroupList?: number[];
   createUser: string;
 }
@@ -34,16 +34,11 @@ export interface WarningInfoDetailResponse
   source: string;
 }
 
-export interface DefenseNoticeAttachment {
-  id: number;
-  fileName: string;
-  fileType: string;
-  fileSize: string;
-  downloadUrl?: string;
-}
+
 export interface DefenseNoticeDetailResponse
   extends BasicDetailResponse,
-    Omit<DefenseNoticeListResponse, 'effectState' | 'pushStatus' | 'publishTime'> {
+    Omit<DefenseNoticeListResponse, 'effectState'> {
   content: string;
-  noticeAttachment: DefenseNoticeAttachment[];
+  attachmentListRes: FileItem[];
+  realname: string;
 }

+ 5 - 5
src/views/disaster/components/Upload.vue

@@ -24,12 +24,12 @@
 
     <!-- 文件列表 -->
     <div class="file-list" v-if="fileList.length > 0">
-      <div v-for="file in fileList" :key="file.id" class="file-item">
+      <div v-for="file in fileList" :key="file.fileId" class="file-item">
         <div class="file-info">
           <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
           <span class="file-name">{{ file.fileName }}</span>
         </div>
-        <el-icon class="delete-button" @click="removeFile(file.id)"><Delete /></el-icon>
+        <el-icon class="delete-button" @click="removeFile(file.fileId)"><Delete /></el-icon>
       </div>
     </div>
   </div>
@@ -153,7 +153,7 @@
     const fileName = file.name;
 
     fileList.value.unshift({
-      id: fileId,
+      fileId: fileId,
       file: file,
       fileType: fileType,
       fileName: fileName,
@@ -166,7 +166,7 @@
       confirmButtonText: '确定',
       cancelButtonText: '取消',
     }).then(() => {
-      const index = fileList.value.findIndex((item) => item.id === id);
+      const index = fileList.value.findIndex((item) => item.fileId === id);
       if (index !== -1) {
         fileList.value.splice(index, 1);
       }
@@ -180,7 +180,7 @@
 
     // 使用更快的速度模拟上传进度
     let targetProgress = 5;
-    const totalDuration = 1500; // 总上传时间,毫秒
+    const totalDuration = 500; // 总上传时间,毫秒
     const interval = 200; // 更新间隔
     const steps = totalDuration / interval;
     const increment = 95 / steps; // 每步增加的百分比,从5%到100%

+ 15 - 4
src/views/disaster/constant/index.ts

@@ -2,6 +2,12 @@
  * 灾害防范通用常量
  */
 
+// 是否推送
+export enum IS_PUSH {
+  NOT_PUSH = 0,
+  PUSH,
+}
+
 // 生效状态
 export enum ACTIVE_STATUS {
   INACTIVE = 0,
@@ -133,18 +139,23 @@ export const DISASTER_TYPE = [
 export const DISASTER_LEVEL = [
   {
     label: 'IV级/一般',
-    value: 1,
+    value: "1",
   },
   {
     label: 'III级/较重',
-    value: 2,
+    value: "2",
   },
   {
     label: 'II级/严重',
-    value: 3,
+    value: "3",
   },
   {
     label: 'I级/特别严重',
-    value: 4,
+    value: "4",
   },
 ];
+
+// 上传文件的文件夹
+export const BIZ_TYPE = {
+  ATTACHMENT: 'ATTACHMENT',
+};

+ 8 - 5
src/views/disaster/disaster-warning/PageDefenseNotice.vue

@@ -25,6 +25,9 @@
           @update:pageSize="handleSizeChange"
           @update:pageNumber="handleCurrentChange"
         >
+          <template #disasterType="scope">
+            <span>{{ formatDisasterType(scope.row.disasterType) }}</span>
+          </template>
           <template #disasterLevel="scope">
             <span>{{ formatDisasterLevel(scope.row.disasterLevel) }}</span>
           </template>
@@ -45,7 +48,7 @@
           <template #action="scope">
             <ActionButton
               text="编辑"
-              v-if="scope.row.activeStatus === ACTIVE_STATUS.NOT_EFFECTIVE"
+              v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE"
               @click="handleEditDefenseNotice(scope.row.id)"
             />
             <ActionButton text="查看" @click="handleViewDefenseNotice(scope.row.id)" />
@@ -54,14 +57,14 @@
               :popconfirm="{
                 title: '确定要发布?',
               }"
-              v-if="scope.row.activeStatus === ACTIVE_STATUS.NOT_EFFECTIVE"
+              v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE"
             />
             <ActionButton
               text="撤回"
               :popconfirm="{
                 title: '确定要撤回?',
               }"
-              v-else-if="scope.row.activeStatus === ACTIVE_STATUS.ACTIVE"
+              v-else-if="scope.row.effectState === ACTIVE_STATUS.ACTIVE"
             />
             <ActionButton
               text="删除"
@@ -90,7 +93,7 @@
   import { ACTIVE_STATUS, ACTIVE_STATUS_COLOR, ACTIVE_STATUS_MAP } from '@/views/disaster/constant';
   import { PUSH_STATUS_MAP, PUSH_STATUS } from './src/constant';
   import { DEFENSE_NOTICE_SEARCH_CONFIG, TABLE_OPTIONS, DEFENSE_NOTICE_TABLE_COLUMNS } from './src/config';
-  import { formatDisasterLevel } from '@/views/disaster/utils/formatTable';
+  import { formatDisasterLevel, formatDisasterType } from '@/views/disaster/utils/formatTable';
   import { useRouter } from 'vue-router';
   import { ElMessage } from 'element-plus';
   const tableData = ref<DefenseNoticeListResponse[]>([]);
@@ -118,8 +121,8 @@
   };
   const handleDeleteDefenseNotice = async (id: number) => {
     await deleteDefenseNoticeItem(id);
+    await getTableData();
     ElMessage.success('删除成功');
-    getTableData();
   };
   const searchData = reactive({
     disasterType: '',

+ 42 - 1
src/views/disaster/disaster-warning/PageDefenseNoticeItem.vue

@@ -11,14 +11,22 @@
       <el-button @click="router.back()">取消</el-button>
       <el-button type="primary" @click="submit">提交</el-button>
     </footer>
+    <UploadLoading :form-loading="formLoading" v-if="formLoading" />
   </div>
 </template>
 
 <script lang="ts" setup>
   import { ref, computed, defineAsyncComponent } from 'vue';
+  import UploadLoading from '@/components/UploadLoading.vue';
   import { useRoute, useRouter } from 'vue-router';
   import BackIcon from 'assets/svg/back.svg';
   import { ElMessage } from 'element-plus';
+  import type { DefenseNoticeRuleForm } from './src/type';
+  import { uploadFile } from '@/api/minio';
+  import { BIZ_TYPE } from '@/views/disaster/constant';
+  import type { FileItem } from '@/views/disaster/types';
+  import { createDefenseNoticeItem } from '@/api/disaster-warning/index';
+
   const router = useRouter();
   const route = useRoute();
   const operate = route.query.operate;
@@ -42,13 +50,46 @@
     }
   });
   const dynamicComponentRef = ref();
+  const formLoading = ref(false);
+  const formatAttachmentList = async (file: FileItem) => {
+    if (!file.file) return file;
+    const fileName = file.fileName;
+    const res = await uploadFile(BIZ_TYPE.ATTACHMENT, fileName, file.file);
+    const fileType = file.fileType;
+    const fileSize = file.fileSize;
+    const fileId = file.fileId;
+    const fileUrl = res.url;
+    return {
+      fileName,
+      fileType,
+      fileSize,
+      fileUrl,
+      fileId,
+    };
+  };
+  const createDefenseNoticeItemFunc = async (formData: DefenseNoticeRuleForm) => {
+    const attachmentListRes: FileItem[] = await Promise.all(
+      formData.attachmentListRes.map((item) => formatAttachmentList(item)),
+    );
+    const createParam = {
+      disasterType: formData.disasterType,
+      disasterLevel: formData.disasterLevel,
+      title: formData.title,
+      content: formData.content,
+      attachmentListRes,
+      isPush: formData.isPush,
+    };
+    await createDefenseNoticeItem(createParam);
+  };
   const submit = async () => {
     if (!dynamicComponentRef.value) return;
     const res = await dynamicComponentRef.value.handleValidate();
     if (res) {
+      formLoading.value = true;
       const formData = dynamicComponentRef.value.getFormData();
-      console.log(formData);
+      await createDefenseNoticeItemFunc(formData);
       ElMessage.success('提交成功');
+      formLoading.value = false;
       router.back();
     } else {
       console.log('不提交');

+ 15 - 7
src/views/disaster/disaster-warning/src/components/CreateDefenseNoticeItem.vue

@@ -1,16 +1,16 @@
 <template>
   <div class="info-container">
     <BasicForm ref="basicFormRef" :formData="ruleFormData" :formRules="formRules" :formConfig="ruleFormConfig">
-      <template #noticeAttachment>
+      <template #attachmentListRes>
         <Upload label="上传附件" @uploadSuccess="handleUploadSuccess" />
       </template>
       <template #isPush>
         <el-radio-group v-model="ruleFormData.isPush">
-          <el-radio :value="true">是</el-radio>
-          <el-radio :value="false">否</el-radio>
+          <el-radio :value="IS_PUSH.PUSH">是</el-radio>
+          <el-radio :value="IS_PUSH.NOT_PUSH">否</el-radio>
         </el-radio-group>
         <SelectGroup
-          v-if="ruleFormData.isPush"
+          v-if="ruleFormData.isPush === IS_PUSH.PUSH"
           ref="selectGroupRef"
           :userGroupList="ruleFormData.userGroupList || []"
           @userGroupListChange="handleUserGroupListChange"
@@ -25,10 +25,17 @@
   import Upload from '@/views/disaster/components/Upload.vue';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
   import { DEFENSE_NOTICE_FROM_CONFIG, DEFENSE_NOTICE_FROM_DATA, DEFENSE_NOTICE_FROM_RULES } from '../config';
+  import { IS_PUSH } from '@/views/disaster/constant';
   import { onMounted, ref } from 'vue';
   import { DefenseNoticeRuleForm } from '../type';
   import SelectGroup from '@/views/disaster/components/SelectGroup.vue';
   import type { FileItem } from '@/views/disaster/types';
+  import { useUserStore } from '@/store/modules/user';
+  import { storeToRefs } from 'pinia';
+
+  const userStore = useUserStore();
+  const { getUserInfo } = storeToRefs(userStore);
+
   const basicFormRef = ref<InstanceType<typeof BasicForm>>();
   const selectGroupRef = ref<InstanceType<typeof SelectGroup>>();
 
@@ -44,9 +51,9 @@
   };
 
   const handleUploadSuccess = (fileList: FileItem[]) => {
-    ruleFormData.noticeAttachment = fileList;
+    ruleFormData.attachmentListRes = fileList;
     if (!basicFormRef.value) return;
-    basicFormRef.value.validateField('noticeAttachment');
+    basicFormRef.value.validateField('attachmentListRes');
   };
 
   const handleValidate = async () => {
@@ -70,7 +77,8 @@
     getFormData,
   });
   onMounted(() => {
-    ruleFormData.createUser = 'XXX';
+    const realname = getUserInfo.value.realname;
+    ruleFormData.createUser = realname;
     cloneRuleFormData();
     beforeRouteLeave();
   });

+ 8 - 6
src/views/disaster/disaster-warning/src/components/EditDefenseNoticeItem.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="info-container">
     <BasicForm ref="basicFormRef" :formData="ruleFormData" :formRules="formRules" :formConfig="ruleFormConfig">
-      <template #noticeAttachment>
-        <Upload label="上传附件" :fileList="ruleFormData.noticeAttachment" @uploadSuccess="handleUploadSuccess" />
+      <template #attachmentListRes>
+        <Upload label="上传附件" :fileList="ruleFormData.attachmentListRes" @uploadSuccess="handleUploadSuccess" />
       </template>
       <template #isPush>
         <el-radio-group v-model="ruleFormData.isPush">
-          <el-radio :value="true">是</el-radio>
-          <el-radio :value="false">否</el-radio>
+          <el-radio :value="IS_PUSH.PUSH">是</el-radio>
+          <el-radio :value="IS_PUSH.NOT_PUSH">否</el-radio>
         </el-radio-group>
         <SelectGroup
           v-if="ruleFormData.isPush"
@@ -29,6 +29,7 @@
   import { DefenseNoticeRuleForm } from '../type';
   import SelectGroup from '@/views/disaster/components/SelectGroup.vue';
   import type { FileItem } from '@/views/disaster/types';
+  import { IS_PUSH } from '@/views/disaster/constant';
   import { getDefenseNoticeDetail } from '@/api/disaster-warning';
 
   const props = defineProps<{
@@ -50,15 +51,16 @@
   };
 
   const handleUploadSuccess = (fileList: FileItem[]) => {
-    ruleFormData.noticeAttachment = fileList;
+    ruleFormData.attachmentListRes = fileList;
     if (!basicFormRef.value) return;
-    basicFormRef.value.validateField('noticeAttachment');
+    basicFormRef.value.validateField('attachmentListRes');
   };
 
   const getDefenseNoticeDetailData = async () => {
     const res = await getDefenseNoticeDetail(props.id);
     for (const key in res) {
       ruleFormData[key] = res[key as keyof typeof res];
+      ruleFormData.createUser = res.realname;
     }
     cloneRuleFormData();
   };

+ 19 - 16
src/views/disaster/disaster-warning/src/components/ViewDefenseNoticeItem.vue

@@ -1,36 +1,36 @@
 <template>
   <div class="info-container">
     <header class="info-container__header">
-      <span class="title">{{ defenseNoticeDetail?.noticeTitle }}</span>
+      <span class="title">{{ defenseNoticeDetail?.title }}</span>
       <div class="disaster">
         <p class="info-item">
-          类型:<span class="info-content">{{ defenseNoticeDetail?.disasterType }}</span>
+          类型:<span class="info-content">{{ formatDisasterType(defenseNoticeDetail?.disasterType || '') }}</span>
         </p>
         <p class="info-item">
-          灾害等级:<span class="info-content">{{ defenseNoticeDetail?.disasterLevel }}</span>
+          灾害等级:<span class="info-content">{{ formatDisasterLevel(defenseNoticeDetail?.disasterLevel || '') }}</span>
         </p>
       </div>
       <span class="publish-info">
         <p class="info-item">
-          发布人:<span class="info-content"
-            >{{ defenseNoticeDetail?.createUser }}{{ defenseNoticeDetail?.publishTime }}</span
-          >
+          发布人:<span class="info-content">
+            {{ defenseNoticeDetail?.realname }}
+          </span>
         </p>
       </span>
     </header>
     <section class="divider"></section>
     <section class="content">
-      <div v-html="defenseNoticeDetail?.noticeContent"></div>
+      <div v-html="defenseNoticeDetail?.content"></div>
     </section>
     <section class="attachment">
-      <span class="info-content">附件({{ defenseNoticeDetail?.noticeAttachment.length }})</span>
+      <span class="info-content">附件({{ defenseNoticeDetail?.attachmentListRes.length }})</span>
       <a @click="downloadAll">下载全部</a>
       <div class="attachment-list">
         <div
           class="attachment-item"
-          v-for="item in defenseNoticeDetail?.noticeAttachment"
-          :key="item.id"
-          @click="previewOnline(item.downloadUrl, item.fileType as keyof typeof FILE_TYPE_ICON)"
+          v-for="item in defenseNoticeDetail?.attachmentListRes"
+          :key="item.fileId"
+          @click="previewOnline(item.fileUrl, item.fileType as keyof typeof FILE_TYPE_ICON)"
         >
           <span class="attachment-item--name">{{ item.fileName }}</span>
           <div class="attachment-item--footer">
@@ -38,7 +38,7 @@
               <img :src="FILE_TYPE_ICON[item.fileType as keyof typeof FILE_TYPE_ICON]" />
               <span>{{ item.fileSize }}</span>
             </div>
-            <a @click.stop="downloadFile(item.downloadUrl, item.fileName)">下载</a>
+            <a @click.stop="downloadFile(item.fileUrl, item.fileName)">下载</a>
           </div>
         </div>
       </div>
@@ -54,6 +54,7 @@
   import type { DefenseNoticeDetailResponse } from '@/types/disaster-warning';
   import { downloadFile } from '@/views/disaster/utils/download';
   import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
+  import { formatDisasterType, formatDisasterLevel } from '@/views/disaster/utils/formatTable';
 
   const props = defineProps<{
     id: number;
@@ -61,15 +62,17 @@
 
   const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
-  const previewOnline = (url: string, type: keyof typeof FILE_TYPE_ICON) => {
-    previewOnlineRef.value?.open(url, type);
+  const previewOnline = (url: string | undefined, type: keyof typeof FILE_TYPE_ICON) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
   };
 
   const defenseNoticeDetail = ref<DefenseNoticeDetailResponse>();
 
   const downloadAll = () => {
-    defenseNoticeDetail.value?.noticeAttachment.forEach((item) => {
-      downloadFile(item.downloadUrl, item.fileName);
+    defenseNoticeDetail.value?.attachmentListRes.forEach((item) => {
+      downloadFile(item.fileUrl, item.fileName);
     });
   };
 

+ 12 - 10
src/views/disaster/disaster-warning/src/config/form.ts

@@ -98,7 +98,7 @@ export const DEFENSE_NOTICE_FROM_CONFIG: FormConfig[] = [
   BASIC_FROM_CONFIG.DISASTER_LEVEL,
   {
     label: '通知标题',
-    prop: 'noticeTitle',
+    prop: 'title',
     component: 'ElInput',
     componentProps: {
       placeholder: '请输入通知标题',
@@ -108,7 +108,7 @@ export const DEFENSE_NOTICE_FROM_CONFIG: FormConfig[] = [
   },
   {
     label: '通知内容',
-    prop: 'noticeContent',
+    prop: 'content',
     component: 'ElInput',
     componentProps: {
       placeholder: '请输入通知内容',
@@ -120,8 +120,8 @@ export const DEFENSE_NOTICE_FROM_CONFIG: FormConfig[] = [
   },
   {
     label: '通知附件',
-    prop: 'noticeAttachment',
-    slot: 'noticeAttachment',
+    prop: 'attachmentListRes',
+    slot: 'attachmentListRes',
   },
   BASIC_FROM_CONFIG.IS_PUSH,
   BASIC_FROM_CONFIG.CREATE_USER,
@@ -147,9 +147,11 @@ export const WARNING_INFO_FROM_DATA = {
 // 防御通知表单数据
 export const DEFENSE_NOTICE_FROM_DATA = {
   ...BASIC_FROM_DATA,
-  noticeTitle: '',
-  noticeContent: '',
-  noticeAttachment: [],
+  title: '',
+  content: '',
+  attachmentListRes: [],
+  pushTime: '',
+  realname: '',
 };
 
 // 通用表单规则
@@ -176,7 +178,7 @@ export const WARNING_INFO_FROM_RULES = {
 // 防御通知表单规则
 export const DEFENSE_NOTICE_FROM_RULES = {
   ...BASIC_FROM_RULES,
-  noticeTitle: [{ required: true, message: '请输入通知标题', trigger: 'blur' }],
-  noticeContent: [{ required: true, message: '请输入通知内容', trigger: 'blur' }],
-  noticeAttachment: [{ required: true, message: '请上传通知附件', trigger: 'change' }],
+  title: [{ required: true, message: '请输入通知标题', trigger: 'blur' }],
+  content: [{ required: true, message: '请输入通知内容', trigger: 'blur' }],
+  attachmentListRes: [{ required: true, message: '请上传通知附件', trigger: 'change' }],
 };

+ 2 - 1
src/views/disaster/disaster-warning/src/type.ts

@@ -1,7 +1,8 @@
 import type { WarningInfoDetailResponse, DefenseNoticeDetailResponse } from '@/types/disaster-warning';
 
 interface BasicRuleForm {
-  isPush: boolean | null;
+  id?: number;
+  isPush: number | null;
   [key: string]: any;
 }
 

+ 6 - 2
src/views/disaster/types/index.ts

@@ -1,4 +1,3 @@
-import type { DefenseNoticeAttachment } from '@/types/disaster-warning';
 export interface GroupOptionType {
   id: number;
   name: string;
@@ -10,7 +9,12 @@ export interface TreeNodeData {
   children: TreeNodeData[];
 }
 
-export interface FileItem extends DefenseNoticeAttachment {
+export interface FileItem {
+  fileId: number;
+  fileName: string;
+  fileType: string;
+  fileSize: string;
+  fileUrl?: string;
   file?: File;
 }
 

+ 2 - 1
src/views/disaster/utils/download.ts

@@ -3,7 +3,8 @@
  * @param url 文件url
  * @param name 文件名
  */
-export const downloadFile = (url: string, name: string): void => {
+export const downloadFile = (url: string | undefined, name: string): void => {
+  if (!url) return;
   // 创建XMLHttpRequest请求
   const request = new XMLHttpRequest();
   request.responseType = "blob";

+ 6 - 2
src/views/disaster/utils/formatTable.ts

@@ -1,5 +1,9 @@
-import { DISASTER_LEVEL } from '../constant';
+import { DISASTER_TYPE, DISASTER_LEVEL } from '../constant';
+// 格式化灾害类型
+export const formatDisasterType = (type: string) => {
+  return DISASTER_TYPE.find((item) => item.value === type)?.label;
+};
 // 格式化灾害等级
 export const formatDisasterLevel = (level: string) => {
-  return DISASTER_LEVEL.find((item) => item.value === Number(level))?.label;
+  return DISASTER_LEVEL.find((item) => item.value === level)?.label;
 };

+ 1 - 1
utils/devProxy/staff/proxy.ts

@@ -5,7 +5,7 @@ import path from 'path';
 const proxyStaff: PROXY_TYPE = {
   serverHost: 'http://192.168.22.121:8802/',
   loginHost: 'http://192.168.13.68:7200/login/#/',
-  fileUploadHost: '',
+  fileUploadHost: 'http://192.168.13.102:9000/',
 };
 
 // 对外导出的代理

+ 1 - 0
utils/devProxy/utils.ts

@@ -7,6 +7,7 @@ export const createProxyList = (devProxy: PROXY_TYPE) =>
   [
     ['/ws_api_bak/', devProxy.serverHost],
     ['/safety_api/', devProxy.serverHost],
+    ['/skyeye-file-upload/', devProxy.fileUploadHost],
   ] as ProxyList;
 
 export const createConfig = (appConfigPath: string) => {