Commit 42067036 authored by leyboy's avatar leyboy

统计用户信息提交

parent c6939b12
......@@ -25,6 +25,9 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.2" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
<orderEntry type="library" name="Maven: com.adc:adc-da-base:2.0.0" level="project" />
<orderEntry type="library" name="Maven: com.adc:adc-da-util:2.2.41" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.20" level="project" />
......
......@@ -7,6 +7,7 @@ import com.adc.da.util.utils.CollectionUtils;
import com.adc.da.znks.entity.ResponseEntity;
import com.adc.da.znks.entity.User;
import com.adc.da.znks.service.LockRecordService;
import com.adc.da.znks.service.UserCountService;
import com.adc.da.znks.service.UserService;
import com.adc.da.znks.util.GenResponse;
import com.adc.da.znks.vo.UserCountVO;
......@@ -40,6 +41,9 @@ public class UserController extends BaseController<User> {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserCountService userCountService;
@ApiOperation(value = "|User|登录或者注册用户")
@PostMapping(value = {"/loginOrRegisterUser"})
public ResponseEntity<Boolean> loginOrRegisterUser(String phoneNumber, String password) {
......@@ -139,8 +143,9 @@ public class UserController extends BaseController<User> {
@ApiOperation(value = "|User|统计用户信息")
@PostMapping("/countUserInfo")
public ResponseEntity<UserCountVO> countUserInfo() {
return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "统计用户信息成功", userService.getUserCountVO());
public ResponseEntity<List<UserCountVO>> countUserInfo() {
return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "统计用户信息成功",
userCountService.getUserCountInfo());
}
}
......@@ -26,17 +26,17 @@ public interface PositionDao extends BaseDao<Position> {
* 获得天津每个地区的人数,每1小时统计一次
*
* @param tianJinArea 天津区域
* @param recordTime1 当前时间的前1个小时
* @param currentTime 当前时间
* @param recordTime1 时间段1
* @param recordTime2 时间段2
**/
Integer getUserCountInTianJinPerArea(@Param("area") String tianJinArea, @Param("recordTime1") String recordTime1, @Param("currentTime") String currentTime);
Integer getUserCountInTianJinPerArea(@Param("area") String tianJinArea, @Param("recordTime1") String recordTime1, @Param("recordTime2") String recordTime2);
/**
* 获得每两小时间段的人数
* 获得每时间段的人数
*
* @param recordTime1 当前时间的前1个小时
* @param currentTime 当前时间
* @param recordTime1 时间段1
* @param recordTime2 时间段2
**/
Integer getUserCountByPerHour(@Param("recordTime1") String recordTime1, @Param("currentTime") String currentTime);
Integer getUserCountByPerHour(@Param("recordTime1") String recordTime1, @Param("recordTime2") String recordTime2);
}
package com.adc.da.znks.service;
import com.adc.da.util.utils.DateUtils;
import com.adc.da.util.utils.GsonUtil;
import com.adc.da.znks.contants.ZnksConstants;
import com.adc.da.znks.dao.PositionDao;
import com.adc.da.znks.dao.UserDao;
import com.adc.da.znks.page.UserPage;
import com.adc.da.znks.util.DateTimeUtil;
import com.adc.da.znks.vo.UserCountVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeMap;
/**
* 统计用户service
**/
@Service
public class UserCountService {
@Autowired(required = false)
private UserDao userDao;
@Autowired(required = false)
private PositionDao positionDao;
private static final Logger logger = LoggerFactory.getLogger(UserCountService.class);
/**
* 统计用户VO的list
**/
private static List<UserCountVO> userCountVOS = new ArrayList<>(24);
/**
* 统计次数
**/
private static final int COUNT_SIZE = 24;
/**
* 获取用户统计信息vo list
**/
public List<UserCountVO> getUserCountInfo() {
int countSize = UserCountService.COUNT_SIZE;
for (int i = 0; i < COUNT_SIZE; i++) {
Date recordTime1 = DateUtils.addHours(DateTimeUtil.getCurrentDayStartTime(),
i);
userCountVOS.add(getUserCountInfo(recordTime1));
}
List<UserCountVO> userCountVOList = UserCountService.userCountVOS;
logger.info("userCountVoList json: {}", GsonUtil.toJson(userCountVOList));
return userCountVOList;
}
/**
* 获取用户统计信息vo
**/
private UserCountVO getUserCountInfo(Date recordTime1) {
UserCountVO userCountVO = new UserCountVO();
userCountVO.setUserCount(getUserTotal());
userCountVO.setClickRate(getClickRate());
String recordTime1Str = DateUtils.dateToString(recordTime1, "yyyy-MM-dd HH:mm:ss");
String recordTime2Str = getRecordTime2(recordTime1);
userCountVO.setDistributePosition(getUserMainPosition(recordTime1Str, recordTime2Str));
//获取每个时间段的人数
userCountVO.setPerQuantumUserCount(String.valueOf(getPerQuantumUserCount(recordTime1Str, recordTime2Str)));
logger.info("userCountVO: {}", userCountVO);
return userCountVO;
}
/**
* 获取每个时间段的人数
**/
private Integer getPerQuantumUserCount(String recordTime1, String recordTime2) {
return positionDao.getUserCountByPerHour(recordTime1, recordTime2);
}
/**
* 获取每个时间段的结束时间
**/
private String getRecordTime2(Date time1) {
return DateUtils.dateToString(DateUtils.addHours(time1, 1),
"yyyy-MM-dd HH:mm:ss");
}
/**
* 从00:00-23:59,每一个小时统计一次,获取主要分布位置信息
*
* @param recordTime1 统计起始时间
* @param recordTime2 统计结束时间
**/
private String getUserMainPosition(String recordTime1, String recordTime2) {
TreeMap<Integer, String> mainPositionMap = new TreeMap<>();
int positionAreaSize = ZnksConstants.TIANJIN_AREAS.length;
List<String> positionAreas = CollectionUtils.arrayToList(ZnksConstants.TIANJIN_AREAS);
for (int i = 0; i < positionAreaSize; i++) {
int userCount = positionDao.getUserCountInTianJinPerArea(positionAreas.get(i),
recordTime1, recordTime2);
String positionArea = positionAreas.get(i);
mainPositionMap.put(userCount, positionArea);
}
String mainPosition = mainPositionMap.lastEntry().getValue();
logger.info("mainPositionMap json: {}", GsonUtil.toJson(mainPositionMap));
logger.info("main position: {},user count: {}", mainPositionMap.lastEntry().getValue(),
mainPositionMap.lastEntry().getKey());
return mainPosition;
}
/**
* 获得软件总人数
**/
private int getUserTotal() {
UserPage page = new UserPage();
int userCount = userDao.queryByCount(page);
return userCount;
}
/**
* 获取每天客户使用软件的点击率
**/
private String getClickRate() {
int currentDayPositionUserCount = positionDao.getCurrentDayUsers(new Date(System.currentTimeMillis()));
double userCount = Double.parseDouble(String.valueOf(currentDayPositionUserCount));
double userTotal = Double.parseDouble(String.valueOf(getUserTotal()));
double clickRate = userCount / userTotal;
String clickRateStr = String.valueOf(clickRate);
clickRateStr = clickRateStr.substring(0, 5);
logger.info("clickRate: {}", Double.parseDouble(clickRateStr));
return clickRateStr;
}
}
......@@ -195,15 +195,4 @@ public class UserService extends BaseService<User, String> {
return false;
}
public UserCountVO getUserCountVO() {
UserPage userPage = new UserPage();
int userCount = dao.queryByCount(userPage);
UserCountVO userCountVO = new UserCountVO();
userCountVO.setUserCount(userCount);
double clickRate = positionDao.getCurrentDayUsers(new Date(System.currentTimeMillis())) / userCount;
userCountVO.setClickRate(clickRate);
userCountVO.setDistributeVOS(ZnksTaskService.getDistributeVOS());
return userCountVO;
}
}
package com.adc.da.znks.service;
import com.adc.da.znks.contants.ZnksConstants;
import com.adc.da.znks.dao.PositionDao;
import com.adc.da.znks.util.DateTimeUtil;
import com.adc.da.znks.vo.MainDistributeVO;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
@Component
public class ZnksTaskService {
private static final Logger logger = LoggerFactory.getLogger(ZnksTaskService.class);
private static List<MainDistributeVO> distributeVOS = new ArrayList<>();
private static final String DEFAULT_MAX_COUNT_TIANJIN_AREA = "西青区";
private static final String DEFAULT_MAX_TIME_QUANTUM = "10:00-11:00";
@Autowired
private PositionDao positionDao;
/**
* 定时统计主要分布问题
**/
@Scheduled(cron = "* * */1 * * *")
public void scheduleMainDistribute() {
//选择当天的所有位置记录
List<String> tianJinAreas = CollectionUtils.arrayToList(ZnksConstants.TIANJIN_AREAS);
TreeMap<Integer, String> tianJinPerAreaUserMap = new TreeMap<>();
Date currentTime = new Date(System.currentTimeMillis());
String currentTimeStr = com.adc.da.util.utils.DateUtils.dateToString(currentTime,
"yyyy-MM-dd HH:mm:ss");
Date recordTime1 = DateUtils.addHours(new Date(System.currentTimeMillis()), -1);
String recordTime1Str = com.adc.da.util.utils.DateUtils.dateToString(recordTime1,
"yyyy-MM-dd HH:mm:ss");
for (String tianJinSArea : tianJinAreas) {
tianJinPerAreaUserMap.put(positionDao.getUserCountInTianJinPerArea(tianJinSArea, recordTime1Str, currentTimeStr), tianJinSArea);
}
String maxUserCountTianJinArea = null;
if (tianJinPerAreaUserMap.lastEntry().getKey() == 0) {
maxUserCountTianJinArea = ZnksTaskService.DEFAULT_MAX_COUNT_TIANJIN_AREA;
} else {
maxUserCountTianJinArea = tianJinPerAreaUserMap.lastEntry().getValue();
}
logger.info("tianJinPerAreaUserMap: {}", tianJinPerAreaUserMap);
TreeMap<Integer, String> mainUserDistributeTime = new TreeMap<>();
Date currentDayEndTime = DateTimeUtil.getCurrentDayEndTime();
long currentTimeLong = currentTime.getTime();
long currentDayEndTimeLong = currentDayEndTime.getTime();
if (currentTimeLong <= currentDayEndTimeLong) {
int hours = (int) DateTimeUtil.getHoursFromCurrentDayStartTime(currentTime);
for (int i = 0; i < hours; i++) {
String timeQuantum = com.adc.da.util.utils.DateUtils.dateToString(recordTime1,
"HH:mm") + "-" + com.adc.da.util.utils.DateUtils.dateToString(currentTime,
"HH:mm"); //获取前一个小时到当前时间的时间段
logger.info("timeQuantum: {}", timeQuantum);
mainUserDistributeTime.put(positionDao.getUserCountByPerHour(recordTime1Str, currentTimeStr), timeQuantum);
}
}
String mainUserTimeQuantum = null;
if (mainUserDistributeTime.lastEntry().getKey() == 0) {
mainUserTimeQuantum = ZnksTaskService.DEFAULT_MAX_TIME_QUANTUM;
} else {
mainUserTimeQuantum = mainUserDistributeTime.lastEntry().getValue();
}
MainDistributeVO mainDistributeVO = new MainDistributeVO();
mainDistributeVO.setMainDistributePosition(maxUserCountTianJinArea);
mainDistributeVO.setMainDistributeTime(mainUserTimeQuantum);
distributeVOS.add(mainDistributeVO);
logger.info("distributeVOS: {}", distributeVOS);
logger.info("maxUserCountTianJinArea: {},userCount: {}", maxUserCountTianJinArea);
logger.info("mainUserDistributeTime: {}", mainUserDistributeTime);
}
public static List<MainDistributeVO> getDistributeVOS() {
return distributeVOS;
}
}
package com.adc.da.znks.vo;
public class MainDistributeVO {
/**
* 主要分布时间
**/
private String mainDistributeTime;
/**
* 主要分布式人数
**/
private String mainDistributePosition;
public MainDistributeVO(String mainDistributeTime, String mainDistributePosition) {
this.mainDistributeTime = mainDistributeTime;
this.mainDistributePosition = mainDistributePosition;
}
public MainDistributeVO() {
}
public String getMainDistributeTime() {
return mainDistributeTime;
}
public void setMainDistributeTime(String mainDistributeTime) {
this.mainDistributeTime = mainDistributeTime;
}
public String getMainDistributePosition() {
return mainDistributePosition;
}
public void setMainDistributePosition(String mainDistributePosition) {
this.mainDistributePosition = mainDistributePosition;
}
@Override
public String toString() {
return "MainDistributeVO{" +
"mainDistributeTime='" + mainDistributeTime + '\'' +
", mainDistributePosition='" + mainDistributePosition + '\'' +
'}';
}
}
......@@ -15,34 +15,61 @@ public class UserCountVO {
/**
* 点击率
*/
private Double clickRate;
private String clickRate;
/**
* 分布时间段
**/
private String perQuantumUserCount;
/**
* 主要分布地区和时间
* 分布人数
**/
List<MainDistributeVO> distributeVOS;
private String distributePosition;
public Double getClickRate() {
public Integer getUserCount() {
return userCount;
}
public void setUserCount(Integer userCount) {
this.userCount = userCount;
}
public String getClickRate() {
return clickRate;
}
public void setClickRate(Double clickRate) {
public void setClickRate(String clickRate) {
this.clickRate = clickRate;
}
public List<MainDistributeVO> getDistributeVOS() {
return distributeVOS;
public String getDistributePosition() {
return distributePosition;
}
public void setDistributeVOS(List<MainDistributeVO> distributeVOS) {
this.distributeVOS = distributeVOS;
public void setDistributePosition(String distributePosition) {
this.distributePosition = distributePosition;
}
public Integer getUserCount() {
return userCount;
public String getPerQuantumUserCount() {
return perQuantumUserCount;
}
public void setUserCount(Integer userCount) {
this.userCount = userCount;
public void setPerQuantumUserCount(String perQuantumUserCount) {
this.perQuantumUserCount = perQuantumUserCount;
}
@Override
public String toString() {
return "UserCountVO{" +
"userCount=" + userCount +
", clickRate=" + clickRate +
", perQuantumUserCount='" + perQuantumUserCount + '\'' +
", distributePosition='" + distributePosition + '\'' +
'}';
}
}
#Development System
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#数据库服务器外网ip221.239.111.146 内网10.10.0.3
#智能定损数据库(测试数据库)
spring.datasource.url = jdbc:mysql://106.2.13.200:3306/smarthome
#spring.datasource.driverClassName = com.mysql.jdbc.Driver
##数据库服务器外网ip221.239.111.146 内网10.10.0.3
##智能定损数据库(测试数据库)
#spring.datasource.url = jdbc:mysql://106.2.13.200:3306/smarthome
#spring.datasource.username = root
spring.datasource.url = jdbc:mysql://47.92.206.131:3306/smarthome
spring.datasource.username = root
spring.datasource.password = root
#spring.datasource.password = root
#spring.datasource.driverClassName = com.mysql.jdbc.Driver
......
......@@ -181,13 +181,13 @@ SELECT SEQ_tb_position.NEXTVAL FROM DUAL
<select id="getUserCountInTianJinPerArea" resultType="java.lang.Integer" parameterType="string">
SELECT COUNT(user_id) AS CURRENT_USER_COUNT
FROM tb_position
WHERE position_name LIKE #{area} AND record_time>=#{recordTime1} AND record_time &lt;= #{currentTime}
WHERE position_name LIKE #{area} AND record_time>=#{recordTime1} AND record_time &lt;= #{recordTime2}
</select>
<select id="getUserCountByPerHour" resultType="java.lang.Integer" parameterType="string">
SELECT COUNT(user_id) AS CURRENT_USER_COUNT
FROM tb_position
WHERE record_time>=#{recordTime1} AND record_time &lt;= #{currentTime}
WHERE record_time>=#{recordTime1} AND record_time &lt;= #{recordTime2}
</select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment