he2802 3 år sedan
förälder
incheckning
467bf06466
85 ändrade filer med 1525 tillägg och 167 borttagningar
  1. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamActivityController.java
  2. 17 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  3. 34 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  4. 1 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  5. 1 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  6. 1 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  7. 1 0
      zhongzheng-admin/src/main/resources/application.yml
  8. 37 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  9. 8 25
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  10. 15 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/mock/MockApplyController.java
  11. 1 0
      zhongzheng-api/src/main/resources/application-dev.yml
  12. 1 0
      zhongzheng-api/src/main/resources/application-pre.yml
  13. 1 0
      zhongzheng-api/src/main/resources/application-prod.yml
  14. 1 0
      zhongzheng-api/src/main/resources/application.yml
  15. 13 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  16. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  17. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  18. 53 17
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  19. 6 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  20. 13 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  21. 35 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityGoodsAddBo.java
  22. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java
  23. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java
  24. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivityGoods.java
  25. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  26. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityGoodsMapper.java
  27. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityGoodsService.java
  28. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityService.java
  29. 35 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityGoodsServiceImpl.java
  30. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java
  31. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyVo.java
  32. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamUserApplyVo.java
  33. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java
  34. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java
  35. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankEditBo.java
  36. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsEditBo.java
  37. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/Goods.java
  38. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  39. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectAddBo.java
  40. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectEditBo.java
  41. 0 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeAddBo.java
  42. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeEditBo.java
  43. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockTimeAddBo.java
  44. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubject.java
  45. 0 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubjectTime.java
  46. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/mapper/MockApplyMapper.java
  47. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/IMockApplyService.java
  48. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/service/impl/MockApplyServiceImpl.java
  49. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockApplyVo.java
  50. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockMajorSubjectVo.java
  51. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/vo/MockTimeVo.java
  52. 9 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  53. 116 13
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  54. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAddBo.java
  55. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java
  56. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeAddBo.java
  57. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeEditBo.java
  58. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeQueryBo.java
  59. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java
  60. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  61. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java
  62. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java
  63. 13 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  64. 28 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java
  65. 8 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  66. 167 22
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  67. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockSubscribeVo.java
  68. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeLetterExportVo.java
  69. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeSignExportVo.java
  70. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeStudentExportVo.java
  71. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeVo.java
  72. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java
  73. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/IWisdomService.java
  74. 104 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/service/impl/WisdomServiceImpl.java
  75. 40 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wisdom/vo/WisdomResultVo.java
  76. 2 38
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java
  77. 4 1
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseChapterSectionMapper.xml
  78. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml
  79. 7 1
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamApplyMapper.xml
  80. 1 1
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  81. 8 2
      zhongzheng-system/src/main/resources/mapper/modules/inform/InformUserMapper.xml
  82. 7 0
      zhongzheng-system/src/main/resources/mapper/modules/mock/MockApplyMapper.xml
  83. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  84. 15 3
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMockSubscribeMapper.xml
  85. 103 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamActivityController.java

@@ -33,6 +33,7 @@ import java.util.List;
 public class ExamActivityController extends BaseController {
 
     private final IExamActivityService iExamActivityService;
+    private final IExamActivityGoodsService iExamActivityGoodsService;
 
     /**
      * 新增活动
@@ -98,4 +99,13 @@ public class ExamActivityController extends BaseController {
         return util.exportExcel(list,"模考活动用户");
     }
 
+    /**
+     * 新增活动商品
+     */
+    @ApiOperation("新增活动商品")
+    @PostMapping("/add/goodsList")
+    public AjaxResult<Void> addActivityGoods(@RequestBody List<ExamActivityGoodsAddBo> goodsList) {
+        return toAjax(iExamActivityGoodsService.addActivityGoods(goodsList) ? 1 : 0);
+    }
+
 }

+ 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();
     }
 

+ 34 - 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,36 @@ 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, "学员签到表");
+    }
+
+    @ApiOperation("导出学员承诺书")
+    @PreAuthorize("@ss.hasPermi('system:subscribe:list')")
+    @GetMapping("/listLetterExport")
+    public AjaxResult listLetterExport(UserSubscribeQueryBo bo) {
+        Map<String,Object> map = iUserSubscribeService.listLetterExport(bo);
+        List<UserSubscribeLetterExportVo> list = (List<UserSubscribeLetterExportVo>)map.get("list");
+        ExcelUtil<UserSubscribeLetterExportVo> util = new ExcelUtil<UserSubscribeLetterExportVo>(UserSubscribeLetterExportVo.class);
+        map.put("excel",util.exportExcel(list, "疫情防控承诺书"));
+        map.remove("list");
+        return AjaxResult.success(map);
+    }
 }

