فهرست منبع

Merge remote-tracking branch 'origin/dev' into dev

wangming 2 روز پیش
والد
کامیت
c838b41f2d
27فایلهای تغییر یافته به همراه1389 افزوده شده و 71 حذف شده
  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. 67 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/smqjh/XSBRefundOrderController.java
  12. 1 1
      yami-shop-platform/src/main/resources/application-prod.yml
  13. 2 2
      yami-shop-platform/src/main/resources/application.yml
  14. 8 0
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java
  15. 2 0
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java
  16. 3 0
      yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java
  17. 2 0
      yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java
  18. 2 2
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java
  19. 159 62
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java
  20. 22 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  21. 17 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBPushRefundOrderService.java
  22. 27 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/XSBRefundOrderService.java
  23. 67 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBPushRefundOrderServiceImpl.java
  24. 431 0
      yami-shop-service/src/main/java/com/yami/shop/service/xsb/impl/XSBRefundOrderServiceImpl.java
  25. 19 4
      yami-shop-service/src/main/java/com/yami/shop/utils/SmqjhUtil.java
  26. 3 0
      yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml
  27. 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);
+    }
+
 }

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

@@ -0,0 +1,67 @@
+
+package com.yami.shop.platform.controller.smqjh;
+
+import com.alibaba.fastjson2.JSONObject;
+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.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+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,string);
+    }
+
+    /**
+     * 修改物流信息
+     */
+    @PostMapping("/updateExpress")
+    public R<String> updateExpress(@RequestBody OrderRefundExpressParamVo orderRefundExpressParamVo) {
+        String string = UUID.randomUUID().toString();
+        log.info("【"+string+"】"+"接收第三方退款订单修改物流信息推送{}", JSONObject.toJSONString(orderRefundExpressParamVo));
+        return  xsbRefundOrderService.updateExpress(orderRefundExpressParamVo);
+    }
+
+    /**
+     * 取消退款订单申请
+     */
+    @PostMapping("/cancel")
+    public R<String> cancel(@RequestBody OrderRefundCancelVo orderRefundCancelVo) {
+        String string = UUID.randomUUID().toString();
+        log.info("【"+string+"】"+"接收第三方取消退款订单申请推送{}", JSONObject.toJSONString(orderRefundCancelVo));
+        return  xsbRefundOrderService.cancel(orderRefundCancelVo,string);
+    }
+
+
+}

+ 1 - 1
yami-shop-platform/src/main/resources/application-prod.yml

@@ -28,4 +28,4 @@ smqjh:
 #  pms-url: http://47.109.39.185:8080/smqjh-pms/api/v1/sync
 #  pms-url: http://192.168.1.242:8080/smqjh-pms/api/v1/sync
   pms-url: https://smqjh.api.zswlgz.com/smqjh-pms/api/v1/sync
-  omsBaseUrl: https://smqjh.api.zswlgz.com/smqjh-oms
+  omsBaseUrl: https://smqjh.api.zswlgz.com/smqjh-oms

+ 2 - 2
yami-shop-platform/src/main/resources/application.yml

@@ -1,8 +1,8 @@
 spring:
   # 环境 dev|prod|docker quartz定时任务
   profiles:
-#    active: dev
-    active: prod
+    active: dev
+#    active: prod
   #文件上传设置
   servlet:
 

+ 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);
 }

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

@@ -217,4 +217,6 @@ public interface OrderService extends IService<Order> {
     void deleteTempSubOrder(String subOrderNumber);
 
     String addSMOrder(SMOrderPo orderPo);
+
+    void returnRefundCheck(String refundNumber);
 }

+ 2 - 2
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java

@@ -281,7 +281,7 @@ public class HBGoodsService implements IHBGoodsService {
                         .eq(CategoryProdHb::getIsDelete, 0));
                 for (CategoryProdHb categoryProd : categoryProds) {
                     FrontCategory frontCategory = frontCategoryMapper.selectOne(new LambdaQueryWrapper<FrontCategory>()
-                            .eq(FrontCategory::getCode, categoryProd.getCode()));
+                            .eq(FrontCategory::getCode, categoryProd.getCode()).eq(FrontCategory::getIsDelete, 0));
                     addShopCategory(frontCategory, categoryProd.getProdId(), shopDetail.getShopId(), shopDetail.getHbStationId());
                 }
 
@@ -851,7 +851,7 @@ public class HBGoodsService implements IHBGoodsService {
 
         for (ShopSku shopSku : shopCategoryList) {
             FrontCategory frontCategory = frontCategoryMapper.selectOne(new LambdaQueryWrapper<FrontCategory>()
-                    .eq(FrontCategory::getCode, ztFrontCategoryCodeLevel));
+                    .eq(FrontCategory::getCode, ztFrontCategoryCodeLevel).eq(FrontCategory::getIsDelete, 0));
             ShopDetail shopDetail = shopDetailMapper.selectById(shopSku.getShopId());
 
             addShopCategory(frontCategory, spuId, shopSku.getShopId(), shopDetail.getHbStationId());

+ 159 - 62
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -27,36 +27,39 @@ import com.yami.shop.bean.pay.RefundInfoDto;
 import com.yami.shop.bean.vo.ExportContext;
 import com.yami.shop.bean.vo.OrderRefundSkuVo;
 import com.yami.shop.bean.vo.OrderRefundVo;
+import com.yami.shop.common.bean.smqjh.Result;
 import com.yami.shop.common.config.Constant;
 import com.yami.shop.common.enums.PayType;
+import com.yami.shop.common.enums.SMQJHResultCode;
 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 com.yami.shop.utils.SmqjhUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 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 +105,11 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     @Autowired
     private ExportTaskService exportTaskService;
 
+    @Autowired
+    private XSBPushRefundOrderService xsbPushRefundOrderService;
+
+    private final SmqjhUtil smqjhUtil;
+
     //导出
     // 线程池配置
     private final ExecutorService exportExecutor = Executors.newFixedThreadPool(
@@ -111,6 +119,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
                     .setDaemon(true)
                     .build()
     );
+
     /**
      * 获取分页对象
      */
@@ -1101,7 +1110,28 @@ 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())) {
+                    //当属于市民请集合的订单的时候,直接回推市民请集合进行退款逻辑处理;
+                    log.info("【详情】推送市民请集合积分处理:,{}", orderRefund.getRefundSn());
+                    try {
+                        orderService.returnRefundCheck(orderRefund.getRefundSn());
+                        String s = HttpUtil.get(smqjhUtil.getOmsBaseUrl() + SmqjhUtil.omsSmqjhRefundPointsHandleUrl + orderRefund.getRefundSn());
+                        log.info("【详情】推送市民请集合积分处理返回:,{}", s);
+                        if (StringUtils.isNotEmpty(s)) {
+                            Result result = JSONObject.parseObject(s, Result.class);
+                            if (result == null) {
+                                log.error("【详情】推送市民请集合积分处理返回失败1:");
+                            }
+                            if (!SMQJHResultCode.SUCCESS.getCode().equals(result.getCode())) {
+                                log.error("【详情】推送市民请集合积分处理返回失败2:" + result.getMsg());
+                            }
+                        }
+                    } catch (Exception e) {
+                        log.error("【详情】推送市民请集合积分报错:" + e.getMessage() + "{}", e);
+                    }
+                } else {
+                    orderService.returnRefund(orderRefund.getOrderNumber());
+                }
             }
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
@@ -1164,12 +1194,30 @@ 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())) {
+                    orderService.returnRefundCheck(orderRefund.getRefundSn());
+                    R<String> stringR = xsbPushRefundOrderService.pushRefundStatus(orderRefund);
+                    if (!stringR.isSuccess()) {
+                        log.error("推送市民请集合审核状态失败,{},{}", stringR.getMsg(), JSONObject.toJSON(stringR));
+                    } else {
+                        log.info("推送市民请集合审核状态成功");
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error("推送市民请集合审核状态报错,{}", e);
+            }
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
             return HBR.error("未知异常");
@@ -1202,14 +1250,27 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
                 orderRefund.setReturnMoneySts(ReturnMoneyStsType.SUCCESS.value());
             }
             orderRefundMapper.updateById(orderRefund);
