Sfoglia il codice sorgente

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

# Conflicts:
#	src/types/components.d.ts
lizhouming 6 mesi fa
parent
commit
a388200805

+ 22 - 2
src/api/inspectionWork/inspector.ts

@@ -31,7 +31,7 @@ export function inspectorDetail(id) {
     params: id
   });
 }
-// 查询用户详情
+// 查询区划树
 export function inspectorDivision(params) {
   return request({
     url: '/api/riskManagement/allAreas',
@@ -139,7 +139,7 @@ export function resultList(children_task_id, queryParams) {
     }
   });
 }
-// 查询用户详情
+// 文件下载
 export function fileDownload(url) {
   return request({
     url: '/api/file/download/' + url,
@@ -147,3 +147,23 @@ export function fileDownload(url) {
     params: url
   });
 }
+// 查询巡查已完成果列表
+export function patrolNum(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/inspection/task/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/inspection/task/children/task/log/' + children_task_id + '/' + 'incomplete' + '/list',
+    method: 'get',
+    params: {
+      area_code: queryParams.area_code
+    }
+  });
+}

+ 66 - 1
src/api/inspectionWork/riskManagement.ts

@@ -30,7 +30,7 @@ export function addtask(data) {
 export function getRiskDetail(id: string) {
   return request({
     url: '/api/riskManagement/risk/' + id,
-    method: 'get',
+    method: 'get'
   });
 }
 
@@ -43,3 +43,68 @@ export const deleteRisk = (data) => {
   });
 };
 
+//子任务列表
+export const getSubtaskList = (task_id: string) => {
+  return request({
+    url: `/api/riskManagement/risk/children/task/${task_id}/list`,
+    method: 'get'
+  });
+};
+
+//查询结果
+export const getSubtaskResultList = (children_task_id: string) => {
+  return request({
+    url: `/api/riskManagement/risk/children/task/result/${children_task_id}/list`,
+    method: 'get'
+  });
+};
+// 查询区划树
+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/risk/children/task/result/' + children_task_id + '/list',
+    method: 'get',
+    params: {
+      page: queryParams.page,
+      pageSize: queryParams.pageSize,
+      inspection_result: queryParams.inspection_result,
+      area_code: queryParams.area,
+      nick_name: queryParams.nick_name
+    }
+  });
+}
+// 文件下载
+export function fileDownload(url) {
+  return request({
+    url: '/api/file/download/' + url,
+    method: 'get',
+    params: url
+  });
+}
+// 查询风险未完成列表
+export function patrolNum_1(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/risk/children/task/log/' + children_task_id + '/' + 'incomplete' + '/list',
+    method: 'get',
+    params: {
+      area_code: queryParams.area_code
+    }
+  });
+}
+// 查询风险已完成列表
+export function patrolNum(children_task_id, queryParams) {
+  return request({
+    url: '/api/riskManagement/risk/children/task/log/' + children_task_id + '/' + 'completed' + '/list',
+    method: 'get',
+    params: {
+      area_code: queryParams.area_code
+    }
+  });
+}

+ 9 - 0
src/assets/styles/index.scss

@@ -805,3 +805,12 @@ aside {
   top: 12px;
   left: 55px;
 }
+
+.amap-marker {
+  .amap-icon {
+    img {
+      width: 100%;
+      height: 100%;
+    }
+  }
+}

+ 40 - 40
src/assets/styles/variables.module.scss

@@ -22,46 +22,46 @@
   // ele
   --brder-color: #e8e8e8
 }
-html.dark {
-  --menuBg: #1d1e1f;
-  --menuColor: #bfcbd9;
-  --menuActiveText: #f4f4f5;
-  --menuHover: #2c81ff;
-
-  --subMenuBg: #0f2942;
-  --subMenuActiveText: #1d1e1f;
-  --subMenuHover: #2c81ff;
-  --subMenuTitleHover: #2c81ff;
-
-  --fixedHeaderBg: #171819;
-  --tableHeaderBg: var(--el-bg-color);
-  --tableHeaderTextColor: var(--el-text-color);
-
-  // 覆盖ele 高亮当前行的标准暗色
-  .el-tree-node__content {
-    --el-color-primary-light-9: #262727;
-  }
-  // vxe-table 主题
-  --vxe-font-color: #98989E;
-  --vxe-primary-color: #2C7ECF;
-  --vxe-icon-background-color: #98989E;
-  --vxe-table-font-color: #98989E;
-  --vxe-table-resizable-color: #95969a;
-  --vxe-table-header-background-color: #28282A;
-  --vxe-table-body-background-color: #151518;
-  --vxe-table-background-color: #4a5663;
-  --vxe-table-border-width: 1px;
-  --vxe-table-border-color: #37373A;
-  --vxe-toolbar-background-color: #37373A;
-
-  // 工作流
-  --bpmn-panel-border: #37373A;
-  --bpmn-panel-box-shadow: #37373A;
-  --bpmn-panel-bar-background-color: #37373A;
-
-  // ele
-  --brder-color: #37373A
-}
+//html.dark {
+//  --menuBg: #1d1e1f;
+//  --menuColor: #bfcbd9;
+//  --menuActiveText: #f4f4f5;
+//  --menuHover: #2c81ff;
+//
+//  --subMenuBg: #0f2942;
+//  --subMenuActiveText: #1d1e1f;
+//  --subMenuHover: #2c81ff;
+//  --subMenuTitleHover: #2c81ff;
+//
+//  --fixedHeaderBg: #171819;
+//  --tableHeaderBg: var(--el-bg-color);
+//  --tableHeaderTextColor: var(--el-text-color);
+//
+//  // 覆盖ele 高亮当前行的标准暗色
+//  .el-tree-node__content {
+//    --el-color-primary-light-9: #262727;
+//  }
+//  // vxe-table 主题
+//  --vxe-font-color: #98989E;
+//  --vxe-primary-color: #2C7ECF;
+//  --vxe-icon-background-color: #98989E;
+//  --vxe-table-font-color: #98989E;
+//  --vxe-table-resizable-color: #95969a;
+//  --vxe-table-header-background-color: #28282A;
+//  --vxe-table-body-background-color: #151518;
+//  --vxe-table-background-color: #4a5663;
+//  --vxe-table-border-width: 1px;
+//  --vxe-table-border-color: #37373A;
+//  --vxe-toolbar-background-color: #37373A;
+//
+//  // 工作流
+//  --bpmn-panel-border: #37373A;
+//  --bpmn-panel-box-shadow: #37373A;
+//  --bpmn-panel-bar-background-color: #37373A;
+//
+//  // ele
+//  --brder-color: #37373A
+//}
 
 // base color
 $blue: #324157;

+ 1 - 1
src/components/LineWidthSelect/index.vue

@@ -18,7 +18,7 @@ interface Props {
   options: object[];
 }
 const props = withDefaults(defineProps<Props>(), {});
