From 21e8dbf985ece78b84a0172af419bbfcd60a4f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=BD=E6=97=A5=E6=99=9A=E9=A3=8E?= <1811466536@qq.com> Date: Fri, 22 Dec 2023 18:04:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BB=A1=E5=87=8F=E9=80=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.dev | 5 +- .../mall/promotion/reward/rewardActivity.ts | 44 ++++++ src/utils/constants.ts | 6 +- .../promotion/rewardActivity/RewardForm.vue | 146 ++++++++++++++---- .../mall/promotion/rewardActivity/index.vue | 38 ++--- 5 files changed, 182 insertions(+), 57 deletions(-) create mode 100644 src/api/mall/promotion/reward/rewardActivity.ts diff --git a/.env.dev b/.env.dev index 21ffa920..610924b8 100644 --- a/.env.dev +++ b/.env.dev @@ -4,7 +4,8 @@ NODE_ENV=development VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +# VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +VITE_BASE_URL='http://dofast.demo.huizhizao.vip:20001' # 上传路径 VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload' @@ -34,4 +35,4 @@ VITE_OUT_DIR=dist VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' # 验证码的开关 -VITE_APP_CAPTCHA_ENABLE=false +VITE_APP_CAPTCHA_ENABLE=true diff --git a/src/api/mall/promotion/reward/rewardActivity.ts b/src/api/mall/promotion/reward/rewardActivity.ts new file mode 100644 index 00000000..50c33564 --- /dev/null +++ b/src/api/mall/promotion/reward/rewardActivity.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface DiscountActivityVO { + id?:number, + name?: string + startTime?:Date + endTime?:Date + remark?:string + conditionType?:number + productScope?:number + productSpuIds?:number[] + rules?:DiscountProductVO[] +} +//优惠规则 +export interface DiscountProductVO { + limit: number + discountPrice: number + freeDelivery: boolean + point: number + couponIds: number[] + couponCounts: number[] +} + + +// 新增满减送活动 +export const createRewardActivity = async (data: DiscountActivityVO) => { + return await request.post({ url: '/promotion/reward-activity/create', data }) +} +// 更新满减送活动 +export const updateRewardActivity = async (data: DiscountActivityVO) => { + return await request.put({ url: '/promotion/reward-activity/update', data }) +} +// 查询满减送活动列表 +export const getRewardActivityPage = async (params) => { + return await request.get({ url: '/promotion/reward-activity/page', params }) +} +// 查询满减送活动详情 +export const getReward = async (id:number) => { + return await request.get({ url: '/promotion/reward-activity/get?id='+id, }) +} +// 删除限时折扣活动 +export const deleteRewardActivity = async (id: number) => { + return await request.delete({ url: '/promotion/reward-activity/delete?id=' + id }) +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 41891a4a..d3d0fd45 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -244,15 +244,15 @@ export const CouponTemplateTakeTypeEnum = { */ export const PromotionProductScopeEnum = { ALL: { - scope: 1, + scope: 10, name: '通用劵' }, SPU: { - scope: 2, + scope: 20, name: '商品劵' }, CATEGORY: { - scope: 3, + scope: 30, name: '品类劵' } } diff --git a/src/views/mall/promotion/rewardActivity/RewardForm.vue b/src/views/mall/promotion/rewardActivity/RewardForm.vue index 18827014..716f4e26 100644 --- a/src/views/mall/promotion/rewardActivity/RewardForm.vue +++ b/src/views/mall/promotion/rewardActivity/RewardForm.vue @@ -30,7 +30,36 @@ - + + 添加活动层级 @@ -78,7 +107,7 @@ import { getSpuSimpleList } from '@/api/mall/product/spu' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { CommonStatusEnum } from '@/utils/constants' -import * as ProductBrandApi from '@/api/mall/product/brand' +import * as RewardActivityApi from '@/api/mall/promotion/reward/rewardActivity' import { PromotionConditionTypeEnum, PromotionProductScopeEnum, @@ -112,8 +141,19 @@ const formData = ref({ remark: undefined, productScope: PromotionProductScopeEnum.ALL.scope, productSpuIds: undefined, - rules: undefined + rules: [{ + limit: undefined, + discountPrice: undefined, + freeDelivery: undefined, + point: undefined, + couponIds: [], + couponCounts: [] + }], }) +// 优惠设置 +let rules=reactive([]); +// 优惠券列表 + const formRules = reactive({ name: [{ required: true, message: '活动名称不能为空', trigger: 'blur' }], startAndEndTime: [{ required: true, message: '活动时间不能为空', trigger: 'blur' }], @@ -121,7 +161,7 @@ const formRules = reactive({ productScope: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }], productSpuIds: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }] }) -const formRef = ref() // 表单 Ref +const formRef = ref([]) // 表单 Ref /** 打开弹窗 */ const open = async (type: string, id?: number) => { @@ -133,19 +173,23 @@ const open = async (type: string, id?: number) => { if (id) { formLoading.value = true try { - // formData.value = await ProductBrandApi.getBrand(id) - formData.value = { - conditionType: 10, - description: '', - id: undefined, - name: '测试活动', - picUrl: '', - productScope: 2, - productSpuIds: [634], - remark: '测试备注', - startAndEndTime: [new Date(), new Date('2023-12-31')], - status: 0 + let data= await RewardActivityApi.getReward(id); + data.startAndEndTime=[new Date(data.startTime), new Date(data.endTime)]; + rules.splice(0,rules.length); + data.rules.forEach((item)=>{ + let ars:string[]=reactive([]); + if(item.freeDelivery){ + ars.push('包邮') } + if(item.point){ + ars.push('送积分') + } + if(item.discountPrice){ + ars.push('订单金额优惠') + } + rules.push(ars) + }) + formData.value=data } finally { formLoading.value = false } @@ -160,18 +204,33 @@ const submitForm = async () => { if (!formRef) return const valid = await formRef.value.validate() if (!valid) return - console.log(formData.value) - message.success('已在控制台打印数据') - return + // 处理下数据兼容接口 + formData.value.startTime= +new Date(formData.value.startAndEndTime[0]) + formData.value.endTime=+new Date(formData.value.startAndEndTime[1]) + console.log(rules) + rules.forEach((item,index)=>{ + if(item.includes('包邮')){ + formData.value.rules[index].freeDelivery=true; + }else{ + formData.value.rules[index].freeDelivery=false; + } + if(!item.includes('送积分')){ + formData.value.rules[index].point=undefined; + } + if(!item.includes('订单金额优惠')){ + formData.value.rules[index].discountPrice=undefined; + } + }) + // 提交请求 formLoading.value = true try { - const data = formData.value as ProductBrandApi.BrandVO + const data = formData.value as RewardActivityApi.DiscountActivityVO if (formType.value === 'create') { - await ProductBrandApi.createBrand(data) + await RewardActivityApi.createRewardActivity(data) message.success(t('common.createSuccess')) } else { - await ProductBrandApi.updateBrand(data) + await RewardActivityApi.updateRewardActivity(data) message.success(t('common.updateSuccess')) } dialogVisible.value = false @@ -182,15 +241,50 @@ const submitForm = async () => { } } +const addStratum =()=>{ + formData.value.rules.push({ + limit: undefined, + discountPrice: undefined, + freeDelivery: undefined, + point: undefined, + couponIds: [], + couponCounts: [] + }) + rules.push([]); + console.log(rules) +} + +const deleteStratum=(index)=>{ + formData.value.rules.splice(index,1) + rules.splice(index,1) +} + /** 重置表单 */ const resetForm = () => { formData.value = { id: undefined, - name: '', - picUrl: '', - status: CommonStatusEnum.ENABLE, - description: '' + name: undefined, + startAndEndTime: undefined, + startTime: undefined, + endTime: undefined, + conditionType: PromotionConditionTypeEnum.PRICE.type, + remark: undefined, + productScope: PromotionProductScopeEnum.ALL.scope, + productSpuIds: undefined, + rules: [{ + limit: undefined, + discountPrice: undefined, + freeDelivery: undefined, + point: undefined, + couponIds: [], + couponCounts: [] + }], } + rules.splice(0,rules.length); + rules.push(reactive([])); + // 解决下有时刷新页面第一次点编辑报错 + nextTick(()=>{ formRef.value?.resetFields() + }) } diff --git a/src/views/mall/promotion/rewardActivity/index.vue b/src/views/mall/promotion/rewardActivity/index.vue index 7a05c9fc..86f91fea 100644 --- a/src/views/mall/promotion/rewardActivity/index.vue +++ b/src/views/mall/promotion/rewardActivity/index.vue @@ -65,13 +65,13 @@ @@ -123,6 +123,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { dateFormatter } from '@/utils/formatTime' import * as ProductBrandApi from '@/api/mall/product/brand' +import * as RewardActivityApi from '@/api/mall/promotion/reward/rewardActivity' import RewardForm from './RewardForm.vue' defineOptions({ name: 'PromotionRewardActivity' }) @@ -146,22 +147,7 @@ const queryFormRef = ref() // 搜索的表单 const getList = async () => { loading.value = true try { - // const data = await ProductBrandApi.getBrandParam(queryParams) - const data = { - list: [ - { - createTime: 1693463998000, - description: '', - id: 3, - name: '索尼', - picUrl: - 'http://127.0.0.1:48080/admin-api/infra/file/4/get/f5b7a536306cd1180a42a2211a8212dc23de6b949d30c30d036caa063042f928.png', - sort: [+new Date(), +new Date('2023-12-31')], - status: 10 - } - ], - total: 1 - } + const data = await RewardActivityApi.getRewardActivityPage(queryParams) list.value = data.list total.value = data.total } finally { @@ -171,16 +157,16 @@ const getList = async () => { /** 搜索按钮操作 */ const handleQuery = () => { - console.log(queryParams) - message.success('已打印搜索参数') - return + // console.log(queryParams) + // message.success('已打印搜索参数') + // return getList() } /** 重置按钮操作 */ const resetQuery = () => { - message.success('重置查询表单获取数据') - return + // message.success('重置查询表单获取数据') + // return queryFormRef.value.resetFields() handleQuery() } @@ -196,10 +182,10 @@ const handleDelete = async (id: number) => { try { // 删除的二次确认 await message.delConfirm() - message.success('您以确认删除') - return + // message.success('您以确认删除') + // return // 发起删除 - await ProductBrandApi.deleteBrand(id) + await RewardActivityApi.deleteRewardActivity(id) message.success(t('common.delSuccess')) // 刷新列表 await getList()