Commit 7ad343d8 by 周晓航

新增不对外暴露接口操作退款

parent 3e18580c
package cn.freemud.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.OrderDevelopRefundVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.service.Orderservice;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/4/30 14:55
* @description : 针对开发人员开放的接口操作, 不暴露给外部人员
*/
@RequestMapping("/order/develop")
@RestController
public class OrderDeveloperController {
@Autowired
private Orderservice orderservice;
/**
* 订单内部人员操作 给订单退款, 使用该接口需要报备
* 1.生成售后单
* 2.直接调用oms进行退款处理
*/
@ApiAnnotation(logMessage = "/order/develop/refund")
@PostMapping("/refund")
public BaseResponse developRefund(@Validated @LogParams @RequestBody OrderDevelopRefundVo orderRefundVo) {
return orderservice.developRefund(orderRefundVo);
}
}
package cn.freemud.entities.vo;
import com.freemud.application.sdk.api.ordercenter.enums.RefundModeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/4/30 15:03
* @description :
*/
@Data
public class OrderDevelopRefundVo {
/**
* 订单号
*/
@NotBlank(message = "订单编号不能为空")
private String orderCode;
private String partnerId;
/**
* 退款理由
*/
private String reason;
/**
* 操作人,需要记录操作人
*/
@NotBlank(message = "请真实填写调动该接口的操作人")
private String operator;
/**
* 微商城退款方式
*
* @see RefundModeEnum#getIndex()
*/
@ApiModelProperty(value = "微商城退款方式", notes = RefundModeEnum.API_DOC)
private Byte refundMode;
}
...@@ -219,4 +219,11 @@ public interface Orderservice extends OrderFactoryService{ ...@@ -219,4 +219,11 @@ public interface Orderservice extends OrderFactoryService{
* @return * @return
*/ */
BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo); BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo);
/**
* 开发人员 操作退款订单 该接口 生产使用请通知SE
* @param orderRefundVo
* @return
*/
BaseResponse developRefund(OrderDevelopRefundVo orderRefundVo);
} }
...@@ -52,6 +52,7 @@ import cn.freemud.enums.*; ...@@ -52,6 +52,7 @@ import cn.freemud.enums.*;
import cn.freemud.handler.WeChatLiveMsgHandle; import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.interceptor.ServiceException; 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.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto; import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
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.OrderRefundResponse; import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
...@@ -59,6 +60,7 @@ import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse; ...@@ -59,6 +60,7 @@ import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse; import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.enums.SettlementTypeEnum; import cn.freemud.management.enums.SettlementTypeEnum;
import cn.freemud.management.intercept.OrderServiceException; import cn.freemud.management.intercept.OrderServiceException;
import cn.freemud.management.service.adapter.OrderManagerAdapter;
import cn.freemud.management.service.handle.ActivityHandle; import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.management.service.handle.OrderVerifyHandle; import cn.freemud.management.service.handle.OrderVerifyHandle;
import cn.freemud.management.service.handle.PaymentHandle; import cn.freemud.management.service.handle.PaymentHandle;
...@@ -294,6 +296,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -294,6 +296,9 @@ public class OrderServiceImpl implements Orderservice {
@Autowired @Autowired
private StockHandle stockHandle; private StockHandle stockHandle;
@Autowired
private OrderManagerAdapter orderManagerAdapter;
@Value("${sellcoupon.test.order.refund.fail:}") @Value("${sellcoupon.test.order.refund.fail:}")
private Integer testOrderRefundFail; private Integer testOrderRefundFail;
// @Override // @Override
...@@ -3564,6 +3569,145 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3564,6 +3569,145 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.success(); return ResponseUtil.success();
} }
@Override
public BaseResponse developRefund(OrderDevelopRefundVo orderRefundVo) {
if (StringUtils.isEmpty(orderRefundVo.getReason())) {
orderRefundVo.setReason("内部操作退款,操作人:" + orderRefundVo.getOperator());
}
// 查询订单
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
baseQueryOrderRequest.setOrderId(orderRefundVo.getOrderCode());
baseQueryOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
String string = JSONObject.toJSONString(queryOrderByIdResponse);
JSONObject jsonObject = JSONObject.parseObject(string);
QueryOrderByIdResponseDto orderByIdResponseDto = jsonObject.toJavaObject(QueryOrderByIdResponseDto.class);
if (!RESPONSE_SUCCESS_CODE.equals(orderByIdResponseDto.getErrcode()) || orderByIdResponseDto.getData() == null) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), "订单信息不存在");
}
OrderBeanV1 orderBean = orderByIdResponseDto.getData();
if (PayStatus.NOT_PAY.getCode().equals(orderByIdResponseDto.getData().getPayStatus())
|| NewOrderStatus.PENDING_PAYMENT.getIndex().equals(orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单未支付,无法退款");
}
if (NewOrderStatus.CLOSED.getIndex().equals(orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单已取消,无法退款");
}
// 微商城订单
if (Objects.equals(BizTypeEnum.MALL.getBizType() ,orderBean.getBizType()) || Objects.equals("23",orderBean.getOrderClient())) {
// 完成/配送中 可以选择退货退款
List<Integer> refundGoodsCodes = Arrays.asList(
NewOrderStatus.DELIVERING.getIndex(), NewOrderStatus.COMPLETE.getIndex());
if (!refundGoodsCodes.contains(orderBean.getStatusV2()) && !Objects.equals(RefundModeEnum.UN_REFUND_GOODS.getIndex(), orderRefundVo.getRefundMode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "还未发货,请选择只退款不退货");
}
// 拼团类型
if (Objects.equals(MarketTypeEnum.GROUPB.getIndex().byteValue(), orderBean.getMarketingType())
&& (StringUtils.isBlank(orderBean.getSpellGroupCode()) || StringUtils.isBlank(orderBean.getSpellGroupActivityCode()))) {
return ResponseUtil.error(ResponseResult.SPELL_GROUP_QUERY_GROUP_WORK_ERROR);
}
}else if (NewOrderStatus.DELIVERING.getIndex().equals(orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单配送中,退款请联系售后!");
}
// fisherman 该接口的调用 肯定是因已经商户确认要退款的操作, 所以不走正常的 是否可退款判断
if (PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus())) {
boolean isRefundDeliveryFee = true;
//商城查询配送费
if (Objects.equals(BizTypeEnum.MALL.getBizType(),orderBean.getBizType())
&& StringUtils.isNotEmpty(orderBean.getExtInfo())) {
JSONObject extInfoJsonObject = JSONObject.parseObject(orderBean.getExtInfo());
OrderExtInfoDto orderExtInfoDto = extInfoJsonObject.toJavaObject(OrderExtInfoDto.class);
if (null != orderExtInfoDto && null != orderExtInfoDto.getProvince()) {
String province = orderExtInfoDto.getProvince();
QueryFreightRefundSupportedVo queryFreightRefundSupportedVo = new QueryFreightRefundSupportedVo();
queryFreightRefundSupportedVo.setPartnerId(orderBean.getCompanyId());
queryFreightRefundSupportedVo.setProvince(province);
//整合商城订单状态,订单状态 1 2 3不需校验直接退运费 20210513
List<Integer> isRefundDeliveryFeeCodes = Arrays.asList(
NewOrderStatus.PENDING_PAYMENT.getIndex(), NewOrderStatus.PLACE_AN_ORDER.getIndex(), NewOrderStatus.ACCEPTED.getIndex());
if (isRefundDeliveryFeeCodes.contains(orderBean.getStatusV2())) {
isRefundDeliveryFee = true;
} else {
QueryFreightRefundSupportedResponse queryFreightRefundSupportedResponse = deliveryFeiginClient.isFreightRefundSupported(queryFreightRefundSupportedVo);
if (null != queryFreightRefundSupportedResponse && RESPONSE_SUCCESS_CODE == queryFreightRefundSupportedResponse.getCode()) {
Boolean freightRefundSupported = queryFreightRefundSupportedResponse.getData();
isRefundDeliveryFee = freightRefundSupported;
}
}
}
}else {
// 查询小程序是否配置了退运费
String configStr = redisCache.hashGet(MessageFormat.format(OrderRedisKeyConstant.ORDER_REFUND_CONFIG, orderBean.getCompanyId(), orderBean.getAppId()), OrderRedisKeyConstant.HashKeyForOrderRefundConfig.TAKE_OUT);
if (StringUtils.isNotEmpty(configStr)) {
OrderRefundConfigEntity config = JSON.parseObject(configStr, OrderRefundConfigEntity.class);
String refundDeliveryFeeConfig = config.getRefundShippingFee();
// 0、null表示 关闭 ; 1 表示开启
if (null != refundDeliveryFeeConfig
&& Arrays.asList(NewOrderStatus.DELIVERING.getIndex(), NewOrderStatus.COMPLETE.getIndex()).contains(orderBean.getStatusV2())
&& !ALLOW_REFUND.equals(refundDeliveryFeeConfig)) {
isRefundDeliveryFee = false;
}
}
}
// 未接单
if (NewOrderStatus.PLACE_AN_ORDER.getIndex().equals(orderBean.getStatusV2())) {
// 未接单的 请用户直接操作C端小程序处理
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单未接单,请指引用户C端操作退款!");
}else {
CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
cancelOrderRequest.setStoreId(orderBean.getShopId());
cancelOrderRequest.setOrderId(orderBean.getOid());
cancelOrderRequest.setOrderClient(Integer.parseInt(orderBean.getOrderClient()));
//传入的售后单类型为:2:售中用户取消 8:售后申请
cancelOrderRequest.setAfterSalesType(AfterSalesType.USER_CANCEL);
if (NewOrderStatus.COMPLETE.getIndex().equals(orderBean.getStatusV2())) {
cancelOrderRequest.setAfterSalesType(AfterSalesType.USER_SALE_RETURN);
}
cancelOrderRequest.setReason(orderRefundVo.getReason());
cancelOrderRequest.setReqRemark(orderRefundVo.getReason());
// 商城订单 增加拓展信息
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
BaseOrderResponse baseResponseDto = orderCenterSdkService.orderCancel(cancelOrderRequest);
if (!RESPONSE_SUCCESS_CODE.equals(baseResponseDto.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), baseResponseDto.getErrmsg());
}
if (orderBean.getAmount() > 0) {
sendPosMessage(orderBean.getCompanyId(), orderBean.getShopId());
}
// 兼容下面的方法
OrderRefundVo refundVo = new OrderRefundVo();
refundVo.setReason(orderRefundVo.getReason());
refundVo.setRemarks(orderRefundVo.getReason());
//通知小助手发送申请退款公众号订阅消息
sendApplyRefundSubscriptionNotice(orderBean, refundVo);
//已接单可发起退款申请,查询门店有无云打印机,有则打印退款申请小票
printApplyRefundSmallTicket(orderBean, refundVo);
}
// 调用oms的 同意退款操作
OrderManagerRequest request = new OrderManagerRequest();
request.setPartnerId(orderBean.getCompanyId());
request.setStoreId(orderBean.getShopId());
request.setOrderId(orderBean.getOid());
request.setReason(orderRefundVo.getReason());
request.setOperateType(cn.freemud.management.enums.OperateType.ORDER_DEVELOPER_AGREE_REFUND.getOpType());
request.setOperator(orderRefundVo.getOperator());
BaseResponse baseResponse = orderManagerAdapter.developRefund(request);
return baseResponse;
}
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单未支付!");
}
/** /**
* 订单退款操作 * 订单退款操作
* 1.调用支付 进行退款 * 1.调用支付 进行退款
......
...@@ -13,7 +13,12 @@ public enum OperateType { ...@@ -13,7 +13,12 @@ public enum OperateType {
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"), ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"),
ORDER_CANCEL("orderCancel","订单取消"), ORDER_CANCEL("orderCancel","订单取消"),
ORDER_CREATE_DELIVERY("orderCreateDelivery","创建配送"), ORDER_CREATE_DELIVERY("orderCreateDelivery","创建配送"),
ORDER_CANCEL_DELIVERY("orderCancelDelivery","取消配送"); ORDER_CANCEL_DELIVERY("orderCancelDelivery","取消配送"),
/**
* 该操作无校验, 直接退款, 如果使用 请联系SE 进行报备,
* 该类型不给外部人员使用, 不对外部暴露接口
*/
ORDER_DEVELOPER_AGREE_REFUND("orderDeveloperAgreeRefund","售后人员同意退款");
/** /**
* 操作类型 * 操作类型
......
...@@ -353,4 +353,22 @@ public class OrderManagerAdapter { ...@@ -353,4 +353,22 @@ public class OrderManagerAdapter {
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancelDelivery(request, orderBean); BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancelDelivery(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse); return handleResponse(request,orderBean,orderManagerResponse);
} }
/**
* @see OrderManagerAdapter#orderAgreeRefund(cn.freemud.management.entities.dto.request.order.OrderManagerRequest)
* @param request
* @return 改操作 无需校验订单参数 直接退款
* 使用该方法 请先进行报备, 因为不暴露给外部使用, 不属于业务代码
*/
public BaseResponse developRefund(OrderManagerRequest request) {
//查询订单
OrderBeanV1 orderBean = orderBaseService.getByOrderCode(request.getOrderId());
if (null == orderBean) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
// 设置退款金额
orderBean.setAmount(orderVerifyHandle.getRefundAmount(orderBean,false).longValue());
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderAgreeRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
}
} }
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