Bläddra i källkod

巡查人员bug+救援要素首页、新增、修改页面及接口+应急专家管理首页、查看、修改静态页面

zhangyihao 7 månader sedan
förälder
incheckning
2fe697b00a

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

@@ -0,0 +1,38 @@
+import request from '@/utils/request';
+// 获取新建用户列表
+export function workList(params) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/list',
+    method: 'get',
+    params: params
+  });
+}
+// 删除巡查任务
+export function workDelete(data) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/delete',
+    method: 'delete',
+    data: data
+  });
+}
+export function updatetask(data) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/update',
+    method: 'put',
+    data: data
+  });
+}
+export function addtask(data) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/create',
+    method: 'post',
+    data: data
+  });
+}
+export function workDetail(id) {
+  return request({
+    url: '/api/riskManagement/rescue/resources/' + id,
+    method: 'get',
+    params: id
+  });
+}

+ 78 - 0
src/views/comprehensiveGuarantee/emergencySpecialistManagement/edit.vue

@@ -0,0 +1,78 @@
+<template>
+  <div class="common-dialog">
+    <div class="common-dialog-content">
+      <div class="common-dialog-title-box">
+        <h3 class="common-dialog-title">查看详情</h3>
+      </div>
+      <div class="common-dialog-box">
+        <el-form ref="form" :model="formData" :rules="rules" label-width="120px">
+          <el-form-item label="姓名:" prop="name">
+            <el-input v-model="formData.name" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="所属区县:" prop="county">
+            <el-input v-model="formData.county" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="专家类型:" prop="expert_type">
+            <el-input v-model="formData.expert_type" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="职位:" prop="position">
+            <el-input v-model="formData.position" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="单位:" prop="unit">
+            <el-input v-model="formData.unit" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="联系电话:" prop="phone">
+            <el-input v-model="formData.phone" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="现在地址:" prop="address">
+            <el-input v-model="formData.address" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="状态:" prop="status">
+            <el-input v-model="formData.status" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="擅长事故类型:" prop="accident_type">
+            <el-input v-model="formData.accident_type" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="救援经历:" prop="rescue_experience">
+            <el-input v-model="formData.rescue_experience" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="出生日期:" prop="birthdate">
+            <el-input v-model="formData.birthdate" style="width: 468px !important" />
+          </el-form-item>
+          <el-form-item label="工作日期:" prop="work_date">
+            <el-input v-model="formData.work_date" style="width: 468px !important" />
+          </el-form-item>
+        </el-form>
+        <div class="common-dialog-footer">
+          <el-button @click="closeDialog">取消</el-button>
+          <el-button type="primary" @click="submitForm">确定</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, watch } from 'vue';
+const emits = defineEmits(['close']);
+const props = defineProps<{
+  eventId: string | number;
+}>();
+const formData = ref({
+  name: '',
+  county: '',
+  expert_type: '',
+  position: '',
+  unit: '',
+  phone: '',
+  address: '',
+  status: '',
+  accident_type: '',
+  rescue_experience: '',
+  birthdate: '',
+  work_date: ''
+});
+const closeDialog = () => {
+  emits('close');
+};
+</script>
+<style scoped></style>

+ 177 - 0
src/views/comprehensiveGuarantee/emergencySpecialistManagement/index.vue

@@ -0,0 +1,177 @@
+<template>
+  <div>
+    <div v-show="!viewState.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="center">
+                    <el-input v-model="queryParams.center" placeholder="请输入内容" clearable />
+                  </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" 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>

