Przeglądaj źródła

Merge remote-tracking branch 'origin/dev' into dev

renqianlong 1 rok temu
rodzic
commit
e03044b843
100 zmienionych plików z 1315 dodań i 135 usunięć
  1. 1 1
      Dockerfile
  2. 1 1
      Dockerfile-admi
  3. 1 2
      Dockerfile-saas
  4. 79 0
      run-prod.sh
  5. 1 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java
  6. 2 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  7. 1 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  8. 3 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  9. 5 0
      zhongzheng-admin-saas/src/main/resources/application.yml
  10. 6 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java
  11. 28 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  12. 7 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java
  13. 6 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  14. 83 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  15. 7 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java
  16. 9 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderBusinessConfigController.java
  17. 9 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  18. 29 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  19. 7 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java
  20. 2 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  21. 1 1
      zhongzheng-admin/src/main/resources/application-pre.yml
  22. 3 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  23. 5 0
      zhongzheng-admin/src/main/resources/application.yml
  24. 0 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/alioss/OssController.java
  25. 1 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  26. 9 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  27. 6 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  28. 2 0
      zhongzheng-api/src/main/resources/application-dev.yml
  29. 1 0
      zhongzheng-api/src/main/resources/application-pre.yml
  30. 3 0
      zhongzheng-api/src/main/resources/application-prod.yml
  31. 5 0
      zhongzheng-api/src/main/resources/application.yml
  32. 4 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysRole.java
  33. 5 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginUser.java
  34. 34 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java
  35. 2 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  36. 12 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  37. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/wxpay/WXPayRequest.java
  38. BIN
      zhongzheng-common/src/main/resources/static/694515817698614/004.jpg
  39. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/001.png
  40. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/002.jpg
  41. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/0020.jpg
  42. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/0024.jpg
  43. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/003.jpg
  44. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/0030.jpg
  45. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/00312.jpg
  46. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/0033.jpg
  47. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/004.jpg
  48. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/005.jpg
  49. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/0051.jpg
  50. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/006.jpg
  51. BIN
      zhongzheng-common/src/main/resources/static/867735392558919680/2323.jpg
  52. 3 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  53. 8 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/AuthenticationEntryPointImpl.java
  54. 19 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java
  55. 21 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  56. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  57. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  58. 18 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  59. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java
  60. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java
  61. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingServiceImpl.java
  62. 75 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java
  63. 34 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  64. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseProgressQueryBo.java
  65. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMapper.java
  66. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseChapterSectionServiceImpl.java
  67. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java
  68. 38 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  69. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java
  70. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/GoodsBatchListVo.java
  71. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyCertificateBo.java
  72. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java
  73. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateApplyNumBo.java
  74. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivity.java
  75. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  76. 38 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java
  77. 56 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  78. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java
  79. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java
  80. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java
  81. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankEditBo.java
  82. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsEditBo.java
  83. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/Goods.java
  84. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  85. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  86. 135 19
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  87. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  88. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  89. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/MakeGoodsVo.java
  90. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeAddBo.java
  91. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeEditBo.java
  92. 11 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java
  93. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/SevenPushAuthAddBo.java
  94. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java
  95. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeUser.java
  96. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  97. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java
  98. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  99. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  100. 200 22
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

+ 1 - 1
Dockerfile

@@ -1,5 +1,5 @@
 # 该镜像需要依赖的基础镜像
-FROM java:8
+FROM openjdk:8
 # 将当前目录下的jar包复制到docker容器的/目录下
 ADD zhongzheng-api.jar /app.jar
 # 声明服务运行在8080端口

+ 1 - 1
Dockerfile-admi

@@ -1,5 +1,5 @@
 # 该镜像需要依赖的基础镜像
-FROM java:8
+FROM openjdk:8
 # 将当前目录下的jar包复制到docker容器的/目录下
 ADD zhongzheng-admin.jar /app-admin.jar
 # 声明服务运行在9099端口

+ 1 - 2
Dockerfile-saas

@@ -1,6 +1,5 @@
-
 # 该镜像需要依赖的基础镜像
-FROM java:8
+FROM openjdk:8
 # 将当前目录下的jar包复制到docker容器的/目录下
 ADD zhongzheng-admin-saas.jar /app-saas-admin.jar
 # 声明服务运行在9099端口

+ 79 - 0
run-prod.sh

@@ -1,4 +1,41 @@
+#!/usr/bin/env bash
+# 定义应用组名
+group_name='zhongzheng'
+# 定义应用名称
+app_name='zhongzheng-saas-api'
+# 定义应用版本
+app_version='1.0-SNAPSHOT'
+# 定义应用环境
+profile_active='prod'
+echo '----copy jar----'
+docker stop ${app_name}
+echo '----stop container----'
+docker rm ${app_name}
+echo '----rm container----'
+docker rmi ${group_name}/${app_name}:${app_version}
+echo '----rm image----'
+# 打包编译docker镜像
+docker build -f /mydata/maven/build/Dockerfile -t ${group_name}/${app_name}:${app_version} .
+echo '----build image----'
+docker run -p 5055:5055 --name ${app_name} \
+--restart=always \
+-e 'spring.profiles.active'=${profile_active} \
+-e TZ="Asia/Shanghai" \
+-m 10240m \
+--cpus=3 \
+--log-opt max-size=50m \
+--log-opt max-file=3 \
+-v /etc/localtime:/etc/localtime \
+-v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/prod_api:/logs \
+-v /mydata/app/${app_name}/logs:/var/logs \
+-d ${group_name}/${app_name}:${app_version}
+echo '----start container----'
 
+echo "开始等待20秒..."
+# 1-10秒内随机
+sleep 5
+echo "等待后继续"
 
 #!/usr/bin/env bash
 # 定义应用组名
@@ -34,3 +71,45 @@ docker run \
 -v /data/nginx/conf.d:/data/nginx/conf.d \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
+
+echo "开始等待20秒..."
+# 1-10秒内随机
+sleep 5
+echo "等待后继续"
+
+#!/usr/bin/env bash
+# 定义应用组名
+group_admin_name='zhongzheng'
+# 定义应用名称
+app_admin_name='zhongzheng-saas-admin-top'
+# 定义应用版本
+app_admin_version='1.0-SNAPSHOT'
+# 定义应用环境
+profile_active='prod'
+echo '----copy jar admin top----'
+docker stop ${app_admin_name}
+echo '----stop container admin top----'
+docker rm ${app_admin_name}
+echo '----rm container admin top----'
+docker rmi ${group_admin_name}/${app_admin_name}:${app_admin_version}
+echo '----rm image admin top----'
+# 打包编译docker镜像
+docker build -f /mydata/maven/build/Dockerfile-saas -t ${group_admin_name}/${app_admin_name}:${app_admin_version} .
+echo '----build image admin top----'
+docker run \
+-p 7077:7077 \
+--name ${app_admin_name} \
+--restart=always \
+--log-opt max-size=50m \
+--log-opt max-file=3 \
+-e 'spring.profiles.active'=${profile_active} \
+-e TZ="Asia/Shanghai" \
+-v /etc/localtime:/etc/localtime \
+-v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/prod_admin_top:/logs \
+-v /mydata/app/${app_admin_name}/logs:/var/logs \
+-v /data/nginx/conf.d:/data/nginx/conf.d \
+-d ${group_admin_name}/${app_admin_name}:${app_admin_version}
+echo '----start container admin top----'
+
+

+ 1 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java

@@ -188,6 +188,7 @@ public class TopOldOrderController extends BaseController {
     @GetMapping("/commissionListExport")
     public AjaxResult<List<TopOldOrderSellerExportVo>> commissionListExport(TopDivideOrderQueryBo bo) {
         List<TopOldOrderCommissionExportVo> list = iTopOldOrderService.commissionListExport(bo);
+
         ExcelUtil<TopOldOrderCommissionExportVo> util = new ExcelUtil<TopOldOrderCommissionExportVo>(TopOldOrderCommissionExportVo.class);
         return util.exportExcel(list, "佣金结算列表");
     }

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

@@ -190,6 +190,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://192.168.1.7:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -186,6 +186,7 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
 
 ZsBank:
     publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=

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

@@ -173,6 +173,7 @@ oldSys:
     goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
     question: http://192.168.1.121:8057/WordData/GetMeasureList
     questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
+    studyCheck: http://www.xyyxt.net/System/BussinessApi/EjStudyCheck
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -189,6 +190,8 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://39.108.7.155:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://39.108.7.155:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -248,6 +248,9 @@ feign:
   hystrix:
     enabled: true
 
+phone:
+  conceal: false
+
 poliv:
   sdk:
     userid: egsxlptzdq
@@ -303,6 +306,8 @@ aliyun:
     todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
     todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
     noFinishExamNoteCode: SMS_262460267  #未做完试卷通知
+    orderServiceEndRemind : SMS_465555251  #学生购买未学习
+    classEndRemind : SMS_465955572
 
 distributionOldPay:
       host: http://test.jqbao.net/System/BussinessApi/AddRedPackData

+ 6 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/UserProfileController.java

@@ -160,6 +160,12 @@ public class UserProfileController extends BaseController {
         return AjaxResult.success(map);
     }
 
+    @ApiOperation("承诺书下载")
+    @GetMapping("/querCommitment")
+    public AjaxResult querCommitment(UserProfileQueryBo bo) {
+        return AjaxResult.success(iUserProfileService.querCommitment(bo));
+    }
+
     /*@ApiOperation("审核资料测试")
     @PreAuthorize("@ss.hasPermi('system:profile:edit')")
     @Log(title = "填写资料审核", businessType = BusinessType.UPDATE)

+ 28 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -50,10 +50,7 @@ import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
 import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.vo.ExamApplyDetailVo;
-import com.zhongzheng.modules.goods.bo.AlikeGoodsBo;
-import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
-import com.zhongzheng.modules.goods.bo.GoodsStudyUrlBo;
-import com.zhongzheng.modules.goods.bo.UserGoodsListBo;
+import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.bo.*;
@@ -85,8 +82,10 @@ import com.zhongzheng.modules.tencentcloud.service.IFaceOcrService;
 import com.zhongzheng.modules.tencentcloud.service.IVodService;
 import com.zhongzheng.modules.top.user.bo.TopSysTenantRegisterAddBo;
 import com.zhongzheng.modules.top.user.service.ITopSysTenantRegisterService;
+import com.zhongzheng.modules.user.bo.UserBusinessGoodsBo;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import com.zhongzheng.modules.user.vo.UserBusinessGoodsVo;
 import com.zhongzheng.modules.user.vo.UserStudyTimeVo;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
@@ -394,6 +393,13 @@ public class CommonController extends BaseController {
         return AjaxResult.success(base);
     }
 
+    @ApiOperation("学员学时图片修改")
+    @PostMapping("common/student/image/spin")
+    public AjaxResult updateStudentImageSpin(@RequestBody UpdateStudentImageBo bo) {
+        iUserSubscribeService.updateStudentImageSpin(bo);
+        return AjaxResult.success();
+    }
+
     @ApiOperation("获取外部题库商品(山东题库)")
     @PostMapping("common/external/question")
     public AjaxResult getExternalQuestion(@RequestBody ExternalQuestionBo bo) {
@@ -885,10 +891,28 @@ public class CommonController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("导入二建精选题目Word模板列表")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importErJianWordQuestionList")
+    public AjaxResult<Map<String,Object>> importErJianWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) throws Exception {
+        Map<String, Object> result = iQuestionService.importErJianWordQuestionList(file, eduId, projectId, businessId, subjectId);
+        return AjaxResult.success(result);
+    }
+
     @ApiOperation("人脸属性")
     @PostMapping("/common/free/detectFaceAttributes")
     public AjaxResult<Void> DetectFaceAttributes(@RequestBody FaceQueryBo bo) {
         iFaceService.DetectFace(bo);
         return AjaxResult.success();
     }
+
+    /**
+     * 回复试卷业务层次
+     */
+    @ApiOperation("回复试卷业务层次")
+    @GetMapping("/common/free/update/exam/business")
+    public AjaxResult<Void> updateExamBusiness() {
+        return toAjax(iGoodsService.updateExamBusiness() ? 1 : 0);
+    }
+
 }

+ 7 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -8,6 +8,7 @@ import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.ServletUtils;
@@ -235,7 +236,9 @@ public class CourseController extends BaseController {
         }
         for(CourseProgressQueryBo queryBo : bo.getTelphoneList()){
             User user = iUserService.getOne(new LambdaQueryWrapper<User>()
-                    .eq(User::getTelphone, EncryptHandler.encrypt(queryBo.getTelphone())).last("limit 1"));
+                    .and(x -> x.eq(StringUtils.isNotBlank(queryBo.getTelphone()),User::getTelphone,EncryptHandler.encrypt(queryBo.getTelphone())).or()
+                    .eq(StringUtils.isNotBlank(queryBo.getIdCard()),User::getIdCard,EncryptHandler.encrypt(queryBo.getIdCard())))
+                    .last("limit 1"));
             if(Validator.isEmpty(user)){
                 continue;
             }
@@ -247,6 +250,9 @@ public class CourseController extends BaseController {
                 vo.setUserId(user.getUserId());
                 vo.setGoodsId(queryBo.getGoodsId());
                 vo.setTelphone(queryBo.getTelphone());
+                if (StringUtils.isNotBlank(user.getPasswordAes())){
+                    vo.setPasswordAes(EncryptHandler.decrypt(user.getPasswordAes()));
+                }
                 vo.setList(list);
                 listVos.add(vo);
             }

+ 6 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -280,4 +280,10 @@ public class ExamApplyController extends BaseController {
         return AjaxResult.success(iExamApplyService.examUserProfileExport(bo));
     }
 
+    @ApiOperation("修改考场人数")
+    @PostMapping ("/update/applyNum")
+    public AjaxResult updateApplyNum(@RequestBody UpdateApplyNumBo bo) {
+        return toAjax(iExamApplyService.updateApplyNum(bo) ? 1 : 0);
+    }
+
 }

+ 83 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -28,6 +28,8 @@ import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
 import com.zhongzheng.modules.grade.service.*;
 import com.zhongzheng.modules.grade.vo.*;
+import com.zhongzheng.modules.order.bo.OrderQueryBo;
+import com.zhongzheng.modules.order.vo.OrderListExportVo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
@@ -205,6 +207,27 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询所有班级用户列表
+     */
+    @ApiOperation("查询所有班级用户列表")
+    @PreAuthorize("@ss.hasPermi('grade:grade:list')")
+    @GetMapping("/listGradeAll")
+    public TableDataInfo<ClassGradeStudentVo> listGradeAll(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassGradeStudentVo> list = iClassGradeService.listGradeAll(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("导出所有班级用户列表")
+    @PreAuthorize("@ss.hasPermi('grade:grade:list')")
+    @GetMapping("/listGradeAllExport")
+    public AjaxResult<ClassGradeStudentAllExportVo> listGradeAllExport(ClassGradeUserQueryBo bo) {
+        List<ClassGradeStudentAllExportVo> list = iClassGradeService.listGradeAllExport(bo);
+        ExcelUtil<ClassGradeStudentAllExportVo> util = new ExcelUtil<>(ClassGradeStudentAllExportVo.class);
+        return util.exportExcel(list,"报班学员记录");
+    }
+
     /**
      * 导出班级学员列表
      */
@@ -243,6 +266,39 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询学时学员记录列表
+     */
+    @ApiOperation("查询学员学时列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserPeriod/manage")
+    public TableDataInfo<ClassPeriodStudentVo> listUserPeriodManage(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserPeriodManage(bo);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 查询学时学员记录统计
+     */
+    @ApiOperation("查询学时学员记录统计")
+    @GetMapping("/listUserPeriod/total")
+    public AjaxResult<UserPeriodTotalVo> listUserPeriodTotal(ClassGradeUserQueryBo bo) {
+        return AjaxResult.success(iClassGradeUserService.listUserPeriodTotal(bo));
+    }
+
+    /**
+     * 查询学时学员记录列表(新)
+     */
+    @ApiOperation("查询学员学时列表(新)")
+    @GetMapping("/listUserPeriod/new")
+    public TableDataInfo<ClassPeriodStudentNewVo> listUserPeriodNew(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentNewVo> list = iClassGradeUserService.listUserPeriodNew(bo);
+        return getDataTable(list);
+    }
+
     /**
      * 查询学时学员记录列表
      */
@@ -255,6 +311,25 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("导出学员学时学习记录列表")
+    @GetMapping("/exportListUserPeriodRecord")
+    public AjaxResult<ClassPeriodStudentExportProcessVo> exportListUserPeriodRecord(ClassGradeUserQueryBo bo) {
+        List<ClassPeriodStudentExportProcessVo> list = iClassGradeUserService.exportListUserPeriodRecord(bo);
+        ExcelUtil<ClassPeriodStudentExportProcessVo> util = new ExcelUtil<>(ClassPeriodStudentExportProcessVo.class);
+        return util.exportExcel(list,"学员学时学习记录列表");
+    }
+
+    /**
+     * 班级管理列表
+     */
+    @ApiOperation("班级管理列表")
+    @GetMapping("/listUserPeriodRecord/new")
+    public TableDataInfo<ClassPeriodStudentVo> listUserPeriodRecordNew(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserPeriodRecordNew(bo);
+        return getDataTable(list);
+    }
+
     @ApiOperation("按周查询学员学时学习记录列表")
     @PreAuthorize("@ss.hasPermi('grade:user:list')")
     @GetMapping("/listUserPeriodWeekRecord")
@@ -274,6 +349,14 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("查询学员视频学习记录列表")
+    @GetMapping("/listUserVideoRecord/new")
+    public TableDataInfo<ClassPeriodStudentVo> listUserVideoRecordNew(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserVideoRecordNew(bo);
+        return getDataTable(list);
+    }
+
     /**
      * 查询学时学员记录列表
      */

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

@@ -210,6 +210,13 @@ public class ClassStudentController extends BaseController {
         return AjaxResult.success(iClassGradeUserService.pushOfficialInfoMore(list));
     }
 
+    @ApiOperation("批量强制信息推送")
+    @PreAuthorize("@ss.hasPermi('app:user:edit')")
+    @PostMapping("/pushForceInfo")
+    public AjaxResult pushForceInfo(@RequestBody List<ClassGradeUserQueryBo>  list) {
+        return AjaxResult.success(iClassGradeUserService.pushForceOfficialInfoMore(list));
+    }
+
     /**
      * 查看用户学时状态
      */

+ 9 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderBusinessConfigController.java

@@ -6,6 +6,7 @@ import java.util.Arrays;
 import com.zhongzheng.modules.order.bo.OrderBusinessConfigAddBo;
 import com.zhongzheng.modules.order.bo.OrderBusinessConfigEditBo;
 import com.zhongzheng.modules.order.bo.OrderBusinessConfigQueryBo;
+import com.zhongzheng.modules.order.domain.OrderBusinessConfig;
 import com.zhongzheng.modules.order.service.IOrderBusinessConfigService;
 import com.zhongzheng.modules.order.vo.OrderBusinessConfigVo;
 import lombok.RequiredArgsConstructor;
@@ -90,6 +91,14 @@ public class OrderBusinessConfigController extends BaseController {
         return toAjax(iOrderBusinessConfigService.insertByAddBo(bo) ? 1 : 0);
     }
 
+    @ApiOperation("新增录单配置")
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "录单配置", businessType = BusinessType.INSERT)
+    @PostMapping("/withEntity")
+    public AjaxResult<OrderBusinessConfigVo> addWithEntity(@RequestBody OrderBusinessConfigAddBo bo) {
+        return AjaxResult.success(iOrderBusinessConfigService.insertByAddBoWithEntity(bo));
+    }
+
     /**
      * 修改录单配置
      */

+ 9 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -18,10 +18,7 @@ import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
-import com.zhongzheng.modules.order.vo.MailOrderVo;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
+import com.zhongzheng.modules.order.vo.*;
 import com.zhongzheng.modules.system.bo.SysTenantEditBo;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysTenantService;
@@ -80,6 +77,14 @@ public class OrderController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("导出订单列表")
+    @GetMapping("/exportList")
+    public AjaxResult<OrderListExportVo> exportList(OrderQueryBo bo) {
+        List<OrderListExportVo> list = iOrderService.selectExportList(bo);
+        ExcelUtil<OrderListExportVo> util = new ExcelUtil<>(OrderListExportVo.class);
+        return util.exportExcel(list,"线上订单记录");
+    }
+
     /**
      * 查询订单列表
      */

+ 29 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -5,6 +5,7 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.framework.web.service.AsyncService;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
+import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.order.service.IOrderHandleService;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
@@ -46,6 +47,8 @@ public class ScheduleController extends BaseController {
 
     private final IOrderHandleService iOrderHandleService;
 
+    private final IClassGradeUserService iClassGradeUserService;
+
     /**
      * 商品购买发送消息
      * @return
@@ -93,6 +96,14 @@ public class ScheduleController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("二建服务和班级到期提醒")
+    @GetMapping("/sendServiceEnd")
+    public AjaxResult sendServiceEnd() {
+        iScheduleService.sendServiceEnd();
+        iScheduleService.sendClassTenAndFifteenEnd();
+        return AjaxResult.success();
+    }
+
     /**
      * 考试提醒
      * @return
@@ -406,10 +417,10 @@ public class ScheduleController extends BaseController {
         //茂名市建设培训学校 680980002459417532
         //肇庆市建筑业协会 480813706424615769
 //        List<String> tenantIds = Arrays.asList("972001468256950403", "680980002459417532", "480813706424615769");
-        List<String> tenantIds = Arrays.asList("87440920140968","694515817698614");
-        tenantIds.forEach(tenantId -> {
-            iScheduleService.synchronizationGoodsByTenantId(tenantId);
-        });
+//        List<String> tenantIds = Arrays.asList("87440920140968","694515817698614");
+//        tenantIds.forEach(tenantId -> {
+//            iScheduleService.synchronizationGoodsByTenantId(tenantId);
+//        });
         return AjaxResult.success();
     }
 
@@ -468,4 +479,18 @@ public class ScheduleController extends BaseController {
         iOrderHandleService.overTimeCloseOrder();
         return AjaxResult.success();
     }
+
+    @ApiOperation("七大员重推")
+    @GetMapping("/seven/resetQdyCheckInfo")
+    public AjaxResult resetQdyCheckInfo(){
+        iClassGradeUserService.resetQdyCheckInfo();
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("计算课程总数")
+    @GetMapping("/order/courseNum")
+    public AjaxResult orderCourseNum(){
+        iScheduleService.orderCourseNum();
+        return AjaxResult.success();
+    }
 }

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

@@ -13,10 +13,7 @@ import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.vo.UserIdCardBatchVo;
-import com.zhongzheng.modules.user.vo.UserStatstVo;
-import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
-import com.zhongzheng.modules.user.vo.UserVo;
+import com.zhongzheng.modules.user.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -239,4 +236,10 @@ public class UserController extends BaseController {
         List<UserVo> list = iUserService.dangAnList(bo);
         return getDataTable(list);
     }
+
+    @ApiOperation("获取用户同专业下课程")
+    @PostMapping("/getUserBusinessGoods")
+    public AjaxResult<List<UserBusinessGoodsVo>> getUserBusinessGoods(@RequestBody List<UserBusinessGoodsBo> bos) {
+        return AjaxResult.success(iUserService.getUserBusinessGoods(bos));
+    }
 }

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

@@ -191,6 +191,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://192.168.1.7:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -186,7 +186,7 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
-
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
 ZsBank:
     publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
     privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=

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

@@ -173,6 +173,7 @@ oldSys:
     goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
     question: http://192.168.1.121:8057/WordData/GetMeasureList
     questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
+    studyCheck: http://www.xyyxt.net/System/BussinessApi/EjStudyCheck
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -189,6 +190,8 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://39.108.7.155:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://39.108.7.155:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -248,6 +248,9 @@ feign:
   hystrix:
     enabled: true
 
+phone:
+  conceal: true
+
 poliv:
   sdk:
     userid: egsxlptzdq
@@ -303,3 +306,5 @@ aliyun:
     todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
     todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
     noFinishExamNoteCode: SMS_262460267  #未做完试卷通知
+    orderServiceEndRemind : SMS_465555251  #学生购买未学习
+    classEndRemind : SMS_465955572

+ 0 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/alioss/OssController.java

@@ -62,7 +62,6 @@ public class OssController {
     @GetMapping("/seller_policy")
     public AjaxResult<ResultBean> seller_policy(@Validated OssRequest ossRequest) {
         ResultBean result = ossService.getPolicy(ossRequest);
-        log.info("服务端生成签名:{}",result);
         return AjaxResult.success(result);
     }
 
@@ -84,7 +83,6 @@ public class OssController {
     @PostMapping("/upload")
     public AjaxResult<String> upload(OssRequest file) throws Exception {
         String result = ossService.upload(file);
-        log.info("服务端生成签名:{}",result);
         return AjaxResult.success("返回图片路径url",result);
     }
 

+ 1 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -277,6 +277,7 @@ public class GoodsController extends BaseController {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
         startPage();
+
         List<OrderGoodsVo> list = iOrderGoodsService.listUserVideoLive(bo);
         return getDataTable(list);
     }

+ 9 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -114,4 +114,13 @@ public class ClassGradeController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return AjaxResult.success(iClassGradeUserService.checkFinishRequiredCourse(bo));
     }
+
+    @ApiOperation("检查是否有二建班级10天过期")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/checkTenClassGradeUser")
+    public AjaxResult<List<ClassGradeUserGoodsVo>> checkTenClassGradeUser(ClassGradeUserQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iClassGradeUserService.checkTenClassGradeUser(bo));
+    }
 }

+ 6 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -1,13 +1,16 @@
 package com.zhongzheng.controller.user;
 
 import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.system.domain.SysTenant;
@@ -19,6 +22,7 @@ import com.zhongzheng.modules.user.service.IUserLoginKeyService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserVisitLogService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
+import com.zhongzheng.modules.user.vo.UserBusinessGoodsVo;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.WxIdBody;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
@@ -32,6 +36,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -218,4 +223,5 @@ public class UserController extends BaseController {
         editBo.setUserKey(loginUser.getToken());
         return toAjax(iUserLoginKeyService.offline(editBo) ? 1 : 0);
     }
+
 }

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

@@ -193,6 +193,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://192.168.1.7:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -186,6 +186,7 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://192.168.1.7:9099/cd/exam/add/exam/result
 
 ZsBank:
     publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=

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

@@ -185,6 +185,7 @@ oldSys:
     goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
     question: http://192.168.1.121:8057/WordData/GetMeasureList
     questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
+    studyCheck: http://www.xyyxt.net/System/BussinessApi/EjStudyCheck
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -202,6 +203,8 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    subscribeAddExamResult: http://39.108.7.155:9099/cd/exam/add/exam/result
+    subscribeAddCertificate: http://39.108.7.155:9099/cd/exam/add/exam/result/certificate
     question: http://120.79.166.78:19013/common/question/getMeasureList
     questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 

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

@@ -245,6 +245,9 @@ feign:
   hystrix:
     enabled: true
 
+phone:
+  conceal: false
+
 poliv:
   sdk:
     userid: egsxlptzdq
@@ -301,3 +304,5 @@ aliyun:
     todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
     todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
     noFinishExamNoteCode: SMS_262460267  #未做完试卷通知
+    orderServiceEndRemind : SMS_465555251  #学生购买未学习
+    classEndRemind : SMS_465955572

+ 4 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysRole.java

@@ -103,6 +103,10 @@ public class SysRole implements Serializable
 
     private String tenantId;
 
+    /** 手机号查看标识:1可以查到 0隐藏 */
+    @ApiModelProperty(value ="手机号查看标识:1可以查到 0隐藏")
+    private Integer phoneConceal;
+
     /**
      * 请求参数
      */

+ 5 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginUser.java

@@ -68,6 +68,11 @@ public class LoginUser implements UserDetails
      */
     private SysUser user;
 
+    /**
+     * 手机号隐藏标识 1,不隐藏
+     */
+    private Integer phoneConcealSign;
+
 
     public LoginUser(SysUser user, Set<String> permissions)
     {

+ 34 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java

@@ -2,14 +2,26 @@ package com.zhongzheng.common.type;
 
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.symmetric.AES;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.TelPhoneUtils;
 import org.apache.ibatis.type.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.token.Token;
+import org.springframework.security.core.token.TokenService;
 import org.springframework.util.StringUtils;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Properties;
 
 
 @MappedJdbcTypes(JdbcType.VARCHAR)
@@ -20,7 +32,6 @@ public class EncryptHandler  implements TypeHandler<String> {
     public static final boolean ENCRYPT_STATUS = true; //是否开启字段加密
 
 
-
     public static String decrypt(String value) {
         if (null == value) {
             return null;
@@ -28,6 +39,27 @@ public class EncryptHandler  implements TypeHandler<String> {
         if (value.length()<=20 ) {
             return value;
         }
+        String s = SecureUtil.aes(KEYS).decryptStr(value);
+        String authorizationToken = ServletUtils.getRequest().getHeader("AuthorizationToken");
+        if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(authorizationToken)){
+            Boolean phoneConceal = false;
+            try (InputStream inputStream = EncryptHandler.class.getClassLoader().getResourceAsStream("application.yml")) {
+                Properties properties = new Properties();
+                properties.load(inputStream);
+                String property = properties.getProperty("conceal");
+                phoneConceal = Boolean.valueOf(property);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            if (phoneConceal){
+                //开启手机号码加密
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+                if (s.length() <= 11 &&
+                        (ObjectUtils.isNull(loginUser.getPhoneConcealSign()) || loginUser.getPhoneConcealSign() != 1)){
+                    return TelPhoneUtils.hideTelPhone(s);
+                }
+            }
+        }
         return SecureUtil.aes(KEYS).decryptStr(value);
     }
 
@@ -38,6 +70,7 @@ public class EncryptHandler  implements TypeHandler<String> {
         if(ENCRYPT_STATUS){
             AES aes = SecureUtil.aes(KEYS);
             String encrypt = aes.encryptHex(value);
+
             return encrypt;
         }else{
             return value;

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

@@ -32,6 +32,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
 
+    public static String YYYY__MM__DD = "yyyy年MM月dd日";
+
     private static String[] parsePatterns = {
             "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",

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

@@ -233,6 +233,18 @@ public class ToolsUtils {
         return checktext != null ? checktext.equals(signature.toUpperCase()) : false;
     }
 
+
+    public static String removeAllTrim(String content) {
+        if(Validator.isNotEmpty(content)){
+            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+            Matcher m = p.matcher(content);
+            content = m.replaceAll("");
+            content = content.replaceAll(" ", "");
+            content = content.replaceAll("[\\u3000-\\u303F\\s\\u00A0]","");
+        }
+        return content;
+    }
+
     /**
      * 将字节数组转化我16进制字符串
      *

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

@@ -65,7 +65,7 @@ public class WXPayRequest {
 
             SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                     sslContext,
-                    new String[]{"TLSv1"},
+                    null,
                     null,
                     new DefaultHostnameVerifier());
 

BIN
zhongzheng-common/src/main/resources/static/694515817698614/004.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/001.png


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/002.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/0020.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/0024.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/003.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/0030.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/00312.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/0033.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/004.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/005.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/0051.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/006.jpg


BIN
zhongzheng-common/src/main/resources/static/867735392558919680/2323.jpg


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

@@ -146,6 +146,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/external/question").anonymous()
                 .antMatchers("/common/replenish/exam").anonymous()
                 .antMatchers("/common/student/image/update").anonymous()
+                .antMatchers("/common/student/image/spin").anonymous()
                 .antMatchers("/common/platform/pay").anonymous()
                 .antMatchers("/common/platform/pay/handle").anonymous()
                 .antMatchers("/common/alike/goods").anonymous()
@@ -160,8 +161,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/grade/grade/listPeriod").anonymous()
                 .antMatchers("/course/business/queryFullId").anonymous()
                 .antMatchers("/grade/grade/listUserPeriod").anonymous()
+                .antMatchers("/grade/grade/listUserPeriod/new").anonymous()
                 .antMatchers("/grade/grade/listPeriodAudit").anonymous()
                 .antMatchers("/grade/grade/listUserVideoRecord").anonymous()
+                .antMatchers("/grade/grade/listUserVideoRecord/new").anonymous()
                 .antMatchers("/swagger-ui.html").anonymous()
                 .antMatchers("/swagger-resources/**").anonymous()
                 .antMatchers("/webjars/**").anonymous()

+ 8 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/AuthenticationEntryPointImpl.java

@@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSON;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.ServletUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.AuthenticationEntryPoint;
@@ -28,11 +30,17 @@ public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, S
 {
     private static final long serialVersionUID = -8970718410437077606L;
 
+    private static Logger log = LoggerFactory.getLogger(AuthenticationEntryPointImpl.class);
+
     @Override
     public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
             throws IOException
     {
         int code = HttpStatus.HTTP_UNAUTHORIZED;
+        String tenantId = request.getHeader("TenantId");
+        String token = request.getHeader("AuthorizationToken");
+        log.error(String.format("token: %s",token));
+        log.error(String.format("tenantId: %s",tenantId));
         String msg = StrUtil.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI());
         ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg)));
     }

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

@@ -3,6 +3,7 @@ package com.zhongzheng.framework.web.service;
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.entity.SysRole;
@@ -40,6 +41,7 @@ import javax.annotation.Resource;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 登录校验方法
@@ -104,7 +106,8 @@ public class SysLoginService
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
             throw new CaptchaException();
         }
-        iUserLoginErrorService.checkLimit(username);
+
+//        iUserLoginErrorService.checkLimit(username);
         // 用户验证
         Authentication authentication = null;
         try
@@ -143,7 +146,22 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        loginUser.setPhoneConcealSign(0);
         SysUser user = iSysUserService.updateLoginTimeIp(loginUser.getUser().getUserId());
+        //查看用户权限是否可以查看手机号码
+        if (user.getUserName().equals("admin")){
+            loginUser.setPhoneConcealSign(1);
+        }else {
+            List<SysUserRole> list = iSysUserRoleService.list(new LambdaQueryWrapper<SysUserRole>()
+                    .eq(SysUserRole::getUserId, user.getUserId()));
+            if (CollectionUtils.isNotEmpty(list)){
+                List<SysRole> sysRoles = iSysRoleService.listByIds(list.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()));
+                if (sysRoles.stream().anyMatch(x -> x.getPhoneConceal() == 1)){
+                    loginUser.setPhoneConcealSign(1);
+                }
+            }
+
+        }
         String dualAuth = configService.selectConfigByKey("login.dual.auth");
         if(Validator.isNotEmpty(dualAuth)&&dualAuth.equals("1")){
             if(Validator.isEmpty(tel)){

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

@@ -2091,6 +2091,27 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return vo;
     }
 
+    @Override
+    public List<UserBusinessGoodsVo> getUserBusinessGoods(List<UserBusinessGoodsBo> bos) {
+        List<UserBusinessGoodsVo> goodsBoList = new ArrayList<>();
+        for (UserBusinessGoodsBo item : bos) {
+            User user = getOne(new LambdaQueryWrapper<User>()
+            .eq(User::getIdCard,EncryptHandler.encrypt(item.getIdNum()))
+            .last("limit 1"));
+            if (ObjectUtils.isNull(user)) {
+                continue;
+            }
+            item.setUserId(user.getUserId());
+            //查询购买课程
+            List<UserBusinessGoodsVo> goodsVo = baseMapper.getCourseByUser(item);
+            if (!CollectionUtils.isEmpty(goodsVo)){
+                goodsVo.forEach(x -> x.setIdNum(item.getIdNum()));
+                goodsBoList.addAll(goodsVo);
+            }
+        }
+        return goodsBoList;
+    }
+
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {
         if(Validator.isEmpty(bo.getAccount())){

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

@@ -219,7 +219,7 @@ public class OssServiceImpl implements OssService {
                 RandomFilename = "certificate" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
                 break;
             case 8:
-                RandomFilename = "question" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now;
+                RandomFilename = "question" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now+"img";
                 break;
             case 9:
                 RandomFilename = "wisdom" + "/" + prefixName + (Validator.isNotEmpty(prefixName) ? "" : (sdf.format(new Date()))) + "/" + now+ String.valueOf(random > 0 ? random : (-1) * random);
@@ -244,6 +244,9 @@ public class OssServiceImpl implements OssService {
         JSONObject resultBean = new JSONObject();
         String filename = request.getParameter("filename");
         filename = ALIYUN_OSS_ENDPOINT.concat("/").concat(filename);
+        if(Validator.isEmpty(request.getParameter("size"))||request.getParameter("size").equals("0")){
+            return  null;
+        }
         resultBean.put("filename", filename);
         resultBean.put("size", request.getParameter("size"));
         resultBean.put("mimeType", request.getParameter("mimeType"));

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java

@@ -41,8 +41,9 @@ import java.util.concurrent.TimeUnit;
 public class AliSmsServiceImpl implements IAliSmsService {
     private static final Logger LOGGER = LoggerFactory.getLogger(AliSmsServiceImpl.class);
 
-    @Value("${aliyun.sms.signName}")
     private String SIGNNAME;
+    @Value("${aliyun.sms.signName}")
+    private String DEFAULT_SIGNNAME;
     @Value("${aliyun.sms.registerTemplateCode}")
     private String REGISTERTEMPLATECODE;
     @Value("${aliyun.sms.accessKeyId}")
@@ -83,8 +84,7 @@ public class AliSmsServiceImpl implements IAliSmsService {
         if(Validator.isNotEmpty(configService.selectConfigByKeyNoCache("sms.signName"))){
             SIGNNAME = configService.selectConfigByKeyNoCache("sms.signName");
         }else{
-            SysConfig config = configService.getSysConfigByKeyTenant("sms.signName",867735392558919680L);
-            SIGNNAME = config.getConfigValue();
+            SIGNNAME = DEFAULT_SIGNNAME;
         }
 
     }

+ 18 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -1209,7 +1209,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     }
 
     private boolean isNumStart(String content) {
-        for(int i=1;i<40;i++){
+        for(int i=1;i<99;i++){
             String num = i+".";
             if(content.startsWith(num)){
                 return true;
@@ -2590,15 +2590,11 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                                     e.printStackTrace();
                                 }
                                 imgUrl =  ossPath + "?x-oss-process=image/resize,w_" + wPx + ",h_" + HPx;
-                                if(type==5||nowPart==9){
+                                if(type==5||nowPart==9||nowPart==10||nowPart==8){
                                     //正文图片
-                                    if(!answerStatus){
-                                        qContent = qContent+"<br />" +"<p><img src=\"" + ossHost + "/" + imgUrl + "\"></p>";
-                                    }
-                                }
-                                if(answerStatus){
-                                    analysisContent=analysisContent+"<br />" +"<p><img src=\"" + ossHost + "/" + imgUrl + "\"></p>";
+                                    qContent = qContent+"<br />" +"<p><img src=\"" + ossHost + "/" + imgUrl + "\"></p>";
                                 }
+
                             }
                         }
                     }
@@ -2606,9 +2602,6 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                     if(content.equals("")){
                         continue;
                     }
-                    if(content.indexOf("关于《建设工程工程量清单计价规范》")>-1){
-                        System.out.println(content);
-                    }
                     System.out.println(content);
                     if (content.startsWith("###")||isXueJianQuestionStart(content,type,alKeyList)) {
 
@@ -2683,6 +2676,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
 
                     if(nowPart==8){
                         if(isNumStart((content))||content.indexOf("###")>-1||content.indexOf("章标题")>-1||content.indexOf("多项选择题")>-1){
+                            if(content.indexOf("未成年工是指年满16周岁未满18周")>-1){
+                                System.out.println(content);
+                            }
                             if(Validator.isNotEmpty(qContent)&&!qContent.equals("")){
                                 String[] sList = qContent.split("【解析】");
                                 if (sList.length>1) {
@@ -2771,7 +2767,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                                         throw new CustomException("答案错误");
                                     }
                                 }
-                                addBo.setCode(importCode);
+               //                 addBo.setCode(importCode);
 
                                 addBo.setBusinessList(businessItemList);
                                 Long qId =  insertByAddBoImportBackId(addBo,0);
@@ -2784,10 +2780,12 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             }
                             ExamAddBo examAddBo = new ExamAddBo();
                             examAddBo.setExamName(preExamName);
-                            examAddBo.setCode(importExamCode);
+        //                    examAddBo.setCode(importExamCode);
                             examAddBo.setBusinessList(businessItemList);
+                            examAddBo.setExamPaperId(139L);
                             examAddBo.setQuestionList(questionList);
                             examAddBo.setStatus(1);
+                            examAddBo.setPublishStatus(1L);
                             iExamService.insertByAddBo(examAddBo);
                         }
                         list1.clear();
@@ -3110,6 +3108,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 String indexKey = null;
                 for (XWPFParagraph paragraph : paragraphList) {
                     content = paragraph.getText();
+                    System.out.println(content);
                     List<XWPFRun> runs = paragraph.getRuns();
                     imgUrl = null;
                 //    System.out.println(content);
@@ -3349,11 +3348,14 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                     }
                     if(aType>0){
                         String[] strArr = content.split("\\.");
-                        if(aType==1&&strArr.length==2){
+                        if(aType==1&&strArr.length==2&&strArr[0].length()<3){
                             System.out.println(strArr);
                             indexKey = strArr[0]+".";
                             QuestionAddBo cAddBo = allQues.get(indexKey);
                             answerQuestion = dealImportAnswer(strArr[1]);
+                            if(Validator.isEmpty(cAddBo)){
+                                System.out.println(cAddBo);
+                            }
                             cAddBo.setAnswerQuestion(answerQuestion);
                             cAddBo.setAnalysisContent("");
                         }
@@ -3361,7 +3363,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             QuestionAddBo cAddBo = allQues.get(indexKey);
                             cAddBo.setAnalysisContent(cAddBo.getAnalysisContent()+content+"<br />");
                         }
-                        if(aType==2&&strArr.length==2){
+                        if(aType==2&&strArr.length==2&&strArr[0].length()<3){
                             indexKey = strArr[0]+".";
                             QuestionAddBo cAddBo = allQues.get(indexKey);
                             answerQuestion = dealImportAnswer(strArr[1]);
@@ -4509,6 +4511,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
 
 
     private String dealImportAnswer(String Answer) {
+        Answer = Answer.trim();
         String[] itemArray = Answer.split("");
         List<String> list = new ArrayList<>();
         for (String v : itemArray) {

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/UserProfileQueryBo.java

@@ -1,6 +1,8 @@
 package com.zhongzheng.modules.base.bo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.common.type.EncryptHandler;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -127,4 +129,8 @@ public class UserProfileQueryBo extends BaseEntity implements Serializable {
 
 	@ApiModelProperty("公司名称")
 	private String companyName;
+
+	/** 身份证号 */
+	@ApiModelProperty("身份证号")
+	private String idCard;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java

@@ -38,6 +38,8 @@ public interface IUserProfileService extends IService<UserProfile> {
 
 	UserProfile queryLast(UserProfileQueryBo bo);
 
+	String querCommitment(UserProfileQueryBo bo);
+
 	/**
 	 * 根据新增业务对象插入填写资料审核
 	 * @param bo 填写资料审核新增业务对象

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingServiceImpl.java

@@ -104,9 +104,9 @@ public class ActivityAdvertisingServiceImpl extends ServiceImpl<ActivityAdvertis
      */
     private void validEntityBeforeSave(ActivityAdvertising entity){
         //TODO 做一些数据校验,如唯一约束
-        if(checkNameUnique(entity)&& Validator.isEmpty(entity.getId())){
+       /* if(checkNameUnique(entity)&& Validator.isEmpty(entity.getId())){
             throw new CustomException("名称重复");
-        }
+        }*/
     }
 
     @Override

+ 75 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java

@@ -18,6 +18,7 @@ import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.base.bo.CertificateTpAddBo;
 import com.zhongzheng.modules.base.bo.CertificateTpEditBo;
@@ -204,6 +205,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         bo.setPageSize(null);
         bo.setPageNum(null);
         GoodsVo goodsVo = iGoodsService.selectDetail(bo.getGoodsId());
+        goodsVo.setSelfClassHours(goodsVo.getClassHours());
         //获取培训开始时间
         UserStudyRecordQueryBo studyRecordQueryBo = new UserStudyRecordQueryBo();
         studyRecordQueryBo.setUserId(bo.getUserId());
@@ -294,6 +296,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             queryBo.setGradeId(gradeUser.getGradeId());
             queryBo.setUserId(gradeUser.getUserId());
             queryBo.setOrderGoodsId(gradeUser.getOrderGoodsId());
+
             OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
                     .eq(OrderGoods::getOrderGoodsId, gradeUser.getOrderGoodsId()));
             queryBo.setGoodsId(orderGoods.getGoodsId());
@@ -365,7 +368,12 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -395,7 +403,12 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -425,7 +438,12 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -455,7 +473,12 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -485,7 +508,12 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -515,7 +543,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 sex = "女";
             }
             vo.setSex(sex);
-            vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
+            Integer totalHour = 0;
+            for(CourseChapterVo chapterVo : chapterList){
+                totalHour+=chapterVo.getSectionNum();
+            }
+            goodsVo.setClassHours(goodsVo.getSelfClassHours());
+            vo.setClassHours(goodsVo.getSelfClassHours()+"");
+    //        vo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+"");
             vo.setDateY(nowDate.substring(0, 4));
             vo.setDateM(nowDate.substring(5, 7));
             vo.setDateD(nowDate.substring(8, 10));
@@ -661,7 +695,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         Long id = iUserCertificateService.selectMaxId();
         String nowId = Long.toString(id);
         String result = "";
-        result = String.format("%0" + 5 + "d", Integer.parseInt(nowId) + 1);
+        result = String.format("%05d", Integer.parseInt(nowId) + 1);
         return result;
     }
 
@@ -749,13 +783,32 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         return chapterListTxt;
     }
 
+
+    private String getImgDir(){
+        String tenantId = ToolsUtils.getTenantId();
+        if(tenantId.equals("694515817698614")){
+            return tenantId;
+        }else {
+            return "867735392558919680";
+        }
+    }
+
+    private Boolean haveStamp(){
+        String tenantId = ToolsUtils.getTenantId();
+        if(tenantId.equals("694515817698614")){
+            return false;
+        }else {
+            return true;
+        }
+    }
+
     private String drawPic(CertificatePhotoVo entity){
         Font font = new Font("微软雅黑", Font.PLAIN, 45);// 添加字体的属性设置
         String projectUrl = "D:\\test\\";
         String imgName = projectUrl + "out01.jpg";
         try {
             // 加载本地图片
-            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/002.jpg");
+            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/"+getImgDir()+"/002.jpg");
     //        String imageLocalUrl = projectUrl + "002.jpg";
    //         BufferedImage imageLocal = ImageIO.read(new File(imageLocalUrl));
             BufferedImage imageLocal = ImageIO.read(imgStream);
@@ -825,7 +878,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         String imgName = null;
         try {
             // 加载本地图片
-            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/003.jpg");
+            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/"+getImgDir()+"/003.jpg");
             //        String imageLocalUrl = projectUrl + "003.jpg";
             //         BufferedImage imageLocal = ImageIO.read(new File(imageLocalUrl));
             BufferedImage imageLocal = ImageIO.read(imgStream);
@@ -886,7 +939,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         String imgName = null;
         try {
             // 加载图片
-            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/004.jpg");
+            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/"+getImgDir()+"/004.jpg");
             //        String imageLocalUrl = projectUrl + "003.jpg";
             //         BufferedImage imageLocal = ImageIO.read(new File(imageLocalUrl));
             BufferedImage imageLocal = ImageIO.read(imgStream);
@@ -932,7 +985,9 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
 
             InputStream logoStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/001.png");
             BufferedImage logoBuffered = ImageIO.read(logoStream);
-            g.drawImage(logoBuffered, 1438, 2555, 529, 528, null);
+            if(haveStamp()){
+                g.drawImage(logoBuffered, 1438, 2555, 529, 528, null);
+            }
 
             //二维码
             String qrTxt = CERTIFICATE_HOST+"pages/certificate/index?code="+entity.getCode();
@@ -969,7 +1024,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         String imgName = null;
         try {
             // 加载本地图片
-            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/005.jpg");
+            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/"+getImgDir()+"/005.jpg");
             //        String imageLocalUrl = projectUrl + "003.jpg";
             //         BufferedImage imageLocal = ImageIO.read(new File(imageLocalUrl));
             BufferedImage imageLocal = ImageIO.read(imgStream);
@@ -1028,7 +1083,9 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
 
             InputStream logoStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/001.png");
             BufferedImage logoBuffered = ImageIO.read(logoStream);
-            g.drawImage(logoBuffered, 1012, 1666, 330, 330, null);
+            if(haveStamp()){
+                g.drawImage(logoBuffered, 1012, 1666, 330, 330, null);
+            }
 
             //二维码
             String qrTxt = CERTIFICATE_HOST+"pages/certificate/index?code="+entity.getCode();
@@ -1064,7 +1121,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         String imgName = null;
         try {
             // 加载本地图片
-            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/006.jpg");
+            InputStream imgStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/"+getImgDir()+"/006.jpg");
             //        String imageLocalUrl = projectUrl + "003.jpg";
             //         BufferedImage imageLocal = ImageIO.read(new File(imageLocalUrl));
             BufferedImage imageLocal = ImageIO.read(imgStream);
@@ -1123,7 +1180,10 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
 
             InputStream logoStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("static/001.png");
             BufferedImage logoBuffered = ImageIO.read(logoStream);
-            g.drawImage(logoBuffered, 1012, 1666, 330, 330, null);
+            if(haveStamp()){
+                g.drawImage(logoBuffered, 1012, 1666, 330, 330, null);
+            }
+
 
             //二维码
             String qrTxt = CERTIFICATE_HOST+"pages/certificate/index?code="+entity.getCode();

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

@@ -147,6 +147,33 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         return profile;
     }
 
+    @Override
+    public String querCommitment(UserProfileQueryBo bo) {
+        if(Validator.isEmpty(bo.getIdCard())||Validator.isEmpty(bo.getGoodsId())){
+            throw new CustomException("参数缺失");
+        }
+        User user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getIdCard, EncryptHandler.encrypt(bo.getIdCard())).last("limit 1"));
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户信息获取有误!");
+        }
+        UserProfile profile = getOne(new LambdaQueryWrapper<UserProfile>()
+                .eq(UserProfile::getUserId, user.getUserId())
+                .eq(UserProfile::getGoodsId, bo.getGoodsId())
+                .eq(UserProfile::getTypeStatus, 1)
+                .eq(UserProfile::getCurrentStatus, 1)
+                .in(UserProfile::getStatus, new ArrayList<Integer>(Arrays.asList(1,2)))
+                .orderByDesc(UserProfile::getId)
+                .last("limit 1"));
+        if(Validator.isNotEmpty(profile)){
+            Map<String, String> maps = JSONObject.parseObject(profile.getKeyValue(), Map.class);
+            if(maps.containsKey("commitment_electr_signature")){
+                String img = ALIYUN_OSS_ENDPOINT + "/" + jsonHandle(maps,"commitment_electr_signature");
+                return img;
+            }
+        }
+        return null;
+    }
+
     /**
      * 实体类转化成视图对象
      *
@@ -261,16 +288,16 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         Calendar rightNow = Calendar.getInstance();
         Map<String, Object> bindingMap = new HashMap<>();
 
-        bindingMap.put("username", jsonHandle(maps,"username"));
-        bindingMap.put("s", jsonHandle(maps,"s"));
-        bindingMap.put("post", jsonHandle(maps,"post"));
+        bindingMap.put("username", jsonHandle(maps,"name"));
+        bindingMap.put("s", jsonHandle(maps,"sex"));
+        bindingMap.put("post", jsonHandle(maps,"apply_post"));
         bindingMap.put("idcard", jsonHandle(maps,"idcard"));
-        bindingMap.put("phone", jsonHandle(maps,"phone"));
+        bindingMap.put("phone", jsonHandle(maps,"telphone"));
         bindingMap.put("school", jsonHandle(maps,"school"));
-        bindingMap.put("edu", jsonHandle(maps,"edu"));
+        bindingMap.put("edu", jsonHandle(maps,"education"));
         bindingMap.put("major", jsonHandle(maps,"major"));
-        bindingMap.put("cname", jsonHandle(maps,"cname"));
-        bindingMap.put("cphone", jsonHandle(maps,"cphone"));
+        bindingMap.put("cname", jsonHandle(maps,"unit_contact"));
+        bindingMap.put("cphone", jsonHandle(maps,"unit_tel"));
         bindingMap.put("image", ALIYUN_OSS_ENDPOINT + "/" + jsonHandle(maps,"commitment_electr_signature"));
         bindingMap.put("y", Convert.toStr(rightNow.get(Calendar.YEAR)));
         bindingMap.put("m", rightNow.get(Calendar.MONTH) + 1);

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseProgressQueryBo.java

@@ -27,4 +27,7 @@ public class CourseProgressQueryBo extends BaseEntity {
 	@ApiModelProperty("手机号码")
 	private String telphone;
 
+	@ApiModelProperty("身份证")
+	private String idCard;
+
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMapper.java

@@ -15,7 +15,9 @@ import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import com.zhongzheng.modules.order.bo.SpecialQuestionBo;
 import com.zhongzheng.modules.order.vo.SpecialQuestionVo;
+import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserPlanQueryBo;
+import com.zhongzheng.modules.user.domain.UserSubscribe;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -79,4 +81,8 @@ public interface CourseMapper extends BaseMapper<Course> {
     Long getSpecialQuestionCount(SpecialQuestionBo bo);
 
     List<Long> getOrderGoodsIds(CourseQueryBo bo);
+
+    Long getStudyCourseNum(SubjectStudyRecordQueryBo subjectStudyRecordQueryBo);
+
+    UserSubscribe getUserSub(@Param("userId") Long userId,@Param("goodsId") Long goodsId);
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseChapterSectionServiceImpl.java

@@ -51,7 +51,7 @@ public class CourseChapterSectionServiceImpl extends ServiceImpl<CourseChapterSe
         list.forEach(courseChapterSectionVo -> {
             if (Validator.isNotNull(courseChapterSectionVo.getDurationTime())) {
                 //设置节时长(分钟)
-                courseChapterSectionVo.setDurationMinTime(Math.ceil(courseChapterSectionVo.getDurationTime()/60.0));
+                courseChapterSectionVo.setDurationMinTime(Double.valueOf(String.format("%.2f",courseChapterSectionVo.getDurationTime().doubleValue()/60.0)));
                 //设置学时
                 courseChapterSectionVo.setClassHours(Double.valueOf(String.format("%.2f", courseChapterSectionVo.getDurationMinTime()/45.0)));
             }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java

@@ -73,13 +73,13 @@ public class CourseMenuServiceImpl extends ServiceImpl<CourseMenuMapper, CourseM
             if (Validator.isNotNull(courseMenuVo.getDurationTime())) {
                 //设置节时长(分钟)
         //        courseMenuVo.setDurationMinTime(Math.ceil(courseMenuVo.getDurationTime()/60.0));
-                courseMenuVo.setDurationMinTime((int)Math.ceil(courseMenuVo.getDurationTime().intValue()/60));
+                courseMenuVo.setDurationMinTime(Double.valueOf(String.format("%.2f",courseMenuVo.getDurationTime().doubleValue()/60)));
                 DecimalFormat df=new DecimalFormat("0.0");//设置保留位数
                 //设置学时
         //        courseMenuVo.setClassHours(Double.valueOf(String.format("%.2f", courseMenuVo.getDurationMinTime()/45.0)));
 //                courseMenuVo.setClassHours(Double.valueOf(df.format(courseMenuVo.getDurationMinTime()/45)));
 
-                courseMenuVo.setClassHours(Double.valueOf(String.format("%.1f", courseMenuVo.getDurationMinTime()/45.0)));
+                courseMenuVo.setClassHours(Double.valueOf(String.format("%.2f", courseMenuVo.getDurationMinTime()/45.0)));
             }
         });
         return list;

+ 38 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -64,6 +64,7 @@ import com.zhongzheng.modules.grade.service.IUserPeriodStatusService;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodVo;
 import com.zhongzheng.modules.order.bo.SpecialQuestionBo;
+import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.vo.SpecialQuestionVo;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.system.domain.SysTenant;
@@ -151,6 +152,8 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     @Autowired
     private IGoodsService iGoodsService;
     @Autowired
+    private IOrderGoodsService iOrderGoodsService;
+    @Autowired
     private IGoodsQuestionRelService iGoodsQuestionRelService;
     @Autowired
     private IQuestionMerchantService iQuestionMerchantService;
@@ -736,7 +739,9 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             goodsUserVo.setErJianErZao(false);
             goodsUserVo.setUserProfile(0);
             if(Validator.isNotEmpty(fullName)){
+                Boolean flag = false;
                 if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")){
+                    flag = true;
                     goodsUserVo.setErJianErZao(true);
                 }else if (goodsUserVo.getEducationName().equals("考前培训") && goodsUserVo.getProjectName().equals("施工现场专业人员")){
                     int count = iUserProfileService.count(new LambdaQueryWrapper<UserProfile>()
@@ -749,6 +754,15 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                         goodsUserVo.setUserProfile(1);
                     }
                 }
+
+                if(goodsUserVo.getEducationName().equals("继续教育") && goodsUserVo.getProjectName().equals("施工现场专业人员")){
+                    flag = true;
+                }
+
+                //继续课程显示班级名称
+                if (flag){
+                    goodsUserVo.setGoodsName(classGradeVo.getClassName());
+                }
             }
 
             goodsUserVo.setGradeId(classGradeVo.getGradeId());
@@ -768,8 +782,11 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             goodsUserVo.setLearnStatus(classGradeVo.getLearnStatus());
             goodsUserVo.setPeriodPlush(classGradeVo.getPeriodPlush());
             goodsUserVo.setOfficialName(classGradeVo.getOfficialName());
+            goodsUserVo.setPeriodTime(classGradeVo.getPeriodTime());
             goodsUserVo.setPeriodWaitTime(classGradeVo.getPeriodWaitTime());
             goodsUserVo.setOpenQuestion(0);
+            goodsUserVo.setSevenPushReason(classGradeVo.getSevenPushReason());
+            goodsUserVo.setSevenPushDate(classGradeVo.getSevenPushDate());
             Long secLong = 0L;
             Long studyLong = 0L;
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
@@ -798,12 +815,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                 if (ObjectUtils.isNotNull(classGradeVo.getPeriodStatus())
                         && classGradeVo.getPeriodStatus() == 1
                         && (DateUtils.getNowTime() >= goodsUserVo.getServiceStartTime() && DateUtils.getNowTime() <= goodsUserVo.getServiceEndTime())){
-                    UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
-                            .eq(UserSubscribe::getUserId, bo.getUserId())
-                            .eq(UserSubscribe::getGoodsId, goodsUserVo.getGoodsId())
-                            .eq(UserSubscribe::getSubscribeStatus, 1)
-                            .orderByDesc(UserSubscribe::getCreateTime)
-                            .last("limit 1"));
+                    UserSubscribe userSubscribe = baseMapper.getUserSub(bo.getUserId(),goodsUserVo.getGoodsId());
                     if (ObjectUtils.isNull(userSubscribe)){
                         goodsUserVo.setSubscribeSign(1);
                     }else if (userSubscribe.getSubscribeStatus() == 1 && ObjectUtils.isNotNull(userSubscribe.getExamStatus())
@@ -933,7 +945,6 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return tableDataInfo;
     }
 
-
     @Override
     public List<GoodsUserVo> goodsStudyProgressList(CourseQueryBo bo) {
         List<GoodsUserVo> goodsUserVos = baseMapper.goodsStudyProgressList(bo);
@@ -978,23 +989,35 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                 continue;
             }
 
-            Long secLong = 0L;
-            Long studyLong = 0L;
+//            Long secLong = 0L;
+//            Long studyLong = 0L;
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
             subjectStudyRecordQueryBo.setGoodsId(goodsUserVo.getGoodsId());
             subjectStudyRecordQueryBo.setUserId(bo.getUserId());
             subjectStudyRecordQueryBo.setGradeId(goodsUserVo.getGradeId());
             subjectStudyRecordQueryBo.setOrderGoodsId(goodsUserVo.getOrderGoodsId());
-            List<SubjectStudyRecordVo> subjectStudyRecordVos = iUserStudyRecordService.listDangAnSubject(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();
-            }
-            goodsUserVo.setSecAllNum(secLong);
+//            List<SubjectStudyRecordVo> subjectStudyRecordVos = iUserStudyRecordService.listDangAnSubject(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();
+//            }
+            goodsUserVo.setSecAllNum(goodsUserVo.getCourseNum());
+            //已学节
+            Long studyLong =  baseMapper.getStudyCourseNum(subjectStudyRecordQueryBo);
             goodsUserVo.setStuAllNum(studyLong);
             goodsUserVo.setExamNum(classGradeVo.getExamNum());
             goodsUserVo.setRecordNum(classGradeVo.getRecordNum());
             goodsUserVo.setPeriodStatus(classGradeVo.getPeriodStatus());
+            goodsUserVo.setSignId(classGradeVo.getId());
+            goodsUserVo.setOfficialStatus(classGradeVo.getOfficialStatus());
+
+            String businessName = iGoodsService.getGoodsBusinessName(goodsUserVo.getGoodsId());
+            if (businessName.contains("继续教育") &&
+                    (businessName.contains("二级建造师") || businessName.contains("二级造价师") || businessName.contains("施工现场专业人员"))){
+                goodsUserVo.setClassStatus(classGradeVo.getClassStatus());
+                goodsUserVo.setClassStartTime(classGradeVo.getClassStartTime());
+                goodsUserVo.setClassEndTime(classGradeVo.getClassEndTime());
+            }
         }
         return goodsUserVos;
     }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java

@@ -55,7 +55,7 @@ public class CourseMenuVo {
 	/** 节时长(分钟) */
 	@Excel(name = "节时长(分钟)")
 	@ApiModelProperty("节时长(分钟)")
-	private Integer durationMinTime;
+	private Double durationMinTime;
 	/** 学时 */
 	@Excel(name = "学时")
 	@ApiModelProperty("学时")

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/GoodsBatchListVo.java

@@ -19,5 +19,7 @@ public class GoodsBatchListVo implements Serializable {
 
     private Long userId;
 
+    private String passwordAes;
+
     private List<GoodsUserVo> list;
 }

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyCertificateBo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplyCertificateBo implements Serializable {
+
+    private String userName;
+
+    private String idCard;
+
+    /** 证书编号 */
+    private String certificateCode;
+    /** 发证时间 */
+    private Long certificateStartTime;
+    /** 到期时间 */
+    private Long certificateEndTime;
+    /** 证书下载地址 */
+    private String certificateUrl;
+
+    private String major;
+
+    private Long tenantId;
+}

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java

@@ -47,5 +47,13 @@ public class ExamApplyResultExportBo implements Serializable {
     @Excel(name = "证书编码")
     private String certificateCode;
 
+    private Long applyTime;
 
+    private String applyStartTime;
+
+    private String applyEndTime;
+
+    private String major;
+
+    private Long tenantId;
 }

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateApplyNumBo.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2024年04月11日 15:03
+ */
+@Data
+public class UpdateApplyNumBo implements Serializable {
+
+    private List<Long> applyIds;
+
+    private Integer num;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivity.java

@@ -48,4 +48,6 @@ private static final long serialVersionUID=1L;
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;
 
+    private Long tenantId;
+
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java

@@ -113,4 +113,6 @@ public interface IExamApplyService extends IService<ExamApply> {
     String examApplyResultCertificate(List<MultipartFile> files);
 
 	List<UserProfile> getUserProfiles(String idCard, String businessName, String major);
+
+    boolean updateApplyNum(UpdateApplyNumBo bo);
 }

+ 38 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java

@@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -31,6 +35,8 @@ import com.zhongzheng.modules.mock.domain.MockMajor;
 import com.zhongzheng.modules.mock.domain.MockMajorSubject;
 import com.zhongzheng.modules.mock.service.IMockMajorService;
 import com.zhongzheng.modules.mock.service.IMockMajorSubjectService;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.service.IUserMockSubscribeService;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -38,11 +44,14 @@ import com.zhongzheng.modules.wx.service.IWxLoginService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -75,6 +84,10 @@ public class ExamActivityServiceImpl extends ServiceImpl<ExamActivityMapper, Exa
     private IUserService userService;
     @Autowired
     private IUserMockSubscribeService userMockSubscribeService;
+    @Autowired
+    private ISysTenantService sysTenantService;
+    @Value("${liveGotoURL}")
+    private String liveGotoURL;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -204,7 +217,31 @@ public class ExamActivityServiceImpl extends ServiceImpl<ExamActivityMapper, Exa
 
     @Override
     public String getActivityApplyCode(Long activityId) {
-        return wxLoginService.getActivityApplyCode(activityId);
+        ExamActivity activity = getById(activityId);
+        if (ObjectUtils.isNull(activity)){
+            throw new CustomException("活动不存在");
+        }
+        //H5域名
+        SysTenant tenant = sysTenantService.getById(activity.getTenantId());
+        String hostH5 = tenant.getHostH5();
+        String urlBase64 = "";
+        try {
+            QRCodeWriter qrCodeWriter = new QRCodeWriter();
+            BitMatrix bitMatrix = qrCodeWriter.encode(String.format("%s%s/pages5/mockExam/examApply?tid=%s",liveGotoURL,hostH5,activityId),
+                    BarcodeFormat.QR_CODE, 300, 300);
+            // 写到输出流
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            MatrixToImageWriter.writeToStream(bitMatrix, "jpg", outputStream);
+            //转换为base64
+            Base64.Encoder encoder1 = Base64.getEncoder();
+            urlBase64 = "data:image/jpeg;base64,"
+                    + encoder1.encodeToString(outputStream.toByteArray());
+        }catch (Exception e) {
+            e.printStackTrace();
+            throw new CustomException("二维码生成失败");
+        }
+//        wxLoginService.getActivityApplyCode(activityId);
+        return urlBase64;
     }
 
     @Override

+ 56 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java

@@ -55,6 +55,7 @@ import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.user.bo.CdExamSubscribeBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -136,6 +137,10 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
 
     @Value("${zhongzheng.profile}")
     private String ZHONGZHENG_PROFILE;
+    @Value("${exam.subscribeAddExamResult}")
+    private String EXAM_SUBSCRIBE_SAVE_RESULT;
+    @Value("${exam.subscribeAddCertificate}")
+    private String EXAM_SUBSCRIBE_SAVE_RESULT_CERTIFICATE;
 
     @Override
     public ExamApplyVo queryById(Long applyId) {
@@ -1150,6 +1155,30 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
        return baseMapper.getUserProfileList(idCard,businessName,major);
     }
 
+    @Override
+    public boolean updateApplyNum(UpdateApplyNumBo bo) {
+        for (Long applyId : bo.getApplyIds()) {
+            ExamApply apply = getById(applyId);
+            if (ObjectUtils.isNull(apply)){
+                throw new CustomException("考试信息获取有误!");
+            }
+            List<ExamApplySiteTime> siteTimeList = iExamApplySiteTimeService
+                    .list(new LambdaQueryWrapper<ExamApplySiteTime>().eq(ExamApplySiteTime::getApplyId, applyId));
+            if (CollectionUtils.isNotEmpty(siteTimeList)){
+                siteTimeList.forEach(item -> {
+                    List<ExamApplySiteTimeTwoAddBo> siteTimeTwoAddBos = JSONArray.parseArray(item.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
+                    if (CollectionUtils.isNotEmpty(siteTimeTwoAddBos)){
+                        siteTimeTwoAddBos.forEach(x -> x.setNum(bo.getNum().longValue()));
+                        String s = JSONArray.toJSONString(siteTimeTwoAddBos);
+                        item.setSiteTime(s);
+                    }
+                });
+            }
+            iExamApplySiteTimeService.updateBatchById(siteTimeList);
+        }
+        return true;
+    }
+
     @Override
     public String examUserProfileExport(UserProfileQueryBo bo) {
         List<UserProfileVo> userProfileVos = iUserProfileService.queryList(bo);
@@ -1304,9 +1333,18 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
                     default :
                         break;
             }
-
+            bo.setApplyTime(DateUtils.dateTimeSec("yyyy-MM-dd",collect.get(0)));
+            bo.setApplyStartTime(getTimeStr(collect.get(1)));
+            bo.setApplyEndTime(getTimeStr(collect.get(3)));
+            bo.setTenantId(user.getTenantId());
+            bo.setMajor(majorName);
             iUserSubscribeService.updateByIdNoTenant(subscribe);
         });
+
+        //通知B端系统
+        String param = JSONArray.toJSONString(exportBo);
+        Map<String, String> headersMap = new HashMap<>();
+        HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_SAVE_RESULT, param, headersMap);
     }
 
     @Override
@@ -1315,6 +1353,7 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             return "请勿上传空文件!";
         }
         List<String> msgList = new ArrayList<>();
+        List<ExamApplyCertificateBo> certificateBos = new ArrayList<>();
         files.forEach(multipartFile -> {
             //文件名= 身份证号码_岗位名称_证书编号_发证日期
             String fileName = multipartFile.getOriginalFilename();
@@ -1353,7 +1392,16 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             ossRequest.setFile(multipartFile);
             try {
                 String upload = ossService.upload(ossRequest);
-                subscribe.setCertificateUrl(upload);
+                subscribe.setCertificateUrl(ALIYUN_OSS_ENDPOINT+upload);
+                ExamApplyCertificateBo examAp = new ExamApplyCertificateBo();
+                examAp.setCertificateUrl(upload);
+                examAp.setCertificateEndTime(timeTwo);
+                examAp.setCertificateStartTime(time);
+                examAp.setCertificateCode(collect.get(2));
+                examAp.setMajor(collect.get(1));
+                examAp.setIdCard(EncryptHandler.decrypt(user.getIdCard()));
+                examAp.setTenantId(user.getTenantId());
+                certificateBos.add(examAp);
             } catch (Exception e) {
 //                log.error("证书上传有误:"+collect.get(0));
                 msgList.add(multipartFile.getOriginalFilename());
@@ -1361,6 +1409,12 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             }
             iUserSubscribeService.updateByIdNoTenant(subscribe);
         });
+        //通知B端系统
+        if (CollectionUtils.isNotEmpty(certificateBos)){
+            String param = JSONArray.toJSONString(certificateBos);
+            Map<String, String> headersMap = new HashMap<>();
+            HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_SAVE_RESULT_CERTIFICATE, param, headersMap);
+        }
         return msgList.stream().collect(Collectors.joining(","));
     }
 

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java

@@ -158,7 +158,7 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
                 CdExamRoomUpdateBo roomBo = new CdExamRoomUpdateBo();
                 roomBo.setSignId(apply.getApplyId());
                 roomBo.setDataFrom(1);
-//                roomBo.setTenantId(apply.getTenantId());
+                roomBo.setTenantId(apply.getTenantId());
                 roomBo.setExamType(apply.getApplyNature());
                 roomBo.setExamTime(timeAddBo.getExamTime());
                 ExamApplySiteTimeTwoAddBo twoAddBo = timeAddBo.getExamApplySiteTimeTwo().stream().findFirst().orElse(null);
@@ -178,7 +178,7 @@ public class ExamApplySiteServiceImpl extends ServiceImpl<ExamApplySiteMapper, E
                 CdExamRoomBo roomBo = new CdExamRoomBo();
                 roomBo.setSignId(apply.getApplyId());
                 roomBo.setDataFrom(1);
-//                roomBo.setTenantId(apply.getTenantId());
+                roomBo.setTenantId(apply.getTenantId());
                 roomBo.setType(1);//七大员预约
                 roomBo.setExamType(apply.getApplyNature());
                 roomBo.setExamTime(timeAddBo.getExamTime());

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java

@@ -221,4 +221,5 @@ public class GoodsAddBo {
     private Integer viewSign;
     @ApiModelProperty("寄件标签:1是 0否")
     private Integer mailSign;
+    private String makeGoodsIds;
 }

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

@@ -135,4 +135,6 @@ public class GoodsBankAddBo {
     private String externalLink;
     @ApiModelProperty("是否外链商品:0否 1是")
     private Integer externalLinkStatus;
+    @ApiModelProperty("寄件标签:1是 0否")
+    private Integer mailSign;
 }

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

@@ -164,4 +164,6 @@ public class GoodsBankEditBo {
     private String externalLink;
     @ApiModelProperty("是否外链商品:0否 1是")
     private Integer externalLinkStatus;
+    @ApiModelProperty("寄件标签:1是 0否")
+    private Integer mailSign;
 }

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

@@ -255,4 +255,5 @@ public class GoodsEditBo {
     private Integer viewSign;
     @ApiModelProperty("寄件标签:1是 0否")
     private Integer mailSign;
+    private String makeGoodsIds;
 }

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

@@ -188,4 +188,8 @@ private static final long serialVersionUID=1L;
     /** 寄件标签:1是 0否 */
     @TableField(updateStrategy=FieldStrategy.IGNORED)
     private Integer mailSign;
+
+    /** 前培和补考商品关联多个 */
+    @TableField(updateStrategy=FieldStrategy.IGNORED)
+    private String makeGoodsIds;
 }

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java

@@ -2,6 +2,10 @@ package com.zhongzheng.modules.goods.mapper;
 
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.bank.domain.Exam;
+import com.zhongzheng.modules.bank.domain.QuestionBusiness;
+import com.zhongzheng.modules.bank.domain.QuestionChapter;
+import com.zhongzheng.modules.bank.domain.QuestionModule;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.bo.ReplenishExamBo;
@@ -14,6 +18,7 @@ import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.UserGoodsListAllBo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.vo.*;
+import com.zhongzheng.modules.system.domain.SysGoodsCopyRecord;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.security.core.parameters.P;
@@ -39,6 +44,8 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     Long getRandomQuestionNum(@Param("goodsId")Long goodsId,@Param("examPaperId") Long examPaperId);
 
+    List<MakeGoodsVo> getMakeGoodsList(@Param("makeGoodsIds")String makeGoodsIds);
+
     int queryUpGoods();
 
     List<GoodsVo> selectListToInput(GoodsQueryBo bo);
@@ -103,4 +110,29 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<Goods> getRelGoodsNoTenant(@Param("businessName") String businessName,@Param("categoryName") String categoryName,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Integer getCourseNum(Long goodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Integer getCourseExamNumNoTenant(Long goodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<QuestionModule> getModuleExam();
+
+    @InterceptorIgnore(tenantLine = "true")
+    SysGoodsCopyRecord getSysGoodsCopy(@Param("moduleExamId") Long moduleExamId,@Param("type")Integer type);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<QuestionBusiness> getModuleExamBusiness(@Param("oldId")Long oldId,@Param("type")Integer type);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Integer saveExamBusiness(QuestionBusiness bs);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<QuestionChapter> getChapterExam();
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Exam> getExam();
+
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -14,6 +14,7 @@ import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
+import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.system.domain.SysTenant;
 
 import java.util.Collection;
@@ -163,5 +164,10 @@ public interface IGoodsService extends IService<Goods> {
 
 	List<Goods> getRelGoodsNoTenant(String businessName, String categoryName, Long tenantId);
 
+    Integer getCourseNum(Long goodsId);
+
+    Integer getCourseExamNum(Long goodsId);
+
+    Boolean updateExamBusiness();
 
 }

+ 135 - 19
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -411,27 +411,41 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                         List<CourseMenuVo> courseMenuVoList = iCourseMenuService.selectList(bo1);
                         if (courseMenuVoList != null && courseMenuVoList.size() > 0) {
                             courseMenuVoList.forEach(courseMenuVo -> {
-                                classHours.updateAndGet(v -> v + Math.round(courseMenuVo.getClassHours()));
-                                //获取章信息
-                                List<CourseModuleChapterVo> courseModuleChapterVoList = iCourseModuleChapterService.getListById(courseMenuVo.getMenuId());
-                                AtomicReference<Double> chapterHours = new AtomicReference<>(0.0);
-                                if (courseModuleChapterVoList != null && courseModuleChapterVoList.size() > 0) {
-                                    courseModuleChapterVoList.forEach(courseModuleChapterVo -> {
-                                        //获取节信息
-                                        List<CourseChapterSectionVo> courseChapterSectionVoList = iCourseChapterSectionService.getListById(courseModuleChapterVo.getChapterId());
-                                        if (courseChapterSectionVoList != null && courseChapterSectionVoList.size() > 0) {
-                                            courseChapterSectionVoList.forEach(courseChapterSectionVo -> {
-                                                chapterHours.updateAndGet(v -> v + courseChapterSectionVo.getClassHours());
-                                            });
-                                        }
-                                    });
+                                classHours.updateAndGet(v -> v + courseMenuVo.getClassHours());
+                                if(courseMenuVo.getType()==1){
+                                    //获取章信息
+                                    List<CourseModuleChapterVo> courseModuleChapterVoList = iCourseModuleChapterService.getListById(courseMenuVo.getMenuId());
+                                    AtomicReference<Double> chapterHours = new AtomicReference<>(0.0);
+                                    if (courseModuleChapterVoList != null && courseModuleChapterVoList.size() > 0) {
+                                        courseModuleChapterVoList.forEach(courseModuleChapterVo -> {
+                                            //获取节信息
+                                            List<CourseChapterSectionVo> courseChapterSectionVoList = iCourseChapterSectionService.getListById(courseModuleChapterVo.getChapterId());
+                                            if (courseChapterSectionVoList != null && courseChapterSectionVoList.size() > 0) {
+                                                courseChapterSectionVoList.forEach(courseChapterSectionVo -> {
+                                                    chapterHours.updateAndGet(v -> v + courseChapterSectionVo.getClassHours());
+                                                });
+                                            }
+                                        });
+                                    }
+                                    classHours.updateAndGet(v -> v + chapterHours.get());
+                                }
+                                else if(courseMenuVo.getType()==2){
+                                    AtomicReference<Double> chapterHours = new AtomicReference<>(0.0);
+                                    //获取节信息
+                                    List<CourseChapterSectionVo> courseChapterSectionVoList = iCourseChapterSectionService.getListById(courseMenuVo.getMenuId());
+                                    if (courseChapterSectionVoList != null && courseChapterSectionVoList.size() > 0) {
+                                        courseChapterSectionVoList.forEach(courseChapterSectionVo -> {
+                                            chapterHours.updateAndGet(v -> v + courseChapterSectionVo.getClassHours());
+                                        });
+                                    }
+                                    classHours.updateAndGet(v -> v + chapterHours.get());
                                 }
-                                classHours.updateAndGet(v -> v + Math.round(chapterHours.get()));
+
                             });
                         }
                     });
                 }
-                goodsVo.setClassHours((new BigDecimal(String.valueOf(classHours))).setScale(0, HALF_UP));
+                goodsVo.setClassHours((new BigDecimal(String.valueOf(classHours))).setScale(1, BigDecimal.ROUND_HALF_UP));
             });
         }
         return list;
@@ -501,6 +515,9 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 //                goodsVo.setSpecTemplateId(relation.getSpecTemplateId());
 //            }
 //        }
+        if(Validator.isNotEmpty(goodsVo.getMakeGoodsIds())){
+            goodsVo.setMakeGoodsVoList(this.baseMapper.getMakeGoodsList(goodsVo.getMakeGoodsIds()));
+        }
         //多规格下的价格区间
         if (ObjectUtils.isNotNull(goodsVo.getSpecTemplateId())) {
             List<GoodsSpecAttributeRelation> list = goodsSpecAttributeRelationService
@@ -1740,9 +1757,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
                 //商品关联题库
                 if (StringUtils.isNotBlank(goods.getQuestionRelIds())){
-                    String collect = Arrays.stream(goods.getQuestionRelIds().split(","))
-                            .map(x -> getNewId(Long.valueOf(x), GoodsCopyEnum.GOODS.getType()).toString()).collect(Collectors.joining(","));
-                    goods.setQuestionRelIds(collect);
+                    List<Long> relIds = Arrays.stream(goods.getQuestionRelIds().split(","))
+                            .map(x -> getNewIdByTenant(Long.valueOf(x), GoodsCopyEnum.GOODS.getType(), newTenantId)).collect(Collectors.toList());
+                    if (CollectionUtils.isNotEmpty(relIds)){
+                        String collect = relIds.stream().map(x -> x.toString()).collect(Collectors.joining(","));
+                        goods.setQuestionRelIds(collect);
+                    }
                 }
 
                 //规格模板
@@ -5271,7 +5291,103 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return baseMapper.getRelGoodsNoTenant(businessName, categoryName, tenantId);
     }
 
+    @Override
+    public Integer getCourseNum(Long goodsId) {
+        return baseMapper.getCourseNum(goodsId);
+    }
+
+    @Override
+    public Integer getCourseExamNum(Long goodsId) {
+        return baseMapper.getCourseExamNumNoTenant(goodsId);
+    }
+
+    @Override
+    public Boolean updateExamBusiness() {
+        //模块卷
+        List<QuestionModule> modules = baseMapper.getModuleExam();
+        if (CollectionUtils.isNotEmpty(modules)){
+            modules.forEach(item -> {
+                Long tenantId = item.getTenantId();
+                SysGoodsCopyRecord copyRecord = baseMapper.getSysGoodsCopy(item.getModuleExamId(),46);
+                if (ObjectUtils.isNull(copyRecord)){
+                    return;
+                }
+                List<QuestionBusiness> businesses = baseMapper.getModuleExamBusiness(copyRecord.getOldId(),4);
+                if (CollectionUtils.isEmpty(businesses)){
+                    return;
+                }
+                //同步模块卷业务层次
+                businesses.forEach(bs -> {
+                    bs.setId(null);
+                    bs.setMajorId(item.getModuleExamId());
+                    bs.setEducationTypeId(getNewIdByTenant(bs.getEducationTypeId(),14,tenantId));
+                    bs.setProjectId(getNewIdByTenant(bs.getProjectId(),22,tenantId));
+                    bs.setBusinessId(getNewIdByTenant(bs.getBusinessId(),9,tenantId));
+                    bs.setSubjectId(getNewIdByTenant(bs.getSubjectId(),26,tenantId));
+                    bs.setTenantId(tenantId);
+                    baseMapper.saveExamBusiness(bs);
+                });
+            });
+        }
+
+        //章卷
+        List<QuestionChapter> chapters = baseMapper.getChapterExam();
+        if (CollectionUtils.isNotEmpty(chapters)){
+            chapters.forEach(item -> {
+                Long tenantId = item.getTenantId();
+                SysGoodsCopyRecord copyRecord = baseMapper.getSysGoodsCopy(item.getChapterExamId(),44);
+                if (ObjectUtils.isNull(copyRecord)){
+                    return;
+                }
+                List<QuestionBusiness> businesses = baseMapper.getModuleExamBusiness(copyRecord.getOldId(),3);
+                if (CollectionUtils.isEmpty(businesses)){
+                    return;
+                }
+
+                //同步模块卷业务层次
+                businesses.forEach(bs -> {
+                    bs.setId(null);
+                    bs.setMajorId(item.getChapterExamId());
+                    bs.setEducationTypeId(getNewIdByTenant(bs.getEducationTypeId(),14,tenantId));
+                    bs.setProjectId(getNewIdByTenant(bs.getProjectId(),22,tenantId));
+                    bs.setBusinessId(getNewIdByTenant(bs.getBusinessId(),9,tenantId));
+                    bs.setSubjectId(getNewIdByTenant(bs.getSubjectId(),26,tenantId));
+                    bs.setTenantId(tenantId);
+
+                    baseMapper.saveExamBusiness(bs);
+                });
+            });
+        }
 
+        //试卷
+        List<Exam> exam = baseMapper.getExam();
+        if (CollectionUtils.isNotEmpty(exam)){
+            exam.forEach(item -> {
+                Long tenantId = item.getTenantId();
+                SysGoodsCopyRecord copyRecord = baseMapper.getSysGoodsCopy(item.getExamId(),28);
+                if (ObjectUtils.isNull(copyRecord)){
+                    return;
+                }
+                List<QuestionBusiness> businesses = baseMapper.getModuleExamBusiness(copyRecord.getOldId(),2);
+                if (CollectionUtils.isEmpty(businesses)){
+                    return;
+                }
+                //同步模块卷业务层次
+                businesses.forEach(bs -> {
+                    bs.setId(null);
+                    bs.setMajorId(item.getExamId());
+                    bs.setEducationTypeId(getNewIdByTenant(bs.getEducationTypeId(),14,tenantId));
+                    bs.setProjectId(getNewIdByTenant(bs.getProjectId(),22,tenantId));
+                    bs.setBusinessId(getNewIdByTenant(bs.getBusinessId(),9,tenantId));
+                    bs.setSubjectId(getNewIdByTenant(bs.getSubjectId(),26,tenantId));
+                    bs.setTenantId(tenantId);
+
+                    baseMapper.saveExamBusiness(bs);
+                });
+            });
+        }
+        return true;
+    }
 
     private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
         baseMapper.updateHandoutsId(goodsId, tenantId, handoutsId);

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java

@@ -448,4 +448,22 @@ public class GoodsUserVo {
 	@ApiModelProperty("学员资料 变更状态 2变更 1否")
 	private Integer profileChangeStatus;
 
+
+	@ApiModelProperty("失败原因")
+	private String pushFailReason;
+
+	@ApiModelProperty("标签Id")
+	private Long signId;
+
+	private String sevenPushReason;
+
+	private String sevenPushDate;
+
+	/** 专业名称 */
+	@ApiModelProperty("专业名称")
+	@Excel(name = "专业")
+	private String majorName;
+
+	@ApiModelProperty("审核通过时间")
+	private Long periodTime;
 }

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

@@ -125,6 +125,10 @@ public class GoodsVo {
 	@Excel(name = "封面地址")
 	@ApiModelProperty("封面地址")
 	private String coverUrl;
+
+	@Excel(name = "学时")
+	@ApiModelProperty("学时")
+	private BigDecimal selfClassHours;
 	/** 学时 */
 	@Excel(name = "学时")
 	@ApiModelProperty("学时")
@@ -406,4 +410,14 @@ public class GoodsVo {
 	private Integer viewSign;
 	@ApiModelProperty("寄件标签:1是 0否")
 	private Integer mailSign;
+
+	private Long orderGoodsId;
+
+	private Long periodWaitTime;
+
+	@ApiModelProperty("前培和补考商品关联多个")
+	private String makeGoodsIds;
+
+	private List<MakeGoodsVo> makeGoodsVoList;
+
 }

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/MakeGoodsVo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.goods.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("补考商品视图对象")
+public class MakeGoodsVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 前培和补考商品关联 */
+    @Excel(name = "前培和补考商品关联")
+    @ApiModelProperty("前培和补考商品关联")
+    private Long makeGoodsId;
+
+    /** 前培和补考商品关联 */
+    @Excel(name = "前培和补考商品关联")
+    @ApiModelProperty("前培和补考商品关联商品名")
+    private String makeGoodsName;
+
+    /** 前培和补考商品关联 */
+    @Excel(name = "前培和补考商品关联")
+    @ApiModelProperty("前培和补考商品关联编码")
+    private String makeGoodsCode;
+}

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

@@ -93,4 +93,7 @@ public class ClassGradeAddBo {
     /** 官方学习地址 */
     @ApiModelProperty("官方学习地址")
     private String officialLearningUrl;
+
+    @ApiModelProperty("班级提前截止天数")
+    private Integer pastDueDay;
 }

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

@@ -111,4 +111,7 @@ public class ClassGradeEditBo {
     /** 官方学习地址 */
     @ApiModelProperty("官方学习地址")
     private String officialLearningUrl;
+
+    @ApiModelProperty("班级提前截止天数")
+    private Integer pastDueDay;
 }

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

@@ -310,6 +310,17 @@ public class ClassGradeUserQueryBo extends BaseEntity {
 	@ApiModelProperty("1单证书 2多证书")
 	private Integer moreCertificateStatus;
 
+	private String sevenPushReason;
 
+	@ApiModelProperty("录单订单编号")
+	private String inputOrderSn;
+
+	private List<Long> tenantIds;
+
+	private List<Long> educationTypeIds;
+
+	private List<Long> projectIds;
+
+	private Long educationId;
 
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/SevenPushAuthAddBo.java

@@ -34,4 +34,6 @@ public class SevenPushAuthAddBo {
 
     @ApiModelProperty("失败原因")
     private String sevenPushReason;
+
+    private String sevenPushDate;
 }

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

@@ -98,4 +98,6 @@ private static final long serialVersionUID=1L;
 
     @TableField(exist = false)
     private Boolean isNewClass;
+
+    private Integer pastDueDay;
 }

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

@@ -88,5 +88,7 @@ private static final long serialVersionUID=1L;
     private Integer sevenPushCheck;
 
     private String sevenPushReason;
+
+    private String sevenPushDate;
 }
 

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java

@@ -29,6 +29,8 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
 //    @InterceptorIgnore(tenantLine = "true")
     List<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo);
 
+    List<ClassGradeStudentVo> listGradeAll(ClassGradeUserQueryBo bo);
+
     List<ClassGradeUserListVo> listGradeInform(ClassGradeQueryBo bo);
 
     List<ClassGradeStudentVo> listGradeStudy(ClassGradeQueryBo bo);

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

@@ -6,6 +6,7 @@ import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.grade.vo.*;
+import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
 import com.zhongzheng.modules.user.bo.UserUsbRecordBo;
 import com.zhongzheng.modules.user.domain.User;
@@ -34,12 +35,20 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 
+    List<ClassPeriodStudentVo> exportUserPeriod(ClassGradeUserQueryBo bo);
+
     List<ClassPeriodStudentVo> listUserWeekPeriod(ClassGradeUserQueryBo bo);
 
     Long listUserWeekStudyTime(ClassGradeUserQueryBo bo);
 
     List<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo);
 
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassPeriodStudentVo> listUserVideoRecordNew(ClassGradeUserQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long listUserVideoRecordNew_COUNT(ClassGradeUserQueryBo bo);
+
     List<ClassPeriodStudentVo> listUserPeriodExport(ClassGradeUserQueryBo bo);
 
     List<ClassPeriodUserVo> listPeriod(ClassGradeUserQueryBo bo);
@@ -64,8 +73,14 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<Long> selectStart(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId,@Param("orderGoodsId") Long orderGoodsId);
 
+    @InterceptorIgnore(tenantLine = "true")
+    List<Long> selectStartNew(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId,@Param("orderGoodsId") Long orderGoodsId);
+
     Long selectStartNoPhoto(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId,@Param("orderGoodsId") Long orderGoodsId);
 
+    @InterceptorIgnore(tenantLine = "true")
+    Long selectStartNoPhotoNew(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId,@Param("orderGoodsId") Long orderGoodsId);
+
     List<Long> selectEnd(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId);
 
     List<ClassGradeUserGoodsVo> sendClassGradeUser();
@@ -74,6 +89,10 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<ClassGradeUserGoodsVo> sendTenClassGradeUser();
 
+    List<ClassGradeUserGoodsVo> sendTenAndFifteenClassGradeUser();
+
+    List<ClassGradeUserGoodsVo> checkTenClassGradeUser(@Param("userId") Long userId,@Param("startTime") Long startTime,@Param("endTime") Long endTime);
+
     List<ClassGradeUserGoodsVo> sendFiveClassGradeUser();
 
     Long selectUserCount(User bo);
@@ -117,6 +136,25 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
     @InterceptorIgnore(tenantLine = "true")
     ClassGradeUser selectUserNoTenant(ClassGradeUserQueryBo bo);
 
+    @InterceptorIgnore(tenantLine = "true")
+    void updateListUserNoTenant(@Param("sevenPushReason") String sevenPushReason);
+
     List<Long> getFinishRequiredCourse(ClassGradeUserQueryBo bo);
 
+
+    OrderGoods getOrderGoods(@Param("userId") Long userId, @Param("goodsId")Long goodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassPeriodStudentNewVo> listUserPeriodNew(ClassGradeUserQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long listUserPeriodNew_COUNT(ClassGradeUserQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getEduIdByTenant(@Param("tenantId") Long tenantId,@Param("eduName") String eduName);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getProIdByTenant(@Param("tenantId") Long tenantId,@Param("proName") String proName,@Param("eduId") Long eduId);
+
+    Long listUserPeriodTotal(Integer periodStatus);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java

@@ -56,6 +56,10 @@ public interface IClassGradeService extends IService<ClassGrade> {
 
     List<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo);
 
+	List<ClassGradeStudentVo> listGradeAll(ClassGradeUserQueryBo bo);
+
+	List<ClassGradeStudentAllExportVo> listGradeAllExport(ClassGradeUserQueryBo bo);
+
     boolean editUserGrade(ClassGradeUserAddQueryBo bo);
 
 	List<ClassGradeUserListVo> listGradeInform(ClassGradeQueryBo bo);

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java

@@ -58,6 +58,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	String pushOfficialInfoMore(List<ClassGradeUserQueryBo> list);
 
+	String pushForceOfficialInfoMore(List<ClassGradeUserQueryBo> list);
+
 	String pushOfficialPeriod(ClassGradeUserQueryBo bo);
 
 
@@ -93,6 +95,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	List<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo);
 
+	List<ClassPeriodStudentExportProcessVo> exportListUserPeriodRecord(ClassGradeUserQueryBo bo);
+
 	List<ClassPeriodStudentVo> listUserPeriodWeekRecord(ClassGradeUserQueryBo bo);
 
 	List<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo);
@@ -123,6 +127,9 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	List<ClassGradeUserGoodsVo> sendTenClassGradeUser();
 
+
+	List<ClassGradeUserGoodsVo> checkTenClassGradeUser(ClassGradeUserQueryBo bo);
+
 	List<ClassGradeUserGoodsVo> sendFiveClassGradeUser();
 
 	Long selectList(User bo);
@@ -153,4 +160,17 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 	List<ClassPeriodStudentVo> listBKUserPeriod(ClassGradeUserQueryBo bo);
 
     List<UserUsbRecordVo> getListUserSubscribe(UserUsbRecordBo bo);
+
+	boolean resetQdyCheckInfo();
+
+	List<ClassPeriodStudentVo> listUserPeriodRecordNew(ClassGradeUserQueryBo bo);
+
+    List<ClassPeriodStudentNewVo> listUserPeriodNew(ClassGradeUserQueryBo bo);
+
+    List<ClassPeriodStudentVo> listUserVideoRecordNew(ClassGradeUserQueryBo bo);
+
+	List<ClassPeriodStudentVo> listUserPeriodManage(ClassGradeUserQueryBo bo);
+
+	UserPeriodTotalVo listUserPeriodTotal(ClassGradeUserQueryBo bo);
+
 }

+ 200 - 22
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -36,6 +36,7 @@ import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.*;
 import com.zhongzheng.modules.grade.mapper.ClassGradeMapper;
+import com.zhongzheng.modules.grade.mapper.ClassGradeUserMapper;
 import com.zhongzheng.modules.grade.service.*;
 import com.zhongzheng.modules.grade.vo.*;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
@@ -163,6 +164,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     private IOrderGoodsService iOrderGoodsService;
 
+    @Autowired
+    private ClassGradeUserMapper classGradeUserMapper;
+
     @Autowired
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
 
@@ -247,7 +251,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     //二建/二造继教班级过滤
                     String businessName = iGoodsService.getGoodsBusinessName(item.getGoodsId());
                     if (businessName.contains("继续教育二级建造师") || businessName.contains("继续教育二级造价师")){
-                        if (gradeVo.getClassStatus() == 1 &&
+                        if (Validator.isNotEmpty(gradeVo.getClassStatus())&&gradeVo.getClassStatus() == 1 &&
                                 (gradeVo.getClassStartTime() > DateUtils.getNowTime() || gradeVo.getClassEndTime() < DateUtils.getNowTime())){
                             //过期班级
                             return false;
@@ -354,8 +358,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                             }
                         });
                     }