+            if (ChannelType.SMQJH.value().equals(orderRefund.getChannelType())) {
+                try {
+                    orderService.returnRefundCheck(orderRefund.getRefundSn());
+                    //当属于市民请集合的订单的时候,直接回推市民请集合进行退款逻辑处理;
+                    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());
-
+            }else {
+                //订单退款金额或者积分处理
+                orderService.returnRefund(orderRefund.getOrderNumber());
+            }
             //推送商家审核状态后 同步退款单状态
             changeStatus(orderRefund.getRefundSn(), orderRefund.getReturnMoneySts());
-          } catch (Exception e) {
+        } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
             return HBR.error("未知异常");
         }
@@ -1328,19 +1389,21 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     public OrderRefundVo selectInfoById(Long refundId) {
         return orderRefundMapper.selectInfoById(refundId);
     }
+
     /**
      * 导出售后订单
+     *
      * @param orderRefund
      * @param userId
      */
     @Override
-    public R<String> export(OrderRefundStaisticsParam orderRefund,Long userId) {
+    public R<String> export(OrderRefundStaisticsParam orderRefund, Long userId) {
 
-        List<OrderRefundVo> orderRefundList= orderRefundMapper.findOrderRefund(orderRefund);
+        List<OrderRefundVo> orderRefundList = orderRefundMapper.findOrderRefund(orderRefund);
         for (OrderRefundVo record : orderRefundList) {
             record.setOrderRefundSkuList(orderRefundskuMapper.selectByRefundId(record.getRefundId()));
         }
-        if (orderRefundList.isEmpty()){
+        if (orderRefundList.isEmpty()) {
             throw new GlobalException("该次导出未查询到数据,不允许导出");
         }
         String taskId = UUID.randomUUID().toString();
@@ -1358,19 +1421,19 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
             Thread currentThread = Thread.currentThread();
             ExportContext context = new ExportContext(null, currentThread, false, 0);
-            exportTaskService.putTaskId(taskId,context);
+            exportTaskService.putTaskId(taskId, context);
             try {
                 // 记录任务开始
                 log.info("开始执行导出任务,用户ID: {}", userId);
-                exportNormalOrders(orderRefundList,exportTask,"refundOrder",context);
+                exportNormalOrders(orderRefundList, exportTask, "refundOrder", context);
                 // 记录任务完成
                 log.info("导出任务完成,用户ID: {}", userId);
             } catch (Exception e) {
                 log.error("导出任务异常,用户ID: {}", userId, e);
                 exportTask.setExportStatus(2);
-                exportTask.setExportMsg("导出失败,"+e.getMessage());
+                exportTask.setExportMsg("导出失败," + e.getMessage());
                 exportTaskService.updateById(exportTask);
-            }finally {
+            } finally {
                 exportTaskService.removeTaskId(taskId);
             }
         }, exportExecutor);
@@ -1414,19 +1477,19 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
 
             String[] headers = {
-                    "序号","订单编号", "退款编号", "申请时间", "申请方式", "售后状态",
-                    "订单类型", "退款商品名称", "规格", "购买单价(元)","退款数量", "小计(元)",
-                    "退款商品总数量", "退款总金额(元)", "退还现金(元)", "退还积分(元)","退还积分中过期积分(分)",
+                    "序号", "订单编号", "退款编号", "申请时间", "申请方式", "售后状态",
+                    "订单类型", "退款商品名称", "规格", "购买单价(元)", "退款数量", "小计(元)",
+                    "退款商品总数量", "退款总金额(元)", "退还现金(元)", "退还积分(元)", "退还积分中过期积分(分)",
                     "所属企业", "买家姓名", "买家电话"
             };
             // 创建合并单元格的表头
-            ExportUtils.createMergedHeader(sheet, headerStyle,"售后订单",19);
+            ExportUtils.createMergedHeader(sheet, headerStyle, "售后订单", 19);
 
             // 创建列标题行
-            ExportUtils.createColumnHeaders(sheet, headerStyle,headers);
+            ExportUtils.createColumnHeaders(sheet, headerStyle, headers);
 
             // 填充数据
-            fillOrderData(sheet, orderList, dataStyle, numberStyle, dateStyle,context);
+            fillOrderData(sheet, orderList, dataStyle, numberStyle, dateStyle, context);
             // 写入文件
             try (FileOutputStream fos = new FileOutputStream(file);
                  BufferedOutputStream bos = new BufferedOutputStream(fos)) {
@@ -1490,11 +1553,11 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
      * 填充订单数据
      */
     private void fillOrderData(Sheet sheet, List<OrderRefundVo> orderList,
-                               CellStyle dataStyle, CellStyle numberStyle, CellStyle dateStyle,ExportContext context) throws InterruptedException{
+                               CellStyle dataStyle, CellStyle numberStyle, CellStyle dateStyle, ExportContext context) throws InterruptedException {
         int batchSize = 100; // 每批处理1000条
         int totalRows = orderList.size();
         int rowNum = 2; // 从第3行开始(0-based索引)
-        int indexNum= 1; //序号
+        int indexNum = 1; //序号
 
         for (int i = 0; i < totalRows; i += batchSize) {
             int end = Math.min(i + batchSize, totalRows);
@@ -1509,9 +1572,9 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
                 Row row = sheet.createRow(rowNum++);
                 row.setHeightInPoints(18);
                 // 序号
-                ExportUtils.createCell(sheet,row, 0,orderRefundVo.getOrderRefundSkuList().size(),rowNum, indexNum, dataStyle);
-                fillOrderRowData(sheet,rowNum,row, orderRefundVo, dataStyle, numberStyle, dateStyle);
-                rowNum+=orderRefundVo.getOrderRefundSkuList().size()-1;
+                ExportUtils.createCell(sheet, row, 0, orderRefundVo.getOrderRefundSkuList().size(), rowNum, indexNum, dataStyle);
+                fillOrderRowData(sheet, rowNum, row, orderRefundVo, dataStyle, numberStyle, dateStyle);
+                rowNum += orderRefundVo.getOrderRefundSkuList().size() - 1;
                 indexNum++;
             }
 
@@ -1530,52 +1593,53 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     /**
      * 填充单行订单数据
      */
-    private void fillOrderRowData(Sheet sheet,int rowNum,Row row, OrderRefundVo orderRefundVo,
+    private void fillOrderRowData(Sheet sheet, int rowNum, Row row, OrderRefundVo orderRefundVo,
                                   CellStyle dataStyle, CellStyle numberStyle, CellStyle dateStyle) {
 
         // 订单编号
-        ExportUtils.createCell(sheet,row, 1,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getOrderNumber(), dataStyle);
+        ExportUtils.createCell(sheet, row, 1, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getOrderNumber(), dataStyle);
 
         // 退款编号
-        ExportUtils.createCell(sheet,row, 2,orderRefundVo.getOrderRefundSkuList().size(),rowNum,  orderRefundVo.getRefundSn(), dateStyle);
+        ExportUtils.createCell(sheet, row, 2, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getRefundSn(), dateStyle);
 
         // 申请时间
-        ExportUtils.createCell(sheet,row, 3,orderRefundVo.getOrderRefundSkuList().size(),rowNum,  ExportUtils.formatDate(orderRefundVo.getApplyTime()), dateStyle);
+        ExportUtils.createCell(sheet, row, 3, orderRefundVo.getOrderRefundSkuList().size(), rowNum, ExportUtils.formatDate(orderRefundVo.getApplyTime()), dateStyle);
 
         // 申请方式
-        ExportUtils.createCell(sheet,row, 4,orderRefundVo.getOrderRefundSkuList().size(),rowNum,getApplyType(orderRefundVo.getApplyType()), dataStyle);
+        ExportUtils.createCell(sheet, row, 4, orderRefundVo.getOrderRefundSkuList().size(), rowNum, getApplyType(orderRefundVo.getApplyType()), dataStyle);
 
         // 售后状态
-        ExportUtils.createCell(sheet,row, 5,orderRefundVo.getOrderRefundSkuList().size(),rowNum, getReturnMoneySts(orderRefundVo.getReturnMoneySts()), dataStyle);
+        ExportUtils.createCell(sheet, row, 5, orderRefundVo.getOrderRefundSkuList().size(), rowNum, getReturnMoneySts(orderRefundVo.getReturnMoneySts()), dataStyle);
         // 订单类型
-        ExportUtils.createCell(sheet,row, 6,orderRefundVo.getOrderRefundSkuList().size(),rowNum, getDvyType(orderRefundVo.getDvyType()), dataStyle);
+        ExportUtils.createCell(sheet, row, 6, orderRefundVo.getOrderRefundSkuList().size(), rowNum, getDvyType(orderRefundVo.getDvyType()), dataStyle);
         // 商品明细行(每个订单项一行)
         fillOrderItems(sheet, rowNum, row, orderRefundVo, dataStyle, numberStyle);
 
         // 退款商品总数量
-        ExportUtils.createCell(sheet,row, 12,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getGoodsNum(), numberStyle);
+        ExportUtils.createCell(sheet, row, 12, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getGoodsNum(), numberStyle);
 
         // 退款总金额(元)
-        ExportUtils.createCell(sheet,row, 13,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getRefundTotalMoney(), numberStyle);
+        ExportUtils.createCell(sheet, row, 13, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getRefundTotalMoney(), numberStyle);
 
         // 退还现金(元)
-        ExportUtils.createCell(sheet,row, 14,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getRefundAmount(), numberStyle);
+        ExportUtils.createCell(sheet, row, 14, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getRefundAmount(), numberStyle);
 
         // 退还积分(元)
-        ExportUtils.createCell(sheet,row,15,orderRefundVo.getOrderRefundSkuList().size(),rowNum,"-"+(orderRefundVo.getOffsetPoints()==null?0:Arith.div(Double.valueOf(orderRefundVo.getOffsetPoints()), 100)), numberStyle);
+        ExportUtils.createCell(sheet, row, 15, orderRefundVo.getOrderRefundSkuList().size(), rowNum, "-" + (orderRefundVo.getOffsetPoints() == null ? 0 : Arith.div(Double.valueOf(orderRefundVo.getOffsetPoints()), 100)), numberStyle);
 
         // 退还积分中过期积分(分)
-        ExportUtils.createCell(sheet,row, 16,orderRefundVo.getOrderRefundSkuList().size(),rowNum, (orderRefundVo.getRefundExpiredScore()==null?0:orderRefundVo.getRefundExpiredScore()), numberStyle);
+        ExportUtils.createCell(sheet, row, 16, orderRefundVo.getOrderRefundSkuList().size(), rowNum, (orderRefundVo.getRefundExpiredScore() == null ? 0 : orderRefundVo.getRefundExpiredScore()), numberStyle);
 
         // 所属企业
-        ExportUtils.createCell(sheet,row, 17,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getChannelName(), dataStyle);
+        ExportUtils.createCell(sheet, row, 17, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getChannelName(), dataStyle);
 
         // 买家姓名
-        ExportUtils.createCell(sheet,row, 18,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getReceiver(), dataStyle);
+        ExportUtils.createCell(sheet, row, 18, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getReceiver(), dataStyle);
 
         // 买家电话
-        ExportUtils.createCell(sheet,row, 19,orderRefundVo.getOrderRefundSkuList().size(),rowNum, orderRefundVo.getBuyerMobile(), dataStyle);
+        ExportUtils.createCell(sheet, row, 19, orderRefundVo.getOrderRefundSkuList().size(), rowNum, orderRefundVo.getBuyerMobile(), dataStyle);
     }
+
     /**
      * 填充订单项明细
      */
@@ -1584,7 +1648,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         int itemSize = orderRefundVo.getOrderRefundSkuList().size();
 
         for (int i = 0; i < itemSize; i++) {
-            Row currentRow = (i < 1) ? row : sheet.createRow(rowNum + (i-1));
+            Row currentRow = (i < 1) ? row : sheet.createRow(rowNum + (i - 1));
             OrderRefundSkuVo orderRefundSkuVo = orderRefundVo.getOrderRefundSkuList().get(i);
             // 退款商品名称
             ExportUtils.createCell(sheet, currentRow, 7, 0, rowNum, orderRefundSkuVo.getProdName(), dataStyle);
@@ -1599,52 +1663,73 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             ExportUtils.createCell(sheet, currentRow, 10, 0, rowNum, orderRefundSkuVo.getProductCount(), dataStyle);
 
             // 小计(元)
-            ExportUtils.createCell(sheet, currentRow, 11, 0, rowNum,(Arith.multiply(orderRefundSkuVo.getProductCount(),orderRefundSkuVo.getSkuPrice(),2)), numberStyle);
+            ExportUtils.createCell(sheet, currentRow, 11, 0, rowNum, (Arith.multiply(orderRefundSkuVo.getProductCount(), orderRefundSkuVo.getSkuPrice(), 2)), numberStyle);
 
         }
     }
 
     /**
-     *海博订单状态
+     * 海博订单状态
+     *
      * @param status
      * @return
      */
     private String getReturnMoneySts(Integer status) {
         switch (status) {
-            case 10: return "待审核";
-            case 20: return "处理中";
-            case 30: return "驳回退款";
-            case 40: return "撤销退款";
-            case 60: return "待退货(一审同意)";
-            case 65: return "待确认收货(二审待审核)";
-            case 70: return "退款完成";
-            default: return "未知状态";
+            case 10:
+                return "待审核";
+            case 20:
+                return "处理中";
+            case 30:
+                return "驳回退款";
+            case 40:
+                return "撤销退款";
+            case 60:
+                return "待退货(一审同意)";
+            case 65:
+                return "待确认收货(二审待审核)";
+            case 70:
+                return "退款完成";
+            default:
+                return "未知状态";
         }
     }
+
     /**
      * 订单类型
+     *
      * @param dvyType
      * @return
      */
     private String getDvyType(Integer dvyType) {
         switch (dvyType) {
-            case 1: return "快递";
-            case 2: return "自提";
-            case 3: return "及时配送";
-            default: return "未知类型";
+            case 1:
+                return "快递";
+            case 2:
+                return "自提";
+            case 3:
+                return "及时配送";
+            default:
+                return "未知类型";
         }
     }
+
     /**
      * 订单类型
+     *
      * @param applyType
      * @return
      */
     private String getApplyType(Integer applyType) {
         switch (applyType) {
-            case 1: return "仅退款";
-            case 2: return "退货退款";
-            case 5: return "差价退款";
-            default: return "未知类型";
+            case 1:
+                return "仅退款";
+            case 2:
+                return "退货退款";
+            case 5:
+                return "差价退款";
+            default:
+                return "未知类型";
         }
     }
 
@@ -1653,5 +1738,17 @@ 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);
+    }
+
 
 }

