orderList.vue 26 KB

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