mirror of
				https://gitee.com/hhyykk/ipms-sjy-ui.git
				synced 2025-11-04 12:18:43 +08:00 
			
		
		
		
	【代码优化】】商城: 完善代码评审提到的问题
This commit is contained in:
		@@ -32,7 +32,6 @@
 | 
			
		||||
          格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b> 的文件
 | 
			
		||||
        </div>
 | 
			
		||||
      </template>
 | 
			
		||||
      <!-- TODO @puhui999:1)表单展示的时候,位置会偏掉,已发微信-->
 | 
			
		||||
      <template #file="row">
 | 
			
		||||
        <div class="flex items-center">
 | 
			
		||||
          <span>{{ row.file.name }}</span>
 | 
			
		||||
 
 | 
			
		||||
@@ -74,6 +74,8 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 | 
			
		||||
import * as RewardActivityApi from '@/api/mall/promotion/reward/rewardActivity'
 | 
			
		||||
import { PromotionConditionTypeEnum, PromotionProductScopeEnum } from '@/utils/constants'
 | 
			
		||||
import ProductCategorySelect from '@/views/mall/product/category/components/ProductCategorySelect.vue'
 | 
			
		||||
import { cloneDeep } from 'lodash-es'
 | 
			
		||||
import { fenToYuan, yuanToFen } from '@/utils'
 | 
			
		||||
 | 
			
		||||
