Commit f11df674 by 芋道源码 Committed by Gitee

!521 商城满减送活动 TODO 完善

Merge pull request !521 from puhui999/dev-crm
parents 5dc11f84 10cb91ad
This source diff could not be displayed because it is too large. You can view the blob instead.
import request from '@/config/axios' import request from '@/config/axios'
export interface DiscountActivityVO { export interface RewardActivityVO {
id?: number id?: number
name?: string name?: string
startTime?: Date startTime?: Date
endTime?: Date endTime?: Date
startAndEndTime?: Date[] // 只前端使用
remark?: string remark?: string
conditionType?: number conditionType?: number
productScope?: number productScope?: number
productSpuIds?: number[] productScopeValues?: number[] // 商品范围:值为 品类编号列表 或 商品编号列表 ,用于提交
rules?: DiscountProductVO[] productCategoryIds?: number[] // 仅用于表单,不提交
productSpuIds?: number[] // 仅用于表单,不提交
rules: RewardRule[]
} }
// 优惠规则 // 优惠规则
export interface DiscountProductVO { export interface RewardRule {
limit: number limit?: number
discountPrice: number discountPrice?: number
freeDelivery: boolean freeDelivery?: boolean
point: number givePoint?: boolean
couponIds: number[] point?: number
couponCounts: number[] giveCoupon?: boolean
couponIds?: number[]
couponCounts?: number[]
} }
// 新增满减送活动 // 新增满减送活动
export const createRewardActivity = async (data: DiscountActivityVO) => { export const createRewardActivity = async (data: RewardActivityVO) => {
return await request.post({ url: '/promotion/reward-activity/create', data }) return await request.post({ url: '/promotion/reward-activity/create', data })
} }
// 更新满减送活动 // 更新满减送活动
export const updateRewardActivity = async (data: DiscountActivityVO) => { export const updateRewardActivity = async (data: RewardActivityVO) => {
return await request.put({ url: '/promotion/reward-activity/update', data }) return await request.put({ url: '/promotion/reward-activity/update', data })
} }
......
...@@ -46,8 +46,3 @@ export const updateUserLevel = async (data: any) => { ...@@ -46,8 +46,3 @@ export const updateUserLevel = async (data: any) => {
export const updateUserPoint = async (data: any) => { export const updateUserPoint = async (data: any) => {
return await request.put({ url: `/member/user/update-point`, data }) return await request.put({ url: `/member/user/update-point`, data })
} }
// 修改会员用户余额
export const updateUserBalance = async (data: any) => {
return await request.put({ url: `/member/user/update-balance`, data })
}
...@@ -4,6 +4,7 @@ import request from '@/config/axios' ...@@ -4,6 +4,7 @@ import request from '@/config/axios'
export interface PayWalletUserReqVO { export interface PayWalletUserReqVO {
userId: number userId: number
} }
/** 钱包 VO */ /** 钱包 VO */
export interface WalletVO { export interface WalletVO {
id: number id: number
...@@ -20,7 +21,12 @@ export const getWallet = async (params: PayWalletUserReqVO) => { ...@@ -20,7 +21,12 @@ export const getWallet = async (params: PayWalletUserReqVO) => {
return await request.get<WalletVO>({ url: `/pay/wallet/get`, params }) return await request.get<WalletVO>({ url: `/pay/wallet/get`, params })
} }
// 查询会员钱包列表 /** 查询会员钱包列表 */
export const getWalletPage = async (params) => { export const getWalletPage = async (params: any) => {
return await request.get({ url: `/pay/wallet/page`, params }) return await request.get({ url: `/pay/wallet/page`, params })
} }
/** 修改会员钱包余额 */
export const updateWalletBalance = async (data: any) => {
return await request.put({ url: `/pay/wallet/update-balance`, data })
}
...@@ -153,11 +153,12 @@ import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate' ...@@ -153,11 +153,12 @@ import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
defineOptions({ name: 'CouponSelect' }) defineOptions({ name: 'CouponSelect' })
defineProps<{ const props = defineProps<{
multipleSelection: CouponTemplateApi.CouponTemplateVO[] multipleSelection?: CouponTemplateApi.CouponTemplateVO[]
}>() }>()
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update:multipleSelection', v: CouponTemplateApi.CouponTemplateVO[]) (e: 'update:multipleSelection', v: CouponTemplateApi.CouponTemplateVO[]): void
(e: 'change', v: CouponTemplateApi.CouponTemplateVO[]): void
}>() }>()
const dialogVisible = ref(false) // 弹窗的是否展示 const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('选择优惠卷') // 弹窗的标题 const dialogTitle = ref('选择优惠卷') // 弹窗的标题
...@@ -209,7 +210,11 @@ const open = async () => { ...@@ -209,7 +210,11 @@ const open = async () => {
defineExpose({ open }) // 提供 open 方法,用于打开弹窗 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const handleSelectionChange = (val: CouponTemplateApi.CouponTemplateVO[]) => { const handleSelectionChange = (val: CouponTemplateApi.CouponTemplateVO[]) => {
emit('update:multipleSelection', val) if (props.multipleSelection) {
emit('update:multipleSelection', val)
return
}
emit('change', val)
} }
const submitForm = () => { const submitForm = () => {
......
<template>
<!-- 满减送活动规则组件 -->
<el-row>
<template v-if="formData.rules">
<div v-for="(rule, index) in formData.rules" :key="index">
<el-col :span="24">
<span class="font-bold">活动层级{{ index + 1 }}</span>
<el-button v-if="index !== 0" link type="danger" @click="deleteRule(index)">
删除
</el-button>
</el-col>
<el-form ref="formRef" :model="rule">
<el-form-item label="优惠门槛:" label-width="100px" prop="limit">
<el-input
v-model="rule.limit"
:min="0"
class="w-150px! p-x-20px!"
placeholder=""
type="number"
/>
{{ PromotionConditionTypeEnum.PRICE.type === formData.conditionType ? '元' : '件' }}
</el-form-item>
<el-form-item label="优惠内容:" label-width="100px">
<el-col :span="24">
订单金额优惠
<el-form-item>
<el-input
v-model="rule.discountPrice"
class="w-150px! p-x-20px!"
placeholder=""
type="number"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<span>包邮:</span>
<el-switch
v-model="rule.freeDelivery"
active-text="是"
inactive-text="否"
inline-prompt
/>
</el-col>
<el-col :span="24">
<span>送积分:</span>
<el-switch
v-model="rule.givePoint"
active-text="是"
inactive-text="否"
inline-prompt
/>
<el-form-item v-if="rule.givePoint">
<el-input
v-model="rule.point"
class="w-150px! p-x-20px!"
placeholder=""
type="number"
/>
积分
</el-form-item>
</el-col>
<!-- 优惠券待处理 也可以参考优惠劵的SpuShowcase-->
<!-- TODO 待实现!-->
<el-col :span="24">
<span>送优惠券:</span>
<el-switch
v-model="rule.giveCoupon"
active-text="是"
inactive-text="否"
inline-prompt
/>
<RewardRuleCouponShowcase v-if="rule.giveCoupon" />
</el-col>
</el-form-item>
</el-form>
</div>
</template>
<el-col :span="24">
<el-button type="primary" @click="addRule">添加优惠规则</el-button>
</el-col>
</el-row>
</template>
<script lang="ts" setup>
import RewardRuleCouponShowcase from './RewardRuleCouponShowcase.vue'
import { RewardActivityVO } from '@/api/mall/promotion/reward/rewardActivity'
import { PromotionConditionTypeEnum } from '@/utils/constants'
import { useVModel } from '@vueuse/core'
defineOptions({ name: 'RewardRule' })
const props = defineProps<{
modelValue: RewardActivityVO
}>()
const emits = defineEmits<{
(e: 'update:modelValue', v: any): void
(e: 'deleteRule', v: number): void
}>()
const formData = useVModel(props, 'modelValue', emits) // 活动数据
/** 删除优惠规则 */
const deleteRule = (ruleIndex: number) => {
formData.value.rules.splice(ruleIndex, 1)
}
/** 添加优惠规则 */
const addRule = () => {
formData.value.rules.push({
limit: 0,
discountPrice: 0,
freeDelivery: false,
givePoint: false,
point: 0,
giveCoupon: false,
couponIds: [],
couponCounts: []
})
}
// TODO puhui999: 规则校验完善
</script>
<style lang="scss" scoped></style>
<template>
<ContentWrap>
<el-button @click="selectCoupon">添加优惠卷</el-button>
<el-table :data="list">
<el-table-column label="优惠券名称" prop="name" />
<el-table-column label="类型" prop="productScope">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PROMOTION_PRODUCT_SCOPE" :value="scope.row.productScope" />
</template>
</el-table-column>
<el-table-column label="优惠" prop="discount">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PROMOTION_DISCOUNT_TYPE" :value="scope.row.discountType" />
{{ discountFormat(scope.row) }}
</template>
</el-table-column>
<el-table-column
:formatter="validityTypeFormat"
align="center"
label="使用时间"
prop="validityType"
/>
<el-table-column
:formatter="remainedCountFormat"
align="center"
label="剩余数量"
prop="totalCount"
/>
<el-table-column align="center" fixed="right" label="状态" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
</ContentWrap>
<!-- 优惠券选择 -->
<CouponSelect ref="couponSelectRef" @change="handleCouponChange" />
</template>
<script lang="ts" setup>
// TODO puhui999: 先简单选择后列表展示,后续继续 fix
import { CouponSelect } from '@/views/mall/promotion/coupon/components'
import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
import { DICT_TYPE } from '@/utils/dict'
import {
discountFormat,
remainedCountFormat,
validityTypeFormat
} from '@/views/mall/promotion/coupon/formatter'
defineOptions({ name: 'RewardRuleCouponShowcase' })
const list = ref<CouponTemplateApi.CouponTemplateVO[]>([]) // 选择的优惠券列表
const couponSelectRef = ref<InstanceType<typeof CouponSelect>>() // 优惠券选择
/** 选择优惠券 */
const selectCoupon = () => {
couponSelectRef.value?.open()
}
/** 选择优惠券后的回调 */
const handleCouponChange = (val: CouponTemplateApi.CouponTemplateVO[]) => {
for (const item of val) {
if (list.value.some((v) => v.id === item.id)) {
continue
}
list.value.push(item)
}
}
</script>
<style lang="scss" scoped></style>
...@@ -4,27 +4,27 @@ ...@@ -4,27 +4,27 @@
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<ContentWrap> <ContentWrap>
<el-form <el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px" label-width="68px"
> >
<el-form-item label="活动名称" prop="name"> <el-form-item label="活动名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
placeholder="请输入活动名称" class="!w-240px"
clearable clearable
placeholder="请输入活动名称"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="活动状态" prop="status"> <el-form-item label="活动状态" prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.status"
placeholder="请选择活动状态"
clearable
class="!w-240px" class="!w-240px"
clearable
placeholder="请选择活动状态"
> >
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)"
...@@ -37,24 +37,31 @@ ...@@ -37,24 +37,31 @@
<el-form-item label="活动时间" prop="createTime"> <el-form-item label="活动时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="活动开始日期"
end-placeholder="活动结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px" class="!w-240px"
end-placeholder="活动结束日期"
start-placeholder="活动开始日期"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery">
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<el-button <el-button
type="primary" v-hasPermi="['product:brand:create']"
plain plain
type="primary"
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['product:brand:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon class="mr-5px" icon="ep:plus" />
新增
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -62,47 +69,47 @@ ...@@ -62,47 +69,47 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" row-key="id" default-expand-all> <el-table v-loading="loading" :data="list" default-expand-all row-key="id">
<el-table-column label="活动名称" prop="name" /> <el-table-column label="活动名称" prop="name" />
<el-table-column <el-table-column
label="活动开始时间" :formatter="dateFormatter"
align="center" align="center"
label="活动开始时间"
prop="startTime" prop="startTime"
:formatter="dateFormatter"
/> />
<el-table-column <el-table-column
label="活动结束时间" :formatter="dateFormatter"
align="center" align="center"
label="活动结束时间"
prop="endTime" prop="endTime"
:formatter="dateFormatter"
/> />
<el-table-column label="状态" align="center" prop="status"> <el-table-column align="center" label="状态" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建时间" :formatter="dateFormatter"
align="center" align="center"
label="创建时间"
prop="createTime" prop="createTime"
width="180" width="180"
:formatter="dateFormatter"
/> />
<el-table-column label="操作" align="center"> <el-table-column align="center" label="操作">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-hasPermi="['product:brand:update']"
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['product:brand:update']"
> >
编辑 编辑
</el-button> </el-button>
<el-button <el-button
v-hasPermi="['product:brand:delete']"
link link
type="danger" type="danger"
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['product:brand:delete']"
> >
删除 删除
</el-button> </el-button>
...@@ -111,9 +118,9 @@ ...@@ -111,9 +118,9 @@
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total"
@pagination="getList" @pagination="getList"
/> />
</ContentWrap> </ContentWrap>
...@@ -168,9 +175,9 @@ const resetQuery = () => { ...@@ -168,9 +175,9 @@ const resetQuery = () => {
} }
/** 添加/修改操作 */ /** 添加/修改操作 */
const formRef = ref() const formRef = ref<InstanceType<typeof RewardForm>>()
const openForm = (type: string, id?: number) => { const openForm = (type: string, id?: number) => {
formRef.value.open(type, id) formRef.value?.open(type, id)
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<el-input v-model="formData.nickname" class="!w-240px" disabled /> <el-input v-model="formData.nickname" class="!w-240px" disabled />
</el-form-item> </el-form-item>
<el-form-item label="变动前余额(元)" prop="balance"> <el-form-item label="变动前余额(元)" prop="balance">
<el-input-number v-model="formData.balance" class="!w-240px" disabled /> <el-input :model-value="formData.balance" class="!w-240px" disabled />
</el-form-item> </el-form-item>
<el-form-item label="变动类型" prop="changeType"> <el-form-item label="变动类型" prop="changeType">
<el-radio-group v-model="formData.changeType"> <el-radio-group v-model="formData.changeType">
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="变动后余额(元)"> <el-form-item label="变动后余额(元)">
<el-input-number v-model="balanceResult" class="!w-240px" disabled /> <el-input :model-value="balanceResult" class="!w-240px" disabled />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
...@@ -57,7 +57,7 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加 ...@@ -57,7 +57,7 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
nickname: undefined, nickname: undefined,
balance: '0', // TODO @puhui999:貌似有 el-input-number 的报错,看看怎么解决。应该可以 balance: '0',
changeBalance: 0, changeBalance: 0,
changeType: 1 changeType: 1
}) })
...@@ -108,8 +108,8 @@ const submitForm = async () => { ...@@ -108,8 +108,8 @@ const submitForm = async () => {
// 提交请求 // 提交请求
formLoading.value = true formLoading.value = true
try { try {
await UserApi.updateUserBalance({ await WalletApi.updateWalletBalance({
id: formData.value.id, userId: formData.value.id,
balance: convertToInteger(formData.value.changeBalance) * formData.value.changeType balance: convertToInteger(formData.value.changeBalance) * formData.value.changeType
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment