This commit is contained in:
2025-12-09 18:41:30 +08:00
parent 82efd1886f
commit 76b93cf8b2
93 changed files with 2131 additions and 3112 deletions

View File

@@ -1,75 +0,0 @@
package com.czg.account.dto.points;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 会员积分变动记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
@Data
public class MemberPointsLogDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 用户id(shopUserId)
*/
private Long userId;
/**
* 摘要信息(如:兑换某个商品/消费多少钱/充值多少钱/新会员赠送积分等)
*/
private String content;
/**
* 订单编号
*/
private String orderNo;
/**
* 浮动类型 add-累加 subtract-扣减
*/
private String floatType;
/**
* 浮动积分(非0正负数)
*/
private Integer floatPoints;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户头像
*/
private String headImg;
/**
* 用户手机号码
*/
private String phone;
/**
* 查询开始日期 yyyy-MM-dd
*/
private String beginDate;
/**
* 查询结束日期 yyyy-MM-dd
*/
private String endDate;
}

View File

@@ -1,71 +0,0 @@
package com.czg.account.dto.points;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 获取会员可用积分
*
* @author tankaikai
* @since 2024-10-26 11:40
*/
@Data
public class OrderDeductionPointsDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 本单最多可抵扣多少积分
*/
private Integer maxUsablePoints;
/**
* 根据策略计算出的最少可以抵扣的金额
*/
private BigDecimal minDeductionAmount;
/**
* 根据策略计算出的最多可以抵扣的金额
*/
private BigDecimal maxDeductionAmount;
/**
* 下单实付抵扣门槛(实付金额不低于这个值)
*/
private BigDecimal minPaymentAmount;
/**
* 下单积分抵扣门槛(每次使用不低于这个值)
*/
private Integer minDeductionPoints;
/**
* 会员账户积分
*/
private Integer accountPoints;
/**
* 订单金额 (扣除各类折扣)
*/
private BigDecimal orderAmount;
/**
* 使用的积分数量
*/
private Integer usedPoints;
/**
* 实际抵扣的金额
*/
private BigDecimal deductionAmount;
/**
* 下单抵扣积分比例 1元=?积分
*/
private Integer equivalentPoints;
/**
* 不可抵扣原因
*/
private String unusableReason;
/**
* 是否可用 1-可用 0-不可用
*/
private Boolean usable;
}

View File

@@ -1,93 +0,0 @@
package com.czg.account.dto.points;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 积分基本设置
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
@Data
public class PointsBasicSettingDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 店铺id
*/
@NotNull(message = "店铺id不能为空", groups = InsertGroup.class)
private Long shopId;
/**
* 开启消费赠送积分 1-开启 0-关闭
*/
@NotNull(message = "开启消费赠送积分不能为空", groups = DefaultGroup.class)
private Integer enableRewards;
/**
* 赠积分适用群体 all-全部 vip-仅会员
*/
@NotNull(message = "赠积分适用群体不能为空", groups = DefaultGroup.class)
private String rewardsGroup;
/**
* 每消费xx元赠送1积分
*/
@NotNull(message = "每消费xx元赠送1积分不能为空", groups = DefaultGroup.class)
private BigDecimal consumeAmount;
/**
* 开启下单积分抵扣 1-开启 0-关闭
*/
@NotNull(message = "开启下单积分抵扣不能为空", groups = DefaultGroup.class)
private Integer enableDeduction;
/**
* 抵扣适用群体 all-全部 vip-仅会员
*/
@NotBlank(message = "抵扣适用群体不能为空", groups = DefaultGroup.class)
private String deductionGroup;
/**
* 下单实付抵扣门槛
*/
@NotNull(message = "下单实付抵扣门槛不能为空", groups = DefaultGroup.class)
@DecimalMin(value = "0", inclusive = false, message = "下单实付抵扣门槛不能小于0")
private BigDecimal minPaymentAmount;
/**
* 下单最高抵扣比例
*/
@NotNull(message = "下单最高抵扣比例不能为空", groups = DefaultGroup.class)
@DecimalMin(value = "0", inclusive = false, message = "下单最高抵扣比例不能小于等于0")
@DecimalMax(value = "100", message = "下单最高抵扣比例不能大于100")
private BigDecimal maxDeductionRatio;
/**
* 下单抵扣积分比例 1元=?积分
*/
@NotNull(message = "下单抵扣积分比例不能为空", groups = DefaultGroup.class)
private Integer equivalentPoints;
/**
* 开启积分商城
*/
@NotNull(message = "开启积分商城不能为空", groups = DefaultGroup.class)
private Integer enablePointsMall;
/**
* 浏览模式 list-列表 grid-宫格
*/
@NotBlank(message = "浏览模式不能为空", groups = DefaultGroup.class)
private String browseMode;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

View File

