he2802 3 yıl önce
ebeveyn
işleme
8f37664678
65 değiştirilmiş dosya ile 1083 ekleme ve 115 silme
  1. 17 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  2. 23 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  3. 1 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  4. 1 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  5. 1 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  6. 1 0
      zhongzheng-admin/src/main/resources/application.yml
  7. 4 4
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  8. 15 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/mock/MockApplyController.java
  9. 1 0
      zhongzheng-api/src/main/resources/application-dev.yml
  10. 1 0
      zhongzheng-api/src/main/resources/application-pre.yml
  11. 1 0
      zhongzheng-api/src/main/resources/application-prod.yml
  12. 1 0
      zhongzheng-api/src/main/resources/application.yml
  13. 13 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  14. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  15. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  16. 53 17
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  17. 13 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  18. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java
  19. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java
  20. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  21. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyVo.java
  22. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamUserApplyVo.java
  23. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectAddBo.java
  24. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectEditBo.java
  25. 0 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeAddBo.java
  26. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeEditBo.java
  27. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockTimeAddBo.java
  28. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubject.java
  29. 0 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubjectTime.java
  30. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/mapper/MockApplyMapper.java
  31. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/IMockApplyService.java
  32. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/impl/MockApplyServiceImpl.java
  33. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockApplyVo.java
  34. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockMajorSubjectVo.java
  35. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockTimeVo.java
  36. 8 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  37. 109 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  38. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAddBo.java
  39. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java
  40. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeAddBo.java
  41. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeEditBo.java
  42. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeQueryBo.java
  43. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java
  44. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  45. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java
  46. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java
  47. 11 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  48. 11 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java
  49. 8 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  50. 110 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  51. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockSubscribeVo.java
  52. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeSignExportVo.java
  53. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeStudentExportVo.java
  54. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeVo.java
  55. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java
  56. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/IWisdomService.java
  57. 104 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/impl/WisdomServiceImpl.java
  58. 40 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/vo/WisdomResultVo.java
  59. 2 38
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java
  60. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml
  61. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml
  62. 7 0
      zhongzheng-system/src/main/resources/mapper/modules/mock/MockApplyMapper.xml
  63. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  64. 11 2
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMockSubscribeMapper.xml
  65. 103 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

+ 17 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -4,6 +4,7 @@ import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.framework.web.service.AsyncService;
 import com.zhongzheng.framework.web.service.WxLoginService;
+import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
 import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
@@ -19,6 +20,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.text.ParseException;
+import java.util.Map;
 
 /**
  * 定时任务
@@ -296,8 +298,21 @@ public class ScheduleController extends BaseController {
 
     @ApiOperation("批量同步考试计划用户")
     @GetMapping("/syncApplyUserInfo")
-    public AjaxResult syncApplyUserInfo(UserQueryBo bo){
-        iScheduleService.syncApplyUserInfo(bo);
+    public AjaxResult<Map<String,Object>> wisdomSyncApplyUserInfo(ExamApplyQueryBo bo){
+        return AjaxResult.success(iScheduleService.wisdomSyncApplyUserInfo(bo));
+    }
+
+    @ApiOperation("同步考生考试状态信息")
+    @GetMapping("/wisdomSyncExamStatus")
+    public AjaxResult wisdomSyncExamStatus(ExamApplyQueryBo bo){
+        iScheduleService.wisdomSyncExamStatus(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("同步考试视频信息")
+    @GetMapping("/wisdomSyncExamVideo")
+    public AjaxResult wisdomSyncExamVideo(ExamApplyQueryBo bo){
+        iScheduleService.wisdomSyncExamVideo(bo);
         return AjaxResult.success();
     }
 }

+ 23 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java

@@ -3,6 +3,7 @@ package com.zhongzheng.controller.user;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.hutool.core.bean.BeanUtil;
@@ -20,6 +21,7 @@ import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
 import com.zhongzheng.modules.exam.vo.ExamApplyVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
+import com.zhongzheng.modules.grade.vo.ClassStudentExportVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserBankRecord;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
@@ -359,4 +361,25 @@ public class UserSubscribeController extends BaseController {
         return AjaxResult.success(iUserSubscribeService.checkIdsDataFilter(bo));
     }
 
+    @ApiOperation("导出学员信息表")
+    @PreAuthorize("@ss.hasPermi('system:subscribe:list')")
+    @GetMapping("/listUserExport")
+    public AjaxResult<Map<String,Object>> listUserExport(UserSubscribeQueryBo bo) {
+        Map<String,Object> map = iUserSubscribeService.listUserExport(bo);
+        List<UserSubscribeStudentExportVo> list = (List<UserSubscribeStudentExportVo>)map.get("list");
+        ExcelUtil<UserSubscribeStudentExportVo> util = new ExcelUtil<UserSubscribeStudentExportVo>(UserSubscribeStudentExportVo.class);
+        map.put("excel",util.exportExcel(list, "学员信息表"));
+        map.remove("list");
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("导出学员签到表")
+    @PreAuthorize("@ss.hasPermi('system:subscribe:list')")
+    @GetMapping("/listSignExport")
+    public AjaxResult listSignExport(UserSubscribeQueryBo bo) {
+        List<UserSubscribeSignExportVo> list = iUserSubscribeService.listSignExport(bo);
+        ExcelUtil<UserSubscribeSignExportVo> util = new ExcelUtil<UserSubscribeSignExportVo>(UserSubscribeSignExportVo.class);
+        return util.exportExcel(list, "学员签到表");
+    }
+
 }

+ 1 - 0
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -110,6 +110,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -110,6 +110,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -110,6 +110,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-admin/src/main/resources/application.yml

@@ -298,3 +298,4 @@ aliyun:
     buyNotStudyTeacherRemind : SMS_247935257  #学生购买未学习老师
     longNotStudyStudentRemind: SMS_247910221  #学生长时间未学习
     longNotStudyTeacherRemind: SMS_247765294  #学生长时间未学习老师
+    signCommitmentRemind: SMS_250390195  #签署承诺书提醒

+ 4 - 4
zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -119,10 +119,10 @@ public class ExamApplyController extends BaseController {
     @ApiOperation("新增用户预约考试")
     @Log(title = "用户预约考试", businessType = BusinessType.INSERT)
     @PostMapping("save")
-    public AjaxResult<Long> add(MultipartFile image, UserSubscribeAddBo bo) throws ParseException {
+    public AjaxResult<Long> saveApply(UserSubscribeAddBo bo) throws ParseException {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
-        return AjaxResult.success(iUserSubscribeService.saveByAddBo(bo,image));
+        return AjaxResult.success(iUserSubscribeService.saveByAddBo(bo));
     }
 
 
@@ -144,12 +144,12 @@ public class ExamApplyController extends BaseController {
      */
     @ApiOperation("签署疫情防控承诺书")
     @PostMapping("/signReport")
-    public  AjaxResult<Void> signReport(MultipartFile image,UserSubscribeSignReportBo bo) {
+    public  AjaxResult<Void> signReport(UserSubscribeSignReportBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
         bo.setPhone(loginUser.getUser().getTelphone());
         bo.setIdCard(loginUser.getUser().getIdCard());
-        return toAjax(iUserSubscribeService.signReport(image,bo)?1:0);
+        return toAjax(iUserSubscribeService.signReport(bo)?1:0);
     }
 
 

+ 15 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/mock/MockApplyController.java

@@ -13,11 +13,14 @@ import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
 import com.zhongzheng.modules.mock.bo.MockApplyAddBo;
 import com.zhongzheng.modules.mock.bo.MockApplyEditBo;
 import com.zhongzheng.modules.mock.bo.MockApplyQueryBo;
+import com.zhongzheng.modules.mock.bo.MockTimeAddBo;
 import com.zhongzheng.modules.mock.domain.MockMajorSubject;
 import com.zhongzheng.modules.mock.service.IMockApplyService;
 import com.zhongzheng.modules.mock.vo.MockApplyVo;
 import com.zhongzheng.modules.mock.vo.MockMajorSubjectVo;
+import com.zhongzheng.modules.mock.vo.MockTimeVo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.vo.UserMockSubscribeVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -188,4 +191,16 @@ public class MockApplyController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 补充模考时间
+     */
+    @ApiOperation("补充模考时间")
+    @PostMapping("/addMockTime")
+    public AjaxResult<MockTimeVo> addMockTime(@RequestBody MockTimeAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        MockTimeVo vo = iMockApplyService.addMockTime(bo);
+        return AjaxResult.success(vo);
+    }
+
 }

+ 1 - 0
zhongzheng-api/src/main/resources/application-dev.yml

@@ -111,6 +111,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-api/src/main/resources/application-pre.yml

@@ -110,6 +110,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-api/src/main/resources/application-prod.yml

@@ -122,6 +122,7 @@ wx:
         qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
         qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
         qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
     wepay:
         mchid: 1342013901
         key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9

+ 1 - 0
zhongzheng-api/src/main/resources/application.yml

@@ -293,3 +293,4 @@ aliyun:
     buyNotStudyTeacherRemind: SMS_247935257  #学生购买未学习老师
     longNotStudyStudentRemind: SMS_247910221  #学生长时间未学习
     longNotStudyTeacherRemind: SMS_247765294  #学生长时间未学习老师
+    signCommitmentRemind: SMS_250390195  #签署承诺书提醒

+ 13 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -96,6 +96,19 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         }
     }
 
+    public static final Long dateTimeSec(final String format, final String ts)
+    {
+        try
+        {
+            return (new SimpleDateFormat(format).parse(ts)).getTime()/1000;
+        }
+        catch (ParseException e)
+        {
+
+            throw new RuntimeException(e);
+        }
+    }
+
     public static String timestampToDateFormat(Long times){
         if(Validator.isEmpty(times)){
             return "";

+ 1 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java

@@ -271,7 +271,7 @@ public class ToolsUtils {
         // 0 代表前面补充0
         // num 代表长度为4
         // d 代表参数为正数型
-        result = String.format("%0" + num + "d", Integer.parseInt(code) + 1);
+        result = String.format("%0" + num + "d", Integer.parseInt(code));
 
         return result;
     }

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

@@ -221,7 +221,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 time+=24*3600;
             }
         }
-
+        Collections.reverse(list);
         return list;
     }
 

+ 53 - 17
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -2,14 +2,12 @@ package com.zhongzheng.framework.web.service;
 
 
 import cn.hutool.core.lang.Validator;
-import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.zxing.BarcodeFormat;
-import com.google.zxing.WriterException;
 import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
@@ -22,28 +20,16 @@ import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
-import com.zhongzheng.modules.course.domain.CourseMenu;
-import com.zhongzheng.modules.course.domain.CourseSectionWatchPer;
-import com.zhongzheng.modules.course.mapper.CourseSectionMapper;
-import com.zhongzheng.modules.user.bo.UserAddBo;
 import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
 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.UserWxFollow;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
