Commit 1e6efe63 by shuhu.hou

Merge branch 'feature/20200205_券码核销改造'

# Conflicts:
#	assortment-ordercenter-sdk/pom.xml
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/service/order/OrderCenterSdkServiceImpl.java
#	order-application-service/pom.xml
parents 7a15f317 d8deeacd
......@@ -10,7 +10,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>assortment-ordercenter-sdk</artifactId>
<version>1.1.7.RELEASE</version>
<version>1.1.8.RELEASE</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
......@@ -24,6 +24,12 @@
<scope>provided</scope>
</dependency>
<dependency>
<artifactId>couponcenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>1.8.3-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<artifactId>membercenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>2.8.3-SNAPSHOT</version>
......
package com.freemud.sdk.api.assortment.order.adapter;
import cn.freemud.base.constant.Version;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.domain.ProductRedeemVO;
import com.freemud.application.sdk.api.couponcenter.offline.domain.TransactionVO;
import com.freemud.application.sdk.api.couponcenter.offline.request.CouponRequest;
import com.freemud.application.sdk.api.membercenter.request.UserScoreRequest;
import com.freemud.application.sdk.api.ordercenter.enums.*;
import com.freemud.application.sdk.api.ordercenter.request.*;
......@@ -1998,13 +2002,6 @@ public class OrderSdkAdapter {
}
/**
* @param request
* @param orderId
* @param isReduce 是否扣减积分
* @return
*/
/**
* 积分扣减或冲正
*
* @param orderBean 订单
......@@ -2031,6 +2028,65 @@ public class OrderSdkAdapter {
return userScoreRequest;
}
public CouponRequest convert2CouponVerificationRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts){
if (CollectionUtils.isEmpty(accounts)) {
return null;
}
Optional<CreateOrderAccountRequest> accountRequest = accounts.stream().filter(account -> account.getAccountType().equals(QueryOrderAccountType.COUPON) || account.getAccountType().equals(QueryOrderAccountType.PRODUCT_COUPON)
|| account.getAccountType().equals(QueryOrderAccountType.DISCOUNT_COUPON)).findFirst();
if (!accountRequest.isPresent() || accountRequest.get().getPrice() == 0) {
return null;
}
CreateOrderAccountRequest accountBean = accountRequest.get();
List<ProductRedeemVO> products = new ArrayList<>();
//商品券核销核销参数
if (QueryOrderAccountType.PRODUCT_COUPON.equals(accountBean.getAccountType())) {
for (int i = 0; i < orderBean.getProductList().size(); i++) {
QueryOrdersResponse.DataBean.OrderBean.ProductBean productBean = orderBean.getProductList().get(i);
String pid = StringUtils.isNotBlank(productBean.getSpecification()) ? productBean.getSpecification() : productBean.getProductId();
if (!org.springframework.util.CollectionUtils.isEmpty(orderBean.getProductList().get(i).getDiscountList())) {
List<QueryOrdersResponse.DataBean.OrderBean.ProductBean.ProductDiscount> discounts = orderBean.getProductList().get(i).getDiscountList().stream().
filter(productDiscount -> productDiscount.getDiscountId().equals(accountBean.getAccountId())).collect(Collectors.toList());
for (QueryOrdersResponse.DataBean.OrderBean.ProductBean.ProductDiscount productDiscount : discounts) {
if (productDiscount.getDiscountType() == null || productDiscount.getDiscountType() == 0) {
continue;
}
ProductRedeemVO couponCodeVerificationProductDto = new ProductRedeemVO();
couponCodeVerificationProductDto.setPid(pid);
couponCodeVerificationProductDto.setConsume_num(productDiscount.getDiscountQty());
couponCodeVerificationProductDto.setSeq(i + 1);
products.add(couponCodeVerificationProductDto);
}
}
}
}
ActivityChannelEnum activityChannelEnum = Objects.equals(OldOrderType.TAKE_OUT.getCode(), orderBean.getType())?ActivityChannelEnum.delivery:ActivityChannelEnum.pickup;
CouponRequest couponCodeVerificationDto = new CouponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(71);
couponCodeVerificationDto.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
couponCodeVerificationDto.setChannel(activityChannelEnum.getCode());
couponCodeVerificationDto.setStation_id("-1");
couponCodeVerificationDto.setOperator_id("-1");
couponCodeVerificationDto.setStore_id(orderBean.getShopId());
//核销不需要核销通知
couponCodeVerificationDto.setAppFlag("kgd.N");
// 订单号 替换成唯一序号
couponCodeVerificationDto.setTrans_id(orderBean.getOid());
couponCodeVerificationDto.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
List<TransactionVO> transactions = new ArrayList<>();
TransactionVO couponCodeVerificationTransDto = new TransactionVO();
couponCodeVerificationTransDto.setCode(accountBean.getAccountId());
couponCodeVerificationTransDto.setTotalAmount(-accountBean.getPrice());
if (CollectionUtils.isNotEmpty(products)) {
couponCodeVerificationTransDto.setProducts(products);
}
transactions.add(couponCodeVerificationTransDto);
couponCodeVerificationDto.setTransactions(transactions);
return couponCodeVerificationDto;
}
public Integer getOldRefoundStatus(Integer refoundStatus) {
if (refoundStatus == null) {
return null;
......
package com.freemud.sdk.api.assortment.order.enums;
public enum ActivityChannelEnum {
// pickup-到店取餐 deliver-外卖
pickup("pickup", "到店取餐"),
delivery("delivery", "外卖");
private String code;
private String desc;
ActivityChannelEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
......@@ -53,6 +53,10 @@ public class QueryOrdersResponse {
@Data
public static class OrderBean {
/**
*
*/
private String orderClient;
/**
* 订单异常具体描述
*/
private String abnormalDesc;
......
......@@ -12,6 +12,9 @@ import com.freemud.api.assortment.datamanager.order.config.ManagerOrderBeanConfi
import com.freemud.api.assortment.datamanager.order.manager.AssortmentOrderManager;
import com.freemud.api.assortment.datamanager.order.vo.DMOrderItemVo;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.request.CouponRequest;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -118,6 +121,8 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired
private MemberCenterService memberCenterService;
@Autowired
private OfflineCouponSdkService offlineCouponSdkService;
@Override
public CreateOrderResponse createOrderFlow(CreateOrderRequest config) {
......@@ -130,9 +135,9 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
}
BaseOrderResponse baseOrderResponse = updateStockAndScore(createOrderResponse.getData(), config.getBaseCreateOrderRequest().getProducts(), config.getBaseCreateOrderRequest().getActivityUpdateStockRequest(),
config.getBaseCreateOrderRequest().getAccounts(), config.getMqMessageRequest(),config.getBaseCreateOrderRequest().getMenuType());
// if (!RESPONSE_SUCCESS.equals(baseOrderResponse.getErrcode())) {
// return getCreateOrderResponse(baseOrderResponse.getErrcode().toString(), baseOrderResponse.getErrmsg(), null);
// }
if (!RESPONSE_SUCCESS.equals(baseOrderResponse.getErrcode())) {
return getCreateOrderResponse(baseOrderResponse.getErrcode().toString(), baseOrderResponse.getErrmsg(), null);
}
return createOrderResponse;
}
......@@ -149,8 +154,11 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
return CreateFatherSonOrderResponse.error("500", "");
}
CreateFatherSonOrderRequest.OrderInfo productOrderRequest = createFatherSonOrderRequest.getOrderInfoList().stream().filter(orderBeanTemp -> 1 == orderBeanTemp.getBizType()).collect(Collectors.toList()).get(0);
updateStockAndScore(productOrderInfo.get(0), productOrderRequest.getProducts(), productOrderRequest.getActivityUpdateStockRequest(), productOrderRequest.getAccounts(),
BaseOrderResponse baseOrderResponse =updateStockAndScore(productOrderInfo.get(0), productOrderRequest.getProducts(), productOrderRequest.getActivityUpdateStockRequest(), productOrderRequest.getAccounts(),
createFatherSonOrderRequest.getMqMessageRequest(),createFatherSonOrderRequest.getMenuType());
if (!RESPONSE_SUCCESS.equals(baseOrderResponse.getErrcode())) {
return CreateFatherSonOrderResponse.error(baseOrderResponse.getErrcode().toString(), baseOrderResponse.getErrmsg());
}
return createFatherSonOrderResponse;
}
......@@ -209,11 +217,24 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
userScoreRequest = orderSdkAdapter.convent2UserScoreRequest(orderBean, accounts, false);
memberScoreService.useScore(userScoreRequest, "");
return BaseOrderResponse.getErrorBaseOrderResponse(userScoreResponse.getCode(), "积分不足");
}
}
// 核销优惠券,核销失败提示下单失败并冲正库存积分等
CouponRequest couponVerificationRequest = orderSdkAdapter.convert2CouponVerificationRequest(orderBean, accounts);
if (couponVerificationRequest!=null){
BaseResponse<CouponRedeemResponse> couponRedeemResponseBaseResponse = offlineCouponSdkService.couponRedeem(couponVerificationRequest, "");
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, couponRedeemResponseBaseResponse.getCode())) {
//TODO 失败取消订单,异步冲正库存
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "异常订单取消", "", null);
orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
return BaseOrderResponse.getErrorBaseOrderResponse(couponRedeemResponseBaseResponse.getCode(), "核销券码失败");
}
}
return BaseOrderResponse.getErrorBaseOrderResponse(RESPONSE_SUCCESS_STR, "");
}
......
......@@ -33,9 +33,14 @@
<version>1.2.1-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>couponcenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>1.8.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.freemud</groupId>
<artifactId>assortment-ordercenter-sdk</artifactId>
<version>1.1.7.RELEASE</version>
<version>1.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......
......@@ -150,6 +150,7 @@ public enum ResponseResult {
COUPON_SHOP_NOTSUPPORT("46010","优惠券在当前门店不可用"),
COUPON_ORDER_WAY_ERROR("46011", "您选择得优惠券不适用该点餐方式"),
COUPON_VERIFICATION_FAIL("46012","优惠券核销失败"),
COUPON_CALLBACK_FAIL("46013","优惠券移除卡包失败"),
/**
* 加价购商品
*/
......
......@@ -11,20 +11,16 @@ import java.util.List;
public interface CouponActivityService {
/**
* 优惠券核销
* @param couponCode 券码
* @param oid 订单ID
* @param partnerId 商户ID
* @param storeId 门店ID
* @param userId 用户ID
* @return
* 核销优惠券
* @param orderBean
*/
BaseResponse verificationCoupon(ActivityChannelEnum activityChannelEnum, String couponCode, String oid, String partnerId,
String storeId, String userId, List<CouponCodeVerificationProductDto> products, Integer discountPrice);
BaseResponse verificationCoupon(QueryOrdersResponseDto.DataBean.OrderBean orderBean);
/**
* 核销优惠券
* 移除卡包
* @param orderBean
* @return
*/
BaseResponse verificationCoupon(QueryOrdersResponseDto.DataBean.OrderBean orderBean);
BaseResponse callbackNotify(QueryOrdersResponseDto.DataBean.OrderBean orderBean) ;
}
......@@ -15,10 +15,14 @@ import cn.freemud.utils.PropertyConvertUtil;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.service.EmailAlertService;
import com.freemud.sdk.api.assortment.order.enums.OldOrderAccountType;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequest;
import com.google.common.base.Throwables;
import com.google.gson.Gson;
import org.apache.commons.collections4.CollectionUtils;
......@@ -42,28 +46,8 @@ public class CouponActivityServiceImpl implements CouponActivityService {
private CouponOfflineClient couponOfflineClient;
@Autowired
private EmailAlertService emailAlertService;
private static Gson gson = new Gson();
@Override
public BaseResponse verificationCoupon(ActivityChannelEnum activityChannelEnum, String couponCode, String oid, String partnerId,
String storeId, String userId, List<CouponCodeVerificationProductDto> products, Integer discountPrice) {
if (StringUtils.isNotBlank(couponCode)) {
CouponCodeVerificationDto couponCodeVerificationDto = couponAdapter.convert2CouponCodeVerificationDto(activityChannelEnum, couponCode, oid, partnerId, storeId, userId, products, discountPrice);
try {
//3.券核销
CouponCodeResponseDto couponCodeResponseDto = couponOfflineClient.verification(couponCodeVerificationDto);
LogUtil.info("coupond_verification_info", gson.toJson(couponCodeVerificationDto), gson.toJson(couponCodeResponseDto));
if (!Objects.equals(couponCodeResponseDto.getStatusCode(), ResponseResult.SUCCESS.getCode())) {
LogUtil.info("coupond_verification_error", gson.toJson(couponCodeVerificationDto), gson.toJson(couponCodeResponseDto));
return ResponseUtil.error(ResponseResult.COUPON_VERIFICATION_FAIL);
}
} catch (Exception e) {
LogUtil.error("verification_error", gson.toJson(couponCodeVerificationDto), "", e);
return ResponseUtil.error(ResponseResult.COUPON_VERIFICATION_FAIL);
}
}
return ResponseUtil.success();
}
@Autowired
private OfflineCouponSdkService offlineCouponSdkService;
/**
......@@ -112,7 +96,7 @@ public class CouponActivityServiceImpl implements CouponActivityService {
|| OrderAccountType.DISCOUNT_COUPON.getCode().equals(accountBean.getType())) {
CouponCodeVerificationDto couponCodeVerificationDto = couponAdapter.convert2CouponCodeVerificationDto(activityChannelEnum, accountBean.getAccountId(), orderBean.getOid(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getUserId(), products, accountBean.getPrice().intValue());
try {
//3.券核销
//71.券核销
CouponCodeResponseDto couponCodeResponseDto = couponOfflineClient.verification(couponCodeVerificationDto);
ThirdPartyLog.infoConvertJson(System.currentTimeMillis(), System.currentTimeMillis(), "/api", couponCodeVerificationDto, couponCodeResponseDto);
if (!Objects.equals(couponCodeResponseDto.getStatusCode(), ResponseResult.SUCCESS.getCode())) {
......@@ -128,4 +112,34 @@ public class CouponActivityServiceImpl implements CouponActivityService {
}
return ResponseUtil.success();
}
@Override
public BaseResponse callbackNotify(QueryOrdersResponseDto.DataBean.OrderBean orderBean) {
if (CollectionUtils.isEmpty(orderBean.getAccountList())) {
return ResponseUtil.success();
}
QueryOrdersResponseDto.DataBean.OrderBean.AccountBean accountBean = orderBean.getAccountList().stream().filter(account -> account.getType().equals(OldOrderAccountType.COUPON.getCode()) || account.getType().equals(OldOrderAccountType.PRODUCT_COUPON.getCode())
|| account.getType().equals(OldOrderAccountType.DISCOUNT_COUPON.getCode())).findFirst().orElse(null);
if (accountBean == null) {
return ResponseUtil.success();
}
String orderCode = orderBean.getOid();
String partnerId = orderBean.getCompanyId();
String couponCode=accountBean.getAccountId();
try {
//移除卡包失败,邮件报警
com.freemud.application.sdk.api.base.BaseResponse baseResponse = offlineCouponSdkService.callbackNotify(couponCode, orderCode, partnerId,"");
if (!Objects.equals(baseResponse.getStatusCode(), ResponseResult.SUCCESS.getCode())) {
emailAlertService.sendEmailAlert("券码移除卡包失败", String.format("request:%s \r\nresponse:%s","券码号:"+couponCode+"订单号:"+orderCode, JSONObject.toJSONString(baseResponse)));
return ResponseUtil.error(ResponseResult.COUPON_CALLBACK_FAIL);
}
return ResponseUtil.success();
} catch (Exception ex) {
emailAlertService.sendEmailAlert("券码移除卡包异常", String.format("request:%s \r\nexception:%s", "券码号:"+couponCode+"订单号:"+orderCode, Throwables.getStackTraceAsString(ex)));
ErrorLog.printErrorLog("verification_error", "/callbackNotify", orderCode, ex);
return ResponseUtil.error(ResponseResult.COUPON_CALLBACK_FAIL);
}
}
}
......@@ -375,11 +375,8 @@ public class OrderServiceImpl implements Orderservice {
if (!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus()) || !OrderStatus.WAIT_PAY.getCode().equals(orderBean.getStatus())) {
return sendPaySuccessNoticeMessage();
}
//核销优惠券,若核销失败直接退款
if (!ResponseResult.SUCCESS.getCode().equals(couponActivityService.verificationCoupon(orderBean).getCode())){
orderRefund(orderBean, "核销券异常退款", openid, oid);
return newSendPayFaileMessage();
}
//若该订单使用了优惠券,则移除卡包,移除失败也不退款
couponActivityService.callbackNotify(orderBean);
// 订单失败后 发消息重试 待实现
String takeCode;
String daySeq;
......
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