浏览代码

Merge branch 'feature/0822_logoff' into develop-new

liujc 7 月之前
父节点
当前提交
66564daf64
共有 24 个文件被更改,包括 428 次插入100 次删除
  1. 2 9
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 6 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallPortalFeignService.java
  3. 20 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/ApiWrapper.java
  4. 39 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/enums/CheckStatus.java
  5. 1 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  6. 8 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java
  7. 20 8
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysUserController.java
  8. 4 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java
  9. 5 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java
  10. 12 11
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  11. 4 5
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  12. 12 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  13. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java
  14. 11 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsOrderReturnApplyVo.java
  15. 4 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  16. 70 8
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  17. 8 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml
  18. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetAuthRecordDao.java
  19. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  20. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  21. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java
  22. 182 55
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java
  23. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetAuthRecordMapper.xml
  24. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

+ 2 - 9
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -1,13 +1,6 @@
 package com.yonge.cooleshow.api.feign;
 
-import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
-import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
-import com.yonge.cooleshow.api.feign.dto.ImUserInfo;
-import com.yonge.cooleshow.api.feign.dto.StudentApi;
-import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
-import com.yonge.cooleshow.api.feign.dto.TeacherApi;
-import com.yonge.cooleshow.api.feign.dto.TenantWrapper;
-import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
+import com.yonge.cooleshow.api.feign.dto.*;
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -213,7 +206,7 @@ public interface AdminFeignService {
      * 账号注销校验
      */
     @PostMapping("/sysUser/logoffCheck")
-    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam(value = "phone") String phone);
+    HttpResponseResult<List<ApiWrapper.LogOff>> accountLogoffCheck(@RequestParam(value = "phone") String phone);
 
     @PostMapping("/sysUser/logoffQuitImGroup")
     HttpResponseResult<Boolean> logoffQuitImGroup(@RequestParam(value = "phone") String phone);

+ 6 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallPortalFeignService.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.api.feign;
 
 import com.yonge.cooleshow.api.feign.dto.OmsOrderDetail;
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.api.feign.fallback.MallPortalFeignServiceFallback;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.feign.config.FeignConfiguration;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @FeignClient(name = "${app-config.open-feign.mall-portal-server.name:mall-portal-server}", url = "${app-config.open-feign.mall-portal-server.url:}",
         configuration = FeignConfiguration.class, fallback = MallPortalFeignServiceFallback.class)
@@ -42,4 +45,7 @@ public interface MallPortalFeignService {
     @GetMapping("/order/queryOrderList")
     HttpResponseResult<List<OmsOrderDetail>> queryOrderList(@RequestParam("status") String status,
                                                             @RequestParam("userId") Long userId);
+
+    @GetMapping("/order/checkOrderStatus")
+    HttpResponseResult<Map<String, Set<CheckStatus>>> checkOrderStatus(@RequestParam("userId") Long userId);
 }

+ 20 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/ApiWrapper.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+import java.util.List;
+
+public class ApiWrapper {
+
+    @Data
+    public static class LogOff{
+
+        @ApiModelProperty("客户端类型")
+        private String client;
+
+        @ApiModelProperty("错误信息")
+        private List<String> errList;
+    }
+}

