Przeglądaj źródła

修改任务模板图片

chauncey 9 miesięcy temu
rodzic
commit
12277ae69c
32 zmienionych plików z 814 dodań i 34 usunięć
  1. 24 0
      src/api/emergency-plan/index.ts
  2. 18 0
      src/assets/svg/emergency-plan.svg
  3. 1 0
      src/constant/dict.ts
  4. 1 0
      src/router/router-icons.ts
  5. 82 0
      src/router/routers/emergency.ts
  6. 24 0
      src/types/emergency-plan/index.ts
  7. BIN
      src/views/disaster/disaster-precaution/src/images/later@1X.png
  8. BIN
      src/views/disaster/disaster-precaution/src/images/midterm@1X.png
  9. BIN
      src/views/disaster/disaster-precaution/src/images/previous@1X.png
  10. 7 0
      src/views/emergency/emergency-plan/PageApproval.vue
  11. 202 0
      src/views/emergency/emergency-plan/PageManagement.vue
  12. 57 0
      src/views/emergency/emergency-plan/PageManagementDetail.vue
  13. 83 0
      src/views/emergency/emergency-plan/src/components/AddManagementDetail.vue
  14. 13 0
      src/views/emergency/emergency-plan/src/components/EditManagementDetail.vue
  15. 13 0
      src/views/emergency/emergency-plan/src/components/ViewManagementDetail.vue
  16. 60 0
      src/views/emergency/emergency-plan/src/config/form.ts
  17. 18 0
      src/views/emergency/emergency-plan/src/config/index.ts
  18. 33 0
      src/views/emergency/emergency-plan/src/config/search.ts
  19. 64 0
      src/views/emergency/emergency-plan/src/config/table.ts
  20. 14 0
      src/views/emergency/emergency-plan/src/constant.ts
  21. 28 0
      src/views/emergency/emergency-plan/src/hook.ts
  22. 5 0
      src/views/emergency/emergency-plan/src/styles/info-common.scss
  23. 3 0
      src/views/emergency/emergency-plan/src/styles/info.scss
  24. 2 3
      src/views/emergency/emergency-supplies/PageEmergencyList.vue
  25. 0 1
      src/views/emergency/emergency-supplies/PageEmergencyListInfo.vue
  26. 11 9
      src/views/emergency/emergency-supplies/PageInventoryCheck.vue
  27. 2 2
      src/views/emergency/emergency-supplies/src/components/AddEmergencyItem.vue
  28. 2 2
      src/views/emergency/emergency-supplies/src/components/EditEmergencyItem.vue
  29. 5 5
      src/views/emergency/emergency-supplies/src/components/ViewEmergencyItem.vue
  30. 0 12
      src/views/emergency/emergency-supplies/src/hook.ts
  31. 1 0
      src/views/emergency/src/constant.ts
  32. 41 0
      src/views/emergency/src/hoos.ts

+ 24 - 0
src/api/emergency-plan/index.ts

@@ -0,0 +1,24 @@
+import { http } from '@/utils/http/axios';
+import type { PlanEmergencyListQuery, PlanEmergencyListResponse } from '@/types/emergency-plan';
+import type { QueryPageRequest, QueryPageResponse } from '@/types/basic-query';
+
+/**
+ * 分页查询应急预案列表
+ */
+export const getEmergencyPlanList = (data: QueryPageRequest<PlanEmergencyListQuery>) => {
+  return http.request<QueryPageResponse<PlanEmergencyListResponse>>({
+    url: '/emergencyPlan/queryEmergencyPlanPage',
+    method: 'post',
+    data,
+  });
+};
+
+/**
+ * 删除应急预案
+ */
+export const deleteEmergencyPlan = (emergencyPlanId: number) => {
+  return http.request({
+    url: `/emergencyPlan/deleteEmergencyPlan?emergencyPlanId=${emergencyPlanId}`,
+    method: 'delete',
+  });
+};

Plik diff jest za duży
+ 18 - 0
src/assets/svg/emergency-plan.svg


+ 1 - 0
src/constant/dict.ts

@@ -10,4 +10,5 @@ export const DICT_CODE = {
   LOCATION_ZJ: 'zhangjiang_park',
   LOCATION_DC: 'dachang_park',
   DRILL_SIGN_TYPE: 'emergency_drill_scope',
+  PLAN_TYPE: 'emergency_response',
 };

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

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

+ 82 - 0
src/router/routers/emergency.ts

@@ -181,6 +181,88 @@ const emergencyManagementRoute = {
         },
       ],
     },
