OnsitePayment.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <!-- 场内支付---停车场 -->
  2. <template>
  3. <view class="parking-lock">
  4. <view class="parking-lock-box">
  5. <view class="parking-lock-pay">
  6. <view class="parking-lock-title">支付停车费</view>
  7. <view class="parking-lock-tips">请您确认停车费用,确认后请支付费用,结束停车。谢谢您的使用!</view>
  8. <view class="parking-lock-info">
  9. <view class="parking-lock-info-item" v-for="(item, index) in fieldList" :key="index">
  10. <view>{{ item.label }}</view>
  11. <view :class="item.money ? 'really-money' : item.vehicleNo ? 'vehicle-no' : ''">{{ orderInfo[item.key] }}</view>
  12. </view>
  13. </view>
  14. <view class="parking-lock-pay-btn" v-if="orderInfo.payAmount && Number(orderInfo.payAmount) > 0">
  15. <button type="default" @click="payMoney" :disabled="!orderInfo.id">立即支付</button>
  16. </view>
  17. <view class="parking-lock-pay-attention">
  18. <text>温馨提示:支付完成请尽快离场,超过免费时长将会重新计费</text>
  19. </view>
  20. </view>
  21. <!-- 支付方式 -->
  22. <ChoosePayment ref="choosePayment" :curOrderList="orderList" :jumpUrl="jumpUrl" :isIndoor="true" />
  23. </view>
  24. <!-- 广告轮播 -->
  25. <ad-banner />
  26. <u-toast ref="uToast" />
  27. </view>
  28. </template>
  29. <script>
  30. import ChoosePayment from '@/pages/choosePayment/choosePayment.vue';
  31. import AdBanner from '@/components/ad-banner/ad-banner.vue';
  32. import { base64Decrypt } from '@/utils';
  33. export default {
  34. components: {
  35. ChoosePayment,
  36. AdBanner
  37. },
  38. data() {
  39. return {
  40. // 支付订单编号
  41. orderList: [],
  42. // 订单信息
  43. orderInfo: {},
  44. // 回调地址
  45. jumpUrl: '',
  46. // 显示的字段集合
  47. fieldList: [
  48. { key: 'vehicleNo', label: '车牌号', vehicleNo: true },
  49. { key: 'parkingName', label: '停车场名称' },
  50. { key: 'entranceName', label: '入场车道' },
  51. { key: 'inTime', label: '入场时间' },
  52. { key: 'freeDuration', label: '免费时长' },
  53. { key: 'calcDuration', label: '计费时长' },
  54. { key: 'duration', label: '累计停车时长' },
  55. { key: 'payAmount', label: '应缴金额', money: true },
  56. { key: 'id', label: '订单编号' }
  57. ],
  58. paramsObj: {
  59. vehicleNo: '',
  60. parkNo: ''
  61. },
  62. timer: null,
  63. polyOrderId: undefined, // 预支付订单id
  64. isBack: 0,
  65. needPay: ''
  66. };
  67. },
  68. onLoad(options) {
  69. console.log('options', options);
  70. const { vehicleNo, parkNo, isBack, polyOrderId, needPay } = options;
  71. if (vehicleNo && parkNo) {
  72. // 车牌号进行base64加密解密 防止贵州银行支付报错
  73. this.paramsObj.vehicleNo = base64Decrypt(vehicleNo);
  74. this.paramsObj.parkNo = parkNo;
  75. this.isBack = isBack ?? 0;
  76. this.polyOrderId = polyOrderId;
  77. this.needPay = needPay;
  78. console.log('isBack', Number(this.isBack) !== 1);
  79. if (needPay && needPay === 'not') {
  80. this.$u.route({
  81. url: '/pages/center/order/order',
  82. type: 'redirectTo'
  83. });
  84. } else if (Number(this.isBack) !== 1) {
  85. this.getOrderDetails(this.paramsObj.vehicleNo, parkNo);
  86. }
  87. this.jumpUrl = `${location.origin}/#/pages/OnsitePayment/OnsitePayment?vehicleNo=${vehicleNo}&parkNo=${parkNo}&isBack=1`;
  88. console.log(this.jumpUrl);
  89. } else {
  90. uni.showModal({
  91. title: '提示',
  92. content: '参数丢失, 返回首页',
  93. showCancel: false,
  94. success: function (res) {
  95. if (res.confirm) {
  96. uni.switchTab({
  97. url: '/pages/index/index'
  98. });
  99. }
  100. }
  101. });
  102. }
  103. },
  104. onShow() {
  105. const { isBack, polyOrderId, needPay } = this;
  106. if (Number(isBack) === 1 && polyOrderId && needPay !== 'not') {
  107. uni.showLoading({
  108. title: '支付查询中...',
  109. mask: true
  110. });
  111. this.timer = setInterval(() => {
  112. this.handlePayStatus(this.polyOrderId);
  113. }, 2000);
  114. }
  115. },
  116. methods: {
  117. /**
  118. * 立即支付
  119. * @date 2023-02-22
  120. * @returns {any}
  121. */
  122. payMoney() {
  123. this.$nextTick(() => {
  124. this.$refs['choosePayment'].openPopup({ ...this.orderInfo }, 'single', 'parking');
  125. });
  126. },
  127. /**
  128. * 根据订单id查询订单信息
  129. * @date 2023-02-22
  130. * @param {any} vehicleNo
  131. * @param {any} parkNo
  132. * @returns {any}
  133. */
  134. async getOrderDetails(vehicleNo, parkNo) {
  135. try {
  136. const { code, data } = await this.$u.api.getOrderInfoByParknoApi({ vehicleNo, parkNo });
  137. if (code === 200) {
  138. const { id } = data;
  139. this.orderList = [id];
  140. this.orderInfo = data;
  141. if (Number(data?.payStatus) === 1) {
  142. this.$refs.uToast.show({
  143. title: '该订单已支付完成!',
  144. type: 'success',
  145. url: '/pages/common/paymentSuccess/paymentSuccess',
  146. callback: () => {
  147. // this.loading = false;
  148. }
  149. });
  150. }
  151. }
  152. } catch (error) {
  153. this.showToast(error?.msg, 'error');
  154. }
  155. },
  156. /**
  157. * 反复查询支付状态
  158. * @param { String } orderId
  159. */
  160. async handlePayStatus(orderId) {
  161. try {
  162. const { code, data } = await this.$u.api.getOrderInfo({ orderId });
  163. if (code === 200) {
  164. if (data?.payStatus === 1 || data?.payStatus === 3) {
  165. clearInterval(this.timer);
  166. this.$refs.uToast.show({
  167. title: '该订单已支付成功!',
  168. type: 'success',
  169. url: '/pages/common/paymentSuccess/paymentSuccess',
  170. callback: () => {
  171. uni.hideLoading();
  172. }
  173. });
  174. }
  175. }
  176. } catch (error) {
  177. clearInterval(this.timer);
  178. uni.hideLoading();
  179. }
  180. },
  181. /**
  182. * @description: 显示提示信息
  183. * @param {*} title
  184. * @param {*} type
  185. * @return {*}
  186. */
  187. showToast(title = '操作失败', type = 'error') {
  188. this.$refs.uToast.show({
  189. title,
  190. type
  191. });
  192. }
  193. }
  194. };
  195. </script>
  196. <style lang="scss" scoped>
  197. @import './OnsitePayment.scss';
  198. </style>