he2802 2 anni fa
parent
commit
7958f1f29f
22 ha cambiato i file con 1862 aggiunte e 60 eliminazioni
  1. 119 0
      zhongzheng-admin-data/src/main/java/com/zhongzheng/controller/common/UserStudyLogController.java
  2. 1 1
      zhongzheng-admin-data/src/main/java/com/zhongzheng/core/config/SwaggerConfig.java
  3. 197 58
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  4. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  5. 82 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogAddBo.java
  6. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogEditBo.java
  7. 110 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogQueryBo.java
  8. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogAddBo.java
  9. 85 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogEditBo.java
  10. 101 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogQueryBo.java
  11. 71 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/domain/CdUserExamLog.java
  12. 63 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/domain/CdUserStudyLog.java
  13. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/mapper/CdUserExamLogMapper.java
  14. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/mapper/CdUserStudyLogMapper.java
  15. 56 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/ICdUserExamLogService.java
  16. 59 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/ICdUserStudyLogService.java
  17. 138 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/impl/CdUserExamLogServiceImpl.java
  18. 160 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/impl/CdUserStudyLogServiceImpl.java
  19. 104 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/vo/CdUserExamLogVo.java
  20. 129 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/vo/CdUserStudyLogVo.java
  21. 67 0
      zhongzheng-system/src/main/resources/mapper/modules/cd/log/CdUserExamLogMapper.xml
  22. 97 0
      zhongzheng-system/src/main/resources/mapper/modules/cd/log/CdUserStudyLogMapper.xml

+ 119 - 0
zhongzheng-admin-data/src/main/java/com/zhongzheng/controller/common/UserStudyLogController.java

