order.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. import OEmpty from '@/components/o-empty'
  2. import { orderStatus } from '@/constant'
  3. import { moneyFormat } from '@/helpers/utils'
  4. import {
  5. Button,
  6. Cell,
  7. CellGroup,
  8. Field,
  9. Grid,
  10. GridItem,
  11. Image,
  12. List,
  13. Popup,
  14. Radio,
  15. RadioGroup,
  16. showToast
  17. } from 'vant'
  18. import { defineComponent, onMounted, reactive, ref } from 'vue'
  19. import { useRoute, useRouter } from 'vue-router'
  20. import request from '../../request-music'
  21. import styles from '../index.module.less'
  22. export default defineComponent({
  23. name: 'order',
  24. emits: ['next'],
  25. setup() {
  26. const router = useRouter()
  27. const route = useRoute()
  28. const form = reactive({
  29. isClick: false,
  30. list: [] as any,
  31. listState: {
  32. dataShow: true, // 判断是否有数据
  33. loading: false,
  34. finished: false
  35. },
  36. params: {
  37. page: 1,
  38. rows: 20
  39. },
  40. resionList: [] as any,
  41. refundStatus: false,
  42. resion: null,
  43. refundSelect: {} as any,
  44. checked: null as any
  45. })
  46. // userPaymentOrder/page
  47. const getList = async () => {
  48. try {
  49. if (form.isClick) return
  50. form.isClick = true
  51. const res = await request.post('/api-student/userPaymentOrder/page', {
  52. data: {
  53. ...form.params,
  54. bizId: route.query.id,
  55. goodsQuery: true
  56. }
  57. })
  58. form.listState.loading = false
  59. const result = res.data || {}
  60. // 处理重复请求数据
  61. if (form.list.length > 0 && result.current === 1) {
  62. return
  63. }
  64. const rows = result.rows || []
  65. rows.goodsInfos &&
  66. rows.goodsInfos.forEach((item: any) => {
  67. const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : ''
  68. item.goodsUrl = img
  69. })
  70. form.list = form.list.concat(rows)
  71. form.listState.finished = result.current >= result.pages
  72. form.params.page = result.current + 1
  73. form.listState.dataShow = form.list.length > 0
  74. form.isClick = false
  75. } catch {
  76. form.listState.dataShow = false
  77. form.listState.finished = true
  78. form.isClick = false
  79. }
  80. }
  81. const getDefaultParams = async () => {
  82. try {
  83. const { data } = await request.get('/api-student/sysParamConfig/queryByParamName', {
  84. params: {
  85. paramName: 'refund_reason'
  86. }
  87. })
  88. const temp = data.paramValue.split('\n') || []
  89. temp.forEach((item: any, index: number) => {
  90. form.resionList.push({
  91. text: item,
  92. value: index + 1
  93. })
  94. })
  95. form.resionList.push({
  96. text: '其它原因',
  97. value: 999
  98. })
  99. console.log(form.resionList, 'resionList')
  100. } catch {
  101. //
  102. }
  103. }
  104. // 确认退费
  105. const onConfirmRefund = async () => {
  106. try {
  107. const status = form.checked === 999 && !form.resion
  108. console.log(form.checked)
  109. if (!form.checked) {
  110. showToast('请选择原因')
  111. return
  112. } else if (status) {
  113. showToast('请输入原因')
  114. return
  115. }
  116. const refundReason = form.resionList.find((item: any) => item.value === form.checked)
  117. console.log({
  118. merOrderNo: form.refundSelect.orderNo,
  119. refundReason: form.checked === 999 ? form.resion : refundReason.text
  120. })
  121. // return
  122. await request.post('/api-student/userPaymentOrder/refundPayment', {
  123. data: {
  124. merOrderNo: form.refundSelect.orderNo,
  125. refundReason: refundReason.text
  126. }
  127. })
  128. form.refundStatus = false
  129. onSearch()
  130. } catch {
  131. //
  132. }
  133. }
  134. const onSearch = () => {
  135. form.params.page = 1
  136. form.list = []
  137. form.listState.dataShow = true // 判断是否有数据
  138. form.listState.loading = false
  139. form.listState.finished = false
  140. getList()
  141. }
  142. // 查看详情
  143. const onDetails = (item: any) => {
  144. router.push({
  145. path: 'payment-result',
  146. query: {
  147. orderNo: item.orderNo
  148. }
  149. })
  150. }
  151. onMounted(() => {
  152. getDefaultParams()
  153. getList()
  154. })
  155. return () => (
  156. <div style={{ paddingTop: '20px' }}>
  157. {form.listState.dataShow ? (
  158. <List
  159. v-model:loading={form.listState.loading}
  160. finished={form.listState.finished}
  161. finishedText=" "
  162. class={[styles.liveList]}
  163. onLoad={getList}
  164. immediateCheck={false}
  165. >
  166. {form.list.map((item: any) => (
  167. <CellGroup inset class={styles.orderCellGroup} onClick={() => onDetails(item)}>
  168. <Cell
  169. title={item.createTime}
  170. titleClass={styles.payTime}
  171. value={orderStatus[item.status]}
  172. valueClass={
  173. item.status === 'WAIT_PAY'
  174. ? styles.payStatus
  175. : item.status === 'PAID'
  176. ? styles.paySuccess
  177. : ''
  178. }
  179. ></Cell>
  180. <Cell border={false} class={styles.imgGroup}>
  181. {{
  182. title: () => (
  183. <Grid border={false}>
  184. {item.goodsInfos &&
  185. item.goodsInfos.map((goods: any) => (
  186. <GridItem>
  187. <Image class={styles.img} src={goods.goodsUrl} />
  188. </GridItem>
  189. ))}
  190. </Grid>
  191. )
  192. }}
  193. </Cell>
  194. <Cell class={styles.btnGroup} center>
  195. {{
  196. title: () => (
  197. <span class={styles.btnPrice}>¥{moneyFormat(item.currentPrice)}</span>
  198. ),
  199. value: () => (
  200. <div class={styles.btns}>
  201. {/* {item.status === 'WAIT_PAY' && (
  202. <>
  203. <Button round plain color="#AAAAAA">
  204. 修改订单
  205. </Button>
  206. <Button round plain color="#FF8057">
  207. 继续支付
  208. </Button>
  209. </>
  210. )} */}
  211. {/* 订单成功 订单金额大于0 */}
  212. {item.status === 'PAID' && (
  213. <Button
  214. round
  215. plain
  216. color="#AAAAAA"
  217. onClick={(e: any) => {
  218. e.stopPropagation()
  219. form.refundSelect = item
  220. form.refundStatus = true
  221. }}
  222. >
  223. 申请退款
  224. </Button>
  225. )}
  226. </div>
  227. )
  228. }}
  229. </Cell>
  230. </CellGroup>
  231. ))}
  232. </List>
  233. ) : (
  234. <OEmpty btnStatus={false} classImgSize="SMALL" tips="暂无订单" />
  235. )}
  236. <Popup v-model:show={form.refundStatus} round style={{ width: '90%' }}>
  237. <div class={styles.container}>
  238. <div class={[styles.dialogTitle, styles.dialogRefund]}>
  239. <i></i>
  240. 申请退款
  241. </div>
  242. <div class={styles.refundContent}>
  243. <div class={styles.tips}>
  244. 您将要发起退款,退款需承担千分之六的手续费,确认退款后款项将原路返还到您的付款账户中。
  245. </div>
  246. <div class={styles.refundTitle}>
  247. <span>*</span>请选择您的退款原因
  248. </div>
  249. <RadioGroup v-model={form.checked}>
  250. {form.resionList &&
  251. form.resionList.map((item: any) => (
  252. <Cell style="padding: 16px 0;" onClick={() => (form.checked = item.value)}>
  253. {{
  254. icon: () => <Radio name={item.value} />,
  255. title: () => <span style={'padding-left: 6px'}>{item.text}</span>
  256. }}
  257. </Cell>
  258. ))}
  259. </RadioGroup>
  260. {form.checked === 999 && (
  261. <Field
  262. class={styles.phoneName}
  263. v-model={form.resion}
  264. placeholder="请输入原因"
  265. maxlength={15}
  266. type="textarea"
  267. rows={2}
  268. />
  269. )}
  270. </div>
  271. <div class={['van-hairline--top van-dialog__footer']}>
  272. <Button
  273. onClick={onConfirmRefund}
  274. class={['van-button van-button--default van-button--large van-dialog__cancel']}
  275. >
  276. 确认退款
  277. </Button>
  278. <Button
  279. onClick={() => (form.refundStatus = false)}
  280. class={[
  281. 'van-button van-button--default van-button--large van-dialog__confirm van-hairline--left'
  282. ]}
  283. >
  284. 取消
  285. </Button>
  286. </div>
  287. </div>
  288. </Popup>
  289. </div>
  290. )
  291. }
  292. })