PageDefenseNotice.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div class="disaster-precaution-container">
  3. <header class="disaster-precaution-container__header">
  4. <span class="disaster-precaution-container__title">灾害防御通知</span>
  5. </header>
  6. <main class="disaster-precaution-container__main">
  7. <div class="disaster-precaution">
  8. <header class="disaster-precaution__header">
  9. <el-button
  10. type="primary"
  11. class="disaster-precaution__header--button"
  12. :icon="Plus"
  13. @click="handleCreateDefenseNotice"
  14. v-if="defenseNoticePermissions"
  15. >创建灾害防御通知
  16. </el-button>
  17. <Search
  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. </Search>
  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. <ActionButton
  69. text="编辑"
  70. v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE && defenseNoticePermissions"
  71. @click="handleEditDefenseNotice(scope.row.id)"
  72. />
  73. <ActionButton text="查看" @click="handleViewDefenseNotice(scope.row.id)" />
  74. <ActionButton
  75. text="发布"
  76. :popconfirm="{
  77. title: '确定要发布?',
  78. }"
  79. v-if="scope.row.effectState === ACTIVE_STATUS.NOT_EFFECTIVE && defenseNoticePermissions"
  80. @confirm="handlePublishDefenseNotice(scope.row.id, scope.row.effectState)"
  81. />
  82. <ActionButton
  83. text="撤回"
  84. :popconfirm="{
  85. title: '确定要撤回?',
  86. }"
  87. v-else-if="scope.row.effectState === ACTIVE_STATUS.ACTIVE && defenseNoticePermissions"
  88. @confirm="handlePublishDefenseNotice(scope.row.id, scope.row.effectState)"
  89. />
  90. <ActionButton
  91. text="删除"
  92. :popconfirm="{
  93. title: '确定要删除?',
  94. }"
  95. @confirm="handleDeleteDefenseNotice(scope.row.id)"
  96. v-if="defenseNoticePermissions"
  97. />
  98. </template>
  99. </BasicTable>
  100. </div>
  101. </main>
  102. </div>
  103. </template>
  104. <script lang="ts" setup>
  105. import { ref, onMounted, reactive } from 'vue';
  106. import { Plus } from '@element-plus/icons-vue';
  107. import Search from '@/views/disaster/components/Search.vue';
  108. import BasicTable from '@/components/BasicTable.vue';
  109. import ActionButton from '@/components/ActionButton.vue';
  110. import useTableConfig from '@/hooks/useTableConfigHook';
  111. import { getDefenseNoticeList, deleteDefenseNoticeItem } from '@/api/disaster-warning';
  112. import type { DefenseNoticeListResponse, DefenseNoticeListQuery } from '@/types/disaster-warning';
  113. import type { QueryPageRequest } from '@/types/disaster';
  114. import {
  115. ACTIVE_STATUS,
  116. ACTIVE_STATUS_COLOR,
  117. ACTIVE_STATUS_MAP,
  118. DISASTER_PERMISSIONS,
  119. } from '@/views/disaster/constant';
  120. import {
  121. DEFENSE_NOTICE_SEARCH_CONFIG_DEFAULT,
  122. DEFENSE_NOTICE_SEARCH_CONFIG_PERMISSION,
  123. TABLE_OPTIONS,
  124. DEFENSE_NOTICE_TABLE_COLUMNS_DEFAULT,
  125. DEFENSE_NOTICE_TABLE_COLUMNS_PERMISSION,
  126. TABLE_HEIGHT_DEFAULT,
  127. TABLE_HEIGHT_PREMISSION,
  128. } from './src/config';
  129. import { useRouter } from 'vue-router';
  130. import { ElMessage } from 'element-plus';
  131. import { publishDefenseNoticeItem } from '@/api/disaster-warning';
  132. import { useDisasterWarningHook } from './src/hook';
  133. import { useUserInfoHook } from '@/views/disaster/hooks/userInfo';
  134. const { permissions } = useUserInfoHook();
  135. const {
  136. disasterTypeDice,
  137. disasterLevelDice,
  138. getDisasterTypeDict,
  139. getDisasterLevelDict,
  140. getDisasterType,
  141. getDisasterLevel,
  142. } = useDisasterWarningHook();
  143. const defenseNoticePermissions = ref<Boolean>(false);
  144. const tableData = ref<DefenseNoticeListResponse[]>([]);
  145. const router = useRouter();
  146. const defaultName = 'defense-notice-item';
  147. const handleEditDefenseNotice = (id: number) => {
  148. router.push({
  149. name: defaultName,
  150. query: { id, operate: 'edit' },
  151. });
  152. };
  153. const handleCreateDefenseNotice = () => {
  154. router.push({
  155. name: defaultName,
  156. query: {
  157. operate: 'create',
  158. },
  159. });
  160. };
  161. const handleViewDefenseNotice = (id: number) => {
  162. router.push({
  163. name: defaultName,
  164. query: { id },
  165. });
  166. };
  167. const handlePublishDefenseNotice = async (id: number, effectState: number) => {
  168. const message = effectState === ACTIVE_STATUS.ACTIVE ? '已取消发布' : '发布成功';
  169. const effectStateStatus = effectState === ACTIVE_STATUS.ACTIVE ? ACTIVE_STATUS.NOT_EFFECTIVE : ACTIVE_STATUS.ACTIVE;
  170. await publishDefenseNoticeItem({ id, effectState: effectStateStatus });
  171. await getTableData();
  172. ElMessage.success(message);
  173. };
  174. const handleDeleteDefenseNotice = async (id: number) => {
  175. await deleteDefenseNoticeItem(id);
  176. await getTableData();
  177. ElMessage.success('删除成功');
  178. };
  179. const searchData = reactive({
  180. disasterType: '',
  181. disasterLevel: '',
  182. effectState: '',
  183. });
  184. const { tableConfig, pagination } = useTableConfig(DEFENSE_NOTICE_TABLE_COLUMNS_DEFAULT, TABLE_OPTIONS);
  185. let defenseNoticeListQuery: QueryPageRequest<DefenseNoticeListQuery> = {
  186. pageNumber: pagination.pageNumber,
  187. pageSize: pagination.pageSize,
  188. queryParam: {},
  189. };
  190. const handleSearch = () => {
  191. defenseNoticeListQuery.queryParam = {};
  192. if (searchData.disasterLevel !== '') {
  193. defenseNoticeListQuery.queryParam.disasterLevel = searchData.disasterLevel;
  194. }
  195. if (searchData.effectState !== '') {
  196. defenseNoticeListQuery.queryParam.effectState = searchData.effectState;
  197. }
  198. if (searchData.disasterType !== '') {
  199. defenseNoticeListQuery.queryParam.disasterType = searchData.disasterType;
  200. }
  201. if (Object.keys(defenseNoticeListQuery.queryParam).length > 0) {
  202. pagination.pageNumber = 1;
  203. defenseNoticeListQuery.pageNumber = 1;
  204. }
  205. getTableData();
  206. };
  207. const handleSizeChange = (value: number) => {
  208. pagination.pageSize = value;
  209. defenseNoticeListQuery.pageSize = value;
  210. getTableData();
  211. };
  212. const handleCurrentChange = (value: number) => {
  213. pagination.pageNumber = value;
  214. defenseNoticeListQuery.pageNumber = value;
  215. getTableData();
  216. };
  217. const getTableData = async () => {
  218. tableConfig.loading = true;
  219. const res = await getDefenseNoticeList(defenseNoticeListQuery);
  220. tableData.value = res.records;
  221. pagination.total = res.totalRow;
  222. tableConfig.loading = false;
  223. };
  224. onMounted(() => {
  225. getTableData();
  226. getDisasterTypeDict();
  227. getDisasterLevelDict();
  228. defenseNoticePermissions.value = Boolean(
  229. permissions.find((item: { code: string }) => item.code === DISASTER_PERMISSIONS.DEFENSE_NOTICE),
  230. );
  231. tableConfig.height = defenseNoticePermissions.value ? TABLE_HEIGHT_PREMISSION : TABLE_HEIGHT_DEFAULT;
  232. if (defenseNoticePermissions.value) {
  233. tableConfig.columns = DEFENSE_NOTICE_TABLE_COLUMNS_PERMISSION;
  234. }
  235. });
  236. </script>
  237. <style lang="scss" scoped>
  238. @use '../style/disaster.scss' as *;
  239. @use './src/common.scss' as *;
  240. </style>