套餐推广管理端接口

This commit is contained in:
gong
2025-12-18 15:17:05 +08:00
parent a1ad1088bb
commit 6256d72a13
24 changed files with 1331 additions and 0 deletions

View File

@@ -123,6 +123,10 @@ public class ShopConfig implements Serializable {
* 拼团开关 1-是 0-否
*/
private Integer isGroupBuy;
/**
* 套餐推广 开关
*/
private Integer isPackagePromotion;
private String dingAppKey;

View File

@@ -0,0 +1,49 @@
package com.czg.constants;
/**
* @author yjjie
* @date 2025/12/18 11:37
*/
public interface PpPackageConstants {
/**
* 订单状态
* ing进行中, wait_verify 待核销finish 已核销refunding 退款中refund 已退款cancel 已取消timeout 超时
*/
class OrderStatus {
/**
* 进行中
*/
public static final String PROCESSING = "ing";
/**
* 待核销
*/
public static final String WAIT_VERIFY = "wait_verify";
/**
* 已核销
*/
public static final String FINISH = "finish";
/**
* 退款中
*/
public static final String REFUNDING = "refunding";
/**
* 已退款
*/
public static final String REFUND = "refund";
/**
* 已取消
*/
public static final String CANCEL = "cancel";
/**
* 超时
*/
public static final String TIMEOUT = "timeout";
}
}

View File

@@ -0,0 +1,46 @@
package com.czg.constants;
/**
* 系统常量
* @author yjjie
* @date 2025/12/18 13:45
*/
public interface SystemConstants {
/**
* 状态 1 0
* 是否 1 0
*/
class OneZero {
/**
* 是否:是
* 状态:允许,开启
*/
public static final Integer ONE = 1;
/**
* 是否:否
* 状态:进制,关闭
*/
public static final Integer ZERO = 0;
}
/**
* 分店类型
*/
class SubShopType {
/**
* 全部
*/
public static final String ALL = "all";
/**
* 仅本店
*/
public static final String ONLY = "only";
/**
* 自定义
*/
public static final String CUSTOM = "custom";
}
}

View File

@@ -0,0 +1,51 @@
package com.czg.market.dto;
import java.io.Serializable;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 套餐推广助力记录 实体类。
*
* @author gyj
* @since 2025-12-18
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PpHelpRecordDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
private Long id;
/**
* 订单 Id
*/
private Long orderId;
/**
* 用户 Id
*/
private Long userId;
/**
* 用户头像
*/
private String userName;
/**
* 用户头像
*/
private String userAvator;
}

View File

@@ -0,0 +1,114 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.math.BigDecimal;
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 gyj
* @since 2025-12-18
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PpPackageOrderDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
private Long id;
/**
* 店铺 Id
*/
private Long shopId;
/**
* 订单编号
*/
private String orderNo;
/**
* 套餐 Id
*/
private Long packageId;
/**
* 用户 Id
*/
private Long userId;
/**
* 分享人数
*/
private Integer shareNum;
/**
* 最终支付金额
*/
private BigDecimal finalPrice;
/**
* 订单状态ing进行中, wait_verify 待核销finish 已核销refunding 退款中refund 已退款cancel 已取消timeout 超时
*/
private String status;
/**
* 支付时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime payTime;
/**
* 支付订单 Id
*/
private Long payOrderId;
/**
* 核销码
*/
private String verifyCode;
/**
* 核销时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime verifyTime;
/**
* 取消时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime cancelTime;
/**
* 取消原因
*/
private String cancelReason;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,57 @@
package com.czg.market.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 套餐推广助力记录 实体类。
*
* @author gyj
* @since 2025-12-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("pp_help_record")
public class PpHelpRecord implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 订单 Id
*/
private Long orderId;
/**
* 用户 Id
*/
private Long userId;
/**
* 用户头像
*/
private String userName;
/**
* 用户头像
*/
private String userAvator;
}

View File

@@ -0,0 +1,138 @@
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 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 gyj
* @since 2025-12-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("pp_package")
public class PpPackage implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* only-仅本店 all全部 /custom 指定
* {@link com.czg.constants.SystemConstants.SubShopType}
*/
private String useShopType;
/**
* 可用门店指定门店时存储门店ID逗号分隔
*/
private String useShops;
/**
* 套餐名称
*/
private String packageName;
/**
* 套餐描述
*/
private String description;
/**
* 套餐图片
*/
private String images;
/**
* 套餐原价
*/
private BigDecimal originPrice;
/**
* 销售价格
*/
private BigDecimal price;
/**
* 套餐内容 json
*/
private String packageContent;
/**
* 可用时段08:00~21:30
*/
private String useTimes;
/**
* 可用周期: [周一,周二]
*/
private String useWeeks;
/**
* 其他使用描述
*/
private String otherDesc;
/**
* 阶梯优惠
*/
private String tieredDiscount;
/**
* 分享期限(小时)
*/
private Integer expireHours;
/**
* 上线状态
*/
private Integer onlineStatus;
/**
* 商品详情图片
*/
private String detailImages;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 0否1是
*/
private Integer isDel;
}

View File

