Commit 74a2885b by 王世昌

Merge branch 'frature/20210414_华莱士微商城申请退款_wangshichang' into feature/20210420-华莱士公用分支-张志恒

parents e6fce948 d2c08bb5
......@@ -15,8 +15,10 @@ package com.freemud.sdk.api.assortment.order.request.order;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.sdk.api.assortment.order.config.BaseConfig;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class CancelOrderRequest extends BaseConfig {
......@@ -70,4 +72,22 @@ public class CancelOrderRequest extends BaseConfig {
*/
@Builder.Default
private boolean isRefundDeliveryAmount = true;
/**
* 售后单拓展信息
*/
private AfterSalesOrderExtInfoReq extInfoReq;
/**
* 售后单拓展信息
*/
@NoArgsConstructor
@Data
public static class AfterSalesOrderExtInfoReq {
/**
* 微商城退款方式
*/
private Byte refundMode;
}
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: OrderCancelReq
* @Package com.freemud.application.sdk.api.ordercenter.request
* @Description:
* @author: ping.wu
* @date: 2019/4/2 21:26
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package com.freemud.sdk.api.assortment.order.request.order;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.sdk.api.assortment.order.config.BaseConfig;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 修改售后单快递信息
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class EditAfterSalesExpressRequest extends BaseConfig {
private String partnerId;
private String storeId;
/**
* 渠道
*/
private Integer orderClient;
/**
* 订单ID
*/
private String orderId;
/**
* 售后单code,新订单服务需要
*/
private String afterSalesCode;
//操作人
private String operator;
/**
* 物流公司名称
*/
private String expressChannelName;
/**
* 物流单号
*/
private String expressNo;
}
......@@ -357,4 +357,11 @@ public interface OrderCenterSdkService {
*/
QueryLineUpResponse queryLineUpOrder(QueryLineUpOrderReq queryLineUpOrderReq);
/**
* 用户修改订单快递信息
* @param afterSalesExpressRequest
* @return
*/
BaseOrderResponse editAfterSalesExpress(EditAfterSalesExpressRequest afterSalesExpressRequest);
}
......@@ -7,6 +7,7 @@ import cn.freemud.amqp.MQService;
import cn.freemud.base.util.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.api.assortment.datamanager.order.config.ManagerOrderBeanConfig;
......@@ -696,6 +697,12 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
request.setCreateEvent(cancelOrderRequest.getCreateEvent());
request.setAfterSerialNo(cancelOrderRequest.getRefundSerialNo());
request.setOperator(cancelOrderRequest.getOperator());
// 【华莱士20210510活动】新增加退款方式字段
if(Objects.nonNull(cancelOrderRequest.getExtInfoReq())){
request.setExtInfo(JSON.toJSONString(cancelOrderRequest.getExtInfoReq()));
}
//为空发起售后单
if(cancelOrderRequest.getCreateEvent() == null){
// 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout,
......@@ -2010,4 +2017,18 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
com.freemud.application.sdk.api.ordercenter.response.BaseResponse<List<String>> response = orderSdkService.queryLineUpOrder(queryLineUpOrderReq, LogThreadLocal.getTrackingNo());
return orderSdkAdapter.convent2QueryLineUpResponse(response);
}
@Override
public BaseOrderResponse editAfterSalesExpress(EditAfterSalesExpressRequest afterSalesExpressRequest){
AfterSalesExpressOperateReq request = new AfterSalesExpressOperateReq();
request.setOrderClient(afterSalesExpressRequest.getOrderClient());
request.setPartnerId(afterSalesExpressRequest.getPartnerId());
request.setOrderCode(afterSalesExpressRequest.getOrderId());
request.setAfterSalesCode(afterSalesExpressRequest.getAfterSalesCode());
request.setAdultRemark("用户填写快递单号");
request.setOperator(afterSalesExpressRequest.getOperator());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse response = orderSdkService.adultGoodsReturned(request, afterSalesExpressRequest.getTrackingNo());
return orderSdkAdapter.convent2BaseOrderResponse(response);
}
}
......@@ -405,4 +405,22 @@ public class OrderController {
return orderservice.queryTodayOrders(queryOrderByConditionsRequestVo);
}
/**
* 退货快递信息
*/
@ApiAnnotation(logMessage = "refundExpress")
@PostMapping("/refundExpress")
public BaseResponse refundExpress(@Validated @LogParams @RequestBody EditAfterSalesExpressVo editAfterSalesExpressVo) {
return mallOrderService.saveAfterSalesExpress(editAfterSalesExpressVo);
}
/**
* 拼团失败批量退款
*/
@ApiAnnotation(logMessage = "spellGroupBatchRefund")
@PostMapping("/spellGroupFailRefund")
public BaseResponse spellGroupFailRefund(@Validated @LogParams @RequestBody SpellGroupFailRefundVo refundVo) {
return orderservice.spellGroupOrderFailRefund(refundVo);
}
}
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;
import javax.validation.constraints.NotBlank;
/**
* 用户退货快递信息
*
* @author shichang.wang 2021/4/15
*/
@ApiModel("用户退货快递信息")
@Data
public class EditAfterSalesExpressVo {
@NotEmpty(message = "sessionId 不能为空")
private String sessionId;
@NotEmpty(message = "订单编号不能为空")
@ApiModelProperty("订单号")
private String oid;
@ApiModelProperty("商户ID")
private String partnerId;
/**
* 物流公司名称
*/
@NotEmpty(message = "物流公司名称不能为空")
@ApiModelProperty("物流公司名称")
private String expressChannelName;
/**
* 物流单号
*/
@NotEmpty(message = "物流单号 不能为空")
@ApiModelProperty("物流单号")
private String expressNo;
}
......@@ -12,9 +12,19 @@
*/
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 haibo.jiang 2019/11/20
* @author shichang.wang 2021/4/15
*/
@ApiModel("用户退款申请")
@Data
public class OrderRefundVo {
......@@ -30,4 +40,12 @@ public class OrderRefundVo {
private String partnerId;
/**
* 微商城退款方式
*
* @see cn.freemud.enums.RefundModeEnum
*/
@ApiModelProperty(value = "微商城退款方式", notes = RefundModeEnum.API_DOC)
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import java.util.List;
/**
* 拼团失败退款
*
* @author shichang.wang 2021/4/15
*/
@ApiModel("拼团失败退款")
@Data
public class SpellGroupFailRefundVo {
@NotEmpty(message = "团号不能为空")
@ApiModelProperty("团号")
private String spellGroupCode;
/**
* 原因
*/
@ApiModelProperty("原因")
private String reason;
/**
* 物流单号
*/
@NotEmpty(message = "订单号列表 不能为空")
@ApiModelProperty("订单号列表")
private List<String> orderCodeList;
}
package cn.freemud.enums;
import lombok.Getter;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 微商城退款方式
*/
@Getter
public enum RefundModeEnum {
REFUND_ALL((byte) 1, "退款退货"),
UN_REFUND_GOODS((byte) 2, "只退款不退货"),
;
private final Byte index;
private final String name;
RefundModeEnum(Byte index, String name) {
this.index = index;
this.name = name;
}
public static final String API_DOC = "微商城退款方式 1:退款退货 2:只退款不退货";
private static class EnumCacheHolder {
private static final Map<Byte, RefundModeEnum> CACHE;
static {
CACHE = Arrays.stream(RefundModeEnum.values()).collect(Collectors.toMap(RefundModeEnum::getIndex, v -> v));
}
}
public static RefundModeEnum getByIndex(Byte index) {
return EnumCacheHolder.CACHE.get(index);
}
}
......@@ -173,6 +173,8 @@ public enum ResponseResult {
STORE_SELF_ERROR("45069", "请选择截止营业时间大于45分钟下单"),
COUPON_INVALID("45070", "券已锁定,请先支付或取消待支付订单"),
ORDER_REFUND_EXPRESS_ERROR("45200", "售后单修改物流信息失败"),
/**
* 支付
......
......@@ -36,6 +36,7 @@ public interface ActivityService {
/**
* 根据不同的activityTypes 查询活动
*
* @param activityQueryDto
* @param activityTypeEnums
* @param goodsBeanDtoList
......@@ -43,4 +44,5 @@ public interface ActivityService {
*/
ActivityQueryResponseDto queryActivityByType(ActivityQueryDto activityQueryDto, List<ActivityTypeEnum> activityTypeEnums, List<ActivityQueryRequestDto.QueryGoodsBeanDto> goodsBeanDtoList);
}
......@@ -3,9 +3,7 @@ package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.OrderAffirmRequestVO;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EmptyTableNumberVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
......@@ -27,9 +25,9 @@ public interface MallOrderService {
* 创建订单
*/
BaseResponse createOrder(CreateOrderVo createOrderVo);
/**
* 订单确认完成
* 订单确认完成
*/
BaseResponse orderAffirm(OrderAffirmRequestVO requestVO);
......@@ -38,4 +36,13 @@ public interface MallOrderService {
*/
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
/**
* 保存退货物流信息
*
* @param editAfterSalesExpressVo
* @return
*/
BaseResponse saveAfterSalesExpress(EditAfterSalesExpressVo editAfterSalesExpressVo);
}
......@@ -4,7 +4,6 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.*;
import com.freemud.sdk.api.assortment.order.enums.OrderSdkType;
import java.util.Map;
......@@ -154,4 +153,11 @@ public interface Orderservice {
*/
BaseResponse queryTodayOrders(QueryOrderByConditionsRequestVo queryOrderByConditionsRequestVo);
/**
* 拼团失败退款
* @param refundVo
* @return
*/
BaseResponse spellGroupOrderFailRefund(SpellGroupFailRefundVo refundVo);
}
......@@ -32,11 +32,14 @@ import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.ResponseUtil;
import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformWxapp;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformWxappManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.deliverycenter.dto.ArriveDeliveryRequestDto;
......@@ -46,11 +49,13 @@ 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.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesStatus;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.POSOrderOperationBaseReq;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.request.order.*;
......@@ -66,9 +71,11 @@ import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -78,6 +85,9 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
@Slf4j
@Service
public class MallOrderServiceImpl implements MallOrderService {
......@@ -121,6 +131,8 @@ public class MallOrderServiceImpl implements MallOrderService {
private OrderSdkService orderSdkService;
@Autowired
private EcologyAdminApplicationClient ecologyAdminApplicationClient;
@Autowired
private AssortmentCustomerInfoManager customerInfoManager;
/**
* 创建订单
......@@ -764,4 +776,92 @@ public class MallOrderServiceImpl implements MallOrderService {
return thirdProductPropertyId;
}
@Override
public BaseResponse saveAfterSalesExpress(EditAfterSalesExpressVo editAfterSalesExpressVo) {
AssortmentCustomerInfoVo userInfo = customerInfoManager.getCustomerInfoByObject(editAfterSalesExpressVo.getSessionId());
if (userInfo == null || StringUtils.isEmpty(userInfo.getMemberId())) {
return ResponseUtil.error(ResponseResult.NOT_LOGIN);
}
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
baseQueryOrderRequest.setOrderId(editAfterSalesExpressVo.getOid());
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
QueryOrdersResponse.DataBean.OrderBean orderBean;
if (queryOrderByIdResponse == null || !RESPONSE_SUCCESS_CODE.equals(queryOrderByIdResponse.getErrcode()) || (orderBean = queryOrderByIdResponse.getData()) == null) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), "订单信息不存在");
}
// 检查参数
BaseResponse response = checkAfterSalesExpress(orderBean, userInfo.getMemberId());
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, response.getCode())) {
return response;
}
// 配送中,完成状态的,用户可填写
List<Integer> enableRefundExpressCodes = Arrays.asList(OrderStatus.DISTRIBUTION.getCode(), OrderStatus.COMPLETE.getCode());
if (enableRefundExpressCodes.contains(orderBean.getStatus()) && PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus())) {
EditAfterSalesExpressRequest editAfterSalesExpressRequest = new EditAfterSalesExpressRequest();
editAfterSalesExpressRequest.setPartnerId(orderBean.getCompanyId());
editAfterSalesExpressRequest.setStoreId(orderBean.getShopId());
editAfterSalesExpressRequest.setOrderId(orderBean.getOid());
editAfterSalesExpressRequest.setOrderClient(orderAdapter.getNewOrderClient(orderBean.getSource()));
editAfterSalesExpressRequest.setExpressNo(editAfterSalesExpressVo.getExpressNo());
editAfterSalesExpressRequest.setExpressChannelName(editAfterSalesExpressVo.getExpressChannelName());
BaseOrderResponse baseResponseDto = orderCenterSdkService.editAfterSalesExpress(editAfterSalesExpressRequest);
if (!RESPONSE_SUCCESS_CODE.equals(baseResponseDto.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), baseResponseDto.getErrmsg());
}
}
return ResponseUtil.success();
}
private BaseResponse checkAfterSalesExpress(QueryOrdersResponse.DataBean.OrderBean orderBean, String userId) {
if (!Objects.equals(userId, orderBean.getUserId())) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), "不能操作非本人的订单");
}
// 必须微商城订单
if (!OrderSourceType.SAASMALL.getCode().equalsIgnoreCase(orderBean.getSource())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "非商城订单不可填写");
}
// 检查售后单的状态
AfterSalesOrderResp afterSalesOrderResp = orderBean.getAfterSalesOrderResp();
if (afterSalesOrderResp == null) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "售后单不存在");
}
if (Objects.equals(AfterSalesStatus.PENDING.getIndex(), afterSalesOrderResp.getAfterSalesStatus())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "商家正在处理中,请稍后……");
}
if (!Objects.equals(AfterSalesStatus.RETURNING.getIndex(), afterSalesOrderResp.getAfterSalesStatus())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "未找到有效的售后单");
}
// 是否为 退款退货方式
AfterSalesOrderExtInfoVo afterSalesOrderExtInfoVo = getAfterSalesOrderExtInfoVo(afterSalesOrderResp);
log.debug("售后单信息方式为:{}", afterSalesOrderResp);
if (Objects.isNull(afterSalesOrderExtInfoVo) || !Objects.equals(RefundModeEnum.REFUND_ALL.getIndex(), afterSalesOrderExtInfoVo.getRefundMode())) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_EXPRESS_ERROR.getCode(), "当前退款方式无需填写");
}
return ResponseUtil.success();
}
private AfterSalesOrderExtInfoVo getAfterSalesOrderExtInfoVo(AfterSalesOrderResp afterSalesOrderResp) {
if (afterSalesOrderResp == null) {
return null;
}
AfterSalesOrderExtInfoVo afterSalesOrderExtInfoVo = null;
try {
afterSalesOrderExtInfoVo = JSON.parseObject(afterSalesOrderResp.getExtInfo(), new com.alibaba.fastjson.TypeReference<AfterSalesOrderExtInfoVo>() {
}.getType());
} catch (Exception e) {
log.error("解析售后单 extInfo 失败");
}
return afterSalesOrderExtInfoVo;
}
}
......@@ -53,6 +53,7 @@ import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.shoppingCart.CollageOrderDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.enums.OrderType;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.redis.RedisCache;
......@@ -66,6 +67,7 @@ import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
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.*;
......@@ -89,10 +91,6 @@ import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
......@@ -745,7 +743,7 @@ public class OrderServiceImpl implements Orderservice {
}
}
//订单状态
Integer status = orderBean.getRefundList().get(0).getStatus();
if (!Objects.equals(RefundStatus.ALREADY_REFUND.getCode(), status)) {
//不是退款中处理不处理
......@@ -2091,7 +2089,41 @@ public class OrderServiceImpl implements Orderservice {
if (OrderStatus.CALCEL.getCode().equals(orderBean.getStatus())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单已取消,无法退款");
}
if (OrderStatus.DISTRIBUTION.getCode().equals(orderBean.getStatus())) {
// 微商城订单
if (com.freemud.sdk.api.assortment.order.enums.OrderSourceType.SAASMALL.getCode().equalsIgnoreCase(orderBean.getSource())){
// 必须选择退款方式
if(Objects.isNull(orderRefundVo.getRefundMode()) || RefundModeEnum.getByIndex(orderRefundVo.getRefundMode()) == null){
return ResponseUtil.error(ResponseResult.PARAMETER_MISSING.getCode(), "请选择退款方式");
}
// 拼单类型 下单\待发货 只可选择只退款不退货
if (Objects.equals(OrderMarketType.COLLAGE.getIndex(),orderBean.getMarketingType())) {
OrderExtInfoDto orderExtInfoDto = JSON.parseObject(orderBean.getExtInfo(),OrderExtInfoDto.class);
String spellGroupCode;
if(Objects.isNull(orderExtInfoDto) || StringUtils.isBlank(spellGroupCode = orderExtInfoDto.getSpellGroupCode())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "未查询到团信息,请稍后重试");
}
// 查询活动信息
OrderSettlementResp settlement;
if(CollectionUtils.isEmpty(orderBean.getOrderSettlementDetailList())
|| Objects.isNull(settlement = orderBean.getOrderSettlementDetailList().stream().filter(e -> Objects.equals(OrderSettlementType.OTHER.getIndex(),e.getSettlementType())).findFirst().orElse(null))
|| StringUtils.isBlank(settlement.getExternalObjectId())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "未查询到活动信息");
}
// todo 查询团信息
}
// 接单 制作完成 下单 的只可以选择只退款不退货
List<Integer> unRefundGoodsCodes = Arrays.asList(
OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode(), OrderStatus.TAKE_ORDER.getCode());
if(unRefundGoodsCodes.contains(orderBean.getStatus())&& !Objects.equals(RefundModeEnum.UN_REFUND_GOODS.getIndex(), orderRefundVo.getRefundMode())){
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "还未发货,请选择只退款不退货");
}
}
// todo 这里直接拒绝?
else if (OrderStatus.DISTRIBUTION.getCode().equals(orderBean.getStatus())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单配送中,退款请联系售后!");
}
......@@ -2165,6 +2197,7 @@ public class OrderServiceImpl implements Orderservice {
boolean isRefundDeliveryFee = true;
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));
// todo 是否有配送费
// 0、null表示 关闭 ; 1 表示开启
if (null != refundDeliveryFeeConfig
&& Arrays.asList(OrderStatus.DISTRIBUTION.getCode(), OrderStatus.COMPLETE.getCode()).contains(orderBean.getStatus())
......@@ -2194,6 +2227,12 @@ public class OrderServiceImpl implements Orderservice {
}
cancelOrderRequest.setReason(orderRefundVo.getReason());
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
// 商城订单 增加拓展信息
if(orderRefundVo.getRefundMode() != null){
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
}
cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
......@@ -2265,6 +2304,12 @@ public class OrderServiceImpl implements Orderservice {
}
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
// 商城订单 增加拓展信息
if(orderRefundVo.getRefundMode() != null){
CancelOrderRequest.AfterSalesOrderExtInfoReq salesOrderExtInfoReq = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
salesOrderExtInfoReq.setRefundMode(orderRefundVo.getRefundMode());
cancelOrderRequest.setExtInfoReq(salesOrderExtInfoReq);
}
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");
......@@ -4097,4 +4142,101 @@ public class OrderServiceImpl implements Orderservice {
}
return ResponseUtil.success(result);
}
@Override
public BaseResponse spellGroupOrderFailRefund(SpellGroupFailRefundVo refundVo) {
log.info("拼团失败取消订单 -> refundVo:{}", refundVo);
List<String> orderCodeList = refundVo.getOrderCodeList();
if (CollectionUtils.isEmpty(orderCodeList) || orderCodeList.stream().anyMatch(StringUtils::isBlank)) {
return ResponseUtil.error(ResponseResult.PARAMETER_MISSING.getCode(), "订单号不能为空");
}
// 进行一次去重
orderCodeList = orderCodeList.stream().distinct().collect(Collectors.toList());
// todo 查询团信息 对比订单号是否正确
// 查询订单列表
QueryOrdersResponse orderListResp = getOrderList(orderCodeList);
if (!RESPONSE_SUCCESS_CODE.equals(orderListResp.getErrcode()) || orderListResp.getData() == null || CollectionUtils.isEmpty(orderListResp.getData().getOrders())) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), "订单信息不存在");
}
String string = JSONArray.toJSONString(orderListResp.getData().getOrders());
JSONArray jsonArray = JSONArray.parseArray(string);
List<OrderBean> orderBeanList = jsonArray.toJavaList(OrderBean.class);
// 前置检查
BaseResponse checkResponse = batchRefundBeforeCheck(orderCodeList, orderBeanList);
if (!RESPONSE_SUCCESS_CODE.equals(orderListResp.getErrcode())) {
return ResponseUtil.error(checkResponse.getCode(), checkResponse.getMessage());
}
// 循环处理
for (OrderBean orderBean : orderBeanList) {
if (Objects.equals(PayStatus.NOT_PAY.getCode(), orderBean.getPayStatus())
|| Objects.equals(OrderStatus.WAIT_PAY.getCode(), orderBean.getStatus())) {
log.info("拼团失败取消订单 -> 订单未支付,无需退款 团号:{}, 订单号:{} ", refundVo.getSpellGroupCode(), orderBean.getOid());
continue;
}
if (OrderStatus.CALCEL.getCode().equals(orderBean.getStatus())) {
log.info("拼团失败取消订单 -> 订单已取消,无需退款 团号:{}, 订单号:{} ", refundVo.getSpellGroupCode(), orderBean.getOid());
continue;
}
// 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);
// 放入缓存等待重试
}
}
return ResponseUtil.success();
}
private QueryOrdersResponse getOrderList(List<String> orderCodeList) {
BatchQueryByCodesRequest baseQueryOrderRequest = new BatchQueryByCodesRequest();
baseQueryOrderRequest.setOrderCodes(orderCodeList);
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
return orderCenterSdkService.batchQueryByCodes(baseQueryOrderRequest);
}
private BaseResponse batchRefundBeforeCheck(List<String> orderCodeList, List<OrderBean> orderBeans) {
List<String> notFoundCodeList = new ArrayList<>(orderCodeList);
List<String> notSupportOrderCodeList = new ArrayList<>(orderCodeList.size());
for (OrderBean orderBean : orderBeans) {
notFoundCodeList.remove(orderBean.getOid());
if (!Objects.equals(com.freemud.sdk.api.assortment.order.enums.OrderSourceType.SAASMALL.getCode(), orderBean.getSource())) {
notSupportOrderCodeList.add(orderBean.getOid());
}
}
StringBuilder builder = new StringBuilder();
if (!notFoundCodeList.isEmpty()) {
builder.append(String.format("部分订单信息不存在:%s ,", JSON.toJSONString(notFoundCodeList)));
}
if (!notSupportOrderCodeList.isEmpty()) {
builder.append(String.format("非微商城订单:%s", JSON.toJSONString(notSupportOrderCodeList)));
}
if (builder.length() != 0) {
return ResponseUtil.error(ResponseResult.ORDER_QUERYORDER_ERROR.getCode(), builder.toString());
}
return ResponseUtil.success();
}
}
......@@ -63,6 +63,8 @@ public class InterfaceAddressConstant {
public static final String ADULT_REFUND_COMPLETE = "/afterSales/v2/adultRefundComplete";
//售后单审核-拒绝申请
public static final String REFUND_REJECT = "afterSales/v2/adultReject";
//售后单审核-退货完成
public static final String ADULT_GOODS_RETURNED = "afterSales/v2/adultGoodsReturned";
//根据综合条件查询订单
......
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: AfterSalesOperateReq
* @Package com.freemud.application.sdk.api.ordercenter.request
* @Description:
* @author: ping.wu
* @date: 2019/4/3 19:54
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package com.freemud.application.sdk.api.ordercenter.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.NotEmpty;
@EqualsAndHashCode(callSuper = true)
@Data
public class AfterSalesExpressOperateReq extends AfterSalesOperateReq{
/**
* 物流公司名称
*/
private String expressChannelName;
/**
* 物流单号
*/
private String expressNo;
}
......@@ -70,4 +70,9 @@ public class OrderCancelReq {
//任务
private OrderTaskReq orderTask;
/**
* 拓展信息
*/
private String extInfo;
}
......@@ -195,5 +195,10 @@ public class OrderExtInfoDto {
private String svcCardCode;
/**
* 团号
*/
private String spellGroupCode;
}
......@@ -937,4 +937,16 @@ public class OrderSdkService {
return responseHandle(responseDTO);
}
/**
* 修改订单extinfo信息
*/
public BaseResponse adultGoodsReturned(AfterSalesExpressOperateReq request, String trackingNo) {
OrderBaseResp responseDTO = RequestThirdPartyUtils.httpJsonReqComplexNew(restTemplate, InterfaceAddressConstant.ADULT_GOODS_RETURNED,
createBaseRequest(request, trackingNo), new ParameterizedTypeReference<OrderBaseResp>() {
});
return responseHandle(responseDTO);
}
}
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