소스 검색

救援要素巡查结果、详情、已完成、未完成界面和接口调试+我的填报的数据提交接口调试+创建物资申报和调度路径

zhangyihao 9 달 전
부모
커밋
4d72ba16f8

+ 1 - 1
src/api/inspectionWork/inspector.ts

@@ -134,7 +134,7 @@ export function resultList(children_task_id, queryParams) {
       page: queryParams.page,
       pageSize: queryParams.pageSize,
       inspection_result: queryParams.inspection_result,
-      area_code: queryParams.area,
+      area: queryParams.area,
       nick_name: queryParams.nick_name
     }
   });

+ 52 - 0
src/api/inspectionWork/rescueResources.ts

@@ -36,3 +36,55 @@ export function workDetail(id) {
     params: id
   });
 }
+export function workSubList(task_id) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/children/task/' + task_id + '/list',
+    method: 'get',
+    params: task_id
+  });
+}
+export const deleteRisk = (id) => {
+  return request({
+    url: '/api/riskManagement/rescue/resources/delete/' + id,
+    method: 'delete',
+    params: id
+  });
+};
+export function inspectorDivision(params) {
+  return request({
+    url: '/api/riskManagement/allAreas',
+    method: 'get',
+    params: params
+  });
+}
+export function resultList(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/children/task/result/' + children_task_id + '/list',
+    method: 'get',
+    params: {
+      page: queryParams.page,
+      pageSize: queryParams.pageSize,
+      result: queryParams.result,
+      area: queryParams.area,
+      nick_name: queryParams.nick_name
+    }
+  });
+}
+export function patrolNum(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/children/task/log/' + children_task_id + '/' + 'completed' + '/list',
+    method: 'get',
+    params: {
+      area_code: queryParams.area_code
+    }
+  });
+}
+export function patrolNum_1(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/children/task/log/' + children_task_id + '/' + 'incomplete' + '/list',
+    method: 'get',
+    params: {
+      area_code: queryParams.area_code
+    }
+  });
+}

+ 160 - 0
src/views/comprehensiveGuarantee/materialReserves/materialsDeclaration.vue

