Przeglądaj źródła

作者:张哲
时间:2023/03/20
类型:开发
描述:里程碑(3)PC端接口开发-搜索服务访问量分布柱状图数据

zizg 2 lat temu
rodzic
commit
cdcd3abe4b

+ 9 - 1
src/main/java/com/redxun/knowledge/analysis/controller/AnalysisCommonController.java

@@ -3,6 +3,7 @@ package com.redxun.knowledge.analysis.controller;
 import com.redxun.common.annotation.ClassDefine;
 import com.redxun.common.base.entity.JsonResult;
 import com.redxun.knowledge.analysis.entity.vo.SearchParticipleWordCloudVo;
+import com.redxun.knowledge.analysis.entity.vo.SearchVisitHistogramVo;
 import com.redxun.knowledge.analysis.service.AnalysisCommonServiceImpl;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,7 +44,14 @@ public class AnalysisCommonController {
         return JsonResult.getSuccessResult(result);
     }
 
-    @ApiOperation("获取搜索服务分词的词云数据")
+    @ApiOperation("PC 获取搜索服务访问量分布柱状图数据")
+    @GetMapping("searchVisitHistogram")
+    public JsonResult searchVisitHistogram(){
+        SearchVisitHistogramVo searchVisitHistogramVo = analysisCommonService.searchVisitHistogram();
+        return JsonResult.getSuccessResult(searchVisitHistogramVo);
+    }
+
+    @ApiOperation("PC 获取搜索服务分词的词云数据")
     @GetMapping("searchParticipleWordCloud")
     public JsonResult searchParticipleWordCloud(@RequestParam(value = "tops", required = false, defaultValue = "100") Integer tops) {
         List<SearchParticipleWordCloudVo> result = analysisCommonService.searchParticipleWordCloud(tops);

+ 26 - 0
src/main/java/com/redxun/knowledge/analysis/entity/consts/PlatformConst.java

@@ -0,0 +1,26 @@
+package com.redxun.knowledge.analysis.entity.consts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 文件名: PlatformConst
+ * 作者: zizg
+ * 时间: 2023/3/20
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+public class PlatformConst {
+
+    public static List<String> platformList(){
+        List<String> list = new ArrayList<>();
+        list.add("知识管理系统");
+        list.add("平展系统");
+        list.add("工作管理系统");
+        list.add("EIP系统");
+        list.add("网盘系统");
+        return list;
+    }
+}

+ 24 - 0
src/main/java/com/redxun/knowledge/analysis/entity/vo/LablesVo.java

@@ -0,0 +1,24 @@
+package com.redxun.knowledge.analysis.entity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件名: LablesVo
+ * 作者: zizg
+ * 时间: 2023/3/20
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@Data
+public class LablesVo implements Serializable {
+
+    private String name;
+
+    private List<Map<String,Object>> values;
+}

+ 30 - 0
src/main/java/com/redxun/knowledge/analysis/entity/vo/SearchVisitHistogramVo.java

@@ -0,0 +1,30 @@
+package com.redxun.knowledge.analysis.entity.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件名: SearchVisitHistogramVo
+ * 作者: zizg
+ * 时间: 2023/3/20
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@ApiModel("PC 搜索服务访问量")
+@Data
+public class SearchVisitHistogramVo implements Serializable {
+
+    @ApiModelProperty("搜索访问总量")
+    private Integer total;
+
+    @ApiModelProperty("标签取值列表")
+    private List<LablesVo> lables;
+
+}

+ 21 - 0
src/main/java/com/redxun/knowledge/analysis/mapper/PvLogMapper.java

@@ -4,6 +4,9 @@ package com.redxun.knowledge.analysis.mapper;
 import com.redxun.common.base.db.BaseDao;
 import com.redxun.knowledge.analysis.entity.dao.PvLog;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
@@ -12,4 +15,22 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface PvLogMapper extends BaseDao<PvLog> {
 
+    /**
+     * 统计当前年的搜索访问总量
+     * @param firstYearDate
+     * @param lastYearDate
+     * @return
+     */
+    Integer selectYearTotal(@Param("firstYearDate") String firstYearDate, @Param("lastYearDate") String lastYearDate);
+
+    /**
+     * 根据月份查询各个业务系统访问量
+     * @param firstOfMonth
+     * @param lastOfMonth
+     * @param platform
+     * @return
+     */
+    Integer selectSearchVisitHistogramByMonth(@Param("firstOfMonth") String firstOfMonth,
+                                              @Param("lastOfMonth") String lastOfMonth,
+                                              @Param("platform") String platform);
 }

+ 58 - 3
src/main/java/com/redxun/knowledge/analysis/service/AnalysisCommonServiceImpl.java

@@ -1,16 +1,20 @@
 package com.redxun.knowledge.analysis.service;
 
+import com.redxun.knowledge.analysis.entity.consts.PlatformConst;
+import com.redxun.knowledge.analysis.entity.vo.LablesVo;
 import com.redxun.knowledge.analysis.entity.vo.SearchParticipleWordCloudVo;
+import com.redxun.knowledge.analysis.entity.vo.SearchVisitHistogramVo;
 import com.redxun.knowledge.analysis.mapper.AnalysisCommonMapper;
+import com.redxun.knowledge.analysis.mapper.PvLogMapper;
 import com.redxun.knowledge.analysis.mapper.SearchParticipleLogMapper;
+import com.redxun.knowledge.utils.DateUtils;
 import groovy.util.logging.Slf4j;
 import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -29,6 +33,9 @@ public class AnalysisCommonServiceImpl {
     @Autowired
     private AnalysisCommonMapper analysisCommonMapper;
 
+    @Autowired
+    private PvLogMapper pvLogMapper;
+
     /**
      * 各模块整体数量统计:知识仓库(知识总数量);知识地图(地图总数量);知识专辑(专辑总数量)
      * @return
@@ -70,4 +77,52 @@ public class AnalysisCommonServiceImpl {
         List<SearchParticipleWordCloudVo> result = searchParticipleWordCloudVos.stream().limit(tops).collect(Collectors.toList());
         return result;
     }
+
+    /**
+     * 获取搜索服务访问量分布柱状图数据,查看一次详情算一次PV
+     * @return
+     */
+    public SearchVisitHistogramVo searchVisitHistogram() {
+        SearchVisitHistogramVo searchVisitHistogramVo = new SearchVisitHistogramVo();
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+        //统计当前年的搜索访问总量
+        int yearTotal = pvLogMapper.selectYearTotal(DateUtils.format(DateUtils.getFirstOfYear(year)),
+                DateUtils.format(DateUtils.getLastOfYear(year)));
+        //统计每月各个系统的搜索访问量
+        List<LablesVo> lablesVoList = new ArrayList<>();
+        for (int i = 1; i <= 12 ; i++) {
+            LablesVo lablesVo = new LablesVo();
+            List<Map<String, Object>> values = new ArrayList<>();
+            lablesVo.setName(i + "月");
+            //查询出全部的业务系统名称
+            List<String> platformList = PlatformConst.platformList();
+            //获取每月的第一天和最后一天
+            String firstOfMonth = DateUtils.getFirstOfMonth(year, i, 15);
+            String lastOfMonth = DateUtils.getLastOfMonth(year, i, 15);
+            Integer sumByMonth = pvLogMapper.selectSearchVisitHistogramByMonth(firstOfMonth, lastOfMonth, null);
+            //根据月份查询各个业务系统访问量
+            platformList.forEach(e -> {
+                Map<String, Object> map = new HashMap<>();
+                Integer count = pvLogMapper.selectSearchVisitHistogramByMonth(firstOfMonth,lastOfMonth,e);
+                map.put("legend",e);
+                map.put("value",count);
+                if (sumByMonth == 0){
+                    map.put("percentage",0.0000);
+                } else {
+                    double sum = count / (sumByMonth.doubleValue());
+                    BigDecimal bd = new BigDecimal(sum);
+                    double f1 = bd.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+                    map.put("percentage",f1);
+                }
+                values.add(map);
+            });
+            lablesVo.setValues(values);
+            lablesVoList.add(lablesVo);
+        }
+        //返回值
+        searchVisitHistogramVo.setTotal(yearTotal);
+        searchVisitHistogramVo.setLables(lablesVoList);
+        return searchVisitHistogramVo;
+    }
 }

+ 1 - 0
src/main/java/com/redxun/knowledge/controller/CommonController.java

@@ -83,6 +83,7 @@ public class CommonController extends BaseController<CommonEntity> {
     @PostMapping("pageTrack")
     public JsonResult pageTrack(@RequestBody SystemLogDto systemLogDto){
         JsonResult jsonResult = JsonResult.getSuccessResult("");
+        systemService.pageTrack(systemLogDto);
         return jsonResult.setData("");
     }
 

+ 30 - 0
src/main/java/com/redxun/knowledge/service/CommonServiceImpl.java

@@ -3,21 +3,29 @@ package com.redxun.knowledge.service;
 
 import com.redxun.common.base.db.BaseDao;
 import com.redxun.common.base.db.BaseService;
+import com.redxun.common.base.entity.IUser;
 import com.redxun.common.service.impl.SuperServiceImpl;
+import com.redxun.common.tool.IdGenerator;
+import com.redxun.common.utils.ContextUtil;
 import com.redxun.datasource.DataSourceContextHolder;
 import com.redxun.dto.user.OsUserDto;
 import com.redxun.feign.sys.SystemClient;
+import com.redxun.knowledge.analysis.entity.dao.PvLog;
+import com.redxun.knowledge.analysis.entity.dto.SystemLogDto;
+import com.redxun.knowledge.analysis.mapper.PvLogMapper;
 import com.redxun.knowledge.common.UserService;
 import com.redxun.knowledge.entity.dao.CommonEntity;
 import com.redxun.knowledge.entity.vo.DicVo;
 import com.redxun.knowledge.entity.vo.PositionSequenceVo;
 import com.redxun.knowledge.mapper.CommonMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +43,9 @@ public class CommonServiceImpl extends SuperServiceImpl<CommonMapper, CommonEnti
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private PvLogMapper pvLogMapper;
+
     @Resource
     @Lazy
     SystemClient systemClient;
@@ -91,4 +102,23 @@ public class CommonServiceImpl extends SuperServiceImpl<CommonMapper, CommonEnti
         map.put("deptName",osUserDto.getDeptName());
         return map;
     }
+
+    /**
+     * 用户浏览估计上报接口
+     * @param systemLogDto
+     */
+    public void pageTrack(SystemLogDto systemLogDto) {
+        IUser users = ContextUtil.getCurrentUser();
+        PvLog pvLog = new PvLog();
+        BeanUtils.copyProperties(systemLogDto,pvLog);
+        pvLog.setPkId(IdGenerator.getIdStr());
+        pvLog.setCompanyId(systemLogDto.getCompanyId());
+        pvLog.setCreateDepId(users.getDeptId());
+        pvLog.setTenantId(users.getTenantId());
+        pvLog.setCreateBy(users.getUserId());
+        pvLog.setCreateTime(new Date());
+        pvLog.setUpdateBy(users.getUserId());
+        pvLog.setUpdateTime(new Date());
+        pvLogMapper.insert(pvLog);
+    }
 }

