Browse Source

fix 合并v5.1

he2802 3 years ago
parent
commit
0ce1489dc4
100 changed files with 2105 additions and 164 deletions
  1. 21 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  2. 15 10
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java
  3. 48 13
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  4. 0 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java
  5. 22 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  6. 1 1
      zhongzheng-admin/src/main/resources/application-dev.yml
  7. 1 2
      zhongzheng-admin/src/main/resources/application-pre.yml
  8. 1 1
      zhongzheng-admin/src/main/resources/application-prod.yml
  9. 2 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java
  10. 2 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/UserProfileStampController.java
  11. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonCourseController.java
  12. 2 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java
  13. 13 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserExamRecordController.java
  14. 20 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyRecordController.java
  15. 20 0
      zhongzheng-api/src/main/java/com/zhongzheng/core/config/WebSocketConfig.java
  16. 1 1
      zhongzheng-api/src/main/resources/application-dev.yml
  17. 1 1
      zhongzheng-api/src/main/resources/application-pre.yml
  18. 1 1
      zhongzheng-api/src/main/resources/application-prod.yml
  19. 28 9
      zhongzheng-common/pom.xml
  20. 6 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/annotation/DataScope.java
  21. 0 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java
  22. 2 1
      zhongzheng-framework/pom.xml
  23. 13 3
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/DataScopeAspect.java
  24. 20 4
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/LogAspect.java
  25. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  26. 10 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  27. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  28. 742 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  29. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionChapterVo.java
  30. 26 26
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionExport.java
  31. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionModuleVo.java
  32. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionVo.java
  33. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileAddBo.java
  34. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileEditBo.java
  35. 14 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java
  36. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/UserProfile.java
  37. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/mapper/UserProfileMapper.java
  38. 41 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  39. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/UserProfileVo.java
  40. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseBusiness.java
  41. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseBusinessServiceImpl.java
  42. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  43. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseBusinessVo.java
  44. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterVo.java
  45. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleVo.java
  46. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionVo.java
  47. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseStreamingVo.java
  48. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseUserVo.java
  49. 8 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamKnowledgeVo.java
  50. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  51. 30 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  52. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  53. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeAddBo.java
  54. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeEditBo.java
  55. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java
  56. 2 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java
  57. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeUser.java
  58. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java
  59. 15 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  60. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  61. 155 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  62. 16 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java
  63. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  64. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeUserVo.java
  65. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeVo.java
  66. 91 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentExportAllVo.java
  67. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java
  68. 12 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodVo.java
  69. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java
  70. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsEditBo.java
  71. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsQueryBo.java
  72. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  73. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  74. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderBillSheetServiceImpl.java
  75. 31 14
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  76. 4 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java
  77. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderListVo.java
  78. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  79. 31 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  80. 197 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/socket/service/WebSocketServer.java
  81. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysUserServiceImpl.java
  82. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppSubscribeEditBo.java
  83. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserExamRecordQueryBo.java
  84. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeAddBo.java
  85. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeEditBo.java
  86. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserUpdateAddBo.java
  87. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserUpdateEditBo.java
  88. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserUpdateQueryBo.java
  89. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java
  90. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserUpdate.java
  91. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamRecordMapper.java
  92. 11 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java
  93. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserExamRecordService.java
  94. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  95. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamRecordServiceImpl.java
  96. 125 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  97. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeVo.java
  98. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserUpdateVo.java
  99. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionChapterMapper.xml
  100. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionMapper.xml

+ 21 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -174,4 +174,25 @@ public class QuestionController extends BaseController {
             return AjaxResult.success();
             return AjaxResult.success();
         }
         }
     }
     }
+
+    @Log(title = "导入题目Word模板", businessType = BusinessType.IMPORT)
+    @ApiOperation("导入题目Word模板")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importWordData")
+    public AjaxResult importWordData(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) throws Exception
+    {
+        String errorLog = iQuestionService.importWordQuestion(file,  eduId,  projectId,  businessId, subjectId);
+        return AjaxResult.success(errorLog);
+    }
+
+    @Log(title = "" +
+            "", businessType = BusinessType.IMPORT)
+    @ApiOperation("导入题目Word模板列表")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importWordQuestionList")
+    public AjaxResult<List<QuestionAddBo>> importWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) throws Exception
+    {
+        List<QuestionAddBo> list = iQuestionService.importWordQuestionList(file,  eduId,  projectId,  businessId, subjectId);
+        return AjaxResult.success(list);
+    }
 }
 }

+ 15 - 10
zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java

@@ -115,17 +115,22 @@ public class UserProfileController extends BaseController {
     @GetMapping("/export")
     @GetMapping("/export")
     public AjaxResult<UserProfileExportVo> export(UserProfileQueryBo bo) {
     public AjaxResult<UserProfileExportVo> export(UserProfileQueryBo bo) {
         String fileName = "";
         String fileName = "";
-        if(bo.getStatus().get(0)==0){
+        if(Validator.isEmpty(bo.getStatus())){
+            bo.setStatus(new ArrayList<Integer>(Arrays.asList(0)));
             fileName="全部";
             fileName="全部";
-        }
-        if(bo.getStatus().get(0)==1){
-            fileName="通过";
-        }
-        if(bo.getStatus().get(0)==2){
-            fileName="待审";
-        }
-        if(bo.getStatus().get(0)==3){
-            fileName="不通过";
+        }else {
+            if(bo.getStatus().get(0)==0){
+                fileName="全部";
+            }
+            if(bo.getStatus().get(0)==1){
+                fileName="通过";
+            }
+            if(bo.getStatus().get(0)==2){
+                fileName="待审";
+            }
+            if(bo.getStatus().get(0)==3){
+                fileName="不通过";
+            }
         }
         }
         startPage();
         startPage();
         //1为资料审核
         //1为资料审核

+ 48 - 13
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -8,6 +8,7 @@ import java.util.*;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
 import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
@@ -143,6 +144,18 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 
+    /**
+     * 查询学时学员记录列表
+     */
+    @ApiOperation("查询学员学时学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserPeriodRecord")
+    public TableDataInfo<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserPeriodRecord(bo);
+        return getDataTable(list);
+    }
+
     /**
     /**
      * 查询学时学员记录列表
      * 查询学时学员记录列表
      */
      */
@@ -163,29 +176,31 @@ public class ClassGradeController extends BaseController {
     @Log(title = "导出学员学时列表", businessType = BusinessType.EXPORT)
     @Log(title = "导出学员学时列表", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
     @GetMapping("/export")
     public AjaxResult<UserProfileExportGaiVo> export(ClassGradeUserQueryBo bo) {
     public AjaxResult<UserProfileExportGaiVo> export(ClassGradeUserQueryBo bo) {
-
         String fileName = "";
         String fileName = "";
-        if(bo.getStudyStatus()==0){
+        if(Validator.isEmpty(bo.getStudyStatus())){
+            bo.setStudyStatus(0);
             fileName="全部";
             fileName="全部";
+        }else{
+            if(bo.getStudyStatus()==0){
+                fileName="全部";
+            }
+            if(bo.getStudyStatus()==1){
+                fileName="未完成学习";
+            }
+            if(bo.getStudyStatus()==2){
+                fileName="完成学习";
+            }
         }
         }
-        if(bo.getStudyStatus()==1){
-            fileName="未完成学习";
-        }
-        if(bo.getStudyStatus()==2){
-            fileName="完成学习";
-        }
-
-        startPage();
         bo.setUserPhoto(1);
         bo.setUserPhoto(1);
-        List<ClassPeriodStudentExportVo> list = iClassGradeUserService.exportPo(bo);
-        ExcelUtil<ClassPeriodStudentExportVo> util = new ExcelUtil<ClassPeriodStudentExportVo>(ClassPeriodStudentExportVo.class);
+        List<ClassPeriodStudentExportAllVo> list = iClassGradeUserService.exportPo(bo);
+        ExcelUtil<ClassPeriodStudentExportAllVo> util = new ExcelUtil<ClassPeriodStudentExportAllVo>(ClassPeriodStudentExportAllVo.class);
         ExportParams deptExportParams = new ExportParams();
         ExportParams deptExportParams = new ExportParams();
         // 设置sheet得名称
         // 设置sheet得名称
         deptExportParams.setSheetName("表1");
         deptExportParams.setSheetName("表1");
         String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         Map<String, Object> deptExportMap = new HashMap<>();
         Map<String, Object> deptExportMap = new HashMap<>();
         deptExportMap.put("title", deptExportParams);
         deptExportMap.put("title", deptExportParams);
-        deptExportMap.put("entity", ClassPeriodStudentExportVo.class);
+        deptExportMap.put("entity", ClassPeriodStudentExportAllVo.class);
         // sheet中要填充得数据
         // sheet中要填充得数据
         deptExportMap.put("data", list);
         deptExportMap.put("data", list);
         List<Map<String, Object>> sheetsList = new ArrayList<>();
         List<Map<String, Object>> sheetsList = new ArrayList<>();
@@ -436,4 +451,24 @@ public class ClassGradeController extends BaseController {
         return AjaxResult.success(iUserPeriodService.checkGoodsChange(bo));
         return AjaxResult.success(iUserPeriodService.checkGoodsChange(bo));
     }
     }
 
 
+    /**
+     * 查询班级信息推送数量
+     */
+    @ApiOperation("查询班级信息推送数量")
+    @PreAuthorize("@ss.hasPermi('grade:grade:list')")
+    @GetMapping("/officialInfoCount")
+    public AjaxResult<Map<String,Object>> officialInfoCount(ClassGradeUserQueryBo bo) {
+        return AjaxResult.success(iClassGradeUserService.selectOfficialInfoCount(bo));
+    }
+
+    /**
+     * 查询班级学时推送数量
+     */
+    @ApiOperation("查询班级学时推送数量")
+    @PreAuthorize("@ss.hasPermi('grade:grade:list')")
+    @GetMapping("/officialPeriodCount")
+    public AjaxResult<Long> officialPeriodCount(ClassGradeUserQueryBo bo) {
+        return AjaxResult.success(iClassGradeUserService.selectOfficialPeriodCount(bo));
+    }
+
 }
 }

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

@@ -177,7 +177,6 @@ public class ClassStudentController extends BaseController {
         return toAjax(iUserUpdateService.updateByEditBo(bo) ? 1 : 0);
         return toAjax(iUserUpdateService.updateByEditBo(bo) ? 1 : 0);
     }
     }
 
 
-
     /**
     /**
      * 官方信息推送
      * 官方信息推送
      */
      */

+ 22 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -140,4 +140,26 @@ public class ScheduleController extends BaseController {
         iScheduleService.bindBefore(bo);
         iScheduleService.bindBefore(bo);
         return AjaxResult.success();
         return AjaxResult.success();
     }
     }
+
+    /**
+     * 官方信息推送
+     * @return
+     */
+    @ApiOperation("定时官方信息推送")
+    @GetMapping("/officialInfoPush")
+    public AjaxResult officialInfoPush(UserQueryBo bo){
+        iScheduleService.officialInfoPush(bo);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 官方学时推送
+     * @return
+     */
+    @ApiOperation("定时官方学时推送")
+    @GetMapping("/officialPeriodPush")
+    public AjaxResult officialPeriodPush(UserQueryBo bo){
+        iScheduleService.officialPeriodPush(bo);
+        return AjaxResult.success();
+    }
 }
 }

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

@@ -115,6 +115,6 @@ certificate:
 
 
 officialPush:
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
-    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    periodPath: http://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

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

@@ -113,9 +113,8 @@ wx:
 
 
 certificate:
 certificate:
     host: http://192.168.1.38:8000/
     host: http://192.168.1.38:8000/
-
 officialPush:
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
-    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    periodPath: http://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

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

@@ -114,7 +114,7 @@ certificate:
     host: https://m.xyyxt.net/
     host: https://m.xyyxt.net/
 
 
 officialPush:
 officialPush:
-    infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
+    infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan
     periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
     periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

+ 2 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java

@@ -76,10 +76,10 @@ public class ProfileTpController extends BaseController {
         String key = "PROFILE_"+loginUser.getUser().getUserId();
         String key = "PROFILE_"+loginUser.getUser().getUserId();
         Long value = redisCache.getCacheObject(key);
         Long value = redisCache.getCacheObject(key);
         if(value!=null){
         if(value!=null){
-            return toAjax(1);
+            return toAjax(0);
         }
         }
         if(iUserProfileService.insertByAddBo(bo)){
         if(iUserProfileService.insertByAddBo(bo)){
-            redisCache.setCacheObject(key,1L,10, TimeUnit.SECONDS);//10秒
+            redisCache.setCacheObject(key,1L,5, TimeUnit.SECONDS);//10秒
             return toAjax(1);
             return toAjax(1);
         }
         }
         return toAjax(0);
         return toAjax(0);

+ 2 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/base/UserProfileStampController.java

@@ -57,10 +57,10 @@ public class UserProfileStampController extends BaseController {
         String key = "PRSTAMP_"+loginUser.getUser().getUserId();
         String key = "PRSTAMP_"+loginUser.getUser().getUserId();
         Long value = redisCache.getCacheObject(key);
         Long value = redisCache.getCacheObject(key);
         if(value!=null){
         if(value!=null){
-            return toAjax(1);
+            return toAjax(0);
         }
         }
         if(iUserProfileService.insertByAddBo(bo)){
         if(iUserProfileService.insertByAddBo(bo)){
-            redisCache.setCacheObject(key,1L,10, TimeUnit.SECONDS);//10秒
+            redisCache.setCacheObject(key,1L,5, TimeUnit.SECONDS);//10秒
             return toAjax(1);
             return toAjax(1);
         }
         }
         return toAjax(0);
         return toAjax(0);

+ 1 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonCourseController.java

@@ -72,7 +72,7 @@ public class CommonCourseController extends BaseController {
     /**
     /**
      * 查询章与节关系列表
      * 查询章与节关系列表
      */
      */
-    @ApiOperation("查询章与节关系列表+章卷同级展示")
+    @ApiOperation("查询章与节关系列表+章卷同级展示(不带用户信息)")
     @GetMapping("/sectionList/{id}")
     @GetMapping("/sectionList/{id}")
     public AjaxResult<List<CourseChapterSectionVo>> sectionList(@PathVariable("id" ) Long id) {
     public AjaxResult<List<CourseChapterSectionVo>> sectionList(@PathVariable("id" ) Long id) {
         List<CourseChapterSectionVo> list = iCourseChapterSectionService.getListById(id);
         List<CourseChapterSectionVo> list = iCourseChapterSectionService.getListById(id);

+ 2 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -123,4 +123,6 @@ public class CourseController extends BaseController {
         List<CourseUserChapterSectionVo> list = iCourseChapterSectionService.sectionList(bo);
         List<CourseUserChapterSectionVo> list = iCourseChapterSectionService.sectionList(bo);
         return AjaxResult.success(list);
         return AjaxResult.success(list);
     }
     }
+
+
 }
 }

+ 13 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserExamRecordController.java

@@ -61,6 +61,19 @@ public class UserExamRecordController extends BaseController {
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 
+    /**
+     * 查询用户的题库试卷做题历史列表
+     */
+    @ApiOperation("查询用户的题库试卷做题历史分组列表")
+    @GetMapping("/group_list")
+    public TableDataInfo<UserExamRecordVo> groupList(UserExamRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserExamRecordVo> list = iUserExamRecordService.selectGroupList(bo);
+        return getDataTable(list);
+    }
+
     /**
     /**
      * 查询用户的题库试卷做题历史列表
      * 查询用户的题库试卷做题历史列表
      */
      */

+ 20 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyRecordController.java

@@ -5,7 +5,10 @@ import java.util.Arrays;
 
 
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
+import com.zhongzheng.modules.course.vo.CourseUserMenuVo;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
+import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordAddBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordAddBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordEditBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordEditBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
@@ -102,6 +105,23 @@ public class UserStudyRecordController extends BaseController {
         return toAjax(iUserStudyRecordService.updateByEditBo(bo) ? 1 : 0);
         return toAjax(iUserStudyRecordService.updateByEditBo(bo) ? 1 : 0);
     }
     }
 
 
+    @ApiOperation("判断学习顺序1")
+    @GetMapping("/checkStudyOrder1")
+    public AjaxResult<Integer> checkStudyOrder1(UserStudyRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserStudyRecordService.checkStudyOrder1(bo) ? 1 : 0);
+    }
 
 
+    /**
+     * 查询课程目录结构列表
+     */
+    @ApiOperation("查询课程所有子目录结构列表")
+    @GetMapping("/menuAllList")
+    public AjaxResult<List<ClassPeriodVo>> menuAllList(UserStudyRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserStudyRecordService.menuAllList(bo));
+    }
 
 
 }
 }

+ 20 - 0
zhongzheng-api/src/main/java/com/zhongzheng/core/config/WebSocketConfig.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.core.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+    /**
+     * ServerEndpointExporter 作用
+     *
+     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
+     *
+     * @return
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

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

@@ -115,6 +115,6 @@ certificate:
 
 
 officialPush:
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
-    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    periodPath: http://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

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

@@ -115,6 +115,6 @@ certificate:
 
 
 officialPush:
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
-    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    periodPath: http://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

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

@@ -126,7 +126,7 @@ certificate:
     host: https://m.xyyxt.net/
     host: https://m.xyyxt.net/
 
 
 officialPush:
 officialPush:
-    infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
+    infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan
     periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
     periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
     token: 0ca175b9c0f726a831d895e26933246

+ 28 - 9
zhongzheng-common/pom.xml

@@ -71,7 +71,6 @@
             <version>3.3.0</version>
             <version>3.3.0</version>
         </dependency>
         </dependency>
 
 
-
         <!-- OSS SDK 相关依赖 -->
         <!-- OSS SDK 相关依赖 -->
         <dependency>
         <dependency>
             <groupId>com.aliyun.oss</groupId>
             <groupId>com.aliyun.oss</groupId>
@@ -85,23 +84,45 @@
             <version>2.0.7</version>
             <version>2.0.7</version>
         </dependency>
         </dependency>
 
 
+        <!-- SpringBoot Websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
         <!-- 阿里JSON解析器 -->
         <!-- 阿里JSON解析器 -->
         <dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <artifactId>fastjson</artifactId>
         </dependency>
         </dependency>
 
 
-        <!-- excel工具 -->
-        <!--    <dependency>
-                <groupId>org.apache.poi</groupId>
-                <artifactId>poi-ooxml</artifactId>
-            </dependency>-->
         <dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
-            <version>4.0.0</version>
+            <version>4.1.0</version>
         </dependency>
         </dependency>
+        <!-- excel工具 -->
+           <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+               <version>4.1.0</version>
+            </dependency>
 
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>4.1.0</version>
+        </dependency>
 
 
             <!-- yml解析器 -->
             <!-- yml解析器 -->
         <dependency>
         <dependency>
@@ -175,13 +196,11 @@
             <groupId>de.codecentric</groupId>
             <groupId>de.codecentric</groupId>
             <artifactId>spring-boot-admin-starter-client</artifactId>
             <artifactId>spring-boot-admin-starter-client</artifactId>
         </dependency>
         </dependency>
-
         <dependency>
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
         </dependency>
         </dependency>
 
 
-
     </dependencies>
     </dependencies>
 
 
 </project>
 </project>

+ 6 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/annotation/DataScope.java

@@ -8,7 +8,7 @@ import java.lang.annotation.Target;
 
 
 /**
 /**
  * 数据权限过滤注解
  * 数据权限过滤注解
- * 
+ *
  * @author zhongzheng
  * @author zhongzheng
  */
  */
 @Target(ElementType.METHOD)
 @Target(ElementType.METHOD)
