prePay.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <template>
  2. <ay-container>
  3. <ay-skeletons :rowList="data.rowList" :loading="data.firstLoad">
  4. <div class="station">
  5. <ayb-station type="2" :stationInfo="data.stationInfo" />
  6. </div>
  7. <div class="chunk1">
  8. <div>
  9. <span class="mr-spacd4">加气量</span>
  10. <span class="font-bold b-fz mr-spacd4">{{ data.orderDetail.gasQty }}</span>
  11. <span>公斤</span>
  12. </div>
  13. </div>
  14. <div class="section s-fz">选择支付方式</div>
  15. <div class="flex chunk s-fz" :class="{ checked: data.fpayType === 0 }">
  16. <span
  17. class="mr-spacd2 radio"
  18. :class="{ checked: data.fpayType === 0 }"
  19. @click="methods.choose(0)"
  20. ></span>
  21. <div>
  22. <span class="font-bold" @click="methods.choose(0)">个人支付</span>
  23. <div class="ml-spacd2 mt-spacd2">
  24. 结算金额 ¥ {{ personPay?.amount }} 元 (结算价 ¥ {{ personPay?.actualPrice }} 元/公斤)
  25. </div>
  26. </div>
  27. </div>
  28. <div class="flex chunk s-fz" v-if="carrierPay" :class="{ checked: data.fpayType === 1 }">
  29. <span
  30. class="mr-spacd2 radio"
  31. :class="{ checked: data.fpayType === 1 }"
  32. @click="methods.choose(1)"
  33. ></span>
  34. <div class="flex-1">
  35. <span class="font-bold" @click="methods.choose(1)">所属物流支付</span>
  36. <div class="childs-fc-mbd2 ml-spacd2 mt-spacd2">
  37. <div @click="methods.switchRebateDetail">
  38. 结算金额 ¥ {{ carrierPay.amount }} 元 (结算价 ¥
  39. {{ carrierPay.actualPrice }} 元/公斤)
  40. </div>
  41. <span v-if="carrierPay.carrierRebate">
  42. 优惠金额{{ carrierPay.carrierRebate }}元
  43. <uni-icons
  44. :type="data.showRebateDetail ? 'up' : 'down'"
  45. color=""
  46. class="p-color p-fz"
  47. v-if="carrierPay.rebateNum"
  48. @click="methods.switchRebateDetail"
  49. />
  50. </span>
  51. <span
  52. v-if="carrierPay.rebateNum"
  53. v-show="data.showRebateDetail"
  54. class="chunk childs-fcjb-mbd2 rebate-detail money-bg"
  55. >
  56. <div v-for="(rd, i) in carrierPay.rebateDetail" :key="i">
  57. <div>{{ config.common.interestType[rd.interestType] }}</div>
  58. <div>¥{{ rd.rebateAmount }}元</div>
  59. </div>
  60. </span>
  61. <div class="pt-spacd2 top-line">{{ carrierPay.carrierOrgName }}</div>
  62. <div>[{{ carrierPay.carNumber }}]</div>
  63. <div class="justify-start">
  64. <div>可用余额¥{{ carrierPay.balance }}元</div>
  65. <div class="center p-color ml-spacd2" @click="methods.paysel">
  66. <uni-icons
  67. type="refresh"
  68. color=""
  69. size="20"
  70. :class="{ rotater: store.webapi.strategy.paysel.ing }"
  71. ></uni-icons>
  72. 刷新
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="chunk2">
  79. <div>
  80. <span>创建订单</span>
  81. <div>{{ data.orderDetail.createDate }}</div>
  82. </div>
  83. <div>
  84. <span>订单编号</span>
  85. <div>{{ data.orderDetail.orderId }}</div>
  86. </div>
  87. <div>
  88. <span>驾驶员</span>
  89. <div>{{ data.orderDetail.driverName }}</div>
  90. </div>
  91. </div>
  92. <div class="btns">
  93. <button
  94. type="primary"
  95. :disabled="!canPay"
  96. :loading="store.webapi.pay.order_pay.ing"
  97. @click="methods.pay()"
  98. >
  99. {{ curPay?.buttonMsg }}
  100. </button>
  101. </div>
  102. </ay-skeletons>
  103. </ay-container>
  104. </template>
  105. <script lang="ts" setup>
  106. const data = reactive({
  107. firstLoad: true,
  108. /** 页面选择支付类型: -1:未选择 0:个人:1:物流 */
  109. fpayType: -1,
  110. orderDetail: {} as 订单详情,
  111. stationInfo: {} as GasstationVO对象,
  112. paysel: {} as 待支付订单_可选支付方式获取实体类,
  113. showRebateDetail: false,
  114. rowList: [
  115. {
  116. align: 'left',
  117. verticalAlign: 'top',
  118. colItems: [
  119. {
  120. style: {
  121. width: '168rpx',
  122. height: '168rpx',
  123. 'flex-shrink': 0,
  124. },
  125. },
  126. {
  127. style: {
  128. width: '100%',
  129. },
  130. childRowItems: [
  131. {
  132. style: {
  133. width: '80%',
  134. },
  135. },
  136. {
  137. style: {
  138. width: '100%',
  139. },
  140. },
  141. {
  142. style: {
  143. width: '100%',
  144. },
  145. },
  146. ],
  147. },
  148. ],
  149. },
  150. ...Array(20).fill({
  151. align: 'left',
  152. colItems: 1,
  153. }),
  154. {
  155. align: 'left',
  156. colItems: [
  157. {
  158. style: {
  159. width: '60%',
  160. },
  161. },
  162. ],
  163. },
  164. ],
  165. })
  166. const canPay = computed(() => curPay.value?.buttonEnable && !store.webapi.pay.order_pay.ing)
  167. const pageParams = computed(() => store.curPage.pageConfig.params)
  168. const personPay = computed(() => data.paysel?.personPay)
  169. const carrierPay = computed(() => data.paysel?.carrierPay)
  170. /** 当前支付方式 */
  171. const curPay = computed<待支付订单_可选支付方式物流支付实体类>(() => {
  172. let rv: 待支付订单_可选支付方式物流支付实体类 = {
  173. buttonMsg: '请选择支付方式',
  174. buttonEnable: false,
  175. }
  176. if (data.fpayType === 0) {
  177. rv = {
  178. ...data.paysel?.personPay,
  179. wxAmount: data.paysel.personPay.amount,
  180. }
  181. }
  182. if (data.fpayType === 1) {
  183. rv = data.paysel?.carrierPay
  184. }
  185. return rv
  186. })
  187. const methods = {
  188. switchRebateDetail() {
  189. data.showRebateDetail = !data.showRebateDetail
  190. },
  191. choose(fpayType) {
  192. data.fpayType = fpayType
  193. },
  194. async pay() {
  195. if (data.fpayType === -1) {
  196. func.native.showToast('请选择支付方式')
  197. return
  198. }
  199. const params: OrderPayParam = {
  200. orderId: pageParams.value.orderId,
  201. payType: curPay.value.payType,
  202. }
  203. // 需要微信支付
  204. if ([1, 2, 3].includes(curPay.value.payType)) {
  205. const li = await uni.login()
  206. params.jsCode = li.code
  207. params.wxAmount = curPay.value.wxAmount
  208. }
  209. // 物流支付
  210. if (data.fpayType === 1) {
  211. params.carNumber = carrierPay.value.carNumber
  212. params.carrierOrgId = carrierPay.value.carrierOrgId
  213. params.carrierOrgName = carrierPay.value.carrierOrgName
  214. params.linked = carrierPay.value.linked
  215. params.tradeType = carrierPay.value.tradeType
  216. params.truckId = carrierPay.value.truckId
  217. }
  218. webapi.pay.order_pay(params).then((res) => {
  219. if ([1, 2, 3].includes(curPay.value.payType)) {
  220. uni.requestPayment({
  221. ...JSON.parse(res.payInfo),
  222. success() {
  223. methods.paySuccess()
  224. },
  225. fail() {
  226. func.native.showToast({
  227. icon: 'error',
  228. title: '支付失败',
  229. })
  230. },
  231. })
  232. } else {
  233. methods.paySuccess()
  234. }
  235. })
  236. },
  237. paySuccess() {
  238. func.native
  239. .showToast({
  240. icon: 'success',
  241. title: '支付成功',
  242. })
  243. .then(() => {
  244. ay.goPage(config.pages.order_orderDetail, {
  245. params: data.orderDetail,
  246. goPageType: enums.GoPageType.redirectTo,
  247. })
  248. })
  249. },
  250. getOrderDetail() {
  251. return webapi.strategy
  252. .get_order_detail({ orderId: pageParams.value.orderId, orderType: 1 })
  253. .then(async (res) => {
  254. data.orderDetail = res
  255. const location = await func.native.getLocation()
  256. data.stationInfo = await webapi.strategy.find_for_mini({
  257. gasstationId: res.gasstationId,
  258. longitude: location.longitude.toString(),
  259. latitude: location.latitude.toString(),
  260. })
  261. })
  262. },
  263. async paysel(first) {
  264. if (store.webapi.strategy.paysel.ing) return
  265. await webapi.strategy
  266. .paysel({ orderId: pageParams.value.orderId })
  267. .then((res) => {
  268. data.paysel = res
  269. // 仅“(散户)个人支付”选项 时,保持 其 选中
  270. if (!res.carrierPay) {
  271. data.fpayType = 0
  272. }
  273. })
  274. .catch(() => {})
  275. if (first) {
  276. data.firstLoad = false
  277. }
  278. },
  279. }
  280. ay.entrance(async (args) => {
  281. methods.getOrderDetail()
  282. methods.paysel(true)
  283. })
  284. onUnload(() => {
  285. store.webapi.strategy.get_order_detail.set()
  286. store.webapi.strategy.paysel.set()
  287. store.webapi.strategy.find_for_mini.set()
  288. })
  289. </script>
  290. <style lang="scss">
  291. .rebate-detail {
  292. width: 50%;
  293. padding: $p-spacd2;
  294. }
  295. .carrier-rebate {
  296. position: relative;
  297. z-index: 1;
  298. display: inline;
  299. padding: $p-spacd2;
  300. margin-bottom: 0;
  301. background: #fff;
  302. border: 1px solid #ccc;
  303. border-bottom: 0;
  304. border-top-left-radius: 10px;
  305. border-top-right-radius: 10px;
  306. transform: translateY(1px);
  307. }
  308. .rotater {
  309. animation: rotate 0.5s linear infinite;
  310. }
  311. @keyframes rotate {
  312. from {
  313. transform: rotate(0deg);
  314. }
  315. to {
  316. transform: rotate(360deg);
  317. }
  318. }
  319. </style>