@@ -0,0 +1,119 @@
+package com.zhongzheng.controller.common;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogAddBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogEditBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo;
+import com.zhongzheng.modules.cd.service.ICdUserExamLogService;
+import com.zhongzheng.modules.cd.service.ICdUserStudyLogService;
+import com.zhongzheng.modules.cd.vo.CdUserExamLogVo;
+import com.zhongzheng.modules.cd.vo.CdUserStudyLogVo;
+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 ruoyi
+ * @date 2023-09-12
+ */
+@Api(value = "用户学习记录控制器", tags = {"用户学习记录管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/common/free/ranking/log")
+public class UserStudyLogController extends BaseController {
+
+    private final ICdUserStudyLogService iCdUserStudyLogService;
+
+    private final ICdUserExamLogService iCdUserExamLogService;
+
+    /**
+     * 查询用户学习记录列表
+     */
+    @ApiOperation("查询用户学习记录排行榜")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/study/list")
+    public TableDataInfo<CdUserStudyLogVo> list(CdUserStudyLogQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+           throw new CustomException("签名错误");
+        }
+        startPage();
+        List<CdUserStudyLogVo> list = iCdUserStudyLogService.getStudyRanking(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询用户学习记录列表
+     */
+    @ApiOperation("查询用户学习试卷成绩排行榜")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/exam/list")
+    public TableDataInfo<CdUserExamLogVo> examList(CdUserExamLogQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        startPage();
+        List<CdUserExamLogVo> list = iCdUserExamLogService.getExamRanking(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询用户刷题排行榜")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/doExam/list")
+    public TableDataInfo<CdUserExamLogVo> doExamList(CdUserExamLogQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        startPage();
+        List<CdUserExamLogVo> list = iCdUserExamLogService.getExamDoRanking(bo);
+        return getDataTable(list);
+    }
+
+
+    @ApiOperation("查询用户周出勤排行榜")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/weekOnline/list")
+    public TableDataInfo<CdUserStudyLogVo> weekOnlineList(CdUserStudyLogQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        startPage();
+        List<CdUserStudyLogVo> list = iCdUserStudyLogService.getStudyOnLineRanking(bo);
+        return getDataTable(list);
+    }
+
+
+    @ApiOperation("查询用户周学习报告")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/weekStudy/list")
+    public TableDataInfo<CdUserStudyLogVo> weekStudyList(CdUserStudyLogQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            throw new CustomException("签名错误");
+        }
+        startPage();
+        List<CdUserStudyLogVo> list = iCdUserStudyLogService.getStudyWeekList(bo);
+        return getDataTable(list);
+    }
+}

+ 1 - 1
zhongzheng-admin-data/src/main/java/com/zhongzheng/core/config/SwaggerConfig.java

@@ -124,7 +124,7 @@ public class SwaggerConfig
         // 用ApiInfoBuilder进行定制
         return new ApiInfoBuilder()
                 // 设置标题
-                .title("标题:中正SAAS客户管理系统_接口文档")
+                .title("标题:中正SAAS中控数据管理系统_接口文档")
                 // 描述
                 .description("描述:用于中正SAAS客户管理系统_接口文档")
                 // 作者信息

+ 197 - 58
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -7,10 +7,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.DayOfWeek;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
@@ -27,6 +24,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String YYYY_MM_DD = "yyyy-MM-dd";
 
+    public static String YYYYMMDD = "yyyyMMdd";
+
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
@@ -121,6 +120,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(date, "yyyy/MM/dd");
     }
 
+    public static Date timeToDate(Long times){
+        long t = times.longValue();
+        t = t * 1000;
+        return new Date(t);
+    }
+
+    public static String timestampToDateFormatMonth(Long times){
+        if(Validator.isEmpty(times)){
+            return "";
+        }
+        long t = times.longValue();
+        t = t * 1000;
+        Date date = new Date(t);
+        return DateFormatUtils.format(date, "MM月dd号");
+    }
+
+    public static String timestampToDateFormatMonthTwo(Long times){
+        if(Validator.isEmpty(times)){
+            return "";
+        }
+        long t = times.longValue();
+        t = t * 1000;
+        Date date = new Date(t);
+        return DateFormatUtils.format(date, "MM.dd");
+    }
+
     public static String timestampToDateFormat(Long times,String patternStr){
         if(Validator.isEmpty(times)){
             return "";
@@ -131,6 +156,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(date, patternStr);
     }
 
+
+    /**
+     * 将秒转为时分秒格式【01:01:01】
+     * @param second 需要转化的秒数
+     * @return
+     */
+    public static String secondConvertHourMinSecond(Long second) {
+        String str = "";
+        if (second == null || second < 0) {
+            return str;
+        }
+
+        // 得到小时
+        long h = second / 3600;
+        str = h > 0 ? ((h < 10 ? ("0" + h) : h) + "时") : "";
+
+        // 得到分钟
+        long m = (second % 3600) / 60;
+        str += m > 0? (m < 10 ? ("0" + m) : m) + "分":"";
+
+        //得到剩余秒
+        long s = second % 60;
+        str += s > 0?(s < 10 ? ("0" + s) : s)+"秒":"";
+        return str;
+    }
+
     public static String timestampToDate(Long times){
         if(Validator.isEmpty(times)){
             return "";
@@ -226,7 +277,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String formatDate(Date time,String str)
     {
-       SimpleDateFormat sdf = new SimpleDateFormat(str);
+        SimpleDateFormat sdf = new SimpleDateFormat(str);
         return sdf.format(time);
     }
 
@@ -329,6 +380,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return "P"+getDateOrderSn();
     }
 
+    public static String getInvoiceOrderSn()
+    {
+        DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String localDate = (LocalDateTime.now().format(ofPattern)).substring(2);
+        //随机数
+        String randomNumeric = RandomStringUtils.randomNumeric(4);
+        return "IN"+localDate+randomNumeric;
+
+    }
+
+    public static String getTagOrderSn(String tag)
+    {
+        return tag+getDateOrderSn();
+    }
+
     public static String secToTime(int time) {
         String timeStr = null;
         int hour = 0;
@@ -343,8 +409,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
                 timeStr = "00:"+unitFormat(minute) + ":" + unitFormat(second);
             } else {
                 hour = minute / 60;
-                if (hour > 99)
+                if (hour > 99){
                     return "99:59:59";
+                }
                 minute = minute % 60;
                 second = time - hour * 3600 - minute * 60;
                 timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second);
@@ -371,48 +438,84 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return hh*60*60+mi*60+ss;
     }
 
-    /**
-     * 指定时间往前或往后推n天
-     *
-     * @param dateTime 指定时间
-     * @param x 指定天数
-     * @return
-     */
-    public static Long getDayBefore(Long dateTime, int x) {
-        Calendar c = Calendar.getInstance();
-        Date date = new Date(dateTime*1000);
-        c.setTime(date);
-        int day = c.get(Calendar.DATE);
-        c.set(Calendar.DATE, day - x);    //往前推几天
-        //c.set(Calendar.DATE, day + x);  往后推几天
-        return c.getTime().getTime()/1000;
+    public static Integer dayBetween(Long s1,Long s2) {
+        String date1str = timestampToDateFormat(s1);
+        String date2str = timestampToDateFormat(s2);
+        int count = 0;
+        if("".equals(date1str) || date1str == null || "".equals(date2str) || date2str == null) {
+            return count;
+        }
+        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
+        try {
+            Date date1 = format.parse(date1str);
+            Date date2 = format.parse(date2str);
+            count = ((int) ((date1.getTime() - date2.getTime()) / (1000*3600*24)));
+            return count;
+        }catch (Exception e){
+            return null;
+        }
     }
 
-    /**
-     * 指定时间往前或往后推n天
-     *
-     * @param dateTime 指定时间
-     * @param x 指定天数
-     * @return
-     */
-    public static Long getDayAfter(Long dateTime, int x) {
-        Calendar c = Calendar.getInstance();
-        Date date = new Date(dateTime*1000);
-        c.setTime(date);
-        int day = c.get(Calendar.DATE);
-//        c.set(Calendar.DATE, day - x);    //往前推几天
-        c.set(Calendar.DATE, day + x);  //往后推几天
-        return c.getTime().getTime()/1000;
+    public static  Integer getTodayWeek(){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        int weekIdx = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+        switch (weekIdx) {
+            case 1:
+                return 1;
+            case 2:
+                return 2;
+            case 3:
+                return 3;
+            case 4:
+                return 4;
+            case 5:
+                return 5;
+            case 6:
+                return 6;
+            default:
+                return 7;
+        }
     }
 
-    public static Date timeToDate(Long times){
-        long t = times.longValue();
-        t = t * 1000;
-        return new Date(t);
+
+    public static LocalDate[] getDateArray() {
+        // 创建一个长度为30的数组
+        LocalDate[] dates = new LocalDate[30];
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+        // 用循环给数组赋值
+        for (int i = 0; i < dates.length; i++) {
+            // 用today.plusDays(i)得到第i天的日期
+            dates[i] = today.plusDays(i);
+        }
+        // 返回数组
+        return dates;
     }
 
     static List<String> holiday =new ArrayList<>();
     static List<String> extraWorkDay =new ArrayList<>();
+    public static Boolean isWorkingDay(long time) {
+        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of("+8"));
+        String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        initHoliday();
+        initExtraWorkDay();
+        //是否加班日
+        if(extraWorkDay.contains(formatTime)){
+            return true;
+        }
+        //是否节假日
+        if(holiday.contains(formatTime)){
+            return false;
+        }
+        //如果是1-5表示周一到周五  是工作日
+        DayOfWeek week = dateTime.getDayOfWeek();
+        if(week==DayOfWeek.SATURDAY||week==DayOfWeek.SUNDAY){
+            return false;
+        }
+        return true;
+
+    }
 
     /**
      *  初始化节假日
@@ -438,25 +541,61 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         extraWorkDay.add("2023-10-08");
     }
 
-    public static Boolean isWorkingDay(long time) {
-        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of("+8"));
-        String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        initHoliday();
-        initExtraWorkDay();
-        //是否加班日
-        if(extraWorkDay.contains(formatTime)){
-            return true;
-        }
-        //是否节假日
-        if(holiday.contains(formatTime)){
-            return false;
-        }
-        //如果是1-5表示周一到周五  是工作日
-        DayOfWeek week = dateTime.getDayOfWeek();
-        if(week==DayOfWeek.SATURDAY||week==DayOfWeek.SUNDAY){
-            return false;
+
+    public static Long getAppointTime(Long millisecond, Integer day) {
+        for (Integer i = 0; i < day; i++) {
+            Long dayAfter = getDayBefore(millisecond, 1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(timeToDate(dayAfter));
+            int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+            String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+
+            if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
+                day += 1;
+
+            }
+            //判断当前是否为工作日
+            if (!isWorkingDay(dayAfter)) {
+                day += 1;
+            }
+            millisecond = dayAfter;
         }
-        return true;
 
+        return millisecond;
+    }
+
+    /**
+     * 指定时间往前或往后推n天
+     *
+     * @param dateTime 指定时间
+     * @param x 指定天数
+     * @return
+     */
+    public static Long getDayBefore(Long dateTime, int x) {
+        Calendar c = Calendar.getInstance();
+        Date date = new Date(dateTime*1000);
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day - x);    //往前推几天
+        //c.set(Calendar.DATE, day + x);  往后推几天
+        return c.getTime().getTime()/1000;
+    }
+
+    /**
+     * 指定时间往前或往后推n天
+     *
+     * @param dateTime 指定时间
+     * @param x 指定天数
+     * @return
+     */
+    public static Long getDayAfter(Long dateTime, int x) {
+        Calendar c = Calendar.getInstance();
+        Date date = new Date(dateTime*1000);
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+//        c.set(Calendar.DATE, day - x);    //往前推几天
+        c.set(Calendar.DATE, day + x);  //往后推几天
+        return c.getTime().getTime()/1000;
     }
+
 }

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java

@@ -493,7 +493,7 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         String keyValue = bo.getKeyValue();
         if (Validator.isNotEmpty(keyValue)) {
             Map<String, String> maps = JSONObject.parseObject(keyValue, Map.class);
-            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post;
+            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post,sex;
             LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
             if (maps.containsKey("idcard")) {
@@ -552,6 +552,12 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
                     objectLambdaUpdateWrapper.set(User::getJob, apply_post);
                 }
             }
+            if (maps.containsKey("sex")) {
+                sex = JSONObject.parseObject(String.valueOf(maps.get("sex")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(sex)){
+                    objectLambdaUpdateWrapper.set(User::getSex, sex.equals("男")?1:2);
+                }
+            }
             objectLambdaUpdateWrapper.set(User::getUpdateTime, DateUtils.getNowTime());
             iUserService.update(null, objectLambdaUpdateWrapper);
         }

+ 82 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogAddBo.java

@@ -0,0 +1,82 @@
+package com.zhongzheng.modules.cd.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+import java.math.BigDecimal;
+
+/**
+ * 用户商品的做题记录添加对象 cd_user_exam_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户商品的做题记录添加对象")
+public class CdUserExamLogAddBo {
+
+    /** 真实姓名 */
+    @ApiModelProperty("真实姓名")
+    private String realname;
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 新B端培训计划ID */
+    @ApiModelProperty("新B端培训计划ID")
+    private Long planId;
+    /** 手机号码 */
+    @ApiModelProperty("手机号码")
+    private String telphone;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 商品ID */
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+    /** 统计日期时间 */
+    @ApiModelProperty("统计日期时间")
+    private Long dateTime;
+    /** 0 失效 1启用 */
+    @ApiModelProperty("0 失效 1启用")
+    private Integer status;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 头像 */
+    @ApiModelProperty("头像")
+    private String avatar;
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+    /** 试卷总题数(含主观题) */
+    @ApiModelProperty("试卷总题数(含主观题)")
+    private Long totalQuestionNum;
+    /** 做对总题数 */
+    @ApiModelProperty("做对总题数")
+    private Long rightQuestionNum;
+    /** 做的题目数(含主观题) */
+    @ApiModelProperty("做的题目数(含主观题)")
+    private Long doQuestionNum;
+    /** 做错题目数 */
+    @ApiModelProperty("做错题目数")
+    private Long errorQuestionNum;
+    /** 总分 */
+    @ApiModelProperty("总分")
+    private BigDecimal totalScore;
+    /** 得分 */
+    @ApiModelProperty("得分")
+    private Long performance;
+    /** 来源平台 1新系统 2旧系统 */
+    @ApiModelProperty("来源平台 1新系统 2旧系统")
+    private Integer fromPlat;
+}

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogEditBo.java

@@ -0,0 +1,102 @@
+package com.zhongzheng.modules.cd.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户商品的做题记录编辑对象 cd_user_exam_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户商品的做题记录编辑对象")
+public class CdUserExamLogEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 真实姓名 */
+    @ApiModelProperty("真实姓名")
+    private String realname;
+
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+
+    /** 新B端培训计划ID */
+    @ApiModelProperty("新B端培训计划ID")
+    private Long planId;
+
+    /** 手机号码 */
+    @ApiModelProperty("手机号码")
+    private String telphone;
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 商品ID */
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    /** 统计日期时间 */
+    @ApiModelProperty("统计日期时间")
+    private Long dateTime;
+
+    /** 0 失效 1启用 */
+    @ApiModelProperty("0 失效 1启用")
+    private Integer status;
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+
+    /** 头像 */
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    /** 试卷总题数(含主观题) */
+    @ApiModelProperty("试卷总题数(含主观题)")
+    private Long totalQuestionNum;
+
+    /** 做对总题数 */
+    @ApiModelProperty("做对总题数")
+    private Long rightQuestionNum;
+
+    /** 做的题目数(含主观题) */
+    @ApiModelProperty("做的题目数(含主观题)")
+    private Long doQuestionNum;
+
+    /** 做错题目数 */
+    @ApiModelProperty("做错题目数")
+    private Long errorQuestionNum;
+
+    /** 总分 */
+    @ApiModelProperty("总分")
+    private BigDecimal totalScore;
+
+    /** 得分 */
+    @ApiModelProperty("得分")
+    private Long performance;
+
+    /** 来源平台 1新系统 2旧系统 */
+    @ApiModelProperty("来源平台 1新系统 2旧系统")
+    private Integer fromPlat;
+
+}

