DrillPlanViewActivities.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <div v-if="drillData" class="drill-plan-detail">
  3. <div>
  4. <div class="name">演练活动</div>
  5. <div class="data">
  6. <div v-for="item in DRILL_VIEW_CONTENT" :key="item.value" class="item">
  7. <span class="label">{{ item.label }}</span>
  8. <a v-if="item.link" class="link" :href="item.link">{{ drillData![item.value] }}</a>
  9. <span v-else class="value"> {{ drillData![item.value] }}</span>
  10. </div>
  11. </div>
  12. </div>
  13. <div>
  14. <div class="name">演练实施</div>
  15. <div class="data">
  16. <div v-for="item in DRILL_VIEW_EXECUTE" :key="item.value" class="item">
  17. <span class="label">{{ item.label }}</span>
  18. <el-popover v-if="item.popover" placement="bottom" trigger="hover" width="224">
  19. <template #reference>
  20. <span style="cursor: pointer">查看签到码</span>
  21. </template>
  22. <QrCode :value="drillData![item.popover]" :width="200" />
  23. </el-popover>
  24. <a v-else-if="item.link" class="link" :href="drillData![item.link]">{{ drillData![item.value] }}</a>
  25. <span v-else class="value"> {{ drillData![item.value] }}</span>
  26. </div>
  27. </div>
  28. </div>
  29. <div>
  30. <div class="name">演练参与部门</div>
  31. <el-button style="margin-top: 20px" type="primary" :icon="Download" @click=""> 下载签到名单 </el-button>
  32. <BasicTable style="margin-top: 20px" :tableConfig="tableConfig" :tableData="drillData.planDetailList!">
  33. <template #drillScriptStatus="scope">
  34. <span>{{ scope.row.drillScriptStatus === 1 ? '未会签' : '已会签' }}</span>
  35. </template>
  36. </BasicTable>
  37. </div>
  38. </div>
  39. </template>
  40. <script setup lang="ts">
  41. import { onMounted, ref } from 'vue';
  42. import { ElPopover } from 'element-plus';
  43. import BasicTable from '@/components/BasicTable.vue';
  44. import { Download } from '@element-plus/icons-vue';
  45. import { useRoute } from 'vue-router';
  46. import { DrillPlanItemDetail } from '../types';
  47. import { DRILL_VIEW_CONTENT, DRILL_VIEW_EXECUTE } from '../constants';
  48. import useTableConfig from '@/hooks/useTableConfigHook';
  49. import { getAllApproval } from '@/api/approval/approval';
  50. import { queryEmergencyDrillPlanDetail, queryEmergencyPlanDetail } from '@/api/emergency-drill/emergency-drill';
  51. import { DRILL_PLAN_ACTIVITIES_TABLE_OPTIONS, DRILL_PLAN_ACTIVITIES_TABLE_COLUMNS } from '../configs/plan/table';
  52. import { useEmergencyDrillHook } from '../hook';
  53. import QrCode from '@/components/Qrcode/src/Qrcode.vue';
  54. const route = useRoute();
  55. const id = route.query.id;
  56. const drillData = ref<DrillPlanItemDetail>();
  57. const { drillScopeDice, getDrillScopeDict } = useEmergencyDrillHook();
  58. async function getData() {
  59. try {
  60. tableConfig.loading = true;
  61. drillData.value = await queryEmergencyDrillPlanDetail(id);
  62. // 解析详情数据
  63. drillData.value.drillScope = drillScopeDice.value.find(
  64. (x) => x.itemCode === drillData.value!.drillScope,
  65. )!.itemValue;
  66. drillData.value.responsibleDeptNameList = drillData.value.responsibleDeptNameList!.replace(/^\[|\]$/g, '');
  67. drillData.value.coordinateDeptNameList = drillData.value.coordinateDeptNameList
  68. ? drillData.value.responsibleDeptNameList!.replace(/^\[|\]$/g, '')
  69. : undefined;
  70. if (drillData.value.emergencyPlanId) {
  71. const emergencyPlan = await queryEmergencyPlanDetail(drillData.value.emergencyPlanId);
  72. drillData.value.emergencyPlanFile = emergencyPlan.planName + emergencyPlan.appendix;
  73. }
  74. const allApprovals = await getAllApproval();
  75. drillData.value.approvalTemplateName = allApprovals.find(
  76. (x) => x.id === drillData.value!.approvalTemplateId,
  77. )?.templateName;
  78. if (drillData.value.drillScript && drillData.value.drillScript.length > 0) {
  79. const scriptFile = unformatAttachment(drillData.value.drillScript);
  80. // console.log(scriptFile);
  81. drillData.value.drillScriptName = scriptFile.fileName;
  82. drillData.value.drillScriptUrl = scriptFile.fileUrl;
  83. }
  84. drillData.value.qrCode = 'https://cn.bing.com/?id=' + id + '&type=test';
  85. tableConfig.loading = false;
  86. } catch (e) {
  87. console.log(e);
  88. }
  89. }
  90. const { tableConfig } = useTableConfig(
  91. DRILL_PLAN_ACTIVITIES_TABLE_COLUMNS,
  92. DRILL_PLAN_ACTIVITIES_TABLE_OPTIONS,
  93. false,
  94. );
  95. onMounted(async () => {
  96. await getDrillScopeDict();
  97. getData();
  98. });
  99. function unformatAttachment(file?: string) {
  100. if (!file) return undefined;
  101. const fileData = JSON.parse(file);
  102. return fileData;
  103. }
  104. </script>
  105. <style scoped>
  106. .name {
  107. margin-top: 10px;
  108. padding-left: 12px;
  109. border-left: 3px #1890ff solid;
  110. }
  111. .data {
  112. display: grid;
  113. grid-template-columns: repeat(auto-fill, 33%);
  114. }
  115. .item {
  116. padding: 25px 16px;
  117. }
  118. </style>