1. 订单服务,修改为交易服务

2. 迁移订单创建 rpc 接口
This commit is contained in:
YunaiV
2020-11-26 18:40:07 +08:00
parent 8f8f4d72b5
commit db4ee1ed7e
122 changed files with 1499 additions and 4067 deletions

View File

@@ -0,0 +1,51 @@
package cn.iocoder.mall.tradeservice.enums;
import cn.iocoder.common.framework.exception.ErrorCode;
/**
* 订单错误码
* <p>
* 错误码区间 [1-008-000-000 ~ 1-008-000-000]
*
* @author Sin
* @time 2019-03-23 11:23
*/
public interface OrderErrorCodeConstants {
// order
ErrorCode ORDER_NOT_EXISTENT = new ErrorCode(1008000000, "获取订单不存在!");
ErrorCode ORDER_GET_SKU_FAIL = new ErrorCode(1008000001, "获取商品失败!)");
ErrorCode ORDER_GET_SKU_NOT_EXISTENT = new ErrorCode(1008000002, "获取的商品不存在!");
ErrorCode ORDER_PAY_AMOUNT_NOT_NEGATIVE = new ErrorCode(1008000003, "支付金额不能为负数!");
ErrorCode ORDER_STATUS_NOT_CANCEL = new ErrorCode(1008000004, "订单状态不能取消!)");
ErrorCode ORDER_DELIVERY_INCORRECT_DATA = new ErrorCode(1008000005, "订单发货数据不正确!");
ErrorCode ORDER_INSUFFICIENT_INVENTORY = new ErrorCode(1008000006, "库存不足!");
ErrorCode ORDER_GOODS_AMOUNT_INCORRECT = new ErrorCode(1008000007, "商品金额非法!");
ErrorCode ORDER_GET_GOODS_INFO_INCORRECT = new ErrorCode(1008000008, "获取额商品信息不正确!");
ErrorCode ORDER_GET_USER_ADDRESS_FAIL = new ErrorCode(1008000009, "获取用户地址失败!");
ErrorCode ORDER_GET_PAY_FAIL = new ErrorCode(1008000010, "调用pay失败!");
ErrorCode ORDER_NOT_USER_ORDER = new ErrorCode(1008000011, "不是该用户的订单!");
ErrorCode ORDER_UNABLE_CONFIRM_ORDER = new ErrorCode(1008000012, "状态不对不能确认订单!");
ErrorCode ORDER_CREATE_CART_IS_EMPTY = new ErrorCode(1008000013, "购物车无选中的商品,无法创建订单");
ErrorCode ORDER_STATUS_NOT_WAITING_PAYMENT = new ErrorCode(1008000014, "订单不处于等待支付状态");
ErrorCode ORDER_PAY_AMOUNT_ERROR = new ErrorCode(1008000015, "订单金额不正确");
// order item
ErrorCode ORDER_ITEM_ONLY_ONE = new ErrorCode(1008000200, "订单Item只有一个!");
ErrorCode ORDER_ITEM_SOME_NOT_EXISTS = new ErrorCode(1008000201, "有不存在的商品!");
// 订单退货
ErrorCode ORDER_RETURN_NO_RETURN_APPLY = new ErrorCode(1008000400, "未退货申请");
ErrorCode ORDER_RETURN_NOT_EXISTENT = new ErrorCode(1008000401, "退货订单不存在");
ErrorCode ORDER_RETURN_REFUND_FAILED = new ErrorCode(1008000402, "退款失败");
// ========== 购物车 ==========
ErrorCode CARD_ITEM_NOT_FOUND = new ErrorCode(1008003000, "购物车项不存在");
ErrorCode CARD_ITEM_SKU_NOT_FOUND = new ErrorCode(1008003001, "商品不存在");
ErrorCode CARD_ITEM_SKU_QUANTITY_NOT_ENOUGH = new ErrorCode(1008003002, "商品库存不足");
// 工具类服务 1008004000
ErrorCode DICT_SERVER_INVOKING_FAIL = new ErrorCode(1008004000, "字典服务调用失败!");
ErrorCode ORDER_LOGISTICS_INVOKING_FAIL = new ErrorCode(1008004001, "订单物流调用失败!");
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.mall.tradeservice.enums.aftersale;
import lombok.Getter;
/**
* 售后订单的状态枚举
*
* 整体流程,见 https://www.processon.com/view/link/5fbdf47f07912946156305d7
*
* 1. 在退款的情况下,需要 1 个来回
* 2. 在退货退款的情况下,需要 2 个来回,额外增加一个买家退货的过程
* 3. 在换货的情况下,需要 3 个来回,额外增加一个买家退货 + 卖家发货的过程
*/
@Getter
public enum AfterSaleOrderStatusEnum {
WAIT_SELLER_AGREE(10, "售后申请待商家处理"),
WAIT_BUYER_RETURN_GOODS(20, "商家同意售后申请,待买家处理"),
SELLER_REFUSE_BUYER(30, "商家不同意售后申请,待买家处理"),
WAIT_SELLER_CONFIRM_GOODS(40, "买家已退货,待商家确认收货"),
WAIT_BUYER_CONFIRM_GOODS(50, "商家已发货,待买家确认收货"),
SELLER_REFUSE_RETURN_GOODS(60, "商家拒绝收货,待买家处理"),
SUCCESS(70, "售后成功"),
CLOSED(80, "售后失败"),
;
/**
* 类型
*/
private final Integer status;
/**
* 描述
*/
private final String desc;
AfterSaleOrderStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
}

View File

@@ -0,0 +1,28 @@
package cn.iocoder.mall.tradeservice.enums.aftersale;
import lombok.Getter;
/**
* 售后单的类型枚举
*/
@Getter
public enum AfterSaleTypeEnum {
IN_SALE(10, "售中退款"),
AFTER_SALE(20, "售后退款");
/**
* 类型
*/
private final Integer type;
/**
* 描述
*/
private final String desc;
AfterSaleTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.mall.tradeservice.enums.aftersale;
import lombok.Getter;
/**
* 售后单的方式枚举
*/
@Getter
public enum AfterSaleWayEnum {
REFUND(10, "退款"),
RETURN_AND_REFUND(20, "退货退款"),
EXCHANGE(30, "换货");
/**
* 方式
*/
private final Integer way;
/**
* 描述
*/
private final String desc;
AfterSaleWayEnum(Integer way, String desc) {
this.way = way;
this.desc = desc;
}
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.mall.tradeservice.enums.logistics;
import lombok.Getter;
/**
* 物流的配送类型
*/
@Getter
public enum LogisticsDeliveryTypeEnum {
/**
* 无需快递
*/
NULL(0),
/**
* 传统快递
*/
EXPRESS(1);
private final Integer deliveryType;
LogisticsDeliveryTypeEnum(Integer deliveryType) {
this.deliveryType = deliveryType;
}
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.mall.tradeservice.enums.order;
import lombok.Getter;
/**
* 交易订单的售后状态的枚举
*/
@Getter
public enum TradeOrderAfterSaleStatusEnum {
NULL(0, ""),
IN_PROCESS(10, "售后中"),
END(10, "售后结束");
/**
* 状态
*/
private final Integer status;
/**
* 描述
*/
private final String desc;
TradeOrderAfterSaleStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
}

View File

@@ -0,0 +1,35 @@
package cn.iocoder.mall.tradeservice.enums.order;
import lombok.Getter;
/**
* 交易订单 - 状态蜜桔
*
* @author Sin
* @time 2019-03-16 14:06
*/
@Getter
public enum TradeOrderStatusEnum {
WAITING_PAYMENT(10, "等待付款"),
WAIT_SHIPMENT(20, "等待发货"),
ALREADY_SHIPMENT(30, "已发货"),
COMPLETED(40, "已完成"),
CLOSED(50, "已关闭");
/**
* 状态值
*/
private final Integer value;
/**
* 状态名
*/
private final String name;
TradeOrderStatusEnum(int value, String name) {
this.value = value;
this.name = name;
}
}

View File

@@ -0,0 +1,61 @@
package cn.iocoder.mall.tradeservice.rpc.cart;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.tradeservice.rpc.cart.dto.*;
import java.util.List;
/**
* 购物车 Rpc 接口
*/
public interface CartRpc {
/**
* 添加商品到购物车
*
* @param addReqDTO 添加商品信息
* @return 成功
*/
CommonResult<Boolean> addCartItem(CartItemAddReqDTO addReqDTO);
/**
* 更新购物车商品数量
*
* @param updateQuantityReqDTO 更新商品数量 DTO
* @return 成功
*/
CommonResult<Boolean> updateCartItemQuantity(CartItemUpdateQuantityReqDTO updateQuantityReqDTO);
/**
* 更新购物车商品是否选中
*
* @param updateSelectedReqDTO 更新商品是否选中 DTO
* @return 成功
*/
CommonResult<Boolean> updateCartItemSelected(CartItemUpdateSelectedReqDTO updateSelectedReqDTO);
/**
* 删除购物车商品列表
*
* @param deleteListReqDTO 删除商品列表 DTO
* @return 成功
*/
CommonResult<Boolean> deleteCartItems(CartItemDeleteListReqDTO deleteListReqDTO);
/**
* 查询用户在购物车中的商品数量
*
* @param userId 用户编号
* @return 商品数量
*/
CommonResult<Integer> sumCartItemQuantity(Integer userId);
/**
* 查询用户在购物车种的商品列表
*
* @param listReqDTO 查询条件 DTO
* @return 购物车中商品列表信息
*/
CommonResult<List<CartItemRespDTO>> listCartItems(CartItemListReqDTO listReqDTO);
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 购物车添加购物项 Request DTO
*/
@Data
@Accessors(chain = true)
public class CartItemAddReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 商品 SKU 编号
*/
@NotNull(message = "商品 SKU 编号不能为空")
private Integer skuId;
/**
* 数量
*/
@NotNull(message = "数量不能为空")
@Min(message = "数量必须大于 0", value = 1L)
private Integer quantity;
}

View File

@@ -0,0 +1,28 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 购物车删除商品列表 Request DTO
*/
@Data
@Accessors(chain = true)
public class CartItemDeleteListReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 商品 SKU 编号列表
*/
@NotNull(message = "商品 SKU 编号列表不能为空")
private List<Integer> skuIds;
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 购物车的商品信息查询 BO
*/
@Data
@Accessors(chain = true)
public class CartItemListReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 是否选中
*/
private Boolean selected;
}

View File

@@ -0,0 +1,67 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 购物车的商品信息 Response DTO
*/
@Data
@Accessors(chain = true)
public class CartItemRespDTO implements Serializable {
// ========= 基础字段 BEGIN =========
/**
* 编号,唯一自增。
*/
private Integer id;
/**
* 是否选中
*/
private Boolean selected;
// ========= 基础字段 END =========
// ========= 买家信息 BEGIN =========
/**
* 用户编号
*/
private Integer userId;
// ========= 买家信息 END =========
// ========= 商品信息 BEGIN =========
/**
* 商品 SPU 编号
*/
private Integer spuId;
/**
* 商品 SKU 编号
*/
private Integer skuId;
/**
* 商品购买数量
*/
private Integer quantity;
// ========= 商品信息 END =========
// ========= 优惠信息 BEGIN =========
// /**
// * 商品营销活动编号
// */
// private Integer activityId;
// /**
// * 商品营销活动类型
// */
// private Integer activityType;
// ========= 优惠信息 END =========
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 购物车更新数量 Request DTO
*/
@Data
@Accessors(chain = true)
public class CartItemUpdateQuantityReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 商品 SKU 编号
*/
@NotNull(message = "商品 SKU 编号不能为空")
private Integer skuId;
/**
* 数量
*/
@NotNull(message = "数量不能为空")
@Min(message = "数量必须大于 0", value = 1L)
private Integer quantity;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.mall.tradeservice.rpc.cart.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Collection;
/**
* 购物车更新是否选中 Request DTO
*/
@Data
@Accessors(chain = true)
public class CartItemUpdateSelectedReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 商品 SKU 编号列表
*/
@NotNull(message = "商品 SKU 编号列表不能为空")
private Collection<Integer> skuIds;
/**
* 是否选中
*/
@NotNull(message = "是否选中不能为空")
private Boolean selected;
}

View File

@@ -0,0 +1,19 @@
package cn.iocoder.mall.tradeservice.rpc.order;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderCreateReqDTO;
/**
* 交易订单 Rpc 接口
*/
public interface TradeOrderRpc {
/**
* 创建交易订单
*
* @param createReqDTO 订单信息
* @return 订单编号
*/
CommonResult<Integer> createTradeOrder(TradeOrderCreateReqDTO createReqDTO);
}

View File

@@ -0,0 +1,69 @@
package cn.iocoder.mall.tradeservice.rpc.order.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 交易订单创建 Request DTO
*
* @author Sin
* @time 2019-03-16 14:42
*/
@Data
@Accessors(chain = true)
public class TradeOrderCreateReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 用户 IP
*/
@NotNull(message = "用户 IP 不能为空")
private String ip;
/**
* 收件地址编号
*/
@NotNull(message = "用户地址不能为空")
private Integer userAddressId;
/**
* 优惠劵编号
*/
private Integer couponCardId;
/**
* 备注
*/
private String remark;
/**
* 订单商品项列表
*/
@NotNull(message = "必须选择购买的商品")
private List<OrderItem> orderItems;
@Data
@Accessors(chain = true)
public static class OrderItem implements Serializable {
/**
* 商品编号
*/
@NotNull(message = "商品 SKU 编号不能为空")
private Integer skuId;
/**
* 数量
*/
@NotNull(message = "商品 SKU 购买数量不能为空")
@Min(value = 1, message = "商品 SKU 购买数量必须大于 0")
private Integer quantity;
}
}