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.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);
...@@ -40,5 +47,10 @@ public interface OrderAdapterService { ...@@ -40,5 +47,10 @@ public interface OrderAdapterService {
* 支付回调处理 * 支付回调处理
*/ */
String paySuccessCallback(PaysuccessNoticeMessage message); String paySuccessCallback(PaysuccessNoticeMessage message);
/**
* 支付回调处理
*/
String mcCafePaySuccessCallback(PaysuccessNoticeMessage message);
} }
...@@ -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;
...@@ -97,8 +99,8 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -97,8 +99,8 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
case 4:// 创建预支付订单 case 4:// 创建预支付订单
baseResponse = encircleOrderService.createPrepaymentOrder(createReserveOrderVo); baseResponse = encircleOrderService.createPrepaymentOrder(createReserveOrderVo);
break; break;
default: default:
throw new ServiceException(ResponseResult.ORDER_CREATE_OPERATION_ERROR); throw new ServiceException(ResponseResult.ORDER_CREATE_OPERATION_ERROR);
} }
return baseResponse; return baseResponse;
} }
...@@ -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);
}
}
@Override
public String mcCafePaySuccessCallback(PaysuccessNoticeMessage message) {
//添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
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());
* app订单处理 if (MapUtils.isEmpty(orderBeans)) {
*/ log.error("paySuccessCallback_queryOrderById_faild, trackingNo:{},PaysuccessNoticeMessage:{}", LogTreadLocal.getTrackingNo(), gson.toJson(message));
if(OrderSourceType.APP.getCode().equals(orderBean.getSource())) { return gson.toJson(message);
return appOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans); }
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