@@ -0,0 +1,160 @@
+<template>
+  <div>
+    <div v-show="!viewState.show" class="app-container">
+      <div>
+        <!-- 表格组件 -->
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" style="width: 100%" :max-height="400">
+          <el-table-column label="序号" align="center" width="55" fixed="left">
+            <template #default="scope">
+              {{ (queryParams.page - 1) * queryParams.pageSize + scope.$index + 1 }}
+            </template>
+          </el-table-column>
+          <el-table-column label="姓名" align="center" prop="name" width="100" fixed="left" />
+          <el-table-column label="所属区县" align="center" prop="county" />
+          <el-table-column label="专家类型" align="center" prop="expert_type" />
+          <el-table-column label="职位" align="center" prop="position" />
+          <el-table-column label="单位" align="center" prop="unit" />
+          <el-table-column label="联系电话" align="center" prop="phone" />
+          <el-table-column label="现在地址" align="center" prop="address" />
+          <el-table-column label="状态" align="center" prop="status" />
+          <el-table-column label="擅长事故类型" align="center" prop="accident_type" />
+          <el-table-column label="救援经历" align="center" prop="rescue_experience" />
+          <el-table-column label="出生日期" align="center" prop="birthdate" />
+          <el-table-column label="工作日期" align="center" prop="work_date" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
+            <template #default="scope">
+              <el-text class="common-btn-text-primary" @click="handleView(scope.row)">查看</el-text>
+              <el-text class="common-btn-text-primary" @click="handleUpdate(scope.row)">修改</el-text>
+              <el-text class="common-btn-text-primary" @click="handlePhone(scope.row)">连线</el-text>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="tableData" />
+      </div>
+    </div>
+    <View v-if="viewState.show" :event-id="viewState.eventId" @close="handleCancel" />
+    <Edit v-if="editState.show" :event-id="editState.eventId" @close="handleCancel" />
+  </div>
+</template>
+<script setup lang="ts">
+import { onMounted, reactive, ref, toRefs } from 'vue';
+import { ElTable, ElTableColumn, ElForm, ElFormItem, ElInput, ElButton, ElText } from 'element-plus';
+import { ComponentInternalInstance, getCurrentInstance } from 'vue';
+import View from './view.vue';
+import Edit from './edit.vue';
+const loading = ref(true);
+const showSearch = ref(true);
+const multiple = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const total = ref(0);
+const tableData = ref<PatrolVO[]>([]);
+const selectedRow = ref<PatrolVO | null>(null);
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const initFormData = reactive({
+  name: '',
+  county: '',
+  expert_type: '',
+  position: '',
+  unit: '',
+  phone: '',
+  address: '',
+  status: '',
+  accident_type: '',
+  rescue_experience: '',
+  birthdate: '',
+  work_date: ''
+});
+
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10
+  }
+});
+
+const { queryParams, form } = toRefs(data);
+
+
+const fetchWorkrData = () => {
+  loading.value = true;
+  const mockData = [
+    {
+      id: 1,
+      name: '张三',
+      county: '海淀区',
+      expert_type: '技术专家',
+      position: '工程师',
+      unit: '某科技公司',
+      phone: '13800000000',
+      address: '北京市海淀区XX路XX号',
+      status: '在线',
+      accident_type: '网络故障',
+      rescue_experience: '5年以上',
+      birthdate: '1990-01-01',
+      work_date: '2015-01-01'
+    },
+    {
+      id: 2,
+      name: '李四',
+      county: '朝阳区',
+      expert_type: '安全专家',
+      position: '高级安全顾问',
+      unit: '某安全咨询公司',
+      phone: '13800000001',
+      address: '北京市朝阳区XX路XX号',
+      status: '离线',
+      accident_type: '安全事故',
+      rescue_experience: '10年以上',
+      birthdate: '1985-01-01',
+      work_date: '2010-01-01'
+    }
+  ];
+
+  tableData.value = mockData;
+  total.value = mockData.length;
+
+  loading.value = false;
+};
+
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchWorkrData();
+};
+
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10 };
+  handleQuery();
+};
+let viewState = reactive({
+  show: false,
+  eventId: ''
+});
+let editState = reactive({
+  show: false,
+  eventId: ''
+});
+const handleView = () => {
+  // viewState.eventId = row.id;
+  viewState.show = true;
+};
+const handleUpdate = () => {
+  // editState.eventId = row.id;
+  editState.show = true;
+};
+const handleCancel = () => {
+  viewState.show = false;
+  editState.show = false;
+};
+onMounted(() => {
+  fetchWorkrData();
+});
+</script>
+<style scoped>
+.app-container {
+  overflow-x: auto; /* 当内容溢出时允许水平滚动 */
+}
+</style>

+ 11 - 0
src/views/comprehensiveGuarantee/materialReserves/materialsdistribution.vue

@@ -0,0 +1,11 @@
+<script setup lang="ts">
+
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 10 - 4
src/views/dataFilling/writeForm.vue