+ 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  #签署承诺书提醒

+ 37 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -13,7 +13,12 @@ import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
+import com.zhongzheng.modules.exam.bo.ExamActivityApplyBo;
+import com.zhongzheng.modules.exam.bo.ExamActivityApplyVo;
+import com.zhongzheng.modules.exam.service.IExamActivityService;
+import com.zhongzheng.modules.exam.vo.ExamActivityVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.domain.Printer;
 import com.zhongzheng.modules.wx.bo.WxServerBody;
 import com.zhongzheng.modules.wx.domain.*;
@@ -47,6 +52,8 @@ public class CommonController extends BaseController {
     @Autowired
     private RedisCache redisCache;
 
+    private final IExamActivityService iExamActivityService;
+
 
     /**
      * 查询课程列表
@@ -77,6 +84,36 @@ public class CommonController extends BaseController {
         return AjaxResult.success(Printer.num);
     }
 
+    /**
+     * 获取活动信息
+     */
+    @ApiOperation("获取活动信息")
+    @GetMapping("/detail/{activityId}")
+    public AjaxResult<ExamActivityVo> getDetail(@PathVariable("activityId" ) Long activityId) {
+        ExamActivityVo vo = iExamActivityService.getDetail(activityId);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 考试活动报名
+     */
+    @ApiOperation("考试活动报名")
+    @PostMapping("/launch")
+    public AjaxResult<ExamActivityApplyVo> applyActivity(@RequestBody ExamActivityApplyBo bo) {
+        ExamActivityApplyVo vo = iExamActivityService.applyActivity(bo);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 获取考试活动商品
+     */
+    @ApiOperation("获取考试活动商品")
+    @GetMapping("/activity/goodsList/{activityId}")
+    public AjaxResult<List<GoodsVo>> getActivityGoodsList(@PathVariable("activityId") Long activityId) {
+        List<GoodsVo> voList = iExamActivityService.getActivityGoodsList(activityId);
+        return AjaxResult.success(voList);
+    }
+
     @ApiOperation("小程序配置")
     @GetMapping("/config")
     public AjaxResult<Map<String,Object>> config(ConfigQueryBo bo) {

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

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.exam;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -50,7 +51,6 @@ public class ExamApplyController extends BaseController {
 
     private final IUserSubscribeService iUserSubscribeService;
 
-    private final IExamActivityService iExamActivityService;
 
     /**
      * 获取考试安排详细信息
@@ -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(@RequestBody 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,14 @@ public class ExamApplyController extends BaseController {
      */
     @ApiOperation("签署疫情防控承诺书")
     @PostMapping("/signReport")
-    public  AjaxResult<Void> signReport(MultipartFile image,UserSubscribeSignReportBo bo) {
+    public AjaxResult<Void> signReport(@RequestBody 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);
+        if (StringUtils.isNotBlank(loginUser.getUser().getIdCard())){
+            bo.setIdCard(loginUser.getUser().getIdCard());
+        }
+        return toAjax(iUserSubscribeService.signReport(bo)?1:0);
     }
 
 
@@ -163,23 +165,4 @@ public class ExamApplyController extends BaseController {
         return toAjax(iUserSubscribeService.updateByEditSingleBo(bo) ? 1 : 0);
     }
 
-    /**
-     * 获取活动信息
-     */
-    @ApiOperation("获取活动信息")
-    @GetMapping("/detail/{activityId}")
-    public AjaxResult<ExamActivityVo> getDetail(@PathVariable("activityId" ) Long activityId) {
-        ExamActivityVo vo = iExamActivityService.getDetail(activityId);
-        return AjaxResult.success(vo);
-    }
-
-    /**
-     * 考试活动报名
-     */
-    @ApiOperation("考试活动报名")
-    @PostMapping("/launch")
-    public AjaxResult<ExamActivityApplyVo> applyActivity(@RequestBody ExamActivityApplyBo bo) {
-        ExamActivityApplyVo vo = iExamActivityService.applyActivity(bo);
-        return AjaxResult.success(vo);
-    }
 }

+ 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();

+ 6 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -614,6 +614,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
 
     @Override
     public Map<String, Object> importExcelQuestionV2NotInBank(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName) {
+        System.out.println(questionList);
         Map<String, Object> map = new HashMap<>();
         if (Validator.isNull(questionList) || questionList.size() == 0) {
             throw new CustomException("导入数据不能为空!");
@@ -823,15 +824,18 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
             if(Validator.isNotEmpty(entity.getContent())&&i>startIndex){
                 break;
             }
+            if(Validator.isEmpty(entity.getOption())){
+                continue;
+            }
             QuestionChildAddBo addBo = new QuestionChildAddBo();
             addBo.setContent(entity.getOption());
             addBo.setOptionsId(j);
             optionsList.add(addBo);
             if("是".equals(entity.getAnswer())){
                 answerList.add(j);
-                if(type==1){ //单选
+                /*if(type==1){ //单选
                     break;
-                }
+                }*/
             }
             j++;
         }

+ 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);
         }

+ 35 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityGoodsAddBo.java

@@ -0,0 +1,35 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("活动商品新增BO")
+public class ExamActivityGoodsAddBo implements Serializable {
+
+    /** 活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+
+    @ApiModelProperty("活动商品ID")
+    private Long goodsId;
+
+    /**排序字段 */
+    @ApiModelProperty("排序字段")
+    private Integer sort;
+
+    /**1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+
+}

+ 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;
 
+
 }

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivityGoods.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.exam.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("exam_activity_goods")
+public class ExamActivityGoods implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 活动ID */
+    private Long activityId;
+    /** 商品ID */
+    private Long goodsId;
+    /** 排序字段 */
+    private Integer sort;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+
+}

+ 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;
 }

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityGoodsMapper.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.exam.bo.ExamActivityQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamActivityUserVo;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamActivityGoods;
+import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 考试活动商品Mapper接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface ExamActivityGoodsMapper extends BaseMapper<ExamActivityGoods> {
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityGoodsService.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.exam.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.exam.bo.ExamActivityGoodsAddBo;
+import com.zhongzheng.modules.exam.domain.ExamActivityGoods;
+
+import java.util.List;
+
+/**
+ * 考试活动Service接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface IExamActivityGoodsService extends IService<ExamActivityGoods> {
+    boolean addActivityGoods(List<ExamActivityGoodsAddBo> goodsList);
+}

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamActivity;
 import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
 
 import java.util.List;
 
@@ -76,4 +77,13 @@ public interface IExamActivityService extends IService<ExamActivity> {
      * @return java.lang.String
      */
     String getActivityApplyCode(Long activityId);
+
+    /**
+     *
+     * @author change
+     * @date 2022/9/12 13:53
+     * @param activityId
+     * @return java.util.List<com.zhongzheng.modules.goods.vo.GoodsVo>
+     */
+    List<GoodsVo> getActivityGoodsList(Long activityId);
 }

+ 35 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityGoodsServiceImpl.java

@@ -0,0 +1,35 @@
+package com.zhongzheng.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.exam.bo.ExamActivityGoodsAddBo;
+import com.zhongzheng.modules.exam.domain.ExamActivityGoods;
+import com.zhongzheng.modules.exam.mapper.ExamActivityGoodsMapper;
+import com.zhongzheng.modules.exam.service.IExamActivityGoodsService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 考试活动Service业务层处理
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Service
+public class ExamActivityGoodsServiceImpl extends ServiceImpl<ExamActivityGoodsMapper, ExamActivityGoods> implements IExamActivityGoodsService {
+    @Override
+    public boolean addActivityGoods(List<ExamActivityGoodsAddBo> goodsList) {
+        List<ExamActivityGoods> goods = goodsList.stream().map(item -> {
+            ExamActivityGoods entity = new ExamActivityGoods();
+            BeanUtils.copyProperties(item, entity);
+            entity.setCreateTime(DateUtils.getNowTime());
+            entity.setUpdateTime(DateUtils.getNowTime());
+            entity.setStatus(1);
+            return entity;
+        }).collect(Collectors.toList());
+        return this.saveBatch(goods);
+    }
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java

@@ -1,23 +1,32 @@
 package com.zhongzheng.modules.exam.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamActivityGoods;
 import com.zhongzheng.modules.exam.domain.ExamActivityUser;
 import com.zhongzheng.modules.exam.mapper.ExamActivityMapper;
+import com.zhongzheng.modules.exam.service.IExamActivityGoodsService;
 import com.zhongzheng.modules.exam.service.IExamActivityService;
 import com.zhongzheng.modules.exam.service.IExamActivityUserService;
 import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 考试活动Service业务层处理
@@ -31,6 +40,10 @@ public class ExamActivityServiceImpl extends ServiceImpl<ExamActivityMapper, Exa
     @Autowired
     private IExamActivityUserService iExamActivityUserService;
     @Autowired
+    private IExamActivityGoodsService iExamActivityGoodsService;
+    @Autowired
+    private IGoodsService iGoodsService;
+    @Autowired
     private IWxLoginService wxLoginService;
 
     @Override
@@ -89,4 +102,23 @@ public class ExamActivityServiceImpl extends ServiceImpl<ExamActivityMapper, Exa
     public String getActivityApplyCode(Long activityId) {
         return wxLoginService.getActivityApplyCode(activityId);
     }
+
+    @Override
+    public List<GoodsVo> getActivityGoodsList(Long activityId) {
+        List<ExamActivityGoods> list = iExamActivityGoodsService.list(new LambdaQueryWrapper<ExamActivityGoods>()
+                .eq(ExamActivityGoods::getActivityId, activityId)
+                .eq(ExamActivityGoods::getStatus, 1)
+                .orderByDesc(ExamActivityGoods::getSort));
+        if (CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        List<GoodsVo> goodsVoList = list.stream().map(item -> {
+            GoodsVo goodsVo = new GoodsVo();
+            Goods goods = iGoodsService.getById(item.getGoodsId());
+            BeanUtils.copyProperties(goods, goodsVo);
+            goodsVo.setSort(item.getSort());
+            return goodsVo;
+        }).collect(Collectors.toList());
+        return goodsVoList;
+    }
 }

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

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

+ 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 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java

@@ -175,4 +175,7 @@ public class GoodsAddBo {
     /** 证书模板ID */
     @ApiModelProperty("证书模板ID")
     private Long certificateTpId;
+    /** 商品划线价格 */
+    @ApiModelProperty("商品划线价格")
+    private BigDecimal linePrice;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java

@@ -121,4 +121,7 @@ public class GoodsBankAddBo {
     /** 科目ID,拼接 */
     @ApiModelProperty("科目ID,拼接")
     private String subjectIds;
+    /** 商品划线价格 */
+    @ApiModelProperty("商品划线价格")
+    private BigDecimal linePrice;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankEditBo.java

@@ -149,4 +149,8 @@ public class GoodsBankEditBo {
     /** 科目ID,拼接 */
     @ApiModelProperty("科目ID,拼接")
     private String subjectIds;
+
+    /** 商品划线价格 */
+    @ApiModelProperty("商品划线价格")
+    private BigDecimal linePrice;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsEditBo.java

@@ -209,4 +209,7 @@ public class GoodsEditBo {
     /** 证书模板ID */
     @ApiModelProperty("证书模板ID")
     private Long certificateTpId;
+    /** 商品划线价格 */
+    @ApiModelProperty("商品划线价格")
+    private BigDecimal linePrice;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/Goods.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.goods.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
@@ -136,4 +137,6 @@ private static final long serialVersionUID=1L;
     private Long certificateId;
     /** 证书模板ID */
     private Long certificateTpId;
+    /** 商品划线价格 */
+    private BigDecimal linePrice;
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java

@@ -311,4 +311,10 @@ public class GoodsVo {
 	@ApiModelProperty("商品章卷数量")
 	private Long examNum;
 
+	/** 商品划线价格 */
+	@ApiModelProperty("商品划线价格")
+	private BigDecimal linePrice;
+	/** 排序字段 */
+	@ApiModelProperty("排序字段")
+	private Integer sort;
 }

+ 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;
+}

+ 9 - 2
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,7 +74,13 @@ public interface IScheduleService extends IService<PolyvVideo> {
 
     void wisdomExamSite(UserQueryBo bo);
 
-    void syncApplyUserInfo(UserQueryBo bo);
-
     void refreshToken(UserQueryBo bo);
+
+    Map<String,Object> wisdomSyncApplyUserInfo(ExamApplyQueryBo bo);
+
+    void wisdomSyncExamStatus(ExamApplyQueryBo bo);
+
+    void wisdomSyncExamVideo(ExamApplyQueryBo bo);
+
+    void signTimeSend(UserQueryBo bo);
 }

+ 116 - 13
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -310,6 +310,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Autowired
     private RedisCache redisCache;
 
+    @Value("${aliyun.sms.signCommitmentRemind}")
+    private String signCommitmentRemind;
+
+
     @Override
     public String updateGoodsSend(UserQueryBo bo) {
         InformRemindVo informRemindVo = informRemindService.queryById(1L);
@@ -621,6 +625,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;
@@ -639,9 +644,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)) {
@@ -651,13 +657,14 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 informUserAddBo.setSendStatus(1);
                 informUserAddBo.setCreateTime(DateUtils.getNowTime());
                 informUserAddBo.setUpdateTime(DateUtils.getNowTime());
-                informUserAddBo.setRemindId(3L);
+                informUserAddBo.setRemindId(16L);
                 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());
@@ -674,13 +681,14 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 informUserAddBo.setSendStatus(1);
                 informUserAddBo.setCreateTime(DateUtils.getNowTime());
                 informUserAddBo.setUpdateTime(DateUtils.getNowTime());
-                informUserAddBo.setRemindId(3L);
+                informUserAddBo.setRemindId(16L);
                 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());
@@ -688,11 +696,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);
                 }
@@ -700,6 +709,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();
@@ -1547,6 +1639,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 LambdaQueryWrapper<MockApply> lqw5 = Wrappers.lambdaQuery();
                 lqw5.eq(MockApply::getApplyId, subscribeVo.getApplyId());
                 MockApply mockApply = iMockApplyService.getOne(lqw5);
+                UserMockSubscribeEditBo bo1 = new UserMockSubscribeEditBo();
+                bo1.setSubscribeId(subscribeVo.getSubscribeId());
+                bo1.setHasMockRemind(1);
+                iUserMockSubscribeService.updateByEditBo(bo1);
                 if (subscribeVo.getMockRemind() == 1) {
                     if (informRemindVo.getWayStatus().equals(1)) {
                         InformUserAddBo informUserAddBo = new InformUserAddBo();
@@ -1581,11 +1677,6 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                         iInformUserService.insertByAddBo(informUserAddBo);
                     }
                 }
-                UserMockSubscribeEditBo bo1 = new UserMockSubscribeEditBo();
-                bo1.setSubscribeId(subscribeVo.getSubscribeId());
-                bo1.setHasMockRemind(1);
-                iUserMockSubscribeService.updateByEditBo(bo1);
-
             }
         }
     }
