Commit 66296c5c by 徐康

Merge remote-tracking branch 'origin/feature/xukang_20211201_虚拟订单退款' into…

Merge remote-tracking branch 'origin/feature/xukang_20211201_虚拟订单退款' into feature/xukang_20211201_虚拟订单退款

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
#	order-application-service/src/main/java/cn/freemud/service/thirdparty/OrderServiceClient.java
parents f82791fd 8214d470
...@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity { ...@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity {
* 1-允许 * 1-允许
*/ */
private String cashierOrderRefund; private String cashierOrderRefund;
/**
* 卖券订单是否可以申请退款
* null <=0 都不可以申请退款
*/
private Integer couponOrderRefundDayLimit;
} }
...@@ -1143,10 +1143,6 @@ public class OrderAdapter { ...@@ -1143,10 +1143,6 @@ public class OrderAdapter {
responseVo.setEnableRefund(true); responseVo.setEnableRefund(true);
} }
responseVo.setBizType(ordersBean.getBizType()); responseVo.setBizType(ordersBean.getBizType());
//6:卖券虚拟商品 暂不能申请退款
if (ordersBean.getBizType() == 6) {
responseVo.setButtonRefund(false);
}
List<Integer> enableRefundCodes = Lists.newArrayList(Arrays.asList( List<Integer> enableRefundCodes = Lists.newArrayList(Arrays.asList(
OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode())); OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode()));
if (enableRefundCodes.contains(ordersBean.getStatus()) && PayStatus.HAVE_PAID.getCode().equals(ordersBean.getPayStatus())) { if (enableRefundCodes.contains(ordersBean.getStatus()) && PayStatus.HAVE_PAID.getCode().equals(ordersBean.getPayStatus())) {
...@@ -1365,7 +1361,6 @@ public class OrderAdapter { ...@@ -1365,7 +1361,6 @@ public class OrderAdapter {
public OrderViewStatusDto getOrderViewStatusDesc(OrderBeanV1 orderBean, String wxAppId) { public OrderViewStatusDto getOrderViewStatusDesc(OrderBeanV1 orderBean, String wxAppId) {
OrderViewStatusDto orderViewStatusDto = new OrderViewStatusDto(); OrderViewStatusDto orderViewStatusDto = new OrderViewStatusDto();
AppLogUtil.infoLog("getOrderStatusDesc start ", JSON.toJSONString(orderBean), "");
RefundBeanV1 refundBean = null; RefundBeanV1 refundBean = null;
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) { if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
refundBean = orderBean.getRefundList().get(0); refundBean = orderBean.getRefundList().get(0);
...@@ -1747,6 +1742,7 @@ public class OrderAdapter { ...@@ -1747,6 +1742,7 @@ public class OrderAdapter {
/** /**
* 是否支持退款 * 是否支持退款
* fisherman 虚拟券是否可退款 在这里进行操作判断 【ID1039143】 1.已完成状态,2.配置的属性值>0&&时间范围内
* *
* @param orderBean 订单详情 * @param orderBean 订单详情
* @param wxAppId wxappId * @param wxAppId wxappId
...@@ -1767,7 +1763,13 @@ public class OrderAdapter { ...@@ -1767,7 +1763,13 @@ public class OrderAdapter {
return this.checkAdvanceOrder(orderBean.getGmtExpect()); return this.checkAdvanceOrder(orderBean.getGmtExpect());
} }
// 加价购选择虚拟商品券包,订单完成前可申请退款,完成之后不能申请退款 // fisherman 虚拟券商品是否可退款配置校验
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) == 0) {
return this.checkRefundButtionBizTypeIs6(orderBean.getCompanyId(), orderBean.getBizType(),
orderBean.getStatus(),wxAppId, new Date(orderBean.getGmtCreate()), orderBean.getOrderType());
}
// 加价购选择虚拟商品券包,订单完成前可申请退款,完成之后不能申请退款 --> 这里的 bizType应该是 = 1的
if (OrderStatus.COMPLETE.equals(status) && CollectionUtils.isNotEmpty(orderBean.getProductList())) { if (OrderStatus.COMPLETE.equals(status) && CollectionUtils.isNotEmpty(orderBean.getProductList())) {
for (ProductBeanV1 productBeanV1 : orderBean.getProductList()){ for (ProductBeanV1 productBeanV1 : orderBean.getProductList()){
if(StringUtils.isNotEmpty(productBeanV1.getExtInfo())){ if(StringUtils.isNotEmpty(productBeanV1.getExtInfo())){
...@@ -1851,6 +1853,40 @@ public class OrderAdapter { ...@@ -1851,6 +1853,40 @@ public class OrderAdapter {
} }
/** /**
* 校验是否配置了 虚拟券 bizTYpe=6 可以退款
*
* @param partnerId
* @param bizType
* @param orderState
* @param wxAppId
* @param createTime
* @return
*/
public boolean checkRefundButtionBizTypeIs6(String partnerId, Integer bizType, Integer orderState, String wxAppId, Date createTime, Integer orderType) {
if (bizType.compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0 || orderState.compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) {
return false;
}
String redisKey = MessageFormat.format(OrderRedisKeyConstant.ORDER_REFUND_CONFIG, partnerId, wxAppId);
String hashKey = OrderType.TAKE_OUT.getCode().equals(orderType)
? OrderRedisKeyConstant.HashKeyForOrderRefundConfig.TAKE_OUT
: OrderRedisKeyConstant.HashKeyForOrderRefundConfig.EAT_IN;;
String configStr = redisCache.hashGet(redisKey, hashKey);
if (StringUtils.isNotEmpty(configStr)) {
OrderRefundConfigEntity config = JSON.parseObject(configStr, OrderRefundConfigEntity.class);
Integer couponOrderRefundDayLimit = config.getCouponOrderRefundDayLimit();
// 必须配置了, 而且创建时间 不大于 这个时间
if (couponOrderRefundDayLimit != null && couponOrderRefundDayLimit.compareTo(0) > 0) {
Date date = DateUtil.addDays(createTime, couponOrderRefundDayLimit);
// 当前时间在 配置时间前面 才可以申请退款
if (new Date().before(date)) {
return true;
}
}
}
return false;
}
/**
* 预约时间 * 预约时间
* @param gmtExpect * @param gmtExpect
* @return true 可退 false不可操作 * @return true 可退 false不可操作
...@@ -2146,21 +2182,6 @@ public class OrderAdapter { ...@@ -2146,21 +2182,6 @@ public class OrderAdapter {
return orderPayRefundRequest; return orderPayRefundRequest;
} }
public com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest getOrderPayRefundRequest(OrderInfoReqs orderBean, Long refundId, String fatherOrderId) {
com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest orderPayRefundRequest = new com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest();
orderPayRefundRequest.setOrgTransId(fatherOrderId);
orderPayRefundRequest.setPartnerId(orderBean.getPartnerId());
orderPayRefundRequest.setStoreId(orderBean.getStoreId());
orderPayRefundRequest.setOrgPayFmId(orderBean.getPayRequestNo());
orderPayRefundRequest.setRefundAmount(orderBean.getActualPayAmount().longValue());
orderPayRefundRequest.setRefundId(refundId);
OrderExtInfoDto orderExtInfoDTO = gson.fromJson(orderBean.getExtInfo(), OrderExtInfoDto.class);
orderPayRefundRequest.setOpenid(orderExtInfoDTO != null ? orderExtInfoDTO.getOpenid() : "");
orderPayRefundRequest.setAppId(orderExtInfoDTO != null ? orderExtInfoDTO.getAppid() : "");
orderPayRefundRequest.setNotifyUrl(refundNotifyCallback);
return orderPayRefundRequest;
}
public MultiOrderRefundRequest getMultiOrderPayRefundRequest(OrderBeanV1 orderBean, Long refundId) { public MultiOrderRefundRequest getMultiOrderPayRefundRequest(OrderBeanV1 orderBean, Long refundId) {
MultiOrderRefundRequest multiQueryRequest = new MultiOrderRefundRequest(); MultiOrderRefundRequest multiQueryRequest = new MultiOrderRefundRequest();
multiQueryRequest.setStationId("1"); multiQueryRequest.setStationId("1");
......
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:14
* @description :
*/
@Data
public class CheckAndCancelRequest {
@ApiModelProperty(value = "商户号", required = true)
private Integer partnerId;
@ApiModelProperty(value = "会员id", required = true)
private String memberId;
@ApiModelProperty(value = "券号列表", required = true)
private List<String> couponCodeList;
@ApiModelProperty(value = "作废原因", required = true)
private String cancelReason = "用户申请退款,订单作废券请求";
}
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:15
* @description :
*/
@Data
public class CheckAndCancelResponseDTO {
public static int SUCCESS = 1;
public static int PROTION_FAIL = 2;
public static int FAIL = 3;
@ApiModelProperty(value = "作废结果,1:已全部作废,2:部分作废失败,3:不可作废", required = true)
private Integer resultCode;
@ApiModelProperty(value = "作废结果说明,如resultCode为3时,代表不可作废的原因(如:xx券已核销)", required = true)
private String memo;
@ApiModelProperty(value = "每个券对应的处理结果", required = true)
private List<CouponCancelMsg> resultList;
}
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:17
* @description :
*/
@Data
public class CouponCancelMsg {
@ApiModelProperty(value = "券号", required = true)
private String code;
@ApiModelProperty(value = "券名称", required = true)
private String name;
@ApiModelProperty(value = "作废结果,0:未处理,1:已作废,2:不可作废,3:作废失败,4:券不存在", required = true)
private Integer result;
@ApiModelProperty(value = "作废结果result对应的说明文字", required = true)
private String memo;
}
package cn.freemud.entities.dto.order;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 上午10:36
* @description :
*/
@Data
@Builder
@AllArgsConstructor
public class RefundFailureRequestDTO {
/**
* 0:其他
*/
public static int FAILURETYPE_OTHER = 0;
/**
* 1:账户无余额
*/
public static int FAILURETYPE_NOT_SUFFICIENT_FUNDS = 1;
/**
* 2:系统异常
*/
public static int FAILURETYPE_SYSTEM_ERROR = 2;
/**
*
*/
private String orderCode;
/**
* 失败类型 0:其他 1:账户无余额2:系统异常
*/
private int failureType;
/**
* 失败原因
*/
private String reason;
/**
*
*/
private String partnerId;
/**
*
*/
private String operator;
private int ver = 0;
}
package cn.freemud.entities.dto.user;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/6 上午11:36
* @description :
*/
@Data
public class UserBaseResponsDTO<T> {
private String code;
private String message;
private T data;
}
package cn.freemud.entities.dto.user;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/6 上午11:35
* @description :
*/
@Data
public class UserCouponCheckRequest {
@ApiModelProperty(value = "商户号", required = true)
private String partnerId;
@ApiModelProperty(value = "会员id", required = true)
private String memberId;
@ApiModelProperty(value = "券号列表", required = true)
private List<String> couponCodes;
}
...@@ -12,19 +12,31 @@ ...@@ -12,19 +12,31 @@
*/ */
package cn.freemud.enums; package cn.freemud.enums;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* 基础服务订单类型如下:
* 1=常规堂食,
* 2=预约堂食,
* 3=常规外送,
* 4=预约外送,
* 5=常规自取,
* 6=预约自取
*
* @see OrderSdkAdapter#getOldOrderType(java.lang.Integer)
* 该类为老订单类型:
*/
public enum OrderType { public enum OrderType {
TAKE_OUT(1, "外卖","takeOut"), TAKE_OUT(1, "外卖", "takeOut"),
PRE_ORDER(2, "预订单","preOrder"), PRE_ORDER(2, "预订单", "preOrder"),
MALL(3, "商城","mall"), MALL(3, "商城", "mall"),
COLLECT_GOODS(4, "打包带走","collectGoods"), COLLECT_GOODS(4, "打包带走", "collectGoods"),
EAT_IN(5, "店内就餐","eatIn") EAT_IN(5, "店内就餐", "eatIn");
;
private Integer code; private Integer code;
private String desc; private String desc;
...@@ -33,7 +45,7 @@ public enum OrderType { ...@@ -33,7 +45,7 @@ public enum OrderType {
*/ */
private String tackDesc; private String tackDesc;
OrderType(Integer code, String desc,String tackDesc) { OrderType(Integer code, String desc, String tackDesc) {
this.code = code; this.code = code;
this.desc = desc; this.desc = desc;
this.tackDesc = tackDesc; this.tackDesc = tackDesc;
...@@ -66,7 +78,7 @@ public enum OrderType { ...@@ -66,7 +78,7 @@ public enum OrderType {
return returnList; return returnList;
} }
for (OrderType orderType : values()) { for (OrderType orderType : values()) {
for (Integer code: list) { for (Integer code : list) {
if (orderType.getCode().equals(code)) { if (orderType.getCode().equals(code)) {
returnList.add(code); returnList.add(code);
} }
......
...@@ -24,6 +24,9 @@ import cn.freemud.entities.dto.*; ...@@ -24,6 +24,9 @@ import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseDto; import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseDto;
import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseObj; import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseObj;
import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto; import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto;
import cn.freemud.entities.dto.coupon.CheckAndCancelRequest;
import cn.freemud.entities.dto.coupon.CheckAndCancelResponseDTO;
import cn.freemud.entities.dto.coupon.CouponResponseDTO;
import cn.freemud.entities.dto.delivery.*; import cn.freemud.entities.dto.delivery.*;
import cn.freemud.entities.dto.ecology.SendMessageRequest; import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.openplatform.QueryInvoiceConfigRequest; import cn.freemud.entities.dto.openplatform.QueryInvoiceConfigRequest;
...@@ -38,6 +41,8 @@ import cn.freemud.entities.dto.shoppingCart.CollageOrderDto; ...@@ -38,6 +41,8 @@ import cn.freemud.entities.dto.shoppingCart.CollageOrderDto;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto; import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.store.StoreMixResponseDto; import cn.freemud.entities.dto.store.StoreMixResponseDto;
import cn.freemud.entities.dto.user.UserBaseResponsDTO;
import cn.freemud.entities.dto.user.UserCouponCheckRequest;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.order.*; import cn.freemud.entities.vo.order.*;
import cn.freemud.enums.OrderType; import cn.freemud.enums.OrderType;
...@@ -47,6 +52,7 @@ import cn.freemud.interceptor.ServiceException; ...@@ -47,6 +52,7 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.BatchOrderRefundV2Request; import cn.freemud.management.entities.dto.request.BatchOrderRefundV2Request;
import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundResponse; import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse; import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import cn.freemud.management.enums.SettlementTypeEnum;
import cn.freemud.management.service.handle.ActivityHandle; import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.manager.OrderManager; import cn.freemud.manager.OrderManager;
import cn.freemud.manager.OrderTackCodeManager; import cn.freemud.manager.OrderTackCodeManager;
...@@ -88,6 +94,9 @@ import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse ...@@ -88,6 +94,9 @@ import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse
import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp; import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp;
import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp; import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.*; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.*;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.storecenter.request.GetListByCodesRequest; import com.freemud.application.sdk.api.storecenter.request.GetListByCodesRequest;
...@@ -263,6 +272,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -263,6 +272,10 @@ public class OrderServiceImpl implements Orderservice {
@Autowired @Autowired
private WeChatLiveMsgHandle weChatLiveMsgHandle; private WeChatLiveMsgHandle weChatLiveMsgHandle;
@Autowired
private CouponOnlineClient couponOnlineClient;
@Autowired
private CustomerExtendClient customerExtendClient;
// @Override // @Override
// public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) { // public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
// String trackingNo = LogThreadLocal.getTrackingNo(); // String trackingNo = LogThreadLocal.getTrackingNo();
...@@ -3339,31 +3352,127 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3339,31 +3352,127 @@ public class OrderServiceImpl implements Orderservice {
AssortmentCustomerInfoVo userLoginInfoDto = baseResponse.getResult(); AssortmentCustomerInfoVo userLoginInfoDto = baseResponse.getResult();
// 查询订单 // 查询订单
BaseResponse<OrderInfoReqs> orderResponse = this.checkOrderAndGetOrderBean(orderRefundVo.getOid()); BaseResponse<OrderBeanV1> orderResponse = this.checkOrderAndGetOrderBean(orderRefundVo.getOid());
if (!Objects.equals(orderResponse.getCode(), ResponseResult.SUCCESS.getCode())) { if (!Objects.equals(orderResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return orderResponse; return orderResponse;
} }
OrderInfoReqs orderBean = orderResponse.getResult(); OrderBeanV1 orderBean = orderResponse.getResult();
// 校验操作 // 校验操作
BaseResponse checkResult = this.couponOrderRefundCheck(userLoginInfoDto, orderBean); BaseResponse checkResult = this.couponOrderRefundCheck(userLoginInfoDto, orderBean);
if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) { if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) {
return checkResult; return checkResult;
} }
// fisherman 调用会员获取券的有效性,是否有转赠状态
checkResult = this.customerExtendHandle(orderBean);
if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) {
return checkResult;
}
// fisherman 未完成调用券码 核销券 // fisherman 券作废
checkResult = this.couponOnLineHandle(orderBean);
// fisherman 核销券失败的逻辑处理
// 走正常退款订单逻辑 这里是否可以丢MQ 异步操作
checkResult = this.doCouponOrderRefund(orderBean, orderRefundVo);
if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) { if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) {
return checkResult; return checkResult;
} }
// 走正常退款订单逻辑 这里是否可以丢MQ 异步操作
try {
this.doCouponOrderRefund(orderBean, orderRefundVo);
}catch (Exception e){
RefundFailureRequestDTO requestDTO = RefundFailureRequestDTO.builder().orderCode(orderBean.getOid())
.failureType(RefundFailureRequestDTO.FAILURETYPE_SYSTEM_ERROR)
.reason(JSON.toJSONString(e.getMessage()))
.partnerId(orderBean.getCompanyId())
.operator("")
.ver(0).build();
orderServiceClient.refundFailures(requestDTO);
}
return ResponseUtil.success();
}
/**
*
* @param orderBean
* @return
*/
private BaseResponse customerExtendHandle(OrderBeanV1 orderBean) {
BaseResponse<List<String>> baseResponse = this.couponOrderCommomCheck(orderBean);
if (baseResponse.getCode().compareTo(ResponseResult.SUCCESS.getCode()) != 0) {
return baseResponse;
}
// 获取优惠券
List<String> couponCodeList = baseResponse.getResult();
UserCouponCheckRequest request = new UserCouponCheckRequest();
request.setPartnerId(orderBean.getCompanyId());
request.setMemberId(orderBean.getUserId());
request.setCouponCodes(couponCodeList);
UserBaseResponsDTO<List<String>> responsDTO = customerExtendClient.getMemberCouponCodes(request);
if (responsDTO == null || !Objects.equals(responsDTO.getCode(), ResponseResult.SUCCESS.getCode())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT, "会员服务调用失败");
}
List<String> responsDTOData = responsDTO.getData();
if (CollectionUtils.isEmpty(responsDTOData) || !responsDTOData.containsAll(couponCodeList)) {
// fisherman 文案让产品提供
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT, "用户优惠券发生变动,无法退款");
}
return ResponseUtil.success(); return ResponseUtil.success();
} }
/**
* 调用券码作废操作
* @param orderBean
* @return
*/
private BaseResponse couponOnLineHandle(OrderBeanV1 orderBean) {
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT);
}
BaseResponse<List<String>> baseResponse = this.couponOrderCommomCheck(orderBean);
if (baseResponse.getCode().compareTo(ResponseResult.SUCCESS.getCode()) != 0) {
return baseResponse;
}
// 获取优惠券
List<String> couponCodeList = baseResponse.getResult();
CheckAndCancelRequest request = new CheckAndCancelRequest();
request.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
request.setMemberId(orderBean.getUserId());
request.setCouponCodeList(couponCodeList);
CouponResponseDTO<CheckAndCancelResponseDTO> responseDTO = couponOnlineClient.checkandcancel(request);
if (responseDTO == null
|| !Objects.equals(responseDTO.getStatusCode(),100)) {
// 直接接口调用失败,
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "操作失败,请稍后重试");
}
CheckAndCancelResponseDTO result = responseDTO.getResult();
// 作废成功
if (result.getResultCode().compareTo(CheckAndCancelResponseDTO.SUCCESS) == 0) {
return ResponseUtil.success();
}
String memo = result.getMemo();
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), memo);
}
private BaseResponse<List<String>> couponOrderCommomCheck(OrderBeanV1 orderBean) {
List<OrderSettlementResp> orderSettlementDetailList = orderBean.getOrderSettlementDetailList();
if (CollectionUtils.isEmpty(orderSettlementDetailList)) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "没有优惠券信息");
}
// 获取优惠券
List<String> couponCodeList = orderSettlementDetailList.stream()
.filter(s -> s.getSettlementType().compareTo(SettlementTypeEnum.SEND_COUPON.getSettlementType()) == 0)
.map(OrderSettlementResp::getExternalObjectId).collect(Collectors.toList());
// fisherman 核销券失败的逻辑处理
if (CollectionUtils.isEmpty(couponCodeList)) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "没有优惠券信息");
}
return ResponseUtil.success(couponCodeList);
}
@Override @Override
public BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo) { public BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo) {
...@@ -3457,37 +3566,45 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3457,37 +3566,45 @@ public class OrderServiceImpl implements Orderservice {
* @param orderBean * @param orderBean
* @return * @return
*/ */
private BaseResponse doCouponOrderRefund(OrderInfoReqs orderBean, OrderRefundVo orderRefundVo) { private void doCouponOrderRefund(OrderBeanV1 orderBean, OrderRefundVo orderRefundVo) {
// 支付金额 大于0 调用支付 进行退款 // 支付金额 大于0 调用支付 进行退款
Long refundId = System.currentTimeMillis(); Long refundId = System.currentTimeMillis();
int state = PayRefundStatus.SUCCESS.getCode(); int state = PayRefundStatus.SUCCESS.getCode();
if (orderBean.getActualPayAmount().compareTo(BigDecimal.ZERO) > 0) { if (orderBean.getActualPayAmount().compareTo(0L) > 0) {
//调用支付退款 //调用支付退款
com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, orderRefundVo.getOid()); com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, orderRefundVo.getOid());
//抖音支付退款必传 //抖音支付退款必传
orderPayRefundRequest.setRefundDesc(orderRefundVo.getReason() == null ? "用户退款" : orderRefundVo.getReason()); orderPayRefundRequest.setRefundDesc(orderRefundVo.getReason() == null ? "用户退款" : orderRefundVo.getReason());
com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> response = payServiceImpl.orderRefund(orderPayRefundRequest); com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> response = payServiceImpl.orderRefund(orderPayRefundRequest);
if (response == null || response.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) { if (response == null || response.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed"); String failMsg = Objects.isNull(response) ? "支付退款失败" : JSON.toJSONString(response);
//TODO 退款失败则记录到世昌的表里
RefundFailureRequestDTO requestDTO = RefundFailureRequestDTO.builder().orderCode(orderBean.getOid())
.failureType(RefundFailureRequestDTO.FAILURETYPE_NOT_SUFFICIENT_FUNDS)
.reason(failMsg)
.partnerId(orderBean.getCompanyId())
.operator("")
.ver(0).build();
orderServiceClient.refundFailures(requestDTO);
} }
//TODO 退款失败则记录到世昌的表里
//获取支付返回退款状态 //获取支付返回退款状态
state = response.getData().getRefundStatus() == null ? PayRefundStatus.SUCCESS.getCode() : response.getData().getRefundStatus(); state = response.getData().getRefundStatus() == null ? PayRefundStatus.SUCCESS.getCode() : response.getData().getRefundStatus();
} }
// 调用基础服务, 进行订单状态变更 // 调用基础服务, 进行订单状态变更
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOrderCode(), CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(),
orderBean.getPartnerId(), AfterSalesType.USER_CANCEL, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString()); orderBean.getCompanyId(), AfterSalesType.USER_CANCEL, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString());
cancelOrderRequest.setOperator(orderBean.getUserName()); cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setPartnerId(orderBean.getPartnerId()); cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) { if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
// 退款中 // 退款中
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent()); cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) { } else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功 //退款成功
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent()); cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
}else {
// 退款失败,直接给基础服务null 用于后续补偿操作
cancelOrderRequest.setCreateEvent(null);
} }
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks()); cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(false); cancelOrderRequest.setRefundDeliveryAmount(false);
...@@ -3497,13 +3614,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3497,13 +3614,10 @@ public class OrderServiceImpl implements Orderservice {
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq); cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest); BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest);
if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) { if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed"); throw new ServiceException(ResponseResult.ORDER__ERRORREFUND);
} }
// 删除订单 通知活动添加商品库存 status 需要老订单的 ordercode // 删除订单 通知活动添加商品库存 status 需要老订单的 ordercode
// orderQueueService.backOrdersStatusChange(orderBean.getOrderCode(), OrderStatusV1.getOldCode(orderBean.getOrderState()), orderBean.getPayState()); // orderQueueService.backOrdersStatusChange(orderBean.getOrderCode(), orderBean.getOrderState(), orderBean.getPayState());
return ResponseUtil.success();
} }
/** /**
...@@ -3513,7 +3627,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3513,7 +3627,7 @@ public class OrderServiceImpl implements Orderservice {
* @param orderBean * @param orderBean
* @return * @return
*/ */
private BaseResponse couponOrderRefundCheck(AssortmentCustomerInfoVo userLoginInfoDto, OrderInfoReqs orderBean) { private BaseResponse couponOrderRefundCheck(AssortmentCustomerInfoVo userLoginInfoDto, OrderBeanV1 orderBean) {
// 校验是否是用户订单 // 校验是否是用户订单
if (!Objects.equals(userLoginInfoDto.getMemberId(), orderBean.getUserId())) { if (!Objects.equals(userLoginInfoDto.getMemberId(), orderBean.getUserId())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "不能操作非本人的订单"); return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "不能操作非本人的订单");
...@@ -3523,40 +3637,46 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3523,40 +3637,46 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作卖券订单"); return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作卖券订单");
} }
// 校验订单状态 卖券订单只有在6已完成状态下 才能退款 // 校验订单状态 卖券订单只有在6已完成状态下 才能退款
if (orderBean.getOrderState().compareTo(OrderStatusV1.COMPLETE.getV2Code()) != 0) { if (orderBean.getStatus().compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作完成的订单"); return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作完成的订单");
} }
// 校验一遍是否有售后单 // 校验一遍是否有售后单
if (CollectionUtils.isNotEmpty(orderBean.getAfterSalesOrderList())) { if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "已存在退款申请,请耐心等待处理"); return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "已存在退款申请,请耐心等待处理");
} }
// fisherman 需要核实一下 是否申请退款,订单主状态还不会变 // fisherman 需要核实一下 是否申请退款,订单主状态还不会变
// fisherman 查询配置是否能退款 未完成 // fisherman 查询配置是否能退款 未完成
return ResponseUtil.success(); boolean isTrue = orderAdapter.checkRefundButtionBizTypeIs6(orderBean.getCompanyId(), orderBean.getBizType(),
orderBean.getStatus(),userLoginInfoDto.getWxAppId(), new Date(orderBean.getGmtCreate()), orderBean.getOrderType());
if (isTrue) {
return ResponseUtil.success();
}
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(),"虚拟券退款配置未启用,请联系客服");
} }
/** /**
* 调用基础服务 获取订单信息 * 调用基础服务 获取订单信息
* *
* @param oid * @param oid
* @return * @return
*/ */
private BaseResponse<OrderInfoReqs> checkOrderAndGetOrderBean(String oid) { private BaseResponse<OrderBeanV1> checkOrderAndGetOrderBean(String oid) {
if (StringUtils.isBlank(oid)) { if (StringUtils.isBlank(oid)) {
return ResponseUtil.error(ResponseResult.ORDER_CODE_EMPTY); return ResponseUtil.error(ResponseResult.ORDER_CODE_EMPTY);
} }
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest(); BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
baseQueryOrderRequest.setOrderId(oid); baseQueryOrderRequest.setOrderId(oid);
baseQueryOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo()); baseQueryOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
QueryByCodeResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderByIdV2(baseQueryOrderRequest); QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
if (queryOrderByIdResponse == null || queryOrderByIdResponse.getResult() == null) { if (queryOrderByIdResponse == null || queryOrderByIdResponse.getData() == null) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST); return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
} }
OrderInfoReqs result = queryOrderByIdResponse.getResult(); OrderBeanV1 data = queryOrderByIdResponse.getData();
return ResponseUtil.success(result); return ResponseUtil.success(data);
} }
......
...@@ -50,4 +50,15 @@ public interface CouponOnlineClient { ...@@ -50,4 +50,15 @@ public interface CouponOnlineClient {
statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE) statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping(value = "/fastBatchQueryTemplateInfo") @PostMapping(value = "/fastBatchQueryTemplateInfo")
CouponResponseDTO<List<FastTemplateInfoResponseVO>> fastBatchQueryTemplateInfo(@RequestBody FastBatchQueryTemplateInfoRequest request); CouponResponseDTO<List<FastTemplateInfoResponseVO>> fastBatchQueryTemplateInfo(@RequestBody FastBatchQueryTemplateInfoRequest request);
/**
* 调用券码,作废券
* @param request
* @return
*/
@LogIgnoreFeign(logMessage="checkandcancel",messageFieldName= ResponseCodeKeyConstant.MSG,
statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping(value = "coupon/standard/checkandcancel")
CouponResponseDTO<CheckAndCancelResponseDTO> checkandcancel(@RequestBody CheckAndCancelRequest request);
} }
...@@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "customer-extend-service", url = "${saas.customerextendclient.feign.url}") @FeignClient(name = "customer-extend-service", url = "${saas.customerextendclient.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"}) @RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CustomerExtendClient { public interface CustomerExtendClient {
...@@ -39,4 +41,15 @@ public interface CustomerExtendClient { ...@@ -39,4 +41,15 @@ public interface CustomerExtendClient {
@LogIgnoreFeign(logMessage="b2bReceiveCard") @LogIgnoreFeign(logMessage="b2bReceiveCard")
@PostMapping(value = "/customerextendservice/qujia/b2breceiveCard") @PostMapping(value = "/customerextendservice/qujia/b2breceiveCard")
B2bReceiveCardResponseDto b2bReceiveCard(@RequestBody B2bReceiveCardRequestDto request); B2bReceiveCardResponseDto b2bReceiveCard(@RequestBody B2bReceiveCardRequestDto request);
/**
* 校验request里面的券 是否正常
* @param request
* @return 如果和request 返回券一致 表示正常
* 这个接口 无力吐槽
*/
@LogIgnoreFeign(logMessage="getMemberCouponCodes")
@PostMapping(value = "/customerextendservice/coupon/getMemberCouponCodes")
UserBaseResponsDTO<List<String>> getMemberCouponCodes(@RequestBody UserCouponCheckRequest request);
} }
...@@ -5,6 +5,7 @@ import cn.freemud.base.entity.BaseResponse; ...@@ -5,6 +5,7 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.QueryInvoiceRepDto; import cn.freemud.entities.dto.QueryInvoiceRepDto;
import cn.freemud.entities.dto.QueryRefundFailuresListDto; import cn.freemud.entities.dto.QueryRefundFailuresListDto;
import cn.freemud.entities.dto.order.QueryInvoiceByCodesResponse; import cn.freemud.entities.dto.order.QueryInvoiceByCodesResponse;
import cn.freemud.entities.dto.order.RefundFailureRequestDTO;
import cn.freemud.entities.dto.pay.OrderInvoiceRequest; import cn.freemud.entities.dto.pay.OrderInvoiceRequest;
import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest; import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import cn.freemud.entities.vo.QueryInvoiceReq; import cn.freemud.entities.vo.QueryInvoiceReq;
...@@ -44,6 +45,13 @@ public interface OrderServiceClient { ...@@ -44,6 +45,13 @@ public interface OrderServiceClient {
QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq); QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq);
/** /**
* 虚拟券退款操作失败记录,用于后期补偿
*/
@LogIgnoreFeign(logMessage="refundFailures")
@PostMapping("/order/v2/refundFailures")
BaseResponse refundFailures(@RequestBody RefundFailureRequestDTO requestDTO);
/**
* 退款失败信息列表查询 * 退款失败信息列表查询
*/ */
@LogIgnoreFeign(logMessage="refundFailuresList") @LogIgnoreFeign(logMessage="refundFailuresList")
......
...@@ -7,6 +7,7 @@ public enum SettlementTypeEnum { ...@@ -7,6 +7,7 @@ public enum SettlementTypeEnum {
CASH_COUPON(10, "代金券"), CASH_COUPON(10, "代金券"),
DISCOUNT_COUPON(208, "折扣券"), DISCOUNT_COUPON(208, "折扣券"),
PRODUCT_COUPON(118, "商品券"), PRODUCT_COUPON(118, "商品券"),
SEND_COUPON(216, "购买券包发的优惠券"),
; ;
private int settlementType; private int settlementType;
......
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