task.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. <template>
  2. <view class="app">
  3. <view class="hdr">
  4. <view class="header">
  5. <image class="header_bg" :src="userInfo.workState ? workStatus[userInfo.workState].img : workStatus[0].img" />
  6. <view class="header_nav">
  7. <view @click="exit()">
  8. <image class="header_left_img" src="@/static/task/task_left.png"></image>
  9. <text class="leftqh">退出</text>
  10. </view>
  11. <view style="text-align: center;font-size: 36rpx;color: #FFFFFF;">我的任务</view>
  12. <view @click="changeStatus()" v-if="userInfo.state" style="position: relative;top: 180rpx">
  13. <image class="header_right_img" src="@/static/task/qiehuan.png"></image>
  14. <text class="qh">切换</text>
  15. </view>
  16. <view v-else></view>
  17. </view>
  18. <view class="status">
  19. <text>{{ userInfo.workState ? workStatus[userInfo.workState].lable : workStatus[0].lable }}</text>
  20. </view>
  21. </view>
  22. <view class="nav_list" v-if="userInfo.state">
  23. <view :class="['nav_list_item', {'selector': index === menuIndex}]" @click="toggleMenu(index)"
  24. v-for="(item, index) in menuList" :key="index">
  25. <text>{{ item.label }}</text>
  26. <text style="color: red;" v-show="item.num">({{ item.num }})</text>
  27. </view>
  28. </view>
  29. </view>
  30. <view class="app-main">
  31. <view class="form" v-for="(item, index) in list" :key="index">
  32. <view class="form_item">
  33. <view class="form_item_l item2">{{ menuList[menuIndex].label }}</view>
  34. <view class="form_item_r">配送费<span style="color: red">¥{{ item.freightPrice }}</span></view>
  35. </view>
  36. <view class="form_item">
  37. <view class="form_item_l">前置仓库</view>
  38. <view class="form_item_r">{{ item.storeName }}</view>
  39. </view>
  40. <view class="form_item" v-if="item.predictTime">
  41. <view class="form_item_l">送达时间</view>
  42. <view class="form_item_r">{{ item.predictTime }}</view>
  43. </view>
  44. <view class="form_item">
  45. <view class="form_item_l">订单编号</view>
  46. <view class="form_item_r">{{ item.orderNo }}</view>
  47. </view>
  48. <view class="form_item">
  49. <view class="form_item_l">收货地址</view>
  50. <view class="form_item_r fr2">
  51. <view class="v1">
  52. <text class="shdz">{{ item.province }}-{{ item.city }}-{{ item.county }}-{{ item.address }}</text>
  53. </view>
  54. <view class="v2">
  55. <image class="addr" src="@/static/task/xxxard.png" @click="openMap(item)" />
  56. </view>
  57. </view>
  58. </view>
  59. <view class="form_item">
  60. <view class="form_item_l">联系电话</view>
  61. <view class="form_item_r" @click="call(item.phone)">
  62. <text style="padding-right: 24rpx;">{{ item.phone }}</text>
  63. <image class="phone" src="@/static/task/call.png"></image>
  64. </view>
  65. </view>
  66. <view style="padding-bottom: 46rpx;padding-top: 36rpx;text-align: right;">
  67. <button class="btn btn2" @click="getDetails(item.id)">订单详情</button>
  68. <block v-if="menuIndex == 0">
  69. <button class="btn btn3" @click="start(item)">开始配送</button>
  70. </block>
  71. <block v-if="menuIndex == 1">
  72. <button class="btn btn2 btn4" @click="order_error(item)">订单异常</button>
  73. <button class="btn btn3" @click="complete(item)">完成配送</button>
  74. </block>
  75. <block v-if="menuIndex == 2">
  76. <button class="btn btn2 btn4" @click="order_error(item)">订单异常</button>
  77. <button class="btn btn3" @click="complete(item)">完成配送</button>
  78. </block>
  79. <block v-if="menuIndex == 3">
  80. <button class="btn btn3" @click="complete(item)">完成配送</button>
  81. </block>
  82. </view>
  83. </view>
  84. <!-- <view v-if="list.length==0" style="text-align: center;padding-top: 60rpx;color: #999999;font-size: 30rpx;">
  85. 暂无任何信息
  86. </view> -->
  87. <view class="loadMore" v-if="userInfo.state">
  88. <uni-load-more :status="finish ? 'noMore' : 'more'" />
  89. </view>
  90. <view class="audit-box" v-else>审核中</view>
  91. <!-- <view class="botm">
  92. <view class="botm_inner">
  93. <image class="rw_img" src="../../static/task/fuwuxing.png"></image>
  94. <text class="botm_txt">
  95. 我的任务
  96. </text>
  97. </view>
  98. </view> -->
  99. <!-- 遮罩层-->
  100. <view v-if="errOrder.show == true" class="mask">
  101. <view class="mask-modal">
  102. <view class="mask-modal-tit">配送异常</view>
  103. <textarea class="mask_area" v-model="errOrder.msg" placeholder="请输入异常原因" placeholder-class="pl"></textarea>
  104. <view class="mask_bottom">
  105. <view>
  106. <button @click="checkErr(false)" style="float: left;" class="mask_btn">取消</button>
  107. </view>
  108. <view>
  109. <button @click="checkErr(true)" style="float: right;" class="mask_btn mask_btn2">确定</button>
  110. </view>
  111. </view>
  112. </view>
  113. </view>
  114. </view>
  115. </view>
  116. </template>
  117. <script>
  118. import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
  119. import websocketMixin from '@/mixins/websocketMixin.js';
  120. import {
  121. mapState,
  122. mapMutations
  123. } from 'vuex';
  124. export default {
  125. components: {
  126. uniLoadMore
  127. },
  128. mixins: [websocketMixin],
  129. computed: {
  130. ...mapState(['token', 'userInfo'])
  131. },
  132. data() {
  133. return {
  134. reportInterval: null, // 用来存储定时任务的 ID
  135. workStatus: [{
  136. lable: '休息中',
  137. value: 0,
  138. img: require('@/static/task/xiuxi.png')
  139. },
  140. {
  141. lable: '开工中',
  142. value: 1,
  143. img: require('@/static/task/kaigong.png')
  144. }
  145. ],
  146. menuIndex: 0,
  147. menuList: [{
  148. label: '待取货',
  149. status: 0,
  150. num: 0
  151. },
  152. {
  153. label: '配送中',
  154. status: 1,
  155. num: 0
  156. },
  157. {
  158. label: '超时',
  159. status: 2,
  160. num: 0
  161. },
  162. {
  163. label: '配送异常',
  164. status: 3,
  165. num: 0
  166. },
  167. {
  168. label: '完成',
  169. status: 4,
  170. num: 0
  171. }
  172. ],
  173. list: [], // 任务列表
  174. pageNo: 1, // 页码
  175. pageSize: 10, // 页数
  176. loadData: false, // 列表加载中
  177. finish: false, // 列表全部加载完成
  178. errOrder: {
  179. show: false,
  180. id: null,
  181. address: '',
  182. msg: ''
  183. },
  184. }
  185. },
  186. onLoad(e) {
  187. let that = this;
  188. if (that.userInfo.state) {
  189. that.resetData();
  190. // 初始化WebSocket连接
  191. // that.initWebSocket();
  192. }
  193. // 如果已有定时任务,先清除
  194. if (this.reportInterval) {
  195. clearInterval(this.reportInterval);
  196. }
  197. // 每隔30秒上报一次
  198. this.reportInterval = setInterval(() => {
  199. this.reportLocation(); // 每隔 15 秒上报一次位置
  200. }, 15000);
  201. },
  202. beforeDestroy() {
  203. // 在组件销毁时清除定时任务,避免内存泄漏
  204. this.stopReporting();
  205. },
  206. destroyed() {
  207. // 销毁时清除定时任务(为了兼容 Vue 2 的生命周期钩子)
  208. this.stopReporting();
  209. },
  210. //上拉加载
  211. onReachBottom() {
  212. let that = this;
  213. if (that.userInfo.state) {
  214. uni.showNavigationBarLoading()
  215. this.getTaskList()
  216. }
  217. },
  218. //下拉刷新
  219. onPullDownRefresh() {
  220. //uni.startPullDownRefresh()
  221. if (this.userInfo.state) {
  222. // 审核通过
  223. this.resetData();
  224. } else {
  225. // 审核中
  226. this.getUserInfo().then(res => {
  227. if (res) {
  228. this.resetData();
  229. } else {
  230. uni.showToast({
  231. title: '后台审核中'
  232. })
  233. }
  234. })
  235. }
  236. setTimeout(() => {
  237. uni.stopPullDownRefresh()
  238. }, 1000)
  239. },
  240. methods: {
  241. ...mapMutations(['saveUserInfo', 'logout']),
  242. // 清除定时任务
  243. stopReporting() {
  244. if (this.reportInterval) {
  245. clearInterval(this.reportInterval); // 清除定时任务
  246. this.reportInterval = null; // 重置定时任务 ID
  247. }
  248. },
  249. /* 获取后台用户信息(进入即判断是否过期) */
  250. getUserInfo() {
  251. let that = this;
  252. return new Promise((resolve, reject) => {
  253. that.request("get", "rider/wxLogin/getRiderInfo", that.token, null).then(res => {
  254. console.log('getUserInfo', res)
  255. if (res.code === 200) {
  256. that.saveUserInfo(newUserData); // 缓存用户基础数据
  257. resolve(true)
  258. } else {
  259. resolve(false)
  260. }
  261. })
  262. })
  263. },
  264. reportLocation() {
  265. let that = this;
  266. return new Promise((resolve, reject) => {
  267. // 获取经纬度
  268. uni.getLocation({
  269. type: 'wgs84', // 使用GPS坐标系
  270. success: function(res) {
  271. const latitude = res.latitude;
  272. const longitude = res.longitude;
  273. console.log('纬度:' + latitude);
  274. console.log('经度:' + longitude);
  275. let content = {
  276. latitude: latitude,
  277. longitude: longitude
  278. };
  279. //上报经纬度
  280. that.request("post", "rider/task/reportLocation", that.token, content).then(res => {
  281. resolve(false)
  282. })
  283. },
  284. fail: function(err) {
  285. resolve(false)
  286. console.error('获取位置失败:', err);
  287. }
  288. });
  289. })
  290. },
  291. // 退出
  292. exit() {
  293. let that = this;
  294. uni.showModal({
  295. title: '系统提示',
  296. content: '是否确认退出?',
  297. showCancel: true,
  298. confirmText: '取消',
  299. cancelText: '确认',
  300. success: function(res) {
  301. if (res.cancel) {
  302. that.logout();
  303. uni.redirectTo({
  304. url: '/pages/login/login'
  305. })
  306. }
  307. }
  308. })
  309. },
  310. // 切换工作状态
  311. changeStatus() {
  312. let that = this
  313. let workState = that.userInfo.workState;
  314. let params = {
  315. riderId: that.userInfo.id
  316. }
  317. that.request("get", "rider/app/" + (workState ? 'toRest' : 'toWorking'), that.token, params).then(res => {
  318. console.log('changeStatus', res)
  319. if (res.code === 200) {
  320. that.userInfo.workState = workState ? 0 : 1;
  321. that.saveUserInfo(that.userInfo);
  322. that.resetData();
  323. }
  324. })
  325. },
  326. // 切换菜单
  327. toggleMenu(index) {
  328. this.finish = false
  329. if (!this.userInfo.state) {
  330. uni.showToast({
  331. title: '审核中,可下拉获取最新审核状态'
  332. })
  333. return;
  334. }
  335. if (!this.loadData) {
  336. this.menuIndex = index;
  337. this.pageNo = 1;
  338. this.list = [];
  339. this.getTaskList();
  340. } else {
  341. uni.showToast({
  342. title: '数据加载中,请稍后'
  343. })
  344. }
  345. },
  346. // 刷新页面数据
  347. resetData() {
  348. if (!this.loadData) {
  349. this.pageNo = 1;
  350. this.list = [];
  351. this.finish = false
  352. this.getWorkStatus();
  353. this.getTaskTotal();
  354. this.getTaskList();
  355. } else {
  356. uni.showToast({
  357. title: '数据加载中,请稍后'
  358. })
  359. }
  360. },
  361. //获取工作状态
  362. getWorkStatus() {
  363. let that = this;
  364. let params = {
  365. riderId: that.userInfo.id
  366. };
  367. that.request("get", "rider/app/getWorkingState", that.token, params).then(res => {
  368. console.log('getWorkStatus', res)
  369. that.status = res.data.workState == 1 ? true : false;
  370. })
  371. },
  372. // 获取订单坐标
  373. getOrderPoi(address) {
  374. console.log('address', address)
  375. const result = {
  376. lat: 0.00,
  377. lng: 0.00
  378. }
  379. return result;
  380. },
  381. // 拨打电话
  382. call(phone) {
  383. uni.makePhoneCall({
  384. phoneNumber: phone //仅为示例
  385. });
  386. },
  387. // 开启导航
  388. async openMap(data) {
  389. debugger
  390. console.log('openMap', data)
  391. let that = this;
  392. // data = {
  393. // province: '福建省',
  394. // city: '福州市',
  395. // county: '晋安区',
  396. // address: '长河路88号'
  397. // };
  398. let address = `${data.province}${data.city}${data.county}${data.address}`;
  399. if (data.latitude && data.longitude) {
  400. wx.openLocation({
  401. latitude: Number(data.latitude), // 纬度,范围为-90~90,负数表示南纬
  402. longitude: Number(data.longitude), // 经度,范围为-180~180,负数表示西经
  403. scale: 8, // 缩放比例
  404. name: data.address,
  405. address,
  406. success(success) {
  407. console.log('success', success)
  408. },
  409. fail(fail) {
  410. console.log('fail', fail)
  411. }
  412. })
  413. } else {
  414. uni.showToast({
  415. title: '经纬度获取失败,无法进行导航',
  416. icon: 'none',
  417. mask: true,
  418. duration: 2000
  419. });
  420. }
  421. },
  422. // 订单详情
  423. getDetails(id) {
  424. console.log("传过去的id:" + id)
  425. uni.navigateTo({
  426. url: `../order/order?id=${id}`
  427. })
  428. },
  429. // 完成配送
  430. async complete(data) {
  431. let that = this;
  432. let id = data.id;
  433. let address = `${data.province}${data.city}${data.county}${data.address}`;
  434. let point = await that.getOrderPoi(address);
  435. if (point) {
  436. let params = {
  437. riderOrderId: id,
  438. lng: point.lng,
  439. lat: point.lat
  440. }
  441. that.request("get", "rider/task/complete", that.token, params).then(res => {
  442. if (res.code == 200) {
  443. uni.showToast({
  444. title: '操作成功'
  445. })
  446. that.resetData()
  447. }
  448. })
  449. }
  450. uni.navigateTo({
  451. url: `../task/complete?id=${id}`
  452. })
  453. },
  454. // 获取各类任务列表统计数量
  455. getTaskTotal() {
  456. let that = this;
  457. that.request("get", "rider/task/statistical", that.token, null).then(res => {
  458. console.log(res.data)
  459. if (res.data) {
  460. let keys = ['waitingCount', 'dispenseCount', 'timeoutCount', 'abnormalCount', 'completedCount'];
  461. keys.forEach((keyName, index) => {
  462. that.menuList[index].num = res.data[keyName] || 0;
  463. })
  464. }
  465. })
  466. },
  467. // 获取任务列表
  468. getTaskList() {
  469. //console.log("getTaskList")
  470. let that = this;
  471. if (that.finish) {
  472. return;
  473. }
  474. that.loadData = true;
  475. let params = {
  476. status: that.menuList[that.menuIndex].status,
  477. page: that.pageNo,
  478. limit: that.pageSize
  479. };
  480. that.request("get", "rider/task/list", that.token, params).then(res => {
  481. if (res.code === 200) {
  482. let newList = res.rows;
  483. console.log(newList)
  484. newList.forEach(item => {
  485. if (item.predictTime) {
  486. if (typeof(item.predictTime) === 'number') {
  487. item.predictTime = that.dateFtt('yyyy-MM-dd hh:mm:ss', new Date(item.predictTime))
  488. }
  489. }
  490. })
  491. that.list = that.list.concat(newList);
  492. that.finish = newList.length >= res.total;
  493. that.pageNo++;
  494. that.loadData = false; // 获取结束
  495. } else {
  496. that.loadData = false; // 获取结束
  497. }
  498. })
  499. },
  500. // 开始配送
  501. async start(data) {
  502. let that = this;
  503. let id = data.id;
  504. let address = `${data.province}${data.city}${data.county}${data.address}`;
  505. let point = await that.getOrderPoi(address);
  506. if (point) {
  507. let params = {
  508. riderOrderId: id,
  509. lng: point.lng,
  510. lat: point.lat
  511. }
  512. that.request("get", "rider/task/begin", that.token, params).then(res => {
  513. // console.log(res)
  514. if (res.code == 200) {
  515. uni.showToast({
  516. title: '操作成功'
  517. })
  518. that.resetData()
  519. }
  520. })
  521. }
  522. },
  523. //订单异常
  524. order_error(data) {
  525. let that = this;
  526. let address = `${data.province}${data.city}${data.county}${data.address}`;
  527. that.errOrder = {
  528. show: true,
  529. id: data.id,
  530. address,
  531. msg: ''
  532. }
  533. },
  534. //提交订单异常
  535. async checkErr(type) {
  536. let that = this
  537. if (type) {
  538. if (!that.errOrder.msg.length) {
  539. uni.showToast({
  540. title: '请输入异常原因'
  541. })
  542. return;
  543. }
  544. that.errOrder.show = false;
  545. let point = await that.getOrderPoi(that.errOrder.address);
  546. if (point) {
  547. let params = {
  548. riderOrderId: that.errOrder.id,
  549. reason: that.errOrder.msg,
  550. lng: point.lng,
  551. lat: point.lat
  552. }
  553. that.request("get", "rider/task/abnormal", that.token, params).then(res => {
  554. if (res.code == 200) {
  555. uni.showToast({
  556. title: '操作成功'
  557. })
  558. that.resetData()
  559. }
  560. })
  561. }
  562. } else {
  563. that.errOrder.show = false;
  564. }
  565. }
  566. }
  567. }
  568. </script>
  569. <style lang="scss" scoped>
  570. .hdr {
  571. position: fixed;
  572. top: 0;
  573. left: 0;
  574. z-index: 99;
  575. width: 100vw;
  576. }
  577. .app-main {
  578. position: absolute;
  579. width: 750rpx;
  580. top: 410rpx;
  581. }
  582. .toLogin {
  583. padding-top: 100rpx;
  584. text-align: center;
  585. color: red;
  586. font-size: 30rpx;
  587. }
  588. .header_right_img {
  589. width: 56rpx;
  590. height: 56rpx;
  591. position: absolute;
  592. right: 72rpx;
  593. top: -6rpx;
  594. }
  595. .header_left_img {
  596. width: 30rpx;
  597. height: 30rpx;
  598. position: absolute;
  599. top: 10rpx;
  600. }
  601. .qh {
  602. font-size: 30rpx;
  603. color: #FFFFFF;
  604. position: absolute;
  605. right: 0;
  606. top: 4rpx;
  607. }
  608. .leftqh {
  609. font-size: 30rpx;
  610. color: #FFFFFF;
  611. position: absolute;
  612. left: 46rpx;
  613. top: 4rpx;
  614. }
  615. .app {
  616. background-color: #F6F6F6;
  617. }
  618. .ret {
  619. width: 20rpx;
  620. height: 36rpx;
  621. }
  622. .header {
  623. height: 322rpx;
  624. position: relative;
  625. }
  626. .header_bg {
  627. width: 750rpx;
  628. height: 322rpx;
  629. }
  630. .header_nav {
  631. width: 686rpx;
  632. display: flex;
  633. flex-direction: row;
  634. position: absolute;
  635. top: 60rpx;
  636. left: 32rpx;
  637. }
  638. .header_nav view {
  639. flex: 1;
  640. }
  641. .status {
  642. width: 750rpx;
  643. text-align: center;
  644. position: absolute;
  645. color: #FFFFFF;
  646. font-size: 48rpx;
  647. top: 164rpx;
  648. font-weight: bold;
  649. }
  650. .status text {
  651. display: inline-block;
  652. width: 242rpx;
  653. height: 84rpx;
  654. background-color: #FFFFFF;
  655. border-radius: 39rpx;
  656. text-align: center;
  657. line-height: 84rpx;
  658. color: #3662DD;
  659. }
  660. .nav_list {
  661. height: 88rpx;
  662. background-color: #FFFFFF;
  663. display: flex;
  664. flex-direction: row;
  665. position: relative;
  666. }
  667. .nav_list_item {
  668. flex: 1;
  669. height: 100%;
  670. line-height: 88rpx;
  671. text-align: center;
  672. font-size: 28rpx;
  673. color: #666666;
  674. &.selector {
  675. position: relative;
  676. &:after {
  677. position: absolute;
  678. content: '';
  679. bottom: 0;
  680. left: 50%;
  681. width: 56rpx;
  682. height: 8rpx;
  683. margin-left: -28rpx;
  684. ;
  685. border-radius: 4rpx;
  686. background-color: #3662DD;
  687. }
  688. }
  689. }
  690. .nav_list_item2 {
  691. width: 200rpx;
  692. position: absolute;
  693. right: 100rpx;
  694. }
  695. .nav_list_item3 {
  696. width: 100rpx;
  697. position: absolute;
  698. right: 0;
  699. }
  700. .form {
  701. padding: 0 47rpx;
  702. border-top: 24rpx solid #F6F6F6;
  703. background-color: #FFFFFF;
  704. }
  705. .form_item {
  706. height: 80rpx;
  707. border-bottom: 1rpx solid #F6F6F6;
  708. display: flex;
  709. flex-direction: row;
  710. }
  711. .selector {
  712. color: #3662DD;
  713. }
  714. .form_item_l {
  715. width: 170rpx;
  716. height: 98rpx;
  717. line-height: 98rpx;
  718. font-size: 28rpx;
  719. color: #999999;
  720. }
  721. .form_item_r {
  722. width: 486rpx;
  723. height: 98rpx;
  724. line-height: 98rpx;
  725. font-size: 28rpx;
  726. color: #333333;
  727. text-align: right;
  728. }
  729. .addr {
  730. display: inline-block;
  731. width: 34rpx;
  732. height: 36rpx;
  733. position: relative;
  734. top: 6rpx;
  735. }
  736. .phone {
  737. width: 38rpx;
  738. height: 36rpx;
  739. position: relative;
  740. top: 6rpx;
  741. }
  742. .item2 {
  743. font-weight: bold;
  744. color: #333333;
  745. font-size: 32rpx;
  746. }
  747. .btn {
  748. display: inline-block;
  749. width: 180rpx;
  750. height: 74rpx;
  751. line-height: 74rpx;
  752. color: #3662DD;
  753. font-size: 30rpx;
  754. border: 1rpx solid #3662DD;
  755. background-color: #FFFFFF;
  756. }
  757. .btn2 {
  758. margin-right: 30rpx;
  759. }
  760. .btn3 {
  761. background: linear-gradient(to right, #5095F4, #3662DD);
  762. color: #FFFFFF;
  763. border: none;
  764. }
  765. .botm {
  766. height: 120rpx;
  767. background-color: #FFFFFF;
  768. position: fixed;
  769. bottom: 0;
  770. width: 750rpx;
  771. }
  772. .botm_inner {
  773. height: 120rpx;
  774. position: relative;
  775. font-size: 30rpx;
  776. color: #3662DD;
  777. }
  778. .rw_img {
  779. width: 58rpx;
  780. height: 64rpx;
  781. position: absolute;
  782. top: 28rpx;
  783. left: 240rpx;
  784. }
  785. .botm_txt {
  786. position: absolute;
  787. left: 328rpx;
  788. top: -6rpx;
  789. /* #ifdef H5 */
  790. top: 40rpx;
  791. /* #endif */
  792. }
  793. .btn4 {
  794. border-color: #FF473C;
  795. color: #FF473C;
  796. }
  797. .mask {
  798. position: fixed;
  799. top: 0;
  800. left: 0;
  801. z-index: 999;
  802. width: 100%;
  803. height: 100vh;
  804. background: rgba(0, 0, 0, 0.4);
  805. display: flex;
  806. justify-content: center;
  807. align-items: center;
  808. }
  809. .mask-modal {
  810. width: 600rpx;
  811. height: 520rpx;
  812. position: relative;
  813. background-color: #FFFFFF;
  814. border-radius: 16rpx;
  815. }
  816. .mask-modal-tit {
  817. color: #000000;
  818. font-size: 32rpx;
  819. padding: 40rpx 0;
  820. text-align: center;
  821. font-weight: bold;
  822. }
  823. .mask_area {
  824. width: 500rpx;
  825. height: 186rpx;
  826. font-size: 30rpx;
  827. background-color: #F8F8F8;
  828. margin: 0 auto;
  829. padding: 24rpx 20rpx;
  830. }
  831. .pl {
  832. font-size: 30rpx;
  833. color: #999999;
  834. }
  835. .mask_bottom {
  836. width: 500rpx;
  837. margin: 0 auto;
  838. display: flex;
  839. flex-direction: row;
  840. padding-top: 40rpx;
  841. }
  842. .mask_bottom view {
  843. flex: 1;
  844. height: 96rpx;
  845. }
  846. .mask_btn {
  847. width: 238rpx;
  848. height: 94rpx;
  849. line-height: 94rpx;
  850. font-size: 32rpx;
  851. border: 1rpx solid #3662DD;
  852. color: #3662DD;
  853. }
  854. .mask_btn2 {
  855. background: linear-gradient(to right, #5095F4, #3662DD);
  856. border: none;
  857. color: #FFFFFF;
  858. }
  859. .fr2 {
  860. display: flex;
  861. flex-direction: row;
  862. }
  863. .fr2 .v1 {
  864. width: 428rpx;
  865. height: 98rpx;
  866. line-height: 98rpx;
  867. text-align: right;
  868. overflow: hidden;
  869. white-space: nowrap;
  870. text-overflow: ellipsis;
  871. }
  872. .fr2 .v2 {
  873. width: 58rpx;
  874. text-align: right;
  875. height: 98rpx;
  876. }
  877. .bgcor {
  878. background-color: red;
  879. }
  880. .loadMore {
  881. // padding: 0 0 120rpx;
  882. background-color: #F6F6F6;
  883. }
  884. .audit-box {
  885. color: #c30d23;
  886. font-size: 38rpx;
  887. font-weight: 600;
  888. text-align: center;
  889. padding: 120rpx 0;
  890. }
  891. </style>