@@ -2116,10 +2207,21 @@ 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);
+    }
+
+
     @Override
     public void refreshToken(UserQueryBo bo) {
         String key = "WX_SMALL_ACCESS_TOKEN";
@@ -2129,6 +2231,7 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
 
     }
 
+
     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;
+
 }

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java

@@ -26,10 +26,13 @@ public class UserSubscribeSignReportBo implements Serializable {
     @ApiModelProperty("身份证")
     private String idCard;
 
-    @ApiModelProperty("身份证")
+    @ApiModelProperty("考试开始时间")
     private String applySiteStartTime;
 
     @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);
 }

+ 13 - 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,20 @@ 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);
+
+	Map<String,Object> listLetterExport(UserSubscribeQueryBo bo);
+
+	Long saveByAddBo(UserSubscribeAddBo bo) throws ParseException;
 
-	Long saveByAddBo(UserSubscribeAddBo bo, MultipartFile image) throws ParseException;
 }

+ 28 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java

@@ -185,6 +185,7 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
     public Boolean updateByEditBo(UserMockSubscribeEditBo bo) {
         UserMockSubscribe update = BeanUtil.toBean(bo, UserMockSubscribe.class);
         validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
         UserMockSubscribeVo userMockSubscribeVo = this.queryById(update.getSubscribeId());
         if (BeanUtil.isNotEmpty(userMockSubscribeVo)) {
             if (Validator.isNotEmpty(userMockSubscribeVo.getFirstHandTime())) {
@@ -194,7 +195,15 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
         if (Validator.isNotEmpty(bo.getHandStatus()) && bo.getHandStatus() != 0) {
             update.setFirstHandTime(DateUtils.getNowTime());
         }
-        update.setUpdateTime(DateUtils.getNowTime());
+        if(Validator.isNotEmpty(userMockSubscribeVo.getApplyId())){
+            MockApply mockApply = iMockApplyService.getById(userMockSubscribeVo.getApplyId());
+            if (Validator.isNotEmpty(mockApply) && mockApply.getMockActivity() == 1){
+                //活动模考
+                update.setUpdateTime(DateUtils.getNowTime());
+                SimpleDateFormat slf = new SimpleDateFormat("HH:mm:ss");
+                update.setApplySiteEndTime(slf.format(new Date()));
+            }
+        }
         return this.updateById(update);
     }
 
@@ -254,9 +263,12 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
                             if (System.currentTimeMillis()/1000 < formatTime(userMockSubscribeVo.getApplySiteExamTime(), userMockSubscribeVo.getApplySiteEndTime())) {
                                 userMockSubscribeVos.add(userMockSubscribeVo);
                             }
-                        }else {
+                        }else if (ObjectUtils.isNotNull(userMockSubscribeVo.getActivityEndTime()) && System.currentTimeMillis()/1000 < userMockSubscribeVo.getActivityEndTime()) {
                             userMockSubscribeVos.add(userMockSubscribeVo);
                         }
+//                        }else {
+//                            userMockSubscribeVos.add(userMockSubscribeVo);
+//                        }
                     } catch (ParseException e) {
                         e.printStackTrace();
                     }
