Commit 1866e737 by 王世昌

批量退款

parent 70c5c72b
package com.freemud.sdk.api.assortment.order.request.order;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
public class BatchOrderRefundV2Request {
/**
* 退款订单列表信息
*/
private List<BatchOrderRefundItem> batchSubRefundRequest;
/**
* 退款回调地址
*/
private String notifyUrl;
/**
* 商户编号(由非码提供)
*/
private String partnerId;
/**
* 商家门店号(在线支付需要提前定义)
*/
private String storeId;
/**
* 商家POS机编号(可以使用固定值)
*/
private String stationId;
/**
* 接口版本,必须为2
*/
private String ver;
/**
* 退款订单信息
*/
@Data
public static class BatchOrderRefundItem {
/**
* 非码订单号
*/
private String fmId;
/**
* 外部交易流水号,由上游系统生成,需保证唯一(支付标识)
*/
private String frontTransId;
/**
* 退款金额
*/
private Long refundAmount;
}
}
...@@ -89,5 +89,9 @@ public class CancelOrderRequest extends BaseConfig { ...@@ -89,5 +89,9 @@ public class CancelOrderRequest extends BaseConfig {
* 微商城退款方式 * 微商城退款方式
*/ */
private Byte refundMode; private Byte refundMode;
/**
* 拼团订单批量退款批次号
*/
private Long batchRefundId;
} }
} }
...@@ -4166,4 +4166,25 @@ public class OrderAdapter { ...@@ -4166,4 +4166,25 @@ public class OrderAdapter {
} }
return payTurnoffRefund; return payTurnoffRefund;
} }
public BatchOrderRefundV2Request getBatchOrderRefundV2Request(List<QueryOrdersResponseDto.DataBean.OrderBean> orderBeans,String partnerId,String storeId) {
BatchOrderRefundV2Request orderPayRefundRequest = new BatchOrderRefundV2Request();
// 请自行过滤金额为0的订单
List<BatchOrderRefundV2Request.BatchOrderRefundItem> items = orderBeans.stream().map(orderBean ->{
BatchOrderRefundV2Request.BatchOrderRefundItem item = new BatchOrderRefundV2Request.BatchOrderRefundItem();
item.setFmId(orderBean.getPayVoucher());
// TODO 暂时不考虑第三方订单
item.setFrontTransId(orderBean.getOid());
item.setRefundAmount(orderBean.getAmount());
return item;
}).collect(Collectors.toList());
orderPayRefundRequest.setBatchSubRefundRequest(items);
orderPayRefundRequest.setPartnerId(partnerId);
orderPayRefundRequest.setStoreId(storeId);
orderPayRefundRequest.setVer("2");
orderPayRefundRequest.setStationId("001");
orderPayRefundRequest.setNotifyUrl(refundNotifyCallback);
return orderPayRefundRequest;
}
} }
package cn.freemud.entities.dto.promotion; package cn.freemud.entities.dto.promotion;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* @author wanghanghang * @author wanghanghang
......
package cn.freemud.entities.vo;
import lombok.Data;
/**
* 售后单拓展信息
*/
@Data
public class AfterSalesOrderExtInfoVo {
/**
* 微商城退款方式
*/
private Byte refundMode;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: GetProductVo
* @Package cn.freemud.entities.vo
* @Description:
* @author: liming.guo
* @date: 2018/5/16 17:35
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.vo;
import cn.freemud.enums.RefundModeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
/**
* 拼团批量退款申请
*
* @author shichang.wang 2021/4/20
*/
@Data
public class SpellGroupBatchOrderRefundVo {
private String partnerId;
private String storeId;
/**
* 退款方式
*/
private Byte refundMode;
private String reason;
private String remarks;
}
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
package cn.freemud.entities.vo; package cn.freemud.entities.vo;
import cn.freemud.enums.RefundReasonEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -35,18 +36,20 @@ public class SpellGroupFailRefundVo { ...@@ -35,18 +36,20 @@ public class SpellGroupFailRefundVo {
/** /**
* 原因 * 取消原因
* {@link cn.freemud.enums.RefundReasonEnum#Other}
* {@link cn.freemud.enums.RefundReasonEnum#SPELL_GROUP_FAIL_TIME_OUT}
* {@link cn.freemud.enums.RefundReasonEnum#SPELL_GROUP_FAIL_SPONSOR_CANCEL}
*/ */
@ApiModelProperty("原因") @ApiModelProperty(value = "取消原因", notes = "取消原因"+ RefundReasonEnum.SPELL_GROUP_FAIL_API_DOC)
private String reason; private Integer reason;
/** /**
* 物流单号 * 订单号列表
*/ */
@NotEmpty(message = "订单号列表 不能为空") @NotEmpty(message = "订单号列表 不能为空")
@ApiModelProperty("订单号列表") @ApiModelProperty("订单号列表")
private List<String> orderCodeList; private List<String> orderCodeList;
} }
package cn.freemud.enums; package cn.freemud.enums;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* All rights Reserved, Designed By www.freemud.cn * All rights Reserved, Designed By www.freemud.cn
* *
...@@ -21,6 +26,9 @@ public enum RefundReasonEnum { ...@@ -21,6 +26,9 @@ public enum RefundReasonEnum {
Misdelivery_Leakage_of_Goods(5, "商品送错送漏"), Misdelivery_Leakage_of_Goods(5, "商品送错送漏"),
Riders_confirm_service_ahead_of_schedule(6, "骑手提前点确认送达"), Riders_confirm_service_ahead_of_schedule(6, "骑手提前点确认送达"),
SPELL_GROUP_FAIL_TIME_OUT(10, "拼团超时取消"),
SPELL_GROUP_FAIL_SPONSOR_CANCEL(11, "团长取消"),
; ;
...@@ -47,4 +55,25 @@ public enum RefundReasonEnum { ...@@ -47,4 +55,25 @@ public enum RefundReasonEnum {
public void setDesc(String desc) { public void setDesc(String desc) {
this.desc = desc; this.desc = desc;
} }
public static final String SPELL_GROUP_FAIL_API_DOC = "微商城拼团失败原因 1:其他 10:拼团超时取消 11:团长取消";
private static class EnumCacheHolder {
private static final Map<Integer, RefundReasonEnum> CACHE;
private static final Map<Integer, RefundReasonEnum> SPELL_GROUP_FAIL_CACHE;
static {
CACHE = Arrays.stream(RefundReasonEnum.values()).collect(Collectors.toMap(RefundReasonEnum::getCode, v -> v));
SPELL_GROUP_FAIL_CACHE = Stream.of(Other,SPELL_GROUP_FAIL_TIME_OUT,SPELL_GROUP_FAIL_SPONSOR_CANCEL).collect(Collectors.toMap(RefundReasonEnum::getCode, v -> v));
}
}
public static RefundReasonEnum getByIndex(Integer index) {
return EnumCacheHolder.CACHE.get(index);
}
public static RefundReasonEnum getSpellGroupReasonByIndex(Integer index) {
return EnumCacheHolder.SPELL_GROUP_FAIL_CACHE.get(index);
}
} }
...@@ -840,23 +840,24 @@ public class MallOrderServiceImpl implements MallOrderService { ...@@ -840,23 +840,24 @@ public class MallOrderServiceImpl implements MallOrderService {
} }
// 是否为 退款退货方式 // 是否为 退款退货方式
AfterSalesOrderExtInfoVo afterSalesOrderExtInfoVo = getAfterSalesOrderExtInfoVo(afterSalesOrderResp); CancelOrderRequest.AfterSalesOrderExtInfoReq afterSalesOrderExtInfoVo = getAfterSalesOrderExtInfoVo(afterSalesOrderResp);
log.debug("售后单信息方式为:{}", afterSalesOrderResp); log.debug("售后单信息方式为:{}", afterSalesOrderResp);
if (Objects.isNull(afterSalesOrderExtInfoVo) || !Objects.equals(RefundModeEnum.REFUND_ALL.getIndex(), afterSalesOrderExtInfoVo.getRefundMode())) { if (Objects.isNull(afterSalesOrderExtInfoVo) || !Objects.equals(RefundModeEnum.REFUND_ALL.getIndex(), afterSalesOrderExtInfoVo.getRefundMode())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "当前退款方式无需填写"); return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "当前退款方式无需填写");
} }
return ResponseUtil.success(); return ResponseUtil.success();
} }
private AfterSalesOrderExtInfoVo getAfterSalesOrderExtInfoVo(AfterSalesOrderResp afterSalesOrderResp) { private CancelOrderRequest.AfterSalesOrderExtInfoReq getAfterSalesOrderExtInfoVo(AfterSalesOrderResp afterSalesOrderResp) {
if (afterSalesOrderResp == null) { if (afterSalesOrderResp == null) {
return null; return null;
} }
AfterSalesOrderExtInfoVo afterSalesOrderExtInfoVo = null; CancelOrderRequest.AfterSalesOrderExtInfoReq afterSalesOrderExtInfoVo = null;
try { try {
afterSalesOrderExtInfoVo = JSON.parseObject(afterSalesOrderResp.getExtInfo(), new com.alibaba.fastjson.TypeReference<AfterSalesOrderExtInfoVo>() { afterSalesOrderExtInfoVo = JSON.parseObject(afterSalesOrderResp.getExtInfo(), new com.alibaba.fastjson.TypeReference< CancelOrderRequest.AfterSalesOrderExtInfoReq>() {
}.getType()); }.getType());
} catch (Exception e) { } catch (Exception e) {
log.error("解析售后单 extInfo 失败"); log.error("解析售后单 extInfo 失败");
......
...@@ -34,10 +34,6 @@ import cn.freemud.entities.dto.delivery.OrderRemindRequestDto; ...@@ -34,10 +34,6 @@ import cn.freemud.entities.dto.delivery.OrderRemindRequestDto;
import cn.freemud.entities.dto.delivery.QueryDeliveryAmountResponseDto; import cn.freemud.entities.dto.delivery.QueryDeliveryAmountResponseDto;
import cn.freemud.entities.dto.delivery.QueryLocusRiderTrackDto; import cn.freemud.entities.dto.delivery.QueryLocusRiderTrackDto;
import cn.freemud.entities.dto.delivery.ResRiderTrackDto; import cn.freemud.entities.dto.delivery.ResRiderTrackDto;
import cn.freemud.entities.dto.ecology.BookingOrderPayedScene;
import cn.freemud.entities.dto.ecology.InstantOrderPayedScene;
import cn.freemud.entities.dto.ecology.SubscribeMessageRequest;
import cn.freemud.entities.dto.ecology.SubscribeMessageResponse;
import cn.freemud.entities.dto.delivery.*; import cn.freemud.entities.dto.delivery.*;
import cn.freemud.entities.dto.order.CreateOrderOperateDto; import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto; import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
...@@ -45,8 +41,8 @@ import cn.freemud.entities.dto.order.FacePayRequestDto; ...@@ -45,8 +41,8 @@ import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto; import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.CombPayResponse; import cn.freemud.entities.dto.pay.CombPayResponse;
import cn.freemud.entities.dto.product.*; import cn.freemud.entities.dto.product.*;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto; import cn.freemud.entities.dto.promotion.GroupWorkQueryRequest;
import cn.freemud.entities.dto.promotion.CalculationDiscountResponseDto; import cn.freemud.entities.dto.promotion.GroupWorkQueryResponse;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto; import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.shoppingCart.CollageOrderDto; import cn.freemud.entities.dto.shoppingCart.CollageOrderDto;
...@@ -61,12 +57,11 @@ import cn.freemud.enums.RefundStatus; ...@@ -61,12 +57,11 @@ import cn.freemud.enums.RefundStatus;
import cn.freemud.enums.ResponseResult; import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.OrderType; import cn.freemud.enums.OrderType;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import cn.freemud.management.thirdparty.MulitiPaymentClient; import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.manager.SpellGroupOrderDataManager; import cn.freemud.manager.SpellGroupOrderDataManager;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.*; import cn.freemud.service.*;
import cn.freemud.service.coupon.CouponRelationFactory;
import cn.freemud.service.coupon.CouponRelationService;
import cn.freemud.service.order.OrderRelationFactory; import cn.freemud.service.order.OrderRelationFactory;
import cn.freemud.service.order.OrderRelationService; import cn.freemud.service.order.OrderRelationService;
import cn.freemud.service.thirdparty.*; import cn.freemud.service.thirdparty.*;
...@@ -74,19 +69,7 @@ import cn.freemud.utils.*; ...@@ -74,19 +69,7 @@ import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.couponcenter.offline.request.CouponLockRequest;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponLockResponse;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest;
import com.freemud.application.sdk.api.membercenter.request.UserScoreRequest;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderItemCreateReq;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.stockapi.request.UpdateStocksRequest;
import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.application.sdk.api.ordercenter.enums.*; import com.freemud.application.sdk.api.ordercenter.enums.*;
import jdk.nashorn.internal.runtime.ECMAException;
import com.alibaba.fastjson.TypeReference;
import com.freemud.api.assortment.datamanager.entity.db.*; import com.freemud.api.assortment.datamanager.entity.db.*;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo; import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.manager.*; import com.freemud.api.assortment.datamanager.manager.*;
...@@ -101,8 +84,6 @@ import com.freemud.api.assortment.datamanager.meal.MealCacheManager; ...@@ -101,8 +84,6 @@ import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.application.sdk.api.constant.ResponseConstant; import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum; import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService; import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService;
import com.freemud.application.sdk.api.deliverycenter.response.DeliveryInfoDto;
import com.freemud.application.sdk.api.deliverycenter.response.DeliveryResponseDto;
import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService; import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService;
import com.freemud.application.sdk.api.log.ApiLog; import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog; import com.freemud.application.sdk.api.log.ErrorLog;
...@@ -121,7 +102,6 @@ import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderC ...@@ -121,7 +102,6 @@ import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderC
import com.freemud.application.sdk.api.ordercenter.response.carpark.OrderResp; import com.freemud.application.sdk.api.ordercenter.response.carpark.OrderResp;
import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSendCouponResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
...@@ -168,8 +148,6 @@ import com.freemud.sdk.api.assortment.payment.service.StandardPaymentService; ...@@ -168,8 +148,6 @@ import com.freemud.sdk.api.assortment.payment.service.StandardPaymentService;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -186,7 +164,6 @@ import org.springframework.stereotype.Service; ...@@ -186,7 +164,6 @@ import org.springframework.stereotype.Service;
import tk.mybatis.mapper.util.StringUtil; import tk.mybatis.mapper.util.StringUtil;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
...@@ -196,8 +173,6 @@ import java.util.function.Function; ...@@ -196,8 +173,6 @@ import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR;
@Service @Service
@Slf4j @Slf4j
...@@ -337,6 +312,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -337,6 +312,9 @@ public class OrderServiceImpl implements Orderservice {
@Autowired @Autowired
private OrderRelationFactory orderRelationFactory; private OrderRelationFactory orderRelationFactory;
@Autowired
private SpellGroupOrderDataManager spellGroupOrderDataManager;
@Override @Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) { public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
String trackingNo = LogTreadLocal.getTrackingNo(); String trackingNo = LogTreadLocal.getTrackingNo();
...@@ -2087,6 +2065,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2087,6 +2065,7 @@ public class OrderServiceImpl implements Orderservice {
if (StringUtils.isEmpty(orderRefundVo.getReason())) { if (StringUtils.isEmpty(orderRefundVo.getReason())) {
orderRefundVo.setReason("退款"); orderRefundVo.setReason("退款");
} }
// 查询用户信息
AssortmentCustomerInfoVo userInfo = customerInfoManager.getCustomerInfoByObject(orderRefundVo.getSessionId()); AssortmentCustomerInfoVo userInfo = customerInfoManager.getCustomerInfoByObject(orderRefundVo.getSessionId());
if (userInfo == null || StringUtils.isEmpty(userInfo.getMemberId())) { if (userInfo == null || StringUtils.isEmpty(userInfo.getMemberId())) {
return ResponseUtil.error(ResponseResult.NOT_LOGIN); return ResponseUtil.error(ResponseResult.NOT_LOGIN);
...@@ -2130,26 +2109,34 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2130,26 +2109,34 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(ResponseResult.PARAMETER_MISSING.getCode(), "请选择退款方式"); return ResponseUtil.error(ResponseResult.PARAMETER_MISSING.getCode(), "请选择退款方式");
} }
// 拼单类型 下单\待发货 只可选择只退款不退货 // 拼团类型
if (Objects.equals(OrderMarketType.COLLAGE.getIndex(),orderBean.getMarketingType())) { if (Objects.equals(OrderMarketType.GROUPB.getIndex(),orderBean.getMarketingType())) {
OrderExtInfoDto orderExtInfoDto = JSON.parseObject(orderBean.getExtInfo(),OrderExtInfoDto.class); OrderExtInfoDto orderExtInfoDto = JSON.parseObject(orderBean.getExtInfo(),OrderExtInfoDto.class);
String spellGroupCode; String spellGroupCode;
if(Objects.isNull(orderExtInfoDto) || StringUtils.isBlank(spellGroupCode = orderExtInfoDto.getSpellGroupCode())){ if(Objects.isNull(orderExtInfoDto) || StringUtils.isBlank(spellGroupCode = orderExtInfoDto.getSpellGroupCode())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "未查询到团信息,请稍后重试"); return ResponseUtil.error(ResponseResult.SPELL_GROUP_QUERY_GROUP_WORK_ERROR);
} }
// 查询活动信息 // 获取拼团活动
OrderSettlementResp settlement; OrderSettlementResp settlement;
if(CollectionUtils.isEmpty(orderBean.getOrderSettlementDetailList()) if(CollectionUtils.isEmpty(orderBean.getOrderSettlementDetailList())
|| Objects.isNull(settlement = orderBean.getOrderSettlementDetailList().stream().filter(e -> Objects.equals(OrderSettlementType.OTHER.getIndex(),e.getSettlementType())).findFirst().orElse(null)) || Objects.isNull(settlement = orderBean.getOrderSettlementDetailList().stream().filter(e -> Objects.equals(OrderSettlementType.SPELL_GROUP.getIndex(),e.getSettlementType())).findFirst().orElse(null))
|| StringUtils.isBlank(settlement.getExternalObjectId())){ || StringUtils.isBlank(settlement.getExternalObjectId())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "未查询到活动信息"); return ResponseUtil.error(ResponseResult.SPELL_GROUP_QUERY_GROUP_WORK_ERROR);
}
// 查询团信息
GroupWorkQueryRequest groupWorkQueryRequest = new GroupWorkQueryRequest();
groupWorkQueryRequest.setActivityCode(settlement.getExternalObjectId());
groupWorkQueryRequest.setGoodId(spellGroupCode);
groupWorkQueryRequest.setPartnerId(orderBean.getCompanyId());
GroupWorkQueryResponse groupWorkQueryResponse = spellGroupOrderDataManager.groupWorkQuery(groupWorkQueryRequest);
if(groupWorkQueryResponse == null || groupWorkQueryResponse.getResult() == null){
return ResponseUtil.error(ResponseResult.SPELL_GROUP_QUERY_GROUP_WORK_ERROR);
} }
// todo 查询团信息
} }
// 接单 制作完成 下单 的只可以选择只退款不退货 // 完成/配送中 可以选择退货退款
List<Integer> unRefundGoodsCodes = Arrays.asList( List<Integer> refundGoodsCodes = Arrays.asList(
OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode(), OrderStatus.TAKE_ORDER.getCode()); OrderStatus.DISTRIBUTION.getCode(), OrderStatus.COMPLETE.getCode());
if(unRefundGoodsCodes.contains(orderBean.getStatus())&& !Objects.equals(RefundModeEnum.UN_REFUND_GOODS.getIndex(), orderRefundVo.getRefundMode())){ if(!refundGoodsCodes.contains(orderBean.getStatus())&& !Objects.equals(RefundModeEnum.UN_REFUND_GOODS.getIndex(), orderRefundVo.getRefundMode())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "还未发货,请选择只退款不退货"); return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "还未发货,请选择只退款不退货");
} }
...@@ -2230,7 +2217,6 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2230,7 +2217,6 @@ public class OrderServiceImpl implements Orderservice {
boolean isRefundDeliveryFee = true; boolean isRefundDeliveryFee = true;
AssortmentOpenPlatformPartnerWxappConfig refundDeliveryFeeConfig = configMap.get(OrderRefundEnum.REFUND_DELIVERY_FEE_ENABLE.getKeyValue()); AssortmentOpenPlatformPartnerWxappConfig refundDeliveryFeeConfig = configMap.get(OrderRefundEnum.REFUND_DELIVERY_FEE_ENABLE.getKeyValue());
LogUtil.info("orderRefund of oid:{}, {}, {}", orderBean.getOid(), orderBean.getStatus(), (null != refundDeliveryFeeConfig ? ToStringBuilder.reflectionToString(refundDeliveryFeeConfig) : null)); LogUtil.info("orderRefund of oid:{}, {}, {}", orderBean.getOid(), orderBean.getStatus(), (null != refundDeliveryFeeConfig ? ToStringBuilder.reflectionToString(refundDeliveryFeeConfig) : null));
// todo 是否有配送费
// 0、null表示 关闭 ; 1 表示开启 // 0、null表示 关闭 ; 1 表示开启
if (null != refundDeliveryFeeConfig if (null != refundDeliveryFeeConfig
&& Arrays.asList(OrderStatus.DISTRIBUTION.getCode(), OrderStatus.COMPLETE.getCode()).contains(orderBean.getStatus()) && Arrays.asList(OrderStatus.DISTRIBUTION.getCode(), OrderStatus.COMPLETE.getCode()).contains(orderBean.getStatus())
...@@ -2261,11 +2247,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2261,11 +2247,10 @@ public class OrderServiceImpl implements Orderservice {
cancelOrderRequest.setReason(orderRefundVo.getReason()); cancelOrderRequest.setReason(orderRefundVo.getReason());
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks()); cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
// 商城订单 增加拓展信息 // 商城订单 增加拓展信息
if(orderRefundVo.getRefundMode() != null){ CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq(); salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode()); cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
}
cancelOrderRequest.setOperator(orderBean.getUserName()); cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo()); cancelOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee); cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
...@@ -2338,11 +2323,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2338,11 +2323,10 @@ public class OrderServiceImpl implements Orderservice {
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks()); cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee); cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
// 商城订单 增加拓展信息 // 商城订单 增加拓展信息
if(orderRefundVo.getRefundMode() != null){ CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq(); salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode()); cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
}
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest); BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest);
if (baseOrderResponse == null || baseOrderResponse.getData() == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) { if (baseOrderResponse == null || baseOrderResponse.getData() == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed"); return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
...@@ -4186,7 +4170,6 @@ public class OrderServiceImpl implements Orderservice { ...@@ -4186,7 +4170,6 @@ public class OrderServiceImpl implements Orderservice {
} }
// 进行一次去重 // 进行一次去重
orderCodeList = orderCodeList.stream().distinct().collect(Collectors.toList()); orderCodeList = orderCodeList.stream().distinct().collect(Collectors.toList());
// todo 查询团信息 对比订单号是否正确
// 查询订单列表 // 查询订单列表
QueryOrdersResponse orderListResp = getOrderList(orderCodeList); QueryOrdersResponse orderListResp = getOrderList(orderCodeList);
...@@ -4203,42 +4186,28 @@ public class OrderServiceImpl implements Orderservice { ...@@ -4203,42 +4186,28 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(checkResponse.getCode(), checkResponse.getMessage()); return ResponseUtil.error(checkResponse.getCode(), checkResponse.getMessage());
} }
// 循环处理 // 过滤订单
for (OrderBean orderBean : orderBeanList) { // todo 此时存在处理中的售后怎么办?
if (Objects.equals(PayStatus.NOT_PAY.getCode(), orderBean.getPayStatus()) orderBeanList = filterOrder(orderBeanList);
|| Objects.equals(OrderStatus.WAIT_PAY.getCode(), orderBean.getStatus())) { if (orderBeanList.isEmpty()){
log.info("拼团失败取消订单 -> 订单未支付,无需退款 团号:{}, 订单号:{} ", refundVo.getSpellGroupCode(), orderBean.getOid()); log.warn("拼团失败取消订单 -> 需要取消的订单未空 团号:{}",refundVo.getSpellGroupCode());
continue; return ResponseUtil.success();
} }
if (OrderStatus.CALCEL.getCode().equals(orderBean.getStatus())) {
log.info("拼团失败取消订单 -> 订单已取消,无需退款 团号:{}, 订单号:{} ", refundVo.getSpellGroupCode(), orderBean.getOid()); // 批量退款
continue; log.info("拼团失败取消订单 -> 开始处理, 团号:{}, 订单号:{}", refundVo.getSpellGroupCode(), orderBeanList);
}
// todo 此时存在处理中的售后怎么办?
try{
log.info("拼团失败取消订单 -> 开始处理, 团号:{}, 订单号:{}", refundVo.getSpellGroupCode(), orderBean.getOid());
// 未接单
OrderRefundVo orderRefundVo = new OrderRefundVo();
orderRefundVo.setOid(orderBean.getOid());
orderRefundVo.setPartnerId(orderBean.getCompanyId());
orderRefundVo.setReason(StringUtils.isBlank(refundVo.getReason()) ? "拼团失败" : refundVo.getReason());
// 拼团失败取消 默认为只退款不退货
orderRefundVo.setRefundMode(RefundModeEnum.UN_REFUND_GOODS.getIndex());
//商家未接单逻辑处理 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
BaseResponse baseResponse = partnerNoTakeOrder(orderRefundVo, orderBean, orderBean.getOid(), AfterSalesType.SYSTEM_CANCEL, true);
if (baseResponse != null) {
return baseResponse;
}
// 删除订单 通知活动添加商品库存
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus());
}catch (Exception e){
log.error("拼团失败取消订单 -> 发生异常 订单号:{}", orderBean.getOid(), e);
// 放入缓存等待重试
}
SpellGroupBatchOrderRefundVo orderRefundVo = new SpellGroupBatchOrderRefundVo();
orderRefundVo.setPartnerId(orderBeanList.get(0).getCompanyId());
orderRefundVo.setPartnerId(orderBeanList.get(0).getShopId());
orderRefundVo.setReason(Optional.ofNullable(RefundReasonEnum.getSpellGroupReasonByIndex(refundVo.getReason())).orElse(RefundReasonEnum.Other).getDesc());
// 拼团失败取消 默认为只退款不退货
orderRefundVo.setRefundMode(RefundModeEnum.UN_REFUND_GOODS.getIndex());
// 拼团失败逻辑处理
BaseResponse baseResponse = batchPartnerNoTakeOrder(orderRefundVo, orderBeanList, AfterSalesType.SYSTEM_CANCEL, true);
if (baseResponse != null) {
return baseResponse;
} }
return ResponseUtil.success(); return ResponseUtil.success();
} }
...@@ -4250,12 +4219,30 @@ public class OrderServiceImpl implements Orderservice { ...@@ -4250,12 +4219,30 @@ public class OrderServiceImpl implements Orderservice {
return orderCenterSdkService.batchQueryByCodes(baseQueryOrderRequest); return orderCenterSdkService.batchQueryByCodes(baseQueryOrderRequest);
} }
private List<OrderBean> filterOrder(List<OrderBean> orderBeans) {
List<OrderBean> list = new ArrayList<>(orderBeans.size());
for (OrderBean orderBean : orderBeans) {
if (Objects.equals(PayStatus.NOT_PAY.getCode(), orderBean.getPayStatus())
|| Objects.equals(OrderStatus.WAIT_PAY.getCode(), orderBean.getStatus())) {
log.info("拼团失败取消订单 -> 订单未支付,无需退款 订单号:{} ", orderBean.getOid());
continue;
}
if (OrderStatus.CALCEL.getCode().equals(orderBean.getStatus())) {
log.info("拼团失败取消订单 -> 订单已取消,无需退款 订单号:{} ", orderBean.getOid());
continue;
}
list.add(orderBean);
}
return list;
}
private BaseResponse batchRefundBeforeCheck(List<String> orderCodeList, List<OrderBean> orderBeans) { private BaseResponse batchRefundBeforeCheck(List<String> orderCodeList, List<OrderBean> orderBeans) {
List<String> notFoundCodeList = new ArrayList<>(orderCodeList); List<String> notFoundCodeList = new ArrayList<>(orderCodeList);
List<String> notSupportOrderCodeList = new ArrayList<>(orderCodeList.size()); List<String> notSupportOrderCodeList = new ArrayList<>(orderCodeList.size());
for (OrderBean orderBean : orderBeans) { for (OrderBean orderBean : orderBeans) {
notFoundCodeList.remove(orderBean.getOid()); notFoundCodeList.remove(orderBean.getOid());
if (!Objects.equals(com.freemud.sdk.api.assortment.order.enums.OrderSourceType.SAASMALL.getCode(), orderBean.getSource())) { // 是否是微商城拼团订单
if (!Objects.equals(com.freemud.sdk.api.assortment.order.enums.OrderSourceType.SAASMALL.getCode(), orderBean.getSource()) || !Objects.equals(OrderMarketType.GROUPB.getIndex(),orderBean.getMarketingType())) {
notSupportOrderCodeList.add(orderBean.getOid()); notSupportOrderCodeList.add(orderBean.getOid());
} }
} }
...@@ -4264,7 +4251,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -4264,7 +4251,7 @@ public class OrderServiceImpl implements Orderservice {
builder.append(String.format("部分订单信息不存在:%s ,", JSON.toJSONString(notFoundCodeList))); builder.append(String.format("部分订单信息不存在:%s ,", JSON.toJSONString(notFoundCodeList)));
} }
if (!notSupportOrderCodeList.isEmpty()) { if (!notSupportOrderCodeList.isEmpty()) {
builder.append(String.format("非微商城订单:%s", JSON.toJSONString(notSupportOrderCodeList))); builder.append(String.format("不是微商城拼团订单:%s", JSON.toJSONString(notSupportOrderCodeList)));
} }
if (builder.length() != 0) { if (builder.length() != 0) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), builder.toString()); return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), builder.toString());
...@@ -4272,4 +4259,91 @@ public class OrderServiceImpl implements Orderservice { ...@@ -4272,4 +4259,91 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.success(); return ResponseUtil.success();
} }
/**
* 拼团失败逻辑处理
* <p>应当只用于售前</p>
*
* 1.调用支付退款
* 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
*
* @param orderRefundVo
* @param orderBeans
* @param afterSalesType
* @param isRefundDeliveryFee
* @return
*/
private BaseResponse batchPartnerNoTakeOrder(SpellGroupBatchOrderRefundVo orderRefundVo, List<OrderBean> orderBeans, AfterSalesType afterSalesType, Boolean isRefundDeliveryFee) {
if (CollectionUtils.isEmpty(orderBeans)) {
return null;
}
long refundId = System.currentTimeMillis();
String partnerId = orderRefundVo.getPartnerId();
String storeId = orderRefundVo.getStoreId();
// 退款批次号
Long batchId = 0L;
List<OrderBean> payRefundOrderCodes = new ArrayList<>(orderBeans.size());
Set<String> unPayRefund = new HashSet<>(orderBeans.size());
orderBeans.forEach(orderBean -> {
// 金额为0不需要退款
if (orderBean.getAmount() > 0) {
payRefundOrderCodes.add(orderBean);
} else {
unPayRefund.add(orderBean.getOid());
}
});
if (!payRefundOrderCodes.isEmpty()) {
// 1.组装批量退款参数
BatchOrderRefundV2Request batchOrderRefundV2Request = orderAdapter.getBatchOrderRefundV2Request(payRefundOrderCodes, partnerId, storeId);
PayBatchRefundResponse response = null;
try {
// 2.调用支付服务退款
response = paymentNewClient.batchRefund(batchOrderRefundV2Request);
} catch (Exception e) {
log.error("批量退款失败!!", e);
}
PayBatchRefundResponse.BatchRefundBatchIdData batchIdData;
if (Objects.isNull(response) || !Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS, response.getCode())
|| Objects.isNull(batchIdData = response.getData()) || Objects.isNull(batchIdData.getBatchId())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "批量退款失败");
}
// 获取退款批次号
batchId = batchIdData.getBatchId();
}
// 循环退单
String trackingNo = LogTreadLocal.getTrackingNo();
for (OrderBean orderBean : orderBeans) {
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(),
partnerId, afterSalesType, orderRefundVo.getReason(), trackingNo, Long.toString(refundId));
cancelOrderRequest.setOperator(Optional.ofNullable(cancelOrderRequest.getOperator()).orElse(orderBean.getUserName()));
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
// 增加拓展信息
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
if (unPayRefund.contains(orderBean.getOid())) {
// 无需退款
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
} else {
// 记录退款批次
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent());
salesOrderExtInfoReq.setBatchRefundId(batchId);
}
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest);
if (baseOrderResponse == null || baseOrderResponse.getData() == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
// 删除订单 通知活动添加商品库存
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus());
}
return null;
}
} }
...@@ -2,6 +2,8 @@ package cn.freemud.service.thirdparty; ...@@ -2,6 +2,8 @@ package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.order.FacePayRequestDto; import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto; import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import com.freemud.sdk.api.assortment.order.request.order.BatchOrderRefundV2Request;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -29,4 +31,10 @@ public interface PaymentNewClient { ...@@ -29,4 +31,10 @@ public interface PaymentNewClient {
@PostMapping("paymentcenter/facePay") @PostMapping("paymentcenter/facePay")
com.freemud.application.sdk.api.base.BaseResponse<FacePayResponseDto> facePay(@RequestBody FacePayRequestDto orderPayDto); com.freemud.application.sdk.api.base.BaseResponse<FacePayResponseDto> facePay(@RequestBody FacePayRequestDto orderPayDto);
/**
* 批量支付退款
*/
@PostMapping("/payment/application/batch/refund")
PayBatchRefundResponse batchRefund(BatchOrderRefundV2Request batchOrderRefundV2Request);
} }
package cn.freemud.management.entities.dto.response.pay;
import lombok.Data;
/**
* 批量退款
* @author shichang.wang 2021/4/20
*/
@Data
public class PayBatchRefundResponse {
private int code;
private BatchRefundBatchIdData data;
private String msg;
@Data
public static class BatchRefundBatchIdData {
/**
* 退款批次号
*/
private Long batchId;
}
}
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