orderList.vue 26 KB

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