@@ -316,9 +328,19 @@ 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);
+                        }
+                        if (ObjectUtils.isNotNull(userMockSubscribe.getActivityEndTime()) &&
+                                System.currentTimeMillis()/1000 > userMockSubscribe.getActivityEndTime()&&
+                                userMockSubscribe.getMockActivity() == 1){
+                            userMockSubscribeVo.setCanDo(0);
                         }
                     } catch (ParseException e) {
                         e.printStackTrace();
@@ -380,7 +402,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"));

+ 167 - 22
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);
@@ -309,7 +317,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,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     }
 
     @Override
-    public Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo) {
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean signReport(UserSubscribeSignReportBo bo) {
         //获取考试预约信息
         UserSubscribe userSubscribe = getById(bo.getSubscribeId());
         if (ObjectUtils.isNull(userSubscribe)){
@@ -1750,20 +1759,146 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         }
         //获取考试专业
         Goods goods = iGoodsService.getById(userSubscribe.getGoodsId());
-        Major major = majorService.getById(goods.getMajorId());
-        bo.setMajor(major.getCategoryName());
+        if (ObjectUtils.isNotNull(goods.getMajorId())){
+            Major major = majorService.getById(goods.getMajorId());
+            bo.setMajor(major.getCategoryName());
+        }
         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);
+        userSubscribe.setReportFileTime(DateUtils.getNowTime());
         updateById(userSubscribe);
         return true;
     }
 
     @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<>(); //图片列表