-import com.zhongzheng.modules.user.mapper.UserSchoolInfoMapper;
-import com.zhongzheng.modules.user.mapper.UserWxFollowMapper;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.TemplatData;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
-import net.polyv.common.v1.base.HttpClientUtil;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.http.entity.StringEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,14 +37,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -110,6 +93,9 @@ public class WxLoginService implements IWxLoginService {
     @Value("${wx.gzh.qdyExamStatusTpId}")
     private String qdyExamStatusTpId;
 
+    @Value("${wx.gzh.signatureTpId}")
+    private String signatureTpId;
+
     @Value("${enCodeVersion}")
     private String enCodeVersion;
 
@@ -834,6 +820,56 @@ public class WxLoginService implements IWxLoginService {
         return result;
     }
 
+    @Override
+    public String sendSignatureTpMsg(String openId, Map<String, String> paramMap) {
+        String accessToken = getWxSmallAccessToken();
+        if (Validator.isEmpty(accessToken)) {
+            throw new CustomException("小程序accessToken 错误");
+        }
+        String param = String.format(small_wxSendTpParam, accessToken);
+        String url = small_wxSendTpUrl + "?" + param;
+        JSONObject obj = new JSONObject();
+        JSONObject mp_template_msg = new JSONObject();
+        JSONObject miniprogram = new JSONObject();
+
+        obj.put("touser", openId);
+        paramMap.put("access_token", accessToken);
+        mp_template_msg.put("appid", gzh_appid);
+        mp_template_msg.put("template_id", signatureTpId);
+        mp_template_msg.put("url", "http://weixin.qq.com/download");  //公众号模板消息所要跳转的url
+        miniprogram.put("appid", appid); //公众号模板消息所要跳转的小程序appid,小程序的必须与公众号具有绑定关系
+        miniprogram.put("pagepath", paramMap.get("pagepath")); //公众号模板消息所要跳转的小程序页面
+        mp_template_msg.put("miniprogram", miniprogram);
+        Map<String, TemplatData> mapdata = new LinkedHashMap<>();
+        // 封装模板数据
+        TemplatData first = new TemplatData();
+        first.setValue(paramMap.get("first"));
+        first.setColor("#173177");
+        mapdata.put("first", first);
+
+        TemplatData keyword1 = new TemplatData();
+        keyword1.setValue(paramMap.get("keyword1"));
+        keyword1.setColor("#000000");
+        mapdata.put("keyword1", keyword1);
+
+        TemplatData keyword2 = new TemplatData();
+        keyword2.setValue(paramMap.get("keyword2"));
+        keyword2.setColor("#000000");
+        mapdata.put("keyword2", keyword2);
+
+        TemplatData remark = new TemplatData();
+        remark.setValue(paramMap.get("remark"));
+        remark.setColor("#173177");
+        mapdata.put("remark", remark);
+
+        mp_template_msg.put("data", mapdata);
+        obj.put("mp_template_msg", mp_template_msg);
+
+        String result = HttpUtils.sendPost(url, obj);
+        return result;
+    }
+
+
     @Override
     public String getActivityApplyCode(Long activityId) {
         String wxGzhAccessToken = getWxSmallAccessToken();

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

@@ -491,7 +491,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;
+            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post;
             LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
             if (maps.containsKey("idcard")) {
@@ -538,6 +538,18 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
                     objectLambdaUpdateWrapper.set(User::getCompanyName, work_unit);
                 }
             }
+            if (maps.containsKey("education")) {
+                education = JSONObject.parseObject(String.valueOf(maps.get("education")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(education)){
+                    objectLambdaUpdateWrapper.set(User::getEduLevel, education);
+                }
+            }
+            if (maps.containsKey("apply_post")) {
+                apply_post = JSONObject.parseObject(String.valueOf(maps.get("apply_post")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(apply_post)){
+                    objectLambdaUpdateWrapper.set(User::getJob, apply_post);
+                }
+            }
             objectLambdaUpdateWrapper.set(User::getUpdateTime, DateUtils.getNowTime());
             iUserService.update(null, objectLambdaUpdateWrapper);
         }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java

@@ -64,8 +64,10 @@ public class ExamApplyAddBo {
     @ApiModelProperty("编码")
     private String code;
 
+
     /** 是否需要签署承诺书 1是,0否 */
     @ApiModelProperty("编码")
     private Integer reportStatus;
 
+
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java

@@ -74,4 +74,5 @@ public class ExamApplyEditBo {
     @ApiModelProperty("编码")
     private Integer reportStatus;
 
+
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java

@@ -62,7 +62,7 @@ private static final long serialVersionUID=1L;
 
     /** 编码 */
     private String code;
-
+    
     /** 是否需要签署承诺书 1是,0否 */
     private Integer reportStatus;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyVo.java

@@ -98,4 +98,6 @@ public class ExamApplyVo {
 
 	@ApiModelProperty("商品Id")
 	private Long[] goodsId;
+	@ApiModelProperty("是否需要签署承诺书 1是,0否")
+	private Integer reportStatus;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamUserApplyVo.java

@@ -79,4 +79,7 @@ public class ExamUserApplyVo {
 	@ApiModelProperty("订单商品")
 	private Long orderGoodsId;
 
+	@ApiModelProperty("是否需要签署承诺书 1是,0否")
+	private Integer reportStatus;
+
 }

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectAddBo.java

@@ -37,7 +37,9 @@ public class MockMajorSubjectAddBo {
     /** 更新时间 */
     @ApiModelProperty("更新时间")
     private Long updateTime;
-
+    /** 考试时长(分钟) */
+    @ApiModelProperty("考试时长(分钟)")
+    private Integer duration;
     /** 关联商品列表 */
     @ApiModelProperty("关联商品列表")
     private List<MockMajorSubjectGoodsAddBo> mockMajorSubjectGoodsList;

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectEditBo.java

@@ -42,6 +42,10 @@ public class MockMajorSubjectEditBo {
     @ApiModelProperty("更新时间")
     private Long updateTime;
 
+    /** 考试时长(分钟) */
+    @ApiModelProperty("考试时长(分钟)")
+    private Integer duration;
+
     /** 关联商品列表 */
     @ApiModelProperty("关联商品列表")
     private List<MockMajorSubjectGoodsEditBo> mockMajorSubjectGoodsList;

+ 0 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeAddBo.java

@@ -36,7 +36,4 @@ public class MockMajorSubjectTimeAddBo {
     /** 修改时间 */
     @ApiModelProperty("修改时间")
     private Long updateTime;
-    /** 考试时长(分钟) */
-    @ApiModelProperty("考试时长(分钟)")
-    private Integer duration;
 }

+ 1 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeEditBo.java

@@ -41,9 +41,7 @@ public class MockMajorSubjectTimeEditBo {
     @ApiModelProperty("修改时间")
     private Long updateTime;
 
-    /** 考试时长(分钟) */
-    @ApiModelProperty("考试时长(分钟)")
-    private Integer duration;
+
 
 
 }

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockTimeAddBo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.mock.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangdamao
+ * @date 2022年09月05日 15:46
+ */
+@Data
+@ApiModel("补充考试时间BO")
+public class MockTimeAddBo {
+
+    @ApiModelProperty("模考Id")
+    private Long applyId;
+
+    @ApiModelProperty("专业ID")
+    private Long majorId;
+
+    @ApiModelProperty("科目ID")
+    private Long subjectId;
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("时长")
+    private Integer duration;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubject.java

@@ -39,6 +39,8 @@ private static final long serialVersionUID=1L;
     private Long examId;
     /** 讲解ID */
     private Long sectionId;
+    /** 考试时长(分钟) */
+    private Integer duration;
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)
     private Long createTime;

+ 0 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubjectTime.java

@@ -37,8 +37,6 @@ private static final long serialVersionUID=1L;
     private String startTime;
     /** 结束时间 */
     private String endTime;
-    /** 考试时长(分钟) */
-    private Integer duration;
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/mapper/MockApplyMapper.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.mock.mapper;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
 import com.zhongzheng.modules.mock.bo.MockApplyQueryBo;
+import com.zhongzheng.modules.mock.bo.MockTimeAddBo;
 import com.zhongzheng.modules.mock.domain.MockApply;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.mock.vo.MockApplyVo;
@@ -34,4 +35,6 @@ public interface MockApplyMapper extends BaseMapper<MockApply> {
     CourseSectionQueryBo mockLiving(Long userId);
 
     List<MockMajorSubjectVo> listApplyName(MockApplyQueryBo bo);
+
+    Long getMockMajorSubjectId(MockTimeAddBo bo);
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/IMockApplyService.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.mock.service;
 
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
+import com.zhongzheng.modules.mock.bo.MockTimeAddBo;
 import com.zhongzheng.modules.mock.domain.MockApply;
 import com.zhongzheng.modules.mock.domain.MockMajorSubject;
 import com.zhongzheng.modules.mock.vo.MockApplyVo;
@@ -10,6 +11,8 @@ import com.zhongzheng.modules.mock.bo.MockApplyAddBo;
 import com.zhongzheng.modules.mock.bo.MockApplyEditBo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.mock.vo.MockMajorSubjectVo;
+import com.zhongzheng.modules.mock.vo.MockTimeVo;
+import com.zhongzheng.modules.user.vo.UserMockSubscribeVo;
 
 import java.text.ParseException;
 import java.util.Collection;
@@ -72,4 +75,7 @@ public interface IMockApplyService extends IService<MockApply> {
 	CourseSectionQueryBo mockLiving(Long userId);
 
     List<MockMajorSubjectVo> listApplyName(MockApplyQueryBo bo);
+
+	MockTimeVo addMockTime(MockTimeAddBo bo);
+
 }

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/impl/MockApplyServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -27,6 +28,7 @@ import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.user.domain.UserMockSubscribe;
 import com.zhongzheng.modules.user.service.IUserMockSubscribeService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import com.zhongzheng.modules.user.vo.UserMockSubscribeVo;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -160,6 +162,7 @@ public class MockApplyServiceImpl extends ServiceImpl<MockApplyMapper, MockApply
                 bo2.setExamId(mockMajorSubjectAddBo.getExamId());
                 bo2.setSectionId(mockMajorSubjectAddBo.getSectionId());
                 bo2.setSubjectId(mockMajorSubjectAddBo.getSubjectId());
+                bo2.setDuration(mockMajorSubjectAddBo.getDuration());
                 MockMajorSubject mockMajorSubjectAdd = BeanUtil.toBean(bo2, MockMajorSubject.class);
                 mockMajorSubjectAdd.setCreateTime(DateUtils.getNowTime());
                 mockMajorSubjectAdd.setUpdateTime(DateUtils.getNowTime());
@@ -278,6 +281,7 @@ public class MockApplyServiceImpl extends ServiceImpl<MockApplyMapper, MockApply
                 bo2.setExamId(mockMajorSubjectAddBo.getExamId());
                 bo2.setSectionId(mockMajorSubjectAddBo.getSectionId());
                 bo2.setSubjectId(mockMajorSubjectAddBo.getSubjectId());
+                bo2.setDuration(mockMajorSubjectAddBo.getDuration());
                 MockMajorSubject mockMajorSubjectAdd = BeanUtil.toBean(bo2, MockMajorSubject.class);
                 mockMajorSubjectAdd.setCreateTime(DateUtils.getNowTime());
                 mockMajorSubjectAdd.setUpdateTime(DateUtils.getNowTime());
@@ -573,4 +577,57 @@ public class MockApplyServiceImpl extends ServiceImpl<MockApplyMapper, MockApply
     public List<MockMajorSubjectVo> listApplyName(MockApplyQueryBo bo) {
         return baseMapper.listApplyName(bo);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MockTimeVo addMockTime(MockTimeAddBo bo) {
+        MockApply apply = getById(bo.getApplyId());
+        if (ObjectUtils.isNull(apply)){
+            throw new CustomException("模考信息获取失败");
+        }
+        //获取科目记录ID
+        Long id = baseMapper.getMockMajorSubjectId(bo);
+        if (ObjectUtils.isNull(id)){
+            throw new CustomException("模考专业科目ID获取失败");
+        }
+        //换算时间
+        Long nowTime = DateUtils.getNowTime();//开始时间
+        Integer duration =  bo.getDuration() * 60;
+        Long  endTime = nowTime + Long.valueOf(duration);//结束时间
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
+        String nowTimeStr = sdf.format(nowTime*1000);
+        String endTimeStr = sdf.format(endTime*1000);
+
+        apply.setApplyStartTime(nowTime);
+        apply.setApplyEndTime(endTime);
+        updateById(apply);
+
+        MockMajorSubjectTime time = new MockMajorSubjectTime();
+        time.setMockMajorSubjectId(id);
+        time.setStartTime(nowTimeStr);
+        time.setEndTime(endTimeStr);
+        time.setExamTime(nowTime);
+        time.setCreateTime(nowTime);
+        time.setUpdateTime(nowTime);
+        iMockMajorSubjectTimeService.save(time);
+
+        UserMockSubscribe userMockSubscribe = iUserMockSubscribeService.getOne(new LambdaQueryWrapper<UserMockSubscribe>()
+                .eq(UserMockSubscribe::getUserId, bo.getUserId())
+                .eq(UserMockSubscribe::getApplyId, bo.getApplyId()));
+        if (ObjectUtils.isNull(userMockSubscribe)){
+            throw new CustomException("我的模考信息获取失败");
+        }
+        userMockSubscribe.setEachExamId(time.getId());
+        userMockSubscribe.setApplySiteStartTime(nowTimeStr);
+        userMockSubscribe.setApplySiteExamTime(nowTime);
+        iUserMockSubscribeService.updateById(userMockSubscribe);
+
+        MockTimeVo mockTimeVo = new MockTimeVo();
+        mockTimeVo.setEachExamId(time.getId());
+        mockTimeVo.setStartTime(nowTimeStr);
+        mockTimeVo.setEndTime(endTimeStr);
+        mockTimeVo.setApplyId(bo.getApplyId());
+        mockTimeVo.setExamTime(nowTime);
+        return mockTimeVo;
+    }
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockApplyVo.java

@@ -199,4 +199,14 @@ public class MockApplyVo {
 	@ApiModelProperty("模考通知状态 0未通知 1已通知")
 	private Integer mockRemind;
 
+	/** 是否活动模考 0否 1是 */
+	@ApiModelProperty("是否活动模考 0否 1是")
+	private Integer mockActivity;
+	/** 活动开始时间 */
+	@ApiModelProperty("活动开始时间")
+	private Long activityStartTime;
+	/** 活动结束时间 */
+	@ApiModelProperty("活动结束时间")
+	private Long activityEndTime;
+
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockMajorSubjectVo.java

@@ -94,6 +94,10 @@ public class MockMajorSubjectVo {
 	@ApiModelProperty("暂未生成回放 1未生成")
 	private Integer waitStatus;
 
+	/** 考试时长(分钟) */
+	@ApiModelProperty("考试时长")
+	private Integer duration;
+
 	/** 模考专业科目绑定时间集合 */
 	@Excel(name = "模考专业科目绑定时间集合")
 	@ApiModelProperty("模考专业科目绑定时间集合")

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockTimeVo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.mock.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangdamao
+ * @date 2022年09月05日 15:46
+ */
+@Data
+@ApiModel("模考VO")
+public class MockTimeVo {
+
+    @ApiModelProperty("模考Id")
+    private Long applyId;
+
+    @ApiModelProperty("每场考试ID")
+    private Long eachExamId;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+}

+ 8 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.schedule.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoEditBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoQueryBo;
@@ -73,5 +74,11 @@ public interface IScheduleService extends IService<PolyvVideo> {
 
     void wisdomExamSite(UserQueryBo bo);
 
-    void syncApplyUserInfo(UserQueryBo bo);
+    Map<String,Object> wisdomSyncApplyUserInfo(ExamApplyQueryBo bo);
+
+    void wisdomSyncExamStatus(ExamApplyQueryBo bo);
+
+    void wisdomSyncExamVideo(ExamApplyQueryBo bo);
+
+    void signTimeSend(UserQueryBo bo);
 }

+ 109 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -307,6 +307,9 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Value("${aliyun.sms.longNotStudyTeacherRemind}")
     private String longNotStudyTeacherRemind;
 
+    @Value("${aliyun.sms.signCommitmentRemind}")
+    private String signCommitmentRemind;
+
     @Override
     public String updateGoodsSend(UserQueryBo bo) {
         InformRemindVo informRemindVo = informRemindService.queryById(1L);
@@ -618,6 +621,7 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         List<UserSubscribeVo> userSubscribeVo = iUserSubscribeService.timeSend();
         InformRemindVo informRemindVo = informRemindService.queryById(16L);
         for (UserSubscribeVo subscribeVo : userSubscribeVo) {
+            String seatTxt =Validator.isNotEmpty(subscribeVo.getSeatNumber())?",座位号:"+subscribeVo.getSeatNumber():"";
             String res;
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
             Long timeId = subscribeVo.getApplySiteExamTime() * 1000;
@@ -636,9 +640,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 informUserAddBo.setSystemStatus(1);
                 informUserAddBo.setRemind("考试提醒");
                 informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
                 GoodsVo goodsVo1 = iGoodsService.queryById(subscribeVo.getGoodsId());
                 informUserAddBo.setText("尊敬的用户:您预约的施工现场专业人员" + goodsVo1.getGoodsName() + "考试将在" + res + "(" + startTime + "-" + endTime + ")进行," +
-                        "考试地点:" + subscribeVo.getApplySiteAddress() + "");
+                        "考试地点:" + subscribeVo.getApplySiteAddress() + seatTxt);
                 iInformUserService.insertByAddBo(informUserAddBo);
             }
             if (informRemindVo.getNoteStatus().equals(1)) {
@@ -652,9 +657,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 informUserAddBo.setSystemStatus(3);
                 informUserAddBo.setRemind("考试提醒");
                 informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
                 GoodsVo goodsVo1 = iGoodsService.queryById(subscribeVo.getGoodsId());
                 informUserAddBo.setText("尊敬的用户:您预约的施工现场专业人员" + goodsVo1.getGoodsName() + "考试将在" + res + "(" + startTime + "-" + endTime + ")进行," +
-                        "考试地点:" + subscribeVo.getApplySiteAddress() + "");
+                        "考试地点:" + subscribeVo.getApplySiteAddress() + seatTxt);
                 UserVo userVo = iUserService.queryById(subscribeVo.getUserId());
                 Map<String, Object> param = new HashMap<>();
                 param.put("goods", goodsVo1.getGoodsName());
@@ -675,9 +681,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 informUserAddBo.setSystemStatus(4);
                 informUserAddBo.setRemind("考试提醒");
                 informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
                 GoodsVo goodsVo1 = iGoodsService.queryById(subscribeVo.getGoodsId());
                 informUserAddBo.setText("尊敬的用户:您预约的施工现场专业人员" + goodsVo1.getGoodsName() + "考试将在" + res + "(" + startTime + "-" + endTime + ")进行," +
-                        "考试地点:" + subscribeVo.getApplySiteAddress() + "");
+                        "考试地点:" + subscribeVo.getApplySiteAddress() + seatTxt);
                 UserVo userVo = iUserService.queryById(subscribeVo.getUserId());
                 Map<String, Object> param = new HashMap<>();
                 param.put("goods", goodsVo1.getGoodsName());
@@ -685,11 +692,12 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 param.put("address", subscribeVo.getApplySiteAddress());
                 iInformUserService.insertByAddBo(informUserAddBo);
                 if(Validator.isNotEmpty(userVo.getOpenId())){
+                    String seatNumberTxt =Validator.isNotEmpty(subscribeVo.getSeatNumber())?"座位号为"+subscribeVo.getSeatNumber()+";":"";
                     Map<String,String> paramMap = new HashMap<>();
                     paramMap.put("first","您预约的施工现场专业人员" + goodsVo1.getGoodsName() + "考试,请及时参加");
                     paramMap.put("keyword1",subscribeVo.getApplySiteAddress());
                     paramMap.put("keyword2", res + "(" + startTime + "-" + endTime + ")");
-                    paramMap.put("remark","请准备好身份证、48小时核酸证明,准时参加考试!");
+                    paramMap.put("remark",seatNumberTxt+"请准备好身份证、48小时核酸证明,准时参加考试!");
                     paramMap.put("pagepath","pages2/exam/exam_appointment?current=0");
                     iWxLoginService.sendQdyExamTpMsg(userVo.getOpenId(),paramMap);
                 }
@@ -697,6 +705,89 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         }
     }
 
+    @Override
+    public void signTimeSend(UserQueryBo bo) {
+        //提醒签署承诺书
+        List<UserSubscribeVo> userSubscribeVo = iUserSubscribeService.signTimeSend();
+        InformRemindVo informRemindVo = informRemindService.queryById(34L);
+        for (UserSubscribeVo subscribeVo : userSubscribeVo) {
+           String dateStartStr = DateUtils.timestampToDate(subscribeVo.getApplySiteExamTime())+" "+subscribeVo.getApplySiteStartTime();
+           Long startTime = DateUtils.dateTimeSec(dateStartStr,DateUtils.YYYY_MM_DD_HH_MM_SS);
+           Long nowTime = DateUtils.getNowTime();
+           if((nowTime+7200L)<=startTime&&(nowTime+7380L)>=startTime){ //开考前2小时通知
+               if (informRemindVo.getWayStatus().equals(1)) {
+                   InformUserAddBo informUserAddBo = new InformUserAddBo();
+                   informUserAddBo.setUserId(subscribeVo.getUserId());
+                   informUserAddBo.setSendStatus(1);
+                   informUserAddBo.setSendTime(DateUtils.getNowTime());
+                   informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                   informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                   informUserAddBo.setRemindId(34L);
+                   informUserAddBo.setSystemStatus(1);
+                   informUserAddBo.setRemind("签署承诺书提醒");
+                   informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                   informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
+                   informUserAddBo.setText("尊敬的用户:您参加的"+subscribeVo.getApplyName()+"考试即将开始,您还没有签署疫情防控承诺书。请及时签署承诺书!\n" +
+                           "\n" +
+                           "\n" +
+                           "\n" +
+                           "点击消息:打开签署承诺书页面");
+                   iInformUserService.insertByAddBo(informUserAddBo);
+               }
+               if (informRemindVo.getNoteStatus().equals(1)) {
+                   InformUserAddBo informUserAddBo = new InformUserAddBo();
+                   informUserAddBo.setUserId(subscribeVo.getUserId());
+                   informUserAddBo.setSendTime(DateUtils.getNowTime());
+                   informUserAddBo.setSendStatus(1);
+                   informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                   informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                   informUserAddBo.setRemindId(34L);
+                   informUserAddBo.setSystemStatus(3);
+                   informUserAddBo.setRemind("签署承诺书提醒");
+                   informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                   informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
+                   informUserAddBo.setText("尊敬的用户:您参加的"+subscribeVo.getApplyName()+"考试即将开始,您还没有在线上签署疫情防控承诺书。立即打开小程序签署承诺书!");
+                   UserVo userVo = iUserService.queryById(subscribeVo.getUserId());
+                   Map<String, Object> param = new HashMap<>();
+                   param.put("name", subscribeVo.getApplyName());
+                   if (Validator.isNotEmpty(IAliSmsService.sendInformSms(userVo.getTelphone(), JSON.toJSONString(param), signCommitmentRemind))) {
+                       iInformUserService.insertByAddBo(informUserAddBo);
+                   }
+               }
+               if (informRemindVo.getGzhTpStatus().equals(1)) {
+                   InformUserAddBo informUserAddBo = new InformUserAddBo();
+                   informUserAddBo.setUserId(subscribeVo.getUserId());
+                   informUserAddBo.setSendTime(DateUtils.getNowTime());
+                   informUserAddBo.setSendStatus(1);
+                   informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                   informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                   informUserAddBo.setRemindId(34L);
+                   informUserAddBo.setSystemStatus(4);
+                   informUserAddBo.setRemind("考试提醒");
+                   informUserAddBo.setGoodsId(subscribeVo.getGoodsId());
+                   informUserAddBo.setOrderGoodsId(subscribeVo.getOrderGoodsId());
+                   informUserAddBo.setText("尊敬的用户:您参加的"+subscribeVo.getApplyName()+"考试即将开始,您还没有在线上签署疫情防控承诺书。立即打开小程序签署承诺书!");
+                   UserVo userVo = iUserService.queryById(subscribeVo.getUserId());
+                   iInformUserService.insertByAddBo(informUserAddBo);
+                   if(Validator.isNotEmpty(userVo.getOpenId())){
+                       Map<String,String> paramMap = new HashMap<>();
+                       paramMap.put("first","您参加的"+subscribeVo.getApplyName()+"考试即将开始,您还没有签署疫情防控承诺书");
+                       paramMap.put("keyword1",subscribeVo.getApplySiteAddress());
+                       paramMap.put("keyword2", dateStartStr);
+                       paramMap.put("remark","↓请点击立即疫情防控签署承诺书。");
+                       paramMap.put("pagepath","pages2/exam/exam_appointment?current=0");
+                       iWxLoginService.sendSignatureTpMsg(userVo.getOpenId(),paramMap);
+                   }
+               }
+               LambdaUpdateWrapper<UserSubscribe> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+               objectLambdaUpdateWrapper.eq(UserSubscribe::getSubscribeId, subscribeVo.getSubscribeId());
+               objectLambdaUpdateWrapper.set(UserSubscribe::getSignaturePushTime,DateUtils.getNowTime());
+               objectLambdaUpdateWrapper.set(UserSubscribe::getUpdateTime,DateUtils.getNowTime());
+               iUserSubscribeService.update(null, objectLambdaUpdateWrapper);
+           }
+        }
+    }
+
     @Override
     public void closeTimeOutOrder() {
         OrderQueryBo bo = new OrderQueryBo();
@@ -2113,10 +2204,22 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     }
 
     @Override
-    public void syncApplyUserInfo(UserQueryBo bo) {
-        iWisdomService.syncApplyUserInfo(192L);
+    public Map<String,Object> wisdomSyncApplyUserInfo(ExamApplyQueryBo bo) {
+        return iWisdomService.syncApplyUserInfo(bo.getApplyId());
+    }
+
+    @Override
+    public void wisdomSyncExamStatus(ExamApplyQueryBo bo) {
+        iWisdomService.syncExamStatus(bo.getApplyId(),1);
     }
 
+    @Override
+    public void wisdomSyncExamVideo(ExamApplyQueryBo bo) {
+        iWisdomService.syncExamVideo(bo.getApplyId(),102L);
+    }
+
+
+
     private Long formatTime(Long startTime, String addTime) throws ParseException{
         Long times = startTime*1000;//时间戳
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAddBo.java

@@ -147,4 +147,8 @@ public class UserAddBo {
     /** 导入编号 */
     @ApiModelProperty("导入编号")
     private String importNo;
+
+    /** 工作岗位 */
+    @ApiModelProperty("工作岗位")
+    private String job;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java

@@ -188,4 +188,7 @@ public class UserEditBo {
     @ApiModelProperty("导入编号")
     private String importNo;
 
+    /** 工作岗位 */
+    @ApiModelProperty("工作岗位")
+    private String job;
 }

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

@@ -134,4 +134,30 @@ public class UserSubscribeAddBo {
     /** 考室编号 */
     @ApiModelProperty("考室编号")
     private String roomCode;
+    /** 智慧考场考试状态 未报到;已报到;缺考;替考;考试中;
+     未交卷;已交卷;作弊;正常 */
+    @ApiModelProperty("智慧考场考试状态 未报到;已报到;缺考;替考;考试中;未交卷;已交卷;作弊;正常")
+    private String wisdomExamStatus;
+
+    /** 智慧考场报到时间 */
+    @ApiModelProperty("智慧考场报到时间")
+    private Long wisdomReportTime;
+
+    /** 智慧考场体温 */
+    @ApiModelProperty("智慧考场体温")
+    private String wisdomTemperature;
+
+    /** 承诺书签名推送时间 */
+    @ApiModelProperty("承诺书签名推送时间")
+    private Long signaturePushTime;
+
+    /** 签署承诺书时间 */
+    @ApiModelProperty("签署承诺书时间")
+    private Long reportFileTime;
+
+    /** 签名照片Base64码 */
+    @ApiModelProperty("签名照片Base64码")
+    private String signImageStr;
+
+
 }

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeEditBo.java

@@ -157,4 +157,25 @@ public class UserSubscribeEditBo {
     /** 考室编号 */
     @ApiModelProperty("考室编号")
     private String roomCode;
+    /** 智慧考场考试状态 未报到;已报到;缺考;替考;考试中;
+     未交卷;已交卷;作弊;正常 */
+    @ApiModelProperty("智慧考场考试状态 未报到;已报到;缺考;替考;考试中;未交卷;已交卷;作弊;正常")
+    private String wisdomExamStatus;
+
+    /** 智慧考场报到时间 */
+    @ApiModelProperty("智慧考场报到时间")
+    private Long wisdomReportTime;
+
+    /** 智慧考场体温 */
+    @ApiModelProperty("智慧考场体温")
+    private String wisdomTemperature;
+    /** 智慧考场同步考试结果信息 */
+    @ApiModelProperty("智慧考场同步考试结果信息")
+    private String syncExamResult;
+    /** 承诺书签名推送时间 */
+    @ApiModelProperty("承诺书签名推送时间")
+    private Long signaturePushTime;
+    /** 签署承诺书时间 */
+    @ApiModelProperty("签署承诺书时间")
+    private Long reportFileTime;
 }

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeQueryBo.java

@@ -142,4 +142,28 @@ public class UserSubscribeQueryBo extends BaseEntity {
 	/** 考场名称 */
 	@ApiModelProperty("考场名称")
 	private String roomName;
+	/** 承诺书签名推送时间 */
+	@ApiModelProperty("承诺书签名推送时间")
+	private Long signaturePushTime;
+	/** 准考证书 */
+	@ApiModelProperty("准考证书")
+	private String examineeCode;
+	/** 0 未签署 1已签署 */
+	@ApiModelProperty("0 未签署 1已签署")
+	private Integer reportStatus;
+	/** 座位号 */
+	@ApiModelProperty("座位号")
+	private String seatNumber;
+	/** 考试开始时间段 */
+	@ApiModelProperty("考试开始时间段")
+	private String applySiteStartTime;
+
+	/** 考试结束时间段 */
+	@ApiModelProperty("考试结束时间段")
+	private String applySiteEndTime;
+
+	/** 考试日期 */
+	@ApiModelProperty("考试日期")
+	private Long applySiteExamTime;
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java

@@ -32,4 +32,7 @@ public class UserSubscribeSignReportBo implements Serializable {
     @ApiModelProperty("专业")
     private String major;
 
+    @ApiModelProperty("签名图片Base64码")
+    private String signImageStr;
+
 }

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

@@ -209,4 +209,6 @@ private static final long serialVersionUID=1L;
     private Integer studyFromPlat;
     @TableField(exist = false)
     private Long lastStudyTime;
+    /** 工作岗位 */
+    private String job;
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java

@@ -102,4 +102,18 @@ private static final long serialVersionUID=1L;
     private Long roomId;
     /** 考室编号 */
     private String roomCode;
+    /** 智慧考场考试状态 未报到;已报到;缺考;替考;考试中;
+     未交卷;已交卷;作弊;正常 */
+    private String wisdomExamStatus;
+    /** 智慧考场报到时间 */
+    private Long wisdomReportTime;
+    /** 智慧考场体温 */
+    private String wisdomTemperature;
+    /** 智慧考场同步考试结果信息 */
+    private String syncExamResult;
+    /** 承诺书签名推送时间 */
+    private Long signaturePushTime;
+    /** 签署承诺书时间 */
+    private Long reportFileTime;
+
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java

@@ -5,6 +5,7 @@ import com.zhongzheng.modules.user.bo.UserSubscribeQueryBo;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.user.vo.UserSubscribeVo;
+import com.zhongzheng.modules.user.vo.UserVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -50,4 +51,10 @@ public interface UserSubscribeMapper extends BaseMapper<UserSubscribe> {
     Integer getConsoleTestSubscribeNum(ConsoleQueryBo bo);
 
     List<UserSubscribeVo> selectApplyUserList(@Param("applyId") Long applyId);
+
+    List<UserSubscribeVo> signTimeSend();
+
+    List<UserVo> listUserExport(UserSubscribeQueryBo bo);
+
+    List<UserSubscribeVo> listSignExport(UserSubscribeQueryBo bo);
 }

+ 11 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java

@@ -3,10 +3,7 @@ package com.zhongzheng.modules.user.service;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
-import com.zhongzheng.modules.user.vo.UserSubscribeIdsImport;
-import com.zhongzheng.modules.user.vo.UserSubscribeIdsImportCheck;
-import com.zhongzheng.modules.user.vo.UserSubscribeImport;
-import com.zhongzheng.modules.user.vo.UserSubscribeVo;
+import com.zhongzheng.modules.user.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.web.multipart.MultipartFile;
@@ -89,11 +86,18 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
      * 签署疫情防控承诺书
      * @author change
      * @date 2022/8/25 10:29
-     * @param image
      * @param bo
      * @return java.lang.Boolean
      */
-	Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo);
+	Boolean signReport(UserSubscribeSignReportBo bo);
+
+
+	List<UserSubscribeVo> signTimeSend();
+
+	Map<String,Object> listUserExport(UserSubscribeQueryBo bo);
+
+	List<UserSubscribeSignExportVo> listSignExport(UserSubscribeQueryBo bo);
+
+	Long saveByAddBo(UserSubscribeAddBo bo) throws ParseException;
 
-	Long saveByAddBo(UserSubscribeAddBo bo, MultipartFile image) throws ParseException;
 }

+ 11 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java

@@ -195,6 +195,8 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
             update.setFirstHandTime(DateUtils.getNowTime());
         }
         update.setUpdateTime(DateUtils.getNowTime());
+        SimpleDateFormat slf = new SimpleDateFormat("HH:mm:ss");
+        update.setApplySiteEndTime(slf.format(new Date()));
         return this.updateById(update);
     }
 
@@ -316,9 +318,14 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
                                     userMockSubscribeVo.setReSubscribe(1);
                                 }
                             }
-                            if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
-                                userMockSubscribeVo.setCanDo(0);
-                            }
+                        }
+                        if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
+                            userMockSubscribeVo.setCanDo(0);
+                        }
+                        if (Validator.isNotEmpty(userMockSubscribe.getHandStatus()) &&
+                            Arrays.asList(1,2).contains(userMockSubscribe.getHandStatus()) &&
+                                userMockSubscribe.getMockActivity() == 1){
+                            userMockSubscribeVo.setCanDo(0);
                         }
                     } catch (ParseException e) {
                         e.printStackTrace();
@@ -380,7 +387,7 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
 //            }
 //        });
 
-        return userMockSubscribeVos.stream().sorted(Comparator.comparing(UserMockSubscribeVo::getApplySiteExamTime, Comparator.nullsFirst(Long::compareTo))).collect(Collectors.toList());
+        return userMockSubscribeVos.stream().sorted(Comparator.comparing(UserMockSubscribeVo::getApplySiteExamTime, Comparator.nullsFirst(Long::compareTo)).reversed()).collect(Collectors.toList());
     }
 
     @Override

+ 8 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -182,14 +182,14 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     @Override
     public UserStudyRecordVo queryLiveLast(UserStudyRecordQueryBo bo) {
         LambdaQueryWrapper<UserStudyRecord> lqw = Wrappers.lambdaQuery();
-        lqw.eq(bo.getUserId() != null, UserStudyRecord::getUserId, bo.getUserId());
-        lqw.eq(bo.getCourseId() != null, UserStudyRecord::getCourseId, bo.getCourseId());
-        lqw.eq(bo.getSectionId() != null, UserStudyRecord::getSectionId, bo.getSectionId());
-        lqw.eq(bo.getGoodsId() != null, UserStudyRecord::getGoodsId, bo.getGoodsId());
-        lqw.eq(bo.getModuleId() != null, UserStudyRecord::getModuleId, bo.getModuleId());
-        lqw.eq(bo.getChapterId() != null, UserStudyRecord::getChapterId, bo.getChapterId());
-        lqw.eq(bo.getGradeId() != null, UserStudyRecord::getGradeId, bo.getGradeId());
-        lqw.eq(bo.getOrderGoodsId() != null, UserStudyRecord::getOrderGoodsId, bo.getOrderGoodsId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getUserId()), UserStudyRecord::getUserId, bo.getUserId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getCourseId()) , UserStudyRecord::getCourseId, bo.getCourseId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getSectionId()), UserStudyRecord::getSectionId, bo.getSectionId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getGoodsId()), UserStudyRecord::getGoodsId, bo.getGoodsId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getModuleId()), UserStudyRecord::getModuleId, bo.getModuleId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getChapterId()), UserStudyRecord::getChapterId, bo.getChapterId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getGradeId()), UserStudyRecord::getGradeId, bo.getGradeId());
+        lqw.eq(ObjectUtils.isNotNull(bo.getOrderGoodsId()), UserStudyRecord::getOrderGoodsId, bo.getOrderGoodsId());
         lqw.eq( UserStudyRecord::getCurrentStatus, 1);
         lqw.orderByDesc(UserStudyRecord::getUpdateTime);
         UserStudyRecord last = this.getOne(lqw.last("limit 1"));

+ 110 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -13,14 +13,18 @@ import com.google.zxing.BarcodeFormat;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.annotation.DataScope;
+import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.modules.alioss.service.OssService;
+import com.zhongzheng.modules.alioss.vo.FileBean;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.base.bo.UserProfileFit;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
@@ -66,6 +70,7 @@ import org.springframework.web.multipart.MultipartFile;
 import org.thymeleaf.util.StringUtils;
 
 import javax.imageio.ImageIO;
+import javax.xml.bind.DatatypeConverter;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
@@ -76,6 +81,7 @@ import java.util.*;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 用户预约考试Service业务层处理
@@ -138,6 +144,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     private IWxLoginService iWxLoginService;
 
 
+
+
     @Autowired
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
 
@@ -236,7 +244,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         }
         ExamApplyQueryBo applyQueryBo = new ExamApplyQueryBo();
         applyQueryBo.setUserId(bo.getUserId());
-        applyQueryBo.setGoodsId(bo.getGoodsId());
+        applyQueryBo.setOrderGoodsId(add.getOrderGoodsId());
         //查询剩余考试次数
         Integer residueSubscribeNext = examApplyMapper.residueSubscribeNext(applyQueryBo);
         if (residueSubscribeNext == null || residueSubscribeNext < 1){
@@ -260,7 +268,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         add.setExamStatus(0);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
-        add.setExamineeCode(ServletUtils.getEncoded("ZZ"+ ToolsUtils.autoGenericCode(String.valueOf(add.getApplyId()),3) +ToolsUtils.autoGenericCode(String.valueOf(add.getUserId()),3)));
+        add.setExamineeCode(ServletUtils.getEncoded("ZZ"+ ToolsUtils.autoGenericCode(String.valueOf(add.getApplyId()),4) +ToolsUtils.autoGenericCode(String.valueOf(add.getUserId()),4)));
         this.save(add);
         //发送预约考试消息
         sendExamSucceed(bo);
@@ -849,7 +857,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             //查询剩余考试次数
             ExamApplyQueryBo examApplyQueryBo = new ExamApplyQueryBo();
             examApplyQueryBo.setUserId(userId);
-            examApplyQueryBo.setGoodsId(goodsId);
+            examApplyQueryBo.setOrderGoodsId(classGradeVo.getOrderGoodsId());
             Integer residueSubscribeNext = examApplyMapper.residueSubscribeNext(examApplyQueryBo);
             if (residueSubscribeNext == null || residueSubscribeNext < 1){
                 userSubscribeImport.setCause("剩余考试次数不足");
@@ -1079,7 +1087,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             //查询剩余考试次数
             ExamApplyQueryBo examApplyQueryBo = new ExamApplyQueryBo();
             examApplyQueryBo.setUserId(userId);
-            examApplyQueryBo.setGoodsId(goodsId);
+            examApplyQueryBo.setOrderGoodsId(classGradeVo.getOrderGoodsId());
             Integer residueSubscribeNext = examApplyMapper.residueSubscribeNext(examApplyQueryBo);
             if (residueSubscribeNext == null || residueSubscribeNext < 1){
                 userSubscribeImport.setCause("剩余考试次数不足");
@@ -1742,7 +1750,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     }
 
     @Override
-    public Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo) {
+    public Boolean signReport(UserSubscribeSignReportBo bo) {
         //获取考试预约信息
         UserSubscribe userSubscribe = getById(bo.getSubscribeId());
         if (ObjectUtils.isNull(userSubscribe)){
@@ -1755,7 +1763,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         String applyDate = DateUtils.timestampToDateFormat(Long.valueOf(userSubscribe.getApplySiteExamTime()), "yyyy-MM-dd");
         bo.setApplySiteStartTime(String.format("%s %s",applyDate,userSubscribe.getApplySiteStartTime()));
         //获取承诺书模板
-        String reportUrl = drawReport(image, bo);
+        String reportUrl = drawReport(bo.getSignImageStr(),bo);
         userSubscribe.setReportStatus(1);//已签署
         userSubscribe.setReportFile(reportUrl);
         updateById(userSubscribe);
@@ -1763,7 +1771,96 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     }
 
     @Override
-    public Long saveByAddBo(UserSubscribeAddBo bo, MultipartFile image) throws ParseException{
+    public List<UserSubscribeVo> signTimeSend() {
+        return baseMapper.signTimeSend();
+    }
+
+    @Override
+    public Map<String,Object> listUserExport(UserSubscribeQueryBo bo) {
+        Map<String,Object> map = new HashMap<>();
+        List<UserVo> list = baseMapper.listUserExport(bo);
+        List<UserSubscribeStudentExportVo> list1 = new ArrayList<>();
+        List<FileBean> fileBeanList = new ArrayList<>(); //身份证列表
+        List<FileBean> fileBeanList2 = new ArrayList<>(); //证件照列表
+        String filename = FileUtils.encodingZipFilename("学员信息数据");
+        String zipFile = FileUtils.getZipAbsoluteFile(filename);
+ /*       String filename2 = FileUtils.encodingZipFilename("证件照压缩包");
+        String zipFile2 = FileUtils.getZipAbsoluteFile(filename2);*/
+        try {
+            ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFile));
+    //        ZipOutputStream outStream2 = new ZipOutputStream(new FileOutputStream(zipFile2));
+            for (UserVo vo : list) {
+                UserSubscribeStudentExportVo item = BeanUtil.toBean(vo, UserSubscribeStudentExportVo.class);
+                if (Validator.isNotEmpty(vo.getSex())) {
+                    if (vo.getSex() == 1) {
+                        item.setSex("男");
+                    }
+                    if (vo.getSex() == 2) {
+                        item.setSex("女");
+                    }
+                }
+                list1.add(item);
+
+                if(Validator.isNotEmpty(vo.getIdCardImg1())){
+                    FileBean f1 = new FileBean();
+                    String idCardImg1 = vo.getIdCardImg1();
+                    f1.setPath(idCardImg1);
+                    f1.setFileName("身份证/"+vo.getIdCard() + "_0.jpg");
+                    FileBean f2 = new FileBean();
+                    String idCardImg2 = vo.getIdCardImg2();
+                    f2.setPath(idCardImg2);
+                    f2.setFileName("身份证/"+vo.getIdCard() + "_1.jpg");
+                    fileBeanList.add(f1);
+                    fileBeanList.add(f2);
+                }
+
+
+                if(Validator.isNotEmpty(vo.getOneInchPhotos())){
+                    FileBean f3 = new FileBean();
+                    String oneInchPhotos = vo.getOneInchPhotos();
+                    f3.setPath(oneInchPhotos);
+                    f3.setFileName("证件照/"+vo.getIdCard() + ".jpg");
+                    fileBeanList.add(f3);
+                }
+
+                if(Validator.isNotEmpty(vo.getKeyValue())){
+                    Map<String, String> maps = JSONObject.parseObject(vo.getKeyValue(), Map.class);
+                    String commitment_seal = JSONObject.parseObject(String.valueOf(maps.get("commitment_seal")), UserProfileFit.class).getValue();
+                    FileBean f4 = new FileBean();
+                    f4.setPath(commitment_seal);
+                    f4.setFileName("承诺书/"+vo.getIdCard()  + ".jpg");
+                    fileBeanList.add(f4);
+                }
+            }
+            ossService.zipWisdomDownload(fileBeanList,outStream);
+     //       ossService.zipWisdomDownload(fileBeanList2,outStream2);
+            outStream.close();
+    //        outStream2.close();
+        }
+       catch (IOException e) {
+        }
+        map.put("list", list1);
+        map.put("zip", AjaxResult.success(filename));
+    //    map.put("zip2", AjaxResult.success(filename2));
+        return map;
+    }
+
+    @Override
+    public List<UserSubscribeSignExportVo> listSignExport(UserSubscribeQueryBo bo) {
+        List<UserSubscribeVo> list = baseMapper.listSignExport(bo);
+        List<UserSubscribeSignExportVo> list1 = new ArrayList<>();
+        for(UserSubscribeVo vo : list){
+            UserSubscribeSignExportVo item = BeanUtil.toBean(vo, UserSubscribeSignExportVo.class);
+            if(Validator.isNotEmpty(vo.getWisdomReportTime())){
+                item.setWisdomReportTime(DateUtils.timestampToDateFormat(vo.getWisdomReportTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
+            }
+            list1.add(item);
+        }
+        return list1;
+    }
+
+    @Override
+    public Long saveByAddBo(UserSubscribeAddBo bo) throws ParseException{
         UserSubscribe add = BeanUtil.toBean(bo, UserSubscribe.class);
         if(Validator.isEmpty(add.getOrderGoodsId())){
             throw new CustomException("缺失订单商品ID");
@@ -1813,13 +1910,14 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         reportBo.setUserId(bo.getUserId());
         reportBo.setPhone(user.getTelphone());
         reportBo.setIdCard(user.getIdCard());
-        this.signReport(image,reportBo);
+        reportBo.setSignImageStr(bo.getSignImageStr());
+        this.signReport(reportBo);
         //发送预约考试消息
         sendExamSucceed(bo);
         return add.getSubscribeId();
     }
 
-    private String drawReport(MultipartFile image, UserSubscribeSignReportBo bo){
+    private String drawReport(String imageStr, UserSubscribeSignReportBo bo){
         Font font = new Font("宋体", Font.BOLD, 48);// 添加字体的属性设置 微软雅黑
         String imgName = null;
         try {
@@ -1841,7 +1939,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             g.drawString(DateUtils.getDate(), 673, 3860);
 
             //用户签名
-            ByteArrayInputStream inputStream = new ByteArrayInputStream(image.getBytes());
+            String replace = imageStr.replace("data:image/jpeg;base64,", "");
+            byte[] imageBytes = DatatypeConverter.parseBase64Binary(replace);
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
             BufferedImage qrImage = ImageIO.read(inputStream);
             Image scaledInstance = qrImage.getScaledInstance(304, 251, Image.SCALE_AREA_AVERAGING);
 //

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockSubscribeVo.java

@@ -228,4 +228,16 @@ public class UserMockSubscribeVo {
 	@Excel(name = "节名称")
 	@ApiModelProperty("节名称")
 	private String name;
+
+	@ApiModelProperty("是否活动模考 0否 1是")
+	private Integer mockActivity;
+
+	@ApiModelProperty("活动开始时间")
+	private Long activityStartTime;
+
+	@ApiModelProperty("活动结束时间")
+	private Long activityEndTime;
+
+	@ApiModelProperty("考试时长(分钟)")
+	private Integer duration;
 }

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeSignExportVo.java

@@ -0,0 +1,42 @@
+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 ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("用户预约考试视图对象")
+public class UserSubscribeSignExportVo {
+	private static final long serialVersionUID = 1L;
+
+
+	@Excel(name = "学员姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+
+
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+
+	@Excel(name = "体温")
+	@ApiModelProperty("体温")
+	private String wisdomTemperature;
+
+
+	@Excel(name = "签到时间")
+	@ApiModelProperty("签到时间")
+	private String wisdomReportTime;
+
+
+
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeStudentExportVo.java

@@ -0,0 +1,52 @@
+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 ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("用户预约考试视图对象")
+public class UserSubscribeStudentExportVo {
+	private static final long serialVersionUID = 1L;
+
+
+	@Excel(name = "学员姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+
+	@Excel(name = "性别")
+	@ApiModelProperty("性别")
+	private String sex;
+
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+
+	@Excel(name = "手机号")
+	@ApiModelProperty("手机号")
+	private String tel;
+
+
+	@Excel(name = "学历")
+	@ApiModelProperty("学历")
+	private String eduLevel;
+
+	@Excel(name = "工作单位")
+	@ApiModelProperty("工作单位")
+	private String companyName;
+
+
+	@Excel(name = "岗位")
+	@ApiModelProperty("岗位")
+	private String job;
+
+
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeVo.java

@@ -267,4 +267,30 @@ public class UserSubscribeVo {
 	@Excel(name = "考室编号")
 	@ApiModelProperty("考室编号")
 	private String roomCode;
+	/** 智慧考场考试状态 未报到;已报到;缺考;替考;考试中;
+	 未交卷;已交卷;作弊;正常 */
+	@Excel(name = "智慧考场考试状态 未报到;已报到;缺考;替考;考试中;未交卷;已交卷;作弊;正常")
+	@ApiModelProperty("智慧考场考试状态 未报到;已报到;缺考;替考;考试中;未交卷;已交卷;作弊;正常")
+	private String wisdomExamStatus;
+	/** 智慧考场报到时间 */
+	@Excel(name = "智慧考场报到时间")
+	@ApiModelProperty("智慧考场报到时间")
+	private Long wisdomReportTime;
+	/** 智慧考场体温 */
+	@Excel(name = "智慧考场体温")
+	@ApiModelProperty("智慧考场体温")
+	private String wisdomTemperature;
+	/** 智慧考场同步考试结果信息 */
+	@ApiModelProperty("智慧考场同步考试结果信息")
+	private String syncExamResult;
+	/** 承诺书签名推送时间 */
+	@Excel(name = "承诺书签名推送时间")
+	@ApiModelProperty("承诺书签名推送时间")
+	private Long signaturePushTime;
+
+	@ApiModelProperty("是否需要签署承诺书 1是,0否")
+	private Integer applyReportStatus;
+
+	@ApiModelProperty("1云学堂 2智慧考场")
+	private Integer fromPlat;
 }

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

@@ -268,6 +268,13 @@ public class UserVo {
 	@ApiModelProperty("班級")
 	private List<ClassGradeUserGoodsVo> classGradeUserGoodsVoList;
 
+	/** 工作岗位 */
+	@Excel(name = "工作岗位")
+	@ApiModelProperty("工作岗位")
+	private String job;
+
+	private String keyValue;
+
 	public void setNull(){
 		this.setOpenId(null);
 		this.setIdCardImg1(null);

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/IWisdomService.java

@@ -14,4 +14,8 @@ public interface IWisdomService {
     void SiteList(Integer pageNo);
 
     Map<String,Object> syncApplyUserInfo(Long applyId);
+
+    void syncExamStatus(Long applyId,Integer pageNo);
+
+    void syncExamVideo(Long applyId,Long roomId);
 }

+ 104 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/impl/WisdomServiceImpl.java

@@ -43,6 +43,7 @@ import com.zhongzheng.modules.exam.domain.ExamNumber;
 import com.zhongzheng.modules.exam.mapper.ExamApplyMapper;
 import com.zhongzheng.modules.exam.mapper.ExamBeforeMapper;
 import com.zhongzheng.modules.exam.mapper.ExamNumberMapper;
+import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamSiteService;
 import com.zhongzheng.modules.exam.vo.ExamApplyVo;
 import com.zhongzheng.modules.exam.vo.ExamBeforeVo;
@@ -103,6 +104,7 @@ import com.zhongzheng.modules.user.vo.*;
 import com.zhongzheng.modules.wisdom.service.IWisdomService;
 import com.zhongzheng.modules.wisdom.vo.CenterVo;
 import com.zhongzheng.modules.wisdom.vo.ExamineesVo;
+import com.zhongzheng.modules.wisdom.vo.WisdomResultVo;
 import com.zhongzheng.modules.wisdom.vo.WisdomRoomVo;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
 import net.polyv.live.v1.entity.channel.playback.LiveChannelVideoListResponse;
@@ -143,6 +145,10 @@ public class WisdomServiceImpl  implements IWisdomService {
 
     private String batchUserUrl = "/exam/api/center-examinees";
 
+    private String examStatusUrl = "/exam/api/status";
+
+    private String examVideoUrl = "/exam/api/rooms/videos";
+
     @Autowired
     private RedisCache redisCache;
 
@@ -152,6 +158,9 @@ public class WisdomServiceImpl  implements IWisdomService {
     @Autowired
     private IUserSubscribeService iUserSubscribeService;
 
+    @Autowired
+    private IExamApplyService iExamApplyService;
+
     @Autowired
     private OssService ossService;
 
@@ -211,6 +220,8 @@ public class WisdomServiceImpl  implements IWisdomService {
                 if(page>pageNo){
                     SiteList(pageNo++);
                 }
+            }else{
+                throw new CustomException("获取智慧考场考场列表失败");
             }
         }catch (Exception e){
             throw new CustomException("获取智慧考场考场列表失败");
@@ -221,6 +232,9 @@ public class WisdomServiceImpl  implements IWisdomService {
     public Map<String,Object> syncApplyUserInfo(Long applyId) {
         Map<String,Object> mapResult = new HashMap<>();
         List<UserSubscribeVo> list = iUserSubscribeService.selectApplyUserList(applyId);
+        if(list.size()==0){
+            throw new CustomException("没有学员推送");
+        }
         Map<String,CenterVo> cMap = new HashMap<>();
         List<CenterVo> cList = new ArrayList<>();
         for(UserSubscribeVo vo : list){
@@ -276,12 +290,15 @@ public class WisdomServiceImpl  implements IWisdomService {
                 ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFile));
                 List<FileBean> fileBeanList = new ArrayList<>();
                 for(Map<String, Object> userVo : vo.getExaminees()){
+                    if(Validator.isEmpty(userVo.get("idCardImg1"))||Validator.isEmpty(userVo.get("idCardImg2"))){
+                        continue;
+                    }
                     FileBean f1 = new FileBean();
-                    String idCardImg1 = Validator.isEmpty(userVo.get("idCardImg1"))?null:String.valueOf(userVo.get("idCardImg1"));
+                    String idCardImg1 = String.valueOf(userVo.get("idCardImg1"));
                     f1.setPath(idCardImg1);
                     f1.setFileName(userVo.get("examineeCode")+"_0.jpg");
                     FileBean f2 = new FileBean();
-                    String idCardImg2 = Validator.isEmpty(userVo.get("idCardImg2"))?null:String.valueOf(userVo.get("idCardImg2"));
+                    String idCardImg2 = String.valueOf(userVo.get("idCardImg2"));
                     f2.setPath(idCardImg2);
                     f2.setFileName(userVo.get("examineeCode")+"_1.jpg");
                     fileBeanList.add(f1);
@@ -345,8 +362,9 @@ public class WisdomServiceImpl  implements IWisdomService {
                         objectLambdaUpdateWrapper.set(UserSubscribe::getRoomId, vo.getRoomId());
                         success++;
                     }else{
+                        String reason = Validator.isNotEmpty(vo.getFailureReason())?vo.getFailureReason():"";
                         objectLambdaUpdateWrapper.set(UserSubscribe::getSyncStatus, 2);
-                        objectLambdaUpdateWrapper.set(UserSubscribe::getSyncResult, "同步失败:"+vo.getFailureReason()+DateUtils.getTime());
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getSyncResult, "同步失败:"+reason+DateUtils.getTime());
                         fail++;
                     }
                     objectLambdaUpdateWrapper.set(UserSubscribe::getUpdateTime,DateUtils.getNowTime());
@@ -355,10 +373,93 @@ public class WisdomServiceImpl  implements IWisdomService {
                 mapResult.put("total",total);
                 mapResult.put("success",success);
                 mapResult.put("fail",fail);
+            }else{
+                throw new CustomException("同步错误");
             }
         }catch (Exception e){
             throw new CustomException("同步错误");
         }
         return mapResult;
     }
+
+    @Override
+    public void syncExamStatus(Long applyId,Integer pageNo) {
+        ExamApplyVo applyVo = iExamApplyService.queryById(applyId);
+        String auth_code = authorization();
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("examCode",applyVo.getCode());
+        paramMap.put("pageNo",pageNo);
+        paramMap.put("pageSize",20);
+        try{
+            String url = host + examStatusUrl;
+            String signature = SignatureUtil.createSignature(paramMap, appid);
+            JSONObject obj = new JSONObject();
+            obj.put("examCode",applyVo.getCode());
+            obj.put("pageNo",pageNo);
+            obj.put("pageSize",20);
+            Map<String, String> hearders = new HashMap<>();
+            hearders.put("auth_code", auth_code);
+            hearders.put("appid", appid);
+            hearders.put("sign", signature);
+            String result = HttpUtils.sendPostHeader(url,obj,hearders);
+            JSONObject userInfoJSON = null;
+            userInfoJSON = JSON.parseObject(result);
+            if (userInfoJSON.containsKey("code")&&"200".equals(String.valueOf(userInfoJSON.get("code")))) {
+                Integer page = Integer.valueOf(userInfoJSON.getJSONObject("result").get("pages").toString());
+                JSONArray jsonArray = userInfoJSON.getJSONObject("result").getJSONArray("records");
+                List<WisdomResultVo> list=jsonArray.toJavaList(WisdomResultVo.class);
+                for (WisdomResultVo vo : list){
+                    LambdaUpdateWrapper<UserSubscribe> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                    objectLambdaUpdateWrapper.eq(UserSubscribe::getExamineeCode, vo.getExamineeCode());
+                    if(vo.getDistributionStatus()==0){
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getWisdomTemperature,vo.getTemperature());
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getWisdomExamStatus,vo.getExamStatus());
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getWisdomReportTime,DateUtils.dateTimeSec(DateUtils.YYYY_MM_DD_HH_MM_SS,vo.getReportTime()));
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getSyncExamResult, "同步结果成功"+DateUtils.getTime());
+                    }
+                    if(vo.getDistributionStatus()==1){
+                        String reason = Validator.isNotEmpty(vo.getFailureReason())?vo.getFailureReason():"";
+                        objectLambdaUpdateWrapper.set(UserSubscribe::getSyncExamResult, "同步结果失败"+reason+DateUtils.getTime());
+                    }
+                    objectLambdaUpdateWrapper.set(UserSubscribe::getUpdateTime,DateUtils.getNowTime());
+                    iUserSubscribeService.update(null, objectLambdaUpdateWrapper);
+                }
+                if(page>pageNo){
+                    syncExamStatus(applyId,pageNo++);
+                }
+            }else{
+                throw new CustomException("获取考生考试状态信息失败");
+            }
+        }catch (Exception e){
+            throw new CustomException("获取考生考试状态信息失败");
+        }
+    }
+
+    @Override
+    public void syncExamVideo(Long applyId, Long roomId) {
+        System.out.println(applyId);
+        ExamApplyVo applyVo = iExamApplyService.queryById(applyId);
+        String auth_code = authorization();
+        Map<String, Object> paramMap = new HashMap<>();
+        System.out.println(applyVo.getCode());
+        paramMap.put("examCode",applyVo.getCode());
+        try{
+            String url = host + examVideoUrl;
+            String signature = SignatureUtil.createSignature(paramMap, appid);
+            JSONObject obj = new JSONObject();
+            obj.put("examCode",applyVo.getCode());
+            Map<String, String> hearders = new HashMap<>();
+            hearders.put("auth_code", auth_code);
+            hearders.put("appid", appid);
+            hearders.put("sign", signature);
+            String result = HttpUtils.sendPostHeader(url,obj,hearders);
+            JSONObject userInfoJSON = null;
+            userInfoJSON = JSON.parseObject(result);
+            if (userInfoJSON.containsKey("code")&&"200".equals(String.valueOf(userInfoJSON.get("code")))) {
+
+            }
+        }catch (Exception e){
+            throw new CustomException("获取考试视频信息失败");
+        }
+    }
 }

+ 40 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/vo/WisdomResultVo.java

@@ -0,0 +1,40 @@
+package com.zhongzheng.modules.wisdom.vo;
+
+import lombok.Data;
+
+@Data
+public class WisdomResultVo {
+    private static final long serialVersionUID = 1L;
+
+    private Long Id;
+
+    private String centerName;
+
+    private String examCenterAddress;
+
+    private String roomId;
+
+    private String roomCode;
+
+    private String roomName;
+
+    private String roomAddress;
+
+    private Long seatNum;
+
+    private Integer useSeatNumber;
+
+    private Integer freeSeatNumber;
+
+    private String reportTime;
+
+    private String examStatus;
+
+    private String temperature;
+
+    private String examineeCode;
+
+    private Integer distributionStatus;
+
+    private String failureReason;
+}

+ 2 - 38
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java

@@ -1,47 +1,9 @@
 package com.zhongzheng.modules.wx.service;
 
 
-import cn.hutool.core.lang.Validator;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.client.j2se.MatrixToImageWriter;
-import com.google.zxing.common.BitMatrix;
-import com.google.zxing.qrcode.QRCodeWriter;
-import com.zhongzheng.common.constant.Constants;
-import com.zhongzheng.common.core.redis.RedisCache;
-import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.common.utils.*;
-import com.zhongzheng.common.utils.http.HttpUtils;
-import com.zhongzheng.common.utils.ip.IpUtils;
-import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
-import com.zhongzheng.modules.course.domain.CourseSectionWatchPer;
-import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
-import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.entity.ClientLoginUser;
-import com.zhongzheng.modules.user.mapper.UserMapper;
-import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.wx.bo.TemplatData;
-import com.zhongzheng.modules.wx.bo.WxLoginBody;
-import org.apache.commons.codec.binary.Base64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.io.ByteArrayOutputStream;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 
 public interface IWxLoginService
@@ -62,5 +24,7 @@ public interface IWxLoginService
 
     String sendQdyExamStatusTpMsg(String openId,Map<String,String> paramMap);
 
+    String sendSignatureTpMsg(String openId, Map<String,String> paramMap);
+
     String getActivityApplyCode(Long activityId);
 }

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml

@@ -573,6 +573,7 @@
         SELECT
             c.*,
                 #{gradeId} as grade_id,
+               cs.subject_name,
         <if test="userId != null ">
             (SELECT COUNT(DISTINCT ubr.module_id,ubr.chapter_id,ubr.exam_id) FROM user_bank_record ubr  where ubr.`status`=1 and ubr.course_id= gc.course_id and ubr.report_status=1 and ubr.grade_id = #{gradeId} and ubr.user_id = #{userId} and ubr.current_status = 1) as record_num,
         </if>
@@ -580,6 +581,7 @@
         FROM
             course c
                 LEFT JOIN goods_course gc ON gc.course_id = c.course_id
+                LEFT JOIN course_subject cs ON cs.id = c.subject_id
                 LEFT JOIN (SELECT
                                COUNT( m.id ) AS exam_num,
                                m.course_id

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml

@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
         <result property="status" column="status"/>
+        <result property="reportStatus" column="report_status"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamApplyVo" id="ExamApplyVo">
@@ -31,6 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="businessName" column="business_name"/>
         <result property="cancelPeople" column="cancel_people"/>
         <result property="people" column="people"/>
+        <result property="reportStatus" column="report_status"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamUserApplyVo" id="ExamUserApplyVo">
@@ -43,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="major" column="major"/>
         <result property="realname" column="realname"/>
         <result property="idCard" column="id_card"/>
+        <result property="reportStatus" column="report_status"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo" id="ExamNumberGoodsVoResult">
@@ -285,6 +288,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ea.apply_start_time,
             ea.apply_end_time,
             ea.apply_status,
+            ea.report_status,
             (SELECT m.category_name FROM major m where m.id = g.major_id) as major,
             (SELECT u.realname FROM `user` u where u.user_id = #{userId}) as realname,
 (SELECT u.id_card FROM `user` u where u.user_id = #{userId}) as id_card

+ 7 - 0
zhongzheng-system/src/main/resources/mapper/modules/mock/MockApplyMapper.xml

@@ -289,6 +289,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and apply_end_time &lt; #{endTime}
         </if>
     </select>
+    <select id="getMockMajorSubjectId" parameterType="com.zhongzheng.modules.mock.bo.MockTimeAddBo" resultType="java.lang.Long">
+        SELECT
+            mms.mock_major_subject_id
+        FROM mock_major mm
+                 LEFT JOIN mock_major_subject mms ON mm.mock_major_id = mms.mock_major_id
+        WHERE mm.apply_id = #{applyId} AND mm.major_id = #{majorId} AND mms.subject_id = #{subjectId}
+    </select>
 
 
 </mapper>

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

@@ -57,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="visitFromPlat" column="visit_from_plat"/>
         <result property="studyFromPlat" column="study_from_plat"/>
         <result property="lastStudyTime" column="last_study_time"/>
+        <result property="job" column="job"/>
     </resultMap>
 
 

+ 11 - 2
zhongzheng-system/src/main/resources/mapper/modules/user/UserMockSubscribeMapper.xml

@@ -69,6 +69,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="hasMockRemind" column="has_mock_remind"/>
         <result property="hasLiveSubscribe" column="has_live_subscribe"/>
         <result property="name" column="name"/>
+        <result property="mockActivity" column="mock_activity"/>
+        <result property="activityStartTime" column="activity_start_time"/>
+        <result property="activityEndTime" column="activity_end_time"/>
+        <result property="duration" column="duration"/>
     </resultMap>
     <select id="getInfo" parameterType="java.lang.Long" resultMap="UserMockSubscribeVoResult">
         SELECT 	ums.*,
@@ -127,7 +131,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 cb.business_name,
                 ma.project_id,
                 cpt.project_name,
-                ma.time_limit
+                ma.time_limit,
+                ma.mock_activity,
+                ma.activity_start_time,
+                ma.activity_end_time,
+                mms.duration
         FROM user_mock_subscribe ums
         LEFT JOIN `user` u ON ums.user_id = u.user_id
         LEFT JOIN mock_major_subject mms ON ums.mock_major_subject_id = mms.mock_major_subject_id
@@ -171,7 +179,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
     <select id="listBySubject" parameterType="com.zhongzheng.modules.user.bo.UserMockSubscribeQueryBo" resultMap="UserMockSubscribeVoResult">
         SELECT
-        ums.*
+        ums.*,
+        ma.mock_activity
         FROM
             user_mock_subscribe ums
         LEFT JOIN mock_apply ma ON ums.apply_id = ma.apply_id

+ 103 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

@@ -33,6 +33,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="roomName" column="room_name"/>
         <result property="roomId" column="room_id"/>
         <result property="roomCode" column="room_code"/>
+        <result property="wisdomExamStatus" column="wisdom_exam_status"/>
+        <result property="wisdomReportTime" column="wisdom_report_time"/>
+        <result property="wisdomTemperature" column="wisdom_temperature"/>
+        <result property="syncExamResult" column="sync_exam_result"/>
+        <result property="signaturePushTime" column="signature_push_time"/>
+        <result property="reportFileTime" column="report_file_time"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.user.vo.UserSubscribeVo" id="UserSubscribeVo">
@@ -91,6 +97,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="applyCode" column="apply_code"/>
         <result property="roomId" column="room_id"/>
         <result property="roomCode" column="room_code"/>
+        <result property="wisdomExamStatus" column="wisdom_exam_status"/>
+        <result property="wisdomReportTime" column="wisdom_report_time"/>
+        <result property="wisdomTemperature" column="wisdom_temperature"/>
+        <result property="syncExamResult" column="sync_exam_result"/>
+        <result property="signaturePushTime" column="signature_push_time"/>
+        <result property="reportFileTime" column="report_file_time"/>
+        <result property="applyReportStatus" column="report_status"/>
+        <result property="fromPlat" column="from_plat"/>
+    </resultMap>
+
+    <resultMap type="com.zhongzheng.modules.user.vo.UserVo" id="UserVoResult">
+        <result property="telphone" column="telphone"/>
+        <result property="realname" column="realname"/>
+        <result property="job" column="job"/>
+        <result property="sex" column="sex"/>
+        <result property="telphone" column="telphone"/>
+        <result property="idCard" column="id_card"/>
+        <result property="eduLevel" column="edu_level"/>
+        <result property="oneInchPhotos" column="one_inch_photos"/>
+        <result property="idCardImg1" column="id_card_img1"/>
+        <result property="idCardImg2" column="id_card_img2"/>
+        <result property="keyValue" column="key_value"/>
     </resultMap>
 
     <select id="listSubscribe" parameterType="com.zhongzheng.modules.user.bo.UserSubscribeQueryBo" resultMap="UserSubscribeVo">
@@ -106,10 +134,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             (SELECT ea.apply_start_time FROM exam_apply ea where ea.apply_id = us.apply_id) as apply_start_time,
             (SELECT ea.apply_end_time FROM exam_apply ea where ea.apply_id = us.apply_id) as apply_end_time,
             (SELECT eb.before_name FROM exam_before eb where eb.before_id = us.before_id) as before_name,
+            (SELECT ea.report_status FROM exam_apply ea where ea.apply_id = us.apply_id) as report_status,
             (SELECT ueg.do_number-ueg.expend_before FROM user_exam_goods ueg where ueg.goods_id = us.goods_id and ueg.user_id = us.user_id ORDER BY user_exam_goods_id DESC limit 1) as before_count,
             ueg.exam_number,
             ueg.do_number,
             ueg.expend_number,
+            es.from_plat,
             ueg.expend_before
         FROM
             user_subscribe us
@@ -118,6 +148,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN goods g ON  us.goods_id = g.goods_id
         LEFT JOIN course_business cb on g.business_id = cb.id
         LEFT JOIN user_exam_goods ueg ON ueg.order_goods_id = us.order_goods_id
+        LEFT JOIN exam_site es ON us.site_id = es.site_id
         WHERE
             1 =1
         <if test="applySiteAddress != null and applySiteAddress != '' ">
@@ -212,6 +243,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="realname != null and realname != '' ">
             and (SELECT u.realname FROM `user` u where us.user_id = u.user_id) like concat('%', #{realname}, '%')
         </if>
+        <if test="syncStatus != null ">
+            and us.sync_status = #{syncStatus}
+        </if>
         <!-- 数据范围过滤 -->
         ${params.dataScope}
         order by us.create_time desc
@@ -309,6 +343,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         and (SELECT COUNT(1) FROM inform_remind ir LEFT JOIN inform_remind_business irb on ir.id = irb.remind_id where ir.id=16 and (SELECT g.business_id FROM goods g where g.goods_id = us.goods_id) = irb.business_id) > 0
     </select>
 
+    <select id="signTimeSend"  resultMap="UserSubscribeVo">
+        SELECT
+        us.*,
+        ea.apply_name
+        FROM
+        user_subscribe us
+        LEFT JOIN exam_apply ea on us.apply_id = ea.apply_id
+        WHERE us.subscribe_status = 1
+        and ea.report_status = 1
+        and us.report_status = 0
+        and us.signature_push_time is NULL
+        and unix_timestamp(now())+86400 > us.apply_site_exam_time
+        and unix_timestamp(now()) &lt; us.apply_site_exam_time
+        and (SELECT COUNT(1) FROM inform_remind ir LEFT JOIN inform_remind_business irb on ir.id = irb.remind_id where ir.id=34 and (SELECT g.business_id FROM goods g where g.goods_id = us.goods_id) = irb.business_id) > 0
+    </select>
+
     <select id="sendExamSucceed" parameterType="map"  resultType="Long">
         SELECT
             COUNT( 1 )
@@ -395,4 +445,57 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and us.apply_id = #{applyId}
           and es.from_plat = 2
     </select>
+
+    <select id="listUserExport" parameterType="com.zhongzheng.modules.user.bo.UserSubscribeQueryBo" resultMap="UserVoResult">
+        SELECT
+            us.*,u.company_name,u.job,u.edu_level,u.realname,u.telphone,u.id_card,u.sex,u.id_card_img1,u.id_card_img2,u.one_inch_photos,up.key_value
+        FROM
+            user_subscribe us
+        LEFT JOIN `user` u on u.user_id =us.user_id
+        LEFT JOIN user_profile up on us.order_goods_id =up.order_goods_id and up.current_status = 1
+        and up.type_status = 1
+        WHERE
+        us.subscribe_status = 1
+        <if test="applyId != null and applyId != '' ">
+            and us.apply_id = #{applyId}
+        </if>
+        <if test="applySiteExamTime != null and applySiteExamTime != '' ">
+            and us.apply_site_exam_time = #{applySiteExamTime}
+        </if>
+        <if test="applySiteStartTime != null and applySiteStartTime != '' ">
+            and us.apply_site_start_time = #{applySiteStartTime}
+        </if>
+        <if test="applySiteEndTime != null and applySiteEndTime != '' ">
+            and us.apply_site_end_time = #{applySiteEndTime}
+        </if>
+        <if test="siteId != null and siteId != '' ">
+            and us.site_id = #{siteId}
+        </if>
+    </select>
+
+    <select id="listSignExport" parameterType="com.zhongzheng.modules.user.bo.UserSubscribeQueryBo" resultMap="UserSubscribeVo">
+        SELECT
+        us.*,u.realname,u.id_card
+        FROM
+        user_subscribe us
+        LEFT JOIN `user` u on u.user_id =us.user_id
+        WHERE
+        us.subscribe_status = 1
+        <if test="applyId != null and applyId != '' ">
+            and us.apply_id = #{applyId}
+        </if>
+        <if test="applySiteExamTime != null and applySiteExamTime != '' ">
+            and us.apply_site_exam_time = #{applySiteExamTime}
+        </if>
+        <if test="applySiteStartTime != null and applySiteStartTime != '' ">
+            and us.apply_site_start_time = #{applySiteStartTime}
+        </if>
+        <if test="applySiteEndTime != null and applySiteEndTime != '' ">
+            and us.apply_site_end_time = #{applySiteEndTime}
+        </if>
+        <if test="siteId != null and siteId != '' ">
+            and us.site_id = #{siteId}
+        </if>
+    </select>
+
 </mapper>