瀏覽代碼

Merge branch 'feature/0721-tenant' of http://git.dayaedu.com/yonge/cooleshow into feature/0721-tenant

Eric 1 年之前
父節點
當前提交
1cc492df93

+ 2 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java

@@ -174,4 +174,6 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
     Integer getUnCompCourseNum(@Param("userId") Long userId);
 
     void updateLockStatus(@Param("userId")Long userId, @Param("lockFlag") Integer lockFlag, @Param("sysUserType")  String sysUserType);
+
+    Long getTenantByClient(@Param("userId") Long userId, @Param("clientId") String clientId);
 }

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -211,4 +211,7 @@ public interface SysUserService extends BaseService<Long, SysUser> {
      * @return SysUser
      */
     SysUser queryUserInfoWithIMToken(Long userId, EClientType clientType);
+
+    //根据用户类型获取机构编号
+    Long getTenantByClient(Long userId, String clientId);
 }

+ 5 - 9
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -378,17 +378,8 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         SysUser sysUser = sysUserDao.get(userId);
 
         if (EClientType.STUDENT == clientType && Objects.nonNull(sysUser)) {
-
             // 重新请求生成IM会话TOKEN
             try {
-
-                /*HttpResponseResult<Boolean> recv = teacherFeignService.userTeacherIdentityInfo(userId);
-
-                if (Objects.nonNull(recv) && recv.getData()) {
-                    // 同时一个手机号,拥手老师、学生身份时,为学生创建新的IMToken
-
-                }*/
-
                 String name = sysUser.getUsername();
                 if(StringUtils.isEmpty(name)){
                     name = sysUser.getRealName();
@@ -412,4 +403,9 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
         return sysUser;
     }
+
+    @Override
+    public Long getTenantByClient(Long userId, String clientId) {
+        return sysUserDao.getTenantByClient(userId,clientId);
+    }
 }

+ 8 - 13
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -93,29 +93,24 @@ public class TokenController extends BaseController {
     public SysUser queryUserInfo() {
         AuthUser authUser = SecurityUtils.getUser();
         if (authUser != null) {
-            return userService.get(authUser.getUserId());
+            SysUser sysUser = userService.get(authUser.getUserId());
+            sysUser.setTenantId(userService.getTenantByClient(authUser.getUserId(),authUser.getClientId()));
+            return sysUser;
         }
         return null;
     }
 
     @ApiOperation(value = "获取用户信息")
     @GetMapping("/api/queryUserInfo")
-    public Object apiQueryUserInfo(@RequestParam(value = "clientType", required = false, defaultValue = "TEACHER") String clientType) {
-
-        // 校验客户端类型
-        if (EClientType.invalid(clientType)) {
-            return failed("无效的客户端类型");
-        }
-
+    public Object apiQueryUserInfo() {
         AuthUser authUser = SecurityUtils.getUser();
         if (authUser != null) {
-            SysUser sysUser = userService.queryUserInfoWithIMToken(authUser.getUserId(), EClientType.valueOf(clientType));
-
+            SysUser sysUser = userService.queryUserInfoWithIMToken(authUser.getUserId(), EClientType.valueOf(authUser.getClientId()));
+            sysUser.setTenantId(userService.getTenantByClient(authUser.getUserId(),authUser.getClientId()));
             String imUserId = String.valueOf(sysUser.getId());
-            if (EClientType.STUDENT.match(clientType)) {
-                imUserId = MessageFormat.format("{0}:{1}",imUserId, clientType);
+            if (EClientType.STUDENT.match(authUser.getClientId())) {
+                imUserId = MessageFormat.format("{0}:{1}",imUserId, authUser.getClientId());
             }
-
             // 封装返回参数
             return succeed(JSON.parseObject(JSON.toJSONString(sysUser), SysUserVo.class).imUserId(imUserId));
         }

+ 15 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -304,6 +304,21 @@
         where cs.teacher_id_ = #{userId}
           and status_ in ('NOT_START','ING')
     </select>
+    <select id="getTenantByClient" resultType="java.lang.Long">
+        select tenant_id_ from
+        <choose>
+            <when test="clientId == 'STUDENT'">
+                student
+            </when>
+            <when test="clientId == 'TEACHER'">
+                teacher
+            </when>
+            <when test="clientId == 'SYSTEM'">
+                employee
+            </when>
+        </choose>
+        where user_id_ = #{userId}
+    </select>
 
     <update id="updateLockStatus">
         <if test="sysUserType == 'STUDENT'">

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java

@@ -10,7 +10,9 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -69,6 +71,9 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty("机构名称")
     private String tenantName;
 
+    @ApiModelProperty(value = "手机号码列表", hidden = true)
+    private List<String> phoneList = new ArrayList<>();
+
     @ApiModelProperty(value = "排序方式",hidden = true)
     private String orderBy;
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -14,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 
 import java.util.List;
 import java.util.Map;
@@ -112,4 +113,11 @@ public interface StudentService extends IService<Student> {
      * @param studentInfo 学生信息
      */
     Boolean save(StudentWrapper.Student studentInfo);
+
+    /**
+     * 导入学生
+     * @param dataList 数据列表
+     * @param id 操作人
+     */
+    void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList, Long id);
 }

+ 72 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -6,8 +6,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
@@ -15,10 +15,20 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -30,7 +40,9 @@ import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.string.ValueUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RMap;
@@ -46,6 +58,7 @@ import java.text.MessageFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -120,12 +133,15 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         studentHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
 
         // IM聊天用户ID
-        studentHomeVo.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(detail.getUserId()), ClientEnum.STUDENT.name()));
+        studentHomeVo.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(detail.getUserId()),
+                ClientEnum.STUDENT.name()));
 
         // 判断是否是机构学生 机构学生 检测机构专辑购买记录
         TenantInfo tenantInfo = tenantInfoService.detail(detail.getTenantId());
         if (tenantInfo != null) {
-            UserTenantAlbumRecord record = userTenantAlbumRecordService.getNewestByTenantIdAndUserId(tenantInfo.getId(), detail.getUserId(), ClientEnum.STUDENT);
+            UserTenantAlbumRecord record =
+                    userTenantAlbumRecordService.getNewestByTenantIdAndUserId(tenantInfo.getId(), detail.getUserId(),
+                            ClientEnum.STUDENT);
             if (record == null || record.getEndTime().getTime() < System.currentTimeMillis()) {
                 studentHomeVo.setTenantAlbumFlag(YesOrNoEnum.NO);
             } else {
@@ -353,6 +369,57 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList, Long id) {
+        if (dataList.isEmpty()) {
+            throw new BizException("导入数据不能为空");
+        }
+        dataList.sort(Comparator.comparingInt(ExcelDataReaderProperty::getRowIndex));
+
+        // 校验数据的完整性
+        List<String> errMsg = new ArrayList<>();
+        Map<String, Integer> phoneMap = new HashMap<>();
+        for (ExcelDataReaderProperty<StudentWrapper.StudentExport> next : dataList) {
+            Integer rowIndex = next.getRowIndex();
+            StudentWrapper.StudentExport student = next.getClazz();
+
+            student.checkValid().forEach(err -> errMsg.add(String.format("第%s行%s", rowIndex, err)));
+
+            if (phoneMap.containsKey(student.getPhone().trim())) {
+                errMsg.add(String.format("第%s行手机号重复", rowIndex));
+            } else {
+                phoneMap.put(student.getPhone().trim(), rowIndex);
+            }
+
+            if (errMsg.size() > 100) {
+                break;
+            }
+        }
+
+        int row = 100;
+        int page = 1;
+        List<List<String>> phonePartition = Lists.partition(new ArrayList<>(phoneMap.keySet()), row);
+
+        StudentSearch studentSearch = new StudentSearch();
+        studentSearch.setRows(row);
+        studentSearch.setPage(page);
+        for (List<String> phones : phonePartition) {
+            studentSearch.setPhoneList(phones);
+            List<StudentVo> studentVos = baseMapper.selectPage(PageUtil.getPage(studentSearch), studentSearch);
+            page++;
+
+            if (!studentVos.isEmpty()) {
+                List<String> existPhoneList = studentVos.stream().map(StudentVo::getPhone).collect(Collectors.toList());
+                existPhoneList.forEach(phone -> errMsg.add(String.format("第%s行手机号已经注册学生", phoneMap.get(phone))));
+            }
+        }
+
+        if (!errMsg.isEmpty()) {
+            throw new BizException(String.join(",", errMsg));
+        }
+    }
+
     private Boolean updateStudent(StudentWrapper.Student studentInfo) {
         StudentVo student = detail(studentInfo.getId());
         if (student == null) {

+ 51 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -7,9 +8,13 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
 
 /**
  * 学生封装类
@@ -86,7 +91,7 @@ public class StudentWrapper {
 
     @Data
     @ApiModel("学生基础信息")
-    public static class Student{
+    public static class Student {
 
         @ApiModelProperty("id")
         private Long id;
@@ -119,7 +124,7 @@ public class StudentWrapper {
 
     @Data
     @ApiModel("解绑机构")
-    public static class UnbindTenant{
+    public static class UnbindTenant {
 
         @ApiModelProperty("短信验证码")
         private String code;
@@ -127,4 +132,48 @@ public class StudentWrapper {
         @ApiModelProperty("解绑原因")
         private String unbindReason;
     }
+
+
+    @Data
+    @ApiModel("学生导入模板模型")
+    public static class StudentExport {
+
+        @ExcelProperty(value = "学生姓名")
+        private String userName;
+
+        @ExcelProperty(value = "手机号码")
+        private String phone;
+
+        @ExcelProperty(value = "声部")
+        private String subjectId;
+
+        @ExcelProperty(value = "出生日期")
+        private String birthday;
+
+        @ExcelProperty(value = "性别")
+        private String gender;
+
+        public List<String> checkValid() {
+            ArrayList<String> errMsg = new ArrayList<>();
+            if (StringUtils.isEmpty(userName)) {
+                errMsg.add("姓名为空");
+            }
+            if (StringUtils.isEmpty(phone)) {
+                errMsg.add("手机号为空");
+            }
+            if (Pattern.matches("^1[3-9]\\d{9}$", phone)) {
+                errMsg.add("手机号格式错误");
+            }
+            if (StringUtils.isEmpty(subjectId)) {
+                errMsg.add("声部为空");
+            }
+            if (StringUtils.isEmpty(birthday)) {
+                errMsg.add("出生日期为空");
+            }
+            if (StringUtils.isEmpty(gender)) {
+                errMsg.add("性别为空");
+            }
+            return errMsg;
+        }
+    }
 }

+ 5 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -1,12 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
-import com.alibaba.excel.annotation.ExcelIgnore;
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.sun.istack.internal.NotNull;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
@@ -17,7 +12,6 @@ import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.common.enums.payment.EGoodsType;
 import com.yonge.cooleshow.common.enums.payment.EPaymentStatus;
 import com.yonge.cooleshow.common.enums.payment.EPaymentType;
-import io.rong.util.ParamNotNull;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -25,13 +19,14 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
-import org.joda.time.DateTime;
 
-import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.text.MessageFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * 平台订单表

+ 25 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java

@@ -191,4 +191,29 @@ public class StudentController extends BaseController {
         return succeed();
     }
 
+    @PostMapping("/logoffAccount")
+    @ApiOperation(value = "注销学生账户")
+    public HttpResponseResult<Boolean> logoffAccount(@RequestParam("code") String code) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if (StringUtils.isEmpty(code)) {
+            return failed("验证码不能为空");
+        }
+        boolean validCode = smsCodeService.verifyValidCode(user.getPhone(), code, "");
+        if (validCode) {
+            return failed("验证码错误");
+        }
+
+        studentService.lambdaUpdate()
+                .set(Student::getLockFlag, true)
+                .set(Student::getHideFlag, true)
+                .eq(Student::getUserId, user.getId())
+                .update();
+        user.setDelFlag(true);
+        sysUserFeignService.update(user);
+        return succeed();
+    }
+
 }

+ 28 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -12,22 +12,30 @@ import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.BizHttpStatus;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.UserStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.easyexcel.ErrMsg;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReader;
+import com.yonge.toolset.utils.easyexcel.ExcelException;
+import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -91,6 +99,26 @@ public class StudentController extends BaseController {
         return succeed();
     }
 
+    @PostMapping("/importExcel")
+    @ApiOperation(value = "导入", notes = "传入file")
+    public HttpResponseResult<List<ErrMsg>> importExcel(@RequestParam("file") MultipartFile file) {
+        if (null == file) {
+            return HttpResponseResult.failed("请上传文件");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        try {
+            ExcelDataReader<StudentWrapper.StudentExport> reader =
+                    ExcelUtils.getReader(StudentWrapper.StudentExport.class, file);
+            studentService.importStudentExcel(reader.getDataList(), user.getId());
+            return HttpResponseResult.succeed();
+        } catch (ExcelException e) {
+            return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(), BizHttpStatus.IMPORT.getMsg());
+        }
+    }
+
     private TenantInfo getTenantInfo() {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())