@@ -0,0 +1,120 @@
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 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;
import lombok.experimental.Accessors;
/**
* 套餐推广订单 实体类。
*
* @author gyj
* @since 2025-12-18
*/
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Table("pp_package_order")
public class PpPackageOrder implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺 Id
*/
private Long shopId;
/**
* 订单编号
*/
private String orderNo;
/**
* 套餐 Id
*/
private Long packageId;
/**
* 用户 Id
*/
private Long userId;
/**
* 分享人数
*/
private Integer shareNum;
/**
* 最终支付金额
*/
private BigDecimal finalPrice;
/**
* 订单状态ing进行中, wait_verify 待核销finish 已核销refunding 退款中refund 已退款cancel 已取消timeout 超时
* {@link com.czg.constants.PpPackageConstants.OrderStatus}
*/
private String status;
/**
* 支付时间
*/
private LocalDateTime payTime;
/**
* 支付订单 Id
*/
private Long payOrderId;
/**
* 核销码
*/
private String verifyCode;
/**
* 核销时间
*/
private LocalDateTime verifyTime;
/**
* 取消时间
*/
private LocalDateTime cancelTime;
/**
* 取消原因
*/
private String cancelReason;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,14 @@
package com.czg.market.service;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.PpHelpRecord;
/**
* 套餐推广助力记录 服务层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpHelpRecordService extends IService<PpHelpRecord> {
}

View File

@@ -0,0 +1,28 @@
package com.czg.market.service;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.PpPackageOrder;
/**
* 套餐推广订单 服务层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpPackageOrderService extends IService<PpPackageOrder> {
/**
* 创建推广订单
*/
Long createPackageOrder(Long packageId);
/**
* 获取进行中的套餐推广订单数量
*/
long getProgressingPackageOrderCount(Long packageId);
/**
* 将所有正在进行的推广订单设置为取消
*/
void cancelProgressingPackageOrder(Long shopId, Long packageId);
}

View File

@@ -0,0 +1,51 @@
package com.czg.market.service;
import com.czg.market.vo.PpPackagePageReqVo;
import com.czg.market.vo.PpPackageVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.PpPackage;
/**
* 套餐推广套餐 服务层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpPackageService extends IService<PpPackage> {
/**
* 获取套餐推广开关
*/
Integer getPackagePromotionSwitch();
/**
* 更新套餐开关
*/
boolean updatePackagePromotionSwitch(Integer status);
/**
* 插入套餐
*/
void insertPackage(PpPackageVO packageVO);
/**
* 更新套餐
*/
void updatePackage(PpPackageVO packageVO);
/**
* 删除套餐
*/
long deletePackage(Long id);
/**
* 确认删除套餐
*/
void sureDeletePackage(Long id);
/**
* 获取套餐分页
*/
Page<PpPackageVO> getPackagePage(PpPackagePageReqVo reqVo, boolean isAdmin);
}

View File

@@ -0,0 +1,23 @@
package com.czg.market.vo;
import com.czg.BaseQueryParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author yjjie
* @date 2025/12/18 11:25
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class PpPackagePageReqVo extends BaseQueryParam {
/**
* 上架状态
*/
private Integer onlineStatus;
/**
* 套餐名称
*/
private String packageName;
}

View File

@@ -0,0 +1,176 @@
package com.czg.market.vo;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author yjjie
* @date 2025/12/18 10:22
*/
@Data
public class PpPackageVO {
@Data
public static class TieredDiscount {
/**
* 人数
*/
private Integer peopleNum;
/**
* 价格
*/
private BigDecimal price;
}
@Data
public static class PackageContent {
/**
* 名称
*/
private String name;
/**
* 选择数量
*/
private Integer num;
/**
* 商品内容
*/
private List<PackageProduct> packageProducts;
}
@Data
public static class PackageProduct {
/**
* 名称
*/
private String name;
/**
* 价格
*/
private BigDecimal price;
/**
* 数量
*/
private Integer num;
}
/**
* 自增主键
*/
@NotNull(message = "id不能为空", groups = {UpdateGroup.class})
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 可用门店only-仅本店 all全部 /custom 指定
* {@link com.czg.constants.SystemConstants.SubShopType}
*/
@NotBlank(message = "可用门店不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private String useShopType;
/**
* 可用门店指定门店时存储门店ID逗号分隔
*/
private String useShops;
/**
* 套餐名称
*/
@NotBlank(message = "套餐名称不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private String packageName;
/**
* 套餐描述
*/
private String description;
/**
* 套餐图片
*/
@NotNull(message = "套餐图片不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private List<String> images;
/**
* 套餐原价
*/
@NotNull(message = "套餐原价不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private BigDecimal originPrice;
/**
* 销售价格
*/
@NotNull(message = "销售价格不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private BigDecimal price;
/**
* 套餐内容 json
*/
@NotNull(message = "套餐内容不能为空", groups = {UpdateGroup.class, InsertGroup.class})
private List<PackageContent> packageContent;
/**
* 可用时段08:00~21:30
*/
private String useTimes;
/**
* 可用周期: [周一,周二]
*/
private List<String> useWeeks;
/**
* 其他使用描述
*/
private String otherDesc;
/**
* 阶梯优惠
*/
private List<TieredDiscount> tieredDiscount;
/**
* 分享期限(小时)
*/
private Integer expireHours;
/**
* 上线状态
*/
private Integer onlineStatus = 1;
/**
* 商品详情图片
*/
private String detailImages;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -21,6 +21,7 @@ public enum OrderNoPrefixEnum {
GB("GB", "拼团-团单号"),
GBO("GBO", "拼团-订单号"),
REG("REG", "拼团-退单"),
PPO("PPO", "套餐推广订单号"),
;
private final String value;