Commit 04305ea3 by hanghang.wang

拼团

parent 70473d7c
package cn.freemud.adapter;
import cn.freemud.entities.dto.ActivityCalculationDiscountResponseDto;
import cn.freemud.entities.dto.CreateSpellGroupOrderDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.entities.dto.promotion.CalculationDiscountGoodsDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.request.create.*;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.util.DateUtil;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author wanghanghang
* @title: SpellGroupOrderAdapter
* @projectName order-group
* @description: 创建拼团订单转换类
* @date 2021/4/15上午11:54
*/
@Component
public class SpellGroupOrderAdapter {
/**
* 转换创建订单request
*
* @param createSpellGroupOrderDto
* @return
*/
public CreateOrderRequest convertToCreateOrderRequest(CreateSpellGroupOrderDto createSpellGroupOrderDto, AssortmentCustomerInfoVo userLoginInfoDto) {
CreateOrderRequest createOrderRequest = new CreateOrderRequest();
//初始化订单基础信息
createOrderRequest.setPartnerId(createSpellGroupOrderDto.getPartnerId());
createOrderRequest.setStoreId(createSpellGroupOrderDto.getStoreId());
createOrderRequest.setThirdStoreId(createSpellGroupOrderDto.getStoreId());
StoreResponse.BizVO storeInfo = createSpellGroupOrderDto.getStoreResponse().getBizVO();
createOrderRequest.setStoreName(storeInfo.getStoreName());
createOrderRequest.setStoreNameEn(storeInfo.getStoreNameEn());
createOrderRequest.setUserId(createSpellGroupOrderDto.getUserId());
createOrderRequest.setUserName(createSpellGroupOrderDto.getNickName());
createOrderRequest.setOrderType(createSpellGroupOrderDto.getOrderType());
createOrderRequest.setPayType(1);
PayChannelType payChannelType = PayChannelType.getByIndex(createSpellGroupOrderDto.getPayChannelType());
if (payChannelType != null) {
createOrderRequest.setPayChannel(payChannelType.getEbcode());
createOrderRequest.setPayChannelName(payChannelType.getName());
createOrderRequest.setPayChannelType(payChannelType.getIndex());
}
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscount = createSpellGroupOrderDto.getActivityCalculationDiscountResponseDto().getResult();
createOrderRequest.setActualPayAmount(calculationDiscount.getTotalAmount().longValue()); //加配送费
createOrderRequest.setSettlementAmount(calculationDiscount.getTotalAmount().longValue());
createOrderRequest.setOriginalAmount(calculationDiscount.getOriginalTotalAmount().longValue());
createOrderRequest.setOrderClient(OrderClientType.SAASMALL.getIndex());
createOrderRequest.setMarketingType(createSpellGroupOrderDto.getMarketingType());
createOrderRequest.setExpressType(null);
createOrderRequest.setExpressChannelName("");
createOrderRequest.setExpressChannelCode("");
createOrderRequest.setExpressNo("");
createOrderRequest.setCanRefund(true);
createOrderRequest.setBizType(1);
createOrderRequest.setSuspendState((byte) 0);
createOrderRequest.setSuspendDesc("");
createOrderRequest.setOperator(userLoginInfoDto.getNickName());
createOrderRequest.setAppId(userLoginInfoDto.getAppId());
createOrderRequest.setPayChannelType(createSpellGroupOrderDto.getPayChannelType());
createOrderRequest.getOrderExtended().setSpellGroupCode(createSpellGroupOrderDto.getSpellGroupCode());
/**
* 处理商品优惠信息 OrderItemCreateReq
* 现阶段拼单商品只有一个,直接取0.后面拓展需要写循环。基本不会动
*/
ProductInfo productInfo = createSpellGroupOrderDto.getProducts().get(0);
ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Goods goods = calculationDiscount.getGoods().get(0);
this.convertToOrderItemReq(productInfo, goods, createOrderRequest, createSpellGroupOrderDto, userLoginInfoDto);
/**
* 处理配送费
*/
OrderCostCreateReq orderCostCreateReq = new OrderCostCreateReq();
orderCostCreateReq.setCostName("快递费用");
//新订单服务 1=包装费,2=运费,3=餐盒单价,4=餐盒数量
orderCostCreateReq.setCostType(2);
orderCostCreateReq.setActualCostAmount((long) 6);
orderCostCreateReq.setCostAmount((long) 6);
orderCostCreateReq.setProductSeq(1);
//1=订单,2=订单商品,3=售后单
orderCostCreateReq.setBillType(1);
orderCostCreateReq.setProductId(productInfo.getPid());
orderCostCreateReq.setNote("快递费用备注");
createOrderRequest.getOrderCostDetailList().add(orderCostCreateReq);
/**
* 处理结算信息
*/
OrderSettlementCreateReq orderSettlementCreateReq = new OrderSettlementCreateReq();
orderSettlementCreateReq.setProductId(goods.getGoodsId());
orderSettlementCreateReq.setSettlementType(9);
orderSettlementCreateReq.setSettlementAmount(goods.getRealAmount());
orderSettlementCreateReq.setNumber(1);
orderSettlementCreateReq.setShopAmount(goods.getRealAmount());
orderSettlementCreateReq.setIsOnline(true);
createOrderRequest.getOrderSettlementDetailList().add(orderSettlementCreateReq);
/**
* 处理快递信息
*/
createOrderRequest.setDeliveryContactInfoList(createSpellGroupOrderDto.getDeliveryContactInfoCreateReqList());
return createOrderRequest;
}
/**
* 转换促销算价request
*
* @param createSpellGroupOrderDto
* @param userLoginInfoDto
* @return
*/
public CalculationDiscountRequestDto convertToCalculationDiscountRequestDto(CreateSpellGroupOrderDto createSpellGroupOrderDto, AssortmentCustomerInfoVo userLoginInfoDto) {
CalculationDiscountRequestDto calculationDiscountRequestDto = new CalculationDiscountRequestDto();
calculationDiscountRequestDto.setStoreId(createSpellGroupOrderDto.getStoreId());
calculationDiscountRequestDto.setPartnerCode(createSpellGroupOrderDto.getPartnerId());
calculationDiscountRequestDto.setUserId(userLoginInfoDto.getMemberId());
List<CalculationDiscountGoodsDto> discountGoodsDtoList = new ArrayList<>();
createSpellGroupOrderDto.getProducts().forEach(productInfo -> {
CalculationDiscountGoodsDto discountGoodsDto = new CalculationDiscountGoodsDto();
discountGoodsDto.setGoodsId(productInfo.getPid());
//拼团订单,数量默认1
discountGoodsDto.setGoodsQuantity(1);
discountGoodsDto.setOriginalPrice(productInfo.getOriginalPrice().intValue());
discountGoodsDtoList.add(discountGoodsDto);
});
calculationDiscountRequestDto.setGoods(discountGoodsDtoList);
calculationDiscountRequestDto.setGroupActivityCode(createSpellGroupOrderDto.getSpellGroupCode());
// calculationDiscountRequestDto.setVer();
return calculationDiscountRequestDto;
}
public CreatePrepayRequestDto convertToCreatePrepayRequest(
AssortmentCustomerInfoVo userLoginInfoDto, QueryOrdersResponse.DataBean.OrderBean data, String trackingNo
) {
CreatePrepayRequestDto requestDto = new CreatePrepayRequestDto();
requestDto.setPartnerId(data.getParentCode());
requestDto.setWxAppId(userLoginInfoDto.getWxAppId());
requestDto.setOpenId(userLoginInfoDto.getOpenId());
requestDto.setTotalAmount(data.getActualPayAmount().longValue());
requestDto.setCardAmount(0);
requestDto.setOrderExtInfoDTO(null);
requestDto.setTransId(data.getOid());
requestDto.setOrderClient(OrderClientType.getOrderClientType(Integer.valueOf(data.getOrderClient())));
requestDto.setProductOrderBean(data);
requestDto.setFatherOrderBean(data);
requestDto.setStoreId(data.getShopId());
requestDto.setChannel("");
return requestDto;
}
public void convertToOrderItemReq(ProductInfo productInfo, ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Goods goods,
CreateOrderRequest createOrderRequest, CreateSpellGroupOrderDto createSpellGroupOrderDto, AssortmentCustomerInfoVo userLoginInfoDto) {
OrderItemCreateReq orderItemCreateReq = new OrderItemCreateReq();
orderItemCreateReq.setPartnerId(createSpellGroupOrderDto.getPartnerId());
orderItemCreateReq.setProductId(productInfo.getPid());
orderItemCreateReq.setThirdProductId(productInfo.getPid());
orderItemCreateReq.setProductCode(productInfo.getProductCode());
orderItemCreateReq.setProductName(productInfo.getName());
orderItemCreateReq.setProductSeq(productInfo.getSequence());
orderItemCreateReq.setProductQuantity(1);
orderItemCreateReq.setProductUnit(productInfo.getUnit());
orderItemCreateReq.setProductPrice(goods.getOriginalPrice());
orderItemCreateReq.setSettlementPrice(goods.getRealAmount());
orderItemCreateReq.setSalePrice(productInfo.getFinalPrice());
orderItemCreateReq.setProductSharePrice(goods.getDiscountAmount());
orderItemCreateReq.setProductPicUrl(productInfo.getPicture());
orderItemCreateReq.setMarketingType(createSpellGroupOrderDto.getMarketingType().byteValue());
orderItemCreateReq.setMarketingCode(createSpellGroupOrderDto.getActivityCode());
orderItemCreateReq.setCategoryId(productInfo.getCategory());
orderItemCreateReq.setCategoryName(productInfo.getCategoryName());
orderItemCreateReq.setProductType(productInfo.getType());
orderItemCreateReq.setUserId(userLoginInfoDto.getMemberId());
orderItemCreateReq.setOpenId(userLoginInfoDto.getOpenId());
orderItemCreateReq.setNickName(userLoginInfoDto.getNickName());
orderItemCreateReq.setPhotoUrl(userLoginInfoDto.getPhotoUrl());
createOrderRequest.getOrderItemList().add(orderItemCreateReq);
}
public ActivityUpdateStockRequest convert2ActivityUpdateStockRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, CreateSpellGroupOrderDto createSpellGroupOrderDto) {
if (orderBean == null || createSpellGroupOrderDto.getActivityCalculationDiscountResponseDto().getResult() == null) {
return null;
}
ActivityUpdateStockRequest activityUpdateStockRequest = new ActivityUpdateStockRequest();
activityUpdateStockRequest.setOrderId(orderBean.getOid());
activityUpdateStockRequest.setPartnerCode(orderBean.getCompanyId());
activityUpdateStockRequest.setStoreId(orderBean.getShopId());
activityUpdateStockRequest.setVer(createSpellGroupOrderDto.getActivityCalculationDiscountResponseDto().getVer().toString());
activityUpdateStockRequest.setUserId(orderBean.getUserId());
activityUpdateStockRequest.setOrderCreateTime(DateUtil.getCurrentDate(DateUtil.FORMAT_yyyyMMdd_date));
List<String> activityList = new ArrayList<>();
activityList.add(createSpellGroupOrderDto.getActivityCode());
activityUpdateStockRequest.setActivityList(activityList);
activityUpdateStockRequest.setStock(createSpellGroupOrderDto.getActivityCalculationDiscountResponseDto().getResult().getStocks());
return activityUpdateStockRequest;
}
/*------------------下方转换返回信息------------------------*/
/**
* 转换拼团订单收货地址reps
*/
public void convertToReceiveAddress(QueryReceiveAddressResponse receiveAddressResult, CreateSpellGroupOrderDto createSpellGroupOrderDto) {
DeliveryContactInfoCreateReq deliveryContactInfoCreateReq = new DeliveryContactInfoCreateReq();
deliveryContactInfoCreateReq.setRelateObjectType(1);
deliveryContactInfoCreateReq.setAddressDetail(receiveAddressResult.getReceiveAddress());
deliveryContactInfoCreateReq.setInfoType(1);
deliveryContactInfoCreateReq.setLatitude(new BigDecimal(receiveAddressResult.getLatitude()));
deliveryContactInfoCreateReq.setLongitude(new BigDecimal(receiveAddressResult.getLongitude()));
deliveryContactInfoCreateReq.setMobile(StringUtils.isEmpty(receiveAddressResult.getMobile()) ? receiveAddressResult.getReceiveMobile() : receiveAddressResult.getMobile());
deliveryContactInfoCreateReq.setContactsName(receiveAddressResult.getReceiveName());
createSpellGroupOrderDto.getDeliveryContactInfoCreateReqList().add(deliveryContactInfoCreateReq);
}
}
...@@ -74,13 +74,6 @@ public class OrderController { ...@@ -74,13 +74,6 @@ public class OrderController {
return orderAdapterService.createOrderNew(createOrderVo); return orderAdapterService.createOrderNew(createOrderVo);
} }
@ApiOperation(value = "创建拼团订单", notes = "创建拼团订单", produces = "application/json")
@ApiAnnotation(logMessage = "createSpellGroupOrder")
@PostMapping("/createSpellGroupOrder")
public BaseResponse createSpellGroupOrder(@Validated @LogParams @RequestBody CreateSpellGroupOrderReq request) {
return orderAdapterService.createSpellGroupOrder(request);
}
/** /**
* 麦咖啡创建订单 * 麦咖啡创建订单
*/ */
......
package cn.freemud.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.CreateSpellGroupOrderReq;
import cn.freemud.service.Orderservice;
import cn.freemud.service.SpellGroupOrderService;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wanghanghang
* @title: SpellGroupOrderController
* @projectName order-group
* @description: 拼团订单Controller
* @date 2021/4/16上午9:50
*/
@RequestMapping("/order")
@RestController
public class SpellGroupOrderController {
@Autowired
private SpellGroupOrderService spellGroupOrderService;
@ApiOperation(value = "创建拼团订单", notes = "创建拼团订单", produces = "application/json")
@ApiAnnotation(logMessage = "createSpellGroupOrder")
@PostMapping("/createSpellGroupOrder")
public BaseResponse createSpellGroupOrder(@Validated @LogParams @RequestBody CreateSpellGroupOrderReq request) {
return spellGroupOrderService.createSpellGroupOrder(request);
}
}
package cn.freemud.entities.dto; package cn.freemud.entities.dto;
import com.freemud.application.sdk.api.promotioncenter.dto.promotion.GoodsStockDTO;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
...@@ -60,8 +62,6 @@ public class ActivityCalculationDiscountResponseDto { ...@@ -60,8 +62,6 @@ public class ActivityCalculationDiscountResponseDto {
* 使用到的优惠券及优惠金额 * 使用到的优惠券及优惠金额
*/ */
private List<CouponResults> couponDiscounts; private List<CouponResults> couponDiscounts;
/** /**
* 多种优惠方案计算出的优惠集合,并按优惠力度倒序排列 * 多种优惠方案计算出的优惠集合,并按优惠力度倒序排列
*/ */
...@@ -73,6 +73,11 @@ public class ActivityCalculationDiscountResponseDto { ...@@ -73,6 +73,11 @@ public class ActivityCalculationDiscountResponseDto {
*/ */
List<ActivityPrompt> activityPrompts; List<ActivityPrompt> activityPrompts;
/**
* 活动集合
*/
List<ActivityUpdateStockRequest.StockBeanDto> stocks;
@Data @Data
public static class ActivityPrompt { public static class ActivityPrompt {
......
package cn.freemud.entities.dto; package cn.freemud.entities.dto;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.entities.dto.promotion.CalculationDiscountGoodsDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountResponseDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountResultDto;
import cn.freemud.entities.vo.CreateSpellGroupOrderReq; import cn.freemud.entities.vo.CreateSpellGroupOrderReq;
import com.freemud.application.sdk.api.ordercenter.request.create.DeliveryContactInfoCreateReq; import com.freemud.application.sdk.api.ordercenter.request.create.DeliveryContactInfoCreateReq;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
...@@ -19,13 +24,35 @@ public class CreateSpellGroupOrderDto extends CreateSpellGroupOrderReq { ...@@ -19,13 +24,35 @@ public class CreateSpellGroupOrderDto extends CreateSpellGroupOrderReq {
/** /**
* 用户收货地址信息 ,入参不需要传,通过校验receiveId获取 * 用户收货地址信息 ,入参不需要传,通过校验receiveId获取
*/ */
public UserDeliveryInfoDto userDeliveryInfoDto; // public UserDeliveryInfoDto userDeliveryInfoDto;
private String userName; /**
*当前用户id
private String mobile; */
private String userId;
/**
*当前用户昵称
*/
private String nickName;
/**
*存储送货地址信息
*/
List<DeliveryContactInfoCreateReq> deliveryContactInfoCreateReqList; List<DeliveryContactInfoCreateReq> deliveryContactInfoCreateReqList;
/**
* 存储商品信息
*/
private List<ProductInfo> products;
/**
* 存储促销返回商品算价信息
*/
private ActivityCalculationDiscountResponseDto activityCalculationDiscountResponseDto;
/**
* 门店信息
*/
private StoreResponse storeResponse;
} }
...@@ -87,4 +87,9 @@ public class CalculationDiscountRequestDto { ...@@ -87,4 +87,9 @@ public class CalculationDiscountRequestDto {
* saas-自提 saasdelivery-外卖 saasmall-微商城 .... * saas-自提 saasdelivery-外卖 saasmall-微商城 ....
*/ */
private String productChannel; private String productChannel;
/**
* 拼团活动是,必传活动号
*/
private String groupActivityCode;
} }
package cn.freemud.entities.vo; package cn.freemud.entities.vo;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List; import java.util.List;
/** /**
* @author freemud * @author wanghanghang
* @title: CreateSpellGroupOrderReq * @title: CreateSpellGroupOrderReq
* @projectName order-group * @projectName order-group
* @description: TODO * @description: 创建拼团订单request
* @date 2021/4/14上午9:52 * @date 2021/4/14上午9:52
*/ */
@Data @Data
...@@ -24,62 +21,73 @@ public class CreateSpellGroupOrderReq { ...@@ -24,62 +21,73 @@ public class CreateSpellGroupOrderReq {
/** /**
* 参与拼团编号->团编号 * 参与拼团编号->团编号
*/ */
private String SpellGroupCode; private String spellGroupCode;
//@NotEmpty(message = "门店ID 不能为空") @NotEmpty(message = "门店ID 不能为空")
private String storeId; private String storeId;
private String thirdShopId; @NotEmpty(message = "商户号 不能为空")
private String partnerId; private String partnerId;
@Builder.Default @Builder.Default
private String menuType = "saas"; private String menuType = "saasmall";
/** /**
* 渠道类型 OrderChannelType * 渠道类型 OrderChannelType
*/ */
private String channelType; private String channelType = "saasmall";
/*下单渠道必填,根据此字段的值判断是自营或第三方,来走不同的状态机 详细见 orderClientType枚举*/
private Integer orderClient;
/**
* 下单支付渠道类型
*/
@NotNull(message = "下单支付渠道类型不能为空")
private Byte payChannelType;
/** /**
* 订单类型 1 到店自取 2 外卖 枚举CreateOrderType * 订单类型 1 到店自取 2 外卖 枚举CreateOrderType
*/ */
//@NotNull(message = "下单类型不能为空") @Builder.Default
private Integer orderType; private Integer orderType = 3;
/** /**
* 订单特殊类型 1:普通订单 2:拼团订单 3:秒杀订单 4:拼单订单 * 订单特殊类型 1:普通订单 2:拼团订单 3:秒杀订单 4:拼单订单
*/ */
@NotNull @Builder.Default
private Byte marketingType; private Integer marketingType = 2;
/** /**
* 收货地址ID * 收货地址ID
*/ */
@NotEmpty(message = "收货地址ID不能为空")
private String receiveId; private String receiveId;
/** /**
* 收货地址 * 拼团活动号
*/ */
private String receiveAddress; @NotEmpty(message = "拼团活动号不能为空")
private String activityCode;
/** /**
* 收货用户名 * 拼团商品集合,本次只会传入一条
*/ */
private String receiveUsername; @NotNull(message = "拼团商品信息不能为空")
private List<SpellGroupProduct> spellGroupProductList;
/** /**
* 收货电话 * 订单备注,预留字段
*/ */
@Pattern(regexp = "^1[3|4|5|6|7|8|9][0-9]{9}$", message = "手机号码格式不正确") private String orderRemark;
private String receiveMobile;
//拼团商品集合,本次只会传入一条
private List<SpellGroupProduct> spellGroupProductList;
/**
* 拼团商品
*/
@Data @Data
public static class SpellGroupProduct{ public static class SpellGroupProduct {
private String productId; private String productId;
private Integer productQuantity;
} }
} }
...@@ -240,12 +240,11 @@ public enum ResponseResult { ...@@ -240,12 +240,11 @@ public enum ResponseResult {
* 拼团订单状态码 80001 - 80101 * 拼团订单状态码 80001 - 80101
*/ */
SPELL_GROUP_THE_CLUB_IS_FULL("80001", "拼团已满员"), SPELL_GROUP_THE_CLUB_IS_FULL("80001", "拼团已满员"),
SPELL_GROUP_CREAT_ORDER_ERROR("80002", "创建拼团订单失败"),
SPELL_GROUP_ACTIVITE_AMOUNT_ERROR("80003", "返回的价格是商品原价,则表示库存不足或者活动关闭"),
; ;
private String code; private String code;
private String message; private String message;
......
package cn.freemud.manager;
import cn.freemud.adapter.SpellGroupOrderAdapter;
import cn.freemud.entities.dto.ActivityCalculationDiscountResponseDto;
import cn.freemud.entities.dto.CreateSpellGroupOrderDto;
import cn.freemud.entities.dto.GetProductInfoDto;
import cn.freemud.entities.dto.ProductInfosDto;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountResponseDto;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.thirdparty.PromotionDiscountClient;
import cn.freemud.service.thirdparty.StoreItemClient;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.membercenter.service.MemberCenterService;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author wanghanghang
* @title: SpellGroupOrderDataManager
* @projectName order-group
* @description: TODO
* @date 2021/4/15下午3:45
*/
@Component
public class SpellGroupOrderDataManager {
@Autowired
private StoreItemClient storeItemClient;
@Autowired
private PromotionDiscountClient promotionDiscountClient;
//会员SDK
@Autowired
private MemberCenterService memberCenterService;
//门店SDK
@Autowired
private StoreCenterService storeCenterService;
/**
* 查询门店信息
*/
public StoreResponse getStoreInfo(String partnerId, String shopId, String trackingNo) {
// 获取门店信息
StoreInfoRequest storeInfoRequest = new StoreInfoRequest(partnerId, shopId, null);
return storeCenterService.getStoreInfo(storeInfoRequest, trackingNo);
}
/**
* 查询地址信息
*
* @param receiveId
* @param partnerId
* @param trackingNo
* @return
*/
public QueryReceiveAddressResponse queryOrderReceiveAddress(String receiveId, String partnerId, String trackingNo) {
//校验收货地址是否可配送
QueryReceiveAddressRequest request = new QueryReceiveAddressRequest(receiveId, partnerId);
BaseResponse<QueryReceiveAddressResponse> queryReceiveAddressResponse = memberCenterService.queryReceiveAddressById(request, trackingNo);
if (!ResponseResult.SUCCESS.getCode().equals(queryReceiveAddressResponse.getCode()) || queryReceiveAddressResponse.getData() == null) {
throw new ServiceException(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
QueryReceiveAddressResponse receiveAddressResult = queryReceiveAddressResponse.getData();
return receiveAddressResult;
}
/**
* 查询商品信息
*
* @param createSpellGroupOrderDto
* @return
*/
public List<ProductInfo> queryProductInfos(CreateSpellGroupOrderDto createSpellGroupOrderDto) {
GetProductInfoDto getProductInfoReq = new GetProductInfoDto();
List<String> proIds = new ArrayList<>();
createSpellGroupOrderDto.getSpellGroupProductList().forEach(proInfo -> {
proIds.add(proInfo.getProductId());
});
getProductInfoReq.setProductIds(proIds);
getProductInfoReq.setPartnerId(createSpellGroupOrderDto.getPartnerId());
getProductInfoReq.setShopId(createSpellGroupOrderDto.getStoreId());
getProductInfoReq.setProductInfoType(1);
ProductInfosDto productInfosReps = storeItemClient.listProductInfos(getProductInfoReq);
if (!ResponseResult.SUCCESS.getCode().equals(productInfosReps.getCode()) || productInfosReps.getData() == null) {
throw new ServiceException(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
return productInfosReps.getData().getProducts();
}
/**
* 查询算价信息
*
* @param calculationDiscountRequestDto
* @return
*/
public ActivityCalculationDiscountResponseDto queryCalculationDiscount(CalculationDiscountRequestDto calculationDiscountRequestDto) {
ActivityCalculationDiscountResponseDto activityCalculationDiscountResponseDto = promotionDiscountClient.calculationDiscountSharing(calculationDiscountRequestDto);
if (!ResponseResult.SUCCESS.getCode().equals(activityCalculationDiscountResponseDto.getStatusCode()) || activityCalculationDiscountResponseDto.getResult() == null) {
throw new ServiceException(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
return activityCalculationDiscountResponseDto;
}
}
...@@ -154,11 +154,5 @@ public interface Orderservice { ...@@ -154,11 +154,5 @@ public interface Orderservice {
*/ */
BaseResponse queryTodayOrders(QueryOrderByConditionsRequestVo queryOrderByConditionsRequestVo); BaseResponse queryTodayOrders(QueryOrderByConditionsRequestVo queryOrderByConditionsRequestVo);
/**
* 创建拼团订单
* @param createSpellGroupOrderReq
* @return
*/
public BaseResponse createSpellGroupOrder(CreateSpellGroupOrderReq createSpellGroupOrderReq);
} }
package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.CreateSpellGroupOrderReq;
/**
* @author wanghanghang
* @title: SpellGroupOrderService
* @projectName order-group
* @description: TODO
* @date 2021/4/15下午9:01
*/
public interface SpellGroupOrderService {
/**
* 创建拼团订单
* @param createSpellGroupOrderReq
* @return
*/
public BaseResponse createSpellGroupOrder(CreateSpellGroupOrderReq createSpellGroupOrderReq);
}
...@@ -917,31 +917,7 @@ public class CheckOrder { ...@@ -917,31 +917,7 @@ public class CheckOrder {
createOrderVo.setUserDeliveryInfoDto(userDeliveryInfoDto); createOrderVo.setUserDeliveryInfoDto(userDeliveryInfoDto);
} }
/**
* 校验拼团订单收货地址
*/
public void checkSpellGroupOrderReceiveAddress(String receiveId,String partnerId , String trackingNo,CreateSpellGroupOrderDto createSpellGroupOrderDto) {
//校验收货地址是否可配送
QueryReceiveAddressRequest request = new QueryReceiveAddressRequest(receiveId,partnerId);
BaseResponse<QueryReceiveAddressResponse> queryReceiveAddressResponse = memberCenterService.queryReceiveAddressById(request, trackingNo);
if (!ResponseResult.SUCCESS.getCode().equals(queryReceiveAddressResponse.getCode()) || queryReceiveAddressResponse.getData() == null) {
throw new ServiceException(ResponseResult.USER_GETRECEIVEADDRESS_ERROR);
}
QueryReceiveAddressResponse receiveAddressResult = queryReceiveAddressResponse.getData();
DeliveryContactInfoCreateReq deliveryContactInfoCreateReq = new DeliveryContactInfoCreateReq();
deliveryContactInfoCreateReq.setRelateObjectType(1);
deliveryContactInfoCreateReq.setAddressDetail(receiveAddressResult.getReceiveAddress());
deliveryContactInfoCreateReq.setInfoType(1);
deliveryContactInfoCreateReq.setLatitude(new BigDecimal(receiveAddressResult.getLatitude()));
deliveryContactInfoCreateReq.setLongitude(new BigDecimal(receiveAddressResult.getLongitude()));
deliveryContactInfoCreateReq.setMobile(StringUtils.isEmpty(receiveAddressResult.getMobile()) ? receiveAddressResult.getReceiveMobile() : receiveAddressResult.getMobile());
deliveryContactInfoCreateReq.setContactsName(receiveAddressResult.getReceiveName());
createSpellGroupOrderDto.setUserName(receiveAddressResult.getReceiveName());
createSpellGroupOrderDto.setMobile(StringUtils.isEmpty(receiveAddressResult.getMobile()) ? receiveAddressResult.getReceiveMobile() : receiveAddressResult.getMobile());
createSpellGroupOrderDto.getDeliveryContactInfoCreateReqList().add(deliveryContactInfoCreateReq);
}
public void checkCardCode(String partnerId, String memberId, String cardCode) { public void checkCardCode(String partnerId, String memberId, String cardCode) {
......
...@@ -44,17 +44,24 @@ import cn.freemud.entities.dto.order.CreatePrepayRequestDto; ...@@ -44,17 +44,24 @@ import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.order.FacePayRequestDto; import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto; import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.CombPayResponse; import cn.freemud.entities.dto.pay.CombPayResponse;
import cn.freemud.entities.dto.product.AttributeValue; import cn.freemud.entities.dto.product.*;
import cn.freemud.entities.dto.product.GroupDetail; import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
import cn.freemud.entities.dto.product.ProductAttributeGroup; import cn.freemud.entities.dto.promotion.CalculationDiscountResponseDto;
import cn.freemud.entities.dto.product.ProductGroup;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto; import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.shoppingCart.CollageOrderDto; import cn.freemud.entities.dto.shoppingCart.CollageOrderDto;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
import cn.freemud.enums.*; import cn.freemud.enums.*;
import cn.freemud.enums.AfterSalesOrderCreateEventEnum;
import cn.freemud.enums.OrderChannelType;
import cn.freemud.enums.PayRefundStatus;
import cn.freemud.enums.PayStatus;
import cn.freemud.enums.QueryOrderStatus;
import cn.freemud.enums.RefundStatus;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.thirdparty.MulitiPaymentClient; import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.manager.SpellGroupOrderDataManager;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.*; import cn.freemud.service.*;
import cn.freemud.service.coupon.CouponRelationFactory; import cn.freemud.service.coupon.CouponRelationFactory;
...@@ -66,8 +73,16 @@ import cn.freemud.utils.*; ...@@ -66,8 +73,16 @@ import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.request.CouponLockRequest;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponLockResponse;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest; import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest;
import com.freemud.application.sdk.api.membercenter.request.UserScoreRequest;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse; import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderItemCreateReq;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.stockapi.request.UpdateStocksRequest;
import com.freemud.sdk.api.assortment.order.enums.*;
import jdk.nashorn.internal.runtime.ECMAException; import jdk.nashorn.internal.runtime.ECMAException;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.freemud.api.assortment.datamanager.entity.db.*; import com.freemud.api.assortment.datamanager.entity.db.*;
...@@ -132,10 +147,6 @@ import com.freemud.sdk.api.assortment.message.request.MessagePushOrderTemplateRe ...@@ -132,10 +147,6 @@ import com.freemud.sdk.api.assortment.message.request.MessagePushOrderTemplateRe
import com.freemud.sdk.api.assortment.message.request.MessageTemplateRequest; import com.freemud.sdk.api.assortment.message.request.MessageTemplateRequest;
import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushService; import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushService;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter; import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.AutoOrderConfigTime;
import com.freemud.sdk.api.assortment.order.enums.NewOrderType;
import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus;
import com.freemud.sdk.api.assortment.order.enums.QueryDeliveryType;
import com.freemud.sdk.api.assortment.order.request.order.*; import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest; import com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest;
import com.freemud.sdk.api.assortment.order.response.order.*; import com.freemud.sdk.api.assortment.order.response.order.*;
...@@ -179,6 +190,8 @@ import java.util.function.Function; ...@@ -179,6 +190,8 @@ import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR;
@Service @Service
@Slf4j @Slf4j
...@@ -386,47 +399,16 @@ public class OrderServiceImpl implements Orderservice { ...@@ -386,47 +399,16 @@ public class OrderServiceImpl implements Orderservice {
return this.createPrepayOrder(createPrepayRequestDto); return this.createPrepayOrder(createPrepayRequestDto);
} }
@Override
public BaseResponse createSpellGroupOrder(CreateSpellGroupOrderReq createSpellGroupOrderReq) {
String trackingNo = LogThreadLocal.getTrackingNo();
//校验用户信息
String sessionId = createSpellGroupOrderReq.getSessionId();
AssortmentCustomerInfoVo userLoginInfoDto = customerInfoManager.getCustomerInfoByObject(sessionId);
if (userLoginInfoDto == null || StringUtils.isEmpty(userLoginInfoDto.getMemberId())) {
throw new ServiceException(ResponseResult.NOT_LOGIN);
}
//团id不为空,调用促销查询团是否关闭,关闭之后给提示不可下单
if(1==1){
return ResponseUtil.error(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
//团开启 则继续执行
CreateSpellGroupOrderDto createSpellGroupOrderDto = new CreateSpellGroupOrderDto();
BeanUtils.copyProperties(createSpellGroupOrderReq, createSpellGroupOrderDto);
//查询配送地址等信息
checkOrder.checkSpellGroupOrderReceiveAddress(createSpellGroupOrderReq.getReceiveId(),createSpellGroupOrderReq.getPartnerId(),trackingNo,createSpellGroupOrderDto);
//查询商品信息 public CreateOrderResponse getCreateOrderResponse(String code, String message, QueryOrdersResponse.DataBean.OrderBean data) {
CreateOrderResponse baseOrderResponse = new CreateOrderResponse();
baseOrderResponse.setErrcode(Integer.valueOf(code));
// 查询小程序自提外卖配置信息 校验当前订单类型的下单参数 校验外卖是否满足起送条件 baseOrderResponse.setErrmsg(message);
Integer pushOrderTime = checkOrder.checkOrderByOrderType(createOrderVo, userLoginInfoDto, storeResponseDto, shoppingCartGoodsDto, trackingNo); baseOrderResponse.setData(data);
OrderExtInfoDto extInfo = getExtInfo(userLoginInfoDto, storeResponseDto, pushOrderTime, createOrderVo, shoppingCartGoodsDto); return baseOrderResponse;
//1.9.2套餐需求同步优化创建订单代码
BaseResponse createOrderOperateDtoResponse = this.sdkCreateOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, userLoginInfoDto);
if (createOrderOperateDtoResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderOperateDtoResponse.getCode()) || createOrderOperateDtoResponse.getResult() == null) {
return createOrderOperateDtoResponse;
}
CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto) createOrderOperateDtoResponse.getResult();
//创建支付
CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(userLoginInfoDto, createOrderVo, createOrderOperateDto, extInfo);
return this.createPrepayOrder(createPrepayRequestDto);
} }
/** /**
* 扫脸支付下单 * 扫脸支付下单
*/ */
......
package cn.freemud.service.impl;
import cn.freemud.adapter.SpellGroupOrderAdapter;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQAction;
import cn.freemud.amqp.MQMessage;
import cn.freemud.amqp.MQService;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.ActivityCalculationDiscountResponseDto;
import cn.freemud.entities.dto.CreateSpellGroupOrderDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountResponseDto;
import cn.freemud.entities.vo.CreateSpellGroupOrderReq;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.SpellGroupOrderDataManager;
import cn.freemud.service.SpellGroupOrderService;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.promotioncenter.service.PromotionSdkService;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.sdk.api.assortment.order.adapter.ActivitySdkAdapter;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.AutoOrderConfigTime;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.service.order.OrderCenterSdkServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Random;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR;
/**
* @author wanghanghang
* @title: SpellGroupOrderServiceImpl
* @projectName order-group
* @description: 拼团业务层Service
* @date 2021/4/16上午9:47
*/
@Service
public class SpellGroupOrderServiceImpl implements SpellGroupOrderService {
@Autowired
private SpellGroupOrderAdapter spellGroupOrderAdapter;
@Autowired
private OrderSdkAdapter orderSdkAdapter;
@Autowired
private SpellGroupOrderDataManager spellGroupOrderDataManager;
@Autowired
private AssortmentCustomerInfoManager customerInfoManager;
@Autowired
private OrderSdkService orderSdkService;
@Autowired
private OrderServiceImpl orderService;
@Autowired
private PromotionSdkService promotionSdkService;
@Autowired
private StoreCenterService storeCenterService;
@Autowired
private ActivitySdkAdapter activitySdkAdapter;
@Autowired
private MQService mqService;
@Value("${program.backorders_change_order_status_consumer_queue}")
private String backOrdersChangeOrderStatusConsumerQueue;
@Value("${program.backorders_notify_activity_exchange}")
private String backOrdersNotifyActivityExchange;
@Override
public BaseResponse createSpellGroupOrder(CreateSpellGroupOrderReq createSpellGroupOrderReq) {
String trackingNo = LogThreadLocal.getTrackingNo();
/*校验用户信息*/
String sessionId = createSpellGroupOrderReq.getSessionId();
AssortmentCustomerInfoVo userLoginInfoDto = customerInfoManager.getCustomerInfoByObject(sessionId);
if (userLoginInfoDto == null || StringUtils.isEmpty(userLoginInfoDto.getMemberId())) {
throw new ServiceException(ResponseResult.NOT_LOGIN);
}
/*查询会员接口,获取城市等信息*/
//todo
/*获取门店信息,拼单虚拟门店,无需校验*/
StoreResponse storeResponse = spellGroupOrderDataManager.getStoreInfo(createSpellGroupOrderReq.getPartnerId(), createSpellGroupOrderReq.getStoreId(), trackingNo);
if (storeResponse == null || storeResponse.getBizVO() == null) {
throw new ServiceException(ResponseResult.STORE_NOT_FOUND);
}
/*初始化service业务DTO类,后续数据转换依据createSpellGroupOrderDto*/
CreateSpellGroupOrderDto createSpellGroupOrderDto = new CreateSpellGroupOrderDto();
BeanUtils.copyProperties(createSpellGroupOrderReq, createSpellGroupOrderDto);
//门店信息->转换至DTO
createSpellGroupOrderDto.setStoreResponse(storeResponse);
/*团id不为空,调用促销查询团是否关闭,关闭之后给提示不可下单*/
String getSpellGroupCode = createSpellGroupOrderReq.getSpellGroupCode();
if (1 == 1) {
return ResponseUtil.error(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
/*---------团开启 则继续执行-------*/
/*查询配送地址等信息->转换至DTO*/
QueryReceiveAddressResponse queryReceiveAddressResponse = spellGroupOrderDataManager.queryOrderReceiveAddress(createSpellGroupOrderReq.getReceiveId(), createSpellGroupOrderReq.getPartnerId(), trackingNo);
spellGroupOrderAdapter.convertToReceiveAddress(queryReceiveAddressResponse, createSpellGroupOrderDto);
/*查询商品信息*/
List<ProductInfo> productInfosDto = spellGroupOrderDataManager.queryProductInfos(createSpellGroupOrderDto);
createSpellGroupOrderDto.setProducts(productInfosDto);
/*商品信息查询促销,获取商品价格等信息 转换结算信息*/
CalculationDiscountRequestDto calculationDiscountRequestDto = spellGroupOrderAdapter.convertToCalculationDiscountRequestDto(createSpellGroupOrderDto, userLoginInfoDto);
ActivityCalculationDiscountResponseDto activityCalculationDiscountResponseDto = spellGroupOrderDataManager.queryCalculationDiscount(calculationDiscountRequestDto);
//促销和产品给出规则,如果促销返回的价格是商品原价,则表示库存不足或者活动关闭 == 拼团的商品价格,肯定比商品原价低
if (activityCalculationDiscountResponseDto.getResult().getTotalAmount().equals(productInfosDto.get(0).getOriginalPrice())) {
return ResponseUtil.error(ResponseResult.SPELL_GROUP_THE_CLUB_IS_FULL);
}
createSpellGroupOrderDto.setActivityCalculationDiscountResponseDto(activityCalculationDiscountResponseDto);
//转换类存入费用信息->配送费
//转换费用信息
//DTO转换为订单Request信息
com.freemud.application.sdk.api.ordercenter.request.create.CreateOrderRequest createOrderRequest = spellGroupOrderAdapter.convertToCreateOrderRequest(createSpellGroupOrderDto, userLoginInfoDto);
com.freemud.application.sdk.api.ordercenter.response.BaseResponse<OrderInfoReqs> response = orderSdkService.createOrder(createOrderRequest, trackingNo);
CreateOrderResponse createOrderResponse = orderSdkAdapter.convent2NEWOrderInfoReqs(response);
if (createOrderResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderResponse.getErrcode()) || createOrderResponse.getData() == null) {
return ResponseUtil.error(ResponseResult.SPELL_GROUP_CREAT_ORDER_ERROR);
}
//调用活动库存
BaseOrderResponse baseOrderResponse = updateActivityStock(createOrderResponse.getData(), createSpellGroupOrderDto);
if (!RESPONSE_SUCCESS.equals(baseOrderResponse.getErrcode())) {
return ResponseUtil.error(baseOrderResponse.getErrcode().toString(), baseOrderResponse.getErrmsg(), null);
}
//创建支付
CreatePrepayRequestDto createPrepayRequestDto = spellGroupOrderAdapter.convertToCreatePrepayRequest(userLoginInfoDto, createOrderResponse.getData(), trackingNo);
return orderService.createPrepayOrder(createPrepayRequestDto);
}
/**
* 扣减动库存
* @param orderBean
* @param createSpellGroupOrderDto
* @return
*/
private BaseOrderResponse updateActivityStock(QueryOrdersResponse.DataBean.OrderBean orderBean, CreateSpellGroupOrderDto createSpellGroupOrderDto) {
ActivityUpdateStockRequest activityUpdateStockRequest = spellGroupOrderAdapter.convert2ActivityUpdateStockRequest(orderBean, createSpellGroupOrderDto);
if (activityUpdateStockRequest != null && (CollectionUtils.isNotEmpty(activityUpdateStockRequest.getStock()) || CollectionUtils.isNotEmpty(activityUpdateStockRequest.getActivityList()))) {
com.freemud.application.sdk.api.base.BaseResponse activityResponse = promotionSdkService.subtractStock(activityUpdateStockRequest, "");
ThirdPartyLog.infoConvertJson(System.currentTimeMillis(), System.currentTimeMillis(),
"subtractStock", JSONObject.toJSONString(activityUpdateStockRequest), JSONObject.toJSONString(activityResponse));
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, activityResponse.getCode())) {
//TODO 失败取消订单,异步冲正库存
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "活动库存不足", "", null);
orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, backOrdersChangeOrderStatusConsumerQueue, backOrdersNotifyActivityExchange);
return BaseOrderResponse.getErrorBaseOrderResponse(activityResponse.getCode(), "活动库存不足");
}
}
return BaseOrderResponse.getErrorBaseOrderResponse(RESPONSE_SUCCESS_STR, "");
}
public BaseOrderResponse orderCancel(CancelOrderRequest cancelOrderRequest) {
OrderCancelReq request = new OrderCancelReq();
//商户号必传
request.setPartnerId(cancelOrderRequest.getPartnerId());
request.setOrderCode(cancelOrderRequest.getOrderId());
request.setReqRemark(cancelOrderRequest.getReqRemark());
//售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单
// 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消,
request.setAfterSalesType(cancelOrderRequest.getAfterSalesType().getIndex() == null ? 1 : cancelOrderRequest.getAfterSalesType().getIndex());
request.setOrderClient(cancelOrderRequest.getOrderClient());
request.setCancelReason(cancelOrderRequest.getReason());
request.setAfterSalesReason(cancelOrderRequest.getReason());
//若为4,默认做【创建】+【同意并退款完成】,售后单状态为【完成】
request.setCreateEvent(cancelOrderRequest.getCreateEvent());
request.setAfterSerialNo(cancelOrderRequest.getRefundSerialNo());
request.setOperator(cancelOrderRequest.getOperator());
//为空发起售后单
if (cancelOrderRequest.getCreateEvent() == null) {
// 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout,
StoreResponse.Configuration configuration = getStoreAutoConfiguration(cancelOrderRequest.getPartnerId(), cancelOrderRequest.getStoreId(), cancelOrderRequest.getTrackingNo());
if (configuration != null && ObjectUtils.equals("2", configuration.getAutoChargebackOrderType())
&& !ObjectUtils.equals("0", configuration.getAutoChargebackOrderTime())) {
request.setTimeOut(AutoOrderConfigTime.getTime(configuration.getAutoChargebackOrderTime()));
}
OrderTaskReq orderTask = setAfterSalesOrderTimeOutTask(configuration);
request.setOrderTask(orderTask);
}
request.setRefundDeliveryAmount(cancelOrderRequest.isRefundDeliveryAmount());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse response = orderSdkService.cancelOrder(request, cancelOrderRequest.getTrackingNo());
return orderSdkAdapter.convent2BaseOrderResponse(response);
}
/**
* 获取门店自动配置信息
*
* @param partnerId
* @param storeCode
* @param trackingNo
* @return
*/
private StoreResponse.Configuration getStoreAutoConfiguration(String partnerId, String storeCode, String trackingNo) {
if (StringUtils.isEmpty(storeCode)) {
return null;
}
StoreInfoRequest storeInfoRequest = new StoreInfoRequest();
storeInfoRequest.setPartnerId(partnerId);
storeInfoRequest.setStoreCode(storeCode);
StoreResponse storeResponse = storeCenterService.getStoreInfo(storeInfoRequest, trackingNo);
if (storeResponse == null || storeResponse.getBizVO() == null || storeResponse.getBizVO().getStoreConfig() == null) {
return null;
}
return storeResponse.getBizVO().getStoreConfig();
}
/**
* 设置申请退款时间
* 如果时间的类型是2表示采用原来的48小时逻辑
* 如果时间的类型是1表示在指定的时间之后进行退款
* 为了防止同一时刻的退款量太大,需要将退款的订单分散到指定的时间后半小时内
*/
private OrderTaskReq setAfterSalesOrderTimeOutTask(StoreResponse.Configuration configuration) {
if (configuration == null) {
return null;
}
if ((configuration.getTimeTypeOfRefund() != null && 2 == configuration.getTimeTypeOfRefund().intValue()) || configuration.getTimeTypeOfRefund() == null) {// 48小时之后
OrderTaskReq orderTask = new OrderTaskReq();
orderTask.setTaskType(4);
orderTask.setTimeout(1);
//1000*60*60*24*2 毫秒(48小时)
long timeout = 172800000;
long timeMillis = System.currentTimeMillis();
Date processingDate = new Date(timeMillis + timeout - 60000);
Date taskTime = new Date(timeMillis + timeout);
orderTask.setTaskTime(DateUtil.convert2String(taskTime, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
//处理时间,当前时间加48小时减1分钟
orderTask.setProcessingTime(DateUtil.convert2String(processingDate, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
return orderTask;
} else if (configuration.getTimeTypeOfRefund() != null && 1 == configuration.getTimeTypeOfRefund().intValue()) {// 指定时间
OrderTaskReq orderTask = new OrderTaskReq();
orderTask.setTaskType(4);
orderTask.setTimeout(1);
// 获取门店配置的当天指定的退款时间
String timeOfRefund = configuration.getTimeOfRefund();
// 获取半小时的随机数
Random r = new Random();
int minute = r.ints(1, 31).findFirst().getAsInt() * 60000;
String today = DateUtil.getCurrentDate(DateUtil.FORMAT_YMD);
Date configTime = DateUtil.convert2Date(today + " " + timeOfRefund, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
// 判断当前时间是否已经超过门店设置的截至时间
if (new Date().after(configTime)) {
today = DateUtil.convert2String(DateUtil.addDays(new Date(), 1), DateUtil.FORMAT_YMD);
configTime = DateUtil.convert2Date(today + " " + timeOfRefund, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
}
Date processingDate = new Date(configTime.getTime() + minute);
String processingStr = DateUtil.convert2String(processingDate, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
orderTask.setTaskTime(processingStr);
orderTask.setProcessingTime(processingStr);
return orderTask;
}
return null;
}
private void backOrdersNotifyActivity(QueryOrdersResponse.DataBean.OrderBean orderBean, String backOrdersChangeOrderStatusConsumerQueue, String backOrdersNotifyActivityExchange) {
if (null == orderBean || backOrdersChangeOrderStatusConsumerQueue == null || backOrdersNotifyActivityExchange == null) {
return;
}
String oid = orderBean.getOid();
Integer status = orderBean.getStatus();
if (StringUtils.isEmpty(oid)) {
return;
}
ApiLog.info("backOrdersStatusChange", oid, String.valueOf(status));
OrderStatusChangeRequestDto requestDto = new OrderStatusChangeRequestDto();
requestDto.setOid(oid);
requestDto.setOrderStatus(status);
try {
Header header = new Header(MQAction.INSERT.getAction(), "backOrdersStatusChange", oid, backOrdersChangeOrderStatusConsumerQueue);
MQMessage<OrderStatusChangeRequestDto> message = new MQMessage<>(header, requestDto);
mqService.convertAndSend(backOrdersNotifyActivityExchange, backOrdersChangeOrderStatusConsumerQueue, message);
} catch (Exception e) {
//TODO 邮件告警
ThirdPartyLog.infoConvertJson(System.currentTimeMillis(), System.currentTimeMillis(),
"backOrdersStatusChangeNotify_error", backOrdersNotifyActivityExchange, backOrdersChangeOrderStatusConsumerQueue);
}
}
}
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
*/ */
package cn.freemud.service.thirdparty; package cn.freemud.service.thirdparty;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.ResponseCodeKeyConstant;
import cn.freemud.entities.dto.ActivityCalculationDiscountRequestDto;
import cn.freemud.entities.dto.ActivityCalculationDiscountResponseDto;
import cn.freemud.entities.dto.ActivityQueryRequestDto; import cn.freemud.entities.dto.ActivityQueryRequestDto;
import cn.freemud.entities.dto.activity.ActivityQueryResponseDto; import cn.freemud.entities.dto.activity.ActivityQueryResponseDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto; import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
...@@ -23,8 +27,17 @@ import org.springframework.web.bind.annotation.*; ...@@ -23,8 +27,17 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping(produces = {"application/json;charset=UTF-8"}) @RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface PromotionDiscountClient { public interface PromotionDiscountClient {
/**无人使用,注释掉。**/
// @PostMapping("/calculation/discount/sharing")
// CalculationDiscountResponseDto discountSharing(@RequestBody CalculationDiscountRequestDto calculationDiscountRequestDto);
/**
* 新版优惠均摊计算
* @param calculationDiscountRequestDto
* @return
*/
@PostMapping("/calculation/discount/sharing") @PostMapping("/calculation/discount/sharing")
CalculationDiscountResponseDto discountSharing(@RequestBody CalculationDiscountRequestDto calculationDiscountRequestDto); ActivityCalculationDiscountResponseDto calculationDiscountSharing(CalculationDiscountRequestDto calculationDiscountRequestDto);
/** /**
* 统一活动查询接口 * 统一活动查询接口
......
package cn.freemud.controller;
import cn.freemud.OrderApplication;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreateSpellGroupOrderReq;
import com.alibaba.fastjson.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
/**
* @author freemud
* @title: SpellGroupOrderControllerTest
* @projectName order-group
* @description: TODO
* @date 2021/4/16下午3:58
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OrderApplication.class)
public class SpellGroupOrderControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
/**
* 创建订单
*/
@Test
public void createOrder() {
CreateSpellGroupOrderReq createSpellGroupOrderReq = new CreateSpellGroupOrderReq();
// createSpellGroupOrderReq.setSessionId();
// createSpellGroupOrderReq.setSpellGroupCode();
// createSpellGroupOrderReq.setStoreId("3536");
// createSpellGroupOrderReq.setPartnerId("1864");
// createSpellGroupOrderReq.setMenuType();
// createSpellGroupOrderReq.setChannelType();
// createSpellGroupOrderReq.setOrderClient();
// createSpellGroupOrderReq.setPayChannelType();
// createSpellGroupOrderReq.setOrderType();
// createSpellGroupOrderReq.setMarketingType();
// createSpellGroupOrderReq.setReceiveId();
// createSpellGroupOrderReq.setActivityCode();
// createSpellGroupOrderReq.setSpellGroupProductList();
// createSpellGroupOrderReq.setOrderRemark();
String str = JSONObject.toJSONString(createSpellGroupOrderReq);
try {
mockMvc.perform(post("/order/createSpellGroupOrder").content(str).
contentType(MediaType.APPLICATION_JSON_UTF8).accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print()).
andExpect(jsonPath("$.code").value("100"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
...@@ -25,4 +25,6 @@ public class OrderExtendedReq { ...@@ -25,4 +25,6 @@ public class OrderExtendedReq {
//订单门店英文名称 //订单门店英文名称
private String storeNameEn; private String storeNameEn;
private String spellGroupCode;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment