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'
export interface DiscountActivityVO {
export interface RewardActivityVO {
id?: number
name?: string
startTime?: Date
endTime?: Date
startAndEndTime?: Date[] // 只前端使用
remark?: string
conditionType?: number
productScope?: number
productSpuIds?: number[]
rules?: DiscountProductVO[]
productScopeValues?: number[] // 商品范围:值为 品类编号列表 或 商品编号列表 ,用于提交
productCategoryIds?: number[] // 仅用于表单,不提交
productSpuIds?: number[] // 仅用于表单,不提交
rules: RewardRule[]
}
// 优惠规则
export interface DiscountProductVO {
limit: number
discountPrice: number
freeDelivery: boolean
point: number
couponIds: number[]
couponCounts: number[]
export interface RewardRule {
limit?: number
discountPrice?: number
freeDelivery?: boolean
givePoint?: boolean
point?: 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 })
}
// 更新满减送活动
export const updateRewardActivity = async (data: DiscountActivityVO) => {
export const updateRewardActivity = async (data: RewardActivityVO) => {
return await request.put({ url: '/promotion/reward-activity/update', data })
}
......
......@@ -46,8 +46,3 @@ export const updateUserLevel = async (data: any) => {
export const updateUserPoint = async (data: any) => {
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'
export interface PayWalletUserReqVO {
userId: number
}
/** 钱包 VO */
export interface WalletVO {
id: number
......@@ -20,7 +21,12 @@ export const getWallet = async (params: PayWalletUserReqVO) => {
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 })
}
/** 修改会员钱包余额 */
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'
defineOptions({ name: 'CouponSelect' })
defineProps<{
multipleSelection: CouponTemplateApi.CouponTemplateVO[]
const props = defineProps<{
multipleSelection?: CouponTemplateApi.CouponTemplateVO[]
}>()
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 dialogTitle = ref('选择优惠卷') // 弹窗的标题
......@@ -209,7 +210,11 @@ const open = async () => {
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const handleSelectionChange = (val: CouponTemplateApi.CouponTemplateVO[]) => {
emit('update:multipleSelection', val)
if (props.multipleSelection) {
emit('update:multipleSelection', val)
return
}
emit('change', val)
}
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 @@
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
>
<el-form-item label="活动名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入活动名称"
class="!w-240px"
clearable
placeholder="请输入活动名称"
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="活动状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择活动状态"
clearable
class="!w-240px"
clearable
placeholder="请选择活动状态"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)"
......@@ -37,24 +37,31 @@
<el-form-item label="活动时间" prop="createTime">
<el-date-picker
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')]"
class="!w-240px"
end-placeholder="活动结束日期"
start-placeholder="活动开始日期"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<el-button
type="primary"
v-hasPermi="['product:brand:create']"
plain
type="primary"
@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-form-item>
</el-form>
......@@ -62,47 +69,47 @@
<!-- 列表 -->
<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="活动开始时间"
:formatter="dateFormatter"
align="center"
label="活动开始时间"
prop="startTime"
:formatter="dateFormatter"
/>
<el-table-column
label="活动结束时间"
:formatter="dateFormatter"
align="center"
label="活动结束时间"
prop="endTime"
:formatter="dateFormatter"
/>
<el-table-column label="状态" align="center" prop="status">
<el-table-column align="center" label="状态" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
:formatter="dateFormatter"
align="center"
label="创建时间"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column align="center" label="操作">
<template #default="scope">
<el-button
v-hasPermi="['product:brand:update']"
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['product:brand:update']"
>
编辑
</el-button>
<el-button
v-hasPermi="['product:brand:delete']"
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['product:brand:delete']"
>
删除
</el-button>
......@@ -111,9 +118,9 @@
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total"
@pagination="getList"
/>
</ContentWrap>
......@@ -168,9 +175,9 @@ const resetQuery = () => {
}
/** 添加/修改操作 */
const formRef = ref()
const formRef = ref<InstanceType<typeof RewardForm>>()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
formRef.value?.open(type, id)
}
/** 删除按钮操作 */
......
......@@ -14,7 +14,7 @@
<el-input v-model="formData.nickname" class="!w-240px" disabled />
</el-form-item>
<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 label="变动类型" prop="changeType">
<el-radio-group v-model="formData.changeType">
......@@ -32,7 +32,7 @@
/>
</el-form-item>
<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>
<template #footer>
......@@ -57,7 +57,7 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const formData = ref({
id: undefined,
nickname: undefined,
balance: '0', // TODO @puhui999:貌似有 el-input-number 的报错,看看怎么解决。应该可以
balance: '0',
changeBalance: 0,
changeType: 1
})
......@@ -108,8 +108,8 @@ const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
await UserApi.updateUserBalance({
id: formData.value.id,
await WalletApi.updateWalletBalance({
userId: formData.value.id,
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