list.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <script lang="ts" setup>
  2. import type {
  3. OnActionClickParams,
  4. VxeTableGridOptions,
  5. } from '#/adapter/vxe-table';
  6. import type { PatientEvaluationModel } from '#/api';
  7. import { Page, useVbenModal } from '@vben/common-ui';
  8. import { Button, message } from 'ant-design-vue';
  9. import { useVbenVxeGrid } from '#/adapter/vxe-table';
  10. import {
  11. exportSatisfactionEvaluationsMethod,
  12. listSatisfactionEvaluationsMethod,
  13. } from '#/api';
  14. import {
  15. getLogisticsCompanyLabelMap,
  16. resolveLogisticsCompanyLabel,
  17. } from '#/api/model/process-node-dict';
  18. import {
  19. useSatisfactionSearchFormSchema,
  20. useSatisfactionTableColumns,
  21. } from './data';
  22. import Detail from './modules/detail.vue';
  23. const [DetailModal, detailModalApi] = useVbenModal({
  24. connectedComponent: Detail,
  25. destroyOnClose: true,
  26. });
  27. const [Grid, gridApi] = useVbenVxeGrid({
  28. formOptions: {
  29. schema: useSatisfactionSearchFormSchema(),
  30. submitOnChange: false,
  31. wrapperClass: 'satisfaction-search-form',
  32. },
  33. gridOptions: {
  34. columns: useSatisfactionTableColumns(onActionClick),
  35. height: 'auto',
  36. keepSource: true,
  37. pagerConfig: {
  38. pageSize: 5,
  39. layouts: ['PrevPage', 'Jump', 'NextPage'],
  40. },
  41. proxyConfig: {
  42. ajax: {
  43. async query({ page }, formValues) {
  44. const [result, logisticsCompanyMap] = await Promise.all([
  45. listSatisfactionEvaluationsMethod(
  46. page.currentPage,
  47. page.pageSize,
  48. formValues,
  49. ),
  50. getLogisticsCompanyLabelMap(),
  51. ]);
  52. return {
  53. ...result,
  54. items: result.items.map((item) => ({
  55. ...item,
  56. logisticsCompany: resolveLogisticsCompanyLabel(
  57. item.logisticsCompany,
  58. logisticsCompanyMap,
  59. ),
  60. })),
  61. };
  62. },
  63. },
  64. },
  65. rowConfig: {
  66. keyField: 'id',
  67. },
  68. stripe: true,
  69. } as VxeTableGridOptions<PatientEvaluationModel.SatisfactionEvaluation>,
  70. });
  71. function onActionClick(
  72. e: OnActionClickParams<PatientEvaluationModel.SatisfactionEvaluation>,
  73. ) {
  74. switch (e.code) {
  75. case 'view': {
  76. onViewHandle(e.row);
  77. break;
  78. }
  79. }
  80. }
  81. function onViewHandle(row: PatientEvaluationModel.SatisfactionEvaluation) {
  82. detailModalApi.setData(row).open();
  83. }
  84. async function onExport() {
  85. const formValues = await gridApi.formApi.getValues();
  86. try {
  87. await exportSatisfactionEvaluationsMethod(formValues);
  88. message.success('导出成功');
  89. } catch (error: any) {
  90. message.error(error.message || '导出失败');
  91. }
  92. }
  93. </script>
  94. <template>
  95. <Page auto-content-height class="satisfaction-page">
  96. <DetailModal />
  97. <Grid>
  98. <template #toolbar-tools>
  99. <Button type="link" @click="onExport">导出</Button>
  100. </template>
  101. </Grid>
  102. </Page>
  103. </template>
  104. <style scoped>
  105. .satisfaction-page :deep(.satisfaction-search-form) {
  106. margin-bottom: 0;
  107. }
  108. </style>