index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <script setup lang="ts">
  2. import type { GasStationDetailVO, QueryCalPriceResponse } from '@/api/globals'
  3. definePage({ name: 'confimOrder', islogin: true, style: { navigationBarTitleText: '下单', navigationStyle: 'custom' } })
  4. const showModel = ref(false)
  5. const refuelNumber = ref()
  6. const refuelGun = ref()
  7. const showModelJf = ref(false)
  8. const selectDk = ref()
  9. const storeDetail = ref<GasStationDetailVO>()
  10. const isSelect = ref(false)
  11. const refuelMoney = ref(null)
  12. const showModelReful = ref(false)
  13. const { lat, lng } = storeToRefs(useUserStore())
  14. const ThreePrice = ref<QueryCalPriceResponse>()
  15. onLoad(async (options: any) => {
  16. await getData(options.storeId)
  17. })
  18. async function getData(storeId: string) {
  19. const res = await Apis.general.post_smqjh_pms_app_api_v1_product_oil_querystoredetail({ data: { storeId, lat: useUserStore().lat, lon: useUserStore().lng } })
  20. storeDetail.value = res.data
  21. refuelNumber.value = res.data?.itemInfoList ? res.data?.itemInfoList[0].itemId : null
  22. }
  23. const refuelGunList = computed(() => {
  24. return storeDetail.value?.itemInfoList ? storeDetail.value?.itemInfoList.find(item => item.itemId === refuelNumber.value)?.gunNos : []
  25. })
  26. const priceData = computed(() => {
  27. return storeDetail.value?.itemInfoList ? storeDetail.value?.itemInfoList.find(item => item.itemId === refuelNumber.value) : null
  28. })
  29. function handlePay() {
  30. if (!refuelGun.value) {
  31. return useGlobalToast().show('请选择油枪')
  32. }
  33. if (!refuelMoney.value) {
  34. return useGlobalToast().show('请输入加油金额')
  35. }
  36. if (Number(storeDetail.value?.distanceShow) > 1) {
  37. useGlobalMessage().confirm({
  38. title: '提示',
  39. msg: '您距离加油站过远,请在油站附近下单',
  40. confirmButtonText: '确认',
  41. cancelButtonText: '取消',
  42. success: async () => {
  43. const { data } = await Apis.general.post_smqjh_pms_app_api_v1_product_oil_querydistancefence({ data: { lat: lat.value, lon: lng.value } })
  44. if (data?.isClosest) {
  45. showModelReful.value = true
  46. }
  47. else {
  48. goPay()
  49. }
  50. },
  51. })
  52. }
  53. else {
  54. goPay()
  55. }
  56. console.log('handlePay')
  57. }
  58. async function handleBlur() {
  59. // if (Number(refuelMoney.value) < 10) {
  60. // return useGlobalToast().show('最小金额为10元')
  61. // }
  62. if (!storeDetail.value)
  63. return
  64. const nams = storeDetail.value?.itemInfoList?.find(item => item.itemId === refuelNumber.value)?.itemName
  65. const { data } = await Apis.general.post_smqjh_pms_api_v1_refueling_querycalprice({ data: {
  66. storeId: storeDetail.value?.storeId as string,
  67. itemName: nams as string,
  68. amount: Number(refuelMoney.value) * 100,
  69. openChannel: 0,
  70. outUserId: '',
  71. mobile: '',
  72. } })
  73. ThreePrice.value = data
  74. console.log(data)
  75. }
  76. async function goPay() {
  77. uni.showLoading({ mask: true })
  78. try {
  79. const res = await Apis.general.post_smqjh_oms_api_v1_oil_order_createorder({ data: {
  80. lat: lat.value,
  81. lon: lng.value,
  82. itemId: refuelNumber.value,
  83. gunNo: refuelGun.value,
  84. originalAmount: Number(ThreePrice.value?.totalPrice),
  85. paymentAmount: Number(ThreePrice.value?.realPrice),
  86. promotionAmount: Number(ThreePrice.value?.promotionAmount),
  87. litre: Number(ThreePrice.value?.litre),
  88. serviceFee: Number(ThreePrice.value?.serviceFee),
  89. totalPrice: Number(ThreePrice.value?.totalPrice),
  90. vipPrice: Number(priceData.value?.vipPrice),
  91. cityPrice: Number(priceData.value?.cityPrice),
  92. storePrice: Number(priceData.value?.storePrice),
  93. storeId: storeDetail.value?.storeId,
  94. itemName: priceData.value?.itemName,
  95. } })
  96. uni.hideLoading()
  97. // #ifdef H5
  98. window.location.href = `${res.data}&redirectUrl=https://smqjh.admin.zswlgz.com/h5/#/pages/transition/index`
  99. // #endif
  100. }
  101. catch {
  102. uni.hideLoading()
  103. }
  104. }
  105. </script>
  106. <template>
  107. <view v-if="storeDetail">
  108. <view class="p24rpx">
  109. <view class="rounded-16rpx bg-white px24rpx py28rpx">
  110. <view class="text-36rpx font-semibold">
  111. {{ storeDetail?.storeName }}
  112. </view>
  113. <view class="mt20rpx text-#aaa">
  114. {{ storeDetail?.address }}
  115. </view>
  116. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  117. <view class="flex items-center justify-between">
  118. <view class="text-#ff4d3a font-semibold">
  119. 平台价
  120. </view>
  121. <view class="text-#aaa">
  122. 门店价:¥{{ priceData?.storePriceShow || 0 }}/L
  123. </view>
  124. </view>
  125. <view class="mt16rpx flex items-center justify-between">
  126. <view class="text-32rpx text-#ff4d3a font-semibold">
  127. ¥{{ priceData?.vipPriceShow || 0 }}/L
  128. </view>
  129. <view class="text-#aaa">
  130. 国标价:¥{{ priceData?.cityPriceShow || 0 }}/L
  131. </view>
  132. </view>
  133. </view>
  134. <view class="mt20rpx rounded-16rpx bg-white px24rpx py28rpx">
  135. <view class="text-28rpx font-semibold">
  136. 选择油号/油枪
  137. </view>
  138. <view class="mt24rpx flex items-center" @click="showModel = true">
  139. <view class="relative w47% rounded-8rpx px24rpx py20rpx" :class="[refuelNumber ? 'bg-#F6FFDF border border-#9ED605 border-solid text-#9ED605' : 'bg-#F9F9F9']">
  140. <view class="text-center text-28rpx font-semibold">
  141. {{ refuelNumber ? storeDetail.itemInfoList?.find(item => item.itemId === refuelNumber)?.itemName : '请选择油号' }}
  142. </view>
  143. <view class="absolute right-24rpx top-50% h32rpx w32rpx -transform-translate-y-50%">
  144. <wd-icon name="arrow-down" size="32rpx" />
  145. </view>
  146. </view>
  147. <view class="relative ml18rpx w47% rounded-8rpx px24rpx py20rpx" :class="[isSelect && refuelGun ? 'bg-#F6FFDF border border-#9ED605 border-solid text-#9ED605' : 'bg-#F9F9F9']">
  148. <view class="text-center text-28rpx font-semibold">
  149. {{ isSelect && refuelGun ? refuelGun : '请选择油枪' }}
  150. </view>
  151. <view class="absolute right-24rpx top-50% h32rpx w32rpx -transform-translate-y-50%">
  152. <wd-icon name="arrow-down" size="32rpx" />
  153. </view>
  154. </view>
  155. </view>
  156. </view>
  157. <view class="mt20rpx rounded-16rpx bg-white px24rpx py28rpx">
  158. <view class="text-28rpx font-semibold">
  159. 加油金额
  160. </view>
  161. <view class="mt20rpx bg-#F9F9F9 px24rpx py20rpx">
  162. <input v-model="refuelMoney" type="digit" class="w-full" placeholder="请输入加油金额,优惠价格计算" @blur="handleBlur">
  163. </view>
  164. <view class="mt20rpx text-#ff4d3a">
  165. 最小金额10元
  166. </view>
  167. </view>
  168. <view class="mt20rpx rounded-16rpx bg-white px24rpx py28rpx">
  169. <view class="flex items-center">
  170. <view class="mr20rpx text-28rpx font-semibold">
  171. 抵扣券
  172. </view>
  173. <wd-button size="small">
  174. 去兑换
  175. </wd-button>
  176. </view>
  177. <view class="mt24rpx flex items-center justify-between rounded-8rpx bg-#F9F9F9 px24rpx py20rpx" @click="showModelJf = true">
  178. <view class="text-28rpx text-#aaa">
  179. 暂无抵扣券
  180. </view>
  181. <wd-icon name="arrow-down" size="32rpx" color="#aaa" />
  182. </view>
  183. <view class="mt16rpx">
  184. 已选:满200元可抵扣100元(最优)
  185. </view>
  186. <view class="mt16rpx">
  187. 抵扣金额:-¥100
  188. </view>
  189. <template v-if="ThreePrice && refuelMoney">
  190. <view class="mb20rpx mt24rpx text-32rpx font-semibold">
  191. 价格明细
  192. </view>
  193. <view class="flex items-center justify-between text-28rpx">
  194. <view class="text-#aaa">
  195. 加油金额
  196. </view>
  197. <view>¥{{ refuelMoney || 0 }}</view>
  198. </view>
  199. <view class="mt20rpx flex items-center justify-between text-28rpx">
  200. <view class="text-#aaa">
  201. 抵扣券
  202. </view>
  203. <view>-¥100</view>
  204. </view>
  205. <view class="mt20rpx flex items-center justify-between text-28rpx">
  206. <view class="text-#aaa">
  207. 服务费
  208. </view>
  209. <view>+¥{{ ThreePrice.promotionAmount ? ThreePrice.promotionAmount / 100 : 0 }}</view>
  210. </view>
  211. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  212. <view class="flex items-center justify-between text-28rpx">
  213. <view class="text-#aaa">
  214. 实付金额
  215. </view>
  216. <view class="text-#ff4d3a font-semibold">
  217. ¥{{ ThreePrice?.realPrice ? ThreePrice?.realPrice / 100 : 0 }}
  218. </view>
  219. </view>
  220. </template>
  221. </view>
  222. </view>
  223. <view class="h200rpx" />
  224. <Zpopup v-model="showModel" bg="#fff">
  225. <view class="px24rpx py28rpx">
  226. <view class="text-center text-32rpx font-semibold">
  227. 选择油号油枪
  228. </view>
  229. <view class="mb20rpx text-32rpx font-semibold">
  230. 油号
  231. </view>
  232. <wd-radio-group v-model="refuelNumber" shape="button">
  233. <view class="flex flex-wrap items-center gap-20rpx">
  234. <wd-radio v-for="item in storeDetail?.itemInfoList" :key="item.itemId" :value="String(item.itemId)">
  235. {{ item.itemName }}
  236. </wd-radio>
  237. </view>
  238. </wd-radio-group>
  239. <view v-if="refuelGunList" class="mb20rpx mt20rpx text-32rpx font-semibold">
  240. 油枪
  241. </view>
  242. <wd-radio-group v-model="refuelGun" shape="button">
  243. <scroll-view scroll-y class="h400rpx pb40rpx">
  244. <view class="grid grid-cols-5 gap-20rpx">
  245. <view v-for="item in refuelGunList" :key="item">
  246. <wd-radio :value="String(item)">
  247. {{ item }}
  248. </wd-radio>
  249. </view>
  250. </view>
  251. </scroll-view>
  252. </wd-radio-group>
  253. </view>
  254. <template #footer>
  255. <view class="text-center text-28rpx text-#ff4d3a">
  256. 请与加油员确认油枪号
  257. </view>
  258. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  259. <wd-button block size="large" @click="showModel = false, isSelect = true">
  260. 确认
  261. </wd-button>
  262. </template>
  263. </Zpopup>
  264. <Zpopup v-model="showModelJf" bg="#fff">
  265. <view class="px24rpx py28rpx">
  266. <view class="mb24rpx text-center text-32rpx font-semibold">
  267. 选择抵扣券
  268. </view>
  269. <wd-radio-group v-model="selectDk" shape="dot">
  270. <view class="flex items-center justify-between">
  271. <view class="text-28rpx">
  272. 不使用抵扣券
  273. </view>
  274. <wd-radio :value="1" />
  275. </view>
  276. <view class="mt24rpx">
  277. <view class="text-28rpx">
  278. 自动推荐
  279. </view>
  280. <view class="relative mt20rpx box-border h144rpx flex items-center justify-between rounded-16rpx bg-[rgba(255,77,58,0.1)] px28rpx py24rpx">
  281. <view class="flex-1">
  282. <view class="flex items-center">
  283. <view class="text-40rpx text-#ff4d3a font-semibold">
  284. <text class="text-24rpx">
  285. </text> 100
  286. </view>
  287. <view class="ml20rpx text-32rpx font-semibold">
  288. 满200元可用
  289. </view>
  290. </view>
  291. <view class="mt24rpx flex items-center text-#aaa">
  292. <view class="text-center text-20rpx">
  293. 可抵扣
  294. </view>
  295. <view class="ml20rpx text-24rpx font-semibold">
  296. 有效期:2022-01-01至2022-01-01
  297. </view>
  298. </view>
  299. </view>
  300. <view class="h-full w134rpx flex items-center justify-center border-l-2rpx border-l-#FF4D3A border-l-dashed">
  301. <wd-radio :value="1" />
  302. </view>
  303. <view class="absolute right-150rpx h30rpx w30rpx rounded-full bg-white -top-10rpx" />
  304. <view class="absolute right-150rpx h30rpx w30rpx rounded-full bg-white -bottom-10rpx" />
  305. </view>
  306. </view>
  307. </wd-radio-group>
  308. </view>
  309. <view class="h200rpx" />
  310. <template #footer>
  311. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  312. <wd-button block size="large">
  313. 确认选择
  314. </wd-button>
  315. </template>
  316. </Zpopup>
  317. <FixedLayout>
  318. <view :class="[ThreePrice && refuelMoney && 'justify-between flex items-center']">
  319. <view v-if="ThreePrice && refuelMoney" class="text-32rpx text-#FF4A39 font-semibold">
  320. <text class="text-24rpx">
  321. </text><text>{{ ThreePrice?.realPrice ? ThreePrice?.realPrice / 100 : 0 }}</text>
  322. </view>
  323. <wd-button block size="large" @click="handlePay">
  324. 立即支付
  325. </wd-button>
  326. </view>
  327. </FixedLayout>
  328. <Zpopup v-model="showModelReful" bg="#fff">
  329. <view class="px24rpx py28rpx">
  330. <view class="mb24rpx text-center text-32rpx font-semibold">
  331. 请确认
  332. </view>
  333. <view>您当前位置最近的油站是</view>
  334. </view>
  335. <view class="h200rpx" />
  336. <template #footer>
  337. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  338. <view class="flex items-center justify-between pb20rpx">
  339. <wd-button type="info" block size="large">
  340. 取消
  341. </wd-button>
  342. <wd-button block size="large">
  343. 继续
  344. </wd-button>
  345. </view>
  346. </template>
  347. </Zpopup>
  348. </view>
  349. </template>
  350. <style lang="scss" scoped>
  351. :deep(.wd-radio){
  352. margin-top: 0 !important;
  353. }
  354. </style>