+    {
+      id: 2024,
+      parentId: 2000,
+      name: 'emergency-plan',
+      path: 'emergency-plan',
+      component: '',
+      redirect: '',
+      meta: {
+        activeMenu: null,
+        alwaysShow: false,
+        frameSrc: '',
+        hidden: false,
+        icon: 'EmergencyPlanIcon',
+        isFrame: 0,
+        isRoot: false,
+        noCache: false,
+        query: '',
+        title: '应急预案',
+      },
+      children: [
+        {
+          id: 202401,
+          parentId: 2024,
+          name: 'emergency-plan-management',
+          path: 'emergency-plan-management',
+          component: '/emergency/emergency-plan/PageManagement',
+          redirect: '',
+          meta: {
+            activeMenu: null,
+            alwaysShow: false,
+            frameSrc: '',
+            hidden: false,
+            icon: '',
+            isFrame: 0,
+            isRoot: false,
+            noCache: false,
+            query: '',
+            title: '预案管理',
+          },
+        },
+        {
+          id: 202402,
+          parentId: 2024,
+          name: 'plan-management-detail',
+          path: 'plan-management-detail',
+          component: '/emergency/emergency-plan/PageManagementDetail',
+          redirect: '',
+          meta: {
+            activeMenu: '/emergency-management/emergency-plan/emergency-plan-management',
+            alwaysShow: false,
+            frameSrc: '',
+            hidden: false,
+            icon: '',
+            isFrame: 0,
+            isRoot: false,
+            noCache: false,
+            query: '',
+            title: '预案管理详情',
+          },
+        },
+        {
+          id: 202403,
+          parentId: 2024,
+          name: 'emergency-plan-approval',
+          path: 'emergency-plan-approval',
+          component: '/emergency/emergency-plan/PageApproval',
+          redirect: '',
+          meta: {
+            activeMenu: null,
+            alwaysShow: false,
+            frameSrc: '',
+            hidden: false,
+            icon: '',
+            isFrame: 0,
+            isRoot: false,
+            noCache: false,
+            query: '',
+            title: '预案审批',
+          },
+        },
+      ],
+    },
     {
       id: 2009,
       parentId: 2000,

+ 24 - 0
src/types/emergency-plan/index.ts

@@ -0,0 +1,24 @@
+export interface PlanEmergencyListQuery {
+  planName?: string;
+  planType?: string;
+  eventType?: string;
+  status?: number;
+}
+
+export interface PlanEmergencyListResponse {
+  id: number;
+  planName: string;
+  planType: string;
+  enentType: string;
+  deptId: number;
+  status: number;
+}
+
+export interface AddEmergencyPlanForm {
+  planName: string;
+  planType: string;
+  eventType: string;
+  deptId: string;
+  approvalTemplateId: string;
+  appendix: string;
+}

BIN
src/views/disaster/disaster-precaution/src/images/later@1X.png


BIN
src/views/disaster/disaster-precaution/src/images/midterm@1X.png


BIN
src/views/disaster/disaster-precaution/src/images/previous@1X.png


+ 7 - 0
src/views/emergency/emergency-plan/PageApproval.vue

@@ -0,0 +1,7 @@
+<template>
+  <div> this is page approval page </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 202 - 0
src/views/emergency/emergency-plan/PageManagement.vue

@@ -0,0 +1,202 @@
+<template>
+  <div class="safety-platform-container">
+    <div class="safety-platform-container__header">
+      <div class="breadcrumb-title">预案管理</div>
+    </div>
+    <div class="safety-platform-container__main">
+      <div class="search-table-container">
+        <header class="disaster-precaution__header">
+          <el-button
+            type="primary"
+            class="search-table-container--button"
+            :icon="Plus"
+            v-if="planManagementPremissions"
+            @click="handleAdd"
+            >添加预案
+          </el-button>
+          <BasicSearch
+            :searchConfig="EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG"
+            :searchData="searchData"
+            @update:searchData="handleSearch"
+          >
+            <template #planType>
+              <el-select v-model="searchData.planType" placeholder="请输入预案层级" filterable>
+                <el-option
+                  v-for="item in planTypeDice"
+                  :key="item.itemCode"
+                  :label="item.itemValue"
+                  :value="item.itemCode"
+                />
+              </el-select>
+            </template>
+            <template #eventType>
+              <el-select v-model="searchData.eventType" placeholder="请选择事件类型" filterable>
+                <el-option
+                  v-for="item in emergencyEventDice"
+                  :key="item.itemCode"
+                  :label="item.itemValue"
+                  :value="item.itemCode"
+                />
+              </el-select>
+            </template>
+          </BasicSearch>
+        </header>
+        <BasicTable
+          :tableData="tableData"
+          :tableConfig="tableConfig"
+          @update:pageSize="handleSizeChange"
+          @update:pageNumber="handleCurrentChange"
+        >
+          <template #planType="scope">
+            <span>{{ getPlanType(scope.row.planType) }}</span>
+          </template>
+          <template #eventType="scope">
+            <span>{{ getEmergencyEvent(scope.row.eventType) }}</span>
+          </template>
+          <template #status="scope">
+            <span>{{ getEmergencyPlanStatusLabel(scope.row.status) }}</span>
+          </template>
+          <template #action="scope">
+            <div class="action-container--div">
+              <ActionButton text="查看" @click="handleView(scope.row.id)" />
+              <ActionButton v-if="planManagementPremissions" text="编辑" @click="handleEdit(scope.row.id)" />
+              <ActionButton
+                v-if="planManagementPremissions"
+                text="删除"
+                :popconfirm="{ title: '确认删除' }"
+                @confirm="handleDelete(scope.row.id)"
+              />
+            </div>
+          </template>
+        </BasicTable>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { useRouter } from 'vue-router';
+  import { ref, reactive, onMounted } from 'vue';
+  import { Plus } from '@element-plus/icons-vue';
+  import { ElMessage } from 'element-plus';
+  import BasicSearch from '@/components/BasicSearch.vue';
+  import BasicTable from '@/components/BasicTable.vue';
+  import ActionButton from '@/components/ActionButton.vue';
+  import useTableConfig from '@/hooks/useTableConfigHook';
+  import { useEmergencyHook } from '../src/hoos';
+  import { useEmergencyPlanHook } from './src/hook';
+  import { useUserInfoHook } from '@/hooks/useUserInfoHook';
+  import type { QueryPageRequest } from '@/types/basic-query';
+  import type { PlanEmergencyListQuery, PlanEmergencyListResponse } from '@/types/emergency-plan';
+  import { getEmergencyPlanList, deleteEmergencyPlan } from '@/api/emergency-plan';
+  import {
+    EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG,
+    EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS,
+    EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS,
+    TABLE_MAX_HEIGHT_DEFAULT,
+    TABLE_MAX_HEIGHT_PERMISSION,
+  } from './src/config';
+  import { EMERGENCY_PERMISSIONS } from '@/views/emergency/src/constant';
+
+  const router = useRouter();
+  const planManagementPremissions = ref<boolean>(false);
+  const { tableConfig, pagination } = useTableConfig(
+    EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS,
+    EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS,
+  );
+  const { emergencyEventDice, getEmergencyEventDict, getEmergencyEvent } = useEmergencyHook();
+  const { planTypeDice, getPlanTypeDict, getPlanType, getEmergencyPlanStatusLabel } = useEmergencyPlanHook();
+  const { permissions } = useUserInfoHook();
+  let planManagementListQuery: QueryPageRequest<PlanEmergencyListQuery> = {
+    pageNumber: pagination.pageNumber,
+    pageSize: pagination.pageSize,
+    queryParam: {},
+  };
+  const tableData = ref<PlanEmergencyListResponse[]>([]);
+  const searchData = reactive({
+    planName: null,
+    planType: null,
+    eventType: null,
+    status: null,
+  });
+  const handleSearch = () => {
+    planManagementListQuery.queryParam = {};
+    if (searchData.planName) {
+      planManagementListQuery.queryParam.planName = searchData.planName;
+    }
+    if (searchData.planType) {
+      planManagementListQuery.queryParam.planType = searchData.planType;
+    }
+    if (searchData.eventType) {
+      planManagementListQuery.queryParam.eventType = searchData.eventType;
+    }
+    if (searchData.status) {
+      planManagementListQuery.queryParam.status = searchData.status;
+    }
+    getTableData();
+  };
+  const getTableData = async () => {
+    tableConfig.loading = true;
+    const res = await getEmergencyPlanList(planManagementListQuery);
+    tableData.value = res.records;
+    pagination.total = res.totalRow;
+    tableConfig.loading = false;
+  };
+  const handleSizeChange = (value: number) => {
+    pagination.pageSize = value;
+    planManagementListQuery.pageSize = value;
+    getTableData();
+  };
+  const handleCurrentChange = (value: number) => {
+    pagination.pageNumber = value;
+    planManagementListQuery.pageNumber = value;
+    getTableData();
+  };
+  const defaultName = 'plan-management-detail';
+  const handleAdd = () => {
+    router.push({
+      name: defaultName,
+      query: {
+        type: 'add',
+      },
+    });
+  };
+  const handleEdit = (id: number) => {
+    router.push({
+      name: defaultName,
+      query: {
+        id,
+        type: 'edit',
+      },
+    });
+  };
+  const handleView = (id: number) => {
+    router.push({
+      name: defaultName,
+      query: {
+        id,
+      },
+    });
+  };
+  const handleDelete = async (id: number) => {
+    await deleteEmergencyPlan(id);
+    ElMessage.success('删除成功');
+    await getTableData();
+  };
+
+  onMounted(() => {
+    getPlanTypeDict();
+    getEmergencyEventDict();
+    getTableData();
+    planManagementPremissions.value = Boolean(
+      permissions.find((item: { code: string }) => item.code === EMERGENCY_PERMISSIONS.PLANE_MANAGEMENT),
+    );
+    tableConfig.maxHeight = planManagementPremissions.value ? TABLE_MAX_HEIGHT_PERMISSION : TABLE_MAX_HEIGHT_DEFAULT;
+  });
+</script>
+
+<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>

+ 57 - 0
src/views/emergency/emergency-plan/PageManagementDetail.vue

@@ -0,0 +1,57 @@
+<template>
+  <div class="safety-platform-container">
+    <div class="safety-platform-container__header">
+      <BreadcrumbBack />
+      <div class="breadcrumb-title">{{ headerTitle }}</div>
+    </div>
+    <main class="safety-platform-container__main">
+      <component ref="dynamicComponentRef" :is="dynamicComponent" :id="id" />
+    </main>
+    <footer class="safety-platform-container__footer">
+      <el-button @click="router.back()">取消</el-button>
+      <el-button type="primary" @click="handleSubmit">提交</el-button>
+    </footer>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { useRoute, useRouter } from 'vue-router';
+  import { ref, computed, defineAsyncComponent } from 'vue';
+  import { ElMessage } from 'element-plus';
+
+  const route = useRoute();
+  const router = useRouter();
+  const type = String(route.query.type);
+  const id = Number(route.query.id);
+  const dynamicComponentRef = ref();
+  const headerTitle = computed(() => {
+    const title = '应急预案';
+    if (type === 'add') {
+      return `添加${title}`;
+    } else if (type === 'edit') {
+      return `编辑${title}`;
+    }
+    return `${title}详情`;
+  });
+  const dynamicComponent = computed(() => {
+    if (type === 'add') {
+      return defineAsyncComponent(() => import('./src/components/AddManagementDetail.vue'));
+    } else if (type === 'edit') {
+      return defineAsyncComponent(() => import('./src/components/EditManagementDetail.vue'));
+    }
+    return defineAsyncComponent(() => import('./src/components/ViewManagementDetail.vue'));
+  });
+  const handleSubmit = async () => {
+    if (!dynamicComponentRef.value) return;
+    const message = type === 'add' ? '添加' : '修改';
+    const res = await dynamicComponentRef.value.handleValidate();
+    if (!res) return;
+    const data = dynamicComponentRef.value.getFormData();
+    router.back();
+  };
+</script>
+
+<style scoped lang="scss">
+  @use '@/styles/page-details-layout.scss' as *;
+  @use './src/styles/info-common.scss' as *;
+</style>

+ 83 - 0
src/views/emergency/emergency-plan/src/components/AddManagementDetail.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="emergency-plan-container">
+    <BasicForm ref="formRef" :formData="ruleFormData" :formRules="formRules" :formConfig="ruleFormConfig">
+      <template #planType>
+        <el-select v-model="ruleFormData.planType" placeholder="请选择预案层级" filterable>
+          <el-option v-for="item in planTypeDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
+        </el-select>
+      </template>
+      <template #eventType>
+        <el-select v-model="ruleFormData.planType" placeholder="请选择事件类型" filterable>
+          <el-option
+            v-for="item in emergencyEventDice"
+            :key="item.itemCode"
+            :label="item.itemValue"
+            :value="item.itemCode"
+          />
+        </el-select>
+      </template>
+      <template #deptId>
+        <el-cascader
+          v-model="ruleFormData.deptId"
+          :options="deptTree"
+          :props="cascaderProp"
+          :show-all-levels="false"
+          placeholder="请选择制定部门"
+        />
+      </template>
+      <template #approvalTemplateId>
+        <el-select v-model="ruleFormData.approvalTemplateId" placeholder="请选择审批流程" filterable>
+          <el-option v-for="item in approvalList" :key="item.id" :label="item.templateName" :value="item.id" />
+        </el-select>
+      </template>
+    </BasicForm>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted } from 'vue';
+  import BasicForm from '@/components/BasicForm.vue';
+  import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { useEmergencyHook } from '@/views/emergency/src/hoos';
+  import { useEmergencyPlanHook } from '../hook';
+  import type { AddEmergencyPlanForm } from '@/types/emergency-plan';
+  import { PLAN_MANAGEMENT_FROM_CONFIG, PLAN_MANAGEMENT_FROM_DATA, PLAN_MANAGEMENT_FROM_RULES } from '../config';
+
+  const formRef = ref();
+  const cascaderProp = { expandTrigger: 'hover', emitPath: false, value: 'id', label: 'deptName' };
+  const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
+    useFormConfigHook<AddEmergencyPlanForm>(
+      PLAN_MANAGEMENT_FROM_CONFIG,
+      PLAN_MANAGEMENT_FROM_DATA,
+      PLAN_MANAGEMENT_FROM_RULES,
+    );
+
+  const { emergencyEventDice, getEmergencyEventDict, deptTree, getDeptTreeData, approvalList, getApprovalList } =
+    useEmergencyHook();
+  const { planTypeDice, getPlanTypeDict } = useEmergencyPlanHook();
+  const handleValidate = async () => {
+    if (!formRef.value) return;
+    const validateResult = await formRef.value.validateForm();
+    return validateResult;
+  };
+  const getFormData = () => {
+    cloneRuleFormData();
+    return ruleFormData;
+  };
+  onMounted(() => {
+    getPlanTypeDict();
+    getEmergencyEventDict();
+    getDeptTreeData();
+    getApprovalList();
+    cloneRuleFormData();
+    beforeRouteLeave();
+  });
+  defineExpose({
+    handleValidate,
+    getFormData,
+  });
+</script>
+
+<style lang="scss" scoped>
+  @use '../styles/info.scss' as *;
+</style>