+ 22 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -1788,6 +1788,28 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
     }
 
+    /**
+     * 校验同步状态
+     */
+    @Override
+    public void returnRefundCheck(String refundNumber) {
+        log.info("====================市民请集合校验同步状态RefundNumber:{}====================", refundNumber);
+        OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>()
+                .eq(OrderRefund::getRefundSn, refundNumber)
+                .eq(OrderRefund::getReturnMoneySts, 70)
+                .eq(OrderRefund::getHandler, Boolean.FALSE)
+        );
+        if (ObjectUtils.isNotEmpty(orderRefund)) {
+            Order order = orderMapper.selectById(orderRefund.getOrderId());
+
+            //生成待商家审核记录
+            addOrderRefundRecord(orderRefund.getRefundId(), 25, 6, "平台已退款到微信账户中");
+            addOrderRefundRecord(orderRefund.getRefundId(), 30, 10, "商家已同意收货,正在为你处理退款。");
+            //如果是分次退款最后一个商品需要改变订单状态
+            updateOrderStatus(order);
+        }
+    }
+
     /**
      * 退款成功后,修改订单状态
      *

+ 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);
+}

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

@@ -0,0 +1,27 @@
+package com.yami.shop.service.xsb;
+
+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 XSBRefundOrderService {
+    /**
+     * 进行推送退款订单
+     * @param refundOrderPushVo
+     * @return
+     */
+    R<String> applyAfterSales(RefundOrderPushVo refundOrderPushVo,String logId);
+
+    /**
+     * 同步物流修改信息
+     * @param orderRefundExpressParam
+     * @return
+     */
+    R<String> updateExpress(OrderRefundExpressParamVo orderRefundExpressParam);
+    /**
+     * 取消订单
+     * @return
+     */
+    R<String> cancel(OrderRefundCancelVo orderRefundCancelVo,String logId);
+}

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

@@ -0,0 +1,67 @@
+package com.yami.shop.service.xsb.impl;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.bean.enums.ChannelType;
+import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.bean.vo.xsb.RefundOrderPushStatusVo;
+import com.yami.shop.common.bean.smqjh.Result;
+import com.yami.shop.common.enums.SMQJHResultCode;
+import com.yami.shop.common.util.HttpUtil;
+import com.yami.shop.common.util.R;
+import com.yami.shop.dao.PointsRecordMapper;
+import com.yami.shop.service.xsb.XSBPushRefundOrderService;
+import com.yami.shop.utils.SmqjhUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class XSBPushRefundOrderServiceImpl implements XSBPushRefundOrderService {
+
+    @Autowired
+    PointsRecordMapper pointsRecordMapper;
+
+    private final SmqjhUtil smqjhUtil;
+
+    /**
+     * 推送市民请集合状态
+     * @param orderRefund
+     * @return
+     */
+    @Override
+    public R<String> pushRefundStatus(OrderRefund orderRefund) {
+        log.info("推送市民请集合状态请求参数,{}", com.alibaba.fastjson2.JSONObject.toJSONString(orderRefund));
+        if (orderRefund==null){
+            return R.FAIL("退款订单信息不存在");
+        }
+        if (!ChannelType.SMQJH.value().equals(orderRefund.getChannelType())){
+            return R.FAIL("退款订单信息不属于市民请集合订单,不允许推送");
+        }
+        RefundOrderPushStatusVo refundOrderPushStatusVo = new RefundOrderPushStatusVo();
+        refundOrderPushStatusVo.setRefundNumber(orderRefund.getRefundSn());
+        refundOrderPushStatusVo.setReturnMoneySts(orderRefund.getReturnMoneySts());
+        refundOrderPushStatusVo.setApplyType(orderRefund.getApplyType());
+        log.info("推送市民请集合状态推送请求参数,{}", com.alibaba.fastjson2.JSONObject.toJSONString(refundOrderPushStatusVo));
+        String post = HttpUtil.post(smqjhUtil.getOmsBaseUrl()+SmqjhUtil.omsSmqjhRefundUrlUpdateStatus, refundOrderPushStatusVo);
+        log.info("推送市民请集合状态推送返回参数,{}", post);
+        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();
+    }
+
+
+
+
+}

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

