PageDefenseNotice.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <template>
  2. <div class="safety-platform-container">
  3. <header class="safety-platform-container__header">
  4. <span class="breadcrumb-title">管理规定与通知</span>
  5. </header>
  6. <main class="safety-platform-container__main">
  7. <div class="search-table-container">
  8. <header class="disaster-precaution__header">
  9. <el-button
  10. type="primary"
  11. class="search-table-container--button"
  12. :icon="Plus"
  13. @click="handleCreateDefenseNotice"
  14. v-if="defenseNoticePermissions"
  15. >创建规定与通知
  16. </el-button>
  17. <BasicSearch
  18. :searchConfig="
  19. defenseNoticePermissions ? DEFENSE_NOTICE_SEARCH_CONFIG_PERMISSION : DEFENSE_NOTICE_SEARCH_CONFIG_DEFAULT
  20. "
  21. :searchData="searchData"
  22. @update:searchData="handleSearch"
  23. >
  24. <template #disasterType>
  25. <el-select v-model="searchData.disasterType" placeholder="请选择灾害类型" filterable>
  26. <el-option
  27. v-for="item in disasterTypeDice"
  28. :key="item.itemCode"
  29. :label="item.itemValue"
  30. :value="item.itemCode"
  31. />
  32. </el-select>
  33. </template>
  34. <template #disasterLevel>
  35. <el-select v-model="searchData.disasterLevel" placeholder="请选择灾害等级">
  36. <el-option
  37. v-for="item in disasterLevelDice"
  38. :key="item.itemCode"
  39. :label="item.itemValue"
  40. :value="item.itemCode"
  41. />
  42. </el-select>
  43. </template>
  44. </BasicSearch>
  45. </header>
  46. <BasicTable
  47. :tableConfig="tableConfig"
  48. :tableData="tableData"
  49. @update:pageSize="handleSizeChange"
  50. @update:pageNumber="handleCurrentChange"
  51. >
  52. <template #disasterType="scope">
  53. <span>{{ getDisasterType(scope.row.disasterType) }}</span>
  54. </template>
  55. <template #disasterLevel="scope">
  56. <span>{{ getDisasterLevel(scope.row.disasterLevel) }}</span>
  57. </template>
  58. <template #effectState="scope">
  59. <div class="active-status--div">
  60. <div
  61. class="dot"
  62. :style="{ backgroundColor: ACTIVE_STATUS_COLOR[scope.row.effectState as ACTIVE_STATUS] }"
  63. />
  64. <span>{{ ACTIVE_STATUS_MAP[scope.row.effectState] }}</span>
  65. </div>
  66. </template>
  67. <template #action="scope">
  68. <div class="action-container--div">
  69. <ActionButton
  70. text="编辑"
  71. v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE && defenseNoticePermissions"
  72. @click="handleEditDefenseNotice(scope.row.id)"
  73. />
  74. <ActionButton text="查看" @click="handleViewDefenseNotice(scope.row.id)" />
  75. <ActionButton
  76. text="发布"
  77. :popconfirm="{
  78. title: '确定要发布?',
  79. }"
  80. v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE && defenseNoticePermissions"
  81. @confirm="handlePublishDefenseNotice(scope.row.id, scope.row.effectState)"
  82. />
  83. <ActionButton
  84. text="撤回"
  85. :popconfirm="{
  86. title: '确定要撤回?',
  87. }"
  88. v-else-if="scope.row.effectState === ACTIVE_STATUS.ACTIVE && defenseNoticePermissions"
  89. @confirm="handlePublishDefenseNotice(scope.row.id, scope.row.effectState)"
  90. />
  91. <ActionButton
  92. text="删除"
  93. :popconfirm="{
  94. title: '确定要删除?',
  95. }"
  96. @confirm="handleDeleteDefenseNotice(scope.row.id)"
  97. v-if="defenseNoticePermissions"
  98. />
  99. </div>
  100. </template>
  101. </BasicTable>
  102. </div>
  103. </main>
  104. </div>
  105. </template>
  106. <script lang="ts" setup>
  107. import { useRouter } from 'vue-router';
  108. import { ref, onMounted, reactive } from 'vue';
  109. import { Plus } from '@element-plus/icons-vue';
  110. import { ElMessage } from 'element-plus';
  111. import BasicSearch from '@/components/BasicSearch.vue';
  112. import BasicTable from '@/components/BasicTable.vue';
  113. import ActionButton from '@/components/ActionButton.vue';
  114. import useTableConfig from '@/hooks/useTableConfigHook';
  115. import { useDisasterWarningHook } from './src/hook';
  116. import { useUserInfoHook } from '@/views/disaster/hooks';
  117. import type { DefenseNoticeListResponse, DefenseNoticeListQuery } from '@/types/disaster-warning';
  118. import type { QueryPageRequest } from '@/types/disaster';
  119. import { getDefenseNoticeList, deleteDefenseNoticeItem, publishDefenseNoticeItem } from '@/api/disaster-warning';
  120. import {
  121. ACTIVE_STATUS,
  122. ACTIVE_STATUS_COLOR,
  123. ACTIVE_STATUS_MAP,
  124. DISASTER_PERMISSIONS,
  125. } from '@/views/disaster/constant';
  126. import {
  127. DEFENSE_NOTICE_SEARCH_CONFIG_DEFAULT,
  128. DEFENSE_NOTICE_SEARCH_CONFIG_PERMISSION,
  129. TABLE_OPTIONS,
  130. DEFENSE_NOTICE_TABLE_COLUMNS_DEFAULT,
  131. DEFENSE_NOTICE_TABLE_COLUMNS_PERMISSION,
  132. TABLE_HEIGHT_DEFAULT,
  133. TABLE_HEIGHT_PREMISSION,
  134. } from './src/config';
  135. const { permissions } = useUserInfoHook();
  136. const {
  137. disasterTypeDice,
  138. disasterLevelDice,
  139. getDisasterTypeDict,
  140. getDisasterLevelDict,
  141. getDisasterType,
  142. getDisasterLevel,
  143. } = useDisasterWarningHook();
  144. const defenseNoticePermissions = ref<Boolean>(false);
  145. const tableData = ref<DefenseNoticeListResponse[]>([]);
  146. const router = useRouter();
  147. const defaultName = 'defense-notice-item';
  148. const handleEditDefenseNotice = (id: number) => {
  149. router.push({
  150. name: defaultName,
  151. query: { id, operate: 'edit' },
  152. });
  153. };
  154. const handleCreateDefenseNotice = () => {
  155. router.push({
  156. name: defaultName,
  157. query: {
  158. operate: 'create',
  159. },
  160. });
  161. };
  162. const handleViewDefenseNotice = (id: number) => {
  163. router.push({
  164. name: defaultName,
  165. query: { id },
  166. });
  167. };
  168. const handlePublishDefenseNotice = async (id: number, effectState: number) => {
  169. const message = effectState === ACTIVE_STATUS.ACTIVE ? '已取消发布' : '发布成功';
  170. const effectStateStatus = effectState === ACTIVE_STATUS.ACTIVE ? ACTIVE_STATUS.NOT_EFFECTIVE : ACTIVE_STATUS.ACTIVE;
  171. await publishDefenseNoticeItem({ id, effectState: effectStateStatus });
  172. await getTableData();
  173. ElMessage.success(message);
  174. };
  175. const handleDeleteDefenseNotice = async (id: number) => {
  176. await deleteDefenseNoticeItem(id);
  177. await getTableData();
  178. ElMessage.success('删除成功');
  179. };
  180. const searchData = reactive({
  181. disasterType: null,
  182. disasterLevel: null,
  183. effectState: null,
  184. });
  185. const { tableConfig, pagination } = useTableConfig(DEFENSE_NOTICE_TABLE_COLUMNS_DEFAULT, TABLE_OPTIONS);
  186. let defenseNoticeListQuery: QueryPageRequest<DefenseNoticeListQuery> = {
  187. pageNumber: pagination.pageNumber,
  188. pageSize: pagination.pageSize,
  189. queryParam: {},
  190. };
  191. const handleSearch = () => {
  192. defenseNoticeListQuery.queryParam = {};
  193. if (searchData.disasterLevel) {
  194. defenseNoticeListQuery.queryParam.disasterLevel = searchData.disasterLevel;
  195. }
  196. if (searchData.effectState) {
  197. defenseNoticeListQuery.queryParam.effectState = searchData.effectState;
  198. }
  199. if (searchData.disasterType) {
  200. defenseNoticeListQuery.queryParam.disasterType = searchData.disasterType;
  201. }
  202. getTableData();
  203. };
  204. const handleSizeChange = (value: number) => {
  205. pagination.pageSize = value;
  206. defenseNoticeListQuery.pageSize = value;
  207. getTableData();
  208. };
  209. const handleCurrentChange = (value: number) => {
  210. pagination.pageNumber = value;
  211. defenseNoticeListQuery.pageNumber = value;
  212. getTableData();
  213. };
  214. const getTableData = async () => {
  215. tableConfig.loading = true;
  216. const res = await getDefenseNoticeList(defenseNoticeListQuery);
  217. tableData.value = res.records;
  218. pagination.total = res.totalRow;
  219. tableConfig.loading = false;
  220. };
  221. onMounted(() => {
  222. getTableData();
  223. getDisasterTypeDict();
  224. getDisasterLevelDict();
  225. defenseNoticePermissions.value = Boolean(
  226. permissions.find((item: { code: string }) => item.code === DISASTER_PERMISSIONS.DEFENSE_NOTICE),
  227. );
  228. tableConfig.maxHeight = defenseNoticePermissions.value ? TABLE_HEIGHT_PREMISSION : TABLE_HEIGHT_DEFAULT;
  229. if (defenseNoticePermissions.value) {
  230. tableConfig.columns = DEFENSE_NOTICE_TABLE_COLUMNS_PERMISSION;
  231. }
  232. });
  233. </script>
  234. <style lang="scss" scoped>
  235. @use '@/styles/page-details-layout.scss' as *;
  236. @use '@/styles/page-main-layout.scss' as *;
  237. @use './src/style/common.scss' as *;
  238. @use '@/views/disaster/style/disaster.scss' as *;
  239. </style>