+ 13 - 0
src/views/emergency/emergency-plan/src/components/EditManagementDetail.vue

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

+ 13 - 0
src/views/emergency/emergency-plan/src/components/ViewManagementDetail.vue

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

+ 60 - 0
src/views/emergency/emergency-plan/src/config/form.ts

@@ -0,0 +1,60 @@
+/**
+ * 应急预案表单配置
+ */
+import type { FormConfig } from '@/types/basic-form';
+
+// 盘点任务表单信息
+export const PLAN_MANAGEMENT_FROM_CONFIG: FormConfig[] = [
+  {
+    label: '预案名称:',
+    prop: 'planName',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入预案名称',
+    },
+  },
+  {
+    label: '预案层级:',
+    prop: 'planType',
+    slot: 'planType',
+  },
+  {
+    label: '事件类型:',
+    prop: 'eventType',
+    slot: 'eventType',
+  },
+  {
+    label: '制定部门:',
+    prop: 'deptId',
+    slot: 'deptId',
+  },
+  {
+    label: '审批流程:',
+    prop: 'approvalTemplateId',
+    slot: 'approvalTemplateId',
+  },
+  {
+    label: '上传附件:',
+    prop: 'appendix',
+    slot: 'appendix',
+  },
+];
+
+// 盘点任务表单数据
+export const PLAN_MANAGEMENT_FROM_DATA = {
+  planName: '',
+  planType: '',
+  eventType: '',
+  deptId: '',
+  approvalTemplateId: '',
+  appendix: '',
+};
+
+// 盘点任务表单规则
+export const PLAN_MANAGEMENT_FROM_RULES = {
+  planName: [{ required: true, message: '请输入预案名称', trigger: 'blur' }],
+  planType: [{ required: true, message: '请选择预案层级', trigger: 'change' }],
+  eventType: [{ required: true, message: '请选择事件类型', trigger: 'change' }],
+  deptId: [{ required: true, message: '请选择制定部门', trigger: 'blur' }],
+  approvalTemplateId: [{ required: true, message: '请选择审批流程', trigger: 'change' }],
+};

