Bladeren bron

商城订单调整、账号注销逻辑调整

yuanliang 1 jaar geleden
bovenliggende
commit
76a99679af

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

@@ -209,4 +209,12 @@ public interface AdminFeignService {
     HttpResponseResult<Object> workOverdue();
 
 
+    /**
+     * 账号注销校验
+     */
+    @PostMapping("/sysUser/logoffCheck")
+    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam("phone") String phone);
+
+    @PostMapping("/sysUser/dismissFanImGroup")
+    HttpResponseResult<Boolean> dismissFanImGroup(@RequestParam("phone") String phone);
 }

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

@@ -204,4 +204,15 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public ImUserInfo register(String userId, String clientType, String username, String avatar) {
         return null;
     }
+
+
+    @Override
+    public HttpResponseResult<List<String>> accountLogoffCheck(String phone) {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult<Boolean> dismissFanImGroup(String phone) {
+        return null;
+    }
 }

+ 40 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysUserController.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.admin.controller;
+
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+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 java.util.List;
+
+@RestController
+@RequestMapping("${app-config.url.admin:}/sysUser")
+@Api(value = "用户表", tags = "用户表")
+public class SysUserController extends BaseController {
+
+    @Autowired
+    private SysUserService sysUserService;
+
+
+    /**
+     * 账号注销校验
+     */
+    @PostMapping("/sysUser/logoffCheck")
+    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam("phone") String phone) {
+        List<String> strings = sysUserService.accountLogoffCheck(phone);
+        return HttpResponseResult.succeed(strings);
+    }
+
+    @PostMapping("/sysUser/dismissFanImGroup")
+    HttpResponseResult<Boolean> dismissFanImGroup(@RequestParam("phone") String phone){
+        sysUserService.dismissFanImGroup(phone);
+        return HttpResponseResult.succeed(true);
+    }
+
+}

+ 2 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.dto.UserSetReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
 import com.yonge.cooleshow.auth.enums.EClientType;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.ImUserModel;
 import com.yonge.toolset.mybatis.service.BaseService;
 
@@ -221,7 +222,7 @@ public interface SysUserService extends BaseService<Long, SysUser> {
      */
     SysUser getSysUserByOpenId(String openId, String clientId);
 
-    void logoffByPhone(String phone);
+    HttpResponseResult<List<String>> logoffByPhone(String phone);
 
 
     void updateStudentHideFlag(Long userId, int hideFlag);

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

@@ -432,7 +432,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void logoffByPhone(String phone) {
+    public HttpResponseResult<List<String>> logoffByPhone(String phone) {
+
+        HttpResponseResult<List<String>> check = adminFeignService.accountLogoffCheck(phone);
+        List<String> errMsg = check.getData();
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(errMsg)) {
+            return HttpResponseResult.failed(500, errMsg, "注销失败");
+        }
+
         int num = sysUserDao.countByPhone(phone);
         //冻结相关所有客户端账号
         sysUserDao.updateLockStatusByPhone(phone);
@@ -441,8 +448,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         if(i < 1){
             throw new BizException("用户不存在或已注销");
         }
+        // 解散群
+        adminFeignService.dismissFanImGroup(phone);
+
         //退出登录
         tokenService.revokeTokenByPhone(phone);
+        return HttpResponseResult.succeed();
     }
 
     @Override

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.auth.web.controller;
 
+import com.yonge.cooleshow.api.feign.StudentFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.cooleshow.auth.api.dto.UpdatePasswordDto;
@@ -439,7 +440,7 @@ public class UserController extends BaseController {
             @ApiImplicitParam(name = "smsCode", value = "短信验证码", paramType = "path", dataType = "long", required = true),
     })
     @GetMapping(value = "/logoff/{smsCode}")
