Kaynağa Gözat

feat: 添加应急演练页面

wyf 9 ay önce
ebeveyn
işleme
422363a9de

+ 19 - 0
src/api/emergency-drill/emergency-drill.ts

@@ -6,8 +6,13 @@ import {
   CreateEmergencyDrillRuleForm,
   DrillPlanItemDetail,
   DrillPlanRecord,
+<<<<<<< HEAD
   ExecuteDrillPlanRuleForm,
 } from '@/views/emergency/emergency-drill/types';
+=======
+} from '@/views/emergency/emergency-drill/types';
+import type { DrillSignlistQuery, DrillSignListResponse } from '@/types/emergency-drill';
+>>>>>>> 25dea31a (feat: 添加应急演练页面)
 
 export const queryEnergencyDrillPlanList = (params: QueryPageRequest<DrillPlanListSearch>) => {
   return http.request<QueryPageResponse<DrillPlanItem>>({
@@ -35,6 +40,7 @@ export const createEmergencyDrillPlan = (params: CreateEmergencyDrillRuleForm) =
   });
 };
 
+<<<<<<< HEAD
 export const saveEmergencyDrillExecute = (params: ExecuteDrillPlanRuleForm) => {
   return http.request({
     url: '/emergencyDrill/saveEmergencyDrillPlan',
@@ -50,6 +56,8 @@ export const saveEmergencyDrillExecute = (params: ExecuteDrillPlanRuleForm) => {
   });
 };
 
+=======
+>>>>>>> 25dea31a (feat: 添加应急演练页面)
 export const deleteEmergencyDrillPlan = (id) => {
   return http.request({
     url: `/emergencyDrill/deleteEmergencyDrillPlan?drillPlanId=${id}`,
@@ -78,10 +86,21 @@ export const exportEmergencyDrillRecord = (id) => {
   });
 };
 
+<<<<<<< HEAD
 // 查询应急预案名
 export const queryEmergencyPlanDetail = (id) => {
   return http.request<any>({
     url: `/emergencyPlan/queryEmergencyPlanDetail?emergencyPlanId=${id}`,
     method: 'get',
+=======
+/**
+ * 查询演练会签列表
+ */
+export const getDrillSignList = (data: QueryPageRequest<DrillSignlistQuery>) => {
+  return http.request<QueryPageResponse<DrillSignListResponse>>({
+    url: '/emergencyDrill/queryEmergencyDrillSignListPage',
+    method: 'post',
+    data,
+>>>>>>> 25dea31a (feat: 添加应急演练页面)
   });
 };

Dosya farkı çok büyük olduğundan ihmal edildi
+ 18 - 0
src/assets/svg/emergency-drill.svg


+ 1 - 0
src/constant/dict.ts

@@ -9,4 +9,5 @@ export const DICT_CODE = {
   PARK: 'emergency_park',
   LOCATION_ZJ: 'zhangjiang_park',
   LOCATION_DC: 'dachang_park',
+  DRILL_SIGN_TYPE: 'emergency_drill_scope',
 };

+ 1 - 0
src/router/router-icons.ts

@@ -69,4 +69,5 @@ export const constantRouterIcon = {
   EmergencyFrameworkIcon: renderSvg('emergency-framework'),
   EmergencySuppliesIcon: renderSvg('emergency-supplies'),
   EmergencyResponseIcon: renderSvg('emergency-response'),
+  EmergencyDrillIcon: renderSvg('emergency-drill'),
 };

+ 25 - 0
src/types/emergency-drill/index.ts

@@ -0,0 +1,25 @@
+interface BasicEmergencyDrillSearchType {
+  drillScope?: string | null;
+  drillContent?: string | null;
+}
+
+export interface DrillSignSearch extends BasicEmergencyDrillSearchType {
+  signType?: number | null;
+  drillTime?: string[] | null;
+}
+
+export interface DrillSignlistQuery extends Omit<DrillSignSearch, 'drillTime'> {
+  drillTimeStart?: string | null;
+  drillTimeEnd?: string | null;
+}
+
+export interface DrillSignListResponse {
+  signType: number;
+  drillScope: string;
+  drillContent: string;
+  drillTime: string;
+  drillLocation: string;
+  personInChargeName: string;
+  createdByName: string;
+  confirmStatus: number;
+}

+ 17 - 18
src/views/emergency/emergency-drill/PageDrillPlanList.vue

@@ -25,24 +25,22 @@
           @update:pageNumber="handleCurrentChange"
         >
           <template #action="scope">
-            <ActionButton text="查看" @click="handleViewDrillPlan(scope.row.id)"></ActionButton>
-            <ActionButton
-              v-if="scope.row.status > 0 && scope.row.status <= 3"
-              text="演练执行"
-              @click="handleToExecute(scope.row.id)"
-            ></ActionButton>
-            <ActionButton
-              v-else-if="scope.row.status < 6"
-              text="演练记录"
-              @click="handleToRecord(scope.row.id)"
-            ></ActionButton>
-            <ActionButton
-              text="删除"
-              :popconfirm="{
-                title: '确定要删除?',
-              }"
-              @confirm="handleDeleteDrillPlan(scope.row.id)"
-            />
+            <div class="action-container--div">
+              <ActionButton text="查看" @click="handleViewDrillPlan(scope.row.id)"></ActionButton>
+              <ActionButton
+                v-if="scope.row.status > 0 && scope.row.status <= 3"
+                text="演练执行"
+                @click=""
+              ></ActionButton>
+              <ActionButton v-else-if="scope.row.status < 6" text="演练记录" @click=""></ActionButton>
+              <ActionButton
+                text="删除"
+                :popconfirm="{
+                  title: '确定要删除?',
+                }"
+                @confirm="handleDeleteDrillPlan(scope.row.id)"
+              />
+            </div>
           </template>
         </BasicTable>
       </div>
@@ -167,4 +165,5 @@
 <style scoped lang="scss">
   @use '@/styles/page-details-layout.scss' as *;
   @use '@/styles/page-main-layout.scss' as *;
+  @use '@/styles/basic-table-action.scss' as *;
 </style>

+ 47 - 4
src/views/emergency/emergency-drill/PageDrillSignList.vue

@@ -5,16 +5,59 @@
     </header>
     <main class="safety-platform-container__main">
       <div class="search-table-container">
-        <header>
-          <!-- 搜索栏 -->
-        </header>
+        <BasicSearch :search-data="searchData" :search-config="DRILL_SIGN_LIST_SEARCH_CONFIG">
+          <template #drillScope>
+            <el-select v-model="searchData.drillScope" placeholder="请选择演练规模" filterable>
+              <el-option
+                v-for="item in drillScopeDice"
+                :key="item.itemCode"
+                :label="item.itemValue"
+                :value="item.itemCode"
+              />
+            </el-select>
+          </template>
+          <template #drillTime>
+            <el-date-picker
+              v-model="searchData.drillTime"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+              @change="handleDateChange"
+            />
+          </template>
+        </BasicSearch>
         <!-- 表格 -->
       </div>
     </main>
   </div>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+  import { onMounted, reactive } from 'vue';
+  import BasicSearch from '@/components/BasicSearch.vue';
+  import { useEmergencyDrillHook } from './hook';
+  import type { DrillSignSearch } from '@/types/emergency-drill';
+  import { DRILL_SIGN_LIST_SEARCH_CONFIG } from './configs/sign';
+
+  const { drillScopeDice, getDrillScopeDict } = useEmergencyDrillHook();
+  const searchData = reactive<DrillSignSearch>({
+    signType: null,
+    drillScope: null,
+    drillContent: null,
+    drillTime: null,
+  });
+  const handleDateChange = (val: string[]) => {
+    if (val && val.length === 2) {
+      const [startDate, endDate] = val;
+      searchData.drillTime = [`${startDate} 00:00:00`, `${endDate} 23:59:59`];
+      return;
+    }
+  };
+  onMounted(() => {
+    getDrillScopeDict();
+  });
+</script>
 
 <style scoped lang="scss">
   @use '@/styles/page-details-layout.scss' as *;

+ 11 - 11
src/views/emergency/emergency-drill/configs/plan/table.ts

@@ -4,58 +4,58 @@ import type { TableColumnProps } from '@/types/basic-table';
 export const TABLE_OPTIONS = {
   emptyText: '暂无数据',
   loading: true,
-  height: 'calc(70vh - 150px)',
+  maxHeight: 'calc(70vh - 150px)',
 };
 
 export const DRILL_PLAN_LIST_TABLE_COLUMNS: TableColumnProps[] = [
   {
-    prop: 'id',
     label: '序号',
     align: 'center',
-    // width: '150px',
+    width: '80px',
+    type: 'index'
   },
   {
     prop: 'drillScope',
     label: '演练规模',
     align: 'center',
-    // minWidth: '200px',
+    minWidth: '120px',
   },
   {
     prop: 'drillContent',
     label: '演练内容',
     align: 'center',
-    // minWidth: '800px',
+    minWidth: '120px',
   },
   {
     prop: 'dueCompleteTime',
     label: '计划完成日期',
     align: 'center',
-    // minWidth: '800px',
+    width: '200px',
   },
 
   {
     prop: 'responsibleDeptNameList',
     label: '责任部门',
     align: 'center',
-    // minWidth: '800px',
+    minWidth: '120px',
   },
   {
     prop: 'coordinateDeptNameList',
     label: '配合部门',
     align: 'center',
-    // minWidth: '800px',
+    minWidth: '120px',
   },
   {
     prop: 'statusLabel',
     label: '状态',
     align: 'center',
-    // minWidth: '800px',
+    minWidth: '120px',
   },
   {
     prop: 'drillTime',
     label: '演练时间',
     align: 'center',
-    // minWidth: '800px',
+    width: '200px',
   },
 
   {
@@ -71,7 +71,7 @@ export const DRILL_PLAN_LIST_TABLE_COLUMNS: TableColumnProps[] = [
 export const DRILL_PLAN_ACTIVITIES_TABLE_OPTIONS = {
   emptyText: '暂无数据',
   loading: true,
-  height: 'calc(50vh - 100px)',
+  maxHeight: 'calc(50vh - 100px)',
 };
 
 export const DRILL_PLAN_ACTIVITIES_TABLE_COLUMNS: TableColumnProps[] = [

+ 3 - 0
src/views/emergency/emergency-drill/configs/sign/index.ts

@@ -0,0 +1,3 @@
+import { DRILL_SIGN_LIST_SEARCH_CONFIG } from './search';
+
+export { DRILL_SIGN_LIST_SEARCH_CONFIG };

+ 30 - 0
src/views/emergency/emergency-drill/configs/sign/search.ts

@@ -0,0 +1,30 @@
+import {DRILI_SIGN_TYPE_OPTIONS} from '../../constants';
+export const DRILL_SIGN_LIST_SEARCH_CONFIG = [
+  {
+    label: '演练脚本:',
+    prop: 'signType',
+    component: 'ElSelect',
+    selectOptions: DRILI_SIGN_TYPE_OPTIONS,
+    componentProps: {
+      placeholder: '请选择演练脚本',
+    },
+  },
+  {
+    label: '演练规模:',
+    prop: 'drillScope',
+    slot: 'drillScope',
+  },
+  {
+    label: '演练内容:',
+    prop: 'drillContent',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入演练内容',
+    },
+  },
+  {
+    label: '演练时间:',
+    prop: 'drillTime',
+    slot: 'drillTime'
+  },
+];

+ 7 - 0
src/views/emergency/emergency-drill/configs/sign/table.ts

@@ -0,0 +1,7 @@
+import type { TableColumnProps } from '@/types/basic-table';
+
+// 基础表格样式配置
+const BASIC_TABLE_OPTIONS = {
+  emptyText: '暂无数据',
+  loading: true,
+};

+ 15 - 0
src/views/emergency/emergency-drill/constants.ts

@@ -130,3 +130,18 @@ export const DRILL_VIEW_RECORD = [
     value: 'drillEffectAssess',
   },
 ];
+
+export enum DRILL_SIGN_TYPE {
+  SCRIPT = 0,
+  RECORD,
+}
+
+export const DRILI_SIGN_TYPE_MAP = {
+  [DRILL_SIGN_TYPE.SCRIPT]: '演练脚本',
+  [DRILL_SIGN_TYPE.RECORD]: '演练记录',
+};
+
+export const DRILI_SIGN_TYPE_OPTIONS = [
+  { label: DRILI_SIGN_TYPE_MAP[DRILL_SIGN_TYPE.SCRIPT], value: DRILL_SIGN_TYPE.SCRIPT },
+  { label: DRILI_SIGN_TYPE_MAP[DRILL_SIGN_TYPE.RECORD], value: DRILL_SIGN_TYPE.RECORD },
+];

+ 19 - 0
src/views/emergency/emergency-drill/hook.ts

@@ -0,0 +1,19 @@
+/**
+ * 演练会签通用hook
+ */
+import { ref } from 'vue';
+import type { SysDictDataDetail } from '@/api/dict';
+import { queryDictTypeDetail } from '@/api/dict';
+import { DICT_CODE } from '@/constant/dict';
+
+export const useEmergencyDrillHook = () => {
+  const drillScopeDice = ref<SysDictDataDetail[]>([]);
+  const getDrillScopeDict = async () => {
+    const res = await queryDictTypeDetail(DICT_CODE.DRILL_SIGN_TYPE);
+    drillScopeDice.value = res.sysDictDataList;
+  };
+  return {
+    drillScopeDice,
+    getDrillScopeDict,
+  };
+};

+ 5 - 1
src/views/emergency/emergency-supplies/src/components/AddEmergencyItem.vue

@@ -38,7 +38,7 @@
         />
       </template>
       <template #park>
-        <el-select v-model="ruleFormData.park" placeholder="请选择园区" filterable @change="handleChangePark">
+        <el-select v-model="ruleFormData.park" placeholder="请选择园区" filterable @change="changePark">
           <el-option v-for="item in parkDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
         </el-select>
       </template>
@@ -130,6 +130,10 @@
     if (ruleFormData.currentQuantity === null) return;
     formRef.value?.validateField('currentQuantity');
   };
+  const changePark = (type: 'zhangjiang_park' | 'dachang_park') => {
+    handleChangePark(type);
+    ruleFormData.location = '';
+  }
   const selectKeeper = (value: QueryUserInfoByUserNameRes) => {
     if(!value) return;
     ruleFormData.keeperId = value.id;

+ 6 - 2
src/views/emergency/emergency-supplies/src/config/table.ts

@@ -28,7 +28,7 @@ const BASIC_TABLE_COLUMNS = {
   },
   EMERGENCY_TYPE: {
     prop: 'emergencyType',
-    label: '应急事件类型',
+    label: '应急类型',
     slot: 'emergencyType',
     minWidth: '140px',
   },
@@ -147,9 +147,13 @@ export const CHANGE_RECORD_TABLE_COLUMNS: TableColumnProps[] = [
     align: 'right',
   },
   {
-    label: '操作人',
+    label: '变更人',
     prop: 'operatorName',
   },
+  {
+    label: '变更时间',
+    prop: 'updatedAt',
+  },
 ];
 
 export const CHANGE_RECORD_TABLE_OPTIONS = {