-const emits = defineEmits('update:modelValue');
+const emits = defineEmits(['update:modelValue']);
 
 let show = ref();
 const handleShow = () => {

+ 5 - 1
src/types/components.d.ts

@@ -23,6 +23,7 @@ declare module 'vue' {
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCard: typeof import('element-plus/es')['ElCard']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -42,6 +43,7 @@ declare module 'vue' {
     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']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
@@ -51,8 +53,9 @@ declare module 'vue' {
     ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
-    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
+    ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
     ElSlider: typeof import('element-plus/es')['ElSlider']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
@@ -78,6 +81,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']

+ 124 - 0
src/views/dataFilling/dossierDetail.vue

@@ -0,0 +1,124 @@
+<template>
+  <div class="app-container p-2">
+    <el-row :gutter="20">
+      <el-col :lg="30" :xs="24" style="">
+        <el-row :span="24" :gutter="10">
+          <el-col :span="18" label="任务名称">
+            <h2 v-if="detailData.title" key="business" style="font-weight: bolder">{{ detailData.title }}</h2>
+            <p class="report-period">【填报周期】:{{ detailData.start }} 至 {{ detailData.end }}</p>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="exportToExcel()"> 导出表格 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" @click="handleReturn()"> 返回 </el-button>
+          </el-col>
+        </el-row>
+      </el-col>
+      <el-col :lg="30" :xs="24">
+        <el-table :data="tableData" border>
+          <el-table-column v-for="header in editableHeaders" :key="header" :label="header" :prop="header">
+            <template #header="{ column }">
+              <span class="editable-header" v-text="column.label"></span>
+            </template>
+            <template #default="{ row, $index }">
+              <span class="editable-span" v-text="row[header]"></span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue';
+import { ElTable, ElButton, ElCol, ElRow, ElTableColumn } from 'element-plus';
+import * as XLSX from 'xlsx';
+
+const emits = defineEmits(['close']);
+const detailData = ref({
+  title: '测试表单',
+  start: '2024-10-15 17:02:22',
+  end: '2024-10-15 18:00:00'
+});
+
+const editableHeaders = ref(['时间', '地点', '损坏程度', '救援人员', '物资']);
+const tableData = ref([]);
+
+onMounted(() => {
+  loadFromLocalStorage();
+  addDefaultRow();
+});
+
+function loadFromLocalStorage() {
+  const storedData = localStorage.getItem('tableData');
+  if (storedData) {
+    tableData.value = JSON.parse(storedData);
+  } else {
+    tableData.value = [
+      {
+        时间: '2024-01-01',
+        地点: '某地',
+        损坏程度: '轻度',
+        救援人员: '张三, 李四',
+        物资: '食品, 水'
+      },
+      {
+        时间: '2024-01-02',
+        地点: '某地',
+        损坏程度: '中度',
+        救援人员: '王五, 赵六',
+        物资: '帐篷, 医疗用品'
+      }
+    ];
+  }
+}
+
+function addDefaultRow() {
+  tableData.value.push({
+    时间: '',
+    地点: '',
+    损坏程度: '',
+    救援人员: '',
+    物资: ''
+  });
+}
+
+const exportToExcel = () => {
+  const worksheet = XLSX.utils.json_to_sheet(tableData.value);
+  const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
+  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+
+  const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
+  const link = document.createElement('a');
+  const url = window.URL.createObjectURL(blob);
+  link.href = url;
+  link.download = 'SheetJS.xlsx';
+  link.click();
+  window.URL.revokeObjectURL(url); // 清理
+};
+const handleReturn = () => {
+  emits('close');
+};
+</script>
+
+<style scoped>
+.app-container {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  color: #2c3e50;
+}
+.report-period {
+  margin-top: 10px;
+  font-size: 14px;
+  color: #606266;
+}
+.editable-span {
+  cursor: default;
+}
+.editable-header {
+  cursor: default;
+}
+</style>

+ 125 - 0
src/views/dataFilling/fileManagement.vue

@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <div v-show=" !dossierDetailState.show" class="app-container">
+      <div>
+        <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="table_name" label-width="auto">
+                    <el-input v-model="queryParams.field_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-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column label="序号" align="center" prop="table_id" />
+          <el-table-column label="表格名称" align="center" prop="table_name" />
+          <el-table-column label="收取时间" align="center" prop="collect_time" />
+          <el-table-column label="收取状态" align="center" prop="collect_status" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template #default="scope">
+              <el-text v-if="scope.row.collect_status === '收取'" class="common-btn-text-primary" @click="handleWrite(scope.row)">收取</el-text>
+              <el-text class="common-btn-text-primary" @click="handleView(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>
+  </div>
+<!--  <WriteForm v-if="writeFormState.show" :event-id="writeFormState.eventId" @close="handleCancel" />-->
+  <dossierDetail v-if="dossierDetailState.show" :event-id="dossierDetailState.eventId" @close="handleCancel" />
+</template>
+<script setup lang="ts">
+import dossierDetail from "@/views/dataFilling/dossierDetail.vue";
+import {onMounted, reactive, ref} from "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([]);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const initFormData = reactive({
+  table_id: '',
+  table_name: '',
+  collect_time: '',
+  collect_status: ''
+});
+
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10,
+    field_name: '',
+  }
+});
+
+const { queryParams, form } = toRefs(data);
+
+const staticData = [
+  {
+    table_id: 1,
+    table_name: '旅游景点数据表单',
+    collect_time: '2024-10-15',
+    collect_status: '待填报'
+  },
+  {
+    table_id: 2,
+    table_name: '非煤矿山数据表单',
+    collect_time: '2024-10-16',
+    collect_status: '待填报'
+  },
+  {
+    table_id: 3,
+    table_name: '专家数据表单',
+    collect_time: '2024-10-17',
+    collect_status: '收取'
+  }
+];
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchWorkrData();
+};
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10, field_name: '' };
+  handleQuery();
+};
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+};
+//需要改动,这里的功能是收取
+const handleWrite = (row) => {
+  if (row) {
+    writeFormState.eventId = row.id;
+    writeFormState.show = true;
+  }
+};
+const handleView = (row) => {
+  if (row) {
+    dossierDetail.eventId = row.id;
+    dossierDetail.show = true;
+  }
+};
+let dossierDetailState = reactive({
+  show: false,
+  eventId: ''
+});
+onMounted(() => {
+  tableData.value = staticData;
+  total.value = staticData.length;
+  loading.value = false;
+});
+</script>

+ 16 - 103
src/views/globalMap/RightMenu/OnlinePlotting/TextEdit.vue

@@ -1,8 +1,6 @@
 <template>
