Commit 137f04eb by 李学兴

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

parents 809c953c 9126f8a4
...@@ -14,6 +14,7 @@ package cn.freemud.adapter; ...@@ -14,6 +14,7 @@ package cn.freemud.adapter;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.CustomerScoreConstant; import cn.freemud.constant.CustomerScoreConstant;
import cn.freemud.constant.KgdRedisKeyConstant;
import cn.freemud.constant.RedisKeyConstant; import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.*; import cn.freemud.entities.dto.*;
...@@ -97,6 +98,7 @@ import java.math.BigDecimal; ...@@ -97,6 +98,7 @@ 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.MessageFormat;
import java.time.Instant; import java.time.Instant;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
...@@ -2091,12 +2093,16 @@ public class OrderAdapter { ...@@ -2091,12 +2093,16 @@ public class OrderAdapter {
// 除 未支付 拒单 和 取消外,其他可退款 // 除 未支付 拒单 和 取消外,其他可退款
return Stream.of(OrderStatus.WAIT_PAY, OrderStatus.REFUSE, OrderStatus.CALCEL).noneMatch(s -> Objects.equals(status, s)); return Stream.of(OrderStatus.WAIT_PAY, OrderStatus.REFUSE, OrderStatus.CALCEL).noneMatch(s -> Objects.equals(status, s));
} }
boolean canRefund = false;
List<AssortmentOpenPlatformPartnerWxappConfig> wxappConfigs = cacheWxappConfigManager.cacheSelectDefaultPage(wxAppId, "2");
Map<String, AssortmentOpenPlatformPartnerWxappConfig> configMap = wxappConfigs.stream().collect(Collectors.toMap(AssortmentOpenPlatformPartnerWxappConfig::getAppKey, Function.identity()));
AssortmentOpenPlatformPartnerWxappConfig orderRefund;
// 查询小程序配置的退款设置
boolean canRefund = false;
String hkey = OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType()) ? KgdRedisKeyConstant.REFUND_CFG_TAKE_OUT : KgdRedisKeyConstant.REFUND_CFG_EAT_IN;
String configStr = redisCache.hashGet(hkey, MessageFormat.format(KgdRedisKeyConstant.ORDER_REFUND_CONFIG, orderBean.getCompanyId(), wxAppId));
if (StringUtils.isEmpty(configStr)) {
return true;
}
JSONObject config = JSON.parseObject(configStr);
String orderRefund;
//订单状态 //订单状态
switch (status) { switch (status) {
...@@ -2104,33 +2110,33 @@ public class OrderAdapter { ...@@ -2104,33 +2110,33 @@ public class OrderAdapter {
case TAKE_ORDER: case TAKE_ORDER:
//区分外卖单和到店订单,判断是否可以退款 //区分外卖单和到店订单,判断是否可以退款
if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) { if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_TAKE_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_TAKE_ORDER_REFUND.getKeyValue());
} else { } else {
orderRefund = configMap.get(OrderRefundEnum.TAKEORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.TAKEORDER_REFUND.getKeyValue());
} }
if (orderRefund == null || ALLOW_REFUND.equals(orderRefund.getAppValue())) { if (orderRefund == null || ALLOW_REFUND.equals(orderRefund)) {
canRefund = true; canRefund = true;
} }
break; break;
//已接单 //已接单
case RECEIPT: case RECEIPT:
if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) { if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_RECEIPT_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_RECEIPT_ORDER_REFUND.getKeyValue());
} else { } else {
orderRefund = configMap.get(OrderRefundEnum.RECEIPTORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.RECEIPTORDER_REFUND.getKeyValue());
} }
if (orderRefund == null || ALLOW_REFUND.equals(orderRefund.getAppValue())) { if (orderRefund == null || ALLOW_REFUND.equals(orderRefund)) {
canRefund = true; canRefund = true;
} }
break; break;
//制作完成 //制作完成
case COMPLETE_MAKE: case COMPLETE_MAKE:
if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) { if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_COMPLETE_MAKE_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_COMPLETE_MAKE_ORDER_REFUND.getKeyValue());
} else { } else {
orderRefund = configMap.get(OrderRefundEnum.COMPLETEMAKEORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.COMPLETEMAKEORDER_REFUND.getKeyValue());
} }
if (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue())) { if (orderRefund != null && ALLOW_REFUND.equals(orderRefund)) {
canRefund = true; canRefund = true;
} }
break; break;
...@@ -2140,19 +2146,18 @@ public class OrderAdapter { ...@@ -2140,19 +2146,18 @@ public class OrderAdapter {
long gmtModified = orderBean.getGmtModified(); long gmtModified = orderBean.getGmtModified();
long value = 0L; long value = 0L;
AssortmentOpenPlatformPartnerWxappConfig refundDateConfig = configMap.get(OrderRefundEnum.REFUND_DATA_RANGE.getKeyValue()); String refundDateConfig = config.getString(OrderRefundEnum.REFUND_DATA_RANGE.getKeyValue());
if (null != refundDateConfig) { if (null != refundDateConfig) {
String appValue = refundDateConfig.getAppValue(); value = Long.parseLong(StringUtils.isEmpty(refundDateConfig) ? "0" : refundDateConfig);
value = Long.parseLong(StringUtils.isEmpty(appValue) ? "0" : appValue);
} }
long allowRefundTime = gmtModified + value * 24 * 60 * 60 * 1000; long allowRefundTime = gmtModified + value * 24 * 60 * 60 * 1000;
if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) { if (OrderType.TAKE_OUT.getCode().equals(orderBean.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_ORDER_REFUND.getKeyValue());
} else { } else {
orderRefund = configMap.get(OrderRefundEnum.ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.ORDER_REFUND.getKeyValue());
} }
if (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue()) && (allowRefundTime - currentTime) >= 0) { if (orderRefund != null && ALLOW_REFUND.equals(orderRefund) && (allowRefundTime - currentTime) >= 0) {
canRefund = true; canRefund = true;
} }
break; break;
......
package cn.freemud.constant;
/**
* @author Clover.z
* @Date 2021/8/11
* @Desc
*/
public class KgdRedisKeyConstant {
/**
* 订单是否支持退款配置 缓存key
* 0:商户号
* 1:小程序appId
*
* value: hash结构
* hkey : eatInType 堂食 和takeOutType 外卖
* 具体配置为json字符串
*/
public static final String ORDER_REFUND_CONFIG = "kgd:order_refund_config_{0}_{1}";
/**
* 订单类型为堂食 redis配置的hkey
*/
public static final String REFUND_CFG_EAT_IN = "eatInType";
/**
* 订单类型为外卖 redis配置的hkey
*/
public static final String REFUND_CFG_TAKE_OUT = "takeOutType";
}
...@@ -15,17 +15,18 @@ package cn.freemud.enums; ...@@ -15,17 +15,18 @@ package cn.freemud.enums;
public enum OrderRefundEnum { public enum OrderRefundEnum {
ORDER_REFUND("orderRefund", "已完成订单是否允许退款"), ORDER_REFUND("orderRefund", "已完成订单是否允许退款"),
REFUND_DATA_RANGE("refundDateRange", "退款允许日期"),
TAKEORDER_REFUND("takeOrderRefund", "未接单是否支持退款"), TAKEORDER_REFUND("takeOrderRefund", "未接单是否支持退款"),
RECEIPTORDER_REFUND("receiptOrderRefund", "已接单是否支持退款"), RECEIPTORDER_REFUND("receiptOrderRefund", "已接单是否支持退款"),
COMPLETEMAKEORDER_REFUND("completeMakeOrderRefund", "制作完成是否支持退款"), COMPLETEMAKEORDER_REFUND("completeMakeOrderRefund", "制作完成是否支持退款"),
REFUND_DELIVERY_FEE_ENABLE("refundShippingFee","商家同意退款时是否退配送费"),
DELIVERY_TAKE_ORDER_REFUND("deliveryTakeOrderRefund","外卖单未接单是否支持退款"), DELIVERY_TAKE_ORDER_REFUND("deliveryTakeOrderRefund","外卖单未接单是否支持退款"),
DELIVERY_RECEIPT_ORDER_REFUND("deliveryReceiptOrderRefund","外卖单已接单是否支持退款"), DELIVERY_RECEIPT_ORDER_REFUND("deliveryReceiptOrderRefund","外卖单已接单是否支持退款"),
DELIVERY_COMPLETE_MAKE_ORDER_REFUND("deliveryCompleteMakeOrderRefund","外卖单制作完成是否支持退款"), DELIVERY_COMPLETE_MAKE_ORDER_REFUND("deliveryCompleteMakeOrderRefund","外卖单制作完成是否支持退款"),
DELIVERY_ORDER_REFUND("deliveryOrderRefund","外卖单订单完成是否支持退款"); DELIVERY_ORDER_REFUND("deliveryOrderRefund","外卖单订单完成是否支持退款"),
REFUND_DATA_RANGE("refundDateRange", "退款允许日期"),
REFUND_DELIVERY_FEE_ENABLE("refundShippingFee","商家同意退款时是否退配送费"),
REFUND_REVERSE_COUPON("refundReverseCoupon", "退款退优惠券");
;
private String keyValue; private String keyValue;
......
package cn.freemud.service.process.order;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
import com.google.common.collect.Maps;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description:
* @author: jiming.liu
* @date: 2021/7/23 下午1:43
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
public abstract class AbstractQueueIndexProcessor implements OrderQueueIndexProcessor {
protected Map<String, String> transferResult(String oid, String queueIndex) {
Map<String, String> queueIndexMap = Maps.newHashMap();
queueIndexMap.put("oid", oid);
queueIndexMap.put("queueIndex", queueIndex == null ? "" : queueIndex);
return queueIndexMap;
}
protected Map<String, String> transferResult(String oid, HexCloudTakeAwayOrderStatusDto statusDto) {
Map<String, String> queueIndexMap = Maps.newHashMap();
queueIndexMap.put("oid", oid);
queueIndexMap.put("queueIndex", statusDto == null ? "" : statusDto.getWaiting_order_count() + "");
return queueIndexMap;
}
}
package cn.freemud.service.process.order;
import cn.freemud.constant.CommonsConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.order.QueryLineUpOrderDto;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
import cn.freemud.utils.AppLogUtil;
import com.freemud.application.sdk.api.ordercenter.request.QueryLineUpOrderReq;
import com.freemud.sdk.api.assortment.order.response.order.QueryLineUpResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description:
* @author: jiming.liu
* @date: 2021/7/21 下午3:53
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Component
public class FreemudOrderQueueIndexProcessorImpl extends AbstractQueueIndexProcessor {
private final OrderCenterSdkService orderCenterSdkService;
public FreemudOrderQueueIndexProcessorImpl(OrderCenterSdkService orderCenterSdkService) {
this.orderCenterSdkService = orderCenterSdkService;
}
@Override
public String name() {
return CommonsConstant.QUEUE_INDEX_PROCESSOR_NAME_FREEMUD;
}
@Override
public HexCloudTakeAwayOrderStatusDto process(QueryLineUpOrderDto vo) {
AppLogUtil.infoLog("queryLineUpOrder from freemud ", vo, "");
QueryLineUpOrderReq queryLineUpOrderReq = new QueryLineUpOrderReq();
queryLineUpOrderReq.setPartnerId(vo.getPartnerId());
queryLineUpOrderReq.setStoreId(vo.getStoreId());
queryLineUpOrderReq.setStartTime(vo.getStartTime());
queryLineUpOrderReq.setEndTime(vo.getEndTime());
// 查询订单的排队人数
QueryLineUpResponse response = orderCenterSdkService.queryLineUpOrder(queryLineUpOrderReq);
if (!ResponseCodeConstant.RESPONSE_SUCCESS.equals(response.getErrcode())) {
AppLogUtil.infoLog("queryLineUpOrder from freemud", vo, response);
return null;
}
List<String> orderCodeList = response.getOrderCodes();
int size = 0, productSum = 0;
if (!CollectionUtils.isEmpty(orderCodeList)) {
size = orderCodeList.size();
productSum = orderCodeList.stream().mapToInt(product -> Integer.parseInt(product.split("-")[1])).sum();
}
return HexCloudTakeAwayOrderStatusDto.builder().waiting_order_count(size).waiting_product_count(productSum).hexCloudResponse(false).build();
}
}
package cn.freemud.service.process.order;
import cn.freemud.constant.CommonsConstant;
import cn.freemud.entities.dto.order.QueryLineUpOrderDto;
import cn.freemud.service.thirdparty.hexcloud.HexCloudClient;
import cn.freemud.service.thirdparty.hexcloud.request.HexCloudBaseRequest;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudBaseResponse;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
import cn.freemud.utils.AppLogUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description:
* @author: jiming.liu
* @date: 2021/7/21 下午3:52
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Component
public class HexCloudOrderQueueIndexProcessorImpl extends AbstractQueueIndexProcessor {
@Autowired
private HexCloudClient hexCloudClient;
@Override
public String name() {
return CommonsConstant.QUEUE_INDEX_PROCESSOR_NAME_HEXCLOUD;
}
@Override
public HexCloudTakeAwayOrderStatusDto process(QueryLineUpOrderDto vo) {
AppLogUtil.infoLog("queryLineUpOrder from HexCloud", vo, "");
if (StringUtils.isEmpty(vo.getThirdOrderCode())) {
AppLogUtil.infoLog("合阔查询失败,ThirdOrderCode is empty", vo, "");
return null;
}
//
Map<String, String> orderThirdCode = new HashMap<>();
orderThirdCode.put("tp_order_id", vo.getThirdOrderCode());
HexCloudBaseRequest request = HexCloudBaseRequest.builder().shopId(vo.getStoreId()).partnerId(vo.getPartnerId()).startTime(vo.getStartTime())
.endTime(vo.getEndTime()).oid(vo.getOrderCode()).data(orderThirdCode).thirdStoreId(vo.getThirdStoreId()).build();
HexCloudBaseResponse<HexCloudTakeAwayOrderStatusDto> hexCloudBaseResponse = hexCloudClient.takeAwayOrderStatus(request);
if (null != hexCloudBaseResponse && hexCloudBaseResponse.success()) {
HexCloudTakeAwayOrderStatusDto statusDto = hexCloudBaseResponse.getResponseBody();
if (null != statusDto) {
statusDto.setHexCloudResponse(true);
}
return statusDto;
} else {
AppLogUtil.infoLog("合阔查询失败", request, hexCloudBaseResponse);
return null;
}
}
}
package cn.freemud.service.process.order;
import cn.freemud.entities.dto.order.QueryLineUpOrderDto;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description:
* @author: jiming.liu
* @date: 2021/7/21 下午3:36
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
public interface OrderQueueIndexProcessor {
/**
* 名称
*
* @return
*/
String name();
/**
* 执行体
*
* @param vo
* @return
*/
HexCloudTakeAwayOrderStatusDto process(QueryLineUpOrderDto vo);
}
package cn.freemud.service.process.order;
import cn.freemud.constant.CommonsConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Optional;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description:
* @author: jiming.liu
* @date: 2021/7/21 下午3:54
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Slf4j
@Component
public class OrderQueueIndexProcessorFactory {
/**
* 查询合阔订单排队接口,商户白名单
*/
@Value("#{'${order.queueIndex.hexCloud.pos.partnerId}'.split(',')}")
private List<String> notAutomaticTwistPartnerId;
/**
* 执行器
*/
private List<OrderQueueIndexProcessor> processors;
public OrderQueueIndexProcessorFactory(List<OrderQueueIndexProcessor> processors) {
this.processors = processors;
}
/**
* 根据白名单配置是否查询合阔
*
* @param partnerId
* @return
*/
public OrderQueueIndexProcessor processor(String partnerId) {
//根据白名单商户判断是否查询合阔
if (StringUtils.isEmpty(partnerId)) {
return commonProcessor();
}
if (notAutomaticTwistPartnerId.contains(partnerId)) {
return getProcessor(CommonsConstant.QUEUE_INDEX_PROCESSOR_NAME_HEXCLOUD);
}
return commonProcessor();
}
/**
* 通用执行器
*
* @return
*/
public OrderQueueIndexProcessor commonProcessor() {
return getProcessor(CommonsConstant.QUEUE_INDEX_PROCESSOR_NAME_FREEMUD);
}
/**
* 根据名称获取processor
*
* @param name
* @return
*/
private OrderQueueIndexProcessor getProcessor(String name) {
Optional<OrderQueueIndexProcessor> optional = processors.stream().filter(p -> name.equals(p.name())).findFirst();
if (optional.isPresent()) {
return optional.get();
}
throw new UnsupportedOperationException("freemud OrderQueueIndexProcessor not fount");
}
}
package cn.freemud.service.thirdparty.hexcloud;
import cn.freemud.service.thirdparty.hexcloud.request.HexCloudBaseRequest;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudBaseResponse;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description: 对接合阔的接口
* @author: jiming.liu
* @date: 2021/7/21 下午2:36
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@FeignClient(name = "adapter-open-store-sync-pos-status-service", url = "${saas.adapter.syncPosStatus.feignUrl}", fallbackFactory = HexCloudClientFallbackFactory.class)
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface HexCloudClient {
/**
* 查询合阔订单排队序号
*
* @param baseRequest
* @return
*/
@PostMapping(value = "/hexcloud/order/status")
HexCloudBaseResponse<HexCloudTakeAwayOrderStatusDto> takeAwayOrderStatus(HexCloudBaseRequest<Map<String, String>> baseRequest);
}
package cn.freemud.service.thirdparty.hexcloud;
import cn.freemud.entities.dto.order.QueryLineUpOrderDto;
import cn.freemud.service.process.order.OrderQueueIndexProcessorFactory;
import cn.freemud.service.thirdparty.hexcloud.request.HexCloudBaseRequest;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudBaseResponse;
import cn.freemud.service.thirdparty.hexcloud.response.HexCloudTakeAwayOrderStatusDto;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.SpringBeanUtil;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description: 合阔接口降级处理
* @author: jiming.liu
* @date: 2021/7/22 下午2:45
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Component
public class HexCloudClientFallbackFactory implements FallbackFactory<HexCloudClient> {
@Override
public HexCloudClient create(Throwable throwable) {
AppLogUtil.errorLog("请求合阔获取订单排队号失败,降级处理:", "", "", (Exception) throwable);
return new HexCloudClient() {
@Override
public HexCloudBaseResponse<HexCloudTakeAwayOrderStatusDto> takeAwayOrderStatus(HexCloudBaseRequest<Map<String, String>> baseRequest) {
QueryLineUpOrderDto vo = new QueryLineUpOrderDto();
vo.setStoreId(baseRequest.getShopId());
vo.setPartnerId(baseRequest.getPartnerId());
vo.setOrderCode(baseRequest.getOid());
vo.setStartTime(baseRequest.getStartTime());
vo.setEndTime(baseRequest.getEndTime());
//请求非码自己的排队号
OrderQueueIndexProcessorFactory factory = SpringBeanUtil.getBean(OrderQueueIndexProcessorFactory.class);
HexCloudTakeAwayOrderStatusDto statusDto = factory.commonProcessor().process(vo);
if (null != statusDto) {
statusDto.setHexCloudResponse(false);
}
return HexCloudBaseResponse.buildSuccess(statusDto);
}
};
}
}
package cn.freemud.service.thirdparty.hexcloud.request;
import lombok.Builder;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description: 查询合阔接口基础参数
* @author: jiming.liu
* @date: 2021/7/21 下午2:36
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
@Builder
public class HexCloudBaseRequest<T> {
/**
* 商户id
*/
private String partnerId;
/**
* 店铺id
*/
private String shopId;
/**
* 订单编号
*/
private String oid;
/**
* 时间开始
*/
private Long startTime;
/**
* 时间开始
*/
private Long endTime;
/**
* 三方门店号
*/
private String thirdStoreId;
/**
* 参数数据
*/
private T data;
}
package cn.freemud.service.thirdparty.hexcloud.response;
import cn.freemud.constant.ResponseCodeConstant;
import lombok.Builder;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description: 合阔接口响base值
* @author: jiming.liu
* @date: 2021/7/21 下午2:36
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
@Builder
public class HexCloudBaseResponse<T> {
/**
* 调用是否成功,0成功
*/
private String statusCode;
/**
* 错误信息
*/
private String ver;
private String message;
/**
* 返回数据
*/
private T responseBody;
/**
* 判断是否成功
*
* @return
*/
public boolean success() {
return ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(this.statusCode);
}
/**
* 成功
*
* @param
* @return
*/
public static HexCloudBaseResponse buildSuccess() {
return HexCloudBaseResponse.builder().statusCode(ResponseCodeConstant.RESPONSE_SUCCESS_STR).build();
}
/**
* 成功
*
* @param
* @return
*/
public static HexCloudBaseResponse buildSuccess(Object payload) {
return HexCloudBaseResponse.builder().statusCode(ResponseCodeConstant.RESPONSE_SUCCESS_STR).responseBody(payload).build();
}
}
package cn.freemud.service.thirdparty.hexcloud.response;
import lombok.Builder;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Description: 订单排队状态响应值
* @author: jiming.liu
* @date: 2021/7/21 下午2:55
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
@Builder
public class HexCloudTakeAwayOrderStatusDto {
/**
* 合阔订单ID (全市场唯一)
*/
private String ticket_id;
/**
* 第三方订单ID(必须唯一)
*/
private String tp_order_id;
/**
* 订单状态: 等待制作(1),制作中(2),制作完成(3),已取餐(4),无效或废弃(5)
*/
private Integer flow_status;
/**
* 取餐号
*/
private String takemealNumber;
/**
* 预计等待时间:单位秒
*/
private Integer waiting_time;
/**
* 前面等待订单数
*/
private Integer waiting_order_count;
/**
* 前面等待商品数
*/
private Integer waiting_product_count;
/**
* 是否是合阔
*/
private boolean hexCloudResponse;
}
package cn.freemud.management.constant;
/**
* @author Clover.z
* @Date 2021/8/11
* @Desc
*/
public class KgdRedisKeyConstant {
/**
* 订单是否支持退款配置 缓存key
* 0:商户号
* 1:小程序appId
*
* value: hash结构
* hkey : eatInType 堂食 和takeOutType 外卖
* 具体配置为json字符串
*/
public static final String ORDER_REFUND_CONFIG = "kgd:order_refund_config_{0}_{1}";
/**
* 订单类型为堂食 redis配置的hkey
*/
public static final String REFUND_CFG_EAT_IN = "eatInType";
/**
* 订单类型为外卖 redis配置的hkey
*/
public static final String REFUND_CFG_TAKE_OUT = "takeOutType";
}
...@@ -15,16 +15,17 @@ package cn.freemud.management.enums; ...@@ -15,16 +15,17 @@ package cn.freemud.management.enums;
public enum OrderRefundEnum { public enum OrderRefundEnum {
ORDER_REFUND("orderRefund", "已完成订单是否允许退款"), ORDER_REFUND("orderRefund", "已完成订单是否允许退款"),
REFUND_DATA_RANGE("refundDateRange", "退款允许日期"),
TAKEORDER_REFUND("takeOrderRefund", "未接单是否支持退款"), TAKEORDER_REFUND("takeOrderRefund", "未接单是否支持退款"),
RECEIPTORDER_REFUND("receiptOrderRefund", "已接单是否支持退款"), RECEIPTORDER_REFUND("receiptOrderRefund", "已接单是否支持退款"),
COMPLETEMAKEORDER_REFUND("completeMakeOrderRefund", "制作完成是否支持退款"), COMPLETEMAKEORDER_REFUND("completeMakeOrderRefund", "制作完成是否支持退款"),
REFUND_DELIVERY_FEE_ENABLE("refundShippingFee","商家同意退款时是否退配送费"),
DELIVERY_TAKE_ORDER_REFUND("deliveryTakeOrderRefund","外卖单未接单是否支持退款"), DELIVERY_TAKE_ORDER_REFUND("deliveryTakeOrderRefund","外卖单未接单是否支持退款"),
DELIVERY_RECEIPT_ORDER_REFUND("deliveryReceiptOrderRefund","外卖单已接单是否支持退款"), DELIVERY_RECEIPT_ORDER_REFUND("deliveryReceiptOrderRefund","外卖单已接单是否支持退款"),
DELIVERY_COMPLETE_MAKE_ORDER_REFUND("deliveryCompleteMakeOrderRefund","外卖单制作完成是否支持退款"), DELIVERY_COMPLETE_MAKE_ORDER_REFUND("deliveryCompleteMakeOrderRefund","外卖单制作完成是否支持退款"),
DELIVERY_ORDER_REFUND("deliveryOrderRefund","外卖单订单完成是否支持退款"); DELIVERY_ORDER_REFUND("deliveryOrderRefund","外卖单订单完成是否支持退款"),
REFUND_DATA_RANGE("refundDateRange", "退款允许日期"),
REFUND_DELIVERY_FEE_ENABLE("refundShippingFee","商家同意退款时是否退配送费"),
REFUND_REVERSE_COUPON("refundReverseCoupon", "退款退优惠券");
private String keyValue; private String keyValue;
......
...@@ -2,11 +2,14 @@ package cn.freemud.management.service.handle; ...@@ -2,11 +2,14 @@ package cn.freemud.management.service.handle;
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.management.constant.KgdRedisKeyConstant;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest; import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse; import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.entities.dto.response.pay.RefundConfig; import cn.freemud.management.entities.dto.response.pay.RefundConfig;
import cn.freemud.management.enums.*; import cn.freemud.management.enums.*;
import cn.freemud.management.util.ResponseUtil; import cn.freemud.management.util.ResponseUtil;
import cn.freemud.redis.RedisCache;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig; import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig;
import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager; import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager;
...@@ -26,11 +29,13 @@ import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; ...@@ -26,11 +29,13 @@ import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
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.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -69,6 +74,8 @@ public class OrderVerifyHandle { ...@@ -69,6 +74,8 @@ public class OrderVerifyHandle {
private OrderCenterSdkService orderCenterSdkService; private OrderCenterSdkService orderCenterSdkService;
@Autowired @Autowired
private DeliveryHandle deliveryHandle; private DeliveryHandle deliveryHandle;
@Autowired
private RedisCache redisCache;
@Value("${delivery.support.ordersource}") @Value("${delivery.support.ordersource}")
private String supportOrderSource; private String supportOrderSource;
...@@ -601,13 +608,19 @@ public class OrderVerifyHandle { ...@@ -601,13 +608,19 @@ public class OrderVerifyHandle {
// 除 未支付 拒单 和 取消外,其他可退款 // 除 未支付 拒单 和 取消外,其他可退款
return Stream.of(OrderStatus.WAIT_PAY,OrderStatus.REFUSE,OrderStatus.CANCEL).noneMatch(s -> Objects.equals(data.getStatus(),s.getCode())); return Stream.of(OrderStatus.WAIT_PAY,OrderStatus.REFUSE,OrderStatus.CANCEL).noneMatch(s -> Objects.equals(data.getStatus(),s.getCode()));
} }
boolean canRefund = false;
com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto extInfo = null; com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto extInfo = null;
JSONObject jsonObject1 = JSONObject.parseObject(data.getExtInfo()); JSONObject jsonObject1 = JSONObject.parseObject(data.getExtInfo());
extInfo = jsonObject1.toJavaObject(com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto.class); extInfo = jsonObject1.toJavaObject(com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto.class);
List<AssortmentOpenPlatformPartnerWxappConfig> partnerWxappConfigs = cacheOpenPlatformPartnerWxappConfigManager.cacheSelectDefaultPage(extInfo.getAppid(), "2");
Map<String, AssortmentOpenPlatformPartnerWxappConfig> configMap = partnerWxappConfigs.stream().collect(Collectors.toMap(AssortmentOpenPlatformPartnerWxappConfig::getAppKey, Function.identity())); // 查询小程序配置的退款设置
AssortmentOpenPlatformPartnerWxappConfig orderRefund; String hkey = OrderType.TAKE_OUT.getCode().equals(data.getOrderType()) ? KgdRedisKeyConstant.REFUND_CFG_TAKE_OUT : KgdRedisKeyConstant.REFUND_CFG_EAT_IN;
String configStr = redisCache.hashGet(hkey, MessageFormat.format(KgdRedisKeyConstant.ORDER_REFUND_CONFIG, data.getCompanyId(), extInfo.getAppid()));
if (StringUtils.isEmpty(configStr)) {
return true;
}
JSONObject config = JSON.parseObject(configStr);
String orderRefund;
//订单状态 //订单状态
switch (data.getStatus()) { switch (data.getStatus()) {
...@@ -615,44 +628,44 @@ public class OrderVerifyHandle { ...@@ -615,44 +628,44 @@ public class OrderVerifyHandle {
case 1: case 1:
//区分外卖单和到店订单,判断是否可以退款 //区分外卖单和到店订单,判断是否可以退款
if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) { if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_TAKE_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_TAKE_ORDER_REFUND.getKeyValue());
}else { }else {
orderRefund = configMap.get(OrderRefundEnum.TAKEORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.TAKEORDER_REFUND.getKeyValue());
} }
if (orderRefund == null || (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue()))) { if (orderRefund == null || (orderRefund != null && ALLOW_REFUND.equals(orderRefund))) {
isFinishRefund = true; isFinishRefund = true;
} }
break; break;
//已接单 //已接单
case 3: case 3:
if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) { if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_RECEIPT_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_RECEIPT_ORDER_REFUND.getKeyValue());
}else { }else {
orderRefund = configMap.get(OrderRefundEnum.RECEIPTORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.RECEIPTORDER_REFUND.getKeyValue());
} }
if (orderRefund == null || (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue()))) { if (orderRefund == null || (orderRefund != null && ALLOW_REFUND.equals(orderRefund))) {
isFinishRefund = true; isFinishRefund = true;
} }
break; break;
//制作完成 //制作完成
case 31: case 31:
if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) { if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_COMPLETE_MAKE_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_COMPLETE_MAKE_ORDER_REFUND.getKeyValue());
}else { }else {
orderRefund = configMap.get(OrderRefundEnum.COMPLETEMAKEORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.COMPLETEMAKEORDER_REFUND.getKeyValue());
} }
if (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue())) { if (orderRefund != null && ALLOW_REFUND.equals(orderRefund)) {
isFinishRefund = true; isFinishRefund = true;
} }
break; break;
// 订单完成 // 订单完成
case 5: case 5:
if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) { if(OrderType.TAKE_OUT.getCode().equals(data.getOrderType())) {
orderRefund = configMap.get(OrderRefundEnum.DELIVERY_ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.DELIVERY_ORDER_REFUND.getKeyValue());
}else { }else {
orderRefund = configMap.get(OrderRefundEnum.ORDER_REFUND.getKeyValue()); orderRefund = config.getString(OrderRefundEnum.ORDER_REFUND.getKeyValue());
} }
if (orderRefund != null && ALLOW_REFUND.equals(orderRefund.getAppValue())) { if (orderRefund != null && ALLOW_REFUND.equals(orderRefund)) {
isFinishRefund = true; isFinishRefund = true;
} }
break; break;
......
...@@ -96,6 +96,11 @@ public class CouponPromotionService implements IPromotionService { ...@@ -96,6 +96,11 @@ public class CouponPromotionService implements IPromotionService {
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults> couponResultsList = calculationDiscountResult.getCouponDiscounts(); List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults> couponResultsList = calculationDiscountResult.getCouponDiscounts();
if (CollectionUtils.isNotEmpty(couponResultsList)) { if (CollectionUtils.isNotEmpty(couponResultsList)) {
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults couponResults : couponResultsList) { for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults couponResults : couponResultsList) {
//前端计算小计拿商品现价累计减couponDiscount,商品券换购券现价已排除
if(ActivityTypeEnum.TYPE_33.getCode()== couponResults.getActivityType()
|| ActivityTypeEnum.TYPE_32.getCode()== couponResults.getActivityType()){
continue;
}
couponDiscount = couponDiscount + (couponResults.getDiscountAmount() == null ? 0 : couponResults.getDiscountAmount()); couponDiscount = couponDiscount + (couponResults.getDiscountAmount() == null ? 0 : couponResults.getDiscountAmount());
} }
} }
......
...@@ -304,6 +304,11 @@ public class CouponDiscountCalculation { ...@@ -304,6 +304,11 @@ public class CouponDiscountCalculation {
long couponDiscount = 0; long couponDiscount = 0;
if (CollectionUtils.isNotEmpty(couponDiscounts)) { if (CollectionUtils.isNotEmpty(couponDiscounts)) {
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Discount couponResults : couponDiscounts) { for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Discount couponResults : couponDiscounts) {
//前端计算小计拿商品现价累计减couponDiscount,商品券换购券现价已排除
if(ActivityTypeEnum.TYPE_33.getCode()== couponResults.getType()
|| ActivityTypeEnum.TYPE_32.getCode()== couponResults.getType()){
continue;
}
couponDiscount = couponDiscount + (couponResults.getDiscount() == null ? 0 : couponResults.getDiscount()); couponDiscount = couponDiscount + (couponResults.getDiscount() == null ? 0 : couponResults.getDiscount());
} }
} }
......
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