1. 迁移交易订单的查询接口

2. 支付服务,重新初始化结构
This commit is contained in:
YunaiV
2020-11-27 18:38:39 +08:00
parent db4ee1ed7e
commit fdc83d4550
100 changed files with 1241 additions and 3604 deletions

View File

@@ -0,0 +1,30 @@
package cn.iocoder.mall.tradeservice.enums.order;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
/**
* 交易订单的明细的字段枚举
*
* @see TradeOrderRespDTO
*/
public enum TradeOrderDetailFieldEnum {
/**
* 交易订单项
*/
ITEM("item");
/**
* 字段
*/
private final String field;
TradeOrderDetailFieldEnum(String field) {
this.field = field;
}
public String getField() {
return field;
}
}

View File

@@ -1,7 +1,12 @@
package cn.iocoder.mall.tradeservice.rpc.order;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderCreateReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderPageReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
import java.util.Collection;
/**
* 交易订单 Rpc 接口
@@ -16,4 +21,23 @@ public interface TradeOrderRpc {
*/
CommonResult<Integer> createTradeOrder(TradeOrderCreateReqDTO createReqDTO);
/**
* 获得订单交易
*
* @param tradeOrderId 订单交易编号
* @param fields 额外返回字段,可见 {@link cn.iocoder.mall.tradeservice.enums.order.TradeOrderDetailFieldEnum}
* @return 订单交易
*/
CommonResult<TradeOrderRespDTO> getTradeOrder(Integer tradeOrderId, Collection<String> fields);
/**
* 获得交易订单分页
*
* @param pageDTO 订单交易分页查询
* @return 订单交易分页结果
*/
CommonResult<PageResult<TradeOrderRespDTO>> pageTradeOrder(TradeOrderPageReqDTO pageDTO);
}

View File

@@ -0,0 +1,101 @@
package cn.iocoder.mall.tradeservice.rpc.order.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 交易订单项 Response DTO
*/
@Data
@Accessors(chain = true)
public class TradeOrderItemRespDTO implements Serializable {
/**
* id自增长
*/
private Integer id;
/**
* 订单编号
*/
private Integer orderId;
/**
* 订单项状态
*/
private Integer status;
/**
* 商品 SKU 编号
*/
private Integer skuId;
/**
* 商品 SPU 编号
*/
private Integer spuId;
/**
* 商品名字
*/
private String skuName;
/**
* 图片名字
*/
private String skuImage;
/**
* 商品数量
*/
private Integer quantity;
/**
* 原始单价,单位:分
*/
private Integer originPrice;
/**
* 购买单价,单位:分
*/
private Integer buyPrice;
/**
* 最终价格,单位:分
*/
private Integer presentPrice;
/**
* 购买总金额,单位:分
*/
private Integer buyTotal;
/**
* 优惠总金额,单位:分
*/
private Integer discountTotal;
/**
* 最终总金额,单位:分
*/
private Integer presentTotal;
/**
* 退款总金额,单位:分
*/
private Integer refundTotal;
/**
* 物流id
*/
private Integer logisticsId;
/**
* 售后状态
*/
private Integer afterSaleStatus;
/**
* 售后订单编号
*/
private Integer afterSaleOrderId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 删除状态
*/
private Integer deleted;
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.mall.tradeservice.rpc.order.dto;
import cn.iocoder.common.framework.vo.PageParam;
import cn.iocoder.common.framework.vo.SortingField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* 交易订单分页 Request DTO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class TradeOrderPageReqDTO extends PageParam {
public static final SortingField ID_ASC = new SortingField("id", "asc");
public static final SortingField ID_DESC = new SortingField("id", "desc");
/**
* 用户编号
*/
private Integer userId;
/**
* 订单状态
*/
private Integer orderStatus;
/**
* 排序字段数组
*/
private List<SortingField> sorts;
/**
* 额外返回字段
*
* @see cn.iocoder.mall.tradeservice.enums.order.TradeOrderDetailFieldEnum
*/
private Collection<String> fields = Collections.emptySet();
}

View File

@@ -0,0 +1,139 @@
package cn.iocoder.mall.tradeservice.rpc.order.dto;
import cn.iocoder.mall.tradeservice.enums.order.TradeOrderDetailFieldEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 交易订单 Response DTO
*/
@Data
@Accessors(chain = true)
public class TradeOrderRespDTO implements Serializable {
// ========== 订单基本信息 ==========
/**
* 订单编号
*/
private Integer id;
/**
* 用户编号
*/
private Integer userId;
/**
* 订单单号
*/
private String orderNo;
/**
* 订单状态
*/
private Integer orderStatus;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
// ========== 价格 + 支付基本信息 ==========
/**
* 订单结束时间
*/
private Date endTime;
/**
* 订单金额(总金额),单位:分
*/
private Integer buyPrice;
/**
* 优惠总金额,单位:分
*/
private Integer discountPrice;
/**
* 物流金额,单位:分
*/
private Integer logisticsPrice;
/**
* 最终金额,单位:分
*/
private Integer presentPrice;
/**
* 支付金额,单位:分
*/
private Integer payPrice;
/**
* 退款金额,单位:分
*/
private Integer refundPrice;
/**
* 付款时间
*/
private Date payTime;
/**
* 支付订单编号
*/
private Integer payTransactionId;
/**
* 支付渠道
*/
private Integer payChannel;
// ========== 收件 + 物流基本信息 ==========
/**
* 配送类型
*/
private Integer deliveryType;
/**
* 发货时间
*/
private Date deliveryTime;
/**
* 收货时间
*/
private Date receiveTime;
/**
* 收件人名称
*/
private String receiverName;
/**
* 手机号
*/
private String receiverMobile;
/**
* 地区编码
*/
private Integer receiverAreaCode;
/**
* 收件详细地址
*/
private String receiverDetailAddress;
// ========== 售后基本信息 ==========
/**
* 售后状态
*/
private Integer afterSaleStatus;
// ========== 营销基本信息 ==========
/**
* 优惠劵编号
*/
private Integer couponCardId;
// ========== 商品基本信息 ==========
/**
* 订单项数组
*
* 需要设置 {@link TradeOrderDetailFieldEnum#ITEM} 才返回
*
* // TODO 芋艿,后续考虑怎么优化下,目前是内嵌了别的 dto
*/
private List<TradeOrderItemRespDTO> orderItems;
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.mall.tradeservice.convert.order;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderDO;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderItemDO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderItemRespDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface TradeOrderConvert {
TradeOrderConvert INSTANCE = Mappers.getMapper(TradeOrderConvert.class);
TradeOrderRespDTO convert(TradeOrderDO bean);
@Mapping(source = "records", target = "list")
PageResult<TradeOrderRespDTO> convertPage(IPage<TradeOrderDO> page);
List<TradeOrderItemRespDTO> convertList(List<TradeOrderItemDO> list);
TradeOrderItemRespDTO convert(TradeOrderItemDO bean);
}

View File

@@ -1,9 +1,11 @@
package cn.iocoder.mall.tradeservice.dal.mysql.mapper.order;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderItemDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.List;
@Repository
@@ -14,4 +16,8 @@ public interface TradeOrderItemMapper extends BaseMapper<TradeOrderItemDO> {
entities.forEach(this::insert);
}
default List<TradeOrderItemDO> selectListByOrderIds(Collection<Integer> orderIds) {
return selectList(new QueryWrapper<TradeOrderItemDO>().in("order_id", orderIds));
}
}

View File

@@ -1,9 +1,20 @@
package cn.iocoder.mall.tradeservice.dal.mysql.mapper.order;
import cn.iocoder.mall.mybatis.core.query.QueryWrapperX;
import cn.iocoder.mall.mybatis.core.util.PageUtil;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderDO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderPageReqDTO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Repository;
@Repository
public interface TradeOrderMapper extends BaseMapper<TradeOrderDO> {
default IPage<TradeOrderDO> selectPage(TradeOrderPageReqDTO pageReqDTO) {
return selectPage(PageUtil.build(pageReqDTO, pageReqDTO.getSorts()),
new QueryWrapperX<TradeOrderDO>().eqIfPresent("user_id", pageReqDTO.getUserId())
.eqIfPresent("status", pageReqDTO.getOrderStatus()));
}
}

View File

@@ -1,11 +1,16 @@
package cn.iocoder.mall.tradeservice.rpc.order;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderCreateReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderPageReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
import cn.iocoder.mall.tradeservice.service.order.TradeOrderService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Collection;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
@@ -22,4 +27,14 @@ public class TradeOrderRpcImpl implements TradeOrderRpc {
return success(tradeOrderService.createTradeOrder(createReqDTO));
}
@Override
public CommonResult<TradeOrderRespDTO> getTradeOrder(Integer tradeOrderId, Collection<String> fields) {
return success(tradeOrderService.getTradeOrder(tradeOrderId, fields));
}
@Override
public CommonResult<PageResult<TradeOrderRespDTO>> pageTradeOrder(TradeOrderPageReqDTO pageDTO) {
return success(tradeOrderService.pageTradeOrder(pageDTO));
}
}

View File

@@ -1,6 +1,11 @@
package cn.iocoder.mall.tradeservice.service.order;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderCreateReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderPageReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
import java.util.Collection;
/**
* 交易订单 Service 接口
@@ -15,4 +20,21 @@ public interface TradeOrderService {
*/
Integer createTradeOrder(TradeOrderCreateReqDTO createReqDTO);
/**
* 获得订单交易
*
* @param tradeOrderId 订单交易编号
* @param fields 额外返回字段,可见 {@link cn.iocoder.mall.tradeservice.enums.order.TradeOrderDetailFieldEnum}
* @return 订单交易
*/
TradeOrderRespDTO getTradeOrder(Integer tradeOrderId, Collection<String> fields);
/**
* 获得订单交易分页
*
* @param pageReqDTO 订单交易分页查询
* @return 订单交易分页结果
*/
PageResult<TradeOrderRespDTO> pageTradeOrder(TradeOrderPageReqDTO pageReqDTO);
}

View File

@@ -4,6 +4,7 @@ import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.DateUtil;
import cn.iocoder.common.framework.util.MathUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO;
@@ -12,16 +13,21 @@ import cn.iocoder.mall.tradeservice.client.product.ProductSkuClient;
import cn.iocoder.mall.tradeservice.client.promotion.CouponCardClient;
import cn.iocoder.mall.tradeservice.client.promotion.PriceClient;
import cn.iocoder.mall.tradeservice.client.user.UserAddressClient;
import cn.iocoder.mall.tradeservice.convert.order.TradeOrderConvert;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderDO;
import cn.iocoder.mall.tradeservice.dal.mysql.dataobject.order.TradeOrderItemDO;
import cn.iocoder.mall.tradeservice.dal.mysql.mapper.order.TradeOrderItemMapper;
import cn.iocoder.mall.tradeservice.dal.mysql.mapper.order.TradeOrderMapper;
import cn.iocoder.mall.tradeservice.enums.logistics.LogisticsDeliveryTypeEnum;
import cn.iocoder.mall.tradeservice.enums.order.TradeOrderAfterSaleStatusEnum;
import cn.iocoder.mall.tradeservice.enums.order.TradeOrderDetailFieldEnum;
import cn.iocoder.mall.tradeservice.enums.order.TradeOrderStatusEnum;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderCreateReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderPageReqDTO;
import cn.iocoder.mall.tradeservice.rpc.order.dto.TradeOrderRespDTO;
import cn.iocoder.mall.tradeservice.service.order.TradeOrderService;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressRespDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -29,8 +35,9 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.mall.tradeservice.enums.OrderErrorCodeConstants.*;
import static cn.iocoder.mall.userservice.enums.UserErrorCodeConstants.*;
import static cn.iocoder.common.framework.util.CollectionUtils.convertSet;
import static cn.iocoder.mall.tradeservice.enums.OrderErrorCodeConstants.ORDER_GET_GOODS_INFO_INCORRECT;
import static cn.iocoder.mall.userservice.enums.UserErrorCodeConstants.USER_ADDRESS_NOT_FOUND;
/**
* 交易订单 Service 实现
@@ -66,7 +73,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
}
// 获得商品信息
List<ProductSkuRespDTO> listProductSkus = productSkuClient.listProductSkus(
CollectionUtils.convertSet(createReqDTO.getOrderItems(), TradeOrderCreateReqDTO.OrderItem::getSkuId),
convertSet(createReqDTO.getOrderItems(), TradeOrderCreateReqDTO.OrderItem::getSkuId),
ProductSkuDetailFieldEnum.SPU.getField());
if (listProductSkus.size() != createReqDTO.getOrderItems().size()) { // 校验获得的数量,是否匹配
throw ServiceExceptionUtil.exception(ORDER_GET_GOODS_INFO_INCORRECT);
@@ -172,4 +179,43 @@ public class TradeOrderServiceImpl implements TradeOrderService {
;
}
@Override
public TradeOrderRespDTO getTradeOrder(Integer tradeOrderId, Collection<String> fields) {
// 查询交易订单
TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(tradeOrderId);
if (tradeOrderDO == null) {
return null;
}
TradeOrderRespDTO tradeOrderRespDTO = TradeOrderConvert.INSTANCE.convert(tradeOrderDO);
// 查询交易订单项
if (fields.contains(TradeOrderDetailFieldEnum.ITEM.getField())) {
List<TradeOrderItemDO> tradeOrderItemDOs = tradeOrderItemMapper.selectListByOrderIds(
Collections.singleton(tradeOrderDO.getId()));
tradeOrderRespDTO.setOrderItems(TradeOrderConvert.INSTANCE.convertList(tradeOrderItemDOs));
}
// 返回
return tradeOrderRespDTO;
}
@Override
public PageResult<TradeOrderRespDTO> pageTradeOrder(TradeOrderPageReqDTO pageReqDTO) {
// 查询交易订单分页
IPage<TradeOrderDO> tradeOrderDOPage = tradeOrderMapper.selectPage(pageReqDTO);
PageResult<TradeOrderRespDTO> pageResult = TradeOrderConvert.INSTANCE.convertPage(tradeOrderDOPage);
if (CollectionUtils.isEmpty(pageResult.getList())) {
return pageResult;
}
// 查询交易订单项们
if (pageReqDTO.getFields().contains(TradeOrderDetailFieldEnum.ITEM.getField())) {
List<TradeOrderItemDO> tradeOrderItemDOs = tradeOrderItemMapper.selectListByOrderIds(
convertSet(tradeOrderDOPage.getRecords(), TradeOrderDO::getId));
Map<Integer, List<TradeOrderItemDO>> tradeOrderItemDOMultiMap = CollectionUtils.convertMultiMap(
tradeOrderItemDOs, TradeOrderItemDO::getOrderId);
pageResult.getList().forEach(tradeOrderRespDTO -> tradeOrderRespDTO.setOrderItems(
TradeOrderConvert.INSTANCE.convertList(tradeOrderItemDOMultiMap.get(tradeOrderRespDTO.getId()))));
}
// 返回
return pageResult;
}
}