liujc 1 yıl önce
ebeveyn
işleme
151a57e085
40 değiştirilmiş dosya ile 1120 ekleme ve 177 silme
  1. 7 0
      cooleshow-api/pom.xml
  2. 17 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  3. 115 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/TenantWrapper.java
  4. 16 13
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java
  5. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  6. 6 2
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/SysUserType.java
  7. 2 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  8. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  9. 51 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  10. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  11. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java
  12. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareWeekDataDao.java
  13. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareWeekData.java
  14. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysUser.java
  15. 3 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantStaff.java
  16. 71 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java
  17. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  18. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java
  19. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareWeekDataService.java
  20. 4 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantStaffService.java
  21. 8 27
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  22. 63 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java
  23. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareWeekDataServiceImpl.java
  24. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  25. 54 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  26. 263 64
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  27. 8 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantStaffServiceImpl.java
  28. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  29. 25 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  30. 13 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  31. 170 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml
  32. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  33. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  34. 22 29
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  35. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantStaffMapper.xml
  36. 4 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml
  37. 3 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java
  38. 4 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  39. 24 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java
  40. 4 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java

+ 7 - 0
cooleshow-api/pom.xml

@@ -26,5 +26,12 @@
             <groupId>com.yonge.cooleshow</groupId>
             <artifactId>cooleshow-common</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.20</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

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

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 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.fallback.AdminFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
@@ -118,6 +119,22 @@ public interface AdminFeignService {
     @GetMapping(value = "/open/adminClient/getEmployee")
     HttpResponseResult<EmployeeApi> getEmployee(@RequestParam("userId") Long userId);
 
+    /**
+     * 机构信息
+     * @param tenantId 机构ID
+     * @return TenantWrapper.Tenant
+     */
+    @GetMapping(value = "/open/adminClient/getTenant")
+    HttpResponseResult<TenantWrapper.Tenant> getTenantInfo(@RequestParam("tenantId") Long tenantId);
+
+    /**
+     * 机构员工信息
+     * @param userId 用户ID
+     * @return TenantWrapper.Staff
+     */
+    @GetMapping(value = "/open/adminClient/getTenantStaff")
+    HttpResponseResult<TenantWrapper.Staff> getTenantStaff(@RequestParam("userId") Long userId);
+
 
     @PostMapping(value = "/open/adminClient/orderUpdate", consumes="application/json", produces="application/json")
     HttpResponseResult<Boolean> updateCouponOrderInfo(@RequestParam("couponIssueId") String couponIssueId,

+ 115 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/TenantWrapper.java

@@ -0,0 +1,115 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+/**
+ * 机构员工表
+ * 2023-07-21 17:32:49
+ */
+public class TenantWrapper implements Serializable {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("tenant - 机构表")
+    public static class Tenant implements Serializable {
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("logo")
+        private String logo;
+
+        @ApiModelProperty("省份编码")
+        private Integer provinceCode;
+
+        @ApiModelProperty("城市编码")
+        private Integer cityCode;
+
+        @ApiModelProperty("地区/街道")
+        private Integer regionCode;
+
+        @ApiModelProperty("联系人")
+        private String username;
+
+        @ApiModelProperty("管理员ID,用户ID")
+        private Long userId;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+        @ApiModelProperty("启用/冻结")
+        private Boolean enableFlag;
+
+        @ApiModelProperty("简介")
+        @TableField(value = "brief_introduction_")
+        private String briefIntroduction;
+
+        public static Tenant from(String json) {
+            return JSON.parseObject(json, Tenant.class);
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantStaff-机构员工表")
+    public static class Staff implements Serializable {
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("昵称")
+        private String nickname;
+
+        @ApiModelProperty("IM授权签名")
+        private String imToken;
+
+        @ApiModelProperty("微信ID")
+        private String wechatId;
+
+        @ApiModelProperty("微信OpenID")
+        private String wxOpenid;
+
+        @ApiModelProperty("公众号关注标识")
+        private Boolean subscribeFlag;
+
+        @ApiModelProperty("管理员标识")
+        private Boolean manageAdmin;
+
+        @ApiModelProperty("介绍")
+        private String introduction;
+
+        @ApiModelProperty("帐号状态(注销,冻结,激活)")
+        private String status;
+
+        public static Staff from(String json) {
+            return JSON.parseObject(json, Staff.class);
+        }
+    }
+
+}

+ 16 - 13
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java

@@ -1,14 +1,17 @@
 package com.yonge.cooleshow.auth.core.provider.service;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
+import com.yonge.cooleshow.api.feign.dto.TenantWrapper;
+import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.service.SysUserService;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.security.AuthUser;
+import com.yonge.cooleshow.common.security.SecurityConstants;
 import com.yonge.cooleshow.common.util.WebUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,24 +22,16 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
-import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.security.AuthUser;
-import com.yonge.cooleshow.common.security.SecurityConstants;
-
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 public class DefaultUserDetailsService implements UserDetailsService {
 
     @Autowired
-    private PasswordEncoder passwordEncoder;
-
-    @Autowired
     private SysUserService sysUserService;
 
     @Resource
@@ -93,6 +88,14 @@ public class DefaultUserDetailsService implements UserDetailsService {
             if (UserLockFlag.LOCKED.equals(data.getLockFlag())) {
                 throw new LockedException("账户被锁定");
             }
+        } else if (SysUserType.ORGANIZATION.getCode().equals(clientId)) {
+            TenantWrapper.Staff tenantStaff = adminFeignService.getTenantStaff(sysUser.getId()).getData();
+            if (tenantStaff == null) {
+                throw new UsernameNotFoundException("账户不存在");
+            }
+            if (UserLockFlag.LOCKED.name().equals(tenantStaff.getStatus())) {
+                throw new LockedException("账户被锁定");
+            }
         }
 
         List<GrantedAuthority> authorities = null;

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

@@ -390,7 +390,7 @@ public class UserController extends BaseController {
         }
 
         // 新密码规则:clx+手机号后四位
-        String newPassword = MessageFormat.format("klx{0}", sysUser.getPhone().substring(7));
+        String newPassword = MessageFormat.format("klxjg{0}", sysUser.getPhone().substring(7));
 
         // 生成重置默认密码
         String password = new BCryptPasswordEncoder().encode(newPassword);

+ 6 - 2
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/SysUserType.java

@@ -2,11 +2,15 @@ package com.yonge.cooleshow.common.enums;
 
 import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
-import org.apache.commons.lang3.StringUtils;
 
 public enum SysUserType implements BaseEnum<String, SysUserType> {
 
-    STUDENT("学生"), TEACHER("指导老师"), SYSTEM("系统內置");
+    STUDENT("学生"),
+    TEACHER("指导老师"),
+    SYSTEM("系统內置"),
+    ORGANIZATION("机构"),
+    ;
+
     @EnumValue
     private String code;
 

+ 2 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -10,6 +10,7 @@ import java.io.OutputStream;
 import java.util.Date;
 import java.util.List;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
@@ -54,8 +55,7 @@ public class StudentController extends BaseController {
     @Autowired
     private StudentService studentService;
 
-
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired

+ 2 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -26,6 +26,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
@@ -78,7 +79,7 @@ import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
 @Api(value = "教师表", tags = "教师表")
 public class TeacherController extends BaseController {
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private TeacherService teacherService;

+ 51 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -1,14 +1,18 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponOrderVO;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
+import com.yonge.cooleshow.api.feign.dto.TenantWrapper;
 import com.yonge.cooleshow.biz.dal.entity.Employee;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
@@ -17,6 +21,8 @@ import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.service.EmployeeService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
 import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
@@ -24,12 +30,13 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.jwt.Jwt;
@@ -46,12 +53,13 @@ import java.math.BigDecimal;
 import java.security.interfaces.RSAPublicKey;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
+@Slf4j
 @RestController
 @RequestMapping("/open/adminClient")
 public class AdminClient extends BaseController {
-    private final static Logger log = LoggerFactory.getLogger(UserOrderClient.class);
 
     @Autowired
     private UserFirstTimeService userFirstTimeService;
@@ -68,6 +76,12 @@ public class AdminClient extends BaseController {
     @Autowired
     private CouponInfoService couponInfoService;
 
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
     @GetMapping("/recordTime")
     public HttpResponseResult<Boolean> recordTime(
             @RequestParam("userId") Long userId,
@@ -132,6 +146,40 @@ public class AdminClient extends BaseController {
         return succeed(employeeApi);
     }
 
+    @ApiOperation(value = "机构信息查询", notes = "tenantId -> 机构ID")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tenantId", value = "机构ID", required = true, dataType = "Long", paramType = "query")
+    })
+    @GetMapping("/getTenant")
+    public HttpResponseResult<TenantWrapper.Tenant> getTenant(@RequestParam("tenantId") Long tenantId) {
+
+        TenantWrapper.Tenant build = TenantWrapper.Tenant.builder().build();
+
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        if (Objects.nonNull(tenantInfo)) {
+            build = TenantWrapper.Tenant.from(JSON.toJSONString(tenantInfo));
+        }
+
+        return succeed(build);
+    }
+
+    @ApiOperation(value = "机构员工信息查询", notes = "userId -> 机构用户ID")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "机构用户ID", required = true, dataType = "Long", paramType = "query")
+    })
+    @GetMapping("/getTenantStaff")
+    public HttpResponseResult<TenantWrapper.Staff> getTenantStaff(@RequestParam("userId") Long userId) {
+
+        // 默认返回值
+        TenantWrapper.Staff ret = TenantWrapper.Staff.builder().build();
+
+        TenantStaff staff = tenantStaffService.getByUserId(userId);
+        if (Objects.nonNull(staff)) {
+            ret = TenantWrapper.Staff.from(JSON.toJSONString(staff));
+        }
+        return succeed(ret);
+    }
+
     /**
      * 订单优惠券信息
      * @return HttpResponseResult<CouponOrderVO.CouponPageInfo>

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -71,4 +71,7 @@ public interface StudentDao extends BaseMapper<Student> {
      */
     List<MyFollow> queryMyFollow(@Param("page") IPage page, @Param("param") QueryMyFollowSearch query);
 
+    List<Map<Integer, String>> getStudentSubjectMapList(List<Long> studentIds);
+
+    int countStudentsWithTenant(Map<String, Object> params);
 }

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
@@ -28,6 +29,7 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 
 	int countMusicGroupStudentTrainData(Map<String, Object> params);
 
+
 	//统计分部小酷Ai新增人数
 	int getOrganNewCloudStudyNum(@Param("organId") Integer organId);
 
@@ -60,4 +62,8 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 
 	//学生端训练统计
 	SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordDto studentTrainStat(@Param("query") SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordQuery query);
+
+	//统计用户指定周训练数据
+	SysMusicCompareWeekData getUserWeekCompareData(@Param("userId") Long userId,
+												   @Param("monday") String monday);
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareWeekDataDao.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface SysMusicCompareWeekDataDao extends BaseDAO<Integer, SysMusicCompareWeekData> {
+
+    SysMusicCompareWeekData getWithUserAndMonday(@Param("userId") Long userId,
+                                                 @Param("monday") String monday);
+
+    List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> getUserTrainStat(@Param("monday") String monday,
+                                                                                 @Param("orderType") Integer orderType,
+                                                                                 @Param("heardLevel") String heardLevel,
+                                                                                 @Param("tenantId") Long tenantId);
+	
+}

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareWeekData.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_music_compare_week_data):
+ */
+@Data
+public class SysMusicCompareWeekData extends BaseEntity {
+
+	/** 用户编号 */
+	private Long userId;
+	
+	/** 周一日期 */
+	private java.util.Date monday;
+	
+	/** 训练次数 */
+	private Integer trainNum;
+	
+	/** 本周训练天数 */
+	private Integer trainDays;
+	
+	/** 本周训练时长 */
+	private Float trainTime;
+	
+	/** 本周入门级最高分 */
+	private Integer beginnerMaxScore;
+	private Integer beginnerMaxScoreId;
+
+	/** 本周进阶级最高分 */
+	private Integer advancedMaxScore;
+	private Integer advancedMaxScoreId;
+
+	/** 本周大师级最高分 */
+	private Integer performerMaxScore;
+	private Integer performerMaxScoreId;
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysUser.java

@@ -71,7 +71,7 @@ public class SysUser implements Serializable {
     @TableField("qq_openid_")
     private String qqOpenid;
 
-    @ApiModelProperty("用户类型(STUDENT/TEACHER/SYSTEM)")
+    @ApiModelProperty("用户类型(STUDENT/TEACHER/SYSTEM/ORGANIZATION)")
     @TableField("user_type_")
     private String userType;
 

+ 3 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantStaff.java

@@ -3,11 +3,10 @@ package com.yonge.cooleshow.biz.dal.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.IdType;
-import lombok.Data;
-
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -68,7 +67,7 @@ public class TenantStaff implements Serializable {
 
     @ApiModelProperty("帐号状态(注销,冻结,激活)") 
 	@TableField(value = "status_")
-    private String status;
+    private UserLockFlag status;
 
     @ApiModelProperty("更新时间") 
 	@TableField(value = "update_time_")

+ 71 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java

@@ -57,6 +57,77 @@ public class SysMusicCompareRecordQueryInfo {
     }
 
     @Data
+    public static class StudentCompareRecordQueryInfo extends QueryInfo{
+        @ApiModelProperty(name = "机构编号")
+        private Long tenantId;
+
+        @ApiModelProperty(name = "学员编号")
+        private Long userId;
+
+        @ApiModelProperty(name = "开始时间")
+        private String startTime;
+
+        @ApiModelProperty(name = "截止时间")
+        private String endTime;
+
+        private HeardLevelEnum heardLevel;
+
+        @ApiModelProperty(name = "0查询时长榜,1查询高分榜,2查询天数榜")
+        private int orderType;
+    }
+
+    @Data
+    public static class StatDto {
+
+        private MusicCompareRankingDto head;
+
+        private Object detail;
+    }
+
+    @Data
+    public static class MusicCompareRankingDto {
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("学员姓名")
+        private String studentName;
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("演奏曲目")
+        private String musicScoreName;
+
+        @ApiModelProperty("排名")
+        private int rankNum = -1;
+
+        @ApiModelProperty("得分")
+        private int score;
+
+        @ApiModelProperty("训练天数")
+        private int trainDays = 0;
+
+        @ApiModelProperty("训练时长")
+        private int trainTime = 0;
+
+        @ApiModelProperty("训练次数")
+        private int trainNum = 0;
+
+        @ApiModelProperty("是否是会员")
+        private int vipUser;
+
+        @ApiModelProperty("学生总数")
+        private int studentNum;
+    }
+
+    @Data
     public static class WechatCompareRecordPageDto{
         @ApiModelProperty(name = "用户编号")
         private Long userId;

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 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.Student;
@@ -24,6 +25,7 @@ import java.util.Map;
  * @date 2022-03-23
  */
 public interface StudentService extends IService<Student> {
+    StudentDao getDao();
     /***
      * 查询学员详情
      * @author liweifan

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java

@@ -58,4 +58,7 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
 
     //学生端,学员训练统计
     SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordDto studentTrainStat(SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordQuery query);
+
+    //训练时长榜
+    SysMusicCompareRecordQueryInfo.StatDto rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo);
 }

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareWeekDataService.java

@@ -0,0 +1,15 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.toolset.mybatis.service.BaseService;
+
+import java.time.LocalDate;
+
+public interface SysMusicCompareWeekDataService extends BaseService<Integer, SysMusicCompareWeekData> {
+    SysMusicCompareWeekDataDao getDao();
+
+    //更新学员本周训练统计数据
+    void updateUserWeekTrainData(Long Long, LocalDate monday);
+
+}

+ 4 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantStaffService.java

@@ -2,8 +2,8 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.biz.dal.wrapper.TenantStaffWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantStaffWrapper;
 
 /**
  * 机构员工表
@@ -49,10 +49,9 @@ public interface TenantStaffService extends IService<TenantStaff>  {
     TenantStaff getByPhone(String phone);
 
     /**
-     * 获取机构用户
-     *
-     * @param userId
-     * @return
+     * 根据用户ID获取员工信息
+     * @param userId 用户Id
+     * @return TenantStaff
      */
     TenantStaff getByUserId(Long userId);
 }

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

@@ -15,21 +15,10 @@ 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.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.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
-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.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -55,14 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.text.MessageFormat;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
@@ -82,18 +64,17 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     private SysUserMapper sysUserMapper;
     @Autowired
     private SubjectDao subjectDao;
-
     @Autowired
     private TenantInfoService tenantInfoService;
-
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
-
     @Autowired
     private SysConfigService sysConfigService;
 
-    @Autowired
-    private ImGroupService imGroupService;
+    @Override
+    public StudentDao getDao() {
+        return baseMapper;
+    }
 
     @Override
     public StudentVo detail(Long userId) {
@@ -444,7 +425,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             sysUser.setUserType("STUDENT");
             sysUser.setBirthdate(studentInfo.getBirthdate());
 
-            String newPassword = MessageFormat.format("klx{0}", studentInfo.getPhone().substring(7));
+            String newPassword = MessageFormat.format("klxjg{0}", studentInfo.getPhone().substring(7));
             String password = new BCryptPasswordEncoder().encode(newPassword);
             sysUser.setPassword(password);
             sysUserMapper.insert(sysUser);

+ 63 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -3,8 +3,11 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.entity.SysUserDevice;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseDto;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseMonthData;
 import com.yonge.cooleshow.biz.dal.dto.StudentTrainChartDto;
@@ -34,6 +37,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -54,10 +58,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private final static Logger log = LoggerFactory.getLogger(SysMusicCompareRecordServiceImpl.class);
 	@Autowired
 	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
-
 	@Autowired
 	private SysConfigService sysConfigService;
-
 	@Autowired
 	private MusicSheetDao musicSheetDao;
 	@Autowired
@@ -66,6 +68,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private TeacherService teacherService;
 	@Autowired
 	private StudentService studentService;
+	@Autowired
+	private SysUserService sysUserService;
+	@Autowired
+	private SysMusicCompareWeekDataService sysMusicCompareWeekDataService;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -226,6 +232,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 					}
 
 				}
+				//按周统计
+				sysMusicCompareWeekDataService.updateUserWeekTrainData(record.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
 
 			} catch (Exception e) {
 				log.error("MusicCompareRecordStat userId={}, musicId={}", record.getUserId(), record.getMusicSheetId(), e);
@@ -445,8 +453,60 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		return sysMusicCompareRecordDao.studentTrainStat(query);
 	}
 
+    @Override
+    public SysMusicCompareRecordQueryInfo.StatDto rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo) {
+		SysMusicCompareRecordQueryInfo.StatDto result = new SysMusicCompareRecordQueryInfo.StatDto();
+		SysMusicCompareRecordQueryInfo.MusicCompareRankingDto head = new SysMusicCompareRecordQueryInfo.MusicCompareRankingDto();
+		head.setUserId(queryInfo.getUserId());
+		List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> userTrainStat = sysMusicCompareWeekDataService.getDao().getUserTrainStat(queryInfo.getStartTime(),
+				queryInfo.getOrderType(),
+				Objects.isNull(queryInfo.getHeardLevel())?null:queryInfo.getHeardLevel().getCode(),
+				queryInfo.getTenantId());
+		List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> detail = new ArrayList<>();
+
+		List<Long> studentIds = userTrainStat.stream().limit(10).
+				map(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getUserId).collect(Collectors.toList());
+		Map<Integer, String> studentSubjectMap = new HashMap<>();
+		if(!org.springframework.util.CollectionUtils.isEmpty(studentIds)){
+			List<Map<Integer, String>> studentSubjectMapList = studentService.getDao().getStudentSubjectMapList(studentIds);
+			studentSubjectMap = MapUtil.convertIntegerMap(studentSubjectMapList);
+		}
+
+		int rankNum = 0;
+		for (int i = 0; i < userTrainStat.size(); i++) {
+			if(userTrainStat.get(i).getUserId().equals(queryInfo.getUserId())){
+				head = userTrainStat.get(i);
+			}
+			userTrainStat.get(i).setTrainTime(userTrainStat.get(i).getTrainTime()/60);
+			if(userTrainStat.get(i).getVipUser() <= 0){
+				continue;
+			}
+			userTrainStat.get(i).setRankNum(++rankNum);
+			if(studentSubjectMap.containsKey(userTrainStat.get(i).getUserId())){
+				userTrainStat.get(i).setSubjectName(studentSubjectMap.get(userTrainStat.get(i).getUserId()));
+			}
+			if(detail.size()<10){
+				detail.add(userTrainStat.get(i));
+			}
+		}
+		Map<String,Object> params = new HashMap<String, Object>(1);
+		params.put("tenantId", queryInfo.getTenantId());
+		head.setStudentNum(studentService.getDao().countStudentsWithTenant(params));
+		if(StringUtils.isBlank(head.getAvatar())){
+			SysUser user = sysUserService.findUserById(queryInfo.getUserId());
+			if(user != null){
+				head.setAvatar(user.getAvatar());
+			}
+		}
+		result.setHead(head);
+		detail.sort(Comparator.comparing(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getRankNum).
+				thenComparing(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getUserId));
+		result.setDetail(detail);
+		return result;
+    }
+
 
-	private String getExpireTime() {
+    private String getExpireTime() {
 
 		String homeworkExpireTime = sysConfigService.findConfigValue(SysConfigConstant.HOMEWORK_EXPIRE_TIME);
 		if (org.springframework.util.StringUtils.isEmpty(homeworkExpireTime)) {

+ 54 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareWeekDataServiceImpl.java

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.cooleshow.biz.dal.enums.HeardLevelEnum;
+import com.yonge.cooleshow.biz.dal.service.SysMusicCompareWeekDataService;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
+import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
+import com.yonge.toolset.utils.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Date;
+import java.time.LocalDate;
+import java.util.Objects;
+
+@Service
+public class SysMusicCompareWeekDataServiceImpl extends BaseServiceImpl<Integer, SysMusicCompareWeekData> implements SysMusicCompareWeekDataService {
+
+	@Autowired
+	private SysMusicCompareWeekDataDao sysMusicCompareWeekDataDao;
+	@Autowired
+	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+
+	@Override
+	public BaseDAO<Integer, SysMusicCompareWeekData> getDAO() {
+		return sysMusicCompareWeekDataDao;
+	}
+
+	@Override
+	public SysMusicCompareWeekDataDao getDao() {
+		return sysMusicCompareWeekDataDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateUserWeekTrainData(Long userId, LocalDate monday) {
+		SysMusicCompareWeekData userWeekData = sysMusicCompareWeekDataDao.getWithUserAndMonday(userId, monday.toString());
+		SysMusicCompareWeekData userWeekCompareData = sysMusicCompareRecordDao.getUserWeekCompareData(userId, monday.toString());
+		userWeekCompareData.setUserId(userId);
+		userWeekCompareData.setMonday(Date.from(monday.atStartOfDay(DateUtil.zoneId).toInstant()));
+		userWeekCompareData.setBeginnerMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.BEGINNER));
+		userWeekCompareData.setAdvancedMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.ADVANCED));
+		userWeekCompareData.setPerformerMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.PERFORMER));
+		if(Objects.isNull(userWeekData)){
+			sysMusicCompareWeekDataDao.insert(userWeekCompareData);
+		}else{
+			sysMusicCompareWeekDataDao.update(userWeekCompareData);
+		}
+	}
+}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -389,7 +389,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }
 
             // 机构解绑
-            if (teacher.getTenantId() != -1 && !teacherSubmitReq.getBindTenant()) {
+            if (teacher.getTenantId() != -1L && Boolean.FALSE.equals(teacherSubmitReq.getBindTenant())) {
                 // 老师建立的班级群解散,并解除好友关系
                 List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
                         .eq(ImGroupMember::getIsAdmin,true)

+ 54 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java

@@ -9,20 +9,23 @@ import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantActivationCodeMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
-import org.redisson.api.RLock;
-import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +48,9 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     @Autowired
     private TenantAlbumPurchaseMapper tenantAlbumPurchaseMapper;
 
+    @Autowired
+    private UserTenantAlbumRecordMapper userTenantAlbumRecordMapper;
+
     /**
      * 查询详情
      *
@@ -165,11 +171,13 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             throw new BizException("激活码已经被使用");
         }
 
+        SysUser sysUser = sysUserMapper.selectById(studentId);
         // 通过状态和ID同时判断更新是否存在竞争
         boolean update = this.lambdaUpdate()
                 .set(TenantActivationCode::getActivationStatus, true)
                 .set(TenantActivationCode::getActivationUserId, student.getUserId())
                 .set(TenantActivationCode::getActivationTime, new Date())
+                .set(TenantActivationCode::getActivationPhone, sysUser.getPhone())
                 .eq(TenantActivationCode::getId, code.getId())
                 .eq(TenantActivationCode::getActivationStatus, false)
                 .update();
@@ -177,7 +185,50 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             throw new BizException("激活码已经被使用");
         }
 
-        // todo 更新会员信息,如果更新异常,回滚激活码
+        QueryWrapper<UserTenantAlbumRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
+                .eq(UserTenantAlbumRecord::getTenantId, student.getTenantId())
+                .eq(UserTenantAlbumRecord::getUserId, student.getUserId())
+                .eq(UserTenantAlbumRecord::getTenantAlbumId, code.getTenantAlbumId())
+                .eq(UserTenantAlbumRecord::getClientType, ClientEnum.STUDENT)
+                .orderByDesc(UserTenantAlbumRecord::getEndTime);
+        List<UserTenantAlbumRecord> userTenantAlbumRecords = userTenantAlbumRecordMapper.selectList(queryWrapper);
+
+        UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
+        userTenantAlbumRecord.setTenantId(student.getTenantId());
+        userTenantAlbumRecord.setUserId(student.getUserId());
+        userTenantAlbumRecord.setTenantAlbumId(code.getTenantAlbumId());
+        userTenantAlbumRecord.setOrderNo("");
+        userTenantAlbumRecord.setSourceType(SourceTypeEnum.TENANT);
+        userTenantAlbumRecord.setClientType(ClientEnum.STUDENT);
+        userTenantAlbumRecord.setSubOrderNo("");
+        userTenantAlbumRecord.setCreateBy(student.getUserId());
+
+        Long tenantAlbumPurchaseId = code.getTenantAlbumPurchaseId();
+        TenantAlbumPurchase purchase = tenantAlbumPurchaseMapper.selectById(tenantAlbumPurchaseId);
+        Integer purchaseCycle = purchase.getPurchaseCycle();
+
+        userTenantAlbumRecord.setType("MONTH");
+        userTenantAlbumRecord.setTimes(purchaseCycle);
+
+        Calendar instance = Calendar.getInstance();
+        if (userTenantAlbumRecords.isEmpty()) {
+            instance.setTime(new Date());
+        } else {
+            // 如果最后一次的时间的小于当前时间,则以当前时间为会员的开始时间
+            // 如果最后一次的时间的大于当前时间,则以最后一次的结束时间为记录的开始时间,相当会员续期
+            UserTenantAlbumRecord lastRecord = userTenantAlbumRecords.get(0);
+            Date lastEndTime = lastRecord.getEndTime();
+            if (lastEndTime.before(new Date())) {
+                instance.setTime(new Date());
+            } else {
+                instance.setTime(lastEndTime);
+            }
+        }
+        userTenantAlbumRecord.setStartTime(instance.getTime());
+        instance.add(Calendar.MONTH, purchaseCycle);
+        userTenantAlbumRecord.setEndTime(instance.getTime());
+        userTenantAlbumRecordMapper.insert(userTenantAlbumRecord);
 
         // 更新购买记录中激活码使用统计数量值
         Integer activeCodeNumber = this.lambdaQuery()

+ 263 - 64
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java

@@ -1,24 +1,42 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantInfoMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantStaffMapper;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
-import org.springframework.beans.BeanUtils;
-import lombok.extern.slf4j.Slf4j;
-import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
-import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantInfoMapper;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -34,30 +52,41 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
     @Autowired
     TenantInfoMapper tenantInfoMapper;
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private TenantStaffMapper tenantStaffMapper;
 
 
-	/**
+    /**
      * 查询详情
+     *
      * @param id 详情ID
      * @return TenantInfo
      */
-	@Override
+    @Override
     public TenantInfo detail(Long id) {
         if (id == null || id == -1) {
             return null;
         }
-        
+
         return baseMapper.selectById(id);
     }
-    
+
     /**
      * 分页查询
-     * @param page IPage<TenantInfo>
+     *
+     * @param page  IPage<TenantInfo>
      * @param query TenantInfoWrapper.TenantInfoQuery
      * @return IPage<TenantInfo>
      */
     @Override
-    public IPage<TenantInfoWrapper.TenantInfo> selectPage(IPage<TenantInfoWrapper.TenantInfo> page, TenantInfoWrapper.TenantInfoQuery query) {
+    public IPage<TenantInfoWrapper.TenantInfo> selectPage(IPage<TenantInfoWrapper.TenantInfo> page,
+                                                          TenantInfoWrapper.TenantInfoQuery query) {
 
         //分页查询
         List<TenantInfoWrapper.TenantInfo> tenantInfos = baseMapper.selectPage(page, query);
@@ -65,16 +94,16 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         ArrayList<Integer> listId = new ArrayList<>();
         for (int i = 0; i < tenantInfos.size(); i++) {
             TenantInfoWrapper.TenantInfo info = tenantInfos.get(i);
-            Integer id = info.getId();
-            listId.add(i,id);
+            long id = info.getId();
+            listId.add(i, (int) id);
         }
         //查询对应机构的老师数量
         List<Integer> listTeacher = new ArrayList<>();
         //查询对应机构的学生数量
         List<Integer> listStudent = new ArrayList<>();
-        if (!CollectionUtils.isEmpty(listId)){
-             listTeacher = tenantInfoMapper.queryTeacherCounts(listId);
-             listStudent = tenantInfoMapper.queryStudentCounts(listId);
+        if (!CollectionUtils.isEmpty(listId)) {
+            listTeacher = tenantInfoMapper.queryTeacherCounts(listId);
+            listStudent = tenantInfoMapper.queryStudentCounts(listId);
         }
 
 
@@ -90,39 +119,72 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
 
         //获取省市区信息
-        List<Integer> areaCodeList = tenantInfos.stream().map(next -> {
-            Set<Integer> codes = new HashSet<>();
-            codes.add(next.getCityCode());
-            codes.add(next.getProvinceCode());
-            codes.add(next.getRegionCode());
-            return codes;
-        }).flatMap(Collection::stream).filter(Objects::nonNull).distinct().collect(Collectors.toList());
-
-        Map<Integer, String> codeNameMap = new HashMap<>();
-
-        if (!CollectionUtils.isEmpty(areaCodeList)) {
-            List<SysArea> sysAreaList = sysAreaService.queryByCodes(areaCodeList);
-            codeNameMap = sysAreaList.stream().collect(Collectors.toMap(SysArea::getCode,
-                    SysArea::getName));
-        }
-
-        for (TenantInfoWrapper.TenantInfo next : tenantInfos) {
-            next.setProvinceName(codeNameMap.getOrDefault(next.getProvinceCode(), ""));
-            next.setCityName(codeNameMap.getOrDefault(next.getCityCode(), ""));
-            next.setRegionName(codeNameMap.getOrDefault(next.getRegionCode(), ""));
-        }
-        return page.setRecords(tenantInfos);
+        List<TenantInfoWrapper.TenantInfo> tenantList = queryArea(tenantInfos);
+        return page.setRecords(tenantList);
     }
 
+
     /**
      * 添加
+     *
      * @param tenantInfo TenantInfoWrapper.TenantInfo
      * @return Boolean
      */
     @Override
     public Boolean add(TenantInfo tenantInfo) {
-        Boolean bool = tenantInfoMapper.insertInfo(tenantInfo);
-        return bool;
+        SysUser sysUser = getOrCreateAccount(tenantInfo);
+
+        TenantStaff tenantStaff = new TenantStaff();
+        tenantStaff.setTenantId(tenantStaff.getTenantId());
+        tenantStaff.setUserId(sysUser.getId());
+        tenantStaff.setAvatar(sysUser.getAvatar());
+        tenantStaff.setNickname(tenantInfo.getUsername());
+        tenantStaff.setStatus(UserLockFlag.NORMAL);
+        tenantStaffMapper.insert(tenantStaff);
+
+        tenantInfo.setEnableFlag(true);
+        tenantInfoMapper.insert(tenantInfo);
+        return true;
+    }
+
+    private SysUser getOrCreateAccount(TenantInfo tenantInfo) {
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getPhone, tenantInfo.getPhone());
+        List<SysUser> sysUsers = sysUserMapper.selectList(sysUserQueryWrapper);
+        SysUser sysUser;
+        //若存在信息
+        if (!sysUsers.isEmpty()) {
+            sysUser = sysUsers.get(0);
+            TenantStaff tenantStaff = tenantStaffMapper.selectById(sysUser.getId());
+            if (tenantStaff != null) {
+                throw new BizException("手机号已经注册机构账号");
+            }
+            //获取当前账户的用户类型
+            String userType = sysUser.getUserType();
+            //设置默认机构类型
+            String tenantUserType = SysUserType.ORGANIZATION.getCode();
+            if (StringUtils.isEmpty(userType)) {
+                sysUser.setUserType(tenantUserType);
+            } else if (!userType.contains(tenantUserType)) {
+                sysUser.setUserType(userType + "," + tenantUserType);
+            }
+
+            //更新当前账号的用户名
+            sysUser.setUsername(tenantInfo.getUsername());
+
+            sysUserMapper.updateById(sysUser);
+        } else {
+            sysUser = new SysUser();
+            sysUser.setPhone(tenantInfo.getPhone());
+            sysUser.setAvatar(sysConfigService.findConfigValue(SysConfigConstant.DEFAULT_HEARD));
+            sysUser.setUserType(SysUserType.ORGANIZATION.getCode());
+
+            String newPassword = MessageFormat.format("klxjg{0}", tenantInfo.getPhone().substring(7));
+            String password = new BCryptPasswordEncoder().encode(newPassword);
+            sysUser.setPassword(password);
+            sysUserMapper.insert(sysUser);
+        }
+        return sysUser;
     }
 	
 
@@ -165,6 +227,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
     /**
      * 冻结
+     *
      * @param query TenantInfoWrapper.TenantInfo
      * @return Boolean
      */
@@ -172,44 +235,180 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
     @Override
     public Boolean state(TenantInfoWrapper.TenantInfoQuery query) {
         Boolean flag;
-        Integer id = query.getId();
-        long longId = id.longValue();
-        TenantInfo info = detail(longId);
+        long id = query.getId();
+        TenantInfo info = detail(id);
 
         //TenantInfo info = this.getById(id);
         if (Objects.isNull(info)) {
             throw new BizException("机构信息不存在");
         }
         //获取是否冻结
-         if (query.getIfFreeze() == 1){
-             if (!info.getEnableFlag()){
-                 return false;
-             }
-             //修改机构账号冻结状态
-              flag = tenantInfoMapper.updateFlag(id);
-             //是否更改结算方式
-             if (query.getIfMethod() == 1){
-                 tenantInfoMapper.updateMethod(id);
-             }else {
-                 return true;
-             }
-         }
-         else {
-             return false;
-         }
+        if (query.getIfFreeze() == 1) {
+            if (!info.getEnableFlag()) {
+                return false;
+            }
+            //修改机构账号冻结状态
+            flag = tenantInfoMapper.updateFlag(id);
+            //是否更改结算方式
+            if (query.getIfMethod() == 1) {
+                tenantInfoMapper.updateMethod(id);
+            } else {
+                return true;
+            }
+        } else {
+            return false;
+        }
         return flag;
     }
 
+
     /**
      * 更新
+     *
      * @param info TenantInfoWrapper.TenantInfo
      * @return Boolean
      */
     @Override
     public Boolean updateTenantInfo(TenantInfo info) {
-        Boolean bool = tenantInfoMapper.updateInfo(info);
-        return bool;
+        SysUser sysUser = getOrCreateAccount(info);
+
+        TenantInfo oldTenantInfo = this.getById(info.getId());
+        tenantStaffMapper.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                .set(TenantStaff::getUserId, sysUser.getId())
+                .set(TenantStaff::getNickname, info.getUsername())
+                .eq(TenantStaff::getUserId, oldTenantInfo.getUserId())
+        );
+
+        tenantInfoMapper.update(null, Wrappers.<TenantInfo>lambdaUpdate()
+                .set(TenantInfo::getName, info.getName())
+                .set(TenantInfo::getLogo, info.getLogo())
+                .set(TenantInfo::getBriefIntroduction, info.getBriefIntroduction())
+                .set(TenantInfo::getProvinceCode, info.getProvinceCode())
+                .set(TenantInfo::getCityCode, info.getCityCode())
+                .set(TenantInfo::getRegionCode, info.getRegionCode())
+                .eq(TenantInfo::getId, info.getId())
+        );
+        return true;
+    }
+
+
+    /**
+     * 机构申请分页查询
+     *
+     * @param query
+     * @return
+     */
+    @Override
+    public IPage<TenantInfoWrapper.TenantInfo> applyPage(IPage<TenantInfoWrapper.TenantInfo> page,
+                                                         TenantInfoWrapper.TenantInfoQuery query) {
+        //分页查询
+        List<TenantInfoWrapper.TenantInfo> tenantInfos = baseMapper.selectApplyPage(page, query);
+        List<TenantInfoWrapper.TenantInfo> infos = queryArea(tenantInfos);
+        return page.setRecords(infos);
     }
 
 
+    /**
+     * 机构入驻审核历史记录查询
+     *
+     * @param query
+     * @return
+     */
+    @Override
+    public IPage<TenantInfoWrapper.TenantInfo> historyPage(IPage<TenantInfoWrapper.TenantInfo> page,
+                                                           TenantInfoWrapper.TenantInfoQuery query) {
+        long id = query.getId();
+        //分页查询
+        List<TenantInfoWrapper.TenantInfo> tenantInfos = baseMapper.selectHistoryPage(page, id);
+        //查询对应省市区
+        List<TenantInfoWrapper.TenantInfo> infos = queryArea(tenantInfos);
+
+        return page.setRecords(infos);
+    }
+
+    /**
+     * 机构入驻审核本次提交查询
+     *
+     * @param query
+     * @return
+     */
+    @Override
+    public TenantInfoWrapper.TenantInfo queryNow(TenantInfoWrapper.TenantInfoQuery query) {
+        //查询本次提交记录
+        TenantInfoWrapper.TenantInfo info = tenantInfoMapper.queryNow(query);
+        Set<Integer> codes = new HashSet<>();
+        codes.add(info.getCityCode());
+        codes.add(info.getProvinceCode());
+        codes.add(info.getRegionCode());
+
+        //将地区码转化为对应的地名
+        List<Integer> areaCodeList = new ArrayList<>();
+        areaCodeList.addAll(codes);
+
+        Map<Integer, String> codeNameMap = new HashMap<>();
+
+        if (!CollectionUtils.isEmpty(areaCodeList)) {
+            List<SysArea> sysAreaList = sysAreaService.queryByCodes(areaCodeList);
+            codeNameMap = sysAreaList.stream().collect(Collectors.toMap(SysArea::getCode,
+                    SysArea::getName));
+        }
+
+        info.setProvinceName(codeNameMap.get(info.getProvinceCode()));
+        info.setCityName(codeNameMap.get(info.getCityCode()));
+        info.setRegionName(codeNameMap.get(info.getRegionCode()));
+        return info;
+    }
+
+    @Override
+    public Boolean entry(TenantInfoWrapper.TenantInfoQuery query) {
+        Integer pass = query.getIfPass();
+        //审核通过
+        if (pass == 1) {
+            //查询本次提交记录,并插入审核表
+            TenantInfoWrapper.TenantInfo info = queryNow(query);
+            tenantInfoMapper.insertNow(info);
+            //更改当前记录的审核状态
+
+            //机构账户新增逻辑
+        } else {
+            //查询本次提交记录,并插入审核表
+            //更改当前记录的审核状态
+
+        }
+        return null;
+    }
+
+
+    /**
+     * 匹配地区码与省市区
+     *
+     * @param tenantInfos
+     * @return
+     */
+    private List<TenantInfoWrapper.TenantInfo> queryArea(List<TenantInfoWrapper.TenantInfo> tenantInfos) {
+        List<Integer> areaCodeList = tenantInfos.stream().map(next -> {
+            Set<Integer> codes = new HashSet<>();
+            codes.add(next.getCityCode());
+            codes.add(next.getProvinceCode());
+            codes.add(next.getRegionCode());
+            return codes;
+        }).flatMap(Collection::stream).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+
+        Map<Integer, String> codeNameMap = new HashMap<>();
+
+        if (!CollectionUtils.isEmpty(areaCodeList)) {
+            List<SysArea> sysAreaList = sysAreaService.queryByCodes(areaCodeList);
+            codeNameMap = sysAreaList.stream().collect(Collectors.toMap(SysArea::getCode,
+                    SysArea::getName));
+        }
+
+        for (TenantInfoWrapper.TenantInfo next : tenantInfos) {
+            next.setProvinceName(codeNameMap.getOrDefault(next.getProvinceCode(), ""));
+            next.setCityName(codeNameMap.getOrDefault(next.getCityCode(), ""));
+            next.setRegionName(codeNameMap.getOrDefault(next.getRegionCode(), ""));
+        }
+
+        return tenantInfos;
+    }
+
 }

+ 8 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantStaffServiceImpl.java

@@ -3,13 +3,12 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-import org.springframework.beans.BeanUtils;
-import lombok.extern.slf4j.Slf4j;
 import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
-import com.yonge.cooleshow.biz.dal.wrapper.TenantStaffWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantStaffMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantStaffWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 /**
  * 机构员工表
@@ -71,15 +70,14 @@ public class TenantStaffServiceImpl extends ServiceImpl<TenantStaffMapper, Tenan
     }
 
     /**
-     * 获取机构用户
+     * 根据用户ID获取员工信息
      *
-     * @param userId
-     * @return
+     * @param userId 用户Id
+     * @return TenantStaff
      */
     @Override
     public TenantStaff getByUserId(Long userId) {
-        return this.lambdaQuery()
-                .eq(TenantStaff::getUserId, userId)
-                .one();
+
+        return lambdaQuery().eq(TenantStaff::getUserId, userId).last("LIMIT 1").one();
     }
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.UserStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
@@ -89,6 +90,9 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty("机构名称")
     private String tenantName;
 
+    @ApiModelProperty("结算方式,TEACHER:结算给老师,TENANT:结算给机构")
+    private ESettlementFrom settlementFrom;
+
 
     public YesOrNoEnum getDelFlag() {
         return delFlag;

+ 25 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -86,6 +86,7 @@
         SELECT
             <include refid="baseColumns"/>,
             if(u.lock_flag_ = 0 and t.lock_flag_ = 0,0,1) as lockFlag,
+            u.avatar_ as avatar,
             u.username_ as username,
             u.gender_ as gender,
             u.birthdate_ as birthdate,
@@ -284,4 +285,28 @@
             and u.username_ LIKE CONCAT('%', #{param.username}, '%')
         </if>
     </select>
+
+    <select id="getStudentSubjectMapList" resultType="java.util.Map">
+        SELECT stu.user_id_ 'key',sub.name_ 'value'
+        FROM student stu
+        LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
+        WHERE stu.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
+
+    <select id="countStudentsWithTenant" resultType="int">
+        SELECT
+        COUNT(su.id_)
+        FROM
+        sys_user su
+        WHERE
+        su.tenant_id_ = #{tenantId}
+        AND su.del_flag_=0 AND su.lock_flag_=0
+        AND FIND_IN_SET('STUDENT',su.user_type_)
+        <if test="search != null">
+            AND (su.username_ LIKE CONCAT('%', #{search}, '%') OR su.phone_ LIKE CONCAT('%', #{search}, '%'))
+        </if>
+    </select>
 </mapper>

+ 13 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -452,6 +452,18 @@
 		</if>
 		group by smcr.user_id_
 	</select>
-	<!--曲目练习统计-->
+    <select id="getUserWeekCompareData"
+            resultType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		SELECT
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DATE(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime,
+			MAX(IF(heard_level_='BEGINNER' AND source_time_ &gt;= play_time_, smcr.score_, 0)) beginnerMaxScore,
+			MAX(IF(heard_level_='ADVANCED' AND source_time_ &gt;= play_time_, smcr.score_, 0)) advancedMaxScore,
+			MAX(IF(heard_level_='PERFORMER' AND source_time_ &gt;= play_time_, smcr.score_, 0)) performerMaxScore,smcr.tenant_id_ tenantId
+		FROM sys_music_compare_record smcr
+		WHERE user_id_=#{userId} AND monday_ = #{monday}
+	</select>
+    <!--曲目练习统计-->
 
 </mapper>

+ 170 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao">
+	
+	<resultMap type="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData" id="SysMusicCompareWeekData">
+		<result column="user_id_" property="userId" />
+		<result column="monday_" property="monday" />
+		<result column="train_num_" property="trainNum" />
+		<result column="train_days_" property="trainDays" />
+		<result column="train_time_" property="trainTime" />
+		<result column="beginner_max_score_" property="beginnerMaxScore" />
+		<result column="advanced_max_score_" property="advancedMaxScore" />
+		<result column="performer_max_score_" property="performerMaxScore" />
+        <result column="tenant_id_" property="tenantId"/>
+	</resultMap>
+	
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysMusicCompareWeekData">
+		SELECT * FROM sys_music_compare_week_data where tenant_id_ = #{tenantId}
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		INSERT INTO sys_music_compare_week_data (user_id_,monday_,train_num_,train_days_,train_time_,
+		                                         beginner_max_score_,beginner_max_score_id_,advanced_max_score_,advanced_max_score_id_,
+		                                         performer_max_score_,performer_max_score_id_,
+		                                         create_time_,update_time_,tenant_id_)
+		VALUES(#{userId},#{monday},#{trainNum},#{trainDays},#{trainTime},#{beginnerMaxScore},#{beginnerMaxScoreId},
+		       #{advancedMaxScore},#{advancedMaxScoreId},#{performerMaxScore},#{performerMaxScoreId},NOW(),NOW(),#{tenantId})
+	</insert>
+	
+	<update id="update" parameterType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		UPDATE sys_music_compare_week_data
+		<set>
+			<if test="trainNum!=null">
+				train_num_ = #{trainNum},
+			</if>
+			<if test="trainDays!=null">
+				train_days_ = #{trainDays},
+			</if>
+			<if test="trainTime!=null">
+				train_time_ = #{trainTime},
+			</if>
+			<if test="beginnerMaxScore!=null">
+				beginner_max_score_ = #{beginnerMaxScore},
+			</if>
+			<if test="beginnerMaxScoreId!=null">
+				beginner_max_score_id_ = #{beginnerMaxScoreId},
+			</if>
+			<if test="advancedMaxScore!=null">
+				advanced_max_score_ = #{advancedMaxScore},
+			</if>
+			<if test="advancedMaxScoreId!=null">
+				advanced_max_score_id_ = #{advancedMaxScoreId},
+			</if>
+			<if test="performerMaxScore!=null">
+				performer_max_score_ = #{performerMaxScore},
+			</if>
+			<if test="performerMaxScoreId!=null">
+				performer_max_score_id_ = #{performerMaxScoreId},
+			</if>
+			update_time_ = NOW()
+		</set>
+		WHERE user_id_=#{userId} AND monday_ = #{monday} and tenant_id_ = #{tenantId}
+	</update>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysMusicCompareWeekData" parameterType="map">
+		SELECT * FROM sys_music_compare_week_data where tenant_id_ = #{tenantId} <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_music_compare_week_data where tenant_id_ = #{tenantId}
+	</select>
+
+	<select id="getWithUserAndMonday" resultMap="SysMusicCompareWeekData">
+		SELECT * FROM sys_music_compare_week_data WHERE user_id_=#{userId} AND monday_=#{monday}
+	</select>
+
+	<select id="getUserTrainStat" resultType="com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo$MusicCompareRankingDto">
+		SELECT
+		smcwd.user_id_ userId,
+			su.avatar_ avatar,
+			su.username_ studentName,
+			<if test="orderType==1">
+				sms.name_ musicScoreName,
+				<if test="heardLevel==null">
+					smcwd.advanced_max_score_ score,
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					smcwd.beginner_max_score_ score,
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					smcwd.advanced_max_score_ score,
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					smcwd.performer_max_score_ score,
+				</if>
+			</if>
+			smcwd.train_num_ trainNum,
+			smcwd.train_days_ trainDays,
+			smcwd.train_time_ trainTime,
+			case when stu.membership_end_time_ &gt; now() then 1 else 0 end vipUser
+		FROM sys_music_compare_week_data smcwd
+		LEFT JOIN sys_user su ON smcwd.user_id_=su.id_
+		LEFT JOIN student stu ON smcwd.user_id_ = stu.user_id_
+		<if test="orderType==1">
+			LEFT JOIN sys_music_score sms
+			<if test="heardLevel==null">
+				ON smcwd.advanced_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='BEGINNER'">
+				ON smcwd.beginner_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='ADVANCED'">
+				ON smcwd.advanced_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='PERFORMER'">
+				ON smcwd.performer_max_score_id_ = sms.id_
+			</if>
+		</if>
+		WHERE smcwd.monday_ = #{monday}
+			AND stu.user_id_ = smcwd.user_id_ and smcwd.tenant_id_ = #{tenantId}
+			<if test="orderType==1">
+				<if test="heardLevel==null">
+					AND smcwd.advanced_max_score_ > 0
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					AND smcwd.beginner_max_score_ > 0
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					AND smcwd.advanced_max_score_ > 0
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					AND smcwd.performer_max_score_ > 0
+				</if>
+			</if>
+			ORDER BY
+			<if test="orderType==null">
+				smcwd.train_time_ DESC,
+			</if>
+			<if test="orderType==0">
+				smcwd.train_time_ DESC,
+			</if>
+			<if test="orderType==1">
+				<if test="heardLevel==null">
+					smcwd.advanced_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					smcwd.beginner_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					smcwd.advanced_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					smcwd.performer_max_score_ DESC,
+				</if>
+			</if>
+			<if test="orderType==2">
+				smcwd.train_days_ DESC,
+			</if>
+			smcwd.user_id_
+	</select>
+</mapper>

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -99,6 +99,8 @@
             u.username_ as username,
             u.phone_ as phone,
             u.real_name_ as realName,
+            u.avatar_ as avatar,
+            u.birthdate_ as birthdate,
             (case when t.membership_end_time_ &gt;= now() then 1 else 0 end) isVip,
 <!--            t.tag_ tag,-->
             u.del_flag_ as delFlag,

+ 2 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml

@@ -22,8 +22,8 @@
         SELECT
         <include refid="baseColumns"/>, ta.purchase_cycle_ as purchaseCycle, su.username_ as activationUserName
         FROM tenant_activation_code t
-        LEFT JOIN tenant_album ta on t.tenant_album_id_ = ta.id_
-        LEFT JOIN sys_user su on t.active_user_id = su.id_
+        LEFT JOIN tenant_album_purchase ta on t.tenant_album_purchase_id_ = ta.id_
+        LEFT JOIN sys_user su on t.activation_user_id_ = su.id_
         <where>
             <if test="param.keyword != null and param.keyword.trim() != ''">
                 AND (

+ 22 - 29
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml

@@ -69,35 +69,28 @@
     </update>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper$TenantInfo">
-		SELECT
-            id_ as id,
-        	name_ AS name,
-        	logo_ AS logo,
-        	brief_Introduction_ AS briefIntroduction,
-        	username_ AS username,
-        	phone_ AS phone,
-            province_code_ AS provinceCode,
-            city_code_ AS cityCode,
-            region_code_ AS regionCode
-		FROM tenant_info t
-		where 1=1
-        <if test="param.keyword != null and param.keyword  != ''">
-            and (
-            t.name_ like concat('%',#{param.keyword},'%')
-            or t.username_ like concat('%',#{param.keyword},'%')
-            or t.phone_ like concat('%',#{param.keyword},'%')
-            )
-        </if>
-        <if test="param.provinceCode != null and param.provinceCode != ''
-               and param.cityCode != null and param.cityCode != ''
-               and param.regionCode != null and param.regionCode != ''">
-            and
-            t.province_code_ = #{param.provinceCode}
-            and
-            t.city_code_ = #{param.cityCode}
-            and
-            t.region_code_ = #{param.regionCode}
-        </if>
+        SELECT
+        <include refid="baseColumns"/>
+        FROM tenant_info t
+        <where>
+            <if test="param.keyword != null and param.keyword  != ''">
+                and (
+                t.name_ like concat('%',#{param.keyword},'%')
+                or t.username_ like concat('%',#{param.keyword},'%')
+                or t.phone_ like concat('%',#{param.keyword},'%')
+                )
+            </if>
+            <if test="param.provinceCode != null">
+                and t.province_code_ = #{param.provinceCode}
+            </if>
+            <if test="param.cityCode != null">
+                and t.city_code_ = #{param.cityCode}
+            </if>
+            <if test="param.regionCode != null">
+                and t.region_code_ = #{param.regionCode}
+            </if>
+        </where>
+
 	</select>
     <select id="queryTeacherCounts" resultType="java.lang.Integer">
         SELECT count(t.tenant_id_) FROM teacher t where t.tenant_id_ IN (<foreach collection="listId" separator="," item="Id">#{Id}</foreach>)

+ 2 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantStaffMapper.xml

@@ -29,7 +29,8 @@
 	</select>
 
     <select id="getByPhone" resultType="com.yonge.cooleshow.biz.dal.entity.TenantStaff">
-        select *
+        select
+            <include refid="baseColumns" />
         from tenant_staff t
         left join sys_user t1 on t1.id_ = t.user_id_
         where t1.phone_ = #{phone}

+ 4 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml

@@ -6,7 +6,6 @@
         t.id_ AS id
         , t.tenant_id_ AS tenantId
         , t.user_id_ AS userId
-        , t.phone_ AS phone
         , t.user_type_ AS userType
         , t.unbind_reason_ AS unbindReason
         , t.status_ AS status
@@ -21,12 +20,14 @@
             resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper$TenantUnbindRecord">
         SELECT
         <include refid="baseColumns"/>
+        ,ti.name_ as tenantName
         ,ti.province_code_ as provinceCode
-        ,ti.city_code_ as cityCide
-        ,ti.region_code_ as regionCide
+        ,ti.city_code_ as cityCode
+        ,ti.region_code_ as regionCode
         ,ti.username_ as tenantUserName
         ,ti.phone_ as tenantUserPhone
         ,su.username_ as userName
+        ,su.phone_ as phone
         FROM tenant_unbind_record t
         LEFT JOIN tenant_info ti ON ti.id_ = t.tenant_id_
         LEFT JOIN sys_user su on su.id_ = t.user_id_

+ 3 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java

@@ -23,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+
 
 @Slf4j
 @Validated
@@ -34,7 +36,7 @@ public class TenantActivationCodeController extends BaseController {
     @Autowired
     private TenantActivationCodeService tenantActivationCodeService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired

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

@@ -19,6 +19,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -63,6 +64,9 @@ public class StudentController extends BaseController {
         List<StudentVo> rows = pages.getRecords();
 
         for (StudentVo vo : rows) {
+            if (StringUtils.isNotEmpty(vo.getPhone())) {
+                vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
+            }
             if (vo.getDelFlag() == YesOrNoEnum.YES) {
                 vo.setUserStatus(UserStatusEnum.CLOSED);
             } else {

+ 24 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java

@@ -10,6 +10,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 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.RestController;
@@ -49,4 +50,27 @@ public class SysMusicCompareRecordController extends BaseController {
         return succeed(sysMusicCompareRecordService.studentTrainStat(query));
     }
 
+    @ApiOperation("云教练排行榜")
+    @GetMapping("rankingList")
+    public HttpResponseResult<SysMusicCompareRecordQueryInfo.StatDto> rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        queryInfo.setTenantId(sysUser.getTenantId());
+        return succeed(sysMusicCompareRecordService.rankingList(queryInfo));
+    }
+
+    @ApiOperation("学员训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
 }

+ 4 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java

@@ -23,6 +23,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 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.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -89,6 +90,9 @@ public class TeacherController extends BaseController {
         List<TeacherVo> rows = pages.getRecords();
 
         for (TeacherVo vo : rows) {
+            if (StringUtils.isNotEmpty(vo.getPhone())) {
+                vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
+            }
             if (vo.getDelFlag() == YesOrNoEnum.YES) {
                 vo.setUserStatus(UserStatusEnum.CLOSED);
             } else {