xuhy
2026-04-20 e0f93776fa55937224179ddbc054d81c2dcf373c
[feat] 优惠券&活动管理
12个文件已添加
3个文件已修改
444 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityStrategy.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityStrategyController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityUserController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpActicityStrategyMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpActicityUserMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityStrategyService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityUserService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityStrategyServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityUserServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityStrategyMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityUserMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityStrategy.java
New file
@@ -0,0 +1,74 @@
package com.xiaopeng.api.model.operation;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
 * <p>
 * 活动策略配置
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("xp_acticity_strategy")
@ApiModel(value="XpActicityStrategy对象", description="活动策略配置")
public class XpActicityStrategy extends BaseModel {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "活动id")
    private Integer actitcityId;
    @ApiModelProperty(value = "策略名称")
    private String name;
    @ApiModelProperty(value = "发放规则(1=每日循环发放,2=仅发放一次,3=使用后发放)")
    private Integer distributionRules;
    @ApiModelProperty(value = "使用后发放规则json")
    private String distributionRulesAfterUse;
    @ApiModelProperty(value = "生效规则(1=次日0点失效,2=指定有效天数,3=指定日期失效)")
    private Integer effectiveRules;
    @ApiModelProperty(value = "有效天数")
    private Integer effectiveDays;
    @ApiModelProperty(value = "有效结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "是否叠加使用(0=否,1=是)")
    private Integer stackedUsage;
    @ApiModelProperty(value = "使用时段json")
    private String usagePeriod;
    @ApiModelProperty(value = "每人限领数量")
    private Integer limitNumber;
    @ApiModelProperty(value = "发放总数")
    private Integer distributionsTotal;
    @ApiModelProperty(value = "是否自动使用(0=不开启,1=冒泡发单时自动使用)")
    private Integer startUsing;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java
New file
@@ -0,0 +1,46 @@
package com.xiaopeng.api.model.operation;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * 活动发放用户
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("xp_acticity_user")
@ApiModel(value="XpActicityUser对象", description="活动发放用户")
public class XpActicityUser extends BaseModel {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "活动id")
    private Integer actitcityId;
    @ApiModelProperty(value = "策略id")
    private Integer actitcityStrategeId;
    @ApiModelProperty(value = "用户类型(1=全部用户,2=老用户,3=新用户,4=流失用户,5=指定用户)")
    private Integer userType;
    @ApiModelProperty(value = "指定用户json数组")
    private String userList;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java
@@ -36,6 +36,9 @@
    @ApiModelProperty(value = "活动名称")
    private String acticityName;
    @ApiModelProperty(value = "活动类型 如新人活动、媒体邀约活动、日常提频等")
    private Integer activityType;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
@@ -62,4 +65,7 @@
    @ApiModelProperty(value = "图片")
    private String img;
    @ApiModelProperty(value = "富文本内容")
    private String richText;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.model.operation.XpCoupon;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.api.vo.operation.XpActivityVo;
import com.xiaopeng.common.core.constant.CacheConstants;
@@ -15,6 +16,7 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@@ -83,10 +85,37 @@
    @PostMapping("/v1/api/appUserCoupon/pageList")
    @ApiOperation(value = "活动列表",tags = {"管理后台-活动列表"},response = XpActivity.class)
    @ApiOperation(value = "活动列表",tags = {"管理后台-活动管理"},response = XpActivity.class)
    public R<PageInfo<XpActivity>> pageList(@RequestBody XpActivityPageListQuery query) {
        PageInfo<XpActivity> pageList = service.pageList(query);
        return R.ok(pageList);
    }
    @PostMapping("/v1/api/xp-coupon/add")
    @ApiOperation(value = "添加活动",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<?> add(@RequestBody XpActivity xpActivity){
        service.save(xpActivity);
        return R.ok();
    }
    @PostMapping("/v1/api/xp-coupon/update")
    @ApiOperation(value = "修改活动",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<XpActivity> updateById(@RequestBody XpActivity xpActivity){
        service.updateById(xpActivity);
        return R.ok();
    }
    @GetMapping("/v1/api/xp-coupon/update")
    @ApiOperation(value = "活动详情",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<XpActivity> queryById(@RequestBody XpActivity xpActivity){
        return R.ok(service.getById(xpActivity));
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityStrategyController.java
New file
@@ -0,0 +1,74 @@
package com.xiaopeng.operation.controller;
NEW_FILE_CODE
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * 活动策略配置 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Api(tags = "活动策略配置管理")
@RequiredArgsConstructor(onConstructor_ = @Lazy)
@RestController
@RequestMapping("/v1/api/acticity-strategy")
public class XpActicityStrategyController {
    @Resource
    private IXpActicityStrategyService service;
    @PostMapping("/listByActivityId")
    @ApiOperation(value = "根据活动ID查询策略列表", tags = {"管理后台-活动策略配置管理"})
    public R<List<XpActicityStrategy>> listByActivityId(@RequestParam Integer activityId) {
        LambdaQueryWrapper<XpActicityStrategy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(XpActicityStrategy::getActitcityId, activityId);
        queryWrapper.orderByDesc(XpActicityStrategy::getCreateTime);
        List<XpActicityStrategy> list = service.list(queryWrapper);
        return R.ok(list);
    }
    @GetMapping("/{id}")
    @ApiOperation(value = "活动策略详情", tags = {"管理后台-活动策略配置管理"})
    public R<XpActicityStrategy> queryById(@PathVariable Integer id) {
        XpActicityStrategy strategy = service.getById(id);
        return R.ok(strategy);
    }
    @PostMapping("/add")
    @ApiOperation(value = "新增活动策略", tags = {"管理后台-活动策略配置管理"})
    public R<?> add(@RequestBody List<XpActicityStrategy> xpActicityStrategies) {
        service.saveBatch(xpActicityStrategies);
        return R.ok();
    }
    @PostMapping("/update")
    @ApiOperation(value = "修改活动策略", tags = {"管理后台-活动策略配置管理"})
    public R<?> updateById(@RequestBody XpActicityStrategy xpActicityStrategy) {
        service.updateById(xpActicityStrategy);
        return R.ok();
    }
    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除活动策略", tags = {"管理后台-活动策略配置管理"})
    public R<?> deleteById(@PathVariable Integer id) {
        service.removeById(id);
        return R.ok();
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityUserController.java
New file
@@ -0,0 +1,78 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.operation.service.IXpActicityUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * 活动发放用户 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Api(tags = "活动发放用户管理")
@RequiredArgsConstructor(onConstructor_ = @Lazy)
@RestController
@RequestMapping("/v1/api/acticity-user")
public class XpActicityUserController {
    @Resource
    private IXpActicityUserService service;
    @GetMapping("/{id}")
    @ApiOperation(value = "活动发放用户详情", tags = {"管理后台-活动发放用户管理"})
    public R<XpActicityUser> queryById(@PathVariable Integer id) {
        XpActicityUser user = service.getById(id);
        return R.ok(user);
    }
    @GetMapping("/listByActicityId/{actitcityId}")
    @ApiOperation(value = "根据活动ID获取用户配置", tags = {"管理后台-活动发放用户管理"})
    public R<List<XpActicityUser>> listByActicityId(@PathVariable Integer actitcityId) {
        LambdaQueryWrapper<XpActicityUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(XpActicityUser::getActitcityId, actitcityId);
        List<XpActicityUser> list = service.list(queryWrapper);
        return R.ok(list);
    }
    @PostMapping("/add")
    @ApiOperation(value = "批量新增活动发放用户", tags = {"管理后台-活动发放用户管理"})
    public R<List<XpActicityUser>> add(@RequestBody List<XpActicityUser> xpActicityUsers) {
        service.saveBatch(xpActicityUsers);
        return R.ok(xpActicityUsers);
    }
    @PostMapping("/update")
    @ApiOperation(value = "修改活动发放用户", tags = {"管理后台-活动发放用户管理"})
    public R<?> updateById(@RequestBody XpActicityUser xpActicityUser) {
        service.updateById(xpActicityUser);
        return R.ok();
    }
    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除活动发放用户", tags = {"管理后台-活动发放用户管理"})
    public R<?> deleteById(@PathVariable Integer id) {
        service.removeById(id);
        return R.ok();
    }
    @DeleteMapping("/deleteByActicityId/{actitcityId}")
    @ApiOperation(value = "根据活动ID删除用户配置", tags = {"管理后台-活动发放用户管理"})
    public R<?> deleteByActicityId(@PathVariable Integer actitcityId) {
        LambdaQueryWrapper<XpActicityUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(XpActicityUser::getActitcityId, actitcityId);
        service.remove(queryWrapper);
        return R.ok();
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpActicityStrategyMapper.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.operation.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
/**
 * <p>
 * 活动策略配置 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
public interface XpActicityStrategyMapper extends BaseMapper<XpActicityStrategy> {
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpActicityUserMapper.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.operation.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.operation.XpActicityUser;
/**
 * <p>
 * 活动发放用户 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
public interface XpActicityUserMapper extends BaseMapper<XpActicityUser> {
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityStrategyService.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.operation.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
/**
 * <p>
 * 活动策略配置 服务类
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
public interface IXpActicityStrategyService extends IService<XpActicityStrategy> {
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityUserService.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.operation.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.operation.XpActicityUser;
/**
 * <p>
 * 活动发放用户 服务类
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
public interface IXpActicityUserService extends IService<XpActicityUser> {
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityStrategyServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.operation.mapper.XpActicityStrategyMapper;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 活动策略配置 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Service
public class XpActicityStrategyServiceImpl extends ServiceImpl<XpActicityStrategyMapper, XpActicityStrategy> implements IXpActicityStrategyService {
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityUserServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.operation.mapper.XpActicityUserMapper;
import com.xiaopeng.operation.service.IXpActicityUserService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 活动发放用户 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2026-04-20
 */
@Service
public class XpActicityUserServiceImpl extends ServiceImpl<XpActicityUserMapper, XpActicityUser> implements IXpActicityUserService {
}
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityMapper.xml
@@ -6,26 +6,17 @@
    <select id="pageList" resultType="com.xiaopeng.api.model.operation.XpActivity">
            select a.*
            from xp_acticity as a
            where a.is_deleted = 0 and a.app_user_id = #{appUserId}
            <if test="query.createTimeStart != null ">
                a.create_time >= #{query.createTimeStart}
            </if>
            <if test="query.createTimeEnd != null ">
                a.create_time &lt;= #{query.createTimeEnd}
            where a.is_deleted = 0
            <if test="query.acticity_name != null ">
                a.acticity_name >= #{acticityName}
            </if>
            <if test="query.status != null">
                and a.status = #{query.status}
            </if>
            <if test="query.couponType != null">
                and a.coupon_type = #{query.couponType}
            <if test="query.activity_type != null">
                and a.activity_type = #{query.activityType}
            </if>
            <if test="query.acticityIds != null">
                and a.activity_id in
                <foreach item="item" collection="query.acticityIds" separator="," open="(" close=")" index="">
                    #{item}
                </foreach>
            </if>
            order by a.create_time desc
            order by a.update_time desc
    </select>
</mapper>
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityStrategyMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaopeng.operation.mapper.XpActicityStrategyMapper">
</mapper>
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActicityUserMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaopeng.operation.mapper.XpActicityUserMapper">
</mapper>