Commit 8f85105e authored by 廖旭伟's avatar 廖旭伟

天府通办应用访问量埋点

parent 88d48877
......@@ -4,6 +4,7 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ITask;
import com.mortals.framework.service.ITaskExcuteService;
import com.mortals.xhx.feign.site.ISiteFeign;
import com.mortals.xhx.module.converge.service.ConvergeAppsService;
import com.mortals.xhx.module.converge.service.ConvergeDeviceService;
import com.mortals.xhx.module.converge.service.ConvergeSiteService;
import lombok.extern.slf4j.Slf4j;
......@@ -21,16 +22,29 @@ public class ProvinceConvergeTaskImpl implements ITaskExcuteService {
private ConvergeSiteService convergeSiteService;
@Autowired
private ConvergeDeviceService convergeDeviceService;
@Autowired
private ConvergeAppsService convergeAppsService;
@Override
public void excuteTask(ITask task) throws AppException {
log.info("开始执行省平台数据汇聚任务...");
try {
convergeSiteService.doConvergeSite();
}catch (Exception e){
log.error("汇聚网点数据执行出错",e);
}
try {
convergeDeviceService.doConvergeDevice();
}catch (Exception e){
log.error("数据汇聚任务执行出错",e);
log.error("汇聚设备数据出错",e);
}
try {
convergeAppsService.doConvergeApps();
}catch (Exception e){
log.error("汇聚应用数据出错",e);
}
log.info("省平台数据汇聚任务执行完成");
}
......
package com.mortals.xhx.module.converge.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import com.mortals.xhx.module.converge.model.vo.AppsAccessVo;
import java.util.List;
/**
* 应用访问Dao
* 应用访问 DAO接口
*
* @author zxfei
* @date 2023-07-03
*/
public interface ConvergeAppsAccessDao extends ICRUDDao<ConvergeAppsAccessEntity,Long>{
/**
* 应用浏览量PV统计
* @return
*/
List<AppsAccessVo> getAppsAccessPv();
/**
* 应用浏览量UV统计
* @return
*/
List<AppsAccessVo> getAppsAccessUv();
}
package com.mortals.xhx.module.converge.dao.ibatis;
import com.mortals.xhx.module.converge.model.vo.AppsAccessVo;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.converge.dao.ConvergeAppsAccessDao;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 应用访问DaoImpl DAO接口
*
* @author zxfei
* @date 2023-07-03
*/
@Repository("convergeAppsAccessDao")
public class ConvergeAppsAccessDaoImpl extends BaseCRUDDaoMybatis<ConvergeAppsAccessEntity,Long> implements ConvergeAppsAccessDao {
@Override
public List<AppsAccessVo> getAppsAccessPv() {
return this.getSqlSession().selectList(this.getSqlId("getAppsAccessPv"));
}
@Override
public List<AppsAccessVo> getAppsAccessUv() {
return this.getSqlSession().selectList(this.getSqlId("getAppsAccessUv"));
}
}
package com.mortals.xhx.module.converge.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.converge.model.vo.ConvergeAppsAccessVo;
import lombok.Data;
/**
* 应用访问实体对象
*
* @author zxfei
* @date 2023-07-04
*/
@Data
public class ConvergeAppsAccessEntity extends ConvergeAppsAccessVo {
private static final long serialVersionUID = 1L;
/**
* 站点id
*/
private Long siteId;
/**
* 应用ID
*/
private String applicationId;
/**
* 应用名称
*/
private String applicationName;
/**
* 应用打开时间
*/
private Date startTime;
/**
* 应用关闭时间
*/
private Date endTime;
/**
* 用户ID
*/
private String userId;
/**
* 用户名称
*/
private String userName;
/**
* 渠道ID
*/
private String channelId;
/**
* 渠道名称
*/
private String channelName;
/**
* 地域
*/
private String location;
/**
* 客户端名称
*/
private String clientName;
/**
* 客户端版本号
*/
private String version;
/**
* 设备唯一标识
*/
private String ecode;
/**
* 应用简称
*/
private String appSimpleName;
/**
* 应用提供方
*/
private String provider;
/**
* 应用来源
*/
private String origin;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof ConvergeAppsAccessEntity) {
ConvergeAppsAccessEntity tmp = (ConvergeAppsAccessEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.siteId = -1L;
this.applicationId = "";
this.applicationName = "";
this.startTime = null;
this.endTime = null;
this.userId = "";
this.userName = "";
this.channelId = "";
this.channelName = "";
this.location = "";
this.clientName = "";
this.version = "";
this.ecode = "";
this.appSimpleName = "";
this.provider = "";
this.origin = "";
}
}
\ No newline at end of file
package com.mortals.xhx.module.converge.model.vo;
import lombok.Data;
@Data
public class AppsAccessVo {
/**
* 站点id
*/
private Long siteId;
/**
* 设备ID
*/
private String equipmentId;
/**
* 应用标识,具有唯一性
*/
private String appEname;
/**
* 应用名称
*/
private String appName;
/**
* 应用简称
*/
private String appSimpleName;
/**
* 应用提供方
*/
private String provider;
/**
* 应用来源
*/
private String origin;
/**
* 应用访问数
*/
private Integer pv;
/**
* 应用访客数
*/
private Integer uv;
}
package com.mortals.xhx.module.converge.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal;
import java.util.Date;
/**
* 应用访问视图对象
*
* @author zxfei
* @date 2023-07-03
*/
@Data
public class ConvergeAppsAccessVo extends BaseEntityLong {
}
\ No newline at end of file
package com.mortals.xhx.module.converge.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import com.mortals.xhx.module.converge.dao.ConvergeAppsAccessDao;
import com.mortals.xhx.module.converge.model.vo.AppsAccessVo;
import java.util.List;
/**
* ConvergeAppsAccessService
*
* 应用访问 service接口
*
* @author zxfei
* @date 2023-07-03
*/
public interface ConvergeAppsAccessService extends ICRUDService<ConvergeAppsAccessEntity,Long>{
ConvergeAppsAccessDao getDao();
/**
* 应用浏览量PV统计
* @return
*/
List<AppsAccessVo> getAppsAccessPv() throws AppException;
/**
* 应用浏览量UV统计
* @return
*/
List<AppsAccessVo> getAppsAccessUv() throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.converge.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.converge.model.ConvergeAppsEntity;
import com.mortals.xhx.module.converge.dao.ConvergeAppsDao;
......@@ -13,4 +14,10 @@ import com.mortals.xhx.module.converge.dao.ConvergeAppsDao;
public interface ConvergeAppsService extends ICRUDService<ConvergeAppsEntity,Long>{
ConvergeAppsDao getDao();
/**
* 天府通办数据汇聚
* @throws AppException
*/
void doConvergeApps() throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.converge.service.impl;
import com.mortals.xhx.module.converge.model.vo.AppsAccessVo;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.converge.dao.ConvergeAppsAccessDao;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import com.mortals.xhx.module.converge.service.ConvergeAppsAccessService;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
/**
* ConvergeAppsAccessService
* 应用访问 service实现
*
* @author zxfei
* @date 2023-07-03
*/
@Service("convergeAppsAccessService")
@Slf4j
public class ConvergeAppsAccessServiceImpl extends AbstractCRUDServiceImpl<ConvergeAppsAccessDao, ConvergeAppsAccessEntity, Long> implements ConvergeAppsAccessService {
@Override
public List<AppsAccessVo> getAppsAccessPv() throws AppException {
return dao.getAppsAccessPv();
}
@Override
public List<AppsAccessVo> getAppsAccessUv() throws AppException {
return dao.getAppsAccessUv();
}
}
\ No newline at end of file
package com.mortals.xhx.module.converge.service.impl;
import com.mortals.xhx.module.converge.model.ConvergeAppsQuery;
import com.mortals.xhx.module.converge.model.ConvergeDeviceEntity;
import com.mortals.xhx.module.converge.model.ConvergeDeviceQuery;
import com.mortals.xhx.module.converge.model.vo.AppsAccessVo;
import com.mortals.xhx.module.converge.service.ConvergeAppsAccessService;
import com.mortals.xhx.module.converge.service.ConvergeDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -7,6 +14,13 @@ import com.mortals.xhx.module.converge.dao.ConvergeAppsDao;
import com.mortals.xhx.module.converge.model.ConvergeAppsEntity;
import com.mortals.xhx.module.converge.service.ConvergeAppsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* ConvergeAppsService
* 设备应用 service实现
......@@ -17,5 +31,68 @@ import lombok.extern.slf4j.Slf4j;
@Service("convergeAppsService")
@Slf4j
public class ConvergeAppsServiceImpl extends AbstractCRUDServiceImpl<ConvergeAppsDao, ConvergeAppsEntity, Long> implements ConvergeAppsService {
@Autowired
private ConvergeAppsAccessService convergeAppsAccessService;
@Autowired
private ConvergeDeviceService convergeDeviceService;
@Override
public void doConvergeApps() throws AppException {
List<AppsAccessVo> accessPvList = convergeAppsAccessService.getAppsAccessPv();
List<AppsAccessVo> accessUvList = convergeAppsAccessService.getAppsAccessUv();
if(CollectionUtils.isEmpty(accessPvList)||CollectionUtils.isEmpty(accessUvList)){
return;
}else {
Map<String,AppsAccessVo> uvMap = new HashMap<>();
for (AppsAccessVo vo:accessUvList){
String key = vo.getSiteId()+"_"+vo.getEquipmentId()+"_"+vo.getAppEname();
uvMap.put(key,vo);
}
List<ConvergeAppsEntity> appsList = new ArrayList<>();
Map<String, ConvergeDeviceEntity> deviceMap = new HashMap<>();
for(AppsAccessVo item:accessPvList){
ConvergeAppsEntity entity = new ConvergeAppsEntity();
if(deviceMap.containsKey(item.getEquipmentId())){
entity.setEquipmentId(deviceMap.get(item.getEquipmentId()).getId());
}else {
ConvergeDeviceEntity deviceEntity = convergeDeviceService.selectOne(new ConvergeDeviceQuery().logo(item.getEquipmentId()));
if(deviceEntity!=null){
deviceMap.put(item.getEquipmentId(),deviceEntity);
entity.setEquipmentId(deviceEntity.getId());
}else {
entity.setEquipmentId(-1l);
}
}
entity.setAppEname(item.getAppEname());
entity.setAppName(item.getAppName());
entity.setAppSimpleName(item.getAppSimpleName());
entity.setProvider(item.getProvider());
entity.setOrigin(item.getOrigin());
entity.setSiteId(item.getSiteId());
entity.setPv(item.getPv());
String key = item.getSiteId()+"_"+item.getEquipmentId()+"_"+item.getAppEname();
if(uvMap.containsKey(key)) {
entity.setUv(uvMap.get(key).getUv());
}
appsList.add(entity);
}
for(ConvergeAppsEntity item:appsList){
ConvergeAppsEntity temp = this.selectOne(new ConvergeAppsQuery().appEname(item.getAppEname()).equipmentId(item.getEquipmentId()).siteId(item.getSiteId()));
if(temp!=null){
item.setId(temp.getId());
if(temp.getPv()==item.getPv()&&temp.getUv()==item.getUv()){
item.setOpr("P");
}else {
item.setOpr("U");
}
this.update(item);
}else {
item.setOpr("A");
this.save(item);
}
}
}
}
}
\ No newline at end of file
......@@ -6,11 +6,11 @@ import com.mortals.xhx.common.pdu.site.SitePdu;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.feign.device.IDeviceFeign;
import com.mortals.xhx.feign.site.ISiteFeign;
import com.mortals.xhx.module.converge.model.ConvergeDeviceEntity;
import com.mortals.xhx.module.converge.model.ConvergeDeviceQuery;
import com.mortals.xhx.module.converge.model.ConvergeSiteQuery;
import com.mortals.xhx.module.converge.model.*;
import com.mortals.xhx.module.converge.model.vo.AppVO;
import com.mortals.xhx.module.converge.model.vo.BranchVO;
import com.mortals.xhx.module.converge.model.vo.EquipmentVO;
import com.mortals.xhx.module.converge.service.ConvergeAppsService;
import com.mortals.xhx.module.converge.service.ConvergeDeviceService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
......@@ -20,7 +20,6 @@ import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.converge.dao.ConvergeSiteDao;
import com.mortals.xhx.module.converge.model.ConvergeSiteEntity;
import com.mortals.xhx.module.converge.service.ConvergeSiteService;
import lombok.extern.slf4j.Slf4j;
......@@ -45,6 +44,8 @@ public class ConvergeSiteServiceImpl extends AbstractCRUDServiceImpl<ConvergeSit
private ISiteFeign siteFeign;
@Autowired
private ConvergeDeviceService convergeDeviceService;
@Autowired
private ConvergeAppsService convergeAppsService;
@Override
public List<BranchVO> getConvergeData() throws AppException {
......@@ -60,7 +61,8 @@ public class ConvergeSiteServiceImpl extends AbstractCRUDServiceImpl<ConvergeSit
for (ConvergeDeviceEntity deviceEntity:deviceEntityList){
EquipmentVO equipmentVO = new EquipmentVO();
BeanUtils.copyProperties(deviceEntity,equipmentVO,BeanUtil.getNullPropertyNames(deviceEntity));
equipmentVO.setAppStats(Collections.emptyList());
List<ConvergeAppsEntity> apps = convergeAppsService.find(new ConvergeAppsQuery().siteId(deviceEntity.getSiteId()).equipmentId(deviceEntity.getId()));
equipmentVO.setAppStats(convertAppVO(apps));
equipments.add(equipmentVO);
}
branchVO.setEquipments(equipments);
......@@ -137,4 +139,18 @@ public class ConvergeSiteServiceImpl extends AbstractCRUDServiceImpl<ConvergeSit
}
return true;
}
private List<AppVO> convertAppVO(List<ConvergeAppsEntity> apps){
if(CollectionUtils.isEmpty(apps)){
return Collections.emptyList();
}else {
List<AppVO> voList = new ArrayList<>();
for (ConvergeAppsEntity item:apps){
AppVO vo = new AppVO();
BeanUtils.copyProperties(item,vo,BeanUtil.getNullPropertyNames(item));
voList.add(vo);
}
return voList;
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.converge.web;
import com.mortals.framework.annotation.RepeatSubmit;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.model.BaseEntity;
import com.mortals.framework.service.IUser;
import com.mortals.framework.utils.BeanUtil;
import com.mortals.framework.utils.ReflectUtils;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.model.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.converge.model.ConvergeAppsAccessEntity;
import com.mortals.xhx.module.converge.service.ConvergeAppsAccessService;
import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*;
/**
*
* 应用访问
*
* @author zxfei
* @date 2023-07-03
*/
@RestController
@RequestMapping("converge/apps/access")
public class ConvergeAppsAccessController extends BaseCRUDJsonBodyMappingController<ConvergeAppsAccessService,ConvergeAppsAccessEntity,Long> {
@Autowired
private ParamService paramService;
public ConvergeAppsAccessController(){
super.setModuleDesc( "应用访问");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
@Override
@PostMapping({"save"})
@UnAuth
public String save(@RequestBody ConvergeAppsAccessEntity entity) {
Map<String, Object> model = new HashMap();
Context context = this.getContext();
int code = 1;
String busiDesc = "保存" + this.getModuleDesc();
try {
this.saveBefore(entity, model, context);
if (entity.newEntity()) {
Class<ConvergeAppsAccessEntity> tClass = ReflectUtils.getClassGenricType(this.getClass(), 1);
ConvergeAppsAccessEntity initEntity = (ConvergeAppsAccessEntity)tClass.newInstance();
initEntity.initAttrValue();
BeanUtils.copyProperties(entity, initEntity, BeanUtil.getNullPropertyNames(entity));
entity = initEntity;
busiDesc = "新增" + this.getModuleDesc();
initEntity.setCreateTime(new Date());
IUser user = this.getCurUser();
if (user != null) {
initEntity.setCreateUserId(user.getId());
initEntity.setCreateUser(user.getLoginName());
initEntity.setCreateUserName(user.getRealName());
initEntity.setCreateUserDeptId(user.getDeptId());
initEntity.setCreateUserDeptName(user.getDeptName());
}
this.service.save(initEntity, context);
} else {
busiDesc = "修改" + this.getModuleDesc();
entity.setUpdateTime(new Date());
IUser user = this.getCurUser();
if (user != null) {
entity.setUpdateUserId(user.getId());
entity.setUpdateUser(user.getLoginName());
entity.setUpdateUserName(user.getRealName());
entity.setUpdateUserDeptId(user.getDeptId());
entity.setUpdateUserDeptName(user.getDeptName());
}
this.service.update(entity, context);
}
model.put("id", entity.getId());
code = this.saveAfter(entity, model, context);
model.put("entity", entity);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】 [id:" + entity.getId() + "]");
} catch (Exception var9) {
this.doException(this.request, busiDesc, model, var9);
model.put("entity", entity);
this.init(model, context);
code = this.saveException(entity, model, context, var9);
}
this.init(model, context);
JSONObject ret = new JSONObject();
ret.put("code", code);
ret.put("msg", model.remove("message_info"));
ret.put("data", model);
return ret.toJSONString();
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.converge.dao.ibatis.ConvergeAppsAccessDaoImpl">
<!-- 页面浏览量PV统计 -->
<select id="getAppsAccessPv" resultType="com.mortals.xhx.module.converge.model.vo.AppsAccessVo">
SELECT
siteId,
ecode as equipmentId,
applicationId as appEname,
appSimpleName,
provider,
origin,
count(1) as pv
FROM
mortals_xhx_converge_apps_access
GROUP BY
siteId,
applicationId,
ecode
</select>
<!-- 页面浏览量UV统计 -->
<select id="getAppsAccessUv" resultType="com.mortals.xhx.module.converge.model.vo.AppsAccessVo">
SELECT
siteId,
ecode AS equipmentId,
applicationId AS appEname,
appSimpleName,
provider,
origin,
count(1) AS uv
FROM
(
SELECT
siteId,
ecode,
applicationId,
appSimpleName,
provider,
origin,
count(1),
DATE_FORMAT(startTime,'%Y-%m-%d') AS accessTime
FROM
mortals_xhx_converge_apps_access
GROUP BY
siteId,
applicationId,
ecode,
DATE_FORMAT(startTime,'%Y-%m-%d')
) AS a
GROUP BY
siteId,
applicationId,
ecode
</select>
</mapper>
\ No newline at end of file
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