orderList.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. <template>
  2. <view>
  3. <zj-page-layout
  4. :hasFooter="false"
  5. :isScroll="true"
  6. :refresherTriggered="refresherTriggered"
  7. @refresherrefresh="refresherrefresh"
  8. @scrolltolower="scrolltolower"
  9. >
  10. <template slot="header">
  11. <view class="top-container">
  12. <scroll-view class="tab-scroll-view" scroll-x scroll-with-animation :scroll-left="scrollLeft">
  13. <view class="left-nav">
  14. <view
  15. class="item"
  16. v-for="(item, index) in mainTabs"
  17. :key="index"
  18. :class="[curMainTab === item.value ? 'active' : '', 'tab-item-' + index]"
  19. @tap="changeMainTab(item.value)"
  20. >
  21. <view class="name">{{ item.name }}</view>
  22. <view class="num">{{ item.num || '' }}</view>
  23. </view>
  24. </view>
  25. </scroll-view>
  26. <view class="right-search">
  27. <u-icon name="search" color="#ffffff" size="28" @tap="toSearchPage()"></u-icon>
  28. </view>
  29. </view>
  30. </template>
  31. <view>
  32. <view class="status-container">
  33. <u-tabs
  34. :list="smallTabs"
  35. @change="changeSmallTab"
  36. :current="curSmallTabIndex"
  37. lineWidth="0"
  38. lineHeight="0"
  39. activeStyle="height: 68rpx; display: flex; align-items: center; justify-content: center; padding: 0 24rpx; border-radius: 24rpx; background: #E7EFFF; color: #3D8FFD; border: 1px solid #3D8FFD; box-sizing: border-box;"
  40. inactiveStyle="height: 68rpx; display: flex; align-items: center; justify-content: center; padding: 0 24rpx; border-radius: 24rpx; border: 1px solid #eaeaea; box-sizing: border-box;"
  41. itemStyle="padding: 0; border-radius: 24rpx; color: #999999; margin-right: 16rpx; font-size: 28rpx;"
  42. >
  43. </u-tabs>
  44. <view class="date" :class="startDate ? 'active' : ''" @tap="isShowDatePicker = true">
  45. <view class="text">按日期</view>
  46. <text class="iconfont icon-jinru"></text>
  47. </view>
  48. </view>
  49. <view class="order-list-container">
  50. <view class="item" v-for="(item, index) in dataList" :key="index" @tap="toDetail(item.id)">
  51. <view class="item-top">
  52. <view class="left">
  53. <view class="title" v-if="item.orderSmallTypeText">
  54. {{ item.orderSmallTypeText.slice(0, 2) }}
  55. </view>
  56. <view class="tags">
  57. <view class="tag red_solid" v-for="(it, idx) in item.orderFlags" :key="idx">{{ it.tagName }}</view>
  58. </view>
  59. </view>
  60. <view class="status">{{ item.orderStatusText }}</view>
  61. </view>
  62. <view class="item-main">
  63. <view class="row">
  64. <view class="label">服务单号</view>
  65. <view class="value">
  66. <view class="val">{{ item.id }}</view>
  67. </view>
  68. </view>
  69. <view class="row" v-if="item.appointmentTime">
  70. <view class="label">预约时间</view>
  71. <view class="value">
  72. <view class="val">{{ item.appointmentTime.slice(0, 10) }}</view>
  73. </view>
  74. </view>
  75. <view class="row">
  76. <view class="label">服务项目</view>
  77. <view class="value">
  78. <view class="val">{{
  79. item.pgOrderProducts.map(o => `${o.mainName || ''}${item.orderSmallTypeText}x${o.num}`).join(',')
  80. }}</view>
  81. </view>
  82. </view>
  83. <view class="row">
  84. <view class="label">客户姓名</view>
  85. <view class="value">
  86. <view class="val">{{ item.userName }} {{ item.userMobile }}</view>
  87. <view class="num" v-if="item.customerTotalNum > 0">
  88. (共<text>{{ item.customerSortNum || 0 }}</text
  89. >/{{ item.customerTotalNum || 0 }}单)</view
  90. >
  91. <view
  92. class="fun"
  93. v-if="orderStatus_v(item.orderStatus) !== 'DQD'"
  94. @tap.stop="$callPhone(item.userMobile)"
  95. >
  96. <text class="iconfont icon-call"></text>
  97. <view class="text">联系Ta</view>
  98. </view>
  99. </view>
  100. </view>
  101. <view class="row address-row">
  102. <!-- // name: item.userName, -->
  103. <view class="label">服务地址</view>
  104. <view class="value">
  105. <view class="val address ellipsis-3">{{ item.address || item.gpsAddress }}</view>
  106. <view
  107. class="fun"
  108. v-if="orderStatus_v(item.orderStatus) !== 'DQD'"
  109. @tap.stop="
  110. $openLocation({
  111. lat: item.lat,
  112. lng: item.lng,
  113. address: item.address || item.gpsAddress
  114. })
  115. "
  116. >
  117. <text class="iconfont icon-daohang"></text>
  118. <view class="text">导航</view>
  119. </view>
  120. </view>
  121. </view>
  122. </view>
  123. <view class="item-btn" @tap.stop>
  124. <!-- 待接单 -->
  125. <block v-if="orderStatus_v(item.orderStatus) == 'DJD'">
  126. <u-button
  127. plain
  128. type="primary"
  129. text="配件申请"
  130. @tap=""
  131. v-if="item.orderType != 'INSTALL'"
  132. @tap="toPartsApply(item.id)"
  133. ></u-button>
  134. <u-button
  135. plain
  136. type="primary"
  137. text="取消加急"
  138. @tap="actionUrgent(item.id, false)"
  139. v-if="item.orderFlags && item.orderFlags.some(o => o.tag == 'JIA_JI')"
  140. ></u-button>
  141. <u-button plain type="primary" text="加急" @tap="actionUrgent(item.id, true)" v-else></u-button>
  142. <u-button type="primary" text="接单" @tap="actionReceive(item.id)"></u-button>
  143. </block>
  144. <!-- 服务中 -->
  145. <block v-if="orderStatus_v(item.orderStatus) == 'FWZ' || orderStatus_v(item.orderStatus) == 'YCD'">
  146. <u-button
  147. plain
  148. type="primary"
  149. text="配件申请"
  150. v-if="item.orderType != 'INSTALL'"
  151. @tap="toPartsApply(item.id)"
  152. ></u-button>
  153. <u-button
  154. plain
  155. type="primary"
  156. text="辅材收费"
  157. @tap="toCharge(item.id, 'M')"
  158. v-if="item.orderType == 'INSTALL'"
  159. ></u-button>
  160. <u-button plain type="primary" text="配件收费" @tap="toCharge(item.id, 'P')" v-else></u-button>
  161. <u-button type="primary" text="过程反馈" @tap="toFeedback(item.id)"></u-button>
  162. </block>
  163. <!-- 待抢单 -->
  164. <block v-if="orderStatus_v(item.orderStatus) == 'DQD'">
  165. <u-button type="primary" text="抢单" @tap="qdOrder(item)"></u-button>
  166. </block>
  167. </view>
  168. </view>
  169. </view>
  170. <Loading :loadStatus="loadStatus" :dataList="dataList" />
  171. </view>
  172. </zj-page-layout>
  173. <zj-dialog-dateRangePicker v-model="isShowDatePicker" @confirm="confirmDate"></zj-dialog-dateRangePicker>
  174. </view>
  175. </template>
  176. <script>
  177. import zjDialogDateRangePicker from '@/components/zj-dialog/zj-dialog-dateRangePicker.vue'
  178. export default {
  179. components: {
  180. zjDialogDateRangePicker
  181. },
  182. data() {
  183. return {
  184. mainTabs: [
  185. { name: '全部', value: '', num: 0 },
  186. { name: '待抢单', value: 'DQD', num: 0 },
  187. { name: '待接单', value: 'DJD', num: 0 },
  188. { name: '服务中', value: 'FWZ', num: 0 },
  189. { name: '已完工', value: 'YWG', num: 0 },
  190. { name: '异常待处理', value: 'YCD', num: 0 }
  191. ],
  192. curMainTab: '',
  193. curSmallTab: 0,
  194. curSmallTabIndex: 0,
  195. smallTabs: [
  196. { id: 0, name: '全部' },
  197. { id: 1, name: '今天' },
  198. { id: 2, name: '明天' },
  199. { id: 3, name: '其他' }
  200. ],
  201. curOrderType: '',
  202. isShowDatePicker: false,
  203. startDate: '',
  204. endDate: '',
  205. dataList: [],
  206. pageNum: 1,
  207. loadStatus: 0,
  208. refresherTriggered: false, // 下拉刷新状态
  209. scrollLeft: 0,
  210. scrollViewWidth: 0,
  211. tabsRect: {
  212. left: 0
  213. },
  214. isYb: false, // 是否延保单
  215. isWb: false // 是否维保单
  216. }
  217. },
  218. async onReady({ tab, isYb, isWb }) {
  219. this.crossPage.$on('refreshWorkorderList', data => {
  220. if (data && data.tab) {
  221. this.curMainTab = data.tab
  222. }
  223. this.refreshList()
  224. })
  225. if (isYb) {
  226. this.isYb = true
  227. }
  228. if (isWb) {
  229. this.isWb = true
  230. }
  231. this.getCount()
  232. this.curMainTab = tab || ''
  233. this.refreshList()
  234. this.resize()
  235. },
  236. onUnload() {
  237. this.crossPage.$off('refreshWorkorderList')
  238. },
  239. methods: {
  240. orderStatus_v(orderStatus) {
  241. if (['DYY'].includes(orderStatus)) {
  242. // 待预约
  243. return 'DYY'
  244. } else if (['DQD'].includes(orderStatus)) {
  245. // 待抢单
  246. return 'DQD'
  247. } else if (
  248. [
  249. 'DSHPG',
  250. 'CJ',
  251. 'YPD',
  252. 'DXSPD',
  253. 'DZBPG',
  254. 'DWDSPGP',
  255. 'DXSSPGP',
  256. 'DTJXSSPGP',
  257. 'DZBSPGP',
  258. 'DFZXPD',
  259. 'DFZXSPGP',
  260. 'XSBH',
  261. 'TJXSBH',
  262. 'ZBBH',
  263. 'FZXBH',
  264. 'FL'
  265. ].includes(orderStatus)
  266. ) {
  267. // 待商户派工
  268. return 'DSHPG'
  269. } else if (['DWDPG', 'DWDPD', 'WDBH'].includes(orderStatus)) {
  270. // 待网点派工
  271. return 'DWDPG'
  272. } else if (['DJD', 'DSM', 'YZP'].includes(orderStatus)) {
  273. // 待接单
  274. return 'DJD'
  275. } else if (['FWZ', 'GCSZT', 'BFWG'].includes(orderStatus)) {
  276. // 服务中
  277. return 'FWZ'
  278. } else if (['YCD'].includes(orderStatus)) {
  279. // 异常单
  280. return 'YCD'
  281. } else if (['YWG', 'GCSZX', 'WDWG', 'YWGO'].includes(orderStatus)) {
  282. // 已完工待结算
  283. return 'YWG'
  284. } else if (['YJS', 'LRCD'].includes(orderStatus)) {
  285. // 已结算
  286. return 'YJS'
  287. } else if (['YQX', 'FWZT', 'YCGB', 'FWQX'].includes(orderStatus)) {
  288. // 已取消
  289. return 'YQX'
  290. }
  291. return ''
  292. },
  293. // 触发下拉刷新
  294. async refresherrefresh(e) {
  295. this.refresherTriggered = true
  296. this.refreshList()
  297. },
  298. // 滚动到底部
  299. scrolltolower(e) {
  300. if (this.loadStatus === 0) {
  301. this.pageNum++
  302. this.getList()
  303. }
  304. },
  305. // 获取统计数量
  306. getCount() {
  307. this.$api
  308. .post('/pg/order/base/status/count', {
  309. isYb: this.isYb,
  310. isWb: this.isWb
  311. })
  312. .then(res => {
  313. if (!res.data) return false
  314. const data = res.data
  315. this.mainTabs[0].num = data.all || 0
  316. this.mainTabs[1].num = data.dqd || 0
  317. this.mainTabs[2].num = data.djd || 0
  318. this.mainTabs[3].num = data.fwz || 0
  319. this.mainTabs[4].num = data.ywg || 0
  320. this.mainTabs[5].num = data.ycd || 0
  321. })
  322. },
  323. // 获取列表
  324. getList() {
  325. this.loadStatus = 1
  326. this.$api
  327. .post('/pg/order/base/list', {
  328. pageNum: this.pageNum,
  329. pageSize: 5,
  330. keyword: '',
  331. orderBaseStatus: this.curMainTab,
  332. byDay: this.curSmallTab || '',
  333. startTime: this.startDate ? this.startDate + ' 00:00:00' : '',
  334. endTime: this.endDate ? this.endDate + ' 23:59:59' : '',
  335. isYb: this.isYb,
  336. isWb: this.isWb
  337. })
  338. .then(res => {
  339. this.loadStatus = 0
  340. let list = res.data.records
  341. if (list.length < 5) {
  342. this.loadStatus = 2
  343. }
  344. this.dataList = this.pageNum === 1 ? list : this.dataList.concat(list)
  345. })
  346. .catch(() => {
  347. this.loadStatus = 2
  348. })
  349. .finally(res => {
  350. this.refresherTriggered = false
  351. })
  352. },
  353. findMainTabIndex(val) {
  354. for (var i = 0; i < this.mainTabs.length; i++) {
  355. if (this.mainTabs[i]['value'] == val) {
  356. return i
  357. }
  358. }
  359. },
  360. setScrollLeft() {
  361. // 当前活动tab的布局信息,有tab菜单的width和left(为元素左边界到父元素左边界的距离)等信息
  362. const tabRect = this.mainTabs[this.findMainTabIndex(this.curMainTab)]
  363. // 累加得到当前item到左边的距离
  364. const offsetLeft = this.mainTabs.slice(0, this.findMainTabIndex(this.curMainTab)).reduce((total, curr) => {
  365. return total + curr.rect.width
  366. }, 0)
  367. // 此处为屏幕宽度
  368. const windowWidth = uni.$u.sys().windowWidth
  369. // 将活动的tabs-item移动到屏幕正中间,实际上是对scroll-view的移动
  370. let scrollLeft =
  371. offsetLeft -
  372. (this.tabsRect.width - tabRect.rect.width) / 2 -
  373. (windowWidth - this.tabsRect.right) / 2 +
  374. this.tabsRect.left / 2
  375. // 这里做一个限制,限制scrollLeft的最大值为整个scroll-view宽度减去tabs组件的宽度
  376. scrollLeft = Math.min(scrollLeft, this.scrollViewWidth)
  377. this.scrollLeft = Math.max(0, scrollLeft)
  378. },
  379. // 获取所有标签的尺寸
  380. resize() {
  381. if (this.mainTabs.length === 0) {
  382. return
  383. }
  384. Promise.all([this.getTabsRect(), this.getAllItemRect()]).then(([tabsRect, itemRect = []]) => {
  385. this.tabsRect = tabsRect
  386. this.scrollViewWidth = 0
  387. itemRect.map((item, index) => {
  388. // 计算scroll-view的宽度,这里
  389. this.scrollViewWidth += item.width
  390. // 另外计算每一个item的中心点X轴坐标
  391. this.mainTabs[index].rect = item
  392. })
  393. // 获取了tabs的尺寸之后,设置滑块的位置
  394. this.setScrollLeft()
  395. })
  396. },
  397. // 获取导航菜单的尺寸
  398. getTabsRect() {
  399. return new Promise(resolve => {
  400. this.queryRect('tab-scroll-view').then(size => resolve(size))
  401. })
  402. },
  403. // 获取所有标签的尺寸
  404. getAllItemRect() {
  405. return new Promise(resolve => {
  406. const promiseAllArr = this.mainTabs.map((item, index) => this.queryRect(`tab-item-${index}`, true))
  407. Promise.all(promiseAllArr).then(sizes => resolve(sizes))
  408. })
  409. },
  410. // 获取各个标签的尺寸
  411. queryRect(el, item) {
  412. return new Promise(resolve => {
  413. this.$uGetRect(`.${el}`).then(size => {
  414. resolve(size)
  415. })
  416. })
  417. },
  418. // 切换大状态
  419. changeMainTab(val) {
  420. this.curMainTab = val
  421. // this.curMainTab = val.value;
  422. if (this.startDate == '' || this.endDate == '') {
  423. this.curSmallTab = 0
  424. this.curSmallTabIndex = 0
  425. } else {
  426. this.curSmallTab = ''
  427. this.curSmallTabIndex = ''
  428. }
  429. this.refreshList()
  430. this.resize()
  431. },
  432. // 切换小状态
  433. changeSmallTab(item) {
  434. this.curSmallTab = item.id
  435. this.curSmallTabIndex = item.index
  436. this.startDate = ''
  437. this.endDate = ''
  438. this.refreshList()
  439. },
  440. // 选择日期
  441. confirmDate(item) {
  442. let [start, end] = item
  443. if (start == '' || end == '') {
  444. this.curSmallTab = 0
  445. this.curSmallTabIndex = 0
  446. this.startDate = ''
  447. this.endDate = ''
  448. return
  449. }
  450. this.curSmallTab = ''
  451. this.curSmallTabIndex = ''
  452. this.startDate = start
  453. this.endDate = end
  454. this.refreshList()
  455. },
  456. // 刷新列表
  457. refreshList() {
  458. this.dataList = []
  459. this.pageNum = 1
  460. this.getList()
  461. this.getCount()
  462. },
  463. // 去搜索页面
  464. toSearchPage() {
  465. this.$navToPage({
  466. url: '/packageWorkorder/pages/search'
  467. })
  468. },
  469. // 加急
  470. actionUrgent(id, flag) {
  471. this.$modal({
  472. title: '加急操作',
  473. content: '加急操作,会消息通知所有订单相关人员,请谨慎操作。'
  474. })
  475. .then(() => {
  476. this.$api
  477. .post('/pg/order/base/flag', {
  478. orderBaseId: id,
  479. orderFlagEnum: 'JIA_JI',
  480. flag: flag
  481. })
  482. .then(res => {
  483. this.$successToast()
  484. this.refreshList()
  485. })
  486. })
  487. .catch(() => {})
  488. },
  489. // 接单
  490. actionReceive(id) {
  491. this.$modal({
  492. title: '接单确认',
  493. content: '确认接单?'
  494. })
  495. .then(() => {
  496. this.$api
  497. .post('/pg/order/base/rece', {
  498. orderBaseId: id
  499. })
  500. .then(res => {
  501. this.$successToast()
  502. this.refreshList()
  503. this.toDetail(id)
  504. })
  505. })
  506. .catch(() => {})
  507. },
  508. // 去收费
  509. toCharge(id, type) {
  510. if (type == 'M') {
  511. this.$navToPage({
  512. url: `/packageMaterial/pages/sale/index?type=${type}&oid=${id}`
  513. })
  514. } else if (type == 'P') {
  515. this.$navToPage({
  516. url: `/packageMaterial/pages/newSale/index?type=${type}&oid=${id}`
  517. })
  518. }
  519. },
  520. // 去配件申请
  521. toPartsApply(id) {
  522. this.$navToPage({
  523. url: `/packageMaterial/pages/partsApply/form?id=${id}`
  524. })
  525. },
  526. // 去过程反馈
  527. toFeedback(id) {
  528. this.$navToPage({
  529. url: `/packageWorkorder/pages/processFeedback?id=${id}`
  530. })
  531. },
  532. toDetail(id) {
  533. this.$navToPage({
  534. url: `/packageWorkorder/pages/orderDetail?id=${id}`
  535. })
  536. },
  537. qdOrder(item) {
  538. this.$modal({
  539. title: '抢单确认',
  540. content: '确认抢单?'
  541. })
  542. .then(() => {
  543. this.$api
  544. .post('/pg/order/base/qd', {
  545. orderBaseId: item.id
  546. })
  547. .then(res => {
  548. this.$successToast()
  549. this.refreshList()
  550. this.toDetail(item.id)
  551. })
  552. })
  553. .catch(() => {})
  554. }
  555. }
  556. }
  557. </script>
  558. <style lang="scss" scopeds>
  559. .all-container {
  560. width: 100%;
  561. height: 100vh;
  562. display: flex;
  563. flex-direction: column;
  564. .main-container {
  565. flex: 1;
  566. }
  567. }
  568. .top-container {
  569. display: flex;
  570. background: $theme-color;
  571. height: 100rpx;
  572. align-items: center;
  573. justify-content: space-between;
  574. padding: 0 30rpx 10rpx;
  575. position: relative;
  576. .left-nav {
  577. flex: 1;
  578. display: flex;
  579. align-items: flex-end;
  580. // overflow-x: scroll;
  581. // overflow-y: hidden;
  582. padding: 20rpx 0;
  583. .item {
  584. flex-shrink: 0;
  585. display: flex;
  586. margin-right: 32rpx;
  587. position: relative;
  588. // &:last-child {
  589. // margin-right: 0;
  590. // }
  591. .name {
  592. font-size: 30rpx;
  593. color: #ffffff;
  594. }
  595. .num {
  596. color: #ffffff;
  597. margin-top: -8rpx;
  598. margin-left: 2rpx;
  599. }
  600. &.active {
  601. &::after {
  602. content: '';
  603. width: 44rpx;
  604. height: 6rpx;
  605. background: #ffffff;
  606. border-radius: 6rpx;
  607. position: absolute;
  608. bottom: -16rpx;
  609. left: calc((100% - 44rpx) / 2);
  610. }
  611. .name {
  612. font-size: 40rpx;
  613. font-weight: bolder;
  614. position: relative;
  615. }
  616. }
  617. }
  618. }
  619. .right-search {
  620. margin-left: 30rpx;
  621. margin-top: 10rpx;
  622. .iconfont {
  623. font-size: 36rpx;
  624. color: #ffffff;
  625. }
  626. }
  627. }
  628. .status-container {
  629. display: flex;
  630. align-items: center;
  631. justify-content: space-between;
  632. padding: 20rpx;
  633. .date {
  634. height: 68rpx;
  635. display: flex;
  636. align-items: center;
  637. justify-content: center;
  638. padding: 0 24rpx;
  639. border-radius: 24rpx;
  640. border: 1px solid #eaeaea;
  641. box-sizing: border-box;
  642. .text {
  643. font-size: 28rpx;
  644. color: $reg-font;
  645. }
  646. .iconfont {
  647. font-size: 28rpx;
  648. color: $reg-font;
  649. }
  650. &.active {
  651. background: #e7efff;
  652. border: 1px solid #3d8ffd;
  653. .text {
  654. color: #3d8ffd;
  655. }
  656. .iconfont {
  657. color: #3d8ffd;
  658. }
  659. }
  660. }
  661. }
  662. .order-list-container {
  663. padding: 0 30rpx;
  664. .item {
  665. @include zj-card;
  666. background: #ffffff;
  667. border-radius: 20rpx;
  668. margin-bottom: 30rpx;
  669. padding: 0 30rpx;
  670. &:last-child {
  671. margin-bottom: 0;
  672. }
  673. .item-top {
  674. display: flex;
  675. justify-content: space-between;
  676. align-items: flex-start;
  677. border-bottom: 1px solid #d6e0f2;
  678. padding: 30rpx 0 20rpx;
  679. .left {
  680. flex: 1;
  681. width: 0;
  682. display: flex;
  683. align-items: center;
  684. flex-wrap: wrap;
  685. .title {
  686. font-size: 40rpx;
  687. font-weight: 600;
  688. color: $theme-color;
  689. margin-right: 12rpx;
  690. }
  691. .text {
  692. line-height: 48rpx;
  693. padding: 0 16rpx;
  694. background: #f4f5f9;
  695. border-radius: 8rpx;
  696. margin-right: 12rpx;
  697. text {
  698. color: $assist-color;
  699. }
  700. }
  701. .tags {
  702. display: flex;
  703. align-items: center;
  704. margin-bottom: 10rpx;
  705. .tag {
  706. margin-top: 10rpx;
  707. flex-shrink: 0;
  708. height: 36rpx;
  709. line-height: 36rpx;
  710. border-radius: 8rpx;
  711. border: 1px solid $theme-color;
  712. color: $theme-color;
  713. font-size: 24rpx;
  714. padding: 0 10rpx;
  715. box-sizing: border-box;
  716. font-weight: 500;
  717. margin-right: 10rpx;
  718. &:last-child {
  719. margin-right: 0;
  720. }
  721. &.red {
  722. border: 1px solid $minor-color;
  723. color: $minor-color;
  724. }
  725. &.red_solid {
  726. border: 1px solid $minor-color;
  727. color: #ffffff;
  728. background: $minor-color;
  729. }
  730. &.orange {
  731. border: 1px solid $assist-color;
  732. color: $assist-color;
  733. }
  734. &.green {
  735. border: 1px solid $success-color;
  736. color: $success-color;
  737. }
  738. }
  739. }
  740. }
  741. .right {
  742. float: right;
  743. flex-shrink: 0;
  744. height: 56rpx;
  745. display: flex;
  746. align-items: center;
  747. .iconfont {
  748. color: $minor-color;
  749. }
  750. .time {
  751. color: $minor-color;
  752. margin-left: 4rpx;
  753. }
  754. }
  755. .status {
  756. color: $minor-color;
  757. line-height: 56rpx;
  758. }
  759. }
  760. .item-main {
  761. .row {
  762. display: flex;
  763. align-items: center;
  764. margin-top: 20rpx;
  765. &.address-row {
  766. align-items: flex-start;
  767. .value {
  768. align-items: flex-start;
  769. }
  770. }
  771. .label {
  772. color: $sec-font;
  773. flex-shrink: 0;
  774. margin-right: 20rpx;
  775. line-height: 36rpx;
  776. font-size: 28rpx;
  777. }
  778. .value {
  779. flex: 1;
  780. display: flex;
  781. align-items: center;
  782. .val {
  783. line-height: 32rpx;
  784. font-size: 28rpx;
  785. }
  786. .num {
  787. margin-left: 4rpx;
  788. text {
  789. color: $theme-color;
  790. }
  791. }
  792. .tag {
  793. height: 36rpx;
  794. padding: 0 10rpx;
  795. border-radius: 4rpx;
  796. background: #ecf5ff;
  797. color: $theme-color;
  798. font-size: 20rpx;
  799. font-weight: 500;
  800. margin-left: 10rpx;
  801. line-height: 36rpx;
  802. box-sizing: border-box;
  803. }
  804. .fun {
  805. flex-shrink: 0;
  806. display: flex;
  807. align-items: center;
  808. padding: 0 20rpx;
  809. .iconfont {
  810. color: $theme-color;
  811. margin-right: 6rpx;
  812. }
  813. .text {
  814. font-size: 28rpx;
  815. color: $theme-color;
  816. }
  817. }
  818. }
  819. }
  820. }
  821. .item-btn {
  822. display: flex;
  823. align-items: center;
  824. justify-content: flex-end;
  825. padding: 30rpx 0;
  826. ::v-deep .u-button {
  827. width: 160rpx;
  828. margin: 0;
  829. margin-left: 20rpx;
  830. }
  831. }
  832. }
  833. }
  834. </style>