|  | @@ -0,0 +1,359 @@
 | 
	
		
			
				|  |  | +import MHeader from '@/components/m-header';
 | 
	
		
			
				|  |  | +import { defineComponent, onMounted, reactive } from 'vue';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  Button,
 | 
	
		
			
				|  |  | +  Cell,
 | 
	
		
			
				|  |  | +  CellGroup,
 | 
	
		
			
				|  |  | +  Field,
 | 
	
		
			
				|  |  | +  Image,
 | 
	
		
			
				|  |  | +  Popup,
 | 
	
		
			
				|  |  | +  Radio,
 | 
	
		
			
				|  |  | +  RadioGroup,
 | 
	
		
			
				|  |  | +  Tag,
 | 
	
		
			
				|  |  | +  showToast
 | 
	
		
			
				|  |  | +} from 'vant';
 | 
	
		
			
				|  |  | +import styles from './index.module.less';
 | 
	
		
			
				|  |  | +import iconRefunding from './images/icon_refunding.svg';
 | 
	
		
			
				|  |  | +import icon_success from './images/icon_success.svg';
 | 
	
		
			
				|  |  | +import iconClose from './images/icon_close.svg';
 | 
	
		
			
				|  |  | +import iconTradeing from './images/icon_tradeing.svg';
 | 
	
		
			
				|  |  | +import { useRoute, useRouter } from 'vue-router';
 | 
	
		
			
				|  |  | +import { browser, moneyFormat } from '@/helpers/utils';
 | 
	
		
			
				|  |  | +import { useEventListener, useWindowScroll } from '@vueuse/core';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +    api_userPaymentOrderCancelRefund,
 | 
	
		
			
				|  |  | +  api_userPaymentOrderDetail,
 | 
	
		
			
				|  |  | +  api_userPaymentOrderRefundPayment
 | 
	
		
			
				|  |  | +} from '../collection-record/api';
 | 
	
		
			
				|  |  | +import * as detailState from '@/state';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'collection-record-detail',
 | 
	
		
			
				|  |  | +  setup() {
 | 
	
		
			
				|  |  | +    const route = useRoute();
 | 
	
		
			
				|  |  | +    const router = useRouter();
 | 
	
		
			
				|  |  | +    const state = reactive({
 | 
	
		
			
				|  |  | +      refund: route.query.refund,
 | 
	
		
			
				|  |  | +      orders: {} as any,
 | 
	
		
			
				|  |  | +      goodsInfos: [] as any,
 | 
	
		
			
				|  |  | +      background: 'transparent',
 | 
	
		
			
				|  |  | +      color: '#fff',
 | 
	
		
			
				|  |  | +      backIconColor: 'white' as any,
 | 
	
		
			
				|  |  | +      timer: null as any,
 | 
	
		
			
				|  |  | +      timerCount: 0 // 执行次数
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const getDetails = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        if (!route.query.orderNo) return;
 | 
	
		
			
				|  |  | +        const { data } = await api_userPaymentOrderDetail(route.query.orderNo);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        state.orders = data || {};
 | 
	
		
			
				|  |  | +        // state.orders.status = 'REFUNDED'
 | 
	
		
			
				|  |  | +        const tempGoods = data.goodsInfos || [];
 | 
	
		
			
				|  |  | +        tempGoods.forEach((item: any) => {
 | 
	
		
			
				|  |  | +          const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : '';
 | 
	
		
			
				|  |  | +          item.goodsUrl = img;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        state.goodsInfos = tempGoods;
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 定时任务
 | 
	
		
			
				|  |  | +    const onTimeout = async () => {
 | 
	
		
			
				|  |  | +      // 判断订单状态,如果未支付则刷新
 | 
	
		
			
				|  |  | +      if (
 | 
	
		
			
				|  |  | +        ['WAIT_PAY', 'PAYING'].includes(state.orders.status) &&
 | 
	
		
			
				|  |  | +        state.timerCount <= 10
 | 
	
		
			
				|  |  | +      ) {
 | 
	
		
			
				|  |  | +        state.timer = setTimeout(async () => {
 | 
	
		
			
				|  |  | +          state.timerCount += 1;
 | 
	
		
			
				|  |  | +          await getDetails();
 | 
	
		
			
				|  |  | +          onTimeout();
 | 
	
		
			
				|  |  | +        }, 3000);
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        clearTimeout(state.timer);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const formatImg = (type: any) => {
 | 
	
		
			
				|  |  | +      const template: any = {
 | 
	
		
			
				|  |  | +        WAIT_PAY: iconTradeing,
 | 
	
		
			
				|  |  | +        PAYING: iconTradeing,
 | 
	
		
			
				|  |  | +        PAID: icon_success,
 | 
	
		
			
				|  |  | +        TIMEOUT: iconClose,
 | 
	
		
			
				|  |  | +        FAIL: iconClose,
 | 
	
		
			
				|  |  | +        CLOSED: iconClose,
 | 
	
		
			
				|  |  | +        REFUNDING: iconRefunding,
 | 
	
		
			
				|  |  | +        REFUNDED: icon_success
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      return template[type] || icon_success;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const formatOrderStatus = (status: string) => {
 | 
	
		
			
				|  |  | +      const temp: any = {
 | 
	
		
			
				|  |  | +        WAIT_PAY: '支付中',
 | 
	
		
			
				|  |  | +        PAYING: '支付中',
 | 
	
		
			
				|  |  | +        PAID: '支付成功',
 | 
	
		
			
				|  |  | +        TIMEOUT: '订单超时',
 | 
	
		
			
				|  |  | +        FAIL: '支付失败',
 | 
	
		
			
				|  |  | +        CLOSED: '订单关闭',
 | 
	
		
			
				|  |  | +        REFUNDING: '退款中',
 | 
	
		
			
				|  |  | +        REFUNDED: '已退款'
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      return temp[status];
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onMounted(async () => {
 | 
	
		
			
				|  |  | +      await getDetails();
 | 
	
		
			
				|  |  | +      await onTimeout();
 | 
	
		
			
				|  |  | +      useEventListener(document, 'scroll', () => {
 | 
	
		
			
				|  |  | +        const { y } = useWindowScroll();
 | 
	
		
			
				|  |  | +        if (y.value > 52) {
 | 
	
		
			
				|  |  | +          state.background = '#fff';
 | 
	
		
			
				|  |  | +          state.color = '#323333';
 | 
	
		
			
				|  |  | +          state.backIconColor = 'black';
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          state.background = 'transparent';
 | 
	
		
			
				|  |  | +          state.color = '#fff';
 | 
	
		
			
				|  |  | +          state.backIconColor = 'white';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const data = reactive({
 | 
	
		
			
				|  |  | +      open: false
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const forms = reactive({
 | 
	
		
			
				|  |  | +      refundReason: '',
 | 
	
		
			
				|  |  | +      refundReasonDes: ''
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** 取消订单 */
 | 
	
		
			
				|  |  | +    const handleCancel = async () => {
 | 
	
		
			
				|  |  | +      await api_userPaymentOrderRefundPayment({
 | 
	
		
			
				|  |  | +        merOrderNo: state.orders.orderNo,
 | 
	
		
			
				|  |  | +        serviceCharge: true,
 | 
	
		
			
				|  |  | +        paymentClient: 'STUDENT',
 | 
	
		
			
				|  |  | +        userId: detailState.state?.user?.data?.id,
 | 
	
		
			
				|  |  | +        refundReason:
 | 
	
		
			
				|  |  | +          forms.refundReason === '其他原因'
 | 
	
		
			
				|  |  | +            ? forms.refundReasonDes
 | 
	
		
			
				|  |  | +            : forms.refundReason,
 | 
	
		
			
				|  |  | +        userRefundOrderDetails: state.goodsInfos.map((goods: any) => ({
 | 
	
		
			
				|  |  | +          userPaymentOrderDetailId: goods.userPaymentOrderId,
 | 
	
		
			
				|  |  | +          num: goods.goodsNum
 | 
	
		
			
				|  |  | +        }))
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      showToast('申请退回成功');
 | 
	
		
			
				|  |  | +      getDetails();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** 取消退款申请 */
 | 
	
		
			
				|  |  | +    const handleBack = async () => {
 | 
	
		
			
				|  |  | +        await api_userPaymentOrderCancelRefund(state.orders.orderNo)
 | 
	
		
			
				|  |  | +        showToast('撤销退回成功');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.paymentResult}>
 | 
	
		
			
				|  |  | +        <div class={[styles.paymentTitle]}>
 | 
	
		
			
				|  |  | +          <MHeader background="transparent" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          {state.orders.id && (
 | 
	
		
			
				|  |  | +            <>
 | 
	
		
			
				|  |  | +              <div class={styles.orderType}>
 | 
	
		
			
				|  |  | +                <Image
 | 
	
		
			
				|  |  | +                  class={styles.img}
 | 
	
		
			
				|  |  | +                  src={formatImg(state.orders.status)}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <div class={styles.orderInfo}>
 | 
	
		
			
				|  |  | +                  <span>{formatOrderStatus(state.orders.status)}</span>
 | 
	
		
			
				|  |  | +                  {state.orders.status === 'PAID' ||
 | 
	
		
			
				|  |  | +                  state.orders.status === 'REFUNDING' ? (
 | 
	
		
			
				|  |  | +                    <div class={styles.orderPrice}>
 | 
	
		
			
				|  |  | +                      实付金额:¥ {moneyFormat(state.orders.paymentCashAmount)}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : (
 | 
	
		
			
				|  |  | +                    ''
 | 
	
		
			
				|  |  | +                  )}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                  {state.orders.status === 'REFUNDED' && (
 | 
	
		
			
				|  |  | +                    <div class={styles.orderPrice}>
 | 
	
		
			
				|  |  | +                      退款金额:¥ {moneyFormat(state.orders.paymentCashAmount)}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  )}
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </>
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <CellGroup inset class={[styles.cellGroup, styles.mTop]}>
 | 
	
		
			
				|  |  | +          <Cell>
 | 
	
		
			
				|  |  | +            {{
 | 
	
		
			
				|  |  | +              title: () => '付款时间',
 | 
	
		
			
				|  |  | +              value: () => <span>{state.orders.payTime || '--'}</span>
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          </Cell>
 | 
	
		
			
				|  |  | +          <Cell>
 | 
	
		
			
				|  |  | +            {{
 | 
	
		
			
				|  |  | +              title: () => '订单编号',
 | 
	
		
			
				|  |  | +              value: () => <span>{state.orders.orderNo}</span>
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          </Cell>
 | 
	
		
			
				|  |  | +        </CellGroup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <CellGroup inset class={styles.cellGroup}>
 | 
	
		
			
				|  |  | +          <div class={styles.buyDetail}>
 | 
	
		
			
				|  |  | +            <div class={styles.buyDetailTitle}>
 | 
	
		
			
				|  |  | +              <i></i> 购买详情
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          {state.goodsInfos.map((goods: any) => (
 | 
	
		
			
				|  |  | +            <Cell>
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                icon: () => (
 | 
	
		
			
				|  |  | +                  <Image class={styles.buyImg} src={goods.goodsUrl} />
 | 
	
		
			
				|  |  | +                ),
 | 
	
		
			
				|  |  | +                title: () => (
 | 
	
		
			
				|  |  | +                  <div class={styles.buyContent}>
 | 
	
		
			
				|  |  | +                    <p class={styles.goodsTitle}>{goods.goodsName}</p>
 | 
	
		
			
				|  |  | +                    <Tag class={styles.brandName}>
 | 
	
		
			
				|  |  | +                      {state.orders.orderType === 'VIP'
 | 
	
		
			
				|  |  | +                        ? '12个月'
 | 
	
		
			
				|  |  | +                        : goods.brandName}
 | 
	
		
			
				|  |  | +                    </Tag>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                ),
 | 
	
		
			
				|  |  | +                value: () => <span>x {goods.goodsNum}</span>
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </Cell>
 | 
	
		
			
				|  |  | +          ))}
 | 
	
		
			
				|  |  | +        </CellGroup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {state.orders.refundAudit === 'ING' && (
 | 
	
		
			
				|  |  | +          <Button
 | 
	
		
			
				|  |  | +            class={styles.cancelBtn}
 | 
	
		
			
				|  |  | +            block
 | 
	
		
			
				|  |  | +            round
 | 
	
		
			
				|  |  | +            type="primary"
 | 
	
		
			
				|  |  | +            onClick={() => handleBack()}>
 | 
	
		
			
				|  |  | +            撤销退回
 | 
	
		
			
				|  |  | +          </Button>
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  | +        {state.orders.refundable && (
 | 
	
		
			
				|  |  | +          <Button
 | 
	
		
			
				|  |  | +            class={[styles.cancelBtn, styles.orderNo]}
 | 
	
		
			
				|  |  | +            block
 | 
	
		
			
				|  |  | +            round
 | 
	
		
			
				|  |  | +            type="primary"
 | 
	
		
			
				|  |  | +            onClick={() => (data.open = true)}>
 | 
	
		
			
				|  |  | +            申请退回
 | 
	
		
			
				|  |  | +          </Button>
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          teleport="body"
 | 
	
		
			
				|  |  | +          v-model:show={data.open}
 | 
	
		
			
				|  |  | +          class={['popup-custom', 'van-scale']}
 | 
	
		
			
				|  |  | +          transition="van-scale">
 | 
	
		
			
				|  |  | +          <div class={styles.cancelBox}>
 | 
	
		
			
				|  |  | +            <div class={styles.boxContent}>
 | 
	
		
			
				|  |  | +              <div class={styles.title}>
 | 
	
		
			
				|  |  | +                <div class={styles.titleTag}></div> 申请退回
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.des}>
 | 
	
		
			
				|  |  | +                您将要发起退回,退回需承担千分之六的手续费,确认退回后款项将原路返还到您的付款账户中。
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.radioTitle}>
 | 
	
		
			
				|  |  | +                <span style={{ color: 'rgba(244, 69, 65, 1)' }}>*</span>
 | 
	
		
			
				|  |  | +                请选择您的退回原因
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <RadioGroup v-model={forms.refundReason}>
 | 
	
		
			
				|  |  | +                <Cell>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    title: () => (
 | 
	
		
			
				|  |  | +                      <div>
 | 
	
		
			
				|  |  | +                        <Radio name="价格太贵了">价格太贵了</Radio>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </Cell>
 | 
	
		
			
				|  |  | +                <Cell>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    title: () => (
 | 
	
		
			
				|  |  | +                      <div>
 | 
	
		
			
				|  |  | +                        <Radio name="不喜欢/不想要">不喜欢/不想要</Radio>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </Cell>
 | 
	
		
			
				|  |  | +                <Cell>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    title: () => (
 | 
	
		
			
				|  |  | +                      <div>
 | 
	
		
			
				|  |  | +                        <Radio name="七天无理由退货">七天无理由退货</Radio>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </Cell>
 | 
	
		
			
				|  |  | +                <Cell>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    title: () => (
 | 
	
		
			
				|  |  | +                      <div>
 | 
	
		
			
				|  |  | +                        <Radio name="其他原因">其他原因</Radio>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </Cell>
 | 
	
		
			
				|  |  | +              </RadioGroup>
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={styles.radioDes}
 | 
	
		
			
				|  |  | +                style={{
 | 
	
		
			
				|  |  | +                  display: forms.refundReason === '其他原因' ? '' : 'none'
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                <Field
 | 
	
		
			
				|  |  | +                  v-model={forms.refundReasonDes}
 | 
	
		
			
				|  |  | +                  rows="2"
 | 
	
		
			
				|  |  | +                  autosize
 | 
	
		
			
				|  |  | +                  label=""
 | 
	
		
			
				|  |  | +                  type="textarea"
 | 
	
		
			
				|  |  | +                  maxlength="50"
 | 
	
		
			
				|  |  | +                  placeholder="在这里填写退回原因"
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <div class={styles.radioBtns}>
 | 
	
		
			
				|  |  | +              <Button
 | 
	
		
			
				|  |  | +                block
 | 
	
		
			
				|  |  | +                onClick={() => {
 | 
	
		
			
				|  |  | +                  if (!forms.refundReason) {
 | 
	
		
			
				|  |  | +                    showToast('请选择退回原因');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  if (
 | 
	
		
			
				|  |  | +                    forms.refundReason === '其他原因' &&
 | 
	
		
			
				|  |  | +                    !forms.refundReasonDes
 | 
	
		
			
				|  |  | +                  ) {
 | 
	
		
			
				|  |  | +                    showToast('请输入退回原因');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  handleCancel();
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                确认退回
 | 
	
		
			
				|  |  | +              </Button>
 | 
	
		
			
				|  |  | +              <Button
 | 
	
		
			
				|  |  | +                block
 | 
	
		
			
				|  |  | +                type="primary"
 | 
	
		
			
				|  |  | +                plain
 | 
	
		
			
				|  |  | +                onClick={() => (data.open = false)}>
 | 
	
		
			
				|  |  | +                取消
 | 
	
		
			
				|  |  | +              </Button>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |