order.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <template>
  2. <view class="pages">
  3. <u-navbar
  4. title="我的订单"
  5. :placeholder="true"
  6. :autoBack="false"
  7. @leftClick="leftClick"
  8. :safeAreaInsetTop="true"
  9. >
  10. </u-navbar>
  11. <view class="tabs-wrap">
  12. <u-tabs
  13. :list="tabsList"
  14. lineColor="#EE0D0D"
  15. :current="tabsCurrent"
  16. :activeStyle="{color:'#EE0D0D','font-weight': '600','font-size':'30rpx'}"
  17. :inactiveStyle="{color:'#7F7F7F'}"
  18. itemStyle="width:18%;box-sizing:border-box;padding:20rpx 15rpx"
  19. @click="tabsClick"></u-tabs>
  20. </view>
  21. <view class="page-wrap">
  22. <mescroll-body class="" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
  23. <view class="order">
  24. <view v-for="(item) in orderListWithClass" class="order-item"
  25. :class="item.class"
  26. @click="goOrderDetails(item)" :key="item.id">
  27. <view class="top u-flex u-row-between">
  28. <text>{{item.theatreName}}</text>
  29. <text>{{item.status|filterOrderState}}</text>
  30. </view>
  31. <view class="info u-flex u-col-top">
  32. <image class="img" :src="item.performImg"></image>
  33. <view class="text">
  34. <view class="name">{{item.performName}} - {{item.goodsName}}</view>
  35. <view class="time">{{item.performDate}} {{item.performTimeStart}}</view>
  36. <!-- <view class="position">{{item.performDate}}</view> -->
  37. <view class="statistics">
  38. <text>共{{item.viewerNum}}张</text>
  39. <text class="label">合计:</text>
  40. <text class="price">¥{{item.realPrice}}</text>
  41. </view>
  42. </view>
  43. </view>
  44. <view class="btn-wrap u-flex u-row-right">
  45. <view
  46. class="btn"
  47. :class="btn.class"
  48. @click.stop="clickEven(btn.fun, item)"
  49. v-for="(btn, index) in statusBtn[item.status].filter(b => !b.condition || b.condition(item))"
  50. :key="index"
  51. >
  52. {{ btn.name }}
  53. </view>
  54. </view>
  55. </view>
  56. </view>
  57. </mescroll-body>
  58. </view>
  59. <u-toast ref="uToast"></u-toast>
  60. <tabbar :tabbarIndexProps="1" />
  61. </view>
  62. </template>
  63. <script>
  64. import tabbar from "../components/tabbar.vue";
  65. // 引入mescroll-mixins.js
  66. import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
  67. // #ifdef H5
  68. import wxH5 from "weixin-jsapi";
  69. // #endif
  70. export default {
  71. mixins: [MescrollMixin], // 使用mixin
  72. components:{
  73. tabbar
  74. },
  75. data() {
  76. return {
  77. staticUrl:this.$commonConfig.staticUrl,
  78. goodsKey:1,
  79. hasfetch:false,
  80. tabsCurrent:1,
  81. tabsList:[
  82. {name:'全部',status:null,},
  83. {name:'待支付',status:'0',badge:{isDot:false,value:null}},
  84. {name:'待使用',status:'3',badge:{isDot:false,value:null}},
  85. {name:'已完成',status:'7',badge:{isDot:false,value:null}},
  86. {name:'已改签',status:'10',badge:{isDot:false,value:null}},
  87. {name:'售后',status:'4,5,6',badge:{isDot:false,value:null}}
  88. ],
  89. status:'',
  90. dataList:[],
  91. statusBtn:{// 状态(0待支付,2超时取消,3支付完成,待使用,4退款中,5己退款,6退款失败,7己使用,8己超期 9关闭)
  92. 0:[{name:'取消订单',fun:'cancelOrder',class:''},{name:'去支付',fun:'pay',class:'red'}],
  93. 1:[],
  94. 2:[],
  95. 3:[{name:'改签',fun:'rebook',class:'',condition: (item) => item.allowReSubmit === 1},{name:'查看原订单',fun:'viewOldOrder',class:'',condition: (item) => !!item.orgOrderId},{name:'出示二维码',fun:'goOrderDetails',class:'red'}],
  96. //,{name:'评价',fun:'evaluate',class:'green'}
  97. 4:[],
  98. 5:[],
  99. 6:[],
  100. // ,{name:'查看评价',fun:'viewEvaluate',class:'green'}
  101. 7:[],
  102. 8:[],
  103. 9:[],
  104. 10:[{name:'查看新订单',fun:'viewNewOrder',class:'red'}]
  105. },
  106. orderBadge:{
  107. noPayNum:0,
  108. deliverNum:0,
  109. collectNum:0,
  110. commentNum:0,
  111. refundNum:0,
  112. },
  113. templateIdList:[],//微信小程序订阅消息
  114. }
  115. },
  116. computed: {
  117. orderListWithClass() {
  118. return this.dataList.map(order => {
  119. // let spliceData = order.detailList.splice(0,2);
  120. // let moreData = order.detailList.splice(2,order.detailList.length);
  121. // let moreData = order.detailList.slice(2);
  122. // if(order.detailList.length>2){
  123. // moreData = order.detailList;
  124. // }
  125. return {
  126. ...order,
  127. // spliceData:spliceData,
  128. // moreData:moreData,
  129. // showMore:false,
  130. class: {
  131. 0: 'status-0',
  132. 1: 'status-1',
  133. 2: 'status-2',
  134. 3: 'status-3',
  135. 4: 'status-4',
  136. 5: 'status-5',
  137. 6: 'status-6',
  138. 7: 'status-7',
  139. 8: 'status-8'
  140. }[order.status] || ''
  141. }
  142. })
  143. }
  144. },
  145. onLoad(page) {
  146. // console.log('page',page);
  147. const status = page.status;
  148. const index = this.tabsList.findIndex(item => item.status === status);
  149. this.tabsCurrent = index>=0?index:0;
  150. this.getTemplateIdList();//获取模板列表
  151. },
  152. onShow() {
  153. setTimeout(()=>{
  154. this.hasfetch&&this.reloadList()
  155. },500);
  156. // this.statisticsOrder();
  157. },
  158. methods: {
  159. leftClick(){
  160. uni.reLaunch({url: '/center/center'});
  161. },
  162. /*下拉刷新的回调, 重置列表为第一页 (此处可删,mixins已默认)
  163. downCallback(){
  164. this.mescroll.resetUpScroll();
  165. },
  166. /*上拉加载的回调*/
  167. upCallback(page) {
  168. // this.statisticsOrder();
  169. // 此处可以继续请求其他接口
  170. // if(page.num == 1){
  171. // // 请求其他接口...
  172. // }
  173. // 如果希望先请求其他接口,再触发upCallback,可参考以下写法
  174. // if(!this.hasTypeId){
  175. // this.shopNewsType();
  176. // return // 此处return,先获取xx
  177. // }
  178. let pageNum = page.num; // 页码, 默认从1开始
  179. let pageSize = page.size; // 页长, 默认每页10条
  180. let params = {
  181. source:1,
  182. pageNum : page.num,
  183. pageSize : page.size,
  184. statusIn : this.tabsList[this.tabsCurrent]?.status||'',
  185. userid:this.vuex_member_info.id
  186. // status : this.tabsList[this.tabsCurrent].status,
  187. }
  188. // console.log('this.params',params);
  189. this.$u.api.orderList(params).then(data => {
  190. this.hasfetch = true;
  191. console.log('data',JSON.parse(JSON.stringify(data)));
  192. // 接口返回的当前页数据列表 (数组)
  193. let curPageData = data.data.rows;
  194. // console.log('curPageData',JSON.parse(JSON.stringify(curPageData)));
  195. // 接口返回的当前页数据长度 (如列表有26个数据,当前页返回8个,则curPageLen=8)
  196. let curPageLen = curPageData.length;
  197. // 接口返回的总页数 (如列表有26个数据,每页10条,共3页; 则totalPage=3)
  198. // let totalPage = data.data.data.totalPage;
  199. // 接口返回的总数据量(如列表有26个数据,每页10条,共3页; 则totalSize=26)
  200. let totalSize = data.data.total;
  201. // 接口返回的是否有下一页 (true/false)
  202. // let hasNext = data.xxx;
  203. // console.log('totalPage',totalPage,'curPageLen',curPageLen);
  204. //设置列表数据
  205. if(page.num == 1) this.dataList = []; //如果是第一页需手动置空列表
  206. this.dataList = this.dataList.concat(curPageData); //追加新数据
  207. // 请求成功,隐藏加载状态
  208. //方法一(推荐): 后台接口有返回列表的总页数 totalPage
  209. // this.mescroll.endByPage(curPageLen, totalPage);
  210. //方法二(推荐): 后台接口有返回列表的总数据量 totalSize
  211. this.mescroll.endBySize(curPageLen, totalSize);
  212. }).catch(err => {
  213. this.mescroll.endErr()
  214. console.log(err)
  215. });
  216. },
  217. /*若希望重新加载列表,只需调用此方法即可(内部会自动page.num=1,再主动触发up.callback)*/
  218. reloadList() {
  219. this.mescroll.resetUpScroll();
  220. },
  221. tabsClick(item){
  222. // this.status = item.status;
  223. this.tabsCurrent = item.index;
  224. this.reloadList()
  225. // console.log('item',item);
  226. },
  227. goOrderDetails(item){
  228. uni.$u.route('/center/orderdetails', {
  229. id: item.id
  230. });
  231. },
  232. toggleMore(item,index){
  233. // console.log('toggleMore',item);
  234. this.orderListWithClass[index].showMore = !this.orderListWithClass[index].showMore
  235. this.goodsKey++;
  236. },
  237. clickEven(fun,item){
  238. // console.log('fun',fun);
  239. let funObj = {
  240. pay: this.pay,
  241. goOrderDetails:this.goOrderDetails,
  242. evaluate:this.evaluate,
  243. refund:this.refund,
  244. cancelOrder:this.cancelOrder,
  245. viewRefund:this.viewRefund,
  246. confirmReceipt:this.confirmReceipt,
  247. viewEvaluate:this.viewEvaluate,
  248. rebook:this.rebook,
  249. viewNewOrder:this.viewNewOrder,
  250. viewOldOrder:this.viewOldOrder,
  251. };
  252. // console.log('funObj[fun]',funObj[fun]);
  253. if (fun in funObj) {
  254. funObj[fun](item);
  255. }
  256. },
  257. getTemplateIdList(){
  258. this.$u.api.templateIdList({templateLabel:'order_pay'}).then(res=>{
  259. console.log('getTemplateIdList',res.data);
  260. this.templateIdList = res.data.list.map(item=>{
  261. return item.templateId
  262. });
  263. // if(this.templateIdList.length>0){
  264. // this.templateEven();
  265. // }
  266. }).catch(err=>{
  267. console.log('getTemplateIdList',err);
  268. })
  269. },
  270. pay(item){
  271. console.log('pay',item);
  272. // #ifdef H5
  273. this.gotoPay(item.id);
  274. // #endif
  275. // #ifdef MP
  276. this.setTemplate(item.id);
  277. // #endif
  278. // uni.$u.route('/shopping/pay', {
  279. // orderId: item.id,
  280. // // openid: that.vuex_wechatOpenid,
  281. // payAmount:item.orderPrice
  282. // });
  283. },
  284. evaluate(item){
  285. // console.log('logistics',item);
  286. uni.$u.route('/shopping/evaluate', {
  287. id: item.id
  288. });
  289. },
  290. comment(orderId,orderDetailId,goodsId){
  291. uni.$u.route('/shopping/addcomment', {
  292. orderId,
  293. orderDetailId,
  294. goodsId
  295. });
  296. },
  297. viewComment(orderDetailId,goodsId,goods){
  298. uni.$u.route('/shopping/viewcomment', {
  299. orderDetailId,
  300. goodsId,
  301. goods:JSON.stringify(goods)
  302. });
  303. },
  304. refund(item){
  305. // console.log('logistics',item);
  306. uni.$u.route('/shopping/refund', {
  307. id: item.id
  308. });
  309. },
  310. cancelOrder(item){
  311. let that = this;
  312. uni.showModal({
  313. title: '提示',
  314. content: '确认取消吗!',
  315. success: res => {
  316. if (res.confirm) {
  317. this.$u.api.cancelOrder({orderId:item.id}).then(res=>{
  318. this.$refs.uToast.show({
  319. message:res.msg,
  320. complete() {
  321. that.reloadList();
  322. }
  323. });
  324. // uni.$u.toast(res.msg);
  325. console.log('res',res.data);
  326. }).catch(err=>{
  327. console.log('cancelOrder',err);
  328. })
  329. }
  330. }
  331. });
  332. // console.log('logistics',item);
  333. },
  334. viewRefund(item){
  335. uni.$u.route('/center/viewRefund', {
  336. orderId: item.id
  337. });
  338. },
  339. confirmReceipt(item){
  340. let that = this;
  341. uni.showModal({
  342. title: '提示',
  343. content: '确认收货吗!',
  344. success: res => {
  345. if (res.confirm) {
  346. this.$u.api.confirmReceipt({orderId:item.id}).then(res=>{
  347. uni.showToast({
  348. title:res.msg,
  349. duration:2000,
  350. complete() {
  351. that.reloadList();
  352. }
  353. });
  354. console.log('res',res.data);
  355. }).catch(err=>{
  356. console.log('confirmReceipt',err);
  357. })
  358. }
  359. }
  360. })
  361. },
  362. viewEvaluate(item){
  363. uni.$u.route('/shopping/orderdetails', {
  364. id: item.id
  365. });
  366. },
  367. rebook(item){
  368. // console.log('rebook',item);
  369. uni.$u.route('pages/ticketlist',{performId:item.performId,orderId:item.id,fromPage:'rebook'})
  370. },
  371. viewOldOrder(item){
  372. console.log('viewOldOrder',item.orgOrderId);
  373. uni.$u.route('/center/orderdetails', {
  374. id: item.orgOrderId
  375. });
  376. },
  377. viewNewOrder(item){
  378. console.log('viewNewOrder',item.newOrderId);
  379. uni.$u.route('/center/orderdetails', {
  380. id: item.newOrderId
  381. });
  382. },
  383. // 设置小程序订阅消息
  384. setTemplate(orderId) {
  385. let that = this;
  386. console.log('templateIdList',this.templateIdList);
  387. uni.requestSubscribeMessage({
  388. tmplIds: that.templateIdList,
  389. success (res) {
  390. // that.gotoPay();
  391. console.log("success:",res);
  392. },
  393. fail (res) {
  394. console.log("fail:",res);
  395. },
  396. complete (res) {
  397. that.gotoPay(orderId);
  398. console.log("complete:",res);
  399. }
  400. })
  401. },
  402. gotoPay(orderId){
  403. this.$u.api.gotoPay({orderId:orderId,openid:''}).then(res=>{
  404. this.payResult = res.data.payInfo;
  405. this.payResult.package = res.data.payInfo.packageValue;
  406. // #ifdef H5
  407. this.initConfig(this.payResult)
  408. // #endif
  409. // #ifdef MP
  410. this.wxPay()
  411. // #endif
  412. // if(this.params.paymentMode==1||this.params.paymentMode==4){
  413. // this.wxPay()
  414. // }else{
  415. // uni.$u.route('/shopping/paysuccess');
  416. // }
  417. console.log('gotoPayres',res.data);
  418. }).catch(err=>{
  419. this.paypass = '';
  420. this.checkPassShow = false;
  421. console.log('gotoPay',err);
  422. })
  423. },
  424. wxPay(){
  425. let that = this;
  426. uni.requestPayment({
  427. ... this.payResult,
  428. "provider": "wxpay",
  429. "orderInfo": {
  430. // "appid": "wx499********7c70e", // 微信开放平台 - 应用 - AppId,注意和微信小程序、公众号 AppId 可能不一致
  431. // "noncestr": "c5sEwbaNPiXAF3iv", // 随机字符串
  432. // "package": "Sign=WXPay", // 固定值
  433. // "partnerid": "148*****52", // 微信支付商户号
  434. // "prepayid": "wx202254********************fbe90000", // 统一下单订单号
  435. // "timestamp": 1597935292, // 时间戳(单位:秒)
  436. // "sign": "A842B45937F6EFF60DEC7A2EAA52D5A0" // 签名,这里用的 MD5/RSA 签名
  437. },
  438. success(res) {
  439. setTimeout(()=>{
  440. this.tabsCurrent = 2;
  441. this.reloadList();
  442. },1500)
  443. // that.payQuery();
  444. },
  445. fail(e) {
  446. console.log('wxPayfail',e);
  447. }
  448. })
  449. },
  450. payQuery(){
  451. let that = this;
  452. let retryCount = 0;
  453. let maxRetryCount = 5; // 设置最大重试次数
  454. let interval = 2000; // 设置间隔时间为2秒
  455. let timeout = 10000; // 设置超时时间为10秒
  456. let timer;
  457. uni.showLoading({
  458. title:'支付结果查询中'
  459. })
  460. timer = setInterval(() => {
  461. retryCount++;
  462. if (retryCount > maxRetryCount || retryCount * interval > timeout) {
  463. clearInterval(timer);
  464. uni.hideLoading();
  465. console.log("支付查询超时或达到最大重试次数");
  466. // 在这里添加超时或达到最大重试次数的处理逻辑
  467. this.reloadList()
  468. } else {
  469. console.log("第" + retryCount + "次查询");
  470. // 调用查询支付状态的方法
  471. // 如果支付状态为成功,则清除定时器并处理成功的逻辑
  472. // 如果支付状态为失败,则清除定时器并处理失败的逻辑
  473. this.$u.api.payQuery({orderId:this.orderId}).then(res=>{
  474. // 0-未支付 1-已支付 2-支付中 3-支付失败 4-支付退款
  475. let payStatus = res.data.payStatus;
  476. if(payStatus===1){
  477. uni.$u.route('/center/paysuccess');
  478. }else if(payStatus===0||payStatus===2){
  479. this.payQuery()
  480. }else if(payStatus===3){
  481. uni.toast('支付失败')
  482. }
  483. clearInterval(timer);
  484. }).catch(err=>{
  485. console.log('payQuery',err);
  486. }).finally(()=>{
  487. uni.hideLoading()
  488. })
  489. }
  490. }, interval);
  491. },
  492. statisticsOrder(){
  493. this.$u.api.statisticsOrder().then(res=>{
  494. let data = res.data || {};
  495. this.orderBadge = Object.assign(this.orderBadge,data);
  496. let {noPayNum,deliverNum,collectNum,commentNum,refundNum} = res.data;
  497. let noPayNumindex = this.tabsList.findIndex(item => item.status == 0);
  498. this.tabsList[1].badge.isDot = false;
  499. this.tabsList[1].badge.value = noPayNum;
  500. this.tabsList[2].badge.isDot = false;
  501. this.tabsList[2].badge.value = deliverNum;
  502. this.tabsList[3].badge.isDot = false;
  503. this.tabsList[3].badge.value = collectNum;
  504. this.tabsList[4].badge.isDot = false;
  505. this.tabsList[4].badge.value = commentNum;
  506. this.tabsList[5].badge.isDot = false;
  507. this.tabsList[5].badge.value = refundNum;
  508. // console.log('statisticsOrder',res.data);
  509. // console.log('this.orderBadge',this.orderBadge);
  510. }).catch(err=>{
  511. console.log('memberInfo',err.data);
  512. })
  513. },
  514. /**
  515. * 公众号微信支付
  516. */
  517. initConfig() {
  518. // #ifdef H5
  519. let that = this
  520. wxH5.config({
  521. debug: false, // 这里一般在测试阶段先用ture,等打包给后台的时候就改回false,
  522. appId: that.payResult.appId, // 必填,公众号的唯一标识
  523. timestamp: that.payResult.timeStamp, // 必填,生成签名的时间戳
  524. nonceStr: that.payResult.nonceStr, // 必填,生成签名的随机串
  525. signature: that.payResult.paySign, // 必填,签名
  526. jsApiList: ['chooseWXPay', 'checkJsApi'] // 必填,需要使用的JS接口列表
  527. })
  528. wxH5.ready(() => {
  529. wxH5.chooseWXPay({
  530. timestamp: that.payResult.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
  531. nonceStr: that.payResult.nonceStr, // 支付签名随机串,不长于 32 位
  532. package: that.payResult.packageValue, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
  533. signType: 'SHA1', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
  534. paySign: that.payResult.paySign, // 支付签名
  535. success: () => {
  536. setTimeout(()=>{
  537. that.tabsCurrent = 2;
  538. that.reloadList();
  539. },1500)
  540. // that.payQuery();
  541. },
  542. fail: (e) => {
  543. uni.$u.route('/center/order', {
  544. status: 0
  545. });
  546. console.log('wxPayfail', e);
  547. },
  548. cancel: () => {
  549. uni.$u.route('/center/order', {
  550. status: 0
  551. });
  552. that.cansubmit = true;
  553. }
  554. })
  555. })
  556. // #endif
  557. }
  558. }
  559. }
  560. </script>
  561. <style>
  562. page{
  563. background-color: #F5F5F5;
  564. }
  565. </style>
  566. <style lang="scss" scoped>
  567. .tabs-wrap{
  568. background-color: #fff;
  569. margin-bottom: 10rpx;
  570. }
  571. .list-item{
  572. overflow: hidden;
  573. width: 48%;
  574. margin-bottom: 30rpx;
  575. background-color: #fff;
  576. .image-wrap{
  577. margin-bottom: 20rpx;
  578. }
  579. }
  580. .order-item{
  581. margin-bottom: 20rpx;
  582. background: #FFFFFF;
  583. box-shadow: 0rpx 2rpx 12rpx 0rpx rgba(221,221,221,0.5);
  584. border-radius: 20rpx;
  585. padding: 32rpx;
  586. content-visibility: auto;
  587. contain-intrinsic-size: 346rpx;
  588. .top{
  589. font-size: 24rpx;
  590. font-weight: 400;
  591. color: #7F7F7F;
  592. line-height: 36rpx;
  593. margin-bottom: 36rpx;
  594. }
  595. .info{
  596. margin-bottom: 30rpx;
  597. .img{
  598. width: 180rpx;
  599. height: 160rpx;
  600. border-radius: 12rpx;
  601. }
  602. .text{
  603. font-size: 24rpx;
  604. font-weight: 400;
  605. color: #7F7F7F;
  606. padding-left: 26rpx;
  607. flex: 1;
  608. .name{
  609. font-size: 28rpx;
  610. font-weight: bold;
  611. color: #363636;
  612. margin-bottom: 20rpx;
  613. }
  614. .time{
  615. margin-bottom: 20rpx;
  616. }
  617. .position{
  618. margin-bottom: 20rpx;
  619. }
  620. .statistics{
  621. text-align: right;
  622. }
  623. .label{
  624. font-size: 24rpx;
  625. font-weight: 400;
  626. color: #363636;
  627. margin-left: 10rpx;
  628. }
  629. .price{
  630. font-size: 32rpx;
  631. font-weight: bold;
  632. color: #ED0000;
  633. }
  634. }
  635. }
  636. .btn-wrap{
  637. }
  638. .btn{
  639. padding: 12rpx 40rpx;
  640. border: 1px solid #E5E5E5;
  641. color: #7F7F7F;
  642. text-align: center;
  643. border-radius: 8rpx;
  644. font-size: 24rpx;
  645. &.red{border-color: #ED0000;color: #ED0000;}
  646. &.red.solid{border-color: #ED0000;background-color:#ED0000;color: #fff;}
  647. &.green{color: #00A447;border-color: #00A447;}
  648. &:not(:first-child){
  649. margin-left: 20rpx;
  650. }
  651. }
  652. &.status-0{.status{color:#FF3C3F;}}
  653. &.status-1{.status{color:#FF3C3F;}}
  654. &.status-2{.status{color:#0099EB;}}
  655. &.status-3{.status{color:#00A447;}}
  656. &.status-4{.status{color:#FF3C3F;}}
  657. &.status-5{.status{color:#FF3C3F;}}
  658. &.status-6{.status{color:#FF3C3F;}}
  659. &.status-7{.status{color:#FFB100;}}
  660. }
  661. </style>