myRepairs.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <template>
  2. <scroll-view class="container" :scroll-y="scrollY" @scrolltolower="scrolltolower">
  3. <!-- 顶部分段器区域 -->
  4. <view class="control">
  5. <view class="control_item" :class="{ active: current === index }" v-for="(item, index) in items" :key="index" @click="onClickItem(index)">{{ item }}</view>
  6. </view>
  7. <!-- 主体内容区域 -->
  8. <view class="body">
  9. <!-- 每一个记录区域 -->
  10. <view class="body_item" :class="{ body_events: isClick }" v-for="item in list" :key="item.id" @click="handleLookDetail(item)">
  11. <!-- 工单编号 -->
  12. <view class="item_title">
  13. <img src="../../static/images/repairsImg/order.png" />
  14. <view class="title_info">工单编号:{{ item.recordNo }}</view>
  15. <view class="title_type" v-if="item.timeoutStr">{{ item.timeoutStr }}</view>
  16. </view>
  17. <!-- 报修时间 -->
  18. <view class="item_time">
  19. <view class="time_msg">
  20. 报修时间:
  21. <text>{{ item.reportTime }}</text>
  22. </view>
  23. <view class="time_type" v-if="item.state === '待接单'">待接单</view>
  24. <view class="time_type color_type" v-if="item.state === '维修中'">维修中</view>
  25. <view class="time_type color_type" v-if="item.state === '转单审核'">转单审核</view>
  26. <view class="time_type color_type" v-if="item.state === '协作审核'">协作审核</view>
  27. <view class="time_type" v-if="item.state === '待确认'">待确认</view>
  28. <view class="time_type color_type2" v-if="item.state === '已完成'">已完成</view>
  29. <view class="time_type" v-if="item.state === '已取消'">已取消</view>
  30. <view class="time_type color_type3" v-if="item.state === '已关单'">已关单</view>
  31. </view>
  32. <!-- 报修姓名 -->
  33. <view class="item_box">
  34. <view class="box_key">报修姓名:</view>
  35. <view class="box_value">{{ item.userName }}</view>
  36. </view>
  37. <!-- 部门 -->
  38. <view class="item_box" v-if="item.userClass">
  39. <view class="box_key">部门:</view>
  40. <view class="box_value">{{ item.userClass }}</view>
  41. </view>
  42. <!-- 报修电话 -->
  43. <view class="item_box">
  44. <view class="box_key">报修电话:</view>
  45. <view class="box_value phone" @click.stop="handleCallPhone(item.userPhone)">
  46. {{ item.userPhone }}
  47. <img src="../../static/images/repairsImg/phone.png" />
  48. </view>
  49. </view>
  50. <!-- 报修区域 -->
  51. <view class="item_box">
  52. <view class="box_key">报修区域:</view>
  53. <view class="box_value">{{ item.areaName }}</view>
  54. </view>
  55. <!-- 详细地址 -->
  56. <view class="item_box">
  57. <view class="box_key">详细地址:</view>
  58. <view class="box_value">{{ item.address }}</view>
  59. </view>
  60. <!-- 报修物品 -->
  61. <view class="item_box">
  62. <view class="box_key">报修物品:</view>
  63. <view class="box_value">{{ item.articleName }}</view>
  64. </view>
  65. <!-- 故障描述 -->
  66. <view class="item_box" v-if="item.descript">
  67. <view class="box_key">故障描述:</view>
  68. <view class="box_value">{{ item.descript }}</view>
  69. </view>
  70. <!-- 报修录音 -->
  71. <view class="item_box" v-if="item.voice">
  72. <view class="box_key">报修录音:</view>
  73. <view class="box_value">
  74. <view class="recording" @click.stop="handlePlayRecording(item)">
  75. <img class="voiceImg" :src="item.status ? '../../static/images/repairsImg/play_active.png' : '../../static/images/repairsImg/play.png'" />
  76. {{ item.voiceLength }}″
  77. </view>
  78. </view>
  79. </view>
  80. <!-- 上传图片 -->
  81. <view class="item_img">
  82. <view class="img_key">上传图片:</view>
  83. <img class="img_value" mode="aspectFill" :src="item.images[0]" @click.stop="handleLookImgs(item.images)" />
  84. </view>
  85. <!-- 维修师傅 -->
  86. <view class="item_time" v-if="item.maintenancerName">
  87. <view class="time_msg">
  88. 维修师傅:
  89. <text>{{ item.maintenancerName }}</text>
  90. </view>
  91. </view>
  92. <!-- 师傅电话 -->
  93. <view class="item_box" v-if="item.maintenancerPhone">
  94. <view class="box_key">师傅电话:</view>
  95. <view class="box_value phone" @click.stop="handleCallPhone(item.maintenancerPhone)">
  96. {{ item.maintenancerPhone }}
  97. <img src="../../static/images/repairsImg/phone.png" />
  98. </view>
  99. </view>
  100. <!-- 维修费用 -->
  101. <view class="item_box" v-if="item.price">
  102. <view class="box_key">维修费用:</view>
  103. <view class="box_value2 phone" @click.stop="checkFeeDetail(item)">
  104. {{ item.price }}元
  105. <img src="../../static/images/repairsImg/eye.png" />
  106. </view>
  107. </view>
  108. <!-- 按钮 -->
  109. <view class="item_btn" v-if="item.state !== '已取消' && item.state !== '已关单'">
  110. <view
  111. class="btn_box type"
  112. v-if="item.state === '待接单' || item.state === '维修中' || item.state === '转单审核' || item.state === '协作审核'"
  113. @click.stop="handleExpedite(item.id)"
  114. >
  115. 催单
  116. </view>
  117. <view class="btn_box type" v-if="item.state === '待确认'" @click.stop="handleBackOffice(item)">转后勤</view>
  118. <view class="btn_box type" v-if="item.state === '待确认'" @click.stop="handlePay(item)">支付</view>
  119. <view class="btn_box type2" v-if="item.state === '待接单' || item.state === '待确认'" @click.stop="handleRepeal(item.id)">撤销</view>
  120. <view class="btn_box type" v-if="item.state === '已完成' && item.evaluate === 1" @click.stop="handleEvaluate(item)">去评价</view>
  121. <view class="btn_box type3" v-if="item.state === '已完成' && item.evaluate === 0" @click.stop="">已评价</view>
  122. </view>
  123. <view class="item_btn2" v-else></view>
  124. </view>
  125. <!-- 维修费用弹窗 -->
  126. <uni-popup :is-mask-click="false" ref="popup_fee">
  127. <view class="pop_fee" @click.stop="">
  128. <view class="fee_title">
  129. 维修费用
  130. <text
  131. @click="
  132. $refs.popup_fee.close()
  133. isClick = false
  134. "
  135. >
  136. ×
  137. </text>
  138. </view>
  139. <view class="fee_list">
  140. <view class="fee_item" v-for="ele in consumables" :key="ele.id">
  141. <view class="fee_box">
  142. 耗材:
  143. <text>{{ ele.consumeName }}</text>
  144. </view>
  145. <view class="fee_box">
  146. 耗材单价:
  147. <text>{{ ele.price }}元</text>
  148. </view>
  149. <view class="fee_box">
  150. 耗材数量:
  151. <text>{{ ele.number }}</text>
  152. </view>
  153. <view class="fee_box">
  154. 耗材费用:
  155. <text>{{ ele.totalPrice }}元</text>
  156. </view>
  157. </view>
  158. </view>
  159. </view>
  160. </uni-popup>
  161. <!-- 转后勤弹窗 -->
  162. <uni-popup ref="popup_logistics" :is-mask-click="false">
  163. <view class="pop_logistics" @click.stop="">
  164. <view class="logistics_title">转后勤</view>
  165. <view class="logistics_body">
  166. <textarea placeholder-style="color:#CCCCCC" placeholder="请输入您宝贵的留言" v-model="logisticsValue"></textarea>
  167. </view>
  168. <view class="logistics_btn">
  169. <view
  170. class="btn_box cancel"
  171. @click="
  172. $refs.popup_logistics.close()
  173. isClick = false
  174. "
  175. >
  176. 取消
  177. </view>
  178. <view class="btn_box confirm" @click="handleLogisticsConfirm">确定</view>
  179. </view>
  180. </view>
  181. </uni-popup>
  182. <!-- 没有数据时展示的图片 -->
  183. <view class="body_no_data" v-if="list.length === 0">
  184. <img src="../../pagesClockIn/static/imgs/nodata.png" />
  185. <view>暂无数据</view>
  186. </view>
  187. </view>
  188. </scroll-view>
  189. </template>
  190. <script>
  191. const innerAudioContext = uni.createInnerAudioContext()
  192. export default {
  193. data() {
  194. return {
  195. // 每一个订单点击时是否触发事件 true 不触发 false 触发
  196. isClick: false,
  197. // 后勤弹窗输入框绑定数据
  198. logisticsValue: '',
  199. // 顶部分段器数组
  200. items: ['未完成(0)', '待确认(0)', '已完成(0)'],
  201. // 分段器数组当前索引
  202. current: 0,
  203. // 订单列表
  204. list: [],
  205. // 是否可以Y轴滚动
  206. scrollY: true,
  207. // 用户id,请求接口时的参数
  208. userId: '',
  209. // 当前页
  210. currentPage: 1,
  211. // 每页多少条数据
  212. pageCount: 5,
  213. // 列表总数据
  214. total: 0,
  215. // 维修费用耗材明细列表
  216. consumables: [],
  217. // 当前操作的记录Id
  218. recordId: ''
  219. }
  220. },
  221. mounted() {
  222. this.userId = uni.getStorageSync('repairsUserInfo').userId
  223. this.getRepairCount()
  224. this.getRepairList()
  225. },
  226. methods: {
  227. // 获取每个状态的订单总数量
  228. async getRepairCount() {
  229. const res = await this.$myRequest_repairs({
  230. url: '/repairRecord/getRepairRecordCountByUserId',
  231. data: {
  232. userId: this.userId
  233. }
  234. })
  235. // console.log(res)
  236. if (res.code === '200') {
  237. this.items = [`未完成(${res.data.incomplete})`, `待确认(${res.data.confirmed})`, `已完成(${res.data.finished})`]
  238. }
  239. },
  240. // 获取订单列表数据
  241. async getRepairList() {
  242. const res = await this.$myRequest_repairs({
  243. url: '/repairRecord/getRepairRecordsByUserId',
  244. data: {
  245. userId: this.userId,
  246. currentPage: this.currentPage,
  247. pageCount: this.pageCount,
  248. state: this.current - 0 + 1
  249. }
  250. })
  251. // console.log(res)
  252. if (res.code === '200') {
  253. res.data.list.forEach((ele) => {
  254. return (ele.status = false)
  255. })
  256. this.list = [...this.list, ...res.data.list]
  257. this.total = res.data.totalCount
  258. // 当页面没有数据时,页面禁止滚动
  259. if (this.list.length === 0) {
  260. this.scrollY = false
  261. } else {
  262. this.scrollY = true
  263. }
  264. } else {
  265. // 请求数据失败页面禁止滚动
  266. this.scrollY = false
  267. }
  268. },
  269. // 滚动到底部触发回调
  270. scrolltolower() {
  271. if (this.total > this.list.length) {
  272. this.currentPage++
  273. this.getRepairList()
  274. } else {
  275. uni.showToast({
  276. title: '没有更多数据了',
  277. icon: 'none'
  278. })
  279. }
  280. },
  281. // 分段器切换回调
  282. onClickItem(index) {
  283. // 清空数组
  284. this.list = []
  285. // 重置当前页面可以滚动
  286. this.scrollY = true
  287. // 重置请求数据当前页参数
  288. this.currentPage = 1
  289. // 改变分段器索引
  290. this.current = index
  291. this.getRepairList()
  292. this.getRepairCount()
  293. },
  294. // 转后勤弹窗确定按钮回调
  295. async handleLogisticsConfirm() {
  296. if (!this.logisticsValue) {
  297. uni.showToast({
  298. title: '留言不能为空',
  299. icon: 'none'
  300. })
  301. return
  302. }
  303. const res = await this.$myRequest_repairs({
  304. url: '/repairLeaveMessage/transferToLogistics',
  305. method: 'post',
  306. data: {
  307. recordId: this.recordId,
  308. userId: this.userId,
  309. content: this.logisticsValue
  310. }
  311. })
  312. // console.log(res)
  313. if (res.code === '200') {
  314. uni.showToast({
  315. title: '转后勤成功',
  316. icon: 'success',
  317. mask: true
  318. })
  319. this.$refs.popup_logistics.close()
  320. this.isClick = false
  321. } else {
  322. uni.showToast({
  323. title: res.message,
  324. icon: 'fail'
  325. })
  326. }
  327. },
  328. // 催单按钮回调
  329. handleExpedite(id) {
  330. uni.showModal({
  331. title: '提示',
  332. content: '确定催单吗?',
  333. success: async (res) => {
  334. if (res.confirm) {
  335. const res = await this.$myRequest_repairs({
  336. url: '/repairRecord/repairRecordReminder',
  337. data: {
  338. recordId: id
  339. }
  340. })
  341. // console.log(res)
  342. if (res.code === '200') {
  343. uni.showToast({
  344. title: '催单成功',
  345. icon: 'success',
  346. mask: true
  347. })
  348. }
  349. }
  350. }
  351. })
  352. },
  353. // 撤销按钮回调
  354. handleRepeal(id) {
  355. uni.showModal({
  356. title: '提示',
  357. content: '确定撤销吗?',
  358. success: async (res) => {
  359. if (res.confirm) {
  360. const res = await this.$myRequest_repairs({
  361. url: '/repairRecord/revokeRepairRecordById',
  362. method: 'get',
  363. data: {
  364. id
  365. }
  366. })
  367. // console.log(res)
  368. if (res.code === '200') {
  369. uni.showToast({
  370. title: '撤销成功',
  371. icon: 'success',
  372. mask: true
  373. })
  374. setTimeout(() => {
  375. this.list = []
  376. this.currentPage = 1
  377. this.getRepairList()
  378. }, 1500)
  379. }
  380. }
  381. }
  382. })
  383. },
  384. // 查看维修费用回调
  385. checkFeeDetail(item) {
  386. this.$refs.popup_fee.open('center')
  387. this.consumables = item.consumables
  388. this.isClick = true
  389. },
  390. // 转后勤按钮回调
  391. handleBackOffice(item) {
  392. this.recordId = item.id
  393. this.isClick = true
  394. this.$refs.popup_logistics.open('center')
  395. },
  396. // 去评价按钮回调
  397. handleEvaluate(item) {
  398. let recordId = item.id
  399. uni.navigateTo({
  400. url: `/pagesRepairs/evaluate/evaluate?recordId=${recordId}`
  401. })
  402. },
  403. // 点击工单编号区域回调
  404. handleLookDetail(item) {
  405. uni.navigateTo({
  406. url: `/pagesRepairs/repairDetails/repairDetails?id=${item.id}`
  407. })
  408. },
  409. // 点击电话号码回调
  410. handleCallPhone(phone) {
  411. uni.makePhoneCall({
  412. phoneNumber: phone
  413. })
  414. },
  415. // 点击图片回调
  416. handleLookImgs(img) {
  417. uni.previewImage({
  418. urls: img
  419. })
  420. },
  421. // 点击支付按钮回调
  422. async handlePay(item) {
  423. const res = await this.$myRequest_repairs({
  424. url: '/repairRecord/pay',
  425. method: 'post',
  426. data: {
  427. recordId: item.id,
  428. openid: uni.getStorageSync('openId'),
  429. totalPrice: item.price
  430. }
  431. })
  432. // console.log(res)
  433. if (res.code === '200') {
  434. uni.requestPayment({
  435. provider: 'wxpay',
  436. timeStamp: res.data.timeStamp,
  437. nonceStr: res.data.nonceStr,
  438. package: 'prepay_id=' + res.data.prepay_id,
  439. signType: res.data.signType,
  440. paySign: res.data.paySign,
  441. success: (res) => {
  442. if (res.errMsg == 'requestPayment:ok') {
  443. uni.showToast({
  444. title: '支付成功',
  445. icon: 'success',
  446. mask: true
  447. })
  448. setTimeout(() => {
  449. // 清空数组
  450. this.list = []
  451. // 重置当前页面可以滚动
  452. this.scrollY = true
  453. // 重置请求数据当前页参数
  454. this.currentPage = 1
  455. this.getRepairList()
  456. this.getRepairCount()
  457. }, 1500)
  458. } else {
  459. uni.showToast({
  460. title: '支付失败',
  461. icon: 'error',
  462. mask: true
  463. })
  464. }
  465. },
  466. fail: (err) => {
  467. if (err.errMsg === 'requestPayment:fail cancel') {
  468. uni.showToast({
  469. title: '支付已取消',
  470. icon: 'none',
  471. mask: true
  472. })
  473. }
  474. }
  475. })
  476. } else {
  477. uni.showToast({
  478. title: res.message,
  479. icon: 'none',
  480. mask: true
  481. })
  482. }
  483. },
  484. // 点击录音播放回调
  485. handlePlayRecording(item) {
  486. this.list.forEach((ele) => {
  487. if (ele.id !== item.id) {
  488. ele.status = false
  489. }
  490. })
  491. innerAudioContext.src = item.voice
  492. if (!item.status) {
  493. item.status = true
  494. innerAudioContext.play()
  495. //播放结束
  496. innerAudioContext.onEnded(() => {
  497. item.status = false
  498. })
  499. } else {
  500. item.status = false
  501. innerAudioContext.stop()
  502. }
  503. }
  504. }
  505. }
  506. </script>
  507. <style lang="scss" scoped>
  508. .container {
  509. display: flex;
  510. flex-direction: column;
  511. box-sizing: border-box;
  512. padding: 0 30rpx;
  513. width: 100vw;
  514. height: calc(100vh - 152rpx);
  515. overflow-y: auto;
  516. // 隐藏滚动条
  517. ::-webkit-scrollbar {
  518. width: 0;
  519. height: 0;
  520. color: transparent;
  521. }
  522. .control {
  523. display: flex;
  524. box-sizing: border-box;
  525. margin: 26rpx 0 29rpx;
  526. padding: 6rpx;
  527. width: 100%;
  528. height: 88rpx;
  529. border-radius: 18rpx;
  530. background-color: #f2f2f2;
  531. .control_item {
  532. flex: 1;
  533. display: flex;
  534. justify-content: center;
  535. align-items: center;
  536. height: 76rpx;
  537. font-size: 32rpx;
  538. }
  539. .active {
  540. border-radius: 18rpx;
  541. background-color: #fff;
  542. }
  543. }
  544. .body {
  545. // height: calc(100vh - 190rpx);
  546. // overflow-y: auto;
  547. padding-bottom: 25rpx;
  548. .body_item {
  549. margin: 10rpx 10rpx 30rpx;
  550. // height: 799rpx;
  551. border-radius: 11rpx;
  552. box-shadow: 0 0 8rpx #d9d9d9;
  553. .item_title {
  554. display: flex;
  555. align-items: center;
  556. padding: 0 30rpx;
  557. height: 87rpx;
  558. border-bottom: 1rpx solid #e6e6e6;
  559. img {
  560. width: 30rpx;
  561. height: 30rpx;
  562. }
  563. .title_info {
  564. margin: 0 21rpx 0 13rpx;
  565. font-size: 28rpx;
  566. }
  567. .title_type {
  568. width: 137rpx;
  569. height: 47rpx;
  570. line-height: 47rpx;
  571. text-align: center;
  572. border-radius: 136rpx;
  573. color: #ff5733;
  574. font-size: 24rpx;
  575. border: 1rpx solid #ff5733;
  576. }
  577. }
  578. .item_time {
  579. display: flex;
  580. justify-content: space-between;
  581. align-items: center;
  582. padding: 0 30rpx;
  583. height: 79rpx;
  584. .time_msg {
  585. font-size: 28rpx;
  586. color: #808080;
  587. text {
  588. color: #000000;
  589. }
  590. }
  591. .time_type {
  592. font-size: 32rpx;
  593. color: #ff5733;
  594. }
  595. .color_type {
  596. color: #1e7dfb;
  597. }
  598. .color_type2 {
  599. color: #6fb6b8;
  600. }
  601. .color_type3 {
  602. color: #cccccc;
  603. }
  604. }
  605. .item_box {
  606. display: flex;
  607. padding: 0 30rpx;
  608. line-height: 60rpx;
  609. font-size: 28rpx;
  610. .box_key {
  611. // width: 145rpx;
  612. color: #808080;
  613. }
  614. .box_value {
  615. max-width: calc(100% - 145rpx);
  616. display: flex;
  617. align-items: center;
  618. img {
  619. margin-top: 5rpx;
  620. margin-left: 10rpx;
  621. width: 28rpx;
  622. height: 28rpx;
  623. }
  624. .recording {
  625. display: flex;
  626. align-items: center;
  627. margin: 15rpx 0;
  628. width: 130rpx;
  629. height: 40rpx;
  630. color: #000;
  631. border-radius: 100rpx;
  632. border: 1rpx solid #cccccc;
  633. .voiceImg {
  634. margin: 0 12rpx;
  635. width: 30rpx;
  636. height: 30rpx;
  637. }
  638. }
  639. }
  640. .box_value2 {
  641. display: flex;
  642. align-items: center;
  643. img {
  644. margin-top: -2rpx;
  645. margin-left: 14rpx;
  646. width: 46rpx;
  647. height: 46rpx;
  648. }
  649. }
  650. .phone {
  651. color: #6fb6b8;
  652. }
  653. }
  654. .item_img {
  655. display: flex;
  656. align-items: center;
  657. padding: 0 30rpx;
  658. height: 120rpx;
  659. color: #808080;
  660. font-size: 28rpx;
  661. .img_key {
  662. }
  663. .img_value {
  664. width: 120rpx;
  665. height: 120rpx;
  666. border-radius: 14rpx;
  667. }
  668. }
  669. .item_btn {
  670. display: flex;
  671. align-items: center;
  672. justify-content: flex-end;
  673. padding: 0 30rpx;
  674. height: 153rpx;
  675. .btn_box {
  676. display: flex;
  677. justify-content: center;
  678. align-items: center;
  679. margin-left: 16rpx;
  680. width: 174rpx;
  681. height: 68rpx;
  682. font-size: 28rpx;
  683. border-radius: 11rpx;
  684. }
  685. .type {
  686. color: #fff;
  687. background-color: #6fb6b8;
  688. }
  689. .type2 {
  690. color: #6fb6b8;
  691. background-color: #fff;
  692. border: 1rpx solid #6fb6b8;
  693. }
  694. .type3 {
  695. color: #6fb6b8;
  696. background-color: #eee;
  697. }
  698. }
  699. .item_btn2 {
  700. height: 50rpx;
  701. }
  702. }
  703. .pop_fee {
  704. padding-bottom: 10rpx;
  705. border-radius: 19rpx;
  706. background-color: #fff;
  707. .fee_title {
  708. display: flex;
  709. justify-content: space-between;
  710. align-items: center;
  711. box-sizing: border-box;
  712. padding: 0 31rpx 0 42rpx;
  713. width: 690rpx;
  714. height: 110rpx;
  715. font-size: 32rpx;
  716. font-weight: bold;
  717. border-radius: 19rpx 19rpx 0 0;
  718. border-bottom: 1rpx solid #e6e6e6;
  719. text {
  720. font-size: 45rpx;
  721. font-weight: 400;
  722. color: #808080;
  723. }
  724. }
  725. .fee_list {
  726. max-height: 50vh;
  727. overflow-y: auto;
  728. .fee_item {
  729. border-bottom: 1rpx solid #e6e6e6;
  730. .fee_box {
  731. display: flex;
  732. align-items: center;
  733. padding-left: 42rpx;
  734. height: 80rpx;
  735. font-size: 28rpx;
  736. color: #808080;
  737. text {
  738. color: #000000;
  739. }
  740. }
  741. }
  742. }
  743. }
  744. .pop_logistics {
  745. border-radius: 19rpx;
  746. background-color: #fff;
  747. .logistics_title {
  748. display: flex;
  749. justify-content: center;
  750. align-items: center;
  751. width: 690rpx;
  752. height: 110rpx;
  753. font-size: 32rpx;
  754. font-weight: bold;
  755. border-radius: 19rpx 19rpx 0 0;
  756. border-bottom: 1rpx solid #e6e6e6;
  757. }
  758. .logistics_body {
  759. height: 440rpx;
  760. border-bottom: 1rpx solid #e6e6e6;
  761. textarea {
  762. box-sizing: border-box;
  763. margin: 35rpx 40rpx;
  764. padding: 20rpx;
  765. width: 610rpx;
  766. height: 370rpx;
  767. font-size: 28rpx;
  768. border-radius: 14rpx;
  769. border: 1rpx solid #e6e6e6;
  770. }
  771. }
  772. .logistics_btn {
  773. display: flex;
  774. align-items: center;
  775. justify-content: space-evenly;
  776. height: 121rpx;
  777. .btn_box {
  778. display: flex;
  779. justify-content: center;
  780. align-items: center;
  781. width: 203rpx;
  782. height: 72rpx;
  783. border-radius: 9rpx;
  784. font-size: 32rpx;
  785. }
  786. .cancel {
  787. background-color: #e5e5e5;
  788. color: #6fb6b8;
  789. }
  790. .confirm {
  791. background-color: #6fb6b8;
  792. color: #fff;
  793. }
  794. }
  795. }
  796. .body_events {
  797. pointer-events: none;
  798. }
  799. .body_no_data {
  800. text-align: center;
  801. color: #b3b3b3;
  802. font-size: 24rpx;
  803. img {
  804. margin: 150rpx auto 50rpx;
  805. width: 480rpx;
  806. height: 508rpx;
  807. }
  808. }
  809. }
  810. }
  811. </style>