+ 39 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/enums/CheckStatus.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.api.feign.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 活动资源类型
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum CheckStatus implements BaseEnum<String, CheckStatus> {
+
+    // 待支付
+    WAIT_PAY("待支付"),
+    // 未确认收货
+    WAIT_CONFIRM("未确认收货"),
+    // 售后处理中
+    WAIT_AFTER_SALE("售后处理中"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CheckStatus(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 1 - 1
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -207,7 +207,7 @@ public class AdminFeignServiceFallback implements AdminFeignService {
 
 
     @Override
-    public HttpResponseResult<List<String>> accountLogoffCheck(String phone) {
+    public HttpResponseResult<List<ApiWrapper.LogOff>> accountLogoffCheck(String phone) {
         return null;
     }
 

+ 8 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java

@@ -3,9 +3,12 @@ package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.MallPortalFeignService;
 import com.yonge.cooleshow.api.feign.dto.OmsOrderDetail;
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Description
@@ -33,4 +36,9 @@ public class MallPortalFeignServiceFallback implements MallPortalFeignService {
     public HttpResponseResult<List<OmsOrderDetail>> queryOrderList(String status, Long userId) {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Map<String, Set<CheckStatus>>> checkOrderStatus(Long userId) {
+        return null;
+    }
 }

+ 20 - 8
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysUserController.java

@@ -1,15 +1,16 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.api.feign.dto.ApiWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -21,15 +22,17 @@ public class SysUserController extends BaseController {
     @Autowired
     private SysUserService sysUserService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     /**
      * 账号注销校验
      */
     @PostMapping("/logoffCheck")
-    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam("phone") String phone) {
-        List<String> strings = sysUserService.accountLogoffCheck(phone);
-        if (!CollectionUtils.isEmpty(strings)) {
-            return HttpResponseResult.succeed(strings);
+    HttpResponseResult<List<ApiWrapper.LogOff>> accountLogoffCheck(@RequestParam("phone") String phone) {
+        List<ApiWrapper.LogOff> logOffs = sysUserService.accountLogoffCheck(phone);
+        if (!CollectionUtils.isEmpty(logOffs)) {
+            return HttpResponseResult.succeed(logOffs);
         }
         return HttpResponseResult.succeed();
     }
@@ -40,4 +43,13 @@ public class SysUserController extends BaseController {
         return HttpResponseResult.succeed(true);
     }
 
+    @ApiOperation(value = "用户注销账号校验")
+    @GetMapping(value = "/logoffUser/{id}")
+    public HttpResponseResult<Void> logoffUser(@PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserById(id);
+        if (sysUser == null) {
+            return failed("用户不存在");
+        }
+        return sysUserFeignService.logoffUser(id);
+    }
 }

+ 4 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java

@@ -98,4 +98,8 @@ public interface SysUserFeignService {
 													@RequestParam("clientId")String clientId,
 													@RequestParam("clientSecret")String clientSecret);
 
+    @ApiOperation(value = "用户注销账号校验")
+    @GetMapping(value = "/user/logoffUser/{id}")
+    HttpResponseResult<Void> logoffUser(@PathVariable("id") Long id);
+
 }

+ 5 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java

@@ -129,4 +129,9 @@ public class SysUserFeignServiceFallback implements SysUserFeignService {
 	public HttpResponseResult<Map<String, Object>> smsLogin(String phone, String smsCode, String loginType, String clientId, String clientSecret) {
 		return null;
 	}
+    @Override
+    public HttpResponseResult<Void> logoffUser(Long id) {
+        return null;
+    }
+
 }

+ 12 - 11
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.auth.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.dto.ApiWrapper;
 import com.yonge.cooleshow.auth.api.dto.QRLoginDto;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
@@ -427,12 +428,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     public HttpResponseResult<Void> logoffByPhone(String phone) {
         // todo: 暂时不上
         try {
-            HttpResponseResult<List<String>> check = adminFeignService.accountLogoffCheck(phone);
+            HttpResponseResult<List<ApiWrapper.LogOff>> check = adminFeignService.accountLogoffCheck(phone);
             if (!check.getStatus()) {
                 log.error("logoffByPhone check error", check.getMsg());
                 throw new BizException("数据检查失败");
             }
-            List<String> errMsg = check.getData();
+            List<ApiWrapper.LogOff> errMsg = check.getData();
             if (!CollectionUtils.isEmpty(errMsg)) {
                 return HttpResponseResult.failed(5201, null, JSON.toJSONString(errMsg));
             }
@@ -449,7 +450,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
             throw new BizException("用户不存在或已注销");
         }
         // 解散群、退群、删除好友关系
-//        adminFeignService.logoffQuitImGroup(phone);
+        adminFeignService.logoffQuitImGroup(phone);
 
         //退出登录
         tokenService.revokeTokenByPhone(phone);
@@ -458,14 +459,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     public HttpResponseResult<List<String>> logoffCheckByPhone(String phone) {
-        HttpResponseResult<List<String>> check = adminFeignService.accountLogoffCheck(phone);
-        if (check == null) {
-            throw new BizException("数据检查失败");
-        }
-        List<String> errMsg = check.getData();
-        if (!CollectionUtils.isEmpty(errMsg)) {
-            return HttpResponseResult.failed(500, errMsg, "存在未处理事项");
-        }
+//        HttpResponseResult<List<ApiWrapper.LogOff>> check = adminFeignService.accountLogoffCheck(phone);
+//        if (check == null) {
+//            throw new BizException("数据检查失败");
+//        }
+//        List<ApiWrapper.LogOff> errMsg = check.getData();
+//        if (!CollectionUtils.isEmpty(errMsg)) {
+//            return HttpResponseResult.failed(500, errMsg, "存在未处理事项");
+//        }
         return HttpResponseResult.succeed();
     }
 

+ 4 - 5
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -457,14 +457,13 @@ public class UserController extends BaseController {
     }
 
     @ApiOperation(value = "用户注销账号校验")
-    @GetMapping(value = "/logoffCheck")
-    public HttpResponseResult<List<String>> logoffCheck() {
-        AuthUser authUser = SecurityUtils.getUser();
-        SysUser sysUser = sysUserService.get(authUser.getUserId());
+    @GetMapping(value = "/logoffUser/{id}")
+    public HttpResponseResult<Void> logoffUser(@PathVariable("id") Long id) {
+        SysUser sysUser = sysUserService.get(id);
         if (sysUser == null) {
             return failed("用户不存在");
         }
-        return sysUserService.logoffCheckByPhone(sysUser.getPhone());
+        return sysUserService.logoffByPhone(sysUser.getPhone());
     }
 
     @ApiOperation(value = "刷新token")

+ 12 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
@@ -26,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -126,6 +128,16 @@ public class OmsPortalOrderController {
         return HttpResponseResult.succeed(portalOrderService.queryOrderList(userId, status));
     }
 
+
+    /**
+     * feign 接口
+     */
+    @RequestMapping(value = "/checkOrderStatus", method = RequestMethod.GET)
+    @ResponseBody
+    public HttpResponseResult<Map<String, Set<CheckStatus>>> checkOrderStatus(@RequestParam("userId") Long userId) {
+        return HttpResponseResult.succeed(portalOrderService.checkOrderStatus(userId));
+    }
+
     @ApiOperation("根据ID获取订单详情")
     @RequestMapping(value = "/detail/{orderId}", method = RequestMethod.GET)
     @ResponseBody

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java

@@ -21,4 +21,6 @@ public interface OmsOrderReturnApplyDao {
      * 获取申请详情
      */
     OmsOrderReturnApplyResult getDetail(@Param("id")Long id);
+
+    List<OmsOrderReturnApplyVo> getCheckOrder(@Param("userId") Long userId);
 }

+ 11 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsOrderReturnApplyVo.java

@@ -19,6 +19,17 @@ public class OmsOrderReturnApplyVo extends OmsOrderReturnApply {
     @ApiModelProperty("退款状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
     private String refundStatus;
 
+    @ApiModelProperty("下单平台 STUDENT TEACHER")
+    private String platformType;
+
+    public String getPlatformType() {
+        return platformType;
+    }
+
+    public void setPlatformType(String platformType) {
+        this.platformType = platformType;
+    }
+
     public Date getArrivalTime() {
         return arrivalTime;
     }

+ 4 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.service;
 
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
@@ -14,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 前台订单管理Service
@@ -163,4 +165,6 @@ public interface OmsPortalOrderService {
     Boolean lockSku(Long skuId, String platform, Boolean lockState);
 
     List<OmsOrderDetail> queryOrderList(Long userId, String status);
+
+    Map<String, Set<CheckStatus>> checkOrderStatus(Long userId);
 }

+ 70 - 8
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -4,9 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.entity.ContractDto;
@@ -45,6 +47,7 @@ import com.yonge.cooleshow.mbg.model.UmsMemberReceiveAddress;
 import com.yonge.cooleshow.mbg.model.UserOrderPayment;
 import com.yonge.cooleshow.mbg.model.UserOrderRefund;
 import com.yonge.cooleshow.portal.component.CancelOrderSender;
+import com.yonge.cooleshow.portal.dao.OmsOrderReturnApplyDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
@@ -54,6 +57,7 @@ import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
 import com.yonge.cooleshow.portal.domain.ProductStock;
 import com.yonge.cooleshow.portal.domain.SmsCouponHistoryDetail;
+import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyVo;
 import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.OrderPayReq;
 import com.yonge.cooleshow.portal.dto.OrderPayRes;
@@ -94,12 +98,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -171,6 +170,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Autowired
     private OmsOrderCourierService orderCourierService;
 
+    @Autowired
+    private OmsOrderReturnApplyDao omsOrderReturnApplyDao;
 
     @Autowired
     private PortalProductDao productDao;
@@ -365,7 +366,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         orderItemDao.insertList(orderItemList);
         //如使用优惠券更新优惠券使用状态
-        if (orderParam.getCouponId() != null) {
+        if (!StringUtil.isEmpty(orderParam.getCouponId())) {
             // updateCouponStatus(orderParam.getCouponId(), currentMember.getId(), 1);
             // todo 远程调用更新优惠券使用
             adminFeignService.updateCouponOrderInfo(orderParam.getCouponId(),false,order.getOrderSn());
@@ -574,7 +575,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             // updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);
             // todo 退回优惠券
 
-            adminFeignService.updateCouponOrderInfo(cancelOrder.getCouponId(),true,cancelOrder.getOrderSn());
+            if (!StringUtil.isEmpty(cancelOrder.getCouponId())) {
+                adminFeignService.updateCouponOrderInfo(cancelOrder.getCouponId(), true, cancelOrder.getOrderSn());
+            }
             //返还使用积分
             if (cancelOrder.getUseIntegration() != null) {
                 UmsMember member = memberService.getById(cancelOrder.getMemberId());
@@ -698,6 +701,65 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
     @Override
+    public Map<String, Set<CheckStatus>> checkOrderStatus(Long userId) {
+
+        // 订单类型:订单状态为待支付,未确认收货,售后处理中  这三个状态则不允许用户注销
+        OmsOrderExample orderExample = new OmsOrderExample();
+        OmsOrderExample.Criteria criteria = orderExample.createCriteria();
+        criteria.andMemberIdEqualTo(userId);
+        criteria.andStatusIn(Lists.newArrayList(0,6,1,2));
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        Map<String,Set<CheckStatus>> orderStatusMap = new HashMap<>();
+        if (!omsOrders.isEmpty()) {
+            for (OmsOrder omsOrder : omsOrders) {
+                switch (omsOrder.getStatus()) {
+                    case 0:
+                    case 6: {
+                        Set<CheckStatus> checkStatuses = orderStatusMap.get(omsOrder.getPlatformType());
+                        if (checkStatuses == null) {
+                            checkStatuses = new HashSet<>();
+                        }
+                        checkStatuses.add(CheckStatus.WAIT_PAY);
+                        orderStatusMap.put(omsOrder.getPlatformType(), checkStatuses);
+                        break;
+                    }
+                    case 1:
+                    case 2: {
+                        Set<CheckStatus> checkStatuses = orderStatusMap.get(omsOrder.getPlatformType());
+                        if (checkStatuses == null) {
+                            checkStatuses = new HashSet<>();
+                        }
+                        checkStatuses.add(CheckStatus.WAIT_CONFIRM);
+                        orderStatusMap.put(omsOrder.getPlatformType(), checkStatuses);
+                        break;
+                    }
+                    default:
+                        break;
+                }
+            }
+        }
+        // 判断售后处理中的订单
+        List<OmsOrderReturnApplyVo> checkOrder = omsOrderReturnApplyDao.getCheckOrder(userId);
+        if (!CollectionUtils.isEmpty(checkOrder)) {
+            Map<String, List<OmsOrderReturnApplyVo>> map = checkOrder.stream().collect(Collectors.groupingBy(OmsOrderReturnApplyVo::getPlatformType));
+            orderStatusMap.forEach((k,v) -> {
+                List<OmsOrderReturnApplyVo> omsOrderReturnApplyVos = map.get(k);
+                if (!CollectionUtils.isEmpty(omsOrderReturnApplyVos)) {
+                    Set<CheckStatus> checkStatuses = orderStatusMap.get(k);
+                    if (checkStatuses == null) {
+                        checkStatuses = new HashSet<>();
+                    }
+                    checkStatuses.add(CheckStatus.WAIT_AFTER_SALE);
+                    orderStatusMap.put(k, checkStatuses);
+                }
+            });
+        }
+        return orderStatusMap;
+
+
+    }
+
+    @Override
     public OmsOrderDetail detail(Long orderId) {
         OmsOrder omsOrder = orderMapper.selectByPrimaryKey(orderId);
         OmsOrderItemExample example = new OmsOrderItemExample();

+ 8 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml

@@ -9,6 +9,7 @@
 
         <result column="arrival_time_" jdbcType="VARCHAR" property="arrivalTime" />
         <result column="refundStatus" jdbcType="VARCHAR" property="refundStatus" />
+        <result column="platformType" jdbcType="VARCHAR" property="platformType" />
     </resultMap>
     <select id="getList" resultMap="returnApplyDetailResult">
         SELECT
@@ -60,4 +61,11 @@
             LEFT JOIN oms_company_address ca ON ra.company_address_id = ca.id
         WHERE ra.id=#{id};
     </select>
+
+    <select id="getCheckOrder" resultMap="returnApplyDetailResult">
+        select t.*,o.platform_type as platformType from oms_order_return_apply t
+        left join oms_order o on t.order_id = o.id
+        where o.member_id = #{userId} and t.status in (0,1)
+
+    </select>
 </mapper>

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetAuthRecordDao.java

@@ -17,4 +17,6 @@ public interface MusicSheetAuthRecordDao extends BaseMapper<MusicSheetAuthRecord
     List<TeacherMusicSheetVo> selectAuditPage(@Param("page") IPage<TeacherMusicSheetVo> page, @Param("param") TeacherMusicSheetAuditSearch query);
 
     List<MusicSheetAuthRecord> findByMusicSheetIds(@Param("musicSheetIds") List musicSheetIds, @Param("auditStatus") String auditStatus);
+
+    int countTeacherAudit(@Param("userId") Long userId);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -227,4 +227,6 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
     void updateState(@Param("ids") String ids);
 
     void delPractice(@Param("musicSheetId") Long musicSheetId, @Param("userId") Long userId, @Param("clientEnum") ClientEnum clientEnum);
+
+    int countTeacherEnable(@Param("userId") Long userId);
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -20,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
+import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.util.List;

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java

@@ -1,8 +1,8 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.yonge.cooleshow.api.feign.dto.ApiWrapper;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserInfoWrapper;
@@ -44,7 +44,7 @@ public interface SysUserService{
      */
     void imDeviceId(UserInfoWrapper.UpdateUser info);
 
-    List<String> accountLogoffCheck(String phone);
+    List<ApiWrapper.LogOff> accountLogoffCheck(String phone);
 
     void logoffQuitImGroup(String phone);
 }

+ 182 - 55
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java

@@ -7,10 +7,13 @@ import com.dayaedu.cbs.openfeign.wrapper.message.CbsMessageWrapper;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.api.feign.MallPortalFeignService;
-import com.yonge.cooleshow.api.feign.dto.OmsOrderDetail;
+import com.yonge.cooleshow.api.feign.dto.ApiWrapper;
+import com.yonge.cooleshow.api.feign.enums.CheckStatus;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetAuthRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
@@ -19,10 +22,7 @@ import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -46,13 +46,7 @@ import org.apache.commons.lang3.StringUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -101,6 +95,12 @@ public class SysUserServiceImpl implements SysUserService {
     @Autowired
     private ImUserFriendService imUserFriendService;
 
+    @Autowired
+    private MusicSheetDao musicSheetDao;
+
+    @Autowired
+    private MusicSheetAuthRecordDao musicSheetAuthRecordDao;
+
     @Resource
     private MessageFeignClientService messageFeignClientService;
     @Override
@@ -239,86 +239,213 @@ public class SysUserServiceImpl implements SysUserService {
     }
 
     @Override
-    public List<String> accountLogoffCheck(String phone) {
+    public List<ApiWrapper.LogOff> accountLogoffCheck(String phone) {
         SysUser sysUser = this.getDao().findUserByPhone(phone);
         if (sysUser == null || Boolean.TRUE.equals(sysUser.getDelFlag())) {
             throw new BizException("账号不存在");
         }
-        List<String> errMsg = new ArrayList<>();
         Long userId = sysUser.getId();
+        Map<String, List<String>> result = new HashMap<>();
 
         // 存在待支付、未确认收货、售后处理的订单
-        if(hasUnfinishedOrder(userId)){
-            errMsg.add("账户存在未支付、未确认收货、售后处理中的订单");
-        }
-
-        // 存在进行中的课程
-        // 陪练课
-        Integer course = courseGroupService.lambdaQuery()
-                .eq(CourseGroup::getTeacherId, userId)
-                .in(CourseGroup::getType, Arrays.asList("PRACTICE", "LIVE", "PIANO_ROOM_CLASS"))
-                .in(CourseGroup::getStatus, Arrays.asList("ING", "APPLY"))
-                .count();
-        // 视频课
-        Integer videoCourse = videoLessonGroupService.lambdaQuery()
-                .eq(VideoLessonGroup::getTeacherId, userId)
-                .eq(VideoLessonGroup::getShelvesFlag, 1)
-                .count();
-
-        if (course > 0 || videoCourse > 0) {
-            errMsg.add("存在进行中的直播课、陪练课、琴房课,未下架的视频课");
+        Map<String, String> map = hasUnfinishedOrder(userId);
+        if(map != null && map.size()>0){
+            map.forEach((k,v)-> result.put(k, Lists.newArrayList("账号存在"+v+"的订单")));
         }
 
         Teacher teacher = teacherService.getById(userId);
 
         if (teacher != null) {
+            List<String> errMsg = new ArrayList<>();
             // 存在群主身份
             List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
-                    .eq(ImGroupMember::getUserId, userId)
-                    .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
-                    .list();
+                .eq(ImGroupMember::getUserId, userId)
+                .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                .list();
             List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).collect(Collectors.toList());
             if (!groupIdList.isEmpty()) {
                 Collection<ImGroup> imGroups = imGroupService.listByIds(groupIdList);
                 long orgGroups = imGroups.stream().filter(next -> ImGroupType.ORG.equals(next.getType())).count();
                 if (orgGroups > 0) {
-                    errMsg.add("账户为机构群群主、需要转移群主或解散群聊");
+                    errMsg.add("账号为机构群群主,需要转移群主或解散群聊");
+                }
+            }
+
+            // 存在进行中的课程
+            // 陪练课
+            List<CourseGroup> list = courseGroupService.lambdaQuery()
+                .eq(CourseGroup::getTeacherId, userId)
+                .in(CourseGroup::getType, Arrays.asList("PRACTICE", "LIVE", "PIANO_ROOM_CLASS"))
+                .in(CourseGroup::getStatus, Arrays.asList("ING", "APPLY", "NOT_SALE"))
+                .list();
+            String courseMsg ="";
+            if (!CollectionUtils.isEmpty(list)) {
+                List<String> courseTypes = list.stream().map(o -> o.getType()).distinct().collect(Collectors.toList());
+                if (courseTypes.contains(CourseScheduleEnum.LIVE.name())) {
+                    courseMsg += "直播课";
+                }
+                if (courseTypes.contains(CourseScheduleEnum.PRACTICE.name())){
+                    if (courseMsg.length() > 0) {
+                        courseMsg+="/";
+                    }
+                    courseMsg += "陪练课";
+                }
+                if (courseTypes.contains(CourseScheduleEnum.PIANO_ROOM_CLASS.name())){
+                    if (courseMsg.length() > 0) {
+                        courseMsg+="/";
+                    }
+                    courseMsg += "琴房课";
+                }
+                if (courseMsg.length() > 0) {
+                    courseMsg="账号存在未开始/进行中的" + courseMsg;
+                }
+            }
+            // 视频课
+            Integer videoCourse = videoLessonGroupService.lambdaQuery()
+                .eq(VideoLessonGroup::getTeacherId, userId)
+                .eq(VideoLessonGroup::getShelvesFlag, 1)
+                .count();
+
+            if (videoCourse > 0) {
+                if (courseMsg.length() > 0) {
+                    courseMsg+="和未下架的视频课";
+                } else {
+                    courseMsg="账号存在未下架的视频课";
+                }
+            } else {
+                // 判断审核中的视频课
+
+                videoCourse = videoLessonGroupService.lambdaQuery()
+                    .eq(VideoLessonGroup::getTeacherId, userId)
+                    .eq(VideoLessonGroup::getAuditStatus, AuthStatusEnum.DOING)
+                    .count();
+                if (videoCourse > 0) {
+                    if (courseMsg.length() > 0) {
+                        courseMsg+="和未下架的视频课";
+                    } else {
+                        courseMsg="账号存在未下架的视频课";
+                    }
                 }
+
+            }
+            if (courseMsg.length() > 0) {
+                errMsg.add(courseMsg);
             }
 
             // 存在未提现的金额
             UserAccountVo detail = userAccountService.detail(userId);
-            if (detail != null && (detail.getAmountTotal().compareTo(BigDecimal.ZERO) > 0 || detail.getAmountUnrecorded().compareTo(BigDecimal.ZERO) > 0)) {
+            if (detail != null && (detail.getAmountTotal().compareTo(BigDecimal.ZERO) > 0
+                || detail.getAmountUsable().compareTo(BigDecimal.ZERO) > 0
+                || detail.getAmountFrozen().compareTo(BigDecimal.ZERO) > 0)
+                || detail.getAmountUnrecorded().compareTo(BigDecimal.ZERO) > 0) {
                 errMsg.add("收入未结算/推广计划未入账");
             }
+
+            // 查询来源是老师的,用户未下架的曲目
+            int i = musicSheetDao.countTeacherEnable(userId);
+            if (i > 0) {
+                errMsg.add("账号存在未下架曲目");
+            } else {
+                // 检查审核中的曲目
+                int j = musicSheetAuthRecordDao.countTeacherAudit(userId);
+                if (j > 0) {
+                    errMsg.add("账号存在未下架曲目");
+                }
+            }
+            List<String> strings = result.get(ClientEnum.TEACHER.name());
+            if (strings == null) {
+                strings = new ArrayList<>();
+            }
+            strings.addAll(errMsg);
+            result.put(ClientEnum.TEACHER.name(), strings);
+
         }
-        return errMsg;
+
+        List<ApiWrapper.LogOff> logOffs = new ArrayList<>();
+        result.forEach((k,v)->{
+            ApiWrapper.LogOff logOff = new ApiWrapper.LogOff();
+            logOff.setClient(k);
+            logOff.setErrList(v);
+            logOffs.add(logOff);
+        });
+
+
+        return logOffs;
     }
 
-    private boolean hasUnfinishedOrder(Long userId) {
+    private Map<String, String> hasUnfinishedOrder(Long userId) {
         // 商城订单 0->待付款;1->待发货;2->已发货
-        HttpResponseResult<List<OmsOrderDetail>> httpResponseResult = mallPortalFeignService.queryOrderList("0,1,2", userId);
+        HttpResponseResult<Map<String, Set<CheckStatus>>> httpResponseResult = mallPortalFeignService.checkOrderStatus(userId);
         if (httpResponseResult == null) {
             throw new BizException("检查订单信息失败");
         }
-        List<OmsOrderDetail> data = httpResponseResult.getData();
-        if (!CollectionUtils.isEmpty(data)) {
-            return true;
+        Map<String, Set<CheckStatus>> data = httpResponseResult.getData();
+        if (data == null) {
+            data = new HashMap<>();
         }
 
         // 酷乐秀订单
-        Integer count = userOrderService.lambdaQuery()
-                .eq(UserOrder::getUserId, userId)
-                .in(UserOrder::getStatus, Arrays.asList(OrderStatusEnum.WAIT_PAY, OrderStatusEnum.PAYING))
-                .count();
-        if (count > 0) {
-            return true;
+        List<UserOrder> list = userOrderService.lambdaQuery()
+            .eq(UserOrder::getUserId, userId)
+            .in(UserOrder::getStatus, Arrays.asList(OrderStatusEnum.WAIT_PAY, OrderStatusEnum.PAYING))
+            .list();
+        if (!CollectionUtils.isEmpty(list)) {
+            for (UserOrder userOrder : list) {
+                Set<CheckStatus> checkStatuses = data.get(userOrder.getOrderClient().name());
+                if (checkStatuses == null) {
+                    checkStatuses = new HashSet<>();
+                }
+                checkStatuses.add(CheckStatus.WAIT_PAY);
+                data.put(userOrder.getOrderClient().name(), checkStatuses);
+            }
+
         }
-        Integer refundCount = userOrderRefundService.lambdaQuery()
-                .eq(UserOrderRefund::getUserId, userId)
-                .eq(UserOrderRefund::getStatus, AuthStatusEnum.DOING)
-                .count();
-        return refundCount > 0;
+
+        // 退款订单
+        List<UserOrderRefund> list1 = userOrderRefundService.lambdaQuery()
+            .eq(UserOrderRefund::getUserId, userId)
+            .eq(UserOrderRefund::getStatus, AuthStatusEnum.DOING)
+            .list();
+        if (!CollectionUtils.isEmpty(list1)) {
+            // 订单id 集合
+            Set<Long> orderIds = list1.stream().map(UserOrderRefund::getOrderId).collect(Collectors.toSet());
+            List<UserOrder> userOrders = userOrderService.lambdaQuery()
+                .in(UserOrder::getId, orderIds)
+                .list();
+            for (UserOrder userOrder : userOrders) {
+                Set<CheckStatus> checkStatuses = data.get(userOrder.getOrderClient().name());
+                if (checkStatuses == null) {
+                    checkStatuses = new HashSet<>();
+                }
+                checkStatuses.add(CheckStatus.WAIT_AFTER_SALE);
+                data.put(userOrder.getOrderClient().name(), checkStatuses);
+            }
+        }
+
+        if (data.isEmpty()) {
+            return null;
+        }
+        Map<String,String> clientResult = new HashMap<>();
+        data.forEach((k, v) -> {
+            StringBuffer result = new StringBuffer("");
+            if (v.contains(CheckStatus.WAIT_PAY)){
+                result.append("待支付");
+            } if (v.contains(CheckStatus.WAIT_CONFIRM)){
+                if (result.length() > 0) {
+                    result.append("/");
+                }
+                result.append("未确认收货");
+            } if (v.contains(CheckStatus.WAIT_AFTER_SALE)){
+                if (result.length() > 0) {
+                    result.append("/");
+                }
+                result.append("售后处理中");
+            }
+            if (result.length() > 0) {
+                clientResult.put(k,result.toString());
+            }
+        });
+        return clientResult;
     }
 
     /**

+ 5 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetAuthRecordMapper.xml

@@ -107,5 +107,9 @@
             AND audit_state_ = #{auditStatus} group by music_sheet_id_)
     </select>
 
-
+	<select id="countTeacherAudit" resultType="int">
+        select count(1) from music_sheet_auth_record msar
+        left join  music_sheet ms on ms.id_ = msar.music_sheet_id_
+        where  ms.create_by_ = #{userId} and ms.source_type_ = 'TEACHER' and msar.audit_state_ ='DOING'
+    </select>
 </mapper>

+ 6 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -1180,6 +1180,12 @@
 
     </select>
 
+    <select id="countTeacherEnable" resultType="int">
+        select count(1)
+        from music_sheet
+        where state_ = 1 and del_flag_ = 0 and source_type_ = 'TEACHER' and create_by_ = #{userId}
+    </select>
+
     <update id="updateTenantByCbsId">
         update music_sheet ms set
         ms.tenant_sort_number_ = #{item.sortNo},ms.tenant_del_flag_ = 0,