Commit bfd80999 by zhiheng.zhang

Merge branch 'feature/2020/09/11-1.9.39-混合支付-张志恒' into develop

# Conflicts:
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/adapter/OrderSdkAdapter.java
#	order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
#	order-application-service/src/main/java/cn/freemud/entities/dto/order/CreatePrepayRequestDto.java
#	order-application-service/src/main/java/cn/freemud/entities/vo/CreateOrderVo.java
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
parents 392ac7e4 c86c7c67
...@@ -262,6 +262,10 @@ public class OrderSdkAdapter { ...@@ -262,6 +262,10 @@ public class OrderSdkAdapter {
request.setExtInfo(JSONObject.toJSONString(requestVO.getOtherInfo())); request.setExtInfo(JSONObject.toJSONString(requestVO.getOtherInfo()));
} }
//订单重量
Double orderWeight = sumOrderWeight(requestVO.getProducts());
request.setWeight(orderWeight);
request.setOrderPayItemCreateReqList(requestVO.getOrderPayItemCreateReqList());
return request; return request;
} }
......
...@@ -2,6 +2,7 @@ package com.freemud.sdk.api.assortment.order.request.order; ...@@ -2,6 +2,7 @@ package com.freemud.sdk.api.assortment.order.request.order;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType; import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq; import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq; import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest; import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.sdk.api.assortment.order.config.BaseConfig; import com.freemud.sdk.api.assortment.order.config.BaseConfig;
...@@ -207,5 +208,6 @@ public class BaseCreateOrderRequest extends BaseConfig { ...@@ -207,5 +208,6 @@ public class BaseCreateOrderRequest extends BaseConfig {
*/ */
private String ruleId; private String ruleId;
} }
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
} }
package com.freemud.sdk.api.assortment.order.request.payment;
import lombok.Data;
@Data
public class PayPlatformVO {
private String ebcode;
private Long amount;
}
package com.freemud.sdk.api.assortment.order.request.payment;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ProductVO {
private String id;
private BigDecimal quantity;
private Integer seq;
private Long price;
private String name;
private String salesType = "NORMAL";
}
package com.freemud.sdk.api.assortment.order.request.payment;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import lombok.Data;
import java.util.List;
@Data
public class UnifiedOrderApplicationRequest {
private List<PayPlatformVO> platforms;
private String openId;
private String notifyUrl;
private Integer invoiceFlag;
private Long amount;
private Long vipAmount;
private Long undisAmount;
private String body;
private String outOrderNo;
private List<ProductVO> products;
private String goodsTag;
private String partnerId;
private String storeId;
private String businessDate;
private String stationId = "1";
private String operatorId = "1";
private String transId;
private String foodOrderType;
private String appId;
private String payCode;
private String payTimeOutTime;
private String ebCode;
}
...@@ -51,11 +51,15 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderSettlementType; ...@@ -51,11 +51,15 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderSettlementType;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum; import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq; import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.promotioncenter.dto.promotion.GoodsStockDTO; import com.freemud.application.sdk.api.promotioncenter.dto.promotion.GoodsStockDTO;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest; import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse; import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.enums.*; import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.sdk.api.assortment.order.request.order.*; import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.payment.PayPlatformVO;
import com.freemud.sdk.api.assortment.order.request.payment.ProductVO;
import com.freemud.sdk.api.assortment.order.request.payment.UnifiedOrderApplicationRequest;
import com.freemud.sdk.api.assortment.order.response.order.CreateOrderFlowResponse; import com.freemud.sdk.api.assortment.order.response.order.CreateOrderFlowResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrderByIdResponse; import com.freemud.sdk.api.assortment.order.response.order.QueryOrderByIdResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse; import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
...@@ -71,6 +75,7 @@ import org.apache.commons.lang.StringUtils; ...@@ -71,6 +75,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.FastDateFormat; import org.apache.commons.lang.time.FastDateFormat;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
...@@ -78,7 +83,9 @@ import java.math.BigDecimal; ...@@ -78,7 +83,9 @@ import java.math.BigDecimal;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -88,6 +95,10 @@ import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; ...@@ -88,6 +95,10 @@ import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
public class OrderAdapter { public class OrderAdapter {
private static FastDateFormat yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private static FastDateFormat yyyyMMddHHmmss = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
public final static String TAKECODEKEY = "takecode";
public static final String REDIS_KEY_SEP = ":";
public static final String numberChar = "0123456789";
public static final String numberCharWithoutZero = "12345";
private static String SPMCHID = "1237482502"; private static String SPMCHID = "1237482502";
// private static String SPWXAPPID = "wx8244c7c48c7d45de"; // private static String SPWXAPPID = "wx8244c7c48c7d45de";
...@@ -120,7 +131,8 @@ public class OrderAdapter { ...@@ -120,7 +131,8 @@ public class OrderAdapter {
// private RedisCache redisCache; // private RedisCache redisCache;
@Autowired @Autowired
private OrderCommonService orderCommonService; private OrderCommonService orderCommonService;
@Autowired
private RedisTemplate redisTemplate;
private static Gson gson = new Gson(); private static Gson gson = new Gson();
/** /**
...@@ -261,6 +273,8 @@ public class OrderAdapter { ...@@ -261,6 +273,8 @@ public class OrderAdapter {
activityUpdateStockRequest.setStock(stocks); activityUpdateStockRequest.setStock(stocks);
createOrderDto.setActivityUpdateStockRequest(activityUpdateStockRequest); createOrderDto.setActivityUpdateStockRequest(activityUpdateStockRequest);
} }
createOrderDto.setPayChannelType(createOrderVo.getPayChannelType());
createOrderDto.setOrderPayItemCreateReqList(createOrderVo.getOrderPayItemCreateReqList());
return createOrderDto; return createOrderDto;
} }
...@@ -3185,4 +3199,192 @@ public class OrderAdapter { ...@@ -3185,4 +3199,192 @@ public class OrderAdapter {
return StringUtils.isNotBlank(payChannel) && OrderAdapter.PAY_CODE_10102.equalsIgnoreCase(payChannel); return StringUtils.isNotBlank(payChannel) && OrderAdapter.PAY_CODE_10102.equalsIgnoreCase(payChannel);
} }
/**
* 生成取餐码
* @param partnerId 商户ID
* @param storeId 门店ID
* @return
*/
public String generateTackCode(String partnerId, String storeId){
String pickUpGoodsNo = generateNumber(6);
String key = this.getOrderTackCodeKey(partnerId,storeId);
if(!redisTemplate.opsForHash().hasKey(key,storeId+pickUpGoodsNo)) {
redisTemplate.opsForHash().put(key,storeId+pickUpGoodsNo,pickUpGoodsNo);
redisTemplate.expire(key,getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
}else{
generateTackCode(partnerId, storeId);
}
return pickUpGoodsNo;
}
/**
* 获取取餐码key
* @param partnerId
* @return
*/
public String getOrderTackCodeKey(String partnerId,String storeId){
Date currentDay = new Date();
String todayStr = formatDate(currentDay);
StringBuilder key = new StringBuilder(TAKECODEKEY).append(REDIS_KEY_SEP)
.append(partnerId)
.append(REDIS_KEY_SEP)
.append(storeId)
.append(REDIS_KEY_SEP)
.append(todayStr);
return key.toString();
}
public static SimpleDateFormat defaultDateFormater = new SimpleDateFormat("yyyy-MM-dd");
private String formatDate(Date date){
return defaultDateFormater.format(date);
}
/**
* 返回一个定长的随机字符串(只包含大小写字母、数字)
*
* @param length
* 随机字符串长度
* @return 随机字符串
*/
public static String generateNumber(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
if (i == 0){
sb.append(numberCharWithoutZero.charAt(random.nextInt(numberCharWithoutZero.length())));
}else {
sb.append(numberChar.charAt(random.nextInt(numberChar.length())));
}
}
return sb.toString();
}
private Long getSecondsNextEarlyMorning(){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
/**
* 支付信息转换
*/
public UnifiedOrderApplicationRequest convent2CombPayOrderRequest(List<OrderPayItemCreateReq> orderPayItemCreateReqList, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount, String partnerPayOvertime) {
UnifiedOrderApplicationRequest orderPayDto = new UnifiedOrderApplicationRequest();
orderPayDto.setEbCode(paymentRequest.getPayCode());
orderPayDto.setPartnerId(orderBean.getCompanyId());
orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStoreId(orderBean.getShopId());
orderPayDto.setOpenId(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusinessDate(businessDate);
orderPayDto.setAmount(amount);
orderPayDto.setUndisAmount(1L);
orderPayDto.setVipAmount(Long.valueOf(cardAmount));
orderPayDto.setAppId(paymentRequest.getWxAppId());
orderPayDto.setPayTimeOutTime(StringUtils.defaultIfBlank(partnerPayOvertime, "30"));
List<ProductVO> productVOS = new ArrayList<ProductVO>();
if (CollectionUtils.isNotEmpty(orderBean.getProductList())) {
orderBean.getProductList().forEach(orderProductBean -> {
ProductVO productBean = new ProductVO();
productBean.setId(orderProductBean.getProductId());
productBean.setQuantity(BigDecimal.valueOf(orderProductBean.getNumber()));
productBean.setSeq(orderProductBean.getSequence());
productBean.setSalesType("NORMAL");
productBean.setPrice(orderProductBean.getPrice());
productBean.setName(orderProductBean.getProductName());
productVOS.add(productBean);
});
}
orderPayDto.setProducts(productVOS);
orderPayDto.setPayCode(paymentRequest.getPayCode());
orderPayDto.setFoodOrderType(getFoodOrderType(orderBean.getOrderType()));
List<PayPlatformVO> platforms = new ArrayList<>();
if(null != orderPayItemCreateReqList && orderPayItemCreateReqList.size()>0){
orderPayItemCreateReqList.forEach(OrderPayItem -> {
PayPlatformVO payPlatformVO = new PayPlatformVO();
payPlatformVO.setAmount(OrderPayItem.getPayAmount().longValue());
payPlatformVO.setEbcode(getEbCode4PayOrderCenter(OrderPayItem.getPayChannelType()));
platforms.add(payPlatformVO);
});
}
orderPayDto.setPlatforms(platforms);
orderPayDto.setOutOrderNo(orderBean.getOid());
return orderPayDto;
}
public OrderPayResponse convent2OrderCombPayResponse(UnifiedOrderApiResponse unifiedOrderResponse) {
OrderPayResponse responseDto = new OrderPayResponse();
responseDto.setFmId(unifiedOrderResponse.getFmTradeNo());
responseDto.setMsg(unifiedOrderResponse.getMessage());
responseDto.setPayEbcode(unifiedOrderResponse.getEbCode());
responseDto.setPayId(unifiedOrderResponse.getPrepayId());
OrderPayResponse.PayOrderBean payBean = new OrderPayResponse.PayOrderBean();
payBean.setAppid(unifiedOrderResponse.getAppId());
payBean.setNonceStr(unifiedOrderResponse.getNonceStr());
payBean.setPackageX(unifiedOrderResponse.get_package());
payBean.setSign(unifiedOrderResponse.getPaySign());
payBean.setSignType(unifiedOrderResponse.getPaySignType());
payBean.setTimestamp(unifiedOrderResponse.getTimestamp());
payBean.setAliPayOrder(unifiedOrderResponse.getPayAccount());
responseDto.setPayOrder(payBean);
responseDto.setStatusCode(unifiedOrderResponse.getCode());
return responseDto;
}
/**
* @nots 基础服务映射,存储数据库用 payChannel 映射 payChannelType java类
* @param payChannelType
* @return
*/
public String getPayChannel4SharedOrder(Integer payChannelType) {
String payChannel = "" ;
switch (payChannelType) {
case 1:
payChannel = "10211";
break;
case 2:
payChannel ="10102";
break;
case 3:
payChannel = "支付宝";
break;
case 4:
payChannel = "10212";
break;
}
return payChannel;
}
/**
* @nots 基础支付
* @param payChannelType
* @return
*/
public String getEbCode4PayOrderCenter(String payChannelType) {
String ebCode = "" ;
switch (payChannelType) {
case "1":
ebCode = "10004";
break;
case "2":
ebCode = "10200";
break;
case "3":
ebCode = "10001";
break;
case "4":
ebCode = "";
break;
}
return ebCode;
}
} }
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: OrderPayResponseDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: liming.guo
* @date: 2018/5/25 17:10
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@NoArgsConstructor
@Data
@ToString
public class UnifiedOrderApiResponse {
private int code;
@ApiModelProperty(value = "提示信息")
private String message;
@ApiModelProperty(value = "验签可配置")
private String sign;
@ApiModelProperty(value = "支付帐号")
private String payAccount;
@ApiModelProperty(value = "支付渠道编号")
private String ebCode;
@ApiModelProperty(value = "支付渠道描述")
private String platformDesc;
@ApiModelProperty(value = "第三方支付交易序号")
private String platformTradeNo;
@ApiModelProperty(value = "非码交易流水号")
private String fmTradeNo;
@ApiModelProperty(value = "外部交易流水号,由上游系统生成,需保证唯一")
private String outOrderNo;
@ApiModelProperty(value = "app_id编号(微信使用)")
private String appId;
@ApiModelProperty(value = "商户号(微信使用)")
private String mchId;
@ApiModelProperty(value = "包名(微信使用)")
private String _package;
@ApiModelProperty(value = "随机字符串(微信使用)")
private String nonceStr;
@ApiModelProperty(value = "签名(微信使用)")
private String paySign;
@ApiModelProperty(value = "签名类型(微信使用)")
private String paySignType;
@ApiModelProperty(value = "时间戳(微信使用)")
private String timestamp;
@ApiModelProperty(value = "预订单编号")
private String prepayId;
@ApiModelProperty(value = "biz_content(支付宝使用)")
private String bizContent;
@ApiModelProperty(value = "当前预下单请求生成的二维码码串")
private String codeUrl;
@ApiModelProperty(value = "间联单号")
private String endTransTradeNo;
}
...@@ -3,9 +3,12 @@ package cn.freemud.entities.dto.order; ...@@ -3,9 +3,12 @@ package cn.freemud.entities.dto.order;
import cn.freemud.entities.vo.CreateOrderVo; import cn.freemud.entities.vo.CreateOrderVo;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType; import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse; import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class CreatePrepayRequestDto { public class CreatePrepayRequestDto {
/** /**
...@@ -67,4 +70,6 @@ public class CreatePrepayRequestDto { ...@@ -67,4 +70,6 @@ public class CreatePrepayRequestDto {
* 使用电子风味卡 * 使用电子风味卡
*/ */
private CreateOrderVo.UnionPayCard unionPayCard; private CreateOrderVo.UnionPayCard unionPayCard;
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
} }
...@@ -14,6 +14,7 @@ package cn.freemud.entities.vo; ...@@ -14,6 +14,7 @@ package cn.freemud.entities.vo;
import cn.freemud.entities.dto.UserDeliveryInfoDto; import cn.freemud.entities.dto.UserDeliveryInfoDto;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto; import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import lombok.Builder; import lombok.Builder;
...@@ -23,12 +24,15 @@ import org.hibernate.validator.constraints.NotEmpty; ...@@ -23,12 +24,15 @@ import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
public class CreateOrderVo { public class CreateOrderVo {
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
@NotEmpty(message = "sessionId 不能为空") @NotEmpty(message = "sessionId 不能为空")
private String sessionId; private String sessionId;
...@@ -327,5 +331,6 @@ public class CreateOrderVo { ...@@ -327,5 +331,6 @@ public class CreateOrderVo {
* 规则ID * 规则ID
*/ */
private String ruleId; private String ruleId;
} }
} }
...@@ -20,7 +20,8 @@ public enum PayChannel { ...@@ -20,7 +20,8 @@ public enum PayChannel {
*/ */
USVCP("10556", "电子风味卡支付"), USVCP("10556", "电子风味卡支付"),
ALIPAY("10300", "支付宝"), ALIPAY("10300", "支付宝"),
WXPAY("10211", "微信"); WXPAY("10211", "微信"),
COMPAY("10212", "组合支付");
private String code; private String code;
private String desc; private String desc;
......
package cn.freemud.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PayChannelType {
WECHAT((byte)1,"微信"),
SVC((byte)2,"储值卡"),
ALIPAY((byte)3,"支付宝"),
COMB((byte)4,"混合支付");
private Byte index;
private String name;
public static final String API_DESC = "订单支付渠道类型 1:微信 2:储值卡 3:支付宝 4:混合支付";
public static PayChannelType getByIndex(byte index) {
for (PayChannelType payType : values()) {
if (payType.getIndex().equals(index)) {
return payType;
}
}
return null;
}
}
...@@ -21,6 +21,7 @@ import cn.freemud.amqp.MQService; ...@@ -21,6 +21,7 @@ import cn.freemud.amqp.MQService;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.log.LogTreadLocal; import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.base.util.JsonUtil;
import cn.freemud.constant.OrderRefundConstant; import cn.freemud.constant.OrderRefundConstant;
import cn.freemud.constant.RedisKeyConstant; import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
...@@ -81,7 +82,9 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType; ...@@ -81,7 +82,9 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq; import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq; import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderModifyRelatingCodeReq;
import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq; import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.ordercenter.response.carpark.OrderResp; import com.freemud.application.sdk.api.ordercenter.response.carpark.OrderResp;
import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
...@@ -110,6 +113,7 @@ import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushServic ...@@ -110,6 +113,7 @@ import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushServic
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter; import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus; import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus;
import com.freemud.sdk.api.assortment.order.request.order.*; import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.payment.UnifiedOrderApplicationRequest;
import com.freemud.sdk.api.assortment.order.response.order.*; import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse; import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
...@@ -152,7 +156,6 @@ import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; ...@@ -152,7 +156,6 @@ import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
public class OrderServiceImpl implements Orderservice { public class OrderServiceImpl implements Orderservice {
private final Integer RESPONSE_SUCCESS_CODE = 100; private final Integer RESPONSE_SUCCESS_CODE = 100;
private static Gson gson = new Gson(); private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}") @Value("${saas.reverseNotifyiDcUrl}")
...@@ -252,6 +255,11 @@ public class OrderServiceImpl implements Orderservice { ...@@ -252,6 +255,11 @@ public class OrderServiceImpl implements Orderservice {
private DeliveryFeiginClient deliveryFeiginClient; private DeliveryFeiginClient deliveryFeiginClient;
@Autowired @Autowired
private OfflineCouponSdkService offlineCouponSdkService; private OfflineCouponSdkService offlineCouponSdkService;
@Autowired
private DeliveryFeiginClient deliveryFeiginClient;
@Autowired
private PaymentApplicationClient paymentApplicationClient;
@Override @Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) { public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
String trackingNo = LogTreadLocal.getTrackingNo(); String trackingNo = LogTreadLocal.getTrackingNo();
...@@ -315,9 +323,17 @@ public class OrderServiceImpl implements Orderservice { ...@@ -315,9 +323,17 @@ public class OrderServiceImpl implements Orderservice {
return createOrderOperateDtoResponse; return createOrderOperateDtoResponse;
} }
CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto)createOrderOperateDtoResponse.getResult(); CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto)createOrderOperateDtoResponse.getResult();
//创建支付 //创建支付 ,混合支付走单独的逻辑,其他的都单独逻辑
CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(userLoginInfoDto, createOrderVo, createOrderOperateDto, extInfo); CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(userLoginInfoDto, createOrderVo, createOrderOperateDto, extInfo);
return this.createPrepayOrder(createPrepayRequestDto); if(null != createOrderVo.getPayChannelType() && createOrderVo.getPayChannelType().equals(PayChannelType.COMB.getIndex())) {
log.info("createCombpayOrder {}" + JsonUtil.toJSONString(createPrepayRequestDto));
createPrepayRequestDto.setOrderPayItemCreateReqList(createOrderVo.getOrderPayItemCreateReqList());
createPrepayRequestDto.setPayCode(createOrderVo.getPayChannelType().toString());
return this.createCombpayOrder(createPrepayRequestDto);
}else{
log.info("createPrepayOrder {}" + JsonUtil.toJSONString(createPrepayRequestDto));
return this.createPrepayOrder(createPrepayRequestDto);
}
} }
/** /**
...@@ -431,6 +447,18 @@ public class OrderServiceImpl implements Orderservice { ...@@ -431,6 +447,18 @@ public class OrderServiceImpl implements Orderservice {
String string2 = JSONObject.toJSONString(payAccessRes); String string2 = JSONObject.toJSONString(payAccessRes);
JSONObject jsonObject2 = JSONObject.parseObject(string2); JSONObject jsonObject2 = JSONObject.parseObject(string2);
payAccessResponse = jsonObject2.toJavaObject(PayAccessResponse.class); payAccessResponse = jsonObject2.toJavaObject(PayAccessResponse.class);
//获取生态缓存中的配置项,如果mealCodeRule的值不为空并且值等于2,则随机生成取参数,当日不重复
String mealCodeRule = redisCache.getValue("mealCodeRule");
if(!StringUtils.isEmpty(mealCodeRule) && "2".equalsIgnoreCase(mealCodeRule)){
//更新db中的取餐码,生成取餐码
OrderModifyRelatingCodeReq relatingCodeReq =new OrderModifyRelatingCodeReq();
relatingCodeReq.setOrderCode(orderBean.getOid());
relatingCodeReq.setOperator(orderBean.getCreateUser());
relatingCodeReq.setPartnerId(orderBean.getCompanyId());
relatingCodeReq.setPickUpGoodsNo(orderAdapter.generateTackCode(orderBean.getCompanyId(),orderBean.getShopId()));
orderCenterSdkService.updatePickUpGoodNo(relatingCodeReq, LogThreadLocal.getTrackingNo());
}
// 添加幂等处理,若订单是已支付成功状态,直接返回成功 // 添加幂等处理,若订单是已支付成功状态,直接返回成功
if (!RESPONSE_SUCCESS_CODE.equals(payAccessResponse.getErrcode())) { if (!RESPONSE_SUCCESS_CODE.equals(payAccessResponse.getErrcode())) {
OrderBean saasOrder = getOrderBeanByOrderId(confirmOrderDto.getOrderId()).get(OrderBeanType.SAASORDER.getCode()); OrderBean saasOrder = getOrderBeanByOrderId(confirmOrderDto.getOrderId()).get(OrderBeanType.SAASORDER.getCode());
...@@ -2990,4 +3018,78 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2990,4 +3018,78 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.success(responses.getData()); return ResponseUtil.success(responses.getData());
} }
/**
* 创建预支付订单
*/
public BaseResponse createCombpayOrder(CreatePrepayRequestDto createPrepayRequestDto) {
CreateOrderResponseVo createOrderResponse;
OrderPayResponse orderPayResponse = null;
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode());
long totalAmount = createPrepayRequestDto.getTotalAmount();
String cardCode = createPrepayRequestDto.getCardCode();
if (totalAmount < 0) {
throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR);
}else{
String partnerPayOvertime = this.getPartnerPayOvertime(createPrepayRequestDto.getPartnerId());
orderPayResponse = comPayOrder(createPrepayRequestDto.getOrderPayItemCreateReqList(),createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(),createPrepayRequestDto.getCardAmount(),partnerPayOvertime);
}
if (orderPayResponse == null || Objects.isNull(orderPayResponse.getFmId())) {
return failPreOrderPay(LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getProductOrderBean(), cardCode, createPrepayRequestDto.getOrderClient(),
Objects.isNull(orderPayResponse) ? null : orderPayResponse.getMsg());
}
createOrderResponse = orderAdapter.convent2CreateFatherSonOrderResponseVo(orderPayResponse, createPrepayRequestDto.getProductOrderBean());
BaseResponse baseEditResponse = this.updateOrderInfo(orderPayResponse, createPrepayRequestDto.getOrderExtInfoDTO(), createPrepayRequestDto.getProductOrderBean(), LogThreadLocal.getTrackingNo());
if (baseEditResponse != null) {
return baseEditResponse;
}
if (totalAmount > 0 && StringUtils.isBlank(cardCode)) {
createOrderResponse.setPaySuccess(false);
} else {
createOrderResponse.setPaySuccess(true);
}
// 推荐优惠插件用户下单数据上报
if (!createOrderResponse.getPaySuccess()) {
return ResponseUtil.success(createOrderResponse);
} else {
//如果是商品券支付0元,调用回调接口
PaysuccessNoticeMessage message = new PaysuccessNoticeMessage();
message.setResult_code(100);
message.setOut_trade_no(createOrderResponse.getFmId());
message.setTrans_id(createOrderResponse.getOid());
message.setTotal_fee(0);
message.setOpenid(createPrepayRequestDto.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
public OrderPayResponse comPayOrder(List<OrderPayItemCreateReq> orderPayItemCreateReqList, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount, String partnerPayOvertime) {
OrderPayResponse orderPayResponse;
try {
//微信或者支付宝支付
UnifiedOrderApplicationRequest request = orderAdapter.convent2CombPayOrderRequest(orderPayItemCreateReqList,orderBean, paymentRequest, orderBean.getAmount(), cardAmount, partnerPayOvertime);
UnifiedOrderApiResponse responseBase = paymentApplicationClient.unifiedOrder(request,orderBean.getCompanyId());
if (!ResponseCodeConstant.RESPONSE_SUCCESS.equals(responseBase.getCode())) {
log.error("混合支付返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase));
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg(responseBase.getMessage());
} else {
putDelMq(request.getPartnerId(), request.getStoreId(), responseBase.getFmTradeNo(), orderBean.getOid());
orderPayResponse = orderAdapter.convent2OrderCombPayResponse(responseBase);
orderPayResponse.setWxAppid(paymentRequest.getWxAppId());
orderPayResponse.setOpenId(paymentRequest.getOpenId());
orderPayResponse.setPartnerId(orderBean.getCompanyId());
orderPayResponse.setOrderId(orderBean.getOid());
}
} catch (Exception e) {
LogUtil.error("comPay_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(paymentRequest));
//TODO 邮件告警
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg("comPay_error");
}
return orderPayResponse;
}
} }
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: PaymentClient
* @Package cn.freemud.service.thirdparty
* @Description: 支付服务
* @author: liming.guo
* @date: 2018/5/12519:24
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.*;
import com.freemud.sdk.api.assortment.order.request.payment.UnifiedOrderApplicationRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = "payment-center-application-api",url="${saas.paymentcenter.application.api.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface PaymentApplicationClient {
/**
* 统一下单
*/
@PostMapping("/payment/application/unifiedOrder")
UnifiedOrderApiResponse unifiedOrder(@RequestBody UnifiedOrderApplicationRequest unifiedOrderApplicationRequest, @RequestHeader("partnerId") String partnerId);
}
...@@ -215,4 +215,5 @@ public class CreateOrderRequest extends BaseRequest { ...@@ -215,4 +215,5 @@ public class CreateOrderRequest extends BaseRequest {
private Byte payChannelType; private Byte payChannelType;
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
} }
package com.freemud.application.sdk.api.ordercenter.request.create;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class OrderPayItemCreateReq {
private Long id;
private Long orderId;
private String orderCode;
private String partnerId;
private String storeId;
private String payChannelType;
private String payChannelName;
private String operator;
private BigDecimal payAmount;
}
\ No newline at end of file
...@@ -271,4 +271,4 @@ public class OrderInfoReqs { ...@@ -271,4 +271,4 @@ public class OrderInfoReqs {
//支付渠道类型 //支付渠道类型
private String payChannelType; private String payChannelType;
} }
\ No newline at end of file
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