111
k94314517
2023-09-05 85e514c685f2862cfe641b3eadb4412a09af2062
111
已添加6个文件
已修改8个文件
390 ■■■■■ 文件已修改
server/src/main/java/doumeemes/api/ext/StagingExtController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/system/SystemLoginLogController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/ActivityLoginDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/CompanyLoginDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/ActivityLoginVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/CompanyLoginStatisticsVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/StagingLoginVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/system/SystemUserMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/SystemLoginLogService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/SystemUserService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/SystemLoginLogServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/SystemUserServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/SystemUserMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/ext/StagingExtController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package doumeemes.api.ext;
import doumeemes.api.BaseController;
import doumeemes.core.model.ApiResponse;
import doumeemes.dao.ext.dto.ActivityLoginDTO;
import doumeemes.dao.ext.vo.ActivityLoginVO;
import doumeemes.dao.ext.vo.StagingLoginVO;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.service.system.SystemLoginLogService;
import doumeemes.service.system.SystemLoginService;
import doumeemes.service.system.SystemUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/9/5 10:26
 */
@RestController
@RequestMapping("/ext/stagingExt")
@Api(tags = "工作台接口")
public class StagingExtController  extends BaseController {
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private SystemUserService systemUserService;
    @ApiOperation("工作台活跃数据")
    @GetMapping("/getStagingLoginVO")
    public ApiResponse<StagingLoginVO> getStagingLoginVO() {
        return ApiResponse.success(systemLoginLogService.getStagingLoginVO());
    }
    @ApiOperation("工作台活跃数据趋势图")
    @PostMapping("/getActivityLoginVOList")
    public ApiResponse<List<ActivityLoginVO>> getActivityLoginVOList(@RequestBody ActivityLoginDTO activityLoginDTO) {
        return ApiResponse.success(systemUserService.activityLoginVOList(activityLoginDTO));
    }
}
server/src/main/java/doumeemes/api/system/SystemLoginLogController.java
@@ -6,9 +6,12 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.core.utils.DateUtil;
import doumeemes.dao.ext.dto.CompanyLoginDTO;
import doumeemes.dao.ext.vo.CompanyLoginStatisticsVO;
import doumeemes.dao.system.dto.QuerySystemLoginLogDTO;
import doumeemes.dao.system.model.SystemLoginLog;
import doumeemes.service.system.SystemLoginLogService;
import doumeemes.service.system.SystemUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;    
@@ -29,6 +32,9 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private SystemUserService systemUserService;
    @PostMapping("/page")
    @ApiOperation("分页查询")
    @RequiresPermissions("system:loginLog:query")
@@ -42,4 +48,19 @@
    public void export (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SystemLoginLog.class).exportWithFirstAndEnd(systemLoginLogService.findPage(pageWrap).getRecords(), "登录日志_"+System.currentTimeMillis(),"登录日志-"+ DateUtil.getPlusTime2(DateUtil.getCurrentDate()),null, response);
    }
    @PostMapping("/companyLoginStatisticsPage")
    @ApiOperation("企业登录统计")
//    @RequiresPermissions("system:loginLog:query")
    public ApiResponse<PageData<CompanyLoginStatisticsVO>> companyLoginStatisticsPage (@RequestBody PageWrap<CompanyLoginDTO> pageWrap) {
        return ApiResponse.success(systemUserService.companyLoginStatisticsPage(pageWrap));
    }
    @PostMapping("/companyLoginStatisticsExport")
    @ApiOperation("企业登录统计导出")