@@ -1,124 +0,0 @@
package com.czg.account.dto.points;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 积分兑换记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
@Data
public class PointsExchangeRecordDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 订单编号
*/
private String orderNo;
/**
* 店铺id
*/
private Long shopId;
/**
* 积分商品id
*/
private Long pointsGoodsId;
/**
* 积分商品名称
*/
private String pointsGoodsName;
/**
* 商品图片URL
*/
private String goodsImageUrl;
/**
* 领取方式 self-自取 post-邮寄
*/
private String pickupMethod;
/**
* 用户id
*/
private Long userId;
/**
* 用户昵称
*/
private String nickName;
/**
* 手机号码
*/
private String mobile;
/**
* 会员头像
*/
private String avatarUrl;
/**
* 消耗积分
*/
private Integer spendPoints;
/**
* 额外支付
*/
private BigDecimal extraPaymentAmount;
/**
* 兑换券券码
*/
private String couponCode;
/**
* 支付平台订单号
*/
private String payOrderId;
/**
* 渠道订单号(微信/支付宝订单号)
*/
private String channelTradeNo;
/**
* 支付方式 积分支付/积分+微信/积分+支付宝
*/
private String payMethod;
/**
* 支付类型 POINTS-积分 WECHAT-微信 ALIPAY-支付宝 UNIONPAY-银联云闪付
*/
private String payType;
/**
* 状态 unpaid-待支付 waiting-待自取 done-已完成 cancel-已取消
*/
private String status;
/**
* 取消/退款原因
*/
private String cancelOrRefundReason;
/**
* 取消/退款时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime cancelOrRefundTime;
/**
* 实际支付时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime payTime;
/**
* 创建时间(下单时间)
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间(核销时间)
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -1,74 +0,0 @@
package com.czg.account.entity;
import com.alibaba.fastjson2.annotation.JSONField;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 会员积分
*
* @author Tankaikai tankaikai@aliyun.com
* @since 2.0 2024-10-25
*/
@Data
@Table("tb_shop_user")
public class MemberPoints implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 会员id
*/
@Id(keyType = KeyType.Auto)
@Column(value = "id")
private Long shopUserId;
/**
* 店铺id
*/
private Long sourceShopId;
private Long mainShopId;
/**
* 会员名称
*/
@Column("nick_name")
private String nickName;
/**
* 会员头像
*/
@Column("head_img")
private String headImg;
/**
* 手机号码
*/
@Column("phone")
private String phone;
/**
* 账户积分
*/
@Column("account_points")
private Integer accountPoints;
/**
* 最近一次积分变动时间
*/
@Column("last_points_change_time")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastPointsChangeTime;
/**
* 最近一次浮动积分
*/
@Column("last_float_points")
private Integer lastFloatPoints;
/**
* 是否会员 1-是 0-否
*/
@Column("is_vip")
private Integer vip;
}

View File

@@ -1,29 +0,0 @@
package com.czg.account.enums;
/**
* 抵扣适用群体枚举
*
* @author tankaikai
* @since 2025-02-25 17:50
*/
public enum PointUserGroupEnum {
/**
* 全部用户
*/
ALL("all"),
/**
* 仅会员
*/
VIP("vip");
private String value;
PointUserGroupEnum(String value) {
this.value = value;
}
public String value() {
return this.value;
}
}

View File

@@ -1,36 +0,0 @@
package com.czg.account.enums;
/**
* 积分兑换状态枚举
*
* @author tankaikai
* @since 2025-02-25 15:37
*/
public enum PointsExchangeStatusEnum {
/**
* 待支付
*/
UNPAID("unpaid"),
/**
* 待自取
*/
WAITING("waiting"),
/**
* 已完成
*/
DONE("done"),
/**
* 已取消
*/
CANCEL("cancel");
private String value;
PointsExchangeStatusEnum(String value) {
this.value = value;
}
public String value() {
return this.value;
}
}

View File

@@ -1,50 +0,0 @@
package com.czg.account.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.List;
/**
* 积分兑换订单支付类型枚举
*
* @author tankaikai
* @since 2025-02-26 10:29
*/
@Getter
@RequiredArgsConstructor
public enum PointsOrderPayTypeEnum {
/**
* 积分
*/
POINTS("POINTS", "积分支付"),
/**
* 积分+微信
*/
WECHAT("WECHAT", "积分+微信"),
/**
* 积分+支付宝
*/
ALIPAY("ALIPAY", "积分+支付宝"),
;
private final String value;
private final String text;
public static List<String> getValues() {
return Arrays.stream(values()).map(PointsOrderPayTypeEnum::getValue).toList();
}
public static String getText(String value) {
PointsOrderPayTypeEnum item = Arrays.stream(values()).filter(obj -> value.equals(obj.getValue())).findFirst().orElse(null);
if (item != null) {
return item.getText();
}
return null;
}
}

View File

@@ -1,28 +0,0 @@
package com.czg.account.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 消费赠送积分入参
*
* @author tankaikai
* @since 2025-02-25 18:20
*/
@Data
public class ConsumeAwardPointsParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID(shopUserId)
*/
private Long shopUserId;
/**
* 订单ID
*/
private Long orderId;
}

View File