+ 110 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserExamLogQueryBo.java

@@ -0,0 +1,110 @@
+package com.zhongzheng.modules.cd.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 java.math.BigDecimal;
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 用户商品的做题记录分页查询对象 cd_user_exam_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户商品的做题记录分页查询对象")
+public class CdUserExamLogQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 真实姓名 */
+	@ApiModelProperty("真实姓名")
+	private String realname;
+	/** 身份证号 */
+	@ApiModelProperty("身份证号")
+	private String idCard;
+	/** 录单订单编号 */
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 新B端培训计划ID */
+	@ApiModelProperty("新B端培训计划ID")
+	private Long planId;
+	/** 手机号码 */
+	@ApiModelProperty("手机号码")
+	private String telphone;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 商品ID */
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
+	/** 统计日期时间 */
+	@ApiModelProperty("统计日期时间")
+	private Long dateTime;
+	/** 0 失效 1启用 */
+	@ApiModelProperty("0 失效 1启用")
+	private Integer status;
+	/** 头像 */
+	@ApiModelProperty("头像")
+	private String avatar;
+	/** 商品名称 */
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 试卷总题数(含主观题) */
+	@ApiModelProperty("试卷总题数(含主观题)")
+	private Long totalQuestionNum;
+	/** 做对总题数 */
+	@ApiModelProperty("做对总题数")
+	private Long rightQuestionNum;
+	/** 做的题目数(含主观题) */
+	@ApiModelProperty("做的题目数(含主观题)")
+	private Long doQuestionNum;
+	/** 做错题目数 */
+	@ApiModelProperty("做错题目数")
+	private Long errorQuestionNum;
+	/** 总分 */
+	@ApiModelProperty("总分")
+	private BigDecimal totalScore;
+	/** 得分 */
+	@ApiModelProperty("得分")
+	private Long performance;
+	/** 来源平台 1新系统 2旧系统 */
+	@ApiModelProperty("来源平台 1新系统 2旧系统")
+	private Integer fromPlat;
+	@ApiModelProperty("1 倒序 2升序")
+	private Integer desc;
+
+	@ApiModelProperty("开始时间")
+	private Long startTime;
+	@ApiModelProperty("结束时间")
+	private Long endTime;
+	@ApiModelProperty("当前时间戳")
+	@NotBlank(message = "当前时间戳不能为空")
+	private Long stamp;
+
+	@ApiModelProperty("签名")
+	@NotBlank(message = "签名不能为空")
+	private String sign;
+}

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogAddBo.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.cd.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 用户学习记录添加对象 cd_user_study_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户学习记录添加对象")
+public class CdUserStudyLogAddBo {
+
+    /** 真实姓名 */
+    @ApiModelProperty("真实姓名")
+    private String realname;
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 新B端培训计划ID */
+    @ApiModelProperty("新B端培训计划ID")
+    private Long planId;
+    /** 手机号码 */
+    @ApiModelProperty("手机号码")
+    private String telphone;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 商品ID */
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+    /** 总学时 */
+    @ApiModelProperty("总学时")
+    private Long totalClassHour;
+    /** 已学学时 */
+    @ApiModelProperty("已学学时")
+    private Long studyClassHour;
+    /** 统计日期时间 */
+    @ApiModelProperty("统计日期时间")
+    private Long dateTime;
+    /** 0 失效 1启用 */
+    @ApiModelProperty("0 失效 1启用")
+    private Integer status;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 头像 */
+    @ApiModelProperty("头像")
+    private String avatar;
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+    /** 来源平台 1新系统 2旧系统 */
+    @ApiModelProperty("来源平台 1新系统 2旧系统")
+    private Integer fromPlat;
+}