defineOptions({ name: 'ProductBrandForm' })
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +113,12 @@ const open = async (type: string, id?: number) => {
 | 
			
		||||
    formLoading.value = true
 | 
			
		||||
    try {
 | 
			
		||||
      const data = await RewardActivityApi.getReward(id)
 | 
			
		||||
      // 转区段时间
 | 
			
		||||
      data.startAndEndTime = [data.startTime, data.endTime]
 | 
			
		||||
      // 规则分转元
 | 
			
		||||
      data.rules.forEach((item: any) => {
 | 
			
		||||
        item.discountPrice = fenToYuan(item.discountPrice || 0)
 | 
			
		||||
      })
 | 
			
		||||
      formData.value = data
 | 
			
		||||
      // 获得商品范围
 | 
			
		||||
      await getProductScope()
 | 
			
		||||
@@ -126,7 +133,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 | 
			
		||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 | 
			
		||||
const submitForm = async () => {
 | 
			
		||||
  // 校验表单
 | 
			
		||||
  if (!formRef) return
 | 
			
		||||
  if (!formRef.value) return
 | 
			
		||||
  const valid = await formRef.value.validate()
 | 
			
		||||
  if (!valid) return
 | 
			
		||||
 | 
			
		||||
@@ -135,7 +142,14 @@ const submitForm = async () => {
 | 
			
		||||
  try {
 | 
			
		||||
    // 设置活动规则优惠券
 | 
			
		||||
    rewardRuleRef.value?.setRuleCoupon()
 | 
			
		||||
    const data = formData.value
 | 
			
		||||
    const data = cloneDeep(formData.value)
 | 
			
		||||
    // 时间段转换
 | 
			
		||||
    data.startTime = data.startAndEndTime![0]
 | 
			
		||||
    data.endTime = data.startAndEndTime![1]
 | 
			
		||||
    // 规则元转分
 | 
			
		||||
    data.rules.forEach((item) => {
 | 
			
		||||
      item.discountPrice = yuanToFen(item.discountPrice || 0)
 | 
			
		||||
    })
 | 
			
		||||
    // 设置商品范围
 | 
			
		||||
    setProductScopeValues(data)
 | 
			
		||||
    if (formType.value === 'create') {
 | 
			
		||||
@@ -170,16 +184,14 @@ const getProductScope = async () => {
 | 
			
		||||
      formData.value.productSpuIds = formData.value.productScopeValues
 | 
			
		||||
      break
 | 
			
		||||
    case PromotionProductScopeEnum.CATEGORY.scope:
 | 
			
		||||
      // TODO @puhui999:可以直接 await nextTick() 呀。
 | 
			
		||||
      await nextTick(() => {
 | 
			
		||||
        let productCategoryIds = formData.value.productScopeValues as any
 | 
			
		||||
        if (Array.isArray(productCategoryIds) && productCategoryIds.length > 0) {
 | 
			
		||||
          // 单选时使用数组不能反显
 | 
			
		||||
          productCategoryIds = productCategoryIds[0]
 | 
			
		||||
        }
 | 
			
		||||
        // 设置品类编号
 | 
			
		||||
        formData.value.productCategoryIds = productCategoryIds
 | 
			
		||||
      })
 | 
			
		||||
      await nextTick()
 | 
			
		||||
      let productCategoryIds = formData.value.productScopeValues as any
 | 
			
		||||
      if (Array.isArray(productCategoryIds) && productCategoryIds.length > 0) {
 | 
			
		||||
        // 单选时使用数组不能反显
 | 
			
		||||
        productCategoryIds = productCategoryIds[0]
 | 
			
		||||
      }
 | 
			
		||||
      // 设置品类编号
 | 
			
		||||
      formData.value.productCategoryIds = productCategoryIds
 | 
			
		||||
      break
 | 
			
		||||
    default:
 | 
			
		||||
      break
 | 
			
		||||
 
 | 
			
		||||
@@ -25,12 +25,13 @@
 | 
			
		||||
              订单金额优惠
 | 
			
		||||
              <el-form-item>
 | 
			
		||||
                减
 | 
			
		||||
                <!-- TODO @puhui999:需要考虑 100 换算哈 -->
 | 
			
		||||
                <el-input
 | 
			
		||||
                <el-input-number
 | 
			
		||||
                  v-model="rule.discountPrice"
 | 
			
		||||
                  :min="0"
 | 
			
		||||
                  :precision="2"
 | 
			
		||||
                  :step="0.1"
 | 
			
		||||
                  class="w-150px! p-x-20px!"
 | 
			
		||||
                  placeholder=""
 | 
			
		||||
                  type="number"
 | 
			
		||||
                  controls-position="right"
 | 
			
		||||
                />
 | 
			
		||||
                元
 | 
			
		||||
              </el-form-item>
 | 
			
		||||
@@ -71,9 +72,9 @@
 | 
			
		||||
                inactive-text="否"
 | 
			
		||||
                inline-prompt
 | 
			
		||||
              />
 | 
			
		||||
              <RewardRuleCouponShowcase
 | 
			
		||||
              <RewardRuleCouponSelect
 | 
			
		||||
                v-if="rule.giveCoupon"
 | 
			
		||||
                ref="rewardRuleCouponShowcaseRef"
 | 
			
		||||
                ref="rewardRuleCouponSelectRef"
 | 
			
		||||
                v-model="rule!"
 | 
			
		||||
              />
 | 
			
		||||
            </el-col>
 | 
			
		||||
@@ -88,12 +89,14 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import RewardRuleCouponShowcase from './RewardRuleCouponShowcase.vue'
 | 
			
		||||
import RewardRuleCouponSelect from './RewardRuleCouponSelect.vue'
 | 
			
		||||
import { RewardActivityVO } from '@/api/mall/promotion/reward/rewardActivity'
 | 
			
		||||
import { PromotionConditionTypeEnum } from '@/utils/constants'
 | 
			
		||||
import { useVModel } from '@vueuse/core'
 | 
			
		||||
import { isEmpty } from '@/utils/is'
 | 
			
		||||
 | 
			
		||||
defineOptions({ name: 'RewardRule' })
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  modelValue: RewardActivityVO
 | 
			
		||||
}>()
 | 
			
		||||
@@ -104,7 +107,7 @@ const emits = defineEmits<{
 | 
			
		||||
}>()
 | 
			
		||||
 | 
			
		||||
const formData = useVModel(props, 'modelValue', emits) // 活动数据
 | 
			
		||||
const rewardRuleCouponShowcaseRef = ref<InstanceType<typeof RewardRuleCouponShowcase>[]>() // 活动规则优惠券 Ref
 | 
			
		||||
const rewardRuleCouponSelectRef = ref<InstanceType<typeof RewardRuleCouponSelect>[]>() // 活动规则优惠券 Ref
 | 
			
		||||
 | 
			
		||||
/** 删除优惠规则 */
 | 
			
		||||
const deleteRule = (ruleIndex: number) => {
 | 
			
		||||
@@ -127,14 +130,20 @@ const addRule = () => {
 | 
			
		||||
 | 
			
		||||
/** 设置规则优惠券-提交时 */
 | 
			
		||||
const setRuleCoupon = () => {
 | 
			
		||||
  if (isEmpty(rewardRuleCouponShowcaseRef.value)) {
 | 
			
		||||
  if (isEmpty(rewardRuleCouponSelectRef.value)) {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  rewardRuleCouponShowcaseRef.value?.forEach((item) => item.setGiveCouponList())
 | 
			
		||||
  // 情况一:不赠送优惠券
 | 
			
		||||
  formData.value.rules.forEach((rule) => {
 | 
			
		||||
    if (!rule.giveCoupon) {
 | 
			
		||||
      rule.couponIds = []
 | 
			
		||||
      rule.couponCounts = []
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  // 情况二:赠送优惠券
 | 
			
		||||
  rewardRuleCouponSelectRef.value?.forEach((item) => item.setGiveCouponList())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
defineExpose({ setRuleCoupon })
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped></style>
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ import { isEmpty } from '@/utils/is'
 | 
			
		||||
import { useVModel } from '@vueuse/core'
 | 
			
		||||
import { findIndex } from '@/utils'
 | 
			
		||||
 | 
			
		||||
// TODO @puhui999:要不就叫 RewardRuleCouponSelect
 | 
			
		||||
defineOptions({ name: 'RewardRuleCouponSelect' })
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  modelValue: RewardRule
 | 
			
		||||
@@ -89,15 +89,13 @@ const initGiveCouponList = async () => {
 | 
			
		||||
  if (!data) {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (let i = 0; i < data.length; i++) {
 | 
			
		||||
    const coupon = data[i]
 | 
			
		||||
    const index = findIndex(rewardRule.value.couponIds!, (item) => item.id === coupon.id)
 | 
			
		||||
  data.forEach((coupon) => {
 | 
			
		||||
    const index = findIndex(rewardRule.value.couponIds!, (couponId) => couponId === coupon.id)
 | 
			
		||||
    list.value.push({
 | 
			
		||||
      ...coupon,
 | 
			
		||||
      giveCount: rewardRule.value.couponCounts![index]
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 设置赠送的优惠券 */
 | 
			
		||||
@@ -106,15 +104,8 @@ const setGiveCouponList = () => {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const couponIds: number[] = []
 | 
			
		||||
  const couponCounts: number[] = []
 | 
			
		||||
  for (let i = 0, len = list.value.length; i < len; i++) {
 | 
			
		||||
    couponIds.push(list.value[i].id)
 | 
			
		||||
    couponCounts.push(list.value[i].giveCount!)
 | 
			
		||||
  }
 | 
			
		||||
  // TODO @puhui999:可以考虑,直接使用 list 的 map 操作,简单一些。性能没啥差别的
 | 
			
		||||
  rewardRule.value.couponIds = couponIds
 | 
			
		||||
  rewardRule.value.couponCounts = couponCounts
 | 
			
		||||
  rewardRule.value.couponIds = list.value.map((rule) => rule.id)
 | 
			
		||||
  rewardRule.value.couponCounts = list.value.map((rule) => rule.giveCount || 0)
 | 
			
		||||
}
 | 
			
		||||
defineExpose({ setGiveCouponList })
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user