@@ -1,28 +0,0 @@
package com.czg.account.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 会员积分查询入参
*
* @author tankaikai
* @since 2025-02-25 17:18
*/
@Data
public class MemberPointsParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户昵称
*/
private String nickName;
/**
* 手机号
*/
private String phone;
}

View File

@@ -1,36 +0,0 @@
package com.czg.account.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 支付完成扣减积分入参
*
* @author tankaikai
* @since 2025-02-25 18:07
*/
@Data
public class PayedDeductPointsParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID(shopUserId)
*/
private Long shopUserId;
/**
* 消耗积分
*/
private Integer points;
/**
* 摘要信息(如:兑换某个商品/消费多少钱/充值多少钱/新会员赠送积分等)
*/
private String content;
/**
* 订单ID可为空
*/
private Long orderId;
}

View File

@@ -1,28 +0,0 @@
package com.czg.account.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 积分兑换 - 取消/退款入参
*
* @author tankaikai
* @since 2025-02-25 15:29
*/
@Data
public class PointsExchangeCfParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 取消或退款原因
*/
private String cancelOrRefundReason;
}

View File

@@ -1,44 +0,0 @@
package com.czg.account.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 兑换记录查询入侵
*
* @author tankaikai
* @since 2025-02-25 14:08
*/
@Data
public class PointsExchangeRecordParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 查询关键字
*/
private String keywords;
/**
* 查询开始日期 格式 yyyy-MM-dd
*/
private String beginDate;
/**
* 查询结束日期 格式 yyyy-MM-dd
*/
private String endDate;
/**
* 领取方式 self-自取 post-邮寄
*/
private String pickupMethod;
/**
* 状态 unpaid-待支付 waiting-待自取 done-已完成 cancel-已取消
*/
private String status;
/**
* 店铺用户id
*/
private Long shopUserId;
}

View File

@@ -1,67 +0,0 @@
package com.czg.account.param;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.InsertGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 积分订单创建入参
*
* @author tankaikai
* @since 2025-02-26 10:03
*/
@Data
public class PointsOrderCreateParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 店铺id
*/
@JSONField(serialize = false)
@NotNull(message = "店铺id不能为空", groups = InsertGroup.class)
private Long shopId;
/**
* 积分商品id
*/
@NotNull(message = "积分商品id不能为空", groups = InsertGroup.class)
private Long pointsGoodsId;
/**
* 领取方式 self-自取 post-邮寄
*/
@NotBlank(message = "领取方式不能为空", groups = InsertGroup.class)
private String pickupMethod;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = InsertGroup.class)
private Long userId;
/**
* 用户昵称
*/
@NotBlank(message = "用户昵称不能为空", groups = InsertGroup.class)
private String nickName;
/**
* 手机号码
*/
private String mobile;
/**
* 会员头像
*/
private String avatarUrl;
/**
* 积分商品名称
*/
@JSONField(serialize = false)
private String pointsGoodsName;
/**
* 商品图片URL
*/
@JSONField(serialize = false)
private String goodsImageUrl;
}

View File

@@ -1,37 +0,0 @@
package com.czg.account.param;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 积分订单支付入参
*
* @author tankaikai
* @since 2025-02-26 10:03
*/
@Data
public class PointsOrderPayParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 订单id(积分兑换记录id)
*/
@NotNull(message = "订单id不能为空", groups = DefaultGroup.class)
private Long id;
/**
* 支付类型 POINTS-积分 WECHAT-微信 ALIPAY-支付宝 UNIONPAY-银联云闪付
*/
@NotBlank(message = "支付类型不能为空", groups = DefaultGroup.class)
private String payType;
/**
* 微信openId/支付完userId
*/
@NotBlank(message = "openId不能为空", groups = DefaultGroup.class)
private String openId;
}

View File

