zhangxin 1 неделя назад
Родитель
Сommit
54664781e8
21 измененных файлов с 1258 добавлено и 8 удалено
  1. 50 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ChannelType.java
  2. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java
  3. 45 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/OmsOrderRefundSkuVo.java
  4. 37 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/RefundOrderPushStatusVo.java
  5. 197 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/RefundOrderPushVo.java
  6. 21 0
      yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/OrderRefundCancelVo.java
  7. 51 0
      yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/OrderRefundExpressParamVo.java
  8. 27 0
      yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/Result.java
  9. 107 0
      yami-shop-common/src/main/java/com/yami/shop/common/enums/SMQJHResultCode.java
  10. 13 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/Arith.java
  11. 61 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/smqjh/XSBRefundOrderController.java
  12. 8 0
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java
  13. 2 0
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java
  14. 3 0
      yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java
  15. 53 8
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java
  16. 17 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBPushRefundOrderService.java
  17. 30 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBRefundOrderService.java
  18. 86 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBPushRefundOrderServiceImpl.java
  19. 438 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBRefundOrderServiceImpl.java
  20. 3 0
      yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml
  21. 3 0
      yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml

+ 50 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ChannelType.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.enums;
+
+
+/**
+ * 优惠券类型 1:代金券 2:折扣券 3:兑换券
+ * @author LGH
+ */
+public enum ChannelType {
+
+    /**
+     * 本渠道数据
+     */
+    CURRENT_CHANNEL(0),
+
+    /**
+     * 市民请集合
+     */
+    SMQJH(1),
+    ;
+
+    private Integer num;
+
+    public Integer value() {
+        return num;
+    }
+
+    ChannelType(Integer num){
+        this.num = num;
+    }
+
+    public static ChannelType instance(Integer value) {
+        ChannelType[] enums = values();
+        for (ChannelType statusEnum : enums) {
+            if (statusEnum.value().equals(value)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java

@@ -190,5 +190,11 @@ public class OrderRefund implements Serializable{
     @ApiModelProperty(value = "退款商品详情")
     private List<OrderRefundSku> orderRefundSkuList;
 
+    /**
+     * 渠道类型  0-本渠道 1-市民请集合
+     */
+    @ApiModelProperty(value = "渠道类型  0-本渠道 1-市民请集合")
+    private Integer channelType;
+
 
 }

+ 45 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/OmsOrderRefundSkuVo.java

@@ -0,0 +1,45 @@
+package com.yami.shop.bean.vo.xsb;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 推送到星闪豹退款订单请求参数
+ * @author kaur
+ */
+@Data
+public class OmsOrderRefundSkuVo {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+    /**
+     * 商品id
+     */
+    private Long skuId;
+    /**
+     * 第三方商品id
+     */
+    private Long thirdSkuId;
+    /**
+     * 退款商品数量
+     */
+    private Integer productCount;
+    /**
+     * 退款单ID
+     */
+    private Long orderRefundId;
+    /**
+     * 商品单价
+     */
+    private BigDecimal skuPrice;
+    /**
+     * 订单项id
+     */
+    private Long orderItemId;
+
+
+}

+ 37 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/RefundOrderPushStatusVo.java

@@ -0,0 +1,37 @@
+package com.yami.shop.bean.vo.xsb;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+/**
+ * 推送到星闪豹退款订单状态
+ * @author kaur
+ */
+@Data
+public class RefundOrderPushStatusVo {
+
+    /**
+     * 市民请集合退款编号
+     */
+    private String refundNumber;
+
+    /**
+     * 市民请集合退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
+     */
+    private Integer returnMoneySts;
+    /**
+     * 申请类型:1,仅退款,2退款退货,5差价退款
+     */
+    private Integer applyType;
+    /**
+     * 拒绝原因
+     */
+    private String rejectMessage;
+
+
+
+}

+ 197 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/xsb/RefundOrderPushVo.java

@@ -0,0 +1,197 @@
+package com.yami.shop.bean.vo.xsb;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+/**
+ * 推送到星闪豹退款订单请求参数
+ * @author kaur
+ */
+@Data
+public class RefundOrderPushVo {
+
+    /**
+     * 市民请集合退款编号
+     */
+    private String refundNumber;
+    /**
+     * 店铺ID
+     */
+    private Long shopId;
+    /**
+     * 第三方店铺ID
+     */
+    private Long thirdShopId;
+
+    /**
+     * 市民请集合买家ID
+     */
+    private Long memberId;
+    /**
+     * 市民请集合订单单号
+     */
+    private String orderNumber;
+    /**
+     * 市民请集合退款单类型(1:整单退款,2:单个物品退款)
+     */
+    private Integer refundType;
+    /**
+     * 市民请集合退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
+     */
+    private Integer returnMoneySts;
+    /**
+     * 市民请集合退款金额
+     */
+    private BigDecimal refundAmount;
+    /**
+     * 市民请集合退款编号市民请集合申请类型:1,仅退款,2退款退货,5差价退款
+     */
+    private Integer applyType;
+    /**
+     * 市民请集合是否接收到商品(1:已收到,0:未收到)
+     */
+    private Integer isReceiver;
+    /**
+     * 市民请集合申请原因
+     */
+    private String buyerReason;
+    /**
+     * 市民请集合申请说明
+     */
+    private String buyerDesc;
+    /**
+     * 市民请集合联系方式(退款时留下的手机号码)
+     */
+    private String buyerMobile;
+    /**
+     * 市民请集合拒绝原因
+     */
+    private String rejectMessage;
+    /**
+     * 市民请集合卖家备注
+     */
+    private String sellerMsg;
+    /**
+     * 市民请集合申请时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format  = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime applyTime;
+    /**
+     * 市民请集合发货时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format  = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime shipTime;
+    /**
+     * 市民请集合收货时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format  = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime receiveTime;
+    /**
+     * 市民请集合撤销时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format  = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime cancelTime;
+    /**
+     * 市民请集合订单运费
+     */
+    private BigDecimal freightAmount;
+    /**
+     * 该退款单是否处理完成
+     */
+    private Integer handler;
+    /**
+     * 是否填写了退货物流信息(1:已填写,0:未填写)
+     */
+    private Integer isReturnLogistics;
+    /**
+     * 退款总金额
+     */
+    private BigDecimal refundTotalMoney;
+    /**
+     * 收货人姓名
+     */
+    private String consigneeName;
+    /**
+     * 收货人电话
+     */
+    private String consigneeMobile;
+    /**
+     * 收货人地址
+     */
+    private String consigneeAddress;
+    /**
+     * 商品信息
+     */
+    private List<OmsOrderRefundSkuVo> orderRefundSkuList;
+    /**
+     * 订单id
+     */
+    private Long orderId;
+    /**
+     * 文件凭证json
+     */
+    private String photoFiles;
+
+    /**
+     * 退款数量
+     */
+    private Integer  GoodsNum;
+
+    /**
+     * 渠道类型 1-市民请集合
+     */
+    private Integer channelType;
+
+    @Override
+    public String toString() {
+        return "RefundOrderPushVo{" +
+                "refundNumber='" + refundNumber + '\'' +
+                ", shopId=" + shopId +
+                ", thirdShopId=" + thirdShopId +
+                ", memberId=" + memberId +
+                ", orderNumber='" + orderNumber + '\'' +
+                ", refundType=" + refundType +
+                ", returnMoneySts=" + returnMoneySts +
+                ", refundAmount=" + refundAmount +
+                ", applyType=" + applyType +
+                ", isReceiver=" + isReceiver +
+                ", buyerReason='" + buyerReason + '\'' +
+                ", buyerDesc='" + buyerDesc + '\'' +
+                ", buyerMobile='" + buyerMobile + '\'' +
+                ", rejectMessage='" + rejectMessage + '\'' +
+                ", sellerMsg='" + sellerMsg + '\'' +
+                ", applyTime=" + applyTime +
+                ", shipTime=" + shipTime +
+                ", receiveTime=" + receiveTime +
+                ", cancelTime=" + cancelTime +
+                ", freightAmount=" + freightAmount +
+                ", handler=" + handler +
+                ", isReturnLogistics=" + isReturnLogistics +
+                ", refundTotalMoney=" + refundTotalMoney +
+                ", consigneeName='" + consigneeName + '\'' +
+                ", consigneeMobile='" + consigneeMobile + '\'' +
+                ", consigneeAddress='" + consigneeAddress + '\'' +
+                ", orderRefundSkuList=" + orderRefundSkuList +
+                ", orderId=" + orderId +
+                ", photoFiles='" + photoFiles + '\'' +
+                ", GoodsNum=" + GoodsNum +
+                ", channelType=" + channelType +
+                '}';
+    }
+}

+ 21 - 0
yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/OrderRefundCancelVo.java

@@ -0,0 +1,21 @@
+package com.yami.shop.common.bean.smqjh;
+
+import lombok.Data;
+
+@Data
+public class OrderRefundCancelVo {
+
+    /**
+     * 退款编号名称
+     */
+
+    private String refundSn;
+
+    /**
+     * 用户编号
+     */
+
+    private Long userId;
+
+
+}

+ 51 - 0
yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/OrderRefundExpressParamVo.java

@@ -0,0 +1,51 @@
+package com.yami.shop.common.bean.smqjh;
+
+import lombok.Data;
+
+@Data
+public class OrderRefundExpressParamVo {
+
+    /**
+     * 退款编号名称
+     */
+
+    private String refundSn;
+
+    /**
+     * 物流公司id
+     */
+
+    private Long expressId;
+
+    /**
+     * 物流公司名称
+     */
+    private String expressName;
+
+    /**
+     * 物流单号
+     */
+    private String expressNo;
+
+    /**
+     * 手机号码
+     */
+    private String mobile;
+
+    /**
+     * 备注信息
+     */
+    private String senderRemarks;
+
+    /**
+     * 图片举证
+     */
+    private String imgs;
+    /**
+     * 用户编号
+     */
+    private Long memberId;
+
+
+
+}

+ 27 - 0
yami-shop-common/src/main/java/com/yami/shop/common/bean/smqjh/Result.java

@@ -0,0 +1,27 @@
+package com.yami.shop.common.bean.smqjh;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 统一响应结构体
+ * 市民请集合的返回实体
+ * @author haoxr
+ * @since 2022/1/30
+ **/
+
+
+@Data
+public class Result<T> implements Serializable {
+    /**
+     * 返回状态码
+     */
+    private String code;
+    /**
+     * 返回数据对象
+     */
+    private T data;
+
+    private String msg;
+}

+ 107 - 0
yami-shop-common/src/main/java/com/yami/shop/common/enums/SMQJHResultCode.java

@@ -0,0 +1,107 @@
+package com.yami.shop.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 自定义响应码
+ *
+ * @author haoxr
+ * @since 2020-06-23
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+public enum SMQJHResultCode implements   Serializable {
+
+    SUCCESS("00000", "success"),
+
+    USER_ERROR("A0001", "用户端错误"),
+    USER_LOGIN_ERROR("A0200", "用户登录异常"),
+
+    USER_NOT_EXIST("A0201", "用户不存在"),
+    USER_ACCOUNT_LOCKED("A0202", "用户账户被冻结"),
+    USER_ACCOUNT_INVALID("A0203", "用户账户已作废"),
+
+    USERNAME_OR_PASSWORD_ERROR("A0210", "用户名或密码错误"),
+    PASSWORD_ENTER_EXCEED_LIMIT("A0211", "用户输入密码次数超限"),
+    CLIENT_AUTHENTICATION_FAILED("A0212", "客户端认证失败"),
+    TOKEN_INVALID("A0230", "token无效或已过期"),
+    TOKEN_ACCESS_FORBIDDEN("A0231", "token已被禁止访问"),
+
+    AUTHORIZED_ERROR("A0300", "访问权限异常"),
+    ACCESS_UNAUTHORIZED("A0301", "访问未授权"),
+    FORBIDDEN_OPERATION("A0302", "演示环境禁止新增、修改和删除重要数据,请本地部署后测试"),
+    REPEAT_SUBMIT_ERROR("A0303", "您的请求已提交,请不要重复提交或等待片刻再尝试。"),
+
+    PARAM_ERROR("A0400", "用户请求参数错误"),
+    RESOURCE_NOT_FOUND("A0401", "请求资源不存在"),
+    PARAM_IS_NULL("A0410", "请求必填参数为空"),
+
+    USER_UPLOAD_FILE_ERROR("A0700", "用户上传文件异常"),
+    USER_UPLOAD_FILE_TYPE_NOT_MATCH("A0701", "用户上传文件类型不匹配"),
+    USER_UPLOAD_FILE_SIZE_EXCEEDS("A0702", "用户上传文件太大"),
+    USER_UPLOAD_IMAGE_SIZE_EXCEEDS("A0703", "用户上传图片太大"),
+
+    SYSTEM_EXECUTION_ERROR("B0001", "系统执行出错"),
+    SYSTEM_EXECUTION_TIMEOUT("B0100", "系统执行超时"),
+    SYSTEM_ORDER_PROCESSING_TIMEOUT("B0100", "系统订单处理超时"),
+
+    SYSTEM_DISASTER_RECOVERY_TRIGGER("B0200", "系统容灾功能被触发"),
+    FLOW_LIMITING("B0210", "系统限流"),
+    DEGRADATION("B0220", "系统功能降级"),
+
+    SYSTEM_RESOURCE_ERROR("B0300", "系统资源异常"),
+    SYSTEM_RESOURCE_EXHAUSTION("B0310", "系统资源耗尽"),
+    SYSTEM_RESOURCE_ACCESS_ERROR("B0320", "系统资源访问异常"),
+    SYSTEM_READ_DISK_FILE_ERROR("B0321", "系统读取磁盘文件失败"),
+
+    CALL_THIRD_PARTY_SERVICE_ERROR("C0001", "调用第三方服务出错"),
+    MIDDLEWARE_SERVICE_ERROR("C0100", "中间件服务出错"),
+    INTERFACE_NOT_EXIST("C0113", "接口不存在"),
+
+    MESSAGE_SERVICE_ERROR("C0120", "消息服务出错"),
+    MESSAGE_DELIVERY_ERROR("C0121", "消息投递出错"),
+    MESSAGE_CONSUMPTION_ERROR("C0122", "消息消费出错"),
+    MESSAGE_SUBSCRIPTION_ERROR("C0123", "消息订阅出错"),
+    MESSAGE_GROUP_NOT_FOUND("C0124", "消息分组未查到"),
+
+    DATABASE_ERROR("C0300", "数据库服务出错"),
+    DATABASE_TABLE_NOT_EXIST("C0311", "表不存在"),
+    DATABASE_COLUMN_NOT_EXIST("C0312", "列不存在"),
+    DATABASE_DUPLICATE_COLUMN_NAME("C0321", "多表关联中存在多个相同名称的列"),
+    DATABASE_DEADLOCK("C0331", "数据库死锁"),
+    DATABASE_PRIMARY_KEY_CONFLICT("C0341", "主键冲突");
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    private String code;
+
+    private String msg;
+
+    @Override
+    public String toString() {
+        return "{" +
+                "\"code\":\"" + code + '\"' +
+                ", \"msg\":\"" + msg + '\"' +
+                '}';
+    }
+
+
+    public static SMQJHResultCode getValue(String code){
+        for (SMQJHResultCode value : values()) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return SYSTEM_EXECUTION_ERROR; // 默认系统执行错误
+    }
+}

+ 13 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/Arith.java

@@ -18,6 +18,8 @@ public class Arith {
     /**
      * 默认除法运算精度
      */
+
+    private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
     private static final int DEF_DIV_SCALE = 10;
 
     /**
@@ -157,4 +159,15 @@ public class Arith {
         BigDecimal b2 = new BigDecimal(Double.toString(v2));
         return Objects.equals(b1,b2);
     }
+    /**
+     * 分转元(指定小数位数)
+     */
+    public static BigDecimal fenToYuan(Long fen, int scale) {
+        if (fen == null) {
+            return BigDecimal.ZERO.setScale(scale, RoundingMode.HALF_UP);
+        }
+        return new BigDecimal(fen)
+                .divide(ONE_HUNDRED, scale, RoundingMode.HALF_UP);
+    }
+
 }

+ 61 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/smqjh/XSBRefundOrderController.java

@@ -0,0 +1,61 @@
+
+package com.yami.shop.platform.controller.smqjh;
+
+import com.yami.shop.bean.vo.xsb.RefundOrderPushVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundCancelVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundExpressParamVo;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.xsb.XSBRefundOrderService;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.UUID;
+
+/**
+ * 星闪豹数据同步问题
+ *
+ * @author FBJ
+ * @version 1.0.0
+ * @since 2025-12-15
+ */
+@RestController
+@RequestMapping("/platform/xsb/refund")
+@AllArgsConstructor
+@Log4j2
+public class XSBRefundOrderController {
+
+
+    private final XSBRefundOrderService xsbRefundOrderService;
+
+
+    /**
+     * 同步退款订单数据
+     */
+    @PostMapping("/applyAfterSales")
+    public R<String> applyAfterSales(@RequestBody RefundOrderPushVo refundOrderPushVo) {
+        String string = UUID.randomUUID().toString();
+        log.info("【"+string+"】"+"接收第三方退款订单推送{}",refundOrderPushVo);
+        return  xsbRefundOrderService.applyAfterSales(refundOrderPushVo);
+    }
+
+    /**
+     * 修改物流信息
+     */
+    @PostMapping("/updateExpress")
+    public R<String> updateExpress(@RequestBody OrderRefundExpressParamVo orderRefundExpressParamVo) {
+        return  xsbRefundOrderService.updateExpress(orderRefundExpressParamVo);
+    }
+
+    /**
+     * 取消退款订单申请
+     */
+    @GetMapping("/cancel")
+    public R<String> cancel(OrderRefundCancelVo orderRefundCancelVo) {
+        return  xsbRefundOrderService.cancel(orderRefundCancelVo);
+    }
+
+
+}

+ 8 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java

@@ -32,6 +32,14 @@ public interface OrderItemMapper extends BaseMapper<OrderItem> {
 
     Integer refundCount(Long orderItemId);
 
+    /**
+     * 根据第三方的skuId和订单号查询订单项信息
+     * @param skuId
+     * @param orderNumber
+     * @return
+     */
+    OrderItem findBySkuIdAndOrderNumber(@Param("skuId")Long skuId,@Param("orderNumber") String orderNumber);
+
 //    List<OrderItem> getUnCloseRefundOrderItemByOrderNumber(String orderNumber);
 
 //	void insertBatch(List<OrderItem> orderItems);

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java

@@ -25,6 +25,7 @@ import com.yami.shop.bean.vo.OrderRefundVo;
 import com.yami.shop.common.util.PageParam;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -113,4 +114,5 @@ public interface OrderRefundMapper extends BaseMapper<OrderRefund> {
 
     Integer queryRemainGoodsNumber(String orderNumber);
 
+    BigDecimal countRefundMoney(@Param("orderId")Long orderId, @Param("returnMoneySts")Integer returnMoneySts);
 }

+ 3 - 0
yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java

@@ -20,6 +20,7 @@ import com.yami.shop.common.util.hb.HBR;
 import org.apache.ibatis.annotations.Param;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -224,4 +225,6 @@ public interface OrderRefundService extends IService<OrderRefund> {
     R<String> export(OrderRefundStaisticsParam orderRefund, Long userId);
 
     Integer queryRemainGoodsNumber(String orderNumber);
+
+    BigDecimal countRefundMoney(Long orderId, Integer value);
 }

+ 53 - 8
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -32,12 +32,13 @@ import com.yami.shop.common.enums.PayType;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.HttpUtil;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
 import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.dao.*;
 import com.yami.shop.service.*;
-import com.yami.shop.service.hb.impl.HBOrderService;
+import com.yami.shop.service.xsb.XSBPushRefundOrderService;
 import com.yami.shop.utils.ExportUtils;
 import com.yami.shop.utils.HBSignUtil;
 import lombok.AllArgsConstructor;
@@ -49,14 +50,11 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.streaming.SXSSFSheet;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
-
-import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -102,6 +100,9 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     @Autowired
     private ExportTaskService exportTaskService;
 
+    @Autowired
+    private XSBPushRefundOrderService xsbPushRefundOrderService;
+
     //导出
     // 线程池配置
     private final ExecutorService exportExecutor = Executors.newFixedThreadPool(
@@ -1101,7 +1102,13 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             if (orderRefund.getReturnMoneySts().equals(70)) {
                 //推送商家审核状态后 同步退款单状态
                 changeStatus(orderRefund.getRefundSn(), orderRefund.getReturnMoneySts());
-                orderService.returnRefund(orderRefund.getOrderNumber());
+                if (ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+                    //当属于市民请集合的订单的时候,直接回推市民请集合进行退款逻辑处理;
+                    HttpUtil.get("http://192.168.1.166:8080/api/v1/xsb/handleRefund/"+orderRefund.getRefundSn());
+
+                }else {
+                    orderService.returnRefund(orderRefund.getOrderNumber());
+                }
             }
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
@@ -1164,12 +1171,28 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             }
 
             if (applyDeal == 1) {
-                //订单退款金额或者积分处理
-                orderService.returnRefund(orderRefund.getOrderNumber());
+                if (ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+
+                }else {
+                    //订单退款金额或者积分处理
+                    orderService.returnRefund(orderRefund.getOrderNumber());
+                }
             }
 
             //推送商家审核状态后 同步退款单状态
             changeStatus(orderRefund.getRefundSn(), orderRefund.getReturnMoneySts());
+            try {
+                if (ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+                    R<String> stringR = xsbPushRefundOrderService.pushRefundStatus(orderRefund);
+                    if (!stringR.isSuccess()){
+                        log.error("推送市民请集合审核状态失败,{},{}",stringR.getMsg(),JSONObject.toJSON(stringR));
+                    }
+                    log.info("推送市民请集合审核状态成功");
+                }
+
+            } catch (Exception e) {
+                log.error("推送市民请集合审核状态报错,{}",e);
+            }
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
             HBR.error("未知异常");
@@ -1203,7 +1226,18 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             }
             orderRefundMapper.updateById(orderRefund);
 
-
+            try {
+                if (ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+                    //当属于市民请集合的订单的时候,直接回推市民请集合进行退款逻辑处理;
+                    R<String> stringR = xsbPushRefundOrderService.pushRefundStatus(orderRefund);
+                    if (!stringR.isSuccess()){
+                        log.error("推送市民请集合收货状态失败,{},{}",stringR.getMsg(),JSONObject.toJSON(stringR));
+                    }
+                    log.info("推送市民请集合收货状态成功");
+                }
+            } catch (Exception e) {
+                log.error("推送市民请集合收货状态报错,{}",e);
+            }
             //订单退款金额或者积分处理
             orderService.returnRefund(orderRefund.getOrderNumber());
 
@@ -1653,5 +1687,16 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         return orderRefundMapper.queryRemainGoodsNumber(orderNumber);
     }
 
+    /**
+     * 根据订单号查询退款类型的金额
+     * @param orderId
+     * @param value
+     * @return
+     */
+    @Override
+    public BigDecimal countRefundMoney(Long orderId, Integer value) {
+        return orderRefundMapper.countRefundMoney(orderId,value);
+    }
+
 
 }

+ 17 - 0
yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBPushRefundOrderService.java

@@ -0,0 +1,17 @@
+package com.yami.shop.service.xsb;
+
+import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundCancelVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundExpressParamVo;
+import com.yami.shop.common.util.R;
+
+public interface XSBPushRefundOrderService {
+
+    /**
+     * 进行推送退款状态变更
+     * @param orderRefund
+     * @return
+     */
+    R<String> pushRefundStatus(OrderRefund orderRefund);
+}

+ 30 - 0
yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBRefundOrderService.java

@@ -0,0 +1,30 @@
+package com.yami.shop.service.xsb;
+
+import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushStatusVo;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundCancelVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundExpressParamVo;
+import com.yami.shop.common.util.R;
+import org.springframework.http.ResponseEntity;
+
+public interface XSBRefundOrderService {
+    /**
+     * 进行推送退款订单
+     * @param refundOrderPushVo
+     * @return
+     */
+    R<String> applyAfterSales(RefundOrderPushVo refundOrderPushVo);
+
+    /**
+     * 同步物流修改信息
+     * @param orderRefundExpressParam
+     * @return
+     */
+    R<String> updateExpress(OrderRefundExpressParamVo orderRefundExpressParam);
+    /**
+     * 取消订单
+     * @return
+     */
+    R<String> cancel(OrderRefundCancelVo orderRefundCancelVo);
+}

+ 86 - 0
yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBPushRefundOrderServiceImpl.java

@@ -0,0 +1,86 @@
+package com.yami.shop.service.xsb.impl;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.dto.OrderRefundDto;
+import com.yami.shop.bean.enums.*;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.vo.xsb.OmsOrderRefundSkuVo;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushStatusVo;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundCancelVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundExpressParamVo;
+import com.yami.shop.common.bean.smqjh.Result;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.enums.SMQJHResultCode;
+import com.yami.shop.common.exception.GlobalException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.HttpUtil;
+import com.yami.shop.common.util.R;
+import com.yami.shop.common.util.RefundSnUtils;
+import com.yami.shop.dao.*;
+import com.yami.shop.service.OrderRefundService;
+import com.yami.shop.service.OrderService;
+import com.yami.shop.service.xsb.XSBPushRefundOrderService;
+import com.yami.shop.utils.CullenUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class XSBPushRefundOrderServiceImpl implements XSBPushRefundOrderService {
+
+    @Autowired
+    PointsRecordMapper pointsRecordMapper;
+
+
+
+    /**
+     * 推送市民请集合状态
+     * @param orderRefund
+     * @return
+     */
+    @Override
+    public R<String> pushRefundStatus(OrderRefund orderRefund) {
+        if (orderRefund==null){
+            return R.FAIL("退款订单信息不存在");
+        }
+        if (!ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+            return R.FAIL("退款订单信息不属于市民请集合订单,不允许推送");
+        }
+        RefundOrderPushStatusVo refundOrderPushStatusVo = new RefundOrderPushStatusVo();
+        refundOrderPushStatusVo.setRefundNumber(orderRefund.getOrderNumber());
+        refundOrderPushStatusVo.setReturnMoneySts(orderRefund.getReturnMoneySts());
+        refundOrderPushStatusVo.setApplyType(orderRefund.getApplyType());
+        String post = HttpUtil.post("http://192.168.1.166:8114/api/v1/xsb/receiveRefundStatus", orderRefund);
+        if (StringUtils.isNotEmpty(post)){
+            Result result = JSONObject.parseObject(post, Result.class);
+            if (result==null){
+                return R.FAIL("推送订单状态返回失败,返回信息为空");
+            }
+            if (!SMQJHResultCode.SUCCESS.getCode().equals(result.getCode())){
+                return R.FAIL("推送订单状态返回失败:"+result.getMsg());
+            }
+        }
+        return R.SUCCESS();
+    }
+
+
+
+
+}

+ 438 - 0
yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBRefundOrderServiceImpl.java

@@ -0,0 +1,438 @@
+package com.yami.shop.service.xsb.impl;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.param.OrderRefundExpressParam;
+import com.yami.shop.bean.dto.OrderRefundDto;
+import com.yami.shop.bean.enums.*;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.vo.xsb.OmsOrderRefundSkuVo;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushStatusVo;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundCancelVo;
+import com.yami.shop.common.bean.smqjh.OrderRefundExpressParamVo;
+import com.yami.shop.common.bean.smqjh.Result;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.enums.SMQJHResultCode;
+import com.yami.shop.common.exception.GlobalException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.HttpUtil;
+import com.yami.shop.common.util.R;
+import com.yami.shop.common.util.RefundSnUtils;
+import com.yami.shop.dao.*;
+import com.yami.shop.service.*;
+import com.yami.shop.service.xsb.XSBRefundOrderService;
+import com.yami.shop.utils.CullenUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class XSBRefundOrderServiceImpl implements XSBRefundOrderService {
+
+    @Autowired
+    private  SkuMapper skuMapper;//商品sku
+    @Autowired
+    private ShopDetailMapper shopDetailMapper;//门店详情信息
+    @Autowired
+    private OrderMapper orderMapper;//订单信息
+
+    @Lazy
+    @Autowired
+    private OrderRefundService orderRefundService;
+
+    private final OrderRefundSkuMapper orderRefundSkuMapper;
+
+    private final OrderService orderService;
+
+    @Autowired
+    private OrderItemMapper orderItemMapper;
+    @Autowired
+    PointsRecordMapper pointsRecordMapper;
+
+    private final OrderRefundRecordMapper orderRefundRecordMapper;
+    @Autowired
+    private RefundDeliveryMapper refundDeliveryMapper;
+
+
+
+
+    /**
+     * 申请退款订单
+     * @param refundOrderPushVo
+     * @return
+     */
+    @Transactional
+    @Override
+    public R<String> applyAfterSales(RefundOrderPushVo refundOrderPushVo) {
+        R<String> stringR = checkParameter(refundOrderPushVo);
+        if (!stringR.isSuccess()){
+            return stringR;
+        }
+        log.info("渠道推送申请退款参数:{}",refundOrderPushVo);
+        List<OrderRefundSku> orderRefundSkuList = new ArrayList<>();
+        List<OmsOrderRefundSkuVo> omsOrderRefundSkuVos = refundOrderPushVo.getOrderRefundSkuList();
+        for (OmsOrderRefundSkuVo omsOrderRefundSkuVo : omsOrderRefundSkuVos) {
+            OrderItem orderItem =  orderItemMapper.findBySkuIdAndOrderNumber(omsOrderRefundSkuVo.getSkuId(),refundOrderPushVo.getOrderNumber());//由于王明推送订单时并没有在第三方(市民请集合)保存本系统id,并且直接将那边的skuId等相关信息直接传输过来,导致只能根据第三方的skuId和订单编号信息去进行查询
+            if (orderItem==null){
+                return R.FAIL("订单项;渠道订单项id:"+omsOrderRefundSkuVo.getId()+";不存在");
+            }
+            OrderRefundSku orderRefundSku = new OrderRefundSku();
+            orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
+            orderRefundSku.setSkuId(omsOrderRefundSkuVo.getThirdSkuId());
+            orderRefundSku.setSkuPrice(omsOrderRefundSkuVo.getSkuPrice().setScale(2, RoundingMode.HALF_UP).doubleValue());
+            orderRefundSku.setProductCount(omsOrderRefundSkuVo.getProductCount());
+            orderRefundSkuList.add(orderRefundSku);
+        }
+        CullenUtils.validateDataThrowException(omsOrderRefundSkuVos.isEmpty(), "退款商品不能为空...");
+        // 获取订单信息
+        Order order = orderService.getOrderByOrderNumber(refundOrderPushVo.getOrderNumber());
+
+        if (order==null){
+            return R.FAIL("渠道推送申请退款:订单不存在");
+        }
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            return R.FAIL("渠道推送申请退款:当前订单还未付款,无法申请");
+        }
+
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.CLOSE.value())) {
+            return R.FAIL("渠道推送申请退款:当前订单已失败,不允许退款");
+        }
+
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.WAIT_GROUP.value())) {
+            return R.FAIL("渠道推送申请退款:当前订单正在等待成团状态,需等待成团才能进行下一步操作");
+        }
+
+        if (refundOrderPushVo.getRefundAmount() .compareTo(BigDecimal.valueOf(order.getActualTotal()))>0) {
+            return R.FAIL("渠道推送申请退款:退款金额已超出订单金额,无法申请");
+        }
+
+        if (!orderRefundService.checkRefundDate(order)) {
+            return R.FAIL("渠道推送申请退款:当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
+        }
+
+        if (Objects.equals(refundOrderPushVo.getRefundType(), RefundType.ALL.value())
+                && (!Objects.isNull(order.getRefundStatus())
+                && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
+            return R.FAIL("渠道推送申请退款:该订单已有商品正在退款中,不能再进行整单退款");
+        }
+
+        List<Integer> returnMoneySts = new ArrayList<>();
+        returnMoneySts.add(ReturnMoneyStsType.APPLY.value());
+        returnMoneySts.add(ReturnMoneyStsType.PROCESSING.value());
+        returnMoneySts.add(ReturnMoneyStsType.CONSIGNMENT.value());
+        returnMoneySts.add(ReturnMoneyStsType.RECEIVE.value());
+        int count = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>()
+                .eq(OrderRefund::getOrderId, order.getOrderId())
+                .in(OrderRefund::getReturnMoneySts, returnMoneySts));
+
+        log.info("渠道推送申请退款:已存在退款订单数量{}", count);
+        if (count > 0) {
+            // 处理已存在退款的情况
+            return R.FAIL("渠道推送申请退款:该订单已有退款正在进行中");
+        }
+
+        // 生成退款单信息
+        OrderRefund newOrderRefund = new OrderRefund();
+
+        // 获取所有正在进行中的退款订单
+        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
+
+        for (OrderRefund orderRefund : orderRefunds) {
+            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
+                return R.FAIL("渠道推送申请退款:该订单正在进行整单退款,无法进行新的退款操作");
+            }
+        }
+
+        // 如果存在分销订单,则计算分销总金额
+        List<OrderItem> orderItemList = orderItemMapper.listByOrderNumber(order.getOrderNumber());
+        // 判断退款单类型(1:整单退款,2:单个物品退款)
+        if (refundOrderPushVo.getRefundType().equals(RefundType.ALL.value())) {
+            // 全部物品退款
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList));
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
+        }
+
+        newOrderRefund.setShopId(refundOrderPushVo.getThirdShopId());
+        newOrderRefund.setUserId(refundOrderPushVo.getMemberId().toString());
+        newOrderRefund.setOrderId(order.getOrderId());
+        newOrderRefund.setOrderNumber(order.getOrderNumber());
+        newOrderRefund.setRefundSn(RefundSnUtils.generate());
+        newOrderRefund.setRefundType(refundOrderPushVo.getRefundType());
+
+        newOrderRefund.setRefundAmount(refundOrderPushVo.getRefundAmount().setScale(2, RoundingMode.HALF_UP).doubleValue());
+        if (Objects.equals(RefundType.ALL.value(), refundOrderPushVo.getRefundType())) {
+            newOrderRefund.setOrderItemId(0L);
+        }
+//        else {
+//            newOrderRefund.setOrderItemId(refundOrderPushVo.getOrderItemId());
+//            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
+//            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.PADYED.value()) && order.getFreightAmount() > 0) {
+//                int orderItenCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
+//                if (Objects.equals(orderRefunds.size(), orderItenCount - 1)) {
+//                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(), order.getFreightAmount()));
+//                }
+//            }
+//        }
+        BigDecimal refundTotalMoney=BigDecimal.ZERO;
+        for (OrderRefundSku orderRefundSku : orderRefundSkuList) {
+            int mul = (int) Arith.mul(orderRefundSku.getSkuPrice(), 100)*orderRefundSku.getProductCount();
+            log.info("转换金额为:"+mul);
+            BigDecimal bigDecimal = Arith.fenToYuan((long) mul, 2);
+            log.info("转换后金额为:"+mul);
+            refundTotalMoney= refundTotalMoney.add(bigDecimal);
+        }
+//        //计算退款订单金额 整单退款需要退运费
+//        if (refundOrderPushVo.getRefundType().equals(RefundType.ALL.value())){
+//            refundTotalMoney= refundTotalMoney.add(BigDecimal.valueOf(Arith.mul(order.getFreightAmount(), 100)));
+//        }
+        newOrderRefund.setRefundAmount(refundOrderPushVo.getRefundAmount().doubleValue());
+        newOrderRefund.setRefundTotalMoney(refundTotalMoney);
+        newOrderRefund.setGoodsNum(refundOrderPushVo.getGoodsNum());
+        newOrderRefund.setApplyType(refundOrderPushVo.getApplyType());
+        if (Objects.equals(refundOrderPushVo.getApplyType(), 2)) {
+            newOrderRefund.setIsReceiver(true);
+        } else {
+            newOrderRefund.setIsReceiver(false);
+        }
+        newOrderRefund.setBuyerReason(refundOrderPushVo.getBuyerReason());
+        newOrderRefund.setBuyerDesc(refundOrderPushVo.getBuyerDesc());
+        newOrderRefund.setBuyerMobile(refundOrderPushVo.getBuyerMobile());
+        newOrderRefund.setPhotoFiles(refundOrderPushVo.getPhotoFiles());
+        newOrderRefund.setReturnMoneySts(ReturnMoneyStsType.APPLY.value());
+        newOrderRefund.setApplyTime(new Date());
+        newOrderRefund.setUpdateTime(new Date());
+        newOrderRefund.setFreightAmount(refundOrderPushVo.getFreightAmount().setScale(2, RoundingMode.HALF_UP).doubleValue());
+        newOrderRefund.setOffsetPoints(0L);
+
+        OrderRefund orderRefund = orderRefundService.applyRefund(newOrderRefund);
+        if (!orderRefundSkuList.isEmpty()) {
+            orderRefundSkuList.forEach(c -> {
+                c.setOrderRefundId(orderRefund.getRefundId());
+                orderRefundSkuMapper.insert(c);
+            });
+        }
+
+        //生成退款记录
+        addOrderRefundRecord(orderRefund.getRefundId(), 1, 1, newOrderRefund.getBuyerReason());
+
+        //生成待商家审核记录
+        addOrderRefundRecord(orderRefund.getRefundId(), 2, 2, "渠道推送申请退款:你的服务单已申请成功,待商家审核");
+
+        //创建海博退款单
+        log.info("渠道推送申请退款:创建海博退款单,生成海博退款单信息{}", orderRefund);
+        orderRefundService.createRefundOrder(orderRefund.getOrderNumber(), orderRefund.getRefundSn());
+
+        return R.SUCCESS(newOrderRefund.getRefundSn());
+    }
+
+
+    /**
+     * 用户修改物流公司信息
+     */
+    @Override
+    public R<String> updateExpress(OrderRefundExpressParamVo orderRefundExpressParam) {
+        OrderRefund orderRefund = orderRefundService.getOrderRefundByRefundSn(orderRefundExpressParam.getRefundSn());
+        if (Objects.isNull(orderRefund)) {
+            throw new GlobalException("查询不到退款信息");
+        }
+
+        if (!Objects.equals(orderRefund.getUserId(), orderRefundExpressParam.getMemberId())) {
+            throw new GlobalException("申请失败,您没有此权限");
+        }
+
+        if (!Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())) {
+            throw new GlobalException("当前状态不允许更新物流信息操作");
+        }
+
+        // 填写物流信息
+        RefundDelivery refundDelivery = refundDeliveryMapper.selectOne(new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, orderRefundExpressParam.getRefundSn()));
+        refundDelivery.setSenderMobile(orderRefundExpressParam.getMobile());
+        refundDelivery.setDeyId(orderRefundExpressParam.getExpressId());
+        refundDelivery.setSenderRemarks(orderRefundExpressParam.getSenderRemarks());
+        refundDelivery.setDeyNu(orderRefundExpressParam.getExpressNo());
+        refundDelivery.setImgs(orderRefundExpressParam.getImgs());
+        refundDelivery.setReceiverMobile(orderRefundExpressParam.getMobile());
+        refundDelivery.setDeyName(orderRefundExpressParam.getExpressName());
+
+        // 更新退款单信息
+        orderRefund.setUpdateTime(new Date());
+
+        orderRefundService.submitExpress(orderRefund, refundDelivery);
+        return R.SUCCESS("修改成功");
+    }
+
+
+    /**
+     * 用户撤销退货退款申请
+     */
+    @Override
+    public R<String> cancel(OrderRefundCancelVo orderRefundCancelVo) {
+        OrderRefundDto orderRefund = orderRefundService.getOrderRefundByRefundSn(orderRefundCancelVo.getRefundSn());
+        if (Objects.isNull(orderRefund)) {
+            throw new GlobalException("撤销失败 退款订单不存在");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.PROCESSING.value())) {
+            throw new GlobalException("卖家正在处理退款,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())) {
+            throw new GlobalException("买家已发货,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.RECEIVE.value())) {
+            throw new GlobalException("卖家已收货,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.SUCCESS.value())) {
+            throw new GlobalException("退款成功,不能撤销退款申请");
+        }
+
+        // 查看订单是否还有处于处理中的退款单,如果没有则修改订单退款状态为关闭状态
+        Order order = orderService.getOrderByOrderNumber(orderRefund.getOrderNumber());
+
+
+        if (!Objects.equals(order.getUserId(),orderRefundCancelVo.getUserId().toString())) {
+            throw new GlobalException("申请失败,您没有此权限");
+        }
+        //如果订单状态为待发货、包含运费、单个商品退款,且所有订单项都进行退款,则不能再取消退款(取消退款后再退款会导致重复退运费bug)
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.PADYED.value()) && Objects.equals(orderRefund.getRefundType(), 2) && order.getFreightAmount() > 0) {
+            // 退款数量
+            int refundCount = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>()
+                    .gt(OrderRefund::getReturnMoneySts, 0)
+                    .lt(OrderRefund::getReturnMoneySts, 6)
+                    .eq(OrderRefund::getOrderId, order.getOrderId())
+            );
+            // 订单项数量
+            int orderItemCount = orderItemMapper.selectCount(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
+            if (refundCount == orderItemCount) {
+                throw new GlobalException("该订单所有商品都进行退款,已无法取消退款");
+            }
+        }
+
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.SUCCESS.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.FAIL.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.REJECT.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CANCEL.value())) {
+            throw new GlobalException("撤销失败 当前状态不允许此操作");
+        }
+
+        Date now = new Date();
+        orderRefund.setReturnMoneySts(ReturnMoneyStsType.CANCEL.value());
+        //orderRefund.setReturnMoneySts(ReturnMoneyStsType.FAIL.value());
+        orderRefund.setCancelTime(now);
+        orderRefund.setUpdateTime(now);
+        orderRefundService.updateById(orderRefund);
+
+
+        List<OrderRefund> orderRefundList = orderRefundService.list(new LambdaQueryWrapper<OrderRefund>()
+                .eq(OrderRefund::getOrderId, order.getOrderId()));
+        long count = orderRefundList.stream().filter(item -> Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.APPLY.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.PROCESSING.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.RECEIVE.value())).count();
+        if (count == 0) {
+            order.setRefundStatus(RefundStatusEnum.DISAGREE.value());
+            orderService.updateById(order);
+        }
+        orderRefundService.changeStatus(orderRefundCancelVo.getRefundSn(), 40);
+
+        addOrderRefundRecord(orderRefund.getRefundId(), 4, 4, "用户主动撤回申请,退货退款关闭。");
+
+        return R.SUCCESS("撤销成功");
+    }
+
+    /**
+     * 参数校验
+     * @param refundOrderPushVo
+     * @return
+     */
+    private R<String> checkParameter(RefundOrderPushVo refundOrderPushVo){
+        if (refundOrderPushVo==null){
+            return R.FAIL("退款推送到星闪豹失败,请求参数为空");
+        }
+        if (StringUtils.isEmpty(refundOrderPushVo.getOrderNumber())){
+            return R.FAIL("退款推送到星闪豹失败,请求参数订单编号为空");
+        }
+        Order orderByOrderNumber = null;
+        try {
+            orderByOrderNumber = orderMapper.getOrderByOrderNumber(refundOrderPushVo.getOrderNumber());
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            log.error("报错信息为,{}",e);
+            return R.FAIL("退款推送到星闪豹失败,查询订单信息报错");
+        }
+        if (orderByOrderNumber==null){
+            return R.FAIL("退款推送到星闪豹失败,订单信息不存在");
+        }
+        if (ObjectUtils.isEmpty(orderByOrderNumber.getChannelId())){
+            return R.FAIL("退款推送到星闪豹失败,订单信息渠道编号为空");
+        }
+        if (!Objects.equals(orderByOrderNumber.getIsPayed(), 1)) {
+            throw new GlobalException("退款推送到星闪豹失败,当前订单还未付款,无法申请");
+        }
+
+        if (ObjectUtils.isEmpty(refundOrderPushVo.getThirdShopId())){
+            return R.FAIL("退款推送到星闪豹失败,请求参数门店编号为空");
+        }
+        ShopDetail shopDetail = shopDetailMapper.selectShopDetailById(refundOrderPushVo.getThirdShopId());
+        if (shopDetail==null){
+            return R.FAIL("退款推送到星闪豹失败,门店信息不存在");
+        }
+        List<OmsOrderRefundSkuVo> orderRefundSkuList = refundOrderPushVo.getOrderRefundSkuList();
+        if (orderRefundSkuList==null||orderRefundSkuList.isEmpty()){
+            return R.FAIL("退款推送到星闪豹失败,退款订单明细信息不存在");
+        }
+//        for (OmsOrderRefundSkuVo omsOrderRefundSkuVo : orderRefundSkuList) {
+//            Sku sku = skuMapper.listBySukIdAndPlatform(omsOrderRefundSkuVo.getThirdSkuId(), orderByOrderNumber.getChannelId());
+//            if (sku==null){
+//                return R.FAIL("退款推送到星闪豹失败,该渠道"+orderByOrderNumber.getChannelId()+"的该商品"+omsOrderRefundSkuVo.getThirdSkuId()+"不存在");
+//            }
+//        }
+        return R.SUCCESS();
+    }
+
+
+    /**
+     * 保存日志
+     * @param refundId
+     * @param auditStatus
+     * @param sort
+     * @param instructions
+     */
+    private void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) {
+        OrderRefundRecord orderRefundRecord = new OrderRefundRecord();
+        orderRefundRecord.setOrderRefundId(refundId);
+        orderRefundRecord.setInstructions(instructions);
+        Date date = new Date();
+        orderRefundRecord.setCreateTime(date);
+        orderRefundRecord.setUpdateTime(date);
+        orderRefundRecord.setAuditStatus(auditStatus);
+        orderRefundRecord.setSort(sort);
+        orderRefundRecordMapper.insert(orderRefundRecord);
+    }
+
+}

+ 3 - 0
yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml

@@ -90,5 +90,8 @@
         WHERE a.order_item_id = #{orderItemId}
           and b.return_money_sts not in (30,40)
     </select>
+    <select id="findBySkuIdAndOrderNumber" resultType="com.yami.shop.bean.model.OrderItem">
+        select * from tz_order_item where order_number = #{orderNumber} and sku_id =#{skuId}
+    </select>
 
 </mapper>

+ 3 - 0
yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml

@@ -602,5 +602,8 @@
                 LEFT JOIN tz_order_refund b ON a.order_refund_id = b.refund_id
                 WHERE b.order_number = #{orderNumber} AND b.return_money_sts NOT IN (30, 40)) AS result
     </select>
+    <select id="countRefundMoney" resultType="java.math.BigDecimal">
+        select  sum(refund_total_money) from  tz_order_refund where order_id = #{orderId} and return_money_sts = #{returnMoneySts}
+    </select>
 
 </mapper>