拼团 订单

This commit is contained in:
2025-12-16 18:06:04 +08:00
parent 48f368c1b1
commit 01ca38079b
38 changed files with 1485 additions and 116 deletions

View File

@@ -22,7 +22,12 @@ public class GbWareQueryParamDTO extends TimeQueryParam {
/**
* 上架状态0下架 1上架
*/
private Boolean onlineStatus;
private Integer onlineStatus;
/**
* 成团人数 最小为1
*/
private Integer groupPeopleNum;
public String getWareName() {
return CzgStrUtils.getStrOrNull(wareName);

View File

@@ -3,18 +3,16 @@ package com.czg.order.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 积分商品退款
*
* @author ww
*/
@Data
public class PointGoodsRefundDTO {
public class CommonRefundDTO {
/**
* 积分商品id
* 记录 id
*/
@NotNull(message = "记录不能为空")
private Long recordId;

View File

@@ -0,0 +1,79 @@
package com.czg.order.dto;
import com.czg.BaseQueryParam;
import com.czg.utils.CzgStrUtils;
import lombok.Data;
/**
* 拼团订单查询参数
*
* @author ww
*/
@Data
public class GbOrderQueryParam extends BaseQueryParam {
private Long shopId;
/**
* 订单状态:待支付/待核销/待成团/已核销/退款中/已退款
*/
private String status;
/**
* 下单 开始时间 yyyy-MM-dd HH:mm:ss
*/
private String orderStartTime;
/**
* 下单 结束时间 yyyy-MM-dd HH:mm:ss
*/
private String orderEndTime;
/**
* 核销 开始时间 yyyy-MM-dd HH:mm:ss
*/
private String verifyStartTime;
/**
* 核销 开始时间 yyyy-MM-dd HH:mm:ss
*/
private String verifyEndTime;
private String phone;
private Long userId;
/**
* 订单号(唯一)
*/
private String orderNo;
/**
* 团单号(关联拼团订单表)
*/
private String groupOrderNo;
public String getOrderStartTime() {
return CzgStrUtils.getStrOrNull(orderStartTime);
}
public String getOrderEndTime() {
return CzgStrUtils.getStrOrNull(orderEndTime);
}
public String getVerifyStartTime() {
return CzgStrUtils.getStrOrNull(verifyStartTime);
}
public String getVerifyEndTime() {
return CzgStrUtils.getStrOrNull(verifyEndTime);
}
public String getOrderNo() {
return CzgStrUtils.getStrOrNull(orderNo);
}
public String getGroupOrderNo() {
return CzgStrUtils.getStrOrNull(groupOrderNo);
}
}

View File

@@ -0,0 +1,16 @@
package com.czg.order.dto;
import lombok.Data;
/**
* 拼团参与 DTO
*
* @author ww
*/
@Data
public class GroupJoinDTO extends LtPayOtherDTO{
/**
* 团单号 为空时 开新团
*/
private String groupOrderNo;
}

View File

@@ -0,0 +1,67 @@
package com.czg.order.dto;
import com.czg.utils.AssertUtil;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 小程序支付 其它类型
* payType 必填 支付方式aliPay 支付宝wechatPay 微信
* openId 必填
* @author ww
*/
@Data
public class LtPayOtherDTO {
/**
* 积分商品id/团购商品id
*/
@NotNull(message = "需要购买的商品不能为空")
private Long paramId;
/**
* 店铺Id
*/
@NotNull(message = "未指定店铺")
private Long shopId;
/**
* 兑换数量
*/
@NotNull(message = "兑换数量不能为空")
private int number;
/**
* 支付方式 支付方式aliPay 支付宝wechatPay 微信
*/
private String payType;
/**
* 用户openId
*/
private String openId;
/**
* 用户Id 对应 用户表 userID
*/
private Long userId;
/**
* 用户IP 后端填充
*/
private String ip;
/**
* 兑换价格 后端自己计算填充
*/
private BigDecimal price;
/**
* 对应的记录Id 支付回调向该内容进行回填
* 积分商品为 mk_points_goods_record 主键id
* 团购商品为 gb_order_detail 主键id
*/
private Long recordId;
public void checkPayInfo(){
AssertUtil.isBlank(payType, "支付方式不能为空");
AssertUtil.isBlank(openId, "openId 不能为空");
AssertUtil.isNull(userId, "用户Id 不能为空");
}
}

View File

@@ -11,34 +11,10 @@ import java.math.BigDecimal;
* @author ww
*/
@Data
public class PointGoodsExchangeDTO {
public class PointGoodsExchangeDTO extends LtPayOtherDTO{
/**
* 积分商品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,108 @@
package com.czg.order.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 ww
* @since 2025-12-16
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("gb_order")
public class GbOrder implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 团单号(唯一)
*/
private String groupOrderNo;
/**
* 商品ID关联gb_ware表
*/
private Long wareId;
/**
* 商品信息
(商品名称,商品描述,商品图片,商品详情图片)
*/
private String wareJson;
/**
* 商品原价
*/
private BigDecimal wareOriginalPrice;
/**
* 商品拼团价
*/
private BigDecimal wareGroupPrice;
/**
* 要求成团人数
*/
private Integer groupPeopleNum;
/**
* 现有人数初始为1即开团人
*/
private Integer currentPeopleNum;
/**
* 拼团结束时间(超时未成团则失败)
*/
private LocalDateTime groupEndTime;
/**
* 创建时间/成团时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* ing 进行中 success 成功 fail 失败
*/
private String status;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 取消原因(默认空,取消拼团时填充)如:商家下架
*/
private String cancelReason;
}

View File

@@ -0,0 +1,120 @@
package com.czg.order.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 ww
* @since 2025-12-16
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("gb_order_detail")
public class GbOrderDetail implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 商品ID
*/
private Long wareId;
/**
* 团单号(关联拼团订单表)
*/
private String groupOrderNo;
/**
* 用户ID下单用户
*/
private Long userId;
/**
* 订单号(唯一)
*/
private String orderNo;
/**
* 支付单号
*/
private Long payOrderId;
/**
* 支付金额(单位:元)
*/
private BigDecimal payAmount;
/**
* 支付时间未支付则为NULL
*/
private LocalDateTime payTime;
/**
* 订单状态:待支付/待核销/待成团/已核销/退款中/已退款
*/
private String status;
/**
* 核销码(唯一,核销时使用)
*/
private String verifyCode;
/**
* 核销时间未核销则为NULL
*/
private LocalDateTime verifyTime;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 退款时间/取消时间
*/
private LocalDateTime cancelTime;
/**
* 取消原因(默认空,取消/退款时填充)
*/
private String cancelReason;
/**
* 删除标记 0-未删 1-已删
*/
private Integer isDel;
}

View File

@@ -59,6 +59,7 @@ public class OrderPayment implements Serializable {
/**
* 支付方式order,refund, memberIn,memberRefund, free
* {@link com.czg.order.enums.PaymentPayTypeEnum}
*/
private String payType;

View File

@@ -0,0 +1,35 @@
package com.czg.order.enums;
import lombok.Getter;
/**
* 支付类型枚举
* tb_order_payment
*
* @author ww
*/
@Getter
public enum PaymentPayTypeEnum {
ORDER("order", "订单支付"),
FREE("free", "霸王餐"),
MEMBER_IN("memberIn", "会员充值"),
MEMBER_PAY("memberPay", "会员购买开通"),
DISTRIBUTION("distribution", "分销员购买开通"),
DISTRIBUTION_RECHARGE("distributionRecharge", "商家运营余额充值"),
POINT("point", "积分商品购买"),
WARE("ware", "拼团商品"),
REFUND("refund", "订单退款"),
MEMBER_REFUND("memberRefund", "会员充值的退款"),
;
private final String value;
private final String msg;
PaymentPayTypeEnum(String value, String msg) {
this.value = value;
this.msg = msg;
}
}

View File

@@ -0,0 +1,14 @@
package com.czg.order.service;
import com.mybatisflex.core.service.IService;
import com.czg.order.entity.GbOrderDetail;
/**
* 拼团订单详情表 服务层。
*
* @author ww
* @since 2025-12-16
*/
public interface GbOrderDetailService extends IService<GbOrderDetail> {
}

View File

@@ -0,0 +1,50 @@
package com.czg.order.service;
import com.czg.order.dto.CommonRefundDTO;
import com.czg.order.dto.GbOrderQueryParam;
import com.czg.order.dto.GroupJoinDTO;
import com.czg.order.entity.GbOrder;
import com.czg.order.vo.GbOrderDetailVO;
import com.czg.order.vo.GbWareVO;
import com.czg.resp.CzgResult;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.util.Map;
/**
* 拼团订单表 服务层。
*
* @author ww
* @since 2025-12-16
*/
public interface GbOrderService extends IService<GbOrder> {
//列表 详细列表 detail的
Page<GbOrderDetailVO> getGbOrderPage(GbOrderQueryParam param);
//拼团订单详情
GbOrderDetailVO getGoodsRecordDetail(Long shopId, Long detailId);
//商品详情
GbWareVO getWareDetail(Long shopId, Long wareId);
//成团/参团 支付
CzgResult<Map<String, Object>> groupJoin(GroupJoinDTO param);
//核销
boolean checkout(String verifyCode, Long shopId);
//支付回调 处理成团人数, 如果没团则创团
void payCallBack(Long recordId, Long payOrderId);
//用户申请退款
boolean applyRefund(CommonRefundDTO param, Long userId);
//取消退款
boolean cancelRefund(CommonRefundDTO param, Long userId, Long shopId);
//退款 同意退款/任务过期 自动退款
boolean agreeRefund(CommonRefundDTO param, Long shopId);
}

View File

@@ -1,7 +1,7 @@
package com.czg.order.service;
import com.czg.order.dto.PointGoodsExchangeDTO;
import com.czg.order.dto.PointGoodsRefundDTO;
import com.czg.order.dto.CommonRefundDTO;
import com.czg.order.dto.LtPayOtherDTO;
import com.czg.resp.CzgResult;
import java.util.Map;
@@ -14,16 +14,16 @@ import java.util.Map;
public interface PointsGoodPayService {
//积分商品兑换
CzgResult<Map<String, Object>> exchange(String ip, PointGoodsExchangeDTO param);
CzgResult<Map<String, Object>> exchange(LtPayOtherDTO param);
//用户申请退款
boolean applyRefund(PointGoodsRefundDTO param, Long userId);
boolean applyRefund(CommonRefundDTO param, Long userId);
//取消退款
boolean cancelRefund(PointGoodsRefundDTO param, Long userId, Long shopId);
boolean cancelRefund(CommonRefundDTO param, Long userId, Long shopId);
//同意退款
boolean agreeRefund(PointGoodsRefundDTO param, Long shopId);
boolean agreeRefund(CommonRefundDTO param, Long shopId);
//支付回调 进行兑换内容发放
void payCallBack(Long recordId, Long payOrderId);

View File

@@ -0,0 +1,41 @@
package com.czg.order.vo;
import com.czg.order.entity.GbOrderDetail;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 拼团订单详情VO
*
* @author ww
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class GbOrderDetailVO extends GbOrderDetail {
/**
* 商品信息
*/
private String wareJson;
/**
* 店铺名称
*/
private String shopName;
/**
* 店铺地址
*/
private String shopAddress;
/**
* 用户名称
*/
private String userName;
/**
* 用户手机号
*/
private String userPhone;
private List<GbOrderUserVO> users;
}

View File

@@ -0,0 +1,19 @@
package com.czg.order.vo;
import lombok.Data;
@Data
public class GbOrderUserVO {
/**
* 用户头像
*/
private String userAvatar;
/**
* 用户手机号
*/
private String userPhone;
/**
* 用户名称
*/
private String userName;
}

View File

@@ -0,0 +1,40 @@
package com.czg.order.vo;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author ww
*/
@Data
public class GbWareOrderVO {
/**
* 用户头像
*/
private String avatar;
/**
* 用户昵称
*/
private String nickName;
/**
* 团单id
*/
private Long groupOrderId;
/**
* 团单编号
*/
private String groupOrderNo;
/**
* 现有人数初始为1即开团人
*/
private Integer currentPeopleNum;
/**
* 拼团结束时间(超时未成团则失败)
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime groupEndTime;
}

View File

@@ -0,0 +1,27 @@
package com.czg.order.vo;
import com.czg.market.entity.GbWare;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @author ww
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GbWareVO extends GbWare {
/**
* 可核销门店 店铺名称
*/
private String shopName;
/**
* 可核销门店 店铺地址
*/
private String shopAddress;
/**
* 正在进行的 拼团单
*/
private List<GbWareOrderVO> gbOrderList;
}