-    public HttpResponseResult<Boolean> logoff(@PathVariable("smsCode") String smsCode) {
+    public HttpResponseResult<List<String>> logoff(@PathVariable("smsCode") String smsCode) {
         AuthUser authUser = SecurityUtils.getUser();
         SysUser sysUser = sysUserService.get(authUser.getUserId());
         if (sysUser == null) {
@@ -450,9 +451,8 @@ public class UserController extends BaseController {
         if (!b) {
             throw new BadCredentialsException("验证码校验失败");
         }
-        sysUserService.logoffByPhone(sysUser.getPhone());
+        return sysUserService.logoffByPhone(sysUser.getPhone());
 //        sysUserService.logoffById(sysUser.getId());
-        return succeed(true);
     }
 
     @ApiOperation(value = "刷新token")

+ 11 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OmsReturnApplyQueryParam.java

@@ -22,6 +22,9 @@ public class OmsReturnApplyQueryParam {
     @ApiModelProperty(value = "处理时间")
     private String handleTime;
 
+    @ApiModelProperty(value = "订单编号")
+    private String orderSn;
+
     public Long getId() {
         return id;
     }
@@ -69,4 +72,12 @@ public class OmsReturnApplyQueryParam {
     public void setHandleTime(String handleTime) {
         this.handleTime = handleTime;
     }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
 }

+ 29 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.cooleshow.mall.common.exception.ApiException;
 import com.yonge.cooleshow.mall.common.service.RedisService;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderItemMapper;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper;
@@ -36,6 +37,7 @@ import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 订单退货管理Service实现类
@@ -52,6 +54,9 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     private OmsOrderReturnApplyMapper returnApplyMapper;
 
     @Autowired
+    private OmsOrderMapper orderMapper;
+
+    @Autowired
     private OmsOrderItemMapper orderItemMapper;
 
     @Autowired
@@ -136,7 +141,30 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         } else {
             return 0;
         }
-        return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
+        int update = returnApplyMapper.updateByPrimaryKeySelective(returnApply);
+        // 更新订单状态
+        updateOrderStatus(omsOrderReturnApply.getOrderSn());
+        return update;
+    }
+
+    private void updateOrderStatus(String orderSn) {
+        // 待发货订单,退费成功后,关闭订单
+        OmsOrder byOrderSn = orderMapper.getByOrderSn(orderSn);
+        if (byOrderSn.getStatus() != 1) {
+            return;
+        }
+
+
+        OmsOrderReturnApplyExample applyExample = new OmsOrderReturnApplyExample();
+        applyExample.createCriteria().andOrderSnEqualTo(orderSn);
+        List<OmsOrderReturnApply> applyList = returnApplyMapper.selectByExample(applyExample);
+
+        List<Integer> statusList = applyList.stream().map(OmsOrderReturnApply::getStatus).distinct().collect(Collectors.toList());
+        // 全部退回完成,更新订单状态为已关闭
+        if (statusList.stream().allMatch(n -> n == 2)) {
+            byOrderSn.setStatus(4);
+            orderMapper.updateByPrimaryKey(byOrderSn);
+        }
     }
 
 

+ 5 - 1
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml

@@ -13,7 +13,8 @@
         product_count,
         return_name,
         status,
-        handle_time
+        handle_time,
+        order_sn
         FROM
         oms_order_return_apply
         WHERE
@@ -40,6 +41,9 @@
             AND (return_name LIKE concat("%",#{queryParam.receiverKeyword},"%")
             OR return_phone LIKE concat("%",#{queryParam.receiverKeyword},"%"))
         </if>
+        <if test="queryParam.orderSn != null">
+            and order_sn like concat('%',#{queryParam.orderSn},'%')
+        </if>
         order by id desc
     </select>
     <select id="getDetail" resultMap="returnApplyDetailResultMap">

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

@@ -42,4 +42,8 @@ public interface SysUserService{
      *
      */
     void imDeviceId(UserInfoWrapper.UpdateUser info);
+
+    List<String> accountLogoffCheck(String phone);
+
+    void dismissFanImGroup(String phone);
 }

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

@@ -4,14 +4,22 @@ import com.google.common.collect.Lists;
 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.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 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.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.biz.dal.service.SysUserService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserInfoWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
@@ -22,18 +30,24 @@ import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import com.yonge.toolset.utils.idcard.IdcardValidator;
 import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.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.stream.Collectors;
 
+@Slf4j
 @Service
 public class SysUserServiceImpl implements SysUserService {
 
@@ -57,6 +71,27 @@ public class SysUserServiceImpl implements SysUserService {
     @Autowired
     private MessageSenderPluginContext messageSenderPluginContext;
 
+    @Autowired
+    private UserOrderService userOrderService;
+
+    @Autowired
+    private UserOrderRefundService userOrderRefundService;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    @Autowired
+    private UserAccountService userAccountService;
+
     @Override
     public SysUserMapper getDao() {
         return sysUserMapper;
@@ -187,4 +222,104 @@ public class SysUserServiceImpl implements SysUserService {
         messageSenderPluginContext.getMessageSenderPlugin(MessageSenderPluginContext.MessageSender.JIGUANG)
             .deviceRemoveAlias(info.getUserId().toString(),Lists.newArrayList(info.getImDeviceId()),info.getClient().getCode());
     }
+
+    @Override
+    public List<String> 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();
+
+        // 存在待支付、未确认收货、售后处理的订单
+        Integer count = userOrderService.lambdaQuery()
+                .eq(UserOrder::getUserId, userId)
+                .in(UserOrder::getStatus, Arrays.asList(OrderStatusEnum.WAIT_PAY, OrderStatusEnum.PAYING, OrderStatusEnum.PAID))
+                .count();
+        if (count > 0) {
+            errMsg.add("账户存在未支付、未确认收货、售后处理中的订单");
+        } else {
+            Integer refundCount = userOrderRefundService.lambdaQuery()
+                    .eq(UserOrderRefund::getUserId, userId)
+                    .eq(UserOrderRefund::getStatus, AuthStatusEnum.DOING)
+                    .count();
+            if (refundCount > 0) {
+                errMsg.add("账户存在未支付、未确认收货、售后处理中的订单");
+            }
+        }
+
+        Teacher teacher = teacherService.getById(userId);
+
+        if (teacher != null) {
+            // 存在群主身份
+            List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                    .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("账户为机构群群主、需要庄毅群主或解散群聊");
+                }
+            }
+
+            // 存在进行中的课程
+            // 陪练课
+            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("存在进行中的课程");
+            }
+
+            // 存在未提现的金额
+            UserAccountVo detail = userAccountService.detail(userId);
+            if (detail != null && (detail.getAmountTotal().compareTo(BigDecimal.ZERO) > 0 || detail.getAmountUnrecorded().compareTo(BigDecimal.ZERO) > 0)) {
+                errMsg.add("收入未结算/推广计划未入账");
+            }
+        }
+        return errMsg;
+    }
+
+    @Override
+    public void dismissFanImGroup(String phone) {
+        SysUser sysUser = this.getDao().findUserByPhone(phone);
+        if (sysUser == null) {
+            return;
+        }
+        Teacher teacher = teacherService.getById(sysUser.getId());
+        if (teacher == null) {
+            return;
+        }
+        List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                .eq(ImGroupMember::getUserId, sysUser.getId())
+                .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                .list();
+        List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).collect(Collectors.toList());
+        if (groupIdList.isEmpty()) {
+            return;
+        }
+        Collection<ImGroup> imGroups = imGroupService.listByIds(groupIdList);
+        List<String> groupIds = imGroups.stream().filter(next -> ImGroupType.FAN.equals(next.getType()) || ImGroupType.COURSE.equals(next.getType()))
+                .map(ImGroup::getId).collect(Collectors.toList());
+
+        for (String groupId : groupIds) {
+            try {
+                imGroupService.dismiss(groupId);
+            } catch (Exception e) {
+                log.error("群解散失败:" + groupId);
+            }
+        }
+    }
 }