@@ -1,22 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.points.MemberPointsLogDTO;
import com.czg.account.entity.MemberPointsLog;
import com.czg.account.vo.PointsShopListVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.util.List;
/**
* 会员积分变动记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
public interface MemberPointsLogService extends IService<MemberPointsLog> {
Page<MemberPointsLogDTO> getMemberPointsLogPage(MemberPointsLogDTO param);
List<PointsShopListVO> getList(long userId, String shopName);
}

View File

@@ -1,100 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.points.OrderDeductionPointsDTO;
import com.czg.account.entity.MemberPoints;
import com.czg.account.param.MemberPointsParam;
import com.czg.order.entity.OrderInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.math.BigDecimal;
/**
* 会员积分
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
public interface MemberPointsService extends IService<MemberPoints> {
/**
* 会员积分分页
*
* @param param 查询参数
* @return 分页结果
*/
Page<MemberPoints> getMemberPointsPage(MemberPointsParam param);
/**
* 初始化会员积分
*
* @param shopUserId 用户id
* @return 会员积分等信息
*/
MemberPoints initMemberPoints(Long shopUserId);
/**
* 获取会员积分等信息
*
* @param shopUserId 用户id
* @return 会员积分等信息
*/
MemberPoints getMemberPoints(Long shopUserId);
/**
* 根据用户id及订单金额计算可抵扣积分及可抵扣金额
*
* @param shopUserId 用户id
* @param orderAmount 订单金额
* @return 积分及金额
*/
OrderDeductionPointsDTO getMemberUsablePoints(Long shopUserId, BigDecimal orderAmount);
/**
* 根据抵扣金额计算抵扣积分
*
* @param shopUserId 用户id
* @param orderAmount 订单金额
* @param deductionAmount 抵扣金额
*/
int calcUsedPoints(Long shopUserId, BigDecimal orderAmount, BigDecimal deductionAmount);
/**
* 根据抵扣积分计算抵扣金额
*
* @param shopUserId 用户id
* @param orderAmount 订单金额
* @param points 抵扣积分
*/
BigDecimal calcDeductionAmount(Long shopUserId, BigDecimal orderAmount, int points);
/**
* 扣除积分
*
* @param shopUserId 用户id
* @param points 积分
* @param content 摘要信息(如:兑换积分商品/积分抵扣账单/消费赠送积分/新会员送积分/储值赠送积分)
* @param orderInfo 订单信息,可以为空
*/
boolean deductPoints(Long shopUserId, int points, String content, OrderInfo orderInfo);
/**
* 追加积分
*
* @param shopUserId 用户id
* @param points 积分
* @param content 摘要信息(如:兑换积分商品/积分抵扣账单/消费赠送积分/新会员送积分/储值赠送积分)
* @param orderInfo 订单信息,可以为空
* @return 成功/失败
*/
boolean addPoints(Long shopUserId, int points, String content, OrderInfo orderInfo);
/**
* 消费赠送积分
*
* @param shopUserId 用户id
* @param orderInfo 订单信息,可以为空
*/
void consumeAwardPoints(Long shopUserId, OrderInfo orderInfo);
}

View File

@@ -1,19 +0,0 @@
package com.czg.account.service;
import com.mybatisflex.core.service.IService;
import com.czg.account.entity.PointsBasicSetting;
/**
* 积分基本设置 服务层。
*
* @author ww
* @since 2025-02-20
*/
public interface PointsBasicSettingService extends IService<PointsBasicSetting> {
/**
* 初始化∫配置信息
* @param id 店铺id
*/
void initInfo(Long id);
}

View File

@@ -1,87 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.points.PointsExchangeRecordDTO;
import com.czg.account.entity.PointsExchangeRecord;
import com.czg.account.param.PointsExchangeCfParam;
import com.czg.account.param.PointsExchangeRecordParam;
import com.czg.account.param.PointsOrderCreateParam;
import com.czg.account.param.PointsOrderPayParam;
import com.czg.account.vo.PointsExchangeSummaryVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
/**
* 积分兑换记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
public interface PointsExchangeRecordService extends IService<PointsExchangeRecord> {
/**
* 获取积分兑换记录分页
*
* @param param 查询参数
* @return 分页数据
*/
Page<PointsExchangeRecordDTO> getPointsExchangeRecordPage(PointsExchangeRecordParam param);
/**
* 获取积分兑换记录详情
*
* @param id 兑换记录id
* @return 兑换记录详情
*/
PointsExchangeRecordDTO getPointsExchangeRecordById(Long id);
/**
* 核销券码
*
* @param couponCode 券码
*/
void checkout(String couponCode);
/**
* 创建兑换订单
*
* @param param 兑换入参
* @return 兑换详情
*/
PointsExchangeRecordDTO create(PointsOrderCreateParam param);
/**
* 支付兑换订单
*
* @param param 支付入参
* @return 支付结果
*/
PointsExchangeRecordDTO pay(PointsOrderPayParam param);
/**
* 取消
*
* @param param 兑换记录
*/
void cancel(PointsExchangeCfParam param);
/**
* 退款
*
* @param param 兑换记录
*/
void refund(PointsExchangeCfParam param);
/**
* 统计兑换记录
*
* @param param 查询参数
* @return 统计结果
*/
PointsExchangeSummaryVo total(PointsExchangeRecordParam param);
/**
* 自动取消
*/
void authCancel();
}

View File

@@ -1,22 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.points.PointsGoodsSettingDTO;
import com.czg.account.entity.PointsGoodsSetting;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
/**
* 积分商品设置
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
*/
public interface PointsGoodsSettingService extends IService<PointsGoodsSetting> {
/**
* 获取积分商品设置分页
*
* @param param 查询参数
* @return 分页结果
*/
Page<PointsGoodsSettingDTO> getPointsGoodsSettingPage(PointsGoodsSettingDTO param);
}

View File

@@ -8,6 +8,7 @@ import lombok.experimental.Accessors;
public class PointsShopListVO {
private String shopName;
private String logo;
private String coverImg;
private Long shopId;
private Integer accountPoints;
}

View File

