Commit a3f4deb6 by 周晓航

Merge branch 'feature/xukang_20211201_虚拟订单退款' into qa

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/controller/OrderController.java
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
parents 1b656eed c901851a
......@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity {
* 1-允许
*/
private String cashierOrderRefund;
/**
* 卖券订单是否可以申请退款
* null <=0 都不可以申请退款
*/
private Integer couponOrderRefundDayLimit;
}
......@@ -5,7 +5,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderModifyRelatingCo
import com.freemud.application.sdk.api.ordercenter.request.QueryAfterSalesOrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.QueryLineUpOrderReq;
import com.freemud.application.sdk.api.ordercenter.response.AfterSalesListResp;
//import com.freemud.application.sdk.api.ordercenter.response.OrderStateInfoResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*;
......@@ -420,4 +420,11 @@ public interface OrderCenterSdkService {
* 小助手日结统计订单信息查询(分页,从库查询)
*/
QueryOrdersResponse getOrderListByDb(QueryOrdersByConditionsRequest queryOrdersByConditionsRequest);
/**
* 查询订单信息 基于基础服务
* @param baseQueryOrderRequest
* @return
*/
QueryByCodeResponse queryOrderByIdV2(BaseQueryOrderRequest baseQueryOrderRequest);
}
......@@ -2358,4 +2358,16 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
return orderSdkAdapter.convent2OrdersResponseByES(baseDownLoadResponse);
}
/**
* 查询订单信息 基于基础服务
* @param request
* @return
*/
@Override
public QueryByCodeResponse queryOrderByIdV2(BaseQueryOrderRequest request) {
QueryByCodeResponse orderInfo = orderSdkService.getOrderInfo(request.getOrderClient(), request.getOrderId(),
request.getThirdOrderCode(), request.getWithOperationHistory(), request.getTrackingNo());
return orderInfo;
}
}
......@@ -897,6 +897,7 @@ public class OrderAdapter {
responseVo.setMcCafeOrderTag(maCafePickTag);
}
responseVo.setTableNumber(ordersBean.getBarCounter());
// fisherman 支付状态描述
responseVo.setPayStatus(ordersBean.getPayStatus());
responseVo.setPayStatusDesc(Optional.ofNullable(PayStatus.getByCode(ordersBean.getPayStatus()))
.map(PayStatus::getDesc).orElse(""));
......@@ -1145,10 +1146,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())) {
......@@ -1751,6 +1748,7 @@ public class OrderAdapter {
/**
* 是否支持退款
* fisherman 虚拟券是否可退款 在这里进行操作判断 【ID1039143】 1.已完成状态,2.配置的属性值>0&&时间范围内
*
* @param orderBean 订单详情
* @param wxAppId wxappId
......@@ -1782,6 +1780,11 @@ public class OrderAdapter {
}
}
}
// fisherman 虚拟券商品是否可退款配置校验
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) == 0) {
return this.checkRefundButtionBizTypeIs6(orderBean.getCompanyId(), orderBean.getBizType(),
orderBean.getStatus(),wxAppId, new Date(orderBean.getGmtCreate()));
}
boolean canRefund = false;
// 查询小程序配置的退款设置
......@@ -1855,6 +1858,38 @@ 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) {
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 = 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不可操作
......
......@@ -20,14 +20,8 @@ import cn.freemud.entities.dto.order.OrderInvoiceConfigVo;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.entities.vo.order.CreateCashierOrderVo;
import cn.freemud.entities.vo.order.CreateOrderInvoiceRequest;
import cn.freemud.entities.vo.order.GetInvoiceConfigRequest;
import cn.freemud.entities.vo.order.PaymentConfigVo;
import cn.freemud.entities.vo.order.OrderAppealVo;
import cn.freemud.entities.vo.order.*;
import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.monitorcenter.tools.HealthUtil;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
......@@ -38,12 +32,6 @@ import cn.freemud.utils.ResponseUtil;
import cn.freemud.xxljob.OrderCountJobHandler;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import com.freemud.thirdparty.wechat.WeChatClient;
import com.freemud.thirdparty.wechat.constant.WeChatConstant;
import com.freemud.thirdparty.wechat.entities.WeChatBaseResponse;
import com.freemud.thirdparty.wechat.entities.vo.NullFieldVo;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderDeliverySendRequestVO;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderSycnPayRequestVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -253,6 +241,7 @@ public class OrderController {
return orderservice.orderRefund(orderRefundVo);
}
/**
* 获取订单排队号
*/
......@@ -510,5 +499,15 @@ public class OrderController {
return orderAdapterService.getPaymentConfig(createOrderVo);
}
/**
* 卖券订单申请退款
*/
@ApiAnnotation(logMessage = "couponOrderRefund")
@PostMapping("/couponOrderRefund")
public BaseResponse couponOrderRefund(@Validated @LogParams @RequestBody OrderRefundVo orderRefundVo) {
return orderservice.couponOrderRefund(orderRefundVo);
}
}
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;
}
......@@ -18,6 +18,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotBlank;
/**
* 用户退款申请
*
......@@ -28,10 +30,10 @@ import org.hibernate.validator.constraints.NotEmpty;
@Data
public class OrderRefundVo {
@NotEmpty(message = "sessionId 不能为空")
@NotBlank(message = "sessionId 不能为空")
private String sessionId;
@NotEmpty(message = "订单编号不能为空")
@NotBlank(message = "订单编号不能为空")
private String oid;
private String reason;
......
......@@ -12,6 +12,19 @@
*/
package cn.freemud.enums;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
/**
* @warning !!!
* 这里的订单状态依据的是 老订单的转换操作, 基础服务给出的订单状态如下:
* 1待支付
* 2下单
* 3已接单
* 4制作完成 5配送中 4/5的状态根据订单类型(自提/外卖)二选一不会同时出现
* 6已完成
* 7已关闭(退款完成)
* @see OrderStatusV1
*/
public enum OrderStatus {
TAKE_ORDER(1, "下单","place an order"),
......
......@@ -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);
}
......
......@@ -192,6 +192,7 @@ public enum ResponseResult {
ORDER_INVOICE_IS_OPENED("45083", "存在选中的订单已开过发票,请重新选择订单",""),
ORDER_CODES_REPEAT("45084", "同一次开票,选中的订单不能重复,请重新选择订单",""),
ORDER_INVOICE_CONFIG_IS_NULL("45085", "发票配置信息为空,不可开票",""),
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
/**
* 售后单
......
......@@ -84,6 +84,7 @@ public interface Orderservice extends OrderFactoryService{
*/
BaseResponse orderRefund(OrderRefundVo orderRefundVo);
/**
* 获取订单排队号
*/
......@@ -204,4 +205,10 @@ public interface Orderservice extends OrderFactoryService{
BaseResponse<OrderInvoiceConfigVo> queryInvoiceConfig(GetInvoiceConfigRequest request);
/**
* 卖券订单 申请退款
* @param orderRefundVo
* @return
*/
BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo);
}
......@@ -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);
}
......@@ -4,6 +4,7 @@ import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.QueryInvoiceRepDto;
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;
......@@ -38,4 +39,11 @@ public interface OrderServiceClient {
@PostMapping(value = "/order/v2/invoice/list/forUser")
QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq);
/**
* 虚拟券退款操作失败记录,用于后期补偿
*/
@LogIgnoreFeign(logMessage="refundFailures")
@PostMapping("/order/v2/refundFailures")
BaseResponse refundFailures(@RequestBody RefundFailureRequestDTO requestDTO);
}
......@@ -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