+        String filename = FileUtils.encodingZipFilename("学员信息数据");
+        String zipFile = FileUtils.getZipAbsoluteFile(filename);
+        try {
+            ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFile));
+            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);
+            outStream.close();
+        }
+       catch (IOException e) {
+        }
+        map.put("list", list1);
+        map.put("zip", AjaxResult.success(filename));
+        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 Map<String,Object> listLetterExport(UserSubscribeQueryBo bo) {
+        List<UserSubscribeVo> list = baseMapper.listSignExport(bo);
+        List<UserSubscribeLetterExportVo> list1 = new ArrayList<>();
+        Map<String,Object> map = new HashMap<>();
+        List<FileBean> fileBeanList = new ArrayList<>(); //图片列表
+        String filename = FileUtils.encodingZipFilename("学员承诺书数据");
+        String zipFile = FileUtils.getZipAbsoluteFile(filename);
+
+        for(UserSubscribeVo vo : list){
+            UserSubscribeLetterExportVo item = BeanUtil.toBean(vo, UserSubscribeLetterExportVo.class);
+            if(Validator.isNotEmpty(vo.getReportFileTime())){
+                item.setReportFileTimeTxt(DateUtils.timestampToDateFormat(vo.getReportFileTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
+            }
+            if(Validator.isNotEmpty(vo.getReportStatus())&&vo.getReportStatus()==1){
+                item.setSignTxt("是");
+            }
+            if(Validator.isNotEmpty(vo.getReportStatus())&&vo.getReportStatus()==0){
+                item.setSignTxt("否");
+            }
+            list1.add(item);
+            if(Validator.isNotEmpty(vo.getReportFile())){
+                FileBean f = new FileBean();
+                f.setPath(vo.getReportFile());
+                f.setFileName(vo.getIdCard() + "_0.jpg");
+                fileBeanList.add(f);
+            }
+
+        }
+        try {
+            ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFile));
+            ossService.zipWisdomDownload(fileBeanList,outStream);
+            outStream.close();
+        }
+        catch (IOException e) {
+        }
+        map.put("list", list1);
+        map.put("zip", AjaxResult.success(filename));
+        return map;
+    }
+
+    @Override
+    public Long saveByAddBo(UserSubscribeAddBo bo) throws ParseException{
         UserSubscribe add = BeanUtil.toBean(bo, UserSubscribe.class);
         if(Validator.isEmpty(add.getOrderGoodsId())){
             throw new CustomException("缺失订单商品ID");
@@ -1804,22 +1939,26 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         add.setExamStatus(0);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
-        add.setExamineeCode(ServletUtils.getEncoded("ZS"+add.getUserId()));
+        add.setExamineeCode(ServletUtils.getEncoded("ZZ"+ ToolsUtils.autoGenericCode(String.valueOf(add.getApplyId()),4) +ToolsUtils.autoGenericCode(String.valueOf(add.getUserId()),4)));
         this.save(add);
         //签署疫情防控书
-        UserSubscribeSignReportBo reportBo = new UserSubscribeSignReportBo();
-        reportBo.setSubscribeId(add.getSubscribeId());
-        User user = iUserService.getById(bo.getUserId());
-        reportBo.setUserId(bo.getUserId());
-        reportBo.setPhone(user.getTelphone());
-        reportBo.setIdCard(user.getIdCard());
-        this.signReport(image,reportBo);
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(bo.getSignImageStr())){
+            UserSubscribeSignReportBo reportBo = new UserSubscribeSignReportBo();
+            reportBo.setSubscribeId(add.getSubscribeId());
+            User user = iUserService.getById(bo.getUserId());
+            reportBo.setUserId(bo.getUserId());
+            reportBo.setPhone(user.getTelphone());
+            reportBo.setIdCard(user.getIdCard());
+            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 {
@@ -1835,13 +1974,19 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             g.setColor(Color.BLACK);
 
             g.drawString(bo.getApplySiteStartTime(), 668, 3341);
-            g.drawString(bo.getMajor(), 673, 3464);
-            g.drawString(bo.getIdCard(), 729, 3593);
+            if (ObjectUtils.isNotNull(bo.getMajor())){
+                g.drawString(bo.getMajor(), 673, 3464);
+            }
+            if (ObjectUtils.isNotNull(bo.getIdCard())){
+                g.drawString(bo.getIdCard(), 729, 3593);
+            }
             g.drawString(bo.getPhone(), 681, 3725);
             g.drawString(DateUtils.getDate(), 673, 3860);
 
             //用户签名
-            ByteArrayInputStream inputStream = new ByteArrayInputStream(image.getBytes());
+            String replace = imageStr.replace("data:image/png;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;
 }

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeLetterExportVo.java

@@ -0,0 +1,47 @@
+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 UserSubscribeLetterExportVo {
+	private static final long serialVersionUID = 1L;
+
+
+	@Excel(name = "学员姓名")
+	@ApiModelProperty("真实姓名")
+	private String realname;
+
+
+	@Excel(name = "身份证号")
+	@ApiModelProperty("身份证号")
+	private String idCard;
+
+	@Excel(name = "手机号码")
+	@ApiModelProperty("手机号码")
+	private String telphone;
+
+
+	@Excel(name = "是否已签署疫情承诺书")
+	@ApiModelProperty("是否已签署疫情承诺书")
+	private String signTxt;
+
+
+	@Excel(name = "签署时间")
+	@ApiModelProperty("签署时间")
+	private String reportFileTimeTxt;
+
+
+
+
+}

+ 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 telphone;
+
+
+	@Excel(name = "学历")
+	@ApiModelProperty("学历")
+	private String eduLevel;
+
+	@Excel(name = "工作单位")
+	@ApiModelProperty("工作单位")
+	private String companyName;
+
+
+	@Excel(name = "岗位")
+	@ApiModelProperty("岗位")
+	private String job;
+
+
+}

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

@@ -267,4 +267,33 @@ 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;
+
+	@ApiModelProperty("签署承诺书时间")
+	private Long reportFileTime;
 }

+ 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);
 }