+ 83 - 0
src/views/comprehensiveGuarantee/emergencySpecialistManagement/view.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="common-dialog">
+    <div class="common-dialog-content">
+      <div class="common-dialog-title-box">
+        <h3 class="common-dialog-title">查看详情</h3>
+      </div>
+      <div class="common-dialog-box">
+        <el-form ref="form" :model="formData" :rules="rules" label-width="120px">
+          <el-form-item label="姓名:" prop="name">
+            <el-input v-model="formData.name" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="所属区县:" prop="county">
+            <el-input v-model="formData.county" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="专家类型:" prop="expert_type">
+            <el-input v-model="formData.expert_type" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="职位:" prop="position">
+            <el-input v-model="formData.position" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="单位:" prop="unit">
+            <el-input v-model="formData.unit" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="联系电话:" prop="phone">
+            <el-input v-model="formData.phone" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="现在地址:" prop="address">
+            <el-input v-model="formData.address" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="状态:" prop="status">
+            <el-input v-model="formData.status" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="擅长事故类型:" prop="accident_type">
+            <el-input v-model="formData.accident_type" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="救援经历:" prop="rescue_experience">
+            <el-input v-model="formData.rescue_experience" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="出生日期:" prop="birthdate">
+            <el-input v-model="formData.birthdate" style="width: 468px !important" disabled />
+          </el-form-item>
+          <el-form-item label="工作日期:" prop="work_date">
+            <el-input v-model="formData.work_date" style="width: 468px !important" disabled />
+          </el-form-item>
+        </el-form>
+        <div class="common-dialog-footer">
+          <el-button type="primary" @click="closeDialog">返回</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, watch } from 'vue';
+
+const emits = defineEmits(['close']);
+const props = defineProps<{
+  eventId: string | number;
+}>();
+
+// 模拟的数据
+const formData = ref({
+  name: '张三',
+  county: '朝阳区',
+  expert_type: '安全工程',
+  position: '高级工程师',
+  unit: '北京市应急管理局',
+  phone: '13800138000',
+  address: '北京市朝阳区XX路XX号',
+  status: '在职',
+  accident_type: '火灾、爆炸',
+  rescue_experience: '参与过多次重大事故救援,经验丰富。',
+  birthdate: '1975-05-20',
+  work_date: '2000-01-01'
+});
+
+const closeDialog = () => {
+  emits('close');
+};
+</script>
+
+<style scoped></style>

+ 69 - 61
src/views/inspectionWork/inspector.vue

@@ -1,65 +1,73 @@
 <template>
-  <div v-show="!inspectorEditState.show && !inspectorAddState.show" class="app-container">
-    <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-row :gutter="20">
-                <el-col :span="8">
-                  <el-form-item prop="nickName">
-                    <el-input v-model="queryParams.nickName" placeholder="请输入巡查人员" clearable />
-                  </el-form-item>
-                </el-col>
-                <el-col :span="8">
-                  <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">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="Plus" @click="handleAdd()">新建</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Top" @click="handleImport()"> 批量导入 </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete(selectedRow)"> 删除 </el-button>
-          </el-col>
-        </el-row>
-        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
-          <el-table-column type="selection" width="55" align="center" />
-          <el-table-column label="姓名" align="center" prop="nickName" />
-          <el-table-column label="联系方式" align="center" prop="phone" />
-          <el-table-column label="粤政易组织" align="center" prop="yzy_organization" />
-          <el-table-column label="责任区划" align="center" prop="division_responsibility" />
-          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-            <template #default="scope">
-              <el-text class="common-btn-text-primary" @click="handleUpdate(scope.row)">编辑</el-text>
-              <el-text class="common-btn-text-danger" @click="handleDelete(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" />
-      </el-col>
-    </el-row>
+  <div>
+    <div v-show="!inspectorEditState.show && !inspectorAddState.show" class="app-container">
+      <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-row :gutter="20">
+                  <el-col :span="8">
+                    <el-form-item prop="nickName">
+                      <el-input v-model="queryParams.nickName" placeholder="请输入巡查人员" clearable />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="8">
+                    <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">
+            <el-col :span="1.5">
+              <el-button type="primary" icon="Plus" @click="handleAdd()">新建</el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="primary" plain icon="Top" @click="handleImport()"> 批量导入 </el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete(selectedRow)"> 删除 </el-button>
+            </el-col>
+          </el-row>
+          <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="姓名" align="center" prop="nickName" />
+            <el-table-column label="联系方式" align="center" prop="phone" />
+            <el-table-column label="粤政易组织" align="center" prop="yzy_organization" />
+            <el-table-column label="责任区划" align="center" prop="division_responsibility" />
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+              <template #default="scope">
+                <el-text class="common-btn-text-primary" @click="handleUpdate(scope.row)">编辑</el-text>
+                <el-text class="common-btn-text-danger" @click="handleDelete(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"
+          />
+        </el-col>
+      </el-row>
+    </div>
     <InspectorEdit v-if="inspectorEditState.show" :event-id="inspectorEditState.eventId" @close="handleCancel" />
     <InspectorAdd v-if="inspectorAddState.show" @close="handleCancel" @refresh="fetchUserData" />
   </div>

+ 282 - 0
src/views/inspectionWork/rescueResources.vue

