index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. <script setup lang="ts">
  2. import type { MapMarker, MapPolyline } from '@uni-helper/uni-types'
  3. import { StaticUrl } from '@/config'
  4. import router from '@/router'
  5. const plugins = requirePlugin('logisticsPlugin')
  6. const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
  7. const { userInfo } = storeToRefs(useUserStore())
  8. definePage({
  9. name: 'xsb-orderDetaile',
  10. islogin: true,
  11. style: {
  12. navigationBarTitleText: '订单详情',
  13. navigationStyle: 'custom',
  14. },
  15. })
  16. const collapse = ref(true)
  17. const orderInfo = ref<Api.xsbOrderList>()
  18. const orderNum = ref()
  19. const mapInfo = ref<Api.RiderInfo>()
  20. const mapMarkers = ref<MapMarker[]>([])
  21. const mapPolyLine = ref<MapPolyline[]>([])
  22. const showNode = ref(false)
  23. const NodeList = ref<Api.DeliveryNode[]>([])
  24. const viewDevyBtn = computed(() => {
  25. return orderInfo.value?.actualTotal && orderInfo.value.dvyType === 1
  26. })
  27. const showMapStatus = [OrderStatus.OrderAccepted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderDelivering, OrderStatus.OrderArrived]
  28. const mapStaticShopImg = {
  29. [OrderStatus.OrderAccepted]: `${StaticUrl}/order-map-jian.png`,
  30. [OrderStatus.OrderWaitDelivery]: `${StaticUrl}/order-map-wait.png`,
  31. [OrderStatus.OrderDelivering]: `${StaticUrl}/order-map-qishou.png`,
  32. [OrderStatus.OrderArrived]: `${StaticUrl}/order-map-qishou.png`,
  33. }
  34. const mapTextShop = {
  35. [OrderStatus.OrderAccepted]: '商家拣货中',
  36. [OrderStatus.OrderWaitDelivery]: orderInfo.value?.dvyType === 3 ? '等待骑手配送' : '待发货',
  37. [OrderStatus.OrderDelivering]: orderInfo.value?.dvyType === 3 ? '骑手配送中' : '待收货',
  38. [OrderStatus.OrderArrived]: '已送达',
  39. }
  40. const mapLation = computed(() => {
  41. const lation = {
  42. latitude: mapInfo.value?.shopLatitude,
  43. longitude: mapInfo.value?.shopLongitude,
  44. scale: 16,
  45. }
  46. if (orderInfo.value && mapInfo.value) {
  47. const lations = calculateCenterPointSpherical({ lat: orderInfo.value.latitude, lng: orderInfo.value.longitude }, { lat: mapInfo.value.shopLatitude as number, lng: mapInfo.value.shopLongitude as number })
  48. lation.latitude = lations.lat
  49. lation.longitude = lations.lng
  50. lation.scale = 6
  51. }
  52. return lation
  53. })
  54. onLoad((options: any) => {
  55. orderNum.value = options.id
  56. getDetail(options.id)
  57. })
  58. async function getDetail(id: string) {
  59. const { data } = await Apis.xsb.orderInfo({
  60. data: {
  61. orderNo: id,
  62. },
  63. })
  64. orderInfo.value = data
  65. if (showMapStatus.includes(data.hbOrderStatus)) {
  66. getOrderMapInf()
  67. }
  68. }
  69. function handleCollapse() {
  70. collapse.value = !collapse.value
  71. }
  72. async function handleCancel() {
  73. await useUserStore().handleCommonCancelOrder(orderInfo.value as Api.xsbOrderList)
  74. getDetail(String(unref(orderInfo)?.orderNumber))
  75. }
  76. async function handlePay() {
  77. const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
  78. if (res.payType !== 1) {
  79. await useUserStore().getWxCommonPayment(res)
  80. getDetail(String(unref(orderInfo)?.orderNumber))
  81. }
  82. else {
  83. getDetail(String(unref(orderInfo)?.orderNumber))
  84. }
  85. }
  86. async function handelDel() {
  87. await useUserStore().handleCommonDeleteOrder(unref(orderInfo) as Api.xsbOrderList)
  88. router.back()
  89. }
  90. async function handleFinish() {
  91. uni.showLoading({ mask: true })
  92. setTimeout(async () => {
  93. await getDetail(String(unref(orderInfo)?.orderNumber))
  94. uni.hideLoading()
  95. }, 2000)
  96. }
  97. function handleCopy() {
  98. uni.setClipboardData({
  99. data: String(orderInfo.value?.orderNumber),
  100. showToast: true,
  101. })
  102. }
  103. async function handleAfterSale() {
  104. if (!orderInfo.value?.orderItemList) {
  105. useGlobalToast().show('商品异常!')
  106. return
  107. }
  108. await useSysStore().getRefunOrder(orderInfo.value.orderNumber as string)
  109. }
  110. async function getOrderMapInf() {
  111. const res = await Apis.xsb.riderInfo({ data: { orderNumber: orderNum.value } })
  112. mapInfo.value = res.data
  113. mapMarkers.value.push({
  114. id: 1,
  115. latitude: Number(mapInfo.value?.shopLatitude),
  116. longitude: Number(mapInfo.value?.shopLongitude),
  117. iconPath: mapStaticShopImg[orderInfo.value?.hbOrderStatus as keyof typeof mapStaticShopImg],
  118. width: 70,
  119. height: 80,
  120. label: {
  121. content: mapTextShop[orderInfo.value?.hbOrderStatus as keyof typeof mapTextShop],
  122. color: '#333',
  123. fontSize: 14,
  124. x: 0,
  125. y: 0,
  126. anchorX: 40,
  127. anchorY: -120,
  128. borderRadius: 8,
  129. borderWidth: 0,
  130. borderColor: '',
  131. bgColor: '#fff',
  132. padding: 5,
  133. display: 'BYCLICK',
  134. textAlign: 'left',
  135. customCallout: {
  136. display: 'BYCLICK',
  137. anchorX: 0,
  138. anchorY: 0,
  139. },
  140. ariaLabel: '',
  141. joinCluster: false,
  142. },
  143. }, {
  144. id: 2,
  145. longitude: Number(orderInfo.value?.longitude),
  146. latitude: Number(orderInfo.value?.latitude),
  147. iconPath: userInfo.value.avatarUrl || `${StaticUrl}/9.png`,
  148. width: 50,
  149. height: 50,
  150. })
  151. if (mapInfo.value?.riderLatitude && mapInfo.value?.riderLongitude) {
  152. mapMarkers.value.push({
  153. id: 3,
  154. longitude: Number(mapInfo.value?.riderLongitude),
  155. latitude: Number(mapInfo.value?.riderLatitude),
  156. iconPath: `${StaticUrl}/order-map-qishou.png`,
  157. width: 70,
  158. height: 80,
  159. label: {
  160. content: '骑手正在送货',
  161. color: '#333',
  162. fontSize: 14,
  163. x: 0,
  164. y: 0,
  165. anchorX: 40,
  166. anchorY: -120,
  167. borderRadius: 8,
  168. borderWidth: 0,
  169. borderColor: '',
  170. bgColor: '#fff',
  171. padding: 5,
  172. display: 'BYCLICK',
  173. textAlign: 'left',
  174. customCallout: {
  175. display: 'BYCLICK',
  176. anchorX: 0,
  177. anchorY: 0,
  178. },
  179. ariaLabel: '',
  180. joinCluster: false,
  181. },
  182. })
  183. mapPolyLine.value.push({
  184. points: [
  185. {
  186. longitude: Number(mapInfo.value?.riderLongitude),
  187. latitude: Number(mapInfo.value?.riderLatitude),
  188. },
  189. {
  190. longitude: Number(orderInfo.value?.longitude),
  191. latitude: Number(orderInfo.value?.latitude),
  192. },
  193. ],
  194. color: '#9ED605',
  195. width: 3,
  196. })
  197. // 绘制路径骑手和店家只能存在一个
  198. return
  199. }
  200. else {
  201. mapPolyLine.value.push({
  202. points: [
  203. {
  204. longitude: Number(orderInfo.value?.longitude),
  205. latitude: Number(orderInfo.value?.latitude),
  206. },
  207. {
  208. longitude: Number(mapInfo.value?.shopLongitude),
  209. latitude: Number(mapInfo.value?.shopLatitude),
  210. },
  211. ],
  212. color: '#9ED605',
  213. width: 3,
  214. })
  215. }
  216. console.log(mapPolyLine.value, 'mapPolyLine')
  217. }
  218. async function getOrderNode() {
  219. uni.showLoading({
  220. mask: true,
  221. })
  222. return new Promise((resolve, reject) => {
  223. Apis.xsb.deliveryNode({
  224. data: {
  225. orderNumber: String(orderInfo.value?.orderNumber),
  226. },
  227. }).then((res) => {
  228. NodeList.value = res.data
  229. resolve(res.data)
  230. }).catch((err) => {
  231. reject(err)
  232. }).finally(() => uni.hideLoading())
  233. })
  234. }
  235. async function handleMarkerTap(e: UniHelper.MapOnMarkertapEvent) {
  236. console.log(e, 'sadada')
  237. if (orderInfo.value?.dvyType === 3) {
  238. await getOrderNode()
  239. showNode.value = true
  240. }
  241. if (viewDevyBtn.value) {
  242. uni.showLoading({ mask: true })
  243. try {
  244. const res = await Apis.xsb.getWaybillToken({ data: { orderNumber: String(orderInfo.value?.orderNumber) } })
  245. uni.hideLoading()
  246. const jsData = JSON.parse(res.data)
  247. if (jsData.errmsg === 'ok') {
  248. plugins.openWaybillTracking({
  249. waybillToken: jsData.waybill_token,
  250. })
  251. }
  252. }
  253. catch {
  254. uni.hideLoading()
  255. }
  256. }
  257. }
  258. async function handleReceive() {
  259. await useUserStore().handleCommonOrderReceive(orderInfo.value as Api.xsbOrderList)
  260. getDetail(String(unref(orderInfo)?.orderNumber))
  261. }
  262. </script>
  263. <template>
  264. <page-meta :page-style="showNode ? 'overflow: hidden;' : ''" />
  265. <view
  266. v-if="orderInfo" class="page-xsb"
  267. :style="{ paddingTop: `${showMapStatus.includes(orderInfo?.hbOrderStatus) ? '850rpx' : (`${Number(statusBarHeight) + Number(MenuButtonHeight) + 10}px`)}` }"
  268. >
  269. <wd-navbar
  270. title="订单详情" :bordered="false" :z-index="99" safe-area-inset-top left-arrow fixed
  271. @click-left="router.back()"
  272. />
  273. <view v-if="showMapStatus.includes(orderInfo?.hbOrderStatus)">
  274. <map
  275. id="orderMap" :polyline="mapPolyLine" :scale="mapLation.scale" :markers="mapMarkers"
  276. :latitude="mapLation.latitude" :longitude="mapLation.longitude" class="fixed top-0 z80 h-900rpx w-screen"
  277. @markertap="handleMarkerTap"
  278. />
  279. </view>
  280. <view class="relative z-90 box-border bg-[#f6f6f6] px-24rpx">
  281. <view class="pt-20rpx">
  282. <view class="text-36rpx font-semibold">
  283. <view v-if="orderInfo.hbOrderStatus === OrderStatus.PaddingPay">
  284. <view class="flex items-center">
  285. 请在
  286. <wd-count-down format="mm:ss" :time="useUserStore().handleXSBCommonOrderStatusText(orderInfo)" @finish="handleFinish">
  287. <template #default="{ current }">
  288. <view class="flex items-center">
  289. <view> {{ current.minutes }} 分</view>
  290. <view> {{ current.seconds }} 秒</view>
  291. </view>
  292. </template>
  293. </wd-count-down>
  294. 内支付
  295. </view>
  296. <!-- <view class="mt-20rpx text-28rpx text-[#AAAAAA]">
  297. 现在支付:预计10:40-10:55送达
  298. </view> -->
  299. <view class="btn mt-20rpx flex items-center justify-between">
  300. <view class="info-btn mr-20rpx w-226rpx">
  301. <wd-button type="info" @click="handleCancel">
  302. 取消订单
  303. </wd-button>
  304. </view>
  305. <view class="ml-20rpx flex-1">
  306. <wd-button @click="handlePay">
  307. 立即支付¥{{ orderInfo.actualTotal }}
  308. </wd-button>
  309. </view>
  310. </view>
  311. </view>
  312. <view
  313. v-if="orderInfo.hbOrderStatus !== OrderStatus.PaddingPay" class="flex items-center"
  314. @click="handleCollapse"
  315. >
  316. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderAccepted" class="mr-10rpx">
  317. 商家拣货中
  318. </view>
  319. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderWaitDelivery" class="mr-10rpx">
  320. 订单待配送
  321. </view>
  322. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderDelivering" class="mr-10rpx">
  323. 订单配送中
  324. </view>
  325. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancelAudit" class="mr-10rpx">
  326. 订单取消审核
  327. </view>
  328. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mr-10rpx">
  329. 订单取消
  330. </view>
  331. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderArrived" class="mr-10rpx">
  332. 订单已送达
  333. </view>
  334. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCompleted" class="mr-10rpx">
  335. 订单已完成
  336. </view>
  337. <view :class="[collapse ? 'rotate-90' : '']">
  338. <wd-icon name="arrow-right" size="22px" />
  339. </view>
  340. </view>
  341. <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mt-20rpx text-28rpx text-[#AAAAAA]">
  342. 取消原因:{{ orderInfo.cancelReason }}
  343. </view>
  344. </view>
  345. </view>
  346. <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
  347. <view v-if="orderInfo.dvyFlowId" class="mb-24rpx text-24rpx">
  348. <view class="mb-20rpx">
  349. {{ orderInfo.dvyName }}
  350. </view>
  351. <view class="text-48rpx font-semibold">
  352. {{ orderInfo.dvyFlowId }}
  353. </view>
  354. </view>
  355. <view class="grid grid-cols-5 text-28rpx text-[#222]">
  356. <view
  357. v-if="orderInfo.hbOrderStatus === OrderStatus.OrderArrived" class="flex flex-col items-center"
  358. @click="handleReceive"
  359. >
  360. <image :src="`${StaticUrl}/orderDetaile-submit-order.png`" class="h-40rpx w-40rpx" />
  361. <view class="mt-40rpx">
  362. 确认收货
  363. </view>
  364. </view>
  365. <view
  366. v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(Number(orderInfo.hbOrderStatus))"
  367. class="flex flex-col items-center" @click="handelDel"
  368. >
  369. <image :src="`${StaticUrl}/orderDetaile-del.png`" class="h-40rpx w-40rpx" />
  370. <view class="mt-40rpx">
  371. 删除订单
  372. </view>
  373. </view>
  374. <view class="contact relative flex flex-col items-center">
  375. <image :src="`${StaticUrl}/orderDetaile-wx.png`" class="h-40rpx w-40rpx" />
  376. <Zcontact>
  377. <view class="mt-40rpx text-28rpx">
  378. 联系商家
  379. </view>
  380. </Zcontact>
  381. </view>
  382. <view
  383. v-if="orderInfo.refundStatus != 2 && [OrderStatus.OrderCompleted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(orderInfo.hbOrderStatus)"
  384. class="flex flex-col items-center" @click="handleAfterSale"
  385. >
  386. <image :src="`${StaticUrl}/orderDetaile-shou.png`" class="h-40rpx w-40rpx" />
  387. <view class="mt-40rpx">
  388. 申请售后
  389. </view>
  390. </view>
  391. <!-- <view class="flex flex-col items-center " @click="router.push({ name: 'common-revalue' })">
  392. <image
  393. :src="`${StaticUrl}/orderDetaile-pj.png`"
  394. class="h40rpx w40rpx"
  395. />
  396. <view class="mt40rpx">
  397. 评价晒单
  398. </view>
  399. </view> -->
  400. <!-- <view class="flex flex-col items-center">
  401. <image
  402. :src="`${StaticUrl}/orderDetaile-bao.png`"
  403. class="h40rpx w40rpx"
  404. />
  405. <view class="mt40rpx">
  406. 再次购买
  407. </view>
  408. </view> -->
  409. </view>
  410. </view>
  411. <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
  412. <view class="flex items-center">
  413. <image :src="`${StaticUrl}/orderDetaile-user.png`" class="mr-20rpx h-40rpx w-40rpx" />
  414. <view class="text-32rpx text-[#222] font-semibold">
  415. {{ orderInfo?.consigneeName }} {{ orderInfo?.consigneeMobile }}
  416. </view>
  417. </view>
  418. <view class="mt-20rpx text-28rpx text-[#AAAAAA]">
  419. {{ orderInfo?.consigneeAddress }}
  420. </view>
  421. </view>
  422. <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
  423. <view class="flex items-center">
  424. <image :src="`${StaticUrl}/order-icon.png`" class="h-36rpx w-36rpx" />
  425. <view class="ml-20rpx text-32rpx font-semibold">
  426. {{ orderInfo?.shopName }}
  427. </view>
  428. </view>
  429. <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
  430. <CollapsePanel :line-height="150">
  431. <view v-for="item in orderInfo?.orderItemList" :key="item.skuId" class="mb-20rpx w-full flex items-center">
  432. <view class="mr-20rpx w-120rpx flex-shrink-0">
  433. <image :src="item.pic" class="h-120rpx w-120rpx" />
  434. </view>
  435. <view class="flex-1">
  436. <view class="w-full flex items-center justify-between font-semibold">
  437. <view class="text-28rpx">
  438. {{ item.skuName }}
  439. </view>
  440. <view class="text-32rpx text-[#FF4D3A]">
  441. ¥{{ item.price }}
  442. </view>
  443. </view>
  444. <view class="text-24rpx text-[#AAAAAA]">
  445. 规格:{{ item.spec }}
  446. </view>
  447. <view class="text-24rpx text-[#AAAAAA]">
  448. ×{{ item.prodCount }}
  449. </view>
  450. </view>
  451. </view>
  452. </CollapsePanel>
  453. <view class="mt-24rpx h-2rpx w-full bg-[#F0F0F0]" />
  454. <view class="mt-24rpx flex items-center justify-between">
  455. <view class="text-28rpx">
  456. 商品金额
  457. </view>
  458. <view class="text-[#FF4A39] font-semibold">
  459. ¥{{ orderInfo?.total }}
  460. </view>
  461. </view>
  462. <view class="mt-24rpx flex items-center justify-between">
  463. <view v-if="orderInfo.dvyType == 3">
  464. 配送费(即时配送)
  465. </view>
  466. <view v-if="orderInfo.dvyType == 1">
  467. 快递
  468. </view>
  469. <view class="text-[#FF4A39] font-semibold">
  470. ¥{{ orderInfo?.freightAmount }}
  471. </view>
  472. </view>
  473. <view class="mt-24rpx flex items-center justify-between">
  474. <view class="text-28rpx">
  475. 积分
  476. </view>
  477. <view class="text-[#FF4A39] font-semibold">
  478. -¥{{ Number(orderInfo?.offsetPoints) / 100 }}
  479. </view>
  480. </view>
  481. <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
  482. <view class="flex items-center justify-end">
  483. <view class="text-28rpx">
  484. 总计{{ orderInfo.orderMoney }} 共减 {{ Number(orderInfo.offsetPoints) / 100 }}
  485. </view>
  486. <view class="ml-20rpx text-28rpx text-[#FF4D3A] font-semibold">
  487. {{ [OrderStatus.PaddingPay, OrderStatus.OrderCancel].includes(Number(orderInfo.hbOrderStatus)) ? '需' : '实'
  488. }}付款¥{{
  489. orderInfo.actualTotal }}
  490. </view>
  491. </view>
  492. </view>
  493. <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
  494. <view class="mb-24rpx text-28rpx font-semibold">
  495. 订单信息
  496. </view>
  497. <view class="pb-20rpx">
  498. <view class="mb-28rpx flex items-center justify-between">
  499. <view class="text-28rpx text-[#AAAAAA]">
  500. 订单编号
  501. </view>
  502. <view class="flex items-center">
  503. <text class="text-[#222]">
  504. {{ orderInfo?.orderNumber }}
  505. </text>
  506. <view class="ml-10rpx" @click="handleCopy">
  507. <wd-icon name="file-copy" size="22px" />
  508. </view>
  509. </view>
  510. </view>
  511. <view class="mb-28rpx flex items-center justify-between">
  512. <view class="text-28rpx text-[#AAAAAA]">
  513. 支付方式
  514. </view>
  515. <view class="text-[#222]">
  516. 微信支付
  517. </view>
  518. </view>
  519. <view class="mb-28rpx flex items-center justify-between">
  520. <view class="text-28rpx text-[#AAAAAA]">
  521. 下单时间
  522. </view>
  523. <view class="text-[#222]">
  524. {{ orderInfo?.createTime }}
  525. </view>
  526. </view>
  527. <view class="mb-28rpx flex items-center justify-between">
  528. <view class="text-28rpx text-[#AAAAAA]">
  529. 备注信息
  530. </view>
  531. <view class="text-[#222]">
  532. {{ orderInfo?.remarks || '无' }}
  533. </view>
  534. </view>
  535. </view>
  536. </view>
  537. <view class="h-80rpx" />
  538. </view>
  539. <Zpopup v-model="showNode" :showfooter="false">
  540. <view class="p-24rpx">
  541. <view class="text-center text-32rpx font-semibold">
  542. 订单追踪
  543. </view>
  544. <wd-steps :active="0" vertical dot>
  545. <wd-step v-for="item in NodeList" :key="item.id">
  546. <template #title>
  547. {{ item.content }}
  548. </template>
  549. <template #description>
  550. {{ item.createTime }}
  551. </template>
  552. </wd-step>
  553. </wd-steps>
  554. </view>
  555. </Zpopup>
  556. </view>
  557. </template>
  558. <style scoped lang="scss">
  559. .page-xsb {
  560. :deep() {
  561. .info-btn .wd-button {
  562. background: #fff !important;
  563. color: #aaa !important;
  564. }
  565. .btn .wd-button {
  566. width: 100% !important;
  567. }
  568. .wd-count-down {
  569. color: #FF4D3A !important;
  570. font-size: 36rpx !important;
  571. }
  572. .contact .wd-button {
  573. font-size: 28rpx !important;
  574. height: 40rpx !important;
  575. padding: 0 !important;
  576. margin-top: 40rpx !important;
  577. }
  578. }
  579. }
  580. </style>