//    @RequiresPermissions("system:loginLog:query")
    public void companyLoginStatisticsExport (@RequestBody PageWrap<CompanyLoginDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(CompanyLoginStatisticsVO.class).exportWithFirstAndEnd(systemUserService.companyLoginStatisticsPage(pageWrap).getRecords(), "企业登录统计_"+System.currentTimeMillis(),"企业登录统计_"+ DateUtil.getPlusTime2(DateUtil.getCurrentDate()),null, response);
    }
}
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java
@@ -89,17 +89,26 @@
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> map = new LinkedHashMap<>();
        // è·¯å¾„拦截配置
        map.put("/web/user/login", "anon");
        map.put("/public/uploadRichText", "anon");
        map.put("/system/login", "anon");
        map.put("/system/wxLogin", "anon");
        map.put("/system/wxProgramLogin", "anon");
        map.put("/system/wxAccountLogin", "anon");
        map.put("/system/initCompany", "anon");
        map.put("/system/logout", "anon");
        map.put("/common/captcha", "anon");
        //放行 scratch æŽ¥å£
        map.put("/web/scratch/**", "anon");
        map.put("/statistics/**", "anon");
        map.put("/dingding/push", "anon");
//        map.put("/ext/workorderExt/freshStatistics", "anon");
        map.put("/dingding/jsapiTicket", "anon");
        map.put("/dingding/ddLogin", "anon");
        map.put("/dingding/getDingdingCorpId", "anon");
        map.put("/lingyang/login", "anon");
        map.put("/lingyang/loginDemo", "anon");
        map.put("/edgp/**", "anon");
        // - æ”¾è¡Œswagger
        map.put("/doc.html", "anon");
        map.put("/webjars/**", "anon");
        map.put("/template/**", "anon");
        map.put("/swagger-resources/**", "anon");
        map.put("/v2/api-docs/**", "anon");
        // - å…¶ä»–接口统一拦截
server/src/main/java/doumeemes/dao/ext/dto/ActivityLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package doumeemes.dao.ext.dto;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author T14
 */
@Data
@ApiModel("工作台活跃趋势图查询类")
public class ActivityLoginDTO {
    @ApiModelProperty(value = "来源  0pc 1钉钉 2羚羊平台 3EDGP平台")
    private Integer orgin;
    @ApiModelProperty(value = "开始日期")
    private String startDate;
    @ApiModelProperty(value = "结束日期")
    private String endDate;
}
server/src/main/java/doumeemes/dao/ext/dto/CompanyLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package doumeemes.dao.ext.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author T14
 */
@Data
@ApiModel("企业登录统计查询类")
public class CompanyLoginDTO {
    @ApiModelProperty(value = "来源  0pc 1钉钉 2羚羊平台 3EDGP平台")
    private Integer orgin;
    @ApiModelProperty(value = "查询年月 YYYY-MM")
    private String queryMonth;
    @ApiModelProperty(value = "企业名称")
    private String companyName;
}
server/src/main/java/doumeemes/dao/ext/vo/ActivityLoginVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package doumeemes.dao.ext.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/9/5 10:30
 */
@Data
@ApiModel("工作台活跃趋势图数据")
public class ActivityLoginVO {
    @ApiModelProperty(value = "今日活跃用户")
    private Integer dayActiveUserNum;
    @ApiModelProperty(value = "今日活跃企业")
    private String dataDate;
}
server/src/main/java/doumeemes/dao/ext/vo/CompanyLoginStatisticsVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package doumeemes.dao.ext.vo;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/9/5 10:30
 */
@Data
@ApiModel("企业登录统计查询数据")
public class CompanyLoginStatisticsVO {
    @ApiModelProperty(value = "时间 yyyy-MM-dd")
    @ExcelColumn(name="时间",width = 6,align = HorizontalAlignment.CENTER)
    private String dataDate;
    @ApiModelProperty(value = "登录企业名称")
    @ExcelColumn(name="登录企业名称",width = 6,align = HorizontalAlignment.CENTER)
    private String companyName;
    @ApiModelProperty(value = "渠道")
    @ExcelColumn(name="渠道", valueMapping = "0=PC平台;1=钉钉平台;2=羚羊平台;3=EDGP平台;4=微信小程序",width = 6,align = HorizontalAlignment.CENTER)
    private Integer orgin;
    @ApiModelProperty(value = "登录次数")
    @ExcelColumn(name="登录次数",width = 6,align = HorizontalAlignment.CENTER)
    private Integer loginNum;
}
server/src/main/java/doumeemes/dao/ext/vo/StagingLoginVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package doumeemes.dao.ext.vo;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/9/5 10:30
 */