+ 95 - 0
src/main/java/com/redxun/knowledge/utils/DateUtils.java

@@ -0,0 +1,95 @@
+package com.redxun.knowledge.utils;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 文件名: DateUtils
+ * 作者: zizg
+ * 时间: 2023/3/20
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+public class DateUtils {
+
+    private static String datePattern = "yyyy-MM-dd";
+
+    private DateUtils(){
+
+    }
+
+    /**
+     * 时间转时间字符串
+     * @param date  日期
+     * @return String
+     */
+    public static String format(Date date) {
+        if (date == null)
+            return "";
+        return DateFormatUtils.format(date,datePattern);
+    }
+
+    /**
+     * 获取某年第一天日期
+     * @param year 年份
+     * @return Date
+     */
+    public static Date getFirstOfYear(int year){
+        Calendar calendar = Calendar.getInstance();
+        calendar.clear();
+        calendar.set(Calendar.YEAR, year);
+        return calendar.getTime();
+    }
+
+
+
+    /**
+     * 获取某年最后一天日期
+     * @param year 年份
+     * @return Date
+     */
+    public static Date getLastOfYear(int year){
+        Calendar calendar = Calendar.getInstance();
+        calendar.clear();
+        calendar.set(Calendar.YEAR, year);
+        calendar.roll(Calendar.DAY_OF_YEAR, -1);
+        return calendar.getTime();
+    }
+
+    /**
+     * 获取指定年月日的第一天
+     * @param year
+     * @param month
+     * @param day
+     * @return
+     */
+    public static String getFirstOfMonth(int year,int month,int day){
+        LocalDate date = LocalDate.of(year, month, day);
+        LocalDate firstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(datePattern);
+        String dateStr = firstDay.format(df);
+        return dateStr;
+    }
+
+    /**
+     * 获取指定年月日的最后一天
+     * @param year
+     * @param month
+     * @param day
+     * @return
+     */
+    public static String getLastOfMonth(int year,int month,int day){
+        LocalDate date = LocalDate.of(year, month, day);
+        LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(datePattern);
+        String dateStr = lastDay.format(df);
+        return dateStr;
+    }
+}

