瀏覽代碼

add 用户统计

he2802 3 年之前
父節點
當前提交
6b9fd5ebb2
共有 28 個文件被更改,包括 1171 次插入15 次删除
  1. 16 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java
  2. 12 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java
  3. 67 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserStudyLogController.java
  4. 55 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserVisitLogController.java
  5. 88 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyLogController.java
  6. 97 6
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  7. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  8. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserQueryBo.java
  9. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogAddBo.java
  10. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogEditBo.java
  11. 75 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogQueryBo.java
  12. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserVisitLogQueryBo.java
  13. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  14. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyLog.java
  15. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyLogMapper.java
  16. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  17. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyLogService.java
  18. 115 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyLogServiceImpl.java
  19. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserVisitLogServiceImpl.java
  20. 82 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserExportVo.java
  21. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserStatstVo.java
  22. 71 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserStudyLogVo.java
  23. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVisitLogVo.java
  24. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java
  25. 12 2
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  26. 40 1
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  27. 59 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyLogMapper.xml
  28. 0 2
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

+ 16 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java

@@ -8,7 +8,9 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.goods.vo.ExportLiveGoodsVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.service.IClassGradeInterfaceService;
 import com.zhongzheng.modules.grade.service.IClassGradeService;
@@ -28,7 +30,9 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 班级Controller
@@ -62,6 +66,18 @@ public class ClassStudentController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询學員用户列表
+     */
+    @ApiOperation("导出學員用户列表")
+    @PreAuthorize("@ss.hasPermi('app:user:list')")
+    @GetMapping("/listStudentExport")
+    public AjaxResult<UserExportVo> listStudentExport(UserQueryBo bo) {
+        List<UserExportVo> list = iUserService.selectListExport(bo);
+        ExcelUtil<UserExportVo> util = new ExcelUtil<>(UserExportVo.class);
+        return util.exportExcel(list,"导出學員用户列表");
+    }
+
 
     /**
      * 修改客户端用户

+ 12 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -15,10 +15,7 @@ import com.zhongzheng.modules.course.vo.CourseSectionImport;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.vo.UserIdCardBatchVo;
-import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
-import com.zhongzheng.modules.user.vo.UserSubscribeExport;
-import com.zhongzheng.modules.user.vo.UserVo;
+import com.zhongzheng.modules.user.vo.*;
 import io.netty.util.internal.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -57,6 +54,17 @@ public class UserController extends BaseController {
 
     private final IAliSmsService iSmsService;
 
+    /**
+     * 查询客户端用户列表
+     */
+    @ApiOperation("统计查询客户端用户列表")
+    @PreAuthorize("@ss.hasPermi('app:user:list')")
+    @GetMapping("/stats_list")
+    public AjaxResult<List<UserStatstVo>> statsList(UserQueryBo bo) {
+        List<UserStatstVo> list = iUserService.statsList(bo);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 查询客户端用户列表
      */

+ 67 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserStudyLogController.java

@@ -0,0 +1,67 @@
+package com.zhongzheng.controller.user;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.bo.UserStudyLogAddBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserStudyLogService;
+import com.zhongzheng.modules.user.vo.UserStudyLogVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户视频学习日志Controller
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Api(value = "用户视频学习日志控制器", tags = {"用户视频学习日志管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/study/log")
+public class UserStudyLogController extends BaseController {
+
+    private final IUserStudyLogService iUserStudyLogService;
+
+    private final WxTokenService wxTokenService;
+
+    /**
+     * 查询用户视频学习日志列表
+     */
+    @ApiOperation("查询用户视频学习日志列表")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/list")
+    public TableDataInfo<UserStudyLogVo> list(UserStudyLogQueryBo bo) {
+        startPage();
+        List<UserStudyLogVo> list = iUserStudyLogService.getList(bo);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 获取用户视频学习日志详细信息
+     */
+    @ApiOperation("获取用户视频学习日志详细信息")
+    @PreAuthorize("@ss.hasPermi('system:log:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<UserStudyLogVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iUserStudyLogService.queryById(id));
+    }
+
+
+
+
+}

+ 55 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserVisitLogController.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.controller.user;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.user.bo.UserVisitLogQueryBo;
+import com.zhongzheng.modules.user.service.IUserVisitLogService;
+import com.zhongzheng.modules.user.vo.UserVisitLogVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 用户访问日志Controller
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Api(value = "用户访问日志控制器", tags = {"用户访问日志管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/visit/log")
+public class UserVisitLogController extends BaseController {
+
+    private final IUserVisitLogService iUserVisitLogService;
+
+    /**
+     * 查询用户访问日志列表
+     */
+    @ApiOperation("查询用户访问日志列表")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/list")
+    public TableDataInfo<UserVisitLogVo> list(UserVisitLogQueryBo bo) {
+        startPage();
+        List<UserVisitLogVo> list = iUserVisitLogService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+}

+ 88 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyLogController.java

@@ -0,0 +1,88 @@
+package com.zhongzheng.controller.user;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.bo.UserStudyLogAddBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogEditBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserStudyLogService;
+import com.zhongzheng.modules.user.vo.UserStudyLogVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 用户视频学习日志Controller
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Api(value = "用户视频学习日志控制器", tags = {"用户视频学习日志管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/study/log")
+public class UserStudyLogController extends BaseController {
+
+    private final IUserStudyLogService iUserStudyLogService;
+
+    private final WxTokenService wxTokenService;
+
+    /**
+     * 查询用户视频学习日志列表
+     */
+    @ApiOperation("查询用户视频学习日志列表")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/list")
+    public TableDataInfo<UserStudyLogVo> list(UserStudyLogQueryBo bo) {
+        startPage();
+        List<UserStudyLogVo> list = iUserStudyLogService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 获取用户视频学习日志详细信息
+     */
+    @ApiOperation("获取用户视频学习日志详细信息")
+    @PreAuthorize("@ss.hasPermi('system:log:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<UserStudyLogVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iUserStudyLogService.queryById(id));
+    }
+
+    /**
+     * 新增用户视频学习日志
+     */
+    @ApiOperation("新增用户视频学习日志")
+    @PreAuthorize("@ss.hasPermi('system:log:add')")
+    @Log(title = "用户视频学习日志", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody UserStudyLogAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserStudyLogService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+
+}

+ 97 - 6
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -38,16 +38,13 @@ import com.zhongzheng.modules.goods.vo.GoodsUserVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
+import com.zhongzheng.modules.inform.domain.InformSysUser;
 import com.zhongzheng.modules.order.domain.OrderBillGoods;
 import com.zhongzheng.modules.user.bo.*;
-import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.domain.UserBankRecord;
-import com.zhongzheng.modules.user.domain.UserSchoolInfo;
+import com.zhongzheng.modules.user.domain.*;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
-import com.zhongzheng.modules.user.service.IUserPlanService;
-import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.service.IUserUpdateService;
+import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.*;
 import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -114,6 +111,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private IUserVisitLogService iUserVisitLogService;
+
+    @Autowired
+    private IUserStudyLogService iUserStudyLogService;
+
 
     @Override
     public UserVo queryById(Long userId) {
@@ -188,6 +191,94 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return list;
     }
 
+    @Override
+    public List<UserStatstVo> statsList(UserQueryBo bo) {
+        List<UserStatstVo> list = new ArrayList<>();
+        if(Validator.isNotEmpty(bo.getStatsStartTime())&&Validator.isNotEmpty(bo.getStatsEndTime())){
+            Long time = bo.getStatsStartTime();
+            Long endTime = bo.getStatsEndTime()+24*3600;
+            Integer peopleNum = count(new LambdaQueryWrapper<User>()
+                    .eq(User::getStatus,1));
+            while (time<endTime){
+                Long time1 = time;
+                Long time2 = time + 24*3600 -1;
+                UserStatstVo statstVo = new UserStatstVo();
+                statstVo.setDate(DateUtils.timestampToDate(time));
+                statstVo.setAllNum(peopleNum);
+                statstVo.setAddNum(count(new LambdaQueryWrapper<User>()
+                        .eq(User::getStatus,1).between(User::getCreateTime,time1,time2)));
+                statstVo.setVisitAllNum(iUserVisitLogService.count(new LambdaQueryWrapper<UserVisitLog>().between(UserVisitLog::getCreateTime,time1,time2)));
+                statstVo.setVisitSmallNum(iUserVisitLogService.count(new LambdaQueryWrapper<UserVisitLog>()
+                        .eq(UserVisitLog::getFromPlat,1).between(UserVisitLog::getCreateTime,time1,time2)));
+                statstVo.setVisitPcNum(iUserVisitLogService.count(new LambdaQueryWrapper<UserVisitLog>()
+                        .eq(UserVisitLog::getFromPlat,2).between(UserVisitLog::getCreateTime,time1,time2)));
+                statstVo.setStudyAllNum(iUserStudyLogService.count(new LambdaQueryWrapper<UserStudyLog>().between(UserStudyLog::getCreateTime,time1,time2)));
+                statstVo.setStudySmallNum(iUserStudyLogService.count(new LambdaQueryWrapper<UserStudyLog>()
+                        .eq(UserStudyLog::getFromPlat,1).between(UserStudyLog::getCreateTime,time1,time2)));
+                statstVo.setStudyPcNum(iUserStudyLogService.count(new LambdaQueryWrapper<UserStudyLog>()
+                        .eq(UserStudyLog::getFromPlat,2).between(UserStudyLog::getCreateTime,time1,time2)));
+                list.add(statstVo);
+                time+=24*3600;
+            }
+        }
+
+        return list;
+    }
+
+    @Override
+    public List<UserExportVo> selectListExport(UserQueryBo bo) {
+        bo.setGetOrderNum(1L);
+        List<UserVo> list = entity2UserVo(userMapper.selectList(bo));
+        List<UserExportVo> listExport = new ArrayList<>();
+        for (UserVo userVo : list) {
+            userVo.setStudentCode(userVo.getUserAccount());
+            ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
+            classGradeUserQueryBo.setUserId(userVo.getUserId());
+            List<Integer> status = new ArrayList<>();
+            status.add(1);
+            classGradeUserQueryBo.setStatus(status);
+            List<ClassGradeUserGoodsVo> classGradeUserGoodsVos = iClassGradeUserService.listUser(classGradeUserQueryBo);
+            userVo.setClassGradeUserGoodsVoList(classGradeUserGoodsVos);
+            userVo.setOrderNum(userVo.getGoodsCourseNum());
+            UserExportVo add = BeanUtil.toBean(userVo, UserExportVo.class);
+            if(Validator.isNotEmpty(userVo.getStudyFromPlat())&&userVo.getStudyFromPlat()==1){
+                add.setStudyFromPlat("小程序");
+            }
+            if(Validator.isNotEmpty(userVo.getStudyFromPlat())&&userVo.getStudyFromPlat()==2){
+                add.setStudyFromPlat("PC");
+            }
+            if(Validator.isNotEmpty(userVo.getVisitFromPlat())&&userVo.getVisitFromPlat()==1){
+                add.setStudyFromPlat("小程序");
+            }
+            if(Validator.isNotEmpty(userVo.getVisitFromPlat())&&userVo.getVisitFromPlat()==2){
+                add.setStudyFromPlat("PC");
+            }
+            add.setLastStudyTime(DateUtils.timestampToDate(userVo.getLastStudyTime()));
+            add.setLastVisitTime(DateUtils.timestampToDate(userVo.getLastVisitTime()));
+            if(Validator.isNotEmpty(userVo.getSex())&&userVo.getSex()==1){
+                add.setSex("男");
+            }
+            if(Validator.isNotEmpty(userVo.getSex())&&userVo.getSex()==2){
+                add.setSex("女");
+            }
+            if(Validator.isNotEmpty(userVo.getUserBindWx())&&userVo.getUserBindWx()==0){
+                add.setUserBindWx("否");
+            }
+            if(Validator.isNotEmpty(userVo.getUserBindWx())&&userVo.getUserBindWx()==1){
+                add.setUserBindWx("是");
+            }
+            if(Validator.isNotEmpty(userVo.getUserFollowWx())&&userVo.getUserFollowWx()==0){
+                add.setUserFollowWx("否");
+            }
+            if(Validator.isNotEmpty(userVo.getUserFollowWx())&&userVo.getUserFollowWx()==1){
+                add.setUserFollowWx("是");
+            }
+            add.setGradeNum(classGradeUserGoodsVos.size());
+            listExport.add(add);
+        }
+        return listExport;
+    }
+
     @Override
     public List<UserStudyRecordVo> selectStudyRecordList(UserStudyRecordQueryBo bo) {
         return userMapper.selectStudyRecordList(bo);

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java

@@ -208,4 +208,25 @@ public class ClassGradeStudentVo {
 	private Integer userFollowWx;
 	@ApiModelProperty("用户学习时长(秒)")
 	private Integer userStudyDuration;
+
+
+	@ApiModelProperty("已经使用学习机会")
+	private Integer useStudyCount;
+	/** 该商品下考试次数 */
+	@Excel(name = "该商品下考试次数")
+	@ApiModelProperty("该商品下考试次数")
+	private Long examNumber;
+	/** 该商品下前培次数 */
+	@Excel(name = "该商品下前培次数")
+	@ApiModelProperty("该商品下前培次数")
+	private Long doNumber;
+	/** 已消耗考试次数 */
+	@Excel(name = "已消耗考试次数")
+	@ApiModelProperty("已消耗考试次数")
+	private Long expendNumber;
+	/** 已消耗前培次数 */
+	@Excel(name = "已消耗前培次数")
+	@ApiModelProperty("已消耗前培次数")
+	private Long expendBefore;
+
 }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserQueryBo.java

@@ -182,4 +182,30 @@ public class UserQueryBo extends BaseEntity {
 	@ApiModelProperty("是否关注公众号 1是 0不是")
 	private Integer hasFollowWx;
 
+	@ApiModelProperty("最近访问来源平台 1小程序 2PC网站")
+	private Integer lastVisitPlat;
+
+	@ApiModelProperty("最近学习来源平台 1小程序 2PC网站")
+	private Integer lastStudyPlat;
+
+	@ApiModelProperty("所属班级名称")
+	private String gradeName;
+
+	@ApiModelProperty("访问开始时间")
+	private Long visitStartTime;
+
+	@ApiModelProperty("访问结束时间")
+	private Long visitEndTime;
+
+	@ApiModelProperty("学习开始时间")
+	private Long studyStartTime;
+
+	@ApiModelProperty("学习结束时间")
+	private Long studyEndTime;
+
+	@ApiModelProperty("统计开始时间")
+	private Long statsStartTime;
+
+	@ApiModelProperty("统计结束时间")
+	private Long statsEndTime;
 }

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogAddBo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 用户视频学习日志添加对象 user_study_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@ApiModel("用户视频学习日志添加对象")
+public class UserStudyLogAddBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long userId;
+    /** 课程ID */
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+    /** 节ID */
+    @ApiModelProperty("节ID")
+    private Long sectionId;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long updateTime;
+    /** 模块ID */
+    @ApiModelProperty("模块ID")
+    private Long moduleId;
+    /** 章ID */
+    @ApiModelProperty("章ID")
+    private Long chapterId;
+    /** 商品Id */
+    @ApiModelProperty("商品Id")
+    private Long goodsId;
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+    /** 来源平台 1小程序 2PC网站 */
+    @ApiModelProperty("来源平台 1小程序 2PC网站")
+    private String fromPlat;
+    /** 访问IP */
+    @ApiModelProperty("访问IP")
+    private String ip;
+    /** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
+    @ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+    private Integer goodsType;
+}

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogEditBo.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 用户视频学习日志编辑对象 user_study_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@ApiModel("用户视频学习日志编辑对象")
+public class UserStudyLogEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long userId;
+
+    /** 课程ID */
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    /** 节ID */
+    @ApiModelProperty("节ID")
+    private Long sectionId;
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long updateTime;
+
+
+    /** 模块ID */
+    @ApiModelProperty("模块ID")
+    private Long moduleId;
+
+    /** 章ID */
+    @ApiModelProperty("章ID")
+    private Long chapterId;
+
+    /** 商品Id */
+    @ApiModelProperty("商品Id")
+    private Long goodsId;
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    /** 来源平台 1小程序 2PC网站 */
+    @ApiModelProperty("来源平台 1小程序 2PC网站")
+    private String fromPlat;
+
+    /** 访问IP */
+    @ApiModelProperty("访问IP")
+    private String ip;
+
+    /** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
+    @ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+    private Integer goodsType;
+
+}

+ 75 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyLogQueryBo.java

@@ -0,0 +1,75 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 用户视频学习日志分页查询对象 user_study_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户视频学习日志分页查询对象")
+public class UserStudyLogQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** $column.columnComment */
+	@ApiModelProperty("$column.columnComment")
+	private Long userId;
+	/** 课程ID */
+	@ApiModelProperty("课程ID")
+	private Long courseId;
+	/** 节ID */
+	@ApiModelProperty("节ID")
+	private Long sectionId;
+	/** 模块ID */
+	@ApiModelProperty("模块ID")
+	private Long moduleId;
+	/** 章ID */
+	@ApiModelProperty("章ID")
+	private Long chapterId;
+	/** 商品Id */
+	@ApiModelProperty("商品Id")
+	private Long goodsId;
+	/** 订单商品ID */
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+	/** 来源平台 1小程序 2PC网站 */
+	@ApiModelProperty("来源平台 1小程序 2PC网站")
+	private String fromPlat;
+	/** 访问IP */
+	@ApiModelProperty("访问IP")
+	private String ip;
+	/** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+	private Integer goodsType;
+	/** 开始时间 */
+	@ApiModelProperty("开始时间")
+	private String startTime;
+	/** 结束时间 */
+	@ApiModelProperty("结束时间")
+	private String endTime;
+}

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserVisitLogQueryBo.java

@@ -45,4 +45,10 @@ public class UserVisitLogQueryBo extends BaseEntity {
 	/** 访问IP */
 	@ApiModelProperty("访问IP")
 	private String ip;
+	/** 开始时间 */
+	@ApiModelProperty("开始时间")
+	private String startTime;
+	/** 结束时间 */
+	@ApiModelProperty("结束时间")
+	private String endTime;
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java

@@ -200,4 +200,13 @@ private static final long serialVersionUID=1L;
     private Integer userBindWx;
     @TableField(exist = false)
     private Integer userFollowWx;
+
+    @TableField(exist = false)
+    private Long lastVisitTime;
+    @TableField(exist = false)
+    private Integer visitFromPlat;
+    @TableField(exist = false)
+    private Integer studyFromPlat;
+    @TableField(exist = false)
+    private Long lastStudyTime;
 }

+ 55 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyLog.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 用户视频学习日志对象 user_study_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_study_log")
+public class UserStudyLog implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** $column.columnComment */
+    private Long userId;
+    /** 课程ID */
+    private Long courseId;
+    /** 节ID */
+    private Long sectionId;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** $column.columnComment */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 模块ID */
+    private Long moduleId;
+    /** 章ID */
+    private Long chapterId;
+    /** 商品Id */
+    private Long goodsId;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /** 来源平台 1小程序 2PC网站 */
+    private String fromPlat;
+    /** 访问IP */
+    private String ip;
+    /** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
+    private Integer goodsType;
+}

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyLogMapper.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
+import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserStudyLog;
+import com.zhongzheng.modules.user.vo.UserStudyLogVo;
+import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
+
+import java.util.List;
+
+/**
+ * 用户视频学习日志Mapper接口
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+public interface UserStudyLogMapper extends BaseMapper<UserStudyLog> {
+    List<UserStudyLogVo> getList(UserStudyLogQueryBo bo);
+}

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java

@@ -36,6 +36,10 @@ public interface IUserService extends IService<User> {
 
 	List<UserVo> selectList(UserQueryBo bo);
 
+	List<UserStatstVo> statsList(UserQueryBo bo);
+
+	List<UserExportVo> selectListExport(UserQueryBo bo);
+
 	List<UserStudyRecordVo> selectStudyRecordList(UserStudyRecordQueryBo bo);
 
 

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyLogService.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.bo.UserStudyLogAddBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogEditBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
+import com.zhongzheng.modules.user.domain.UserStudyLog;
+import com.zhongzheng.modules.user.vo.UserStudyLogVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户视频学习日志Service接口
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+public interface IUserStudyLogService extends IService<UserStudyLog> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	UserStudyLogVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<UserStudyLogVo> queryList(UserStudyLogQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入用户视频学习日志
+	 * @param bo 用户视频学习日志新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(UserStudyLogAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改用户视频学习日志
+	 * @param bo 用户视频学习日志编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(UserStudyLogEditBo bo);
+
+	List<UserStudyLogVo> getList(UserStudyLogQueryBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 115 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyLogServiceImpl.java

@@ -0,0 +1,115 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ip.IpUtils;
+import com.zhongzheng.modules.user.bo.UserStudyLogAddBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogEditBo;
+import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
+import com.zhongzheng.modules.user.domain.UserStudyLog;
+import com.zhongzheng.modules.user.mapper.UserStudyLogMapper;
+import com.zhongzheng.modules.user.service.IUserStudyLogService;
+import com.zhongzheng.modules.user.vo.UserStudyLogVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户视频学习日志Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Service
+public class UserStudyLogServiceImpl extends ServiceImpl<UserStudyLogMapper, UserStudyLog> implements IUserStudyLogService {
+
+    @Override
+    public UserStudyLogVo queryById(Long id){
+        UserStudyLog db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, UserStudyLogVo.class);
+    }
+
+    @Override
+    public List<UserStudyLogVo> queryList(UserStudyLogQueryBo bo) {
+        LambdaQueryWrapper<UserStudyLog> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, UserStudyLog::getUserId, bo.getUserId());
+        lqw.eq(bo.getCourseId() != null, UserStudyLog::getCourseId, bo.getCourseId());
+        lqw.eq(bo.getSectionId() != null, UserStudyLog::getSectionId, bo.getSectionId());
+        lqw.eq(bo.getModuleId() != null, UserStudyLog::getModuleId, bo.getModuleId());
+        lqw.eq(bo.getChapterId() != null, UserStudyLog::getChapterId, bo.getChapterId());
+        lqw.eq(bo.getGoodsId() != null, UserStudyLog::getGoodsId, bo.getGoodsId());
+        lqw.eq(bo.getOrderGoodsId() != null, UserStudyLog::getOrderGoodsId, bo.getOrderGoodsId());
+        lqw.eq(StrUtil.isNotBlank(bo.getFromPlat()), UserStudyLog::getFromPlat, bo.getFromPlat());
+        lqw.eq(StrUtil.isNotBlank(bo.getIp()), UserStudyLog::getIp, bo.getIp());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<UserStudyLogVo> entity2Vo(Collection<UserStudyLog> collection) {
+        List<UserStudyLogVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, UserStudyLogVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<UserStudyLog> page = (Page<UserStudyLog>)collection;
+            Page<UserStudyLogVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(UserStudyLogAddBo bo) {
+        UserStudyLog add = BeanUtil.toBean(bo, UserStudyLog.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        add.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(UserStudyLogEditBo bo) {
+        UserStudyLog update = BeanUtil.toBean(bo, UserStudyLog.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    @Override
+    public List<UserStudyLogVo> getList(UserStudyLogQueryBo bo) {
+        return this.baseMapper.getList(bo);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(UserStudyLog entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserVisitLogServiceImpl.java

@@ -44,6 +44,7 @@ public class UserVisitLogServiceImpl extends ServiceImpl<UserVisitLogMapper, Use
         lqw.eq(bo.getUserId() != null, UserVisitLog::getUserId, bo.getUserId());
         lqw.eq(StrUtil.isNotBlank(bo.getFromPlat()), UserVisitLog::getFromPlat, bo.getFromPlat());
         lqw.eq(StrUtil.isNotBlank(bo.getIp()), UserVisitLog::getIp, bo.getIp());
+        lqw.between(bo.getStartTime() != null,UserVisitLog::getCreateTime,bo.getStartTime(),bo.getEndTime());
         return entity2Vo(this.list(lqw));
     }
 

+ 82 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserExportVo.java

@@ -0,0 +1,82 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 用户视图对象 mall_package
+ *
+ * @author change
+ * @date 2021-05-25
+ */
+@Data
+@ApiModel("用户视图对象")
+public class UserExportVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 账号 */
+	@Excel(name = "学员编号")
+	@ApiModelProperty("账号")
+	private String userAccount;
+
+	/** 真实姓名 */
+	@Excel(name = "学员姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+	/** 性别 */
+	@Excel(name = "性别")
+	@ApiModelProperty("性别")
+	private String sex;
+	/** 身份证号 */
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+	/** 手机号码 */
+	@Excel(name = "手机号码")
+	@ApiModelProperty("手机号码")
+	private String telphone;
+
+
+	/** 公司名称 */
+	@Excel(name = "公司名称")
+	@ApiModelProperty("公司名称")
+	private String companyName;
+
+	/** 商品视频数 */
+	@ApiModelProperty("商品视频数")
+	private Long goodsCourseNum;
+
+	/** 商品题库数 */
+	@ApiModelProperty("商品题库数")
+	private Long goodsBankNum;
+
+	@ApiModelProperty("商品直播数")
+	private Long goodsLiveNum;
+
+
+
+	@ApiModelProperty("用户是否绑定微信")
+	private String userBindWx;
+	@ApiModelProperty("用户是否关注微信")
+	private String userFollowWx;
+
+	@ApiModelProperty("用户最近访问时间")
+	private String lastVisitTime;
+	@ApiModelProperty("用户最近访问终端")
+	private String visitFromPlat;
+	@ApiModelProperty("用户最近学习终端")
+	private String studyFromPlat;
+	@ApiModelProperty("用户最近学习时间")
+	private String lastStudyTime;
+
+	@ApiModelProperty("所属班级数")
+	private Integer gradeNum;
+
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserStatstVo.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 用户视图对象 mall_package
+ *
+ * @author change
+ * @date 2021-05-25
+ */
+@Data
+@ApiModel("用户视图对象")
+public class UserStatstVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 账号 */
+	@Excel(name = "学员编号")
+	@ApiModelProperty("日期")
+	private String date;
+
+	@ApiModelProperty("学员总数")
+	private Integer allNum;
+
+	@ApiModelProperty("新增学员数")
+	private Integer addNum;
+
+	@ApiModelProperty("访问学员总数")
+	private Integer visitAllNum;
+
+	@ApiModelProperty("访问小程序学员总数")
+	private Integer visitSmallNum;
+
+	@ApiModelProperty("访问PC学员总数")
+	private Integer visitPcNum;
+
+	@ApiModelProperty("学习学员总数")
+	private Integer studyAllNum;
+
+	@ApiModelProperty("学习小程序学员总数")
+	private Integer studySmallNum;
+
+	@ApiModelProperty("学习PC学员总数")
+	private Integer studyPcNum;
+}

+ 71 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserStudyLogVo.java

@@ -0,0 +1,71 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 用户视频学习日志视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@ApiModel("用户视频学习日志视图对象")
+public class UserStudyLogVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** $column.columnComment */
+	@Excel(name = "${comment}" , readConverterExp = "$column.readConverterExp()")
+	@ApiModelProperty("$column.columnComment")
+	private Long userId;
+	/** 课程ID */
+	@Excel(name = "课程ID")
+	@ApiModelProperty("课程ID")
+	private Long courseId;
+	/** 节ID */
+	@Excel(name = "节ID")
+	@ApiModelProperty("节ID")
+	private Long sectionId;
+	/** 模块ID */
+	@Excel(name = "模块ID")
+	@ApiModelProperty("模块ID")
+	private Long moduleId;
+	/** 章ID */
+	@Excel(name = "章ID")
+	@ApiModelProperty("章ID")
+	private Long chapterId;
+	/** 商品Id */
+	@Excel(name = "商品Id")
+	@ApiModelProperty("商品Id")
+	private Long goodsId;
+	/** 订单商品ID */
+	@Excel(name = "订单商品ID")
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+	/** 来源平台 1小程序 2PC网站 */
+	@Excel(name = "来源平台 1小程序 2PC网站")
+	@ApiModelProperty("来源平台 1小程序 2PC网站")
+	private String fromPlat;
+	/** 访问IP */
+	@Excel(name = "访问IP")
+	@ApiModelProperty("访问IP")
+	private String ip;
+	/** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
+	@Excel(name = "商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+	private Integer goodsType;
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	@ApiModelProperty("访问时间")
+	private Long createTime;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVisitLogVo.java

@@ -36,4 +36,6 @@ public class UserVisitLogVo {
 	@Excel(name = "访问IP")
 	@ApiModelProperty("访问IP")
 	private String ip;
+	@ApiModelProperty("访问时间")
+	private Long createTime;
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java

@@ -253,6 +253,16 @@ public class UserVo {
 	@ApiModelProperty("用户是否关注微信")
 	private Integer userFollowWx;
 
+	@ApiModelProperty("用户最近访问时间")
+	private Long lastVisitTime;
+	@ApiModelProperty("用户最近访问终端1小程序 2PC网站")
+	private Integer visitFromPlat;
+	@ApiModelProperty("用户最近学习终端 1小程序 2PC网站")
+	private Integer studyFromPlat;
+	@ApiModelProperty("用户最近学习时间")
+	private Long lastStudyTime;
+
+
 	/** 1在职 0离职 */
 	@Excel(name = "班級")
 	@ApiModelProperty("班級")

+ 12 - 2
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -171,7 +171,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
         <result property="userBindWx" column="user_bind_wx"/>
         <result property="userFollowWx" column="user_follow_wx"/>
-        <result property="userStudyDuration" column="user_study_duration"/>
+        <result property="useStudyCount" column="use_study_count"/>
+        <result property="examNumber" column="exam_number"/>
+        <result property="doNumber" column="do_number"/>
+        <result property="expendNumber" column="expend_number"/>
+        <result property="expendBefore" column="expend_before"/>
     </resultMap>
 
 
@@ -408,7 +412,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         cpt.project_name,
         (case WHEN u.union_id is null then 0 ELSE 1 end) as user_bind_wx,
         (case WHEN uwf.gzh_open_id is null then 0 ELSE 1 end) as user_follow_wx,
-        (SELECT IFNULL(SUM(usr.study_duration),0) from user_study_record usr where usr.user_id = cgu.user_id and usr.grade_id = cgu.grade_id) as user_study_duration
+        (SELECT IFNULL(SUM(usr.study_duration),0) from user_study_record usr where usr.user_id = cgu.user_id and usr.grade_id = cgu.grade_id) as user_study_duration,
+        (SELECT count(*) from class_grade_user cgu where cgu.order_goods_id = og.order_goods_id) as use_study_count,
+        ueg.exam_number,
+        ueg.do_number,
+        ueg.expend_number,
+        ueg.expend_before
         FROM
         class_grade_user cgu
         LEFT JOIN class_grade cg ON cgu.grade_id = cg.grade_id
@@ -419,6 +428,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN course_business cb ON g.business_id = cb.id
         LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
         LEFT JOIN user_wx_follow uwf ON u.union_id = uwf.union_id
+        LEFT JOIN user_exam_goods ueg ON ueg.order_goods_id = og.order_goods_id
         where 1=1
 
         <if test="gradeId != null and gradeId !='' ">

+ 40 - 1
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -53,6 +53,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="goodsLiveNum" column="goods_live_num"/>
         <result property="userBindWx" column="user_bind_wx"/>
         <result property="userFollowWx" column="user_follow_wx"/>
+        <result property="lastVisitTime" column="last_visit_time"/>
+        <result property="visitFromPlat" column="visit_from_plat"/>
+        <result property="studyFromPlat" column="study_from_plat"/>
+        <result property="lastStudyTime" column="last_study_time"/>
     </resultMap>
 
 
@@ -145,7 +149,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         (case WHEN u.union_id is null then 0 ELSE 1 end) as user_bind_wx,
         (case WHEN uwf.gzh_open_id is null then 0 ELSE 1 end) as user_follow_wx
         <if test="getOrderNum != null and getOrderNum == 1" >
-        ,ou.goods_course_num,ou.goods_bank_num,ou.goods_live_num
+        ,ou.goods_course_num,ou.goods_bank_num,ou.goods_live_num,uvl.last_visit_time,uvl.visit_from_plat,usl.study_from_plat,usl.last_study_time
         </if>
         FROM
         `user` u
@@ -167,6 +171,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             GROUP BY
             o.user_id
             ) ou ON u.user_id = ou.user_id
+            LEFT JOIN (SELECT user_id,any_value(from_plat) visit_from_plat,any_value(create_time) last_visit_time from user_visit_log GROUP BY user_id)uvl on u.user_id = uvl.user_id
+            LEFT JOIN (SELECT user_id,any_value(from_plat) study_from_plat,any_value(create_time) last_study_time from user_study_log GROUP BY user_id)usl on u.user_id = usl.user_id
         </if>
         <if test="businessId != null and businessId != ''">
             LEFT JOIN `order` o ON u.user_id = o.user_id and o.`status` = 1
@@ -233,6 +239,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             FROM
             `order` o
             LEFT JOIN order_goods og on o.order_sn = og.order_sn
+            LEFT JOIN goods g on og.goods_id = g.goods_id
             where 1=1
             and og.`status` = 1
             and og.refund_status in (0,1,3)
@@ -274,6 +281,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="hasFollowWx != null and hasFollowWx == 0 ">
             AND uwf.gzh_open_id is null
         </if>
+        <if test="lastVisitPlat != null ">
+            AND uvl.visit_from_plat = #{lastVisitPlat}
+        </if>
+        <if test="lastStudyPlat != null ">
+            AND usl.study_from_plat = #{lastStudyPlat}
+        </if>
+        <if test="visitStartTime != null and visitStartTime !=''">
+            and uvl.last_visit_time >= #{visitStartTime}
+        </if>
+        <if test="visitEndTime != null and visitEndTime !=''">
+            and #{visitEndTime} >= uvl.last_visit_time
+        </if>
+        <if test="studyStartTime != null and studyStartTime !=''">
+            and usl.last_study_time >= #{studyStartTime}
+        </if>
+        <if test="studyEndTime != null and studyEndTime !=''">
+            and #{studyEndTime} >= usl.last_study_time
+        </if>
+        <if test="gradeName != null and gradeName != ''">
+            and ( SELECT
+            count(og.*)
+            FROM
+            `order` o
+            LEFT JOIN order_goods og on o.order_sn = og.order_sn
+            LEFT JOIN class_grade cg on cg.grade_id = og.grade_id
+            where 1=1
+            and og.`status` = 1
+            and og.refund_status in (0,1,3)
+            and og.pay_status in (2,3,4))
+            and (cg.class_name like concat('%', #{gradeName}, '%'))
+            and o.user_id = u.user_id)>0
+        </if>
     </select>
 
 

+ 59 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyLogMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhongzheng.modules.user.mapper.UserStudyLogMapper">
+
+    <resultMap type="com.zhongzheng.modules.user.domain.UserStudyLog" id="UserStudyLogResult">
+        <result property="id" column="id"/>
+        <result property="userId" column="user_id"/>
+        <result property="courseId" column="course_id"/>
+        <result property="sectionId" column="section_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="moduleId" column="module_id"/>
+        <result property="chapterId" column="chapter_id"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="fromPlat" column="from_plat"/>
+        <result property="ip" column="ip"/>
+        <result property="goodsType" column="goods_type"/>
+    </resultMap>
+
+    <resultMap type="com.zhongzheng.modules.user.vo.UserStudyLogVo" id="UserStudyLogVoResult">
+        <result property="id" column="id"/>
+        <result property="userId" column="user_id"/>
+        <result property="courseId" column="course_id"/>
+        <result property="sectionId" column="section_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moduleId" column="module_id"/>
+        <result property="chapterId" column="chapter_id"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="fromPlat" column="from_plat"/>
+        <result property="ip" column="ip"/>
+        <result property="goodsType" column="goods_type"/>
+        <result property="goodsName" column="goods_name"/>
+    </resultMap>
+
+    <select id="getList" parameterType="com.zhongzheng.modules.user.bo.UserStudyLogQueryBo"  resultMap="UserStudyLogVoResult">
+        SELECT
+            usl.*,
+            g.goods_name
+        FROM
+            user_study_log usl
+                LEFT JOIN goods g ON usl.goods_id = g.goods_id
+        WHERE
+            usl.user_id = #{userId}
+            <if test="endTime != null and endTime !=''">
+                and #{endTime} >= usl.create_time
+            </if>
+            <if test="startTime != null and startTime !=''">
+                and usl.create_time >= #{startTime}
+            </if>
+            <if test="fromPlat != null and fromPlat !=''">
+                and usl.from_plat = #{fromPlat}
+            </if>
+    </select>
+
+</mapper>

+ 0 - 2
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -167,8 +167,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
         ORDER BY record_id DESC LIMIT 30 ) temp
         LEFT JOIN course c ON temp.course_id = c.course_id
-
-
     </select>
 
     <select id="selectUserStudy" parameterType="map"  resultMap="UserStudyRecordResult">