@@ -0,0 +1,282 @@
+<template>
+  <div>
+    <div v-show="!patrolSubTasksState.show && !rescueResourcesAddState.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="type" label-width="auto">
+                    <el-select v-model="queryParams.type" placeholder="全部" clearable>
+                      <el-option v-for="item in typeOptions" :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 label="采集周期:" prop="cycle" label-width="auto">
+                    <el-select v-model="queryParams.cycle" 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-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="handleAdd">新建</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete(selectedRow)"> 删除 </el-button>
+          </el-col>
+        </el-row>
+        <!-- 表格组件 -->
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="任务编号" align="center" prop="task_number" />
+          <el-table-column label="采集业务" align="center">
+            <template #default="scope">
+              <el-text type="primary" @click="openPatrolSubTasks(scope.row)">{{ convertStatus(scope.row.type, 'type') }}</el-text>
+            </template>
+          </el-table-column>
+          <el-table-column label="采集时间范围" width="200" align="center" prop="task_time" />
+          <el-table-column label="采集周期" align="center">
+            <template #default="scope">
+              {{ convertStatus(scope.row.cycle, 'cycle') }}
+            </template>
+          </el-table-column>
+          <el-table-column label="采集范围" align="center">
+            <template #default="scope">
+              {{ convertStatus(scope.row.task_range, 'task_range') }}
+            </template>
+          </el-table-column>
+          <el-table-column label="创建人" align="center" prop="create_by" />
+          <el-table-column label="创建时间" align="center" prop="create_time" />
+          <el-table-column label="任务状态" align="center">
+            <template #default="scope">
+              {{ convertStatus(scope.row.task_status, 'task_status') }}
+            </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="handleUpdate(scope.row)">编辑</el-text>
+              <el-text v-if="scope.row.task_status !== '3'" class="common-btn-text-danger" @click="handleWork(scope.row)">完成任务</el-text>
+              <el-text class="common-btn-text-danger" @click="handleDelete(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>
+    <PatrolSubTasks v-if="patrolSubTasksState.show" :event-id="patrolSubTasksState.eventId" @close="handleCancel" @refreshsub="fetchWorkrData" />
+    <RescueResourcesEdit
+      v-if="rescueResourcesEditState.show"
+      :event-id="rescueResourcesEditState.eventId"
+      @close="handleCancel"
+      @refresh="fetchWorkrData"
+    />
+    <RescueResourcesAdd v-if="rescueResourcesAddState.show" @close="handleCancel" @refresh="fetchWorkrData" />
+  </div>
+</template>
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue';
+import PatrolSubTasks from './patrolSubTasks.vue';
+import RescueResourcesAdd from './rescueResourcesAdd.vue';
+import RescueResourcesEdit from './rescueResourcesEdit.vue';
+import { workList, workDelete, updatetask } from '@/api/inspectionWork/rescueResources';
+import { to } from 'await-to-js';
+import { ElMessageBox } 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 selectedRow = ref<RescueVO | null>(null);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+export interface RescueVO {
+  task_number: number;
+  type: string;
+  task_time: string;
+  cycle: number;
+  id: number;
+  task_range: number;
+  task_status: number;
+  create_time: string;
+  create_by: string;
+}
+const initFormData = reactive({
+  task_number: '',
+  type: '',
+  task_time: '',
+  cycle: '',
+  id: '',
+  task_range: '',
+  task_status: '',
+  create_time: '',
+  create_by: ''
+});
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10,
+    type: '',
+    cycle: ''
+  }
+});
+const { queryParams, form } = toRefs(data);
+// 巡查业务选项
+const typeOptions = [
+  { value: '', label: '全部' },
+  { value: '0', label: '庇护场所' },
+  { value: '1', label: '救援队伍' },
+  { value: '2', label: '救援设备' }
+];
+
+// 巡查周期选项
+const cycleOptions = [
+  { value: '', label: '全部' },
+  { value: '0', label: '每年' },
+  { value: '1', label: '每月' },
+  { value: '2', label: '每周' },
+  { value: '3', label: '每日' },
+  { value: '4', label: '一次' }
+];
+// 转换状态的方法
+function convertStatus(value, types) {
+  const statusMapping = {
+    type: {
+      '0': '庇护场所',
+      '1': '救援队伍',
+      '2': '救援设备'
+    },
+    cycle: {
+      '0': '每年',
+      '1': '每月',
+      '2': '每周',
+      '3': '每日',
+      '4': '一次'
+    },
+    task_range: {
+      '0': '市级',
+      '1': '区县级',
+      '2': '镇街级',
+      '3': '村居级'
+    },
+    task_status: {
+      '0': '未开始',
+      '1': '进行中',
+      '2': '未完成',
+      '3': '已完结'
+    }
+  };
+
+  return statusMapping[types]?.[value] || value;
+}
+let patrolSubTasksState = reactive({
+  show: false,
+  eventId: ''
+});
+let rescueResourcesAddState = reactive({
+  show: false
+});
+let rescueResourcesEditState = reactive({
+  show: false,
+  eventId: ''
+});
+const handleCancel = () => {
+  patrolSubTasksState.show = false;
+  rescueResourcesAddState.show = false;
+  rescueResourcesEditState.show = false;
+};
+const openPatrolSubTasks = (row) => {
+  if (row) {
+    patrolSubTasksState.eventId = row.id + ''; // 假设eventId是id字段
+    patrolSubTasksState.show = true;
+  }
+};
+const handleAdd = () => {
+  rescueResourcesAddState.show = true;
+};
+const handleUpdate = (row) => {
+  if (row) {
+    rescueResourcesEditState.eventId = row.id + ''; // 假设eventId是id字段
+    rescueResourcesEditState.show = true;
+  }
+};
+const handleDelete = async (row) => {
+  let id = [];
+  if (row) {
+    id = [row.id];
+  } else {
+    id = ids.value;
+  }
+  const [err] = await to(proxy?.$modal.confirm('是否确认删除选择的数据项?') as any);
+  if (!err) {
+    await workDelete(id);
+    proxy.$modal.msgSuccess('删除成功');
+    fetchWorkrData();
+  }
+};
+
+const fetchWorkrData = () => {
+  loading.value = true;
+  workList(queryParams.value)
+    .then((res) => {
+      tableData.value = res.data;
+      total.value = res.total;
+    })
+    .finally(() => {
+      loading.value = false;
+    });
+};
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchWorkrData();
+};
+// 重置查询条件
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10, type: '', cycle: '' };
+  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 handleWork = async (row) => {
+  try {
+    const confirmed = await ElMessageBox.confirm('确定要完结任务吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+    if (confirmed) {
+      try {
+        await updatetask({ id: row.id, task_status: '3' });
+        console.log(`任务 ${row.id} 已完结`);
+        fetchWorkrData();
+      } catch (error) {
+        console.error(`任务 ${row.id} 完结失败:`, error);
+      }
+    } else {
+      console.log(`任务 ${row.id} 未完结`);
+    }
+  } catch (error) {
+    console.error('确认对话框处理失败:', error);
+  }
+};
+onMounted(() => {
+  fetchWorkrData();
+});
+</script>