-  <div v-show="modelValue" class="text-edit-container">
-    <div class="gradient-text title">编辑文案</div>
-    <div class="close-btn" @click="cancelEdit"></div>
-    <el-input v-model="textEditState.text" :rows="8" type="textarea" placeholder="请输入文案" />
+  <Dialog custom-show type="xs" title="编辑文案" height="330px" @close="cancelEdit" @confirm="addText">
+    <el-input v-model="textEditState.text" :rows="6" type="textarea" placeholder="请输入文案" />
     <div class="flex-box">
       <div class="edit-box">
         <div class="flex">
@@ -21,12 +19,8 @@
           <el-color-picker v-model="textEditState.fontColor" popper-class="custom-color-picker" />
         </div>
       </div>
-      <div class="edit-btn-box">
-        <div class="btn" @click="cancelEdit">取消</div>
-        <div class="btn2" @click="addText">确定</div>
-      </div>
     </div>
-  </div>
+  </Dialog>
 </template>
 
 <script lang="ts" setup>
@@ -67,50 +61,6 @@ const addText = () => {
 </script>
 
 <style lang="scss" scoped>
-.text-edit-container {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  width: 1569px;
-  height: 760px;
-  background: url('@/assets/images/map/rightMenu/onlinePlotting/dialog2.png') no-repeat;
-  font-size: 36px;
-  padding: 180px 40px 20px 40px;
-  font-size: 36px;
-  .flex-box {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-top: 40px;
-  }
-  .edit-box {
-    display: flex;
-    align-items: center;
-    .flex {
-      display: flex;
-      align-items: center;
-      flex: 1;
-      margin-right: 20px;
-    }
-    .text {
-      white-space: nowrap;
-      margin-right: 8px;
-      font-size: 38px;
-      color: #ffffff;
-    }
-  }
-  .edit-btn-box {
-    display: flex;
-    align-items: center;
-  }
-}
-.title {
-  font-size: 84px;
-  position: absolute;
-  top: 30px;
-  left: 70px;
-}
 .el-textarea {
   position: relative;
   &::before {
@@ -138,7 +88,7 @@ const addText = () => {
   box-shadow: none;
   background-color: #0a3b87;
   border: 1px solid #0d63c2;
-  font-size: 32px;
+  font-size: 16px;
   color: #a7ccdf;
   font-family: PingFang SC;
   &::placeholder {
@@ -146,25 +96,25 @@ const addText = () => {
   }
 }
 .color-container {
-  width: 80px;
-  height: 50px;
+  width: 26px;
+  height: 16px;
   display: flex;
   justify-content: center;
   align-items: center;
   position: relative;
   background-color: #0d3980;
-  border: 4px solid #0b5fbb;
-  margin-left: 20px;
+  border: 1px solid #0b5fbb;
+  margin-left: 5px;
   :deep(.el-color-picker) {
-    height: 60px !important;
+    height: 20px !important;
   }
   &::before {
     content: '';
     position: absolute;
     top: 0;
     left: 0;
-    width: 12px;
-    height: 12px;
+    width: 4px;
+    height: 4px;
     background: url('@/assets/images/inputIcon1.png') no-repeat;
   }
   &::after {
@@ -172,53 +122,16 @@ const addText = () => {
     position: absolute;
     right: 0;
     bottom: 0;
-    width: 12px;
-    height: 12px;
+    width: 4px;
+    height: 4px;
     background: url('@/assets/images/inputIcon2.png') no-repeat;
   }
 }
-.custom-select {
-  :deep(.el-select__wrapper) {
-    height: 50px !important;
-    line-height: 50px !important;
-    .el-select__placeholder {
-      height: 50px !important;
-      line-height: 50px !important;
-    }
-  }
+.flex-box {
+  margin-top: 10px;
 }
-.btn {
-  width: 140px;
-  height: 56px;
-  background: url('@/assets/images/map/rightMenu/onlinePlotting/btn2.png') no-repeat;
+.edit-box {
   display: flex;
-  justify-content: center;
   align-items: center;
-  cursor: pointer;
-  margin-left: 20px;
-  color: #a7ccdf;
-  font-size: 32px;
-}
-.btn2 {
-  width: 204px;
-  height: 120px;
-  background: url('@/assets/images/map/rightMenu/onlinePlotting/btn3.png') no-repeat;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-  margin-left: 20px;
-  color: #ffffff;
-  font-size: 32px;
-}
-.close-btn {
-  position: absolute;
-  top: 0px;
-  right: 0px;
-  width: 75px;
-  height: 70px;
-  background: url('@/assets/images/map/rightMenu/close.png') no-repeat;
-  background-size: 100% 100%;
-  cursor: pointer;
 }
 </style>

+ 69 - 69
src/views/globalMap/RightMenu/OnlinePlotting/index.vue

@@ -69,14 +69,14 @@
       </div>
     </div>
     <div v-else-if="menuActive1 === 1" class="tab-content3">
-      <div class="box1">
-        <div class="box-item">
-          <div class="btn">
-            <div class="merge-icon"></div>
-            合并
-          </div>
-        </div>
-      </div>
+<!--      <div class="box1">-->
+<!--        <div class="box-item">-->
+<!--          <div class="btn">-->
+<!--            <div class="merge-icon"></div>-->
+<!--            合并-->
+<!--          </div>-->
+<!--        </div>-->
+<!--      </div>-->
       <div class="params-box">
         <el-input v-model="queryParams.pattern_name" class="custom-input" placeholder="请输入" @input="handleQuery">
           <template #prefix>
@@ -103,11 +103,11 @@
               <div class="edit-icon"></div>
               编辑
             </div>
-            <div class="line2"></div>
-            <div class="btn">
-              <div class="share-icon"></div>
-              分享
-            </div>
+<!--            <div class="line2"></div>-->
+<!--            <div class="btn">-->
+<!--              <div class="share-icon"></div>-->
+<!--              分享-->
+<!--            </div>-->
           </div>
         </div>
         <div class="footer">
@@ -125,7 +125,7 @@
     </div>
   </div>
   <!--添加文字-->
-  <TextEdit v-model="showTextEdit" @add-text="addText" />
+  <TextEdit v-if="showTextEdit" v-model="showTextEdit" @add-text="addText" />
   <!--绘制提示信息-->
   <div v-show="tipTitle !== ''" class="tipTitle">{{ tipTitle }}</div>
   <!--保存修改弹窗-->
@@ -213,100 +213,100 @@ const menu = ref([
         name: '火点',
         value: 'firePoint',
         children: [
-          { name: '起火点', value: 'marker', image: getImageUrl('firePoint'), icon: getImageUrl('firePoint'), size: [166, 88] },
-          { name: '烟点', value: 'marker', image: getImageUrl('smokePoint'), icon: getImageUrl('smokePoint'), size: [166, 88] },
-          { name: '已灭火点', value: 'marker', image: getImageUrl('extinguishedPoint'), icon: getImageUrl('extinguishedPoint'), size: [166, 88] }
+          { name: '起火点', value: 'marker', image: getImageUrl('firePoint'), icon: getImageUrl('firePoint'), size: [55, 29] },
+          { name: '烟点', value: 'marker', image: getImageUrl('smokePoint'), icon: getImageUrl('smokePoint'), size: [55, 29] },
+          { name: '已灭火点', value: 'marker', image: getImageUrl('extinguishedPoint'), icon: getImageUrl('extinguishedPoint'), size: [55, 29] }
         ]
       },
       {
         name: '火线',
         value: 'firewire',
         children: [
-          { name: '火线', value: 'marker', image: getImageUrl('firewire'), icon: getImageUrl('firewire'), size: [166, 88] },
-          { name: '受控火线', value: 'marker', image: getImageUrl('controlledfireline'), icon: getImageUrl('controlledfireline'), size: [166, 88] },
-          { name: '已灭火线', value: 'marker', image: getImageUrl('extinguishedline'), icon: getImageUrl('extinguishedline'), size: [166, 88] },
-          { name: '强火线', value: 'marker', image: getImageUrl('StrongFrontline'), icon: getImageUrl('StrongFrontline'), size: [166, 88] },
-          { name: '中火线', value: 'marker', image: getImageUrl('ZhongxianLine'), icon: getImageUrl('ZhongxianLine'), size: [166, 88] },
-          { name: '弱火线', value: 'marker', image: getImageUrl('WeakFrontline'), icon: getImageUrl('WeakFrontline'), size: [166, 88] }
+          { name: '火线', value: 'marker', image: getImageUrl('firewire'), icon: getImageUrl('firewire'), size: [55, 29] },
+          { name: '受控火线', value: 'marker', image: getImageUrl('controlledfireline'), icon: getImageUrl('controlledfireline'), size: [55, 29] },
+          { name: '已灭火线', value: 'marker', image: getImageUrl('extinguishedline'), icon: getImageUrl('extinguishedline'), size: [55, 29] },
+          { name: '强火线', value: 'marker', image: getImageUrl('StrongFrontline'), icon: getImageUrl('StrongFrontline'), size: [55, 29] },
+          { name: '中火线', value: 'marker', image: getImageUrl('ZhongxianLine'), icon: getImageUrl('ZhongxianLine'), size: [55, 29] },
+          { name: '弱火线', value: 'marker', image: getImageUrl('WeakFrontline'), icon: getImageUrl('WeakFrontline'), size: [55, 29] }
         ]
       },
       {
         name: '火场',
         value: 'fireGround',
         children: [
-          { name: '火场', value: 'marker', image: getImageUrl('fireground'), icon: getImageUrl('fireground'), size: [166, 88] },
-          { name: '受控火场', value: 'marker', image: getImageUrl('controlledfireground'), icon: getImageUrl('controlledfireground'), size: [166, 88] },
-          { name: '已灭火场', value: 'marker', image: getImageUrl('extinguishedfireground'), icon: getImageUrl('extinguishedfireground'), size: [166, 88] }
+          { name: '火场', value: 'marker', image: getImageUrl('fireground'), icon: getImageUrl('fireground'), size: [55, 29] },
+          { name: '受控火场', value: 'marker', image: getImageUrl('controlledfireground'), icon: getImageUrl('controlledfireground'), size: [55, 29] },
+          { name: '已灭火场', value: 'marker', image: getImageUrl('extinguishedfireground'), icon: getImageUrl('extinguishedfireground'), size: [55, 29] }
         ]
       },
       {
         name: '箭头',
         value: 'arrow',
         children: [
-          { name: '曲箭头', value: 'marker', image: getImageUrl('curvedarrow'), icon: getImageUrl('curvedarrow'), size: [166, 88] },
-          { name: '直箭头', value: 'marker', image: getImageUrl('straightarrow1'), icon: getImageUrl('straightarrow1'), size: [166, 88] },
-          { name: '细箭头', value: 'marker', image: getImageUrl('thinarrow'), icon: getImageUrl('thinarrow'), size: [166, 88] }
-        ]
-      },
-      {
-        name: '导航',
-        value: 'navigation',
-        children: [
-          { name: '导航', value: 'marker', image: getImageUrl('navigation'), icon: getImageUrl('navigation'), size: [166, 88] }
+          { name: '曲箭头', value: 'marker', image: getImageUrl('curvedarrow'), icon: getImageUrl('curvedarrow'), size: [55, 29] },
+          { name: '直箭头', value: 'marker', image: getImageUrl('straightarrow1'), icon: getImageUrl('straightarrow1'), size: [55, 29] },
+          { name: '细箭头', value: 'marker', image: getImageUrl('thinarrow'), icon: getImageUrl('thinarrow'), size: [55, 29] }
         ]
       },
+      // {
+      //   name: '导航',
+      //   value: 'navigation',
+      //   children: [
+      //     { name: '导航', value: 'marker', image: getImageUrl('navigation'), icon: getImageUrl('navigation'), size: [55, 29] }
+      //   ]
+      // },
       {
         name: '扑救队伍',
         value: 'firefightingTeam',
         children: [
-          { name: '指挥中心', value: 'marker', image: getImageUrl('commandcentre'), icon: getImageUrl('commandcentre'), size: [166, 88] },
-          { name: '分指中心', value: 'marker', image: getImageUrl('dividingcenter'), icon: getImageUrl('dividingcenter'), size: [166, 88] },
-          { name: '集结地', value: 'marker', image: getImageUrl('rendezvous'), icon: getImageUrl('rendezvous'), size: [166, 88] },
-          { name: '军队', value: 'marker', image: getImageUrl('army'), icon: getImageUrl('army'), size: [166, 88] },
-          { name: '武警', value: 'marker', image: getImageUrl('armedpolice'), icon: getImageUrl('armedpolice'), size: [166, 88] },
-          { name: '森林警察', value: 'marker', image: getImageUrl('forestpoliceman'), icon: getImageUrl('forestpoliceman'), size: [166, 88] },
-          { name: '扑火队伍', value: 'marker', image: getImageUrl('firefightingteam'), icon: getImageUrl('firefightingteam'), size: [166, 88] },
-          { name: '扑火队伍路线', value: 'marker', image: getImageUrl('Firefightingteamroute'), icon: getImageUrl('Firefightingteamroute'), size: [166, 88] }
+          { name: '指挥中心', value: 'marker', image: getImageUrl('commandcentre'), icon: getImageUrl('commandcentre'), size: [55, 29] },
+          { name: '分指中心', value: 'marker', image: getImageUrl('dividingcenter'), icon: getImageUrl('dividingcenter'), size: [55, 29] },
+          { name: '集结地', value: 'marker', image: getImageUrl('rendezvous'), icon: getImageUrl('rendezvous'), size: [55, 29] },
+          { name: '军队', value: 'marker', image: getImageUrl('army'), icon: getImageUrl('army'), size: [55, 29] },
+          { name: '武警', value: 'marker', image: getImageUrl('armedpolice'), icon: getImageUrl('armedpolice'), size: [55, 29] },
+          { name: '森林警察', value: 'marker', image: getImageUrl('forestpoliceman'), icon: getImageUrl('forestpoliceman'), size: [55, 29] },
+          { name: '扑火队伍', value: 'marker', image: getImageUrl('firefightingteam'), icon: getImageUrl('firefightingteam'), size: [55, 29] },
+          // { name: '扑火队伍路线', value: 'marker', image: getImageUrl('Firefightingteamroute'), icon: getImageUrl('Firefightingteamroute'), size: [55, 29] }
         ]
       },
       {
         name: '飞机车辆',
         value: 'aircraftVehicles',
         children: [
-          { name: '固定翼', value: 'marker', image: getImageUrl('fixedwing'), icon: getImageUrl('fixedwing'), size: [166, 88] },
-          { name: '直升机', value: 'marker', image: getImageUrl('helicopter'), icon: getImageUrl('helicopter'), size: [166, 88] },
-          { name: '无人机', value: 'marker', image: getImageUrl('UAV'), icon: getImageUrl('UAV'), size: [166, 88] },
-          { name: '指挥车', value: 'marker', image: getImageUrl('commandvehicle'), icon: getImageUrl('commandvehicle'), size: [166, 88] },
-          { name: '飞机航线设置', value: 'marker', image: getImageUrl('aircraftroutesetting'), icon: getImageUrl('aircraftroutesetting'), size: [166, 88] },
-          { name: '直升机航线设置', value: 'marker', image: getImageUrl('helicopterroutesetting'), icon: getImageUrl('helicopterroutesetting'), size: [166, 88] }
+          { name: '固定翼', value: 'marker', image: getImageUrl('fixedwing'), icon: getImageUrl('fixedwing'), size: [55, 29] },
+          { name: '直升机', value: 'marker', image: getImageUrl('helicopter'), icon: getImageUrl('helicopter'), size: [55, 29] },
+          { name: '无人机', value: 'marker', image: getImageUrl('UAV'), icon: getImageUrl('UAV'), size: [55, 29] },
+          { name: '指挥车', value: 'marker', image: getImageUrl('commandvehicle'), icon: getImageUrl('commandvehicle'), size: [55, 29] },
+          { name: '飞机航线设置', value: 'marker', image: getImageUrl('aircraftroutesetting'), icon: getImageUrl('aircraftroutesetting'), size: [55, 29] },
+          { name: '直升机航线设置', value: 'marker', image: getImageUrl('helicopterroutesetting'), icon: getImageUrl('helicopterroutesetting'), size: [55, 29] }
         ]
       },
       {
         name: '基础设置',
         value: 'basicSetting',
         children: [
-          { name: '航站', value: 'marker', image: getImageUrl('terminal'), icon: getImageUrl('terminal'), size: [166, 88] },
-          { name: '起降点', value: 'marker', image: getImageUrl('takeoffandlandingpoint'), icon: getImageUrl('takeoffandlandingpoint'), size: [166, 88] },
-          { name: '取水点', value: 'marker', image: getImageUrl('waterpoint'), icon: getImageUrl('waterpoint'), size: [166, 88] },
-          { name: '瞭望塔', value: 'marker', image: getImageUrl('watchtower'), icon: getImageUrl('watchtower'), size: [166, 88] },
-          { name: '物资库', value: 'marker', image: getImageUrl('materialwarehouse'), icon: getImageUrl('materialwarehouse'), size: [166, 88] },
+          { name: '航站', value: 'marker', image: getImageUrl('terminal'), icon: getImageUrl('terminal'), size: [55, 29] },
+          { name: '起降点', value: 'marker', image: getImageUrl('takeoffandlandingpoint'), icon: getImageUrl('takeoffandlandingpoint'), size: [55, 29] },
+          { name: '取水点', value: 'marker', image: getImageUrl('waterpoint'), icon: getImageUrl('waterpoint'), size: [55, 29] },
+          { name: '瞭望塔', value: 'marker', image: getImageUrl('watchtower'), icon: getImageUrl('watchtower'), size: [55, 29] },
+          { name: '物资库', value: 'marker', image: getImageUrl('materialwarehouse'), icon: getImageUrl('materialwarehouse'), size: [55, 29] },
 
         ]
       },
-      {
-        name: '其他',
-        value: 'other',
-        children: [
-          { name: '危险区域', value: 'marker', image: getImageUrl('dangerousarea'), icon: getImageUrl('dangerousarea'), size: [166, 88] },
-          { name: '隔离带开采', value: 'marker', image: getImageUrl('Isolationzonemining'), icon: getImageUrl('Isolationzonemining'), size: [166, 88] },
-          { name: '应急庇护场所', value: 'marker', image: getImageUrl('emergencyshelter'), icon: getImageUrl('emergencyshelter'), size: [166, 88] },
-          { name: '风力风向', value: 'marker', image: getImageUrl('windspeedanddirection'), icon: getImageUrl('windspeedanddirection'), size: [166, 88] },
-          { name: '测距', value: 'marker', image: getImageUrl('ranging'), icon: getImageUrl('ranging'), size: [166, 88] },
-          { name: '大风', value: 'marker', image: getImageUrl('strongwind'), icon: getImageUrl('strongwind'), size: [166, 88] },
-          { name: '人工降雨', value: 'marker', image: getImageUrl('artificialrainfall'), icon: getImageUrl('artificialrainfall'), size: [166, 88] },
-          { name: '台风', value: 'marker', image: getImageUrl('typhoon'), icon: getImageUrl('typhoon'), size: [166, 88] }
-        ]
-      }
+      // {
+      //   name: '其他',
+      //   value: 'other',
+      //   children: [
+      //     { name: '危险区域', value: 'marker', image: getImageUrl('dangerousarea'), icon: getImageUrl('dangerousarea'), size: [55, 29] },
+      //     { name: '隔离带开采', value: 'marker', image: getImageUrl('Isolationzonemining'), icon: getImageUrl('Isolationzonemining'), size: [55, 29] },
+      //     { name: '应急庇护场所', value: 'marker', image: getImageUrl('emergencyshelter'), icon: getImageUrl('emergencyshelter'), size: [55, 29] },
+      //     { name: '风力风向', value: 'marker', image: getImageUrl('windspeedanddirection'), icon: getImageUrl('windspeedanddirection'), size: [55, 29] },
+      //     { name: '测距', value: 'marker', image: getImageUrl('ranging'), icon: getImageUrl('ranging'), size: [55, 29] },
+      //     { name: '大风', value: 'marker', image: getImageUrl('strongwind'), icon: getImageUrl('strongwind'), size: [55, 29] },
+      //     { name: '人工降雨', value: 'marker', image: getImageUrl('artificialrainfall'), icon: getImageUrl('artificialrainfall'), size: [55, 29] },
+      //     { name: '台风', value: 'marker', image: getImageUrl('typhoon'), icon: getImageUrl('typhoon'), size: [55, 29] }
+      //   ]
+      // }
     ]
   },
   {

+ 149 - 0
src/views/inspectionWork/completed.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/inspector';
+
+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>

+ 149 - 0
src/views/inspectionWork/incompleted.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/inspector';
+
+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>

+ 38 - 4
src/views/inspectionWork/patrolSubTasks.vue

@@ -47,8 +47,16 @@
             <el-table-column label="巡查周期" align="center" :formatter="(row) => cycleMap[row.cycle]" />
             <el-table-column label="巡查范围" align="center" :formatter="(row) => inspectionRangeMap[row.inspection_range]" />
             <el-table-column label="执行日期" align="center" prop="create_time" />
-            <el-table-column label="已完成" align="center" prop="completed_num" />
-            <el-table-column label="未完成" align="center" prop="incomplete_num" />
+            <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>
@@ -65,9 +73,11 @@
         </el-card>
       </el-col>
     </el-row>
-    <PatrolSubResult v-if="patrolSubResultState.show" :event-id="patrolSubResultState.eventId" @close="handleCancel" />
-    <PatrolTaskEdit v-if="patrolTaskEditState.show" :event-id="patrolTaskEditState.eventId" @close="handleCancel" @refresh-parent="refreshBoth" />
   </div>
+  <PatrolSubResult v-if="patrolSubResultState.show" :event-id="patrolSubResultState.eventId" @close="handleCancel" />
+  <PatrolTaskEdit v-if="patrolTaskEditState.show" :event-id="patrolTaskEditState.eventId" @close="handleCancel" @refresh-parent="refreshBoth" />
+  <Completed v-if="completedState.show" :event-id="completedState.eventId" @close="handleCancel" />
+  <Incompleted v-if="incompletedState.show" :event-id="incompletedState.eventId" @close="handleCancel" />
 </template>
 <script setup lang="ts">
 import { workDetail, workSubList, updatetask, deleteRisk } from '@/api/inspectionWork/inspector';
@@ -75,6 +85,8 @@ import { reactive, ref } from 'vue';
 import { ElMessageBox } from 'element-plus';
 import PatrolSubResult from './patrolSubResult.vue';
 import PatrolTaskEdit from './patrolTaskEdit.vue';
+import Completed from './completed.vue';
+import Incompleted from './incompleted.vue';
 import { to } from 'await-to-js';
 const props = defineProps<{ eventId: string }>();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -150,9 +162,19 @@ let patrolSubResultState = reactive({
   show: false,
   eventId: ''
 });
+let completedState = reactive({
+  show: false,
+  eventId: ''
+});
+let incompletedState = reactive({
+  show: false,
+  eventId: ''
+});
 const handleCancel = () => {
   patrolTaskEditState.show = false;
   patrolSubResultState.show = false;
+  completedState.show = false;
+  incompletedState.show = false;
 };
 const handleUpdate = () => {
   patrolTaskEditState.eventId = props.eventId; // 假设eventId是id字段
@@ -164,6 +186,18 @@ const handleResult = (row) => {
     patrolSubResultState.show = true;
   }
 };
+const handleCompletedClick = (row) => {
+  if (row) {
+    completedState.eventId = row.id; // 假设eventId是id字段
+    completedState.show = true;
+  }
+};
+const handleIncompletedClick = (row) => {
+  if (row) {
+    incompletedState.eventId = row.id; // 假设eventId是id字段
+    incompletedState.show = true;
+  }
+};
 const loading = ref(false);
 const fetchWorkDetail = () => {
   loading.value = true;

+ 28 - 2
src/views/inspectionWork/riskManagement.vue

@@ -103,8 +103,34 @@
                 <el-radio value="4" size="large">一次</el-radio>
               </el-radio-group>
             </el-form-item>
-            <el-form-item  label="选择时间:" prop="corn_query">
-              <el-date-picker v-model="form.corn_query" type="dates" placeholder="选择日期时间"></el-date-picker>
+            <el-form-item v-if="form.cycle ==='0'" label="选择时间:" prop="corn_query">
+              <el-date-picker v-model="form.corn_query" type="date" placeholder="选择日期时间" value-format="YYYY-MM-DD"></el-date-picker>
+            </el-form-item>
+            <el-form-item v-if="form.cycle ==='1'" label="选择时间:" prop="corn_query">
+              <el-date-picker v-model="form.corn_query" type="date" placeholder="选择日期时间" value-format="MM-DD"></el-date-picker>
+            </el-form-item>
+            <el-form-item v-if="form.cycle === '2'" label="选择时间:" prop="corn_query">
+              <div class="weekday-selector">
+                <el-radio-group v-model="form.corn_query">
+                  <el-radio label="1">周一</el-radio>
+                  <el-radio label="2">周二</el-radio>
+                  <el-radio label="3">周三</el-radio>
+                  <el-radio label="4">周四</el-radio>
+                  <el-radio label="5">周五</el-radio>
+                  <el-radio label="6">周六</el-radio>
+                  <el-radio label="7">周日</el-radio>
+                </el-radio-group>
+              </div>
+            </el-form-item>
+            <el-form-item v-if="form.cycle ==='3'" label="选择时间:" prop="corn_query">
+              <el-date-picker v-model="form.corn_query" type="datetime" placeholder="选择日期时间"
+                              format="YYYY-MM-DD HH:mm:ss"
+              ></el-date-picker>
+            </el-form-item>
+            <el-form-item v-if="form.cycle ==='4'" label="选择时间:" prop="corn_query">
+              <el-date-picker v-model="form.corn_query" type="datetime" placeholder="选择日期时间"
+                              format="HH:mm:ss"
+              ></el-date-picker>
             </el-form-item>
             <el-form-item label="排查范围:" prop="task_range">
               <el-radio-group v-model="form.task_range">

+ 239 - 0
src/views/inspectionWork/riskResult.vue

@@ -0,0 +1,239 @@
+<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="inspection_result" label-width="auto">
+                    <el-select v-model="queryParams.inspection_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.inspection_result) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="现场照片" align="center" prop="fileList">
+            <template #default="{ row }">
+              <div v-if="row.fileList && row.fileList.length > 0">
+                <img v-for="file in row.fileList" :key="file.uid" :src="file.previewUrl" alt="" style="max-width: 100px" />
+              </div>
+              <div v-else>无图片</div>
+            </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, fileDownload } from '@/api/inspectionWork/riskManagement';
+import { ElMessage } from 'element-plus';
+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: '',
+  inspection_result: '',
+  remark: '',
+  fileList: []
+});
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10,
+    inspection_result: '',
+    area_code: '',
+    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) => {
+      if (res.code === 200) {
+        tableData.value = res.data || []; // 确保tableData是一个数组
+        total.value = res.total || 0; // 确保total是一个数字
+        console.log('Fetched subtasks data:', tableData.value);
+      } else {
+        console.error(res.msg);
+      }
+      loading.value = false; // 结束加载
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+      loading.value = false; // 结束加载
+    });
+};
+const loadFilePreviews = (rowData) => {
+  if (rowData.fileList && rowData.fileList.length > 0) {
+    for (const file of rowData.fileList) {
+      try {
+        fileDownload(file.url)
+          .then((response) => {
+            if (response && response.data) {
+              file.previewUrl = URL.createObjectURL(new Blob([response.data]));
+            }
+          })
+          .catch((error) => {
+            console.error(`Failed to load image at ${file.url}:`, error);
+          });
+      } catch (error) {
+        console.error(`Failed to start download for ${file.url}:`, error);
+      }
+    }
+  }
+};
+const fetchAndLoadPreviews = () => {
+  fetchResulData().then(() => {
+    tableData.value.forEach(loadFilePreviews);
+  });
+};
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchResulData();
+};
+const handleExport = () => {
+  ElMessage.info("导出成功");
+};
+// 重置查询条件
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10, nick_name: '', area_code: '', inspection_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>

+ 149 - 0
src/views/inspectionWork/risk_completed.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/riskManagement';
+
+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>

+ 149 - 0
src/views/inspectionWork/risk_incomplete.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/riskManagement';
+
+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>

+ 202 - 51
src/views/inspectionWork/riskdetails.vue

@@ -12,7 +12,7 @@
         </el-form-item>
         <el-row :span="24" :gutter="10">
           <el-col :span="20" label="预案名称">
-<!--            <h2 key="planName" style="font-weight: bolder">{{ detailData.type }}</h2>-->
+            <!--            <h2 key="planName" style="font-weight: bolder">{{ detailData.type }}</h2>-->
             <div class="td">
               <template v-if="detailData.type === '0'">
                 <div>风险源排查</div>
@@ -24,7 +24,7 @@
                 <div>危险源排查</div>
               </template>
             </div>
-        </el-col>
+          </el-col>
           <el-col :span="1.5">
             <el-button class="common-btn-text-primary" type="primary" @click="planUpdate()"> 编辑 </el-button>
           </el-col>
@@ -57,46 +57,53 @@
             </el-descriptions-item>
           </el-descriptions>
         </el-card>
+      </el-col>
+      <el-col :lg="30" :xs="24">
         <h3>子任务记录</h3>
-        <el-table :data="tableData" style="width: 100%; margin-top: 20px">
-          <el-table-column prop="riskSourceType" label="风险源类型" width="150">
-            <template #default="scope">
-              <dict-tag :options="plan_type" :value="scope.row.riskSourceType" style="display: inline-block" />
-            </template>
-          </el-table-column>
-          <el-table-column prop="requiredCheckTime" label="要求排查时间" width="150"></el-table-column>
-          <el-table-column prop="checkCycle" label="排查周期" width="150"></el-table-column>
-          <el-table-column prop="checkRange" label="排查范围" width="150"></el-table-column>
-          <el-table-column prop="executionDate" label="执行日期" width="150"></el-table-column>
-          <el-table-column prop="completed" label="已完成" width="100">
-            <template #default="scope">
-              <span @click="handleClick(scope.row.completed, 'completed')">{{ scope.row.completed }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="uncompleted" label="未完成" width="100">
-            <template #default="scope">
-              <span @click="handleClick(scope.row.uncompleted, 'uncompleted')">{{ scope.row.uncompleted }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="操作" width="150">
-            <template #default="scope">
-              <el-button size="small" @click="handleresult(scope.$index, scope.row)">巡查结果</el-button>
-            </template>
-          </el-table-column>
-        </el-table>
+        <el-card style="margin-top: 10px" shadow="hover">
+          <el-table ref="multipleTable" v-loading="loading" :data="subtaskData" style="width: 100%">
+            <el-table-column label="风险源类型" align="center" prop="type" width="150">
+              <template #default="scope">
+                <dict-tag :options="risk_type" :value="scope.row.type" style="display: inline-block" />
+              </template>
+            </el-table-column>
+            <el-table-column prop="task_time" label="要求排查时间" width="150" />
+            <el-table-column label="排查周期" align="center" prop="cycle" width="150">
+              <template #default="scope">
+                <dict-tag :options="risk_cycle" :value="scope.row.cycle" style="display: inline-block" />
+              </template>
+            </el-table-column>
+            <el-table-column label="排查范围" align="center" prop="task_range" width="150">
+              <template #default="scope">
+                <dict-tag :options="risk_range" :value="scope.row.task_range" style="display: inline-block" />
+              </template>
+            </el-table-column>
+            <el-table-column prop="create_time" label="执行日期" width="150" />
+            <el-table-column prop="completed_num" label="已完成" width="100">
+              <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 prop="incomplete_num" label="未完成" width="100">
+              <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="操作" width="150">
+              <template #default="scope">
+                <el-text class="common-btn-text-primary" @click="handleResult(scope.row)">巡查结果</el-text>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
       </el-col>
     </el-row>
     <!-- 修改弹窗 -->
     <el-dialog v-model="visible" title="修改任务" width="500px" append-to-body>
       <el-form ref="demoFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="风险源类型:" prop="type" >
+        <el-form-item label="风险源类型:" prop="type">
           <el-select v-model="form.type" placeholder="请选择风险源排查类型">
-            <el-option
-              v-for="item in risk_type"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
-            </el-option>
+            <el-option v-for="item in risk_type" :key="item.value" :label="item.label" :value="item.value"> </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="排查时间范围:" prop="publish">
@@ -112,15 +119,37 @@
             <el-radio value="4" size="large">一次</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item  label="选择时间:" prop="corn_query">
-          <el-date-picker v-model="form.corn_query" type="dates" placeholder="选择日期时间"></el-date-picker>
+        <el-form-item v-if="form.cycle === '0'" label="选择时间:" prop="corn_query">
+          <el-date-picker v-model="form.corn_query" type="date" placeholder="选择日期时间" value-format="YYYY-MM-DD"></el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="form.cycle === '1'" label="选择时间:" prop="corn_query">
+          <el-date-picker v-model="form.corn_query" type="month" placeholder="选择日期时间" value-format="MM"></el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="form.cycle === '2'" label="选择时间:" prop="corn_query">
+          <div class="weekday-selector">
+            <el-radio-group v-model="form.corn_query">
+              <el-radio label="1">周一</el-radio>
+              <el-radio label="2">周二</el-radio>
+              <el-radio label="3">周三</el-radio>
+              <el-radio label="4">周四</el-radio>
+              <el-radio label="5">周五</el-radio>
+              <el-radio label="6">周六</el-radio>
+              <el-radio label="7">周日</el-radio>
+            </el-radio-group>
+          </div>
+        </el-form-item>
+        <el-form-item v-if="form.cycle === '3'" label="选择时间:" prop="corn_query">
+          <el-date-picker v-model="form.corn_query" type="datetime" placeholder="选择日期时间" format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="form.cycle === '4'" label="选择时间:" prop="corn_query">
+          <el-date-picker v-model="form.corn_query" type="datetime" placeholder="选择日期时间" format="HH:mm:ss"></el-date-picker>
         </el-form-item>
         <el-form-item label="排查范围:" prop="task_range">
           <el-radio-group v-model="form.task_range">
-            <el-radio  value="0" size="large">市级</el-radio>
-            <el-radio  value="1" size="large">区县级</el-radio>
-            <el-radio  value="2" size="large">镇街级</el-radio>
-            <el-radio  value="3" size="large">村居级</el-radio>
+            <el-radio value="0" size="large">市级</el-radio>
+            <el-radio value="1" size="large">区县级</el-radio>
+            <el-radio value="2" size="large">镇街级</el-radio>
+            <el-radio value="3" size="large">村居级</el-radio>
           </el-radio-group>
         </el-form-item>
       </el-form>
@@ -129,23 +158,101 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    <!--    巡查结果-->
+    <el-dialog v-model="visible" title="巡查结果" width="500px" append-to-body>
+      <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="inspection_result" label-width="auto">
+                <el-select v-model="queryParams.inspection_result" placeholder="全部" clearable>
+                  <el-option v-for="item in risk_result" :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>
+      <!--      表格组件-->
+      <el-table v-loading="loading" :data="SubtaskResultList" border style="width: 100%">
+        <el-table-column prop="point_name" label="排查点" align="center" width="180" />
+        <el-table-column prop="area" label="所属区划" width="180" />
+        <el-table-column prop="create_time" label="执行日期" width="180" />
+        <el-table-column prop="nick_name" label="排查人" width="180" />
+        <el-table-column prop="result" label="排查结果" />
+        <el-table-column prop="fileList" label="现场照片" />
+        <el-table-column prop="remark" label="备注" />
+      </el-table>
+      <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+    </el-dialog>
   </div>
+  <RiskResult v-if="riskResultState.show" :event-id="riskResultState.eventId" @close="handleCancel" />
+  <RiskCompleted v-if="risk_completedState.show" :event-id="risk_completedState.eventId" @close="handleCancel" />
+  <RiskIncomplete v-if="risk_incompleteState.show" :event-id="risk_incompleteState.eventId" @close="handleCancel" />
 </template>
 
 <script setup name="planList" lang="ts">
 import { to } from 'await-to-js';
-import { deletePlan, getPlanDetail} from '@/api/riskPrevention/planManage';
-import  { ElMessageBox } from 'element-plus';
-import {deleteRisk, getRiskDetail, updatetask} from "@/api/inspectionWork/riskManagement";
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { deleteRisk, getRiskDetail, updatetask, getSubtaskList, getSubtaskResultList } from '@/api/inspectionWork/riskManagement';
+import { reactive, ref } from 'vue';
+import RiskResult from './riskResult.vue';
+import RiskCompleted from './risk_completed.vue';
+import RiskIncomplete from './risk_incomplete.vue';
+const divisionSelectedId = ref(null);
+const formattedDivisionData = ref([]);
+const onDivisionChange = (value) => {
+  // 确认选中的项存在
+  const selectedDivision = findNode(formattedDivisionData.value, value);
+  if (!selectedDivision) {
+    ElMessage.warning('未找到匹配的责任区划。');
+    // 将选中的值重置为 null 或空字符串,防止后续逻辑错误
+    divisionSelectedId.value = null;
+  } else {
+    console.log('Selected Division:', selectedDivision); // 调试输出
+  }
+};
+const queryParams = reactive({
+  page: 1,
+  pageSize: '10',
+  inspection_result: '',
+  area_code: '',
+  nick_name: ''
+});
+const { page, pageSize } = toRefs(queryParams);
 const router = useRouter();
-
 const goBack = () => {
   proxy?.$tab.closePage();
 };
 
 const route = useRoute();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { mm_event_type, risk_type,risk_range,risk_cycle,risk_status } = toRefs<any>(proxy?.useDict('risk_type', 'mm_event_type', 'risk_range','risk_cycle','risk_status'));
+const { risk_type, risk_range, risk_cycle, risk_status, risk_result } = toRefs<any>(
+  proxy?.useDict('risk_type', 'risk_range', 'risk_cycle', 'risk_status', 'risk_result')
+);
+const subtaskData = ref([]);
+const SubtaskResultList = ref([]);
 
 //已完成/未完成的页面跳转
 const handleClick = (value: number, type: string) => {
@@ -163,7 +270,7 @@ const handleClick = (value: number, type: string) => {
 };
 
 // 预案编辑
-let detailData = ref({
+const detailData = ref({
   // id: '',
   type: '',
   start_time: '',
@@ -172,6 +279,7 @@ let detailData = ref({
   corn_query: '',
   task_range: ''
 });
+
 let id = ref();
 let task_number = ref();
 let visible = ref(false);
@@ -188,7 +296,41 @@ let form = ref({
   corn_query: '',
   task_range: ''
 });
-
+let riskResultState = reactive({
+  show: false,
+  eventId: ''
+});
+let risk_completedState = reactive({
+  show: false,
+  eventId: ''
+});
+let risk_incompleteState = reactive({
+  show: false,
+  eventId: ''
+});
+const handleCancel = () => {
+  riskResultState.show = false;
+  risk_completedState.show = false;
+  risk_incompleteState.show = false;
+};
+const handleResult = (row) => {
+  if (row) {
+    riskResultState.eventId = row.id; // 假设eventId是id字段
+    riskResultState.show = true;
+  }
+};
+const handleCompletedClick = (row) => {
+  if (row) {
+    risk_completedState.eventId = row.id; // 假设eventId是id字段
+    risk_completedState.show = true;
+  }
+};
+const handleIncompletedClick = (row) => {
+  if (row) {
+    risk_incompleteState.eventId = row.id; // 假设eventId是id字段
+    risk_incompleteState.show = true;
+  }
+};
 /** 编辑按钮操作 */
 const planUpdate = async () => {
   resetForm();
@@ -265,14 +407,23 @@ const submitForm = () => {
   });
 };
 
-
-
 onMounted(() => {
   task_number.value = route.query.id;
   getRiskDetail(task_number.value).then((res) => {
     detailData.value = res.data;
   });
+  getSubtaskList(task_number.value).then((res) => {
+    subtaskData.value = res.data;
+  });
+  // getSubtaskResultList(subtaskData.value[0]?.id).then((res) => {
+  //   SubtaskResultList.value = res.data;
+  // });
 });
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.clickable-number {
+  color: blue;
+  cursor: pointer;
+}
+</style>