diff --git a/apps/web-antd/src/views/mall/product/comment/data.ts b/apps/web-antd/src/views/mall/product/comment/data.ts index 22349188448c012a37c33f601838b3ea04986f9d..b7e246d472981d48acdd39184153377bf8054a1c 100644 --- a/apps/web-antd/src/views/mall/product/comment/data.ts +++ b/apps/web-antd/src/views/mall/product/comment/data.ts @@ -25,7 +25,6 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: 'required', }, - // TODO @puhui999:商品的选择:上面 spuId 可以选择了,下面的 skuId 打开后,没商品。 { fieldName: 'skuId', label: '商品规格', diff --git a/apps/web-antd/src/views/mall/product/comment/modules/form.vue b/apps/web-antd/src/views/mall/product/comment/modules/form.vue index 3709d2bfc8e1f4b53043da11f65ebdc6cd18b3fe..f2d3d14e0c7721c88cbbc695b8f1acd3c30a87e3 100644 --- a/apps/web-antd/src/views/mall/product/comment/modules/form.vue +++ b/apps/web-antd/src/views/mall/product/comment/modules/form.vue @@ -101,23 +101,13 @@ const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { // 重置表单数据 - // TODO @puhui999:105 到 108 的代码,不需要的呀?(可以测试下) - formData.value = { - descriptionScores: 5, - benefitScores: 5, - } as Partial; selectedSku.value = undefined; return; } // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { - // TODO @puhui999:115 到 121 的代码,不需要的呀?(可以测试下) // 新建模式:重置表单 - formData.value = { - descriptionScores: 5, - benefitScores: 5, - } as Partial; selectedSku.value = undefined; await formApi.setValues({ spuId: undefined, skuId: undefined }); return; diff --git a/apps/web-antd/src/views/mall/product/spu/components/sku-table-select.vue b/apps/web-antd/src/views/mall/product/spu/components/sku-table-select.vue index 53668afe0a50a4f3f46daf65aa078103aa6572a4..a93eed7a02e20df7441c2262ca79271f78b95f90 100644 --- a/apps/web-antd/src/views/mall/product/spu/components/sku-table-select.vue +++ b/apps/web-antd/src/views/mall/product/spu/components/sku-table-select.vue @@ -1,17 +1,16 @@ diff --git a/apps/web-antd/src/views/mall/promotion/point/activity/modules/form.vue b/apps/web-antd/src/views/mall/promotion/point/activity/modules/form.vue index d6315b296cb8b50806f6aacbce213ab916b9f4f5..43462850e5dfcbe3ed44a839303db6a8d4c403a6 100644 --- a/apps/web-antd/src/views/mall/promotion/point/activity/modules/form.vue +++ b/apps/web-antd/src/views/mall/promotion/point/activity/modules/form.vue @@ -180,26 +180,16 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { + // 重置表单数据(新增和编辑模式都需要) formData.value = undefined; spuList.value = []; spuPropertyList.value = []; return; } - // 重置表单数据(新增和编辑模式都需要) - // TODO @puhui999:这里的重置,是不是在 183 到 185 已经处理了呀。 - formData.value = undefined; - spuList.value = []; - spuPropertyList.value = []; + // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { - // 新增模式:重置表单字段 - // TODO @puhui999:197 到 201 这块的 setValues 的设置,是不是必要哈。可以看看。 - await formApi.setValues({ - sort: 0, - remark: '', - spuId: undefined, - }); return; } // 加载数据 diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts index 46e6e9caebcf42c14dab6c23ef110fef74fcd3a2..e0a62c668625a0539ad26bcc95f36072bf301d14 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts @@ -166,26 +166,87 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: z.number().default(PromotionProductScopeEnum.ALL.scope), }, - // TODO @puhui999:选择完删除后,自动就退出了 modal; { fieldName: 'productSpuIds', label: '选择商品', component: 'Input', dependencies: { - triggerFields: ['productScope'], + triggerFields: ['productScope', 'productScopeValues'], show: (values) => { return values.productScope === PromotionProductScopeEnum.SPU.scope; }, + trigger(values, form) { + // 当加载已有数据时,根据 productScopeValues 设置 productSpuIds + if ( + values.productScope === PromotionProductScopeEnum.SPU.scope && + values.productScopeValues + ) { + form.setFieldValue('productSpuIds', values.productScopeValues); + } + }, + }, + rules: 'required', + }, + { + fieldName: 'productCategoryIds', + label: '选择分类', + component: 'Input', + dependencies: { + triggerFields: ['productScope', 'productScopeValues'], + show: (values) => { + return ( + values.productScope === PromotionProductScopeEnum.CATEGORY.scope + ); + }, + trigger(values, form) { + // 当加载已有数据时,根据 productScopeValues 设置 productCategoryIds + if ( + values.productScope === PromotionProductScopeEnum.CATEGORY.scope && + values.productScopeValues + ) { + const categoryIds = values.productScopeValues; + // 单选时使用数组不能反显,取第一个元素 + form.setFieldValue( + 'productCategoryIds', + Array.isArray(categoryIds) && categoryIds.length > 0 + ? categoryIds[0] + : categoryIds, + ); + } + }, }, rules: 'required', }, - // TODO @puhui999:这里还有个分类; { fieldName: 'rules', label: '优惠设置', component: 'Input', formItemClass: 'items-start', - // TODO @puhui999:这里可能要加个 rules: 'required', + rules: 'required', + }, + // 隐藏字段:用于自动同步 productScopeValues + { + fieldName: 'productScopeValues', + component: 'Input', + dependencies: { + triggerFields: ['productScope', 'productSpuIds', 'productCategoryIds'], + show: () => false, + trigger(values, form) { + switch (values.productScope) { + case PromotionProductScopeEnum.CATEGORY.scope: { + const categoryIds = Array.isArray(values.productCategoryIds) + ? values.productCategoryIds + : [values.productCategoryIds]; + form.setFieldValue('productScopeValues', categoryIds); + break; + } + case PromotionProductScopeEnum.SPU.scope: { + form.setFieldValue('productScopeValues', values.productSpuIds); + break; + } + } + }, + }, }, ]; } diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue index 34949082494d99d8d5e69b500f332774ea9d8480..7f160273b33919f13615ff38c0f34638fa6f80e9 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue @@ -1,7 +1,7 @@ diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue index b91b63398712fa1804055f8da190b65a3431f747..7674f5b1ac9e8db8ada31043a11fdcf91b8c43dd 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue @@ -2,7 +2,7 @@ import type { MallCouponTemplateApi } from '#/api/mall/promotion/coupon/couponTemplate'; import type { MallRewardActivityApi } from '#/api/mall/promotion/reward/rewardActivity'; -import { nextTick, onMounted, ref } from 'vue'; +import { nextTick, onMounted, ref, watch } from 'vue'; import { CouponTemplateTakeTypeEnum, DICT_TYPE } from '@vben/constants'; @@ -32,15 +32,14 @@ interface GiveCoupon extends MallCouponTemplateApi.CouponTemplate { const rewardRule = useVModel(props, 'modelValue', emits); const list = ref([]); // 选择的优惠劵列表 -// TODO @puhui999:1)命名上,可以弱化 coupon;例如说 selectRef;原因是,本身就是 coupon-select.vue;2)相关的处理的方法,最好都带 handle,如果是处理事件;例如说 deleteCoupon 改成 handleDelete; /** 选择优惠券 */ -const couponSelectRef = ref>(); -function selectCoupon() { - couponSelectRef.value?.open(); +const selectRef = ref>(); +function handleSelect() { + selectRef.value?.open(); } /** 选择优惠券后的回调 */ -function handleCouponChange(val: any[]) { +function handleChange(val: any[]) { for (const item of val) { if (list.value.some((v) => v.id === item.id)) { continue; @@ -50,13 +49,18 @@ function handleCouponChange(val: any[]) { } /** 删除优惠券 */ -function deleteCoupon(index: number) { +function handleDelete(index: number) { list.value.splice(index, 1); } /** 初始化赠送的优惠券列表 */ async function initGiveCouponList() { - if (!rewardRule.value || !rewardRule.value.giveCouponTemplateCounts) { + // 校验优惠券存在 + if ( + !rewardRule.value || + !rewardRule.value.giveCouponTemplateCounts || + Object.keys(rewardRule.value.giveCouponTemplateCounts).length === 0 + ) { return; } const tempLateIds = Object.keys( @@ -74,19 +78,22 @@ async function initGiveCouponList() { }); } -/** 设置赠送的优惠券 */ -// TODO @puhui999:这个有办法不提供,就是不用 form.vue 去调用,更加透明~ -function setGiveCouponList() { - if (!rewardRule.value) { - return; - } - rewardRule.value.giveCouponTemplateCounts = {}; - list.value.forEach((rule) => { - rewardRule.value.giveCouponTemplateCounts![rule.id] = rule.giveCount!; - }); -} - -defineExpose({ setGiveCouponList }); +/** 监听 list 变化,自动同步到 rewardRule */ +watch( + list, + (val) => { + if (!rewardRule.value) { + return; + } + // 核心:清空 giveCouponTemplateCounts,解决删除不生效的问题 + rewardRule.value.giveCouponTemplateCounts = {}; + // 设置优惠券和其数量的对应 + val.forEach((item) => { + rewardRule.value.giveCouponTemplateCounts![item.id] = item.giveCount!; + }); + }, + { deep: true }, +); onMounted(async () => { await nextTick(); @@ -96,7 +103,7 @@ onMounted(async () => { diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule.vue index 9b15dfbc3dd6258885d037c873b56c740bde7173..1aadac101d67e8582b1eecbf6517c6c508a98496 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule.vue +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule.vue @@ -1,7 +1,7 @@