+ 85 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogEditBo.java

@@ -0,0 +1,85 @@
+package com.zhongzheng.modules.cd.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 用户学习记录编辑对象 cd_user_study_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户学习记录编辑对象")
+public class CdUserStudyLogEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 真实姓名 */
+    @ApiModelProperty("真实姓名")
+    private String realname;
+
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+
+    /** 新B端培训计划ID */
+    @ApiModelProperty("新B端培训计划ID")
+    private Long planId;
+
+    /** 手机号码 */
+    @ApiModelProperty("手机号码")
+    private String telphone;
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 商品ID */
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    /** 总学时 */
+    @ApiModelProperty("总学时")
+    private Long totalClassHour;
+
+    /** 已学学时 */
+    @ApiModelProperty("已学学时")
+    private Long studyClassHour;
+
+    /** 统计日期时间 */
+    @ApiModelProperty("统计日期时间")
+    private Long dateTime;
+
+    /** 0 失效 1启用 */
+    @ApiModelProperty("0 失效 1启用")
+    private Integer status;
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+
+    /** 头像 */
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    /** 来源平台 1新系统 2旧系统 */
+    @ApiModelProperty("来源平台 1新系统 2旧系统")
+    private Integer fromPlat;
+
+}

+ 101 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/bo/CdUserStudyLogQueryBo.java

@@ -0,0 +1,101 @@
+package com.zhongzheng.modules.cd.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;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 用户学习记录分页查询对象 cd_user_study_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户学习记录分页查询对象")
+public class CdUserStudyLogQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 真实姓名 */
+	@ApiModelProperty("真实姓名")
+	private String realname;
+	/** 身份证号 */
+	@ApiModelProperty("身份证号")
+	private String idCard;
+	/** 录单订单编号 */
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 新B端培训计划ID */
+	@ApiModelProperty("新B端培训计划ID")
+	private Long planId;
+	/** 手机号码 */
+	@ApiModelProperty("手机号码")
+	private String telphone;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 商品ID */
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
+	/** 总学时 */
+	@ApiModelProperty("总学时")
+	private Long totalClassHour;
+	/** 已学学时 */
+	@ApiModelProperty("已学学时")
+	private Long studyClassHour;
+	/** 统计日期时间 */
+	@ApiModelProperty("统计日期时间")
+	private Long dateTime;
+	/** 0 失效 1启用 */
+	@ApiModelProperty("0 失效 1启用")
+	private Integer status;
+	/** 头像 */
+	@ApiModelProperty("头像")
+	private String avatar;
+	/** 商品名称 */
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 来源平台 1新系统 2旧系统 */
+	@ApiModelProperty("来源平台 1新系统 2旧系统")
+	private Integer fromPlat;
+	@ApiModelProperty("1 倒序 2升序")
+	private Integer desc;
+
+	@ApiModelProperty("开始时间")
+	private Long startTime;
+	@ApiModelProperty("结束时间")
+	private Long endTime;
+	@ApiModelProperty("周出勤总天数")
+	private Integer dayNum;
+
+	@ApiModelProperty("当前时间戳")
+	@NotBlank(message = "当前时间戳不能为空")
+	private Long stamp;
+
+	@ApiModelProperty("签名")
+	@NotBlank(message = "签名不能为空")
+	private String sign;
+
+}

+ 71 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/domain/CdUserExamLog.java

@@ -0,0 +1,71 @@
+package com.zhongzheng.modules.cd.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;
+
+/**
+ * 用户商品的做题记录对象 cd_user_exam_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("cd_user_exam_log")
+public class CdUserExamLog implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 真实姓名 */
+    private String realname;
+    /** 身份证号 */
+    private String idCard;
+    /** 录单订单编号 */
+    private String inputOrderSn;
+    /** 新B端培训计划ID */
+    private Long planId;
+    /** 手机号码 */
+    private String telphone;
+    /** 用户ID */
+    private Long userId;
+    /** 商品ID */
+    private Long goodsId;
+    /** 统计日期时间 */
+    private Long dateTime;
+    /** 0 失效 1启用 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 头像 */
+    private String avatar;
+    /** 商品名称 */
+    private String goodsName;
+    /** 试卷总题数(含主观题) */
+    private Long totalQuestionNum;
+    /** 做对总题数 */
+    private Long rightQuestionNum;
+    /** 做的题目数(含主观题) */
+    private Long doQuestionNum;
+    /** 做错题目数 */
+    private Long errorQuestionNum;
+    /** 总分 */
+    private BigDecimal totalScore;
+    /** 得分 */
+    private Long performance;
+    /** 来源平台 1新系统 2旧系统 */
+    private Integer fromPlat;
+}

+ 63 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/domain/CdUserStudyLog.java

