Commit e69c512a by xiaoer.li@freemud.com

Merge remote-tracking branch 'origin/qa' into qa

parents 57abd511 8f2207b8
......@@ -71,7 +71,7 @@
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-orderdistributor-sdk</artifactId>
<version>2.6.RELEASE</version>
<version>2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
......@@ -81,7 +81,7 @@
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-dynamic-queue</artifactId>
<version>1.6.RELEASE</version>
<version>1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.freemud</groupId>
......
......@@ -13,6 +13,7 @@
package cn.freemud;
import cn.freemud.core.db.DataSourcesConfig;
import com.alibaba.fastjson.parser.ParserConfig;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import feign.RequestInterceptor;
import org.jasypt.encryption.StringEncryptor;
......@@ -46,6 +47,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@EnableAutoConfiguration
public class OrderApplication {
public static void main(String[] args) {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
SpringApplication.run(OrderApplication.class, args);
}
......
......@@ -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;
......@@ -1053,8 +1051,8 @@ public class OrderAdapter {
if (OrderAccountType.CUSTOMER_SUB.getCode().equals(accountBean.getType())) {
customerScoreAmount = accountBean.getPrice() < 0 ? 0 - accountBean.getPrice() : accountBean.getPrice();
DecimalFormat decimalFormat = new DecimalFormat("#.00");
String customerScoreAmountStr = decimalFormat.format(customerScoreAmount / 100.0);
customerScorePrompt = "积分抵扣-¥" + customerScoreAmountStr;
customerScorePrompt = decimalFormat.format(customerScoreAmount / 100.0);
// customerScorePrompt = "积分抵扣-¥" + customerScoreAmountStr;
}
}
}
......@@ -2232,13 +2230,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 +2757,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 +2771,7 @@ public class OrderAdapter {
requestDto.setTotalAmount(totalAmount);
requestDto.setCardAmount(cardAmount);
requestDto.setOrderExtInfoDTO(orderExtInfoDTO);
requestDto.setTransId(transId);
return requestDto;
}
......@@ -2781,7 +2781,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())){
......
......@@ -71,7 +71,7 @@ import java.util.stream.Collectors;
public class CheckOrder {
// 配送费逻辑是否使用旧的
@Value("${store.delivery.use.old:false}")
@Value("${store.delivery.use.old:true}")
private boolean storeDeliveryUseOld;
@Autowired
......
......@@ -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.*;
......@@ -132,8 +133,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}")
......@@ -216,6 +215,8 @@ public class OrderServiceImpl implements Orderservice {
private PaymentNewClient paymentNewClient;
@Autowired
private MallOrderServiceImpl mallOrderService;
@Autowired
private OrderAdapterService orderAdapterService;
......@@ -331,33 +332,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();
......@@ -468,25 +444,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);
......@@ -551,7 +518,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");
......@@ -1819,13 +1786,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());
......@@ -1857,7 +1825,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);
}
}
......@@ -1919,9 +1887,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));
......@@ -1941,7 +1909,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());
......@@ -1951,7 +1919,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");
......@@ -2281,7 +2249,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);
}
}
......@@ -2377,13 +2345,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);
}
}
......@@ -21,16 +21,16 @@ public class RefundConfig {
*/
private boolean isRefundDeliveryFee;
/**
* 是否支持订单完成退款
* 订单是否支持退款
*/
private boolean isFinishRefund;
private boolean isCanRefund;
public RefundConfig(){
}
public RefundConfig(boolean isFinishRefund,boolean isRefundDeliveryFee){
this.isFinishRefund=isFinishRefund;
public RefundConfig(boolean isCanRefund, boolean isRefundDeliveryFee){
this.isCanRefund = isCanRefund;
this.isRefundDeliveryFee=isRefundDeliveryFee;
}
}
......@@ -160,7 +160,7 @@ public enum ResponseResult {
REJECT_ORDER_FAIL("45075", "拒单失败"),
AGREE_REFUND_ORDER_FAIL("45076", "同意退款失败"),
ORDER_REFUND_NOT_APPLY("45077","用户未申请退款"),
ORDER_HAD_AFFIRM_CAN_NOT_REFUND("45078","订单已经完成,不能申请退款"),
ORDER_HAD_AFFIRM_CAN_NOT_REFUND("45078","当前订单不允许退款,请前往B端后台设置"),
ORDER_REJECT_REFUND_REPETITION("45079","重复操作,订单已拒绝退款"),
ORDER_REJECT_REFUND_STATUS_NOT("45080","订单不是申请退款中,不能操作"),
ORDER_REJECT_REFUND_STATUS_END("45081","订单未接单或者已取消,不能操作"),
......
......@@ -14,12 +14,9 @@ import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPa
import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager;
import com.freemud.application.sdk.api.ordercenter.enums.OperateClient;
import com.freemud.sdk.api.assortment.order.enums.OldOrderAccountType;
import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus;
import com.freemud.sdk.api.assortment.order.enums.OldOrderType;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -221,18 +218,20 @@ public class OrderVerifyHandle {
|| orderBean.getRefundList().get(orderBean.getRefundList().size() - 1).getStatus() != 1) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_NOT_APPLY);
}
boolean isFinishRefund = false;
//订单是否支持退款
boolean isCanRefund = false;
//订单
boolean isRefundDeliveryFee=false;
//saas渠道订单,已完成的订单不能操作, 商户配置已完成订单可退款可退款
if (ObjectUtils.equals(orderBean.getSource(), OrderSource.SAAS.getSource())) {
RefundConfig refundConfig = getRefundConfig(orderBean);
isFinishRefund=refundConfig.isFinishRefund();
isCanRefund=refundConfig.isCanRefund();
isRefundDeliveryFee=refundConfig.isRefundDeliveryFee();
if (!isFinishRefund) {
if (!isCanRefund) {
return ResponseUtil.error(ResponseResult.ORDER_HAD_AFFIRM_CAN_NOT_REFUND);
}
}
if (isFinishRefund) {
if (isCanRefund) {
orderBean.setAmount(getRefundAmount(orderBean,isRefundDeliveryFee).longValue());
}
return ResponseUtil.success();
......@@ -373,8 +372,7 @@ public class OrderVerifyHandle {
return refundAmount;
}
List<QueryOrdersResponse.DataBean.OrderBean.AccountBean> accountList = data.getAccountList();
//外卖订单,已完成,不退配送费
if (data.getStatus() == OldOrderStatus.COMPLETE.getCode() && data.getType() == OldOrderType.TAKE_OUT.getCode()) {
if (CollectionUtils.isNotEmpty(accountList)) {
for (QueryOrdersResponse.DataBean.OrderBean.AccountBean orderCostResp : accountList) {
if (orderCostResp.getType() == OldOrderAccountType.DELIVERY_AMOUNT.getCode()) {
refundAmount = new BigDecimal(data.getAmount().intValue() - orderCostResp.getPrice());
......
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();
}
}
......@@ -87,7 +87,7 @@ import static java.util.stream.Collectors.toList;
public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
// 配送费逻辑是否使用旧的
@Value("${store.delivery.use.old:false}")
@Value("${store.delivery.use.old:true}")
private boolean storeDeliveryUseOld;
@Autowired
......
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