@@ -0,0 +1,431 @@
+package com.yami.shop.service.xsb.impl;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.dto.OrderRefundDto;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.enums.RefundStatusEnum;
+import com.yami.shop.bean.enums.RefundType;
+import com.yami.shop.bean.enums.ReturnMoneyStsType;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.vo.xsb.OmsOrderRefundSkuVo;
+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.config.Constant;
+import com.yami.shop.common.exception.GlobalException;
+import com.yami.shop.common.util.Arith;
+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.XSBRefundOrderService;
+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 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,String logId) {
+        R<String> stringR = checkParameter(refundOrderPushVo);
+        if (!stringR.isSuccess()){
+            return stringR;
+        }
+        log.info("【"+logId+"】"+"渠道推送申请退款参数:{}",refundOrderPushVo);
+        List<OrderRefundSku> orderRefundSkuList = new ArrayList<>();
+        List<OmsOrderRefundSkuVo> omsOrderRefundSkuVos = refundOrderPushVo.getOrderRefundSkuList();
+        for (OmsOrderRefundSkuVo omsOrderRefundSkuVo : omsOrderRefundSkuVos) {
+            OrderItem orderItem =  orderItemMapper.findBySkuIdAndOrderNumber(omsOrderRefundSkuVo.getThirdSkuId(),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("【"+logId+"】"+"渠道推送申请退款:已存在退款订单数量{}", 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("【"+logId+"】"+"转换金额为:"+mul);
+            BigDecimal bigDecimal = Arith.fenToYuan((long) mul, 2);
+            log.info("【"+logId+"】"+"转换后金额为:"+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);
+        newOrderRefund.setChannelType(refundOrderPushVo.getChannelType());
+        log.info("【"+logId+"】"+"添加退款信息:"+JSONObject.toJSONString(newOrderRefund));
+        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("【"+logId+"】"+"渠道推送申请退款:创建海博退款单,生成海博退款单信息{}", 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,String logId) {
+        OrderRefundDto orderRefund = orderRefundService.getOrderRefundByRefundSn(orderRefundCancelVo.getRefundSn());
+        log.info("【"+logId+"】"+"接收第三方取消退款订单申请推送,退款订单{}", JSONObject.toJSONString(orderRefund));
+        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());
+
+        log.info("【"+logId+"】"+"接收第三方取消退款订单申请推送,订单{}", JSONObject.toJSONString(order));
+        if (!Objects.equals(orderRefund.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);
+    }
+
+}

+ 19 - 4
yami-shop-service/src/main/java/com/yami/shop/utils/SmqjhUtil.java

@@ -20,18 +20,33 @@ public class SmqjhUtil {
     @Value("${smqjh.pms-url}")
     private String smqjhPmsUrl;
 
+
+
     @Getter
     @Value("${smqjh.omsBaseUrl}")
     private String omsBaseUrl;
 
-
     /**
-     +     * 市民请集合门店修改和新增调用
-     +     */
+     * pms
+    * 市民请集合门店修改和新增调用
+    */
     public static String smqjhMdUrlAddAndUpdate="/shopDetail/save";
-    /**
+    /**pms
      * 市民请集合门店状态修改调用
     */
     public static String smqjhMdUrlUpdateStatus="/shopDetail/updateStatus";
 
+    /**
+     * oms
+     * 市民请集合同步退款订单状态
+     */
+    public static String omsSmqjhRefundUrlUpdateStatus=  "/api/v1/xsb/receiveRefundStatus";
+
+    /**
+     * oms
+     * 市民请集合同步退款处理积分
+     */
+    public static String omsSmqjhRefundPointsHandleUrl= "/api/v1/xsb/handleRefund/";
+
+
 }

+ 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>