新增:教学管理查看使用时长
This commit is contained in:
parent
179b880409
commit
49f6b357d3
3
sql/20210607-thesai.sql
Normal file
3
sql/20210607-thesai.sql
Normal file
@ -0,0 +1,3 @@
|
||||
ALTER TABLE `user_simulation_stats`
|
||||
ADD COLUMN `end_time` datetime NOT NULL DEFAULT '1970-01-01 01:01:01' ON UPDATE CURRENT_TIMESTAMP AFTER `fake`;
|
||||
|
@ -19,6 +19,7 @@ import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.LessonVO;
|
||||
import club.joylink.rtss.vo.client.Node;
|
||||
import club.joylink.rtss.vo.client.PageVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.org.*;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@ -290,49 +291,55 @@ public class OrgController {
|
||||
return iOrgService.adminQueryOrgTree(orgId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@ApiOperation("数据处理接口,用后即删")
|
||||
@PutMapping("/data/data")
|
||||
public void data() {
|
||||
OrgUserExample orgUserExample = new OrgUserExample();
|
||||
orgUserExample.createCriteria().andRoleEqualTo(BusinessConsts.OrgRole.Student.name());
|
||||
List<OrgUser> ous = orgUserDAO.selectByExample(orgUserExample);
|
||||
Set<Long> orgIdSet = new HashSet<>();
|
||||
Map<Long, Set<Long>> userId_orgIdSet_map = new HashMap<>();
|
||||
ous.forEach(ou -> {
|
||||
orgIdSet.add(ou.getOrgId());
|
||||
Set<Long> userOrgIdSet = userId_orgIdSet_map.computeIfAbsent(ou.getUserId(), k -> new HashSet<>());
|
||||
userOrgIdSet.add(ou.getOrgId());
|
||||
});
|
||||
List<Org> orgList = iOrgService.findEntities(new ArrayList<>(orgIdSet), null);
|
||||
Map<Long, Long> orgId_rootId_map = orgList.stream().collect(Collectors.toMap(Org::getId, Org::getRootId));
|
||||
Map<Long, Org> topOrgMap = iOrgService.findEntities(new ArrayList<>(orgId_rootId_map.values()), null)
|
||||
.stream().collect(Collectors.toMap(Org::getId, Function.identity()));
|
||||
List<SysUser> users = iSysUserService.findEntities(new ArrayList<>(userId_orgIdSet_map.keySet()), null);
|
||||
Set<Long> nonRootOrgIds = new HashSet<>();
|
||||
users.forEach(user -> {
|
||||
Set<Long> userOrgIdSet = userId_orgIdSet_map.get(user.getId());
|
||||
String orgCode = null;
|
||||
Long rootId = null;
|
||||
for (Long orgId : userOrgIdSet) {
|
||||
rootId = orgId_rootId_map.get(orgId);
|
||||
if (rootId == null) {
|
||||
nonRootOrgIds.add(rootId);
|
||||
} else {
|
||||
Org org = topOrgMap.get(rootId);
|
||||
if (orgCode == null) {
|
||||
orgCode = org.getCode();
|
||||
} else {
|
||||
BusinessExceptionAssertEnum.DATA_ERROR.assertEquals(orgCode, org.getCode(), userOrgIdSet.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(orgCode, user.getId() + "无所属顶级组织");
|
||||
user.setAccount(user.getAccount().substring(0, user.getAccount().indexOf(orgCode)));
|
||||
user.setOrgId(rootId);
|
||||
sysUserDAO.updateByPrimaryKey(user);
|
||||
});
|
||||
System.out.println(nonRootOrgIds.toString());
|
||||
@ApiOperation("获取学生实训使用时长")
|
||||
@GetMapping("/usage/students")
|
||||
public List<StudentsUsageStatisticsVO> statisticUsage(@Validated UsageQueryVO queryVO) {
|
||||
return iOrgUserService.statisticUsage(queryVO);
|
||||
}
|
||||
|
||||
// @Transactional
|
||||
// @ApiOperation("数据处理接口,用后即删")
|
||||
// @PutMapping("/data/data")
|
||||
// public void data() {
|
||||
// OrgUserExample orgUserExample = new OrgUserExample();
|
||||
// orgUserExample.createCriteria().andRoleEqualTo(BusinessConsts.OrgRole.Student.name());
|
||||
// List<OrgUser> ous = orgUserDAO.selectByExample(orgUserExample);
|
||||
// Set<Long> orgIdSet = new HashSet<>();
|
||||
// Map<Long, Set<Long>> userId_orgIdSet_map = new HashMap<>();
|
||||
// ous.forEach(ou -> {
|
||||
// orgIdSet.add(ou.getOrgId());
|
||||
// Set<Long> userOrgIdSet = userId_orgIdSet_map.computeIfAbsent(ou.getUserId(), k -> new HashSet<>());
|
||||
// userOrgIdSet.add(ou.getOrgId());
|
||||
// });
|
||||
// List<Org> orgList = iOrgService.findEntities(new ArrayList<>(orgIdSet), null);
|
||||
// Map<Long, Long> orgId_rootId_map = orgList.stream().collect(Collectors.toMap(Org::getId, Org::getRootId));
|
||||
// Map<Long, Org> topOrgMap = iOrgService.findEntities(new ArrayList<>(orgId_rootId_map.values()), null)
|
||||
// .stream().collect(Collectors.toMap(Org::getId, Function.identity()));
|
||||
// List<SysUser> users = iSysUserService.findEntities(new ArrayList<>(userId_orgIdSet_map.keySet()), null);
|
||||
// Set<Long> nonRootOrgIds = new HashSet<>();
|
||||
// users.forEach(user -> {
|
||||
// Set<Long> userOrgIdSet = userId_orgIdSet_map.get(user.getId());
|
||||
// String orgCode = null;
|
||||
// Long rootId = null;
|
||||
// for (Long orgId : userOrgIdSet) {
|
||||
// rootId = orgId_rootId_map.get(orgId);
|
||||
// if (rootId == null) {
|
||||
// nonRootOrgIds.add(rootId);
|
||||
// } else {
|
||||
// Org org = topOrgMap.get(rootId);
|
||||
// if (orgCode == null) {
|
||||
// orgCode = org.getCode();
|
||||
// } else {
|
||||
// BusinessExceptionAssertEnum.DATA_ERROR.assertEquals(orgCode, org.getCode(), userOrgIdSet.toString());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(orgCode, user.getId() + "无所属顶级组织");
|
||||
// user.setAccount(user.getAccount().substring(0, user.getAccount().indexOf(orgCode)));
|
||||
// user.setOrgId(rootId);
|
||||
// sysUserDAO.updateByPrimaryKey(user);
|
||||
// });
|
||||
// System.out.println(nonRootOrgIds.toString());
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -5,11 +5,13 @@ import club.joylink.rtss.entity.UserSimulationStatsExample;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.UserSimulationStatsListVO;
|
||||
import club.joylink.rtss.vo.client.UserSimulationStatsQueryVO;
|
||||
import club.joylink.rtss.vo.client.org.StudentsUsageStatisticsVO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -108,4 +110,6 @@ public interface UserSimulationStatsDAO extends MyBatisBaseDao<UserSimulationSta
|
||||
"where " +
|
||||
"map_prd_id=#{prdId} ")
|
||||
void fillPrdType(Long prdId, String prdType);
|
||||
|
||||
List<StudentsUsageStatisticsVO> queryUsage(long mapId, List<Long> userIds, LocalDateTime startTime, LocalDateTime endTime);
|
||||
}
|
@ -75,6 +75,31 @@ public interface UserTrainingStatsMapper {
|
||||
"</script>")
|
||||
UserRankStatsVO selectRank(LocalDateTime startTime, LocalDateTime endTime, List<Long> lessonIds, Long userId);
|
||||
|
||||
@Select("<script>" +
|
||||
"SELECT SUM(ut.duration) AS duration, " +
|
||||
// "u.name AS username, " +
|
||||
"ut.user_id AS userId " +
|
||||
"FROM user_training_stats ut " +
|
||||
// "LEFT JOIN sys_user u ON u.id = ut.user_id " +
|
||||
"WHERE 1 = 1" +
|
||||
"<if test=\"startTime != null\">" +
|
||||
" AND ut.finish_time >= #{startTime}" +
|
||||
"</if>" +
|
||||
"<if test=\"endTime != null\">" +
|
||||
" AND ut.finish_time <= #{endTime}" +
|
||||
"</if>" +
|
||||
"AND ut.lesson_id IN" +
|
||||
"<foreach collection='lessonIds' item='lessonId' open='(' separator=',' close=')'>" +
|
||||
" #{lessonId}" +
|
||||
"</foreach>" +
|
||||
"AND ut.user_id IN " +
|
||||
"<foreach collection='userIds' item='userId' open='(' separator=',' close=')'>" +
|
||||
" #{userId}" +
|
||||
"</foreach>" +
|
||||
"GROUP BY ut.user_id" +
|
||||
"</script>")
|
||||
List<UserRankStatsVO> selectUsage(LocalDateTime startTime, LocalDateTime endTime, List<Long> lessonIds, List<Long> userIds);
|
||||
|
||||
@Select("<script>" +
|
||||
"SELECT dd.name AS statsProjectName, " +
|
||||
"SUM(ut.duration) AS duration, " +
|
||||
|
@ -1,10 +1,11 @@
|
||||
package club.joylink.rtss.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* user_simulation_stats
|
||||
* @author
|
||||
* 用户仿真统计
|
||||
*/
|
||||
public class UserSimulationStats implements Serializable {
|
||||
private Long id;
|
||||
@ -19,6 +20,11 @@ public class UserSimulationStats implements Serializable {
|
||||
*/
|
||||
private Long mapId;
|
||||
|
||||
/**
|
||||
* 产品编码
|
||||
*/
|
||||
private Long mapPrdId;
|
||||
|
||||
/**
|
||||
* 产品类型
|
||||
*/
|
||||
@ -39,6 +45,8 @@ public class UserSimulationStats implements Serializable {
|
||||
*/
|
||||
private Boolean fake;
|
||||
|
||||
private LocalDateTime endTime;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public Long getId() {
|
||||
@ -65,6 +73,14 @@ public class UserSimulationStats implements Serializable {
|
||||
this.mapId = mapId;
|
||||
}
|
||||
|
||||
public Long getMapPrdId() {
|
||||
return mapPrdId;
|
||||
}
|
||||
|
||||
public void setMapPrdId(Long mapPrdId) {
|
||||
this.mapPrdId = mapPrdId;
|
||||
}
|
||||
|
||||
public String getPrdType() {
|
||||
return prdType;
|
||||
}
|
||||
@ -97,6 +113,14 @@ public class UserSimulationStats implements Serializable {
|
||||
this.fake = fake;
|
||||
}
|
||||
|
||||
public LocalDateTime getEndTime() {
|
||||
return endTime;
|
||||
}
|
||||
|
||||
public void setEndTime(LocalDateTime endTime) {
|
||||
this.endTime = endTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object that) {
|
||||
if (this == that) {
|
||||
@ -112,10 +136,12 @@ public class UserSimulationStats implements Serializable {
|
||||
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
|
||||
&& (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
|
||||
&& (this.getMapId() == null ? other.getMapId() == null : this.getMapId().equals(other.getMapId()))
|
||||
&& (this.getMapPrdId() == null ? other.getMapPrdId() == null : this.getMapPrdId().equals(other.getMapPrdId()))
|
||||
&& (this.getPrdType() == null ? other.getPrdType() == null : this.getPrdType().equals(other.getPrdType()))
|
||||
&& (this.getDuration() == null ? other.getDuration() == null : this.getDuration().equals(other.getDuration()))
|
||||
&& (this.getRole() == null ? other.getRole() == null : this.getRole().equals(other.getRole()))
|
||||
&& (this.getFake() == null ? other.getFake() == null : this.getFake().equals(other.getFake()));
|
||||
&& (this.getFake() == null ? other.getFake() == null : this.getFake().equals(other.getFake()))
|
||||
&& (this.getEndTime() == null ? other.getEndTime() == null : this.getEndTime().equals(other.getEndTime()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -125,10 +151,12 @@ public class UserSimulationStats implements Serializable {
|
||||
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
|
||||
result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
|
||||
result = prime * result + ((getMapId() == null) ? 0 : getMapId().hashCode());
|
||||
result = prime * result + ((getMapPrdId() == null) ? 0 : getMapPrdId().hashCode());
|
||||
result = prime * result + ((getPrdType() == null) ? 0 : getPrdType().hashCode());
|
||||
result = prime * result + ((getDuration() == null) ? 0 : getDuration().hashCode());
|
||||
result = prime * result + ((getRole() == null) ? 0 : getRole().hashCode());
|
||||
result = prime * result + ((getFake() == null) ? 0 : getFake().hashCode());
|
||||
result = prime * result + ((getEndTime() == null) ? 0 : getEndTime().hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -141,10 +169,12 @@ public class UserSimulationStats implements Serializable {
|
||||
sb.append(", id=").append(id);
|
||||
sb.append(", userId=").append(userId);
|
||||
sb.append(", mapId=").append(mapId);
|
||||
sb.append(", mapPrdId=").append(mapPrdId);
|
||||
sb.append(", prdType=").append(prdType);
|
||||
sb.append(", duration=").append(duration);
|
||||
sb.append(", role=").append(role);
|
||||
sb.append(", fake=").append(fake);
|
||||
sb.append(", endTime=").append(endTime);
|
||||
sb.append(", serialVersionUID=").append(serialVersionUID);
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
|
@ -1,5 +1,6 @@
|
||||
package club.joylink.rtss.entity;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@ -304,6 +305,66 @@ public class UserSimulationStatsExample {
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdIsNull() {
|
||||
addCriterion("map_prd_id is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdIsNotNull() {
|
||||
addCriterion("map_prd_id is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdEqualTo(Long value) {
|
||||
addCriterion("map_prd_id =", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdNotEqualTo(Long value) {
|
||||
addCriterion("map_prd_id <>", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdGreaterThan(Long value) {
|
||||
addCriterion("map_prd_id >", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdGreaterThanOrEqualTo(Long value) {
|
||||
addCriterion("map_prd_id >=", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdLessThan(Long value) {
|
||||
addCriterion("map_prd_id <", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdLessThanOrEqualTo(Long value) {
|
||||
addCriterion("map_prd_id <=", value, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdIn(List<Long> values) {
|
||||
addCriterion("map_prd_id in", values, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdNotIn(List<Long> values) {
|
||||
addCriterion("map_prd_id not in", values, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdBetween(Long value1, Long value2) {
|
||||
addCriterion("map_prd_id between", value1, value2, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andMapPrdIdNotBetween(Long value1, Long value2) {
|
||||
addCriterion("map_prd_id not between", value1, value2, "mapPrdId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andPrdTypeIsNull() {
|
||||
addCriterion("prd_type is null");
|
||||
return (Criteria) this;
|
||||
@ -563,6 +624,66 @@ public class UserSimulationStatsExample {
|
||||
addCriterion("fake not between", value1, value2, "fake");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeIsNull() {
|
||||
addCriterion("end_time is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeIsNotNull() {
|
||||
addCriterion("end_time is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeEqualTo(LocalDateTime value) {
|
||||
addCriterion("end_time =", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeNotEqualTo(LocalDateTime value) {
|
||||
addCriterion("end_time <>", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeGreaterThan(LocalDateTime value) {
|
||||
addCriterion("end_time >", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeGreaterThanOrEqualTo(LocalDateTime value) {
|
||||
addCriterion("end_time >=", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeLessThan(LocalDateTime value) {
|
||||
addCriterion("end_time <", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeLessThanOrEqualTo(LocalDateTime value) {
|
||||
addCriterion("end_time <=", value, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeIn(List<LocalDateTime> values) {
|
||||
addCriterion("end_time in", values, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeNotIn(List<LocalDateTime> values) {
|
||||
addCriterion("end_time not in", values, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeBetween(LocalDateTime value1, LocalDateTime value2) {
|
||||
addCriterion("end_time between", value1, value2, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andEndTimeNotBetween(LocalDateTime value1, LocalDateTime value2) {
|
||||
addCriterion("end_time not between", value1, value2, "endTime");
|
||||
return (Criteria) this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -168,4 +168,6 @@ public interface ILessonService {
|
||||
* 按条件查询非默认课程
|
||||
*/
|
||||
List<LessonVO> queryNonDefaultLessons(Long creatorId, Project project, String status);
|
||||
|
||||
List<LsLesson> findLessonEntities(long mapId);
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import club.joylink.rtss.vo.client.UsageTotalStatsVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface IUserUsageStatsService {
|
||||
@ -79,4 +80,6 @@ public interface IUserUsageStatsService {
|
||||
* @return
|
||||
*/
|
||||
List<UsageTotalStatsVO> totalDuration(boolean filter);
|
||||
|
||||
List<UserRankStatsVO> queryTrainingUsageGroupByUser(LocalDateTime start, LocalDateTime end, List<Long> lessonIds, List<Long> userIds);
|
||||
}
|
||||
|
@ -853,7 +853,8 @@ public class LessonService implements ILessonService {
|
||||
return new LessonVO(lessonList.get(0));
|
||||
}
|
||||
|
||||
private List<LsLesson> findLessonEntities(@NonNull Long mapId) {
|
||||
@Override
|
||||
public List<LsLesson> findLessonEntities(long mapId) {
|
||||
LsLessonExample example = new LsLessonExample();
|
||||
example.createCriteria().andMapIdEqualTo(mapId);
|
||||
return lessonDAO.selectByExample(example);
|
||||
|
@ -153,6 +153,11 @@ public class UserUsageStatsService implements IUserUsageStatsService {
|
||||
return usageTotalStatsVOS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserRankStatsVO> queryTrainingUsageGroupByUser(LocalDateTime start, LocalDateTime end, List<Long> lessonIds, List<Long> userIds) {
|
||||
return this.userTrainingStatsMapper.selectUsage(start, end, lessonIds, userIds);
|
||||
}
|
||||
|
||||
public static void addMyRank(List<UserRankStatsVO> rankList, UserVO userVO) {
|
||||
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertCollectionNotEmpty(rankList);
|
||||
for(int i = 0; i < rankList.size(); i++) {
|
||||
|
@ -7,10 +7,8 @@ import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.ExamDefinitionVO;
|
||||
import club.joylink.rtss.vo.client.Node;
|
||||
import club.joylink.rtss.vo.client.PageVO;
|
||||
import club.joylink.rtss.vo.client.org.CompanyVO;
|
||||
import club.joylink.rtss.vo.client.org.DepartmentVO;
|
||||
import club.joylink.rtss.vo.client.org.NonTopOrgCreateVO;
|
||||
import club.joylink.rtss.vo.client.org.OrgQueryVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.org.*;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -6,6 +6,7 @@ import club.joylink.rtss.entity.OrgUser;
|
||||
import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.LessonVO;
|
||||
import club.joylink.rtss.vo.client.PageVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.org.*;
|
||||
|
||||
import java.util.List;
|
||||
@ -75,4 +76,6 @@ public interface IOrgUserService {
|
||||
List<OrgUser> findEntitiesByUserId(long userId, BusinessConsts.OrgRole role);
|
||||
|
||||
void userBindCompanyManager(UserVO userVO, Long topOrgId);
|
||||
|
||||
List<StudentsUsageStatisticsVO> statisticUsage(UsageQueryVO queryVO);
|
||||
}
|
||||
|
@ -6,11 +6,13 @@ import club.joylink.rtss.dao.OrgDAO;
|
||||
import club.joylink.rtss.entity.*;
|
||||
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
||||
import club.joylink.rtss.services.ISysUserService;
|
||||
import club.joylink.rtss.services.IUserUsageStatsService;
|
||||
import club.joylink.rtss.vo.LoginUserInfoVO;
|
||||
import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.ExamDefinitionVO;
|
||||
import club.joylink.rtss.vo.client.Node;
|
||||
import club.joylink.rtss.vo.client.PageVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.org.*;
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
|
@ -9,10 +9,13 @@ import club.joylink.rtss.entity.*;
|
||||
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
||||
import club.joylink.rtss.services.ILessonService;
|
||||
import club.joylink.rtss.services.ISysUserService;
|
||||
import club.joylink.rtss.services.IUserUsageStatsService;
|
||||
import club.joylink.rtss.services.completition.IRaceQuestionsRuleService;
|
||||
import club.joylink.rtss.services.user.IUserSimulationStatService;
|
||||
import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.LessonVO;
|
||||
import club.joylink.rtss.vo.client.PageVO;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import club.joylink.rtss.vo.client.org.*;
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
@ -25,6 +28,7 @@ import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@ -47,11 +51,17 @@ public class OrgUserService implements IOrgUserService {
|
||||
@Autowired
|
||||
private OrgExamDAO orgExamDAO;
|
||||
@Autowired
|
||||
private ILessonService lessonService;
|
||||
private ILessonService iLessonService;
|
||||
|
||||
@Autowired
|
||||
private IOrgService iOrgService;
|
||||
|
||||
@Autowired
|
||||
private IUserUsageStatsService iUserUsageStatsService;
|
||||
|
||||
@Autowired
|
||||
private IUserSimulationStatService iUserSimulationStatService;
|
||||
|
||||
|
||||
@Override
|
||||
public CompanyVO userScanCodeBindCompanyManager(Long userId, Long companyId) {
|
||||
@ -268,7 +278,7 @@ public class OrgUserService implements IOrgUserService {
|
||||
public List<LessonVO> getLessonsByDepart(Long departId) {
|
||||
List<Long> lessonIds = getDepartLessonRefs(departId).stream().map(OrgLesson::getLessonId).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(lessonIds)) return new ArrayList<>();
|
||||
return lessonService.getValidLesson(null, lessonIds, null);
|
||||
return iLessonService.getValidLesson(null, lessonIds, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -398,7 +408,33 @@ public class OrgUserService implements IOrgUserService {
|
||||
userVO.setOrgInfo(topOrg, true);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<StudentsUsageStatisticsVO> statisticUsage(UsageQueryVO queryVO) {
|
||||
List<OrgUser> students = this.findEntitiesByOrgId(queryVO.getClsId(), BusinessConsts.OrgRole.Student);
|
||||
if (CollectionUtils.isEmpty(students)) {
|
||||
return List.of();
|
||||
}
|
||||
List<Long> userIds = students.stream().map(OrgUser::getUserId).collect(Collectors.toList());
|
||||
List<StudentsUsageStatisticsVO> vos = StudentsUsageStatisticsVO.buildList(iSysUserService.findEntities(userIds, "id"));
|
||||
Map<Long, StudentsUsageStatisticsVO> voMap = vos.stream().collect(Collectors.toMap(StudentsUsageStatisticsVO::getUserId, Function.identity()));
|
||||
List<Long> lessonIds = iLessonService.findLessonEntities(queryVO.getMapId())
|
||||
.stream().map(LsLesson::getId).collect(Collectors.toList());
|
||||
if (!CollectionUtils.isEmpty(lessonIds)) {
|
||||
List<UserRankStatsVO> trainingUsage =
|
||||
iUserUsageStatsService.queryTrainingUsageGroupByUser(queryVO.getStartTime(), queryVO.getEndTime(), lessonIds, userIds);
|
||||
for (UserRankStatsVO usage : trainingUsage) {
|
||||
StudentsUsageStatisticsVO vo = voMap.get(usage.getUserId());
|
||||
vo.setTrainingDuration(usage.getDuration());
|
||||
}
|
||||
}
|
||||
List<StudentsUsageStatisticsVO> simulationUsage =
|
||||
iUserSimulationStatService.querySimulationUsage(queryVO.getMapId(), userIds, queryVO.getStartTime(), queryVO.getEndTime());
|
||||
for (StudentsUsageStatisticsVO usage : simulationUsage) {
|
||||
StudentsUsageStatisticsVO vo = voMap.get(usage.getUserId());
|
||||
vo.setSimulationDuration(usage.getSimulationDuration());
|
||||
}
|
||||
return vos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@ -414,10 +450,10 @@ public class OrgUserService implements IOrgUserService {
|
||||
SysUser sysUser = importOrgUser.convert2DB();
|
||||
sysUser.setOrgId(topOrg.getId());
|
||||
iSysUserService.createUser(sysUser);
|
||||
create(orgId, sysUser.getId() , BusinessConsts.OrgRole.Student);
|
||||
create(orgId, sysUser.getId(), BusinessConsts.OrgRole.Student);
|
||||
} else {
|
||||
if (!orgUserIdSet.contains(user.getId())) {
|
||||
create(orgId, user.getId() , BusinessConsts.OrgRole.Student);
|
||||
create(orgId, user.getId(), BusinessConsts.OrgRole.Student);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,9 @@ package club.joylink.rtss.services.user;
|
||||
|
||||
import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.*;
|
||||
import club.joylink.rtss.vo.client.org.StudentsUsageStatisticsVO;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface IUserSimulationStatService {
|
||||
@ -88,4 +90,6 @@ public interface IUserSimulationStatService {
|
||||
* @param filter
|
||||
*/
|
||||
List<UsageTotalStatsVO> totalDuration(boolean filter, List<Long> userIds);
|
||||
|
||||
List<StudentsUsageStatisticsVO> querySimulationUsage(long mapId, List<Long> userIds, LocalDateTime startTime, LocalDateTime endTime);
|
||||
}
|
||||
|
@ -9,11 +9,13 @@ import club.joylink.rtss.services.IMapService;
|
||||
import club.joylink.rtss.services.UserUsageStatsService;
|
||||
import club.joylink.rtss.vo.UserVO;
|
||||
import club.joylink.rtss.vo.client.*;
|
||||
import club.joylink.rtss.vo.client.org.StudentsUsageStatisticsVO;
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
@ -32,6 +34,7 @@ public class UserSimulationStatService implements IUserSimulationStatService {
|
||||
public void addUserSimulationStats(UserSimulationStatsVO statsVO, UserVO userVO) {
|
||||
UserSimulationStats userSimulationStats = statsVO.convert2DB();
|
||||
userSimulationStats.setFake(true);
|
||||
userSimulationStats.setEndTime(LocalDateTime.now());
|
||||
this.userSimulationStatsDAO.insertSelective(userSimulationStats);
|
||||
}
|
||||
|
||||
@ -44,6 +47,7 @@ public class UserSimulationStatService implements IUserSimulationStatService {
|
||||
userSimulationStats.setDuration(duration);
|
||||
userSimulationStats.setFake(false);
|
||||
userSimulationStats.setRole(role);
|
||||
userSimulationStats.setEndTime(LocalDateTime.now());
|
||||
this.userSimulationStatsDAO.insertSelective(userSimulationStats);
|
||||
}
|
||||
|
||||
@ -123,4 +127,9 @@ public class UserSimulationStatService implements IUserSimulationStatService {
|
||||
// 实训
|
||||
return usageTotalStatsVOList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<StudentsUsageStatisticsVO> querySimulationUsage(long mapId, List<Long> userIds, LocalDateTime startTime, LocalDateTime endTime) {
|
||||
return userSimulationStatsDAO.queryUsage(mapId, userIds, startTime, endTime);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,50 @@
|
||||
package club.joylink.rtss.vo.client.org;
|
||||
|
||||
import club.joylink.rtss.entity.OrgUser;
|
||||
import club.joylink.rtss.entity.SysUser;
|
||||
import club.joylink.rtss.vo.client.UserRankStatsVO;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 学生的实训/仿真使用时长统计
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
public class StudentsUsageStatisticsVO {
|
||||
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long userId;
|
||||
|
||||
private String account;
|
||||
|
||||
private String userName;
|
||||
|
||||
@Setter
|
||||
private Long trainingDuration;
|
||||
|
||||
@Setter
|
||||
private Long simulationDuration;
|
||||
|
||||
public StudentsUsageStatisticsVO(SysUser user) {
|
||||
this.userId = user.getId();
|
||||
this.account = user.getAccount();
|
||||
this.userName = user.getName();
|
||||
}
|
||||
|
||||
public static List<StudentsUsageStatisticsVO> buildList(Collection<SysUser> users) {
|
||||
if (CollectionUtils.isEmpty(users))
|
||||
return Collections.emptyList();
|
||||
return users.stream().map(StudentsUsageStatisticsVO::new).collect(Collectors.toList());
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package club.joylink.rtss.vo.client.org;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
public class UsageQueryVO {
|
||||
@NotNull(message = "班级id不能为空")
|
||||
private Long clsId;
|
||||
|
||||
@NotNull(message = "地图id不能为空")
|
||||
private Long mapId;
|
||||
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime startTime;
|
||||
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime endTime;
|
||||
}
|
@ -5,10 +5,12 @@
|
||||
<id column="id" jdbcType="BIGINT" property="id" />
|
||||
<result column="user_id" jdbcType="BIGINT" property="userId" />
|
||||
<result column="map_id" jdbcType="BIGINT" property="mapId" />
|
||||
<result column="map_prd_id" jdbcType="BIGINT" property="mapPrdId" />
|
||||
<result column="prd_type" jdbcType="VARCHAR" property="prdType" />
|
||||
<result column="duration" jdbcType="INTEGER" property="duration" />
|
||||
<result column="role" jdbcType="VARCHAR" property="role" />
|
||||
<result column="fake" jdbcType="BIT" property="fake" />
|
||||
<result column="fake" jdbcType="TINYINT" property="fake" />
|
||||
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
|
||||
</resultMap>
|
||||
<sql id="Example_Where_Clause">
|
||||
<where>
|
||||
@ -69,7 +71,7 @@
|
||||
</where>
|
||||
</sql>
|
||||
<sql id="Base_Column_List">
|
||||
id, user_id, map_id, prd_type, duration, `role`, fake
|
||||
id, user_id, map_id, map_prd_id, prd_type, duration, `role`, fake, end_time
|
||||
</sql>
|
||||
<select id="selectByExample" parameterType="club.joylink.rtss.entity.UserSimulationStatsExample" resultMap="BaseResultMap">
|
||||
select
|
||||
@ -110,10 +112,12 @@
|
||||
</if>
|
||||
</delete>
|
||||
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.UserSimulationStats" useGeneratedKeys="true">
|
||||
insert into user_simulation_stats (user_id, map_id, prd_type,
|
||||
duration, `role`, fake)
|
||||
values (#{userId,jdbcType=BIGINT}, #{mapId,jdbcType=BIGINT}, #{prdType,jdbcType=VARCHAR},
|
||||
#{duration,jdbcType=INTEGER}, #{role,jdbcType=VARCHAR}, #{fake,jdbcType=BIT})
|
||||
insert into user_simulation_stats (user_id, map_id, map_prd_id,
|
||||
prd_type, duration, `role`,
|
||||
fake, end_time)
|
||||
values (#{userId,jdbcType=BIGINT}, #{mapId,jdbcType=BIGINT}, #{mapPrdId,jdbcType=BIGINT},
|
||||
#{prdType,jdbcType=VARCHAR}, #{duration,jdbcType=INTEGER}, #{role,jdbcType=VARCHAR},
|
||||
#{fake,jdbcType=TINYINT}, #{endTime,jdbcType=TIMESTAMP})
|
||||
</insert>
|
||||
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.UserSimulationStats" useGeneratedKeys="true">
|
||||
insert into user_simulation_stats
|
||||
@ -124,6 +128,9 @@
|
||||
<if test="mapId != null">
|
||||
map_id,
|
||||
</if>
|
||||
<if test="mapPrdId != null">
|
||||
map_prd_id,
|
||||
</if>
|
||||
<if test="prdType != null">
|
||||
prd_type,
|
||||
</if>
|
||||
@ -136,6 +143,9 @@
|
||||
<if test="fake != null">
|
||||
fake,
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
end_time,
|
||||
</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="userId != null">
|
||||
@ -144,6 +154,9 @@
|
||||
<if test="mapId != null">
|
||||
#{mapId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="mapPrdId != null">
|
||||
#{mapPrdId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="prdType != null">
|
||||
#{prdType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
@ -154,7 +167,10 @@
|
||||
#{role,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="fake != null">
|
||||
#{fake,jdbcType=BIT},
|
||||
#{fake,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
#{endTime,jdbcType=TIMESTAMP},
|
||||
</if>
|
||||
</trim>
|
||||
</insert>
|
||||
@ -176,6 +192,9 @@
|
||||
<if test="record.mapId != null">
|
||||
map_id = #{record.mapId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="record.mapPrdId != null">
|
||||
map_prd_id = #{record.mapPrdId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="record.prdType != null">
|
||||
prd_type = #{record.prdType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
@ -186,7 +205,10 @@
|
||||
`role` = #{record.role,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.fake != null">
|
||||
fake = #{record.fake,jdbcType=BIT},
|
||||
fake = #{record.fake,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="record.endTime != null">
|
||||
end_time = #{record.endTime,jdbcType=TIMESTAMP},
|
||||
</if>
|
||||
</set>
|
||||
<if test="_parameter != null">
|
||||
@ -198,10 +220,12 @@
|
||||
set id = #{record.id,jdbcType=BIGINT},
|
||||
user_id = #{record.userId,jdbcType=BIGINT},
|
||||
map_id = #{record.mapId,jdbcType=BIGINT},
|
||||
map_prd_id = #{record.mapPrdId,jdbcType=BIGINT},
|
||||
prd_type = #{record.prdType,jdbcType=VARCHAR},
|
||||
duration = #{record.duration,jdbcType=INTEGER},
|
||||
`role` = #{record.role,jdbcType=VARCHAR},
|
||||
fake = #{record.fake,jdbcType=BIT}
|
||||
fake = #{record.fake,jdbcType=TINYINT},
|
||||
end_time = #{record.endTime,jdbcType=TIMESTAMP}
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
</if>
|
||||
@ -215,6 +239,9 @@
|
||||
<if test="mapId != null">
|
||||
map_id = #{mapId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="mapPrdId != null">
|
||||
map_prd_id = #{mapPrdId,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="prdType != null">
|
||||
prd_type = #{prdType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
@ -225,7 +252,10 @@
|
||||
`role` = #{role,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="fake != null">
|
||||
fake = #{fake,jdbcType=BIT},
|
||||
fake = #{fake,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
end_time = #{endTime,jdbcType=TIMESTAMP},
|
||||
</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
@ -234,10 +264,34 @@
|
||||
update user_simulation_stats
|
||||
set user_id = #{userId,jdbcType=BIGINT},
|
||||
map_id = #{mapId,jdbcType=BIGINT},
|
||||
map_prd_id = #{mapPrdId,jdbcType=BIGINT},
|
||||
prd_type = #{prdType,jdbcType=VARCHAR},
|
||||
duration = #{duration,jdbcType=INTEGER},
|
||||
`role` = #{role,jdbcType=VARCHAR},
|
||||
fake = #{fake,jdbcType=BIT}
|
||||
fake = #{fake,jdbcType=TINYINT},
|
||||
end_time = #{endTime,jdbcType=TIMESTAMP}
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
</update>
|
||||
|
||||
<!-- 额外添加 -->
|
||||
<select id="queryUsage" resultType="club.joylink.rtss.vo.client.org.StudentsUsageStatisticsVO">
|
||||
SELECT
|
||||
sum(duration) AS simulationDuration,
|
||||
user_id as userId
|
||||
FROM
|
||||
user_simulation_stats
|
||||
WHERE
|
||||
map_id = #{mapId}
|
||||
<if test="startTime != null">
|
||||
and end_time >= #{startTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and end_time <= #{endTime}
|
||||
</if>
|
||||
AND user_id IN
|
||||
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
|
||||
#{userId}
|
||||
</foreach>
|
||||
GROUP BY user_id;
|
||||
</select>
|
||||
</mapper>
|
Loading…
Reference in New Issue
Block a user