Commit 882a86f4 by 姜海波

Merge branch 'qa' of http://gitlab.freemud.com/order-group-application/order-group into qa

# Conflicts:
#	assortment-ordercenter-sdk/pom.xml
#	order-application-service/pom.xml
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
#	ordercenter-sdk/readme.md
parents ae91e40a 9405ea97
......@@ -34,4 +34,5 @@
| 1.3.6.RELEASE | 蜜雪 | 丁凯 | 2020-04-27 |
| 1.5.5-SNAPSHOT | 返回售后单创建时间 | wuping | 2020-04-27 |
| 1.5.6-SNAPSHOT | 取消订单增加任务 | wuping | 2020-04-28 |
| 1.3.7.RELEASE | 放开常用方法修饰符 | 李小二 | 2020-04-27 |
\ No newline at end of file
| 1.3.7.RELEASE | 放开常用方法修饰符 | 李小二 | 2020-04-27 |
| 1.6.5-SNAPSHOT | 创建订单增加appid字段 | wuping | 2020-05-08 |
\ No newline at end of file
......@@ -245,6 +245,7 @@ public class OrderSdkAdapter {
request.setOrderExtended(requestVO.getOrderExtended());
request.setOrderTask(requestVO.getOrderTask());
request.setOperator(requestVO.getOperator());
request.setAppId(requestVO.getAppId());
// 扩展字段(第三方商品分类编号)
if (null != requestVO && null != requestVO.getOtherInfo()) {
......@@ -1020,6 +1021,7 @@ public class OrderSdkAdapter {
}
data.setOrderOperationHistoryList(getOrderOperationHistory(orderInfoReqs.getOrderOperationHistoryList()));
data.setApportionDetails(getApportionDetails(orderInfoReqs));
data.setOrderCostDetailList(orderInfoReqs.getOrderCostDetailList());
return data;
}
......
......@@ -133,6 +133,10 @@ public class BaseCreateOrderRequest extends BaseConfig {
private OrderTaskReq orderTask;
//操作人
private String operator;
/**
* 微信、支付宝、APP渠道appid
*/
private String appId;
/**
* 促销活动扣减库存
......@@ -159,6 +163,7 @@ public class BaseCreateOrderRequest extends BaseConfig {
*/
private String region;
@Data
public static class DeliveryTypeInfo {
/**
......
......@@ -162,5 +162,10 @@ public class CreateFatherSonOrderRequest extends BaseConfig {
//预订单任务
private OrderTaskReq orderTask;
/**
* 微信、支付宝、APP渠道appid
*/
private String appId;
}
}
......@@ -13,6 +13,7 @@
package com.freemud.sdk.api.assortment.order.response.order;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderCostResp;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.builder.ToStringBuilder;
......@@ -245,6 +246,8 @@ public class QueryOrdersResponse {
private List<OrderSettlement> apportionDetails;
private List<OrderCostResp> orderCostDetailList;
private AddDeliveryInfo addInfo;
......
......@@ -38,7 +38,6 @@ import cn.freemud.request.wechat.dto.SignMessageBuilder;
import cn.freemud.service.impl.OrderCommonService;
import cn.freemud.utils.*;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformWxapp;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -73,7 +72,6 @@ import org.springframework.stereotype.Component;
import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.text.DecimalFormat;
......@@ -259,7 +257,8 @@ public class OrderAdapter {
}
public CreateFatherSonOrderRequest convertFatherSonOrderRequest(CreateOrderVo createOrderVo, ShoppingCartGoodsDto shoppingCartGoodsDto,
OrderExtendedReq orderExtendedReq,StoreResponse.BizVO storeResponseDto) {
OrderExtendedReq orderExtendedReq,StoreResponse.BizVO storeResponseDto,
String appId) {
CreateFatherSonOrderRequest createFatherSonOrderRequest = new CreateFatherSonOrderRequest();
createFatherSonOrderRequest.setPartnerId(createOrderVo.getPartnerId());
createFatherSonOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
......@@ -268,6 +267,7 @@ public class OrderAdapter {
List<CreateFatherSonOrderRequest.OrderInfo> orderInfoList = new ArrayList<>();
CreateFatherSonOrderRequest.OrderInfo productOrderInfo = convertProductOrderInfo(createOrderVo, deliveryInfoDto, shoppingCartGoodsDto);
productOrderInfo.setOrderExtended(orderExtendedReq);
productOrderInfo.setAppId(appId);
OrderTaskReq orderTask = null;
if(StringUtils.isNotEmpty(createOrderVo.getTakeMealTime())){
Integer orderType = 0;
......@@ -2232,13 +2232,13 @@ public class OrderAdapter {
/**
* 支付信息转换
*/
public UnifiedOrderRequest convent2UnifiedOrderRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount) {
public UnifiedOrderRequest convent2UnifiedOrderRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount, String transId) {
UnifiedOrderRequest orderPayDto = new UnifiedOrderRequest();
orderPayDto.setPartnerId(orderBean.getCompanyId());
orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStoreId(orderBean.getShopId());
orderPayDto.setTransId(orderBean.getOid());
orderPayDto.setTransId(transId);
orderPayDto.setOpenId(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusinessDate(businessDate);
......@@ -2759,7 +2759,8 @@ public class OrderAdapter {
public CreatePrepayRequestDto convertToCreatePrepayRequestDto(String partnerId, String wxAppId, String openId,
String faceCode, String cardCode, String payCode, QueryOrdersResponse.DataBean.OrderBean fatherOrderBean,
QueryOrdersResponse.DataBean.OrderBean productOrderBean, long totalAmount, int cardAmount, OrderExtInfoDTO orderExtInfoDTO){
QueryOrdersResponse.DataBean.OrderBean productOrderBean, long totalAmount, int cardAmount, OrderExtInfoDTO orderExtInfoDTO,
String transId){
CreatePrepayRequestDto requestDto = new CreatePrepayRequestDto();
requestDto.setPartnerId(partnerId);
requestDto.setWxAppId(wxAppId);
......@@ -2772,6 +2773,7 @@ public class OrderAdapter {
requestDto.setTotalAmount(totalAmount);
requestDto.setCardAmount(cardAmount);
requestDto.setOrderExtInfoDTO(orderExtInfoDTO);
requestDto.setTransId(transId);
return requestDto;
}
......@@ -2781,7 +2783,28 @@ public class OrderAdapter {
createOrderVo.getFaceCode(), createOrderVo.getCardCode(), null,
createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(),
createOrderOperateDto.getTotalAmount() == null ? 0 : createOrderOperateDto.getTotalAmount(),
createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount(), orderExtInfoDTO);
createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount(), orderExtInfoDTO,
createOrderOperateDto.getFatherOrderBean().getOid());
}
/**
* 支付后通知失败返回信息
*/
public String newSendPayFaileMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 500);
map.put("message", "failed");
return gson.toJson(map);
}
/**
* 支付后通知确认返回信息
*/
public String sendPaySuccessNoticeMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 0);
map.put("message", "success");
return gson.toJson(map);
}
......
......@@ -99,7 +99,7 @@ public class OrderController {
@ApiAnnotation(logMessage = "paySuccessCallback")
@PostMapping("/paySuccessCallback")
public String paySuccessCallback(@LogParams @RequestBody PaysuccessNoticeMessage message) {
return orderservice.paySuccessCallback(message);
return orderAdapterService.paySuccessCallback(message);
}
/**
......
package cn.freemud.entities.dto.ecology;
import lombok.Data;
@Data
public class VirtualBindStoreResponse {
/**
* 门店id
*/
private String storeId;
/**
* 类型
*/
private String type;
}
package cn.freemud.entities.dto.ecology;
import lombok.Data;
@Data
public class VirtualStoreRequest {
/**
* appid
*/
private String platformAppId;
/**
* 类型
*/
private String type;
}
......@@ -6,15 +6,52 @@ import lombok.Data;
@Data
public class CreatePrepayRequestDto {
/**
* 商户id
*/
private String partnerId;
/**
* appid
*/
private String wxAppId;
/**
* 用户openId
*/
private String openId;
/**
* 人脸识别码code
*/
private String faceCode;
/**
* 会员卡code
*/
private String cardCode;
/**
* 支付渠道码
*/
private String payCode;
/**
* 父订单,如果不存在,则值与productOrderBean一致
*/
private QueryOrdersResponse.DataBean.OrderBean fatherOrderBean;
/**
* 商品订单
*/
private QueryOrdersResponse.DataBean.OrderBean productOrderBean;
/**
* 总金额
*/
private long totalAmount;
/**
* 会员卡支付金额
*/
private int cardAmount;
/**
* 订单扩展信息
*/
private OrderExtInfoDTO orderExtInfoDTO;
/**
* 交易请求号
*/
private String transId;
}
......@@ -23,7 +23,12 @@ public enum RedisCacheEnum {
ORDER_PLUS_DISH_LOCKKEY_PREFIX("kgd:encircle:plus:dish:table:lock:","围餐下单业务LockKey"),
ORDER_CREATE_TRANS_ID_KEY("kgd:meal:trans:{0}:{1}:{2}:{3}","围餐下单多次创建预支付生成不同TRANS_ID"),
ORDER_CREATE_PRE_PARMENT_INTO_LOCK("kgd:meal:pre:payment:lock:","围餐订单唤起预支付锁定不可下单"),
ORDER_CACHE_WEICAN_TRANSID_INFO("kgd:meal:payment:trans:order:","缓存围餐支付transId");
ORDER_CACHE_WEICAN_TRANSID_INFO("kgd:meal:payment:trans:order:","缓存围餐支付transId"),
PAYMENT_TRANSID_SEQUENCE_KEY("kgd:payment:transid:sequence:{1}", "创建预支付交易号序列"),
PAYMENT_TRANSID_ORDER_KEY("kgd:payment:transid:order:{1}", "交易订单key"),
;
private String code;
private String desc;
......
......@@ -5,6 +5,11 @@ import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import java.util.Map;
/**
* app订单服务
......@@ -25,4 +30,8 @@ public interface AppOrderService {
* APP下单,下单带商品信息,不经过购物车服务,不唤起支付
*/
BaseResponse createOrder(AppCreateOrderVo createOrderVo, AssortmentCustomerInfoVo customerInfo);
/**
* 支付回调
*/
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
}
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.CreateOrderVo;
import cn.freemud.entities.vo.OrderAffirmRequestVO;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EmptyTableNumberVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import java.util.Map;
/**
* 商城订单业务操作类
* @version V1.0
......@@ -28,4 +33,9 @@ public interface MallOrderService {
*/
BaseResponse orderAffirm(OrderAffirmRequestVO requestVO);
/**
* 支付回调
*/
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
}
......@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
/**
* All rights Reserved, Designed By www.freemud.cn
......@@ -35,4 +36,9 @@ public interface OrderAdapterService {
*/
BaseResponse appCreateOrder(AppCreateOrderVo createOrderVo);
/**
* 支付回调处理
*/
String paySuccessCallback(PaysuccessNoticeMessage message);
}
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 com.freemud.sdk.api.assortment.order.enums.OrderSdkType;
import java.util.Map;
/**
* 订单服务
*
......@@ -25,9 +29,9 @@ public interface Orderservice {
BaseResponse scanFaceCreateOrder(CreateOrderVo createOrderVo);
/**
* 支付成功后回调通知
* 支付回调
*/
String paySuccessCallback(PaysuccessNoticeMessage message);
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
/**
* 支付成功后回调通知_新版本
......
......@@ -4,17 +4,26 @@ import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.PayStatus;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.TradeState;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.AppOrderService;
import cn.freemud.utils.BeanUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
......@@ -52,6 +61,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
public class AppOrderServiceImpl implements AppOrderService {
......@@ -66,6 +77,10 @@ public class AppOrderServiceImpl implements AppOrderService {
private OrderCenterSdkService orderCenterSdkService;
@Autowired
private PaymentNewService paymentNewService;
@Autowired
private RedisCache redisCache;
@Autowired
private RedisService redisService;
//门店SDK
@Autowired
......@@ -111,9 +126,11 @@ public class AppOrderServiceImpl implements AppOrderService {
extInfo.setOpenid(createPrepayVo.getOpenId());
String faceCode = "";
String cardCode = "";
String transId = createPrepayVo.getOrderCode() + redisService.increment(RedisUtil.getPaymentTransIdSequenceKey(createPrepayVo.getOrderCode()), 1, TimeUnit.DAYS);
CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(createPrepayVo.getPartnerId(), createPrepayVo.getPayAppId(), createPrepayVo.getOpenId(), faceCode,
cardCode, createPrepayVo.getPayCode(), createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(), createOrderOperateDto.getTotalAmount(),
createOrderOperateDto.getCardAmount(), extInfo);
createOrderOperateDto.getCardAmount(), extInfo, transId);
redisService.savePaymentTransIdOrder(RedisUtil.getPaymentTransIdOrderKey(transId), productOrderBean.getOid(), 30L, TimeUnit.MINUTES);
return orderservice.createPrepayOrder(createPrepayRequestDto);
}
......@@ -156,6 +173,16 @@ public class AppOrderServiceImpl implements AppOrderService {
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
String paySuccessCallbackResult = orderservice.paySuccessCallback(message, confirmOrderDto, orderBeans);
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
// 删除订单自增缓存
redisCache.delete(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()));
// 删除支付交易号订单关系缓存
redisCache.delete(RedisUtil.getPaymentTransIdOrderKey(message.getTrans_id()));
return paySuccessCallbackResult;
}
private void checkOrderBefore(CreatePrepayVo createPrepayVo, QueryOrdersResponse.DataBean.OrderBean orderBean) {
if(!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){
......
......@@ -18,6 +18,7 @@ import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.StoreItemClient;
import cn.freemud.utils.AmountUtils;
......@@ -105,6 +106,9 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
private MealCacheManager mealCacheManager;
@Autowired
private ActivityCalculationDiscountService calculationDiscountService;
@Autowired
private OrderAdapterService orderAdapterService;
private final Integer RESPONSE_SUCCESS_CODE = 100;
......@@ -522,7 +526,7 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
message.setOpenid(assortmentCustomerInfoVo.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
orderCommonService.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
}
}else{
return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null);
......
......@@ -11,6 +11,8 @@ import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.PayAccessResponse;
import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.dto.ecology.VirtualStoreRequest;
import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup;
......@@ -25,6 +27,7 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.BuriedPointService;
import cn.freemud.service.MallOrderService;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.WechatApplicationServiceClient;
import cn.freemud.utils.LogUtil;
......@@ -121,6 +124,8 @@ public class MallOrderServiceImpl implements MallOrderService {
private OrderSdkService orderSdkService;
@Autowired
private WechatApplicationServiceClient wechatApplicationServiceClient;
@Autowired
private EcologyAdminApplicationClient ecologyAdminApplicationClient;
/**
* 创建订单
......@@ -214,12 +219,14 @@ public class MallOrderServiceImpl implements MallOrderService {
}
private void change2BindMallShopId(CreateOrderVo createOrderVo, String wxAppId) {
String redisKey = RedisKeyConstant.OPENSTORE_MICROMALL_BIND_STOREID_PREFIX + wxAppId;
String shopId = redisCache.getValue(redisKey);
if(StringUtils.isEmpty(shopId)) {
VirtualStoreRequest virtualStoreRequest = new VirtualStoreRequest();
virtualStoreRequest.setPlatformAppId(wxAppId);
virtualStoreRequest.setType("microMall");
BaseResponse<VirtualBindStoreResponse> virtualBindStoreResponse = ecologyAdminApplicationClient.getBuyBindVirtualStore(virtualStoreRequest);
if(virtualBindStoreResponse == null || virtualBindStoreResponse.getResult() == null || StringUtils.isBlank(virtualBindStoreResponse.getResult().getStoreId())) {
throw new ServiceException(ResponseResult.STORE_BIND_MALL_NOT_FOUND);
}
createOrderVo.setShopId(shopId);
createOrderVo.setShopId(virtualBindStoreResponse.getResult().getStoreId());
}
private OrderExtInfoDTO getExtInfo(AssortmentCustomerInfoVo userLoginInfoDto, StoreResponse.BizVO storeResponseDto, CreateOrderVo createOrderVo) {
......@@ -331,7 +338,7 @@ public class MallOrderServiceImpl implements MallOrderService {
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount) {
try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount);
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, orderBean.getOid());
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null;
......@@ -385,11 +392,8 @@ public class MallOrderServiceImpl implements MallOrderService {
return this.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
if (MapUtils.isEmpty(orderBeans)) {
ErrorLog.printErrorLog("paySuccessCallback_queryOrderById_faild", "paySuccessCallback", message, new Exception());
return gson.toJson(message);
}
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId();
......
package cn.freemud.service.impl;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.enums.OrderChannelType;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.UserLoginChannelEnum;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.*;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.sdk.api.assortment.order.enums.OrderSourceType;
import com.freemud.sdk.api.assortment.order.util.LockUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
......@@ -30,19 +41,31 @@ import org.springframework.stereotype.Service;
* @Copyright: ${DATE.YARE} www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Slf4j
@Service
public class OrderAdapterServiceImpl implements OrderAdapterService {
private final String PAY_SUCCESS_KEY = "pay_success_key:";
private static Gson gson = new Gson();
@Autowired
private EncircleOrderService encircleOrderService;
@Autowired
private Orderservice orderservice;
private OrderServiceImpl orderService;
@Autowired
private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired
private MallOrderService mallOrderService;
@Autowired
private AppOrderService appOrderService;
@Autowired
private RedisCache redisCache;
@Autowired
private OrderAdapter orderAdapter;
@Autowired
private OrderCommonService orderCommonService;
@Override
public BaseResponse createOrderNew(CreateOrderVo createOrderVo) {
......@@ -95,7 +118,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){
return baseResponse;
}
return orderservice.createOrderNew(createOrderVo);
return orderService.createOrderNew(createOrderVo);
}
@Override
......@@ -110,6 +133,57 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
throw new UnsupportedOperationException("暂不支持渠道:"+assortmentCustomerInfoVo.getChannel());
}
@Override
public String paySuccessCallback(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());
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 ("meals".equals(orderBean.getSource())) {
return orderCommonService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* 微商城处理
*/
if(OrderSourceType.SAASMALL.getCode().equals(orderBean.getSource())) {
return mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* app订单处理
*/
if(OrderSourceType.APP.getCode().equals(orderBean.getSource())) {
return appOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* 默认点餐处理
*/
return orderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
} catch (Exception e) {
throw e;
} finally {
//删除分布式锁
redisCache.delete("saas:lockAfter:" + paySuccessKey);
}
}
/**
* APP下单,下单带商品信息,不经过购物车服务,不唤起支付
*/
......
......@@ -4,12 +4,16 @@ import cn.freemud.adapter.MessageNoticeAdapter;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.OrderExtInfoDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.dto.ShoppingCartBaseResponse;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.PayStatus;
import cn.freemud.enums.RedisCacheEnum;
import cn.freemud.enums.ResponseResult;
......@@ -18,6 +22,7 @@ import cn.freemud.redis.RedisCache;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.utils.DateTimeUtil;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
......@@ -52,6 +57,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.sql.Time;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Map;
......@@ -92,6 +98,8 @@ public class OrderCommonService {
private MessageNoticeAdapter messageNoticeAdapter;
@Autowired
private MessageCenterClient messageNoticeClient;
@Autowired
private RedisService redisService;
private final Integer RESPONSE_SUCCESS_CODE = 100;
/**
......@@ -111,10 +119,8 @@ public class OrderCommonService {
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class) == null ? new OrderExtInfoDto() : JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
if(orderBean.getAmount() > 0){
try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount);
Long increment = redisCache.opsForValue().increment(
MessageFormat.format(RedisCacheEnum.ORDER_CREATE_TRANS_ID_KEY.getCode(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getBarCounter(), orderBean.getOid()), 1);
request.setTransId(orderBean.getOid() + increment);
String transId = orderBean.getOid() + redisService.increment(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()), 1L, TimeUnit.DAYS);
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, transId);
if(SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEFAULT.getProfile())
|| SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEV.getProfile())
......@@ -122,7 +128,7 @@ public class OrderCommonService {
request.setAmount(1L);
}
ApiLog.info("支付transId :{},payRequest:{}",request.getTransId(),JSON.toJSONString(request));
redisCache.save(RedisCacheEnum.ORDER_CACHE_WEICAN_TRANSID_INFO.getCode()+request.getTransId(),orderBean.getOid(),1L,TimeUnit.DAYS);
redisService.savePaymentTransIdOrder(RedisUtil.getPaymentTransIdOrderKey(transId), orderBean.getOid(), 1L, TimeUnit.DAYS);
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, LogThreadLocal.getTrackingNo());
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null;
......@@ -219,15 +225,9 @@ public class OrderCommonService {
* @param message
* @return
*/
public String paySuccessCallback(PaysuccessNoticeMessage message){
//拉取订单详细信息
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
baseQueryOrderRequest.setOrderId(message.getTrans_id());
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
OrderExtInfoDto extInfo = JSONObject.parseObject(queryOrderByIdResponse.getData().getExtInfo(), OrderExtInfoDto.class);
//判断订单支付状态 订单已支付则发起退款
QueryOrdersResponse.DataBean.OrderBean orderBean = queryOrderByIdResponse.getData();
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
OrderExtInfoDto extInfo = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
if(PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus()) && ObjectUtils.equals(1,orderBean.getPayType())){
//发起退款 本期不考虑 极端情况
}
......@@ -272,8 +272,14 @@ public class OrderCommonService {
LogUtil.error("paySuccessCallback_payAccess_faild", JSON.toJSONString(message), JSON.toJSONString(groupOrderResponse));
return this.newSendPayFaileMessage();
}
redisCache.delete(MessageFormat.format(RedisCacheEnum.ORDER_CREATE_TRANS_ID_KEY.getCode(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getBarCounter(), orderBean.getOid()));
// 删除订单自增缓存
redisCache.delete(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()));
// 删除支付交易号订单关系缓存
redisCache.delete(RedisUtil.getPaymentTransIdOrderKey(message.getTrans_id()));
this.sendPosMessage(orderBean.getCompanyId(),orderBean.getShopId(),orderBean.getOid());
//支付回掉成功标记
redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES);
//返回调用结果
return this.newSendPaySuccessNoticeMessage();
}
......
......@@ -45,6 +45,7 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.BuriedPointService;
import cn.freemud.service.CouponActivityService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.*;
......@@ -133,8 +134,6 @@ public class OrderServiceImpl implements Orderservice {
private final Integer RESPONSE_SUCCESS_CODE = 100;
private final String PAY_SUCCESS_KEY="pay_success_key:";
private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}")
......@@ -219,6 +218,9 @@ public class OrderServiceImpl implements Orderservice {
private MallOrderServiceImpl mallOrderService;
@Autowired
private CacheOpenPlatformPartnerWxappConfigManager cacheOpenPlatformPartnerWxappConfigManager;
@Autowired
private OrderAdapterService orderAdapterService;
@Override
......@@ -333,33 +335,8 @@ public class OrderServiceImpl implements Orderservice {
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message) {
//添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
if(!LockUtils.lockAfter(redisCache.getRedisTemplate(),PAY_SUCCESS_KEY+message.getTrans_id())){
return newSendPayFaileMessage();
}
ConfirmOrderDto confirmOrderDto = orderAdapter.convent2ConfirmOrderDto(message);
//首先判断当前订单号是否为围餐,围餐则需要截取掉订单最后一位数字
String orderId = redisCache.getValue(RedisCacheEnum.ORDER_CACHE_WEICAN_TRANSID_INFO.getCode() + confirmOrderDto.getOrderId());
if (StringUtils.isNotBlank(orderId)) {
confirmOrderDto.setOrderId(orderId);
ApiLog.info("围餐订单回调==>orderId:{},transId:{}", confirmOrderDto.getOrderId(), orderId);
}
Map<String, OrderBean> orderBeans = getOrderBeanByOrderId(confirmOrderDto.getOrderId());
if (MapUtils.isEmpty(orderBeans)) {
ErrorLog.printErrorLog("paySuccessCallback_queryOrderById_faild", "paySuccessCallback", message, new Exception());
return gson.toJson(message);
}
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
if ("meals".equals(orderBean.getSource())) { //围餐
message.setTrans_id(confirmOrderDto.getOrderId());
return orderCommonService.paySuccessCallback(message);
}
// 商城订单处理
if(OrderSourceType.SAASMALL.getCode().equals(orderBean.getSource())) {
return mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
String oid = StringUtils.isNotEmpty(orderBean.getParentCode()) && !"0".equals(orderBean.getParentCode()) ? orderBean.getParentCode() : orderBean.getOid();
String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId();
......@@ -470,25 +447,16 @@ public class OrderServiceImpl implements Orderservice {
requestDto.setOpenId(orderExtInfoDto != null ? orderExtInfoDto.getOpenid() : "");
buriedPointService.BuriedPointPayment(requestDto, orderBean);
// 推荐优惠插件用户支付完成数据上报
// if (message.getTotal_fee() != 0) {
// orderBean.setStatus(OrderStatus.TAKE_ORDER.getCode());
// wechatPushProcessor.statusOrderPay(orderBean, sessionId, message.getPaid_no(), message.getOut_trade_no()
// , message.getEndTransId(), message.getPlatformMchId(), message.getTerminalId());
// }
// 开通会员卡
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);
//删除分布式锁
redisCache.delete("saas:lockAfter:"+PAY_SUCCESS_KEY+message.getTrans_id());
return sendPaySuccessNoticeMessage();
}
private Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
public Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
// 订单查询:若结果集只有一个orderBean,则为普通订单,否则为会员卡订单(父子订单)
Map<String, OrderBean> result = new HashMap<>();
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(orderId);
......@@ -553,7 +521,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatformMchId(newMessage.getPlatformMchId());
message.setTerminalId(newMessage.getAppId());
message.setRuleId(newMessage.getRuleId());
String res = paySuccessCallback(message);
String res = orderAdapterService.paySuccessCallback(message);
JSONObject jsonObject = JSONObject.parseObject(res);
if (jsonObject.containsKey("code")) {
Integer code = (Integer) jsonObject.get("code");
......@@ -1766,7 +1734,6 @@ public class OrderServiceImpl implements Orderservice {
AssortmentCustomerInfoVo userLoginInfoDto) {
CreateOrderOperateDto response = new CreateOrderOperateDto();
OrderExtendedReq orderExtendedReq = orderAdapter.saveStoreInfo(storeResponseDto);
String orderWarnTime = storeResponseDto.getOrderWarnTime();
OrderClientType orderClient = OrderClientType.SAAS;
String appId = userLoginInfoDto.getWxAppId();
if("2".equals(userLoginInfoDto.getChannel()) ){
......@@ -1783,7 +1750,7 @@ public class OrderServiceImpl implements Orderservice {
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);
CreateFatherSonOrderResponse createFatherSonOrderResponse = createFatherSonOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, orderExtendedReq,appId);
if (ObjectUtils.notEqual(Integer.valueOf(ResponseResult.SUCCESS.getCode()), createFatherSonOrderResponse.getErrcode())) {
throw new ServiceException(ResponseResult.ORDER_CREATE_ERROR);
}
......@@ -1798,7 +1765,7 @@ public class OrderServiceImpl implements Orderservice {
fatherBeanList.get(0).setCompanyId(createOrderVo.getPartnerId());
} else {
//普通订单
CreateOrderResponse createOrderFlowResponse = createOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, orderExtendedReq, orderClient);
CreateOrderResponse createOrderFlowResponse = createOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, orderExtendedReq, orderClient,appId);
if (ObjectUtils.notEqual(Integer.valueOf(ResponseResult.SUCCESS.getCode()), createOrderFlowResponse.getErrcode())) {
throw new ServiceException(ResponseResult.ORDER_CREATE_ERROR);
}
......@@ -1823,13 +1790,14 @@ public class OrderServiceImpl implements Orderservice {
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());
orderPayResponse = getPreOrderPay(createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getCardAmount(), transId);
} else if (totalAmount > 0 && StringUtils.isNotBlank(cardCode)) {
//svc卡支付
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo());
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, transId, LogThreadLocal.getTrackingNo());
} else {
// 0元订单如果不需要支付,自定义支付单号
orderPayResponse = getOrderPayResponse(paymentRequest, createPrepayRequestDto.getFatherOrderBean());
......@@ -1861,7 +1829,7 @@ public class OrderServiceImpl implements Orderservice {
message.setOpenid(createPrepayRequestDto.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
this.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
......@@ -1869,13 +1837,15 @@ public class OrderServiceImpl implements Orderservice {
/**
* 创建普通订单
*/
public CreateOrderResponse createOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto, ShoppingCartGoodsDto shoppingCartGoodsDto, OrderExtendedReq orderExtendedReq, OrderClientType orderClient) {
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);
......@@ -1889,8 +1859,10 @@ public class OrderServiceImpl implements Orderservice {
/**
* 创建父子订单
*/
public CreateFatherSonOrderResponse createFatherSonOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto, ShoppingCartGoodsDto shoppingCartGoodsDto, OrderExtendedReq orderExtendedReq) {
CreateFatherSonOrderRequest createFatherSonOrderRequest = orderAdapter.convertFatherSonOrderRequest(createOrderVo, shoppingCartGoodsDto, orderExtendedReq,storeResponseDto);
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();
......@@ -1923,9 +1895,9 @@ public class OrderServiceImpl implements Orderservice {
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) {
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);
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));
......@@ -1945,7 +1917,7 @@ public class OrderServiceImpl implements Orderservice {
}
}
public OrderPayResponse svcPay(String cardCode, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo) {
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());
......@@ -1955,7 +1927,7 @@ public class OrderServiceImpl implements Orderservice {
request.setStoreId(orderBean.getShopId());
// request.setStoreId("10086");
request.setAmount(orderBean.getAmount());
request.setTransId(orderBean.getOid());
request.setTransId(transId);
request.setStationId("1");
request.setOperatorId("1");
request.setVer("2");
......@@ -2245,7 +2217,7 @@ public class OrderServiceImpl implements Orderservice {
private BaseResponse createOrderAndPay(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto, ShoppingCartGoodsDto shoppingCartGoodsDto,
AssortmentCustomerInfoVo userLoginInfoDto, OrderExtInfoDTO orderExtInfoDTO) {
//创建订单--包括下单购买会员卡创建父子订单
CreateOrderOperateDto operateDto = createOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto);
CreateOrderOperateDto operateDto = createOrderForFace(createOrderVo, storeResponseDto, shoppingCartGoodsDto,userLoginInfoDto.getWxAppId());
long totalAmount = operateDto.getTotalAmount();
int cardAmount = operateDto.getCardAmount();
QueryOrdersResponse.DataBean.OrderBean fatherOrderBean = operateDto.getFatherOrderBean();
......@@ -2285,7 +2257,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
//0元订单内部调支付成功
this.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
......@@ -2293,11 +2265,10 @@ public class OrderServiceImpl implements Orderservice {
/**
* 创建订单
*/
private CreateOrderOperateDto createOrder(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto,
ShoppingCartGoodsDto shoppingCartGoodsDto){
private CreateOrderOperateDto createOrderForFace(CreateOrderVo createOrderVo, StoreResponse.BizVO storeResponseDto,
ShoppingCartGoodsDto shoppingCartGoodsDto,String appId){
CreateOrderOperateDto response = new CreateOrderOperateDto();
OrderExtendedReq orderExtendedReq = orderAdapter.saveStoreInfo(storeResponseDto);
String orderWarnTime = storeResponseDto.getOrderWarnTime();
//创建普通订单
Function<Object, CreateOrderResponse> createOrder = (var -> {
BaseCreateOrderRequest baseCreateOrderRequest = orderAdapter.convent2CreateOrderDto(createOrderVo, shoppingCartGoodsDto,storeResponseDto);
......@@ -2305,6 +2276,7 @@ public class OrderServiceImpl implements Orderservice {
baseCreateOrderRequest = getProductCustomerCode(baseCreateOrderRequest);
//保存门店渠道信息
baseCreateOrderRequest.setOrderExtended(orderExtendedReq);
baseCreateOrderRequest.setAppId(appId);
CreateOrderRequest createOrderRequest = new CreateOrderRequest();
baseCreateOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
createOrderRequest.setBaseCreateOrderRequest(baseCreateOrderRequest);
......@@ -2317,7 +2289,7 @@ public class OrderServiceImpl implements Orderservice {
});
//创建父子订单
Function<Object, CreateFatherSonOrderResponse> createFatherSonOrder = (var -> {
CreateFatherSonOrderRequest createFatherSonOrderRequest = orderAdapter.convertFatherSonOrderRequest(createOrderVo, shoppingCartGoodsDto, orderExtendedReq,storeResponseDto);
CreateFatherSonOrderRequest createFatherSonOrderRequest = orderAdapter.convertFatherSonOrderRequest(createOrderVo, shoppingCartGoodsDto, orderExtendedReq,storeResponseDto,appId);
//查询第三方商品编号
createFatherSonOrderRequest = getProductCustomerCodeNew(createFatherSonOrderRequest);
MqMessageRequest mqMessageRequest = new MqMessageRequest();
......@@ -2381,13 +2353,13 @@ public class OrderServiceImpl implements Orderservice {
}
//唤起微信支付
if (totalAmount > 0 && StringUtils.isBlank(createOrderVo.getCardCode()) && StringUtils.isBlank(createOrderVo.getFaceCode())) {
orderPayResponse = getPreOrderPay(fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo(), cardAmount);
orderPayResponse = getPreOrderPay(fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo(), cardAmount, fatherBeanListOne.getOid());
return orderPayResponse;
}
//储值卡支付
if (totalAmount > 0 && StringUtils.isNotBlank(createOrderVo.getCardCode())) {
//svc卡支付
orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo());
orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, fatherBeanListOne.getOid(), LogThreadLocal.getTrackingNo());
return orderPayResponse;
}
//扫脸支付
......
package cn.freemud.service.impl;
import cn.freemud.enums.RedisCacheEnum;
import cn.freemud.redis.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class RedisService {
@Autowired
private RedisCache redisCache;
/**
* 指定的key值自增,并指定缓存过期时间
*/
public Long increment(String key, long expire, TimeUnit timeUnit) {
Long increment = redisCache.opsForValue().increment(key, 1);
redisCache.updateTTL(key, expire, timeUnit);
return increment;
}
/**
* 保存支付交易好订单关系,并指定缓存过期时间
*/
public void savePaymentTransIdOrder(String key, String orderId, long expire, TimeUnit timeUnit) {
redisCache.save(key, orderId, expire, timeUnit);
}
}
package cn.freemud.service.thirdparty;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.dto.ecology.VirtualStoreRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
/**
* 生态服务
* @author: kai.ding
* @date:
*/
@FeignClient(name = "ECOLOGY-ADMIN-APPLICATION", url = "${saas.ecology.admin.application.feign.url}")
public interface EcologyAdminApplicationClient {
/**
* 获取虚拟门店
*/
@PostMapping(value = "ecology/api/app/info/getBuyBindVirtualStore", produces = MediaType.APPLICATION_JSON_VALUE ,consumes = MediaType.APPLICATION_JSON_VALUE )
BaseResponse<VirtualBindStoreResponse> getBuyBindVirtualStore(@RequestBody VirtualStoreRequest virtualStoreRequest);
}
package cn.freemud.utils;
import cn.freemud.enums.RedisCacheEnum;
import java.text.MessageFormat;
public class RedisUtil {
private final static String BASE_URL = "micro_program:";
private final static String ENTER_SHOP_KEY = BASE_URL + "ENTER_SHOP_KEY_";
......@@ -17,4 +21,18 @@ public class RedisUtil {
public static String getCouponAppSecret(String partnerId) {
return COUPON_APP_SECRET + partnerId;
}
/**
* 获取订单支付交易请求序列
*/
public static String getPaymentTransIdSequenceKey(String orderId) {
return MessageFormat.format(RedisCacheEnum.PAYMENT_TRANSID_SEQUENCE_KEY.getCode(), orderId);
}
/**
* 获取交易订单key
*/
public static String getPaymentTransIdOrderKey(String transId){
return MessageFormat.format(RedisCacheEnum.PAYMENT_TRANSID_ORDER_KEY.getCode(), transId);
}
}
......@@ -211,4 +211,9 @@ public class CreateOrderRequest extends BaseRequest {
//操作人
private String operator;
/**
* 微信、支付宝、APP渠道appid
*/
private String appId;
}
package cn.freemud.entities.ecology;
import lombok.Data;
@Data
public class VirtualBindStoreResponse {
/**
* 门店id
*/
private String storeId;
/**
* 类型
*/
private String type;
}
package cn.freemud.entities.ecology;
import lombok.Data;
@Data
public class VirtualStoreRequest {
/**
* appid
*/
private String platformAppId;
/**
* 类型
*/
private String type;
}
......@@ -19,6 +19,8 @@ import cn.freemud.constant.ShoppingCartConstant;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.activity.ActivityQueryDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.ecology.VirtualStoreRequest;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
......@@ -70,6 +72,8 @@ public class ShoppingCartMallServiceImpl implements ShoppingCartNewService {
private AssortmentSdkService assortmentSdkService;
@Autowired
private AssortmentCustomerInfoManager customerInfoManager;
@Autowired
private EcologyAdminApplicationClient ecologyAdminApplicationClient;
/**
* 从微信卡券向购物车中添加商品
......@@ -659,11 +663,14 @@ public class ShoppingCartMallServiceImpl implements ShoppingCartNewService {
* 获取商城门店id
*/
private String getBindMallShopId(String wxAppId) {
String shopId = shoppingCartBaseService.getBindMallShopId(wxAppId, LogThreadLocal.getTrackingNo());
if(StringUtils.isEmpty(shopId)) {
VirtualStoreRequest virtualStoreRequest = new VirtualStoreRequest();
virtualStoreRequest.setPlatformAppId(wxAppId);
virtualStoreRequest.setType("microMall");
BaseResponse<VirtualBindStoreResponse> virtualBindStoreResponse = ecologyAdminApplicationClient.getBuyBindVirtualStore(virtualStoreRequest);
if(virtualBindStoreResponse == null || virtualBindStoreResponse.getResult() == null || StringUtils.isBlank(virtualBindStoreResponse.getResult().getStoreId())) {
throw new ServiceException(ResponseResult.STORE_MALL_NOT_FOUND);
}
return shopId;
return virtualBindStoreResponse.getResult().getStoreId();
}
}
package cn.freemud.service.thirdparty;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.ecology.VirtualStoreRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 生态服务
* @author: kai.ding
* @date:
*/
@FeignClient(name = "ECOLOGY-ADMIN-APPLICATION", url = "${saas.ecology.admin.application.feign.url}")
public interface EcologyAdminApplicationClient {
/**
* 获取虚拟门店
*/
@PostMapping(value = "ecology/api/app/info/getBuyBindVirtualStore", produces = MediaType.APPLICATION_JSON_VALUE ,consumes = MediaType.APPLICATION_JSON_VALUE )
BaseResponse<VirtualBindStoreResponse> getBuyBindVirtualStore(@RequestBody VirtualStoreRequest virtualStoreRequest);
}
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