@Data
@ApiModel("工作台活跃数据")
public class StagingLoginVO {
    @ApiModelProperty(value = "今日活跃用户")
    private Integer dayActiveUserNum;
    @ApiModelProperty(value = "今日活跃企业")
    private Integer dayActiveCompanyNum;
    @ApiModelProperty(value = "本月活跃企业")
    private Integer monthActiveCompanyNum;
    @ApiModelProperty(value = "本月登录2次及以上企业数")
    private Integer monthTwoCompanyNum;
    @ApiModelProperty(value = "本月登录2次及以上企业数(羚羊)")
    private Integer monthTwoCompanyLYNum;
}
server/src/main/java/doumeemes/dao/system/SystemUserMapper.java
@@ -1,6 +1,10 @@
package doumeemes.dao.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import doumeemes.dao.ext.dto.ActivityLoginDTO;
import doumeemes.dao.ext.dto.CompanyLoginDTO;
import doumeemes.dao.ext.vo.ActivityLoginVO;
import doumeemes.dao.ext.vo.CompanyLoginStatisticsVO;
import doumeemes.dao.system.dto.QuerySystemUserDTO;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.dao.system.vo.SystemUserListVO;
@@ -17,4 +21,10 @@
     */
    List<SystemUserListVO> selectManageList(@Param("dto") QuerySystemUserDTO dto, @Param("orderByClause") String orderByClause);
    List<ActivityLoginVO> activityLoginVOList(@Param("dto")ActivityLoginDTO activityLoginDTO) ;
    List<CompanyLoginStatisticsVO> companyLoginStatisticsList(@Param("dto") CompanyLoginDTO companyLoginDTO) ;
}
server/src/main/java/doumeemes/service/system/SystemLoginLogService.java
@@ -2,6 +2,7 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.ext.vo.StagingLoginVO;
import doumeemes.dao.system.dto.QuerySystemLoginLogDTO;
import doumeemes.dao.system.model.SystemLoginLog;
import java.util.List;
@@ -89,4 +90,6 @@
     * @date 2022/04/18 18:12
     */
    long count(SystemLoginLog systemLoginLog);
    StagingLoginVO getStagingLoginVO();
}
server/src/main/java/doumeemes/service/system/SystemUserService.java
@@ -2,6 +2,10 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.ext.dto.ActivityLoginDTO;
import doumeemes.dao.ext.dto.CompanyLoginDTO;
import doumeemes.dao.ext.vo.ActivityLoginVO;
import doumeemes.dao.ext.vo.CompanyLoginStatisticsVO;
import doumeemes.dao.system.dto.QuerySystemUserDTO;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.dao.system.vo.SystemUserListVO;
@@ -91,4 +95,9 @@
     * @date 2022/04/18 18:12
     */
    long count(SystemUser systemUser);
    List<ActivityLoginVO> activityLoginVOList(ActivityLoginDTO activityLoginDTO);
    PageData<CompanyLoginStatisticsVO> companyLoginStatisticsPage(PageWrap<CompanyLoginDTO> pageWrap);
}
server/src/main/java/doumeemes/service/system/impl/SystemLoginLogServiceImpl.java
@@ -6,6 +6,9 @@
import doumeemes.core.utils.Utils;
import doumeemes.dao.business.model.Company;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.ext.dto.ActivityLoginDTO;
import doumeemes.dao.ext.vo.ActivityLoginVO;
import doumeemes.dao.ext.vo.StagingLoginVO;
import doumeemes.dao.system.SystemLoginLogMapper;
import doumeemes.dao.system.dto.QuerySystemLoginLogDTO;
import doumeemes.dao.system.join.SystemLoginLogJoinMapper;
@@ -137,4 +140,67 @@
        Wrapper<SystemLoginLog> wrapper = new QueryWrapper<>(systemLoginLog);
        return systemLoginLogMapper.selectCount(wrapper);
    }
    @Override
    public StagingLoginVO getStagingLoginVO(){
        StagingLoginVO stagingLoginVO = new StagingLoginVO();
        //今日活跃用户:统计当天登录用户数,一个系统用户在不同的企业登录,算两个用户;一个用户在一个企业内多次登录,算一个用户
        stagingLoginVO.setDayActiveUserNum(
            systemLoginLogMapper.selectList(new QueryWrapper<SystemLoginLog>()
                    .select(" COMPANY_USER_ID ")
                    .isNotNull(" COMPANY_ID ")
                    .isNotNull(" COMPANY_USER_ID ")
                    .apply(" LOGIN_TIME like concat(CURDATE(),'%') ")
                    .groupBy(" COMPANY_ID , COMPANY_USER_ID ")
            ).size()
        );
        //今日活跃企业:统计当天登录的企业数,一个企业的不同用户登录,算一个企业数;
        stagingLoginVO.setDayActiveCompanyNum(
                systemLoginLogMapper.selectList(new QueryWrapper<SystemLoginLog>()
                        .select(" COMPANY_ID ")
                        .isNotNull(" COMPANY_ID ")
                        .isNotNull(" COMPANY_USER_ID ")
                        .apply(" LOGIN_TIME like concat(CURDATE(),'%') ")
                        .groupBy(" COMPANY_ID ")
                ).size()
        );
        //统计本月(自然月)登录的企业数,逻辑同上;
        stagingLoginVO.setMonthActiveCompanyNum(
                systemLoginLogMapper.selectList(new QueryWrapper<SystemLoginLog>()
                        .select(" COMPANY_ID ")
                        .isNotNull(" COMPANY_ID ")
                        .isNotNull(" COMPANY_USER_ID ")
                        .apply(" LOGIN_TIME like concat(date_format(NOW(), '%Y-%m'),'%') ")
                        .groupBy(" COMPANY_ID ")
                ).size()
        );
        //本月登录2次及以上企业数:统计本月(自然月)登录2次及以上的企业数,逻辑同上;
        stagingLoginVO.setMonthTwoCompanyNum(
                systemLoginLogMapper.selectList(new QueryWrapper<SystemLoginLog>()
                        .select(" COMPANY_ID ")
                        .isNotNull(" COMPANY_ID ")
                        .isNotNull(" COMPANY_USER_ID ")
                        .apply(" LOGIN_TIME like concat(date_format(NOW(), '%Y-%m'),'%') ")
                        .groupBy(" COMPANY_ID ")
                        .having(" count(1) > 1 ")
                ).size()
        );
        //本月登录2次及以上企业数(羚羊):统计本月(自然月)登录2次及以上(登录来源于羚羊平台)的企业数,逻辑同上;
        stagingLoginVO.setMonthTwoCompanyLYNum(
                systemLoginLogMapper.selectList(new QueryWrapper<SystemLoginLog>()
                        .select(" COMPANY_ID ")
                        .isNotNull(" COMPANY_ID ")
                        .isNotNull(" COMPANY_USER_ID ")
                        .apply(" LOGIN_TIME like concat(date_format(NOW(), '%Y-%m'),'%') ")
                        .eq("ORGIN",2)
                        .groupBy(" COMPANY_ID ")
                        .having(" count(1) > 1 ")
                ).size()
        );
        return stagingLoginVO;
    }
}
server/src/main/java/doumeemes/service/system/impl/SystemUserServiceImpl.java
@@ -4,6 +4,10 @@
import com.github.pagehelper.PageInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.ext.dto.ActivityLoginDTO;
import doumeemes.dao.ext.dto.CompanyLoginDTO;
import doumeemes.dao.ext.vo.ActivityLoginVO;
import doumeemes.dao.ext.vo.CompanyLoginStatisticsVO;
import doumeemes.dao.system.SystemUserMapper;
import doumeemes.dao.system.dto.QuerySystemUserDTO;
import doumeemes.dao.system.model.SystemUser;
@@ -188,4 +192,21 @@
            injectIds(pool, child);
        }
    }
    @Override
    public List<ActivityLoginVO> activityLoginVOList(ActivityLoginDTO activityLoginDTO) {
        return systemUserMapper.activityLoginVOList(activityLoginDTO);
    }
    @Override
    public PageData<CompanyLoginStatisticsVO> companyLoginStatisticsPage(PageWrap<CompanyLoginDTO> pageWrap) {
        // æ‰§è¡ŒæŸ¥è¯¢
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        List<CompanyLoginStatisticsVO> companyLoginStatisticsList = systemUserMapper.companyLoginStatisticsList(pageWrap.getModel());
        return PageData.from(new PageInfo<>(companyLoginStatisticsList));
    }
}
server/src/main/resources/mappers/SystemUserMapper.xml
@@ -18,6 +18,7 @@
      <result column="UPDATE_USER_NAME" property="username"/>
    </association>
  </resultMap>
  <select id="selectManageList" parameterType="doumeemes.dao.system.dto.QuerySystemUserDTO" resultMap="SystemUserListVO">
    SELECT
      DISTINCT
