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 {
* 1-允许
*/
private String cashierOrderRefund;
/**
* 卖券订单是否可以申请退款
* null <=0 都不可以申请退款
*/
private Integer couponOrderRefundDayLimit;
}
......@@ -1143,10 +1143,6 @@ public class OrderAdapter {
responseVo.setEnableRefund(true);
}
responseVo.setBizType(ordersBean.getBizType());
//6:卖券虚拟商品 暂不能申请退款
if (ordersBean.getBizType() == 6) {
responseVo.setButtonRefund(false);
}
List<Integer> enableRefundCodes = Lists.newArrayList(Arrays.asList(
OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode()));
if (enableRefundCodes.contains(ordersBean.getStatus()) && PayStatus.HAVE_PAID.getCode().equals(ordersBean.getPayStatus())) {
......@@ -1365,7 +1361,6 @@ public class OrderAdapter {
public OrderViewStatusDto getOrderViewStatusDesc(OrderBeanV1 orderBean, String wxAppId) {
OrderViewStatusDto orderViewStatusDto = new OrderViewStatusDto();
AppLogUtil.infoLog("getOrderStatusDesc start ", JSON.toJSONString(orderBean), "");
RefundBeanV1 refundBean = null;
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
refundBean = orderBean.getRefundList().get(0);
......@@ -1747,6 +1742,7 @@ public class OrderAdapter {
/**
* 是否支持退款
* fisherman 虚拟券是否可退款 在这里进行操作判断 【ID1039143】 1.已完成状态,2.配置的属性值>0&&时间范围内
*
* @param orderBean 订单详情
* @param wxAppId wxappId
......@@ -1767,7 +1763,13 @@ public class OrderAdapter {
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())) {
for (ProductBeanV1 productBeanV1 : orderBean.getProductList()){
if(StringUtils.isNotEmpty(productBeanV1.getExtInfo())){
......@@ -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
* @return true 可退 false不可操作
......@@ -2146,21 +2182,6 @@ public class OrderAdapter {
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) {
MultiOrderRefundRequest multiQueryRequest = new MultiOrderRefundRequest();
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 @@
*/
package cn.freemud.enums;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.google.common.collect.Lists;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 基础服务订单类型如下:
* 1=常规堂食,
* 2=预约堂食,
* 3=常规外送,
* 4=预约外送,
* 5=常规自取,
* 6=预约自取
*
* @see OrderSdkAdapter#getOldOrderType(java.lang.Integer)
* 该类为老订单类型:
*/
public enum OrderType {
TAKE_OUT(1, "外卖","takeOut"),
PRE_ORDER(2, "预订单","preOrder"),
MALL(3, "商城","mall"),
COLLECT_GOODS(4, "打包带走","collectGoods"),
EAT_IN(5, "店内就餐","eatIn")
;
TAKE_OUT(1, "外卖", "takeOut"),
PRE_ORDER(2, "预订单", "preOrder"),
MALL(3, "商城", "mall"),
COLLECT_GOODS(4, "打包带走", "collectGoods"),
EAT_IN(5, "店内就餐", "eatIn");
private Integer code;
private String desc;
......@@ -33,7 +45,7 @@ public enum OrderType {
*/
private String tackDesc;
OrderType(Integer code, String desc,String tackDesc) {
OrderType(Integer code, String desc, String tackDesc) {
this.code = code;
this.desc = desc;
this.tackDesc = tackDesc;
......@@ -66,7 +78,7 @@ public enum OrderType {
return returnList;
}
for (OrderType orderType : values()) {
for (Integer code: list) {
for (Integer code : list) {
if (orderType.getCode().equals(code)) {
returnList.add(code);
}
......
......@@ -50,4 +50,15 @@ public interface CouponOnlineClient {
statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping(value = "/fastBatchQueryTemplateInfo")
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;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "customer-extend-service", url = "${saas.customerextendclient.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CustomerExtendClient {
......@@ -39,4 +41,15 @@ public interface CustomerExtendClient {
@LogIgnoreFeign(logMessage="b2bReceiveCard")
@PostMapping(value = "/customerextendservice/qujia/b2breceiveCard")
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;
import cn.freemud.entities.dto.QueryInvoiceRepDto;
import cn.freemud.entities.dto.QueryRefundFailuresListDto;
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.QueryInvoiceByCodesRequest;
import cn.freemud.entities.vo.QueryInvoiceReq;
......@@ -44,6 +45,13 @@ public interface OrderServiceClient {
QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq);
/**
* 虚拟券退款操作失败记录,用于后期补偿
*/
@LogIgnoreFeign(logMessage="refundFailures")
@PostMapping("/order/v2/refundFailures")
BaseResponse refundFailures(@RequestBody RefundFailureRequestDTO requestDTO);
/**
* 退款失败信息列表查询
*/
@LogIgnoreFeign(logMessage="refundFailuresList")
......
......@@ -7,6 +7,7 @@ public enum SettlementTypeEnum {
CASH_COUPON(10, "代金券"),
DISCOUNT_COUPON(208, "折扣券"),
PRODUCT_COUPON(118, "商品券"),
SEND_COUPON(216, "购买券包发的优惠券"),
;
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