Browse Source

小程序,首页机构人数统计、机构人数按天统计

zouxuan 1 year ago
parent
commit
2a44a19522

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantPersonStat.java

@@ -0,0 +1,55 @@
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 机构人员信息统计
+ * 2023-07-25 10:43:00
+ */
+@Data
+@ApiModel(" TenantPersonStat-机构人员信息统计")
+@TableName("tenant_person_stat")
+public class TenantPersonStat implements Serializable {
+
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("机构编号") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("学员人数") 
+	@TableField(value = "student_num_")
+    private Integer studentNum = 0;
+
+    @ApiModelProperty("老师人数") 
+	@TableField(value = "teacher_num_")
+    private Integer teacherNum = 0;
+
+    @ApiModelProperty("年月日") 
+	@TableField(value = "day_")
+    private String day;
+
+    @ApiModelProperty("年月") 
+	@TableField(value = "month_")
+    private String month;
+
+    @ApiModelProperty("年") 
+	@TableField(value = "year_")
+    private String year;
+
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 26 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantPersonStatMapper.java

@@ -0,0 +1,26 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantPersonStat;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 机构人员信息统计
+ * 2023-07-25 10:43:00
+ */
+@Repository
+public interface TenantPersonStatMapper extends BaseMapper<TenantPersonStat> {
+
+	//初始化统计数据
+    List<TenantPersonStat> init();
+
+	//获取首页人数统计节点列表
+    List<TenantPersonStatWrapper.TenantPersonStatDto> indexSum(@Param("query") TenantPersonStatWrapper.TenantPersonStatQuery query);
+
+	//获取当前时间机构人员数量
+	TenantPersonStatWrapper.TenantPersonStat sumByNow(@Param("tenantId") Long tenantId);
+}

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantPersonStatService.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.TenantPersonStat;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+
+/**
+ * 机构人员信息统计
+ * 2023-07-25 10:43:00
+ */
+public interface TenantPersonStatService extends IService<TenantPersonStat>  {
+
+    //每天一次定时任务
+    void tenantPersonStatTask();
+
+    //小程序首页统计
+    TenantPersonStatWrapper.TenantPersonStatSum indexSum(TenantPersonStatWrapper.TenantPersonStatQuery query);
+     
+}

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

@@ -0,0 +1,89 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.entity.TenantPersonStat;
+import com.yonge.cooleshow.biz.dal.mapper.TenantPersonStatMapper;
+import com.yonge.cooleshow.biz.dal.service.TenantPersonStatService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import com.yonge.toolset.utils.date.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 机构人员信息统计
+ * 2023-07-25 10:43:00
+ */
+@Slf4j
+@Service
+public class TenantPersonStatServiceImpl extends ServiceImpl<TenantPersonStatMapper, TenantPersonStat> implements TenantPersonStatService {
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void tenantPersonStatTask() {
+        Date date = DateUtil.addDays(new Date(), -1);
+        String day = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+        this.lambdaUpdate().eq(TenantPersonStat::getDay,day).remove();
+        String month = DateUtil.getMonth(date);
+        String year = DateUtil.getYear(date);
+        //获取初始化数据
+        List<TenantPersonStat> stats = baseMapper.init();
+        if(CollectionUtils.isNotEmpty(stats)){
+            stats.stream().forEach(e->{
+                e.setDay(day);
+                e.setMonth(month);
+                e.setYear(year);
+            });
+            this.saveBatch(stats);
+        }
+    }
+
+    @Override
+    public TenantPersonStatWrapper.TenantPersonStatSum indexSum(TenantPersonStatWrapper.TenantPersonStatQuery query) {
+        //获取时间周期,以及分组条件
+        List<String> dates = this.getDates(query);
+        List<TenantPersonStatWrapper.TenantPersonStatDto> vos = baseMapper.indexSum(query);
+
+        Map<String, TenantPersonStatWrapper.TenantPersonStatDto> dateMap = vos.stream()
+                .collect(Collectors.toMap(TenantPersonStatWrapper.TenantPersonStatDto::getDate, Function.identity()));
+        Set<String> keySet = dateMap.keySet();
+        // 遍历日期列表,补全数据并添加到结果集中
+        List<TenantPersonStatWrapper.TenantPersonStatDto> dtos = new ArrayList<>();
+        for (String date : dates) {
+            if (keySet.contains(date)) {
+                //如果存在对应日期的数据,则添加到结果集中
+                dtos.add(dateMap.get(date));
+            } else {
+                // 如果不存在对应日期的数据
+                dtos.add(new TenantPersonStatWrapper.TenantPersonStatDto(date));
+            }
+        }
+        return new TenantPersonStatWrapper.TenantPersonStatSum(baseMapper.sumByNow(query.getTenantId()),dtos);
+    }
+
+    private List<String> getDates(TenantPersonStatWrapper.TenantPersonStatQuery query){
+        Date startTime = DateUtil.stringToDate(query.getStartTime(),DateUtil.DEFAULT_PATTERN);
+        Date endTime = DateUtil.stringToDate(query.getEndTime(),DateUtil.DEFAULT_PATTERN);
+        List<String> dates;
+        if(DateUtil.daysBetween(startTime, endTime) <= 31){
+            query.setGroupBy("day_");
+            query.setFormat("%d日");
+            dates = DateUtil.getDatesBetweenByDay(startTime, endTime);
+        } else if (DateUtil.monthsBetween(startTime, endTime) <= 12) {
+            query.setGroupBy("month_");
+            query.setFormat("%m月");
+            dates = DateUtil.getDatesBetweenByMonth(startTime, endTime);
+        }else {
+            query.setGroupBy("year_");
+            query.setFormat("%Y年");
+            dates = DateUtil.getDatesBetweenByYear(startTime, endTime);
+        }
+        return dates;
+    }
+}

+ 73 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantPersonStatWrapper.java

@@ -0,0 +1,73 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 机构人员信息统计
+ * 2023-07-25 10:43:00
+ */
+@ApiModel(value = "TenantPersonStatWrapper对象", description = "机构人员信息统计查询对象")
+public class TenantPersonStatWrapper {
+
+    @Data
+    public static class TenantPersonStatQuery extends BaseEntity {
+
+        @ApiModelProperty("开始时间(年月日)")
+        private String startTime;
+
+        @ApiModelProperty("截止时间(年月日)")
+        private String endTime;
+
+        private String groupBy;
+
+        private String format;
+    }  
+
+	@Data
+    public static class TenantPersonStatDto {
+
+        @ApiModelProperty("学员人数")
+        private Integer studentNum = 0;
+
+        @ApiModelProperty("老师人数")
+        private Integer teacherNum = 0;
+
+        @ApiModelProperty("时间节点")
+        private String date;
+
+        public TenantPersonStatDto(String date) {
+            this.date = date;
+        }
+    }
+
+	@Data
+    public static class TenantPersonStat {
+
+        @ApiModelProperty("学员总人数")
+        private Integer studentNum = 0;
+
+        @ApiModelProperty("老师总人数")
+        private Integer teacherNum = 0;
+	}
+
+	@Data
+    public static class TenantPersonStatSum {
+
+        @ApiModelProperty("总人数统计")
+        private TenantPersonStat tenantPersonStat;
+
+        @ApiModelProperty("列表数据")
+        private List<TenantPersonStatDto> statDtos;
+
+        public TenantPersonStatSum(TenantPersonStat tenantPersonStat, List<TenantPersonStatDto> statDtos) {
+            this.tenantPersonStat = tenantPersonStat;
+            this.statDtos = statDtos;
+        }
+    }
+
+}

+ 38 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantPersonStatMapper.xml

@@ -0,0 +1,38 @@
+<?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.mapper.TenantPersonStatMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.student_num_ AS studentNum
+        , t.teacher_num_ AS teacherNum
+        , t.day_ AS day
+        , t.month_ AS month
+        , t.year_ AS year
+        , t.create_time_ AS createTime
+        </sql> 
+    
+    <select id="init" resultType="com.yonge.cooleshow.biz.dal.entity.TenantPersonStat">
+        select ti.id_ tenantId,COUNT(s.user_id_) studentNum,COUNT(t.user_id_) teacherNum from tenant_info ti
+        left join student s ON s.tenant_id_ = ti.id_ AND s.lock_flag_ = 0
+        left join teacher t ON t.tenant_id_ = ti.id_ AND t.lock_flag_ = 0
+        group by ti.id_
+    </select>
+    <select id="indexSum"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper$TenantPersonStatDto">
+        SELECT DATE_FORMAT(${query.groupBy},${query.format}) date,SUM(student_num_) studentNum,SUM(teacher_num_) teacherNum FROM tenant_person_stat
+        WHERE tenant_id_ = #{query.tenantId} AND day_ BETWEEN #{query.startTime} AND #{query.endTime}
+        GROUP BY ${query.groupBy}
+    </select>
+    <select id="sumByNow" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper$TenantPersonStat">
+        select COUNT(s.user_id_) studentNum,COUNT(t.user_id_) teacherNum from tenant_info ti
+        left join student s ON s.tenant_id_ = ti.id_ AND s.lock_flag_ = 0
+        left join teacher t ON t.tenant_id_ = ti.id_ AND t.lock_flag_ = 0
+        where ti.id_ = #{tenantId}
+    </select>
+
+</mapper>

+ 20 - 3
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java → cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/IndexController.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.SysMusicCompareRecordService;
+import com.yonge.cooleshow.biz.dal.service.TenantPersonStatService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -12,15 +14,17 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-@Api(tags = "小酷Ai记录")
-@RequestMapping("sysMusicRecord")
+@Api(tags = "首页统计")
+@RequestMapping("index")
 @RestController
-public class SysMusicCompareRecordController extends BaseController {
+public class IndexController extends BaseController {
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private SysMusicCompareRecordService sysMusicCompareRecordService;
+    @Autowired
+    private TenantPersonStatService tenantPersonStatService;
 
 
     @ApiOperation("学员训练数据统计列表")
@@ -52,4 +56,17 @@ public class SysMusicCompareRecordController extends BaseController {
         return succeed(result);
     }
 
+    @ApiOperation("学员训练数据统计列表")
+    @PostMapping("tenantPersonStatSum")
+    public HttpResponseResult<TenantPersonStatWrapper.TenantPersonStatSum> tenantPersonStatSum
+            (@RequestBody TenantPersonStatWrapper.TenantPersonStatQuery query){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        query.setTenantId(sysUser.getTenantId());
+        tenantPersonStatService.indexSum(query);
+        return succeed(tenantPersonStatService.indexSum(query));
+    }
+
 }

+ 43 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

@@ -30,6 +30,12 @@ public class DateUtil {
 
 	public static final String DATE_FORMAT_MIN = "yyyy年MM月dd日";
 
+	public static final String DATE_FORMAT_DAY = "dd日";
+
+	public static final String DATE_FORMAT_MONTH = "MM月";
+
+	public static final String DATE_FORMAT_YEAR = "yyyy年";
+
 	/**
 	 * 默认使用的Locale。默认Locale为 US
 	 */
@@ -1221,6 +1227,43 @@ public class DateUtil {
 		return false;
 	}
 
+
+	public static List<String> getDatesBetweenByDay(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_DAY);
+			dates.add(dateString);
+			currentDate = DateUtil.addDays(currentDate,1);
+		}
+		return dates;
+	}
+
+	public static List<String> getDatesBetweenByMonth(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_MONTH);
+			dates.add(dateString);
+			currentDate = DateUtil.addMonths(currentDate,1);
+		}
+		return dates;
+	}
+
+	public static List<String> getDatesBetweenByYear(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_YEAR);
+			dates.add(dateString);
+			currentDate = DateUtil.addYears(currentDate,1);
+		}
+		return dates;
+	}
+
 	/**
 	 * @describe 时间区段辅助类
 	 * @author Joburgess