Browse Source

feat:教务端学员云教练数据统计

Joburgess 3 năm trước cách đây
mục cha
commit
352e50fff7

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherDao.java

@@ -6,6 +6,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 
 public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
@@ -19,5 +20,6 @@ public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
     CloudTeacher getByStudentId(@Param("studentId") Integer studentId);
 
     int getOrganVipStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansVipStudentNum(@Param("organIds") List<Integer> organId);
 
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java

@@ -19,6 +19,8 @@ public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
     List<Organization> findOrgans(@Param("organIds") List<Integer> organIds);
 
+    List<Organization> getOrgans(@Param("organIds") List<Integer> organIds);
+
     /**
      * 根据分部id字符串查询
      * @param organIds

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -250,6 +250,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return com.ym.mec.biz.dal.dto.EduOrganStudentDataDto
      */
     int getOrganStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
 
     /**
      * @describe 统计云教练试用人数
@@ -259,9 +260,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return int
      */
     int getCloudStudyStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
 
 
     int getCloudStudyLivelyStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
 
     /**
      * @describe 查询云教练学员列表数据
@@ -309,4 +312,5 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return int
      */
     int getOrganEVipStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansEVipStudentNum(@Param("organIds") List<Integer> organIds);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java

@@ -8,6 +8,9 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class EduOrganStudentDataDto {
 
+    @ApiModelProperty("分部名称")
+    private String organName;
+
     @ApiModelProperty("学员总数")
     private int totalStudentNum;
 
@@ -23,9 +26,20 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("云教练试用人数")
     private int cloudStudyUseStudentNum;
 
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
     @ApiModelProperty("活跃人数")
     private int cloudStudyLivelyStudentNum;
 
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
     public int getTotalStudentNum() {
         return totalStudentNum;
     }
@@ -66,6 +80,14 @@ public class EduOrganStudentDataDto {
         this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
     }
 
+    public float getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(float cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+
     public int getCloudStudyLivelyStudentNum() {
         return cloudStudyLivelyStudentNum;
     }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import java.text.ParseException;
 import java.util.List;
 
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
@@ -98,6 +99,8 @@ public interface StudentService extends BaseService<Integer, Student> {
      */
     StatDto organStudentData(StudentQueryInfo queryInfo);
 
+    List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
+
     /**
      * @describe 清理学员云教练连续使用天数
      * @author Joburgess

+ 69 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -50,6 +50,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private CloudTeacherDao cloudTeacherDao;
 
+    @Autowired
+    private OrganizationDao organizationDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -422,6 +425,72 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    public List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds) {
+
+        List<Organization> organs = organizationDao.getOrgans(organIds);
+
+        if(CollectionUtils.isEmpty(organs)){
+            return Collections.emptyList();
+        }
+
+        List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+        Map<String, Long> organsStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+            organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+        Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+            organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+        Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+            organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+        Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+            organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+        Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+            organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+        }
+
+        List<EduOrganStudentDataDto> result = new ArrayList<>();
+
+        for (Organization organ : organs) {
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setOrganName(organ.getName());
+            if(organsStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsEVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.seteVipStudentNum(organsEVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyLivelyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            result.add(organStudentVipData);
+        }
+        return result;
+    }
+
+    @Override
     public void cleanStudentCloudStudySequenceDays() {
         studentDao.cleanStudentCloudStudySequenceDays();
     }

+ 16 - 0
mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml

@@ -86,4 +86,20 @@
             LEFT JOIN sys_user su ON cto.student_id_=su.id_
         WHERE su.del_flag_=0 AND cto.status_ IN (1,2) AND su.organ_id_=#{organId}
     </select>
+
+    <select id="getOrgansVipStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT cto.student_id_) 'value'
+        FROM cloud_teacher_order cto
+                 LEFT JOIN sys_user su ON cto.student_id_=su.id_
+        WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml

@@ -148,6 +148,17 @@
         </foreach>
     </select>
 
+    <select id="getOrgans" resultMap="Organization">
+        SELECT * FROM organization
+        WHERE 1=1
+         <if test="organIds!=null and organIds.size()>0">
+             AND id_ IN
+             <foreach collection="organIds" item="organId" separator="," open="(" close=")">
+                 #{organId}
+             </foreach>
+         </if>
+    </select>
+
     <select id="getActivityOrgans" resultMap="Organization">
         SELECT o.* FROM practice_group_sell_price pgsp
         LEFT JOIN organization o ON pgsp.organ_id_=o.id_

+ 74 - 3
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -763,9 +763,7 @@
     </select>
 
     <select id="getOrganStudentNum" resultType="int">
-        SELECT COUNT(stu.user_id_) totalStudentNum,
-               SUM(CASE WHEN stu.member_rank_setting_id_ IS NULL THEN 0 ELSE 1 END) vipStudentNum,
-               SUM(CASE WHEN stu.experience_member_rank_setting_id_ IS NULL THEN 0 ELSE 1 END) eVipStudentNum
+        SELECT COUNT(stu.user_id_) totalStudentNum
         FROM student stu
             LEFT JOIN sys_user su ON stu.user_id_=su.id_
         WHERE su.del_flag_=0
@@ -774,6 +772,22 @@
         </if>
     </select>
 
+    <select id="getOrgansStudentNum" resultType="map">
+        SELECT
+               su.organ_id_ 'key',
+               COUNT(stu.user_id_) 'value'
+        FROM student stu
+        LEFT JOIN sys_user su ON stu.user_id_=su.id_
+        WHERE su.del_flag_=0
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
     <select id="getCloudStudyStudentNum" resultType="int">
         SELECT
             COUNT(DISTINCT smcr.user_id_)
@@ -782,6 +796,24 @@
              LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
         WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL AND su.organ_id_=#{organId};
     </select>
+
+    <select id="getOrganCloudStudyStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT smcr.user_id_) 'value'
+        FROM sys_music_compare_record smcr
+                 LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                 LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
     <select id="getCloudStudyLivelyStudentNum" resultType="int">
         SELECT COUNT(user_id_)
         FROM (SELECT
@@ -794,6 +826,28 @@
             GROUP BY smcr.user_id_) t WHERE t.days>=5
     </select>
 
+    <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">
+        SELECT
+               t.organ_id_ 'key',
+               COUNT(user_id_) 'value'
+        FROM (SELECT
+                su.organ_id_,
+                  smcr.user_id_,
+                  COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
+              FROM sys_music_compare_record smcr
+                       LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+                       LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+              WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>
+              GROUP BY smcr.user_id_) t WHERE t.days>=5
+        GROUP BY t.organ_id_
+    </select>
+
     <sql id="queryCloudStudyStudentDataCondition">
         <where>
             su.del_flag_=0
@@ -853,6 +907,23 @@
         WHERE su.del_flag_=0 AND su.organ_id_=#{organId} AND stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT IN (1, 2))
     </select>
 
+    <select id="getOrgansEVipStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT stu.user_id_) 'value'
+        FROM student stu
+                 LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+                 LEFT JOIN sys_user su ON su.id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT IN (1, 2))
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1

+ 21 - 1
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentController.java

@@ -1,17 +1,25 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @Author Joburgess
  * @Date 2021/8/17 0017
@@ -23,7 +31,8 @@ public class EduStudentController extends BaseController {
 
     @Autowired
     private StudentService studentService;
-
+    @Autowired
+    private OrganizationService organizationService;
 
     @ApiOperation(value = "云教练学员数据")
     @GetMapping("/organStudentData")
@@ -31,4 +40,15 @@ public class EduStudentController extends BaseController {
         return succeed(studentService.organStudentData(queryInfo));
     }
 
+    @ApiOperation(value = "分部云教练学员数据预览")
+    @GetMapping("/organStudentOverView")
+    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+        List<Organization> organizations = organizationService.queryEmployeeOrgan();
+        if(CollectionUtils.isEmpty(organizations)){
+            return succeed(Collections.emptyList());
+        }
+        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        return succeed(studentService.organStudentOverView(organIds));
+    }
+
 }