@@ -65,4 +66,55 @@
    ${orderByClause}
  </select>
  <resultMap id="ActivityLoginVO" type="doumeemes.dao.ext.vo.ActivityLoginVO" autoMapping="true">
    <id column="ID" property="id"/>
  </resultMap>
  <select id="activityLoginVOList" parameterType="doumeemes.dao.ext.dto.ActivityLoginDTO" resultMap="ActivityLoginVO">
    select a.DATA_DATE , count(1)  as dayActiveUserNum from ( SELECT DATE_FORMAT( DATE_ADD(CONCAT(#{dto.startDate}), INTERVAL(help_topic_id) DAY),'%Y-%m-%d')  DATA_DATE
    FROM mysql.help_topic
    WHERE  TIMESTAMPDIFF(DAY,CONCAT(#{dto.startDate}),CONCAT(#{dto.endDate})) > help_topic_id )  a
    left join
    ( SELECT  s.*   FROM `system_login_log` s where s.COMPANY_ID is not null and s.COMPANY_USER_ID is not null
      <if test="dto.orgin != null">
        AND s.orgin = #{dto.orgin}
      </if>
        ) b
    on a.DATA_DATE = date_format(b.LOGIN_TIME , '%Y-%m-%d')
    where 1 = 1
    group by a.DATA_DATE
  </select>
  <resultMap id="CompanyLoginStatisticsVO" type="doumeemes.dao.ext.vo.CompanyLoginStatisticsVO" autoMapping="true">
    <id column="ID" property="id"/>
  </resultMap>
  <select id="companyLoginStatisticsList" parameterType="doumeemes.dao.ext.dto.CompanyLoginDTO" resultMap="CompanyLoginStatisticsVO">
    SELECT date_format(s.LOGIN_TIME, '%Y-%m-%d') as dataDate ,c.`NAME` as companyName ,s.orgin , count(1)  as loginNum
    FROM `system_login_log` s left join company c on s.COMPANY_ID = c.ID
    <where>
      s.COMPANY_ID is not null
      <if test="dto.orgin != null">
        AND s.orgin = #{dto.orgin}
      </if>
      <if test="dto.companyName != null and dto.companyName != ''">
        AND c.`NAME` LIKE CONCAT('%', #{dto.companyName}, '%')
      </if>
      <if test="dto.queryMonth != null and dto.queryMonth != ''">
        AND s.LOGIN_TIME LIKE CONCAT('%', #{dto.queryMonth}, '%')
      </if>
    </where>
    group by S.COMPANY_ID , date_format(s.LOGIN_TIME, '%Y-%m-%d') ,c.`NAME` ,s.orgin
    order by s.LOGIN_TIME  desc , c.`NAME` desc
  </select>
</mapper>