@@ -0,0 +1,63 @@
+package com.zhongzheng.modules.cd.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;
+
+/**
+ * 用户学习记录对象 cd_user_study_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("cd_user_study_log")
+public class CdUserStudyLog implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 真实姓名 */
+    private String realname;
+    /** 身份证号 */
+    private String idCard;
+    /** 录单订单编号 */
+    private String inputOrderSn;
+    /** 新B端培训计划ID */
+    private Long planId;
+    /** 手机号码 */
+    private String telphone;
+    /** 用户ID */
+    private Long userId;
+    /** 商品ID */
+    private Long goodsId;
+    /** 总学时 */
+    private Long totalClassHour;
+    /** 已学学时 */
+    private Long studyClassHour;
+    /** 统计日期时间 */
+    private Long dateTime;
+    /** 0 失效 1启用 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 头像 */
+    private String avatar;
+    /** 商品名称 */
+    private String goodsName;
+    /** 来源平台 1新系统 2旧系统 */
+    private Integer fromPlat;
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/mapper/CdUserExamLogMapper.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.cd.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserExamLog;
+import com.zhongzheng.modules.cd.vo.CdUserExamLogVo;
+import com.zhongzheng.modules.cd.vo.CdUserStudyLogVo;
+
+import java.util.List;
+
+/**
+ * 用户商品的做题记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+public interface CdUserExamLogMapper extends BaseMapper<CdUserExamLog> {
+    List<CdUserExamLogVo> getExamRanking(CdUserExamLogQueryBo bo);
+
+    List<CdUserExamLogVo> getExamDoRanking(CdUserExamLogQueryBo bo);
+}

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/mapper/CdUserStudyLogMapper.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.cd.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserStudyLog;
+import com.zhongzheng.modules.cd.vo.CdUserStudyLogVo;
+
+import java.util.List;
+
+/**
+ * 用户学习记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+public interface CdUserStudyLogMapper extends BaseMapper<CdUserStudyLog> {
+
+    List<CdUserStudyLogVo> getStudyRanking(CdUserStudyLogQueryBo bo);
+
+    List<CdUserStudyLogVo> getStudyOnLineRanking(CdUserStudyLogQueryBo bo);
+
+    List<CdUserStudyLogVo> getStudyWeekList(CdUserStudyLogQueryBo bo);
+}

+ 56 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/ICdUserExamLogService.java

@@ -0,0 +1,56 @@
+package com.zhongzheng.modules.cd.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogAddBo;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogEditBo;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserExamLog;
+import com.zhongzheng.modules.cd.vo.CdUserExamLogVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户商品的做题记录Service接口
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+public interface ICdUserExamLogService extends IService<CdUserExamLog> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	CdUserExamLogVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<CdUserExamLogVo> queryList(CdUserExamLogQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入用户商品的做题记录
+	 * @param bo 用户商品的做题记录新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(CdUserExamLogAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改用户商品的做题记录
+	 * @param bo 用户商品的做题记录编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(CdUserExamLogEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+	List<CdUserExamLogVo> getExamRanking(CdUserExamLogQueryBo bo);
+
+	List<CdUserExamLogVo> getExamDoRanking(CdUserExamLogQueryBo bo);
+}

+ 59 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/ICdUserStudyLogService.java

@@ -0,0 +1,59 @@
+package com.zhongzheng.modules.cd.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogAddBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogEditBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserStudyLog;
+import com.zhongzheng.modules.cd.vo.CdUserStudyLogVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户学习记录Service接口
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+public interface ICdUserStudyLogService extends IService<CdUserStudyLog> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	CdUserStudyLogVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<CdUserStudyLogVo> queryList(CdUserStudyLogQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入用户学习记录
+	 * @param bo 用户学习记录新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(CdUserStudyLogAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改用户学习记录
+	 * @param bo 用户学习记录编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(CdUserStudyLogEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+	List<CdUserStudyLogVo> getStudyRanking(CdUserStudyLogQueryBo bo);
+
+	List<CdUserStudyLogVo> getStudyOnLineRanking(CdUserStudyLogQueryBo bo);
+
+	List<CdUserStudyLogVo> getStudyWeekList(CdUserStudyLogQueryBo bo);
+}

+ 138 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/impl/CdUserExamLogServiceImpl.java

@@ -0,0 +1,138 @@
+package com.zhongzheng.modules.cd.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogAddBo;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogEditBo;
+import com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserExamLog;
+import com.zhongzheng.modules.cd.mapper.CdUserExamLogMapper;
+import com.zhongzheng.modules.cd.service.ICdUserExamLogService;
+import com.zhongzheng.modules.cd.vo.CdUserExamLogVo;
+import org.springframework.beans.factory.annotation.Value;
+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 ruoyi
+ * @date 2023-09-12
+ */
+@Service
+public class CdUserExamLogServiceImpl extends ServiceImpl<CdUserExamLogMapper, CdUserExamLog> implements ICdUserExamLogService {
+
+    @Value("${aliyun.oss.endpoint}")
+    private String ossHost;
+
+    @Override
+    public CdUserExamLogVo queryById(Long id){
+        CdUserExamLog db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, CdUserExamLogVo.class);
+    }
+
+    @Override
+    public List<CdUserExamLogVo> queryList(CdUserExamLogQueryBo bo) {
+        LambdaQueryWrapper<CdUserExamLog> lqw = Wrappers.lambdaQuery();
+        lqw.like(StrUtil.isNotBlank(bo.getRealname()), CdUserExamLog::getRealname, bo.getRealname());
+        lqw.eq(StrUtil.isNotBlank(bo.getIdCard()), CdUserExamLog::getIdCard, bo.getIdCard());
+        lqw.eq(StrUtil.isNotBlank(bo.getInputOrderSn()), CdUserExamLog::getInputOrderSn, bo.getInputOrderSn());
+        lqw.eq(bo.getPlanId() != null, CdUserExamLog::getPlanId, bo.getPlanId());
+        lqw.eq(StrUtil.isNotBlank(bo.getTelphone()), CdUserExamLog::getTelphone, bo.getTelphone());
+        lqw.eq(bo.getUserId() != null, CdUserExamLog::getUserId, bo.getUserId());
+        lqw.eq(bo.getGoodsId() != null, CdUserExamLog::getGoodsId, bo.getGoodsId());
+        lqw.eq(bo.getDateTime() != null, CdUserExamLog::getDateTime, bo.getDateTime());
+        lqw.eq(bo.getStatus() != null, CdUserExamLog::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getAvatar()), CdUserExamLog::getAvatar, bo.getAvatar());
+        lqw.like(StrUtil.isNotBlank(bo.getGoodsName()), CdUserExamLog::getGoodsName, bo.getGoodsName());
+        lqw.eq(bo.getTotalQuestionNum() != null, CdUserExamLog::getTotalQuestionNum, bo.getTotalQuestionNum());
+        lqw.eq(bo.getRightQuestionNum() != null, CdUserExamLog::getRightQuestionNum, bo.getRightQuestionNum());
+        lqw.eq(bo.getDoQuestionNum() != null, CdUserExamLog::getDoQuestionNum, bo.getDoQuestionNum());
+        lqw.eq(bo.getErrorQuestionNum() != null, CdUserExamLog::getErrorQuestionNum, bo.getErrorQuestionNum());
+        lqw.eq(bo.getTotalScore() != null, CdUserExamLog::getTotalScore, bo.getTotalScore());
+        lqw.eq(bo.getPerformance() != null, CdUserExamLog::getPerformance, bo.getPerformance());
+        lqw.eq(bo.getFromPlat() != null, CdUserExamLog::getFromPlat, bo.getFromPlat());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<CdUserExamLogVo> entity2Vo(Collection<CdUserExamLog> collection) {
+        List<CdUserExamLogVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, CdUserExamLogVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<CdUserExamLog> page = (Page<CdUserExamLog>)collection;
+            Page<CdUserExamLogVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(CdUserExamLogAddBo bo) {
+        CdUserExamLog add = BeanUtil.toBean(bo, CdUserExamLog.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(CdUserExamLogEditBo bo) {
+        CdUserExamLog update = BeanUtil.toBean(bo, CdUserExamLog.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(CdUserExamLog entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    @Override
+    public List<CdUserExamLogVo> getExamRanking(CdUserExamLogQueryBo bo) {
+        List<CdUserExamLogVo> list = baseMapper.getExamRanking(bo);
+        for(CdUserExamLogVo vo : list){
+            vo.setAvatar(ossHost+"/"+vo.getAvatar());
+        }
+        return list;
+    }
+
+    @Override
+    public List<CdUserExamLogVo> getExamDoRanking(CdUserExamLogQueryBo bo) {
+        List<CdUserExamLogVo> list = baseMapper.getExamDoRanking(bo);
+        for(CdUserExamLogVo vo : list){
+            vo.setAvatar(ossHost+"/"+vo.getAvatar());
+        }
+        return list;
+    }
+}

+ 160 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/service/impl/CdUserStudyLogServiceImpl.java

@@ -0,0 +1,160 @@
+package com.zhongzheng.modules.cd.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogAddBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogEditBo;
+import com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo;
+import com.zhongzheng.modules.cd.domain.CdUserStudyLog;
+import com.zhongzheng.modules.cd.mapper.CdUserStudyLogMapper;
+import com.zhongzheng.modules.cd.service.ICdUserStudyLogService;
+import com.zhongzheng.modules.cd.vo.CdUserStudyLogVo;
+import org.springframework.beans.factory.annotation.Value;
+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.math.BigDecimal;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户学习记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Service
+public class CdUserStudyLogServiceImpl extends ServiceImpl<CdUserStudyLogMapper, CdUserStudyLog> implements ICdUserStudyLogService {
+
+    @Value("${aliyun.oss.endpoint}")
+    private String ossHost;
+
+    @Override
+    public CdUserStudyLogVo queryById(Long id){
+        CdUserStudyLog db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, CdUserStudyLogVo.class);
+    }
+
+    @Override
+    public List<CdUserStudyLogVo> queryList(CdUserStudyLogQueryBo bo) {
+        LambdaQueryWrapper<CdUserStudyLog> lqw = Wrappers.lambdaQuery();
+        lqw.like(StrUtil.isNotBlank(bo.getRealname()), CdUserStudyLog::getRealname, bo.getRealname());
+        lqw.eq(StrUtil.isNotBlank(bo.getIdCard()), CdUserStudyLog::getIdCard, bo.getIdCard());
+        lqw.eq(StrUtil.isNotBlank(bo.getInputOrderSn()), CdUserStudyLog::getInputOrderSn, bo.getInputOrderSn());
+        lqw.eq(bo.getPlanId() != null, CdUserStudyLog::getPlanId, bo.getPlanId());
+        lqw.eq(StrUtil.isNotBlank(bo.getTelphone()), CdUserStudyLog::getTelphone, bo.getTelphone());
+        lqw.eq(bo.getUserId() != null, CdUserStudyLog::getUserId, bo.getUserId());
+        lqw.eq(bo.getGoodsId() != null, CdUserStudyLog::getGoodsId, bo.getGoodsId());
+        lqw.eq(bo.getTotalClassHour() != null, CdUserStudyLog::getTotalClassHour, bo.getTotalClassHour());
+        lqw.eq(bo.getStudyClassHour() != null, CdUserStudyLog::getStudyClassHour, bo.getStudyClassHour());
+        lqw.eq(bo.getDateTime() != null, CdUserStudyLog::getDateTime, bo.getDateTime());
+        lqw.eq(bo.getStatus() != null, CdUserStudyLog::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getAvatar()), CdUserStudyLog::getAvatar, bo.getAvatar());
+        lqw.like(StrUtil.isNotBlank(bo.getGoodsName()), CdUserStudyLog::getGoodsName, bo.getGoodsName());
+        lqw.eq(bo.getFromPlat() != null, CdUserStudyLog::getFromPlat, bo.getFromPlat());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<CdUserStudyLogVo> entity2Vo(Collection<CdUserStudyLog> collection) {
+        List<CdUserStudyLogVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, CdUserStudyLogVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<CdUserStudyLog> page = (Page<CdUserStudyLog>)collection;
+            Page<CdUserStudyLogVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(CdUserStudyLogAddBo bo) {
+        CdUserStudyLog add = BeanUtil.toBean(bo, CdUserStudyLog.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(CdUserStudyLogEditBo bo) {
+        CdUserStudyLog update = BeanUtil.toBean(bo, CdUserStudyLog.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(CdUserStudyLog entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    @Override
+    public List<CdUserStudyLogVo> getStudyRanking(CdUserStudyLogQueryBo bo) {
+        List<CdUserStudyLogVo> list = baseMapper.getStudyRanking(bo);
+        for(CdUserStudyLogVo log : list ){
+            log.setAvatar(ossHost+"/"+log.getAvatar());
+        }
+        return list;
+    }
+
+    @Override
+    public List<CdUserStudyLogVo> getStudyOnLineRanking(CdUserStudyLogQueryBo bo) {
+        if(Validator.isEmpty(bo.getStartTime())){
+            throw new CustomException("参数缺失");
+        }
+        bo.setDayNum(DateUtils.dayBetween(bo.getStartTime(),bo.getEndTime()));
+        List<CdUserStudyLogVo> list = baseMapper.getStudyOnLineRanking(bo);
+        for(CdUserStudyLogVo log : list ){
+            log.setAvatar(ossHost+"/"+log.getAvatar());
+        }
+        return list;
+    }
+
+    @Override
+    public List<CdUserStudyLogVo> getStudyWeekList(CdUserStudyLogQueryBo bo) {
+        if(Validator.isEmpty(bo.getStartTime())||Validator.isEmpty(bo.getEndTime())||Validator.isEmpty(bo.getPlanId())){
+            throw new CustomException("参数缺失");
+        }
+        bo.setDayNum(DateUtils.dayBetween(bo.getStartTime(),bo.getEndTime()));
+        List<CdUserStudyLogVo> list = baseMapper.getStudyWeekList(bo);
+        for(CdUserStudyLogVo log : list ){
+            log.setAvatar(ossHost+"/"+log.getAvatar());
+            if(Validator.isNotEmpty(log.getTotalQuestionNum())&&log.getTotalQuestionNum().compareTo(BigDecimal.ZERO)>0){
+                log.setEstimationPassRate((log.getRightQuestionNum().multiply(log.getDoQuestionNum())).divide((log.getTotalQuestionNum().multiply(log.getTotalQuestionNum()))));
+            }else{
+                log.setEstimationPassRate(new BigDecimal(0));
+            }
+            log.setRealPassRate(new BigDecimal(0));
+        }
+        return list;
+    }
+}

+ 104 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/vo/CdUserExamLogVo.java

@@ -0,0 +1,104 @@
+package com.zhongzheng.modules.cd.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 用户商品的做题记录视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户商品的做题记录视图对象")
+public class CdUserExamLogVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 真实姓名 */
+	@Excel(name = "真实姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+	/** 身份证号 */
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+	/** 录单订单编号 */
+	@Excel(name = "录单订单编号")
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 新B端培训计划ID */
+	@Excel(name = "新B端培训计划ID")
+	@ApiModelProperty("新B端培训计划ID")
+	private Long planId;
+	/** 手机号码 */
+	@Excel(name = "手机号码")
+	@ApiModelProperty("手机号码")
+	private String telphone;
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 商品ID */
+	@Excel(name = "商品ID")
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
+	/** 统计日期时间 */
+	@Excel(name = "统计日期时间")
+	@ApiModelProperty("统计日期时间")
+	private Long dateTime;
+	/** 0 失效 1启用 */
+	@Excel(name = "0 失效 1启用")
+	@ApiModelProperty("0 失效 1启用")
+	private Integer status;
+	/** 头像 */
+	@Excel(name = "头像")
+	@ApiModelProperty("头像")
+	private String avatar;
+	/** 商品名称 */
+	@Excel(name = "商品名称")
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 试卷总题数(含主观题) */
+	@Excel(name = "试卷总题数(含主观题)")
+	@ApiModelProperty("试卷总题数(含主观题)")
+	private Long totalQuestionNum;
+	/** 做对总题数 */
+	@Excel(name = "做对总题数")
+	@ApiModelProperty("做对总题数")
+	private Long rightQuestionNum;
+	/** 做的题目数(含主观题) */
+	@Excel(name = "做的题目数(含主观题)")
+	@ApiModelProperty("做的题目数(含主观题)")
+	private Long doQuestionNum;
+	/** 做错题目数 */
+	@Excel(name = "做错题目数")
+	@ApiModelProperty("做错题目数")
+	private Long errorQuestionNum;
+	/** 总分 */
+	@Excel(name = "总分")
+	@ApiModelProperty("总分")
+	private BigDecimal totalScore;
+	/** 得分 */
+	@Excel(name = "得分")
+	@ApiModelProperty("得分")
+	private Long performance;
+	/** 来源平台 1新系统 2旧系统 */
+	@Excel(name = "来源平台 1新系统 2旧系统")
+	@ApiModelProperty("来源平台 1新系统 2旧系统")
+	private Integer fromPlat;
+	@ApiModelProperty("试卷正确率")
+	private BigDecimal questionRate;
+	@ApiModelProperty("刷题率")
+	private BigDecimal doQuestionRate;
+}

+ 129 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/cd/vo/CdUserStudyLogVo.java

@@ -0,0 +1,129 @@
+package com.zhongzheng.modules.cd.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 org.apache.poi.hpsf.Decimal;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+
+/**
+ * 用户学习记录视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户学习记录视图对象")
+public class CdUserStudyLogVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 真实姓名 */
+	@Excel(name = "真实姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+	/** 身份证号 */
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+	/** 录单订单编号 */
+	@Excel(name = "录单订单编号")
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+	/** 新B端培训计划ID */
+	@Excel(name = "新B端培训计划ID")
+	@ApiModelProperty("新B端培训计划ID")
+	private Long planId;
+	/** 手机号码 */
+	@Excel(name = "手机号码")
+	@ApiModelProperty("手机号码")
+	private String telphone;
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 商品ID */
+	@Excel(name = "商品ID")
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
+	/** 总学时 */
+	@Excel(name = "总学时")
+	@ApiModelProperty("总学时")
+	private Long totalClassHour;
+	/** 已学学时 */
+	@Excel(name = "已学学时")
+	@ApiModelProperty("已学学时")
+	private Long studyClassHour;
+	/** 统计日期时间 */
+	@Excel(name = "统计日期时间")
+	@ApiModelProperty("统计日期时间")
+	private Long dateTime;
+	/** 0 失效 1启用 */
+	@Excel(name = "0 失效 1启用")
+	@ApiModelProperty("0 失效 1启用")
+	private Integer status;
+	/** 头像 */
+	@Excel(name = "头像")
+	@ApiModelProperty("头像")
+	private String avatar;
+	/** 商品名称 */
+	@Excel(name = "商品名称")
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 来源平台 1新系统 2旧系统 */
+	@Excel(name = "来源平台 1新系统 2旧系统")
+	@ApiModelProperty("来源平台 1新系统 2旧系统")
+	private Integer fromPlat;
+	@ApiModelProperty("课时进度")
+	private BigDecimal classRate;
+	/** 试卷总题数(含主观题) */
+	@Excel(name = "试卷总题数(含主观题)")
+	@ApiModelProperty("试卷总题数(含主观题)")
+	private BigDecimal totalQuestionNum;
+	/** 做对总题数 */
+	@Excel(name = "做对总题数")
+	@ApiModelProperty("做对总题数")
+	private BigDecimal rightQuestionNum;
+	/** 做的题目数(含主观题) */
+	@Excel(name = "做的题目数(含主观题)")
+	@ApiModelProperty("做的题目数(含主观题)")
+	private BigDecimal doQuestionNum;
+	/** 做错题目数 */
+	@Excel(name = "做错题目数")
+	@ApiModelProperty("做错题目数")
+	private BigDecimal errorQuestionNum;
+	/** 总分 */
+	@Excel(name = "总分")
+	@ApiModelProperty("总分")
+	private BigDecimal totalScore;
+	/** 得分 */
+	@Excel(name = "得分")
+	@ApiModelProperty("得分")
+	private Long performance;
+	@ApiModelProperty("试卷正确率")
+	private BigDecimal questionRate;
+	@ApiModelProperty("刷题率")
+	private BigDecimal doQuestionRate;
+
+	@ApiModelProperty("今天上线时间")
+	private Long onlineTime;
+	@ApiModelProperty("今天学习时长")
+	private Long studyTime;
+	@ApiModelProperty("周出勤率")
+	private BigDecimal onlineRate;
+
+	@ApiModelProperty("预估通过勤率")
+	private BigDecimal estimationPassRate;
+
+	@ApiModelProperty("实际通过勤率")
+	private BigDecimal realPassRate;
+}

+ 67 - 0
zhongzheng-system/src/main/resources/mapper/modules/cd/log/CdUserExamLogMapper.xml

@@ -0,0 +1,67 @@
+<?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.cd.mapper.CdUserExamLogMapper">
+
+    <select id="getExamRanking" parameterType="com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo" resultType="com.zhongzheng.modules.cd.vo.CdUserExamLogVo">
+        SELECT
+        any_value ( avatar ) avatar,
+        any_value ( realname ) realname,
+        any_value ( telphone ) telphone,(
+        SUM( right_question_num )/ SUM( total_question_num ))  question_rate
+        FROM
+        cd_user_study_log
+        WHERE
+        1=1
+        <if test="planId != null and planId != ''">
+            AND plan_id = #{planId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND (date_time BETWEEN #{startTime} and #{endTime})
+        </if>
+        <if test="inputOrderSn != null and inputOrderSn != ''">
+            AND input_order_sn = #{inputOrderSn}
+        </if>
+        GROUP BY
+        user_id
+
+        <if test="desc != null and desc == 1">
+            ORDER BY  question_rate DESC
+        </if>
+        <if test="desc != null and desc == 2">
+            ORDER BY question_rate ASC
+        </if>
+    </select>
+
+    <select id="getExamDoRanking" parameterType="com.zhongzheng.modules.cd.bo.CdUserExamLogQueryBo" resultType="com.zhongzheng.modules.cd.vo.CdUserExamLogVo">
+        SELECT
+        any_value ( avatar ) avatar,
+        any_value ( realname ) realname,
+        any_value ( telphone ) telphone,(
+        SUM( do_question_num )/ SUM( total_question_num ))  do_question_rate
+        FROM
+        cd_user_study_log
+        WHERE
+        1=1
+        <if test="planId != null and planId != ''">
+            AND plan_id = #{planId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND (date_time BETWEEN #{startTime} and #{endTime})
+        </if>
+        <if test="inputOrderSn != null and inputOrderSn != ''">
+            AND input_order_sn = #{inputOrderSn}
+        </if>
+        GROUP BY
+        user_id
+
+        <if test="desc != null and desc == 1">
+            ORDER BY  do_question_rate DESC
+        </if>
+        <if test="desc != null and desc == 2">
+            ORDER BY do_question_rate ASC
+        </if>
+    </select>
+
+</mapper>

+ 97 - 0
zhongzheng-system/src/main/resources/mapper/modules/cd/log/CdUserStudyLogMapper.xml

@@ -0,0 +1,97 @@
+<?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.cd.mapper.CdUserStudyLogMapper">
+
+    <select id="getStudyRanking" parameterType="com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo" resultType="com.zhongzheng.modules.cd.vo.CdUserStudyLogVo">
+        SELECT
+            any_value ( avatar ) avatar,
+            any_value ( realname ) realname,
+            any_value ( telphone ) telphone,(
+                SUM( study_class_hour )/ SUM( total_class_hour ))  class_rate
+        FROM
+            cd_user_study_log
+        WHERE
+              1=1
+        <if test="planId != null and planId != ''">
+            AND plan_id = #{planId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND (date_time BETWEEN #{startTime} and #{endTime})
+        </if>
+        <if test="inputOrderSn != null and inputOrderSn != ''">
+            AND input_order_sn = #{inputOrderSn}
+        </if>
+        GROUP BY
+            user_id
+
+        <if test="desc != null and desc == 1">
+            ORDER BY  class_rate DESC
+        </if>
+        <if test="desc != null and desc == 2">
+            ORDER BY class_rate ASC
+        </if>
+    </select>
+
+    <select id="getStudyOnLineRanking" parameterType="com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo" resultType="com.zhongzheng.modules.cd.vo.CdUserStudyLogVo">
+        SELECT
+        any_value ( avatar ) avatar,
+        any_value ( realname ) realname,
+        any_value ( telphone ) telphone,
+        (SUM(IF(online_time IS NULL,0,1))  / #{dayNum})  online_rate
+        FROM
+        cd_user_study_log
+        WHERE
+        1=1
+        <if test="planId != null and planId != ''">
+            AND plan_id = #{planId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND (date_time BETWEEN #{startTime} and #{endTime})
+        </if>
+        <if test="inputOrderSn != null and inputOrderSn != ''">
+            AND input_order_sn = #{inputOrderSn}
+        </if>
+        GROUP BY
+        user_id
+
+        <if test="desc != null and desc == 1">
+            ORDER BY  online_rate DESC
+        </if>
+        <if test="desc != null and desc == 2">
+            ORDER BY online_rate ASC
+        </if>
+    </select>
+
+
+    <select id="getStudyWeekRanking" parameterType="com.zhongzheng.modules.cd.bo.CdUserStudyLogQueryBo" resultType="com.zhongzheng.modules.cd.vo.CdUserStudyLogVo">
+        SELECT
+        any_value ( avatar ) avatar,
+        any_value ( realname ) realname,
+        any_value ( telphone ) telphone,
+        any_value ( goods_name ) goods_name,
+        SUM( study_time ) study_time,
+        MAX( total_class_hour ) total_class_hour,
+        MAX( study_class_hour ) study_class_hour,
+        MAX( do_question_num ) do_question_num,
+        MAX( right_question_num ) right_question_num,
+        MAX( total_question_num ) total_question_num
+        FROM
+        cd_user_study_log
+        WHERE
+        1=1
+        <if test="planId != null and planId != ''">
+            AND plan_id = #{planId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND (date_time BETWEEN #{startTime} and #{endTime})
+        </if>
+        <if test="inputOrderSn != null and inputOrderSn != ''">
+            AND input_order_sn = #{inputOrderSn}
+        </if>
+        GROUP BY
+        user_id,
+        goods_id
+    </select>
+</mapper>