@@ -79,7 +79,7 @@ const detailData = ref({
 
 const editableHeaders = ref<string[]>([]);
 const tableData = ref<any[]>([]);
-
+const headerMapping = ref<{ [key: string]: string }>({});
 // 获取表头数据
 const fetchHeaders = async () => {
   try {
@@ -87,6 +87,11 @@ const fetchHeaders = async () => {
     if (response.code === 200) {
       const headers = response.fields.map((field) => field.field_comment);
       editableHeaders.value = headers;
+
+      // 填充映射
+      response.fields.forEach(field => {
+        headerMapping.value[field.field_comment] = field.field_name;
+      });
     } else {
       console.error('获取表头失败:', response.msg);
     }
@@ -152,9 +157,10 @@ const handleReport = async () => {
   try {
     const mappedData = tableData.value.map((row) => {
       const mappedRow: any = {};
-      editableHeaders.value.forEach((header) => {
-        if (row[header.field_name] !== undefined) {
-          mappedRow[header.field_name] = row[header.field_name];
+      Object.keys(row).forEach((header) => {
+        const fieldName = headerMapping.value[header];
+        if (fieldName) {
+          mappedRow[fieldName] = row[header];
         }
       });
       return mappedRow;

+ 2 - 2
src/views/inspectionWork/patrolSubResult.vue

@@ -110,7 +110,7 @@ const data = reactive({
     page: 1,
     pageSize: 10,
     inspection_result: '',
-    area_code: '',
+    area: '',
     nick_name: ''
   }
 });
@@ -164,7 +164,7 @@ const handleExport = () => {
 };
 // 重置查询条件
 const resetQuery = () => {
-  queryParams.value = { page: 1, pageSize: 10, nick_name: '', area_code: '', inspection_result: '' };
+  queryParams.value = { page: 1, pageSize: 10, nick_name: '', area: '', inspection_result: '' };
   handleQuery();
 };
 const handleSelectionChange = (selection) => {

+ 12 - 7
src/views/inspectionWork/rescueResources.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-show="!patrolSubTasksState.show && !rescueResourcesAddState.show" class="app-container">
+    <div v-show="!rescueResourcesDetailState.show && !rescueResourcesAddState.show" class="app-container">
       <div>
         <transition name="fade">
           <div v-show="showSearch">
@@ -75,7 +75,12 @@
         <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="tableData" />
       </div>
     </div>
-    <PatrolSubTasks v-if="patrolSubTasksState.show" :event-id="patrolSubTasksState.eventId" @close="handleCancel" @refreshsub="fetchWorkrData" />
+    <RescueResourcesDetail
+      v-if="rescueResourcesDetailState.show"
+      :event-id="rescueResourcesDetailState.eventId"
+      @close="handleCancel"
+      @refreshsub="fetchWorkrData"
+    />
     <RescueResourcesEdit
       v-if="rescueResourcesEditState.show"
       :event-id="rescueResourcesEditState.eventId"
@@ -87,7 +92,7 @@
 </template>
 <script setup lang="ts">
 import { onMounted, reactive, ref } from 'vue';
-import PatrolSubTasks from './patrolSubTasks.vue';
+import RescueResourcesDetail from './rescueResourcesDetail.vue';
 import RescueResourcesAdd from './rescueResourcesAdd.vue';
 import RescueResourcesEdit from './rescueResourcesEdit.vue';
 import { workList, workDelete, updatetask } from '@/api/inspectionWork/rescueResources';
@@ -182,7 +187,7 @@ function convertStatus(value, types) {
 
   return statusMapping[types]?.[value] || value;
 }
-let patrolSubTasksState = reactive({
+let rescueResourcesDetailState = reactive({
   show: false,
   eventId: ''
 });
@@ -194,14 +199,14 @@ let rescueResourcesEditState = reactive({
   eventId: ''
 });
 const handleCancel = () => {
-  patrolSubTasksState.show = false;
+  rescueResourcesDetailState.show = false;
   rescueResourcesAddState.show = false;
   rescueResourcesEditState.show = false;
 };
 const openPatrolSubTasks = (row) => {
   if (row) {
-    patrolSubTasksState.eventId = row.id + ''; // 假设eventId是id字段
-    patrolSubTasksState.show = true;
+    rescueResourcesDetailState.eventId = row.id + ''; // 假设eventId是id字段
+    rescueResourcesDetailState.show = true;
   }
 };
 const handleAdd = () => {

+ 149 - 0
src/views/inspectionWork/rescueResourcesCompleted.vue

@@ -0,0 +1,149 @@
+<template>
+  <el-dialog v-model="showSearch" title="已完成" width="80%" @close="$emit('close')">
+    <el-row :gutter="20">
+      <el-col :lg="4" :xs="24">
+        <el-tree
+          ref="deptTreeRef"
+          class="mt-2"
+          node-key="id"
+          :data="deptOptions"
+          :props="{ label: 'label', children: 'children' }"
+          :expand-on-click-node="false"
+          :filter-node-method="filterNode"
+          highlight-current
+          default-expand-all
+          @node-click="handleNodeClick"
+        />
+      </el-col>
+      <el-col :lg="20" :xs="24">
+        <transition name="fade">
+          <div v-show="showSearch">
+            <el-form ref="queryFormRef" :model="queryParams">
+              <el-button type="primary" @click="handleExport">导出</el-button>
+            </el-form>
+          </div>
+        </transition>
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column label="排查范围" align="center" prop="area" />
+          <el-table-column label="任务进度" align="center" prop="task_status">
+            <!-- 使用自定义槽来渲染转换后的文本 -->
+            <template #default="scope">
+              {{ formatStatus(scope.row.task_status) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="排查人员" align="center" prop="nick_name" />
+          <el-table-column label="上报时间" align="center" prop="create_time" />
+        </el-table>
+      </el-col>
+    </el-row>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { onMounted, reactive, ref, watch } from 'vue';
+import { useRouter } from 'vue-router';
+import { inspectorDivision, patrolNum } from '@/api/inspectionWork/rescueResources';
+
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const deptOptions = ref([]);
+const deptTreeRef = ref(null);
+const tableData = ref([]);
+const props = defineProps<{ eventId: string }>();
+
+const initFormData = reactive({
+  area: '',
+  task_status: '',
+  yzy_organization: '',
+  nick_name: '',
+  create_time: ''
+});
+
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    area_code: '',
+    deptId: ''
+  }
+});
+
+const { queryParams, form } = toRefs(data);
+const formatStatus = (status) => {
+  return Number(status) === 1 ? '已完成' : '未完成';
+};
+
+const filterNode = (value: string, data: any) => {
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
+};
+
+const getTreeSelect = async () => {
+  const res = await inspectorDivision();
+  if (res.code === 200) {
+    deptOptions.value = res.data; // 将部门树数据赋值给deptOptions
+  } else {
+    console.error(res.msg);
+  }
+  loading.value = false; // 加载完成后关闭加载提示
+};
+
+const fetchUserData = async () => {
+  loading.value = true; // 开始加载
+
+  // 构造请求参数
+  const params = {
+    ...queryParams.value,
+    // 只在area_code有值时添加到请求参数中
+    ...(queryParams.value.area_code ? { area_code: queryParams.value.area_code } : {})
+  };
+
+  return patrolNum(props.eventId, params)
+    .then((res) => {
+      if (res.code === 200) {
+        tableData.value = res.data; // 确保tableData是一个数组
+        total.value = res.total;
+      } else {
+        console.error(res.msg);
+      }
+      loading.value = false; // 结束加载
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+      loading.value = false; // 结束加载
+    });
+};
+
+watch(queryParams, () => {
+  fetchUserData();
+});
+
+const handleNodeClick = (data: any) => {
+  queryParams.value.deptId = data.id;
+  queryParams.value.area_code = data.code; // 设置area_code为点击节点的code值
+  fetchUserData();
+};
+
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+};
+
+onMounted(async () => {
+  await getTreeSelect();
+  fetchUserData();
+});
+</script>
+
+<style scoped>
+.mt-2 {
+  max-width: 300px; /* 设置最大宽度 */
+  max-height: 800px; /* 设置最大高度 */
+  overflow-y: auto; /* 如果内容超出高度则显示滚动条 */
+}
+</style>

+ 292 - 0
src/views/inspectionWork/rescueResourcesDetail.vue

@@ -0,0 +1,292 @@
+<template>
+  <div class="app-container p-2">
+    <el-row :gutter="20">
+      <!-- 基础信息 -->
+      <el-col :lg="30" :xs="24" style="">
+        <el-form-item>
+          <div class="back-btn" @click="goBack">
+            <el-icon><Back /></el-icon>
+            返回上一级
+          </div>
+        </el-form-item>
+        <el-row :span="24" :gutter="10">
+          <el-col :span="20" label="任务名称">
+            <h2 key="type" style="font-weight: bolder">{{ detailData.type }}</h2>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="handleUpdate()"> 编辑 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="handlefinal()"> 完成任务 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" @click="handleDelete()"> 删除 </el-button>
+          </el-col>
+        </el-row>
+        <div class="line" style="background: #e7e7e7; width: auto; height: 0.6px; position: relative"></div>
+        <h3>基础信息</h3>
+        <el-card style="margin-top: 10px" shadow="hover">
+          <el-descriptions title="">
+            <el-descriptions-item key="task_number" label="任务编号:">{{ detailData.task_number }}</el-descriptions-item>
+            <el-descriptions-item key="type" label="巡查业务:">{{ detailData.type }}</el-descriptions-item>
+            <el-descriptions-item key="create_by" label="创建人:">{{ detailData.create_by }}</el-descriptions-item>
+            <el-descriptions-item key="create_time" label="创建时间:">{{ detailData.create_time }}</el-descriptions-item>
+            <el-descriptions-item key="task_time" label="巡查时间范围:">{{ detailData.task_time }}</el-descriptions-item>
+            <el-descriptions-item key="cycle" label="巡查周期:">{{ detailData.cycle }}</el-descriptions-item>
+            <el-descriptions-item key="task_range" label="巡查范围:">{{ detailData.task_range }}</el-descriptions-item>
+            <el-descriptions-item key="task_status" label="任务状态:">{{ detailData.task_status }}</el-descriptions-item>
+          </el-descriptions>
+        </el-card>
+      </el-col>
+      <el-col :lg="30" :xs="24">
+        <h3>子任务记录</h3>
+        <el-card style="margin-top: 10px" shadow="hover">
+          <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+            <el-table-column label="巡查业务" align="center" :formatter="(row) => typeMap[row.type]" />
+            <el-table-column label="要求巡查时间" align="center" prop="task_time" />
+            <el-table-column label="巡查周期" align="center" :formatter="(row) => cycleMap[row.cycle]" />
+            <el-table-column label="巡查范围" align="center" :formatter="(row) => taskRangeMap[row.task_range]" />
+            <el-table-column label="执行日期" align="center" prop="create_time" />
+            <el-table-column label="已完成" align="center" prop="completed_num">
+              <template #default="scope">
+                <el-text class="common-btn-text-primary" @click="handleCompletedClick(scope.row)">{{ scope.row.completed_num }}</el-text>
+              </template>
+            </el-table-column>
+            <el-table-column label="未完成" align="center" prop="incomplete_num">
+              <template #default="scope">
+                <el-text class="common-btn-text-primary" @click="handleIncompletedClick(scope.row)">{{ scope.row.incomplete_num }}</el-text>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+              <template #default="scope">
+                <el-text class="common-btn-text-primary" @click="handleResult(scope.row)">巡查结果</el-text>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination
+            v-show="total > 0"
+            v-model:page="queryParams.page"
+            v-model:limit="queryParams.pageSize"
+            :total="total"
+            @pagination="fetchSubTasks"
+          />
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+  <RescueResourcesResult v-if="rescueResourcesResultState.show" :event-id="rescueResourcesResultState.eventId" @close="handleCancel" />
+  <RescueResourcesEdit
+    v-if="rescueResourcesEditState.show"
+    :event-id="rescueResourcesEditState.eventId"
+    @close="handleCancel"
+    @refresh-parent="refreshBoth"
+  />
+  <RescueResourcesCompleted v-if="rescueResourcesCompletedState.show" :event-id="rescueResourcesCompletedState.eventId" @close="handleCancel" />
+  <RescueResourcesIncomplete v-if="rescueResourcesIncompleteState.show" :event-id="rescueResourcesIncompleteState.eventId" @close="handleCancel" />
+</template>
+<script setup lang="ts">
+import { workDetail, workSubList, updatetask, deleteRisk } from '@/api/inspectionWork/rescueResources';
+import { reactive, ref } from 'vue';
+import { ElMessageBox } from 'element-plus';
+import RescueResourcesResult from './rescueResourcesResult.vue';
+import RescueResourcesEdit from './rescueResourcesEdit.vue';
+import RescueResourcesCompleted from './rescueResourcesCompleted.vue';
+import RescueResourcesIncomplete from './rescueResourcesIncomplete.vue';
+import { to } from 'await-to-js';
+const props = defineProps<{ eventId: string }>();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const total = ref(0);
+const tableData = ref([]);
+const multiple = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const emits = defineEmits(['close']);
+const detailData = ref({
+  task_number: '',
+  type: '',
+  task_time: '',
+  cycle: '',
+  id: '',
+  task_range: '',
+  task_status: '',
+  create_time: '',
+  create_by: ''
+});
+const initFormData = reactive({
+  finished: '',
+  type: '',
+  task_time: '',
+  cycle: '',
+  id: '',
+  task_range: '',
+  run_time: '',
+  unfinished: ''
+});
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10
+  }
+});
+const { queryParams, form } = toRefs(data);
+// 映射表
+const typeMap = {
+  0: '庇护场所',
+  1: '救援队伍',
+  2: '救援设备'
+};
+
+const cycleMap = {
+  0: '每年',
+  1: '每月',
+  2: '每周',
+  3: '每日',
+  4: '一次'
+};
+
+const taskRangeMap = {
+  0: '市级',
+  1: '区县级',
+  2: '镇街级',
+  3: '村居级'
+};
+
+const taskStatusMap = {
+  0: '未开始',
+  1: '进行中',
+  2: '未完成',
+  3: '已完结'
+};
+let rescueResourcesEditState = reactive({
+  show: false,
+  eventId: ''
+});
+let rescueResourcesResultState = reactive({
+  show: false,
+  eventId: ''
+});
+let rescueResourcesCompletedState = reactive({
+  show: false,
+  eventId: ''
+});
+let rescueResourcesIncompleteState = reactive({
+  show: false,
+  eventId: ''
+});
+const handleCancel = () => {
+  rescueResourcesEditState.show = false;
+  rescueResourcesResultState.show = false;
+  rescueResourcesCompletedState.show = false;
+  rescueResourcesIncompleteState.show = false;
+};
+const handleUpdate = () => {
+  rescueResourcesEditState.eventId = props.eventId; // 假设eventId是id字段
+  rescueResourcesEditState.show = true;
+};
+const handleResult = (row) => {
+  if (row) {
+    rescueResourcesResultState.eventId = row.id; // 假设eventId是id字段
+    rescueResourcesResultState.show = true;
+  }
+};
+const handleCompletedClick = (row) => {
+  if (row) {
+    rescueResourcesCompletedState.eventId = row.id; // 假设eventId是id字段
+    rescueResourcesCompletedState.show = true;
+  }
+};
+const handleIncompletedClick = (row) => {
+  if (row) {
+    rescueResourcesIncompleteState.eventId = row.id; // 假设eventId是id字段
+    rescueResourcesIncompleteState.show = true;
+  }
+};
+const loading = ref(false);
+const fetchWorkDetail = () => {
+  loading.value = true;
+  workDetail(props.eventId) // 使用从父组件接收到的eventId
+    .then((res) => {
+      if (res.code === 200) {
+        let data = res.data;
+        // 转换type
+        data.type = typeMap[data.type] || '未知';
+        // 转换cycle
+        data.cycle = cycleMap[data.cycle] || '未知';
+        // 转换task_range
+        data.task_range = taskRangeMap[data.task_range] || '未知';
+        // 转换task_status
+        data.task_status = taskStatusMap[data.task_status] || '未知';
+
+        detailData.value = data; // 将转换后的数据赋值给detailData
+      } else {
+        console.error(res.msg);
+      }
+    })
+    .finally(() => {
+      loading.value = false;
+    });
+};
+const fetchSubTasks = () => {
+  return workSubList(props.eventId, queryParams.value)
+    .then((res) => {
+      if (res.code === 200) {
+        tableData.value = res.data;
+        total.value = res.total;
+        console.log('Fetched subtasks data:', tableData.value);
+      } else {
+        console.error(res.msg);
+      }
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+    });
+};
+const handleDelete = async () => {
+  const [err] = await to(proxy?.$modal.confirm('是否确认删除?') as any);
+  if (!err) {
+    await deleteRisk([props.eventId]);
+    proxy?.$modal.msgSuccess('删除成功');
+    emits('close');
+    emits('refreshsub');
+  }
+};
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+const handlefinal = async () => {
+  try {
+    const confirmed = await ElMessageBox.confirm('确定要完结任务吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+    if (confirmed) {
+      try {
+        await updatetask({ id: props.eventId, task_status: '3' });
+        console.log(`任务 ${props.eventId} 已完结`);
+        fetchWorkDetail();
+      } catch (error) {
+        console.error(`任务 ${props.eventId} 完结失败:`, error);
+      }
+    } else {
+      console.log(`任务 ${props.eventId} 未完结`);
+    }
+  } catch (error) {
+    console.error('确认对话框处理失败:', error);
+  }
+};
+const goBack = () => {
+  emits('close');
+};
+const refreshBoth = () => {
+  fetchWorkDetail();
+  fetchSubTasks();
+};
+onMounted(() => {
+  fetchWorkDetail(); // 在组件挂载后调用此函数以获取数据
+  fetchSubTasks();
+});
+</script>

+ 149 - 0
src/views/inspectionWork/rescueResourcesIncomplete.vue

@@ -0,0 +1,149 @@
+<template>
+  <el-dialog v-model="showSearch" title="未完成" width="80%" @close="$emit('close')">
+    <el-row :gutter="20">
+      <el-col :lg="4" :xs="24">
+        <el-tree
+          ref="deptTreeRef"
+          class="mt-2"
+          node-key="id"
+          :data="deptOptions"
+          :props="{ label: 'label', children: 'children' }"
+          :expand-on-click-node="false"
+          :filter-node-method="filterNode"
+          highlight-current
+          default-expand-all
+          @node-click="handleNodeClick"
+        />
+      </el-col>
+      <el-col :lg="20" :xs="24">
+        <transition name="fade">
+          <div v-show="showSearch">
+            <el-form ref="queryFormRef" :model="queryParams">
+              <el-button type="primary" @click="handleExport">导出</el-button>
+            </el-form>
+          </div>
+        </transition>
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column label="排查范围" align="center" prop="area" />
+          <el-table-column label="任务进度" align="center" prop="task_status">
+            <!-- 使用自定义槽来渲染转换后的文本 -->
+            <template #default="scope">
+              {{ formatStatus(scope.row.task_status) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="排查人员" align="center" prop="nick_name" />
+          <el-table-column label="上报时间" align="center" prop="create_time" />
+        </el-table>
+      </el-col>
+    </el-row>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { onMounted, reactive, ref, watch } from 'vue';
+import { useRouter } from 'vue-router';
+import { inspectorDivision, patrolNum_1 } from '@/api/inspectionWork/rescueResources';
+
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const deptOptions = ref([]);
+const deptTreeRef = ref(null);
+const tableData = ref([]);
+const props = defineProps<{ eventId: string }>();
+
+const initFormData = reactive({
+  area: '',
+  task_status: '',
+  yzy_organization: '',
+  nick_name: '',
+  create_time: ''
+});
+
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    area_code: '',
+    deptId: ''
+  }
+});
+
+const { queryParams, form } = toRefs(data);
+
+const formatStatus = (status) => {
+  return Number(status) === 1 ? '已完成' : '未完成';
+};
+
+const filterNode = (value: string, data: any) => {
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
+};
+
+const getTreeSelect = async () => {
+  const res = await inspectorDivision();
+  if (res.code === 200) {
+    deptOptions.value = res.data; // 将部门树数据赋值给deptOptions
+  } else {
+    console.error(res.msg);
+  }
+  loading.value = false; // 加载完成后关闭加载提示
+};
+
+const fetchUserData = async () => {
+  loading.value = true; // 开始加载
+
+  // 构造请求参数
+  const params = {
+    ...queryParams.value,
+    // 只在area_code有值时添加到请求参数中
+    ...(queryParams.value.area_code ? { area_code: queryParams.value.area_code } : {})
+  };
+
+  return patrolNum_1(props.eventId, params)
+    .then((res) => {
+      if (res.code === 200) {
+        tableData.value = res.data; // 确保tableData是一个数组
+        total.value = res.total;
+      } else {
+        console.error(res.msg);
+      }
+      loading.value = false; // 结束加载
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+      loading.value = false; // 结束加载
+    });
+};
+watch(queryParams, () => {
+  fetchUserData();
+});
+
+const handleNodeClick = (data: any) => {
+  queryParams.value.deptId = data.id;
+  queryParams.value.area_code = data.code; // 设置 area_code
+  fetchUserData(); // 调用 fetchUserData 函数更新表格数据
+};
+
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+};
+
+onMounted(async () => {
+  await getTreeSelect();
+  fetchUserData();
+});
+</script>
+
+<style scoped>
+.mt-2 {
+  max-width: 300px; /* 设置最大宽度 */
+  max-height: 800px; /* 设置最大高度 */
+  overflow-y: auto; /* 如果内容超出高度则显示滚动条 */
+}
+</style>

+ 226 - 0
src/views/inspectionWork/rescueResourcesResult.vue

@@ -0,0 +1,226 @@
+<template>
+  <div>
+    <el-dialog v-model="showSearch" title="采集结果" width="80%" @close="$emit('close')">
+      <div class="app-container">
+        <transition name="fade">
+          <div v-show="showSearch">
+            <el-form ref="queryFormRef" :model="queryParams">
+              <el-row :gutter="20">
+                <el-col :span="6">
+                  <el-form-item label="所属区划:" prop="area" label-width="auto">
+                    <el-tree-select
+                      v-model="divisionSelectedId"
+                      :data="formattedDivisionData"
+                      :props="{ label: 'label', value: 'code', children: 'children' }"
+                      :render-after-expand="false"
+                      style="width: 468px"
+                      @change="onDivisionChange"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="采集结果:" prop="result" label-width="auto">
+                    <el-select v-model="queryParams.result" placeholder="全部" clearable>
+                      <el-option v-for="item in cycleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item prop="nick_name" label-width="auto">
+                    <el-input v-model="queryParams.nick_name" placeholder="请输入排查人"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-button type="primary" @click="handleQuery">搜索</el-button>
+                  <el-button @click="resetQuery">重置</el-button>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
+        </transition>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" icon="Plus" @click="handleExport">导出</el-button>
+          </el-col>
+        </el-row>
+        <!-- 表格组件 -->
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column label="排查点" align="center" prop="point_name" />
+          <el-table-column label="所属区划" align="center" prop="area" />
+          <el-table-column label="执行日期" align="center" prop="create_time" />
+          <el-table-column label="排查人" align="center" prop="nick_name" />
+          <el-table-column label="排查结果" align="center">
+            <template #default="{ row }">
+              {{ getInspectionResultText(row.result) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="现场照片" align="center" prop="fileList">
+            <template #default="scope">
+              <el-image
+                style="width: 100px; height: 100px"
+                :src="scope.row.url"
+                :preview-src-list="scope.row.urlList"
+                :preview-teleported="true"
+                fit="cover"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="备注" align="center" prop="remark" />
+        </el-table>
+        <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="tableData" />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue';
+import { inspectorDivision, resultList } from '@/api/inspectionWork/inspector';
+import { ElMessage } from 'element-plus';
+const baseUrl = import.meta.env.VITE_APP_BASE_API;
+const downLoadApi = import.meta.env.VITE_APP_BASE_DOWNLOAD_API;
+const loading = ref(true);
+const showSearch = ref(true);
+const multiple = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const total = ref(0);
+const tableData = ref([]);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const divisionSelectedId = ref(null);
+const formattedDivisionData = ref([]);
+const rawDivisionData = ref([]);
+const props = defineProps<{
+  eventId: string | number;
+}>();
+const initFormData = reactive({
+  id: '',
+  children_task_id: '',
+  point_name: '',
+  area: '',
+  create_time: '',
+  nick_name: '',
+  result: '',
+  remark: '',
+  fileList: ''
+});
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10,
+    result: '',
+    area: '',
+    nick_name: ''
+  }
+});
+const { queryParams, form } = toRefs(data);
+const cycleOptions = ref([
+  { label: '全部', value: '' }, // 通常“全部”对应空值或者特定的标识符,表示不按此条件过滤
+  { label: '正常', value: '1' },
+  { label: '异常', value: '2' }
+]);
+const getInspectionResultText = (resultCode) => {
+  switch (resultCode) {
+    case '1':
+      return '正常';
+    case '2':
+      return '异常';
+    default:
+      return '全部';
+  }
+};
+
+const fetchResulData = () => {
+  loading.value = true; // 开始加载
+  return resultList(props.eventId, queryParams.value)
+    .then((res) => {
+      res.data.forEach((item) => {
+        if (item.fileList && item.fileList.length > 0) {
+          let urlList = [];
+          item.fileList.forEach((item2) => {
+            urlList.push(baseUrl + downLoadApi + item2.url);
+          });
+          item.urlList = urlList;
+          item.url = urlList[0];
+        }
+      });
+      tableData.value = res.data || []; // 确保tableData是一个数组
+      total.value = res.total || 0; // 确保total是一个数字
+      console.log('Fetched subtasks data:', tableData.value);
+      loading.value = false; // 结束加载
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+      loading.value = false; // 结束加载
+    });
+};
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchResulData();
+};
+const handleExport = () => {
+  ElMessage.info('导出成功');
+};
+// 重置查询条件
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10, nick_name: '', area: '', result: '' };
+  handleQuery();
+};
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+  selectedRow.value = selection.length === 1 ? selection[0] : null;
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+const fetchDivisionData = async () => {
+  const response = await inspectorDivision();
+  if (response.code === 200) {
+    rawDivisionData.value = response.data;
+    formattedDivisionData.value = formatDivisionData(rawDivisionData.value);
+    console.log('Formatted Division Data:', formattedDivisionData.value);
+  } else {
+    ElMessage.error(response.msg);
+  }
+};
+const onDivisionChange = (value) => {
+  // 确认选中的项存在
+  const selectedDivision = findNode(formattedDivisionData.value, value);
+  if (!selectedDivision) {
+    ElMessage.warning('未找到匹配的责任区划。');
+    // 将选中的值重置为 null 或空字符串,防止后续逻辑错误
+    divisionSelectedId.value = null;
+  } else {
+    console.log('Selected Division:', selectedDivision); // 调试输出
+  }
+};
+// 递归查找节点
+const findNode = (nodes, code) => {
+  for (let i = 0; i < nodes.length; i++) {
+    const node = nodes[i];
+    if (node.code === code) {
+      return node;
+    }
+    if (node.children && node.children.length > 0) {
+      const found = findNode(node.children, code);
+      if (found) {
+        return found;
+      }
+    }
+  }
+  return null;
+};
+// 格式化责任区划数据
+const formatDivisionData = (data) => {
+  return data.map((item) => ({
+    id: item.id,
+    label: item.label,
+    code: item.code,
+    children: item.children ? formatDivisionData(item.children) : []
+  }));
+};
+onMounted(() => {
+  fetchResulData();
+  fetchDivisionData();
+});
+</script>