+ 4 - 1
zhongzheng-system/src/main/resources/mapper/modules/course/CourseChapterSectionMapper.xml

@@ -155,7 +155,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where 1=1
           and cme.chapter_id = #{chapterId}
           and cme.course_id = #{courseId}
-          and cme.module_id = #{moduleId}
+        <if test="moduleId == null ">
+            and cme.module_id = #{moduleId}
+        </if>
+
     </select>
 
     <select id="getListTotalTime" parameterType="Long"  resultType="java.lang.Long">

+ 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

+ 7 - 1
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,8 @@ 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"/>
+        <result property="wisdomNum" column="wisdom_num"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamUserApplyVo" id="ExamUserApplyVo">
@@ -43,6 +46,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">
@@ -208,7 +212,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         (select cpt.project_name FROM course_project_type cpt where ea.project_id= cpt.id) as project_name,
         (select cb.business_name FROM course_business cb where ea.business_id= cb.id) as business_name,
         (SELECT COUNT(us.apply_id) FROM user_subscribe us where us.apply_id = ea.apply_id and us.subscribe_status = 1) as people,
-        (SELECT COUNT(us.apply_id) FROM user_subscribe us where us.apply_id = ea.apply_id and us.subscribe_status = 2) as cancel_people
+        (SELECT COUNT(us.apply_id) FROM user_subscribe us where us.apply_id = ea.apply_id and us.subscribe_status = 2) as cancel_people,
+        (SELECT COUNT(*) FROM exam_apply_site eas LEFT JOIN exam_site es on eas.site_id = es.site_id where eas.apply_id = ea.apply_id and es.from_plat = 2) as wisdom_num
         FROM
         exam_apply ea
         where 1=1
