list.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import {
  2. PropType,
  3. computed,
  4. defineComponent,
  5. onMounted,
  6. reactive,
  7. watch
  8. } from 'vue';
  9. import {
  10. IApiUserPaymentOrderPage,
  11. api_userPaymentOrderPage,
  12. api_userPaymentOrderStudentRefundOrderPage,
  13. type_OrderStatus
  14. } from '../api';
  15. import Item from './item';
  16. import MFullRefresh from '@/components/m-full-refresh';
  17. import { Button, DatePicker, List, Popup, showToast } from 'vant';
  18. import MEmpty from '@/components/m-empty';
  19. import ItemSkelete from './item-skelete';
  20. import icon_arrow from '../image/icon_arrow.svg';
  21. import styles from './list.module.less';
  22. import { usePageVisibility } from '@vant/use';
  23. import { listenerMessage } from '@/helpers/native-message';
  24. export default defineComponent({
  25. name: 'collection-record-list',
  26. props: {
  27. orderStatus: {
  28. type: String,
  29. default: ''
  30. },
  31. refundIndex: {
  32. type: Number,
  33. default: 0
  34. }
  35. },
  36. emits: ['refund'],
  37. setup(props, { emit }) {
  38. const time = new Date();
  39. const data = reactive({
  40. page: 1,
  41. dateTime: [
  42. time.getFullYear().toString(),
  43. (time.getMonth() + 1).toString().padStart(2, '0')
  44. ],
  45. minDate: new Date(time.getFullYear(), 0, 1),
  46. maxDate: new Date(time.getFullYear() + 10, 5, 1),
  47. list: [],
  48. skelete: true,
  49. refreshing: false,
  50. finished: false,
  51. loading: false,
  52. dataOpen: false
  53. });
  54. const statusTypes: { [_: string]: string } = {
  55. WAIT_PAY: '待领取',
  56. PAYING: '待领取',
  57. PAID: '领取成功',
  58. CLOSED: '已关闭'
  59. };
  60. const statusColors: { [_: string]: string } = {
  61. WAIT_PAY: 'rgba(64, 196, 203, 1)',
  62. PAYING: 'rgba(64, 196, 203, 1)',
  63. PAID: 'rgba(28, 172, 241, 1)',
  64. CLOSED: 'rgba(170, 170, 170, 1)',
  65. ING: 'rgba(153, 153, 153, 1)',
  66. REJECT: 'rgba(255, 90, 86, 1)',
  67. PASS: 'rgba(255, 162, 68, 1)'
  68. };
  69. const refundTypes: { [_: string]: string } = {
  70. ING: '退回申请中',
  71. REJECT: '退回失败',
  72. PASS: '退回成功',
  73. CLOSED: '退回关闭'
  74. };
  75. const getList = async () => {
  76. data.loading = true;
  77. let res = {} as any;
  78. if (props.orderStatus === 'REFUNDED') {
  79. res = await api_userPaymentOrderStudentRefundOrderPage({
  80. page: data.page,
  81. rows: 10,
  82. refundMonth: data.dateTime.join('-')
  83. });
  84. if (res?.code === 200 && Array.isArray(res?.data?.rows)) {
  85. data.list = res.data.rows.map((item: any) => {
  86. return {
  87. ...item,
  88. createTime: item.refundTime,
  89. statusName: refundTypes[item.refundAudit],
  90. statusColor: statusColors[item.status],
  91. isRefund: true // 是退款列表
  92. };
  93. });
  94. data.finished = !res.data.next;
  95. data.page = data.page + 1;
  96. }
  97. } else {
  98. try {
  99. res = await api_userPaymentOrderPage({
  100. page: data.page,
  101. rows: 10,
  102. orderStatus: props.orderStatus as any,
  103. payMonth: data.dateTime.join('-')
  104. });
  105. } catch (error) {}
  106. if (res?.code === 200 && Array.isArray(res?.data?.rows)) {
  107. data.list = res.data.rows.map((item: any) => {
  108. return {
  109. ...item,
  110. createTime: item.payTime,
  111. statusName: statusTypes[item.status],
  112. statusColor: statusColors[item.status]
  113. };
  114. });
  115. data.finished = !res.data.next;
  116. data.page = data.page + 1;
  117. }
  118. }
  119. setTimeout(() => {
  120. data.refreshing = false;
  121. }, 500);
  122. data.loading = false;
  123. data.skelete = false;
  124. };
  125. watch(
  126. () => props.refundIndex,
  127. () => handlStart()
  128. );
  129. onMounted(() => {
  130. getList();
  131. listenerMessage('webViewOnResume', () => handlStart());
  132. });
  133. const handlStart = () => {
  134. data.finished = false;
  135. data.page = 1;
  136. getList();
  137. };
  138. const timeName = computed(() => {
  139. return `${data.dateTime[0]}年${data.dateTime[1]}月`;
  140. });
  141. return () => (
  142. <>
  143. <MFullRefresh
  144. modelValue={data.refreshing}
  145. onRefresh={() => {
  146. data.refreshing = true;
  147. console.log('下拉');
  148. handlStart();
  149. }}>
  150. <Button
  151. class={styles.downBtn}
  152. size="small"
  153. round
  154. onClick={() => (data.dataOpen = true)}>
  155. <div>{timeName.value}</div>
  156. <img class={styles.downIcon} src={icon_arrow} />
  157. </Button>
  158. {data.skelete && new Array(5).fill(1).map(i => <ItemSkelete />)}
  159. {data.list.length !== 0 && (
  160. <List
  161. loading={data.loading}
  162. finished={data.finished}
  163. finishedText=" ">
  164. {data.list.map(item => {
  165. return (
  166. <Item
  167. item={item}
  168. onClose={() => handlStart()}
  169. onRefund={() => emit('refund')}
  170. />
  171. );
  172. })}
  173. </List>
  174. )}
  175. {!data.skelete && data.list.length === 0 && (
  176. <MEmpty description="暂无记录" />
  177. )}
  178. </MFullRefresh>
  179. <Popup teleport="body" v-model:show={data.dataOpen} position="bottom">
  180. <DatePicker
  181. v-model={data.dateTime}
  182. title="选择年月"
  183. columnsType={['year', 'month']}
  184. minDate={data.minDate}
  185. maxDate={data.maxDate}
  186. onConfirm={() => {
  187. data.dataOpen = false;
  188. console.log(data.dateTime);
  189. handlStart();
  190. }}
  191. />
  192. </Popup>
  193. </>
  194. );
  195. }
  196. });