Commit 5f636648 by 徐康

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

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
parents f6b2d5aa 565c3c83
......@@ -506,7 +506,7 @@ public class OrderController {
@ApiAnnotation(logMessage = "couponOrderRefund")
@PostMapping("/couponOrderRefund")
public BaseResponse couponOrderRefund(@Validated @LogParams @RequestBody OrderRefundVo orderRefundVo) {
return orderservice.couponOrderRefund(orderRefundVo);
return orderservice.couponOrderRefund(orderRefundVo,0);
}
......
......@@ -18,7 +18,7 @@ public class CouponCancelMsg {
@ApiModelProperty(value = "券名称", required = true)
private String name;
@ApiModelProperty(value = "作废结果,0:未处理,1:已作废,2:不可作废,3:作废失败,4:券不存在", required = true)
@ApiModelProperty(value = "作废结果,0:未处理,1:作废成功,2:已核销不能作废,3:已锁定不能作废,4:作废失败,5:券不存在", required = true)
private Integer result;
@ApiModelProperty(value = "作废结果result对应的说明文字", required = true)
......
package cn.freemud.enums;
public enum CouponOrderRefundFailTypeEnum {
SUCCESS(0, "成功"),
ORDER_VERIFY_FAIL(1, "订单校验失败"),
COUPON_PROCESS_FAIL(2, "优惠券处理失败"),
OTHER(7, "其他"),
;
private Integer code;
private String desc;
CouponOrderRefundFailTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponOrderRefundFailTypeEnum getByCode(Integer code) {
for (CouponOrderRefundFailTypeEnum type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package cn.freemud.enums;
public enum CouponOrderRefundStatusEnum {
WAIT(1, "待退款"),
REFUNDED(2, "已退款"),
REFUND_FAILED(3, "退款失败"),
NOT_NEED_REFUND(4, "无需退款"),
;
private Integer code;
private String desc;
CouponOrderRefundStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponOrderRefundStatusEnum getByCode(Integer code) {
for (CouponOrderRefundStatusEnum type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
......@@ -193,6 +193,7 @@ public enum ResponseResult {
ORDER_CODES_REPEAT("45084", "同一次开票,选中的订单不能重复,请重新选择订单",""),
ORDER_INVOICE_CONFIG_IS_NULL("45085", "发票配置信息为空,不可开票",""),
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
COUPON_ORDER_VERIFY_FAIL("45087","买券订单校验异常",""),
/**
* 售后单
......@@ -226,6 +227,7 @@ public enum ResponseResult {
PAY_ERROR("46016","支付类型错误",""),
COUPON_DATETIME_INVAILD("46017", "优惠券在当前时间不可用",""),
COUPON_ORDER_ORIGINAL_AMOUNT_NOT_ENOUGH("46018","优惠券不满足可用金额门槛",""),
COUPON_CANCEL_FAIL("46019","作废券失败",""),
SHOPPING_CART_USER_HAVE_NO_COUPON("46019", "使用的商品券已失效,请重新下单",""),
/**
......
......@@ -25,4 +25,12 @@ public class RefundOverOrderManager {
return refundOverOrderDao.selectBatch(num);
}
public void insert(RefundOverOrder refundOverOrder) {
refundOverOrderDao.insert(refundOverOrder);
}
public void update(RefundOverOrder refundOverOrder) {
refundOverOrderDao.update(refundOverOrder);
}
}
......@@ -14,4 +14,6 @@ public interface RefundOverOrderDao extends MyMapper<RefundOverOrder> {
List<RefundOverOrder> selectBatch(@Param("num") Integer num);
List<RefundOverOrder> update(@Param("refundOverOrder") RefundOverOrder refundOverOrder);
}
......@@ -206,11 +206,12 @@ public interface Orderservice extends OrderFactoryService{
BaseResponse<OrderInvoiceConfigVo> queryInvoiceConfig(GetInvoiceConfigRequest request);
/**
* 卖券订单 申请退款
* 卖券订单 申请退款
* @param orderRefundVo
* @param flag 0 用户调用 1系统调用
* @return
*/
BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo);
BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo, int flag);
/**
* 卖券订单 申请退款 重试
......
......@@ -101,7 +101,7 @@ import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderC
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.OrderCountResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.*;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
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;
......@@ -3353,17 +3353,10 @@ public class OrderServiceImpl implements Orderservice {
@Override
public BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo) {
public BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo, int flag) {
if (StringUtils.isEmpty(orderRefundVo.getReason())) {
orderRefundVo.setReason("退款");
}
// 校验用户是否登录
BaseResponse<AssortmentCustomerInfoVo> baseResponse = this.checkUserLoginInfoDto(orderRefundVo.getSessionId());
if (!Objects.equals(baseResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return baseResponse;
}
AssortmentCustomerInfoVo userLoginInfoDto = baseResponse.getResult();
// 查询订单
BaseResponse<OrderBeanV1> orderResponse = this.checkOrderAndGetOrderBean(orderRefundVo.getOid());
if (!Objects.equals(orderResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
......@@ -3371,6 +3364,20 @@ public class OrderServiceImpl implements Orderservice {
}
OrderBeanV1 orderBean = orderResponse.getResult();
AssortmentCustomerInfoVo userLoginInfoDto;
if (flag > 0) {
userLoginInfoDto = new AssortmentCustomerInfoVo();
userLoginInfoDto.setMemberId(orderBean.getUserId());
userLoginInfoDto.setWxAppId(orderBean.getAppId());
}else {
// 校验用户是否登录
BaseResponse<AssortmentCustomerInfoVo> baseResponse = this.checkUserLoginInfoDto(orderRefundVo.getSessionId());
if (!Objects.equals(baseResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return baseResponse;
}
userLoginInfoDto = baseResponse.getResult();
}
// 校验操作
BaseResponse checkResult = this.couponOrderRefundCheck(userLoginInfoDto, orderBean);
if (!Objects.equals(checkResult.getCode(), ResponseResult.SUCCESS.getCode())) {
......@@ -3421,12 +3428,12 @@ public class OrderServiceImpl implements Orderservice {
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, "会员服务调用失败");
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "会员服务调用失败");
}
List<String> responsDTOData = responsDTO.getData();
if (CollectionUtils.isEmpty(responsDTOData) || !responsDTOData.containsAll(couponCodeList)) {
// fisherman 文案让产品提供
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT, "用户优惠券发生变动,无法退款");
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "您购买的优惠券已锁定,请先进行解锁操作再退款");
}
return ResponseUtil.success();
}
......@@ -3438,7 +3445,7 @@ public class OrderServiceImpl implements Orderservice {
*/
private BaseResponse couponOnLineHandle(OrderBeanV1 orderBean) {
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT);
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "不是卖券订单");
}
BaseResponse<List<String>> baseResponse = this.couponOrderCommomCheck(orderBean);
if (baseResponse.getCode().compareTo(ResponseResult.SUCCESS.getCode()) != 0) {
......@@ -3456,7 +3463,7 @@ public class OrderServiceImpl implements Orderservice {
if (responseDTO == null
|| !Objects.equals(responseDTO.getStatusCode(),100)) {
// 直接接口调用失败,
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "操作失败,请稍后重试");
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "操作失败,请稍后重试");
}
CheckAndCancelResponseDTO result = responseDTO.getResult();
// 作废成功
......@@ -3464,14 +3471,14 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.success();
}
String memo = result.getMemo();
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), memo);
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.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(), "没有优惠券信息");
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "没有优惠券信息");
}
// 获取优惠券
List<String> couponCodeList = orderSettlementDetailList.stream()
......@@ -3480,7 +3487,7 @@ public class OrderServiceImpl implements Orderservice {
// fisherman 核销券失败的逻辑处理
if (CollectionUtils.isEmpty(couponCodeList)) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "没有优惠券信息");
return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "没有优惠券信息");
}
return ResponseUtil.success(couponCodeList);
}
......@@ -3637,19 +3644,19 @@ public class OrderServiceImpl implements Orderservice {
private BaseResponse couponOrderRefundCheck(AssortmentCustomerInfoVo userLoginInfoDto, OrderBeanV1 orderBean) {
// 校验是否是用户订单
if (!Objects.equals(userLoginInfoDto.getMemberId(), orderBean.getUserId())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "不能操作非本人的订单");
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "不能操作非本人的订单");
}
// 是否是卖券订单
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作卖券订单");
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "只可操作卖券订单");
}
// 校验订单状态 卖券订单只有在6已完成状态下 才能退款
if (orderBean.getStatus().compareTo(OrderStatusV1.COMPLETE.getCode()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作完成的订单");
if (orderBean.getStatus().compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) {
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "只可操作完成的订单");
}
// 校验一遍是否有售后单
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "已存在退款申请,请耐心等待处理");
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "已存在退款申请,请耐心等待处理");
}
// fisherman 需要核实一下 是否申请退款,订单主状态还不会变
......@@ -3660,7 +3667,7 @@ public class OrderServiceImpl implements Orderservice {
if (isTrue) {
return ResponseUtil.success();
}
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(),"虚拟券退款配置未启用,请联系客服");
return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(),"虚拟券退款配置未启用,请联系客服");
}
......
......@@ -7,12 +7,18 @@ import cn.freemud.entities.dto.delivery.GetFilterPartnerResponse;
import cn.freemud.entities.dto.delivery.PartnerFilterResponse;
import cn.freemud.entities.dto.openplatform.OrderGetPartnerRequest;
import cn.freemud.entities.vo.OrderCountRequestVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.entities.vo.SendOrderCountsMsg;
import cn.freemud.enums.CouponOrderRefundFailTypeEnum;
import cn.freemud.enums.CouponOrderRefundStatusEnum;
import cn.freemud.enums.ResponseResult;
import cn.freemud.manager.RefundOverOrderManager;
import cn.freemud.manager.db2.dao.RefundOverOrderDao;
import cn.freemud.service.Orderservice;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.ExceptionUtils;
import com.alibaba.fastjson.JSON;
import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -20,12 +26,15 @@ import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
......@@ -44,6 +53,8 @@ public class CouponOrderRefundRetryHandler extends IJobHandler {
@Autowired
private RefundOverOrderManager refundOverOrderManager;
private ExecutorService executor = Executors.newFixedThreadPool(1);
@Override
public ReturnT<String> execute(String param) throws Exception {
......@@ -69,8 +80,57 @@ public class CouponOrderRefundRetryHandler extends IJobHandler {
return ReturnT.SUCCESS;
}
executor.execute(() -> {
ApiLog.infoMessage("开始自动给买券订单过期券退款 : " + JSON.toJSONString(refundOverOrderList));
for(RefundOverOrder refundOverOrder : refundOverOrderList) {
RefundOverOrder refundOverOrderUpdate = new RefundOverOrder();
refundOverOrderUpdate.setRefundId(refundOverOrder.getRefundId());
try {
OrderRefundVo orderRefundVo = new OrderRefundVo();
orderRefundVo.setOid(refundOverOrder.getRefundOrderCode());
orderRefundVo.setReason("券过期自动退款");
orderRefundVo.setRemarks("券过期自动退款");
BaseResponse baseResponse = orderservice.couponOrderRefund(orderRefundVo, 1);
if(ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUNDED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.SUCCESS.getCode());
refundOverOrderUpdate.setRefundDesc("成功");
} else if(ResponseResult.COUPON_CANCEL_FAIL.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.NOT_NEED_REFUND.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.COUPON_PROCESS_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else if(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.ORDER_VERIFY_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else if(ResponseResult.ORDER__ERRORREFUND.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.ORDER_VERIFY_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.OTHER.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
}
refundOverOrderManager.update(refundOverOrder);
} catch (Exception e) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.OTHER.getCode());
refundOverOrderUpdate.setRefundDesc(cutStr500(ExceptionUtils.getExceptionInfo(e)));
refundOverOrderManager.update(refundOverOrder);
}
}
});
return ReturnT.SUCCESS;
}
private String cutStr500(String s) {
if(StringUtils.isNotBlank(s) && s.length() > 500) {
return s.substring(0, 500);
}
return s;
}
}
......@@ -26,4 +26,12 @@
limit #{num}
</select>
<update id="update" parameterType="cn.freemud.entities.db.db2.RefundOverOrder">
update refund_over_order
set refund_status = #{refundStatus},
refund_fail = #{refundFail},
refund_desc = #{refundDesc}
where refund_id = #{refundId}
</update>
</mapper>
\ No newline at end of file
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