Browse Source

迭代八巡查工作:首页新增界面、首页编辑界面、子任务记录接口调试,

zhangyihao 7 months ago
parent
commit
b283bab296

+ 24 - 0
src/api/inspectionWork/inspector.ts

@@ -93,3 +93,27 @@ export function workDetail(id) {
     params: id
   });
 }
+// 任务更新
+export function updatetask(data) {
+  return request({
+    url: '/api/riskManagement/inspection/task/update',
+    method: 'put',
+    data: data
+  });
+}
+// 新增任务
+export function addtask(data) {
+  return request({
+    url: '/api/riskManagement/inspection/task/create',
+    method: 'post',
+    data: data
+  });
+}
+// 查询用户详情
+export function workSubList(task_id) {
+  return request({
+    url: '/api/riskManagement/inspection/task/children/task/' + task_id + '/list',
+    method: 'get',
+    params: task_id
+  });
+}

+ 56 - 9
src/views/inspectionWork/patrolSubTasks.vue

@@ -17,7 +17,7 @@
             <el-button type="primary" @click="handleUpdate()"> 编辑 </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" @click="handleWork()"> 完成任务 </el-button>
+            <el-button type="primary" @click="handlefinal()"> 完成任务 </el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button type="danger" @click="handleDelete"> 删除预案 </el-button>
@@ -42,13 +42,13 @@
         <h3>子任务记录</h3>
         <el-card style="margin-top: 10px" shadow="hover">
           <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
-            <el-table-column label="巡查业务" align="center" prop="business" />
+            <el-table-column label="巡查业务" align="center" :formatter="(row) => businessMap[row.business]" />
             <el-table-column label="要求巡查时间" align="center" prop="task_time" />
-            <el-table-column label="巡查周期" align="center" prop="cycle" />
-            <el-table-column label="巡查范围" walign="center" prop="inspection_range" />
-            <el-table-column label="执行日期" align="center" prop="run_time" />
-            <el-table-column label="已完成" align="center" prop="finished" />
-            <el-table-column label="未完成" align="center" prop="unfinished" />
+            <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" class-name="small-padding fixed-width">
               <template #default="scope">
                 <el-text class="common-btn-text-primary" @click="handleView(scope.row)">巡查结果</el-text>
@@ -60,7 +60,7 @@
             v-model:page="queryParams.page"
             v-model:limit="queryParams.pageSize"
             :total="total"
-            @pagination="tableData"
+            @pagination="fetchSubTasks"
           />
         </el-card>
       </el-col>
@@ -68,11 +68,15 @@
   </div>
 </template>
 <script setup lang="ts">
-import { workDetail } from '@/api/inspectionWork/inspector';
+import { workDetail, workSubList, updatetask } from '@/api/inspectionWork/inspector';
 import { reactive, ref } from 'vue';
+import { ElMessageBox } from 'element-plus';
 const props = defineProps<{ eventId: string }>();
 const total = ref(0);
 const tableData = ref([]);
+const multiple = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
 const emits = defineEmits(['close']);
 const detailData = ref({
   task_number: '',
@@ -157,10 +161,53 @@ const fetchWorkDetail = () => {
       loading.value = false;
     });
 };
+const fetchSubTasks = () => {
+  return workSubList(props.eventId, queryParams.value)
+    .then((res) => {
+      if (res.code === 200) {
+        tableData.value = res.data;
+        total.value = res.total;
+        console.log('Fetched subtasks data:', tableData.value);
+      } else {
+        console.error(res.msg);
+      }
+    })
+    .catch((error) => {
+      console.error('Error fetching sub tasks:', error);
+    });
+};
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+const handlefinal = async () => {
+  try {
+    const confirmed = await ElMessageBox.confirm('确定要完结任务吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+    if (confirmed) {
+      try {
+        await updatetask({ id: props.eventId, task_status: '3' });
+        console.log(`任务 ${props.eventId} 已完结`);
+        fetchWorkDetail();
+      } catch (error) {
+        console.error(`任务 ${props.eventId} 完结失败:`, error);
+      }
+    } else {
+      console.log(`任务 ${props.eventId} 未完结`);
+    }
+  } catch (error) {
+    console.error('确认对话框处理失败:', error);
+  }
+};
 const goBack = () => {
   emits('close');
 };
 onMounted(() => {
   fetchWorkDetail(); // 在组件挂载后调用此函数以获取数据
+  fetchSubTasks();
 });
 </script>

+ 48 - 3
src/views/inspectionWork/patrolTask.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-show="!patrolSubTasksState.show" class="app-container">
+    <div v-show="!patrolSubTasksState.show && !patrolTaskAddState.show" class="app-container">
       <div>
         <transition name="fade">
           <div v-show="showSearch">
@@ -67,7 +67,7 @@
           <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="handleWork(scope.row)">完成任务</el-text>
+              <el-text class="common-btn-text-danger" v-if="scope.row.task_status !== '3'" @click="handleWork(scope.row)">完成任务</el-text>
               <el-text class="common-btn-text-danger" @click="handleDelete(scope.row)">删除</el-text>
             </template>
           </el-table-column>
