OnsitePayment.vue 6.0 KB

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