瀏覽代碼

完成处置整改的所有功能

chauncey 10 月之前
父節點
當前提交
027239fd08

+ 13 - 0
src/api/disaster-control/index.ts

@@ -15,6 +15,8 @@ import type {
   LossRecordEditQuery,
   DisposalRectificationCreateQuery,
   DisposalRectificationFormData,
+  DisasterLossDetailQuery,
+  DisasterLossDetailResponse,
 } from '@/types/disaster-control';
 import type { QueryPageResponse, QueryPageRequest } from '@/types/disaster';
 /**
@@ -204,3 +206,14 @@ export const getRectificationList = (reportRecordIds: number[]) => {
     method: 'get',
   });
 };
+
+/**
+ * 查询灾害损失明细
+ */
+export const getDisasterLossDetail = (data: DisasterLossDetailQuery) => {
+  return http.request<DisasterLossDetailResponse>({
+    url: '/disasterHandle/queryDisasterLossDetailByTask',
+    method: 'post',
+    data,
+  });
+};

+ 42 - 0
src/types/disaster-control/index.ts

@@ -8,6 +8,7 @@ export interface ImageItem {
 
 export interface DisposalManagementListQuery {
   reporterId?: number;
+  fixerId?: number;
 }
 
 export interface LossReportReportTaskQuery {
@@ -203,3 +204,44 @@ export interface DisposalRectificationFormData {
 export interface DisposalRectificationCreateQuery extends DisposalRectificationFormData {
   fixTaskId: number;
 }
+
+export interface DisasterLossDetailQuery {
+  handleTaskId: number;
+  reporterId?: number;
+  fixerId?: number;
+}
+
+export interface LossRecordListDetail {
+  fixTaskId: number;
+  affectedItems: string;
+  buildingNo?: string;
+  floorNo?: string;
+  roomNo?: string;
+  createdBy: number;
+  updatedAt: string;
+  safetyLevel: string;
+  isAffectWork: number;
+  estimatedLoss: string | null;
+  description: string;
+  images: string;
+  remark: string;
+  isLoss: number;
+  responsibleDeptName: string;
+  fixPrincipals: string;
+  priority: string;
+  fixRecordList: DisposalRectificationFormData[];
+}
+
+export interface ReportTaskListDetail {
+  fixFinishCount: number;
+  lossRecordCount: number;
+  reportDeptId: number;
+  reportDeptName: string;
+  reportTaskId: number;
+  lossRecordList: LossRecordListDetail[]; // 损失记录列表
+}
+
+export interface DisasterLossDetailResponse {
+  handleTaskName: string;
+  reportTaskList: ReportTaskListDetail[]; // 上报任务列表
+}

+ 14 - 12
src/views/disaster/disaster-control/PageDisposalRectification.vue

@@ -49,7 +49,7 @@
                         'collapse-item__icon',
                         { 'collapse-item__icon--disabled': !item.tableData[0].disasterReportRecordDetailList.length },
                       ]"
-                      @click="handleViewTask(item.handleTaskId, item.taskName)"
+                      @click="handleViewTask(item.id)"
                     />
                   </el-tooltip>
                 </template>
@@ -93,14 +93,14 @@
                         <div class="action-container" v-if="scope.row.fixStatus === FIX_STATUS.TO_BE_RECTIFIED">
                           <ActionButton
                             text="查看"
-                            @click="handleViewTask(item.handleTaskId, item.taskName, scope.row.id, scope.row.fixTaskId)"
+                            @click="handleViewTask(item.id, scope.row.id, scope.row.fixTaskId, scope.row.deptId)"
                           />
                           <ActionButton
                             text="去整改"
                             @click="
                               handleRectification(
                                 scope.row.id,
-                                item.handleTaskId,
+                                item.id,
                                 scope.row.fixTaskId,
                                 item.tableData[0].disasterReportRecordDetailList,
                               )
@@ -115,14 +115,14 @@
                         <div class="action-container" v-else>
                           <ActionButton
                             text="查看"
-                            @click="handleViewTask(item.handleTaskId, item.taskName, scope.row.id, scope.row.fixTaskId)"
+                            @click="handleViewTask(item.id, scope.row.id, scope.row.fixTaskId, scope.row.deptId)"
                           />
                           <ActionButton
                             text="去整改"
                             @click="
                               handleRectification(
                                 scope.row.id,
-                                item.handleTaskId,
+                                item.id,
                                 scope.row.fixTaskId,
                                 item.tableData[0].disasterReportRecordDetailList,
                               )
@@ -180,7 +180,7 @@
     LossRecordTableResponse,
     disasterReportRecordDetailListResponse,
   } from '@/types/disaster-control';
-  import { getReportTaskList, getLossRecordTableData, addFixer } from '@/api/disaster-control';
+  import { getDisasterControlCollapseData, getLossRecordTableData, addFixer } from '@/api/disaster-control';
   import { queryUserInfoByIds } from '@/api/system/person-group';
   import {
     DISPOSAL_RECTIFICATION_SEARCH_CONFIG,
@@ -243,10 +243,12 @@
   };
   const getDisposalData = async () => {
     collapseLoading.value = true;
-    const res = await getReportTaskList({
+    const res = await getDisasterControlCollapseData({
       pageNumber: currentPage.value,
       pageSize: pageSize.value,
-      queryParam: {},
+      queryParam: {
+        fixerId: userId,
+      },
     });
     collapseList.value = res.records.map((item) => ({
       ...item,
@@ -257,7 +259,7 @@
         },
       ],
     }));
-    taskIds.value = collapseList.value.map((item) => item.handleTaskId);
+    taskIds.value = collapseList.value.map((item) => item.id);
     total.value = res.totalRow;
     collapseLoading.value = false;
     if (collapseList.value.length > 0) {
@@ -275,7 +277,7 @@
       ...searchData,
     });
     collapseList.value.forEach((item) => {
-      item.tableData = res.filter((tableItem) => tableItem.handleTaskId === item.handleTaskId);
+      item.tableData = res.filter((tableItem) => tableItem.handleTaskId === item.id);
     });
     tableConfig.loading = false;
   };
@@ -326,16 +328,16 @@
     });
   };
 
-  const handleViewTask = (handleTaskId: number, taskName: string, lossTaskId?: number, fixTaskId?: number) => {
+  const handleViewTask = (handleTaskId: number, lossTaskId?: number, fixTaskId?: number, deptId?: number) => {
     router.push({
       name: 'disaster-control-disposal-rectification-item-detail',
       params: {
         id: handleTaskId,
       },
       query: {
-        taskName,
         lossTaskId,
         fixTaskId,
+        deptId,
       },
     });
   };

+ 2 - 1
src/views/disaster/disaster-control/PageLossReportItem.vue

@@ -29,6 +29,7 @@
   const router = useRouter();
   const route = useRoute();
   const reportTaskId = Number(route.params.id);
+  const id = Number(route.query.id);
   const dynamicComponentRef = ref();
   const operate = route.query.operation;
   const headerTitle = computed(() => {
@@ -75,7 +76,7 @@
     );
     formData.images = [...(formData.images || []), ...imagesListRes];
     const editParam = {
-      id: reportTaskId,
+      id,
       ...formData,
     };
     await editLossRecord(editParam);

+ 67 - 61
src/views/disaster/disaster-control/PageViewDisposalRectification.vue

@@ -4,37 +4,44 @@
       <img :src="BackIcon" alt="back" class="back-icon" @click="router.back()" />
       <span class="disaster-precaution-container__title">灾害损失记录明细</span>
     </header>
-    <TaskInfoSection :task-name="taskName" @export-loss-detail="exportLossDetail" />
+    <TaskInfoSection :task-name="disasterLossDetailList?.handleTaskName" @export-loss-detail="exportLossDetail" />
     <main class="disaster-precaution-container__main">
       <section class="info-container">
         <CollapseItem
-          v-for="item in [1, 2, 3]"
-          :key="item"
-          :name="`上报单位:${item}`"
-          :isActive="activeId === item"
-          @toggle="handleCollapseToggle(item)"
+          v-for="reportTask in disasterLossDetailList?.reportTaskList"
+          :key="reportTask.reportDeptId"
+          :name="reportTask.reportDeptName"
+          :isActive="activeId === reportTask.reportDeptId"
+          @toggle="handleCollapseToggle(reportTask.reportDeptId)"
         >
           <template #view-operation>
             <div class="rectification-info">
-              <span class="num">26</span>
-              <span>条,整改完成16条</span>
+              <span class="num">{{ reportTask.lossRecordCount }}</span>
+              <span>条,整改完成{{ reportTask.fixFinishCount }}条</span>
             </div>
           </template>
           <template #right-header>
-            <span class="collapse-item__header--right">{{ activeId === item ? '收起' : '立即查看' }}</span>
+            <span class="collapse-item__header--right">
+              {{ activeId === reportTask.reportTaskId ? '收起' : '立即查看' }}
+            </span>
           </template>
           <template #main-table>
             <div class="rectification-table">
               <section class="damaged-list-container">
-                <DamagedList :damagedList="damagedList" :activeId="0" />
+                <DamagedList
+                  :damagedList="reportTask.lossRecordList"
+                  :active-id="activeTaskId"
+                  @update:activeId="handleActiveTask"
+                />
               </section>
               <section class="disaster-info-container">
-                <DisasterInfo :LossReportItemFormData="lossReportItem" rectification v-if="lossReportItem?.isLoss" />
+                <DisasterInfo :LossReportItemFormData="lossRecordListInfo" rectification v-if="lossRecordListInfo" />
                 <Rectification
-                  :rectification-list="rectificationList"
-                  :rectification-dept-name="rectificationDeptName"
+                  v-if="lossRecordListInfo?.fixRecordList"
+                  :rectification-list="lossRecordListInfo?.fixRecordList"
+                  :rectification-dept-name="lossRecordListInfo?.responsibleDeptName"
                   :rectification-responsible-user-list="rectificationResponsibleUserList"
-                  :rectification-priority="rectificationPriority"
+                  :rectification-priority="lossRecordListInfo?.priority"
                 />
               </section>
             </div>
@@ -55,76 +62,75 @@
   import DisasterInfo from './src/components/DisasterInfo.vue';
   import Rectification from './src/components/Rectification.vue';
   import { useDisasterControlHook } from './src/hook';
+  import { useUserInfoHook } from '../hooks';
   import type { PersonGroupItem } from '@/types/person-group/type';
-  import type { DisposalRectificationFormData } from '@/types/disaster-control';
-  import { getRectificationList } from '@/api/disaster-control';
+  import type { ReportTaskListDetail, LossRecordListDetail } from '@/types/disaster-control';
   import { queryUserInfoByIds } from '@/api/system/person-group';
   import BackIcon from 'assets/svg/back.svg';
 
   const router = useRouter();
   const route = useRoute();
   const handleTaskId = Number(route.params.id);
-  const { taskName, lossTaskId, fixTaskId } = route.query as unknown as {
-    taskName: string;
+  const { lossTaskId, fixTaskId, deptId } = route.query as unknown as {
     lossTaskId: number;
     fixTaskId: number;
+    deptId: number;
+  };
+  const activeTaskId = ref<number>(Number(fixTaskId));
+
+  const handleActiveTask = (fixTaskId: number) => {
+    activeTaskId.value = fixTaskId;
+    if (!lossRecordList.value.length) return;
+    lossRecordListInfo.value = lossRecordList.value.find((item) => item.fixTaskId === activeTaskId.value);
+    getFixUserList(lossRecordListInfo.value?.fixPrincipals);
   };
-  const { lossReportItem, getLossReportItem } = useDisasterControlHook();
+  const { id: fixerId } = useUserInfoHook();
+  const { getDisasterLossDetailList, disasterLossDetailList } = useDisasterControlHook();
 
   const exportLossDetail = () => {
     ElMessage.warning('暂未开放');
   };
-  const activeId = ref<number | null>(1);
+  const activeId = ref<number | null>(null);
   const handleCollapseToggle = (itemId: number) => {
     if (activeId.value === itemId) {
       activeId.value = null;
     } else {
       activeId.value = itemId;
+      reportTaskListInfo.value = reportTaskList.value.find((item) => item.reportDeptId === activeId.value);
+      if (!reportTaskListInfo.value) return;
+      lossRecordList.value = reportTaskListInfo.value?.lossRecordList;
+      activeTaskId.value = lossRecordList.value[0].fixTaskId;
+      lossRecordListInfo.value = lossRecordList.value.find((item) => item.fixTaskId === activeTaskId.value);
+      getFixUserList(lossRecordListInfo.value?.fixPrincipals);
     }
   };
-  const damagedList: string[] = [
-    '玻璃破损6处',
-    '树木倒伏',
-    '道闸杆',
-    '摄像机支架',
-    '支架鸭嘴(不锈钢)',
-    '遥控器',
-    '室外防水设备箱',
-  ];
-  const rectificationDeptName = ref<string>('建设管理部');
-  const rectificationResponsibleUserList = ref<PersonGroupItem[]>([
-    {
-      id: 1,
-      realname: '张三',
-      staffNo: '123456',
-    },
-    {
-      id: 2,
-      realname: '李四',
-      staffNo: '123456',
-    },
-    {
-      id: 3,
-      realname: '王五',
-      staffNo: '123456',
-    },
-  ]);
-  const rectificationPriority = ref<string>('normal');
-  const rectificationList = ref<DisposalRectificationFormData[]>([]);
+  const rectificationResponsibleUserList = ref<PersonGroupItem[]>([]);
+  const reportTaskList = ref<ReportTaskListDetail[]>([]);
+  const lossRecordList = ref<LossRecordListDetail[]>([]);
+  const reportTaskListInfo = ref<ReportTaskListDetail>();
+  const lossRecordListInfo = ref<LossRecordListDetail>();
+  const getFixUserList = async (userIds: string | undefined) => {
+    if (!userIds) return;
+    const ids = JSON.parse(userIds);
+    const res = await queryUserInfoByIds(ids);
+    rectificationResponsibleUserList.value = res;
+  };
   onMounted(async () => {
-    const res = await getRectificationList([lossTaskId]);
-    rectificationList.value = res[0].disasterLossFixRecordList;
-    // 直接for循环查
-    for (const item of rectificationList.value) {
-      item.remark = item.remark ? item.remark : '--';
-      if (item.createdBy) {
-        const userInfo = await queryUserInfoByIds([Number(item.createdBy)]);
-        item.createdByName = userInfo[0]?.realname || '--';
-      } else {
-        item.createdByName = '--';
-      }
+    await getDisasterLossDetailList({
+      handleTaskId,
+      fixerId,
+    });
+    if (!disasterLossDetailList.value?.reportTaskList.length) return;
+    reportTaskList.value = disasterLossDetailList.value?.reportTaskList;
+    activeId.value = deptId ? Number(deptId) : reportTaskList.value[0].reportDeptId;
+    reportTaskListInfo.value = reportTaskList.value.find((item) => item.reportDeptId === activeId.value);
+    if (!reportTaskListInfo.value) return;
+    lossRecordList.value = reportTaskListInfo.value?.lossRecordList;
+    if (isNaN(activeTaskId.value)) {
+      activeTaskId.value = lossRecordList.value[0].fixTaskId;
     }
-    getLossReportItem(Number(handleTaskId), Number(lossTaskId));
+    lossRecordListInfo.value = lossRecordList.value.find((item) => item.fixTaskId === activeTaskId.value);
+    getFixUserList(lossRecordListInfo.value?.fixPrincipals);
   });
 </script>
 

+ 26 - 4
src/views/disaster/disaster-control/src/components/DamagedList.vue

@@ -2,18 +2,40 @@
   <div class="damaged-list">
     <header class="header"> 受灾物品 </header>
     <nav class="nav">
-      <div class="nav-item" v-for="(item, index) in damagedList" :key="index" :class="{ active: activeId === index }">
-        <span class="nav-item__name">{{ item }}</span>
+      <div
+        class="nav-item"
+        v-for="damagedItem in damagedList"
+        :key="damagedItem.fixTaskId"
+        :class="{ active: activeTaskId === damagedItem.fixTaskId }"
+        @click="handleActiveTask(damagedItem.fixTaskId)"
+      >
+        <span class="nav-item__name">{{ damagedItem.affectedItems }}</span>
       </div>
     </nav>
   </div>
 </template>
 
 <script lang="ts" setup>
-  defineProps<{
-    damagedList: string[];
+  import { ref, watch } from 'vue';
+  import type { LossRecordListDetail } from '@/types/disaster-control';
+  const props = defineProps<{
+    damagedList: LossRecordListDetail[];
     activeId: number;
   }>();
+  const emit = defineEmits<{
+    (e: 'update:activeId', value: number): void;
+  }>();
+  const activeTaskId = ref<number>(props.activeId);
+  const handleActiveTask = (fixTaskId: number) => {
+    activeTaskId.value = fixTaskId;
+    emit('update:activeId', fixTaskId);
+  };
+  watch(
+    () => props.activeId,
+    (newId) => {
+      activeTaskId.value = newId;
+    },
+  );
 </script>
 
 <style lang="scss" scoped>

+ 2 - 2
src/views/disaster/disaster-control/src/components/DisasterInfo.vue

@@ -88,10 +88,10 @@
 <script lang="ts" setup>
   import { ref, onMounted } from 'vue';
   import { useDisasterControlHook } from '../hook';
-  import type { disasterReportRecordDetailListResponse } from '@/types/disaster-control';
+  import type { disasterReportRecordDetailListResponse, LossRecordListDetail } from '@/types/disaster-control';
 
   defineProps<{
-    LossReportItemFormData: disasterReportRecordDetailListResponse;
+    LossReportItemFormData: disasterReportRecordDetailListResponse | LossRecordListDetail;
     rectification?: boolean;
   }>();
 

+ 3 - 3
src/views/disaster/disaster-control/src/components/EditLossReportItem.vue

@@ -148,8 +148,8 @@
   };
 
   const route = useRoute();
-  const reportTaskId = Number(route.query.id);
-  const id = Number(route.params.id);
+  const handleTaskId = Number(route.query.handleTaskId);
+  const id = Number(route.query.id);
   const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
     useFormConfigHook<LossReportItemFormData>(
       LOSS_REPORT_ITEM_FORM_CONFIG_LOSS,
@@ -176,7 +176,7 @@
   };
 
   const getLossReportItemData = async () => {
-    const res = await getLossReportItem(reportTaskId, id);
+    const res = await getLossReportItem(handleTaskId, id);
     if (!res) return;
     const userInfo = await queryUserInfoByIds([Number(res.createdBy)]);
     for (const key in ruleFormData) {

+ 5 - 4
src/views/disaster/disaster-control/src/components/LossRecord.vue

@@ -97,7 +97,7 @@
                       <ActionButton
                         text="编辑"
                         v-if="isOverdue(item.dueCompleteTime) && scope.row.fixStatus === FIX_STATUS.TO_BE_RECTIFIED"
-                        @click="handleEdit(scope.row.id, item.handleTaskId)"
+                        @click="handleEdit(item.handleTaskId, scope.row.reportTaskId, scope.row.id)"
                       />
                       <ActionButton text="查看" />
                       <ActionButton
@@ -110,7 +110,7 @@
                       <ActionButton text="查看" v-if="scope.row.fixStatus === FIX_STATUS.TEMPORARY_CLOSED" />
                       <ActionButton
                         text="编辑"
-                        @click="handleEdit(scope.row.id, item.handleTaskId)"
+                        @click="handleEdit(item.handleTaskId, scope.row.reportTaskId, scope.row.id)"
                         v-if="isOverdue(item.dueCompleteTime) && scope.row.fixStatus !== FIX_STATUS.TEMPORARY_CLOSED"
                       />
                       <ActionButton
@@ -265,14 +265,15 @@
     });
   };
 
-  const handleEdit = (handleTaskId: number, id: number) => {
+  const handleEdit = (handleTaskId: number, reportTaskId: number, id: number) => {
     router.push({
       name: defaultName,
       params: {
-        id: handleTaskId,
+        id: reportTaskId,
       },
       query: {
         id,
+        handleTaskId,
         operation: 'edit',
       },
     });

+ 2 - 1
src/views/disaster/disaster-control/src/components/Rectification.vue

@@ -12,7 +12,7 @@
         <p v-show="rectificationResponsibleUserList.length">
           整改责任人:
           <span>
-            {{ rectificationResponsibleUserList[0].realname }}({{ rectificationResponsibleUserList[0].staffNo }})
+            {{ rectificationResponsibleUserList[0]?.realname }}({{ rectificationResponsibleUserList[0]?.staffNo }})
           </span>
           <a v-if="rectificationResponsibleUserList.length > 1" @click="groupInfo = true">查看详情</a>
         </p>
@@ -123,6 +123,7 @@
     display: flex;
     flex-direction: column;
     gap: 20px;
+    padding-left: 12px;
     &--title {
       display: flex;
       gap: 100px;

+ 1 - 1
src/views/disaster/disaster-control/src/components/TaskInfoSection.vue

@@ -15,7 +15,7 @@
 <script lang="ts" setup>
   import ExportIcon from 'assets/svg/export.svg';
   defineProps<{
-    taskName: string;
+    taskName?: string;
   }>();
   const emit = defineEmits<{
     (e: 'exportLossDetail'): void;

+ 17 - 4
src/views/disaster/disaster-control/src/hook.ts

@@ -3,10 +3,14 @@
  */
 
 import { ref } from 'vue';
-import { queryDictTypeDetail } from '@/api/dict';
 import type { SysDictDataDetail } from '@/api/dict';
-import type { disasterReportRecordDetailListResponse } from '@/types/disaster-control';
-import { getLossRecordTableData } from '@/api/disaster-control';
+import type {
+  disasterReportRecordDetailListResponse,
+  DisasterLossDetailQuery,
+  DisasterLossDetailResponse,
+} from '@/types/disaster-control';
+import { queryDictTypeDetail } from '@/api/dict';
+import { getLossRecordTableData, getDisasterLossDetail } from '@/api/disaster-control';
 import { DICT_CODE } from '@/constant/dict';
 
 export const useDisasterControlHook = () => {
@@ -25,7 +29,8 @@ export const useDisasterControlHook = () => {
     if (!safetyLevelCode) return '';
     return safetyLevelDice.value.find((item) => item.itemCode === safetyLevelCode)?.itemValue;
   };
-  const getPriority = (priorityCode: string) => {
+  const getPriority = (priorityCode: string | undefined) => {
+    if (!priorityCode) return '';
     return priorityDice.value.find((item) => item.itemCode === priorityCode)?.itemValue;
   };
   const getLossReportItem = async (handleTaskId: number, id: number) => {
@@ -34,6 +39,12 @@ export const useDisasterControlHook = () => {
     });
     const disasterReportRecordDetailList = res[0].disasterReportRecordDetailList;
     lossReportItem.value = disasterReportRecordDetailList.find((item) => item.id === id);
+    return lossReportItem.value;
+  };
+  const disasterLossDetailList = ref<DisasterLossDetailResponse>();
+  const getDisasterLossDetailList = async (data: DisasterLossDetailQuery) => {
+    const res = await getDisasterLossDetail(data);
+    disasterLossDetailList.value = res;
   };
   return {
     priorityDice,
@@ -44,5 +55,7 @@ export const useDisasterControlHook = () => {
     getPriority,
     lossReportItem,
     getLossReportItem,
+    getDisasterLossDetailList,
+    disasterLossDetailList,
   };
 };

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

@@ -4,6 +4,7 @@ import path from 'path';
 // staff环境
 const proxyStaff: PROXY_TYPE = {
   serverHost: 'http://192.168.13.68:8802/',
+  // serverHost: 'http://192.168.22.146:8802/',
   loginHost: 'http://192.168.13.68:7200/login/#/',
   fileUploadHost: 'http://192.168.13.102:9000/',
   push_stream_host: 'http://192.168.13.69:8080',