@@ -0,0 +1,81 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分基本设置 实体类。
*
* @author ww
* @since 2025-12-08
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MkPointsConfigDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 店铺id
*/
private Long shopId;
/**
* 开启消费赠送积分 1-开启 0-关闭 开启后,所有用户可通过消费获得积分及可用积分抵扣支付
*/
@NotNull(message = "开启消费开关参数错误")
private Integer enableRewards;
/**
* 每消费xx元赠送1积分
*/
@NotNull(message = "消费送积分参数错误")
@DecimalMin(value = "0", inclusive = false, message = "消费送积分金额必须大于0")
private BigDecimal consumeAmount;
/**
* 下单实付抵扣门槛
*/
@NotNull(message = "抵扣门槛参数错误")
private BigDecimal minPaymentAmount;
/**
* 下单最高抵扣比例
*/
@NotNull(message = "抵扣比例参数错误")
@DecimalMin(value = "0", inclusive = false, message = "抵扣比例必须大于0")
private BigDecimal maxDeductionRatio;
/**
* 下单抵扣积分比例 1元=?积分
*/
@NotNull(message = "积分比例错误")
@DecimalMin(value = "0", inclusive = false, message = "积分比例必须大于0")
private Integer equivalentPoints;
/**
* 开启积分商城
*/
@NotNull(message = "积分商城开关参数错误")
private Integer enablePointsMall;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

View File

@@ -1,27 +1,34 @@
package com.czg.account.dto.points;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
package com.czg.market.dto;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.NonNull;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分商品设置
* 积分商品设置 实体类
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
* @author ww
* @since 2025-12-08
*/
@Data
public class PointsGoodsSettingDTO implements Serializable {
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MkPointsGoodsDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -29,74 +36,100 @@ public class PointsGoodsSettingDTO implements Serializable {
/**
* id
*/
@Null(message = "ID必须为空", groups = InsertGroup.class)
@NotNull(message = "ID不能为空", groups = UpdateGroup.class)
private Long id;
/**
* 店铺id
*/
@NotNull(message = "店铺id不能为空", groups = DefaultGroup.class)
private Long shopId;
/**
* 商品类型 physical-实物 coupon-优惠劵
* 商品类型 优惠劵 其它商品
*/
@NotBlank(message = "商品类型不能为空", groups = DefaultGroup.class)
@NotBlank(message = "商品类型不能为空")
private String goodsCategory;
/**
* 商品名称
* 优惠券id
*/
@NotBlank(message = "商品名称不能为空", groups = DefaultGroup.class)
private Long couponId;
/**
* 商品名称/优惠券名称
*/
@NotBlank(message = "名称不能为空")
private String goodsName;
/**
* 商品图片URL
*/
private String goodsImageUrl;
/**
* 所需积分
*/
@NotNull(message = "所需积分不能为空", groups = DefaultGroup.class)
@NotNull(message = "所需积分不能为空")
@Min(value = 1, message = "所需积分不能小于1")
private Integer requiredPoints;
/**
* 额外价格
*/
@NotNull(message = "额外价格不能为空", groups = DefaultGroup.class)
private BigDecimal extraPrice;
/**
* 排序(权重)数字越高显示约靠前
*/
@NotNull(message = "排序(权重)不能为空", groups = DefaultGroup.class)
private Integer sort;
/**
* 数量
*/
@NotNull(message = "数量不能为空", groups = DefaultGroup.class)
@NotNull(message = "数量不能为空")
@Min(value = 1, message = "数量不能小于1")
private Integer quantity;
/**
* 排序(权重)数字越高显示约靠前
*/
private Integer sort;
/**
* 是否上架 1- 0-
*/
@NotNull(message = "上架状态不能为空")
private Integer status;
/**
* 领取方式 店内自取系统发放
*/
private String receiveType;
/**
* 限购数量
*/
private Integer limitQuota;
/**
* 商品详情
*/
private String goodsDescription;
/**
* 累计兑换数量
*/
private Integer totalExchangeCount;
/**
* 是否上架 1- 0-
*/
@NotNull(message = "是否上架不能为空", groups = DefaultGroup.class)
private Integer status;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 逻辑删除标志 1- 0-
*/
private Integer delFlag;
}
}

View File

@@ -0,0 +1,34 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.BaseQueryParam;
import com.czg.market.entity.MkPointsGoodsRecord;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分兑换记录 实体类。
*
* @author ww
* @since 2025-12-08
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MkPointsGoodsRecordDTO extends MkPointsGoodsRecord implements Serializable {
private String headImg;
private String nickName;
private String phone;
}

View File

@@ -0,0 +1,68 @@
package com.czg.market.dto;
import com.czg.TimeQueryParam;
import com.czg.utils.CzgStrUtils;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 积分兑换记录 实体类。
*
* @author ww
* @since 2025-12-08
*/
@Data
public class MkPointsGoodsRecordQueryDTO extends TimeQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 店铺id
*/
private Long shopId;
/**
* 对应 关键词 只查 积分商品名称
*/
private String pointsGoodsName;
/**
* 商品类型 优惠劵 其它商品
*/
private String goodsCategory;
/**
* 领取方式 店内自取、系统发放
*/
private String receiveType;
/**
* 会员id
*/
private Long shopUserId;
/**
* 状态 待支付 待核销 已完成 退款中 已退款
*/
private String status;
public String getPointsGoodsName() {
return CzgStrUtils.getStrOrNull(pointsGoodsName);
}
public String getGoodsCategory() {
return CzgStrUtils.getStrOrNull(goodsCategory);
}
public String getReceiveType() {
return CzgStrUtils.getStrOrNull(receiveType);
}
public String getStatus() {
return CzgStrUtils.getStrOrNull(status);
}
}