+ 134 - 0
src/views/inspectionWork/rescueResourcesAdd.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="app-container p-2">
+    <!-- 新增/修改弹窗 -->
+    <div class="common-dialog">
+      <div class="common-dialog-content">
+        <div class="common-dialog-title-box">
+          <i class="common-dialog-title-icon" />
+          <div>新建任务</div>
+        </div>
+        <div class="common-dialog-box">
+          <el-form ref="demoFormRef" :model="form" label-width="100px" :rules="rules">
+            <el-form-item label="采集类型:" prop="type">
+              <el-select v-model="form.type" placeholder="请选择救援要素采集类型">
+                <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="排查时间范围:" prop="publish">
+              <el-date-picker v-model="form.start_time" type="date" placeholder="选择开始日期" value-format="YYYY-MM-DD"></el-date-picker>
+              <el-date-picker v-model="form.end_time" type="date" placeholder="选择结束日期" value-format="YYYY-MM-DD"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="排查周期:" prop="cycle">
+              <el-radio-group v-model="form.cycle">
+                <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="4" size="large">一次</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <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="YYYY-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 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-group>
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="common-dialog-footer" style="display: flex; justify-content: center">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import { updatetask, addtask } from '@/api/inspectionWork/rescueResources';
+import { ref } from 'vue';
+const demoFormRef = ref(null);
+const buttonLoading = ref(false);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const emits = defineEmits(['close']);
+let form = ref({
+  id: '',
+  type: '',
+  start_time: '',
+  end_time: '',
+  cycle: '',
+  corn_query: '',
+  task_range: ''
+});
+// 巡查业务选项
+const typeOptions = [
+  { value: '0', label: '庇护场所' },
+  { value: '1', label: '救援队伍' },
+  { value: '2', label: '救援设备' }
+];
+// 表单验证规则
+const rules = ref({
+  type: [{ required: true, message: '请选择救援要素采集类型', trigger: 'blur' }],
+  start_time: [{ required: true, message: '请选择开始日期', trigger: 'change' }],
+  end_time: [{ required: true, message: '请选择结束日期', trigger: 'change' }],
+  cycle: [{ required: true, message: '请选择巡查周期', trigger: 'change' }],
+  task_range: [{ required: true, message: '请选择巡查范围', trigger: 'change' }],
+  corn_query: [],
+  corn_query_month: [],
+  corn_query_day: [],
+  corn_query_weekday: [] // 添加用于每周的选择的验证
+});
+// 提交表单
+const submitForm = () => {
+  demoFormRef.value?.validate(async (valid) => {
+    if (valid) {
+      try {
+        buttonLoading.value = true;
+        form.value.task_number ? await updatetask(form.value) : await addtask(form.value); //根据 form.value.planId 是否存在,调用 updateReport 或 addReport 方法
+        proxy?.$modal.msgSuccess(form.value.task_number ? '修改成功' : '新增成功');
+        emits('refresh'); // 提交成功后通知父组件刷新
+        emits('close'); // 关闭弹窗
+      } finally {
+        buttonLoading.value = false;
+      }
+    }
+  });
+};
+// 重置表单数据和表单验证状态
+const resetForm = () => {
+  form.value = {
+    type: '',
+    start_time: '',
+    end_time: '',
+    cycle: '',
+    corn_query: '',
+    task_range: ''
+  };
+  demoFormRef.value?.resetFields(); // 重置表单的验证状态
+};
+
+const cancel = () => {
+  resetForm();
+  emits('close');
+};
+</script>