@@ -285,6 +290,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

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -126,7 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="buyUserNum" column="buy_user_num"/>
         <result property="chapterNum" column="chapter_num"/>
         <result property="examNum" column="exam_num"/>
-
+        <result property="linePrice" column="line_price"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo" id="ExamNumberGoodsVoResult">

+ 8 - 2
zhongzheng-system/src/main/resources/mapper/modules/inform/InformUserMapper.xml

@@ -33,6 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="applyId" column="apply_id"/>
         <result property="applyStatus" column="apply_status"/>
         <result property="goodsId" column="goods_id"/>
+        <result property="applyStartTime" column="apply_start_time"/>
         <result property="applyEndTime" column="apply_end_time"/>
         <result property="gradeId" column="grade_id"/>
         <result property="totalPeople" column="total_people"/>
@@ -72,6 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ea.apply_status,
         cgg.goods_id,
         cgg.grade_id,
+        ea.apply_start_time,
         ea.apply_end_time,
         eas.total_people,
         cgu.order_goods_id
@@ -98,8 +100,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ea.apply_status,
         cgg.goods_id,
         cgg.grade_id,
+        ea.apply_start_time,
         ea.apply_end_time,
-        eas.total_people
+        eas.total_people,
+        cgu.order_goods_id
         FROM
         exam_apply ea
         LEFT JOIN exam_apply_goods eag on ea.apply_id = eag.apply_id
@@ -122,8 +126,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ea.apply_status,
         cgg.goods_id,
         cgg.grade_id,
+        ea.apply_start_time,
         ea.apply_end_time,
-        eas.total_people
+        eas.total_people,
+        cgu.order_goods_id
         FROM
         exam_apply ea
         LEFT JOIN exam_apply_goods eag on ea.apply_id = eag.apply_id

+ 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>
 
 

+ 15 - 3
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
@@ -238,7 +247,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 LEFT JOIN mock_major mm ON mms.mock_major_id = mm.mock_major_id
                 LEFT JOIN mock_apply ma ON mm.apply_id = ma.apply_id
         WHERE
-            mmg.goods_id = #{goodsId} AND ma.mock_activity = 1
+            mmg.goods_id = #{goodsId}
+          AND ma.mock_activity = 1
+          AND ma.status = 1
+          AND unix_timestamp(now()) <![CDATA[ <= ]]> ma.activity_end_time
     </select>
 
 </mapper>

+ 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="apply_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 apply_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,u.telphone
+        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>