View File

@@ -0,0 +1,77 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 会员积分账户 实体类。
*
* @author ww
* @since 2025-12-08
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MkPointsUserDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 用户Id
*/
private Long userId;
/**
* 店铺id
*/
private Long shopId;
/**
* 店铺用户id
*/
private Long shopUserId;
/**
* 头像
*/
private String headImg;
/**
* 昵称
*/
private String nickName;
/**
* 手机号
*/
private String phone;
/**
* 积分余额
*/
private Long pointBalance;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -1,30 +1,31 @@
package com.czg.account.entity;
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分基本设置 实体类
*
* @author ww
* @since 2025-02-20
* @since 2025-12-08
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_points_basic_setting")
public class PointsBasicSetting implements Serializable {
@Table("mk_points_config")
public class MkPointsConfig implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -32,34 +33,19 @@ public class PointsBasicSetting implements Serializable {
/**
* 店铺id
*/
@Id(keyType = KeyType.None)
@Id
private Long shopId;
/**
* 开启消费赠送积分 1-开启 0-关闭
* 开启消费赠送积分 1-开启 0-关闭 开启后所有用户可通过消费获得积分及可用积分抵扣支付
*/
private Integer enableRewards;
/**
* 赠积分适用群体 all-全部 vip-仅会员
*/
private String rewardsGroup;
/**
* 每消费xx元赠送1积分
*/
private BigDecimal consumeAmount;
/**
* 开启下单积分抵扣 1-开启 0-关闭
*/
private Integer enableDeduction;
/**
* 抵扣适用群体 all-全部 vip-仅会员
*/
private String deductionGroup;
/**
* 下单实付抵扣门槛
*/
@@ -80,15 +66,10 @@ public class PointsBasicSetting implements Serializable {
*/
private Integer enablePointsMall;
/**
* 浏览模式 list-列表 grid-宫格
*/
private String browseMode;
/**
* 创建时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
}

View File

@@ -1,26 +1,32 @@
package com.czg.account.entity;
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分商品设置
* 积分商品设置 实体类
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
* @author ww
* @since 2025-12-08
*/
@Data
@Table("tb_points_goods_setting")
public class PointsGoodsSetting implements Serializable {
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_points_goods")
public class MkPointsGoods implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -28,65 +34,97 @@ public class PointsGoodsSetting implements Serializable {
/**
* id
*/
@Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 商品类型 physical-实物 coupon-优惠劵
* 商品类型 优惠劵 其它商品
*/
private String goodsCategory;
/**
* 优惠券id
*/
private Long couponId;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品图片URL
*/
private String goodsImageUrl;
/**
* 所需积分
*/
private Integer requiredPoints;
/**
* 额外价格
*/
private BigDecimal extraPrice;
/**
* 排序(权重)数字越高显示约靠前
*/
private Integer sort;
/**
* 数量
*/
private Integer quantity;
/**
* 商品详情
* 排序(权重)数字越高显示约靠前
*/
private String goodsDescription;
/**
* 累计兑换数量
*/
private Integer totalExchangeCount;
private Integer sort;
/**
* 是否上架 1- 0-
*/
private Integer status;
/**
* 领取方式 店内自取系统发放
*/
private String receiveType;
/**
* 限购数量
*/
private Integer limitQuota;
/**
* 已购数量
*/
@Column(ignore = true)
private Integer boughtCount;
/**
* 商品详情
*/
private String goodsDescription;
/**
* 累计兑换数量
*/
private Integer totalExchangeCount;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 逻辑删除标志 1- 0-
*/
@Column(onInsertValue = "0")
private Integer delFlag;
}
}

View File

@@ -1,26 +1,32 @@
package com.czg.account.entity;
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积分兑换记录
* 积分兑换记录 实体类
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
* @author ww
* @since 2025-12-08
*/
@Data
@Table("tb_points_exchange_record")
public class PointsExchangeRecord implements Serializable {
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_points_goods_record")
public class MkPointsGoodsRecord implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -28,110 +34,115 @@ public class PointsExchangeRecord implements Serializable {
/**
* id
*/
@Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 订单编号
*/
private String orderNo;
/**
* 店铺id
*/
private Long shopId;
/**
* 积分商品id
*/
private Long pointsGoodsId;
/**
* 积分商品名称
*/
private String pointsGoodsName;
/**
* 商品图片URL
*/
private String goodsImageUrl;
/**
* 领取方式 self-自取 post-邮寄
* 商品类型 优惠劵 其它商品
*/
private String pickupMethod;
private String goodsCategory;
/**
* 店铺用户id
* 领取方式 店内自取系统发放
*/
private String receiveType;
/**
* 会员id
*/
private Long shopUserId;
/**
* 用户昵称
* 用户id
*/
private String nickName;
private Long userId;
/**
* 手机号码
* 数量
*/
private String mobile;
/**
* 会员头像
*/
private String avatarUrl;
private int number;
/**
* 消耗积分
*/
private Integer spendPoints;
/**
* 额外支付
*/
private BigDecimal extraPaymentAmount;
/**
* 兑换券券码
*/
private String couponCode;
/**
* 支付平台订单号
*/
private String payOrderId;
private Long payOrderId;
/**
* 渠道订单号(微信/支付宝订单号)
*/
private String channelTradeNo;
/**
* 支付方式 积分支付/积分+微信/积分+支付宝
*/
private String payMethod;
/**
* 支付类型 POINTS-积分 WECHAT-微信 ALIPAY-支付宝 UNIONPAY-银联云闪付
*/
private String payType;
/**
* 状态 unpaid-待支付 waiting-待自取 done-已完成 cancel-已取消
* 状态 待支付 待核销 已完成 退款中 已退款
*/
private String status;
/**
* 取消/退款原因
*/
private String cancelOrRefundReason;
/**
* 取消/退款时间
*/
private LocalDateTime cancelOrRefundTime;
/**
* 实际支付时间
*/
private LocalDateTime payTime;
/**
* 创建时间下单时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间核销时间
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 次数
* 核销时间
*/
@Column(ignore = true)
private Long count;
private LocalDateTime checkoutTime;
/**
* 总额
* 是否删除 0否 1是
*/
@Column(ignore = true)
private BigDecimal totalAmount;
}
private Integer isDel;
}

View File

@@ -1,24 +1,31 @@
package com.czg.account.entity;
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 会员积分变动记录
* 会员积分账户 实体类
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
* @author ww
* @since 2025-12-08
*/
@Data
@Table("tb_member_points_log")
public class MemberPointsLog implements Serializable {
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_points_user")
public class MkPointsUser implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -28,33 +35,37 @@ public class MemberPointsLog implements Serializable {
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 用户Id
*/
private Long userId;
/**
* 店铺id
*/
private Long shopId;
/**
* 店铺用户id
*/
private Long shopUserId;
/**
* 摘要信息兑换某个商品/消费多少钱/充值多少钱/新会员赠送积分等
* 积分余额
*/
private String content;
/**
* 订单编号
*/
private String orderNo;
/**
* 浮动类型 add-累加 subtract-扣减
*/
private String floatType;
/**
* 浮动积分(非0正负数)
*/
private Integer floatPoints;
private Long pointBalance;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
}
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
}

View File

@@ -1,24 +1,31 @@
package com.czg.account.vo;
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 会员积分变动记录
* 会员积分变动记录 实体类
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-25
* @author ww
* @since 2025-12-08
*/
@Data
@Table("tb_member_points_log")
public class MemberPointsLogVO implements Serializable {
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_points_user_record")
public class MkPointsUserRecord implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -28,34 +35,36 @@ public class MemberPointsLogVO implements Serializable {
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺id
* 积分用户Id
*/
private Long shopId;
/**
* 店铺用户id
*/
private Long shopUserId;
private Long mkPointsUserId;
/**
* 摘要信息兑换某个商品/消费多少钱/充值多少钱/新会员赠送积分等
*/
private String content;
/**
* 订单编号
*/
private String orderNo;
private String sourceId;
/**
* 浮动类型 add-累加 subtract-扣减
*/
private String floatType;
/**
* 浮动积分(非0正负数)
*/
private Integer floatPoints;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
private String shopName;
}

View File

@@ -0,0 +1,21 @@
package com.czg.market.enums;
/**
* 积分 枚举类
*/
public enum PointsConstant {
ADD("add", "增加"),
SUB("subtract", "扣减");
private final String value;
private final String desc;
PointsConstant(String value, String desc) {
this.value = value;
this.desc = desc;
}
public String getValue() { return value; }
}

View File

@@ -0,0 +1,19 @@
package com.czg.market.service;
import com.czg.order.entity.OrderInfo;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkPointsConfig;
/**
* 积分基本设置 服务层。
*
* @author ww
* @since 2025-12-08
*/
public interface MkPointsConfigService extends IService<MkPointsConfig> {
/**
* 订单支付成功,通过计算 给用户赠送积分
*
*/
void consumeAwardPoints(Long shopUserId, OrderInfo orderInfo);
}

View File

@@ -0,0 +1,23 @@
package com.czg.market.service;
import com.czg.account.vo.PointsExchangeSummaryVo;
import com.czg.market.dto.MkPointsGoodsRecordDTO;
import com.czg.market.dto.MkPointsGoodsRecordQueryDTO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkPointsGoodsRecord;
/**
* 积分兑换记录 服务层。
*
* @author ww
* @since 2025-12-08
*/
public interface MkPointsGoodsRecordService extends IService<MkPointsGoodsRecord> {
Page<MkPointsGoodsRecordDTO> getGoodsRecordPage(MkPointsGoodsRecordQueryDTO param);
PointsExchangeSummaryVo total(MkPointsGoodsRecordQueryDTO param);
boolean checkout(String couponCode,Long shopId);
}

View File

@@ -0,0 +1,37 @@
package com.czg.market.service;
import com.czg.BaseQueryParam;
import com.czg.market.entity.MkPointsGoodsRecord;
import com.czg.order.dto.PointGoodsRefundDTO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkPointsGoods;
/**
* 积分商品设置 服务层。
*
* @author ww
* @since 2025-12-08
*/
public interface MkPointsGoodsService extends IService<MkPointsGoods> {
Page<MkPointsGoods> getPointsGoodsPage(BaseQueryParam param, Long shopId);
Page<MkPointsGoods> getPointsGoodsPageByUser(Integer page, Integer size, Long shopId, Long userId);
Page<MkPointsGoodsRecord> getGoodsRecordPage(Integer page, Integer size, Long shopId, Long userId);
//用户申请退款
boolean applyRefund(PointGoodsRefundDTO param, Long userId);
boolean cancelRefund(PointGoodsRefundDTO param, Long userId);
/**
* 更新商品数量
*
* @param id 商品id
* @param quantity 库存数量 最终值
* @param totalExchangeCount 累计兑换数量 最终值
*/
boolean upNumberById(Long id, Integer quantity, Integer totalExchangeCount);
}

View File

@@ -0,0 +1,20 @@
package com.czg.market.service;
import com.czg.account.vo.PointsShopListVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkPointsUserRecord;
import java.util.List;
/**
* 会员积分变动记录 服务层。
*
* @author ww
* @since 2025-12-08
*/
public interface MkPointsUserRecordService extends IService<MkPointsUserRecord> {
Page<MkPointsUserRecord> pageByPointsUserId(Integer page, Integer size, Long mkPointsUserId);
}

View File

@@ -0,0 +1,51 @@
package com.czg.market.service;
import com.czg.account.vo.PointsShopListVO;
import com.czg.market.dto.MkPointsUserDTO;
import com.czg.market.enums.PointsConstant;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkPointsUser;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List;
/**
* 用户积分 服务层。
*
* @author ww
* @since 2025-12-08
*/
public interface MkPointsUserService extends IService<MkPointsUser> {
Page<MkPointsUserDTO> getPointsUserPage(String phone, Integer page, Integer size);
List<PointsShopListVO> pointsShopList(Long userId, String shopName);
/**
* 获取用户积分信息
* 返回的数据ID可能为空 不影响修改用户积分 统一接口的处理
*
* @param shopId 店铺Id
* @param shopUserId 店铺用户Id
* @param userId 会员Id
*/
MkPointsUser getPointsUser(Long shopId, Long shopUserId, Long userId);
/**
* 修改用户积分 统一接口 userId和shopUserId不能同时为空
*
* @param shopId 店铺Id 注意不要直接使用shopUser的ID
* @param floatType {@link com.czg.market.enums.PointsConstant}
* @param points 积分数 正数
* @param reason 事件
* 会员消费送积分
* 消费¥多少 送多少积分
* 积分抵扣账单
*/
Long alterPoints(Long userId, Long shopUserId, @NotNull Long shopId, @NotNull PointsConstant floatType,
@NotNull Integer points, String sourceId, @NotBlank String reason);
}

View File

@@ -0,0 +1,44 @@
package com.czg.order.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 积分商品兑换信息
*
* @author ww
*/
@Data
public class PointGoodsExchangeDTO {
/**
* 积分商品id
*/
@NotNull(message = "积分商品不能为空")
private Long pointsGoodsId;
/**
* 店铺Id
*/
@NotNull(message = "未指定店铺")
private Long shopId;
/**
* 兑换数量
*/
@NotNull(message = "兑换数量不能为空")
private int number;
/**
* 兑换价格
*/
private BigDecimal price;
/**
* 支付方式 支付方式aliPay 支付宝wechatPay 微信
*/
private String payType;
/**
* 用户openId
*/
private String openId;
private Long userId;
}

View File

@@ -0,0 +1,29 @@
package com.czg.order.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 积分商品退款
*
* @author ww
*/
@Data
public class PointGoodsRefundDTO {
/**
* 积分商品id
*/
@NotNull(message = "记录不能为空")
private Long recordId;
/**
* 订单编号
*/
@NotNull(message = "订单编号不能为空")
private String orderNo;
private String reason;
}

View File

@@ -0,0 +1,24 @@
package com.czg.order.service;
import com.czg.order.dto.PointGoodsExchangeDTO;
import com.czg.order.dto.PointGoodsRefundDTO;
import com.czg.resp.CzgResult;
import java.util.Map;
/**
* 积分商品兑换服务
*
* @author ww
*/
public interface PointsGoodPayService {
//积分商品兑换
CzgResult<Map<String, Object>> exchange(String ip, PointGoodsExchangeDTO param);
//同意退款
boolean applyRefund(PointGoodsRefundDTO param, Long shopId);
//支付回调 进行兑换内容发放
void payCallBack(Long recordId);
}