PageSupplyRequest.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <div class="safety-platform-container">
  3. <div class="safety-platform-container__header">
  4. <div class="breadcrumb-title">物资申领</div>
  5. </div>
  6. <div 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="handleCreateRequest"
  14. v-if="supplyRequestManagePermission"
  15. >
  16. 创建申领计划
  17. </el-button>
  18. <BasicSearch
  19. :searchConfig="SUPPLY_REQUEST_SEARCH_CONFIG"
  20. :searchData="searchData"
  21. @update:search-data="handleSearch"
  22. >
  23. <template #planName>
  24. <el-input
  25. v-model="searchData.planName"
  26. placeholder="请输入物资申领计划"
  27. clearable
  28. @keyup.enter="handleSearch"
  29. />
  30. </template>
  31. </BasicSearch>
  32. </header>
  33. <BasicTable
  34. :tableData="tableData"
  35. :tableConfig="tableConfig"
  36. @update:page-size="handleSizeChange"
  37. @update:page-number="handleCurrentChange"
  38. >
  39. <template #status="scope">
  40. <span>{{ getStatusText(scope.row.status) }}</span>
  41. </template>
  42. <template #action="scope">
  43. <div class="action-container--div">
  44. <ActionButton text="详情" @click="handleViewDetail(scope.row.id)" />
  45. <template v-if="scope.row.status === SUPPLY_REQUEST_STATUS.APPLYING">
  46. <ActionButton
  47. text="发起采购"
  48. @click="handleStartPurchase(scope.row.id, scope.row.purchaseDate)"
  49. v-if="supplyRequestManagePermission"
  50. />
  51. <ActionButton
  52. text="编辑"
  53. @click="handleEdit(scope.row.id, scope.row.planName, scope.row.purchaseDate)"
  54. v-if="supplyRequestManagePermission"
  55. />
  56. <ActionButton
  57. text="删除"
  58. :popconfirm="{
  59. title: '确定删除?',
  60. }"
  61. @confirm="handleDelete(scope.row.id)"
  62. v-if="supplyRequestManagePermission"
  63. />
  64. </template>
  65. <template
  66. v-else-if="
  67. scope.row.status === SUPPLY_REQUEST_STATUS.PURCHASING ||
  68. scope.row.status === SUPPLY_REQUEST_STATUS.RECEIVING
  69. "
  70. >
  71. <ActionButton
  72. text="编辑"
  73. @click="handleEdit(scope.row.id, scope.row.planName, scope.row.purchaseDate)"
  74. v-if="supplyRequestManagePermission"
  75. />
  76. </template>
  77. </div>
  78. </template>
  79. </BasicTable>
  80. </div>
  81. </div>
  82. </div>
  83. <SupplyRequestForm ref="supplyRequestFormRef" @success="handleFormSuccess" />
  84. <StartPurchaseForm ref="startPurchaseFormRef" @success="handleFormSuccess" />
  85. </template>
  86. <script setup lang="ts">
  87. import { ref, reactive, onMounted } from 'vue';
  88. import { Plus } from '@element-plus/icons-vue';
  89. import { ElMessage } from 'element-plus';
  90. import { useRouter } from 'vue-router';
  91. import BasicSearch from '@/components/BasicSearch.vue';
  92. import BasicTable from '@/components/BasicTable.vue';
  93. import ActionButton from '@/components/ActionButton.vue';
  94. import SupplyRequestForm from './src/components/SupplyRequestForm.vue';
  95. import StartPurchaseForm from './src/components/StartPurchaseForm.vue';
  96. import {
  97. SUPPLY_REQUEST_SEARCH_CONFIG,
  98. SUPPLY_REQUEST_TABLE_COLUMNS,
  99. SUPPLY_REQUEST_TABLE_OPTIONS,
  100. SUPPLY_REQUEST_TABLE_MAX_HEIGHT_DEFAULT,
  101. } from './src/config';
  102. import useTableConfig from '@/hooks/useTableConfigHook';
  103. import { useUserInfoHook } from '@/hooks/useUserInfoHook';
  104. import { EMERGENCY_PERMISSIONS } from '@/views/emergency/src/constant';
  105. import { SUPPLY_REQUEST_STATUS, SUPPLY_REQUEST_STATUS_MAP } from './src/constant';
  106. import type { QueryPageRequest } from '@/types/basic-query';
  107. import type { SupplyRequestListQuery, SupplyRequestListItem } from '@/types/emergency-supplier';
  108. import { getSupplyRequestList, deleteSupplyRequest } from '@/api/emergency-supplier';
  109. const router = useRouter();
  110. const { permissions } = useUserInfoHook();
  111. const supplyRequestManagePermission = ref<Boolean>(false);
  112. const { tableConfig, pagination } = useTableConfig(SUPPLY_REQUEST_TABLE_COLUMNS, SUPPLY_REQUEST_TABLE_OPTIONS);
  113. let supplyRequestListQuery: QueryPageRequest<SupplyRequestListQuery> = {
  114. pageNumber: pagination.pageNumber,
  115. pageSize: pagination.pageSize,
  116. queryParam: {},
  117. };
  118. const tableData = ref<SupplyRequestListItem[]>([]);
  119. const searchData = reactive({
  120. planName: '',
  121. status: SUPPLY_REQUEST_STATUS.ALL,
  122. });
  123. const supplyRequestFormRef = ref<InstanceType<typeof SupplyRequestForm>>();
  124. const startPurchaseFormRef = ref<InstanceType<typeof StartPurchaseForm>>();
  125. // 获取状态文本
  126. const getStatusText = (status: number) => {
  127. return SUPPLY_REQUEST_STATUS_MAP[status] || '';
  128. };
  129. // 搜索处理
  130. const handleSearch = () => {
  131. supplyRequestListQuery.queryParam = {};
  132. if (searchData.planName) {
  133. supplyRequestListQuery.queryParam.planName = searchData.planName;
  134. }
  135. if (searchData.status !== null && searchData.status !== SUPPLY_REQUEST_STATUS.ALL) {
  136. supplyRequestListQuery.queryParam.status = searchData.status;
  137. }
  138. getTableData();
  139. };
  140. // 获取表格数据
  141. const getTableData = async () => {
  142. tableConfig.loading = true;
  143. const res = await getSupplyRequestList(supplyRequestListQuery);
  144. tableData.value = res.records;
  145. pagination.total = res.totalRow;
  146. tableConfig.loading = false;
  147. };
  148. // 分页处理
  149. const handleSizeChange = (value: number) => {
  150. pagination.pageSize = value;
  151. supplyRequestListQuery.pageSize = value;
  152. getTableData();
  153. };
  154. const handleCurrentChange = (value: number) => {
  155. pagination.pageNumber = value;
  156. supplyRequestListQuery.pageNumber = value;
  157. getTableData();
  158. };
  159. // 创建申领计划
  160. const handleCreateRequest = () => {
  161. supplyRequestFormRef.value?.openAddDialog();
  162. };
  163. // 查看详情
  164. const handleViewDetail = (id: number) => {
  165. router.push({
  166. name: 'supply-request-detail',
  167. params: {
  168. id,
  169. },
  170. });
  171. };
  172. // 发起采购
  173. const handleStartPurchase = (id: number, purchaseDate: string) => {
  174. startPurchaseFormRef.value?.openDialog(id, purchaseDate);
  175. };
  176. // 编辑
  177. const handleEdit = (id: number, planName: string, purchaseDate: string) => {
  178. supplyRequestFormRef.value?.openEditDialog({
  179. id: id,
  180. planName: planName,
  181. purchaseDate: purchaseDate,
  182. });
  183. };
  184. // 表单提交成功回调
  185. const handleFormSuccess = () => {
  186. getTableData();
  187. };
  188. // 删除
  189. const handleDelete = async (id: number) => {
  190. await deleteSupplyRequest(id);
  191. await getTableData();
  192. ElMessage.success('删除成功');
  193. };
  194. onMounted(() => {
  195. getTableData();
  196. tableConfig.maxHeight = SUPPLY_REQUEST_TABLE_MAX_HEIGHT_DEFAULT;
  197. supplyRequestManagePermission.value = Boolean(
  198. permissions.find((item: { code: string }) => item.code === EMERGENCY_PERMISSIONS.SUPPLY_REQUEST_MANAGE),
  199. );
  200. });
  201. </script>
  202. <style scoped lang="scss">
  203. @use '@/styles/page-details-layout.scss' as *;
  204. @use '@/styles/page-main-layout.scss' as *;
  205. @use '@/styles/basic-table-action.scss' as *;
  206. @use './src/styles/page-common.scss' as *;
  207. </style>