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 3ff475282..0599f5977 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 @@ -99,16 +99,14 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { + // 关闭时重置表单状态 selectedSku.value = undefined; + await formApi.setValues({ spuId: undefined, skuId: undefined }); return; } // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { - // 新建模式:重置表单 - // TODO @puhui999:这里的重置,可以统一到 103 行那么? - selectedSku.value = undefined; - await formApi.setValues({ spuId: undefined, skuId: undefined }); return; } // 编辑模式:加载数据 diff --git a/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue index 1c508cc7e..17e405bfb 100644 --- a/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue +++ b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue @@ -4,7 +4,7 @@ import type { MallSpuApi } from '#/api/mall/product/spu'; import { computed, ref, watch } from 'vue'; -import { CloseCircleFilled, PlusOutlined } from '@vben/icons'; +import { IconifyIcon } from '@vben/icons'; import { Image, Tooltip } from 'ant-design-vue'; @@ -110,9 +110,9 @@ function emitSpuChange() { class="h-full w-full rounded-lg object-cover" /> - - @@ -126,8 +126,7 @@ function emitSpuChange() { class="flex h-[60px] w-[60px] cursor-pointer items-center justify-center rounded-lg border-2 border-dashed transition-colors hover:border-primary hover:bg-primary/5" @click="handleOpenSpuSelect" > - - + diff --git a/apps/web-antd/src/views/mall/product/spu/form/index.vue b/apps/web-antd/src/views/mall/product/spu/form/index.vue index c2f5e3061..0d654b318 100644 --- a/apps/web-antd/src/views/mall/product/spu/form/index.vue +++ b/apps/web-antd/src/views/mall/product/spu/form/index.vue @@ -32,30 +32,6 @@ const spuId = ref(); const { params, name } = useRoute(); const { closeCurrentTab } = useTabs(); const activeTabName = ref('info'); -// TODO @puhui999:这个要不要类似 ele 里,直接写到 html 里? -const tabList = ref([ - { - key: 'info', - tab: '基础设置', - }, - { - key: 'sku', - tab: '价格库存', - }, - { - key: 'delivery', - tab: '物流设置', - }, - { - key: 'description', - tab: '商品详情', - }, - { - key: 'other', - tab: '其它设置', - }, -]); - const formLoading = ref(false); // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const isDetail = ref(name === 'ProductSpuDetail'); // 是否查看详情 const skuListRef = ref(); // 商品属性列表 Ref @@ -95,22 +71,22 @@ const propertyList = ref([]); // 商品属性列表 const ruleConfig: RuleConfig[] = [ { name: 'stock', - rule: (arg) => arg >= 0, + rule: (arg: number) => arg >= 0, message: '商品库存必须大于等于 1 !!!', }, { name: 'price', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品销售价格必须大于等于 0.01 元!!!', }, { name: 'marketPrice', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品市场价格必须大于等于 0.01 元!!!', }, { name: 'costPrice', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品成本价格必须大于等于 0.00 元!!!', }, ]; // sku 相关属性校验规则 @@ -222,7 +198,7 @@ async function handleSubmit() { item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice); }); } - // 处理轮播图列表 TODO @puhui999:这个是必须的哇? + // 处理轮播图列表:上传组件可能返回对象或字符串,统一处理成字符串数组 const newSliderPicUrls: any[] = []; values.sliderPicUrls!.forEach((item: any) => { // 如果是前端选的图 @@ -344,7 +320,28 @@ onMounted(async () => { @@ -410,7 +407,6 @@ onMounted(async () => { diff --git a/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue b/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue index a81137fd0..e92e00237 100644 --- a/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue +++ b/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue @@ -215,18 +215,17 @@ async function getAttributeOptions(propertyId: number) {
- + 添加
diff --git a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue index b45bd92c9..789ecd139 100644 --- a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue +++ b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue @@ -61,9 +61,9 @@ const formSchema: VbenFormSchema[] = [ })); }, filterable: true, + allowCreate: true, placeholder: '请选择属性名称。如果不存在,可手动输入选择', multiple: true, - allowCreate: true, clearable: true, }, rules: 'required', diff --git a/apps/web-ele/src/views/mall/promotion/bargain/activity/data.ts b/apps/web-ele/src/views/mall/promotion/bargain/activity/data.ts index 86e0af7da..06762a868 100644 --- a/apps/web-ele/src/views/mall/promotion/bargain/activity/data.ts +++ b/apps/web-ele/src/views/mall/promotion/bargain/activity/data.ts @@ -24,7 +24,7 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入活动名称', }, rules: 'required', - // TODO @puhui999:这里和 antd 里的不太一样,可以看看。 + formItemClass: 'col-span-2', }, { fieldName: 'startTime', @@ -33,8 +33,8 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { format: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'datetime', placeholder: '请选择开始时间', - class: '!w-full', }, rules: 'required', }, @@ -45,48 +45,8 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { format: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'datetime', placeholder: '请选择结束时间', - class: '!w-full', - }, - rules: 'required', - }, - { - fieldName: 'bargainFirstPrice', - label: '砍价起始价格(元)', - component: 'InputNumber', - componentProps: { - min: 0, - precision: 2, - step: 0.01, - placeholder: '请输入砍价起始价格', - controlsPosition: 'right', - class: '!w-full', - }, - rules: 'required', - }, - { - fieldName: 'bargainMinPrice', - label: '砍价底价(元)', - component: 'InputNumber', - componentProps: { - min: 0, - precision: 2, - step: 0.01, - placeholder: '请输入砍价底价', - controlsPosition: 'right', - class: '!w-full', - }, - rules: 'required', - }, - { - fieldName: 'stock', - label: '活动库存', - component: 'InputNumber', - componentProps: { - min: 1, - placeholder: '请输入活动库存', - controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -96,9 +56,8 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', componentProps: { min: 1, - placeholder: '请输入助力人数', + placeholder: '达到该人数才能砍到低价', controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -108,9 +67,8 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', componentProps: { min: 1, - placeholder: '请输入砍价次数', + placeholder: '最大帮砍次数', controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -120,9 +78,8 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', componentProps: { min: 1, - placeholder: '请输入购买限制', + placeholder: '最大购买次数', controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -134,9 +91,8 @@ export function useFormSchema(): VbenFormSchema[] { min: 0, precision: 2, step: 0.01, - placeholder: '请输入最小砍价金额', + placeholder: '用户每次砍价的最小金额', controlsPosition: 'right', - class: '!w-full', }, }, { @@ -147,11 +103,17 @@ export function useFormSchema(): VbenFormSchema[] { min: 0, precision: 2, step: 0.01, - placeholder: '请输入最大砍价金额', + placeholder: '用户每次砍价的最大金额', controlsPosition: 'right', - class: '!w-full', }, }, + { + fieldName: 'spuId', + label: '砍价商品', + component: 'Input', + rules: 'required', + formItemClass: 'col-span-2', + }, ]; } @@ -223,15 +185,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { field: 'bargainFirstPrice', title: '起始价格', minWidth: 100, - // TODO @puhui999:这里和 antd 不太一样,得看看 - formatter: 'formatFenToYuanAmount', + formatter: 'formatAmount2', }, { field: 'bargainMinPrice', title: '砍价底价', minWidth: 100, - // TODO @puhui999:这里和 antd 不太一样,得看看 - formatter: 'formatFenToYuanAmount', + formatter: 'formatAmount2', }, { field: 'recordUserCount', diff --git a/apps/web-ele/src/views/mall/promotion/bargain/activity/modules/form.vue b/apps/web-ele/src/views/mall/promotion/bargain/activity/modules/form.vue index bd4d82975..56a6e0061 100644 --- a/apps/web-ele/src/views/mall/promotion/bargain/activity/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/bargain/activity/modules/form.vue @@ -1,13 +1,20 @@ diff --git a/apps/web-ele/src/views/mall/promotion/bargain/record/data.ts b/apps/web-ele/src/views/mall/promotion/bargain/record/data.ts index a584e1146..47480820e 100644 --- a/apps/web-ele/src/views/mall/promotion/bargain/record/data.ts +++ b/apps/web-ele/src/views/mall/promotion/bargain/record/data.ts @@ -75,15 +75,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { field: 'activity.bargainMinPrice', title: '最低价', minWidth: 100, - // TODO @puhui999:这里和 antd 不同 - formatter: 'formatFenToYuanAmount', + formatter: 'formatAmount2', }, { field: 'bargainPrice', title: '当前价', minWidth: 100, - // TODO @puhui999:这里和 antd 不同 - formatter: 'formatFenToYuanAmount', + formatter: 'formatAmount2', }, { field: 'activity.helpMaxCount', @@ -154,8 +152,7 @@ export function useHelpGridColumns(): VxeTableGridOptions['columns'] { field: 'reducePrice', title: '砍价金额', minWidth: 100, - // TODO @puhui999:这里和 antd 不同 - formatter: 'formatFenToYuanAmount', + formatter: 'formatAmount2', }, { field: 'createTime', diff --git a/apps/web-ele/src/views/mall/promotion/combination/activity/data.ts b/apps/web-ele/src/views/mall/promotion/combination/activity/data.ts index c3b88118d..900af00e9 100644 --- a/apps/web-ele/src/views/mall/promotion/combination/activity/data.ts +++ b/apps/web-ele/src/views/mall/promotion/combination/activity/data.ts @@ -24,16 +24,7 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入活动名称', }, rules: 'required', - }, - { - fieldName: 'status', - label: '活动状态', - component: 'Select', - componentProps: { - placeholder: '请选择活动状态', - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - rules: 'required', + formItemClass: 'col-span-2', }, { fieldName: 'startTime', @@ -41,10 +32,9 @@ export function useFormSchema(): VbenFormSchema[] { component: 'DatePicker', componentProps: { placeholder: '请选择开始时间', - showTime: false, + type: 'datetime', valueFormat: 'x', - format: 'YYYY-MM-DD', - class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', }, rules: 'required', }, @@ -54,22 +44,19 @@ export function useFormSchema(): VbenFormSchema[] { component: 'DatePicker', componentProps: { placeholder: '请选择结束时间', - showTime: false, + type: 'datetime', valueFormat: 'x', - format: 'YYYY-MM-DD', - class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', }, rules: 'required', }, { fieldName: 'userSize', - label: '用户数量', + label: '拼团人数', component: 'InputNumber', componentProps: { - placeholder: '请输入用户数量', + placeholder: '达到该人数即成团', min: 2, - controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -78,10 +65,8 @@ export function useFormSchema(): VbenFormSchema[] { label: '限制时长', component: 'InputNumber', componentProps: { - placeholder: '请输入限制时长(小时)', + placeholder: '限制时长(小时)', min: 0, - controlsPosition: 'right', - class: '!w-full', }, rules: 'required', }, @@ -92,8 +77,6 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { placeholder: '请输入总限购数量', min: 0, - controlsPosition: 'right', - class: '!w-full', }, }, { @@ -103,8 +86,6 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { placeholder: '请输入单次限购数量', min: 0, - controlsPosition: 'right', - class: '!w-full', }, }, { @@ -115,6 +96,13 @@ export function useFormSchema(): VbenFormSchema[] { options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'), }, }, + { + fieldName: 'spuId', + label: '拼团商品', + component: 'Input', + rules: 'required', + formItemClass: 'col-span-2', + }, ]; } diff --git a/apps/web-ele/src/views/mall/promotion/combination/activity/modules/form.vue b/apps/web-ele/src/views/mall/promotion/combination/activity/modules/form.vue index f54d05308..6f97d797d 100644 --- a/apps/web-ele/src/views/mall/promotion/combination/activity/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/combination/activity/modules/form.vue @@ -1,12 +1,20 @@ diff --git a/apps/web-ele/src/views/mall/promotion/combination/record/data.ts b/apps/web-ele/src/views/mall/promotion/combination/record/data.ts index 82b63c49a..7669be635 100644 --- a/apps/web-ele/src/views/mall/promotion/combination/record/data.ts +++ b/apps/web-ele/src/views/mall/promotion/combination/record/data.ts @@ -20,9 +20,11 @@ export function useGridFormSchema(): VbenFormSchema[] { { fieldName: 'createTime', label: '创建时间', - component: 'RangePicker', + component: 'DatePicker', componentProps: { - placeholder: ['开始时间', '结束时间'], + type: 'daterange', + startPlaceholder: '开始时间', + endPlaceholder: '结束时间', clearable: true, valueFormat: 'YYYY-MM-DD HH:mm:ss', }, diff --git a/apps/web-ele/src/views/mall/promotion/coupon/template/data.ts b/apps/web-ele/src/views/mall/promotion/coupon/template/data.ts index 035259be5..0b00c1427 100644 --- a/apps/web-ele/src/views/mall/promotion/coupon/template/data.ts +++ b/apps/web-ele/src/views/mall/promotion/coupon/template/data.ts @@ -60,7 +60,6 @@ export function useFormSchema(): VbenFormSchema[] { rules: 'required', defaultValue: PromotionProductScopeEnum.ALL.scope, }, - // TODO @puhui999: 商品选择器优化 { fieldName: 'productSpuIds', label: '商品', @@ -84,7 +83,6 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: 'required', }, - // TODO @puhui999: 商品分类选择器优化 { fieldName: 'productCategoryIds', label: '商品分类', diff --git a/apps/web-ele/src/views/mall/promotion/coupon/template/modules/form.vue b/apps/web-ele/src/views/mall/promotion/coupon/template/modules/form.vue index 69e5d8f1a..13e4c7535 100644 --- a/apps/web-ele/src/views/mall/promotion/coupon/template/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/coupon/template/modules/form.vue @@ -16,11 +16,18 @@ import { updateCouponTemplate, } from '#/api/mall/promotion/coupon/couponTemplate'; import { $t } from '#/locales'; +import { ProductCategorySelect } from '#/views/mall/product/category/components'; +import { SpuShowcase } from '#/views/mall/product/spu/components'; import { useFormSchema } from '../data'; const emit = defineEmits(['success']); -const formData = ref(); +const formData = ref< + Partial & { + productCategoryIds?: number | number[]; + productSpuIds?: number[]; + } +>({}); const getTitle = computed(() => { return formData.value?.id ? $t('ui.actionTitle.edit', ['优惠券模板']) @@ -64,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - formData.value = undefined; + formData.value = {}; return; } // 加载数据 @@ -75,7 +82,7 @@ const [Modal, modalApi] = useVbenModal({ modalApi.lock(); try { formData.value = await getCouponTemplate(data.id); - const processedData = await processLoadData(formData.value); + const processedData = await processLoadData(formData.value as any); // 设置到表单 await formApi.setValues(processedData); } finally { @@ -144,7 +151,15 @@ async function processLoadData( diff --git a/apps/web-ele/src/views/mall/promotion/discountActivity/data.ts b/apps/web-ele/src/views/mall/promotion/discountActivity/data.ts index 395192522..9e6368fd2 100644 --- a/apps/web-ele/src/views/mall/promotion/discountActivity/data.ts +++ b/apps/web-ele/src/views/mall/promotion/discountActivity/data.ts @@ -69,8 +69,15 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入备注', rows: 4, }, + formItemClass: 'col-span-2', + }, + { + fieldName: 'spuIds', + label: '活动商品', + component: 'Input', + rules: 'required', + formItemClass: 'col-span-2', }, - // TODO @puhui999:这里和 antd 对应的不太一样; ]; } diff --git a/apps/web-ele/src/views/mall/promotion/discountActivity/index.vue b/apps/web-ele/src/views/mall/promotion/discountActivity/index.vue index da984ff4e..b9a5e725a 100644 --- a/apps/web-ele/src/views/mall/promotion/discountActivity/index.vue +++ b/apps/web-ele/src/views/mall/promotion/discountActivity/index.vue @@ -46,7 +46,7 @@ async function handleClose(row: MallDiscountActivityApi.DiscountActivity) { text: '正在关闭中...', }); try { - await closeDiscountActivity(row.id as number); + await closeDiscountActivity(row.id!); ElMessage.success('关闭成功'); handleRefresh(); } finally { @@ -60,7 +60,7 @@ async function handleDelete(row: MallDiscountActivityApi.DiscountActivity) { text: $t('ui.actionMessage.deleting', [row.name]), }); try { - await deleteDiscountActivity(row.id as number); + await deleteDiscountActivity(row.id!); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); handleRefresh(); } finally { diff --git a/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue b/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue index 93a4b1356..5918b0ea2 100644 --- a/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/discountActivity/modules/form.vue @@ -13,14 +13,18 @@ import { updateDiscountActivity, } from '#/api/mall/promotion/discount/discountActivity'; import { $t } from '#/locales'; +import { SpuShowcase } from '#/views/mall/product/spu/components'; import { useFormSchema } from '../data'; defineOptions({ name: 'DiscountActivityForm' }); -// TODO @puhui999:这里和 yudao-ui-admin-vben-v5/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue 不太一样 const emit = defineEmits(['success']); -const formData = ref(); +const formData = ref< + Partial & { + spuIds?: number[]; + } +>({}); const getTitle = computed(() => { return formData.value?.id ? $t('ui.actionTitle.edit', ['限时折扣活动']) @@ -70,8 +74,7 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - // TODO @puhui999:这里和 yudao-ui-admin-vben-v5/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue 不太一样 - formData.value = undefined; + formData.value = {}; return; } // 加载数据 @@ -93,7 +96,11 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-ele/src/views/mall/promotion/point/activity/modules/form.vue b/apps/web-ele/src/views/mall/promotion/point/activity/modules/form.vue index b2fb8b9ef..bf21ae078 100644 --- a/apps/web-ele/src/views/mall/promotion/point/activity/modules/form.vue +++ b/apps/web-ele/src/views/mall/promotion/point/activity/modules/form.vue @@ -4,7 +4,7 @@ import type { MallPointActivityApi } from '#/api/mall/promotion/point'; import type { RuleConfig, SpuProperty, -} from '#/views/mall/product/spu/components/type'; +} from '#/views/mall/product/spu/components'; import { computed, ref } from 'vue'; @@ -23,11 +23,10 @@ import { } from '#/api/mall/promotion/point'; import { $t } from '#/locales'; import { + getPropertyList, SpuAndSkuList, SpuSkuSelect, } from '#/views/mall/product/spu/components'; -// TODO @puhui999:getPropertyList 在 antd 和 el 导入的路径不同;是不是要统一下哈; -import { getPropertyList } from '#/views/mall/product/spu/components/property-util'; import { useFormSchema } from '../data'; @@ -100,7 +99,6 @@ async function getSpuDetails( return; } - // TODO @puhui999:这里的 spuList,是不是直接放到 145 行就 ok 啦;(尾部); spuList.value = []; // 筛选指定的 SKU @@ -134,7 +132,6 @@ async function getSpuDetails( }); res.skus = selectSkus; - // TODO @puhui999:这里的逻辑,是不是放到 147 行(尾部); const spuProperties: SpuProperty[] = [ { spuId: res.id!, diff --git a/apps/web-ele/src/views/mall/promotion/point/components/showcase.vue b/apps/web-ele/src/views/mall/promotion/point/components/showcase.vue index 5aedbba54..597395ea3 100644 --- a/apps/web-ele/src/views/mall/promotion/point/components/showcase.vue +++ b/apps/web-ele/src/views/mall/promotion/point/components/showcase.vue @@ -1,5 +1,4 @@ -