Commit 79b5413c by 徐康

麦咖啡下单和支付成功

parent 80a616c1
package com.freemud.sdk.api.assortment.order.entities;
import lombok.Data;
import java.util.List;
@Data
public class BatchQueryActivityInfoRequestDto {
/**
* 商户号
*/
private Integer partnerId;
/**
* 活动号集合
*/
private List<String> activeCode;
/**
* 是否需要活动商品券相关数据 1:需要
*/
private Integer isProduct;
/**
* 签名
*/
private String sign;
}
package com.freemud.sdk.api.assortment.order.entities;
import lombok.Data;
import java.util.List;
@Data
public class BatchQueryActivityInfoResponseDto {
/**
* 状态码
*/
private String statusCode;
/**
* 状态码描述
*/
private String msg;
// private List<Active> activities;
}
package com.freemud.sdk.api.assortment.order.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GetAppKeyRequestDto {
private String partnerId;
private String appId;
}
package com.freemud.sdk.api.assortment.order.entities;
import lombok.Data;
@Data
public class GetAppKeyResponseDto {
/**
* 状态码(100:成功,101:失败,-101:无效参数,-1:系统错误)
*/
private Integer statusCode;
/**
* 描述
*/
private String msg;
private Integer ver;
private DataBean data;
@Data
public static class DataBean {
private String appKey;
}
}
package com.freemud.sdk.api.assortment.order.enums;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: PayRefundStatus
* @Package cn.freemud.enums
* @Description:
* @author: jiaxin.liu
* @date: 2019/5/27 15:09
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
public enum CouponReqTypeEnum {
QUERY(0,"查询"),
CANCEL_REDEEM(3,"冲正"),
REDEEM(71,"核销"),
LOCK(89,"锁定"),
UNLOCK(90,"解锁"),
;
private Integer code;
private String desc;
CouponReqTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponReqTypeEnum getByCode(Integer code) {
if (code == null) {
return null;
}
for (CouponReqTypeEnum payStatus : values()) {
if (payStatus.getCode().equals(code)) {
return payStatus;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: OrderChannelType
* @Package cn.freemud.enums
* @Description:
* @author: liming.guo
* @date: 2018/7/3 15:06
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package com.freemud.sdk.api.assortment.order.enums;
public enum MCCafeChannelEnum {
MOCOFFEE_WX(1, "mocoffee_wx", "麦咖啡微信小程序"),
MOCOFFEE_ZFB(2, "mocoffee_zfb", "麦咖啡支付宝小程序"),
;
private int code;
private String name;
private String desc;
MCCafeChannelEnum(int code, String name, String desc) {
this.code = code;
this.name = name;
this.desc = desc;
}
public static MCCafeChannelEnum getByCode(int code) {
for (MCCafeChannelEnum type : values()) {
if (type.getCode() == code) {
return type;
}
}
return null;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.freemud.sdk.api.assortment.order.request.coupon;
import com.freemud.application.sdk.api.couponcenter.offline.domain.TransactionVO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MCCafeConponRequest {
/**
* 接口版本
*/
@NotNull
private Integer ver;
/**
* kdg.Y 开个店渠道且需要回调三方
* kgd.N 开个店渠道且不需要回调三方
*/
private String appFlag;
/**
* 需要查询的券码,仅供查询券使用
*/
private String coupon;
/**
* 请求操作类型,0是卡券查询,2是卡券交易查询,3是卡券冲正,71是卡券核销
*/
@NotNull(message = "操作不能为空")
private Integer reqtype;
/**
* 商家门店号
*/
@NotBlank(message = "商家门店号不能为空")
private String store_id;
/**
* 子品牌 ID 可以为空
*/
private String organize_id;
/**
* 组织机构ID(注意和channle的区别)
*/
private List<String> channel_ids;
/**
* 组织机构code(注意和channle的区别)
*/
private List<String> channel_codes;
/**
* 商家POS机编号
*/
@NotBlank(message = "商家POS机编号不能为空")
private String station_id;
/**
* 营业员编号
*/
@NotBlank(message = "营业员编号不能为空")
private String operator_id;
/**
* 商户编号
*/
@NotNull(message = "商户编号不能为空")
private Integer partnerId;
private Integer checkValue;
private Integer clientReqCount;
/**
* POS交易序号
*/
private String trans_id;
/**
* 营业日
*/
private String business_date;
/**
* 优惠券列表
*/
private List<MCCafeTransactionVo> transactions;
/**
* 签名
*/
private String sign;
/**
* 追加key
*/
private String appSecret;
private String openid;
private String transactionuuid;
private String status;
private Boolean isManual;
private String channel;
}
package com.freemud.sdk.api.assortment.order.request.coupon;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: CouponCodeVerificationReqVO
* @Package cn.freemud.entities.dto
* @Description:
* @author: biao.zhang
* @date: 2018/7/17 14:45
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class MCCafeCouponLockRequest {
private Integer ver;
/**
* 71 核销
* 89 锁定
* 90 解锁
*/
private Integer reqType;
/**
* 核销渠道
* 1:线下Pos
* 2:线上
* 3:pickup:麦当劳点餐
* 4:delivery:麦当劳外送
* 5:mccafe:麦当劳咖啡
* 6:mc_dessert麦当劳甜品站
* 7:SOK
* 8:ECP/CMA
* 9:mcd_alipay:麦当劳支付宝点餐
*/
private String channel;
//商户编号
private String partnerId;
//商家门店号
private String storeId;
//营业员编号
private String operatorId;
//POS机编号
private String stationId;
//交易序号
private String transId;
//券编号
private String coupon;
//三方券号
private String offerId;
//锁定/解锁次数
private String number;
private String appFlag;
private String businessDate;
//----非必传---
//预约订单时间,为空则为及时单,如:2020-06-17 12:00:00
private String advancedOrderTime;
//签名
private String sign;
private List<MCCafeTransactionVo> transactions;
}
package com.freemud.sdk.api.assortment.order.request.coupon;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MCCafeProductRedeemVo {
private String pid;
/**
* 第三方商品编号 有的话会校验
*/
private String customer_code;
private Integer seq;
private Integer consume_num;
private Integer gid;
private Integer DiscountAmount;
private String brand_code;
private String pcata;
private BigDecimal redeem_price;
//键位商品编号
private String keyProductCode;
}
package com.freemud.sdk.api.assortment.order.request.coupon;
import lombok.Data;
import java.util.List;
@Data
public class MCCafeTransactionVo {
private Integer pay_amount;
private String code;
private String ebcode;
/**
* 优惠总金额,由第三方计算,单位分
*/
private Long totalAmount;
private List<MCCafeProductRedeemVo> products;
}
package com.freemud.sdk.api.assortment.order.service;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeConponRequest;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeCouponLockRequest;
import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequest;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import java.util.List;
public interface CouponClientService {
// CouponRedeemResponse redeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest);
CouponRedeemResponse redeemBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponRedeemResponse cancelRedeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest);
CouponBaseResponse lock(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponBaseResponse unlock(MCCafeCouponLockRequest mcCafeCouponLockRequest);
}
package com.freemud.sdk.api.assortment.order.service;
import com.freemud.application.sdk.api.ordercenter.request.QueryAfterSalesOrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.response.AfterSalesListResp;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*;
public interface MCCafeOrderCenterSdkService {
/**
* 创建麦咖啡订单
*
* @return
*/
CreateOrderResponse createMCCafeOrderFlow(CreateOrderRequest createOrderRequest);
/**
* 创建麦咖啡父子订单
*/
CreateFatherSonOrderResponse createMCCafeFatherSonOrder(CreateFatherSonOrderRequest createFatherSonOrderRequest);
}
package com.freemud.sdk.api.assortment.order.service.order;
import cn.freemud.base.constant.Version;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.sdk.api.assortment.order.request.coupon.*;
import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequest;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.freemud.sdk.api.assortment.order.service.CouponClientService;
import com.freemud.sdk.api.assortment.order.service.thirdparty.CouponOfflineMCCafeClient;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class CouponClientServiceImpl implements CouponClientService {
@Autowired
private CouponOfflineMCCafeClient couponOfflineMCCafeClient;
// @Override
// public CouponRedeemResponse redeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
// if (null == orderBean || 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<MCCafeProductRedeemVo> 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;
// }
// MCCafeProductRedeemVo mcCafeProductRedeemVo = new MCCafeProductRedeemVo();
// mcCafeProductRedeemVo.setPid(pid);
// mcCafeProductRedeemVo.setKeyProductCode(productBean.getCustomerCode());
// mcCafeProductRedeemVo.setCustomer_code(productBean.getCustomerCode());
// mcCafeProductRedeemVo.setConsume_num(productDiscount.getDiscountQty());
// mcCafeProductRedeemVo.setSeq(i + 1);
// products.add(mcCafeProductRedeemVo);
// }
// }
// }
// }
// MCCafeConponRequest mcCafeConponRequest = new MCCafeConponRequest();
// mcCafeConponRequest.setVer(Integer.valueOf(Version.VERSION_1));
// mcCafeConponRequest.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
// mcCafeConponRequest.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
// mcCafeConponRequest.setStore_id(orderBean.getShopId());
// mcCafeConponRequest.setStation_id("-1");
// mcCafeConponRequest.setOperator_id("-1");
// // 订单号
// mcCafeConponRequest.setTrans_id(orderBean.getOid());
// mcCafeConponRequest.setChannel(OrderClientType.ALIPAY.getIndex().toString().equals(orderBean.getOrderClient())?MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
// List<MCCafeTransactionVo> transactions = new ArrayList<>();
// MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
// mcCafeTransactionVo.setCode(accountBean.getAccountId());
// mcCafeTransactionVo.setTotalAmount(-accountBean.getPrice());
// if (CollectionUtils.isNotEmpty(products)) {
// mcCafeTransactionVo.setProducts(products);
// }
// transactions.add(mcCafeTransactionVo);
// mcCafeConponRequest.setTransactions(transactions);
// mcCafeConponRequest.setSign("skip");
//
// mcCafeConponRequest.setAppFlag("kgd.N");
// mcCafeConponRequest.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
//
// return couponOfflineMCCafeClient.redeem(mcCafeConponRequest);
// }
@Override
public CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest) {
return couponOfflineMCCafeClient.redeem(mcCafeConponRequest);
}
@Override
public CouponRedeemResponse redeemBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
return null;
}
@Override
public CouponRedeemResponse cancelRedeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
MCCafeConponRequest mcCafeConponRequest = new MCCafeConponRequest();
return couponOfflineMCCafeClient.cancelRedeem(mcCafeConponRequest);
}
@Override
public CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest) {
return couponOfflineMCCafeClient.query(mcCafeConponRequest);
}
@Override
public CouponBaseResponse lock(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
if (null == orderBean || 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();
MCCafeCouponLockRequest couponCodeVerificationDto = new MCCafeCouponLockRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqType(CouponReqTypeEnum.LOCK.getCode());
couponCodeVerificationDto.setPartnerId(orderBean.getCompanyId());
couponCodeVerificationDto.setStoreId(orderBean.getShopId());
// 订单号
couponCodeVerificationDto.setTransId(orderBean.getOid());
couponCodeVerificationDto.setCoupon(accountBean.getAccountId());
couponCodeVerificationDto.setOfferId(accountBean.getAccountId());
couponCodeVerificationDto.setNumber("1");
couponCodeVerificationDto.setChannel(OrderClientType.ALIPAY.getIndex().toString().equals(orderBean.getOrderClient())
?MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
couponCodeVerificationDto.setOperatorId("-1");
couponCodeVerificationDto.setStationId("-1");
couponCodeVerificationDto.setSign("skip");
return couponOfflineMCCafeClient.lock(couponCodeVerificationDto);
}
@Override
public CouponBaseResponse unlock(MCCafeCouponLockRequest mcCafeCouponLockRequest) {
return couponOfflineMCCafeClient.unlock(mcCafeCouponLockRequest);
}
}
package com.freemud.sdk.api.assortment.order.service.order;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQAction;
import cn.freemud.amqp.MQMessage;
import cn.freemud.amqp.MQService;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.api.assortment.datamanager.order.config.ManagerOrderBeanConfig;
import com.freemud.api.assortment.datamanager.order.manager.AssortmentOrderManager;
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.CouponBaseResponse;
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.LogThreadLocal;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.membercenter.request.UserScoreRequest;
import com.freemud.application.sdk.api.membercenter.service.MemberCenterService;
import com.freemud.application.sdk.api.membercenter.service.MemberPropertyService;
import com.freemud.application.sdk.api.membercenter.service.MemberScoreService;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.request.create.CreateFatherSonOrderReq;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService;
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.stockapi.request.UpdateStocksRequest;
import com.freemud.application.sdk.api.stockapi.service.StockSdkService;
import com.freemud.application.sdk.api.storecenter.request.vo.GetOrgTreeListRequest;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.application.sdk.api.structure.service.MessageCenterClient;
import com.freemud.sdk.api.assortment.order.adapter.ActivitySdkAdapter;
import com.freemud.sdk.api.assortment.order.adapter.MemberSdkAdapter;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.OldOrderType;
import com.freemud.sdk.api.assortment.order.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.StockChangeType;
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.CreateFatherSonOrderResponse;
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.CouponClientService;
import com.freemud.sdk.api.assortment.order.service.MCCafeOrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
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;
@Import(ManagerOrderBeanConfig.class)
@Service
public class MCCafeOrderCenterSdkServiceImpl implements MCCafeOrderCenterSdkService {
@Autowired
private StockSdkService stockSdkService;
@Autowired
private PromotionSdkService promotionSdkService;
@Autowired
private OrderSdkAdapter orderSdkAdapter;
@Autowired
private MemberSdkAdapter memberSdkAdapter;
@Autowired
private ActivitySdkAdapter activitySdkAdapter;
@Autowired
private MQService mqService;
@Autowired
private MemberScoreService memberScoreService;
@Autowired
private MemberPropertyService memberPropertyService;
@Autowired
private OrderSdkService orderSdkService;
@Autowired
private StoreCenterService storeCenterService;
@Autowired
private OrderDownLoadSdkService orderDownLoadSdkService;
@Autowired
private MealCacheManager mealCacheManager;
@Autowired
private AssortmentOrderManager assortmentOrderManager;
@Autowired(required = false)
private MessageCenterClient messageCenterClient;
@Autowired
private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired
private MemberCenterService memberCenterService;
@Autowired
private OfflineCouponSdkService offlineCouponSdkService;
@Autowired
private OrderCenterSdkService orderCenterSdkService;
@Autowired
private CouponClientService couponClientService;
@Override
public CreateOrderResponse createMCCafeOrderFlow(CreateOrderRequest config) {
com.freemud.application.sdk.api.ordercenter.request.create.CreateOrderRequest request = orderSdkAdapter.convent2NEWCreateOrderRequest(config.getBaseCreateOrderRequest());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse<OrderInfoReqs> order = orderSdkService.createOrder(request, config.getTrackingNo());
CreateOrderResponse createOrderResponse = orderSdkAdapter.convent2NEWOrderInfoReqs(order);
if (!RESPONSE_SUCCESS.equals(createOrderResponse.getErrcode())
|| createOrderResponse.getData() == null) {
return getCreateOrderResponse(createOrderResponse.getErrcode().toString(), createOrderResponse.getErrmsg(), null);
}
BaseOrderResponse baseOrderResponse = updateMCCafeStockAndScore(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);
}
return createOrderResponse;
}
@Override
public CreateFatherSonOrderResponse createMCCafeFatherSonOrder(CreateFatherSonOrderRequest createFatherSonOrderRequest) {
CreateFatherSonOrderReq request = orderSdkAdapter.convent2NEWCreateFatherSonOrderRequest(createFatherSonOrderRequest);
com.freemud.application.sdk.api.ordercenter.response.BaseResponse<List<OrderInfoReqs>> baseResponse = orderSdkService.createFatherSonOrder(request, createFatherSonOrderRequest.getTrackingNo());
if (!RESPONSE_SUCCESS_STR.equals(baseResponse.getCode()) || baseResponse.getResult() == null) {
return CreateFatherSonOrderResponse.error(baseResponse.getCode(), baseResponse.getMessage());
}
CreateFatherSonOrderResponse createFatherSonOrderResponse = orderSdkAdapter.convent2NEWFatherOrderInfoReqs(baseResponse);
List<QueryOrdersResponse.DataBean.OrderBean> productOrderInfo = createFatherSonOrderResponse.getOrderBeanList().stream().filter(orderBeanTemp -> 1 == orderBeanTemp.getBizType()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(productOrderInfo)) {
return CreateFatherSonOrderResponse.error("500", "");
}
CreateFatherSonOrderRequest.OrderInfo productOrderRequest = createFatherSonOrderRequest.getOrderInfoList().stream().filter(orderBeanTemp -> 1 == orderBeanTemp.getBizType()).collect(Collectors.toList()).get(0);
BaseOrderResponse baseOrderResponse =updateMCCafeStockAndScore(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;
}
private BaseOrderResponse updateMCCafeStockAndScore(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderProductRequest> products, ActivityUpdateStockRequest updateStockRequest,
List<CreateOrderAccountRequest> accounts, MqMessageRequest mqMessageRequest, String menuType) {
//TODO 转换获取库存信息,扣减库存
UpdateStocksRequest updateStocksRequest = orderSdkAdapter.getUpdateProductStock(orderBean, products, StockChangeType.REDUCE,menuType);
if (updateStocksRequest != null && CollectionUtils.isNotEmpty(updateStocksRequest.getProductStocks())) {
BaseResponse baseResponse = stockSdkService.reducesStocks(updateStocksRequest, "");
ThirdPartyLog.infoConvertJson(System.currentTimeMillis(), System.currentTimeMillis(),
"updateStock", JSONObject.toJSONString(updateStocksRequest), JSONObject.toJSONString(baseResponse));
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, baseResponse.getCode())) {
//TODO 失败取消订单
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "商品库存不足", "", null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
return BaseOrderResponse.getErrorBaseOrderResponse(baseResponse.getCode(), "商品库存不足");
}
}
//TODO 扣减活动库存
ActivityUpdateStockRequest activityUpdateStockRequest = orderSdkAdapter.convert2ActivityUpdateStockRequest(orderBean, updateStockRequest);
if (activityUpdateStockRequest != null && CollectionUtils.isNotEmpty(activityUpdateStockRequest.getStock())) {
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);
orderCenterSdkService.orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
return BaseOrderResponse.getErrorBaseOrderResponse(activityResponse.getCode(), "活动库存不足");
}
}
// 扣减积分,扣减失败冲正积分返回错误
UserScoreRequest userScoreRequest = orderSdkAdapter.convent2UserScoreRequest(orderBean, accounts, true);
if (userScoreRequest != null) {
BaseResponse userScoreResponse = memberScoreService.useScore(userScoreRequest, "");
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, userScoreResponse.getCode())) {
//TODO 失败取消订单,异步冲正库存
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "积分不足", "", null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
return BaseOrderResponse.getErrorBaseOrderResponse(userScoreResponse.getCode(), "积分不足");
}
}
CouponBaseResponse couponRedeemResponse = couponClientService.lock(orderBean, accounts);
if (couponRedeemResponse!=null){
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, couponRedeemResponse.getStatusCode())) {
//TODO 失败取消订单,异步冲正库存
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "冻结券码失败", "", null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
//失败异步冲正库存,取消订单
backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
return BaseOrderResponse.getErrorBaseOrderResponse(couponRedeemResponse.getStatusCode(), "冻结券码失败");
}
}
// 如果是自提,则冻结优惠券,失败提示下单失败并冲正库存积分等
// 如果是外卖,则核销优惠券,失败提示下单失败并冲正库存积分等
// if(OldOrderType.TAKE_OUT.getCode().equals(orderBean.getType())) {
// CouponRedeemResponse couponRedeemResponse = couponClientService.redeem(orderBean, accounts);
//
// if (couponRedeemResponse!=null){
//
// if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, couponRedeemResponse.getStatusCode())) {
// //TODO 失败取消订单,异步冲正库存
// CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
// AfterSalesType.SYSTEM_CANCEL, "核销券码失败", "", null);
// orderCenterSdkService.orderCancel(cancelOrderRequest);
// //失败异步冲正库存,取消订单
// backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
// return BaseOrderResponse.getErrorBaseOrderResponse(couponRedeemResponse.getStatusCode(), "核销券码失败");
// }
// }
// } else if(OldOrderType.COLLECT_GOODS.getCode().equals(orderBean.getType()) || OldOrderType.EAT_IN.getCode().equals(orderBean.getType())) {
// CouponRedeemResponse couponRedeemResponse = couponClientService.lock(orderBean, accounts);
//
// if (couponRedeemResponse!=null){
//
// if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, couponRedeemResponse.getStatusCode())) {
// //TODO 失败取消订单,异步冲正库存
// CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
// AfterSalesType.SYSTEM_CANCEL, "冻结券码失败", "", null);
// orderCenterSdkService.orderCancel(cancelOrderRequest);
// //失败异步冲正库存,取消订单
// backOrdersNotifyActivity(orderBean, mqMessageRequest.getBackOrdersNotifyActivityQueue(), mqMessageRequest.getBackOrdersNotifyActivityExchange());
// return BaseOrderResponse.getErrorBaseOrderResponse(couponRedeemResponse.getStatusCode(), "冻结券码失败");
// }
// }
// }
return BaseOrderResponse.getErrorBaseOrderResponse(RESPONSE_SUCCESS_STR, "");
}
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);
}
}
private CreateOrderResponse getCreateOrderResponse(String code, String message, QueryOrdersResponse.DataBean.OrderBean data) {
CreateOrderResponse baseOrderResponse = new CreateOrderResponse();
baseOrderResponse.setErrcode(Integer.valueOf(code));
baseOrderResponse.setErrmsg(message);
baseOrderResponse.setData(data);
return baseOrderResponse;
}
/**
* 查询门店的组织机构
* @param partnerId
* @param storeCode
* @return
*/
private List<String> getOrgIds(String partnerId, String storeCode) {
GetOrgTreeListRequest request = new GetOrgTreeListRequest();
request.setPartnerId(partnerId);
request.setStoreCode(storeCode);
BaseResponse<List<String>> orgList = storeCenterService.getOrgList(request, LogThreadLocal.getTrackingNo());
if (orgList != null && ResponseResult.SUCCESS.getCode().equals(orgList.getCode())) {
return orgList.getData();
}
return null;
}
}
package com.freemud.sdk.api.assortment.order.service.thirdparty;
import com.freemud.sdk.api.assortment.order.entities.BatchQueryActivityInfoRequestDto;
import com.freemud.sdk.api.assortment.order.entities.GetAppKeyRequestDto;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
//测试环境:http://115.159.65.101:8082 生产环境:https://onlinecoupon.sandload.cn
@FeignClient(name = "CARDBINMCCafeCLIENT",url="fff")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CardBinMCCafeClient {
/**
* 获取麦咖啡券码密钥
* @param requestDto
* @return
*/
@PostMapping("/mccafe/getAppKey")
GetAppKeyRequestDto getMCCafeAppKey(GetAppKeyRequestDto requestDto);
/**
* 麦咖啡活动信息批量查询
* @param requestDto
* @return
*/
@PostMapping(value = "/mccafe/batchQueryActivityInfo")
BatchQueryActivityInfoRequestDto batchQueryMCCafeActivityInfo(BatchQueryActivityInfoRequestDto requestDto);
}
package com.freemud.sdk.api.assortment.order.service.thirdparty;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeCouponLockRequest;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeConponRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "COUPONMCCafe",url="http://coupon-api-gateway-koderover-dev-coupon.api-ingress.sandload.cn")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CouponOfflineMCCafeClient {
@PostMapping("/mccafe/redeem")
CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest);
@PostMapping("/mccafe/cancelRedeem")
CouponRedeemResponse cancelRedeem(MCCafeConponRequest mcCafeConponRequest);
@PostMapping("/mccafe/query")
CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest);
@PostMapping("/mccafe/lock")
CouponBaseResponse lock(MCCafeCouponLockRequest MCCafeCouponLockRequest);
@PostMapping("/mccafe/unlock")
CouponBaseResponse unlock(MCCafeCouponLockRequest MCCafeCouponLockRequest);
}
package com.freemud.sdk.api.assortment.coupon;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.freemud.application.sdk.api.base.BaseRequest;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.constant.FMStatusCode;
import com.freemud.application.sdk.api.couponcenter.config.CouponOfflineApiConstant;
import com.freemud.application.sdk.api.couponcenter.config.CouponOfflineCenterProperties;
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.couponcenter.offline.response.CouponQueryResponse;
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.LogThreadLocal;
import com.freemud.application.sdk.api.storecenter.request.vo.GetOrgTreeListRequest;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.application.sdk.api.util.BaseRequestUtils;
import com.freemud.application.sdk.api.util.RequestThirdPartyUtils;
import com.freemud.application.sdk.api.util.ResponseUtils;
import com.freemud.application.sdk.api.util.ValidationUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;
import java.util.*;
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;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: OrderCenterSdkServiceImplTest
* @Package com.freemud.sdk.api.assortment.order.service.order
* @Description: 简单描述下这个类是做什么用的
* @author: dingda.li
* @date: 2019-07-25 11:19
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目的
*/
public class CouponSdkServiceTest {
@Autowired
private StoreCenterService storeCenterService;
@Autowired
private RestTemplate restTemplate;
/**
* 券核销
*/
@Test
public void couponRedeem71() {
CouponRequest couponRequest = new CouponRequest();
couponRequest.setReqtype(71);
couponRequest.setStore_id("111");
couponRequest.setStation_id("222");
couponRequest.setTrans_id("333");
couponRequest.setChannel("5");
List<TransactionVO> transactionVOList = new ArrayList<>();
TransactionVO transactionVO = new TransactionVO();
transactionVO.setCode("9800gtx");
List<ProductRedeemVO> productRedeemVOList = new ArrayList<>();
ProductRedeemVO productRedeemVO = new ProductRedeemVO();
productRedeemVO.setSeq(1);
productRedeemVO.setConsume_num(10);
productRedeemVO.setPid("1000555");
productRedeemVOList.add(productRedeemVO);
transactionVO.setProducts(productRedeemVOList);
transactionVOList.add(transactionVO);
couponRequest.setTransactions(transactionVOList);
couponRequest.setVer(1);
couponRequest.setPartnerId(1000);
BaseResponse validateResponse = ValidationUtils.validate(couponRequest);
if (!ResponseUtils.isSuccess(validateResponse)) {
System.out.println(JSON.toJSONString(validateResponse));
return ;
}
BaseRequest<CouponRequest> request = new BaseRequest();
request.setRequestBody(couponRequest);
request.setAppName("Order");
request.setBaseUrl("");
request.setTrackingNo(UUID.randomUUID().toString());
CouponQueryResponse couponQueryResponse = RequestThirdPartyUtils.httpJsonReqComplex(restTemplate, CouponOfflineApiConstant.COUPON_API,
request, new TypeReference<CouponQueryResponse>(){});
if (couponQueryResponse.getStatusCode() != RESPONSE_SUCCESS) {
System.out.println(couponQueryResponse.getMsg());
return ;
}
System.out.println(couponQueryResponse);
}
/**
* 券冲正
*/
@Test
public void couponRedeem3() {
CouponRequest couponRequest = new CouponRequest();
couponRequest.setReqtype(3);
couponRequest.setStore_id("111");
couponRequest.setStation_id("222");
couponRequest.setTrans_id("333");
couponRequest.setChannel("5");
List<TransactionVO> transactionVOList = new ArrayList<>();
TransactionVO transactionVO = new TransactionVO();
transactionVO.setCode("9800gtx");
List<ProductRedeemVO> productRedeemVOList = new ArrayList<>();
ProductRedeemVO productRedeemVO = new ProductRedeemVO();
productRedeemVO.setSeq(1);
productRedeemVO.setConsume_num(10);
productRedeemVO.setPid("1000555");
productRedeemVOList.add(productRedeemVO);
transactionVO.setProducts(productRedeemVOList);
transactionVOList.add(transactionVO);
couponRequest.setTransactions(transactionVOList);
couponRequest.setVer(1);
couponRequest.setPartnerId(1000);
BaseResponse validateResponse = ValidationUtils.validate(couponRequest);
if (!ResponseUtils.isSuccess(validateResponse)) {
System.out.println(JSON.toJSONString(validateResponse));
return ;
}
BaseRequest<CouponRequest> request = new BaseRequest();
request.setRequestBody(couponRequest);
request.setAppName("Order");
request.setBaseUrl("");
request.setTrackingNo(UUID.randomUUID().toString());
CouponQueryResponse couponQueryResponse = RequestThirdPartyUtils.httpJsonReqComplex(restTemplate, CouponOfflineApiConstant.COUPON_API,
request, new TypeReference<CouponQueryResponse>(){});
if (couponQueryResponse == null) {
System.out.println("查询券列表返回Null");
return;
}
if (couponQueryResponse.getStatusCode() != RESPONSE_SUCCESS) {
System.out.println(couponQueryResponse.getMsg());
return ;
}
System.out.println(couponQueryResponse);
}
}
\ No newline at end of file
...@@ -42,7 +42,7 @@ import tk.mybatis.spring.annotation.MapperScan; ...@@ -42,7 +42,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@ComponentScan({"cn.freemud", "com.freemud"}) @ComponentScan({"cn.freemud", "com.freemud"})
@MapperScan({"cn.freemud.*.dao","com.freemud.sdk.api.assortment.orderdistributor.mapper","com.freemud.api.assortment.datamanager.manager", @MapperScan({"cn.freemud.*.dao","com.freemud.sdk.api.assortment.orderdistributor.mapper","com.freemud.api.assortment.datamanager.manager",
"com.freemud.api.assortment.datamanager.queue.dao","com.freemud.api.assortment.datamanager.rbac.dao","com.freemud.api.assortment.datamanager.queue.entity"}) "com.freemud.api.assortment.datamanager.queue.dao","com.freemud.api.assortment.datamanager.rbac.dao","com.freemud.api.assortment.datamanager.queue.entity"})
@EnableFeignClients({"cn.freemud.service.thirdparty","com.freemud.sdk.api.assortment.message"}) @EnableFeignClients({"cn.freemud.service.thirdparty","com.freemud.sdk.api.assortment.message","com.freemud.sdk.api.assortment.order.service.thirdparty"})
@EnableAutoConfiguration @EnableAutoConfiguration
public class OrderApplication { public class OrderApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -19,6 +19,7 @@ import cn.freemud.entities.vo.encircle.EmptyTableNumberVo; ...@@ -19,6 +19,7 @@ import cn.freemud.entities.vo.encircle.EmptyTableNumberVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo; import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.monitorcenter.tools.HealthUtil; import cn.freemud.monitorcenter.tools.HealthUtil;
import cn.freemud.service.EncircleOrderService; import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.MCCafeOrderService;
import cn.freemud.service.OrderAdapterService; import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.Orderservice; import cn.freemud.service.Orderservice;
import cn.freemud.utils.ResponseUtil; import cn.freemud.utils.ResponseUtil;
...@@ -49,6 +50,8 @@ public class OrderController { ...@@ -49,6 +50,8 @@ public class OrderController {
private EncircleOrderService encircleOrderService; private EncircleOrderService encircleOrderService;
@Autowired @Autowired
private MallOrderServiceImpl mallOrderService; private MallOrderServiceImpl mallOrderService;
@Autowired
private MCCafeOrderService mcCafeOrderService;
/** /**
* 创建订单之前校验前面排队的订单数 * 创建订单之前校验前面排队的订单数
...@@ -76,6 +79,15 @@ public class OrderController { ...@@ -76,6 +79,15 @@ public class OrderController {
} }
/** /**
* 麦咖啡创建订单
*/
@ApiAnnotation(logMessage = "createMCCafeOrder")
@PostMapping("/createMCCafeOrder")
public BaseResponse createOrderMCCafe(@Validated @LogParams @RequestBody CreateOrderVo createOrderVo) {
return orderAdapterService.createMCCafeOrder(createOrderVo);
}
/**
* 扫脸支付下单 * 扫脸支付下单
*/ */
@ApiAnnotation(logMessage = "scanFaceCreateOrder") @ApiAnnotation(logMessage = "scanFaceCreateOrder")
...@@ -112,6 +124,15 @@ public class OrderController { ...@@ -112,6 +124,15 @@ public class OrderController {
} }
/** /**
* 麦咖啡订单支付成功后通知
*/
@ApiAnnotation(logMessage = "mcCafePaySuccessCallback")
@PostMapping({"/mcCafePaySuccessCallback","/openStoreMCCafeQueryPaymentCallback"})
public String mcCafePaySuccessCallback(@LogParams @RequestBody NewPaysuccessNoticeMessage message) {
return mcCafeOrderService.mcCafePaySuccessCallback(message);
}
/**
* 退款回掉通知 * 退款回掉通知
*/ */
@ApiAnnotation(logMessage = "refundNotifyCallback") @ApiAnnotation(logMessage = "refundNotifyCallback")
......
package cn.freemud.entities.dto.shoppingCart;
import cn.freemud.entities.dto.OrderProductAddInfo;
import cn.freemud.entities.vo.SubtractStockVO;
import com.alibaba.fastjson.JSON;
import lombok.Builder;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Data
public class MCCafeShoppingCartGoodsDto extends ShoppingCartGoodsDto {
private String thirdCouponCode;
}
package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.*;
import java.util.Map;
/**
* 订单服务
*
* @author liming.guo
* @date 2018/05/08
*/
public interface MCCafeOrderService {
/**
* 创建麦咖啡订单
*/
BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo);
/**
* 麦咖啡支付成功回调
*/
String mcCafePaySuccessCallback(NewPaysuccessNoticeMessage message);
/**
* 支付回调
*/
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
}
...@@ -27,6 +27,13 @@ public interface OrderAdapterService { ...@@ -27,6 +27,13 @@ public interface OrderAdapterService {
BaseResponse createOrderNew(CreateOrderVo createOrderVo); BaseResponse createOrderNew(CreateOrderVo createOrderVo);
/** /**
* 麦咖啡创建订单
* @param createOrderVo
* @return
*/
BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo);
/**
* 创建预支付 * 创建预支付
*/ */
BaseResponse createPrepay(CreatePrepayVo createPrepayVo); BaseResponse createPrepay(CreatePrepayVo createPrepayVo);
...@@ -41,4 +48,9 @@ public interface OrderAdapterService { ...@@ -41,4 +48,9 @@ public interface OrderAdapterService {
*/ */
String paySuccessCallback(PaysuccessNoticeMessage message); String paySuccessCallback(PaysuccessNoticeMessage message);
/**
* 支付回调处理
*/
String mcCafePaySuccessCallback(PaysuccessNoticeMessage message);
} }
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
package cn.freemud.service.impl; package cn.freemud.service.impl;
import cn.freemud.base.constant.Version;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.StoreConstant; import cn.freemud.constant.StoreConstant;
...@@ -34,7 +35,9 @@ import cn.freemud.service.CouponService; ...@@ -34,7 +35,9 @@ import cn.freemud.service.CouponService;
import cn.freemud.service.thirdparty.ShoppingCartClient; import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.StockClient; import cn.freemud.service.thirdparty.StockClient;
import cn.freemud.utils.LogUtil; import cn.freemud.utils.LogUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappConfig; import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappConfig;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerStoreDeliveryConfig; import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerStoreDeliveryConfig;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo; import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
...@@ -42,6 +45,7 @@ import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIapp ...@@ -42,6 +45,7 @@ import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIapp
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerStoreDeliveryConfigManager; import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerStoreDeliveryConfigManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager; import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.application.sdk.api.base.BaseResponse; import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
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.StatisticalPropertyRequest; import com.freemud.application.sdk.api.membercenter.request.StatisticalPropertyRequest;
...@@ -54,6 +58,9 @@ import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest; ...@@ -54,6 +58,9 @@ import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse; import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse; import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService; import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.sdk.api.assortment.order.enums.CouponReqTypeEnum;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeConponRequest;
import com.freemud.sdk.api.assortment.order.service.CouponClientService;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.gson.Gson; import com.google.gson.Gson;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -108,6 +115,8 @@ public class CheckOrder { ...@@ -108,6 +115,8 @@ public class CheckOrder {
private ItemServiceImpl itemService; private ItemServiceImpl itemService;
@Autowired @Autowired
private CouponService couponService; private CouponService couponService;
@Autowired
private CouponClientService couponClientService;
private static Gson gson = new Gson(); private static Gson gson = new Gson();
/** /**
* 下单会员相关校验 * 下单会员相关校验
...@@ -498,6 +507,98 @@ public class CheckOrder { ...@@ -498,6 +507,98 @@ public class CheckOrder {
return shoppingCartGoodsDto; return shoppingCartGoodsDto;
} }
public ShoppingCartGoodsDto getMCCafeShoppingCartGoodsDto(CreateOrderVo createOrderVo) {
ShoppingCartInfoRequestVo.BuyMemberCard buyMemberCard = null;
if (createOrderVo.getBuyMemberCard() != null) {
buyMemberCard = new ShoppingCartInfoRequestVo.BuyMemberCard();
buyMemberCard.setPaidId(createOrderVo.getBuyMemberCard().getPaidId());
buyMemberCard.setRuleId(createOrderVo.getBuyMemberCard().getRuleId());
}
ShoppingCartInfoRequestVo shoppingCartInfoRequestVo = ShoppingCartInfoRequestVo.builder()
.partnerId(createOrderVo.getPartnerId())
.shopId(createOrderVo.getShopId())
.version(createOrderVo.getVersion())
.sessionId(createOrderVo.getSessionId())
.orderType(createOrderVo.getOrderType())
.reachStoreType(createOrderVo.getReachStoreType())
.flag(CouponFlag.NO.getCode())
.receiveId(createOrderVo.getReceiveId())
.useCustomerScore(createOrderVo.getUseCustomerScore())
.buyMemberCard(buyMemberCard)
.menuType(createOrderVo.getMenuType())
.build();
// 如果使用优惠券或者商品券,校验 couponCode
// if (StringUtils.isNotBlank(createOrderVo.getCouponCode())) {
// // 校验couponCode
// GetCouponDetailResponseDto getCouponDetailResponseDto = couponService.getMemberCoupon(GetMemberCouponRequestVo.builder()
// .partnerId(createOrderVo.getPartnerId())
// .couponCode(createOrderVo.getCouponCode()).build());
// if (Objects.equals(getCouponDetailResponseDto, null) || CollectionUtils.isEmpty(getCouponDetailResponseDto.getDetails())
// || getCouponDetailResponseDto.getDetails().get(0).getActive() == null
// || getCouponDetailResponseDto.getDetails().get(0).getActive().getActiveCode() == null) {
// if ((CollectionUtils.isNotEmpty(getCouponDetailResponseDto.getDetails().get(0).getActiveRestrictionVOS())
// && CollectionUtils.isEmpty(getCouponDetailResponseDto.getDetails().get(0).getActiveRestrictionVOS().stream()
// .filter(a -> Objects.equals(a.getStoreIdPartner(), createOrderVo.getShopId())).collect(Collectors.toList()))
// )) {
// throw new ServiceException(ResponseResult.COUPON_SHOP_NOTSUPPORT);
// } else {
// throw new ServiceException(ResponseResult.COUPON_GETINFO_INVAILD);
// }
// }
// String activeCode = getCouponDetailResponseDto.getDetails().get(0).getActive().getActiveCode();
// // 校验点餐方式,查询购物车接口内部已校验
// shoppingCartInfoRequestVo.setCouponCode(createOrderVo.getCouponCode());
// // 活动code
// shoppingCartInfoRequestVo.setActivityCode(activeCode);
// shoppingCartInfoRequestVo.setCardCode(createOrderVo.getCardCode());
// }
if (StringUtils.isNotBlank(createOrderVo.getCouponCode())) {
// 校验couponCode
CouponQueryResponse couponQueryResponse = couponClientService.query(MCCafeConponRequest.builder()
.ver(Integer.valueOf(Version.VERSION_1))
.reqtype(CouponReqTypeEnum.QUERY.getCode())
.partnerId(Integer.parseInt(createOrderVo.getPartnerId()))
.store_id(createOrderVo.getShopId())
.station_id("1")
.operator_id(createOrderVo.getUserId())
.channel(createOrderVo.getChannel())
.coupon(createOrderVo.getCouponCode())
.sign("skip")
.build());
if (couponQueryResponse == null || !ResponseResult.SUCCESS.getCode().equals(couponQueryResponse.getStatusCode())) {
throw new ServiceException(ResponseResult.COUPON_SHOP_NOTSUPPORT);
}
String activeCode = couponQueryResponse.getCodeInfo().getAct_id();
// 校验点餐方式,查询购物车接口内部已校验
shoppingCartInfoRequestVo.setCouponCode(createOrderVo.getCouponCode());
// 活动code
shoppingCartInfoRequestVo.setActivityCode(activeCode);
shoppingCartInfoRequestVo.setCardCode(createOrderVo.getCardCode());
}
// 通过购物车获取优惠信息
GetShoppingCartGoodsApportionDto requestDto = new GetShoppingCartGoodsApportionDto();
requestDto.setShoppingCartInfoRequestVo(shoppingCartInfoRequestVo);
//加价购商品 校验放购物车校验
requestDto.setPremiumExchangeActivity(createOrderVo.getPremiumExchangeActivity());
// cn.freemud.base.entity.BaseResponse<ShoppingCartGoodsDto> apportionResponse = shoppingCartClient.getShoppingCartGoodsApportionNew(requestDto);
cn.freemud.base.entity.BaseResponse<ShoppingCartGoodsDto> apportionResponse = JSON.parseObject(
"{\"code\":\"100\",\"message\":\"success\",\"result\":{\"activityDiscountsDtos\":[{\"activityCode\":\"MMJ2020080414450543441\",\"activityName\":\"231321313\",\"activityType\":11,\"discountAmount\":-200}],\"isDiscountDelivery\":false,\"originalTotalAmount\":1600,\"packageAmount\":2,\"products\":[{\"activityDiscountsDtos\":[{\"activityCode\":\"MMJ2020080414450543441\",\"activityName\":\"231321313\",\"activityType\":11,\"discountAmount\":124}],\"attributeNames\":\"{\\\"attributeNames\\\":\\\"微辣\\\"}\",\"classificationId\":\"\",\"customerCode\":\"144101061128506371\",\"extraList\":[{\"attributeId\":\"141178803539043623\",\"attributeName\":\"微辣\"}],\"hasProductCoupon\":false,\"materialList\":[{\"activityDiscountsDtos\":[{\"activityCode\":\"MMJ2020080414450543441\",\"activityName\":\"231321313\",\"activityType\":11,\"discountAmount\":13}],\"attributeNames\":\"{\\\"attributeNames\\\":\\\"\\\"}\",\"extraList\":[],\"hasProductCoupon\":false,\"originalPrice\":100,\"spuId\":\"180924094892495124\",\"spuName\":\"红豆\",\"stockLimit\":false,\"totalDiscountAmount\":26},{\"activityDiscountsDtos\":[{\"activityCode\":\"MMJ2020080414450543441\",\"activityName\":\"231321313\",\"activityType\":11,\"discountAmount\":26}],\"attributeNames\":\"{\\\"attributeNames\\\":\\\"\\\"}\",\"extraList\":[],\"hasProductCoupon\":false,\"originalPrice\":200,\"spuId\":\"180924005379756305\",\"spuName\":\"奶盖\",\"stockLimit\":false,\"totalDiscountAmount\":52}],\"originalPrice\":800,\"picture\":\"https://img10.sandload.cn/zfd0x0.jpg?timestamp=1593831027040\",\"productType\":88,\"qty\":2,\"skuId\":\"144101061128506371\",\"skuName\":\"红烧鱼块\",\"spuId\":\"144101061128506371\",\"spuName\":\"红烧鱼块\",\"stockLimit\":false,\"totalDiscountAmount\":202,\"unit\":\"\",\"weight\":0.0}],\"reduceScore\":140,\"scoreReduceAmount\":1400,\"stocks\":[{\"activityCode\":\"MMJ2020080414450543441\",\"activityStock\":1,\"activityType\":11,\"goodsStock\":[]}],\"totalAmount\":1400,\"totalDiscountAmount\":200},\"ver\":\"1\"}"
, new TypeReference<cn.freemud.base.entity.BaseResponse<ShoppingCartGoodsDto>>(){}
);
if (!ObjectUtils.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, apportionResponse.getCode())) {
ResponseResult responseResult = ResponseResult.getResponseResult(apportionResponse.getCode());
throw new ServiceException(responseResult != null ? responseResult : ResponseResult.SHOPPING_CART_GETINFO_ERROR );
}
if (apportionResponse.getResult() == null || CollectionUtils.isEmpty(apportionResponse.getResult().getProducts())) {
throw new ServiceException(ResponseResult.SHOPPING_CART_GETINFO_INVAILD);
}
ShoppingCartGoodsDto shoppingCartGoodsDto = apportionResponse.getResult();
if (shoppingCartGoodsDto.getOriginalTotalAmount() == null) {
throw new ServiceException(ResponseResult.SHOPPING_CART_GETINFO_INVAILD);
}
return shoppingCartGoodsDto;
}
/** /**
* 获取门店配送信息 * 获取门店配送信息
*/ */
......
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: OrderServiceImpl
* @Package cn.freemud.service.impl
* @Description:
* @author: liming.guo
* @date: 2018/5/17 20:55
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.impl;
import cn.freemud.adapter.*;
import cn.freemud.amp.body.MessagePushNewMqBody;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQAction;
import cn.freemud.amqp.MQMessage;
import cn.freemud.amqp.MQService;
import cn.freemud.base.constant.Version;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.OrderRefundConstant;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.PayAccessResponse;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean;
import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseDto;
import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto;
import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup;
import cn.freemud.entities.dto.product.ProductGroup;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.*;
import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.BeanUtil;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.ResponseUtil;
import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.*;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.api.assortment.datamanager.manager.*;
import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.application.sdk.api.deliverycenter.response.DeliveryInfoDto;
import com.freemud.application.sdk.api.deliverycenter.response.DeliveryResponseDto;
import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.paymentcenter.client.request.CodePayRequest;
import com.freemud.application.sdk.api.paymentcenter.client.request.SVCCardAmountRequest;
import com.freemud.application.sdk.api.paymentcenter.client.response.CodePayResponse;
import com.freemud.application.sdk.api.paymentcenter.client.response.SVCCardAmountResponse;
import com.freemud.application.sdk.api.paymentcenter.client.service.PaymentNewService;
import com.freemud.application.sdk.api.storecenter.request.GetListByCodesRequest;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.GetListByCodesResponse;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto;
import com.freemud.application.sdk.api.structure.service.MessageCenterClient;
import com.freemud.sdk.api.assortment.message.config.MessageOfficialRefundPushMqConfig;
import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsg;
import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsgDataValue;
import com.freemud.sdk.api.assortment.message.enums.MessageEventType;
import com.freemud.sdk.api.assortment.message.request.MessagePushOrderTemplateRequest;
import com.freemud.sdk.api.assortment.message.request.MessageTemplateRequest;
import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushService;
import com.freemud.sdk.api.assortment.order.enums.CouponReqTypeEnum;
import com.freemud.sdk.api.assortment.order.enums.MCCafeChannelEnum;
import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeConponRequest;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeCouponLockRequest;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeProductRedeemVo;
import com.freemud.sdk.api.assortment.order.request.coupon.MCCafeTransactionVo;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import com.freemud.sdk.api.assortment.order.service.CouponClientService;
import com.freemud.sdk.api.assortment.order.service.MCCafeOrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest;
import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse;
import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse;
import com.freemud.sdk.api.assortment.payment.service.StandardPaymentService;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR;
@Service
@Slf4j
public class MCCafeOrderServiceImpl implements MCCafeOrderService {
private final Integer RESPONSE_SUCCESS_CODE = 100;
private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}")
private String reverseNotifyiDcUrl;
@Value("${program.backorders_change_order_status_consumer_queue}")
private String backOrdersChangeOrderStatusConsumerQueue;
@Value("${program.backorders_notify_activity_exchange}")
private String backOrdersNotifyActivityExchange;
@Value("${mq.queue.cloud_print_queue}")
private String cloudPrintQueue;
@Value("${mq.cloud_print_exchange}")
private String cloud_print_exchange;
@Autowired
private AssortmentCloudPrinterManager cloudPrinterManager;
@Autowired
private FMAssistantCloudPrintClient fmAssistantCloudPrintClient;
@Autowired
private MessageCenterClient messageNoticeClient;
@Autowired
private PromotionActivityClient promotionActivityClient;
@Autowired
private ShoppingCartClient shoppingCartClient;
@Autowired
private CustomerApplicationClient customerApplicationClient;
@Autowired
private ItemServiceImpl itemService;
@Autowired
private BuriedPointService buriedPointService;
@Autowired
private CouponActivityService couponActivityService;
@Autowired
private MessageNoticeAdapter messageNoticeAdapter;
@Autowired
private OrderAdapter orderAdapter;
@Autowired
private ActivityAdapter activityAdapter;
@Autowired
private CouponAdapter couponAdapter;
@Autowired
private MealCacheManager mealCacheManager;
//聚合订单服务
@Autowired
private OrderCenterSdkService orderCenterSdkService;
@Autowired
private MCCafeOrderCenterSdkService mcCafeOrderCenterSdkService;
@Autowired
private StandardPaymentService standardPaymentService;
//门店SDK
@Autowired
private StoreCenterService storeCenterService;
@Autowired
private DeliveryService deliveryService;
@Autowired
private MQService mqService;
@Autowired
@Qualifier("messageTemplatePushOrderService")
private IMessageTemplatePushService<MessagePushOrderTemplateRequest> messageTemplatePushService;
@Autowired
private AssortmentOpenPlatformWxappManager openPlatformWxappManager;
@Autowired
private AssortmentOpenPlatformPartnerConfigManager openPlatformPartnerConfigManager;
@Autowired
private AssortmentCustomerInfoManager customerInfoManager;
@Autowired
private CheckOrder checkOrder;
@Autowired
private RedisCache redisCache;
@Autowired
private PaymentQueueService paymentQueueService;
@Autowired
private PaymentNewService paymentNewService;
@Autowired
private ActivityApplicationClient activityApplicationClient;
@Autowired
private AssortmentOpenPlatformWxappAuthorizerManager wxappAuthorizerManager;
@Autowired
private PaymentNewClient paymentNewClient;
@Autowired
private CacheOpenPlatformPartnerWxappConfigManager cacheOpenPlatformPartnerWxappConfigManager;
@Autowired
private OrderAdapterService orderAdapterService;
@Autowired
private AssortmentOpenPlatformPartnerManager assortmentOpenPlatformPartnerManager;
@Autowired
private CouponClientService couponClientService;
@Override
public BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo) {
String trackingNo = LogThreadLocal.getTrackingNo();
// 查询用户信息、校验svc卡,余额购物车校验
AssortmentCustomerInfoVo userLoginInfoDto = checkOrder.checkOrderByMember(createOrderVo, trackingNo);
// 查询门店信息 营业时间、营业状态,服务器当前时间在营业时间内 点餐桌号
StoreResponse.BizVO storeResponseDto = checkOrder.checkOrderByStore(createOrderVo, trackingNo);
// 查询购物车(内部校验券点餐方式,券是否可用) 校验当前订单类型的下单参数
ShoppingCartGoodsDto shoppingCartGoodsDto = checkOrder.getMCCafeShoppingCartGoodsDto(createOrderVo);
// 查询小程序自提外卖配置信息 校验当前订单类型的下单参数 校验外卖是否满足起送条件
Integer pushOrderTime = checkOrder.checkOrderByOrderType(createOrderVo, userLoginInfoDto, storeResponseDto, shoppingCartGoodsDto, trackingNo);
OrderExtInfoDto extInfo = getExtInfo(userLoginInfoDto, storeResponseDto, pushOrderTime, createOrderVo);
//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);
}
/**
* 获取预支付成功,将信息放入死心队列,当支付成功没有回掉的时候处理
*
* @param partnerId
* @param storeId
* @param fmId
* @param orderId
*/
public void putDelMq(String partnerId, String storeId, String fmId, String orderId) {
PaymentMqMessageDto dto = new PaymentMqMessageDto();
try {
dto.setFmId(fmId);
dto.setOrderId(orderId);
dto.setPartnerId(partnerId);
dto.setStoreId(storeId);
dto.setTrackingNo(LogThreadLocal.getTrackingNo());
paymentQueueService.paymentCallback(dto);
} catch (Exception e) {
log.info("paymentQueueService.paymentCallback" + dto + " error" + e);
}
}
@Override
public String mcCafePaySuccessCallback(NewPaysuccessNoticeMessage newMessage) {
PaysuccessNoticeMessage message = new PaysuccessNoticeMessage();
message.setResult_code(StringUtils.isBlank(newMessage.getResultCode()) ? 0 : Integer.valueOf(newMessage.getResultCode()));
message.setOut_trade_no(StringUtils.isBlank(newMessage.getTransactionCode()) ? "" : newMessage.getTransactionCode());
message.setTrans_id(StringUtils.isBlank(newMessage.getTransId()) ? "" : newMessage.getTransId());
message.setTotal_fee(newMessage.getTotalAmount() == null ? 0 : newMessage.getTotalAmount());
message.setOpenid(StringUtils.isBlank(newMessage.getOpenId()) ? "" : newMessage.getOpenId());
message.setPlatform_coupon(newMessage.getPlatformCoupon() == null ? 0 : newMessage.getPlatformCoupon());
message.setMerchant_coupon(newMessage.getPlatformCoupon() == null ? 0 : newMessage.getPlatformCoupon());
message.setPaid_no(newMessage.getThirdPartTradeNo());
message.setEndTransId(newMessage.getEndTransId());
message.setPlatformMchId(newMessage.getPlatformMchId());
message.setTerminalId(newMessage.getAppId());
message.setRuleId(newMessage.getRuleId());
String res = orderAdapterService.mcCafePaySuccessCallback(message);
JSONObject jsonObject = JSONObject.parseObject(res);
if (jsonObject.containsKey("code")) {
Integer code = (Integer) jsonObject.get("code");
if (Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_0, code) || Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS, code)) {
// 新版支付成功的情况下code为100
return newSendPaySuccessNoticeMessage();
} else {
return newSendPayFaileMessage();
}
}
return newSendPayFaileMessage();
}
public QueryRelationOrderByIdResponseDto getQueryRelationOrderByIdResponseDto(String oid) {
QueryRelatedOrderByCodeRequest baseQueryOrderRequest = new QueryRelatedOrderByCodeRequest();
baseQueryOrderRequest.setOrderCode(oid);
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
QueryRelatedOrderByCodeResp queryOrderByIdResponse;
queryOrderByIdResponse = orderCenterSdkService.queryRelatedOrderByCode(baseQueryOrderRequest);
String string = JSONObject.toJSONString(queryOrderByIdResponse);
JSONObject jsonObject = JSONObject.parseObject(string);
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = jsonObject.toJavaObject(QueryRelationOrderByIdResponseDto.class);
String orderString = JSONObject.toJSONString(queryOrderByIdResponse.getOrderBeanList());
queryOrderByIdResponseDto.setData(JSONArray.parseArray(orderString, OrderBean.class));
return queryOrderByIdResponseDto;
}
public void backOrdersStatusChange(String oid, Integer orderStatus) {
if (StringUtils.isEmpty(oid)) {
return;
}
ApiLog.info("backOrdersStatusChange", oid, String.valueOf(orderStatus));
OrderStatusChangeRequestDto requestDto = new OrderStatusChangeRequestDto();
requestDto.setOid(oid);
requestDto.setOrderStatus(orderStatus);
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) {
LogUtil.error("ActivityReverse", JSON.toJSONString(requestDto), "", e);
}
}
private QueryOrderByIdResponseDto getQueryOrderByIdResponseDto(String oid) {
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
baseQueryOrderRequest.setOrderId(oid);
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
String string = JSONObject.toJSONString(queryOrderByIdResponse);
JSONObject jsonObject = JSONObject.parseObject(string);
return jsonObject.toJavaObject(QueryOrderByIdResponseDto.class);
}
/**
* 支付后通知确认返回信息
*/
public String newSendPaySuccessNoticeMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 100);
map.put("message", "success");
return gson.toJson(map);
}
/**
* 支付后通知失败返回信息
*/
public String newSendPayFaileMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 500);
map.put("message", "failed");
return gson.toJson(map);
}
/**
* 发送模板消息
*
* @param orderBean
* @param messageEventType
*/
private void sendMessage(OrderBean orderBean, MessageEventType messageEventType) {
MessageTemplateRequest<MessagePushOrderTemplateRequest> messageTemplateRequest = null;
try {
messageTemplateRequest = messageNoticeAdapter.convent2MessageTemplateRequest(orderBean);
messageTemplateRequest.setMessageEventType(messageEventType);
this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
} catch (Exception e) {
LogUtil.error("sendTemplateMsg_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(messageTemplateRequest), e);
}
}
/**
* 获取父子订单商品第三方商品编号
*
* @param
* @return
*/
private CreateFatherSonOrderRequest getProductCustomerCodeNew(CreateFatherSonOrderRequest fatherSonOrderRequest) {
List<String> pids = new ArrayList<>();
List<CreateFatherSonOrderRequest.OrderInfo> productOrderInfoList = fatherSonOrderRequest.getOrderInfoList().stream().filter(orderInfo -> orderInfo.getProducts() != null).collect(Collectors.toList());
if (CollectionUtils.isEmpty(productOrderInfoList)) {
return fatherSonOrderRequest;
}
for (CreateOrderProductRequest productDto : productOrderInfoList.get(0).getProducts()) {
pids.add(productDto.getProductId());
}
Map<String, GetProductsVo> products = itemService.getSpuProducts(pids, fatherSonOrderRequest.getPartnerId(), productOrderInfoList.get(0).getShopId(),fatherSonOrderRequest.getMenuType());
if (products.isEmpty()) {
return fatherSonOrderRequest;
}
for (CreateOrderProductRequest productDto : productOrderInfoList.get(0).getProducts()) {
if (StringUtils.isNotEmpty(productDto.getSpecification()) && products.get(productDto.getSpecification()) != null) {
productDto.setCustomerCode(products.get(productDto.getSpecification()).getCustomerCode());
productDto.setProductCode(products.get(productDto.getSpecification()).getProductCode());
productDto.setThirdProductSpecId(products.get(productDto.getSpecification()).getThirdProductSpecId());
productDto.setThirdProductPropertyId(getThirdPropertyId(products.get(productDto.getSpecification()).getProductAttributeGroupList(),productDto.getAddInfo()));
} else {
productDto.setCustomerCode("");
productDto.setProductCode("");
LogUtil.error("getProducts_exception", JSONObject.toJSONString(pids), JSONObject.toJSONString(products));
}
//套餐子商品
if(CollectionUtils.isNotEmpty(productDto.getComboProduct())){
for (CreateOrderProductRequest comboProduct : productDto.getComboProduct()){
String comboSkuId = comboProduct.getSpecification();
if (products.get(comboSkuId) != null) {
comboProduct.setCustomerCode(products.get(comboSkuId).getCustomerCode());
comboProduct.setProductCode(products.get(comboSkuId).getProductCode());
comboProduct.setThirdProductSpecId(products.get(comboSkuId).getThirdProductSpecId());
comboProduct.setThirdProductPropertyId(getThirdPropertyId(products.get(comboSkuId).getProductAttributeGroupList(),comboProduct.getAddInfo()));
} else {
comboProduct.setCustomerCode("");
comboProduct.setProductCode("");
LogUtil.error("getProducts_exception", JSONObject.toJSONString(comboSkuId), JSONObject.toJSONString(products), null);
}
}
}
}
return fatherSonOrderRequest;
}
/**
* 获取商品第三方商品编号
*
* @param createOrderDto
* @return
*/
private BaseCreateOrderRequest getProductCustomerCode(BaseCreateOrderRequest createOrderDto) {
List<String> spuIds = new ArrayList<>();
for (CreateOrderProductRequest productDto : createOrderDto.getProducts()) {
spuIds.add(productDto.getProductId());
}
Map<String, GetProductsVo> products = itemService.getSpuProducts(spuIds, createOrderDto.getCompanyId(), createOrderDto.getShopId(),createOrderDto.getMenuType());
if (products.isEmpty()) {
return createOrderDto;
}
for (CreateOrderProductRequest productDto : createOrderDto.getProducts()) {
String skuId = productDto.getSpecification();
if (products.get(skuId) != null) {
productDto.setCustomerCode(products.get(skuId).getCustomerCode());
productDto.setProductCode(products.get(skuId).getProductCode());
productDto.setThirdProductSpecId(products.get(productDto.getSpecification()).getThirdProductSpecId());
productDto.setThirdProductPropertyId(getThirdPropertyId(products.get(productDto.getSpecification()).getProductAttributeGroupList(),productDto.getAddInfo()));
// todo 商品组信息
setProductGroupInfo(products.get(skuId).getProductGroupList(), productDto);
} else {
productDto.setCustomerCode("");
productDto.setProductCode("");
LogUtil.error("getProducts_exception", JSONObject.toJSONString(skuId), JSONObject.toJSONString(products), null);
}
//套餐子商品
if(CollectionUtils.isNotEmpty(productDto.getComboProduct())){
for (CreateOrderProductRequest comboProduct : productDto.getComboProduct()){
String comboSkuId = comboProduct.getSpecification();
System.out.println(comboSkuId);
if (products.get(comboSkuId) != null) {
comboProduct.setCustomerCode(products.get(comboSkuId).getCustomerCode());
comboProduct.setProductCode(products.get(comboSkuId).getProductCode());
comboProduct.setThirdProductSpecId(products.get(comboSkuId).getThirdProductSpecId());
comboProduct.setThirdProductPropertyId(getThirdPropertyId(products.get(comboSkuId).getProductAttributeGroupList(),comboProduct.getAddInfo()));
comboProduct.setStapleFood(products.get(comboSkuId).getStapleFood());
// todo 套餐商品的商品组信息
setProductGroupInfo(products.get(comboSkuId).getProductGroupList(), comboProduct);
} else {
comboProduct.setCustomerCode("");
comboProduct.setProductCode("");
LogUtil.error("getProducts_exception", JSONObject.toJSONString(skuId), JSONObject.toJSONString(products), null);
}
}
}
}
return createOrderDto;
}
/**
* 设置商品组信息
* @param productGroupList
* @param product
*/
private void setProductGroupInfo(List<ProductGroup> productGroupList, CreateOrderProductRequest product) {
if (CollectionUtils.isEmpty(productGroupList)) return;
List<ProductGroupVo> targetGroupList = Lists.newArrayList();
for (ProductGroup productGroup : productGroupList) {
for (GroupDetail groupDetail : productGroup.getGroupDetail()) {
ProductGroupVo productGroupVo = ProductGroupVo.builder()
.groupId(groupDetail.getGroupId()).groupName(productGroup.getName())
.thirdGroupId(productGroup.getGroupCode()).build();
if (!targetGroupList.contains(productGroupVo)) {
targetGroupList.add(productGroupVo);
}
}
}
product.setProductGroupList(targetGroupList);
}
private String getThirdPropertyId(List<ProductAttributeGroup> productAttributeGroups, String addInfo) {
String thirdProductPropertyId = "";
if(StringUtils.isBlank(addInfo) || CollectionUtils.isEmpty(productAttributeGroups) ){
return thirdProductPropertyId;
}
JSONObject jsonObject = JSONObject.parseObject(addInfo);
String attributeNames = (String)jsonObject.get("attributeNames");
List<String> list = new ArrayList<>();
String[] split = attributeNames.split("/");
List<AttributeValue> attributeValues = new ArrayList<>();
for (ProductAttributeGroup attributeGroup : productAttributeGroups){
attributeValues.addAll(attributeGroup.getAttributeValues());
}
for (int i= 0;i<split.length;i++){
for (AttributeValue attributeValue : attributeValues){
if(attributeValue.getAttributeValue().equals(split[i])){
list.add(attributeValue.getCustomerCode());
break;
}
}
}
if (CollectionUtils.isNotEmpty(list)) {
thirdProductPropertyId = StringUtils.join(list, ",");
}
return thirdProductPropertyId;
}
/**
* 创建订单调用集成,不区分订单类型
*
* @return
*/
public BaseResponse sdkCreateOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto, ShoppingCartGoodsDto shoppingCartGoodsDto,
AssortmentCustomerInfoVo userLoginInfoDto) {
CreateOrderOperateDto response = new CreateOrderOperateDto();
OrderExtendedReq orderExtendedReq = orderAdapter.saveStoreInfo(storeResponseDto);
OrderClientType orderClient = OrderClientType.SAAS;
String appId = userLoginInfoDto.getWxAppId();
if(UserLoginChannelEnum.ALIPAY.getCode().equals(userLoginInfoDto.getChannel()) ){
orderClient = OrderClientType.ALIPAY;
} else if(UserLoginChannelEnum.APP.getCode().equals(userLoginInfoDto.getChannel())) {
orderClient = OrderClientType.APP;
}
long totalAmount = 0;
int cardAmount = 0;
QueryOrdersResponse.DataBean.OrderBean fatherBeanListOne = new QueryOrdersResponse.DataBean.OrderBean();
QueryOrdersResponse.DataBean.OrderBean productBeanListOne = new QueryOrdersResponse.DataBean.OrderBean();
if (createOrderVo.getBuyMemberCard() != null && StringUtils.isNotEmpty(createOrderVo.getBuyMemberCard().getRuleId()) && StringUtils.isNotEmpty(createOrderVo.getBuyMemberCard().getPaidId())) {
//父子订单
int cardOriginalAmount = shoppingCartGoodsDto.getCardOriginalAmount() == null ? 0 : shoppingCartGoodsDto.getCardOriginalAmount();
int cardDiscountAmount = shoppingCartGoodsDto.getCardDiscountAmount() == null ? 0 : shoppingCartGoodsDto.getCardDiscountAmount();
cardAmount = cardOriginalAmount - cardDiscountAmount;
CreateFatherSonOrderResponse createFatherSonOrderResponse = createFatherSonOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, orderExtendedReq,appId);
if (ObjectUtils.notEqual(Integer.valueOf(ResponseResult.SUCCESS.getCode()), createFatherSonOrderResponse.getErrcode())) {
return ResponseUtil.error(createFatherSonOrderResponse.getErrcode().toString(), createFatherSonOrderResponse.getErrmsg());
}
List<QueryOrdersResponse.DataBean.OrderBean> orderBeanList = createFatherSonOrderResponse.getOrderBeanList();
List<QueryOrdersResponse.DataBean.OrderBean> fatherBeanList = orderBeanList.stream().filter(orderBeanTemp -> orderBeanTemp.getIsParent()).collect(Collectors.toList());
List<QueryOrdersResponse.DataBean.OrderBean> productBeanList = orderBeanList.stream().filter(orderBeanTemp -> 1 == orderBeanTemp.getBizType()).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(fatherBeanList)) fatherBeanListOne = fatherBeanList.get(0);
if (CollectionUtils.isNotEmpty(productBeanList)) productBeanListOne = productBeanList.get(0);
//订单总金额 商品+会员卡
totalAmount = orderBeanList.stream().mapToLong(QueryOrdersResponse.DataBean.OrderBean::getAmount).count();
fatherBeanList.get(0).setShopId(storeResponseDto.getStoreCode());
fatherBeanList.get(0).setCompanyId(createOrderVo.getPartnerId());
} else {
//普通订单
CreateOrderResponse createOrderFlowResponse = createOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, orderExtendedReq, orderClient,appId);
if (ObjectUtils.notEqual(Integer.valueOf(ResponseResult.SUCCESS.getCode()), createOrderFlowResponse.getErrcode())) {
return ResponseUtil.error(createOrderFlowResponse.getErrcode().toString(), createOrderFlowResponse.getErrmsg());
}
fatherBeanListOne = createOrderFlowResponse.getData();
productBeanListOne = createOrderFlowResponse.getData();
totalAmount = createOrderFlowResponse.getData().getAmount();
}
response.setTotalAmount(totalAmount);
response.setCardAmount(cardAmount);
response.setFatherOrderBean(fatherBeanListOne);
response.setProductOrderBean(productBeanListOne);
return ResponseUtil.success(response);
}
/**
* 创建预支付订单
*/
public BaseResponse createPrepayOrder(CreatePrepayRequestDto createPrepayRequestDto) {
CreateOrderResponseVo createOrderResponse;
OrderPayResponse orderPayResponse = null;
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode());
long totalAmount = createPrepayRequestDto.getTotalAmount();
String cardCode = createPrepayRequestDto.getCardCode();
String transId = createPrepayRequestDto.getTransId();
if (totalAmount < 0) {
throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR);
} else if (totalAmount > 0 && StringUtils.isBlank(cardCode)) {
orderPayResponse = getPreOrderPay(createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getCardAmount(), transId);
} else if (totalAmount > 0 && StringUtils.isNotBlank(cardCode)) {
//svc卡支付
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, transId, LogThreadLocal.getTrackingNo());
} else {
// 0元订单如果不需要支付,自定义支付单号
orderPayResponse = getOrderPayResponse(paymentRequest, createPrepayRequestDto.getFatherOrderBean());
}
if (orderPayResponse == null) {
return failPreOrderPay(LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getProductOrderBean(), cardCode, createPrepayRequestDto.getOrderClient());
}
createOrderResponse = orderAdapter.convent2CreateFatherSonOrderResponseVo(orderPayResponse, createPrepayRequestDto.getProductOrderBean());
BaseResponse baseEditResponse = this.updateOrderInfo(orderPayResponse, createPrepayRequestDto.getOrderExtInfoDTO(), createPrepayRequestDto.getProductOrderBean(), LogThreadLocal.getTrackingNo());
if (baseEditResponse != null) {
return baseEditResponse;
}
if (totalAmount > 0 && StringUtils.isBlank(cardCode)) {
createOrderResponse.setPaySuccess(false);
} else {
createOrderResponse.setPaySuccess(true);
}
// 推荐优惠插件用户下单数据上报
//wechatPushProcessor.statusOrderCreate(userLoginInfoDto, createOrderResponse.getOid(), createOrderVo.getPartnerId());
if (!createOrderResponse.getPaySuccess()) {
return ResponseUtil.success(createOrderResponse);
} else {
//如果是商品券支付0元,调用回调接口
PaysuccessNoticeMessage message = new PaysuccessNoticeMessage();
message.setResult_code(100);
message.setOut_trade_no(createOrderResponse.getFmId());
message.setTrans_id(createOrderResponse.getOid());
message.setTotal_fee(0);
message.setOpenid(createPrepayRequestDto.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
/**
* 创建普通订单
*/
public CreateOrderResponse createOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto, ShoppingCartGoodsDto shoppingCartGoodsDto,
OrderExtendedReq orderExtendedReq, OrderClientType orderClient,String appId) {
BaseCreateOrderRequest baseCreateOrderRequest = orderAdapter.convent2CreateOrderDto(createOrderVo, shoppingCartGoodsDto, storeResponseDto);
//查询第三方商品编号
baseCreateOrderRequest = getProductCustomerCode(baseCreateOrderRequest);
//保存门店渠道信息
baseCreateOrderRequest.setOrderExtended(orderExtendedReq);
baseCreateOrderRequest.setOrderClient(orderClient);
baseCreateOrderRequest.setAppId(appId);
CreateOrderRequest createOrderRequest = new CreateOrderRequest();
baseCreateOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
createOrderRequest.setBaseCreateOrderRequest(baseCreateOrderRequest);
MqMessageRequest mqMessageRequest = new MqMessageRequest();
mqMessageRequest.setBackOrdersNotifyActivityExchange(backOrdersNotifyActivityExchange);
mqMessageRequest.setBackOrdersNotifyActivityQueue(backOrdersChangeOrderStatusConsumerQueue);
createOrderRequest.setMqMessageRequest(mqMessageRequest);
createOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
return mcCafeOrderCenterSdkService.createMCCafeOrderFlow(createOrderRequest);
}
/**
* 创建父子订单
*/
public CreateFatherSonOrderResponse createFatherSonOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto,
ShoppingCartGoodsDto shoppingCartGoodsDto, OrderExtendedReq orderExtendedReq,
String appId) {
CreateFatherSonOrderRequest createFatherSonOrderRequest = orderAdapter.convertFatherSonOrderRequest(createOrderVo, shoppingCartGoodsDto, orderExtendedReq,storeResponseDto,appId);
//查询第三方商品编号
createFatherSonOrderRequest = getProductCustomerCodeNew(createFatherSonOrderRequest);
MqMessageRequest mqMessageRequest = new MqMessageRequest();
mqMessageRequest.setBackOrdersNotifyActivityExchange(backOrdersNotifyActivityExchange);
mqMessageRequest.setBackOrdersNotifyActivityQueue(backOrdersChangeOrderStatusConsumerQueue);
createFatherSonOrderRequest.setMqMessageRequest(mqMessageRequest);
return mcCafeOrderCenterSdkService.createMCCafeFatherSonOrder(createFatherSonOrderRequest);
}
private OrderPayResponse getOrderPayResponse(PaymentRequest paymentRequest, QueryOrdersResponse.DataBean.OrderBean orderBean) {
OrderPayResponse orderPayResponse;
String fmId = "SPAY" + ValidationCode.getRandomUuid();
orderPayResponse = orderAdapter.getOrderPayResponse(orderBean.getCompanyId(), paymentRequest,
orderBean.getOid(), fmId);
return orderPayResponse;
}
private BaseResponse failPreOrderPay(String trackingNo, QueryOrdersResponse.DataBean.OrderBean orderBean, String cardCode, OrderClientType orderClient) {
List<OrderClientType> notCancelOrderClientList = Lists.newArrayList(OrderClientType.APP);
if(!notCancelOrderClientList.contains(orderClient)) {
//失败冲正库存,冲正活动库存,取消订单
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "获取预支付失败", trackingNo, null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
// TODO: 2019/9/10 hubowen mq推送变更
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus());
}
//svc 卡支付失败
if (StringUtils.isNotBlank(cardCode)) {
return ResponseUtil.error(ResponseResultEnum.PAY_BACKEND_CONFIG_ERROR.getCode(), ResponseResultEnum.PAY_BACKEND_CONFIG_ERROR.getMessage(), null);
}
return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null);
}
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount, String transId) {
try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, transId);
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
log.error("支付SDK返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase));
return null;
}
putDelMq(request.getPartnerId(), request.getStoreId(), responseBase.getData().getFmId(), orderBean.getOid());
OrderPayResponse orderPayResponse = orderAdapter.convent2OrderPayResponse(responseBase.getData());
orderPayResponse.setWxAppid(paymentRequest.getWxAppId());
orderPayResponse.setOpenId(paymentRequest.getOpenId());
orderPayResponse.setPartnerId(orderBean.getCompanyId());
orderPayResponse.setOrderId(orderBean.getOid());
return orderPayResponse;
} catch (Exception e) {
LogUtil.error("getPreOrderPay_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(paymentRequest));
//TODO 邮件告警
return null;
}
}
public OrderPayResponse svcPay(String cardCode, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String transId, String trackingNo) {
CodePayRequest request = new CodePayRequest();
String partnerId = orderBean.getCompanyId();
request.setBody(orderBean.getShopName());
request.setBusinessDate(DateUtil.convert2String(new Date(), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
request.setCode(cardCode);
request.setPartnerId(partnerId);
request.setStoreId(orderBean.getShopId());
request.setAmount(orderBean.getAmount());
request.setTransId(transId);
request.setStationId("1");
request.setOperatorId("1");
request.setVer("2");
SVCCardAmountRequest svcRequest = new SVCCardAmountRequest();
svcRequest.setPartnerId(partnerId);
svcRequest.setCardCodes(Arrays.asList(cardCode));
//查询svc卡余额
com.freemud.application.sdk.api.base.BaseResponse<SVCCardAmountResponse> svcCardAmountResponseBaseResponse = paymentNewService.querySVCCardAmount(svcRequest, trackingNo);
if (svcCardAmountResponseBaseResponse == null || !ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(svcCardAmountResponseBaseResponse.getCode())
|| svcCardAmountResponseBaseResponse.getData().getData() == null || CollectionUtils.isEmpty(svcCardAmountResponseBaseResponse.getData().getData().getCardSimpleInfos())) {
return null;
}
Integer amount = svcCardAmountResponseBaseResponse.getData().getData().getCardSimpleInfos().get(0).getAmount();
Integer vamount = svcCardAmountResponseBaseResponse.getData().getData().getCardSimpleInfos().get(0).getVamount();
if (amount + vamount < orderBean.getAmount()) {
return null;
}
//svc卡支付
com.freemud.application.sdk.api.base.BaseResponse<CodePayResponse> responseBase = paymentNewService.codePay(request, trackingNo);
if (responseBase == null || !ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode()) || responseBase.getData().getData() == null) {
return null;
}
OrderPayResponse orderPayResponse = new OrderPayResponse();
CodePayResponse.CodePayDate codePayResponse = responseBase.getData().getData();
orderPayResponse.setFmId(codePayResponse.getFmId());
orderPayResponse.setPayTransId(codePayResponse.getPayTransId());
orderPayResponse.setWxAppid(paymentRequest.getWxAppId());
orderPayResponse.setOpenId(paymentRequest.getOpenId());
orderPayResponse.setPartnerId(orderBean.getCompanyId());
orderPayResponse.setOrderId(orderBean.getOid());
return orderPayResponse;
}
private PaymentRequest orderBodyConvertToPaymentBody(String openId, String partnerId, String appId, String payCode) {
//设置支付信息
PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setOpenId(openId);
paymentRequest.setWxAppId(appId);
AssortmentOpenPlatformWxapp wxApp = openPlatformWxappManager.findByPartnerIdAndWxappId(partnerId, appId);
AssortmentOpenPlatformPartner platformPartner = null;
if (wxApp == null) {
platformPartner = assortmentOpenPlatformPartnerManager.selectOpenPlatformPartner(partnerId);
}
paymentRequest.setPrincipalName(wxApp != null ? wxApp.getPrincipalName() : platformPartner != null ? platformPartner.getCompanyName() : "上海非码网络科技有限公司");
paymentRequest.setReverseNotifyiDcUrl(reverseNotifyiDcUrl);
paymentRequest.setPayCode(payCode);
return paymentRequest;
}
private OrderExtInfoDto getExtInfo(AssortmentCustomerInfoVo userLoginInfoDto, StoreResponse.BizVO storeResponseDto,
Integer pushOrderTime, CreateOrderVo createOrderVo) {
Integer serviceTime = storeResponseDto.getServiceTime();
String sessionId = createOrderVo.getSessionId();
String version = createOrderVo.getVersion();
CreateOrderVo.BuyMemberCard memberCard = createOrderVo.getBuyMemberCard();
String deliveryHoursDayStart = "";
String deliveryHoursDayEnd = "";
if (StringUtils.isNotBlank(storeResponseDto.getDeliveryHoursDay())) {
String[] days = storeResponseDto.getDeliveryHoursDay().split("-");
if (days.length == 2) {
deliveryHoursDayStart = DateUtil.convert2String(new Date(), DateUtil.FORMAT_yyyyMMdd_date) + " " + days[0] + ":00";
// deliveryHoursDayEnd = DateUtil.convert2String(new Date(), DateUtil.FORMAT_yyyyMMdd_date) + " " + days[1] + ":00";
}
}
OrderExtInfoDto orderExtInfoDto = new OrderExtInfoDto();
orderExtInfoDto.setDeliveryHoursDayStart(deliveryHoursDayStart);
orderExtInfoDto.setDeliveryHoursDayEnd(deliveryHoursDayEnd);
orderExtInfoDto.setOpenid(userLoginInfoDto.getOpenId());
orderExtInfoDto.setAppid(userLoginInfoDto.getWxAppId());
orderExtInfoDto.setSessionId(sessionId);
if (Objects.equals(serviceTime, null)) {
serviceTime = 50;
}
orderExtInfoDto.setServiceTime(serviceTime);
orderExtInfoDto.setPushOrderTime(pushOrderTime);
orderExtInfoDto.setVersion(version);
if (memberCard != null && memberCard.getRuleId() != null) {
orderExtInfoDto.setRuleId(memberCard.getRuleId());
}
// 扩展字段中存储 sessionKey
orderExtInfoDto.setSessionKey(createOrderVo.getSessionKey());
orderExtInfoDto.setFormId(createOrderVo.getFormId());
orderExtInfoDto.setFromAppId(userLoginInfoDto.getWxAppId());
if (StringUtils.isNotBlank(createOrderVo.getScene())) {
orderExtInfoDto.setScene(createOrderVo.getScene());
}
return orderExtInfoDto;
}
/**
* 编辑订单,保持预支付信息
*/
public BaseResponse updateOrderInfo(OrderPayResponse orderPayResponse, OrderExtInfoDto orderExtInfo
, QueryOrdersResponse.DataBean.OrderBean orderBean, String trackingNo) {
orderExtInfo.setOpenid(orderPayResponse.getOpenId());
orderExtInfo.setFmId(orderPayResponse.getFmId());
orderExtInfo.setAppid(orderPayResponse.getWxAppid());
String prepayId = "";
OrderPayResponse.PayOrderBean payOrder = orderPayResponse.getPayOrder();
// StringUtils 依赖修改
if (payOrder != null && !StringUtils.isEmpty(payOrder.getPackageX())) {
String[] prepayIds = payOrder.getPackageX().split("=");
prepayId = prepayIds.length > 1 ? prepayIds[1] : "";
}
//支付宝保存交易流水号发送支付宝模板消息
if (payOrder != null && !StringUtils.isEmpty(payOrder.getAliPayOrder())) {
prepayId = payOrder.getAliPayOrder();
}
orderExtInfo.setPrepayId(prepayId);
OrderEditRequest orderEditRequest = new OrderEditRequest(orderPayResponse.getPayTransId(),
JSONObject.toJSONString(orderExtInfo));
orderEditRequest.setOrderId(orderBean.getOid());
orderEditRequest.setTrackingNo(trackingNo);
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderEdit(orderEditRequest);
if (!ObjectUtils.equals(ResponseCodeConstant.RESPONSE_SUCCESS, baseOrderResponse.getErrcode())) {
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "编辑订单支付信息失败", trackingNo, null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
//如果编辑订单支付信息失败,冲正
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus());
return ResponseUtil.error(baseOrderResponse.getErrcode().toString(), baseOrderResponse.getErrmsg());
}
return null;
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
String oid = StringUtils.isNotEmpty(orderBean.getParentCode()) && !"0".equals(orderBean.getParentCode()) ? orderBean.getParentCode() : orderBean.getOid();
String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId();
String storeId = orderBean.getShopId();
orderBean.setPayVoucher(message.getOut_trade_no());
//编辑订单信息,获取openid,用于退款
String extInfo = orderBean.getExtInfo();
OrderExtInfoDto orderExtInfoDto = null;
String wxappid = "";
String sessionId = "";
String openid = "";
String ruleId = "";
String payCode = "";
if (StringUtils.isNotBlank(extInfo)) {
orderExtInfoDto = gson.fromJson(extInfo, OrderExtInfoDto.class);
if (orderExtInfoDto != null && StringUtils.isNotBlank(orderExtInfoDto.getOpenid())) {
openid = orderExtInfoDto.getOpenid();
wxappid = orderExtInfoDto.getAppid();
sessionId = orderExtInfoDto.getSessionId();
ruleId = orderExtInfoDto.getRuleId();
}
if (orderExtInfoDto != null && StringUtils.isNotBlank(orderExtInfoDto.getPayCode())
&& Arrays.asList(PayChannel.ALIPAY.getCode(), PayChannel.WXPAY.getCode()).contains(orderExtInfoDto.getPayCode())) {
payCode = orderExtInfoDto.getPayCode();
}
}
// 如果订单状态不是未支付,返回信息
if (!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus()) || !OrderStatus.WAIT_PAY.getCode().equals(orderBean.getStatus())) {
return sendPaySuccessNoticeMessage();
}
//核销优惠券
MCCafeConponRequest mcCafeConponRequest = convertOrderBean2CouponLockRequest(orderBean);
if(null != mcCafeConponRequest) {
CouponRedeemResponse couponRedeemResponse = couponClientService.redeem(mcCafeConponRequest);
//失败则取消订单并解锁优惠券
if(!RESPONSE_SUCCESS_CODE.equals(couponRedeemResponse.getStatusCode())) {
//异步冲正库存积分等
//TODO trackingNo来源
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "支付核销优惠券失败", "", null);
orderCenterSdkService.orderCancel(cancelOrderRequest);
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus());
throw new ServiceException(ResponseResult.COUPON_VERIFICATION_FAIL);
}
}
//若该订单使用了优惠券,则移除卡包,移除失败也不退款
couponActivityService.callbackNotify(orderBean);
// 订单失败后 发消息重试 待实现
String takeCode;
String daySeq;
PayAccessResponse payAccessResponse;
ConfirmOrderRequest var1 = LightApplicationConvertToAssortmentSdkAdapter.confirmOrderDtoConvertToConfirmOrderRequest(confirmOrderDto, orderBeans.get(OrderBeanType.MERMBERORDER.getCode()));
var1.setPartnerId(partnerId);
var1.setStoreId(storeId);
var1.setOrderType(orderBean.getType());
var1.setProductOrderCode(orderBean.getOid());
var1.setPayDate(DateUtil.convert2String(new Date(), "yyyy-MM-dd HH:mm:ss"));
var1.setPayTransId(message.getOut_trade_no());
var1.setOperator(orderBean.getUserName());
var1.setEndTransId(message.getEndTransId());
if (StringUtils.isNotBlank(payCode)) {
var1.setPayChannel(payCode);
var1.setPayChannelName(PayChannel.getByCode(payCode).getDesc());
}
if (orderBean.getGmtExpect() != null && orderBean.getGmtExpect() != 0) {
var1.setExpectTime(DateUtil.convert2String(new Date(orderBean.getGmtExpect()), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
}
// 订单支付成功
com.freemud.sdk.api.assortment.order.response.order.PayAccessResponse payAccessRes = orderCenterSdkService.payAccess(var1);
String string2 = JSONObject.toJSONString(payAccessRes);
JSONObject jsonObject2 = JSONObject.parseObject(string2);
payAccessResponse = jsonObject2.toJavaObject(PayAccessResponse.class);
// 添加幂等处理,若订单是已支付成功状态,直接返回成功
if (!RESPONSE_SUCCESS_CODE.equals(payAccessResponse.getErrcode())) {
OrderBean saasOrder = getOrderBeanByOrderId(confirmOrderDto.getOrderId()).get(OrderBeanType.SAASORDER.getCode());
if (saasOrder != null && (!PayStatus.NOT_PAY.getCode().equals(saasOrder.getPayStatus()) || !OrderStatus.WAIT_PAY.getCode().equals(saasOrder.getStatus()))) {
return sendPaySuccessNoticeMessage();
}
LogUtil.error("paySuccessCallback_payAccess_faild", gson.toJson(confirmOrderDto), gson.toJson(payAccessResponse));
//orderRefund(orderBean, "订单异常退款", openid, oid);
return gson.toJson(message);
}
// TODO 订单序号替换取餐码显示
takeCode = payAccessResponse.getData().getTakeCode();
daySeq = payAccessResponse.getData().getDaySeq();
//TODO 清空购物车
NewShoppingCartClearDto newShoppingCartClearDto = new NewShoppingCartClearDto();
newShoppingCartClearDto.setPartnerId(partnerId);
newShoppingCartClearDto.setShopId(storeId);
newShoppingCartClearDto.setUserId(userId);
newShoppingCartClearDto.setAppId(wxappid);
newShoppingCartClearDto.setSessionId(sessionId);
newShoppingCartClearDto.setOperationType(1);
shoppingCartClient.clearShoppingCart(newShoppingCartClearDto);
if (StringUtils.isNotBlank(daySeq) && orderExtInfoDto != null && !OrderType.TAKE_OUT.getCode().equals(orderBean.getType())) {
String storeAddress = StringUtils.isNotBlank(orderBean.getAddress()) ? orderBean.getAddress() : "";
orderBean.setAddress(storeAddress);
orderBean.setOtherCode(takeCode);
//发送支付成功模板消息
this.sendPaySuccessMessage(orderBean);
}
// 有云打印机 打印小票,杯贴
try {
List<AssortmentCloudPrinter> storePrinters = cloudPrinterManager.getStorePrinters(partnerId, storeId);
if (null != storePrinters && storePrinters.size() > 0) {
boolean printerStatus = false;
for (AssortmentCloudPrinter cloudPrinter : storePrinters) {
if (null != cloudPrinter.getStatus() && cloudPrinter.getStatus() == 1) {
printerStatus = true;
}
}
//在线打印
if (printerStatus) {
OrderPrintDto orderPrintDto = orderAdapter.convert2OrderPrintDto(orderBean);
orderPrintDto.setDaySeq(daySeq);
orderPrintDto.setOtherCode(takeCode);
asynchronousPrint(orderPrintDto);
}
}
} catch (Exception e) {
LogUtil.error("cloudPrint_error", null, null, e);
}
//TODO 埋点支付行为
BuriedPointPaymentRequestDto requestDto = new BuriedPointPaymentRequestDto();
requestDto.setStoreId(storeId);
requestDto.setPartnerId(partnerId);
requestDto.setWxAppId(wxappid);
requestDto.setSessionId(sessionId);
requestDto.setOpenId(orderExtInfoDto != null ? orderExtInfoDto.getOpenid() : "");
buriedPointService.BuriedPointPayment(requestDto, orderBean);
// 开通会员卡
if (StringUtils.isNotBlank(ruleId)) {
this.activateMemberCard(partnerId, ruleId, oid, userId);
}
//支付回掉成功标记
redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES);
return sendPaySuccessNoticeMessage();
}
private List<CreateOrderAccountRequest> convertOrderBean2Accounts(OrderBean orderBean) {
List<CreateOrderAccountRequest> list = new ArrayList<>();
if(CollectionUtils.isNotEmpty(orderBean.getAccountList())) {
orderBean.getAccountList().forEach(o -> {
CreateOrderAccountRequest createOrderAccountDto = CreateOrderAccountRequest.builder()
.accountId(o.getAccountId())
.name(o.getName())
.price(o.getPrice())
.accountType(orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(o.getType())))
.sequence(o.getSequence())
.orderId(o.getOrderId())
.build();
list.add(createOrderAccountDto);
});
}
return list;
}
private MCCafeConponRequest convertOrderBean2CouponLockRequest(OrderBean orderBean) {
if (null == orderBean || CollectionUtils.isEmpty(orderBean.getAccountList())) {
return null;
}
Optional<OrderBean.AccountBean> accountRequest = orderBean.getAccountList().stream().filter(
account -> orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.COUPON)
|| orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.PRODUCT_COUPON)
|| orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.DISCOUNT_COUPON)).findFirst();
if (!accountRequest.isPresent() || accountRequest.get().getPrice() == 0) {
return null;
}
OrderBean.AccountBean accountBean = accountRequest.get();
List<MCCafeProductRedeemVo> products = new ArrayList<>();
//商品券核销核销参数
if (QueryOrderAccountType.PRODUCT_COUPON.equals(orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(accountBean.getType())))) {
for (int i = 0; i < orderBean.getProductList().size(); i++) {
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<OrderBean.ProductBean.ProductDiscount> discounts = orderBean.getProductList().get(i).getDiscountList().stream().
filter(productDiscount -> productDiscount.getDiscountId().equals(accountBean.getAccountId())).collect(Collectors.toList());
for (OrderBean.ProductBean.ProductDiscount productDiscount : discounts) {
if (productDiscount.getDiscountType() == null || productDiscount.getDiscountType() == 0) {
continue;
}
MCCafeProductRedeemVo mcCafeProductRedeemVo = new MCCafeProductRedeemVo();
mcCafeProductRedeemVo.setPid(pid);
mcCafeProductRedeemVo.setKeyProductCode(productBean.getCustomerCode());
mcCafeProductRedeemVo.setCustomer_code(productBean.getCustomerCode());
mcCafeProductRedeemVo.setConsume_num(productDiscount.getDiscountQty());
mcCafeProductRedeemVo.setSeq(i + 1);
products.add(mcCafeProductRedeemVo);
}
}
}
}
MCCafeConponRequest mcCafeConponRequest = new MCCafeConponRequest();
mcCafeConponRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeConponRequest.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
mcCafeConponRequest.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
mcCafeConponRequest.setStore_id(orderBean.getShopId());
mcCafeConponRequest.setStation_id("-1");
mcCafeConponRequest.setOperator_id("-1");
// 订单号
mcCafeConponRequest.setTrans_id(orderBean.getOid());
mcCafeConponRequest.setChannel(OrderSourceType.ALIPAY.getCode().equals(orderBean.getSource())?
MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
List<MCCafeTransactionVo> transactions = new ArrayList<>();
MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
mcCafeTransactionVo.setCode(accountBean.getAccountId());
mcCafeTransactionVo.setTotalAmount(-accountBean.getPrice());
if (CollectionUtils.isNotEmpty(products)) {
mcCafeTransactionVo.setProducts(products);
}
transactions.add(mcCafeTransactionVo);
mcCafeConponRequest.setTransactions(transactions);
mcCafeConponRequest.setSign("skip");
mcCafeConponRequest.setAppFlag("kgd.N");
mcCafeConponRequest.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
return mcCafeConponRequest;
}
private MCCafeCouponLockRequest convertOrderBean2CouponUnlockRequest(OrderBean orderBean) {
if (null == orderBean || CollectionUtils.isEmpty(orderBean.getAccountList())) {
return null;
}
Optional<OrderBean.AccountBean> accountRequest = orderBean.getAccountList().stream().filter(
account -> orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.COUPON)
|| orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.PRODUCT_COUPON)
|| orderAdapter.getQueryOrderAccountType(orderAdapter.getOrderAccountType(account.getType())).equals(QueryOrderAccountType.DISCOUNT_COUPON)).findFirst();
if (!accountRequest.isPresent() || accountRequest.get().getPrice() == 0) {
return null;
}
OrderBean.AccountBean accountBean = accountRequest.get();
MCCafeCouponLockRequest mcCafeCouponLockRequest = new MCCafeCouponLockRequest();
mcCafeCouponLockRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeCouponLockRequest.setReqType(CouponReqTypeEnum.UNLOCK.getCode());
mcCafeCouponLockRequest.setPartnerId(orderBean.getCompanyId());
mcCafeCouponLockRequest.setStoreId(orderBean.getShopId());
// 订单号
mcCafeCouponLockRequest.setTransId(orderBean.getOid());
mcCafeCouponLockRequest.setCoupon(accountBean.getAccountId());
mcCafeCouponLockRequest.setOfferId(accountBean.getAccountId());
mcCafeCouponLockRequest.setNumber("1");
mcCafeCouponLockRequest.setChannel(OrderSourceType.ALIPAY.getCode().equals(orderBean.getSource())?
MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
mcCafeCouponLockRequest.setOperatorId("-1");
mcCafeCouponLockRequest.setStationId("-1");
mcCafeCouponLockRequest.setSign("skip");
return mcCafeCouponLockRequest;
}
/**
* 支付后通知确认返回信息
*/
public String sendPaySuccessNoticeMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 0);
map.put("message", "success");
return gson.toJson(map);
}
public Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
// 订单查询:若结果集只有一个orderBean,则为普通订单,否则为会员卡订单(父子订单)
Map<String, OrderBean> result = new HashMap<>();
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(orderId);
if (CollectionUtils.isEmpty(queryOrderByIdResponseDto.getData())) {
return result;
}
if (1 == queryOrderByIdResponseDto.getData().size()) {
result.put(OrderBeanType.SAASORDER.getCode(), queryOrderByIdResponseDto.getData().get(0));
} else {
List<OrderBean> saasOrderBeans = queryOrderByIdResponseDto.getData().stream().filter(order -> order.getBizType().equals(1)).collect(Collectors.toList());
List<OrderBean> memberOrderBeans = queryOrderByIdResponseDto.getData().stream().filter(order -> order.getBizType().equals(3) && !order.isParent()).collect(Collectors.toList());
List<OrderBean> fatherOrderBeans = queryOrderByIdResponseDto.getData().stream().filter(order -> order.getBizType().equals(2) && order.isParent()).collect(Collectors.toList());
result.put(OrderBeanType.SAASORDER.getCode(), CollectionUtils.isNotEmpty(saasOrderBeans) ? saasOrderBeans.get(0) : null);
result.put(OrderBeanType.MERMBERORDER.getCode(), CollectionUtils.isNotEmpty(memberOrderBeans) ? memberOrderBeans.get(0) : null);
result.put(OrderBeanType.FATHERORDER.getCode(), CollectionUtils.isNotEmpty(fatherOrderBeans) ? fatherOrderBeans.get(0) : null);
}
return result;
}
/**
* 发送支付成功模板消息
*
* @param orderBean
*/
private void sendPaySuccessMessage(QueryOrdersResponseDto.DataBean.OrderBean orderBean) {
Long gmtExpect = orderBean.getGmtExpect();
if (gmtExpect != null) {
// 预约下单
this.sendMessage(orderBean, MessageEventType.PAYORDEREXPECT);
} else {
// 非预约下单
this.sendMessage(orderBean, MessageEventType.PAYORDER);
}
}
/**
* 发MQ去打印
*
* @param request
*/
public void asynchronousPrint(OrderPrintDto request) {
LogUtil.debug("OrderPrintDto", JSONObject.toJSONString(request), null);
Header header = new Header(MQAction.INSERT.getAction(), "asynchronous-print-api", request.getOid() + "", cloudPrintQueue);
MQMessage<OrderPrintDto> message = new MQMessage<>(header, request);
mqService.convertAndSend(cloud_print_exchange, cloudPrintQueue, message);
}
/**
* 开通会员卡
*
* @param partnerId 商户号
* @param ruleId 会员规则ID
* @param oid 订单号
* @param userId 用户ID
*/
private void activateMemberCard(String partnerId, String ruleId, String oid, String userId) {
PurchasePaidRequestDto purchasePaidRequestDto = new PurchasePaidRequestDto();
purchasePaidRequestDto.setPartnerId(partnerId);
purchasePaidRequestDto.setOperatorType(0);
purchasePaidRequestDto.setRuleId(ruleId);
purchasePaidRequestDto.setOrderId(oid);
purchasePaidRequestDto.setMemberId(userId);
// 尝试三次开通会员卡,中途成功则跳出
int count = 3;
for (int i = 1; i <= count; i++) {
BaseResponse baseResponse = customerApplicationClient.purchasePaid(purchasePaidRequestDto);
// 不以响应码为判断是否开通会员卡成功的标准
if (baseResponse != null && "SUCCESS".equals(baseResponse.getResult())) {
break;
}
// 尝试开通会员卡失败三次
if (i >= count) {
LogUtil.error("尝试开通会员卡失败" + count + "次", JSON.toJSONString(purchasePaidRequestDto), JSON.toJSONString(baseResponse));
}
}
}
}
...@@ -55,6 +55,8 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -55,6 +55,8 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
@Autowired @Autowired
private OrderServiceImpl orderService; private OrderServiceImpl orderService;
@Autowired @Autowired
private MCCafeOrderService mcCafeOrderService;
@Autowired
private AssortmentCustomerInfoManager assortmentCustomerInfoManager; private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired @Autowired
private MallOrderService mallOrderService; private MallOrderService mallOrderService;
...@@ -125,6 +127,24 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -125,6 +127,24 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
return orderService.createOrderNew(createOrderVo); return orderService.createOrderNew(createOrderVo);
} }
@Override
public BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo) {
AssortmentCustomerInfoVo assortmentCustomerInfoVo = assortmentCustomerInfoManager.getCustomerInfoByObject(createOrderVo.getSessionId());
if (assortmentCustomerInfoVo == null || StringUtils.isEmpty(assortmentCustomerInfoVo.getMemberId())) {
return ResponseUtil.error(ResponseResult.NOT_LOGIN);
}
// 扩展字段中存储 sessionKey
createOrderVo.setSessionKey(assortmentCustomerInfoVo.getSessionKey());
//原标准点餐程序逻辑处理
BaseResponse baseResponse = this.checkStandardParamInfo(createOrderVo);
if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){
return baseResponse;
}
return mcCafeOrderService.createMCCafeOrder(createOrderVo);
}
@Override @Override
public BaseResponse createPrepay(CreatePrepayVo createPrepayVo) { public BaseResponse createPrepay(CreatePrepayVo createPrepayVo) {
AssortmentCustomerInfoVo assortmentCustomerInfoVo = assortmentCustomerInfoManager.getCustomerInfoByObject(createPrepayVo.getSessionId()); AssortmentCustomerInfoVo assortmentCustomerInfoVo = assortmentCustomerInfoManager.getCustomerInfoByObject(createPrepayVo.getSessionId());
...@@ -161,23 +181,45 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -161,23 +181,45 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
if (!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){ if (!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){
return orderAdapter.sendPaySuccessNoticeMessage(); return orderAdapter.sendPaySuccessNoticeMessage();
} }
/** //买券虚拟订单
* 围餐处理 if(orderBean.getBizType() == 6) {
*/ return sellCouponOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
if ("meals".equals(orderBean.getSource())) {
return orderCommonService.paySuccessCallback(message, confirmOrderDto, orderBeans);
} }
/** /**
* 微商城处理 * 默认点餐处理
*/ */
if(OrderSourceType.SAASMALL.getCode().equals(orderBean.getSource())) { return orderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
return mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans); } catch (Exception e) {
throw e;
} finally {
//删除分布式锁
redisCache.delete("saas:lockAfter:" + paySuccessKey);
} }
/** }
* app订单处理
*/ @Override
if(OrderSourceType.APP.getCode().equals(orderBean.getSource())) { public String mcCafePaySuccessCallback(PaysuccessNoticeMessage message) {
return appOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans); //添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
String paySuccessKey = PAY_SUCCESS_KEY + message.getTrans_id();
if(!LockUtils.lockAfter(redisCache.getRedisTemplate(), paySuccessKey)){
return orderAdapter.newSendPayFaileMessage();
}
try {
ConfirmOrderDto confirmOrderDto = orderAdapter.convent2ConfirmOrderDto(message);
// 通过交易号从缓存中拿订单号,如果有数据则实际订单号为其value值
String orderId = redisCache.getValue(RedisUtil.getPaymentTransIdOrderKey(confirmOrderDto.getOrderId()));
if (StringUtils.isNotBlank(orderId)) {
log.info("从缓存中获取的订单数据,trackingNo:{},transId:{},orderId:{}", LogTreadLocal.getTrackingNo(), confirmOrderDto.getOrderId(), orderId);
confirmOrderDto.setOrderId(orderId);
}
Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans = orderService.getOrderBeanByOrderId(confirmOrderDto.getOrderId());
if (MapUtils.isEmpty(orderBeans)) {
log.error("paySuccessCallback_queryOrderById_faild, trackingNo:{},PaysuccessNoticeMessage:{}", LogTreadLocal.getTrackingNo(), gson.toJson(message));
return gson.toJson(message);
}
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
if (!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){
return orderAdapter.sendPaySuccessNoticeMessage();
} }
//买券虚拟订单 //买券虚拟订单
if(orderBean.getBizType() == 6) { if(orderBean.getBizType() == 6) {
...@@ -186,7 +228,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -186,7 +228,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
/** /**
* 默认点餐处理 * 默认点餐处理
*/ */
return orderService.paySuccessCallback(message, confirmOrderDto, orderBeans); return mcCafeOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
} catch (Exception e) { } catch (Exception e) {
throw e; throw e;
} finally { } finally {
......
package cn.freemud.service;
import cn.freemud.OrderApplication;
import cn.freemud.base.constant.Version;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import com.freemud.sdk.api.assortment.order.enums.CouponReqTypeEnum;
import com.freemud.sdk.api.assortment.order.request.coupon.*;
import com.freemud.sdk.api.assortment.order.service.thirdparty.CouponOfflineMCCafeClient;
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.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OrderApplication.class)
public class CouponActivityServiceTest {
@Autowired
private CouponOfflineMCCafeClient offlineMCCafeClient;
@Test
public void redeemTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
couponCodeVerificationDto.setPartnerId(1205);
couponCodeVerificationDto.setStore_id("khl-12345");
couponCodeVerificationDto.setStation_id("1");
couponCodeVerificationDto.setOperator_id("1");
// 订单号
couponCodeVerificationDto.setTrans_id("testRedeem0729009");
couponCodeVerificationDto.setChannel("mocoffee_wx");
List<MCCafeTransactionVo> transactions = new ArrayList<>();
MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
mcCafeTransactionVo.setCode("281168656683188");
List<MCCafeProductRedeemVo> products = new ArrayList<>();
MCCafeProductRedeemVo mcCafeProductRedeemVo = new MCCafeProductRedeemVo();
mcCafeProductRedeemVo.setConsume_num(1);
mcCafeProductRedeemVo.setPid("100057810020870000");
mcCafeProductRedeemVo.setCustomer_code("11");
mcCafeProductRedeemVo.setKeyProductCode("11");
mcCafeProductRedeemVo.setSeq(1);
products.add(mcCafeProductRedeemVo);
mcCafeTransactionVo.setProducts(products);
transactions.add(mcCafeTransactionVo);
couponCodeVerificationDto.setTransactions(transactions);
couponCodeVerificationDto.setSign("skip");
System.out.println(JSON.toJSONString(couponCodeVerificationDto));
CouponRedeemResponse couponCodeResponseDto = offlineMCCafeClient.redeem(couponCodeVerificationDto);
System.out.println(couponCodeResponseDto);
}
@Test
public void cancelRedeemTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.CANCEL_REDEEM.getCode());
couponCodeVerificationDto.setPartnerId(1205);
couponCodeVerificationDto.setStore_id("khl-12345");
couponCodeVerificationDto.setStation_id("1");
couponCodeVerificationDto.setOperator_id("1");
// 订单号
couponCodeVerificationDto.setTrans_id("testRedeem0729009");
couponCodeVerificationDto.setChannel("mocoffee_wx");
List<MCCafeTransactionVo> transactions = new ArrayList<>();
MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
mcCafeTransactionVo.setCode("297330216254368");
List<MCCafeProductRedeemVo> products = new ArrayList<>();
MCCafeProductRedeemVo mcCafeProductRedeemVo = new MCCafeProductRedeemVo();
mcCafeProductRedeemVo.setConsume_num(1);
mcCafeProductRedeemVo.setPid("100057810020870000");
mcCafeProductRedeemVo.setCustomer_code("11");
mcCafeProductRedeemVo.setKeyProductCode("11");
mcCafeProductRedeemVo.setSeq(1);
products.add(mcCafeProductRedeemVo);
mcCafeTransactionVo.setProducts(products);
transactions.add(mcCafeTransactionVo);
couponCodeVerificationDto.setTransactions(transactions);
couponCodeVerificationDto.setSign("skip");
System.out.println(JSON.toJSONString(couponCodeVerificationDto));
CouponRedeemResponse couponCodeResponseDto = offlineMCCafeClient.cancelRedeem(couponCodeVerificationDto);
System.out.println(couponCodeResponseDto);
}
@Test
public void queryTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.QUERY.getCode());
couponCodeVerificationDto.setPartnerId(1205);
couponCodeVerificationDto.setStore_id("khl-12345");
couponCodeVerificationDto.setStation_id("1");
couponCodeVerificationDto.setOperator_id("1");
couponCodeVerificationDto.setChannel("mocoffee_wx");
couponCodeVerificationDto.setCoupon("281168656683188");
couponCodeVerificationDto.setSign("skip");
System.out.println(JSON.toJSONString(couponCodeVerificationDto));
CouponQueryResponse couponQueryResponse = offlineMCCafeClient.query(couponCodeVerificationDto);
System.out.println(JSON.toJSONString(couponQueryResponse));
}
@Test
public void lockTest() {
MCCafeCouponLockRequest couponCodeVerificationDto = new MCCafeCouponLockRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqType(89);
couponCodeVerificationDto.setPartnerId("1205");
couponCodeVerificationDto.setStoreId("99992");
// 订单号
couponCodeVerificationDto.setTransId("00000002");
couponCodeVerificationDto.setOfferId("281168656683188");
couponCodeVerificationDto.setCoupon("281168656683188");
couponCodeVerificationDto.setNumber("1");
couponCodeVerificationDto.setChannel("mocoffee_wx");
couponCodeVerificationDto.setOperatorId("1");
couponCodeVerificationDto.setStationId("1");
couponCodeVerificationDto.setSign("ss");
System.out.println(JSON.toJSONString(couponCodeVerificationDto));
CouponBaseResponse couponCodeResponseDto = offlineMCCafeClient.lock(couponCodeVerificationDto);
System.out.println(couponCodeResponseDto);
}
@Test
public void unlockTest() {
MCCafeCouponLockRequest couponCodeVerificationDto = new MCCafeCouponLockRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqType(90);
couponCodeVerificationDto.setPartnerId("1205");
couponCodeVerificationDto.setStoreId("khl-12345");
// 订单号
couponCodeVerificationDto.setTransId("00000002");
couponCodeVerificationDto.setOfferId("281168656683188");
couponCodeVerificationDto.setCoupon("281168656683188");
couponCodeVerificationDto.setNumber("1");
couponCodeVerificationDto.setChannel("mocoffee_wx");
couponCodeVerificationDto.setOperatorId("1");
couponCodeVerificationDto.setStationId("1");
couponCodeVerificationDto.setSign("ss");
System.out.println(JSON.toJSONString(couponCodeVerificationDto));
CouponBaseResponse couponCodeResponseDto = offlineMCCafeClient.unlock(couponCodeVerificationDto);
System.out.println(couponCodeResponseDto);
}
}
\ No newline at end of file
package cn.freemud.entities.dto;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: CouponCodeBaseReqVO
* @Package cn.freemud.entities.dto
* @Description:
* @author: biao.zhang
* @date: 2018/11/19 16:07
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class CouponCodeMCCafeBaseDto {
private Integer ver;
/**
* 71 核销
* 89 锁定
* 90 解锁
*/
private Integer reqType;
/**
* 核销渠道
* 1:线下Pos
* 2:线上
* 3:pickup:麦当劳点餐
* 4:delivery:麦当劳外送
* 5:mccafe:麦当劳咖啡
* 6:mc_dessert麦当劳甜品站
* 7:SOK
* 8:ECP/CMA
* 9:mcd_alipay:麦当劳支付宝点餐
*/
private String channel;
//商户编号
private String partnerId;
//商家门店号
private String storeId;
//营业员编号
private String operatorId;
//POS机编号
private String stationId;
}
package cn.freemud.entities.dto;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: CouponCodeVerificationReqVO
* @Package cn.freemud.entities.dto
* @Description:
* @author: biao.zhang
* @date: 2018/7/17 14:45
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class CouponCodeVerificationMCCafeDto extends CouponCodeMCCafeBaseDto {
//交易序号
private String transId;
//券编号
private String coupon;
//三方券号
private String offerId;
//锁定/解锁次数
private String number;
//----非必传---
//预约订单时间,为空则为及时单,如:2020-06-17 12:00:00
private String advancedOrderTime;
//签名
private String sign;
private List<CouponCodeVerificationTransDto> transactions;
}
...@@ -64,17 +64,7 @@ public interface CouponService { ...@@ -64,17 +64,7 @@ public interface CouponService {
* @param requestVo * @param requestVo
* @return * @return
*/ */
GetCouponDetailResponseDto getMCDMemberCoupon(GetMemberCouponRequestVo requestVo); GetCouponDetailResponseDto getMCCafeMemberCoupon(GetMemberCouponRequestVo requestVo);
/**
* 批次查询麦咖啡券详情
*
* @param partnerId
* @param storeId
* @param codes
* @return
*/
List<GetCouponDetailResponseDto.Details> getMCDMemberCoupons(String partnerId, String storeId, List<String> codes);
/** /**
* 同步券到会员卡包(投放会员卡包) * 同步券到会员卡包(投放会员卡包)
...@@ -100,7 +90,7 @@ public interface CouponService { ...@@ -100,7 +90,7 @@ public interface CouponService {
/** /**
* 获取卡券服务麦咖啡商户密钥 * 获取卡券服务麦咖啡商户密钥
*/ */
String getAppSecretMCD(String partnerId); String getMCCafeAppSecret(String partnerId);
/** /**
* 通过code校验券是否存在,返回商品券信息pid、price、code * 通过code校验券是否存在,返回商品券信息pid、price、code
......
...@@ -86,6 +86,8 @@ public class CouponServiceImpl implements CouponService { ...@@ -86,6 +86,8 @@ public class CouponServiceImpl implements CouponService {
@Autowired @Autowired
private CouponOnlineClient couponOnlineClient; private CouponOnlineClient couponOnlineClient;
@Autowired @Autowired
private CouponOnlineMCCafeClient couponOnlineMCCafeClient;
@Autowired
private CouponAvailableService couponAvailableService; private CouponAvailableService couponAvailableService;
@Value("${coupon.app.id}") @Value("${coupon.app.id}")
private String appid; private String appid;
...@@ -94,7 +96,7 @@ public class CouponServiceImpl implements CouponService { ...@@ -94,7 +96,7 @@ public class CouponServiceImpl implements CouponService {
@Autowired @Autowired
private CardBinClient cardBinClient; private CardBinClient cardBinClient;
@Autowired @Autowired
private CardBinMCDClient cardBinMCDClient; private CardBinMCCafeClient cardBinMCCafeClient;
@Autowired @Autowired
private StoreItemClient storeItemClient; private StoreItemClient storeItemClient;
@Autowired @Autowired
...@@ -251,6 +253,32 @@ public class CouponServiceImpl implements CouponService { ...@@ -251,6 +253,32 @@ public class CouponServiceImpl implements CouponService {
return null; return null;
} }
@Override
public GetCouponDetailResponseDto getMCCafeMemberCoupon(GetMemberCouponRequestVo requestVo) {
log.info("getMemberCoupon:" + gson.toJson(requestVo));
//TODO 券详情查券服务
Map<String, String> map = new TreeMap<String, String>();
if (StringUtils.isBlank(requestVo.getPartnerId()) || StringUtils.isBlank(requestVo.getCouponCode())) {
return null;
}
map.put(Finals.CODES, requestVo.getCouponCode());
map.put(Finals.PARTNER_ID, requestVo.getPartnerId());
map.put(Finals.MERCHANT_ID, requestVo.getPartnerId());
map.put(Finals.ACTION, "code.allDetails");
// 券码接口新增参数:组织机构(多个用英文逗号分离)
String channelIds = commonService.getOrgIdsAsString(requestVo.getPartnerId(), requestVo.getStoreId());
map.put(Finals.CHANNEL_CODE_LIST, channelIds);
String appSecret = getMCCafeAppSecret(requestVo.getPartnerId());
String sign = SignUtil.createMD5Sign(map, appSecret);
map.put(Finals.SIGN, sign);
GetCouponDetailResponseDto responseDto = couponOnlineMCCafeClient.getMCCafeCouponDetails(map);
LogUtil.info("couponOnlineClient.getCouponDetails****", map, gson.toJson(responseDto));
if (ResponseCodeConstant.RESPONSE_SUCCESS_1.equals(responseDto.getResult())) {
return responseDto;
}
return null;
}
/** /**
* 批次查询 * 批次查询
*/ */
...@@ -307,12 +335,12 @@ public class CouponServiceImpl implements CouponService { ...@@ -307,12 +335,12 @@ public class CouponServiceImpl implements CouponService {
} }
@Override @Override
public String getAppSecretMCD(String partnerId) { public String getMCCafeAppSecret(String partnerId) {
// 获取券服务的密钥 // 获取券服务的密钥
String couponAppSecret = RedisUtil.getCouponAppSecret(partnerId); String couponAppSecret = RedisUtil.getCouponAppSecret(partnerId);
String appSecret = redisCache.getValue(couponAppSecret); String appSecret = redisCache.getValue(couponAppSecret);
if (StringUtils.isBlank(appSecret)) { if (StringUtils.isBlank(appSecret)) {
GetAppKeyResponseDto getAppKeyResponseDto = cardBinMCDClient.getAppKey(GetAppKeyRequestDto.builder().partnerId(partnerId).appId(appid).build()); GetAppKeyResponseDto getAppKeyResponseDto = cardBinMCCafeClient.getMCCafeAppKey(GetAppKeyRequestDto.builder().partnerId(partnerId).appId(appid).build());
if (Objects.equals(String.valueOf(getAppKeyResponseDto.getStatusCode()), ResponseResult.SUCCESS.getCode()) if (Objects.equals(String.valueOf(getAppKeyResponseDto.getStatusCode()), ResponseResult.SUCCESS.getCode())
&& getAppKeyResponseDto.getData() != null) { && getAppKeyResponseDto.getData() != null) {
redisCache.save(couponAppSecret, getAppKeyResponseDto.getData().getAppKey()); redisCache.save(couponAppSecret, getAppKeyResponseDto.getData().getAppKey());
......
...@@ -9,24 +9,24 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -9,24 +9,24 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
//测试环境:http://115.159.65.101:8082 生产环境:https://onlinecoupon.sandload.cn //测试环境:http://115.159.65.101:8082 生产环境:https://onlinecoupon.sandload.cn
@FeignClient(name = "CARDBINCLIENT",url="${saas.cardbinclient.feign.url}") @FeignClient(name = "CARDBINMCCafeCLIENT",url="fff")
@RequestMapping(produces = {"application/json;charset=UTF-8"}) @RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CardBinMCDClient { public interface CardBinMCCafeClient {
/** /**
* 获取麦咖啡券码密钥 * 获取麦咖啡券码密钥
* @param requestDto * @param requestDto
* @return * @return
*/ */
@PostMapping("/getAppKey") @PostMapping("/mccafe/getAppKey")
GetAppKeyResponseDto getAppKey(GetAppKeyRequestDto requestDto); GetAppKeyResponseDto getMCCafeAppKey(GetAppKeyRequestDto requestDto);
/** /**
* 麦咖啡活动信息批量查询 * 麦咖啡活动信息批量查询
* @param requestDto * @param requestDto
* @return * @return
*/ */
@PostMapping(value = "/batchQueryActivityInfo") @PostMapping(value = "/mccafe/batchQueryActivityInfo")
BatchQueryActivityInfoResponseDto batchQueryActivityInfo(BatchQueryActivityInfoRequestDto requestDto); BatchQueryActivityInfoResponseDto batchQueryMCCafeActivityInfo(BatchQueryActivityInfoRequestDto requestDto);
} }
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.CouponCodeResponseDto;
import cn.freemud.entities.dto.CouponCodeVerificationMCCafeDto;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@FeignClient(name = "COUPONMCCafe",url="http://coupon-api-gateway-koderover-dev-coupon.api-ingress.sandload.cn")
public interface CouponOfflineMCCafeClient {
@PostMapping("/mccafe/redeem")
CouponRedeemResponse redeem(CouponCodeVerificationMCCafeDto couponCodeVerificationMCCafeDto);
@PostMapping("/mccafe/cancelRedeem")
CouponRedeemResponse cancelRedeem(CouponCodeVerificationMCCafeDto couponCodeVerificationMCCafeDto);
@PostMapping("/mccafe/query")
CouponRedeemResponse query(CouponCodeVerificationMCCafeDto couponCodeVerificationMCCafeDto);
@PostMapping("/mccafe/lock")
CouponRedeemResponse lock(CouponCodeVerificationMCCafeDto couponCodeVerificationMCCafeDto);
@PostMapping("/mccafe/unlock")
CouponRedeemResponse unlock(CouponCodeVerificationMCCafeDto couponCodeVerificationMCCafeDto);
}
...@@ -12,14 +12,14 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -12,14 +12,14 @@ import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map; import java.util.Map;
//@IgnoreFeignLogAnnotation //@IgnoreFeignLogAnnotation
@FeignClient(name = "COUPONOLINE", url = "${saas.coupononlineclient.feign.url}", configuration = FormSupportConfig.class) @FeignClient(name = "COUPONOLINEMCCafe", url = "fffff", configuration = FormSupportConfig.class)
public interface CouponOnlineMCDClient { public interface CouponOnlineMCCafeClient {
/** /**
* 查询券详情 * 查询券详情
*/ */
@PostMapping(value = "/code_v4", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, @PostMapping(value = "/mccafe/code_v4", produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE} consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}
) )
GetCouponDetailResponseDto getCouponDetails(@RequestBody Map<String, ?> map); GetCouponDetailResponseDto getMCCafeCouponDetails(@RequestBody Map<String, ?> map);
} }
...@@ -175,24 +175,17 @@ public class CouponServiceTest { ...@@ -175,24 +175,17 @@ public class CouponServiceTest {
*/ */
@Test @Test
public void couponCodeV4() { public void couponCodeV4() {
Map<String, String> map = new TreeMap<String, String>(); GetMemberCouponRequestVo getMemberCouponRequestVo = new GetMemberCouponRequestVo();
map.put(Finals.CODES, ""); getMemberCouponRequestVo.setCouponCode("");
map.put(Finals.PARTNER_ID, ""); getMemberCouponRequestVo.setPartnerId("");
map.put(Finals.MERCHANT_ID, ""); getMemberCouponRequestVo.setStoreId("");
map.put(Finals.ACTION, "code.allDetails"); GetCouponDetailResponseDto responseDto = couponService.getMCCafeMemberCoupon(getMemberCouponRequestVo);
// 券码接口新增参数:组织机构(多个用英文逗号分离) System.out.println(JSON.toJSONString(responseDto));
String channelIds = commonService.getOrgIdsAsString("", "");
map.put(Finals.CHANNEL_CODE_LIST, channelIds);
String appSecret = getAppSecret("");
String sign = SignUtil.createMD5Sign(map, appSecret);
map.put(Finals.SIGN, sign);
// GetCouponDetailResponseDto responseDto = couponOnlineClient.getCouponDetails(map);
// System.out.println(JSON.toJSONString(responseDto));
} }
@Test @Test
public String getAppSecret(String partner) { public String getAppSecret(String partner) {
String appSecret = couponService.getAppSecretMCD(partner); String appSecret = couponService.getMCCafeAppSecret(partner);
System.out.println(appSecret); System.out.println(appSecret);
return appSecret; return appSecret;
} }
......
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