RewardRuleCouponSelect.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <el-button class="ml-10px" type="text" @click="selectCoupon">添加优惠卷</el-button>
  3. <div
  4. v-for="(item, index) in list"
  5. :key="item.id"
  6. class="coupon-list-item p-x-10px mb-10px flex justify-between"
  7. >
  8. <div class="coupon-list-item-left flex items-center flex-wrap">
  9. <div class="mr-10px"> 优惠券名称:{{ item.name }}</div>
  10. <div class="mr-10px">
  11. 范围:
  12. <dict-tag :type="DICT_TYPE.PROMOTION_PRODUCT_SCOPE" :value="item.productScope" />
  13. </div>
  14. <div class="flex items-center">
  15. 优惠:
  16. <dict-tag :type="DICT_TYPE.PROMOTION_DISCOUNT_TYPE" :value="item.discountType" />
  17. {{ discountFormat(item) }}
  18. </div>
  19. </div>
  20. <div class="coupon-list-item-right">
  21. <el-input v-model="item.giveCount" class="w-150px! p-x-20px!" placeholder="" type="number" />
  22. <el-button class="ml-20px" link type="danger" @click="deleteCoupon(index)">删除</el-button>
  23. </div>
  24. </div>
  25. <!-- 优惠券选择 -->
  26. <CouponSelect
  27. ref="couponSelectRef"
  28. :take-type="CouponTemplateTakeTypeEnum.ADMIN.type"
  29. @change="handleCouponChange"
  30. />
  31. </template>
  32. <script lang="ts" setup>
  33. import { CouponSelect } from '@/views/mall/promotion/coupon/components'
  34. import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
  35. import { RewardRule } from '@/api/mall/promotion/reward/rewardActivity'
  36. import { DICT_TYPE } from '@/utils/dict'
  37. import { CouponTemplateTakeTypeEnum } from '@/utils/constants'
  38. import { discountFormat } from '@/views/mall/promotion/coupon/formatter'
  39. import { isEmpty } from '@/utils/is'
  40. import { useVModel } from '@vueuse/core'
  41. defineOptions({ name: 'RewardRuleCouponSelect' })
  42. const props = defineProps<{
  43. modelValue: RewardRule
  44. }>()
  45. const emits = defineEmits<{
  46. (e: 'update:modelValue', v: any): void
  47. }>()
  48. const rewardRule = useVModel(props, 'modelValue', emits) // 赠送规则
  49. const list = ref<GiveCouponVO[]>([]) // 选择的优惠券列表
  50. /** 选择赠送的优惠卷类型拓展 */
  51. interface GiveCouponVO extends CouponTemplateApi.CouponTemplateVO {
  52. giveCount?: number
  53. }
  54. /** 选择优惠券 */
  55. const couponSelectRef = ref<InstanceType<typeof CouponSelect>>() // 优惠券选择
  56. const selectCoupon = () => {
  57. couponSelectRef.value?.open()
  58. }
  59. /** 选择优惠券后的回调 */
  60. const handleCouponChange = (val: CouponTemplateApi.CouponTemplateVO[]) => {
  61. for (const item of val) {
  62. if (list.value.some((v) => v.id === item.id)) {
  63. continue
  64. }
  65. list.value.push(item)
  66. }
  67. }
  68. /** 删除优惠券 */
  69. const deleteCoupon = (index: number) => {
  70. list.value.splice(index, 1)
  71. }
  72. /** 初始化赠送的优惠券列表 */
  73. const initGiveCouponList = async () => {
  74. // 校验优惠券存在
  75. if (isEmpty(rewardRule.value) || isEmpty(rewardRule.value.giveCouponTemplateCounts)) {
  76. return
  77. }
  78. const tempLateIds = Object.keys(rewardRule.value.giveCouponTemplateCounts!).map((item) =>
  79. parseInt(item)
  80. )
  81. const data = await CouponTemplateApi.getCouponTemplateList(tempLateIds)
  82. if (!data) {
  83. return
  84. }
  85. // 回显
  86. data.forEach((coupon) => {
  87. list.value.push({
  88. ...coupon,
  89. giveCount: rewardRule.value.giveCouponTemplateCounts![coupon.id]
  90. })
  91. })
  92. }
  93. /** 设置赠送的优惠券 */
  94. const setGiveCouponList = () => {
  95. if (isEmpty(rewardRule.value) || isEmpty(list.value)) {
  96. return
  97. }
  98. // 设置优惠券和其数量的对应
  99. list.value.forEach((rule) => {
  100. if (!rewardRule.value.giveCouponTemplateCounts) {
  101. rewardRule.value.giveCouponTemplateCounts = {}
  102. }
  103. rewardRule.value.giveCouponTemplateCounts[rule.id] = rule.giveCount!
  104. })
  105. }
  106. defineExpose({ setGiveCouponList })
  107. /** 组件初始化 */
  108. onMounted(async () => {
  109. await nextTick()
  110. await initGiveCouponList()
  111. })
  112. </script>
  113. <style lang="scss" scoped>
  114. .coupon-list-item {
  115. border: 1px dashed var(--el-border-color-darker);
  116. border-radius: 8px;
  117. }
  118. </style>