orderCard.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <view class="order-card" :class="{ 'order-card-overTime': order.isDelay }" @click.stop="handleClick(order)">
  3. <view class="order-card-header">
  4. <view class="order-card-header-left">
  5. <view class="order-card-header-left-band" style="backgroundColor: #007AFF;" v-show="order.itemBrand">
  6. {{ order.itemBrand }}
  7. </view>
  8. <view class="order-card-header-left-band" v-for="value in order.tags" :key="value.id"
  9. :style="{ backgroundColor: value.color }">
  10. {{ value.name }}
  11. </view>
  12. <!-- <view class="order-card-header-left-band" v-if="order.tags.length == 0" style="backgroundColor: #999;">
  13. 暂无标签
  14. </view> -->
  15. </view>
  16. <view class="order-card-header-right">
  17. <view class="order-card-header-right-price">
  18. ¥{{ order.priceRange ? order.priceRange : '暂无价格' }}
  19. </view>
  20. </view>
  21. </view>
  22. <view class="order-card-content">
  23. <view class="order-card-content-left">
  24. <image :src="order.image ? order.image : '/static/acceptOrder/orderCardPic.jpg'" mode="scaleToFill" />
  25. </view>
  26. <view class="order-card-content-right">
  27. <view>{{ order.item }}</view>
  28. <view>发单人:{{ order.createNickName }}</view>
  29. <view>{{ order.sendDate }}</view>
  30. </view>
  31. </view>
  32. <view class="order-card-bottom">
  33. <u-row justify="between" v-if="order.status == '1' || order.status == null">
  34. <u-col span="5.5">
  35. <view @click.stop="handleAcceptOrder(order)">
  36. <u-button type="primary" size="medium">立即接单</u-button>
  37. </view>
  38. </u-col>
  39. <u-col span="5.5">
  40. <view @click.stop="handleBusy(order)">
  41. <u-button type="primary" size="medium">在忙({{ buzyTime / 1000 }}s)</u-button>
  42. </view>
  43. </u-col>
  44. </u-row>
  45. <u-row justify="between" v-if="order.status == '2'">
  46. <u-col span="5.5">
  47. <view @click.stop="handleWillFollow(order)">
  48. <u-button type="primary" size="medium">待跟进</u-button>
  49. </view>
  50. </u-col>
  51. <u-col span="5.5">
  52. <view @click.stop="handleTag(order)">
  53. <u-button type="primary" size="medium">打标签</u-button>
  54. </view>
  55. </u-col>
  56. </u-row>
  57. <u-row justify="between" v-if="order.status == '3'">
  58. <u-col span="12">
  59. <view @click.stop="handleShare(order)">
  60. <u-button type="primary" size="medium">一键分享</u-button>
  61. </view>
  62. </u-col>
  63. </u-row>
  64. <u-row justify="between" v-if="order.status == '4'">
  65. <u-col span="12">
  66. <view @click.stop="handleShare(order)">
  67. <u-button type="primary" size="medium">待跟进</u-button>
  68. </view>
  69. </u-col>
  70. </u-row>
  71. </view>
  72. </view>
  73. </template>
  74. <script>
  75. // order.status 1未接,2已接单,3完成一键分享,4未接待跟进
  76. export default {
  77. props: {
  78. order: {
  79. type: Object,
  80. default: () => ({})
  81. }
  82. },
  83. data() {
  84. return {
  85. buzyTime: 300000,
  86. // buzyTime: 5000,
  87. busyTimer: null,
  88. }
  89. },
  90. computed: {
  91. statue() {
  92. switch (this.order.status) {
  93. case 'pending':
  94. return '待接单';
  95. case 'received':
  96. return '已接单';
  97. case 'rejected':
  98. return '已拒绝';
  99. }
  100. }
  101. },
  102. watch: {
  103. buzyTime: {
  104. handler(newVal) {
  105. // console.log('newVal', newVal);
  106. if (newVal == 0) {
  107. // 移动到最后
  108. this.handleBusy(this.order)
  109. }
  110. },
  111. deep: true
  112. }
  113. },
  114. mounted() {
  115. this.openTimer()
  116. console.log('order', this.order);
  117. },
  118. beforeDestroy() {
  119. this.closeTimer()
  120. },
  121. methods: {
  122. handleAcceptOrder(order) {
  123. console.log('立即接单', order);
  124. this.$emit('handleCardClick', order);
  125. },
  126. handleWillFollow(order) {
  127. console.log('待跟进', order);
  128. },
  129. handleBusy(order) {
  130. this.closeTimer()
  131. console.log('在忙', order);
  132. this.$emit('handleBuzyBtnClick', {
  133. ...order,
  134. });
  135. },
  136. handleTag(order) {
  137. console.log('打标签', order);
  138. },
  139. handleShare(order) {
  140. console.log('一键分享', order);
  141. },
  142. handleClick(order) {
  143. console.log('点击了订单', order);
  144. this.$emit('handleCardClick', order);
  145. },
  146. openTimer() {
  147. // 组件挂载时启动定时器
  148. console.log('组件挂载时启动定时器');
  149. this.busyTimer = setInterval(() => {
  150. this.buzyTime -= 1000;
  151. }, 1000);
  152. },
  153. closeTimer() {
  154. // 组件卸载时清理定时器,防止内存泄漏
  155. if (this.busyTimer) {
  156. clearInterval(this.busyTimer);
  157. this.busyTimer = null;
  158. }
  159. }
  160. }
  161. }
  162. </script>
  163. <style scoped>
  164. /* 样式部分无修改,保持原样 */
  165. .order-card {
  166. box-sizing: border-box;
  167. margin: 20rpx;
  168. padding: 16rpx;
  169. border-radius: 20rpx;
  170. background-color: #fff;
  171. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
  172. border: 1px solid #000;
  173. border-color: rgb(254 226 226 / var(--tw-border-opacity, 1));
  174. }
  175. .order-card-overTime {
  176. background-color: rgba(254, 242, 242, 1);
  177. }
  178. .order-card-header {
  179. display: flex;
  180. justify-content: space-between;
  181. align-items: center;
  182. }
  183. .order-card-header-left {
  184. display: flex;
  185. }
  186. .order-card-header-left>view {
  187. height: 30rpx;
  188. line-height: 30rpx;
  189. padding: 0 12rpx;
  190. border-radius: 10rpx;
  191. font-size: 20rpx;
  192. font-weight: 700;
  193. padding: 5rpx 12rpx;
  194. margin-right: 10rpx;
  195. }
  196. .order-card-header-left-band {
  197. --tw-text-opacity: 1;
  198. --tw-border-opacity: 1;
  199. --tw-bg-opacity: 1;
  200. color: #fff;
  201. background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));
  202. border: 1px solid #000;
  203. border-color: rgb(219 234 254 / var(--tw-border-opacity, 1));
  204. }
  205. .order-card-header-left-status {
  206. --tw-text-opacity: 1;
  207. --tw-bg-opacity: 1;
  208. color: rgb(255 107 107 / var(--tw-text-opacity, 1));
  209. background-color: rgb(255 241 241 / var(--tw-bg-opacity, 1));
  210. border: 1px solid #000;
  211. border-color: rgb(219 234 254 / var(--tw-border-opacity, 1));
  212. }
  213. .order-card-header-left-timeout {
  214. --tw-text-opacity: 1;
  215. --tw-bg-opacity: 1;
  216. color: rgb(255 107 107 / var(--tw-text-opacity, 1));
  217. background-color: rgb(255 241 241 / var(--tw-bg-opacity, 1));
  218. border: 1px solid #000;
  219. border-color: rgb(219 234 254 / var(--tw-border-opacity, 1));
  220. }
  221. .order-card-header-left-phone {
  222. --tw-text-opacity: 1;
  223. --tw-bg-opacity: 1;
  224. color: rgb(255 107 107 / var(--tw-text-opacity, 1));
  225. background-color: rgb(255 241 241 / var(--tw-bg-opacity, 1));
  226. border: 1px solid #000;
  227. border-color: rgb(219 234 254 / var(--tw-border-opacity, 1));
  228. }
  229. .order-card-header-right-price {
  230. font-weight: 800;
  231. font-size: 1.5rem;
  232. }
  233. .order-card-content {
  234. display: flex;
  235. align-items: center;
  236. margin-top: 20rpx;
  237. }
  238. .order-card-content image {
  239. width: 150rpx;
  240. height: 150rpx;
  241. margin-right: 20rpx;
  242. border-radius: 20rpx;
  243. }
  244. .order-card-content .order-card-content-right {
  245. flex: 1;
  246. font-size: 24rpx;
  247. display: flex;
  248. flex-direction: column;
  249. gap: 10rpx;
  250. font-size: 24rpx;
  251. font-weight: 700;
  252. }
  253. .order-card-content .order-card-content-right>view:nth-child(1) {
  254. font-size: 35rpx;
  255. margin-bottom: 10rpx;
  256. }
  257. .order-card-bottom {
  258. margin-top: 20rpx;
  259. }
  260. .order-card-bottom .u-button {
  261. height: 70rpx;
  262. border-radius: 20rpx;
  263. font-size: 24rpx;
  264. font-weight: 700;
  265. }
  266. </style>