+                if (StringUtils.isNotBlank(bo.getOfficialName()) && ObjectUtils.isNotNull(bo.getClassStatus()) && bo.getClassStatus() == 1){
+                    add.setSevenCode(ServletUtils.getEncoded("SEV"));
+                }else {
                     String sevenCode = getSevenCode(goodsId,add.getStudentUpper());
                     add.setSevenCode(sevenCode);
+                }
             }
             else if (("继续教育二级建造师".equals(businessName)|| ("继续教育二级造价师".equals(businessName))) && sysTenant.getShareClass() == 1){
                 erJfalg = true;
@@ -652,8 +660,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     }
                 }
             }
-
-            if (bo.getStatus() != -1) {
+            if(Validator.isNotEmpty(bo.getStatus())){
+                if (bo.getStatus() != -1) {
            /* LambdaQueryWrapper<ClassGrade> lqw = Wrappers.lambdaQuery();
             lqw.eq(ClassGrade::getClassName, update.getClassName());
             lqw.eq(ClassGrade::getStatus, 1);
@@ -668,31 +676,32 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     throw new RuntimeException("班级名称不能重复");
                 }
             }*/
-            }
-            if (bo.getStatus() == -1) { //删除判断班级是否人数空
-                ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
-                classGradeUserQueryBo.setGradeId(bo.getGradeId());
-                List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
-                if (list.size() > 0) {
-                    throw new RuntimeException("班级还有学员,无法删除");
                 }
-                ClassGrade grade = getById(bo.getGradeId());
-                if (StringUtils.isNotBlank(grade.getOfficialName())) {
-                    throw new RuntimeException("二建/二造班级无法删除,请联系技术人员!");
-                }
-            }
-            if (bo.getStatus() == 0) {  //更新为无效
-                ClassGradeVo oldGrade = this.queryById(bo.getGradeId());
-                if (oldGrade.getStatus() == 1) {
+                if (bo.getStatus() == -1) { //删除判断班级是否人数空
                     ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
                     classGradeUserQueryBo.setGradeId(bo.getGradeId());
                     List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
                     if (list.size() > 0) {
-                        throw new RuntimeException("班级还有学员,无法设置为无效");
+                        throw new RuntimeException("班级还有学员,无法删除");
+                    }
+                    ClassGrade grade = getById(bo.getGradeId());
+                    if (StringUtils.isNotBlank(grade.getOfficialName())) {
+                        throw new RuntimeException("二建/二造班级无法删除,请联系技术人员!");
                     }
                 }
-                if (StringUtils.isNotBlank(oldGrade.getOfficialName()) && sysTenant.getShareClass() == 1) {
-                    throw new RuntimeException("二建/二造班级无法设置为无效,请联系技术人员!");
+                if (bo.getStatus() == 0) {  //更新为无效
+                    ClassGradeVo oldGrade = this.queryById(bo.getGradeId());
+                    if (oldGrade.getStatus() == 1) {
+                        ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
+                        classGradeUserQueryBo.setGradeId(bo.getGradeId());
+                        List<ClassGradeStudentVo> list = this.listGrade(classGradeUserQueryBo);
+                        if (list.size() > 0) {
+                            throw new RuntimeException("班级还有学员,无法设置为无效");
+                        }
+                    }
+                    if (StringUtils.isNotBlank(oldGrade.getOfficialName()) && sysTenant.getShareClass() == 1) {
+                        throw new RuntimeException("二建/二造班级无法设置为无效,请联系技术人员!");
+                    }
                 }
             }
             //更改班主任
@@ -868,6 +877,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         if(Validator.isNotEmpty(entity.getOfficialName())){
             entity.setOfficialName(entity.getOfficialName().trim());
         }
+        if(Validator.isNotEmpty(entity.getPastDueDay())&&entity.getPastDueDay()<10){
+            throw new CustomException("班级提前截止天数错误");
+        }
     }
 
     @Override
@@ -932,6 +944,172 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return classGradeStudentVos;
     }
 
+    @Override
+    public List<ClassGradeStudentVo> listGradeAll(ClassGradeUserQueryBo bo) {
+        //身份证去重
+        if (Validator.isNotEmpty(bo.getIdCard()) && Validator.isNotEmpty(bo.getIdCards())) {
+            String idCard = bo.getIdCard();
+            List<String> idCards = bo.getIdCards();
+            Set<String> set = new HashSet<>();
+            for (String id : idCards) {
+                set.add(id);
+            }
+            set.add(idCard);
+            if (Validator.isNotEmpty(set)) {
+                bo.setIdCards(new ArrayList<>(set));
+            }
+            bo.setIdCard(null);
+        }
+        //查找班级学员
+        List<ClassGradeStudentVo> classGradeStudentVos = baseMapper.listGradeAll(bo);
+        //得到每个学员的课程学习记录
+        for (ClassGradeStudentVo classGradeStudentVo : classGradeStudentVos) {
+            Long secLong = 0L;
+            Long studyLong = 0L;
+
+            SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
+            subjectStudyRecordQueryBo.setGoodsId(classGradeStudentVo.getGoodsId());
+            subjectStudyRecordQueryBo.setUserId(classGradeStudentVo.getUserId());
+            subjectStudyRecordQueryBo.setGradeId(bo.getGradeId());
+            subjectStudyRecordQueryBo.setOrderGoodsId(classGradeStudentVo.getOrderGoodsId());
+            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();
+
+            }
+
+          /*  List<Long> timeList = classGradeUserMapper.selectStart(classGradeStudentVo.getUserId(), classGradeStudentVo.getGoodsId(), classGradeStudentVo.getGradeId(),classGradeStudentVo.getOrderGoodsId());
+            if (!org.springframework.util.CollectionUtils.isEmpty(timeList)) {
+                //查找开始学习时间
+                classGradeStudentVo.setStartTime(timeList.get(0));
+            }else{
+                classGradeStudentVo.setStartTime(classGradeUserMapper.selectStartNoPhoto(classGradeStudentVo.getUserId(), classGradeStudentVo.getGoodsId(), classGradeStudentVo.getGradeId(),classGradeStudentVo.getOrderGoodsId())
+                );
+            }*/
+            //BigDecimal divide = new BigDecimal(studyLong.toString()).divide(new BigDecimal(secLong.toString()),2,BigDecimal.ROUND_HALF_UP);
+            //classGradeStudentVo.setStudyNum(divide.multiply(new BigDecimal("100")).longValue());
+            classGradeStudentVo.setSecAllNum(secLong);
+            classGradeStudentVo.setStuAllNum(studyLong);
+            /*UserUpdateQueryBo userUpdateQueryBo = new UserUpdateQueryBo();
+            userUpdateQueryBo.setUserId(classGradeStudentVo.getUserId());
+            classGradeStudentVo.setUserUpdates(iUserUpdateService.queryList(userUpdateQueryBo));*/
+            /*if (Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId()) && classGradeStudentVo.getRebuyOrderGoodsId().longValue() > 0) {
+                classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(), classGradeStudentVo.getUserId()));
+            }*/
+/*            if (ObjectUtils.isNotNull(classGradeStudentVo.getOrgId())){
+                SysTenant tenant = iSysTenantService.getById(classGradeStudentVo.getOrgId());
+                if (ObjectUtils.isNotNull(tenant)){
+                    classGradeStudentVo.setTenantName(tenant.getTenantName());
+                }
+            }*/
+        }
+        return classGradeStudentVos;
+    }
+
+    @Override
+    public List<ClassGradeStudentAllExportVo> listGradeAllExport(ClassGradeUserQueryBo bo) {
+        if (Validator.isNotEmpty(bo.getIdCard()) && Validator.isNotEmpty(bo.getIdCards())) {
+            String idCard = bo.getIdCard();
+            List<String> idCards = bo.getIdCards();
+            Set<String> set = new HashSet<>();
+            for (String id : idCards) {
+                set.add(id);
+            }
+            set.add(idCard);
+            if (Validator.isNotEmpty(set)) {
+                bo.setIdCards(new ArrayList<>(set));
+            }
+            bo.setIdCard(null);
+        }
+        //查找班级学员
+        List<ClassGradeStudentVo> classGradeStudentVos = baseMapper.listGradeAll(bo);
+        List<ClassGradeStudentAllExportVo> eList = new ArrayList<>();
+        //得到每个学员的课程学习记录
+        for (ClassGradeStudentVo classGradeStudentVo : classGradeStudentVos) {
+            Long secLong = 0L;
+            Long studyLong = 0L;
+
+            SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
+            subjectStudyRecordQueryBo.setGoodsId(classGradeStudentVo.getGoodsId());
+            subjectStudyRecordQueryBo.setUserId(classGradeStudentVo.getUserId());
+            subjectStudyRecordQueryBo.setGradeId(bo.getGradeId());
+            subjectStudyRecordQueryBo.setOrderGoodsId(classGradeStudentVo.getOrderGoodsId());
+            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();
+
+            }
+
+            List<Long> timeList = classGradeUserMapper.selectStart(classGradeStudentVo.getUserId(), classGradeStudentVo.getGoodsId(), classGradeStudentVo.getGradeId(),classGradeStudentVo.getOrderGoodsId());
+            if (!org.springframework.util.CollectionUtils.isEmpty(timeList)) {
+                //查找开始学习时间
+                classGradeStudentVo.setStartTime(timeList.get(0));
+            }else{
+                classGradeStudentVo.setStartTime(classGradeUserMapper.selectStartNoPhoto(classGradeStudentVo.getUserId(), classGradeStudentVo.getGoodsId(), classGradeStudentVo.getGradeId(),classGradeStudentVo.getOrderGoodsId())
+                );
+            }
+            //BigDecimal divide = new BigDecimal(studyLong.toString()).divide(new BigDecimal(secLong.toString()),2,BigDecimal.ROUND_HALF_UP);
+            //classGradeStudentVo.setStudyNum(divide.multiply(new BigDecimal("100")).longValue());
+            classGradeStudentVo.setSecAllNum(secLong);
+            classGradeStudentVo.setStuAllNum(studyLong);
+            /*UserUpdateQueryBo userUpdateQueryBo = new UserUpdateQueryBo();
+            userUpdateQueryBo.setUserId(classGradeStudentVo.getUserId());
+            classGradeStudentVo.setUserUpdates(iUserUpdateService.queryList(userUpdateQueryBo));*/
+            /*if (Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId()) && classGradeStudentVo.getRebuyOrderGoodsId().longValue() > 0) {
+                classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(), classGradeStudentVo.getUserId()));
+            }*/
+            if (ObjectUtils.isNotNull(classGradeStudentVo.getOrgId())){
+                SysTenant tenant = iSysTenantService.getById(classGradeStudentVo.getOrgId());
+                if (ObjectUtils.isNotNull(tenant)){
+                    classGradeStudentVo.setTenantName(tenant.getTenantName());
+                }
+            }
+            ClassGradeStudentAllExportVo exportVo = BeanUtil.toBean(classGradeStudentVo,ClassGradeStudentAllExportVo.class);
+            exportVo.setHourStr((classGradeStudentVo.getRecordNum()+classGradeStudentVo.getStuAllNum())+"/"+(classGradeStudentVo.getExamNum()+classGradeStudentVo.getSecAllNum()));
+            exportVo.setServiceTimeStr(DateUtils.timestampToDateFormat(classGradeStudentVo.getServiceStartTime(),DateUtils.YYYY_MM_DD_HH_MM_SS)+"至"+DateUtils.timestampToDateFormat(classGradeStudentVo.getServiceEndTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
+            exportVo.setVideoStr(classGradeStudentVo.getStuAllNum()+"/"+classGradeStudentVo.getSecAllNum());
+            exportVo.setExamStr(classGradeStudentVo.getRecordNum()+"/"+classGradeStudentVo.getExamNum());
+            exportVo.setStudyStartStr(DateUtils.timestampToDateFormat(classGradeStudentVo.getStartTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
+            exportVo.setStudyEndStr(DateUtils.timestampToDateFormat(classGradeStudentVo.getEndTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
+            if(classGradeStudentVo.getPeriodStatus()==-1||classGradeStudentVo.getPeriodStatus()==0){
+                exportVo.setStudyStatusStr("未学完");
+            }else{
+                exportVo.setStudyStatusStr("已完成");
+            }
+            if(Validator.isEmpty(classGradeStudentVo.getStudyCount())){
+                classGradeStudentVo.setStudyCount(0L);
+            }
+            if(Validator.isEmpty(classGradeStudentVo.getUseStudyCount())){
+                classGradeStudentVo.setUseStudyCount(0);
+            }
+            exportVo.setTotalStudyCount(classGradeStudentVo.getUseStudyCount()+classGradeStudentVo.getStudyCount().intValue());
+            if(Validator.isNotEmpty(classGradeStudentVo.getUserStatus())&&classGradeStudentVo.getUserStatus()==1){
+                exportVo.setUserStatus("变更");
+            }else{
+                exportVo.setUserStatus("未变更");
+            }
+            if(Validator.isNotEmpty(classGradeStudentVo.getOfficialStatus())&&classGradeStudentVo.getOfficialStatus()==1){
+                exportVo.setOfficialStatus("是");
+            }else{
+                exportVo.setOfficialStatus("否");
+            }
+            if(Validator.isNotEmpty(classGradeStudentVo.getPeriodStatus())&&classGradeStudentVo.getPeriodStatus()==1){
+                exportVo.setPeriodStatus("通过");
+            }else{
+                exportVo.setPeriodStatus("未通过");
+            }
+            if(Validator.isNotEmpty(classGradeStudentVo.getPeriodPlush())&&classGradeStudentVo.getPeriodPlush()==1){
+                exportVo.setPeriodPlush("是");
+            }else{
+                exportVo.setPeriodPlush("否");
+            }
+            eList.add(exportVo);
+        }
+        return eList;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean editUserGrade(ClassGradeUserAddQueryBo bo) {
@@ -1661,7 +1839,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Override
     public List<ClassGradeVo> searchGradeList(ClassGradeQueryBo bo) {
         List<ClassGradeVo> classGradeVos = entity2Vo(baseMapper.searchGradeList(bo));
-        if (CollectionUtils.isEmpty(classGradeVos)) {
+        if (Validator.isEmpty(classGradeVos)||CollectionUtils.isEmpty(classGradeVos)) {
             return new ArrayList<>();
         }
         classGradeVos.forEach(item -> {

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików