package cn.lili.modules.order.order.entity.dos;
|
|
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.json.JSONUtil;
|
import cn.lili.common.enums.ClientTypeEnum;
|
import cn.lili.common.enums.PromotionTypeEnum;
|
import cn.lili.common.security.sensitive.Sensitive;
|
import cn.lili.common.security.sensitive.enums.SensitiveStrategy;
|
import cn.lili.common.utils.BeanUtil;
|
import cn.lili.modules.goods.entity.enums.GoodsTypeEnum;
|
import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
|
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
|
import cn.lili.modules.order.cart.entity.vo.CartVO;
|
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
|
import cn.lili.modules.order.order.entity.enums.*;
|
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
|
import cn.lili.mybatis.BaseEntity;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModelProperty;
|
import lombok.Data;
|
import lombok.EqualsAndHashCode;
|
import lombok.NoArgsConstructor;
|
import org.springframework.format.annotation.DateTimeFormat;
|
|
import java.util.Date;
|
import java.util.Optional;
|
|
/**
|
* 订单
|
*
|
* @author Chopper
|
* @since 2020/11/17 7:30 下午
|
*/
|
@EqualsAndHashCode(callSuper = true)
|
@Data
|
@TableName("li_order")
|
@ApiModel(value = "订单")
|
@NoArgsConstructor
|
public class Order extends BaseEntity {
|
|
|
private static final long serialVersionUID = 2233811628066468683L;
|
@ApiModelProperty("订单编号")
|
private String sn;
|
|
@ApiModelProperty("交易编号 关联Trade")
|
private String tradeSn;
|
|
@ApiModelProperty(value = "店铺ID")
|
private String storeId;
|
|
@ApiModelProperty(value = "店铺名称")
|
private String storeName;
|
|
@ApiModelProperty(value = "会员ID")
|
private String memberId;
|
|
@ApiModelProperty(value = "用户名")
|
@Sensitive(strategy = SensitiveStrategy.PHONE)
|
private String memberName;
|
|
/**
|
* @see OrderStatusEnum
|
*/
|
@ApiModelProperty(value = "订单状态")
|
private String orderStatus;
|
|
/**
|
* @see PayStatusEnum
|
*/
|
@ApiModelProperty(value = "付款状态")
|
private String payStatus;
|
/**
|
* @see DeliverStatusEnum
|
*/
|
@ApiModelProperty(value = "货运状态")
|
private String deliverStatus;
|
|
@ApiModelProperty(value = "第三方付款流水号")
|
private String receivableNo;
|
|
/**
|
* @see PaymentMethodEnum
|
*/
|
@ApiModelProperty(value = "支付方式")
|
private String paymentMethod;
|
|
@ApiModelProperty(value = "支付时间")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
private Date paymentTime;
|
|
@ApiModelProperty(value = "收件人姓名")
|
private String consigneeName;
|
|
@ApiModelProperty(value = "收件人手机")
|
private String consigneeMobile;
|
|
/**
|
* @see DeliveryMethodEnum
|
*/
|
@ApiModelProperty(value = "配送方式")
|
private String deliveryMethod;
|
|
@ApiModelProperty(value = "地址名称, ','分割")
|
private String consigneeAddressPath;
|
|
@ApiModelProperty(value = "地址id,','分割 ")
|
private String consigneeAddressIdPath;
|
|
@ApiModelProperty(value = "详细地址")
|
private String consigneeDetail;
|
|
@ApiModelProperty(value = "总价格")
|
private Double flowPrice;
|
|
@ApiModelProperty(value = "商品价格")
|
private Double goodsPrice;
|
|
@ApiModelProperty(value = "运费")
|
private Double freightPrice;
|
|
@ApiModelProperty(value = "优惠的金额")
|
private Double discountPrice;
|
|
@ApiModelProperty(value = "修改价格")
|
private Double updatePrice;
|
|
@ApiModelProperty(value = "发货单号")
|
private String logisticsNo;
|
|
@ApiModelProperty(value = "物流公司CODE")
|
private String logisticsCode;
|
|
@ApiModelProperty(value = "物流公司名称")
|
private String logisticsName;
|
|
@ApiModelProperty(value = "订单商品总重量")
|
private Double weight;
|
|
@ApiModelProperty(value = "商品数量")
|
private Integer goodsNum;
|
|
@ApiModelProperty(value = "买家订单备注")
|
private String remark;
|
|
@ApiModelProperty(value = "卖家订单备注")
|
private String sellerRemark;
|
|
@ApiModelProperty(value = "订单取消原因")
|
private String cancelReason;
|
|
@ApiModelProperty(value = "完成时间")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
private Date completeTime;
|
|
@ApiModelProperty(value = "送货时间")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
private Date logisticsTime;
|
|
@ApiModelProperty(value = "支付方式返回的交易号")
|
private String payOrderNo;
|
|
/**
|
* @see ClientTypeEnum
|
*/
|
@ApiModelProperty(value = "订单来源")
|
private String clientType;
|
|
@ApiModelProperty(value = "是否需要发票")
|
private Boolean needReceipt;
|
|
@ApiModelProperty(value = "是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空")
|
private String parentOrderSn = "";
|
|
@ApiModelProperty(value = "是否为某订单类型的订单,如果是则为订单类型的id,否则为空")
|
private String promotionId;
|
|
/**
|
* @see OrderTypeEnum
|
*/
|
@ApiModelProperty(value = "订单类型")
|
private String orderType;
|
|
/**
|
* @see OrderPromotionTypeEnum
|
*/
|
@ApiModelProperty(value = "订单促销类型")
|
private String orderPromotionType;
|
|
@ApiModelProperty(value = "价格价格详情")
|
private String priceDetail;
|
|
@ApiModelProperty(value = "订单是否支持原路退回")
|
private Boolean canReturn;
|
|
@ApiModelProperty(value = "提货码")
|
private String verificationCode;
|
|
@ApiModelProperty(value = "分销员ID")
|
private String distributionId;
|
|
@ApiModelProperty(value = "使用的店铺会员优惠券id(,区分)")
|
private String useStoreMemberCouponIds;
|
|
@ApiModelProperty(value = "使用的平台会员优惠券id")
|
private String usePlatformMemberCouponId;
|
|
@ApiModelProperty(value = "qrCode 实物为提货码 虚拟货物为账号")
|
private String qrCode;
|
|
@ApiModelProperty(value = "自提点地址")
|
private String storeAddressPath;
|
|
@ApiModelProperty(value = "自提点电话")
|
private String storeAddressMobile;
|
|
@ApiModelProperty(value = "自提点地址经纬度")
|
private String storeAddressCenter;
|
|
/**
|
* 构建订单
|
*
|
* @param cartVO 购物车VO
|
* @param tradeDTO 交易DTO
|
*/
|
public Order(CartVO cartVO, TradeDTO tradeDTO) {
|
String oldId = this.getId();
|
BeanUtil.copyProperties(tradeDTO, this);
|
BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this);
|
BeanUtil.copyProperties(cartVO, this);
|
//填写订单类型
|
this.setTradeType(cartVO, tradeDTO);
|
setId(oldId);
|
|
//设置默认支付状态
|
this.setOrderStatus(OrderStatusEnum.UNPAID.name());
|
this.setPayStatus(PayStatusEnum.UNPAID.name());
|
this.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name());
|
this.setTradeSn(tradeDTO.getSn());
|
this.setRemark(cartVO.getRemark());
|
this.setFreightPrice(cartVO.getPriceDetailDTO().getFreightPrice());
|
//会员收件信息
|
if (tradeDTO.getMemberAddress() != null && DeliveryMethodEnum.LOGISTICS.name().equals(cartVO.getDeliveryMethod())) {
|
this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath());
|
this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath());
|
this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail());
|
this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile());
|
this.setConsigneeName(tradeDTO.getMemberAddress().getName());
|
}
|
//自提点信息
|
if (tradeDTO.getStoreAddress() != null && DeliveryMethodEnum.SELF_PICK_UP.name().equals(cartVO.getDeliveryMethod())) {
|
this.setStoreAddressPath(tradeDTO.getStoreAddress().getAddress());
|
this.setStoreAddressMobile(tradeDTO.getStoreAddress().getMobile());
|
this.setStoreAddressCenter(tradeDTO.getStoreAddress().getCenter());
|
}
|
//平台优惠券判定
|
if (tradeDTO.getPlatformCoupon() != null) {
|
this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId());
|
}
|
//店铺优惠券判定
|
if (tradeDTO.getStoreCoupons() != null && !tradeDTO.getStoreCoupons().isEmpty()) {
|
StringBuilder storeCouponIds = new StringBuilder();
|
for (MemberCouponDTO value : tradeDTO.getStoreCoupons().values()) {
|
storeCouponIds.append(value.getMemberCoupon().getId()).append(",");
|
}
|
this.setUseStoreMemberCouponIds(storeCouponIds.toString());
|
}
|
|
}
|
|
|
/**
|
* 填写交易(订单)类型
|
* 1.判断是普通、促销订单
|
* 2.普通订单进行区分:实物订单、虚拟订单
|
* 3.促销订单判断货物进行区分实物、虚拟商品。
|
* 4.拼团订单需要填写父订单ID
|
*
|
* @param cartVO 购物车VO
|
* @param tradeDTO 交易DTO
|
*/
|
private void setTradeType(CartVO cartVO, TradeDTO tradeDTO) {
|
|
//判断是否为普通订单、促销订单
|
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) {
|
this.setOrderType(OrderTypeEnum.NORMAL.name());
|
this.setOrderPromotionType(OrderPromotionTypeEnum.NORMAL.name());
|
} else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) {
|
this.setOrderType(OrderTypeEnum.VIRTUAL.name());
|
this.setOrderPromotionType(OrderPromotionTypeEnum.NORMAL.name());
|
} else {
|
//促销订单(拼团、积分)-判断购买的是虚拟商品还是实物商品
|
String goodsType = cartVO.getCheckedSkuList().get(0).getGoodsSku().getGoodsType();
|
if (CharSequenceUtil.isEmpty(goodsType) || goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())) {
|
this.setOrderType(OrderTypeEnum.NORMAL.name());
|
} else {
|
this.setOrderType(OrderTypeEnum.VIRTUAL.name());
|
}
|
//填写订单的促销类型
|
this.setOrderPromotionType(tradeDTO.getCartTypeEnum().name());
|
|
//判断是否为拼团订单,如果为拼团订单获取拼团ID,判断是否为主订单
|
if (tradeDTO.getCartTypeEnum().name().equals(PromotionTypeEnum.PINTUAN.name()) && cartVO.getCheckedSkuList().get(0).getPromotionMap() != null && !cartVO.getCheckedSkuList().get(0).getPromotionMap().isEmpty()) {
|
Optional<String> pintuanPromotions = cartVO.getCheckedSkuList().get(0).getPromotionMap().keySet().stream().filter(i -> i.contains(PromotionTypeEnum.PINTUAN.name())).findFirst();
|
pintuanPromotions.ifPresent(s -> promotionId = s.split("-")[1]);
|
}
|
}
|
}
|
|
|
public PriceDetailDTO getPriceDetailDTO() {
|
|
try {
|
return JSONUtil.toBean(priceDetail, PriceDetailDTO.class);
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
public void setPriceDetailDTO(PriceDetailDTO priceDetail) {
|
this.priceDetail = JSONUtil.toJsonStr(priceDetail);
|
}
|
|
|
}
|