+ 50 - 17
src/main/resources/mapper/knowledge/analysis/PvLogMapper.xml

@@ -3,26 +3,28 @@
 <mapper namespace="com.redxun.knowledge.analysis.mapper.PvLogMapper">
 
     <resultMap id="PvLog" type="com.redxun.knowledge.analysis.entity.dao.PvLog">
-                <id property="pkId" column="PK_ID" jdbcType="VARCHAR"/>
-                <result property="module" column="MODULE" jdbcType="VARCHAR"/>
-                <result property="subModule" column="SUB_MODULE" jdbcType="VARCHAR"/>
-                <result property="userId" column="USER_ID" jdbcType="VARCHAR"/>
-                <result property="companyId" column="COMPANY_ID" jdbcType="VARCHAR"/>
-                <result property="page" column="PAGE" jdbcType="VARCHAR"/>
-                <result property="platform" column="PLATFORM" jdbcType="VARCHAR"/>
-                <result property="ussd" column="USSD" jdbcType="VARCHAR"/>
-                <result property="companyId" column="COMPANY_ID_" jdbcType="VARCHAR"/>
-                <result property="createDepId" column="CREATE_DEP_ID_" jdbcType="VARCHAR"/>
-                <result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
-                <result property="createBy" column="CREATE_BY_" jdbcType="VARCHAR"/>
-                <result property="createTime" column="CREATE_TIME_" jdbcType="DATE"/>
-                <result property="updateBy" column="UPDATE_BY_" jdbcType="VARCHAR"/>
-                <result property="updateTime" column="UPDATE_TIME_" jdbcType="DATE"/>
+        <id property="pkId" column="PK_ID" jdbcType="VARCHAR"/>
+        <result property="module" column="MODULE" jdbcType="VARCHAR"/>
+        <result property="subModule" column="SUB_MODULE" jdbcType="VARCHAR"/>
+        <result property="userId" column="USER_ID" jdbcType="VARCHAR"/>
+        <result property="companyId" column="COMPANY_ID" jdbcType="VARCHAR"/>
+        <result property="page" column="PAGE" jdbcType="VARCHAR"/>
+        <result property="platform" column="PLATFORM" jdbcType="VARCHAR"/>
+        <result property="ussd" column="USSD" jdbcType="VARCHAR"/>
+        <result property="companyId" column="COMPANY_ID_" jdbcType="VARCHAR"/>
+        <result property="createDepId" column="CREATE_DEP_ID_" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
+        <result property="createBy" column="CREATE_BY_" jdbcType="VARCHAR"/>
+        <result property="createTime" column="CREATE_TIME_" jdbcType="DATE"/>
+        <result property="updateBy" column="UPDATE_BY_" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="UPDATE_TIME_" jdbcType="DATE"/>
     </resultMap>
 
 
     <select id="query" resultType="com.redxun.knowledge.analysis.entity.dao.PvLog" parameterType="java.util.Map">