+ 18 - 0
src/views/emergency/emergency-plan/src/config/index.ts

@@ -0,0 +1,18 @@
+import { EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG } from './search';
+import {
+  EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS,
+  EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS,
+  TABLE_MAX_HEIGHT_DEFAULT,
+  TABLE_MAX_HEIGHT_PERMISSION,
+} from './table';
+import { PLAN_MANAGEMENT_FROM_CONFIG, PLAN_MANAGEMENT_FROM_DATA, PLAN_MANAGEMENT_FROM_RULES } from './form';
+export {
+  EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG,
+  EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS,
+  EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS,
+  TABLE_MAX_HEIGHT_DEFAULT,
+  TABLE_MAX_HEIGHT_PERMISSION,
+  PLAN_MANAGEMENT_FROM_CONFIG,
+  PLAN_MANAGEMENT_FROM_DATA,
+  PLAN_MANAGEMENT_FROM_RULES,
+};

+ 33 - 0
src/views/emergency/emergency-plan/src/config/search.ts

@@ -0,0 +1,33 @@
+import type { SearchConfig } from '@/types/basic-search';
+import { EMERGENCY_PLAN_STATUS_OPTIONS } from '../constant';
+
+export const EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG: SearchConfig[] = [
+  {
+    label: '预案名称:',
+    prop: 'planName',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入预案名称',
+    },
+  },
+  {
+    label: '预案层级:',
+    prop: 'planType',
+    slot: 'planType',
+  },
+  {
+    label: '事件类型:',
+    prop: 'eventType',
+    slot: 'eventType',
+  },
+  {
+    label: '状态:',
+    prop: 'status',
+    component: 'ElSelect',
+    selectOptions: EMERGENCY_PLAN_STATUS_OPTIONS,
+    componentProps: {
+      placeholder: '请选择状态',
+      filterable: true,
+    },
+  },
+];

+ 64 - 0
src/views/emergency/emergency-plan/src/config/table.ts

@@ -0,0 +1,64 @@
+import type { TableColumnProps } from '@/types/basic-table';
+// 基础表格样式配置
+export const TABLE_MAX_HEIGHT_DEFAULT = 'calc(70vh - 100px)';
+export const TABLE_MAX_HEIGHT_PERMISSION = 'calc(70vh - 150px)';
+const TABLE_OPTIONS = {
+  emptyText: '暂无数据',
+  loading: true,
+};
+
+const BASIC_TABLE_COLUMNS = {
+  INDEX: {
+    label: '序号',
+    type: 'index',
+    width: '80px',
+    align: 'center'
+  },
+  PLAN_NAME: {
+    label: '预案名称',
+    prop: 'planName',
+    minWidth: '120px',
+  },
+  PLAN_TYPE: {
+    label: '预案层级',
+    slot: 'planType',
+    minWidth: '120px',
+  },
+  ENENT_TYPE: {
+    label: '预案类型',
+    slot: 'eventType',
+    minWidth: '120px',
+  },
+  DEPT_NAME: {
+    label: '制定部门',
+    prop: 'deptId',
+    minWidth: '120px',
+  },
+  ACTION: {
+    label: '操作',
+    slot: 'action',
+    fixed: 'right',
+    align: 'center',
+    width: '200px',
+  },
+};
+/**
+ * 预案管理表格配置
+ */
+export const EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS = {
+  ...TABLE_OPTIONS,
+};
+
+export const EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS: TableColumnProps[] = [
+  BASIC_TABLE_COLUMNS.INDEX,
+  BASIC_TABLE_COLUMNS.PLAN_NAME,
+  BASIC_TABLE_COLUMNS.PLAN_TYPE,
+  BASIC_TABLE_COLUMNS.ENENT_TYPE,
+  BASIC_TABLE_COLUMNS.DEPT_NAME,
+  {
+    label: '状态',
+    slot: 'status',
+    minWidth: '120px',
+  },
+  BASIC_TABLE_COLUMNS.ACTION,
+];

