task-card.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <script setup lang="ts">
  2. import { storeToRefs } from 'pinia'
  3. import { taskReceive } from '../../../core/libs/requests'
  4. import { useUserStore } from '../../../store'
  5. import Card from '@designer-hub/app/src/components/card.vue'
  6. import dayjs from 'dayjs'
  7. import { useTask } from '../../../composables/task'
  8. import { AgentTask } from '@designer-hub/app/src/core/libs/models'
  9. const props = withDefaults(defineProps<{ options: any }>(), { options: () => ({}) })
  10. const userStore = useUserStore()
  11. const { userInfo } = storeToRefs(userStore)
  12. const { types } = useTask()
  13. const status = ref<{ [key: number]: { title: string; bg: string; bgClass: string } }>({
  14. 1: {
  15. title: '未开始',
  16. bg: 'bg-[#f04c47]',
  17. bgClass: 'bg-[#f04c47]',
  18. },
  19. 2: { title: '进行中', bg: '', bgClass: 'bg-[#2357e9]' },
  20. 3: { title: '已撤回', bg: '', bgClass: 'bg-[#f04c47]' },
  21. 4: { title: '已完成', bg: '', bgClass: 'bg-[#f04c47]' },
  22. 5: { title: '未完成', bg: '', bgClass: 'bg-[#abacaf]' },
  23. 6: { title: '待确认', bg: '', bgClass: 'bg-[#f04c47]' },
  24. })
  25. const acceptingOrders = async (item: AgentTask) => {
  26. uni.showLoading()
  27. const res = await taskReceive({ brokerId: userInfo.value.userId, taskId: item.id, orders: true })
  28. uni.hideLoading()
  29. // initData()
  30. }
  31. const acceptingNoOrders = async (item: AgentTask) => {
  32. uni.showLoading()
  33. const res = await taskReceive({ brokerId: userInfo.value.userId, taskId: item.id, orders: false })
  34. uni.hideLoading()
  35. // initData()
  36. }
  37. const toDetail = () =>
  38. uni.navigateTo({ url: `/pages/agent/tasks/detail/index?taskId=${props.options.id}` })
  39. </script>
  40. <template>
  41. <Card
  42. :custom-class="`p-0 bg-gradient-to-r`"
  43. style="padding: 0"
  44. :custom-style="types[options.taskType as 1 | 2 | 3].bgStyle"
  45. @click="toDetail"
  46. >
  47. <div class="flex p-4 items-center">
  48. <div
  49. :class="`${status[options.status]?.bgClass} w-[47px] h-[23px] px-1 rounded border justify-center items-center gap-2.5 inline-flex`"
  50. >
  51. <div class="text-right text-white text-xs font-normal font-['PingFang_SC'] leading-tight">
  52. {{ status[options.status as 1 | 2 | 3].title }}
  53. </div>
  54. </div>
  55. <div class="mx-2.5 text-black/90 text-lg font-normal font-['PingFang_SC'] leading-none">
  56. {{ types[options.taskType].title }}
  57. </div>
  58. <div class="flex-1"></div>
  59. <div class="mx-1.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
  60. 奖励积分
  61. </div>
  62. <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
  63. {{ options.pointsReward }}
  64. </div>
  65. </div>
  66. <div class="flex flex-col gap-4 bg-white p-5 rounded-2xl">
  67. <div>
  68. <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
  69. 任务名称:
  70. </span>
  71. <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
  72. {{ options.name }}
  73. </span>
  74. </div>
  75. <div>
  76. <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
  77. 发起方:
  78. </span>
  79. <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
  80. {{ options.bearerName }}
  81. </span>
  82. </div>
  83. <div>
  84. <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
  85. 任务时间:
  86. </span>
  87. <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
  88. {{ dayjs(options.startTime).format('YYYY/MM/DD') }}-{{
  89. dayjs(options.endTime).format('YYYY/MM/DD')
  90. }}
  91. </span>
  92. </div>
  93. <div class="flex items-center border-t border-t-solid border-t-[#efefef] pt-1.5">
  94. <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
  95. 目标 {{ options.storeQuantity }}
  96. </div>
  97. <template v-if="!options.receive">
  98. <div class="flex-1"></div>
  99. <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
  100. 个人完成
  101. <span style="color: #2357e9">{{ options.personalCompletedNum }}</span>
  102. </div>
  103. <div class="flex-1"></div>
  104. <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
  105. 累计完成
  106. <span style="color: #f1981b">{{ options.completedNum }}</span>
  107. </div>
  108. </template>
  109. <template v-else>
  110. <div class="flex-1"></div>
  111. <div
  112. v-if="options.receive"
  113. class="mr-[16px] w-[68px] h-7 px-2.5 py-[3px] rounded-[30px] border border-[#fe5053] justify-center items-center gap-2.5 inline-flex"
  114. style="border: 1px solid #fe5053"
  115. @click.stop="acceptingNoOrders(options)"
  116. >
  117. <div class="w-9 text-[#ff2d2d] text-xs font-normal font-['PingFang_SC']">不接单</div>
  118. </div>
  119. <div
  120. v-if="options.receive"
  121. @click.stop="acceptingOrders(options)"
  122. class="w-[68px] h-7 px-2.5 py-[3px] bg-[#2357e9] rounded-[30px] justify-center items-center gap-2.5 inline-flex"
  123. >
  124. <div class="text-white text-xs font-normal font-['PingFang_SC']">接单</div>
  125. </div>
  126. </template>
  127. </div>
  128. </div>
  129. </Card>
  130. </template>