You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
6.6 KiB

10 months ago
  1. <template>
  2. <view class="orderManagement">
  3. <mNavbar title="订单管理" :leftClick="leftClick"></mNavbar>
  4. <van-tabs v-model:active="active" color="#EF8C94" @change="clickTabs"
  5. style="position: sticky;top: 90rpx;z-index: 99;">
  6. <van-tab :title="item.name" v-for="(item, index) in tabs" :key="index"
  7. @click="getOrderList(index)"></van-tab>
  8. </van-tabs>
  9. <view v-if="orderList.length > 0" class="list">
  10. <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
  11. <view class="item" v-for="(item, index) in orderList" @click="toOrderDetail(item.id)">
  12. <view class="top">
  13. <view class="service">
  14. <text>{{item.projectId_dictText}}</text>
  15. <uni-icons type="right" size="15"></uni-icons>
  16. <text>{{item.type_dictText}}</text>
  17. </view>
  18. <view class="status">
  19. <text> {{item.state_dictText}}</text>
  20. </view>
  21. </view>
  22. <view class="content">
  23. <view class="left">
  24. <image mode="aspectFill" :src="item.image"></image>
  25. </view>
  26. <view class="right">
  27. <view class="text-hidden-1">
  28. 客户姓名{{item.name}}
  29. </view>
  30. <view class="text-hidden-1">
  31. 下单时间{{item.createTime}}
  32. </view>
  33. <view class="text-hidden-1">
  34. 下单地址{{item.addressId_dictText}}
  35. </view>
  36. <view class="text-hidden-1">
  37. 总计时间{{item.useTime}}分钟
  38. </view>
  39. </view>
  40. </view>
  41. <view class="order-price">
  42. <view v-if="true" class="tag">
  43. {{item.technicianId_dictText}}
  44. </view>
  45. <view v-else class="anticipate">
  46. <image src="/static/order/time.png" mode="aspectFill"></image>
  47. <text>预计30min内到达</text>
  48. </view>
  49. <view class="price">
  50. 总价格<text class="num">{{item.money}}</text>
  51. </view>
  52. </view>
  53. <view class="bottom">
  54. <view @click.stop="calcelOrder(item.id,cancelSuccess)" class="b1" v-if="item.state == 0">
  55. 取消订单
  56. </view>
  57. <view @click.stop="toPayOrder(item)" class="b2" v-if="item.state == 0">
  58. 立即付款
  59. </view>
  60. <!-- <view @click.stop="toPayOrder(item)" class="b2" v-if="item.state == 2">
  61. 立即确认
  62. </view> -->
  63. <view class="b1" @click.stop="moreOrder(item.projectId,toPlaceorder)" v-if="item.state == 3">
  64. 再来一单
  65. </view>
  66. <view class="b2" @click.stop="toEvaluate(item.id,item.projectId)" v-if="item.state == 3">
  67. 立即评价
  68. </view>
  69. <view class="b2" @click.stop="moreOrder(item.projectId,toPlaceorder)" v-if="item.state == 4">
  70. 再来一单
  71. </view>
  72. </view>
  73. </view>
  74. </van-list>
  75. </view>
  76. <van-empty v-else image="/static/empty/order.png" image-size="400rpx" description="暂无订单" />
  77. </view>
  78. </template>
  79. <script>
  80. import mNavbar from '@/components/base/m-navbar.vue'
  81. import order from '@/mixins/order.js'
  82. export default {
  83. components: {
  84. mNavbar
  85. },
  86. mixins: [order],
  87. data(){
  88. return {
  89. active : 0,
  90. tabs: [
  91. {
  92. name: '待付款'
  93. },
  94. {
  95. name: '已付款'
  96. },
  97. {
  98. name: '已确认'
  99. },
  100. {
  101. name: '已完成'
  102. },
  103. {
  104. name: '已取消'
  105. }
  106. ],
  107. queryParams: {
  108. state: 0,
  109. pageNo: 1,
  110. pageSize: 10
  111. },
  112. orderList : [],
  113. finished : false,
  114. }
  115. },
  116. onShow(){
  117. this.getOrderList(0)
  118. },
  119. methods : {
  120. //返回个人中心
  121. leftClick() {
  122. uni.switchTab({
  123. url: '/pages/index/center'
  124. })
  125. },
  126. //点击tab栏
  127. clickTabs(index) {
  128. this.queryParams.state = index;
  129. this.getOrderList()
  130. },
  131. //获取订单列表
  132. getOrderList() {
  133. this.$api('getOrderList', this.queryParams, res => {
  134. if (res.code == 200) {
  135. this.orderList = res.result.records;
  136. if (this.queryParams.pageSize > res.result.total) {
  137. this.finished = true
  138. }
  139. this.loading = false
  140. }else{
  141. this.finished = true
  142. }
  143. //用户不存在,删除token和用户信息并且需要用户重新登录
  144. if (res.code == 500 && res.message === '操作失败,用户不存在!') {
  145. localStorage.removeItem('token')
  146. localStorage.removeItem('userInfo')
  147. uni.navigateTo({
  148. url: '/pages/login/login'
  149. })
  150. }
  151. })
  152. },
  153. //跳转订单详情页面
  154. toOrderDetail(id) {
  155. uni.navigateTo({
  156. url: '/pages/order/orderDetail?id=' + id
  157. })
  158. },
  159. //list列表滑动到底部自动新增数据列表
  160. onLoad() {
  161. this.queryParams.pageSize += 10;
  162. this.getOrderList()
  163. },
  164. //取消成功
  165. cancelSuccess() {
  166. uni.showToast({
  167. title: '取消成功',
  168. icon: 'none'
  169. })
  170. this.getOrderList()
  171. },
  172. }
  173. }
  174. </script>
  175. <style lang="scss" scoped>
  176. .orderManagement{
  177. .list {
  178. .item {
  179. width: calc(100% - 40rpx);
  180. background-color: #fff;
  181. margin: 20rpx;
  182. box-sizing: border-box;
  183. border-radius: 16rpx;
  184. padding: 30rpx;
  185. .top {
  186. display: flex;
  187. justify-content: space-between;
  188. align-items: center;
  189. font-size: 30rpx;
  190. .service {}
  191. .status {
  192. color: #333;
  193. font-size: 26rpx;
  194. font-weight: 600;
  195. }
  196. }
  197. .content {
  198. display: flex;
  199. margin: 10rpx 0;
  200. .left {
  201. width: 150rpx;
  202. height: 150rpx;
  203. border-radius: 10rpx;
  204. image {
  205. width: 150rpx;
  206. height: 150rpx;
  207. }
  208. }
  209. .right {
  210. width: calc(100% - 160rpx);
  211. color: #777;
  212. font-size: 24rpx;
  213. padding-left: 20rpx;
  214. line-height: 40rpx;
  215. }
  216. }
  217. .order-price {
  218. display: flex;
  219. justify-content: space-between;
  220. margin: 20rpx 0rpx;
  221. .tag {
  222. width: 150rpx;
  223. color: #EF8C94;
  224. font-size: 24rpx;
  225. text-align: center;
  226. background-color: #FAE9EA;
  227. border: 1px solid #EF8C94;
  228. border-radius: 8rpx;
  229. padding: 2rpx 0;
  230. }
  231. .anticipate {
  232. display: flex;
  233. align-items: center;
  234. font-size: 24rpx;
  235. color: #666666;
  236. image {
  237. width: 25rpx;
  238. height: 25rpx;
  239. margin-right: 5rpx;
  240. }
  241. }
  242. .price {
  243. font-weight: 900;
  244. text-align: right;
  245. text {
  246. color: #ff780099;
  247. font-size: 30rpx;
  248. }
  249. }
  250. }
  251. .bottom {
  252. display: flex;
  253. justify-content: flex-end;
  254. font-size: 25rpx;
  255. .b1 {
  256. border: 1px solid #777;
  257. color: #777;
  258. box-sizing: border-box;
  259. }
  260. .b2 {
  261. background: #EF8C94;
  262. color: #fff;
  263. }
  264. view {
  265. margin: 12rpx;
  266. border-radius: 28rpx;
  267. padding: 8rpx 28rpx;
  268. margin-bottom: 0;
  269. }
  270. }
  271. }
  272. }
  273. }
  274. </style>