orderList.vue 23 KB

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