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 {
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);
}
......@@ -3446,12 +3446,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();
}
......@@ -3463,7 +3463,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) {
......@@ -3481,7 +3481,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();
// 作废成功
......@@ -3489,14 +3489,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()
......@@ -3505,7 +3505,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);
}
......@@ -3662,19 +3662,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.getV1Code()) != 0) {
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(), "只可操作完成的订单");
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 需要核实一下 是否申请退款,订单主状态还不会变
......@@ -3685,7 +3685,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;
}
}
......@@ -9,12 +9,12 @@
<id column="refund_id" property="refundId" jdbcType="INTEGER" />
<result column="refund_order_code" property="refundOrderCode" 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_fail" property="refundFail" jdbcType="INTEGER" />
<result column="refund_desc" property="refundDesc" jdbcType="VARCHAR" />
<result column="refund_create_time" property="refundCreateTime" jdbcType="DATETIME" />
<result column="refund_update_time" property="refundUpdateTime" jdbcType="DATETIME" />
<result column="refund_create_time" property="refundCreateTime" jdbcType="TIMESTAMP" />
<result column="refund_update_time" property="refundUpdateTime" jdbcType="TIMESTAMP" />
</resultMap>
<select id="selectBatch" resultType="cn.freemud.entities.db.db2.RefundOverOrder">
......@@ -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