Commit 42067036 authored by leyboy's avatar leyboy

统计用户信息提交

parent c6939b12
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <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-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: com.adc:adc-da-util:2.2.41" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.20" 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; ...@@ -7,6 +7,7 @@ import com.adc.da.util.utils.CollectionUtils;
import com.adc.da.znks.entity.ResponseEntity; import com.adc.da.znks.entity.ResponseEntity;
import com.adc.da.znks.entity.User; import com.adc.da.znks.entity.User;
import com.adc.da.znks.service.LockRecordService; 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.service.UserService;
import com.adc.da.znks.util.GenResponse; import com.adc.da.znks.util.GenResponse;
import com.adc.da.znks.vo.UserCountVO; import com.adc.da.znks.vo.UserCountVO;
...@@ -40,6 +41,9 @@ public class UserController extends BaseController<User> { ...@@ -40,6 +41,9 @@ public class UserController extends BaseController<User> {
private static final Logger log = LoggerFactory.getLogger(UserController.class); private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserCountService userCountService;
@ApiOperation(value = "|User|登录或者注册用户") @ApiOperation(value = "|User|登录或者注册用户")
@PostMapping(value = {"/loginOrRegisterUser"}) @PostMapping(value = {"/loginOrRegisterUser"})
public ResponseEntity<Boolean> loginOrRegisterUser(String phoneNumber, String password) { public ResponseEntity<Boolean> loginOrRegisterUser(String phoneNumber, String password) {
...@@ -139,8 +143,9 @@ public class UserController extends BaseController<User> { ...@@ -139,8 +143,9 @@ public class UserController extends BaseController<User> {
@ApiOperation(value = "|User|统计用户信息") @ApiOperation(value = "|User|统计用户信息")
@PostMapping("/countUserInfo") @PostMapping("/countUserInfo")
public ResponseEntity<UserCountVO> countUserInfo() { public ResponseEntity<List<UserCountVO>> countUserInfo() {
return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "统计用户信息成功", userService.getUserCountVO()); return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "统计用户信息成功",
userCountService.getUserCountInfo());
} }
} }
...@@ -26,17 +26,17 @@ public interface PositionDao extends BaseDao<Position> { ...@@ -26,17 +26,17 @@ public interface PositionDao extends BaseDao<Position> {
* 获得天津每个地区的人数,每1小时统计一次 * 获得天津每个地区的人数,每1小时统计一次
* *
* @param tianJinArea 天津区域 * @param tianJinArea 天津区域
* @param recordTime1 当前时间的前1个小时 * @param recordTime1 时间段1
* @param currentTime 当前时间 * @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 recordTime1 时间段1
* @param currentTime 当前时间 * @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> { ...@@ -195,15 +195,4 @@ public class UserService extends BaseService<User, String> {
return false; 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 { ...@@ -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; return clickRate;
} }
public void setClickRate(Double clickRate) { public void setClickRate(String clickRate) {
this.clickRate = clickRate; this.clickRate = clickRate;
} }
public List<MainDistributeVO> getDistributeVOS() { public String getDistributePosition() {
return distributeVOS; return distributePosition;
} }
public void setDistributeVOS(List<MainDistributeVO> distributeVOS) { public void setDistributePosition(String distributePosition) {
this.distributeVOS = distributeVOS; this.distributePosition = distributePosition;
} }
public Integer getUserCount() { public String getPerQuantumUserCount() {
return userCount; return perQuantumUserCount;
} }
public void setUserCount(Integer userCount) { public void setPerQuantumUserCount(String perQuantumUserCount) {
this.userCount = userCount; this.perQuantumUserCount = perQuantumUserCount;
}
@Override
public String toString() {
return "UserCountVO{" +
"userCount=" + userCount +
", clickRate=" + clickRate +
", perQuantumUserCount='" + perQuantumUserCount + '\'' +
", distributePosition='" + distributePosition + '\'' +
'}';
} }
} }
#Development System #Development System
spring.datasource.driverClassName = com.mysql.jdbc.Driver #spring.datasource.driverClassName = com.mysql.jdbc.Driver
#数据库服务器外网ip221.239.111.146 内网10.10.0.3 ##数据库服务器外网ip221.239.111.146 内网10.10.0.3
#智能定损数据库(测试数据库) ##智能定损数据库(测试数据库)
spring.datasource.url = jdbc:mysql://106.2.13.200:3306/smarthome #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.username = root
spring.datasource.password = root
#spring.datasource.password = root #spring.datasource.password = root
#spring.datasource.driverClassName = com.mysql.jdbc.Driver #spring.datasource.driverClassName = com.mysql.jdbc.Driver
......
...@@ -181,13 +181,13 @@ SELECT SEQ_tb_position.NEXTVAL FROM DUAL ...@@ -181,13 +181,13 @@ SELECT SEQ_tb_position.NEXTVAL FROM DUAL
<select id="getUserCountInTianJinPerArea" resultType="java.lang.Integer" parameterType="string"> <select id="getUserCountInTianJinPerArea" resultType="java.lang.Integer" parameterType="string">
SELECT COUNT(user_id) AS CURRENT_USER_COUNT SELECT COUNT(user_id) AS CURRENT_USER_COUNT
FROM tb_position 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>
<select id="getUserCountByPerHour" resultType="java.lang.Integer" parameterType="string"> <select id="getUserCountByPerHour" resultType="java.lang.Integer" parameterType="string">
SELECT COUNT(user_id) AS CURRENT_USER_COUNT SELECT COUNT(user_id) AS CURRENT_USER_COUNT
FROM tb_position FROM tb_position
WHERE record_time>=#{recordTime1} AND record_time &lt;= #{currentTime} WHERE record_time>=#{recordTime1} AND record_time &lt;= #{recordTime2}
</select> </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