orderCard.vue 8.8 KB

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