@@ -25,4 +25,9 @@ public @interface DataScope
      * 用户表的别名
      * 用户表的别名
      */
      */
     public String userAlias() default "";
     public String userAlias() default "";
+
+    /**
+     * 业务层次表的别名
+     */
+    public String businessAlias() default "";
 }
 }

+ 0 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java

@@ -357,8 +357,6 @@ public class ExcelUtil<T>
         }
         }
         catch (Exception e)
         catch (Exception e)
         {
         {
-            System.out.println("3434");
-            System.out.println(e.getMessage());
             log.error("导出Excel异常{}", e.getMessage());
             log.error("导出Excel异常{}", e.getMessage());
             throw new CustomException("导出Excel失败,请联系网站管理员!");
             throw new CustomException("导出Excel失败,请联系网站管理员!");
         }
         }

+ 2 - 1
zhongzheng-framework/pom.xml

@@ -67,6 +67,7 @@
             <artifactId>zhongzheng-system</artifactId>
             <artifactId>zhongzheng-system</artifactId>
         </dependency>
         </dependency>
 
 
+
     </dependencies>
     </dependencies>
 
 
-</project>
+</project>

+ 13 - 3
zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/DataScopeAspect.java

@@ -54,6 +54,11 @@ public class DataScopeAspect
      */
      */
     public static final String DATA_SCOPE_SELF = "5";
     public static final String DATA_SCOPE_SELF = "5";
 
 
+    /**
+     * 业务层次数据权限
+     */
+    public static final String DATA_SCOPE_BUSINESS = "6";
+
     /**
     /**
      * 数据权限过滤关键字
      * 数据权限过滤关键字
      */
      */
@@ -88,7 +93,7 @@ public class DataScopeAspect
             if (Validator.isNotNull(currentUser) && !currentUser.isAdmin())
             if (Validator.isNotNull(currentUser) && !currentUser.isAdmin())
             {
             {
                 dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
                 dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
-                        controllerDataScope.userAlias());
+                        controllerDataScope.userAlias(),controllerDataScope.businessAlias());
             }
             }
         }
         }
     }
     }
@@ -100,10 +105,9 @@ public class DataScopeAspect
      * @param user 用户
      * @param user 用户
      * @param userAlias 别名
      * @param userAlias 别名
      */
      */
-    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
+    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String businessAlias)
     {
     {
         StringBuilder sqlString = new StringBuilder();
         StringBuilder sqlString = new StringBuilder();
-
         for (SysRole role : user.getRoles())
         for (SysRole role : user.getRoles())
         {
         {
             String dataScope = role.getDataScope();
             String dataScope = role.getDataScope();
@@ -140,6 +144,12 @@ public class DataScopeAspect
                     sqlString.append(" OR 1=0 ");
                     sqlString.append(" OR 1=0 ");
                 }
                 }
             }
             }
+            else if (DATA_SCOPE_BUSINESS.equals(dataScope))
+            {
+                sqlString.append(StrUtil.format(
+                        " OR {}.id IN ( SELECT business_id FROM sys_role_business WHERE role_id = {} ) ", businessAlias,
+                        role.getRoleId()));
+            }
         }
         }
 
 
         if (StrUtil.isNotBlank(sqlString.toString()))
         if (StrUtil.isNotBlank(sqlString.toString()))

+ 20 - 4
zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/LogAspect.java

@@ -19,7 +19,9 @@ import com.zhongzheng.framework.manager.AsyncManager;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.framework.web.service.TopTokenService;
 import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.system.domain.SysOperLog;
 import com.zhongzheng.modules.system.domain.SysOperLog;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
 import org.aspectj.lang.Signature;
 import org.aspectj.lang.annotation.AfterReturning;
 import org.aspectj.lang.annotation.AfterReturning;
@@ -56,6 +58,9 @@ public class LogAspect
     @Value("${mybatis-plus.tenant.enabled-tenant:true}")
     @Value("${mybatis-plus.tenant.enabled-tenant:true}")
     private boolean enabledTenant;
     private boolean enabledTenant;
 
 
+    @Value("${zhongzheng.name}")
+    private String applicationName;
+
     // 配置织入点
     // 配置织入点
     @Pointcut("@annotation(com.zhongzheng.common.annotation.Log)")
     @Pointcut("@annotation(com.zhongzheng.common.annotation.Log)")
     public void logPointCut()
     public void logPointCut()
@@ -98,10 +103,21 @@ public class LogAspect
             String username = null;
             String username = null;
             if(enabledTenant){
             if(enabledTenant){
                 // 获取当前的用户
                 // 获取当前的用户
-                LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
-                if (loginUser != null)
-                {
-                    username = loginUser.getUsername();
+                //后台
+                if(applicationName.equals("zhongzheng")){
+                    LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
+                    if (loginUser != null)
+                    {
+                        username = loginUser.getUsername();
+                    }
+                }
+                //客户端
+                if(applicationName.equals("zhongzheng-api")){
+                    ClientLoginUser  loginUser = SpringUtils.getBean(WxTokenService.class).getLoginUser(ServletUtils.getRequest());
+                    if (loginUser != null)
+                    {
+                        username = loginUser.getUser().getUserAccount();
+                    }
                 }
                 }
             }else{
             }else{
                 TopLoginUser topLoginUser = SpringUtils.getBean(TopTokenService.class).getLoginUser(ServletUtils.getRequest());
                 TopLoginUser topLoginUser = SpringUtils.getBean(TopTokenService.class).getLoginUser(ServletUtils.getRequest());

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -136,6 +136,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // Spring Boot Actuator 的安全配置
                 // Spring Boot Actuator 的安全配置
                 .antMatchers("/actuator").anonymous()
                 .antMatchers("/actuator").anonymous()
                 .antMatchers("/actuator/**").anonymous()
                 .antMatchers("/actuator/**").anonymous()
+                .antMatchers("/webSocket/**").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .anyRequest().authenticated()
                 .and()
                 .and()

+ 10 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java

@@ -105,10 +105,10 @@ public class OssServiceImpl implements OssService {
     public String generateRandomFilename(OssRequest ossRequest) {
     public String generateRandomFilename(OssRequest ossRequest) {
         String prefixName = "";
         String prefixName = "";
         if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
         if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
-            prefixName = prefixName + ossRequest.getUserId()+"/";
+            prefixName = prefixName + ossRequest.getUserId();
         }
         }
         if(Validator.isNotEmpty(ossRequest.getGradeId())&&ossRequest.getGradeId().longValue()>0){
         if(Validator.isNotEmpty(ossRequest.getGradeId())&&ossRequest.getGradeId().longValue()>0){
-            prefixName = prefixName + ossRequest.getGradeId()+"/";
+            prefixName = prefixName + "/" + ossRequest.getGradeId();
         }
         }
         String RandomFilename = "";
         String RandomFilename = "";
         //生成随机数
         //生成随机数
@@ -124,28 +124,28 @@ public class OssServiceImpl implements OssService {
         RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
         RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
         switch(ossRequest.getImageStatus()){
         switch(ossRequest.getImageStatus()){
             case 0 :
             case 0 :
-                RandomFilename = "avatar"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "avatar"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 1 :
             case 1 :
-                RandomFilename = "IDNumber"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "IDNumber"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 2 :
             case 2 :
-                RandomFilename = "QuestionBank"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "QuestionBank"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 3 :
             case 3 :
-                RandomFilename = "guide"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "guide"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 4 :
             case 4 :
-                RandomFilename = "advertising"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "advertising"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 5 :
             case 5 :
-                RandomFilename = "IDCard"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "IDCard"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 6 :
             case 6 :
-                RandomFilename = "file"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "file"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
             case 7 :
             case 7 :
-                RandomFilename = "certificate"+"/"+prefixName+sdf.format(new Date())+"/"+now;
+                RandomFilename = "certificate"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())+"/"+now));
                 break;
                 break;
         }
         }
 
 

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java

@@ -11,6 +11,7 @@ import com.zhongzheng.modules.bank.vo.QuestionImport;
 import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
@@ -63,4 +64,8 @@ public interface IQuestionService extends IService<Question> {
 	List<QuestionImport> importQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName);
 	List<QuestionImport> importQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName);
 
 
     List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo);
     List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo);
+
+    String importWordQuestion(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);
+
+	List<QuestionAddBo> importWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);
 }
 }

+ 742 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -3,12 +3,14 @@ package com.zhongzheng.modules.bank.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.tokenizer.Word;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.bank.bo.*;
 import com.zhongzheng.modules.bank.bo.*;
 import com.zhongzheng.modules.bank.domain.ExamQuestion;
 import com.zhongzheng.modules.bank.domain.ExamQuestion;
@@ -33,6 +35,13 @@ import com.zhongzheng.modules.exam.service.IExamKnowledgeService;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
 import io.micrometer.core.lang.NonNull;
 import io.micrometer.core.lang.NonNull;
+import org.apache.poi.hwpf.extractor.WordExtractor;
+import org.apache.poi.ooxml.POIXMLDocument;
+import org.apache.poi.ooxml.extractor.POIXMLTextExtractor;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -40,7 +49,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.Page;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -287,6 +299,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                         bAddBo.setSubjectId(subjectId);
                         bAddBo.setSubjectId(subjectId);
                         bList.add(bAddBo);
                         bList.add(bAddBo);
                         addBo.setExamKnowledgeBusinessAddBoList(bList);
                         addBo.setExamKnowledgeBusinessAddBoList(bList);
+                        addBo.setStatus(1);
                         knowledgeId = iExamKnowledgeService.insertByImportQuestionAddBo(addBo);
                         knowledgeId = iExamKnowledgeService.insertByImportQuestionAddBo(addBo);
                         if(Validator.isEmpty(knowledgeId)||knowledgeId==0){
                         if(Validator.isEmpty(knowledgeId)||knowledgeId==0){
                             //        errorLog+=knowledge+"-该知识点不存在\n";
                             //        errorLog+=knowledge+"-该知识点不存在\n";
@@ -294,7 +307,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             errorList.add(question);
                             errorList.add(question);
                             continue;
                             continue;
                         }
                         }
-
+                        //新增进入redis
+                        String key = "KNO_"+knowledge;
+                        redisCache.setCacheObject(key,knowledgeId,3, TimeUnit.MINUTES);//3分钟
                     }
                     }
                     kIdList.add(knowledgeId);
                     kIdList.add(knowledgeId);
                 }
                 }
@@ -323,12 +338,709 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return baseMapper.listGoodsUserQuestionVo(bo);
         return baseMapper.listGoodsUserQuestionVo(bo);
     }
     }
 
 