+ 127 - 0
src/views/inspectionWork/rescueResourcesEdit.vue

@@ -0,0 +1,127 @@
+<template>
+  <div class="app-container p-2">
+    <!-- 新增/修改弹窗 -->
+    <div class="common-dialog">
+      <div class="common-dialog-content">
+        <div class="common-dialog-title-box">
+          <i class="common-dialog-title-icon" />
+          <div>修改任务</div>
+        </div>
+        <div class="common-dialog-box">
+          <el-form ref="demoFormRef" :model="form" label-width="100px" :rules="rules">
+            <el-form-item label="采集类型:" prop="type">
+              <el-select v-model="form.type" placeholder="请选择救援要素采集类型">
+                <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="排查时间范围:" prop="publish">
+              <el-date-picker v-model="form.start_time" type="date" placeholder="选择开始日期" value-format="YYYY-MM-DD"></el-date-picker>
+              <el-date-picker v-model="form.end_time" type="date" placeholder="选择结束日期" value-format="YYYY-MM-DD"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="排查周期:" prop="cycle">
+              <el-radio-group v-model="form.cycle">
+                <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="4" size="large">一次</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <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="YYYY-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 label="排查范围:" prop="inspection_range">
+              <el-radio-group v-model="form.inspection_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-group>
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="common-dialog-footer" style="display: flex; justify-content: center">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import { workDetail, updatetask } from '@/api/inspectionWork/rescueResources';
+import { ref, watch } from 'vue';
+import { ElMessage } from 'element-plus';
+const demoFormRef = ref(null);
+const buttonLoading = ref(false);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const emit = defineEmits(['close']);
+const props = defineProps<{ eventId: string }>();
+let form = ref({
+  id: '',
+  type: '',
+  start_time: '',
+  end_time: '',
+  cycle: '',
+  corn_query: '',
+  inspection_range: ''
+});
+// 巡查业务选项
+const typeOptions = [
+  { value: '0', label: '庇护场所' },
+  { value: '1', label: '救援队伍' },
+  { value: '2', label: '救援设备' }
+];
+const fetchDetail = async () => {
+  const response = await workDetail(props.eventId);
+  if (response.code === 200) {
+    form.value = response.data;
+  } else {
+    ElMessage.error(response.msg);
+  }
+};
+const rules = ref({
+  // id: [{ required: true, message: '主键不能为空', trigger: 'blur' }],
+});
+watch(
+  () => props.eventId,
+  (newVal) => {
+    if (newVal) {
+      fetchDetail();
+    }
+  },
+  { immediate: true }
+);
+const submitForm = async () => {
+  // 假设表单已经通过验证
+  const response = await updatetask(form.value);
+  if (response.code === 200) {
+    ElMessage.success('提交成功');
+    emit('refresh'); // 提交成功后通知父组件刷新
+    emit('refreshParent'); // 提交成功后通知子任务组件刷新
+    cancel(); // 关闭弹窗
+  } else {
+    ElMessage.error(response.msg);
+  }
+};
+
+const cancel = () => {
+  emit('close');
+};
+</script>