Commit b13740b4 authored by 廖旭伟's avatar 廖旭伟

事件分析、产品热力图、页面访问分析、页面路径分析统计功能

parent a172b5ad
-- ----------------------------
-- 页面事件记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_event`;
CREATE TABLE mortals_xhx_page_event(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`businessCode` varchar(256) COMMENT '业务场景编码',
`businessName` varchar(256) COMMENT '业务场景名称',
`eventCode` varchar(256) COMMENT '事件编码',
`eventName` varchar(256) COMMENT '事件名称',
`takeTime` int(8) COMMENT '事件耗时(单位毫秒)',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`coordinate` varchar(128) COMMENT '事件坐标(x,y)',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='页面事件记录';
-- ----------------------------
-- 页面路径记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_route`;
CREATE TABLE mortals_xhx_page_route(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`sourceCode` varchar(256) COMMENT '开始页面编码(路由)',
`sourceName` varchar(256) COMMENT '开始页面名称',
`targetCode` varchar(256) COMMENT '目标页面编码(路由)',
`targetName` varchar(256) COMMENT '目标页面名称',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='页面路径记录';
-- ----------------------------
-- 产品页面配置表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_info`;
CREATE TABLE mortals_xhx_page_info(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`screenUrl` varchar(256) COMMENT '页面截图地址',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面配置';
-- ----------------------------
-- 产品页面访问记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_access`;
CREATE TABLE mortals_xhx_page_access(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`firstCode` varchar(256) COMMENT '页面编码(页面路由)',
`firstName` varchar(256) COMMENT '页面名称',
`secondCode` varchar(256) COMMENT '页面编码(页面路由)',
`secondName` varchar(256) COMMENT '页面名称',
`thirdCode` varchar(256) COMMENT '页面编码(页面路由)',
`thirdName` varchar(256) COMMENT '页面名称',
`fourthCode` varchar(256) COMMENT '页面编码(页面路由)',
`fourthName` varchar(256) COMMENT '页面名称',
`accessContent` text COMMENT '完整路径',
`pageDepth` int(8) DEFAULT '0' COMMENT '页面深度',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面访问记录';
-- ----------------------------
-- 产品页面配置表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_page_access_depth`;
CREATE TABLE mortals_xhx_page_access_depth(
`id` bigint(20) AUTO_INCREMENT COMMENT '序号,主键,自增长',
`deviceNum` varchar(256) COMMENT '设备编码',
`productId` bigint(20) COMMENT '产品id',
`productName` varchar(256) COMMENT '产品名称',
`pageCode` varchar(256) COMMENT '页面编码(页面路由)',
`pageName` varchar(256) COMMENT '页面名称',
`depthValue` int(8) COMMENT '本次访问深度',
`createUserId` bigint(20) COMMENT '创建用户',
`createTime` datetime COMMENT '创建时间',
`updateUserId` bigint(20) COMMENT '更新用户',
`updateTime` datetime COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品页面配置';
This diff is collapsed.
...@@ -2,6 +2,9 @@ package com.mortals.xhx.module.page.dao; ...@@ -2,6 +2,9 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao; import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity; import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import java.util.List; import java.util.List;
/** /**
* 产品页面配置Dao * 产品页面配置Dao
...@@ -13,5 +16,10 @@ import java.util.List; ...@@ -13,5 +16,10 @@ import java.util.List;
public interface PageAccessDepthDao extends ICRUDDao<PageAccessDepthEntity,Long>{ public interface PageAccessDepthDao extends ICRUDDao<PageAccessDepthEntity,Long>{
/**
* 人均访问深度
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getDepthAvg(PageCensusPdu pdu);
} }
...@@ -2,6 +2,11 @@ package com.mortals.xhx.module.page.dao; ...@@ -2,6 +2,11 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao; import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageEventEntity; import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import java.util.List; import java.util.List;
/** /**
* 页面事件记录Dao * 页面事件记录Dao
...@@ -13,5 +18,31 @@ import java.util.List; ...@@ -13,5 +18,31 @@ import java.util.List;
public interface PageEventDao extends ICRUDDao<PageEventEntity,Long>{ public interface PageEventDao extends ICRUDDao<PageEventEntity,Long>{
/**
* 事件分析
* @param pdu
* @return
*/
List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu);
/**
* 产品热力图
* @param pdu
* @return
*/
List<ProductHotCensusVo> getProductHotCensus(PageCensusPdu pdu);
/**
* 页面访问指标趋势
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getPageAccessTrend(PageCensusPdu pdu);
/**
* 页面访问次数TOP10
* @param pdu
* @return
*/
List<AccessTrendCensusVo> getPageAccessTop(PageCensusPdu pdu);
} }
...@@ -2,7 +2,12 @@ package com.mortals.xhx.module.page.dao; ...@@ -2,7 +2,12 @@ package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao; import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageRouteEntity; import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 页面路径记录Dao * 页面路径记录Dao
* 页面路径记录 DAO接口 * 页面路径记录 DAO接口
...@@ -13,5 +18,17 @@ import java.util.List; ...@@ -13,5 +18,17 @@ import java.util.List;
public interface PageRouteDao extends ICRUDDao<PageRouteEntity,Long>{ public interface PageRouteDao extends ICRUDDao<PageRouteEntity,Long>{
/**
* 路径图
* @param pdu
* @return
*/
List<PageWayCensusVo> getPageWayCensus(PageCensusPdu pdu);
/**
* 获取路径图页面名称
* @param pdu
* @return
*/
List<Map<String,Object>> getPageWayCode(PageCensusPdu pdu);
} }
package com.mortals.xhx.module.page.dao.ibatis; package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageAccessDepthDao; import com.mortals.xhx.module.page.dao.PageAccessDepthDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity; import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
...@@ -16,6 +18,9 @@ import java.util.List; ...@@ -16,6 +18,9 @@ import java.util.List;
@Repository("pageAccessDepthDao") @Repository("pageAccessDepthDao")
public class PageAccessDepthDaoImpl extends BaseCRUDDaoMybatis<PageAccessDepthEntity,Long> implements PageAccessDepthDao { public class PageAccessDepthDaoImpl extends BaseCRUDDaoMybatis<PageAccessDepthEntity,Long> implements PageAccessDepthDao {
@Override
public List<AccessTrendCensusVo> getDepthAvg(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getDepthAvg"), pdu);
}
} }
package com.mortals.xhx.module.page.dao.ibatis; package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageEventDao; import com.mortals.xhx.module.page.dao.PageEventDao;
import com.mortals.xhx.module.page.model.PageEventEntity; import com.mortals.xhx.module.page.model.PageEventEntity;
...@@ -17,5 +21,25 @@ import java.util.List; ...@@ -17,5 +21,25 @@ import java.util.List;
public class PageEventDaoImpl extends BaseCRUDDaoMybatis<PageEventEntity,Long> implements PageEventDao { public class PageEventDaoImpl extends BaseCRUDDaoMybatis<PageEventEntity,Long> implements PageEventDao {
@Override
public List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageEventCensus"), pdu);
}
@Override
public List<ProductHotCensusVo> getProductHotCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getProductHotCensus"), pdu);
}
@Override
public List<AccessTrendCensusVo> getPageAccessTrend(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageAccessTrend"), pdu);
}
@Override
public List<AccessTrendCensusVo> getPageAccessTop(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageAccessTop"), pdu);
}
} }
package com.mortals.xhx.module.page.dao.ibatis; package com.mortals.xhx.module.page.dao.ibatis;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageRouteDao; import com.mortals.xhx.module.page.dao.PageRouteDao;
import com.mortals.xhx.module.page.model.PageRouteEntity; import com.mortals.xhx.module.page.model.PageRouteEntity;
import java.util.Date; import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis; import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 页面路径记录DaoImpl DAO接口 * 页面路径记录DaoImpl DAO接口
* *
...@@ -17,5 +21,13 @@ import java.util.List; ...@@ -17,5 +21,13 @@ import java.util.List;
public class PageRouteDaoImpl extends BaseCRUDDaoMybatis<PageRouteEntity,Long> implements PageRouteDao { public class PageRouteDaoImpl extends BaseCRUDDaoMybatis<PageRouteEntity,Long> implements PageRouteDao {
@Override
public List<PageWayCensusVo> getPageWayCensus(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageWayCensus"), pdu);
}
@Override
public List<Map<String, Object>> getPageWayCode(PageCensusPdu pdu) {
return this.getSqlSession().selectList(this.getSqlId("getPageWayCode"), pdu);
}
} }
...@@ -7,126 +7,252 @@ import com.mortals.framework.annotation.Excel; ...@@ -7,126 +7,252 @@ import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong; import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.vo.PageAccessVo; import com.mortals.xhx.module.page.model.vo.PageAccessVo;
/** /**
* 产品页面配置实体对象 * 产品页面访问记录实体对象
* *
* @author zxfei * @author zxfei
* @date 2023-04-12 * @date 2023-04-13
*/ */
public class PageAccessEntity extends PageAccessVo { public class PageAccessEntity extends PageAccessVo {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 设备编码 * 设备编码
*/ */
private String deviceNum; private String deviceNum;
/** /**
* 产品id * 产品id
*/ */
private Long productId; private Long productId;
/** /**
* 产品名称 * 产品名称
*/ */
private String productName; private String productName;
/** /**
* 页面编码(页面路由) * 页面编码(页面路由)
*/ */
private String pageCode; private String firstCode;
/** /**
* 页面名称 * 页面名称
*/ */
private String pageName; private String firstName;
/** /**
* 场景维度 * 页面编码(页面路由)
*/ */
private Integer sceneDepth; private String secondCode;
/**
* 页面名称
*/
private String secondName;
/**
* 页面编码(页面路由)
*/
private String thirdCode;
/**
* 页面名称
*/
private String thirdName;
/**
* 页面编码(页面路由)
*/
private String fourthCode;
/**
* 页面名称
*/
private String fourthName;
/**
* 完整路径
*/
private String accessContent;
/**
* 页面深度
*/
private Integer pageDepth;
public PageAccessEntity(){} public PageAccessEntity(){}
/** /**
* 获取 设备编码 * 获取 设备编码
* @return String * @return String
*/ */
public String getDeviceNum(){ public String getDeviceNum(){
return deviceNum; return deviceNum;
} }
/** /**
* 设置 设备编码 * 设置 设备编码
* @param deviceNum * @param deviceNum
*/ */
public void setDeviceNum(String deviceNum){ public void setDeviceNum(String deviceNum){
this.deviceNum = deviceNum; this.deviceNum = deviceNum;
} }
/** /**
* 获取 产品id * 获取 产品id
* @return Long * @return Long
*/ */
public Long getProductId(){ public Long getProductId(){
return productId; return productId;
} }
/** /**
* 设置 产品id * 设置 产品id
* @param productId * @param productId
*/ */
public void setProductId(Long productId){ public void setProductId(Long productId){
this.productId = productId; this.productId = productId;
} }
/** /**
* 获取 产品名称 * 获取 产品名称
* @return String * @return String
*/ */
public String getProductName(){ public String getProductName(){
return productName; return productName;
} }
/** /**
* 设置 产品名称 * 设置 产品名称
* @param productName * @param productName
*/ */
public void setProductName(String productName){ public void setProductName(String productName){
this.productName = productName; this.productName = productName;
} }
/** /**
* 获取 页面编码(页面路由) * 获取 页面编码(页面路由)
* @return String * @return String
*/ */
public String getPageCode(){ public String getFirstCode(){
return pageCode; return firstCode;
}
/**
* 设置 页面编码(页面路由)
* @param firstCode
*/
public void setFirstCode(String firstCode){
this.firstCode = firstCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getFirstName(){
return firstName;
}
/**
* 设置 页面名称
* @param firstName
*/
public void setFirstName(String firstName){
this.firstName = firstName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getSecondCode(){
return secondCode;
}
/**
* 设置 页面编码(页面路由)
* @param secondCode
*/
public void setSecondCode(String secondCode){
this.secondCode = secondCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getSecondName(){
return secondName;
}
/**
* 设置 页面名称
* @param secondName
*/
public void setSecondName(String secondName){
this.secondName = secondName;
} }
/** /**
* 设置 页面编码(页面路由) * 获取 页面编码(页面路由)
* @param pageCode * @return String
*/ */
public void setPageCode(String pageCode){ public String getThirdCode(){
this.pageCode = pageCode; return thirdCode;
} }
/** /**
* 获取 页面名称 * 设置 页面编码(页面路由)
* @return String * @param thirdCode
*/ */
public String getPageName(){ public void setThirdCode(String thirdCode){
return pageName; this.thirdCode = thirdCode;
} }
/** /**
* 设置 页面名称 * 获取 页面名称
* @param pageName * @return String
*/ */
public void setPageName(String pageName){ public String getThirdName(){
this.pageName = pageName; return thirdName;
} }
/** /**
* 获取 场景维度 * 设置 页面名称
* @return Integer * @param thirdName
*/ */
public Integer getSceneDepth(){ public void setThirdName(String thirdName){
return sceneDepth; this.thirdName = thirdName;
} }
/** /**
* 设置 场景维度 * 获取 页面编码(页面路由)
* @param sceneDepth * @return String
*/ */
public void setSceneDepth(Integer sceneDepth){ public String getFourthCode(){
this.sceneDepth = sceneDepth; return fourthCode;
}
/**
* 设置 页面编码(页面路由)
* @param fourthCode
*/
public void setFourthCode(String fourthCode){
this.fourthCode = fourthCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getFourthName(){
return fourthName;
}
/**
* 设置 页面名称
* @param fourthName
*/
public void setFourthName(String fourthName){
this.fourthName = fourthName;
}
/**
* 获取 完整路径
* @return String
*/
public String getAccessContent(){
return accessContent;
}
/**
* 设置 完整路径
* @param accessContent
*/
public void setAccessContent(String accessContent){
this.accessContent = accessContent;
}
/**
* 获取 页面深度
* @return Integer
*/
public Integer getPageDepth(){
return pageDepth;
}
/**
* 设置 页面深度
* @param pageDepth
*/
public void setPageDepth(Integer pageDepth){
this.pageDepth = pageDepth;
} }
...@@ -134,7 +260,7 @@ public class PageAccessEntity extends PageAccessVo { ...@@ -134,7 +260,7 @@ public class PageAccessEntity extends PageAccessVo {
@Override @Override
public int hashCode() { public int hashCode() {
return this.getId().hashCode(); return this.getId().hashCode();
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
...@@ -142,7 +268,7 @@ public class PageAccessEntity extends PageAccessVo { ...@@ -142,7 +268,7 @@ public class PageAccessEntity extends PageAccessVo {
if (obj instanceof PageAccessEntity) { if (obj instanceof PageAccessEntity) {
PageAccessEntity tmp = (PageAccessEntity) obj; PageAccessEntity tmp = (PageAccessEntity) obj;
if (this.getId() == tmp.getId()) { if (this.getId() == tmp.getId()) {
return true; return true;
} }
} }
return false; return false;
...@@ -153,24 +279,45 @@ public class PageAccessEntity extends PageAccessVo { ...@@ -153,24 +279,45 @@ public class PageAccessEntity extends PageAccessVo {
sb.append(",deviceNum:").append(getDeviceNum()); sb.append(",deviceNum:").append(getDeviceNum());
sb.append(",productId:").append(getProductId()); sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName()); sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode()); sb.append(",firstCode:").append(getFirstCode());
sb.append(",pageName:").append(getPageName()); sb.append(",firstName:").append(getFirstName());
sb.append(",sceneDepth:").append(getSceneDepth()); sb.append(",secondCode:").append(getSecondCode());
sb.append(",secondName:").append(getSecondName());
sb.append(",thirdCode:").append(getThirdCode());
sb.append(",thirdName:").append(getThirdName());
sb.append(",fourthCode:").append(getFourthCode());
sb.append(",fourthName:").append(getFourthName());
sb.append(",accessContent:").append(getAccessContent());
sb.append(",pageDepth:").append(getPageDepth());
return sb.toString(); return sb.toString();
} }
public void initAttrValue(){ public void initAttrValue(){
this.deviceNum = ""; this.deviceNum = "";
this.productId = null;
this.productName = "";
this.firstCode = "";
this.firstName = "";
this.secondCode = "";
this.secondName = "";
this.thirdCode = "";
this.productId = null; this.thirdName = "";
this.productName = ""; this.fourthCode = "";
this.pageCode = ""; this.fourthName = "";
this.pageName = ""; this.accessContent = "";
this.sceneDepth = 0; this.pageDepth = 0;
} }
} }
\ No newline at end of file
package com.mortals.xhx.module.page.model.pdu;
import lombok.Data;
@Data
public class AccessPdu {
/*** 页面编码(页面路由) */
private String pageCode;
/** 页面名称 */
private String pageName;
}
package com.mortals.xhx.module.page.model.pdu; package com.mortals.xhx.module.page.model.pdu;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity; import com.mortals.xhx.module.page.model.*;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import lombok.Data; import lombok.Data;
import java.util.List;
/*** /***
* 页面数据埋点信息 * 页面数据埋点信息
*/ */
...@@ -29,4 +28,6 @@ public class BuryPointPdu { ...@@ -29,4 +28,6 @@ public class BuryPointPdu {
private PageEventEntity eventInfo; private PageEventEntity eventInfo;
/** 产品页面访问深度 **/ /** 产品页面访问深度 **/
private PageRouteEntity routeInfo; private PageRouteEntity routeInfo;
/** 场景深度 **/
private List<AccessPdu> depthArr;
} }
package com.mortals.xhx.module.page.model.pdu;
import lombok.Data;
/**
* 页面统计查询
*/
@Data
public class PageCensusPdu {
/*** 产品id */
private Long productId;
/** 查询日期开始 **/
private String dateTimeStart;
/** 查询日期结束 **/
private String dateTimeEnd;
/** 页面编码 **/
private String pageCode;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 页面访问指标趋势
*/
@Data
public class AccessTrendCensusVo {
/**
* 页面编码(页面路由)
*/
private String pageCode;
/**
* 页面名称
*/
private String pageName;
/** 访问日期 */
private String accessDay;
/** 访问次数 */
private Integer accessCount;
/** 人均访问深度 */
private Float depthAvg;
/** 次均访问深度 */
private Float singleDepth;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 事件分析
*/
@Data
public class PageEventCensusVo {
/**
* 事件编码
*/
private String eventCode;
/**
* 事件名称
*/
private String eventName;
/**
* 事件日均数量
*/
private Integer dayAvg;
/**
* 事件平均耗时(单位毫秒)
*/
private Float takeTimeAvg;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 路径
*/
@Data
public class PageWayCensusVo {
/**
* 开始页面编码(路由)
*/
private String source;
/**
* 开始页面名称
*/
private String sourceName;
/**
* 目标页面编码(路由)
*/
private String target;
/**
* 目标页面名称
*/
private String targetName;
/**
* 点击次数
*/
private Integer value;
}
package com.mortals.xhx.module.page.model.vo;
import lombok.Data;
/**
* 产品热力图
*/
@Data
public class ProductHotCensusVo {
/**
* 业务场景编码
*/
private String businessCode;
/**
* 业务场景名称
*/
private String businessName;
/**
* 事件坐标
*/
private String coordinate;
/**
* 点击次数
*/
private Integer value;
/** 页面x坐标 */
private Float x;
/** 页面y坐标 */
private Float y;
/** 事件占比 */
private String proportion;
}
package com.mortals.xhx.module.page.service; package com.mortals.xhx.module.page.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageEventEntity; import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import java.util.List;
import java.util.Map;
/** /**
* PageEventService * PageEventService
...@@ -14,4 +21,26 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; ...@@ -14,4 +21,26 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
public interface PageEventService extends ICRUDService<PageEventEntity,Long>{ public interface PageEventService extends ICRUDService<PageEventEntity,Long>{
PageEventEntity saveByPdu(BuryPointPdu pdu); PageEventEntity saveByPdu(BuryPointPdu pdu);
/**
* 事件分析
* @param pdu
* @return
*/
List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) throws AppException;
/**
* 产品热力图
* @param pdu
* @return
*/
Map<String,Object> getProductHotCensus(PageCensusPdu pdu) throws AppException;
/**
* 页面访问分析
* @param pdu
* @return
*/
Map<String,Object> getPageAccessAnalyse(PageCensusPdu pdu) throws AppException;
} }
\ No newline at end of file
package com.mortals.xhx.module.page.service; package com.mortals.xhx.module.page.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.page.model.PageRouteEntity; import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import java.util.Map;
/** /**
* PageRouteService * PageRouteService
...@@ -14,4 +18,11 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; ...@@ -14,4 +18,11 @@ import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
public interface PageRouteService extends ICRUDService<PageRouteEntity,Long>{ public interface PageRouteService extends ICRUDService<PageRouteEntity,Long>{
PageRouteEntity saveByPdu(BuryPointPdu pdu); PageRouteEntity saveByPdu(BuryPointPdu pdu);
/**
* 页面路径访问分析
* @param pdu
* @return
*/
Map<String,Object> getWayAccessAnalyse(PageCensusPdu pdu) throws AppException;
} }
\ No newline at end of file
package com.mortals.xhx.module.page.service.impl; package com.mortals.xhx.module.page.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
...@@ -23,26 +25,39 @@ public class PageAccessServiceImpl extends AbstractCRUDServiceImpl<PageAccessDao ...@@ -23,26 +25,39 @@ public class PageAccessServiceImpl extends AbstractCRUDServiceImpl<PageAccessDao
@Override @Override
protected void validData(PageAccessEntity entity, Context context) throws AppException { protected void validData(PageAccessEntity entity, Context context) throws AppException {
if(StringUtils.isEmpty(entity.getPageCode())){ // if(StringUtils.isEmpty(entity.getPageCode())){
throw new AppException("页面编码(路由)不能为空"); // throw new AppException("页面编码(路由)不能为空");
} // }
if(StringUtils.isEmpty(entity.getPageName())){ // if(StringUtils.isEmpty(entity.getPageName())){
throw new AppException("页面名称不能为空"); // throw new AppException("页面名称不能为空");
} // }
} }
@Override @Override
public PageAccessEntity saveByPdu(BuryPointPdu pdu) { public PageAccessEntity saveByPdu(BuryPointPdu pdu) {
if(pdu.getSceneDepth()==null){ if(CollectionUtils.isEmpty(pdu.getDepthArr())){
return null; return null;
} }
PageAccessEntity entity = new PageAccessEntity(); PageAccessEntity entity = new PageAccessEntity();
entity.setDeviceNum(pdu.getDeviceNum()); entity.setDeviceNum(pdu.getDeviceNum());
entity.setProductId(pdu.getProductId()); entity.setProductId(pdu.getProductId());
entity.setProductName(pdu.getProductName()); entity.setProductName(pdu.getProductName());
entity.setPageCode(pdu.getPageCode()); entity.setFirstCode(pdu.getDepthArr().get(0).getPageCode());
entity.setPageName(pdu.getPageName()); entity.setFirstName(pdu.getDepthArr().get(0).getPageName());
entity.setSceneDepth(pdu.getSceneDepth()); if(pdu.getDepthArr().size()>1){
entity.setSecondCode(pdu.getDepthArr().get(1).getPageCode());
entity.setSecondName(pdu.getDepthArr().get(1).getPageName());
}
if(pdu.getDepthArr().size()>2){
entity.setThirdCode(pdu.getDepthArr().get(2).getPageCode());
entity.setThirdName(pdu.getDepthArr().get(2).getPageName());
}
if(pdu.getDepthArr().size()>3){
entity.setFourthCode(pdu.getDepthArr().get(3).getPageCode());
entity.setFourthName(pdu.getDepthArr().get(3).getPageName());
}
entity.setPageDepth(pdu.getDepthArr().size());
entity.setAccessContent(JSONObject.toJSONString(pdu.getDepthArr()));
entity.setCreateTime(new Date()); entity.setCreateTime(new Date());
return this.save(entity); return this.save(entity);
} }
......
package com.mortals.xhx.module.page.service.impl; package com.mortals.xhx.module.page.service.impl;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.dao.PageAccessDepthDao;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import com.mortals.xhx.module.page.model.PageInfoQuery;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.model.vo.ProductHotCensusVo;
import com.mortals.xhx.module.page.service.PageInfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
...@@ -9,7 +19,13 @@ import com.mortals.xhx.module.page.dao.PageEventDao; ...@@ -9,7 +19,13 @@ import com.mortals.xhx.module.page.dao.PageEventDao;
import com.mortals.xhx.module.page.model.PageEventEntity; import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.service.PageEventService; import com.mortals.xhx.module.page.service.PageEventService;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* PageEventService * PageEventService
...@@ -21,6 +37,13 @@ import java.util.Date; ...@@ -21,6 +37,13 @@ import java.util.Date;
@Service("pageEventService") @Service("pageEventService")
public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao, PageEventEntity, Long> implements PageEventService { public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao, PageEventEntity, Long> implements PageEventService {
@Autowired
private PageInfoService pageInfoService;
@Autowired
private PageAccessDepthDao pageAccessDepthDao;
@Override @Override
protected void validData(PageEventEntity entity, Context context) throws AppException { protected void validData(PageEventEntity entity, Context context) throws AppException {
if(StringUtils.isEmpty(entity.getPageCode())){ if(StringUtils.isEmpty(entity.getPageCode())){
...@@ -51,4 +74,116 @@ public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao, ...@@ -51,4 +74,116 @@ public class PageEventServiceImpl extends AbstractCRUDServiceImpl<PageEventDao,
entity.setCreateTime(new Date()); entity.setCreateTime(new Date());
return this.save(entity); return this.save(entity);
} }
@Override
public List<PageEventCensusVo> getPageEventCensus(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
return dao.getPageEventCensus(pdu);
}
@Override
public Map<String, Object> getProductHotCensus(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
if(StringUtils.isEmpty(pdu.getPageCode())){
throw new AppException("页面编码不能为空");
}
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(pdu.getDateTimeStart());
Date date2 = sdf.parse(pdu.getDateTimeEnd());
}catch (ParseException e){
throw new AppException("日期格式错误,应为yyyy-MM-dd");
}
Map<String,Object> result = new HashMap<>();
List<ProductHotCensusVo> list = dao.getProductHotCensus(pdu);
Long clickSum = 0l;
if(CollectionUtils.isNotEmpty(list)){
for (ProductHotCensusVo vo:list){
clickSum+=vo.getValue();
}
for (ProductHotCensusVo vo:list){
float a = (float)vo.getValue();
float b = (float)clickSum;
float p = a/b;
DecimalFormat decimalFormat=new DecimalFormat(".00%");
String s = decimalFormat.format(p);
vo.setProportion(s);
}
}
result.put("data",list);
result.put("clickSum", clickSum);
PageInfoEntity pageInfoEntity = pageInfoService.selectOne(new PageInfoQuery().pageCode(pdu.getPageCode()).productId(pdu.getProductId()));
if(pageInfoEntity!=null) {
result.put("screenUrl", pageInfoEntity.getScreenUrl());
}else {
result.put("screenUrl", "");
}
return result;
}
@Override
public Map<String, Object> getPageAccessAnalyse(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
Map<String,Object> result = new HashMap<>();
List<AccessTrendCensusVo> trendCensusVos = dao.getPageAccessTrend(pdu);
Long clickSum = 0l;
float dayAccessAvg = 0;
if(CollectionUtils.isNotEmpty(trendCensusVos)) {
for(AccessTrendCensusVo vo:trendCensusVos){
clickSum+=vo.getAccessCount();
}
float a = (float)clickSum;
float b = (float)trendCensusVos.size();
float p = a/b;
DecimalFormat decimalFormat=new DecimalFormat(".00");
String s = decimalFormat.format(p);
dayAccessAvg = Float.valueOf(s);
}
result.put("accessTrend", trendCensusVos); //页面访问指标趋势
result.put("accessSum", clickSum); //页面累计访问次数
result.put("dayAccessAvg", dayAccessAvg); //日均访问次数
List<AccessTrendCensusVo> pageAccessTop = dao.getPageAccessTop(pdu);
result.put("pageAccessTop", pageAccessTop); //页面访问次数TOP10
List<AccessTrendCensusVo> depthAvg = pageAccessDepthDao.getDepthAvg(pdu);
if(CollectionUtils.isNotEmpty(depthAvg)){
result.put("depthAvg", depthAvg.get(0).getDepthAvg()); //人均访问深度
result.put("singleDepth", depthAvg.get(0).getSingleDepth()); //次均访问深度
}else {
result.put("depthAvg", 0);
result.put("singleDepth", 0);
}
return result;
}
} }
\ No newline at end of file
package com.mortals.xhx.module.page.service.impl; package com.mortals.xhx.module.page.service.impl;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.page.model.pdu.BuryPointPdu; import com.mortals.xhx.module.page.model.pdu.BuryPointPdu;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageWayCensusVo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
...@@ -10,6 +12,9 @@ import com.mortals.xhx.module.page.model.PageRouteEntity; ...@@ -10,6 +12,9 @@ import com.mortals.xhx.module.page.model.PageRouteEntity;
import com.mortals.xhx.module.page.service.PageRouteService; import com.mortals.xhx.module.page.service.PageRouteService;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* PageRouteService * PageRouteService
...@@ -53,4 +58,23 @@ public class PageRouteServiceImpl extends AbstractCRUDServiceImpl<PageRouteDao, ...@@ -53,4 +58,23 @@ public class PageRouteServiceImpl extends AbstractCRUDServiceImpl<PageRouteDao,
entity.setCreateTime(new Date()); entity.setCreateTime(new Date());
return this.save(entity); return this.save(entity);
} }
@Override
public Map<String, Object> getWayAccessAnalyse(PageCensusPdu pdu) throws AppException {
if(StringUtils.isEmpty(pdu.getDateTimeStart())){
throw new AppException("开始日期不能为空");
}
if(StringUtils.isEmpty(pdu.getDateTimeEnd())){
throw new AppException("结束日期不能为空");
}
if(pdu.getProductId()==null){
throw new AppException("产品id不能为空");
}
Map<String,Object> result = new HashMap<>();
List<PageWayCensusVo> pageWayCensusVos = dao.getPageWayCensus(pdu);
result.put("links",pageWayCensusVos);
List<Map<String, Object>> pageCodes = dao.getPageWayCode(pdu);
result.put("data",pageCodes);
return result;
}
} }
\ No newline at end of file
package com.mortals.xhx.module.page.web;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.web.BaseJsonBodyController;
import com.mortals.xhx.module.page.model.pdu.PageCensusPdu;
import com.mortals.xhx.module.page.model.vo.PageEventCensusVo;
import com.mortals.xhx.module.page.service.PageEventService;
import com.mortals.xhx.module.page.service.PageRouteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 用户行为分析
*/
@RestController
@RequestMapping("act/analyse")
public class PageCensusController extends BaseJsonBodyController {
@Autowired
private PageEventService pageEventService;
@Autowired
private PageRouteService pageRouteService;
/**
* 事件分析
* @param query
* @return
*/
@PostMapping({"pageEventCensus"})
@UnAuth
public Rest<Object> getPageEventCensus(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询事件分析结果";
int code=1;
try {
List<PageEventCensusVo> result = pageEventService.getPageEventCensus(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model);
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 产品热力图
* @param query
* @return
*/
@PostMapping({"productHotCensus"})
@UnAuth
public Rest<Object> getProductHotCensus(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询产品热力图";
int code=1;
try {
Map<String,Object> result = pageEventService.getProductHotCensus(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 页面访问分析
* @param query
* @return
*/
@PostMapping({"accessAnalyse"})
@UnAuth
public Rest<Object> getPageAccessAnalyse(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询页面访问分析";
int code=1;
try {
Map<String,Object> result = pageEventService.getPageAccessAnalyse(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
/**
* 页面路径访问分析
* @param query
* @return
*/
@PostMapping({"wayAccessAnalyse"})
@UnAuth
public Rest<Object> getPageWayAnalyse(@RequestBody PageCensusPdu query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
String busiDesc = "查询页面路径访问分析";
int code=1;
try {
Map<String,Object> result = pageRouteService.getWayAccessAnalyse(query);
model.put("data", result);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setData(model.get("data"));
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
}
<?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.page.dao.ibatis.PageAccessDepthDaoImpl">
<!-- 人均访问深度 -->
<select id="getDepthAvg" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT
FORMAT(AVG(t.depthValue),2) AS depthAvg,
FORMAT(sum(t.depthValue)/count(t.id),2) AS singleDepth
FROM
mortals_xhx_page_access_depth t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
</select>
</mapper>
\ 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.page.dao.ibatis.PageEventDaoImpl">
<!-- 事件分析 -->
<select id="getPageEventCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.PageEventCensusVo">
SELECT
t.eventCode,
t.eventName,
FLOOR(count(id)/(DATEDIFF(MAX(t.createTime),MIN(t.createTime))+1)) as dayAvg,
FORMAT(AVG(t.takeTime)/1000,2) as takeTimeAvg
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
AND t.eventCode IS NOT NULL
GROUP BY
t.eventCode,
t.eventName
</select>
<!-- 产品热力图 -->
<select id="getProductHotCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.ProductHotCensusVo">
SELECT * FROM (
SELECT
t.businessCode,
t.businessName,
t.coordinate,
SUBSTRING_INDEX(t.coordinate,',',1) AS x,
SUBSTRING_INDEX(t.coordinate,',',-1) AS y,
COUNT(t.id) AS `value`
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
AND t.businessCode IS NOT NULL
AND t.businessCode !=''
AND t.coordinate IS NOT NULL
AND t.coordinate !=''
AND t.pageCode = #{pageCode}
GROUP BY
t.businessCode,
t.businessName,
t.coordinate
) as a ORDER BY `value` DESC LIMIT 10
</select>
<!-- 页面访问指标趋势 -->
<select id="getPageAccessTrend" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT
date_format(createTime, '%m-%d') AS accessDay,
COUNT(t.id) AS accessCount
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
date_format(createTime, '%m-%d')
</select>
<!-- 页面访问次数TOP10 -->
<select id="getPageAccessTop" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.AccessTrendCensusVo">
SELECT * FROM (
SELECT
t.pageCode,
t.pageName,
COUNT(t.id) AS accessCount
FROM
mortals_xhx_page_event t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
t.pageCode,
t.pageName
) as a ORDER BY accessCount DESC LIMIT 10
</select>
</mapper>
\ 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.page.dao.ibatis.PageRouteDaoImpl">
<!-- 路径图 -->
<select id="getPageWayCensus" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="com.mortals.xhx.module.page.model.vo.PageWayCensusVo">
SELECT
t.sourceCode AS source,
t.sourceName,
t.targetCode AS target,
t.targetName,
count(t.id) AS `value`
FROM
mortals_xhx_page_route t
WHERE
t.productId = #{productId}
AND t.createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND t.createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
GROUP BY
t.sourceCode,
t.sourceName,
t.targetCode,
t.targetName
</select>
<!-- 路径图 -->
<select id="getPageWayCode" parameterType="com.mortals.xhx.module.page.model.pdu.PageCensusPdu" resultType="java.util.HashMap">
SELECT DISTINCT a.* FROM
(
SELECT DISTINCT
sourceCode AS `code`,
sourceName AS `name`
FROM
mortals_xhx_page_route
WHERE
productId = #{productId}
AND createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
UNION
SELECT DISTINCT
targetCode AS `code`,
targetName AS `name`
FROM
mortals_xhx_page_route
WHERE
productId = #{productId}
AND createTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{dateTimeStart},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
AND createTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{dateTimeEnd},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
) AS a
</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