@@ -77,12 +77,17 @@
     </div>
   </div>
   <PatrolSubTasks v-if="patrolSubTasksState.show" :event-id="patrolSubTasksState.eventId" @close="handleCancel" />
+  <PatrolTaskEdit v-if="patrolTaskEditState.show" :event-id="patrolTaskEditState.eventId" @close="handleCancel" @refresh="fetchWorkrData" />
+  <PatrolTaskAdd v-if="patrolTaskAddState.show" @close="handleCancel" @refresh="fetchWorkrData" />
 </template>
 <script setup lang="ts">
 import { onMounted, reactive, ref } from 'vue';
 import PatrolSubTasks from './patrolSubTasks.vue';
-import { workList, workDelete } from '@/api/inspectionWork/inspector';
+import PatrolTaskAdd from './patrolTaskAdd.vue';
+import PatrolTaskEdit from './patrolTaskEdit.vue';
+import { workList, workDelete, updatetask } from '@/api/inspectionWork/inspector';
 import { to } from 'await-to-js';
+import { ElMessageBox } from 'element-plus';
 const loading = ref(true);
 const showSearch = ref(true);
 const multiple = ref(true);
@@ -178,8 +183,17 @@ let patrolSubTasksState = reactive({
   show: false,
   eventId: ''
 });
+let patrolTaskAddState = reactive({
+  show: false
+});
+let patrolTaskEditState = reactive({
+  show: false,
+  eventId: ''
+});
 const handleCancel = () => {
   patrolSubTasksState.show = false;
+  patrolTaskAddState.show = false;
+  patrolTaskEditState.show = false;
 };
 const openPatrolSubTasks = (row) => {
   if (row) {
@@ -187,6 +201,15 @@ const openPatrolSubTasks = (row) => {
     patrolSubTasksState.show = true;
   }
 };
+const handleAdd = () => {
+  patrolTaskAddState.show = true;
+};
+const handleUpdate = (row) => {
+  if (row) {
+    patrolTaskEditState.eventId = row.id; // 假设eventId是id字段
+    patrolTaskEditState.show = true;
+  }
+};
 const handleDelete = async (row) => {
   let id = [];
   if (row) {
@@ -228,6 +251,28 @@ const handleSelectionChange = (selection) => {
   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();
 });

+ 135 - 0
src/views/inspectionWork/patrolTaskAdd.vue

@@ -0,0 +1,135 @@
+<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="business">
+              <el-select v-model="form.business" placeholder="请选择巡查业务">
+                <el-option v-for="item in businessOptions" :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 { updatetask, addtask } from '@/api/inspectionWork/inspector';
+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: '',
+  business: '',
+  start_time: '',
+  end_time: '',
+  cycle: '',
+  corn_query: '',
+  inspection_range: ''
+});
+// 巡查业务选项
+const businessOptions = [
+  { value: '0', label: '城市隐患巡查' },
+  { value: '1', label: '森林防火巡查' },
+  { value: '2', label: '重点危化企业巡查' },
+  { value: '3', label: '重点水库水位巡查' }
+];
+// 表单验证规则
+const rules = ref({
+  business: [{ 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' }],
+  inspection_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 = {
+    business: '',
+    start_time: '',
+    end_time: '',
+    cycle: '',
+    corn_query: '',
+    inspection_range: ''
+  };
+  demoFormRef.value?.resetFields(); // 重置表单的验证状态
+};
+
+const cancel = () => {
+  resetForm();
+  emits('close');
+};
+</script>

+ 124 - 0
src/views/inspectionWork/patrolTaskEdit.vue

@@ -0,0 +1,124 @@
+<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="business">
+              <el-select v-model="form.business" placeholder="请选择巡查业务">
+                <el-option v-for="item in businessOptions" :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/inspector';
+import { ref, watch } from 'vue';
+import { ElMessage } from 'element-plus';
+const demoFormRef = ref(null);
+const buttonLoading = ref(false);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const emits = defineEmits(['close']);
+const props = defineProps<{ eventId: string }>();
+let form = ref({
+  id: '',
+  business: '',
+  start_time: '',
+  end_time: '',
+  cycle: '',
+  corn_query: '',
+  inspection_range: ''
+});
+// 巡查业务选项
+const businessOptions = [
+  { value: '0', label: '城市隐患巡查' },
+  { value: '1', label: '森林防火巡查' },
+  { value: '2', label: '重点危化企业巡查' },
+  { value: '3', label: '重点水库水位巡查' }
+];
+const fetchDetail = async () => {
+  const response = await workDetail(props.eventId);
+  if (response.code === 200) {
+    form.value = response.data;
+  } else {
+    ElMessage.error(response.msg);
+  }
+};
+watch(
+  () => props.eventId,
+  (newVal) => {
+    if (newVal) {
+      fetchDetail();
+    }
+  },
+  { immediate: true }
+);
+const submitForm = async () => {
+  // 假设表单已经通过验证
+  const response = await updatetask(form.value);
+  if (response.code === 200) {
+    ElMessage.success('提交成功');
+    emits('refresh'); // 提交成功后通知父组件刷新
+    emits('close'); // 关闭弹窗
+  } else {
+    ElMessage.error(response.msg);
+  }
+};
+
+const cancel = () => {
+  emits('close');
+};
+</script>