+ 14 - 0
src/views/emergency/emergency-plan/src/constant.ts

@@ -0,0 +1,14 @@
+export const EMERGENCY_PLAN_STATUS_OPTIONS = [
+  {
+    label: '预案审批中',
+    value: 1,
+  },
+  {
+    label: '预案已退回',
+    value: 2,
+  },
+  {
+    label: '已公式',
+    value: 3,
+  },
+];

+ 28 - 0
src/views/emergency/emergency-plan/src/hook.ts

@@ -0,0 +1,28 @@
+/**
+ * 应急预案公用hook
+ */
+import { ref } from 'vue';
+import type { SysDictDataDetail } from '@/api/dict';
+import { queryDictTypeDetail } from '@/api/dict';
+import { DICT_CODE } from '@/constant/dict';
+import { EMERGENCY_PLAN_STATUS_OPTIONS } from './constant';
+export const useEmergencyPlanHook = () => {
+  // 预案层级
+  const planTypeDice = ref<SysDictDataDetail[]>([]);
+  const getPlanTypeDict = async () => {
+    const planTypeRes = await queryDictTypeDetail(DICT_CODE.PLAN_TYPE);
+    planTypeDice.value = planTypeRes.sysDictDataList;
+  };
+  const getPlanType = (planType: string) => {
+    return planTypeDice.value.find((item) => item.itemCode === planType)?.itemValue;
+  };
+  const getEmergencyPlanStatusLabel = (status: number) => {
+    return EMERGENCY_PLAN_STATUS_OPTIONS.find((item) => item.value === status)?.label;
+  }
+  return {
+    planTypeDice,
+    getPlanTypeDict,
+    getPlanType,
+    getEmergencyPlanStatusLabel,
+  };
+};

+ 5 - 0
src/views/emergency/emergency-plan/src/styles/info-common.scss

@@ -0,0 +1,5 @@
+.safety-platform-container__header {
+  flex-direction: row !important;
+  justify-content: flex-start !important;
+  gap: 8px !important;
+}

+ 3 - 0
src/views/emergency/emergency-plan/src/styles/info.scss

@@ -0,0 +1,3 @@
+.emergency-plan-container{
+    overflow-y: auto;
+}

+ 2 - 3
src/views/emergency/emergency-supplies/PageEmergencyList.vue

@@ -138,6 +138,7 @@
   } from './src/config';
   import useTableConfig from '@/hooks/useTableConfigHook';
   import { useUserInfoHook } from '@/hooks/useUserInfoHook';
+  import { useEmergencyHook } from '../src/hoos';
   import { useEmergencySuppliesHook } from './src/hook';
   import type { EmergencySupplyListQuery, EmergencySupplyListResponse } from '@/types/emergency-supplier';
   import type { QueryPageRequest } from '@/types/basic-query';
