Commit b015060e by 徐康

到期券自动退款

parent 20a83277
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 { ...@@ -193,6 +193,7 @@ public enum ResponseResult {
ORDER_CODES_REPEAT("45084", "同一次开票,选中的订单不能重复,请重新选择订单",""), ORDER_CODES_REPEAT("45084", "同一次开票,选中的订单不能重复,请重新选择订单",""),
ORDER_INVOICE_CONFIG_IS_NULL("45085", "发票配置信息为空,不可开票",""), ORDER_INVOICE_CONFIG_IS_NULL("45085", "发票配置信息为空,不可开票",""),
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""), ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
COUPON_ORDER_VERIFY_FAIL("45087","买券订单校验异常",""),
/** /**
* 售后单 * 售后单
...@@ -226,6 +227,7 @@ public enum ResponseResult { ...@@ -226,6 +227,7 @@ public enum ResponseResult {
PAY_ERROR("46016","支付类型错误",""), PAY_ERROR("46016","支付类型错误",""),
COUPON_DATETIME_INVAILD("46017", "优惠券在当前时间不可用",""), COUPON_DATETIME_INVAILD("46017", "优惠券在当前时间不可用",""),
COUPON_ORDER_ORIGINAL_AMOUNT_NOT_ENOUGH("46018","优惠券不满足可用金额门槛",""), COUPON_ORDER_ORIGINAL_AMOUNT_NOT_ENOUGH("46018","优惠券不满足可用金额门槛",""),
COUPON_CANCEL_FAIL("46019","作废券失败",""),
SHOPPING_CART_USER_HAVE_NO_COUPON("46019", "使用的商品券已失效,请重新下单",""), SHOPPING_CART_USER_HAVE_NO_COUPON("46019", "使用的商品券已失效,请重新下单",""),
/** /**
......
...@@ -25,4 +25,12 @@ public class RefundOverOrderManager { ...@@ -25,4 +25,12 @@ public class RefundOverOrderManager {
return refundOverOrderDao.selectBatch(num); 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> { ...@@ -14,4 +14,6 @@ public interface RefundOverOrderDao extends MyMapper<RefundOverOrder> {
List<RefundOverOrder> selectBatch(@Param("num") Integer num); List<RefundOverOrder> selectBatch(@Param("num") Integer num);
List<RefundOverOrder> update(@Param("refundOverOrder") RefundOverOrder refundOverOrder);
} }
...@@ -3446,12 +3446,12 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3446,12 +3446,12 @@ public class OrderServiceImpl implements Orderservice {
request.setCouponCodes(couponCodeList); request.setCouponCodes(couponCodeList);
UserBaseResponsDTO<List<String>> responsDTO = customerExtendClient.getMemberCouponCodes(request); UserBaseResponsDTO<List<String>> responsDTO = customerExtendClient.getMemberCouponCodes(request);
if (responsDTO == null || !Objects.equals(responsDTO.getCode(), ResponseResult.SUCCESS.getCode())) { 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(); List<String> responsDTOData = responsDTO.getData();
if (CollectionUtils.isEmpty(responsDTOData) || !responsDTOData.containsAll(couponCodeList)) { if (CollectionUtils.isEmpty(responsDTOData) || !responsDTOData.containsAll(couponCodeList)) {
// fisherman 文案让产品提供 // fisherman 文案让产品提供
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT, "您购买的优惠券已锁定,请先进行解锁操作再退款"); return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "您购买的优惠券已锁定,请先进行解锁操作再退款");
} }
return ResponseUtil.success(); return ResponseUtil.success();
} }
...@@ -3463,7 +3463,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3463,7 +3463,7 @@ public class OrderServiceImpl implements Orderservice {
*/ */
private BaseResponse couponOnLineHandle(OrderBeanV1 orderBean) { private BaseResponse couponOnLineHandle(OrderBeanV1 orderBean) {
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0) { 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); BaseResponse<List<String>> baseResponse = this.couponOrderCommomCheck(orderBean);
if (baseResponse.getCode().compareTo(ResponseResult.SUCCESS.getCode()) != 0) { if (baseResponse.getCode().compareTo(ResponseResult.SUCCESS.getCode()) != 0) {
...@@ -3481,7 +3481,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3481,7 +3481,7 @@ public class OrderServiceImpl implements Orderservice {
if (responseDTO == null if (responseDTO == null
|| !Objects.equals(responseDTO.getStatusCode(),100)) { || !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(); CheckAndCancelResponseDTO result = responseDTO.getResult();
// 作废成功 // 作废成功
...@@ -3489,14 +3489,14 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3489,14 +3489,14 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.success(); return ResponseUtil.success();
} }
String memo = result.getMemo(); 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) { private BaseResponse<List<String>> couponOrderCommomCheck(OrderBeanV1 orderBean) {
List<OrderSettlementResp> orderSettlementDetailList = orderBean.getOrderSettlementDetailList(); List<OrderSettlementResp> orderSettlementDetailList = orderBean.getOrderSettlementDetailList();
if (CollectionUtils.isEmpty(orderSettlementDetailList)) { 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() List<String> couponCodeList = orderSettlementDetailList.stream()
...@@ -3505,7 +3505,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3505,7 +3505,7 @@ public class OrderServiceImpl implements Orderservice {
// fisherman 核销券失败的逻辑处理 // fisherman 核销券失败的逻辑处理
if (CollectionUtils.isEmpty(couponCodeList)) { if (CollectionUtils.isEmpty(couponCodeList)) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "没有优惠券信息"); return ResponseUtil.error(ResponseResult.COUPON_CANCEL_FAIL.getCode(), "没有优惠券信息");
} }
return ResponseUtil.success(couponCodeList); return ResponseUtil.success(couponCodeList);
} }
...@@ -3662,19 +3662,19 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3662,19 +3662,19 @@ public class OrderServiceImpl implements Orderservice {
private BaseResponse couponOrderRefundCheck(AssortmentCustomerInfoVo userLoginInfoDto, OrderBeanV1 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.COUPON_ORDER_VERIFY_FAIL.getCode(), "不能操作非本人的订单");
} }
// 是否是卖券订单 // 是否是卖券订单
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0) { 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已完成状态下 才能退款 // 校验订单状态 卖券订单只有在6已完成状态下 才能退款
if (orderBean.getStatus().compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) { if (orderBean.getStatus().compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作完成的订单"); return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "只可操作完成的订单");
} }
// 校验一遍是否有售后单 // 校验一遍是否有售后单
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) { if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "已存在退款申请,请耐心等待处理"); return ResponseUtil.error(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode(), "已存在退款申请,请耐心等待处理");
} }
// fisherman 需要核实一下 是否申请退款,订单主状态还不会变 // fisherman 需要核实一下 是否申请退款,订单主状态还不会变
...@@ -3685,7 +3685,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3685,7 +3685,7 @@ public class OrderServiceImpl implements Orderservice {
if (isTrue) { if (isTrue) {
return ResponseUtil.success(); 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; ...@@ -7,12 +7,18 @@ import cn.freemud.entities.dto.delivery.GetFilterPartnerResponse;
import cn.freemud.entities.dto.delivery.PartnerFilterResponse; import cn.freemud.entities.dto.delivery.PartnerFilterResponse;
import cn.freemud.entities.dto.openplatform.OrderGetPartnerRequest; import cn.freemud.entities.dto.openplatform.OrderGetPartnerRequest;
import cn.freemud.entities.vo.OrderCountRequestVo; import cn.freemud.entities.vo.OrderCountRequestVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.entities.vo.SendOrderCountsMsg; 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.RefundOverOrderManager;
import cn.freemud.manager.db2.dao.RefundOverOrderDao; import cn.freemud.manager.db2.dao.RefundOverOrderDao;
import cn.freemud.service.Orderservice; import cn.freemud.service.Orderservice;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient; import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.utils.AppLogUtil; 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.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.log.ApiLog; import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
...@@ -20,12 +26,15 @@ import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp; ...@@ -20,12 +26,15 @@ import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant; import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.IJobHandler;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -44,6 +53,8 @@ public class CouponOrderRefundRetryHandler extends IJobHandler { ...@@ -44,6 +53,8 @@ public class CouponOrderRefundRetryHandler extends IJobHandler {
@Autowired @Autowired
private RefundOverOrderManager refundOverOrderManager; private RefundOverOrderManager refundOverOrderManager;
private ExecutorService executor = Executors.newFixedThreadPool(1);
@Override @Override
public ReturnT<String> execute(String param) throws Exception { public ReturnT<String> execute(String param) throws Exception {
...@@ -69,8 +80,57 @@ public class CouponOrderRefundRetryHandler extends IJobHandler { ...@@ -69,8 +80,57 @@ public class CouponOrderRefundRetryHandler extends IJobHandler {
return ReturnT.SUCCESS; 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; return ReturnT.SUCCESS;
} }
private String cutStr500(String s) {
if(StringUtils.isNotBlank(s) && s.length() > 500) {
return s.substring(0, 500);
}
return s;
}
} }
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
<id column="refund_id" property="refundId" jdbcType="INTEGER" /> <id column="refund_id" property="refundId" jdbcType="INTEGER" />
<result column="refund_order_code" property="refundOrderCode" jdbcType="VARCHAR" /> <result column="refund_order_code" property="refundOrderCode" jdbcType="VARCHAR" />
<result column="refund_coupon_code" property="refundCouponCode" jdbcType="VARCHAR" /> <result column="refund_coupon_code" property="refundCouponCode" jdbcType="VARCHAR" />
<result column="refund_time" property="refundTime" jdbcType="DATETIME" /> <result column="refund_time" property="refundTime" jdbcType="TIMESTAMP" />
<result column="refund_status" property="refundStatus" jdbcType="INTEGER" /> <result column="refund_status" property="refundStatus" jdbcType="INTEGER" />
<result column="refund_fail" property="refundFail" jdbcType="INTEGER" /> <result column="refund_fail" property="refundFail" jdbcType="INTEGER" />
<result column="refund_desc" property="refundDesc" jdbcType="VARCHAR" /> <result column="refund_desc" property="refundDesc" jdbcType="VARCHAR" />
<result column="refund_create_time" property="refundCreateTime" jdbcType="DATETIME" /> <result column="refund_create_time" property="refundCreateTime" jdbcType="TIMESTAMP" />
<result column="refund_update_time" property="refundUpdateTime" jdbcType="DATETIME" /> <result column="refund_update_time" property="refundUpdateTime" jdbcType="TIMESTAMP" />
</resultMap> </resultMap>
<select id="selectBatch" resultType="cn.freemud.entities.db.db2.RefundOverOrder"> <select id="selectBatch" resultType="cn.freemud.entities.db.db2.RefundOverOrder">
...@@ -26,4 +26,12 @@ ...@@ -26,4 +26,12 @@
limit #{num} limit #{num}
</select> </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> </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