+    private String dealTxt(String txt){
+        txt = txt.trim();
+        if(txt.startsWith("\\t")){
+            txt = txt.replace("\\t", "");
+        }
+        if(txt.startsWith("\t")){
+            txt = txt.replace("\t", "");
+        }
+        return txt;
+    }
+
+    @Override
+    public String importWordQuestion(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) {
+        String errorLog = ""; //错误提示
+        String buffer = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        try{
+            String path = file.getOriginalFilename();
+            if (path.endsWith(".doc")) {
+                throw new CustomException("不支持doc格式");
+                /*InputStream is = file.getInputStream();
+                WordExtractor wordExtractor = new WordExtractor(is);
+                buffer = wordExtractor.getText();
+                wordExtractor.close();*/
+            } else if (path.endsWith("docx")) {
+                InputStream is = file.getInputStream();
+                XWPFDocument doc = new XWPFDocument(is);
+    //            XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
+                List<XWPFParagraph> paragraphList = doc.getParagraphs();
+                int type = -1;  //题目类型
+                boolean isOption = false; //是否判断题
+                List<QuestionChildAddBo> optionsList =new ArrayList<>(); //题目选项
+                String content = ""; //每行正文
+                String qContent = ""; //题目正文
+                String answerQuestion = null; //答案
+                String analysisContent = ""; //解析文本
+                int i = 0;
+                int index = 1; //题目序列号
+                List<QuestionBusinessAddBo> businessList = new ArrayList<>();
+                QuestionBusinessAddBo questionBusinessAddBo = new QuestionBusinessAddBo();
+                questionBusinessAddBo.setEducationTypeId(eduId);
+                questionBusinessAddBo.setProjectId(projectId);
+                questionBusinessAddBo.setBusinessId(businessId);
+                questionBusinessAddBo.setSubjectId(subjectId);
+                businessList.add(questionBusinessAddBo);
+                //遍历正文
+                while (i<paragraphList.size())
+                {
+                    content = paragraphList.get(i).getText();
+                   if(Validator.isNotEmpty(content)){
+                       content =dealTxt(content);
+                       if(content.startsWith("注意事项")){
+                           break;
+                       }
+                        //第一个选项
+                        if(content.startsWith("A.")){
+                            isOption = true;
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("B.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(1L);
+                            bo1.setContent(q_content.replace("A.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第二个选项
+                        else if(content.startsWith("B.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content =content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("C.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(2L);
+                            bo1.setContent(q_content.replace("B.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第三个选项
+                        else if(content.startsWith("C.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("D.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(3L);
+                            bo1.setContent(q_content.replace("C.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第四个选项
+                        else if(content.startsWith("D.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("E.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(4L);
+                            bo1.setContent(q_content.replace("D.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第五个选项
+                        else if(content.startsWith("E.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("F.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(5L);
+                            bo1.setContent(q_content.replace("E.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第六个选项
+                        else if(content.startsWith("F.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("G.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(6L);
+                            bo1.setContent(q_content.replace("F.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //答案和题型
+                        else if(content.startsWith("正确答案")){
+                            answerQuestion = content.replace("正确答案:", "");
+                            if(Validator.isEmpty(answerQuestion)){
+                                throw new CustomException("正确答案错误");
+                            }
+                            if(isOption){
+                                //选择题
+                                answerQuestion = dealImportAnswer(answerQuestion);
+                                if(answerQuestion.length()>1){
+                                    type = 2; //多选
+                                }else{
+                                    type = 1; //单选
+                                }
+                            }else{
+                                if("正确".equals(answerQuestion)){
+                                    answerQuestion = "1";
+                                    type = 3; //判断
+                                }
+                                else if("错误".equals(answerQuestion)){
+                                    answerQuestion = "0";
+                                    type = 3;
+                                }else{
+                                    answerQuestion = null;
+                                    type = 5; //简答题
+                                    int j = i+1;
+                                    String q_content = content; //简答题
+
+                                    while (j<paragraphList.size())
+                                    {
+                                        String tempTxt = paragraphList.get(j).getText();
+                                        if(checkKey(tempTxt)){
+                                            break;
+                                        }
+                                        q_content+=tempTxt;
+                                        j++;
+                                    }
+                                    q_content = q_content.replace("正确答案:", "");
+                                    QuestionChildAddBo bo1 = null;
+                                    if(optionsList.size()==0){
+                                        bo1 = new QuestionChildAddBo();
+                                        optionsList.add(bo1);
+                                    }
+                                    bo1 = optionsList.get(0);
+                                    bo1.setOptionsId(1L);
+                                    bo1.setAnalysisContent(q_content);
+                                    i = j-1; //底部会再执行加回来
+                                }
+                            }
+                        }
+                        //解题思路
+                        else if(content.startsWith("解题思路:")){
+                            int j = i+1;
+                            String q_content = content; //解题思路
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent+=q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //考查考点
+                        else if(content.startsWith("考查考点:")){
+                            int j = i+1;
+                            String q_content = content; //考查考点
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent = analysisContent + "\r\n" +q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //老师解答
+                        else if(content.startsWith("老师解答:")){
+                            int j = i+1;
+                            String q_content = content; //考查考点
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent = analysisContent + "\r\n" +q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //问答题问题
+                        else if(content.startsWith("【问题】")){
+                            //多个问题合在一起
+                            int j = i+1;
+                            String q_content = content; //问题
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            q_content = q_content.replace("【问题】", "");
+                            QuestionChildAddBo bo1 = null;
+                            if(optionsList.size()==0){
+                                bo1 = new QuestionChildAddBo();
+                                optionsList.add(bo1);
+                            }
+                            bo1 = optionsList.get(0);
+                            bo1.setOptionsId(1L);
+                            bo1.setContent(q_content);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //题目正文
+                        else{
+                            qContent += content;
+                        }
+                    }else{
+                       qContent = removeNo(qContent);
+                       if(Validator.isEmpty(qContent)){
+                           errorLog+="第"+index+"条题目内容空白\n";
+                           i++;
+                           continue;
+                       }
+                       QuestionAddBo bo = new QuestionAddBo();
+                       if(type==-1){
+                           errorLog+="第"+index+"条题目选项错误\n";
+                           i++;
+                           continue;
+                       }
+                       bo.setType(type);
+
+                       bo.setStatus(1);
+                       bo.setContent(qContent);
+                       bo.setAnswerQuestion(answerQuestion);
+                       bo.setAnalysisContent(analysisContent);
+                       bo.setOptionsList(optionsList);
+                       bo.setCreateBy(SecurityUtils.getUsername());
+                       bo.setImportNo(importNo);
+                       bo.setPublishStatus(1);
+                       bo.setBusinessList(businessList);
+                       insertByAddBoImport(bo,i);
+
+                        //清空数据
+                        isOption = false;
+                        type = -1;
+                        qContent = "";
+                        index++;
+                       answerQuestion = null;
+                       analysisContent = "";
+                       optionsList.clear();
+                    }
+                    i++;
+                }
+            //    buffer = extractor.getText();
+                //extractor.close();
+
+            } else {
+                throw new CustomException("请导入word文件!");
+            }
+       }catch (IOException e){
+            System.out.println("此文件不是word文件!A"+e.getMessage()+e.toString()+e.getLocalizedMessage());
+        }
+        return errorLog;
+    }
+
+    @Override
+    public List<QuestionAddBo> importWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) {
+        List<QuestionAddBo> list = new ArrayList<>();
+        String errorLog = ""; //错误提示
+        String buffer = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        try{
+            String path = file.getOriginalFilename();
+            if (path.endsWith(".doc")) {
+                throw new CustomException("不支持doc格式");
+                /*InputStream is = file.getInputStream();
+                WordExtractor wordExtractor = new WordExtractor(is);
+                buffer = wordExtractor.getText();
+                wordExtractor.close();*/
+            } else if (path.endsWith("docx")) {
+                InputStream is = file.getInputStream();
+                XWPFDocument doc = new XWPFDocument(is);
+                //            XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
+                List<XWPFParagraph> paragraphList = doc.getParagraphs();
+                int type = -1;  //题目类型
+                boolean isOption = false; //是否判断题
+                List<QuestionChildAddBo> optionsList =new ArrayList<>(); //题目选项
+                String content = ""; //每行正文
+                String qContent = ""; //题目正文
+                String answerQuestion = null; //答案
+                String analysisContent = ""; //解析文本
+                int i = 0;
+                int index = 1; //题目序列号
+                List<QuestionBusinessAddBo> businessList = new ArrayList<>();
+                QuestionBusinessAddBo questionBusinessAddBo = new QuestionBusinessAddBo();
+                questionBusinessAddBo.setEducationTypeId(eduId);
+                questionBusinessAddBo.setProjectId(projectId);
+                questionBusinessAddBo.setBusinessId(businessId);
+                questionBusinessAddBo.setSubjectId(subjectId);
+                businessList.add(questionBusinessAddBo);
+                //遍历正文
+                while (i<paragraphList.size())
+                {
+                    content = paragraphList.get(i).getText();
+                    if(Validator.isNotEmpty(content)){
+                        content =dealTxt(content);
+                        if(content.startsWith("注意事项")){
+                            break;
+                        }
+                        //第一个选项
+                        if(content.startsWith("A.")){
+                            isOption = true;
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("B.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(1L);
+                            bo1.setContent(q_content.replace("A.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第二个选项
+                        else if(content.startsWith("B.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content =content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("C.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(2L);
+                            bo1.setContent(q_content.replace("B.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第三个选项
+                        else if(content.startsWith("C.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("D.")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(3L);
+                            bo1.setContent(q_content.replace("C.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第四个选项
+                        else if(content.startsWith("D.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("E.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(4L);
+                            bo1.setContent(q_content.replace("D.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第五个选项
+                        else if(content.startsWith("E.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("F.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(5L);
+                            bo1.setContent(q_content.replace("E.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //第六个选项
+                        else if(content.startsWith("F.")){
+                            QuestionChildAddBo bo1 = new QuestionChildAddBo();
+                            int j = i+1;
+                            String q_content = content; //题目正文
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(Validator.isEmpty(tempTxt)||tempTxt.startsWith("G.")||tempTxt.startsWith("正确答案")){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            bo1.setOptionsId(6L);
+                            bo1.setContent(q_content.replace("F.", ""));
+                            optionsList.add(bo1);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //答案和题型
+                        else if(content.startsWith("正确答案")){
+                            answerQuestion = content.replace("正确答案:", "");
+                            if(Validator.isEmpty(answerQuestion)){
+                                throw new CustomException("正确答案错误");
+                            }
+                            if(isOption){
+                                //选择题
+                                answerQuestion = dealImportAnswer(answerQuestion);
+                                if(answerQuestion.length()>1){
+                                    type = 2; //多选
+                                }else{
+                                    type = 1; //单选
+                                }
+                            }else{
+                                if("正确".equals(answerQuestion)){
+                                    answerQuestion = "1";
+                                    type = 3; //判断
+                                }
+                                else if("错误".equals(answerQuestion)){
+                                    answerQuestion = "0";
+                                    type = 3;
+                                }else{
+                                    answerQuestion = null;
+                                    type = 5; //简答题
+                                    int j = i+1;
+                                    String q_content = content; //简答题
+
+                                    while (j<paragraphList.size())
+                                    {
+                                        String tempTxt = paragraphList.get(j).getText();
+                                        if(checkKey(tempTxt)){
+                                            break;
+                                        }
+                                        q_content+=tempTxt;
+                                        j++;
+                                    }
+                                    q_content = q_content.replace("正确答案:", "");
+                                    QuestionChildAddBo bo1 = null;
+                                    if(optionsList.size()==0){
+                                        bo1 = new QuestionChildAddBo();
+                                        optionsList.add(bo1);
+                                    }
+                                    bo1 = optionsList.get(0);
+                                    bo1.setOptionsId(1L);
+                                    bo1.setAnalysisContent(q_content);
+                                    i = j-1; //底部会再执行加回来
+                                }
+                            }
+                        }
+                        //解题思路
+                        else if(content.startsWith("解题思路:")){
+                            int j = i+1;
+                            String q_content = content; //解题思路
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent+=q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //考查考点
+                        else if(content.startsWith("考查考点:")){
+                            int j = i+1;
+                            String q_content = content; //考查考点
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent = analysisContent + "\r\n" +q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //老师解答
+                        else if(content.startsWith("老师解答:")){
+                            int j = i+1;
+                            String q_content = content; //考查考点
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            analysisContent = analysisContent + "\r\n" +q_content;
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //问答题问题
+                        else if(content.startsWith("【问题】")){
+                            //多个问题合在一起
+                            int j = i+1;
+                            String q_content = content; //问题
+                            while (j<paragraphList.size())
+                            {
+                                String tempTxt = dealTxt(paragraphList.get(j).getText());
+                                if(checkKey(tempTxt)){
+                                    break;
+                                }
+                                q_content+=tempTxt;
+                                j++;
+                            }
+                            q_content = q_content.replace("【问题】", "");
+                            QuestionChildAddBo bo1 = null;
+                            if(optionsList.size()==0){
+                                bo1 = new QuestionChildAddBo();
+                                optionsList.add(bo1);
+                            }
+                            bo1 = optionsList.get(0);
+                            bo1.setOptionsId(1L);
+                            bo1.setContent(q_content);
+                            i = j-1; //底部会再执行加回来
+                        }
+                        //题目正文
+                        else{
+                            qContent += content;
+                        }
+                    }else{
+                        qContent = removeNo(qContent);
+                        if(Validator.isEmpty(qContent)){
+                            errorLog+="第"+index+"条题目内容空白\n";
+                            i++;
+                            continue;
+                        }
+                        QuestionAddBo bo = new QuestionAddBo();
+                        if(type==-1){
+                            errorLog+="第"+index+"条题目选项错误\n";
+                            i++;
+                            continue;
+                        }
+                        bo.setType(type);
+
+                        bo.setStatus(1);
+                        bo.setContent(qContent);
+                        bo.setAnswerQuestion(answerQuestion);
+                        bo.setAnalysisContent(analysisContent);
+                        List<QuestionChildAddBo> optionsListBak =new ArrayList<>();
+                        optionsListBak.addAll(optionsList);
+                        bo.setOptionsList(optionsListBak);
+                        bo.setCreateBy(SecurityUtils.getUsername());
+                        bo.setImportNo(importNo);
+                        bo.setPublishStatus(1);
+                        bo.setBusinessList(businessList);
+                        list.add(bo);
+                        //清空数据
+                        isOption = false;
+                        type = -1;
+                        qContent = "";
+                        index++;
+                        answerQuestion = null;
+                        analysisContent = "";
+                        optionsList.clear();
+                    }
+                    i++;
+                }
+                //    buffer = extractor.getText();
+                //extractor.close();
+
+            } else {
+                throw new CustomException("请导入word文件!");
+            }
+        }catch (IOException e){
+            System.out.println("此文件不是word文件!A"+e.getMessage()+e.toString()+e.getLocalizedMessage());
+        }
+        return list;
+    }
+
+    private String removeNo(String txt){
+        int intIndex = txt.indexOf(".");
+        if(intIndex != -1){
+            txt = txt.substring(intIndex+1);
+        }
+        return txt;
+    }
+
+    private boolean checkKey(String key){
+        if(Validator.isEmpty(key)||key.startsWith("解题思路:")||key.startsWith("考查考点:")||key.startsWith("老师解答:")||key.startsWith("正确答案:")||key.startsWith("A.")||key.startsWith("【问题】")){
+            return true;
+        }
+        return false;
+    }
+
+
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public String insertByAddBoImport(QuestionAddBo bo,Integer no) {
     public String insertByAddBoImport(QuestionAddBo bo,Integer no) {
         String errorLog = null;
         String errorLog = null;
         Question add = BeanUtil.toBean(bo, Question.class);
         Question add = BeanUtil.toBean(bo, Question.class);
         add.setCode(ServletUtils.getImportEncoded("TM")+no);
         add.setCode(ServletUtils.getImportEncoded("TM")+no);
-        if(bo.getOptionsList()!=null){
+        if(bo.getOptionsList()!=null&&bo.getOptionsList().size()>0){
             add.setJsonStr(JSON.toJSONString(bo.getOptionsList()));
             add.setJsonStr(JSON.toJSONString(bo.getOptionsList()));
         }
         }
         /*if(checkNameUnique(add)){
         /*if(checkNameUnique(add)){
@@ -347,7 +1059,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 addItem.setType(QuestionBusiness.TYPE_QUESTION);
                 addItem.setType(QuestionBusiness.TYPE_QUESTION);
                 coll.add(addItem);
                 coll.add(addItem);
             }
             }
-            iQuestionBusinessService.saveBatch(coll);
+            boolean result1  = iQuestionBusinessService.saveBatch(coll);
         }
         }
         return errorLog;
         return errorLog;
     }
     }
@@ -552,4 +1264,31 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         }
         }
         return sb.toString();
         return sb.toString();
     }
     }
+
+
+    private String dealImportAnswer(String Answer){
+        String[] itemArray = Answer.split("");
+        List<String> list = new ArrayList<>();
+        for (String v:itemArray) {
+            if("A".equals(v)){
+                list.add("1");
+            }
+            else if("B".equals(v)){
+                list.add("2");
+            }
+            else if("C".equals(v)){
+                list.add("3");
+            }
+            else if("D".equals(v)){
+                list.add("4");
+            }
+            else if("E".equals(v)){
+                list.add("5");
+            }
+            else if("F".equals(v)){
+                list.add("6");
+            }
+        }
+        return String.join(",", list);
+    }
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionChapterVo.java

@@ -79,5 +79,13 @@ public class QuestionChapterVo {
 
 
 	@ApiModelProperty("章卷下的卷")
 	@ApiModelProperty("章卷下的卷")
 	private List<ExamVo> examVos;
 	private List<ExamVo> examVos;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 
 
 }
 }

+ 26 - 26
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionExport.java

@@ -23,47 +23,33 @@ public class QuestionExport implements Serializable {
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    @Excel(name = "编号")
-    private String id;
-    /** 题目正文 */
-    @Excel(name = "题目内容")
-    private String content;
-
-    @Excel(name = "题目类型")
-    private String type;
 
 
-    @Excel(name = "正确答案")
-    private String answerQuestion;
-
-
-    @Excel(name = "答案解析")
-    private String analysisContent;
-    /** 问题内容 */
-    @Excel(name = "问题内容")
-    @ApiModelProperty("问题内容")
-    private String jsonStr;
-    /** 前缀名称 */
-    @Excel(name = "标题前缀")
-    private String prefixName;
+    private String id;
 
 
     /** 教育类型ID */
     /** 教育类型ID */
     @Excel(name = "教育类型")
     @Excel(name = "教育类型")
     private String educationType;
     private String educationType;
+    /** 项目ID */
+    @Excel(name = "项目类型")
+    private String project;
     /** 业务层次id */
     /** 业务层次id */
     @Excel(name = "业务层次")
     @Excel(name = "业务层次")
     private String business;
     private String business;
     /** 科目id */
     /** 科目id */
     @Excel(name = "科目")
     @Excel(name = "科目")
     private String subject;
     private String subject;
-    /** 项目ID */
-    @Excel(name = "项目类型")
-    private String project;
-
     @Excel(name = "知识点")
     @Excel(name = "知识点")
     private String knowledge;
     private String knowledge;
+    /** 前缀名称 */
+    @Excel(name = "标题前缀")
+    private String prefixName;
 
 
-    private List<String> knowledgeList;
+    @Excel(name = "题目类型")
+    private String type;
 
 
+    /** 题目正文 */
+    @Excel(name = "题目内容")
+    private String content;
     @Excel(name = "选项1")
     @Excel(name = "选项1")
     private String v1;
     private String v1;
     @Excel(name = "选项2")
     @Excel(name = "选项2")
@@ -76,6 +62,20 @@ public class QuestionExport implements Serializable {
     private String v5;
     private String v5;
     @Excel(name = "选项6")
     @Excel(name = "选项6")
     private String v6;
     private String v6;
+
+    @Excel(name = "正确答案")
+    private String answerQuestion;
+
+    @Excel(name = "答案解析")
+    private String analysisContent;
+    /** 问题内容 */
+
+    @ApiModelProperty("问题内容")
+    private String jsonStr;
+
+
+    private List<String> knowledgeList;
+
     @Excel(name = "失败原因")
     @Excel(name = "失败原因")
     private String cause;
     private String cause;
 
 

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionModuleVo.java

@@ -73,4 +73,12 @@ public class QuestionModuleVo {
 	private Long projectId;
 	private Long projectId;
 	@ApiModelProperty("章卷数量")
 	@ApiModelProperty("章卷数量")
 	private Integer chapterExamNum;
 	private Integer chapterExamNum;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 }
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionVo.java

@@ -99,4 +99,13 @@ public class QuestionVo {
 	@ApiModelProperty("试卷列表")
 	@ApiModelProperty("试卷列表")
 	private List<ExamVo> examList;
 	private List<ExamVo> examList;
 
 
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
+
 }
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileAddBo.java

@@ -66,4 +66,8 @@ public class UserProfileAddBo {
     /**  1 为资料审核  2为盖章审核 */
     /**  1 为资料审核  2为盖章审核 */
     @ApiModelProperty(" 1 为资料审核  2为盖章审核")
     @ApiModelProperty(" 1 为资料审核  2为盖章审核")
     private Integer typeStatus;
     private Integer typeStatus;
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 }
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileEditBo.java

@@ -73,4 +73,7 @@ public class UserProfileEditBo {
     @ApiModelProperty(" 1 为资料审核  2为盖章审核")
     @ApiModelProperty(" 1 为资料审核  2为盖章审核")
     private Integer typeStatus;
     private Integer typeStatus;
 
 
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 }
 }

+ 14 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
+import java.io.Serializable;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -22,7 +23,9 @@ import com.zhongzheng.common.core.domain.BaseEntity;
 @Data
 @Data
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @ApiModel("填写资料审核分页查询对象")
 @ApiModel("填写资料审核分页查询对象")
-public class UserProfileQueryBo extends BaseEntity {
+public class UserProfileQueryBo extends BaseEntity implements Serializable {
+
+	private static final long serialVersionUID = 1L;
 
 
 	/** 分页大小 */
 	/** 分页大小 */
 	@ApiModelProperty("分页大小")
 	@ApiModelProperty("分页大小")
@@ -105,4 +108,14 @@ public class UserProfileQueryBo extends BaseEntity {
 	@Excel(name = "类型")
 	@Excel(name = "类型")
 	@ApiModelProperty("类型")
 	@ApiModelProperty("类型")
 	private Long typeStatus;
 	private Long typeStatus;
+
+	@ApiModelProperty("查询开始时间")
+	private Long searchStartTime;
+
+	@ApiModelProperty("查询结束时间")
+	private Long searchEndTime;
+
+	/** 订单商品ID */
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
 }
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/UserProfile.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.base.domain;
 package com.zhongzheng.modules.base.domain;
 
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
@@ -59,4 +60,8 @@ private static final long serialVersionUID=1L;
 
 
     /**  1 为资料审核  2为盖章审核 */
     /**  1 为资料审核  2为盖章审核 */
     private Integer typeStatus;
     private Integer typeStatus;
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/mapper/UserProfileMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.base.mapper;
 package com.zhongzheng.modules.base.mapper;
 
 
+import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;

+ 41 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java

@@ -9,10 +9,12 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.extra.template.TemplateException;
 import cn.hutool.extra.template.TemplateException;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.fasterxml.jackson.databind.exc.InvalidFormatException;
 import com.fasterxml.jackson.databind.exc.InvalidFormatException;
 import com.openhtmltopdf.swing.Java2DRenderer;
 import com.openhtmltopdf.swing.Java2DRenderer;
 import com.openhtmltopdf.util.FSImageWriter;
 import com.openhtmltopdf.util.FSImageWriter;
+import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
@@ -24,6 +26,7 @@ import com.zhongzheng.modules.base.bo.UserProfileFit;
 import com.zhongzheng.modules.base.vo.JsonBean;
 import com.zhongzheng.modules.base.vo.JsonBean;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportVo;
 import com.zhongzheng.modules.base.vo.UserProfileExportVo;
+import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
@@ -31,6 +34,7 @@ import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
+import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.user.vo.UserVo;
 import freemarker.template.Configuration;
 import freemarker.template.Configuration;
@@ -123,8 +127,8 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
     }
     }
 
 
     @Override
     @Override
+    @DataScope(businessAlias = "cb")
     public List<UserProfileVo> queryList(UserProfileQueryBo bo) {
     public List<UserProfileVo> queryList(UserProfileQueryBo bo) {
-
         return baseMapper.selectUserProfile(bo);
         return baseMapper.selectUserProfile(bo);
     }
     }
 
 
@@ -374,6 +378,11 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         if (userProfileVo.getTypeStatus().equals(1)){
         if (userProfileVo.getTypeStatus().equals(1)){
             //审核资料发送消息
             //审核资料发送消息
             sendAuidit(update);
             sendAuidit(update);
+            if (update.getStatus().equals(1)) {
+                //审核通过同步身份证到用户信息
+                getUserPicInfo(update);
+            }
+
         }else if (userProfileVo.getTypeStatus().equals(2)){
         }else if (userProfileVo.getTypeStatus().equals(2)){
             //审核承诺书发送消息
             //审核承诺书发送消息
             sendAuiditSMS(update);
             sendAuiditSMS(update);
@@ -381,6 +390,33 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         return this.updateById(update);
         return this.updateById(update);
     }
     }
 
 
+    /**
+     * 同步身份证到用户信息
+     */
+    private void getUserPicInfo(UserProfile bo){
+        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 = null;
+            LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+            objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
+            if(maps.containsKey("recent_photos")){
+                recent_photos = JSONObject.parseObject(String.valueOf(maps.get("recent_photos")), UserProfileFit.class).getValue();
+                objectLambdaUpdateWrapper.set(User::getOneInchPhotos, recent_photos);
+            }
+            if(maps.containsKey("idcard_face_photo")){
+                idcard_face_photo = JSONObject.parseObject(String.valueOf(maps.get("idcard_face_photo")), UserProfileFit.class).getValue();
+                objectLambdaUpdateWrapper.set(User::getIdCardImg1, idcard_face_photo);
+            }
+            if(maps.containsKey("idcard_national_photo")){
+                idcard_national_photo = JSONObject.parseObject(String.valueOf(maps.get("idcard_national_photo")), UserProfileFit.class).getValue();
+                objectLambdaUpdateWrapper.set(User::getIdCardImg2, idcard_national_photo);
+            }
+            objectLambdaUpdateWrapper.set(User::getUpdateTime,DateUtils.getNowTime());
+            iUserService.update(null, objectLambdaUpdateWrapper);
+        }
+    }
+
     private void sendAuiditSMS(UserProfile bo) {
     private void sendAuiditSMS(UserProfile bo) {
         UserProfileVo userProfileVo = this.queryById(bo.getId());
         UserProfileVo userProfileVo = this.queryById(bo.getId());
         Long gradeId = baseMapper.selectGrade(userProfileVo.getUserId(),userProfileVo.getGoodsId());
         Long gradeId = baseMapper.selectGrade(userProfileVo.getUserId(),userProfileVo.getGoodsId());
@@ -589,19 +625,19 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
             userProfileExportVo.setApply_post(jsonBean.getApply_post().getValue());
             userProfileExportVo.setApply_post(jsonBean.getApply_post().getValue());
             userProfileExportVo.setMajor(jsonBean.getMajor().getValue());
             userProfileExportVo.setMajor(jsonBean.getMajor().getValue());
             userProfileExportVo.setWorking_years(jsonBean.getWorking_years().getValue());
             userProfileExportVo.setWorking_years(jsonBean.getWorking_years().getValue());
-            if (StringUtils.isNotBlank(jsonBean.getRecent_photos().getValue())) {
+            if (Validator.isNotEmpty(jsonBean.getRecent_photos())) {
                 userProfileExportVo.setRecent_photos(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getRecent_photos().getValue());
                 userProfileExportVo.setRecent_photos(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getRecent_photos().getValue());
             }
             }
 
 
-            if (StringUtils.isNotBlank(jsonBean.getIdcard_face_photo().getValue())) {
+            if (Validator.isNotEmpty(jsonBean.getIdcard_face_photo())) {
                 userProfileExportVo.setIdcard_face_photo(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getIdcard_face_photo().getValue());
                 userProfileExportVo.setIdcard_face_photo(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getIdcard_face_photo().getValue());
             }
             }
 
 
-            if (StringUtils.isNotBlank(jsonBean.getIdcard_national_photo().getValue())) {
+            if (Validator.isNotEmpty(jsonBean.getIdcard_national_photo())) {
                 userProfileExportVo.setIdcard_national_photo(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getIdcard_national_photo().getValue());
                 userProfileExportVo.setIdcard_national_photo(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getIdcard_national_photo().getValue());
             }
             }
 
 
-            if (StringUtils.isNotBlank(jsonBean.getCommitment_electr_signature().getValue())) {
+            if (Validator.isNotEmpty(jsonBean.getCommitment_electr_signature())) {
                 userProfileExportVo.setCommitment_electr_signature(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getCommitment_electr_signature().getValue());
                 userProfileExportVo.setCommitment_electr_signature(ALIYUN_OSS_ENDPOINT + "/" + jsonBean.getCommitment_electr_signature().getValue());
             }
             }
             //查找盖章得记录
             //查找盖章得记录

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/UserProfileVo.java

@@ -110,4 +110,6 @@ public class UserProfileVo {
 
 
 	/**  1 为资料审核  2为盖章审核 */
 	/**  1 为资料审核  2为盖章审核 */
 	private Integer typeStatus;
 	private Integer typeStatus;
+	/** 订单商品ID */
+	private Long orderGoodsId;
 }
 }

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseBusiness.java

@@ -48,6 +48,8 @@ private static final long serialVersionUID=1L;
 
 
     private Integer templateStatus;
     private Integer templateStatus;
 
 
-    /** 1限制视频商品做卷顺序 0不限制 */
+    /** 1限制章下做卷顺序 0不限制 2限制整个目录顺序 */
     private Integer goodsLearningOrder;
     private Integer goodsLearningOrder;
+
+
 }
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseBusinessServiceImpl.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.course.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.course.bo.CourseProjectTypeQueryBo;
 import com.zhongzheng.modules.course.bo.CourseProjectTypeQueryBo;
@@ -40,6 +41,7 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
     public CourseBusinessVo queryById(Long id){
     public CourseBusinessVo queryById(Long id){
         CourseBusinessQueryBo courseBusinessQueryBo = new CourseBusinessQueryBo();
         CourseBusinessQueryBo courseBusinessQueryBo = new CourseBusinessQueryBo();
         courseBusinessQueryBo.setId(id);
         courseBusinessQueryBo.setId(id);
+        System.out.println(id+"业务ID");
         List<CourseBusinessVo> courseBusinessVos = entity2Vo(baseMapper.queryList(courseBusinessQueryBo));
         List<CourseBusinessVo> courseBusinessVos = entity2Vo(baseMapper.queryList(courseBusinessQueryBo));
         if (CollectionUtils.isEmpty(courseBusinessVos)){
         if (CollectionUtils.isEmpty(courseBusinessVos)){
             throw new IllegalArgumentException("请输入正确业务ID");
             throw new IllegalArgumentException("请输入正确业务ID");
@@ -148,6 +150,10 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
     @Override
     @Override
     public boolean editLearningOrder(CourseBusinessEditBo bo) {
     public boolean editLearningOrder(CourseBusinessEditBo bo) {
         for (Long businessId : bo.getBusinessIds()) {
         for (Long businessId : bo.getBusinessIds()) {
+            CourseBusinessVo oldBusiness = this.queryById(businessId);
+            if(oldBusiness.getGoodsLearningOrder()!=0){
+                throw new CustomException("无法修改学习顺序");
+            }
             CourseBusiness update =new CourseBusiness();
             CourseBusiness update =new CourseBusiness();
             update.setUpdateTime(DateUtils.getNowTime());
             update.setUpdateTime(DateUtils.getNowTime());
             update.setId(businessId);
             update.setId(businessId);

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -359,6 +359,14 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             goodsUserVo.setClassEndTime(classGradeVo.getClassEndTime());
             goodsUserVo.setClassEndTime(classGradeVo.getClassEndTime());
             goodsUserVo.setPeriodStatus(classGradeVo.getPeriodStatus());
             goodsUserVo.setPeriodStatus(classGradeVo.getPeriodStatus());
             goodsUserVo.setClassStatus(classGradeVo.getClassStatus());
             goodsUserVo.setClassStatus(classGradeVo.getClassStatus());
+            goodsUserVo.setRecordNum(classGradeVo.getRecordNum());
+            goodsUserVo.setExamNum(classGradeVo.getExamNum());
+            goodsUserVo.setInterfaceAccountId(classGradeVo.getInterfaceAccountId());
+            goodsUserVo.setInterfacePushId(classGradeVo.getInterfacePushId());
+            goodsUserVo.setOfficialLearningUrl(classGradeVo.getOfficialLearningUrl());
+            goodsUserVo.setOfficialStatus(classGradeVo.getOfficialStatus());
+            goodsUserVo.setLearnStatus(classGradeVo.getLearnStatus());
+            goodsUserVo.setPeriodPlush(classGradeVo.getPeriodPlush());
             Long secLong = 0L;
             Long secLong = 0L;
             Long studyLong = 0L;
             Long studyLong = 0L;
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseBusinessVo.java

@@ -88,8 +88,8 @@ public class CourseBusinessVo {
 	@ApiModelProperty("模板选用名称")
 	@ApiModelProperty("模板选用名称")
 	private String templateName;
 	private String templateName;
 
 
-	/** 1限制视频商品做卷顺序 0不限制 */
-	@Excel(name = "1限制视频商品做卷顺序 0不限制")
-	@ApiModelProperty("1限制视频商品做卷顺序 0不限制")
+	/** 1限制章下做卷顺序 0不限制 2限制整个目录顺序 */
+	@Excel(name = "1限制章下做卷顺序 0不限制 2限制整个目录顺序")
+	@ApiModelProperty("1限制章下做卷顺序 0不限制 2限制整个目录顺序")
 	private Integer goodsLearningOrder;
 	private Integer goodsLearningOrder;
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterVo.java

@@ -69,4 +69,12 @@ public class CourseChapterVo {
 	@Excel(name = "节时间")
 	@Excel(name = "节时间")
 	@ApiModelProperty("节时间")
 	@ApiModelProperty("节时间")
 	private Integer durationTime;
 	private Integer durationTime;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleVo.java

@@ -64,5 +64,13 @@ public class CourseModuleVo {
 	@Excel(name = "章数")
 	@Excel(name = "章数")
 	@ApiModelProperty("章数")
 	@ApiModelProperty("章数")
 	private Integer chapterNum;
 	private Integer chapterNum;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 
 
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionVo.java

@@ -90,4 +90,12 @@ public class CourseSectionVo {
 	/** 课程列表 */
 	/** 课程列表 */
 	@ApiModelProperty("课程列表")
 	@ApiModelProperty("课程列表")
 	private List<CourseSectionListVo> courseList;
 	private List<CourseSectionListVo> courseList;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseStreamingVo.java

@@ -81,5 +81,13 @@ public class CourseStreamingVo {
 	@Excel(name = "保利威视频url")
 	@Excel(name = "保利威视频url")
 	@ApiModelProperty("保利威视频url")
 	@ApiModelProperty("保利威视频url")
 	private String polyvUrl;
 	private String polyvUrl;
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 
 
 }
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseUserVo.java

@@ -125,4 +125,10 @@ public class CourseUserVo {
 	@Excel(name = "1 需重修")
 	@Excel(name = "1 需重修")
 	@ApiModelProperty("1 需重修")
 	@ApiModelProperty("1 需重修")
 	private Integer rebuild;
 	private Integer rebuild;
+	/** 节数 */
+	@ApiModelProperty("试卷数")
+	private Long examNum;
+	/** 已做试卷 */
+	@ApiModelProperty("已做试卷")
+	private Long recordNum;
 }
 }

+ 8 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamKnowledgeVo.java

@@ -44,6 +44,13 @@ public class ExamKnowledgeVo {
 	@ApiModelProperty("业务层次")
 	@ApiModelProperty("业务层次")
 	private List<CourseBusinessVo> courseBusinessList;
 	private List<CourseBusinessVo> courseBusinessList;
 
 
-
+	/** 添加时间 */
+	@ApiModelProperty("添加时间")
+	@Excel(name = "添加时间")
+	private Long createTime;
+	/** 修改时间 */
+	@ApiModelProperty("修改时间")
+	@Excel(name = "修改时间")
+	private Long updateTime;
 
 
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
@@ -32,6 +33,7 @@ import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
+import com.zhongzheng.modules.user.domain.UserBankRecord;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -253,6 +255,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             }
             }
             iGoodsCourseService.saveBatch(coll);
             iGoodsCourseService.saveBatch(coll);
         }
         }
+        if(Validator.isEmpty(bo.getBuyNote())){
+            LambdaUpdateWrapper<Goods> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+            objectLambdaUpdateWrapper.eq(Goods::getGoodsId,bo.getGoodsId());
+            objectLambdaUpdateWrapper.set(Goods::getBuyNote,null);
+            update(null, objectLambdaUpdateWrapper);
+        }
         //试听列表
         //试听列表
         if(bo.getAuditionList()!=null&&bo.getAuditionList().size()>0){
         if(bo.getAuditionList()!=null&&bo.getAuditionList().size()>0){
             update.setGoodsAuditionConfig(JSON.toJSONString(bo.getAuditionList()));
             update.setGoodsAuditionConfig(JSON.toJSONString(bo.getAuditionList()));

+ 30 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java

@@ -324,5 +324,34 @@ public class GoodsUserVo {
 	private Integer classStatus;
 	private Integer classStatus;
 	@ApiModelProperty("预约ID")
 	@ApiModelProperty("预约ID")
 	private Integer subscribeId;
 	private Integer subscribeId;
-
+	/** 节数 */
+	@ApiModelProperty("试卷数")
+	private Long examNum;
+	/** 已做试卷 */
+	@ApiModelProperty("已做试卷")
+	private Long recordNum;
+	/** 官方学习地址 */
+	@Excel(name = "官方学习地址")
+	@ApiModelProperty("官方学习地址")
+	private String officialLearningUrl;
+	/** 官方推送状态 1是 0否 */
+	@Excel(name = "官方推送状态 1是 0否")
+	@ApiModelProperty("官方推送状态 1是 0否")
+	private Integer officialStatus;
+	/** 官方学习账号推送状态 0否 1是 */
+	@Excel(name = "官方学习账号推送状态 0否 1是")
+	@ApiModelProperty("官方学习账号推送状态 0否 1是")
+	private Integer learnStatus;
+	/** 官方账号开通 */
+	@Excel(name = "官方账号开通")
+	@ApiModelProperty("官方账号开通")
+	private Long interfaceAccountId;
+	/** 官方信息推送接口 */
+	@Excel(name = "官方信息推送接口")
+	@ApiModelProperty("官方信息推送接口")
+	private Long interfacePushId;
+	/** 是否学时推送 0未推送 1推送 */
+	@Excel(name = "是否学时推送 0未推送 1推送")
+	@ApiModelProperty("是否学时推送 0未推送 1推送")
+	private Integer periodPlush;
 }
 }

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

@@ -240,4 +240,6 @@ public class GoodsVo {
 
 
 	@ApiModelProperty("节数量")
 	@ApiModelProperty("节数量")
 	private Long sectionNum;
 	private Long sectionNum;
+	@ApiModelProperty("班级数量")
+	private Long gradeNum;
 }
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeAddBo.java

@@ -86,4 +86,8 @@ public class ClassGradeAddBo {
     /** 班級編碼 */
     /** 班級編碼 */
     @ApiModelProperty("班級編碼")
     @ApiModelProperty("班級編碼")
     private String gradeCode;
     private String gradeCode;
+
+    /** 官方学习地址 */
+    @ApiModelProperty("官方学习地址")
+    private String officialLearningUrl;
 }
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeEditBo.java

@@ -104,4 +104,7 @@ public class ClassGradeEditBo {
     @ApiModelProperty("班級編碼")
     @ApiModelProperty("班級編碼")
     private String gradeCode;
     private String gradeCode;
 
 
+    /** 官方学习地址 */
+    @ApiModelProperty("官方学习地址")
+    private String officialLearningUrl;
 }
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java

@@ -135,4 +135,10 @@ public class ClassGradeUserQueryBo extends BaseEntity {
 
 
 	@ApiModelProperty("搜索关键词")
 	@ApiModelProperty("搜索关键词")
 	private String searchKey;
 	private String searchKey;
+
+	@ApiModelProperty("查询开始时间")
+	private Long searchStartTime;
+
+	@ApiModelProperty("查询结束时间")
+	private Long searchEndTime;
 }
 }

+ 2 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java

@@ -64,15 +64,12 @@ private static final long serialVersionUID=1L;
     private Long sysUserId;
     private Long sysUserId;
 
 
     /** 官方信息推送接口 */
     /** 官方信息推送接口 */
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long interfacePushId;
     private Long interfacePushId;
     /** 备注 */
     /** 备注 */
     private String remark;
     private String remark;
     /** 官方账号开通 */
     /** 官方账号开通 */
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long interfaceAccountId;
     private Long interfaceAccountId;
     /** 学时推送 */
     /** 学时推送 */
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long interfacePeriodId;
     private Long interfacePeriodId;
 
 
     /** 报考地区 */
     /** 报考地区 */
@@ -80,4 +77,6 @@ private static final long serialVersionUID=1L;
 
 
     /** 班級編碼 */
     /** 班級編碼 */
     private String gradeCode;
     private String gradeCode;
+    /** 官方学习地址 */
+    private String officialLearningUrl;
 }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeUser.java

@@ -70,5 +70,7 @@ private static final long serialVersionUID=1L;
     private Long officialStatusNum;
     private Long officialStatusNum;
     /** 是否学时推送 0未推送 1推送 */
     /** 是否学时推送 0未推送 1推送 */
     private Integer periodPlush;
     private Integer periodPlush;
+    /** 官方学时推送次数 */
+    private Long periodStatusNum;
 }
 }
 
 

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java

@@ -5,6 +5,7 @@ import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.grade.vo.*;
 import com.zhongzheng.modules.grade.vo.*;
+import com.zhongzheng.modules.user.bo.UserQueryBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.User;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
@@ -56,4 +57,15 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
     Long selectUserCount(User bo);
     Long selectUserCount(User bo);
 
 
     List<CourseChapterVo> findChapterList(ClassGradeUserQueryBo bo);
     List<CourseChapterVo> findChapterList(ClassGradeUserQueryBo bo);
+
+    Long selectOfficialInfoCount(ClassGradeUserQueryBo bo);
+
+    Long selectOfficialPeriodCount(ClassGradeUserQueryBo bo);
+
+    List<ClassGradeUserGoodsVo> selectOfficialNotPush(UserQueryBo bo);
+
+    List<ClassGradeUserGoodsVo> selectPeriodNotPush(UserQueryBo bo);
+
+    Long selectLearnStatusCount(ClassGradeUserQueryBo bo);
+
 }
 }

+ 15 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java

@@ -7,10 +7,13 @@ import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.vo.*;
 import com.zhongzheng.modules.grade.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.bo.UserQueryBo;
+import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.User;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 学员记录Service接口
  * 学员记录Service接口
@@ -53,7 +56,7 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 
 	String pushOfficialPeriodMore(List<ClassGradeUserQueryBo> list);
 	String pushOfficialPeriodMore(List<ClassGradeUserQueryBo> list);
 
 
-	List<ClassPeriodStudentExportVo> exportPo(ClassGradeUserQueryBo bo);
+	List<ClassPeriodStudentExportAllVo> exportPo(ClassGradeUserQueryBo bo);
 
 
 	/**
 	/**
 	 * 根据编辑业务对象修改学员记录
 	 * 根据编辑业务对象修改学员记录
@@ -74,6 +77,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 
 	List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 	List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 
 
+	List<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo);
+
 	List<UserPeriodExportVo> listUserStudyRecord(ClassGradeUserQueryBo bo);
 	List<UserPeriodExportVo> listUserStudyRecord(ClassGradeUserQueryBo bo);
 
 
     List<ClassPeriodUserVo> listPeriod(ClassGradeUserQueryBo bo);
     List<ClassPeriodUserVo> listPeriod(ClassGradeUserQueryBo bo);
@@ -97,4 +102,13 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 	Long selectList(User bo);
 	Long selectList(User bo);
 
 
 	List<CourseChapterVo> findChapterList(ClassGradeUserQueryBo bo);
 	List<CourseChapterVo> findChapterList(ClassGradeUserQueryBo bo);
+
+	Map<String,Object> selectOfficialInfoCount(ClassGradeUserQueryBo bo);
+
+	Long selectOfficialPeriodCount(ClassGradeUserQueryBo bo);
+
+	List<ClassGradeUserGoodsVo> selectOfficialNotPush(UserQueryBo bo);
+
+	List<ClassGradeUserGoodsVo> selectPeriodNotPush(UserQueryBo bo);
+
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.grade.service.impl;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -34,6 +35,7 @@ import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
+import com.zhongzheng.modules.order.mapper.OrderMapper;
 import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserUpdateQueryBo;
 import com.zhongzheng.modules.user.bo.UserUpdateQueryBo;
@@ -107,6 +109,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     @Autowired
     private IUserService iUserService;
     private IUserService iUserService;
 
 
+    @Autowired
+    private OrderMapper orderMapper;
+
     @Autowired
     @Autowired
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
 
 
@@ -381,6 +386,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             UserUpdateQueryBo userUpdateQueryBo = new UserUpdateQueryBo();
             UserUpdateQueryBo userUpdateQueryBo = new UserUpdateQueryBo();
             userUpdateQueryBo.setUserId(classGradeStudentVo.getUserId());
             userUpdateQueryBo.setUserId(classGradeStudentVo.getUserId());
             classGradeStudentVo.setUserUpdates(iUserUpdateService.queryList(userUpdateQueryBo));
             classGradeStudentVo.setUserUpdates(iUserUpdateService.queryList(userUpdateQueryBo));
+            if(Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId())&&classGradeStudentVo.getRebuyOrderGoodsId().longValue()>0){
+                classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(),classGradeStudentVo.getUserId()));
+            }
         }
         }
         return classGradeStudentVos;
         return classGradeStudentVos;
     }
     }

+ 155 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -16,6 +16,8 @@ import com.zhongzheng.common.utils.AES;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.polyv.PolyvUtils;
 import com.zhongzheng.common.utils.polyv.PolyvUtils;
+import com.zhongzheng.modules.base.domain.UserProfile;
+import com.zhongzheng.modules.base.service.IUserProfileService;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
@@ -33,6 +35,8 @@ import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
+import com.zhongzheng.modules.user.bo.UserQueryBo;
+import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserPlan;
 import com.zhongzheng.modules.user.domain.UserPlan;
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
@@ -41,6 +45,7 @@ import com.zhongzheng.modules.user.service.IUserStudyRecordPhotoService;
 import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import com.zhongzheng.modules.user.vo.SubjectStudyRecordVo;
 import com.zhongzheng.modules.user.vo.SubjectStudyRecordVo;
 import com.zhongzheng.modules.user.vo.UserStudyRecordPhotoVo;
 import com.zhongzheng.modules.user.vo.UserStudyRecordPhotoVo;
+import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.binary.Base64;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
@@ -105,6 +110,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
     @Autowired
     @Autowired
     private IClassGradeUserService iClassGradeUserService;
     private IClassGradeUserService iClassGradeUserService;
 
 
+    @Autowired
+    private IUserProfileService iUserProfileService;
+
     @Value("${aliyun.oss.endpoint}")
     @Value("${aliyun.oss.endpoint}")
     private String ALIYUN_OSS_ENDPOINT;
     private String ALIYUN_OSS_ENDPOINT;
 
 
@@ -390,7 +398,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                 }
                 }
             }
             }
         }
         }
-
         classGradeUser1.setUpdateTime(DateUtils.getNowTime());
         classGradeUser1.setUpdateTime(DateUtils.getNowTime());
         iClassGradeUserService.update(classGradeUser1, classGradeUser);
         iClassGradeUserService.update(classGradeUser1, classGradeUser);
         return gradePeriodStatus;
         return gradePeriodStatus;
@@ -423,7 +430,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             if(userVo.getClassStartTime().longValue()>nowTime){
             if(userVo.getClassStartTime().longValue()>nowTime){
                 return "班级有效期未开始";
                 return "班级有效期未开始";
             }
             }
-            if(nowTime>userVo.getClassStartTime().longValue()){
+            if(nowTime>userVo.getClassEndTime().longValue()){
                 return "班级有效期已结束";
                 return "班级有效期已结束";
             }
             }
         }
         }
@@ -461,6 +468,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusTime,DateUtils.getNowTime());
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusTime,DateUtils.getNowTime());
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusNum,userVo.getOfficialStatusNum()+1);
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusNum,userVo.getOfficialStatusNum()+1);
              this.update(null, objectLambdaUpdateWrapper);
              this.update(null, objectLambdaUpdateWrapper);
+
+             //修改资料变更状态
+
              return null;
              return null;
          }else {
          }else {
              //推送失败
              //推送失败
@@ -468,7 +478,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
              objectLambdaUpdateWrapper.eq(ClassGradeUser::getId, userVo.getId());
              objectLambdaUpdateWrapper.eq(ClassGradeUser::getId, userVo.getId());
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusMsg, respone);
              objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusMsg, respone);
              objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
              objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
-             objectLambdaUpdateWrapper.set(ClassGradeUser::getOfficialStatusTime,DateUtils.getNowTime());
              this.update(null, objectLambdaUpdateWrapper);
              this.update(null, objectLambdaUpdateWrapper);
              return respone;
              return respone;
          }
          }
@@ -521,10 +530,14 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             if(userVo.getClassStartTime().longValue()>nowTime){
             if(userVo.getClassStartTime().longValue()>nowTime){
                 return "班级有效期未开始";
                 return "班级有效期未开始";
             }
             }
-            if(nowTime>userVo.getClassStartTime().longValue()){
+            if(nowTime>userVo.getClassEndTime().longValue()){
                 return "班级有效期已结束";
                 return "班级有效期已结束";
             }
             }
         }
         }
+        if(userVo.getPeriodStatus()!=1){
+            return "学时审核没通过";
+        }
+
         OrderGoodsQueryBo goodsQueryBo = new OrderGoodsQueryBo();
         OrderGoodsQueryBo goodsQueryBo = new OrderGoodsQueryBo();
         goodsQueryBo.setUserId(bo.getUserId());
         goodsQueryBo.setUserId(bo.getUserId());
         goodsQueryBo.setGradeId(userVo.getGradeId());
         goodsQueryBo.setGradeId(userVo.getGradeId());
@@ -532,13 +545,27 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         if(Validator.isEmpty(orderGoods)){
         if(Validator.isEmpty(orderGoods)){
             return "班级商品不存在";
             return "班级商品不存在";
         }
         }
+
+        UserProfile userProfile = iUserProfileService.getOne(new LambdaQueryWrapper<UserProfile>()
+                .eq(UserProfile::getUserId,bo.getUserId()).eq(UserProfile::getGoodsId,orderGoods.getGoodsId())
+                .eq(UserProfile::getCurrentStatus,1).eq(UserProfile::getTypeStatus,1)
+                .last("limit 1"));
+        if(Validator.isNotEmpty(userProfile)&&userProfile.getStatus()!=1){
+            return "资料审核没通过";
+        }
+
+        UserStudyRecordQueryBo studyRecordQueryBo = new UserStudyRecordQueryBo();
+        studyRecordQueryBo.setUserId(bo.getUserId());
+        studyRecordQueryBo.setGradeId(userVo.getGradeId());
+        //第一条学习记录
+        UserStudyRecordVo firstVo = iUserStudyRecordService.queryFirst(studyRecordQueryBo);
         Map<String, String> params =  new HashMap<>();
         Map<String, String> params =  new HashMap<>();
         params.put("zh",OFFICIALPUSH_INFOACCOUNT);
         params.put("zh",OFFICIALPUSH_INFOACCOUNT);
         params.put("bh",userVo.getOfficialName());
         params.put("bh",userVo.getOfficialName());
         params.put("xm",userVo.getRealName());
         params.put("xm",userVo.getRealName());
         params.put("sfz",userVo.getIdCard());
         params.put("sfz",userVo.getIdCard());
-        params.put("ksrq",DateUtils.timestampToDate(orderGoods.getCreateTime()));
-        params.put("jsrq",DateUtils.timestampToDate(userVo.getPeriodTime()));
+        params.put("ksrq",DateUtils.timestampToDate(firstVo.getFirstStartTime()));
+        params.put("jsrq",DateUtils.timestampToDate(userVo.getPeriodWaitTime()));
         String  dataTxt = params.get("zh")+params.get("bh")+params.get("xm")+params.get("sfz")+params.get("ksrq")+params.get("jsrq");
         String  dataTxt = params.get("zh")+params.get("bh")+params.get("xm")+params.get("sfz")+params.get("ksrq")+params.get("jsrq");
         String encrypted = dataSign(dataTxt,OFFICIALPUSH_TOKEN);
         String encrypted = dataSign(dataTxt,OFFICIALPUSH_TOKEN);
         params.put("SignMsg",encrypted);
         params.put("SignMsg",encrypted);
@@ -557,6 +584,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushMsg, respone);
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushMsg, respone);
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushTime,DateUtils.getNowTime());
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushTime,DateUtils.getNowTime());
+                objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodStatusNum,userVo.getPeriodStatusNum()+1);
                 this.update(null, objectLambdaUpdateWrapper);
                 this.update(null, objectLambdaUpdateWrapper);
                 return null;
                 return null;
             }else {
             }else {
@@ -565,7 +593,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                 objectLambdaUpdateWrapper.eq(ClassGradeUser::getId, userVo.getId());
                 objectLambdaUpdateWrapper.eq(ClassGradeUser::getId, userVo.getId());
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushMsg, respone);
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushMsg, respone);
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
                 objectLambdaUpdateWrapper.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
-                objectLambdaUpdateWrapper.set(ClassGradeUser::getPeriodPlushTime,DateUtils.getNowTime());
                 this.update(null, objectLambdaUpdateWrapper);
                 this.update(null, objectLambdaUpdateWrapper);
                 return respone;
                 return respone;
             }
             }
@@ -636,7 +663,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
 
 
 
 
     @Override
     @Override
-    public List<ClassPeriodStudentExportVo> exportPo(ClassGradeUserQueryBo bo) {
+    public List<ClassPeriodStudentExportAllVo> exportPo(ClassGradeUserQueryBo bo) {
         //查询班级学员信息
         //查询班级学员信息
         List<ClassPeriodStudentVo> classPeriodStudentVos = baseMapper.listUserPeriod(bo);
         List<ClassPeriodStudentVo> classPeriodStudentVos = baseMapper.listUserPeriod(bo);
         List<ClassPeriodStudentExportVo> exportList = new ArrayList<>();
         List<ClassPeriodStudentExportVo> exportList = new ArrayList<>();
@@ -737,7 +764,28 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             addItem.setPeriodVoList(listUserStudyRecord(classGradeUserQueryBo1));
             addItem.setPeriodVoList(listUserStudyRecord(classGradeUserQueryBo1));
             exportList.add(addItem);
             exportList.add(addItem);
         }
         }
-        return exportList;
+        return fillList(exportList);
+    }
+
+    //填充满列表的用户信息
+    private List<ClassPeriodStudentExportAllVo>  fillList(List<ClassPeriodStudentExportVo> list){
+        List<ClassPeriodStudentExportAllVo> newList = new ArrayList<>();
+        for(ClassPeriodStudentExportVo vo : list){
+            for(UserPeriodExportVo cVo : vo.getPeriodVoList()){
+                ClassPeriodStudentExportAllVo item = BeanUtil.toBean(vo, ClassPeriodStudentExportAllVo.class);
+                item.setId(cVo.getId());
+                item.setModuleName(cVo.getModuleName());
+                item.setChapterName(cVo.getChapterName());
+                item.setSectionName(cVo.getSectionName());
+                item.setDurationTime(cVo.getDurationTime());
+                item.setStudyTimeTxt(cVo.getStudyTimeTxt());
+                item.setStudyTimeLongTxt(cVo.getStudyTimeLongTxt());
+                item.setStudyStatusTxt(cVo.getStudyStatusTxt());
+                item.setScore(cVo.getScore());
+                newList.add(item);
+            }
+        }
+        return newList;
     }
     }
 
 
     private UserPeriodExportVo mergeData(Long index,String moduleName,String chapterName,String sectionName,ClassPeriodSectionVo classPeriodSectionVo,BigDecimal performance,Boolean isExam){
     private UserPeriodExportVo mergeData(Long index,String moduleName,String chapterName,String sectionName,ClassPeriodSectionVo classPeriodSectionVo,BigDecimal performance,Boolean isExam){
@@ -932,6 +980,78 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return classPeriodStudentVos;
         return classPeriodStudentVos;
     }
     }
 
 
+    @Override
+    public List<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo) {
+        //查询班级学员信息
+        List<ClassPeriodStudentVo> classPeriodStudentVos = baseMapper.listUserPeriod(bo);
+        //查找学员学习记录
+        for (ClassPeriodStudentVo classPeriodStudentVo : classPeriodStudentVos) {
+        //    Long secLong = 0L;
+        //    Long studyLong = 0L;
+
+           /* SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
+            subjectStudyRecordQueryBo.setGoodsId(classPeriodStudentVo.getGoodsId());
+            subjectStudyRecordQueryBo.setUserId(classPeriodStudentVo.getUserId());
+            subjectStudyRecordQueryBo.setGradeId(classPeriodStudentVo.getGradeId());
+            List<SubjectStudyRecordVo> subjectStudyRecordVos = iUserStudyRecordService.listSubject(subjectStudyRecordQueryBo);
+            for (SubjectStudyRecordVo subjectStudyRecordVo : subjectStudyRecordVos) {
+                secLong = new BigDecimal(secLong.toString()).add(new BigDecimal(subjectStudyRecordVo.getSectionNum().toString())).longValue();
+                studyLong = new BigDecimal(studyLong.toString()).add(new BigDecimal(subjectStudyRecordVo.getRecordNum().toString())).longValue();
+
+            }*/
+            //总节数
+         //   classPeriodStudentVo.setSecAllNum(secLong);
+            //学习节数
+        //    classPeriodStudentVo.setStuAllNum(studyLong);
+
+            //总的审核状态按照策划规则
+            ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
+            classGradeUserQueryBo.setGradeId(classPeriodStudentVo.getGradeId());
+            classGradeUserQueryBo.setUserId(classPeriodStudentVo.getUserId());
+            classGradeUserQueryBo.setGoodsId(classPeriodStudentVo.getGoodsId());
+        //    List<ClassPeriodUserVo> classPeriodUserVos1 = baseMapper.listPeriod(classGradeUserQueryBo);
+        //    ClassPeriodUserVo classPeriodUserVos = classPeriodUserVos1.get(0);
+        //    classPeriodUserVos.setPending(classPeriodStudentVo.getSecAllNum()-classPeriodUserVos.getPass()-classPeriodUserVos.getCheat());
+        //    classPeriodUserVos.setExamPending(classPeriodUserVos.getExamNum()-classPeriodUserVos.getExamPass()-classPeriodUserVos.getExamCheat());
+            //當前班級學員審核狀態 -1不可审核 0待審  1未通过 2通过
+            Integer gradePeriodStatus = 0; //班级里的审核状态字段,保持一致 0 未通过 1通过 2待审核 -1 不可审核
+
+            classPeriodStudentVo.setAllStatus(changePeriodStatus(classPeriodStudentVo.getPeriodStatus()));
+
+        //    classPeriodStudentVo.setWaitRebuildNum(classPeriodUserVos.getCheat()+classPeriodUserVos.getExamCheat());
+            if (!CollectionUtils.isEmpty(baseMapper.selectStart(classPeriodStudentVo.getUserId(),classPeriodStudentVo.getGoodsId(),classPeriodStudentVo.getGradeId()))) {
+                //查找开始学习时间
+                classPeriodStudentVo.setStartTime(baseMapper.selectStart(classPeriodStudentVo.getUserId(),classPeriodStudentVo.getGoodsId(),classPeriodStudentVo.getGradeId()).get(0));
+            }
+
+            if(Validator.isNotEmpty(bo.getUserPhoto())&&bo.getUserPhoto()==1){
+                //解析身份证和一寸照
+                if(Validator.isNotEmpty(classPeriodStudentVo.getKeyValue())){
+                    JSONObject keyJSON = null;
+                    try {
+                        keyJSON = JSON.parseObject(classPeriodStudentVo.getKeyValue());
+                        if(keyJSON.containsKey("recent_photos")){
+                            String recent_photos_data = keyJSON.getString("recent_photos");
+                            JSONObject recent_photos_jsondata= JSON.parseObject(recent_photos_data);
+                            String recent_photos = recent_photos_jsondata.getString("value");
+                            classPeriodStudentVo.setOneInchPhotos(recent_photos);
+                        }
+                        if(keyJSON.containsKey("idcard_face_photo")){
+                            String idcard_face_photo_data = keyJSON.getString("idcard_face_photo");
+                            JSONObject idcard_face_photo_jsondata= JSON.parseObject(idcard_face_photo_data);
+                            String idcard_face_photo = idcard_face_photo_jsondata.getString("value");
+                            classPeriodStudentVo.setIdCardImg1(idcard_face_photo);
+                        }
+                        classPeriodStudentVo.setKeyValue(null);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        return classPeriodStudentVos;
+    }
+
     private Integer changePeriodStatus(Long gradePeriodStatus){
     private Integer changePeriodStatus(Long gradePeriodStatus){
         //當前班級學員審核狀態 -1不可审核 0待審  1未通过 2通过
         //當前班級學員審核狀態 -1不可审核 0待審  1未通过 2通过
         //班级里的审核状态字段,保持一致 0 未通过 1通过 2待审核 -1 不可审核
         //班级里的审核状态字段,保持一致 0 未通过 1通过 2待审核 -1 不可审核
@@ -1204,6 +1324,8 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return classPeriodUserVos;
         return classPeriodUserVos;
     }
     }
 
 
+
+
     @Override
     @Override
     public List<ClassPeriodVo> listPeriodAudit(ClassGradeUserQueryBo bo) {
     public List<ClassPeriodVo> listPeriodAudit(ClassGradeUserQueryBo bo) {
         //查找最外层课程目录 模块 章 节
         //查找最外层课程目录 模块 章 节
@@ -1483,7 +1605,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
 
 
     @Override
     @Override
     public Long selectList(User bo) {
     public Long selectList(User bo) {
-
         return baseMapper.selectUserCount(bo);
         return baseMapper.selectUserCount(bo);
     }
     }
 
 
@@ -1492,6 +1613,30 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return baseMapper.findChapterList(bo);
         return baseMapper.findChapterList(bo);
     }
     }
 
 
+    @Override
+    public Map<String,Object> selectOfficialInfoCount(ClassGradeUserQueryBo bo) {
+        Map<String,Object> map = new HashMap<>();
+        map.put("officialInfoCount",baseMapper.selectOfficialInfoCount(bo));
+        map.put("learnStatus",baseMapper.selectLearnStatusCount(bo));
+        return map;
+    }
+
+    @Override
+    public Long selectOfficialPeriodCount(ClassGradeUserQueryBo bo) {
+        return baseMapper.selectOfficialPeriodCount(bo);
+    }
+
+    @Override
+    public List<ClassGradeUserGoodsVo> selectOfficialNotPush(UserQueryBo bo) {
+        return baseMapper.selectOfficialNotPush(bo);
+    }
+
+    @Override
+    public List<ClassGradeUserGoodsVo> selectPeriodNotPush(UserQueryBo bo) {
+        return baseMapper.selectPeriodNotPush(bo);
+    }
+
+
     /**
     /**
      * 实体类转化成视图对象
      * 实体类转化成视图对象
      *
      *

+ 16 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java

@@ -205,9 +205,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
             userPeriodEditBo.setGoodsId(userPeriodVo.getGoodsId());
             userPeriodEditBo.setGoodsId(userPeriodVo.getGoodsId());
             userPeriodEditBo.setGradeId(userPeriodVo.getGradeId());
             userPeriodEditBo.setGradeId(userPeriodVo.getGradeId());
             userPeriodEditBo.setStatus(bo.getStatus());
             userPeriodEditBo.setStatus(bo.getStatus());
-            //发送消息
-            sendPeriodSMS(userPeriodEditBo);
-            sendPeriodSevenSMS(userPeriodEditBo);
+
 
 
             //修改学员班级审核状态
             //修改学员班级审核状态
             LambdaQueryWrapper<ClassGradeUser> classGradeUser = Wrappers.lambdaQuery();
             LambdaQueryWrapper<ClassGradeUser> classGradeUser = Wrappers.lambdaQuery();
@@ -219,12 +217,16 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
             classGradeUser1.setUpdateTime(DateUtils.getNowTime());
             classGradeUser1.setUpdateTime(DateUtils.getNowTime());
             List<ClassGradeUser> list1 = iClassGradeUserService.list(classGradeUser);
             List<ClassGradeUser> list1 = iClassGradeUserService.list(classGradeUser);
             iClassGradeUserService.update(classGradeUser1, classGradeUser);
             iClassGradeUserService.update(classGradeUser1, classGradeUser);
-            //生成证书
             ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
             ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
             classGradeUserQueryBo.setUserId(userPeriodVo.getUserId());
             classGradeUserQueryBo.setUserId(userPeriodVo.getUserId());
             classGradeUserQueryBo.setGradeId(userPeriodVo.getGradeId());
             classGradeUserQueryBo.setGradeId(userPeriodVo.getGradeId());
             classGradeUserQueryBo.setGoodsId(userPeriodVo.getGoodsId());
             classGradeUserQueryBo.setGoodsId(userPeriodVo.getGoodsId());
-            iCertificateTpService.makeCertificatePhoto(classGradeUserQueryBo);
+            //处理学时通过事件
+            periodPass(classGradeUserQueryBo);
+            //发送消息
+            sendPeriodSMS(userPeriodEditBo);
+            sendPeriodSevenSMS(userPeriodEditBo);
+
         } else {
         } else {
             //作弊情况下判断是否已经全部审核完成,完成发送消息
             //作弊情况下判断是否已经全部审核完成,完成发送消息
             for (UserPeriod userPeriod : listPeriodVo) {
             for (UserPeriod userPeriod : listPeriodVo) {
@@ -307,8 +309,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
         classGradeUserQueryBo.setGoodsId(bo.getGoodsId());
         classGradeUserQueryBo.setGoodsId(bo.getGoodsId());
         Integer gradePeriodStatus = iClassGradeUserService.updateUserPeriodStatus(classGradeUserQueryBo);
         Integer gradePeriodStatus = iClassGradeUserService.updateUserPeriodStatus(classGradeUserQueryBo);
         if(gradePeriodStatus==1){
         if(gradePeriodStatus==1){
-            //生成证书
-            iCertificateTpService.makeCertificatePhoto(classGradeUserQueryBo);
+            periodPass(classGradeUserQueryBo);
         }
         }
         //发送消息
         //发送消息
         if(gradePeriodStatus==1||gradePeriodStatus==0){
         if(gradePeriodStatus==1||gradePeriodStatus==0){
@@ -320,6 +321,14 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
         return true;
         return true;
     }
     }
 
 
+    //学时通过处理事件
+    private void periodPass(ClassGradeUserQueryBo classGradeUserQueryBo){
+        //生成证书
+        iCertificateTpService.makeCertificatePhoto(classGradeUserQueryBo);
+        //官方学时推送
+        iClassGradeUserService.pushOfficialPeriod(classGradeUserQueryBo);
+    }
+
     private void sendPeriodSMS(UserPeriodEditBo bo) {
     private void sendPeriodSMS(UserPeriodEditBo bo) {
         String key = "Period-"+bo.getGoodsId()+"-"+bo.getUserId();
         String key = "Period-"+bo.getGoodsId()+"-"+bo.getUserId();
         Long value = redisCache.getCacheObject(key);
         Long value = redisCache.getCacheObject(key);

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

@@ -144,4 +144,22 @@ public class ClassGradeStudentVo {
 	private Integer rebuy;
 	private Integer rebuy;
 	@ApiModelProperty("订单商品ID")
 	@ApiModelProperty("订单商品ID")
 	private Long orderGoodsId;
 	private Long orderGoodsId;
+	/** 官方信息推送次数 */
+	@Excel(name = "官方信息推送次数")
+	@ApiModelProperty("官方信息推送次数")
+	private Long officialStatusNum;
+	@ApiModelProperty("信息推送时间")
+	private Long officialStatusTime;
+	/** 官方信息推送接口 */
+	@Excel(name = "官方信息推送接口")
+	@ApiModelProperty("官方信息推送接口")
+	private Long interfacePushId;
+	/** 复购老订单商品ID */
+	@Excel(name = "复购老订单商品ID")
+	@ApiModelProperty("复购老订单商品ID")
+	private Long rebuyOrderGoodsId;
+	/** 是否学时推送 0未推送 1推送 */
+	@Excel(name = "是否学时推送 0未推送 1推送")
+	@ApiModelProperty("是否学时推送 0未推送 1推送")
+	private Integer periodPlush;
 }
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeUserVo.java

@@ -113,4 +113,12 @@ public class ClassGradeUserVo {
 	@Excel(name = "是否学时推送 0未推送 1推送")
 	@Excel(name = "是否学时推送 0未推送 1推送")
 	@ApiModelProperty("是否学时推送 0未推送 1推送")
 	@ApiModelProperty("是否学时推送 0未推送 1推送")
 	private Integer periodPlush;
 	private Integer periodPlush;
+	@ApiModelProperty("学时审批状态 0 未通过 1通过 2待审核 -1 不可审核 3审核中")
+	private Integer periodStatus;
+	@ApiModelProperty("学时变为待审核时间")
+	private Long periodWaitTime;
+	/** 官方学时推送次数 */
+	@Excel(name = "官方学时推送次数")
+	@ApiModelProperty("官方学时推送次数")
+	private Long periodStatusNum;
 }
 }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeVo.java

@@ -137,4 +137,30 @@ public class ClassGradeVo {
 
 
 	@ApiModelProperty("学时审批状态 0 未通过 1通过 2待审核 -1 不可审核")
 	@ApiModelProperty("学时审批状态 0 未通过 1通过 2待审核 -1 不可审核")
 	private Integer periodStatus;
 	private Integer periodStatus;
+
+	/** 节数 */
+	@ApiModelProperty("试卷数")
+	private Long examNum;
+
+
+	/** 已做试卷 */
+	@ApiModelProperty("已做试卷")
+	private Long recordNum;
+	/** 官方学习地址 */
+	@Excel(name = "官方学习地址")
+	@ApiModelProperty("官方学习地址")
+	private String officialLearningUrl;
+	/** 官方推送状态 1是 0否 */
+	@Excel(name = "官方推送状态 1是 0否")
+	@ApiModelProperty("官方推送状态 1是 0否")
+	private Integer officialStatus;
+	/** 官方学习账号推送状态 0否 1是 */
+	@Excel(name = "官方学习账号推送状态 0否 1是")
+	@ApiModelProperty("官方学习账号推送状态 0否 1是")
+	private Integer learnStatus;
+	/** 是否学时推送 0未推送 1推送 */
+	@Excel(name = "是否学时推送 0未推送 1推送")
+	@ApiModelProperty("是否学时推送 0未推送 1推送")
+	private Integer periodPlush;
+
 }
 }

+ 91 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentExportAllVo.java

@@ -0,0 +1,91 @@
+package com.zhongzheng.modules.grade.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 学员记录视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-11-10
+ */
+@Data
+@ExcelTarget("classPeriodStudentExportVo")
+public class ClassPeriodStudentExportAllVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 学员编码 */
+	@Excel(name = "学员编码")
+	@ApiModelProperty("学员编码")
+	private String studentCode;
+	/** 学员编码 */
+	@Excel(name = "学员姓名")
+	@ApiModelProperty("学员姓名")
+	private String realName;
+	/** 学员编码 */
+	@Excel(name = "学员身份证")
+	@ApiModelProperty("学员身份证")
+	private String idCard;
+	/** 学员编码 */
+	@Excel(name = "学员电话")
+	@ApiModelProperty("学员电话")
+	private String telPhone;
+	/** 一寸照片 */
+	@Excel(name = "一寸照片")
+	@ApiModelProperty("一寸照片")
+	private String oneInchPhotos;
+	/** 身份证人像照 */
+	@Excel(name = "身份证人像照")
+	@ApiModelProperty("身份证人像照")
+	private String idCardImg1;
+	/** 商品ID */
+	@Excel(name = "商品名称")
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 学时 */
+	@Excel(name = "学时")
+	@ApiModelProperty("学时")
+	private Long classHours;
+	@Excel(name = "学习有效期")
+	private String studyTimeStr;
+	@Excel(name = "所在班级")
+	private String className;
+	@Excel(name = "班级有效期")
+	private String classTimeStr;
+
+	@Excel(name = "序号")
+	@ApiModelProperty("序号")
+	private Long id;
+
+	@Excel(name = "模块标题")
+	@ApiModelProperty("模块标题")
+	private String moduleName;
+	@Excel(name = "章标题")
+	@ApiModelProperty("章标题")
+	private String chapterName;
+	@Excel(name = "节标题")
+	@ApiModelProperty("节标题")
+	private String sectionName;
+	@Excel(name = "节时长(秒)")
+	@ApiModelProperty("节时长(秒)")
+	private Long durationTime;
+	@Excel(name = "学习/做题时间")
+	@ApiModelProperty("学习/做题时间")
+	private String studyTimeTxt;
+	@Excel(name = "学习/做题时长")
+	@ApiModelProperty("学习/做题时长")
+	private String studyTimeLongTxt;
+	@Excel(name = "学习/做题状态")
+	@ApiModelProperty("学习/做题状态")
+	private String studyStatusTxt;
+	@Excel(name = "测试成绩")
+	@ApiModelProperty("测试成绩")
+	private BigDecimal score;
+}

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java

@@ -179,4 +179,8 @@ public class ClassPeriodStudentVo {
 	private Long classEndTime;
 	private Long classEndTime;
 
 
 	private Integer gradePeriodStatus;
 	private Integer gradePeriodStatus;
+	/** 官方学时推送次数 */
+	@Excel(name = "官方学时推送次数")
+	@ApiModelProperty("官方学时推送次数")
+	private Long periodStatusNum;
 }
 }

+ 12 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodVo.java

@@ -35,6 +35,10 @@ public class ClassPeriodVo implements Comparable<ClassPeriodVo> {
 	@ApiModelProperty("id")
 	@ApiModelProperty("id")
 	private Long id;
 	private Long id;
 
 
+	/** 节ID */
+	@ApiModelProperty("节ID")
+	private Long sectionId;
+
 	/** 章ID */
 	/** 章ID */
 	@ApiModelProperty("章ID")
 	@ApiModelProperty("章ID")
 	private Long chapterId;
 	private Long chapterId;
@@ -137,7 +141,10 @@ public class ClassPeriodVo implements Comparable<ClassPeriodVo> {
 	private Integer sort;
 	private Integer sort;
 	@ApiModelProperty("课程排序")
 	@ApiModelProperty("课程排序")
 	private Integer courseSort;
 	private Integer courseSort;
-
+	/** 节类型 1录播 2直播 3回放 */
+	@Excel(name = "节类型 1录播 2直播 3回放")
+	@ApiModelProperty("节类型 1录播 2直播 3回放")
+	private Integer sectionType;
 	/** 审核时间 */
 	/** 审核时间 */
 	@Excel(name = "审核照片")
 	@Excel(name = "审核照片")
 	@ApiModelProperty("审核照片")
 	@ApiModelProperty("审核照片")
@@ -160,6 +167,10 @@ public class ClassPeriodVo implements Comparable<ClassPeriodVo> {
 	@ApiModelProperty("以往审核记录")
 	@ApiModelProperty("以往审核记录")
 	private List<UserPeriodStatusVo> userPeriodStatusVos;
 	private List<UserPeriodStatusVo> userPeriodStatusVos;
 
 
+	@Excel(name = "学习状态 0 未完整看完 1完整播放 -1未看过")
+	@ApiModelProperty("学习状态 0 未完整看完 1完整播放 -1未看过")
+	private Integer studyStatus;
+
 
 
 	@Override
 	@Override
 	public int compareTo(ClassPeriodVo o) {
 	public int compareTo(ClassPeriodVo o) {

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java

@@ -71,9 +71,9 @@ public class OrderGoodsAddBo {
     /** 备注 */
     /** 备注 */
     @ApiModelProperty("备注")
     @ApiModelProperty("备注")
     private String remark;
     private String remark;
-    /** 0 非复购 1复购 针对业务层次配了【下单前需要  选择班级 */
-    @ApiModelProperty("0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
-    private Integer rebuy;
+    /** 复购老订单商品ID */
+    @ApiModelProperty("复购老订单商品ID")
+    private Long rebuyOrderGoodsId;
     /** 学习次数 */
     /** 学习次数 */
     @ApiModelProperty("学习次数")
     @ApiModelProperty("学习次数")
     private Long studyCount;
     private Long studyCount;

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsEditBo.java

@@ -91,9 +91,9 @@ public class OrderGoodsEditBo {
     @ApiModelProperty("班级id")
     @ApiModelProperty("班级id")
     private Long gradeId;
     private Long gradeId;
 
 
-    /** 0 非复购 1复购 针对业务层次配了【下单前需要  选择班级 */
-    @ApiModelProperty("0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
-    private Integer rebuy;
+    /** 复购老订单商品ID */
+    @ApiModelProperty("复购老订单商品ID")
+    private Long rebuyOrderGoodsId;
 
 
     /** 学习次数 */
     /** 学习次数 */
     @ApiModelProperty("学习次数")
     @ApiModelProperty("学习次数")

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsQueryBo.java

@@ -68,6 +68,8 @@ public class OrderGoodsQueryBo extends BaseEntity {
 	/** 退款状态 0无  1退款中 2已退款 3拒绝退款 */
 	/** 退款状态 0无  1退款中 2已退款 3拒绝退款 */
 	@ApiModelProperty("退款状态 0无  1退款中 2已退款 3拒绝退款")
 	@ApiModelProperty("退款状态 0无  1退款中 2已退款 3拒绝退款")
 	private Integer refundStatus;
 	private Integer refundStatus;
+	@ApiModelProperty("退款状态 0无  1退款中 2已退款 3拒绝退款")
+	private List<Integer> refundStatusList;
 	/** 支付状态 1未收费 2部分收费 3完全收费 */
 	/** 支付状态 1未收费 2部分收费 3完全收费 */
 	@ApiModelProperty("支付状态 1未收费 2部分收费 3完全收费")
 	@ApiModelProperty("支付状态 1未收费 2部分收费 3完全收费")
 	private Integer payStatus;
 	private Integer payStatus;
@@ -96,5 +98,8 @@ public class OrderGoodsQueryBo extends BaseEntity {
 	private Long userId;
 	private Long userId;
 	@ApiModelProperty("班级ID")
 	@ApiModelProperty("班级ID")
 	private Long gradeId;
 	private Long gradeId;
+	/** 复购老订单商品ID */
+	@ApiModelProperty("复购老订单商品ID")
+	private Integer rebuyOrderGoodsId;
 
 
 }
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java

@@ -73,8 +73,8 @@ private static final long serialVersionUID=1L;
     private String remark;
     private String remark;
     /** 班级id */
     /** 班级id */
     private Long gradeId;
     private Long gradeId;
-    /** 0 非复购 1复购 针对业务层次配了【下单前需要  选择班级 */
-    private Integer rebuy;
+    /** 复购老订单商品ID */
+    private Long rebuyOrderGoodsId;
     /** 学习次数 */
     /** 学习次数 */
     private Long studyCount;
     private Long studyCount;
 }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -21,4 +21,6 @@ public interface OrderMapper extends BaseMapper<Order> {
     Integer selectUserClass(@Param("goodsId") Long goodsId,@Param("userId") Long userId);
     Integer selectUserClass(@Param("goodsId") Long goodsId,@Param("userId") Long userId);
 
 
     List<OrderListVo> selectListApp(OrderQueryBo bo);
     List<OrderListVo> selectListApp(OrderQueryBo bo);
+
+    Integer getGradePeriod(@Param("orderGoodsId") Long orderGoodsId,@Param("userId") Long userId);
 }
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderBillSheetServiceImpl.java

@@ -209,12 +209,12 @@ public class OrderBillSheetServiceImpl extends ServiceImpl<OrderBillSheetMapper,
                 goods.setPayStatus(OrderGoods.PAY_PART);
                 goods.setPayStatus(OrderGoods.PAY_PART);
                 order.setOrderStatus(Order.PAY_PART);  //订单支付状态改为部分支付
                 order.setOrderStatus(Order.PAY_PART);  //订单支付状态改为部分支付
             }
             }
-            iWxPayService.joinLockGrade(order.getOrderSn(),goods.getGoodsId(),goods.getOrderGoodsId());
             order.setStatus(1);//订单生效
             order.setStatus(1);//订单生效
             order.setUpdateTime(DateUtils.getNowTime());
             order.setUpdateTime(DateUtils.getNowTime());
             iOrderService.updateById(order);
             iOrderService.updateById(order);
             goods.setUpdateTime(DateUtils.getNowTime());
             goods.setUpdateTime(DateUtils.getNowTime());
             iOrderGoodsService.updateById(goods);
             iOrderGoodsService.updateById(goods);
+            iWxPayService.joinLockGrade(order.getOrderSn(),goods.getGoodsId(),goods.getOrderGoodsId());
             iWxPayService.updateUserExamGoods(goods,order);
             iWxPayService.updateUserExamGoods(goods,order);
         }
         }
         iOrderBillGoodsService.saveBatch(coll);
         iOrderBillGoodsService.saveBatch(coll);
@@ -224,7 +224,7 @@ public class OrderBillSheetServiceImpl extends ServiceImpl<OrderBillSheetMapper,
         result.put("sheetSn",sheet_no);
         result.put("sheetSn",sheet_no);
         return result;
         return result;
     }
     }
-  
+
 
 
     /**
     /**
      * 修改订单商品支付状态为完全支付
      * 修改订单商品支付状态为完全支付

+ 31 - 14
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -137,7 +137,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
 
     @Override
     @Override
     public List<OrderListVo> selectList(OrderQueryBo bo) {
     public List<OrderListVo> selectList(OrderQueryBo bo) {
-        List<OrderListVo> orderListVos = orderMapper.selectList(bo);
+        List<OrderListVo> orderListVos = this.baseMapper.selectList(bo);
+        for(OrderListVo vo : orderListVos){
+            if(Validator.isNotEmpty(vo.getRebuyOrderGoodsId())&&vo.getRebuyOrderGoodsId().longValue()>0){
+                vo.setRebuy(this.baseMapper.getGradePeriod(vo.getRebuyOrderGoodsId(),vo.getUserId()));
+            }
+        }
         return orderListVos;
         return orderListVos;
     }
     }
 
 
@@ -258,9 +263,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
                 canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
                 if(g.getGoodsInputData()!=null){
                 if(g.getGoodsInputData()!=null){
                     gradeId = g.getGoodsInputData().getGradeId();
                     gradeId = g.getGoodsInputData().getGradeId();
-                    if(getHaveBuyGoods(g.getGoodsId(),bo.getUserId())){
+                    //判断是否有购买过
+                    Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(),bo.getUserId());
+                    if(Validator.isNotEmpty(oldOrderGoodsId)){
                         //有指定选班模板且视频商品班级已过期,记录复购状态
                         //有指定选班模板且视频商品班级已过期,记录复购状态
-                        orderGoods.setRebuy(1);
+                        orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
                     }
                     }
                 }
                 }
                 String requestId = IdUtil.simpleUUID();
                 String requestId = IdUtil.simpleUUID();
@@ -275,7 +282,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
             }
 
 
             if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
             if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
-                this.checkBuyGoods(g.getGoodsId(),bo.getUserId());
+                this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
             }
             }
 
 
         }
         }
@@ -357,9 +364,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
                 canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
                 if(g.getGoodsInputData()!=null){
                 if(g.getGoodsInputData()!=null){
                     gradeId = g.getGoodsInputData().getGradeId();
                     gradeId = g.getGoodsInputData().getGradeId();
-                    if(getHaveBuyGoods(g.getGoodsId(),bo.getUserId())){
+                    //判断是否有购买过
+                    Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(),bo.getUserId());
+                    if(Validator.isNotEmpty(oldOrderGoodsId)){
                         //有指定选班模板且视频商品班级已过期,记录复购状态
                         //有指定选班模板且视频商品班级已过期,记录复购状态
-                        orderGoods.setRebuy(1);
+                        orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
                     }
                     }
                 }
                 }
                 String requestId = IdUtil.simpleUUID();
                 String requestId = IdUtil.simpleUUID();
@@ -374,7 +383,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
             }
 
 
             if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
             if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
-                this.checkBuyGoods(g.getGoodsId(),bo.getUserId());
+                this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
             }
             }
             iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
             iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
         }
         }
@@ -501,19 +510,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
     }
 
 
     //判断视频商品是否购买过
     //判断视频商品是否购买过
-    public boolean getHaveBuyGoods(Long goodsId,Long userId){
+    public Long getHaveBuyGoods(Long goodsId,Long userId){
         OrderGoodsQueryBo orderGoodsQueryBo = new OrderGoodsQueryBo();
         OrderGoodsQueryBo orderGoodsQueryBo = new OrderGoodsQueryBo();
         orderGoodsQueryBo.setUserId(userId);
         orderGoodsQueryBo.setUserId(userId);
         orderGoodsQueryBo.setGoodsId(goodsId);
         orderGoodsQueryBo.setGoodsId(goodsId);
+        List<Integer> refundStatusList = new ArrayList<>();
+        refundStatusList.add(0);
+        refundStatusList.add(1);
+        refundStatusList.add(3);
+        orderGoodsQueryBo.setRefundStatusList(refundStatusList);
         List<Integer> payStatusList = new ArrayList<>();
         List<Integer> payStatusList = new ArrayList<>();
         payStatusList.add(2);
         payStatusList.add(2);
         payStatusList.add(3);
         payStatusList.add(3);
         orderGoodsQueryBo.setPayStatusList(payStatusList);
         orderGoodsQueryBo.setPayStatusList(payStatusList);
         List<OrderGoodsVo> list1 = iOrderGoodsService.selectList(orderGoodsQueryBo);
         List<OrderGoodsVo> list1 = iOrderGoodsService.selectList(orderGoodsQueryBo);
         if(list1!=null&&list1.size()>0){
         if(list1!=null&&list1.size()>0){
-            return true;
+            return list1.get(0).getOrderGoodsId();
         }
         }
-        return false;
+        return null;
     }
     }
 
 
     //检查是否允许重复购买商品
     //检查是否允许重复购买商品
@@ -534,24 +548,27 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         gradeUserTempQueryBo.setStatus(ClassGradeUserTemp.STATUS_LOCK);
         gradeUserTempQueryBo.setStatus(ClassGradeUserTemp.STATUS_LOCK);
         List<ClassGradeUserTempVo> list1 = iClassGradeUserTempService.queryList(gradeUserTempQueryBo);
         List<ClassGradeUserTempVo> list1 = iClassGradeUserTempService.queryList(gradeUserTempQueryBo);
         if(list1!=null&&list1.size()>0){
         if(list1!=null&&list1.size()>0){
-            throw new CustomException("购买商品尚有订单未支付",510);
+            throw new CustomException("当前所购买商品,存在订单未支付",510);
         }
         }
         return true;
         return true;
     }
     }
 
 
 
 
     //检查是否购买过商品
     //检查是否购买过商品
-    public boolean checkBuyGoods(Long goodsId,Long userId){
+    public boolean checkBuyGoods(Long goodsId,Long userId,Long goodsType){
         OrderGoodsQueryBo bo = new OrderGoodsQueryBo();
         OrderGoodsQueryBo bo = new OrderGoodsQueryBo();
         bo.setUserId(userId);
         bo.setUserId(userId);
         bo.setGoodsId(goodsId);
         bo.setGoodsId(goodsId);
         Long num = iOrderGoodsService.getBuyGoodsHistory(bo);
         Long num = iOrderGoodsService.getBuyGoodsHistory(bo);
         if(num.longValue()>0){
         if(num.longValue()>0){
-            throw new CustomException("无法重复购买商品",511);
+            if(goodsType.equals(2)){
+                throw new CustomException("不可以重复购买题库商品",511);
+            }
+            throw new CustomException("不可以重复购买商品",511);
         }
         }
         Long num1 = iOrderGoodsService.getBuyGoodsReadyPay(bo);
         Long num1 = iOrderGoodsService.getBuyGoodsReadyPay(bo);
         if(num1.longValue()>0){
         if(num1.longValue()>0){
-            throw new CustomException("购买商品尚有订单未支付",510);
+            throw new CustomException("当前所购买商品,存在订单未支付",510);
         }
         }
         return false;
         return false;
     }
     }

+ 4 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java

@@ -124,10 +124,10 @@ public class OrderGoodsVo {
 	@Excel(name = "封面地址")
 	@Excel(name = "封面地址")
 	@ApiModelProperty("封面地址")
 	@ApiModelProperty("封面地址")
 	private String coverUrl;
 	private String coverUrl;
-	/** 0 非复购 1复购 针对业务层次配了【下单前需要  选择班级 */
-	@Excel(name = "0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
-	@ApiModelProperty("0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
-	private Integer rebuy;
+	/** 复购老订单商品ID */
+	@Excel(name = "复购老订单商品ID")
+	@ApiModelProperty("复购老订单商品ID")
+	private Long rebuyOrderGoodsId;
 	@ApiModelProperty("班级名称")
 	@ApiModelProperty("班级名称")
 	private String gradeName;
 	private String gradeName;
 	/** 学习次数 */
 	/** 学习次数 */

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderListVo.java

@@ -167,4 +167,9 @@ public class OrderListVo {
 	@Excel(name = "0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
 	@Excel(name = "0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
 	@ApiModelProperty("0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
 	@ApiModelProperty("0 非复购 1复购 针对业务层次配了【下单前需要  选择班级")
 	private Integer rebuy;
 	private Integer rebuy;
+	@ApiModelProperty("是否学时推送 0未推送 1推送")
+	private Integer periodPlush;
+	@Excel(name = "复购老订单商品ID")
+	@ApiModelProperty("复购老订单商品ID")
+	private Long rebuyOrderGoodsId;
 }
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java

@@ -42,4 +42,8 @@ public interface IScheduleService extends IService<PolyvVideo> {
     void UpExamNum(UserQueryBo bo);
     void UpExamNum(UserQueryBo bo);
 
 
     void bindBefore(UserQueryBo bo);
     void bindBefore(UserQueryBo bo);
+
+    void officialInfoPush(UserQueryBo bo);
+
+    void officialPeriodPush(UserQueryBo bo);
 }
 }

+ 31 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -37,6 +37,7 @@ import com.zhongzheng.modules.exam.vo.ExamNumberVo;
 import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
 import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.domain.ClassGradeUserTemp;
 import com.zhongzheng.modules.grade.domain.ClassGradeUserTemp;
 import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
 import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
@@ -134,12 +135,8 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Autowired
     @Autowired
     private IGoodsService iGoodsService;
     private IGoodsService iGoodsService;
     @Autowired
     @Autowired
-    private IClassGradeService iClassGradeService;
-    @Autowired
     private IClassGradeUserService iClassGradeUserService;
     private IClassGradeUserService iClassGradeUserService;
     @Autowired
     @Autowired
-    private IClassGradeGoodsService iClassGradeGoodsService;
-    @Autowired
     private IOrderService iOrderService;
     private IOrderService iOrderService;
 
 
     @Autowired
     @Autowired
@@ -843,6 +840,36 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         }
         }
     }
     }
 
 
+    /**
+     * 官方信息推送
+     * @param bo
+     */
+    @Override
+    public void officialInfoPush(UserQueryBo bo) {
+        List<ClassGradeUserGoodsVo> list = iClassGradeUserService.selectOfficialNotPush(bo);
+        for(ClassGradeUserGoodsVo vo : list){
+            ClassGradeUserQueryBo queryBo = new ClassGradeUserQueryBo();
+            queryBo.setGradeId(vo.getGradeId());
+            queryBo.setUserId(vo.getUserId());
+            String result = iClassGradeUserService.pushOfficialInfo(queryBo);
+        }
+    }
+
+    /**
+     * 官方学时推送
+     * @param bo
+     */
+    @Override
+    public void officialPeriodPush(UserQueryBo bo) {
+        List<ClassGradeUserGoodsVo> list = iClassGradeUserService.selectPeriodNotPush(bo);
+        for(ClassGradeUserGoodsVo vo : list){
+            ClassGradeUserQueryBo queryBo = new ClassGradeUserQueryBo();
+            queryBo.setGradeId(vo.getGradeId());
+            queryBo.setUserId(vo.getUserId());
+            String result = iClassGradeUserService.pushOfficialPeriod(queryBo);
+        }
+    }
+
     //获得可用学习天数
     //获得可用学习天数
     private static int getDutyDays(Date  startDateStr, Date endDateStr,Long[] longs,Long studyDay)  {
     private static int getDutyDays(Date  startDateStr, Date endDateStr,Long[] longs,Long studyDay)  {
         int result = 0;
         int result = 0;

+ 197 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/socket/service/WebSocketServer.java

@@ -0,0 +1,197 @@
+package com.zhongzheng.modules.socket.service;
+
+import cn.hutool.core.lang.Validator;
+import com.zhongzheng.common.exception.CustomException;
+import org.springframework.stereotype.Component;
+
+import javax.validation.Valid;
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@ServerEndpoint("/webSocket/{sid}")
+@Component
+public class WebSocketServer {
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+ //   private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+    private static ConcurrentHashMap<String, Map<String,Session>> sessionPools = new ConcurrentHashMap<>(); //v是userAccount,v是Session
+    private static ConcurrentHashMap<String, String> namePools = new ConcurrentHashMap<>(); //key是tag,v是userAccount
+    private static ConcurrentHashMap<String, String> actionPools = new ConcurrentHashMap<>(); //存放每个会话的操作,key是tag,v是action
+
+
+    //发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+//                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+    //给指定用户发送信息
+    public void sendInfo(String userAccount,String tag, String message){
+        Map<String,Session> sessionMap = sessionPools.get(userAccount);
+        Session session = sessionMap.get(tag);
+        if(session==null){
+            throw new CustomException("webSocket不在线",505);
+        }
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            throw new CustomException("webSocket不在线",505);
+        }
+    }
+
+    //建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "sid") String userAccount){
+        String tag = null;
+        if(Validator.isNotEmpty(userAccount)){
+            tag = session.getId(); //用户不同端标识码
+            if(!namePools.containsKey(tag)){
+                namePools.put(tag,userAccount);
+            }
+            if(sessionPools.containsKey(userAccount)){
+                Map<String,Session> sessionMap = sessionPools.get(userAccount);
+                //用户新的终端连接进来
+                if(!sessionMap.containsKey(tag)){
+                    sessionMap.put(tag,session);
+                    addOnlineCount();
+                }
+            }else{
+                //用户所有端都没连接
+                Map<String,Session> sessionMap = new HashMap<>();
+                sessionMap.put(tag,session);
+                sessionPools.put(userAccount, sessionMap);
+                addOnlineCount();
+            }
+            System.out.println(userAccount + "加入webSocket!当前人数为" + onlineNum);
+            try {
+                sendMessage(session, "欢迎" + userAccount + "加入连接!");
+            } catch (IOException e) {
+                e.printStackTrace();
+                delPeople(tag);
+            }
+        }
+    }
+
+    private String delPeople(String tag){
+        String userAccount = null;
+        if(namePools.containsKey(tag)){
+            userAccount =  namePools.get(tag);
+            namePools.remove(tag);
+            actionPools.remove(tag);
+        }
+        if(Validator.isNotEmpty(userAccount)){
+            if(sessionPools.containsKey(userAccount)){
+                Map<String,Session> sessionMap = sessionPools.get(userAccount);
+                if(sessionMap.containsKey(tag)){
+                    sessionMap.remove(tag);
+                }
+                if(sessionMap.size()==0){
+                    sessionPools.remove(userAccount);
+                }
+            }
+
+        }
+        subOnlineCount();
+        return userAccount;
+    }
+
+    //关闭连接时调用
+    @OnClose
+    public void onClose(Session session){
+        String tag = session.getId();
+
+        if (Validator.isNotEmpty(tag)) {
+            String userAccount = delPeople(tag);
+            System.out.println(userAccount + "断开webSocket连接!当前人数为" + onlineNum);
+        }
+    }
+
+    //收到客户端信息
+    @OnMessage
+    public void onMessage(String message, Session session) throws IOException{
+        String tag = session.getId();
+        if(Validator.isNotEmpty(message)){
+            if (message.equals("doQuestion")) { //题库全部限制多开
+                doQuestion(tag,"doQuestion");
+            }
+            if (message.equals("doCourse")) { //课程继续教育限制多开
+                doQuestion(tag,"doCourse");
+            }
+            if (message.equals("delAction")) {
+                if(actionPools.containsKey(tag)){
+                    actionPools.remove(tag);
+                }
+            }
+        }
+   //     message = "客户端:" + message + ",已收到";
+   //    System.out.println(message+System.currentTimeMillis()/1000+namePools.get(session.getId()));
+        /*for (Session session: sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }*/
+    }
+
+    //错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+
+    //存储用户行为和发送下线消息给其他端
+    private boolean doQuestion(String tag,String nowAction){
+        String userAccount = null;
+        if(namePools.containsKey(tag)){
+            userAccount =  namePools.get(tag);
+            actionPools.put(tag,nowAction);
+        }
+        if(Validator.isNotEmpty(userAccount)){
+            if(sessionPools.containsKey(userAccount)){
+                Map<String,Session> sessionMap = sessionPools.get(userAccount); //获取用户得所有端会话
+                for(String key : sessionMap.keySet()){
+                   if(actionPools.containsKey(key)){
+                       String action =  actionPools.get(key); //获取用户所在的行为
+                       if(!key.equals(tag)){
+                           if(action.equals(nowAction)){
+                          //     System.out.println(key+"踢下线");
+                               Session other = sessionMap.get(key);
+                               //通知其他端下线
+                               try {
+                                   sendMessage(other, "offLine");
+                               } catch (IOException e) {
+                                   e.printStackTrace();
+                                   delPeople(tag);
+                               }
+                           }
+                       }
+                   }
+                }
+            }
+        }
+        return false;
+    }
+
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysUserServiceImpl.java

@@ -11,6 +11,7 @@ import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.exam.domain.ExamBefore;
 import com.zhongzheng.modules.system.domain.SysPost;
 import com.zhongzheng.modules.system.domain.SysPost;
 import com.zhongzheng.modules.system.domain.SysUserPost;
 import com.zhongzheng.modules.system.domain.SysUserPost;
 import com.zhongzheng.modules.system.domain.SysUserRole;
 import com.zhongzheng.modules.system.domain.SysUserRole;
@@ -213,6 +214,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     @Override
     @Transactional
     @Transactional
     public int insertUser(SysUser user) {
     public int insertUser(SysUser user) {
+        validEntityBeforeSave(user);
         // 新增用户信息
         // 新增用户信息
         user.setCode(ServletUtils.getEncoded("ZH"));
         user.setCode(ServletUtils.getEncoded("ZH"));
         int rows = baseMapper.insert(user);
         int rows = baseMapper.insert(user);
@@ -232,6 +234,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     @Override
     @Transactional
     @Transactional
     public int updateUser(SysUser user) {
     public int updateUser(SysUser user) {
+        validEntityBeforeSave(user);
         // 新增用户与角色管理
         // 新增用户与角色管理
         if (!user.getStatus().equals(-1)) {
         if (!user.getStatus().equals(-1)) {
             insertUserRole(user);
             insertUserRole(user);
@@ -243,6 +246,27 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return baseMapper.updateById(user);
         return baseMapper.updateById(user);
     }
     }
 
 
+    private void validEntityBeforeSave(SysUser entity){
+        //TODO 做一些数据校验,如唯一约束
+        if(checkNameUnique(entity)){
+            throw new CustomException("账号名称重复");
+        }
+    }
+
+    private boolean checkNameUnique(SysUser entity) {
+        SysUser info = baseMapper.selectUserByUserName(entity.getUserName());
+        if (Validator.isNotNull(info)) {
+            if(Validator.isNotEmpty(entity.getUserId())){
+                if(entity.getUserId().longValue() != info.getUserId().longValue()){
+                    return true;
+                }
+            }else{
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
     /**
      * 修改用户状态
      * 修改用户状态
      *
      *

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppSubscribeEditBo.java

@@ -110,6 +110,8 @@ public class UserAppSubscribeEditBo {
     /** 考培日期 */
     /** 考培日期 */
     @ApiModelProperty("考培日期")
     @ApiModelProperty("考培日期")
     private Long applySiteExamTrainTime;
     private Long applySiteExamTrainTime;
-
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 
 
 }
 }

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

@@ -57,6 +57,10 @@ public class UserExamRecordQueryBo extends BaseEntity {
 	private Long performance;
 	private Long performance;
 	@ApiModelProperty("试卷类型ID")
 	@ApiModelProperty("试卷类型ID")
 	private Long paperId;
 	private Long paperId;
+	@ApiModelProperty("模块卷ID")
+	private Long moduleExamId;
+	@ApiModelProperty("章卷ID")
+	private Long chapterExamId;
 
 
 
 
 }
 }

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

@@ -98,4 +98,7 @@ public class UserSubscribeAddBo {
     /** 导入批次编号 */
     /** 导入批次编号 */
     @ApiModelProperty("导入批次编号")
     @ApiModelProperty("导入批次编号")
     private String importNo;
     private String importNo;
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 }
 }

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

@@ -119,4 +119,8 @@ public class UserSubscribeEditBo {
     /** 导入批次编号 */
     /** 导入批次编号 */
     @ApiModelProperty("导入批次编号")
     @ApiModelProperty("导入批次编号")
     private String importNo;
     private String importNo;
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
 }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserUpdateAddBo.java

@@ -39,4 +39,5 @@ public class UserUpdateAddBo {
     /** 1已读 2未读 */
     /** 1已读 2未读 */
     @ApiModelProperty("1已读 2未读")
     @ApiModelProperty("1已读 2未读")
     private Integer status;
     private Integer status;
+
 }
 }

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserUpdateEditBo.java

@@ -43,6 +43,8 @@ public class UserUpdateEditBo {
     /** 1已读 2未读 */
     /** 1已读 2未读 */
     @ApiModelProperty("1已读 2未读")
     @ApiModelProperty("1已读 2未读")
     private Integer status;
     private Integer status;
-
+    /** 1已推送 2未推送 */
+    @ApiModelProperty("1已推送 2未推送")
+    private Integer pushStatus;
 
 
 }
 }

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

@@ -52,4 +52,8 @@ public class UserUpdateQueryBo extends BaseEntity {
 	/** 1已读 2未读 */
 	/** 1已读 2未读 */
 	@ApiModelProperty("1已读 2未读")
 	@ApiModelProperty("1已读 2未读")
 	private Integer status;
 	private Integer status;
+
+	/** 1已推送 2未推送 */
+	@ApiModelProperty("1已推送 2未推送")
+	private Integer pushStatus;
 }
 }

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

@@ -78,4 +78,6 @@ private static final long serialVersionUID=1L;
     private Long applySiteExamTrainTime;
     private Long applySiteExamTrainTime;
     /** 导入批次编号 */
     /** 导入批次编号 */
     private String importNo;
     private String importNo;
+    /** 订单商品ID */
+    private Long orderGoodsId;
 }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserUpdate.java

@@ -43,4 +43,5 @@ private static final long serialVersionUID=1L;
 
 
     /** 1已读 2未读 */
     /** 1已读 2未读 */
     private Integer status;
     private Integer status;
+
 }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamRecordMapper.java

@@ -25,4 +25,5 @@ public interface UserExamRecordMapper extends BaseMapper<UserExamRecord> {
     List<UserExamWrongRecordVo> getExamRecordRightList(UserExamRecordQueryBo bo);
     List<UserExamWrongRecordVo> getExamRecordRightList(UserExamRecordQueryBo bo);
     List<UserExamWrongRecordVo> getExamRecordWrongList(UserExamRecordQueryBo bo);
     List<UserExamWrongRecordVo> getExamRecordWrongList(UserExamRecordQueryBo bo);
     Long getUserDoQuestionNum(UserExamRecordQueryBo bo);
     Long getUserDoQuestionNum(UserExamRecordQueryBo bo);
+    List<UserExamRecordVo> selectGroupList(UserExamRecordQueryBo bo);
 }
 }

+ 11 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.user.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
+import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodStatusVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodStatusVo;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
@@ -67,4 +68,14 @@ public interface UserStudyRecordMapper extends BaseMapper<UserStudyRecord> {
     Long selectCountPlan(Long planId);
     Long selectCountPlan(Long planId);
 
 
     SectionStudyRecordVo listExamRecord(SubjectStudyRecordQueryBo bo);
     SectionStudyRecordVo listExamRecord(SubjectStudyRecordQueryBo bo);
+
+    Long selectChapterSectionRecord(UserStudyRecordQueryBo bo);
+
+    List<ClassPeriodVo> listMenu(UserStudyRecordQueryBo bo);
+
+    List<ClassPeriodVo> listChapterSection(UserStudyRecordQueryBo bo);
+
+    List<ClassPeriodVo> listModuleChapter(UserStudyRecordQueryBo bo);
+
+    Integer getStudyStatus(ClassPeriodVo bo);
 }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserExamRecordService.java

@@ -70,4 +70,6 @@ public interface IUserExamRecordService extends IService<UserExamRecord> {
 	 * @return
 	 * @return
 	 */
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+	List<UserExamRecordVo> selectGroupList(UserExamRecordQueryBo bo);
+
 }
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java

@@ -1,7 +1,9 @@
 package com.zhongzheng.modules.user.service;
 package com.zhongzheng.modules.user.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
+import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserStudyRecord;
 import com.zhongzheng.modules.user.domain.UserStudyRecord;
 import com.zhongzheng.modules.user.vo.*;
 import com.zhongzheng.modules.user.vo.*;
@@ -77,4 +79,8 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 	SectionStudyRecordVo listExamRecord(SubjectStudyRecordQueryBo bo);
 	SectionStudyRecordVo listExamRecord(SubjectStudyRecordQueryBo bo);
 
 
 	void studyFinish(UserStudyRecord bo);
 	void studyFinish(UserStudyRecord bo);
+
+	boolean checkStudyOrder1(UserStudyRecordQueryBo entity);
+
+	List<ClassPeriodVo> menuAllList(UserStudyRecordQueryBo bo);
 }
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamRecordServiceImpl.java

@@ -189,4 +189,9 @@ public class UserExamRecordServiceImpl extends ServiceImpl<UserExamRecordMapper,
         }
         }
         return this.removeByIds(ids);
         return this.removeByIds(ids);
     }
     }
+
+    @Override
+    public List<UserExamRecordVo> selectGroupList(UserExamRecordQueryBo bo) {
+        return this.baseMapper.selectGroupList(bo);
+    }
 }
 }

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

@@ -13,8 +13,10 @@ import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.bank.domain.Exam;
 import com.zhongzheng.modules.bank.domain.Exam;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.domain.CoursePhotoLog;
 import com.zhongzheng.modules.course.domain.CoursePhotoLog;
+import com.zhongzheng.modules.course.service.ICourseChapterSectionService;
 import com.zhongzheng.modules.course.service.ICoursePhotoLogService;
 import com.zhongzheng.modules.course.service.ICoursePhotoLogService;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
+import com.zhongzheng.modules.course.vo.CourseChapterSectionVo;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
 import com.zhongzheng.modules.face.service.IFaceService;
 import com.zhongzheng.modules.face.service.IFaceService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
@@ -29,7 +31,10 @@ import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
 import com.zhongzheng.modules.grade.service.IUserPeriodStatusService;
 import com.zhongzheng.modules.grade.service.IUserPeriodStatusService;
+
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
+
+import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodStatusVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodStatusVo;
 import com.zhongzheng.modules.inform.bo.InformRemindQueryBo;
 import com.zhongzheng.modules.inform.bo.InformRemindQueryBo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
@@ -93,6 +98,8 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     private IClassGradeUserService iClassGradeUserService;
     private IClassGradeUserService iClassGradeUserService;
     @Autowired
     @Autowired
     private IUserSubscribeService iUserSubscribeService;
     private IUserSubscribeService iUserSubscribeService;
+    @Autowired
+    private ICourseChapterSectionService iCourseChapterSectionService;
 
 
 
 
     @Autowired
     @Autowired
@@ -292,6 +299,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
                 UserStudyRecord update = BeanUtil.toBean(lastVo, UserStudyRecord.class);
                 UserStudyRecord update = BeanUtil.toBean(lastVo, UserStudyRecord.class);
                 update.setUpdateTime(DateUtils.getNowTime());
                 update.setUpdateTime(DateUtils.getNowTime());
                 this.updateById(update);
                 this.updateById(update);
+                add.setRecordId(update.getRecordId());
             }
             }
         }else{
         }else{
             this.save(add);
             this.save(add);
@@ -404,6 +412,123 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         }
         }
     }
     }
 
 
+    //判断学习顺序1
+    @Override
+    public boolean checkStudyOrder1(UserStudyRecordQueryBo entity) {
+        List<CourseChapterSectionVo> list = iCourseChapterSectionService.getListById(entity.getChapterId());
+        Long studyNum = baseMapper.selectChapterSectionRecord(entity);
+        int num = studyNum.intValue();
+        if(num==list.size()){
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获取课程目录
+     * @param bo
+     * @return
+     */
+    @Override
+    public List<ClassPeriodVo> menuAllList(UserStudyRecordQueryBo bo) {
+        //存储整个目录节列表
+        List<ClassPeriodVo> sectionList = new ArrayList<>();
+        //获取课程目录
+        List<ClassPeriodVo> list = baseMapper.listMenu(bo);
+        //排序目录
+        Collections.sort(list);
+        for (ClassPeriodVo classPeriodVo : list) {
+            //为模块搜索下面的章 和节
+            if (classPeriodVo.getType() == 1){
+                UserStudyRecordQueryBo moduleQueryBo = new UserStudyRecordQueryBo();
+                moduleQueryBo.setModuleId(classPeriodVo.getId());
+                List<ClassPeriodVo> classPeriodChapterVos = baseMapper.listModuleChapter(moduleQueryBo);
+                //排序章目录
+                Collections.sort(classPeriodChapterVos);
+                for (ClassPeriodVo classChapterVo : classPeriodChapterVos) {
+                    UserStudyRecordQueryBo chapterQueryBo = new UserStudyRecordQueryBo();
+                    chapterQueryBo.setChapterId(classChapterVo.getId());
+                    List<ClassPeriodVo> classPeriodSectionVos = baseMapper.listChapterSection(chapterQueryBo);
+                    //排序节目录
+                    Collections.sort(classPeriodSectionVos);
+                    for (ClassPeriodVo classSectionVo : classPeriodSectionVos) {
+                        classSectionVo.setModuleId(classPeriodVo.getId());
+                        classSectionVo.setChapterId(classChapterVo.getId());
+                        classSectionVo.setSectionId(classSectionVo.getId());
+                        sectionList.add(classSectionVo);
+                    }
+                }
+            }
+            //为章搜索节记录
+            if (classPeriodVo.getType() == 2){
+                UserStudyRecordQueryBo chapterQueryBo = new UserStudyRecordQueryBo();
+                chapterQueryBo.setChapterId(classPeriodVo.getId());
+                List<ClassPeriodVo> classPeriodSectionVos = baseMapper.listChapterSection(chapterQueryBo);
+                //排序节目录
+                Collections.sort(classPeriodSectionVos);
+                for (ClassPeriodVo classSectionVo : classPeriodSectionVos) {
+                    classSectionVo.setModuleId(0L);
+                    classSectionVo.setChapterId(classPeriodVo.getId());
+                    classSectionVo.setSectionId(classSectionVo.getId());
+                    sectionList.add(classSectionVo);
+                }
+
+            }
+            //为节搜索学时记录
+            if (classPeriodVo.getType() == 3){
+                classPeriodVo.setModuleId(0L);
+                classPeriodVo.setChapterId(0L);
+                classPeriodVo.setSectionId(classPeriodVo.getId());
+                sectionList.add(classPeriodVo);
+            }
+        }
+        for(ClassPeriodVo section : sectionList){
+            section.setGoodsId(bo.getGoodsId());
+            section.setGradeId(bo.getGradeId());
+            section.setUserId(bo.getUserId());
+            section.setCourseId(bo.getCourseId());
+            section.setStudyStatus(baseMapper.getStudyStatus(section));
+        }
+        return sectionList;
+    }
+
+
+    //判断当前未看完的节是否是点击播放的节
+    private boolean compareSection(UserStudyRecordVo recordVo,UserStudyRecordQueryBo entity){
+        if(recordVo.getModuleId().equals(entity.getModuleId())){
+            if(recordVo.getChapterId().equals(entity.getChapterId())){
+                if(recordVo.getSectionId().equals(entity.getSectionId())){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+
+
+    /**
+     * 获取最后一次看完的节
+     * @param bo
+     * @return
+     */
+    private UserStudyRecordVo queryLastOver(UserStudyRecordQueryBo bo) {
+        LambdaQueryWrapper<UserStudyRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq(UserStudyRecord::getUserId, bo.getUserId());
+        lqw.eq( UserStudyRecord::getCourseId, bo.getCourseId());
+        lqw.eq(UserStudyRecord::getSectionId, bo.getSectionId());
+        lqw.eq(UserStudyRecord::getGradeId, bo.getGradeId());
+        lqw.eq(UserStudyRecord::getGoodsId, bo.getGoodsId());
+        lqw.eq(UserStudyRecord::getModuleId, bo.getModuleId());
+        lqw.eq(UserStudyRecord::getChapterId, bo.getChapterId());
+        lqw.eq( UserStudyRecord::getCurrentStatus, 1);
+        lqw.eq( UserStudyRecord::getStatus, 1);
+        lqw.orderByDesc(UserStudyRecord::getRecordId);
+        UserStudyRecord last = this.getOne(lqw.last("limit 1"));
+        return BeanUtil.toBean(last, UserStudyRecordVo.class);
+    }
+
     @Override
     @Override
     public Boolean updateByEditBo(UserStudyRecordEditBo bo) {
     public Boolean updateByEditBo(UserStudyRecordEditBo bo) {
         UserStudyRecord update = BeanUtil.toBean(bo, UserStudyRecord.class);
         UserStudyRecord update = BeanUtil.toBean(bo, UserStudyRecord.class);

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubscribeVo.java

@@ -188,5 +188,8 @@ public class UserSubscribeVo {
 	@Excel(name = "导入批次编号")
 	@Excel(name = "导入批次编号")
 	@ApiModelProperty("导入批次编号")
 	@ApiModelProperty("导入批次编号")
 	private String importNo;
 	private String importNo;
-
+	/** 订单商品ID */
+	@com.zhongzheng.common.annotation.Excel(name = "订单商品ID")
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
 }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserUpdateVo.java

@@ -47,4 +47,5 @@ public class UserUpdateVo {
 	/** 1已读 2未读 */
 	/** 1已读 2未读 */
 	@ApiModelProperty("创建时间")
 	@ApiModelProperty("创建时间")
 	private Long createTime;
 	private Long createTime;
+
 }
 }

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionChapterMapper.xml

@@ -33,6 +33,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="projectId" column="project_id"/>
         <result property="projectId" column="project_id"/>
         <result property="subjectName" column="subject_name"/>
         <result property="subjectName" column="subject_name"/>
         <result property="examNum" column="exam_num"/>
         <result property="examNum" column="exam_num"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
         <collection property="goodsList" column="chapter_exam_id" select="findGoodsList"/>
         <collection property="goodsList" column="chapter_exam_id" select="findGoodsList"/>
     </resultMap>
     </resultMap>
 
 

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionMapper.xml

@@ -36,6 +36,8 @@
         <result property="knowledgeIds" column="knowledge_ids"/>
         <result property="knowledgeIds" column="knowledge_ids"/>
         <result property="publishStatus" column="publish_status"/>
         <result property="publishStatus" column="publish_status"/>
         <result property="code" column="code"/>
         <result property="code" column="code"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
         <collection property="businessList" column="question_id" select="findBusinessList" />
         <collection property="businessList" column="question_id" select="findBusinessList" />
         <collection property="knowledgeList" column="knowledge_ids" select="findKnowledge"/>
         <collection property="knowledgeList" column="knowledge_ids" select="findKnowledge"/>
         <collection property="examList" column="question_id" select="findExamList" />
         <collection property="examList" column="question_id" select="findExamList" />

Some files were not shown because too many files changed in this diff