myRepairs.vue 19 KB

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