-        select PK_ID,MODULE,SUB_MODULE,USER_ID,COMPANY_ID,PAGE,PLATFORM,USSD,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_ from KM_PV_LOG
+        select
+        PK_ID,MODULE,SUB_MODULE,USER_ID,COMPANY_ID,PAGE,PLATFORM,USSD,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
+        from KM_PV_LOG
         <where>
             <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
                 ${w.whereSql}
@@ -32,10 +34,41 @@
             ORDER BY ${w.orderBySql}
         </if>
         <if test="@rx.Ognl@isEmpty(w.orderBySql)">
-            ORDER BY  PK_ID DESC
+            ORDER BY PK_ID DESC
         </if>
     </select>
 
+    <insert id="insert">
+        insert into KM_PV_LOG (PK_ID, MODULE, SUB_MODULE, USER_ID, COMPANY_ID, PAGE, PLATFORM, USSD, COMPANY_ID_,
+                               CREATE_DEP_ID_, TENANT_ID_, CREATE_BY_, CREATE_TIME_, UPDATE_BY_, UPDATE_TIME_)
+        values (#{pkId}, #{module}, #{subModule}, #{userId}, #{companyId}, #{page}, #{platform}, #{ussd}, #{companyId},
+                #{createDepId},
+                #{tenantId},
+                #{createBy},
+                #{createTime},
+                #{updateBy},
+                #{updateTime})
+    </insert>
+
+    <select id="selectYearTotal" resultType="int">
+        select count(*) from KM_PV_LOG
+        where
+        TO_CHAR(CREATE_TIME_,'yyyy-mm-dd') &gt;= #{firstYearDate}
+        and TO_CHAR(CREATE_TIME_,'yyyy-mm-dd') &lt;= #{lastYearDate}
+    </select>
+
+    <select id="selectSearchVisitHistogramByMonth" resultType="int">
+        select count(*)
+        from KM_PV_LOG
+        <where>
+            TO_CHAR(CREATE_TIME_,'yyyy-mm-dd') &gt;= #{firstOfMonth}
+            and TO_CHAR(CREATE_TIME_,'yyyy-mm-dd') &lt;= #{lastOfMonth}
+            <if test="platform != null">
+                and PLATFORM = #{platform}
+            </if>
+        </where>
+    </select>
+
 </mapper>