@@ -146,10 +147,8 @@
   import { EMERGENCY_SUPPLY_STATUS } from './src/constant';
 
   const router = useRouter();
+  const { emergencyEventDice, getEmergencyEventDict, getEmergencyEvent } = useEmergencyHook();
   const {
-    emergencyEventDice,
-    getEmergencyEventDict,
-    getEmergencyEvent,
     emergencySupplyDice,
     getEmergencySupplyDict,
     getEmergencySupply,

+ 0 - 1
src/views/emergency/emergency-supplies/PageEmergencyListInfo.vue

@@ -44,7 +44,6 @@
     const res = await dynamicComponentRef.value.handleValidate();
     if (!res) return;
     const data = dynamicComponentRef.value.getFormData();
-    console.log(data);
     if (type === 'add') {
       await addEmergencySupply(data);
     } else {

+ 11 - 9
src/views/emergency/emergency-supplies/PageInventoryCheck.vue

@@ -74,12 +74,15 @@
             </span>
           </template>
           <template #supplementQuantity="scope">
-            <span v-if="scope.row.supplementQuantity > 0">
-              <span class="font-red">{{ scope.row.supplementQuantity }}</span>
-            </span>
-            <span v-else>
-              <span>0</span>
-            </span>
+            <div v-if="!scope.row.afterQuantity" />
+            <div v-else>
+              <span v-if="scope.row.supplementQuantity > 0">
+                <span class="font-red">{{ scope.row.supplementQuantity }}</span>
+              </span>
+              <span v-else>
+                <span>0</span>
+              </span>
+            </div>
           </template>
           <template #park="scope">
             <span>{{ getPark(scope.row.park) }}</span>
@@ -145,6 +148,7 @@
     INVENTORY_CHECK_TABLE_MAX_HEIGHT_DEFAULT,
   } from './src/config';
   import useTableConfig from '@/hooks/useTableConfigHook';
+  import { useEmergencyHook } from '../src/hoos';
   import { useEmergencySuppliesHook } from './src/hook';
   import { openMessageBox } from '@/utils/element-plus/messageBox';
   import type {
@@ -162,10 +166,8 @@
   import { INVENTORY_RESULT_MAP } from './src/constant';
   import PreviewIcon from './src/svg/img-preview.svg';
 
+  const { emergencyEventDice, getEmergencyEventDict, getEmergencyEvent } = useEmergencyHook();
   const {
-    emergencyEventDice,
-    getEmergencyEventDict,
-    getEmergencyEvent,
     emergencySupplyDice,
     getEmergencySupplyDict,
     getEmergencySupply,

+ 2 - 2
src/views/emergency/emergency-supplies/src/components/AddEmergencyItem.vue

@@ -74,6 +74,7 @@
   import { ref, onMounted, computed } from 'vue';
   import BasicForm from '@/components/BasicForm.vue';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { useEmergencyHook } from '@/views/emergency/src/hoos';
   import { useEmergencySuppliesHook } from '../hook';
   import type { AddEmergencyItemForm } from '@/types/emergency-supplier';
   import type { QueryUserInfoByUserNameRes } from '@/types/person-group/type';
@@ -140,9 +141,8 @@
     ruleFormData.keeperName = value.realname;
   };
 
+  const { emergencyEventDice, getEmergencyEventDict } = useEmergencyHook();
   const {
-    emergencyEventDice,
-    getEmergencyEventDict,
     emergencySupplyDice,
     getEmergencySupplyDict,
     parkDice,

+ 2 - 2
src/views/emergency/emergency-supplies/src/components/EditEmergencyItem.vue

@@ -54,6 +54,7 @@
   import { ref, onMounted, computed } from 'vue';
   import BasicForm from '@/components/BasicForm.vue';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { useEmergencyHook } from '@/views/emergency/src/hoos';
   import { useEmergencySuppliesHook } from '../hook';
   import type { EditEmergencyItemForm } from '@/types/emergency-supplier';
   import type { QueryUserInfoByUserNameRes } from '@/types/person-group/type';
@@ -115,10 +116,9 @@
     formRef.value?.validateField('currentQuantity');
   };
 
+  const { getEmergencyEventDict, getEmergencyEvent } = useEmergencyHook();
   const {
-    getEmergencyEventDict,
     getEmergencySupplyDict,
-    getEmergencyEvent,
     getEmergencySupply,
     parkDice,
     getParkDict,

+ 5 - 5
src/views/emergency/emergency-supplies/src/components/ViewEmergencyItem.vue

@@ -8,6 +8,7 @@
   import { ref, onMounted } from 'vue';
   import BasicForm from '@/components/BasicForm.vue';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { useEmergencyHook } from '@/views/emergency/src/hoos';
   import { useEmergencySuppliesHook } from '../hook';
   import type { ViewEmergencyItemForm } from '@/types/emergency-supplier';
   import { getEmergencySupplyDetail } from '@/api/emergency-supplier';
@@ -17,13 +18,13 @@
     id: number;
   }>();
   const formRef = ref();
-  const DISABLED_EMERGENCY_ITEM_FROM_CONFIG = VIEW_EMERGENCY_ITEM_FROM_CONFIG.map(item => {
+  const DISABLED_EMERGENCY_ITEM_FROM_CONFIG = VIEW_EMERGENCY_ITEM_FROM_CONFIG.map((item) => {
     return {
       ...item,
       componentProps: {
         ...(item.componentProps || {}),
-        disabled: true
-      }
+        disabled: true,
+      },
     };
   });
   const { ruleFormConfig, ruleFormData } = useFormConfigHook<ViewEmergencyItemForm>(
@@ -31,10 +32,9 @@
     VIEW_EMERGENCY_ITEM_DATA,
   );
 
+  const { getEmergencyEventDict, getEmergencyEvent } = useEmergencyHook();
   const {
-    getEmergencyEventDict,
     getEmergencySupplyDict,
-    getEmergencyEvent,
     getEmergencySupply,
     getParkDict,
     getPark,

+ 0 - 12
src/views/emergency/emergency-supplies/src/hook.ts

@@ -9,15 +9,6 @@ import { queryUserInfoByUserName } from '@/api/system/person-group';
 import { DICT_CODE } from '@/constant/dict';
 import { EMERGENCY_SUPPLY_STATUS_OPTIONS } from './constant';
 export const useEmergencySuppliesHook = () => {
-  // 应急事件类型
-  const emergencyEventDice = ref<SysDictDataDetail[]>([]);
-  const getEmergencyEventDict = async () => {
-    const emergencyEventRes = await queryDictTypeDetail(DICT_CODE.EMERGENCY_EVENT);
-    emergencyEventDice.value = emergencyEventRes.sysDictDataList;
-  };
-  const getEmergencyEvent = (emergencyType: string) => {
-    return emergencyEventDice.value.find((item) => item.itemCode === emergencyType)?.itemValue;
-  };
   // 应急物资类型
   const emergencySupplyDice = ref<SysDictDataDetail[]>([]);
   const getEmergencySupplyDict = async () => {
@@ -70,9 +61,6 @@ export const useEmergencySuppliesHook = () => {
     loading.value = false;
   };
   return {
-    emergencyEventDice,
-    getEmergencyEventDict,
-    getEmergencyEvent,
     emergencySupplyDice,
     getEmergencySupplyDict,
     getEmergencySupply,

+ 1 - 0
src/views/emergency/src/constant.ts

@@ -8,4 +8,5 @@ export const EMERGENCY_PERMISSIONS = {
   EMERGENCY_PROCEDURE_COMPLETE: 'emergency_business_module:emergency_procedure_complete',
   // 应急处置-应急指挥中心管理权限:打开、编辑
   EMERGENCY_COMMAND_CENTER_MANAGE: 'emergency_business_module:emergency_command_center_manage',
+  PLANE_MANAGEMENT: 'emergency_business_module:plan_management',
 };

+ 41 - 0
src/views/emergency/src/hoos.ts

@@ -0,0 +1,41 @@
+/**
+ * 应急管理公用hook
+ */
+import { ref } from 'vue';
+import type { DeptTree } from '@/types/dept/type';
+import type { ApprovalInstanceType } from '@/views/system/approval/types';
+import type { SysDictDataDetail } from '@/api/dict';
+import { getAllDepartments } from '@/api/auth/dept';
+import { getAllApproval } from '@/api/approval/approval';
+import { queryDictTypeDetail } from '@/api/dict';
+import { DICT_CODE } from '@/constant/dict';
+export const useEmergencyHook = () => {
+  // 应急事件类型
+  const emergencyEventDice = ref<SysDictDataDetail[]>([]);
+  const getEmergencyEventDict = async () => {
+    const emergencyEventRes = await queryDictTypeDetail(DICT_CODE.EMERGENCY_EVENT);
+    emergencyEventDice.value = emergencyEventRes.sysDictDataList;
+  };
+  const getEmergencyEvent = (emergencyType: string) => {
+    return emergencyEventDice.value.find((item) => item.itemCode === emergencyType)?.itemValue;
+  };
+  // 部门树
+  const deptTree = ref<DeptTree[]>();
+  const getDeptTreeData = async () => {
+    deptTree.value = await getAllDepartments();
+  };
+  // 获取所有审批流程
+  const approvalList = ref<ApprovalInstanceType[]>();
+  const getApprovalList = async () => {
+    approvalList.value = await getAllApproval();
+  };
+  return {
+    emergencyEventDice,
+    getEmergencyEventDict,
+    getEmergencyEvent,
+    deptTree,
+    getDeptTreeData,
+    approvalList,
+    getApprovalList,
+  };
+};