yangdamao пре 2 година
родитељ
комит
59ff86d564
100 измењених фајлова са 2165 додато и 341 уклоњено
  1. 1 1
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SysProfileController.java
  2. 2 2
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java
  3. 3 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  4. 3 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  5. 10 7
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  6. 4 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/activity/ActivityRecommendController.java
  7. 43 6
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  8. 2 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  9. 0 13
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  10. 14 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  11. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysProfileController.java
  12. 2 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java
  13. 74 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  14. 3 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  15. 3 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  16. 10 7
      zhongzheng-admin/src/main/resources/application-prod.yml
  17. 4 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityRecommendController.java
  18. 11 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  19. 10 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  20. 3 0
      zhongzheng-api/src/main/resources/application-dev.yml
  21. 3 0
      zhongzheng-api/src/main/resources/application-pre.yml
  22. 11 7
      zhongzheng-api/src/main/resources/application-prod.yml
  23. 16 10
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  24. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  25. 210 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java
  26. 1 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  27. 24 12
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java
  28. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/DistributionSellerServiceImpl.java
  29. 10 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  30. 17 7
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  31. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/bo/ActivityRecommendQueryBo.java
  32. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java
  33. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityRecommendVo.java
  34. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/mapper/UserProfileMapper.java
  35. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java
  36. 16 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java
  37. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  38. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseAddBo.java
  39. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseEditBo.java
  40. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseMenuAddBo.java
  41. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseMenuEditBo.java
  42. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseMenuQueryBo.java
  43. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java
  44. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Course.java
  45. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseMenu.java
  46. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Major.java
  47. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuMapper.java
  48. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/MajorMapper.java
  49. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/IMajorService.java
  50. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java
  51. 12 12
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  52. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/MajorServiceImpl.java
  53. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java
  54. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseUserMenuVo.java
  55. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseVo.java
  56. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/distribution/service/impl/DistributionActivityGoodsServiceImpl.java
  57. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java
  58. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java
  59. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java
  60. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  61. 16 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java
  62. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  63. 174 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  64. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java
  65. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java
  66. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsEditBo.java
  67. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFirstChoiceAddBo.java
  68. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/Goods.java
  69. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsCourse.java
  70. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  71. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  72. 72 30
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  73. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  74. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  75. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenBo.java
  76. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java
  77. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/CreateSameClassBo.java
  78. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java
  79. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java
  80. 15 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  81. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java
  82. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java
  83. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  84. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  85. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java
  86. 305 153
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  87. 16 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  88. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  89. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassStudentExportVo.java
  90. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  91. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java
  92. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  93. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java
  94. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  95. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  96. 135 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  97. 198 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  98. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  99. 231 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  100. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysTask.java

+ 1 - 1
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SysProfileController.java

@@ -101,7 +101,7 @@ public class SysProfileController extends BaseController
         {
             return AjaxResult.error("修改密码失败,旧密码错误");
         }
-        if(!ToolsUtils.verifPwd(newPassword)){
+        if(!ToolsUtils.verifEasyPwd(newPassword)){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         if (SecurityUtils.matchesPassword(newPassword, password))

+ 2 - 2
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java

@@ -154,7 +154,7 @@ public class TopSysUserController extends BaseController
             return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(SecurityUtils.getUsername());
-        if(!ToolsUtils.verifPwd(user.getPassword())){
+        if(!ToolsUtils.verifEasyPwd(user.getPassword())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -210,7 +210,7 @@ public class TopSysUserController extends BaseController
                 }
 
             }
-            if(!ToolsUtils.verifPwd(user.getPassword())){
+            if(!ToolsUtils.verifEasyPwd(user.getPassword())){
                 throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
             }
             user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
     salePassword: http://gdxypx.xy.com/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,6 +176,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://39.108.7.155:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,6 +176,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://39.108.7.155:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

+ 10 - 7
zhongzheng-admin-saas/src/main/resources/application-prod.yml

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://www.xyyxt.net/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,11 +176,13 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
 exam:
-    applySave: http://192.168.1.7:9099/cd/exam/save
-    applyUpdate: http://192.168.1.7:9099/cd/exam/update
-    applyDelete: http://192.168.1.7:9099/cd/exam/delete
-    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save
-    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
+    applySave: http://39.108.7.155:9099/cd/exam/save
+    applyUpdate: http://39.108.7.155:9099/cd/exam/update
+    applyDelete: http://39.108.7.155:9099/cd/exam/delete
+    subscribeSave: http://39.108.7.155:9099/cd/subscribe/save
+    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

+ 4 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/activity/ActivityRecommendController.java

@@ -46,6 +46,10 @@ public class ActivityRecommendController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<ActivityRecommendVo> list(ActivityRecommendQueryBo bo) {
         startPage();
+        List<Integer> statusList = new ArrayList<>();
+        statusList.add(1);
+        statusList.add(0);
+        bo.setStatusList(statusList);
         List<ActivityRecommendVo> list = iActivityRecommendService.selectList(bo);
         return getDataTable(list);
     }

+ 43 - 6
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -42,10 +42,7 @@ import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsSer
 import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
 import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
-import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
-import com.zhongzheng.modules.exam.bo.ExamApplyResultBo;
-import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
-import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
+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;
@@ -98,6 +95,9 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -312,6 +312,31 @@ public class CommonController extends BaseController {
     }
 
     @ApiOperation("七大员新考结果")
+    @PostMapping("common/apply/result/receipt")
+    public AjaxResult examApplyResultReceipt(List<MultipartFile> files) {
+        files.forEach(item -> {
+            try {
+                ExcelUtil<ExamApplyResultExportBo> util = new ExcelUtil<ExamApplyResultExportBo>(ExamApplyResultExportBo.class);
+                //测试时间
+                String time = util.examApplyTimeAnalysis(item.getInputStream(), 1);
+                //成绩数据
+                List<ExamApplyResultExportBo> exportBo = util.examApplyImportExcel("", item.getInputStream());
+                iExamApplyService.examApplyResultReceipt(exportBo,time);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员新考证书")
+    @PostMapping("common/apply/result/certificate")
+    public AjaxResult examApplyResultCertificate(List<MultipartFile> files) {
+        String msg = iExamApplyService.examApplyResultCertificate(files);
+        return AjaxResult.success(msg);
+    }
+
+    @ApiOperation("七大员考试结果回执")
     @PostMapping("common/apply/result")
     public AjaxResult examApplyResult(@RequestBody ExamApplyResultBo bo) {
         if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
@@ -431,6 +456,17 @@ public class CommonController extends BaseController {
         return AjaxResult.success(iClassGradeService.getOfficialGradeNum(bo));
     }
 
+    @ApiOperation("新增二建班级")
+    @PostMapping("common/free/save/class")
+    public AjaxResult openOfficialSaveGrade(@RequestBody ClassGradeOpenBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        iClassGradeService.openOfficialSaveGrade(bo);
+        return AjaxResult.success();
+    }
+
+
     @ApiOperation("预报名班级开班")
     @PostMapping("common/free/open/class")
     public AjaxResult openOfficialGrade(@RequestBody ClassGradeOpenBo bo) {
@@ -747,12 +783,13 @@ public class CommonController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
     @Log(title = "测试获取山东题库", businessType = BusinessType.INSERT)
     @GetMapping("/common/free/getShanDongExam")
-    public AjaxResult getShanDongExam(GoodsQueryBo bo) {
-        iQuestionOtherService.queryById(3L);
+    public AjaxResult getShanDongExam(GoodsQueryBo bo) throws UnsupportedEncodingException {
+        System.out.println(bo.getBuyNote());
         return AjaxResult.success();
     }
 
 
+
     @ApiOperation("旧系统post请求")
     @PostMapping("/common/free/clientPost")
     public AjaxResult<Void> clientPost(@RequestBody ClientPostAddBo bo) {

+ 2 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -196,7 +196,8 @@ public class ClassGradeController extends BaseController {
     @PreAuthorize("@ss.hasPermi('grade:grade:list')")
     @GetMapping("/listGrade")
     public TableDataInfo<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo) {
-        if (ObjectUtils.isNotNull(bo.getGradeId())){
+        if (ObjectUtils.isNotNull(bo.getSevenCodeSign()) && bo.getSevenCodeSign() == 1
+                && ObjectUtils.isNotNull(bo.getGradeId())){
             ClassGrade gradeGrade = iClassGradeService.getById(bo.getGradeId());
             if (StringUtils.isNotBlank(gradeGrade.getSevenCode())){
                 bo.setSevenCode(gradeGrade.getSevenCode());

+ 0 - 13
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -151,19 +151,6 @@ public class OrderController extends BaseController {
     @PostMapping("/inputOrder")
     public AjaxResult addInputOrder(@RequestBody OrderAddBo bo) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        if (ObjectUtils.isNotNull(bo.getOpenQuestionSign()) && bo.getOpenQuestionSign() == 1){
-            //新B端外部题库开通
-            QuestionOpenBo questionOpenBo = new QuestionOpenBo();
-            questionOpenBo.setCreateSysUserId(loginUser.getUser().getUserId());
-            questionOpenBo.setCreateBy(SecurityUtils.getUsername());
-            questionOpenBo.setGoodsId(bo.getGoodsList().get(0).getGoodsId());
-            UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
-                    .eq(UserSubscribe::getUserId, bo.getUserId())
-                    .eq(UserSubscribe::getOrderGoodsId, bo.getSubOrderGoodsId())
-                    .last("limit 1"));
-            questionOpenBo.setUserSubscribeIds(Arrays.asList(userSubscribe.getSubscribeId()));
-            return AjaxResult.success(iOrderService.questionGoodsOpen(questionOpenBo));
-        }
         if(Validator.isEmpty(bo.getCreateUsername())){
             bo.setCreateSysUserId(loginUser.getUser().getUserId());
             bo.setCreateBy(SecurityUtils.getUsername());

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

@@ -437,4 +437,18 @@ public class ScheduleController extends BaseController {
         iScheduleService.createExamApply();
         return AjaxResult.success();
     }
+
+    @ApiOperation("每日汇总用户学习数据")
+    @GetMapping("/syncUserDateStudyLog")
+    public AjaxResult syncUserDateStudyLog(){
+        iScheduleService.syncUserDateStudyLog();
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员学员预约下载任务执行")
+    @GetMapping("/user/download")
+    public AjaxResult usbUserDownload(){
+        iScheduleService.usbUserDownload();
+        return AjaxResult.success();
+    }
 }

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysProfileController.java

@@ -96,7 +96,7 @@ public class SysProfileController extends BaseController
         {
             return AjaxResult.error("修改密码失败,旧密码错误");
         }
-        if(!ToolsUtils.verifPwd(newPassword)){
+        if(!ToolsUtils.verifEasyPwd(newPassword)){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         if (SecurityUtils.matchesPassword(newPassword, password))

+ 2 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java

@@ -161,7 +161,7 @@ public class SysUserController extends BaseController
             return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(SecurityUtils.getUsername());
-        if(!ToolsUtils.verifPwd(user.getPassword())){
+        if(!ToolsUtils.verifEasyPwd(user.getPassword())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -218,7 +218,7 @@ public class SysUserController extends BaseController
                 }
 
             }
-            if(!ToolsUtils.verifPwd(user.getPassword())){
+            if(!ToolsUtils.verifEasyPwd(user.getPassword())){
                 throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
             }
             user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));

+ 74 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java

@@ -2,7 +2,10 @@ package com.zhongzheng.controller.user;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSONArray;
+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.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -10,8 +13,12 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeTwoAddBo;
+import com.zhongzheng.modules.exam.domain.ExamApplySiteTime;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
+import com.zhongzheng.modules.exam.service.IExamApplySiteTimeService;
 import com.zhongzheng.modules.exam.vo.ExamSessionVo;
+import com.zhongzheng.modules.system.vo.SysTaskVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
@@ -49,6 +56,8 @@ public class UserSubscribeController extends BaseController {
 
     private final IExamApplyGoodsService iExamApplyGoodsService;
 
+    private final IExamApplySiteTimeService iExamApplySiteTimeService;
+
     /**
      * 查询用户预约考试列表
      */
@@ -61,6 +70,46 @@ public class UserSubscribeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 预约列表(包含其他使用祥粤考场的机构)
+     */
+    @ApiOperation("预约列表(包含其他使用祥粤考场的机构)")
+    @GetMapping("/sub/list")
+    public TableDataInfo<UserSubVo> getListSubscribe(UserSubQueryBo bo) {
+        startPage();
+        List<UserSubVo> list = iUserSubscribeService.getListSubscribe(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 预约学员档案资料下载
+     */
+    @ApiOperation("预约学员档案资料下载")
+    @GetMapping("/sub/user/export")
+    public AjaxResult<Void> subUserExport(SubUserExportBo bo) {
+        return toAjax(iUserSubscribeService.subUserExport(bo) ? 1 : 0);
+    }
+
+    /**
+     * 预约学员信息下载
+     */
+    @ApiOperation("预约学员信息下载")
+    @PostMapping("/sub/record/user/export")
+    public AjaxResult<String> subRecordUserExport(@RequestBody SubUserExportBo bo) {
+        String path = iUserSubscribeService.subRecordUserExport(bo);
+        return AjaxResult.success("操作成功",path);
+    }
+
+    /**
+     * 学员档案下载任务列表
+     */
+    @ApiOperation("学员档案下载任务列表")
+    @GetMapping("/sub/user/export/list")
+    public AjaxResult<List<SysTaskVo>> subUserExportList() {
+        return AjaxResult.success(iUserSubscribeService.subUserExportList());
+    }
+
+
     /**
      * 根据月份获取当月考试场次
      */
@@ -211,6 +260,9 @@ public class UserSubscribeController extends BaseController {
         String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 //        map.put("goodsExcel",goodsUtil.exportEasyExcel(goodsUtil.exportEasyData(goodsList), bo.getApplyName()+"商品列表"+timeStr));
 
+        ExamApplySiteTime siteTime = iExamApplySiteTimeService.getOne(new LambdaQueryWrapper<ExamApplySiteTime>()
+                .eq(ExamApplySiteTime::getApplyId, bo.getApplyId())
+                .last("limit 1"));
         if(Validator.isEmpty(bo.getApplySiteAddressTrain())){
             UserSubscribeExport export = new UserSubscribeExport();
             export.setRemark("导入时,请把示例删除");
@@ -218,8 +270,17 @@ public class UserSubscribeController extends BaseController {
             export.setIdCard("44086921356895125365");
             export.setApplyName(bo.getApplyName());
             export.setApplySiteAddress(bo.getApplySiteAddress());
-            export.setApplySiteExamTime("2021/10/21");
-            export.setApplySiteTime("9:00-12:00");
+            if (ObjectUtils.isNotNull(siteTime)){
+                List<ExamApplySiteTimeTwoAddBo> siteTimeTwoAddBos = JSONArray.parseArray(siteTime.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
+                if (CollectionUtils.isNotEmpty(siteTimeTwoAddBos)){
+                    ExamApplySiteTimeTwoAddBo twoAddBo = siteTimeTwoAddBos.get(0);
+                    export.setApplySiteTime(String.format("%s-%s",twoAddBo.getStartTime(),twoAddBo.getEndTime()));
+                }
+                export.setApplySiteExamTime(DateUtils.timestampToDateFormat(siteTime.getExamTime(),"yyyy/MM/dd"));
+            }else {
+                export.setApplySiteExamTime("2021/10/21");
+                export.setApplySiteTime("9:00-12:00");
+            }
             export.setMajorName("土建质量员");
 //            export.setCode("SP6415428604");
 //            export.setGoodsName("一级建造师继续教育(必修课+机电工程)");
@@ -242,8 +303,17 @@ public class UserSubscribeController extends BaseController {
             export.setGoodsName("一级建造师继续教育(必修课+机电工程)");
 
             export.setApplySiteAddressTrain(bo.getApplySiteAddressTrain());
-            export.setApplySiteExamTrainTime("2021/10/21");
-            export.setApplySiteTrainTime("9:00-12:00");
+            if (ObjectUtils.isNotNull(siteTime)){
+                List<ExamApplySiteTimeTwoAddBo> siteTimeTwoAddBos = JSONArray.parseArray(siteTime.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
+                if (CollectionUtils.isNotEmpty(siteTimeTwoAddBos)){
+                    ExamApplySiteTimeTwoAddBo twoAddBo = siteTimeTwoAddBos.get(0);
+                    export.setApplySiteTime(String.format("%s-%s",twoAddBo.getStartTime(),twoAddBo.getEndTime()));
+                }
+                export.setApplySiteExamTime(DateUtils.timestampToDateFormat(siteTime.getExamTime(),"yyyy/MM/dd"));
+            }else {
+                export.setApplySiteExamTime("2021/10/21");
+                export.setApplySiteTime("9:00-12:00");
+            }
 
             List<UserSubscribeTrainExport> list = new ArrayList<>();
             list.add(export);

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
     salePassword: http://gdxypx.xy.com/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: closehttps://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
@@ -176,6 +177,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://192.168.1.24:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
     salePassword: http://gdxypx.xy.com/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,6 +176,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://192.168.1.24:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://www.xyyxt.net/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,11 +176,13 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
 exam:
-    applySave: http://192.168.1.7:9099/cd/exam/save
-    applyUpdate: http://192.168.1.7:9099/cd/exam/update
-    applyDelete: http://192.168.1.7:9099/cd/exam/delete
-    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save
-    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
+    applySave: http://39.108.7.155:9099/cd/exam/save
+    applyUpdate: http://39.108.7.155:9099/cd/exam/update
+    applyDelete: http://39.108.7.155:9099/cd/exam/delete
+    subscribeSave: http://39.108.7.155:9099/cd/subscribe/save
+    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

+ 4 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityRecommendController.java

@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -40,6 +41,9 @@ public class ActivityRecommendController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<ActivityRecommendVo> list(ActivityRecommendQueryBo bo) {
         startPage();
+        List<Integer> statusList = new ArrayList<>();
+        statusList.add(1);
+        bo.setStatusList(statusList);
         List<ActivityRecommendVo> list = iActivityRecommendService.selectList(bo);
         return getDataTable(list);
     }

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

@@ -200,6 +200,17 @@ public class CommonController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("获取微信参数")
+    @GetMapping("/wx/config")
+    public AjaxResult<Map<String, Object>> wxConfig() {
+        Map<String, Object> map = new HashMap<>();
+        String smallAppId = configService.selectConfigByKey("wx.small.appid");
+        String gzhAppId = configService.selectConfigByKey("wx.gzh.appid");
+        map.put("smallAppId", smallAppId);
+        map.put("gzhAppId", gzhAppId);
+        return AjaxResult.success(map);
+    }
+
     /**
      * 查询课程列表
      */
@@ -214,7 +225,6 @@ public class CommonController extends BaseController {
     @ApiOperation("查询用户拥有的商品")
     @GetMapping("/test")
     public AjaxResult<Integer> test(CourseQueryBo bo) throws InterruptedException, ParseException {
-
         return AjaxResult.success(Printer.num);
     }
 

+ 10 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.base.vo.BaseFilterVo;
 import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
 import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
+import com.zhongzheng.modules.goods.bo.GoodsFirstChoiceAddBo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
@@ -227,4 +228,13 @@ public class OrderController extends BaseController {
     public AjaxResult<String> getOrderSevenYear(@PathVariable("orderGoodsId")Long orderGoodsId) {
         return AjaxResult.success("成功",iOrderGoodsService.getOrderSevenYear(orderGoodsId));
     }
+
+
+    @ApiOperation("优选商品重构")
+    @PostMapping("/firstChoiceGoods")
+    public AjaxResult<GoodsFirstChoiceAddBo> firstChoiceGoods(@RequestBody GoodsFirstChoiceAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderGoodsService.firstChoiceGoods(bo));
+    }
 }

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

@@ -137,6 +137,7 @@ oldStudySys:
     classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
     salePassword: http://gdxypx.xy.com/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
@@ -178,6 +179,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://192.168.1.24:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

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

@@ -134,6 +134,7 @@ oldStudySys:
     classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
     salePassword: http://gdxypx.xy.com/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
@@ -175,6 +176,8 @@ invoice:
 
 liveHost: http://192.168.1.222:6009
 
+fileHost: http://192.168.1.24:9099
+
 exam:
     applySave: http://192.168.1.7:9099/cd/exam/save
     applyUpdate: http://192.168.1.7:9099/cd/exam/update

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

@@ -146,6 +146,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://www.xyyxt.net/system/BussinessApi/UpdateInvoiceData
+    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -187,11 +188,14 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
+
 exam:
-    applySave: http://192.168.1.7:9099/cd/exam/save
-    applyUpdate: http://192.168.1.7:9099/cd/exam/update
-    applyDelete: http://192.168.1.7:9099/cd/exam/delete
-    subscribeSave: http://192.168.1.7:9099/cd/subscribe/save
-    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
+    applySave: http://39.108.7.155:9099/cd/exam/save
+    applyUpdate: http://39.108.7.155:9099/cd/exam/update
+    applyDelete: http://39.108.7.155:9099/cd/exam/delete
+    subscribeSave: http://39.108.7.155:9099/cd/subscribe/save
+    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

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

@@ -368,6 +368,8 @@ public class ToolsUtils {
         return result;
     }
 
+
+
     public static String EncoderByMd5(String str) {
         String result = "";
         MessageDigest md5 = null;
@@ -402,8 +404,8 @@ public class ToolsUtils {
         if(Validator.isEmpty(passWord)){
             return false;
         }
-        if(passWord.length()<6||passWord.length()>18){
-            return false;
+        if(passWord.length()<8||passWord.length()>16){
+            throw new CustomException("密码长度限制8到16位");
         }
         return true;
     }
@@ -421,7 +423,7 @@ public class ToolsUtils {
         if (m.matches()){
             return true;
         } else {
-            return false;
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
     }
 
@@ -534,14 +536,18 @@ public class ToolsUtils {
         return tempPKey;
     }
 
-    private static String MD5PubHasher(byte[] hashText) throws NoSuchAlgorithmException {
-        MessageDigest md5 = MessageDigest.getInstance("MD5");
-        byte[] b = md5.digest(hashText);
-        StringBuilder ret = new StringBuilder();
-        for (int i = 0; i < b.length; i++) {
-            ret.append(String.format("%02x", b[i]));
+    public static String MD5PubHasher(byte[] hashText)  {
+        try {
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] b = md5.digest(hashText);
+            StringBuilder ret = new StringBuilder();
+            for (int i = 0; i < b.length; i++) {
+                ret.append(String.format("%02x", b[i]));
+            }
+            return ret.toString();
+        }catch (NoSuchAlgorithmException e){
+            return null;
         }
-        return ret.toString();
     }
 
     public static String encryptDes(String source, byte[] key, byte[] iv) throws Exception {

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

@@ -300,7 +300,7 @@ public class HttpUtils
             conn.setRequestProperty("connection", "Keep-Alive");
             conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
             conn.setRequestProperty("Accept-Charset", "utf-8");
-            conn.setRequestProperty("contentType", "utf-8");
+            conn.setRequestProperty("contentType", "application/json;charset=UTF-8");
             conn.setDoOutput(true);
             conn.setDoInput(true);
             out = new PrintWriter(conn.getOutputStream());

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

@@ -315,6 +315,216 @@ public class ExcelUtil<T>
         return list;
     }
 
+    /**
+     * 获取七大员指定表格考试时间
+     *
+     * @param is 输入流
+     * @return 转换后集合
+     */
+    public String examApplyTimeAnalysis(InputStream is,Integer index) throws Exception
+    {
+        this.type = Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        Sheet sheet = wb.getSheetAt(0);
+        if (sheet == null)
+        {
+            throw new IOException("文件sheet不存在");
+        }
+        // 获取表头
+        Row heard = sheet.getRow(index);
+        Iterator<Cell> cellIterator = heard.cellIterator();
+        List<String> dataList = new ArrayList<>();
+        while(cellIterator.hasNext()) {
+            Cell next = cellIterator.next();
+            String stringCellValue = next.getStringCellValue();
+            dataList.add(stringCellValue);
+        }
+        return dataList.get(dataList.size() -1);
+    }
+    /**
+     * 七大员考试回执方法
+     *
+     * @param sheetName 表格索引名
+     * @param is 输入流
+     * @return 转换后集合
+     */
+    public List<T> examApplyImportExcel(String sheetName, InputStream is) throws Exception
+    {
+        this.type = Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        List<T> list = new ArrayList<T>();
+        Sheet sheet = null;
+        if (Validator.isNotEmpty(sheetName))
+        {
+            // 如果指定sheet名,则取指定sheet中的内容.
+            sheet = wb.getSheet(sheetName);
+        }
+        else
+        {
+            // 如果传入的sheet名不存在则默认指向第1个sheet.
+            sheet = wb.getSheetAt(0);
+        }
+
+        if (sheet == null)
+        {
+            throw new IOException("文件sheet不存在");
+        }
+
+        int rows = sheet.getPhysicalNumberOfRows();
+
+        if (rows > 0)
+        {
+            // 定义一个map用于存放excel列的序号和field.
+            Map<String, Integer> cellMap = new HashMap<String, Integer>();
+            // 第2行是表头
+            Row heard = sheet.getRow(2);
+            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
+            {
+                Cell cell = heard.getCell(i);
+                if (Validator.isNotNull(cell))
+                {
+                    String value = this.getCellValue(heard, i).toString();
+                    cellMap.put(value, i);
+                }
+                else
+                {
+                    cellMap.put(null, i);
+                }
+            }
+            // 有数据时才处理 得到类的所有field.
+            Field[] allFields = clazz.getDeclaredFields();
+            // 定义一个map用于存放列的序号和field.
+            Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
+            for (int col = 0; col < allFields.length; col++)
+            {
+                Field field = allFields[col];
+                Excel attr = field.getAnnotation(Excel.class);
+                if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
+                {
+                    // 设置类的私有字段属性可访问.
+                    field.setAccessible(true);
+                    Integer column = cellMap.get(attr.name());
+                    if (column != null)
+                    {
+                        fieldsMap.put(column, field);
+                    }
+                }
+            }
+            for (int i = 3; i < rows; i++)
+            {
+                // 从第3行开始取数据,第2行是表头.
+                Row row = sheet.getRow(i);
+                if(row == null)
+                {
+                    continue;
+                }
+                T entity = null;
+                for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet())
+                {
+                    Object val = this.getCellValue(row, entry.getKey());
+
+                    // 如果不存在实例则新建.
+                    entity = (entity == null ? clazz.newInstance() : entity);
+                    // 从map中得到对应列的field.
+                    Field field = fieldsMap.get(entry.getKey());
+                    // 取得类型,并根据对象类型设置值.
+                    Class<?> fieldType = field.getType();
+                    if (String.class == fieldType)
+                    {
+                        String s = Convert.toStr(val);
+                        if (StrUtil.endWith(s, ".0"))
+                        {
+                            //    val = StrUtil.subBefore(s, ".0",false);
+                        }
+                        else
+                        {
+                            if (val instanceof Double)
+                            {
+                                String dateFormat = field.getAnnotation(Excel.class).dateFormat();
+                                if (Validator.isNotEmpty(dateFormat))
+                                {
+                                    val = DateUtils.parseDateToStr(dateFormat, (Date) val);
+                                }
+                                else
+                                {
+                                    val = Convert.toStr(val);
+                                }
+                            }
+                            if (val instanceof Date)
+                            {
+                                String dateFormat = field.getAnnotation(Excel.class).dateFormat();
+                                if (Validator.isNotEmpty(dateFormat))
+                                {
+                                    val = DateUtils.parseDateToStr(dateFormat, (Date) val);
+                                }
+                                else
+                                {
+                                    val = Convert.toStr(val);
+                                }
+                            }
+
+                        }
+                    }
+                    else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && Validator.isNumber(Convert.toStr(val)))
+                    {
+                        val = Convert.toInt(val);
+                    }
+                    else if (Long.TYPE == fieldType || Long.class == fieldType)
+                    {
+                        val = Convert.toLong(val);
+                    }
+                    else if (Double.TYPE == fieldType || Double.class == fieldType)
+                    {
+                        val = Convert.toDouble(val);
+                    }
+                    else if (Float.TYPE == fieldType || Float.class == fieldType)
+                    {
+                        val = Convert.toFloat(val);
+                    }
+                    else if (BigDecimal.class == fieldType)
+                    {
+                        val = Convert.toBigDecimal(val);
+                    }
+                    else if (Date.class == fieldType)
+                    {
+                        if (val instanceof String)
+                        {
+                            val = DateUtils.parseDate(val);
+                        }
+                        else if (val instanceof Double)
+                        {
+                            val = DateUtil.getJavaDate((Double) val);
+                        }
+                    }
+                    else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
+                    {
+                        val = Convert.toBool(val, false);
+                    }
+                    if (Validator.isNotNull(fieldType))
+                    {
+                        Excel attr = field.getAnnotation(Excel.class);
+                        String propertyName = field.getName();
+                        if (Validator.isNotEmpty(attr.targetAttr()))
+                        {
+                            propertyName = field.getName() + "." + attr.targetAttr();
+                        }
+                        else if (Validator.isNotEmpty(attr.readConverterExp()))
+                        {
+                            val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
+                        }
+                        else if (Validator.isNotEmpty(attr.dictType()))
+                        {
+                            val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
+                        }
+                        ReflectUtils.invokeSetter(entity, propertyName, val);
+                    }
+                }
+                list.add(entity);
+            }
+        }
+        return list;
+    }
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
      *

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

@@ -135,13 +135,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/profile/**").anonymous()
                 .antMatchers("/common/jzs/**").anonymous()
                 .antMatchers("/common/rollback/period").anonymous()
-                .antMatchers("/common/apply/user/profile").anonymous()
+                .antMatchers("/common/apply/**").anonymous()
                 .antMatchers("/common/decompression").anonymous()
                 .antMatchers("/common/merge/file").anonymous()
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/orderGoods").anonymous()
                 .antMatchers("/common/check/account").anonymous()
-                .antMatchers("/common/apply/user/profile").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/apply/detail").anonymous()
                 .antMatchers("/common/external/question").anonymous()

+ 24 - 12
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java

@@ -18,22 +18,18 @@ import org.springframework.stereotype.Component;
 
 
 public class CustomTenantLineInnerInterceptor extends TenantLineInnerInterceptor {
+    private TenantLineHandler tenantLineHandler;
     public CustomTenantLineInnerInterceptor(TenantLineHandler tenantLineHandler) {
         super(tenantLineHandler);
+        this.tenantLineHandler = tenantLineHandler;
     }
 
-    /**
-     * 重构mybatispuls的多租户改为支持in
-     * @param currentExpression
-     * @param table
-     * @return
-     */
+
     @Override
     protected Expression builderExpression(Expression currentExpression, Table table) {
         Column aliasColumn = this.getAliasColumn(table);
         boolean presenceOfField=true;
-
-        if(presenceOfField) {
+        if(!this.tenantLineHandler.ignoreTable(table.getName())) {
             FindInSetExpression findInSetExpression = new FindInSetExpression();
             findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
             findInSetExpression.setRightExpression(aliasColumn);
@@ -50,21 +46,37 @@ public class CustomTenantLineInnerInterceptor extends TenantLineInnerInterceptor
 
     @Override
     protected void processInsert(Insert insert, int index, String sql, Object obj) {
-
+        super.processInsert(insert,index,sql,obj);
     }
 
     @Override
     protected void processUpdate(Update update, int index, String sql, Object obj) {
-
+        Table table = update.getTable();
+        if (!this.tenantLineHandler.ignoreTable(table.getName())) {
+            Column aliasColumn = this.getAliasColumn(table);
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            Expression where = update.getWhere() instanceof OrExpression ? new AndExpression(new Parenthesis(update.getWhere()), findInSetExpression) : new AndExpression(update.getWhere(), findInSetExpression);
+            update.setWhere(where);
+        }
     }
 
     @Override
     protected void processDelete(Delete delete, int index, String sql, Object obj) {
-
+        Table table = delete.getTable();
+        if (!this.tenantLineHandler.ignoreTable(table.getName())) {
+            Column aliasColumn = this.getAliasColumn(table);
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            Expression where = delete.getWhere() instanceof OrExpression ? new AndExpression(new Parenthesis(delete.getWhere()), findInSetExpression) : new AndExpression(delete.getWhere(), findInSetExpression);
+            delete.setWhere(where);
+        }
     }
 
     @Override
     protected void processInsertSelect(SelectBody selectBody) {
-
+        super.processInsertSelect(selectBody);
     }
 }

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

@@ -92,7 +92,7 @@ public class DistributionSellerServiceImpl extends ServiceImpl<DistributionSelle
         if(Validator.isEmpty(bo.getRealname())){
             throw new CustomException("姓名不能为空");
         }
-        if(!ToolsUtils.verifPwd(bo.getPwd())){
+        if(!ToolsUtils.verifEasyPwd(bo.getPwd())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         String key = Constants.REGISTER_SMS + bo.getTel();

+ 10 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java

@@ -491,6 +491,16 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
         .set(SysTenant::getStatus,-1));
     }
 
+    @Override
+    public List<SysTenant> getListNoTenant(Long tenantId) {
+        return baseMapper.getListNoTenant(tenantId);
+    }
+
+    @Override
+    public List<SysTenant> getExamRoomTenant() {
+        return baseMapper.getExamRoomTenant();
+    }
+
     private void initRoles(Long newTenantId,Long tenantId) {
         List<String> roleKey = new ArrayList<>();
         roleKey.add("seller");

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

@@ -198,7 +198,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Override
     public List<UserVo> selectList(UserQueryBo bo) {
         bo.setGetOrderNum(1L);
-        List<UserVo> list = entity2UserVo(userMapper.selectList(bo));
+        List<UserVo> list = entity2UserVo(userMapper.selectListNoTenant(bo));
         for (UserVo userVo : list) {
             userVo.setStudentCode(userVo.getUserAccount());
             ClassGradeUserQueryBo classGradeUserQueryBo = new ClassGradeUserQueryBo();
@@ -206,17 +206,17 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             List<Integer> status = new ArrayList<>();
             status.add(1);
             classGradeUserQueryBo.setStatus(status);
-            List<ClassGradeUserGoodsVo> classGradeUserGoodsVos = iClassGradeUserService.listUser(classGradeUserQueryBo);
+            List<ClassGradeUserGoodsVo> classGradeUserGoodsVos = iClassGradeUserService.listUserNoTenant(classGradeUserQueryBo);
             userVo.setClassGradeUserGoodsVoList(classGradeUserGoodsVos);
             userVo.setOrderNum(userVo.getGoodsCourseNum());
 
-            UserVisitLog userVisitLog = iUserVisitLogService.getOne(new LambdaQueryWrapper<UserVisitLog>().eq(UserVisitLog::getUserId, userVo.getUserId()).orderByDesc(UserVisitLog::getId).last("limit 1"));
+            UserVisitLog userVisitLog = iUserVisitLogService.getOneNoTenant(userVo.getUserId());
             if(Validator.isNotEmpty(userVisitLog)){
                 userVo.setLastVisitTime(userVisitLog.getCreateTime());
                 userVo.setVisitFromPlat(Integer.parseInt(userVisitLog.getFromPlat()));
             }
 
-            UserStudyLog userStudyLog = iUserStudyLogService.getOne(new LambdaQueryWrapper<UserStudyLog>().eq(UserStudyLog::getUserId, userVo.getUserId()).orderByDesc(UserStudyLog::getId).last("limit 1"));
+            UserStudyLog userStudyLog = iUserStudyLogService.getOneNoTenant( userVo.getUserId());
             if(Validator.isNotEmpty(userStudyLog)){
                 userVo.setLastStudyTime(userStudyLog.getCreateTime());
                 userVo.setStudyFromPlat(Integer.parseInt(userStudyLog.getFromPlat()));
@@ -728,7 +728,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getPwd()==null){
             throw new CustomException("密码不能为空");
         }
-        if(!ToolsUtils.verifPwd(bo.getPwd())){
+        if(!ToolsUtils.verifEasyPwd(bo.getPwd())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         String key = Constants.REGISTER_SMS + bo.getTel();
@@ -919,7 +919,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         {
             throw new BaseException("新密码格式错误");
         }
-        if(!ToolsUtils.verifPwd(bo.getNewPwd())){
+        if(!ToolsUtils.verifEasyPwd(bo.getNewPwd())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         user.setPassword(SecurityUtils.encryptPassword(bo.getNewPwd()));
@@ -1151,7 +1151,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getPwd()==null){
             throw new CustomException("密码不能为空");
         }
-        if(!ToolsUtils.verifPwd(bo.getPwd())){
+        if(!ToolsUtils.verifEasyPwd(bo.getPwd())){
             throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
         }
         String key = Constants.FORGET_SMS + bo.getTel();
@@ -1584,6 +1584,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return tokenService.createToken(loginUser);
     }
 
+    @Override
+    public User getByIdNoTenant(Long userId) {
+        return baseMapper.getByIdNoTenant(userId);
+    }
+
+    @Override
+    public User getByCardNoTenant(String idCard) {
+        return baseMapper.getByCardNoTenant(idCard);
+    }
+
 
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/bo/ActivityRecommendQueryBo.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 
@@ -57,4 +58,6 @@ public class ActivityRecommendQueryBo extends BaseEntity {
 	/** 1小程序 2PC网站 */
 	@ApiModelProperty("1小程序 2PC网站")
 	private Integer platform;
+	@ApiModelProperty("1有效 0无效")
+	private List<Integer> statusList;
 }

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java

@@ -140,6 +140,18 @@ public class ActivityRecommendServiceImpl extends ServiceImpl<ActivityRecommendM
                             GoodsSpecAttributeRelation relation = list.stream().findFirst().get();
                             item.setSpecTemplateId(relation.getSpecTemplateId());
                         }
+                        //多规格下的价格区间
+                        List<GoodsSpecAttributeRelation> specAttributeRelations = goodsSpecAttributeRelationService
+                                .list(new LambdaQueryWrapper<GoodsSpecAttributeRelation>()
+                                        .eq(GoodsSpecAttributeRelation::getSpecTemplateId, item.getSpecTemplateId()));
+                        if (CollectionUtils.isNotEmpty(specAttributeRelations)) {
+                            List<Long> goodsIds = specAttributeRelations.stream().filter(x -> ObjectUtils.isNotNull(x.getGoodsId())).map(GoodsSpecAttributeRelation::getGoodsId).collect(Collectors.toList());
+                            List<Goods> goodsList = iGoodsService.listByIds(goodsIds);
+                            //从小到大排序
+                            List<Goods> collect = goodsList.stream().filter(x -> ObjectUtils.isNotNull(x.getStandPrice())).sorted(Comparator.comparing(Goods::getStandPrice)).collect(Collectors.toList());
+                            item.setMinPrice(collect.get(0).getStandPrice());
+                            item.setMaxPrice(collect.get(collect.size() - 1).getStandPrice());
+                        }
                     }
                 });
             }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityRecommendVo.java

@@ -71,4 +71,6 @@ public class ActivityRecommendVo {
 	private String businessName;
 	@ApiModelProperty("商品列表")
 	private List<ActivityRecommendGoodsVo> goodsList;
+	@ApiModelProperty("业务别名称")
+	private String aliasName;
 }

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

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.base.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
@@ -29,4 +30,7 @@ public interface UserProfileMapper extends BaseMapper<UserProfile> {
     Long selectGrade(@Param("userId") Long userId,@Param("goodsId") Long goodsId);
 
     Integer getProfileStatusNum(ConsoleQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId);
 }

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

@@ -77,4 +77,6 @@ public interface IUserProfileService extends IService<UserProfile> {
 	Map<String,Object> exportPo(UserProfileQueryBo bo);
 
 	Integer getProfileStatusNum(ConsoleQueryBo bo);
+
+    UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId);
 }

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

@@ -48,6 +48,7 @@ import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -193,7 +194,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                     vo.setYear(date.substring(0, 4));
                     vo.setType("专业");
                     vo.setMajor("网络班");
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
@@ -216,7 +217,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                     vo.setYear(date.substring(0, 4));
                     vo.setType("选修");
                     vo.setMajor("网络班");
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
@@ -244,13 +245,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中必修");
-                    vo.setRemark2("课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -274,13 +275,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中建");
-                    vo.setRemark2("筑工程课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("筑工程课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -304,13 +305,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中机");
-                    vo.setRemark2("电工程课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("电工程课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -334,13 +335,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中市");
-                    vo.setRemark2("政公用工程课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("政公用工程课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -364,13 +365,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中公");
-                    vo.setRemark2("路工程课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("路工程课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -394,13 +395,13 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                         sex = "女";
                     }
                     vo.setSex(sex);
-                    vo.setClassHours(goodsVo.getClassHours()+"");
+                    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));
                     vo.setMajor("一级建造师继续教育培训");
                     vo.setRemark1("其中水");
-                    vo.setRemark2("利水电课 "+goodsVo.getClassHours()+" 学时,测试成绩合格。");
+                    vo.setRemark2("利水电课 "+goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP )+" 学时,测试成绩合格。");
                     vo.setTrainStartTime(studyRecordVo.getFirstStartTime()); //培训开始时间
                     vo.setTrainEndTime(classGradeUser.getPeriodWaitTime());//学时变为待审核时间,也是学习完成时间
                     List<String> chapterListTxt = changeChapterList(chapterList);
@@ -422,7 +423,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         addBo.setCertificateTpId(certificateTpId);
         addBo.setCertificateCode(vo.getCode());
         addBo.setCertificatePath(certificatePath);
-        addBo.setClassHours(goodsVo.getClassHours());
+        addBo.setClassHours(goodsVo.getClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP ));
         addBo.setEducationTypeId(goodsVo.getEducationTypeId());
         addBo.setProjectId(goodsVo.getProjectId());
         addBo.setBusinessId(goodsVo.getBusinessId());

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

@@ -995,6 +995,11 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         return baseMapper.getProfileStatusNum(bo);
     }
 
+    @Override
+    public UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId) {
+        return baseMapper.getByOrderGoodsIdNoTenant(orderGoodsId);
+    }
+
     /**
      * url读取image转换为Base64字符串
      *

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseAddBo.java

@@ -78,5 +78,7 @@ public class CourseAddBo {
     /** 1显示 0隐藏 */
     @ApiModelProperty("1显示 0隐藏")
     private Integer courseShow;
-
+    /** 优选生成 0否 1是 */
+    @ApiModelProperty("优选生成 0否 1是")
+    private Integer firstChoice;
 }

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

@@ -96,4 +96,7 @@ public class CourseEditBo {
     /** 1显示 0隐藏 */
     @ApiModelProperty("1显示 0隐藏")
     private Integer courseShow;
+    /** 优选生成 0否 1是 */
+    @ApiModelProperty("优选生成 0否 1是")
+    private Integer firstChoice;
 }

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

@@ -42,4 +42,7 @@ public class CourseMenuAddBo {
     /** 排序 */
     @ApiModelProperty("排序")
     private Integer sort;
+    /** 是否优选  0没有 1选中 */
+    @ApiModelProperty("是否优选  0没有 1选中")
+    private Integer firstChoiceStatus;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseMenuEditBo.java

@@ -48,4 +48,8 @@ public class CourseMenuEditBo {
     /** 排序 */
     @ApiModelProperty("排序")
     private Integer sort;
+
+    /** 是否优选  0没有 1选中 */
+    @ApiModelProperty("是否优选  0没有 1选中")
+    private Integer firstChoiceStatus;
 }

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

@@ -79,4 +79,7 @@ public class CourseMenuQueryBo extends BaseEntity {
 
 	@ApiModelProperty("商品ID")
 	private Long goodsId;
+
+	@ApiModelProperty("是否获取学时 1获取")
+	private Integer getHours;
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java

@@ -137,8 +137,14 @@ public class CourseQueryBo extends BaseEntity {
 	@ApiModelProperty("真实姓名")
 	private String realname;
 
+	@ApiModelProperty("旧业务系统订单号")
+	private String oldOrderSn;
+
 	@ApiModelProperty("查询标识:1 PC学习列表")
 	private Integer querySign;
 
+	@ApiModelProperty("学习是否完成 1完成 2未学完")
+	private Integer studyFinishStatus;
+
 	private List<Long> orderGoodsIds;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Course.java

@@ -72,5 +72,7 @@ private static final long serialVersionUID=1L;
     private Long tenantId;
     @TableField(exist = false)
     private Long oId;
+    /** 优选生成 0否 1是 */
+    private Integer firstChoice;
 
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseMenu.java

@@ -45,4 +45,6 @@ private static final long serialVersionUID=1L;
     /** 排序 */
     private Integer sort;
     private Long tenantId;
+    /** 是否优选  0没有 1选中 */
+    private Integer firstChoiceStatus;
 }

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

@@ -46,7 +46,7 @@ private static final long serialVersionUID=1L;
     private String encoder;
     /** 排序 */
     private Integer sort;
-    private Long tenantId;
+    private String tenantId;
     @TableField(exist = false)
     private Long oId;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuMapper.java

@@ -43,4 +43,6 @@ public interface CourseMenuMapper extends BaseMapper<CourseMenu> {
     @InterceptorIgnore(tenantLine = "true")
     List<CourseMenu> selectByNotTenant(@Param("newCourseId") Long newCourseId,@Param("type") Integer type,@Param("newModuleId") Long newModuleId,@Param("newTenantId") Long newTenantId);
 
+    Long countChapterTotalTime(@Param("chapterId") Long chapterId);
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/MajorMapper.java

@@ -28,4 +28,7 @@ public interface MajorMapper extends BaseMapper<Major> {
 
     @InterceptorIgnore(tenantLine = "true")
     Major getMajorByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Major getMajorByIdNoTenant(Long majorId);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/IMajorService.java

@@ -51,4 +51,6 @@ public interface IMajorService extends IService<Major> {
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     Major getMajorByTenant(String encoder, Long newTenantId);
+
+    Major getMajorByIdNoTenant(Long majorId);
 }

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

@@ -269,6 +269,13 @@ public class CourseMenuServiceImpl extends ServiceImpl<CourseMenuMapper, CourseM
                 }
             }
         }
+        if ( Validator.isNotEmpty(bo.getGetHours()) && bo.getGetHours() == 1) {
+            for (CourseUserMenuVo courseMenuVo : courseMenuVos) {
+                if(courseMenuVo.getType()==2){
+                    courseMenuVo.setTotalTime(baseMapper.countChapterTotalTime(courseMenuVo.getMenuId()));
+                }
+            }
+        }
         if (bo.getRebuild() != null && bo.getRebuild() == 1) {
             List<CourseUserMenuVo> courseMenuVoss = courseMenuVos.stream().filter(s ->
                     s.getRebuild() != null && s.getRebuild().equals(1)

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

@@ -58,6 +58,7 @@ import com.zhongzheng.modules.grade.bo.UserPeriodQueryBo;
 import com.zhongzheng.modules.grade.bo.UserPeriodStatusAddBo;
 import com.zhongzheng.modules.grade.domain.UserPeriod;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
+import com.zhongzheng.modules.grade.mapper.ClassGradeUserMapper;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
 import com.zhongzheng.modules.grade.service.IUserPeriodStatusService;
@@ -161,6 +162,8 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     private RedisCache redisCache;
     @Value("${liveGotoURL}")
     private String URL_PREFIX;
+    @Autowired
+    private ClassGradeUserMapper classGradeUserMapper;
 
 
 
@@ -578,7 +581,6 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                         goodsUserVo.setSubscribeSign(1);
                     }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 0){
                         goodsUserVo.setSubscribeSign(4);
-
                     } else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
                         goodsUserVo.setSubscribeSign(3);
                     }
@@ -779,8 +781,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             }
             goodsUserVo.setSecAllNum(secLong);
             goodsUserVo.setStuAllNum(studyLong);
-            goodsUserVo.setSubscribeSign(1);
-
+            goodsUserVo.setSubscribeSign(0);
 
             //查询对应考试安排
             List<ExamApplyGoodsVo> examApplyGoodsVoList = iExamApplyGoodsService.listByGoodsId(goodsUserVo.getGoodsId());
@@ -797,10 +798,11 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                             .last("limit 1"));
                     if (ObjectUtils.isNull(userSubscribe)){
                         goodsUserVo.setSubscribeSign(1);
+                    }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 1
+                            && ObjectUtils.isNull(userSubscribe.getResult())){
+                        goodsUserVo.setSubscribeSign(2);
                     }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 0){
                         goodsUserVo.setSubscribeSign(4);
-                    }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 1){
-                        goodsUserVo.setSubscribeSign(2);
                     }else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
                         goodsUserVo.setSubscribeSign(3);
                     }
@@ -821,13 +823,6 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                             String format = String.format("%s-%s", twoAddBo.getStartTime(), twoAddBo.getEndTime());
                             examApplyGoodsVo.setApplyTime(time);
                             examApplyGoodsVo.setApplyMoment(format);
-                            examApplyGoodsVo.setApplyNum(twoAddBo.getNum().intValue());
-                            //预约人数
-                            int count = iUserSubscribeService.count(new LambdaQueryWrapper<UserSubscribe>()
-                                    .eq(UserSubscribe::getSubscribeStatus, 1)
-                                    .eq(UserSubscribe::getExamStatus, 0)
-                                    .eq(UserSubscribe::getApplyId, examApplyGoodsVo.getApplyId()));
-                            examApplyGoodsVo.setSubscribeNum(count);
                         }
                     }
                     switch (examApply.getApplyNature()){
@@ -936,6 +931,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             subjectStudyRecordQueryBo.setGoodsId(goodsUserVo.getGoodsId());
             subjectStudyRecordQueryBo.setUserId(goodsUserVo.getUserId());
             subjectStudyRecordQueryBo.setGradeId(goodsUserVo.getGradeId());
+            subjectStudyRecordQueryBo.setOrderGoodsId(goodsUserVo.getOrderGoodsId());
             List<SubjectStudyRecordVo> subjectStudyRecordVos = iUserStudyRecordService.listSubject(subjectStudyRecordQueryBo);
             for (SubjectStudyRecordVo subjectStudyRecordVo : subjectStudyRecordVos) {
                 secLong = new BigDecimal(secLong.toString()).add(new BigDecimal(subjectStudyRecordVo.getSectionNum().toString())).longValue();
@@ -943,6 +939,10 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             }
             goodsUserVo.setSecAllNum(secLong);
             goodsUserVo.setStuAllNum(studyLong);
+            List<Long> photoListTime = classGradeUserMapper.selectStart(goodsUserVo.getUserId(), goodsUserVo.getGoodsId(), goodsUserVo.getGradeId(),goodsUserVo.getOrderGoodsId());
+            if(Validator.isNotEmpty(photoListTime)&&photoListTime.size()>0){
+                goodsUserVo.setStartTime(photoListTime.get(0));
+            }
         }
         return goodsUserVos;
     }

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.course.bo.*;
@@ -104,7 +105,7 @@ public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements
         queryBo.setMajorProjects(bo.getMajorProjects());
         queryBo.setCategoryName(bo.getCategoryName());
         if (baseMapper.countNum(queryBo)>0){
-            throw new IllegalArgumentException("该科目下已存在专业名称重复");
+            throw new CustomException("该科目下已存在专业名称重复");
         }
 
         Major add = BeanUtil.toBean(bo, Major.class);
@@ -174,4 +175,9 @@ public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements
     public Major getMajorByTenant(String encoder, Long newTenantId) {
         return baseMapper.getMajorByTenant(encoder,newTenantId);
     }
+
+    @Override
+    public Major getMajorByIdNoTenant(Long majorId) {
+        return baseMapper.getMajorByIdNoTenant(majorId);
+    }
 }

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

@@ -95,4 +95,9 @@ public class CourseMenuVo {
 	@ApiModelProperty("章下面的节")
 	private List<CourseChapterSectionVo> courseChapterSectionList;
 
+	/** 是否优选  0没有 1选中 */
+	@Excel(name = "是否优选  0没有 1选中")
+	@ApiModelProperty("是否优选  0没有 1选中")
+	private Integer firstChoiceStatus;
+
 }

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

@@ -101,4 +101,12 @@ public class CourseUserMenuVo {
 	@ApiModelProperty("公共标识:1公共章 0非公共章")
 	private Integer commonSign;
 
+	/** 是否优选  0没有 1选中 */
+	@Excel(name = "是否优选  0没有 1选中")
+	@ApiModelProperty("是否优选  0没有 1选中")
+	private Integer firstChoiceStatus;
+
+	@ApiModelProperty("章下节总秒数")
+	private Long totalTime;
 }
+

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

@@ -117,5 +117,8 @@ public class CourseVo {
 	private Integer courseShow;
 	@ApiModelProperty("课程双师资绑定状态")
 	private Integer bindStatus;
-
+	/** 优选生成 0否 1是 */
+	@Excel(name = "优选生成 0否 1是")
+	@ApiModelProperty("优选生成 0否 1是")
+	private Integer firstChoice;
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/distribution/service/impl/DistributionActivityGoodsServiceImpl.java

@@ -583,7 +583,7 @@ public class DistributionActivityGoodsServiceImpl extends ServiceImpl<Distributi
     }
 
     @Override
-    
+
     public void saveBatchEntity(List<DistributionActivityGoods> activityGoodsList) {
         saveBatch(activityGoodsList);
     }
@@ -1241,7 +1241,7 @@ public class DistributionActivityGoodsServiceImpl extends ServiceImpl<Distributi
         if (ObjectUtil.isNull(newMajorId)) {
             //新增专业
             major.setId(null);
-            major.setTenantId(newTenantId);
+            major.setTenantId(newTenantId.toString());
             iMajorService.save(major);
             newMajorId = major.getId();
             addSysGoodsRecord(oid, major.getId(), GoodsCopyEnum.MAJOR.getType(), newTenantId);

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

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplyResultExportBo implements Serializable {
+
+    @Excel(name = "序号")
+    private String index;
+
+    @Excel(name = "考生姓名")
+    private String userName;
+
+    @Excel(name = "考生身份证号")
+    private String idCard;
+
+    @Excel(name = "联系方式")
+    private String telphone;
+
+    @Excel(name = "岗位名称")
+    private String majorName;
+
+    @Excel(name = "考试状态")
+    private String applyStatus;
+
+    @Excel(name = "考试成绩")
+    private String score;
+
+    @Excel(name = "成绩审核状态")
+    private String scoreCheck;
+
+    @Excel(name = "成绩审核时间")
+    private String scoreCheckTime;
+
+    @Excel(name = "工作单位")
+    private String companyName;
+
+    @Excel(name = "证书编码")
+    private String certificateCode;
+
+
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java

@@ -22,6 +22,9 @@ public class ExamApplySubscribeBo implements Serializable {
     @ApiModelProperty("标识ID")
     private Long signId;
 
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
     @ApiModelProperty("学员类型:1非补考 2补考")
     private Integer studentType;
 

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月11日 11:40
+ */
+@Data
+public class SubscribeInfoBo implements Serializable {
+
+    private Long userId;
+
+    private Long applyTime;
+
+    private String applyStartTime;
+
+    private String applyEndTime;
+
+    private String major;
+
+}

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

@@ -63,6 +63,8 @@ private static final long serialVersionUID=1L;
     private Integer applyNature;
     /** 专场学员资料地址 */
     private String natureUrl;
+    /** 关联code(公用祥粤考场) */
+    private String relCode;
 
     private Long tenantId;
 }

+ 16 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java

@@ -3,10 +3,7 @@ package com.zhongzheng.modules.exam.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.base.domain.UserProfile;
-import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
-import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
-import com.zhongzheng.modules.exam.bo.ExamApplyRoomQueryBo;
-import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
+import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.vo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
@@ -97,4 +94,19 @@ public interface ExamApplyMapper extends BaseMapper<ExamApply> {
 
     @InterceptorIgnore(tenantLine = "true")
     ExamApply getEntityById(Long applyId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    String getExamRelCodeNotTenant(@Param("applyName") String applyName);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<String> getSevenMajorNames();
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserSubscribe getSubscribeInfo(SubscribeInfoBo infoBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserSubscribe getExamPassSub(SubscribeInfoBo infoBo);
 }

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

@@ -8,6 +8,7 @@ import com.zhongzheng.modules.exam.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.user.vo.UserStudyRecordExport;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
@@ -101,4 +102,12 @@ public interface IExamApplyService extends IService<ExamApply> {
     void updateExamUserProfile(MultipartFile file);
 
 	String examUserProfileExport(UserProfileQueryBo bo);
+
+    String getExamRelCodeNotTenant(String applyName);
+
+    List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId);
+
+    void examApplyResultReceipt(List<ExamApplyResultExportBo> exportBo, String time);
+
+    String examApplyResultCertificate(List<MultipartFile> files);
 }

+ 174 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java

@@ -78,9 +78,12 @@ import javax.mail.internet.*;
 import javax.mail.util.ByteArrayDataSource;
 import java.awt.image.BufferedImage;
 import java.io.*;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -631,6 +634,16 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
         add.setCode(ServletUtils.getEncoded("KSAP"));
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
+        add.setRelCode(ServletUtils.getEncoded("SHEX"));
+        //是否公用祥粤考场
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = sysTenantService.getById(Long.valueOf(tenantId));
+        if (ObjectUtils.isNotNull(sysTenant.getExamRoom()) && sysTenant.getExamRoom() == 1){
+            String code = baseMapper.getExamRelCodeNotTenant(add.getApplyName());
+            if (net.polyv.common.v1.util.StringUtils.isNotEmpty(code)){
+                add.setRelCode(code);
+            }
+        }
         this.save(add);
         if (CollectionUtils.isNotEmpty(bo.getApplyUsers())) {
             //专场预约学员
@@ -1219,6 +1232,167 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
         return content;
     }
 
+    @Override
+    public String getExamRelCodeNotTenant(String applyName) {
+        return baseMapper.getExamRelCodeNotTenant(applyName);
+    }
+
+    @Override
+    public List<UserStudyRecordExport> getUserStudyRecordNoTenant(Long orderGoodsId) {
+        return baseMapper.getUserStudyRecordNoTenant(orderGoodsId);
+    }
+
+    @Override
+    public void examApplyResultReceipt(List<ExamApplyResultExportBo> exportBo, String time) {
+        if (CollectionUtils.isEmpty(exportBo)){
+            return;
+        }
+        //考试时间
+        List<String> collect = Arrays.stream(time.split(" ")).collect(Collectors.toList());
+        SubscribeInfoBo infoBo = new SubscribeInfoBo();
+        infoBo.setApplyTime(DateUtils.dateTimeSec("yyyy-MM-dd",collect.get(0)));
+        infoBo.setApplyStartTime(getTimeStr(collect.get(1)));
+        infoBo.setApplyEndTime(getTimeStr(collect.get(3)));
+        //补充学员成绩
+        exportBo.forEach(bo -> {
+            //查询学员信息
+            User user = iUserService.getByCardNoTenant(bo.getIdCard());
+            if (ObjectUtils.isNull(user)){
+                log.error("学员信息查询不到:"+bo.getUserName());
+                return;
+            }
+            //预约考试信息
+            //匹配系统七大员报考岗位
+            String majorName = getMajorName(bo.getMajorName());
+            infoBo.setMajor(majorName);
+            infoBo.setUserId(user.getUserId());
+            UserSubscribe subscribe = baseMapper.getSubscribeInfo(infoBo);
+            if (ObjectUtils.isNull(subscribe)){
+                return;
+            }
+            switch (bo.getApplyStatus()){
+                case "正常":
+                    //补充考试成绩
+                    BigDecimal bigDecimal = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(1);
+                    subscribe.setPerformance(bigDecimal.longValue());
+                    if (bigDecimal.compareTo(new BigDecimal("60.00")) >= 0){
+                        subscribe.setResult(1);
+                    }else {
+                        subscribe.setResult(0);
+                    }
+                    break;
+                case "缺考":
+                    //补充考试成绩
+                    BigDecimal bigDecimal2 = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(2);
+                    subscribe.setPerformance(bigDecimal2.longValue());
+                    subscribe.setResult(0);
+                    break;
+                case "作弊":
+                    //补充考试成绩
+                    BigDecimal bigDecimal3 = new BigDecimal(bo.getScore());
+                    subscribe.setExamStatus(3);
+                    subscribe.setPerformance(bigDecimal3.longValue());
+                    subscribe.setResult(0);
+                    break;
+                    default :
+                        break;
+            }
+
+            iUserSubscribeService.updateByIdNoTenant(subscribe);
+        });
+    }
+
+    @Override
+    public String examApplyResultCertificate(List<MultipartFile> files) {
+        if (CollectionUtils.isEmpty(files)){
+            return "请勿上传空文件!";
+        }
+        List<String> msgList = new ArrayList<>();
+        files.forEach(multipartFile -> {
+            //文件名= 身份证号码_岗位名称_证书编号_发证日期
+            String fileName = multipartFile.getOriginalFilename();
+            List<String> collect = Arrays.stream(fileName.split("_")).collect(Collectors.toList());
+            //查询学员信息
+            User user = iUserService.getByCardNoTenant(collect.get(0));
+            if (ObjectUtils.isNull(user)){
+                log.error("学员信息查询不到:"+collect.get(0));
+                msgList.add(multipartFile.getOriginalFilename());
+                return;
+            }
+            SubscribeInfoBo infoBo = new SubscribeInfoBo();
+            infoBo.setMajor(collect.get(1));
+            infoBo.setUserId(user.getUserId());
+            UserSubscribe subscribe = baseMapper.getExamPassSub(infoBo);
+            if (ObjectUtils.isNull(subscribe)){
+                msgList.add(multipartFile.getOriginalFilename());
+                return;
+            }
+            subscribe.setCertificateCode(collect.get(2));
+            Long time = DateUtils.dateTimeSec("yyyy-MM-dd",collect.get(3));
+            subscribe.setCertificateStartTime(time);
+            //有效期为一年
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(time));
+            // 将年份加一
+            calendar.add(Calendar.YEAR, 1);
+            Long timeTwo = calendar.getTime().getTime()/1000;
+            subscribe.setCertificateEndTime(timeTwo);
+
+            //上传证书
+            OssRequest ossRequest = new OssRequest();
+            ossRequest.setGradeId(0L);
+            ossRequest.setUserId(0L);
+            ossRequest.setImageStatus(7);
+            ossRequest.setFile(multipartFile);
+            try {
+                String upload = ossService.upload(ossRequest);
+                subscribe.setCertificateUrl(upload);
+            } catch (Exception e) {
+//                log.error("证书上传有误:"+collect.get(0));
+                msgList.add(multipartFile.getOriginalFilename());
+                e.printStackTrace();
+            }
+            iUserSubscribeService.updateByIdNoTenant(subscribe);
+        });
+        return msgList.stream().collect(Collectors.joining(","));
+    }
+
+    private String getMajorName(String majorName) {
+        //祥粤学习 七大员报考岗位名称
+        List<String> names = baseMapper.getSevenMajorNames();
+        if (CollectionUtils.isEmpty(names)){
+            return "";
+        }
+        List<String> collect = names.stream().sorted(Comparator.comparing(x -> {
+            Integer count = 0;
+            for (int i = 0; i < majorName.length(); i++) {
+                char c = majorName.charAt(i);
+                if (x.contains(Character.toString(c))) {
+                    count++;
+                }
+            }
+            return count;
+        })).collect(Collectors.toList());
+
+        return collect.get(collect.size() - 1);
+    }
+
+    private String getTimeStr(String str){
+        String format = "";
+        SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");
+        SimpleDateFormat sf2 = new SimpleDateFormat("HH:mm");
+        try {
+            Date parse = sf.parse(str);
+            format = sf2.format(parse);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return format;
+    }
+
+
     //生成承诺书
     private void generateCommitment(String keyValue,String toPath,String idCard,String major)throws IOException {
         int imgIndex=(int)(Math.random() * 10 );

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

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

@@ -202,4 +202,13 @@ public class GoodsAddBo {
     private String sevenYear;
     @ApiModelProperty("商品试卷限制终端学习,多个,拼接  1公众号 2小程序")
     private String examLimitClient;
+    /** 是否优选  0没有 1选中 */
+    @ApiModelProperty("是否优选  0没有 1选中")
+    private Integer firstChoiceStatus;
+    /** 优选至少学习学时 */
+    @ApiModelProperty("优选至少学习学时")
+    private Long minClassHour;
+    /** 优选生成商品 0否 1是 */
+    @ApiModelProperty("优选生成商品 0否 1是")
+    private Long firstChoiceGoods;
 }

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

@@ -236,4 +236,13 @@ public class GoodsEditBo {
     private String sevenYear;
     @ApiModelProperty("商品试卷限制终端学习,多个,拼接  1公众号 2小程序")
     private String examLimitClient;
+    /** 是否优选  0没有 1选中 */
+    @ApiModelProperty("是否优选  0没有 1选中")
+    private Integer firstChoiceStatus;
+    /** 优选至少学习学时 */
+    @ApiModelProperty("优选至少学习学时")
+    private Long minClassHour;
+    /** 优选生成商品 0否 1是 */
+    @ApiModelProperty("优选生成商品 0否 1是")
+    private Long firstChoiceGoods;
 }

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFirstChoiceAddBo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.goods.bo;
+
+import com.zhongzheng.modules.course.bo.CourseMenuAddBo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品添加对象 goods
+ *
+ * @author hjl
+ * @date 2021-10-12
+ */
+@Data
+@ApiModel("商品添加对象")
+public class GoodsFirstChoiceAddBo {
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    @ApiModelProperty("班级ID")
+    private Long gradeId;
+
+    @ApiModelProperty("章列表ID")
+    private List<Long> chapterIdList;
+}

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

@@ -170,4 +170,10 @@ private static final long serialVersionUID=1L;
     private String sevenYear;
     /** 补考商品统一标识 */
     private Integer unifySign;
+    /** 是否优选  0没有 1选中 */
+    private Integer firstChoiceStatus;
+    /** 优选至少学习学时 */
+    private Long minClassHour;
+    /** 优选生成商品 0否 1是 */
+    private Long firstChoiceGoods;
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsCourse.java

@@ -38,4 +38,5 @@ private static final long serialVersionUID=1L;
     /** 别名 */
     private String aliasName;
     private Long tenantId;
+
 }

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

@@ -14,6 +14,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.SysTenant;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.security.core.parameters.P;
 
@@ -96,4 +97,10 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<ReplenishExamVo> getReplenishExam(ReplenishExamBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Goods> getRelevanceGoodsNoTenant(@Param("businessName") String businessName,@Param("majName")String majName,@Param("goodsId")Long goodsId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Goods> getRelGoodsNoTenant(@Param("businessName") String businessName,@Param("categoryName") String categoryName,@Param("tenantId") Long tenantId);
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.bo.ReplenishExamBo;
+import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
 import com.zhongzheng.modules.course.vo.ExternalQuestionVo;
 import com.zhongzheng.modules.course.vo.ReplenishExamVo;
@@ -13,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.system.domain.SysTenant;
 
 import java.util.Collection;
 import java.util.List;
@@ -156,4 +158,10 @@ public interface IGoodsService extends IService<Goods> {
     List<ExternalQuestionVo> getExternalQuestion(ExternalQuestionBo bo);
 
 	List<ReplenishExamVo> getReplenishExam(ReplenishExamBo bo);
+
+	List<Goods> getRelevanceGoodsNoTenant(String businessName,String majName,Long goodsId);
+
+	List<Goods> getRelGoodsNoTenant(String businessName, String categoryName, Long tenantId);
+
+
 }

+ 72 - 30
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -630,34 +630,64 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             }
         }else if (businessName.contains("继续教育") && businessName.contains("施工现场专业人员")
                 && StringUtils.isNotBlank(bo.getSevenYear()) && !Arrays.asList("2021","2022").contains(bo.getSevenYear())){
-            //七大员继教同专业下共用一个班级
-            Goods oneGoods = getOne(new LambdaQueryWrapper<Goods>()
-                    .eq(Goods::getEducationTypeId, add.getEducationTypeId())
-                    .eq(Goods::getProjectId, add.getProjectId())
-                    .eq(Goods::getBusinessId, add.getBusinessId())
-                    .eq(ObjectUtils.isNotNull(add.getMajorId()), Goods::getMajorId, add.getMajorId())
-                    .eq(Goods::getSubjectIds, add.getSubjectIds())
-                    .eq(Goods::getStatus, 1)
-                    .eq(Goods::getGoodsStatus,1)
-                    .ne(Goods::getGoodsId, goodsId)
-                    .last("limit 1"));
-            if (ObjectUtils.isNotNull(oneGoods)){
-                List<ClassGradeGoods> classGradeList = iClassGradeGoodsService
-                        .list(new LambdaQueryWrapper<ClassGradeGoods>()
-                        .eq(ClassGradeGoods::getGoodsId, oneGoods.getGoodsId()));
-                if (CollectionUtils.isNotEmpty(classGradeList)){
-                    List<ClassGrade> list = iClassGradeService.listByIds(classGradeList.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
-                    list.forEach(item -> item.setGradeId(null));
-                    iClassGradeService.saveBatch(list);
-                    List<ClassGradeGoods> gradeGoodsList = list.stream().map(item -> {
-                        ClassGradeGoods gradeGoods = new ClassGradeGoods();
-                        gradeGoods.setGradeId(item.getGradeId());
-                        gradeGoods.setGoodsId(goodsId);
-                        gradeGoods.setUpdateTime(DateUtils.getNowTime());
-                        gradeGoods.setCreateTime(DateUtils.getNowTime());
-                        return gradeGoods;
-                    }).collect(Collectors.toList());
-                    iClassGradeGoodsService.saveBatch(gradeGoodsList);
+            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            SysTenant tenant = iSysTenantService.getById(Long.valueOf(tenantId));
+            if (ObjectUtils.isNotNull(tenant.getSevenClass()) && tenant.getSevenClass() == 1){
+                //多机构使用祥粤七大员班级
+                Goods g = getById(goodsId);
+                Major major = iMajorService.getById(g.getMajorId());
+                List<Goods> list = baseMapper.getRelevanceGoodsNoTenant(businessName,major.getCategoryName(),g.getGoodsId());
+                if (CollectionUtils.isNotEmpty(list)){
+                    Long relGoodsId = list.stream().findFirst().get().getGoodsId();
+                    List<ClassGradeGoods> classGradeList = iClassGradeGoodsService
+                            .getClassNoTenant(Arrays.asList(relGoodsId));
+                    if (CollectionUtils.isNotEmpty(classGradeList)){
+                        if (CollectionUtils.isNotEmpty(classGradeList)){
+                            List<ClassGrade> gradeList = iClassGradeService.listByIdsNoTenant(classGradeList.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
+                            gradeList.forEach(item -> item.setGradeId(null));
+                            iClassGradeService.saveBatch(gradeList);
+                            List<ClassGradeGoods> gradeGoodsList = gradeList.stream().map(item -> {
+                                ClassGradeGoods gradeGoods = new ClassGradeGoods();
+                                gradeGoods.setGradeId(item.getGradeId());
+                                gradeGoods.setGoodsId(goodsId);
+                                gradeGoods.setUpdateTime(DateUtils.getNowTime());
+                                gradeGoods.setCreateTime(DateUtils.getNowTime());
+                                return gradeGoods;
+                            }).collect(Collectors.toList());
+                            iClassGradeGoodsService.saveBatch(gradeGoodsList);
+                        }
+                    }
+                }
+            }else {
+                //七大员继教同专业下共用一个班级
+                Goods oneGoods = getOne(new LambdaQueryWrapper<Goods>()
+                        .eq(Goods::getEducationTypeId, add.getEducationTypeId())
+                        .eq(Goods::getProjectId, add.getProjectId())
+                        .eq(Goods::getBusinessId, add.getBusinessId())
+                        .eq(ObjectUtils.isNotNull(add.getMajorId()), Goods::getMajorId, add.getMajorId())
+                        .eq(Goods::getSubjectIds, add.getSubjectIds())
+                        .eq(Goods::getStatus, 1)
+                        .eq(Goods::getGoodsStatus,1)
+                        .ne(Goods::getGoodsId, goodsId)
+                        .last("limit 1"));
+                if (ObjectUtils.isNotNull(oneGoods)){
+                    List<ClassGradeGoods> classGradeList = iClassGradeGoodsService
+                            .list(new LambdaQueryWrapper<ClassGradeGoods>()
+                                    .eq(ClassGradeGoods::getGoodsId, oneGoods.getGoodsId()));
+                    if (CollectionUtils.isNotEmpty(classGradeList)){
+                        List<ClassGrade> list = iClassGradeService.listByIds(classGradeList.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
+                        list.forEach(item -> item.setGradeId(null));
+                        iClassGradeService.saveBatch(list);
+                        List<ClassGradeGoods> gradeGoodsList = list.stream().map(item -> {
+                            ClassGradeGoods gradeGoods = new ClassGradeGoods();
+                            gradeGoods.setGradeId(item.getGradeId());
+                            gradeGoods.setGoodsId(goodsId);
+                            gradeGoods.setUpdateTime(DateUtils.getNowTime());
+                            gradeGoods.setCreateTime(DateUtils.getNowTime());
+                            return gradeGoods;
+                        }).collect(Collectors.toList());
+                        iClassGradeGoodsService.saveBatch(gradeGoodsList);
+                    }
                 }
             }
         }
@@ -3151,7 +3181,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         if (ObjectUtil.isNull(newMajorId)){
             //新增专业
             major.setId(null);
-            major.setTenantId(newTenantId);
+            major.setTenantId(newTenantId.toString());
             iMajorService.save(major);
             newMajorId = major.getId();
             addSysGoodsRecord(oid,major.getId(),GoodsCopyEnum.MAJOR.getType(),newTenantId,array);
@@ -3821,7 +3851,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             List<Major> newMajorList = majorList.stream().map(x -> {
                 Major major = BeanUtil.toBean(x, Major.class);
                 major.setId(null);
-                major.setTenantId(newTenantId);
+                major.setTenantId(newTenantId.toString());
                 major.setOId(x.getId());
                 return major;
             }).collect(Collectors.toList());
@@ -5159,6 +5189,18 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return baseMapper.getReplenishExam(bo);
     }
 
+    @Override
+    public List<Goods> getRelevanceGoodsNoTenant(String businessName,String majName,Long goodsId) {
+        return baseMapper.getRelevanceGoodsNoTenant(businessName, majName, goodsId);
+    }
+
+    @Override
+    public List<Goods> getRelGoodsNoTenant(String businessName, String categoryName, Long tenantId) {
+        return baseMapper.getRelGoodsNoTenant(businessName,categoryName,tenantId);
+    }
+
+
+
     private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
         baseMapper.updateHandoutsId(goodsId,tenantId,handoutsId);
     }

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

@@ -430,4 +430,18 @@ public class GoodsUserVo {
 	private String sevenYear;
 	@ApiModelProperty("七大员继教订单商品年份")
 	private String orderYear;
+
+
+	@ApiModelProperty("学习开始时间")
+	private Long startTime;
+	/** 学习有效期结束 */
+
+	@ApiModelProperty("学习结束时间")
+	private Long endTime;
+
+	@ApiModelProperty("商品开通时间")
+	private Long openGoodsTime;
+
+	@ApiModelProperty("旧业务系统订单号")
+	private String oldOrderSn;
 }

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

@@ -376,4 +376,18 @@ public class GoodsVo {
 	private Boolean jjShiGongYuan;
 	@ApiModelProperty("补考商品统一标识:1统一")
 	private Integer unifySign;
+	/** 是否优选  0没有 1选中 */
+	@Excel(name = "是否优选  0没有 1选中")
+	@ApiModelProperty("是否优选  0没有 1选中")
+	private Integer firstChoiceStatus;
+	/** 优选至少学习学时 */
+	@Excel(name = "优选至少学习学时")
+	@ApiModelProperty("优选至少学习学时")
+	private Long minClassHour;
+	/** 优选生成商品 0否 1是 */
+	@Excel(name = "优选生成商品 0否 1是")
+	@ApiModelProperty("优选生成商品 0否 1是")
+	private Long firstChoiceGoods;
+	@ApiModelProperty("业务别名")
+	private String aliasName;
 }

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

@@ -42,4 +42,10 @@ public class ClassGradeOpenBo implements Serializable {
     private Integer learningStatus;
 
     private Long learningTimeStart;
+
+    @ApiModelProperty("业务层次")
+    private String businessName;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
 }

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

@@ -299,6 +299,9 @@ public class ClassGradeUserQueryBo extends BaseEntity {
 	@ApiModelProperty("七大员继教班级关联code")
 	private String sevenCode;
 
+	@ApiModelProperty("七大员继教班级关联code标签:1 是 0否")
+	private Integer sevenCodeSign;
+
 	private List<WeekDataVo> weekList;
 
 }

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/CreateSameClassBo.java

@@ -0,0 +1,44 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月10日 8:50
+ */
+@Data
+public class CreateSameClassBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("班级编号")
+    private String classNo;
+
+    @ApiModelProperty("班级名称")
+    private String categoryName;
+
+    @ApiModelProperty("开班状态 0未开班(预报名) 1开班")
+    private Integer openclassState;
+
+    @ApiModelProperty("班级有效开始时间")
+    private String beginTime;
+
+    @ApiModelProperty("班级有效结束时间")
+    private String endTime;
+
+    @ApiModelProperty("5二建继教 ,  8二造继教")
+    private Integer platformId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+}

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

@@ -93,4 +93,6 @@ private static final long serialVersionUID=1L;
 
     /** 企业ID */
     private Long tenantId;
+
+    private Long firstChoiceGrade;
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.grade.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.grade.domain.ClassGradeGoods;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
@@ -17,4 +18,13 @@ public interface ClassGradeGoodsMapper extends BaseMapper<ClassGradeGoods> {
     List<ClassGradeGoods> getGradeGoodsList(@Param("goodsId") Long goodsId);
 
     List<ClassGradeGoods> getClassGradeByIds(@Param("goodsIds")List<Long> goodsIds);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGradeGoods> getClassNoTenant(@Param("goodsIds")List<Long> goodsIds);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ClassGradeGoods getOneNoTenant(@Param("gradeId") Long gradeId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGradeGoods> listByIdNoTenant(Long gradeId);
 }

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

@@ -26,7 +26,7 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
 
     List<GoodsVo> queryGoodsList(Long classId);
 
-
+    @InterceptorIgnore(tenantLine = "true")
     List<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo);
 
     List<ClassGradeUserListVo> listGradeInform(ClassGradeQueryBo bo);
@@ -77,7 +77,7 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
     List<ClassGrade> queryListByNameTenantId(@Param("className") String className,@Param("tenantId") Long tenantId);
 
     @InterceptorIgnore(tenantLine = "true")
-    List<ClassGrade> getGradeListByCodeTenant(@Param("registerCode") String registerCode);
+    List<ClassGrade> getGradeListByCodeTenant(@Param("officialName") String officialName);
 
     @InterceptorIgnore(tenantLine = "true")
     void UpGradeStatusByTenant(ClassGradeOpenUpBo openUpBo);
@@ -90,9 +90,22 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
 
     ClassGrade getSevenGrade(List<Long> gradeIds);
 
+    @InterceptorIgnore(tenantLine = "true")
     Long getStudeCountByCode(String sevenCode);
 
     List<ClassGradeVo> searchGradeList(ClassGradeQueryBo bo);
 
     List<String> getSevenYearByCode(String sevenCode);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> listByIdsNoTenant(@Param("ids") List<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> getListNoTenant(@Param("sevenCode") String sevenCode,@Param("gradeId") Long gradeId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateByIdNoTenant(ClassGrade update);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ClassGrade getCodeNoTenant(@Param("officialName") String officialName,@Param("tenantId") Long tenantId);
 }

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.grade.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
@@ -26,6 +27,9 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<ClassGradeUserGoodsVo> listUser(ClassGradeUserQueryBo bo);
 
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGradeUserGoodsVo> listUserNoTenant(ClassGradeUserQueryBo bo);
+
     List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 
     List<ClassPeriodStudentVo> listUserWeekPeriod(ClassGradeUserQueryBo bo);
@@ -56,7 +60,9 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<ClassPeriodSectionVo> listPeriodSectionExam(@Param("chapterId") Long id,@Param("goodsId") Long goodsId,@Param("courseId") Long courseId,@Param("userId") Long userId);
 
-    List<Long> selectStart(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId);
+    List<Long> selectStart(@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);
 
     List<Long> selectEnd(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId);
 

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java

@@ -53,4 +53,10 @@ public interface IClassGradeGoodsService extends IService<ClassGradeGoods> {
     List<ClassGradeGoods> getGradeGoodsList(Long goodsId);
 
 	List<ClassGradeGoods> getClassGradeByIds(List<Long> goodsIds);
+
+    List<ClassGradeGoods> getClassNoTenant(List<Long> collect);
+
+    ClassGradeGoods getOneNoTenant(Long gradeId);
+
+    List<ClassGradeGoods> listByIdNoTenant(Long gradeId);
 }

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

@@ -107,4 +107,10 @@ public interface IClassGradeService extends IService<ClassGrade> {
 
 
 	List<ClassGradeVo> searchGradeList(ClassGradeQueryBo bo);
+
+    List<ClassGrade> listByIdsNoTenant(List<Long> ids);
+
+    ClassGrade getCodeNoTenant(String officialName, Long tenantId);
+
+	void openOfficialSaveGrade(ClassGradeOpenBo bo);
 }

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

@@ -85,6 +85,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
     List<ClassGradeUserGoodsVo> listUser(ClassGradeUserQueryBo bo);
 
+	List<ClassGradeUserGoodsVo> listUserNoTenant(ClassGradeUserQueryBo bo);
+
 	List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 
 	List<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo);

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java

@@ -107,4 +107,19 @@ public class ClassGradeGoodsServiceImpl extends ServiceImpl<ClassGradeGoodsMappe
     public List<ClassGradeGoods> getClassGradeByIds(List<Long> goodsIds) {
         return baseMapper.getClassGradeByIds(goodsIds);
     }
+
+    @Override
+    public List<ClassGradeGoods> getClassNoTenant(List<Long> goodsIds) {
+        return baseMapper.getClassNoTenant(goodsIds);
+    }
+
+    @Override
+    public ClassGradeGoods getOneNoTenant(Long gradeId) {
+        return baseMapper.getOneNoTenant(gradeId);
+    }
+
+    @Override
+    public List<ClassGradeGoods> listByIdNoTenant(Long gradeId) {
+        return baseMapper.listByIdNoTenant(gradeId);
+    }
 }

+ 305 - 153
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -27,6 +27,7 @@ import com.zhongzheng.modules.course.bo.CourseProjectTypeQueryBo;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseSubject;
+import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
@@ -120,6 +121,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
 
     @Autowired
     private IUserUpdateService iUserUpdateService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
 
     @Autowired
     private IInformRemindService informRemindService;
@@ -178,6 +181,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Value("${oldStudySys.classOpenPath}")
     private String CLASS_OPEN_PATH;
 
+    @Value("${oldStudySys.createExamPath}")
+    private String CREATE_EXAM_PATH;
+
     @Override
     public ClassGradeVo queryById(Long gradeId) {
         ClassGradeQueryBo classGradeQueryBo = new ClassGradeQueryBo();
@@ -259,30 +265,13 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
         add.setGradeCode(ServletUtils.getEncoded("BJ"));
-        /*LambdaQueryWrapper<ClassGrade> lqw = Wrappers.lambdaQuery();
-        lqw.eq(ClassGrade::getClassName, add.getClassName());
-        lqw.eq(ClassGrade::getStatus, 1);
-        List<ClassGrade> list = this.list(lqw);
-        if (CollectionUtils.isNotEmpty(list)) {
-            throw new RuntimeException("班级名称不能重复");
-        }*/
+
         //企业ID
         String tenant = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = sysTenantService.getById(Long.valueOf(tenant));
         SysOldOrg org = sysOldOrgService.list(new LambdaQueryWrapper<SysOldOrg>()
                 .eq(SysOldOrg::getTenantId, tenant)
                 .last("limit 1")).stream().findFirst().orElse(null);
-//        //校验是否二建/二造商品创建班级
-//        if (bo.getClassGradeGoodsAddBos() != null &&
-//                (ObjectUtils.isNull(bo.getClassStatus()) || 1 == bo.getClassStatus()) && org.getShareClass() == 1) {
-//            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
-//            Goods goods = iGoodsService.getById(goodsId);
-//            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
-//            businessQueryBo.setId(goods.getBusinessId());
-//            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-//            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
-//                throw new CustomException("二建/二造不允许直接创建开班班级!");
-//            }
-//        }
         //班级绑定学员资料推送和学时推送
         List<ClassGradeInterface> list = iClassGradeInterfaceService.list(new LambdaQueryWrapper<ClassGradeInterface>()
                 .eq(ClassGradeInterface::getStatus, 1)
@@ -296,6 +285,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 }
             });
         }
+        Boolean erJfalg = false;
+        Boolean ezJfalg = false;
         //七大员继教班级默认学时推送和报名推送
         if (bo.getClassGradeGoodsAddBos() != null ) {
             Long goodsId = bo.getClassGradeGoodsAddBos()[0];
@@ -304,7 +295,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             //2021 和 2022 年的课程不在祥粤学习
             if (businessName.contains("继续教育") && businessName.contains("施工现场专业人员")) {
                 String sevenYear = goods.getSevenYear();
-                if (!Arrays.asList("2021,2022").contains(sevenYear)){
+                if (!Arrays.asList("2021","2022").contains(sevenYear)){
                     List<ClassGradeInterface> interfaceList = iClassGradeInterfaceService
                             .list(new LambdaQueryWrapper<ClassGradeInterface>()
                                     .in(ClassGradeInterface::getType, Arrays.asList(1, 3))
@@ -324,107 +315,113 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 String sevenCode = getSevenCode(goodsId);
                 add.setSevenCode(sevenCode);
             }
-        }
-        //是否创建官方班级编号
-        if (bo.getClassGradeGoodsAddBos() != null &&
-                (ObjectUtils.isNull(bo.getClassStatus()) || 0 == bo.getClassStatus()) && org.getShareClass() == 1) {
-            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
-            Goods goods = iGoodsService.getById(goodsId);
-            CourseBusiness business = iCourseBusinessService.getById(goods.getBusinessId());
-            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
-            businessQueryBo.setId(goods.getBusinessId());
-            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
-                List<Goods> goodsList = iGoodsService.list(new LambdaQueryWrapper<Goods>()
-                        .eq(Goods::getEducationTypeId, goods.getEducationTypeId())
-                        .eq(Goods::getBusinessId, goods.getBusinessId())
-                        .eq(Goods::getStatus, 1)
-                        .eq(Goods::getGoodsStatus, 1)
-                        .eq(Goods::getProjectId, goods.getProjectId())
-                        .eq(Goods::getSubjectIds, goods.getSubjectIds()));
-                if (goodsList.size() > 1) {
-                    //该业务层次下有多个商品
-                    List<Long> goodsIds = goodsList.stream().filter(item -> !item.getGoodsId().equals(goodsId)).map(Goods::getGoodsId).collect(Collectors.toList());
-                    List<ClassGradeGoods> goodsGradeList = iClassGradeGoodsService
-                            .list(new LambdaQueryWrapper<ClassGradeGoods>()
-                                    .in(ClassGradeGoods::getGoodsId, goodsIds));
-                    if (CollectionUtils.isNotEmpty(goodsGradeList)) {
-                        Map<Long, List<ClassGradeGoods>> map = goodsGradeList.stream().collect(Collectors.groupingBy(ClassGradeGoods::getGoodsId));
-                        List<ClassGradeSortBo> sortList = new ArrayList<>();
-                        map.forEach((k, v) -> {
-                            ClassGradeSortBo sortBo = new ClassGradeSortBo();
-                            sortBo.setKey(k);
-                            sortBo.setSize(v.size());
-                            sortList.add(sortBo);
-                        });
-                        ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
-                        List<ClassGradeGoods> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGradeGoods::getCreateTime)).collect(Collectors.toList());
-                        //班级信息
-                        List<ClassGrade> listGrade = listByIds(classGradesMax.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
-                        //获取当前机构商品下的班级
-                        List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goods.getGoodsId());
-                        if (gradeGoods.size() < listGrade.size()) {
-                            ClassGrade grade = listGrade.get(gradeGoods.size());
-                            if (checkEjjjPeopleNumLimit(business.getId(), grade.getGradeId())) {
-                                add.setOfficialName(listGrade.get(gradeGoods.size()).getOfficialName());
-                                add.setClassStatus(0);
-                            } else {
-                                add.setOfficialName(ServletUtils.getEncoded("PIY"));
-                                add.setClassStatus(0);
-                            }
-                        }
-                    }
-                }
-
-                if (StringUtils.isBlank(add.getOfficialName())) {
-                    List<CourseSubject> courseSubjectList = iCourseSubjectService.listByIds(Arrays.asList(goods.getSubjectIds().split(",")));
-                    List<String> subNames = courseSubjectList.stream().map(CourseSubject::getSubjectName).collect(Collectors.toList());
-                    List<Long> subIds = iCourseSubjectService.getIdsByTenant(subNames);
-                    //获取业务层次下所有班级
-                    ClassGradeListBo bgListBo = new ClassGradeListBo();
-                    bgListBo.setAliasName(business.getAliasName());
-                    bgListBo.setSubIds(subIds);
-                    List<ClassGrade> classGrades = baseMapper.getGradeListByTenant(bgListBo);
-                    if (CollectionUtils.isEmpty(classGrades)) {
-                        //生成预报名官方编号
-                        add.setOfficialName(ServletUtils.getEncoded("PIY"));
-                        add.setClassStatus(0);
-                    } else {
-                        //获取班级创建最多的机构
-                        Map<Long, List<ClassGrade>> map = classGrades.stream().collect(Collectors.groupingBy(ClassGrade::getTenantId));
-                        List<ClassGradeSortBo> sortList = new ArrayList<>();
-                        map.forEach((k, v) -> {
-                            ClassGradeSortBo sortBo = new ClassGradeSortBo();
-                            sortBo.setKey(k);
-                            Map<String, List<ClassGrade>> collect = v.stream().collect(Collectors.groupingBy(ClassGrade::getOfficialName));
-                            sortBo.setSize(collect.keySet().size());
-                            sortList.add(sortBo);
-                        });
-                        ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
-                        List<ClassGrade> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGrade::getCreateTime)).collect(Collectors.toList());
-                        //去重
-                        List<String> codeStrs = new ArrayList<>();
-                        for (ClassGrade gradesMax : classGradesMax) {
-                            if (codeStrs.contains(gradesMax.getOfficialName())) {
-                                continue;
-                            }
-                            codeStrs.add(gradesMax.getOfficialName());
-                        }
-                        //获取当前机构商品下的班级
-                        List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goodsId);
-                        if (gradeGoods.size() < codeStrs.size()) {
-                            add.setOfficialName(codeStrs.get(gradeGoods.size()));
-                            add.setClassStatus(0);
-                        } else {
-                            //生成预报名官方编号
-                            add.setOfficialName(ServletUtils.getEncoded("PIY"));
-                            add.setClassStatus(0);
-                        }
-                    }
-                }
+            else if (("继续教育二级建造师".equals(businessName)) || ("继续教育二级造价师".equals(businessName))){
+                erJfalg = true;
+                ezJfalg = "继续教育二级造价师".equals(businessName);
+                add.setOfficialName(ServletUtils.getEncoded("PIY"));
             }
         }
+        //是否创建官方班级编号
+//        if (bo.getClassGradeGoodsAddBos() != null &&
+//                (ObjectUtils.isNull(bo.getClassStatus()) || 0 == bo.getClassStatus()) && org.getShareClass() == 1) {
+//            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
+//            Goods goods = iGoodsService.getById(goodsId);
+//            CourseBusiness business = iCourseBusinessService.getById(goods.getBusinessId());
+//            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
+//            businessQueryBo.setId(goods.getBusinessId());
+//            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
+//            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
+//                List<Goods> goodsList = iGoodsService.list(new LambdaQueryWrapper<Goods>()
+//                        .eq(Goods::getEducationTypeId, goods.getEducationTypeId())
+//                        .eq(Goods::getBusinessId, goods.getBusinessId())
+//                        .eq(Goods::getStatus, 1)
+//                        .eq(Goods::getGoodsStatus, 1)
+//                        .eq(Goods::getProjectId, goods.getProjectId())
+//                        .eq(Goods::getSubjectIds, goods.getSubjectIds()));
+//                if (goodsList.size() > 1) {
+//                    //该业务层次下有多个商品
+//                    List<Long> goodsIds = goodsList.stream().filter(item -> !item.getGoodsId().equals(goodsId)).map(Goods::getGoodsId).collect(Collectors.toList());
+//                    List<ClassGradeGoods> goodsGradeList = iClassGradeGoodsService
+//                            .list(new LambdaQueryWrapper<ClassGradeGoods>()
+//                                    .in(ClassGradeGoods::getGoodsId, goodsIds));
+//                    if (CollectionUtils.isNotEmpty(goodsGradeList)) {
+//                        Map<Long, List<ClassGradeGoods>> map = goodsGradeList.stream().collect(Collectors.groupingBy(ClassGradeGoods::getGoodsId));
+//                        List<ClassGradeSortBo> sortList = new ArrayList<>();
+//                        map.forEach((k, v) -> {
+//                            ClassGradeSortBo sortBo = new ClassGradeSortBo();
+//                            sortBo.setKey(k);
+//                            sortBo.setSize(v.size());
+//                            sortList.add(sortBo);
+//                        });
+//                        ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
+//                        List<ClassGradeGoods> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGradeGoods::getCreateTime)).collect(Collectors.toList());
+//                        //班级信息
+//                        List<ClassGrade> listGrade = listByIds(classGradesMax.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
+//                        //获取当前机构商品下的班级
+//                        List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goods.getGoodsId());
+//                        if (gradeGoods.size() < listGrade.size()) {
+//                            ClassGrade grade = listGrade.get(gradeGoods.size());
+//                            if (checkEjjjPeopleNumLimit(business.getId(), grade.getGradeId())) {
+//                                add.setOfficialName(listGrade.get(gradeGoods.size()).getOfficialName());
+//                                add.setClassStatus(0);
+//                            } else {
+//                                add.setOfficialName(ServletUtils.getEncoded("PIY"));
+//                                add.setClassStatus(0);
+//                            }
+//                        }
+//                    }
+//                }
+//
+//                if (StringUtils.isBlank(add.getOfficialName())) {
+//                    List<CourseSubject> courseSubjectList = iCourseSubjectService.listByIds(Arrays.asList(goods.getSubjectIds().split(",")));
+//                    List<String> subNames = courseSubjectList.stream().map(CourseSubject::getSubjectName).collect(Collectors.toList());
+//                    List<Long> subIds = iCourseSubjectService.getIdsByTenant(subNames);
+//                    //获取业务层次下所有班级
+//                    ClassGradeListBo bgListBo = new ClassGradeListBo();
+//                    bgListBo.setAliasName(business.getAliasName());
+//                    bgListBo.setSubIds(subIds);
+//                    List<ClassGrade> classGrades = baseMapper.getGradeListByTenant(bgListBo);
+//                    if (CollectionUtils.isEmpty(classGrades)) {
+//                        //生成预报名官方编号
+//                        add.setOfficialName(ServletUtils.getEncoded("PIY"));
+//                        add.setClassStatus(0);
+//                    } else {
+//                        //获取班级创建最多的机构
+//                        Map<Long, List<ClassGrade>> map = classGrades.stream().collect(Collectors.groupingBy(ClassGrade::getTenantId));
+//                        List<ClassGradeSortBo> sortList = new ArrayList<>();
+//                        map.forEach((k, v) -> {
+//                            ClassGradeSortBo sortBo = new ClassGradeSortBo();
+//                            sortBo.setKey(k);
+//                            Map<String, List<ClassGrade>> collect = v.stream().collect(Collectors.groupingBy(ClassGrade::getOfficialName));
+//                            sortBo.setSize(collect.keySet().size());
+//                            sortList.add(sortBo);
+//                        });
+//                        ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
+//                        List<ClassGrade> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGrade::getCreateTime)).collect(Collectors.toList());
+//                        //去重
+//                        List<String> codeStrs = new ArrayList<>();
+//                        for (ClassGrade gradesMax : classGradesMax) {
+//                            if (codeStrs.contains(gradesMax.getOfficialName())) {
+//                                continue;
+//                            }
+//                            codeStrs.add(gradesMax.getOfficialName());
+//                        }
+//                        //获取当前机构商品下的班级
+//                        List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goodsId);
+//                        if (gradeGoods.size() < codeStrs.size()) {
+//                            add.setOfficialName(codeStrs.get(gradeGoods.size()));
+//                            add.setClassStatus(0);
+//                        } else {
+//                            //生成预报名官方编号
+//                            add.setOfficialName(ServletUtils.getEncoded("PIY"));
+//                            add.setClassStatus(0);
+//                        }
+//                    }
+//                }
+//            }
+//        }
         boolean save = this.save(add);
+
         //添加班级商品
         if (bo.getClassGradeGoodsAddBos() != null) {
             for (Long classGradeGoodsAddBo : bo.getClassGradeGoodsAddBos()) {
@@ -450,9 +447,95 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             classGradeSysService.save(classGradeSys);
         }
 
+        if (erJfalg && bo.getClassGradeGoodsAddBos() != null){
+            //二建继教班级创建,所有共享班级机构同步创建
+            synchronousCreation(add,sysTenant,bo.getClassGradeGoodsAddBos()[0]);
+            //通知旧系统
+            CreateSameClassBo classBo = new CreateSameClassBo();
+            if (ObjectUtils.isNotNull(bo.getClassStatus()) && bo.getClassStatus() == 1){
+                classBo.setClassNo(add.getOfficialName());
+                classBo.setOpenclassState(1);
+                classBo.setBeginTime(DateUtils.timestampToDateFormat(add.getClassStartTime(),"yyyy-MM-dd HH:mm:ss"));
+                classBo.setEndTime(DateUtils.timestampToDateFormat(add.getClassEndTime(),"yyyy-MM-dd HH:mm:ss"));
+            }else {
+                classBo.setClassNo(add.getOfficialName());
+                classBo.setOpenclassState(0);
+            }
+            classBo.setCategoryName(add.getClassName());
+            classBo.setPlatformId(ezJfalg?8:5);
+            Goods goods = iGoodsService.getById(bo.getClassGradeGoodsAddBos()[0]);
+            Major major = iMajorService.getById(goods.getMajorId());
+            if (ObjectUtils.isNotNull(major)){
+                classBo.setMajorName(major.getCategoryName());
+            }
+            Long nowTime = DateUtils.getNowTime();
+            String sign = ToolsUtils.EncoderByMd5(classBo.getClassNo()+nowTime.toString() + "pubilc2022");
+            classBo.setSign(sign);
+            classBo.setStamp(nowTime);
+            JSONObject param = JSONObject.parseObject(JSONObject.toJSONString(classBo));
+            String respone = "";
+            try {
+                respone = HttpUtils.sendPost(CREATE_EXAM_PATH, param);
+                if (!respone.contains("\"Status\":true")) {
+                    throw new CustomException("旧系统创建班级错误" + respone);
+                }
+            } catch (Exception e) {
+                throw new CustomException("旧系统创建班级错误" + e.getMessage());
+            }
+        }
+
         return save;
     }
 
+    public void createSameClass(){
+
+    }
+
+
+    private void synchronousCreation(ClassGrade classGrade, SysTenant sysTenant,Long goodsId) {
+        List<SysTenant> tenantList = sysTenantService.getListNoTenant(0L);
+        if (CollectionUtils.isEmpty(tenantList)){
+            return;
+        }
+        Goods goods = iGoodsService.getById(goodsId);
+        String businessName = iGoodsService.getGoodsBusinessName(goodsId);
+        Major major = iMajorService.getById(goods.getMajorId());
+        tenantList.forEach(tenant -> {
+            //是否存在对应课程商品
+            List<Goods> relGoods = iGoodsService.getRelGoodsNoTenant(businessName,major.getCategoryName(),tenant.getTenantId());
+            if (CollectionUtils.isEmpty(relGoods)){
+                return;
+            }
+            //班级是否存在
+            ClassGrade grade = baseMapper.getCodeNoTenant(classGrade.getOfficialName(),tenant.getTenantId());
+            if (ObjectUtils.isNotNull(grade)){
+                //已经存在 过滤已经创建过班级的商品
+                List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+            }
+            if (CollectionUtils.isEmpty(relGoods)){
+                return;
+            }
+
+            //同步班级
+            classGrade.setGradeId(null);
+            classGrade.setTenantId(tenant.getTenantId());
+            save(classGrade);
+
+            List<ClassGradeGoods> gradeGoods = relGoods.stream().map(item -> {
+                ClassGradeGoods classGradeGoods = new ClassGradeGoods();
+                classGradeGoods.setGradeId(classGrade.getGradeId());
+                classGradeGoods.setGoodsId(item.getGoodsId());
+                classGradeGoods.setCreateTime(DateUtils.getNowTime());
+                classGradeGoods.setUpdateTime(DateUtils.getNowTime());
+                classGradeGoods.setTenantId(tenant.getTenantId());
+                return classGradeGoods;
+            }).collect(Collectors.toList());
+            iClassGradeGoodsService.saveBatch(gradeGoods);
+        });
+    }
+
     private String getSevenCode(Long goodsId) {
         Goods g = iGoodsService.getById(goodsId);
         List<Goods> list = iGoodsService.list(new LambdaQueryWrapper<Goods>()
@@ -490,18 +573,18 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         if (ObjectUtils.isNull(gradeGoods)) {
             throw new RuntimeException("班级商品信息查询失败");
         }
+        ClassGrade classGrade = getById(update.getGradeId());
+        String officialName = classGrade.getOfficialName();//预开班班级编号
         //企业ID
         String tenant = ServletUtils.getRequest().getHeader("TenantId");
-        SysOldOrg org = sysOldOrgService.list(new LambdaQueryWrapper<SysOldOrg>()
-                .eq(SysOldOrg::getTenantId, tenant)
-                .last("limit 1")).stream().findFirst().orElse(null);
+        SysTenant sysTenant = sysTenantService.getById(Long.valueOf(tenant));
 
         Goods goods = iGoodsService.getById(gradeGoods.getGoodsId());
         CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
         businessQueryBo.setId(goods.getBusinessId());
         String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
 
-        if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName)))&& org.getShareClass() == 1) {
+        if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName)))&& sysTenant.getShareClass() == 1) {
             if (update.getClassStatus() != null && update.getClassStatus().equals(1)) {
                 //二造和二建班级开班校验班级人数(300人)
                 if (!checkClassUserNum(goods.getBusinessId(), update.getGradeId())) {
@@ -559,7 +642,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     throw new RuntimeException("班级还有学员,无法设置为无效");
                 }
             }
-            if (StringUtils.isNotBlank(oldGrade.getOfficialName()) && org.getShareClass() == 1) {
+            if (StringUtils.isNotBlank(oldGrade.getOfficialName()) && sysTenant.getShareClass() == 1) {
                 throw new RuntimeException("二建/二造班级无法设置为无效,请联系技术人员!");
             }
         }
@@ -607,48 +690,30 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         }
         this.updateById(update);
         if (fullName.contains("继续教育") && fullName.contains("施工现场专业人员") && StringUtils.isNotBlank(classGradeVo.getSevenCode())){
-            List<ClassGrade> list = list(new LambdaQueryWrapper<ClassGrade>()
-                    .eq(ClassGrade::getSevenCode, classGradeVo.getSevenCode())
-                    .ne(ClassGrade::getGradeId,update.getGradeId()));
+            List<ClassGrade> list = baseMapper.getListNoTenant(classGradeVo.getSevenCode(),update.getGradeId());
             if (CollectionUtils.isNotEmpty(list)){
                 List<ClassGrade> collect = list.stream().filter(item -> {
-                    ClassGradeGoods classGradeGoods = iClassGradeGoodsService
-                            .getOne(new LambdaQueryWrapper<ClassGradeGoods>()
-                                    .eq(ClassGradeGoods::getGradeId, item.getGradeId())
-                                    .last("limit 1"));
-                    Goods goodsOne = iGoodsService.getById(classGradeGoods.getGoodsId());
+                    ClassGradeGoods classGradeGoods = iClassGradeGoodsService.getOneNoTenant(item.getGradeId());
+                    Goods goodsOne = iGoodsService.getGoodsByIdNotTenant(classGradeGoods.getGoodsId());
                     return StringUtils.isNotBlank(goodsOne.getSevenYear()) && !Arrays.asList("2021", "2022").contains(goodsOne.getSevenYear());
                 }).collect(Collectors.toList());
                 if (CollectionUtils.isNotEmpty(collect)){
-                    List<ClassGrade> collect1 = list.stream().map(item -> {
+                    list.forEach(item ->{
                         update.setGradeId(item.getGradeId());
-                        return update;
-                    }).collect(Collectors.toList());
-                    updateBatchById(collect1);
+                        updateByIdNoTenant(update);
+                    });
                 }
             }
         }
 
         ClassGrade grade = getById(update.getGradeId());
-        if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) && org.getShareClass() == 1) {
-            if (ObjectUtils.isNotNull(grade) && ObjectUtils.isNotNull(grade.getClassStatus())
-                    && StringUtils.isNotBlank(grade.getOfficialName()) && grade.getClassStatus() == 1) {
-//                List<ClassGrade> list = list(new LambdaQueryWrapper<ClassGrade>().eq(ClassGrade::getOfficialName, update.getRegisterCode()));
-//                if (CollectionUtils.isNotEmpty(list)){
-//                    update(new LambdaUpdateWrapper<ClassGrade>()
-//                            .set(ClassGrade::getOfficialName,update.getOfficialName())
-//                            .set(ClassGrade::getRegisterCode,update.getRegisterCode())
-//                            .set(ClassGrade::getClassStartTime,update.getClassStartTime())
-//                            .set(ClassGrade::getClassEndTime,update.getClassEndTime())
-//                            .set(ClassGrade::getClassStatus,update.getClassStatus())
-//                            .set(ClassGrade::getLearningStatus,update.getLearningStatus())
-//                            .set(ClassGrade::getInterfacePushId,update.getInterfacePushId())
-//                            .in(ClassGrade::getGradeId,list.stream().map(ClassGrade::getGradeId).collect(Collectors.toList())));
-//                }
+        if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) && sysTenant.getShareClass() == 1) {
+            if (StringUtils.isNotBlank(grade.getOfficialName()) && grade.getClassStatus() == 1) {
 
                 ClassGradeOpenBo openBo = new ClassGradeOpenBo();
                 openBo.setOfficialName(grade.getOfficialName());
-                openBo.setRegisterCode(grade.getRegisterCode());
+//                openBo.setRegisterCode(grade.getRegisterCode());
+                openBo.setRegisterCode(officialName);
                 openBo.setClassName(grade.getClassName());
                 openBo.setClassStartTime(grade.getClassStartTime());
                 openBo.setClassEndTime(grade.getClassEndTime());
@@ -677,6 +742,10 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return true;
     }
 
+    private void updateByIdNoTenant(ClassGrade update) {
+        baseMapper.updateByIdNoTenant(update);
+    }
+
     private void sendClassSMS(ClassGradeVo classGradeVo) {
         InformRemindVo informRemindVo = informRemindService.queryByName("二建继教开班提醒");
         if (CollectionUtils.isEmpty(classGradeVo.getGoodsList())) {
@@ -816,6 +885,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             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;
     }
@@ -1228,7 +1303,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     private Integer getClassUserNumAll(Long gradeId) {
         Integer numAll = 0;
         ClassGradeVo gradeVo = queryById(gradeId);
-        if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
+        if (Validator.isNotEmpty(gradeVo)
+                && Validator.isNotEmpty(gradeVo.getOfficialName()) && Validator.isEmpty(gradeVo.getSevenCode())) {
             ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
             queryBo.setOfficialName(gradeVo.getOfficialName());
             Integer peopleNum = queryOfficialGradeCount(queryBo);
@@ -1441,7 +1517,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             return;
         }
         List<Long> ids = list.stream().map(ClassGrade::getGradeId).collect(Collectors.toList());
-        //保留预报名编号
+//        //保留预报名编号
         baseMapper.UpGradeCodeByIdTenant(ids);
 
         ClassGradeOpenUpBo openUpBo = new ClassGradeOpenUpBo();
@@ -1558,6 +1634,82 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return classGradeVos;
     }
 
+    @Override
+    public List<ClassGrade> listByIdsNoTenant(List<Long> ids) {
+        return baseMapper.listByIdsNoTenant(ids);
+    }
+
+    @Override
+    public ClassGrade getCodeNoTenant(String registerCode, Long tenantId) {
+        return baseMapper.getCodeNoTenant(registerCode,tenantId);
+    }
+
+    @Override
+    public void openOfficialSaveGrade(ClassGradeOpenBo bo) {
+        List<SysTenant> tenantList = sysTenantService.getListNoTenant(0L);
+        if (CollectionUtils.isEmpty(tenantList)){
+            return;
+        }
+        tenantList.forEach(tenant -> {
+            //是否存在对应课程商品
+            List<Goods> relGoods = iGoodsService.getRelGoodsNoTenant(bo.getBusinessName(),bo.getMajorName(),tenant.getTenantId());
+            if (CollectionUtils.isEmpty(relGoods)){
+                return;
+            }
+            //班级是否存在
+            if (StringUtils.isNotBlank(bo.getRegisterCode())){
+                ClassGrade grade = baseMapper.getCodeNoTenant(bo.getRegisterCode(),tenant.getTenantId());
+                if (ObjectUtils.isNotNull(grade)){
+                    //已经存在 过滤已经创建过班级的商品
+                    List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                    List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                    relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+                }
+                if (CollectionUtils.isEmpty(relGoods)){
+                    return;
+                }
+            }
+            relGoods.forEach(item -> {
+                ClassGrade classGrade = new ClassGrade();
+                classGrade.setCreateTime(DateUtils.getNowTime());
+                if (bo.getClassStatus() == 1){
+                    //开班
+                    classGrade.setClassStatus(1);
+                    classGrade.setOfficialName(bo.getOfficialName());
+                    classGrade.setLearningStatus(1);
+                    classGrade.setClassStartTime(bo.getClassStartTime());
+                    classGrade.setClassEndTime(bo.getClassEndTime());
+                    //二建/二造官方信息推送开关打开
+                    List<ClassGradeInterface> interfaceList = iClassGradeInterfaceService
+                            .list(new LambdaQueryWrapper<ClassGradeInterface>()
+                                    .eq(ClassGradeInterface::getType, 1).last("limit 1"));
+                    if (CollectionUtils.isNotEmpty(interfaceList)) {
+                        classGrade.setInterfacePushId(interfaceList.get(0).getId());
+                    }
+                }else {
+                    classGrade.setClassStatus(0);
+                    classGrade.setLearningStatus(2);//待定
+                    classGrade.setOfficialName(bo.getRegisterCode());
+                }
+                classGrade.setStudentUpper(ClassGrade.INIT_UPPER); //上限300
+                classGrade.setUpdateTime(DateUtils.getNowTime());
+                classGrade.setStatus(1);
+                String gradeCode = ServletUtils.getEncoded("BJ");
+                classGrade.setGradeCode(gradeCode);
+                classGrade.setClassName(bo.getClassName());
+                classGrade.setTenantId(tenant.getTenantId());
+                save(classGrade);
+                ClassGradeGoods classGradeGoods = new ClassGradeGoods();
+                classGradeGoods.setGradeId(classGrade.getGradeId());
+                classGradeGoods.setGoodsId(item.getGoodsId());
+                classGradeGoods.setCreateTime(DateUtils.getNowTime());
+                classGradeGoods.setUpdateTime(DateUtils.getNowTime());
+                classGradeGoods.setTenantId(tenant.getTenantId());
+                iClassGradeGoodsService.save(classGradeGoods);
+            });
+        });
+    }
+
     //创建预开班班级
     private void creatClass(List<Long> goodsIds, Long tenantId, String code) {
         goodsIds.forEach(goodsId -> {

+ 16 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -436,6 +436,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         queryBo.setUserId(bo.getUserId());
         queryBo.setOrderGoodsId(bo.getOrderGoodsId());
         ClassPeriodStudentVo classPeriodStudentVo = baseMapper.userPeriodStatus(queryBo);
+        if(Validator.isEmpty(classPeriodStudentVo)){
+            throw new CustomException("数据非法");
+        }
         Long secLong = 0L;
         Long studyLong = 0L;
 
@@ -1718,6 +1721,11 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return baseMapper.listUser(bo);
     }
 
+    @Override
+    public List<ClassGradeUserGoodsVo> listUserNoTenant(ClassGradeUserQueryBo bo) {
+        return baseMapper.listUserNoTenant(bo);
+    }
+
     @Override
     @DataScope(businessAlias = "cb")
     public List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo) {
@@ -1757,9 +1765,12 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             classPeriodStudentVo.setAllStatus(changePeriodStatus(classPeriodStudentVo.getPeriodStatus()));
 
             classPeriodStudentVo.setWaitRebuildNum(classPeriodUserVos.getCheat() + classPeriodUserVos.getExamCheat());
-            if (!CollectionUtils.isEmpty(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId()))) {
+            if (!CollectionUtils.isEmpty(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId()))) {
                 //查找开始学习时间
-                classPeriodStudentVo.setStartTime(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId()).get(0));
+                classPeriodStudentVo.setStartTime(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId()).get(0));
+            }else{
+                classPeriodStudentVo.setStartTime(baseMapper.selectStartNoPhoto(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId())
+                );
             }
             //当审核状态状态为通过是采取解析身份证和一寸照
             if ("1".equals(classPeriodStudentVo.getProfileStatus()) && Validator.isNotEmpty(bo.getUserPhoto()) && bo.getUserPhoto() == 1) {
@@ -1843,9 +1854,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             classPeriodStudentVo.setAllStatus(changePeriodStatus(classPeriodStudentVo.getPeriodStatus()));
 
             //    classPeriodStudentVo.setWaitRebuildNum(classPeriodUserVos.getCheat()+classPeriodUserVos.getExamCheat());
-            if (!CollectionUtils.isEmpty(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId()))) {
+            if (!CollectionUtils.isEmpty(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId()))) {
                 //查找开始学习时间
-                classPeriodStudentVo.setStartTime(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId()).get(0));
+                classPeriodStudentVo.setStartTime(baseMapper.selectStart(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGoodsId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId()).get(0));
             }
             //取学时所有拍照最新的一张
             String recentPhoto = userStudyRecordPhotoMapper.selectGradeRecentOnePhoto(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGradeId(),classPeriodStudentVo.getOrderGoodsId());
@@ -1891,6 +1902,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             classGradeUserQueryBo.setGradeId(classPeriodStudentVo.getGradeId());
             classGradeUserQueryBo.setUserId(classPeriodStudentVo.getUserId());
             classGradeUserQueryBo.setGoodsId(classPeriodStudentVo.getGoodsId());
+            classGradeUserQueryBo.setOrderGoodsId(classPeriodStudentVo.getOrderGoodsId());
             Long studyTime = baseMapper.listUserWeekStudyTime(classGradeUserQueryBo);
             classPeriodStudentVo.setStudyTime(studyTime);
             //    List<ClassPeriodUserVo> classPeriodUserVos1 = baseMapper.listPeriod(classGradeUserQueryBo);

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

@@ -236,4 +236,12 @@ public class ClassGradeStudentVo {
 	@ApiModelProperty("官方信息推送结果")
 	private String officialStatusMsg;
 
+	@ApiModelProperty("机构ID")
+	private Long orgId;
+
+	@ApiModelProperty("所属机构")
+	private String tenantName;
+
+
+
 }

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

@@ -152,7 +152,7 @@ public class ClassStudentExportVo implements Serializable {
 			vo.setServiceDateStr(DateUtils.timestampToDate(studentVo.getServiceStartTime())+"至"+DateUtils.timestampToDate(studentVo.getServiceEndTime()));
 		}
 		if (ObjectUtil.isNotNull(studentVo.getClassStartTime()) && ObjectUtil.isNotNull(studentVo.getClassEndTime())){
-			vo.setClassDateStr(sdf.format(new Date(studentVo.getClassStartTime()))+"至"+sdf.format(new Date(studentVo.getClassEndTime())));
+			vo.setClassDateStr(DateUtils.timestampToDate(studentVo.getClassStartTime())+"至"+DateUtils.timestampToDate(studentVo.getClassEndTime()));
 		}
 		vo.setFinishStatusStr(ObjectUtil.isNotNull(studentVo.getFinishStatus()) && studentVo.getFinishStatus() == 1?"学完":"未学完");
 		vo.setRebuyStr(ObjectUtil.isNotNull(studentVo.getRebuy()) && studentVo.getRebuy() == 1?"复购 针对业务层次配了【下单前需要选择班级】":"非复购");

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

@@ -109,8 +109,6 @@ public class OrderAddBo {
     /** 培训计划ID */
     @ApiModelProperty("计划ID")
     private Integer planId;
-    @ApiModelProperty("预约订单商品ID")
-    private Long subOrderGoodsId;
-    @ApiModelProperty("新B端题库开通标识")
+    @ApiModelProperty("新B端考试订单标识:1题库开通 2补冲考是标识")
     private Integer openQuestionSign;
 }

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

@@ -101,4 +101,6 @@ public class OrderGoodsAddBo {
     private Integer sevenClassCopy;
     @ApiModelProperty("关联的订单商品ID")
     private Long relevanceId;
+    @ApiModelProperty("预约订单商品ID")
+    private Long subOrderGoodsId;
 }

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

@@ -92,6 +92,10 @@ private static final long serialVersionUID=1L;
     private String distributionLinkCode;
     @ApiModelProperty("分成模式 1机构分成 2业务员分成")
     private Integer divideModel;
+    @ApiModelProperty("分成类型1百分比 2固定成本")
+    private Integer divideType;
+    @ApiModelProperty("分成比率(固定成本为固定值)")
+    private BigDecimal divideRate;
     @ApiModelProperty("分成钱")
     private BigDecimal divideMoney;
     /** 七大员商品年份 */
@@ -108,5 +112,8 @@ private static final long serialVersionUID=1L;
     @TableField(exist = false)
     private Long subOrderGoodsId;
 
+    @TableField(exist = false)
+    @ApiModelProperty("新B端考试订单标识:1题库开通 2补冲考是标识")
+    private Integer openQuestionSign;
 
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.order.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
@@ -72,4 +73,7 @@ public interface OrderGoodsMapper extends BaseMapper<OrderGoods> {
     OrderGoods getSevenLastOne(@Param("projectId")Integer projectId,@Param("sevenYear")String sevenYear,@Param("userId")Long userId);
 
     Long countOrderGoodsByYear(@Param("sevenYear") String sevenYear,@Param("goodsId") Long goodsId,@Param("userId") Long userId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    OrderGoods getByIdNoTenant(Long orderGoodsId);
 }

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

@@ -1,4 +1,5 @@
 package com.zhongzheng.modules.order.mapper;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
@@ -48,7 +49,16 @@ public interface OrderMapper extends BaseMapper<Order> {
 
     ClassGrade getSevenGrade(@Param("gradeIds") List<Long> gradeIds);
 
+    @InterceptorIgnore(tenantLine = "true")
+    ClassGrade getSevenGradeNoTenant(@Param("gradeIds") List<Long> gradeIds);
+
     Integer getStudeCountByCode(String sevenCode);
 
     List<ClassGrade> getClassNameByGoods(@Param("educationTypeId") Long educationTypeId,@Param("projectId") Long projectId,@Param("businessId") Long businessId,@Param("majorId") Long majorId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> getClassNameByGoodsNotTenant(@Param("educationTypeId") Long educationTypeId,@Param("projectId") Long projectId,@Param("businessId") Long businessId,@Param("majorId") Long majorId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Integer getStudeCountByCodeNoTenant(String sevenCode);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.order.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.goods.bo.CheckGoodsStatusBo;
+import com.zhongzheng.modules.goods.bo.GoodsFirstChoiceAddBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsSectionListBo;
 import com.zhongzheng.modules.goods.vo.GoodsSectionListVo;
@@ -124,4 +125,8 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
     Long countOrderGoodsByYear(String sevenYear, Long goodsId, Long userId);
 
     String getOrderSevenYear(Long orderGoodsId);
+
+    GoodsFirstChoiceAddBo firstChoiceGoods(GoodsFirstChoiceAddBo bo);
+
+    OrderGoods getByIdNoTenant(Long orderGoodsId);
 }

+ 135 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java

@@ -16,11 +16,15 @@ import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.domain.ShoppingCart;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.base.service.IShoppingCartService;
 import com.zhongzheng.modules.base.service.IUserProfileService;
+import com.zhongzheng.modules.course.domain.Course;
+import com.zhongzheng.modules.course.domain.CourseBusiness;
+import com.zhongzheng.modules.course.domain.CourseMenu;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
 import com.zhongzheng.modules.course.mapper.CourseMenuMapper;
 import com.zhongzheng.modules.course.service.ICourseChapterSectionService;
@@ -37,11 +41,9 @@ import com.zhongzheng.modules.exam.service.IExamApplySiteTimeService;
 import com.zhongzheng.modules.exam.service.IExamApplyUserService;
 import com.zhongzheng.modules.exam.service.IExamBeforeService;
 import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
-import com.zhongzheng.modules.goods.bo.CheckGoodsStatusBo;
-import com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo;
-import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
-import com.zhongzheng.modules.goods.bo.GoodsSectionListBo;
+import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsCourse;
 import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
 import com.zhongzheng.modules.goods.domain.QuestionMerchant;
 import com.zhongzheng.modules.goods.service.IGoodsCourseService;
@@ -51,6 +53,8 @@ import com.zhongzheng.modules.goods.service.IQuestionMerchantService;
 import com.zhongzheng.modules.goods.vo.GoodsSectionListVo;
 import com.zhongzheng.modules.goods.vo.GoodsSectionNumVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.grade.bo.ClassGradeGoodsAddBo;
+import com.zhongzheng.modules.grade.domain.ClassGrade;
 import com.zhongzheng.modules.grade.domain.ClassGradeGoods;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
@@ -77,11 +81,10 @@ import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
 import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.domain.UserExamGoods;
+import com.zhongzheng.modules.user.domain.UserExamGoodsSupplement;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
-import com.zhongzheng.modules.user.service.IUserExamGoodsService;
-import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.service.IUserStudyRecordService;
-import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.SubjectStudyRecordVo;
 import net.polyv.common.v1.util.StringUtils;
 import net.polyv.live.v1.entity.channel.operate.LiveChannelBasicInfoResponse;
@@ -114,6 +117,7 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     @Autowired
     private IClassGradeService iClassGradeService;
 
+
     @Autowired
     private IOrderService iOrderService;
 
@@ -179,6 +183,10 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     @Autowired
     private IQuestionMerchantService iQuestionMerchantService;
 
+    @Autowired
+    private IUserExamGoodsSupplementService iUserExamGoodsSupplementService;
+
+
     @Override
     public OrderGoodsVo queryById(Long orderGoodsId) {
         OrderGoods db = this.baseMapper.selectById(orderGoodsId);
@@ -848,6 +856,11 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         return orderGoods.getSevenYear();
     }
 
+    @Override
+    public OrderGoods getByIdNoTenant(Long orderGoodsId) {
+        return baseMapper.getByIdNoTenant(orderGoodsId);
+    }
+
     private boolean checkUnique(Long GoodsId,Long UserId) {
         ShoppingCart info = iShoppingCartService.getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,UserId).eq(ShoppingCart::getGoodsId,GoodsId).last("limit 1"));
@@ -921,4 +934,118 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
 
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public GoodsFirstChoiceAddBo firstChoiceGoods(GoodsFirstChoiceAddBo bo) {
+        if(Validator.isEmpty(bo.getGradeId())||Validator.isEmpty(bo.getGoodsId())||Validator.isEmpty(bo.getOrderGoodsId())||Validator.isEmpty(bo.getCourseId())){
+            throw new CustomException("参数错误");
+        }
+        Goods goodsOld = iGoodsService.getOne(new LambdaQueryWrapper<Goods>()
+                .eq(Goods::getGoodsId, bo.getGoodsId()));
+        if(Validator.isEmpty(goodsOld)){
+            throw new CustomException("数据错误");
+        }
+        if(Validator.isEmpty(goodsOld.getFirstChoiceStatus())||goodsOld.getFirstChoiceStatus()!=1){
+            throw new CustomException("非法商品操作");
+        }
+        OrderGoods orderGoods = getOne(new LambdaQueryWrapper<OrderGoods>()
+                .eq(OrderGoods::getOrderGoodsId, bo.getOrderGoodsId()));
+        if(Validator.isEmpty(orderGoods)||orderGoods.getGoodsId().longValue()!=bo.getGoodsId().longValue()||orderGoods.getGradeId().longValue()!=bo.getGradeId().longValue()){
+            throw new CustomException("订单商品数据错误");
+        }
+        ClassGrade gradeOld = iClassGradeService.getOne(new LambdaQueryWrapper<ClassGrade>()
+                .eq(ClassGrade::getGradeId, bo.getGradeId()));
+      /*  ClassGrade gradeNew = BeanUtil.toBean(gradeOld, ClassGrade.class);
+        gradeNew.setGradeId(null);
+        gradeNew.setFirstChoiceGrade(gradeOld.getGradeId());
+        gradeNew.setCreateTime(DateUtils.getNowTime());
+        gradeNew.setUpdateTime(DateUtils.getNowTime());
+        gradeNew.setGradeCode(ServletUtils.getEncoded("BJ"));
+        gradeNew.setClassName(gradeNew.getClassName()+"(优选)");
+        iClassGradeService.save(gradeNew);*/
+
+
+
+        Course courseOld =courseMapper.selectOne(new LambdaQueryWrapper<Course>()
+                .eq(Course::getCourseId, bo.getCourseId()));
+        Course courseNew = BeanUtil.toBean(courseOld, Course.class);
+        courseNew.setCourseId(null);
+        courseNew.setFirstChoice(1);
+        courseNew.setCreateTime(DateUtils.getNowTime());
+        courseNew.setUpdateTime(DateUtils.getNowTime());
+        courseNew.setCode(ServletUtils.getEncoded("KC"));
+        courseNew.setCourseName(courseNew.getCourseName()+"(优选)");
+        courseMapper.insert(courseNew);
+
+        LambdaQueryWrapper<CourseMenu> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getCourseId() != null, CourseMenu::getCourseId, bo.getCourseId());
+        lqw.in( CourseMenu::getMenuId, bo.getChapterIdList());
+        lqw.eq(CourseMenu::getType, 2);
+        List<CourseMenu> menuList = courseMenuMapper.selectList(lqw);
+        if(Validator.isEmpty(menuList)||menuList.size()==0){
+            throw new CustomException("章数据错误");
+        }
+        for(CourseMenu menu : menuList){
+            menu.setCourseId(courseNew.getCourseId());
+            menu.setFirstChoiceStatus(0);
+            menu.setCreateTime(DateUtils.getNowTime());
+            menu.setUpdateTime(DateUtils.getNowTime());
+            courseMenuMapper.insert(menu);
+        }
+
+        Goods goodsNew = BeanUtil.toBean(goodsOld, Goods.class);
+        goodsNew.setGoodsId(null);
+        goodsNew.setCreateTime(DateUtils.getNowTime());
+        goodsNew.setUpdateTime(DateUtils.getNowTime());
+        goodsNew.setCode(ServletUtils.getEncoded("KC"));
+        goodsNew.setFirstChoiceGoods(bo.getGoodsId());
+        goodsNew.setFirstChoiceStatus(0);
+        goodsNew.setCode(ServletUtils.getEncoded("SP"));
+        goodsNew.setGoodsName(goodsNew.getGoodsName()+"(优选)");
+        iGoodsService.save(goodsNew);
+
+        GoodsCourse goodsCourseOld = iGoodsCourseService.getOne(new LambdaQueryWrapper<GoodsCourse>()
+                .eq(GoodsCourse::getGoodsId, bo.getGoodsId()).eq(GoodsCourse::getCourseId, bo.getCourseId()));
+        if(Validator.isEmpty(goodsCourseOld)){
+            throw new CustomException("商品课程错误");
+        }
+        GoodsCourse goodsCourseNew = BeanUtil.toBean(goodsCourseOld, GoodsCourse.class);
+        goodsCourseNew.setCourseId(courseNew.getCourseId());
+        goodsCourseNew.setGoodsId(goodsNew.getGoodsId());
+        iGoodsCourseService.save(goodsCourseNew);
+
+        orderGoods.setGoodsId(goodsNew.getGoodsId());
+   //     orderGoods.setGradeId(gradeNew.getGradeId());
+        updateById(orderGoods);
+
+        ClassGradeGoodsAddBo gradeGoodsAddBo = new ClassGradeGoodsAddBo();
+        gradeGoodsAddBo.setGoodsId(goodsNew.getGoodsId());
+        gradeGoodsAddBo.setGradeId(gradeOld.getGradeId());//
+        iClassGradeGoodsService.insertByAddBo(gradeGoodsAddBo);
+
+        LambdaUpdateWrapper<UserExamGoods> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        objectLambdaUpdateWrapper.eq(UserExamGoods::getOrderGoodsId, bo.getOrderGoodsId());
+        objectLambdaUpdateWrapper.set(UserExamGoods::getGoodsId, goodsNew.getGoodsId());
+        objectLambdaUpdateWrapper.set(UserExamGoods::getUpdateTime,DateUtils.getNowTime());
+        iUserExamGoodsService.update(null, objectLambdaUpdateWrapper);
+
+        LambdaUpdateWrapper<UserExamGoodsSupplement> objectLambdaUpdateWrapper2 = Wrappers.lambdaUpdate();
+        objectLambdaUpdateWrapper2.eq(UserExamGoodsSupplement::getOrderGoodsId, bo.getOrderGoodsId());
+        objectLambdaUpdateWrapper2.set(UserExamGoodsSupplement::getGoodsId, goodsNew.getGoodsId());
+        objectLambdaUpdateWrapper2.set(UserExamGoodsSupplement::getUpdateTime,DateUtils.getNowTime());
+        iUserExamGoodsSupplementService.update(null, objectLambdaUpdateWrapper2);
+
+      /*  LambdaUpdateWrapper<ClassGradeUser> objectLambdaUpdateWrapper3 = Wrappers.lambdaUpdate();
+        objectLambdaUpdateWrapper3.eq(ClassGradeUser::getOrderGoodsId, bo.getOrderGoodsId());
+        objectLambdaUpdateWrapper3.eq(ClassGradeUser::getUserId, bo.getUserId());
+        objectLambdaUpdateWrapper3.set(ClassGradeUser::getGradeId, gradeNew.getGradeId());
+        objectLambdaUpdateWrapper3.set(ClassGradeUser::getUpdateTime,DateUtils.getNowTime());
+        iClassGradeUserService.update(null, objectLambdaUpdateWrapper3);*/
+
+        bo.setGoodsId(goodsNew.getGoodsId());
+        bo.setCourseId(goodsCourseNew.getCourseId());
+    //    bo.setGradeId(gradeNew.getGradeId());
+        return bo;
+    }
 }

+ 198 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -20,6 +20,7 @@ import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
 import com.zhongzheng.modules.activity.domain.ActivityOrder;
 import com.zhongzheng.modules.activity.service.IActivityGoodsPriceService;
@@ -49,10 +50,7 @@ import com.zhongzheng.modules.goods.service.IGoodsQuestionRelService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IQuestionMerchantService;
 import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
-import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
-import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
-import com.zhongzheng.modules.grade.bo.ClassGradeSortBo;
-import com.zhongzheng.modules.grade.bo.ClassGradeUserTempQueryBo;
+import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.*;
 import com.zhongzheng.modules.grade.service.*;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserTempVo;
@@ -95,6 +93,7 @@ import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import net.polyv.common.v1.util.StringUtils;
 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;
 
@@ -217,6 +216,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private ITopOldOrderService topOldOrderService;
     @Autowired
     private ISysOldOrgService iSysOldOrgService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
+    @Value("${oldStudySys.createExamPath}")
+    private String CREATE_EXAM_PATH;
 
     @Override
     public OrderVo queryById(Long orderId) {
@@ -690,9 +693,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             orderGoods.setCreateTime(DateUtils.getNowTime());
             orderGoods.setUpdateTime(DateUtils.getNowTime());
             orderGoods.setGoodsReceived(g.getGoodsReceived());
-            if (ObjectUtils.isNotNull(bo.getSubOrderGoodsId())){
+            if (ObjectUtils.isNotNull(g.getSubOrderGoodsId())){
                 //补充考试次数订单商品ID
-                orderGoods.setSubOrderGoodsId(bo.getSubOrderGoodsId());
+                orderGoods.setSubOrderGoodsId(g.getSubOrderGoodsId());
+                orderGoods.setOpenQuestionSign(bo.getOpenQuestionSign());
             }
             //订单标准价格不计算优惠
             totalPrice = totalPrice.add(goods.getStandPrice());
@@ -859,7 +863,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         iWxPayService.joinLockGrade(order.getOrderSn(), orderGoods.getGoodsId(), orderGoods.getOrderGoodsId());
         //商品是否关联第三方题库商品
         Goods goods = iGoodsService.getById(orderGoods.getGoodsId());
-        if (ObjectUtils.isNotNull(goods.getQuestionGoodsId())){
+        if (ObjectUtils.isNotNull(orderGoods.getOpenQuestionSign()) && orderGoods.getOpenQuestionSign() == 1){
+            //开通题库
+            questionHandleTwo(orderGoods,goods);
+        }else if (ObjectUtils.isNotNull(goods.getQuestionGoodsId())){
             questionGoodsHandle(orderGoods,goods);
         }
 //        //商品是否有活动模考
@@ -907,6 +914,58 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         iGoodsQuestionRelService.save(rel);
     }
 
+
+    private void questionHandleTwo(OrderGoods orderGoods,Goods goods) {
+        //第三方题库商品
+        Goods questionGoods = iGoodsService.getById(goods.getGoodsId());
+        if (ObjectUtils.isNull(questionGoods) || questionGoods.getGoodsType() != 9){
+            //商品类型不符合
+            return;
+        }
+        //添加第三方关联记录
+        QuestionMerchant merchant = iQuestionMerchantService.getById(questionGoods.getQuestionMerchantId());
+        if (ObjectUtils.isNull(merchant)){
+            //商家不存在
+            return;
+        }
+        //服务有效期
+        OrderGoods orderGoodsTwo = setQuestionServiceTimeTwo(orderGoods, orderGoods.getSubOrderGoodsId());
+        iOrderGoodsService.updateById(orderGoodsTwo);
+
+        GoodsQuestionRel rel = new GoodsQuestionRel();
+        rel.setOrderGoodsId(orderGoodsTwo.getOrderGoodsId());
+        rel.setQuestionGoodsId(orderGoods.getGoodsId());
+        rel.setQsOrderGoodsId(orderGoods.getOrderGoodsId());
+        rel.setStatus(1);
+        rel.setQuestionDoNum(merchant.getDoNum());
+        rel.setCreateTime(DateUtils.getNowTime());
+        rel.setUpdateTime(DateUtils.getNowTime());
+        iGoodsQuestionRelService.save(rel);
+    }
+
+    private OrderGoods setQuestionServiceTimeTwo(OrderGoods add,Long subOrderGoodsId) {
+        Order one = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, add.getOrderSn()));
+        if (Objects.isNull(one)){
+            return null;
+        }
+        UserSubscribe subscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                .eq(UserSubscribe::getUserId, one.getUserId())
+                .eq(UserSubscribe::getOrderGoodsId, subOrderGoodsId)
+                .eq(UserSubscribe::getSubscribeStatus, 1)
+                .eq(UserSubscribe::getExamStatus,0)
+                .last("limit 1"));
+        if (ObjectUtils.isNull(subscribe)){
+            return add;
+        }
+        //考试日期
+        Long examTime = subscribe.getApplySiteExamTime();
+        //前推8天
+        Long dayBefore = DateUtils.getDayBefore(examTime, 8);
+        add.setServiceStartTime(dayBefore);
+        add.setServiceEndTime(examTime);
+        return add;
+    }
+
     private OrderGoods setQuestionServiceTime(OrderGoods add,OrderGoods orderGoods) {
         Order one = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, orderGoods.getOrderSn()));
         if (Objects.isNull(one)){
@@ -1287,6 +1346,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     BigDecimal goodsDecimal = goodsPrice;
                     //换算订单成本和盈亏
                     TopCostTpItem topCostTpItem = tpItem;
+                    orderGoods.setDivideType(topCostTpItem.getDockType());
+                    orderGoods.setDivideRate(topCostTpItem.getDockValue());
                     if (ObjectUtil.isNotNull(topCostTpItem.getDockStatus()) && topCostTpItem.getDockStatus() == 1){
                         //启用成本扣除项
                         switch (topCostTpItem.getDockType()){
@@ -2277,6 +2338,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         OrderGoods orderGoods = iOrderGoodsService.getById(orderGoodsId);
         String businessFull = iGoodsService.getGoodsBusinessName(goodsId);
         Goods goods = iGoodsService.getById(goodsId);
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
         //指定班级
         if (gradeId != null && gradeId > 0) {
             ClassGradeVo classGradeVo = iClassGradeService.queryById(gradeId);
@@ -2295,7 +2358,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             int locakStudentNum = 0;
             Boolean sevenFlag = false;
             if (businessFull.contains("继续教育") && businessFull.contains("施工现场专业人员")){
-                locakStudentNum = baseMapper.getStudeCountByCode(classGradeVo.getSevenCode());
+                if (ObjectUtils.isNotNull(sysTenant.getSevenClass()) && sysTenant.getSevenClass() == 1){
+                    //七大员继教班级共享
+                    locakStudentNum = baseMapper.getStudeCountByCodeNoTenant(classGradeVo.getSevenCode());
+                }else {
+                    locakStudentNum = baseMapper.getStudeCountByCode(classGradeVo.getSevenCode());
+                }
                 sevenFlag = true;
             }else {
                 LambdaQueryWrapper<ClassGradeUser> lqw = new LambdaQueryWrapper<>();
@@ -2338,7 +2406,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             Boolean sevenFlag = false;
             if (businessFull.contains("继续教育") && businessFull.contains("施工现场专业人员")
                     && StringUtils.isNotBlank(goods.getSevenYear()) && !Arrays.asList("2021","2022").contains(goods.getSevenYear())){
-                locakStudentNum = baseMapper.getStudeCountByCode(classGradeVo.getSevenCode());
+                if (ObjectUtils.isNotNull(sysTenant.getSevenClass()) && sysTenant.getSevenClass() == 1){
+                    //七大员继教班级共享
+                    locakStudentNum = baseMapper.getStudeCountByCodeNoTenant(classGradeVo.getSevenCode());
+                }else {
+                    locakStudentNum = baseMapper.getStudeCountByCode(classGradeVo.getSevenCode());
+                }
                 sevenFlag = true;
             }else {
                 //临时锁定的班级学员数量
@@ -2384,7 +2457,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 //七大员继教
                 classGrade.setStudentUpper(ClassGrade.INIT_UPPER3); //上限1000
                 String sevenYear = goods.getSevenYear();
-                if (!Arrays.asList("2021,2022").contains(sevenYear)){
+                if (!Arrays.asList("2021","2022").contains(sevenYear)){
                     //班级绑定学员资料推送和学时推送
                     List<ClassGradeInterface> list = iClassGradeInterfaceService.list(new LambdaQueryWrapper<ClassGradeInterface>()
                             .eq(ClassGradeInterface::getStatus, 1)
@@ -2398,8 +2471,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                             }
                         });
                     }
-                    String sevenCode = getSevenCode(goodsId);
-                    classGrade.setSevenCode(sevenCode);
+                    if (ObjectUtils.isNotNull(sysTenant.getSevenClass()) && sysTenant.getSevenClass() == 1){
+                        //七大员继教班级共享
+                        classGrade.setSevenCode(getSevenCodeNoTenant(goodsId));
+                    }else {
+                        classGrade.setSevenCode(getSevenCode(goodsId));
+                    }
                 }
             }else {
                 classGrade.setStudentUpper(ClassGrade.INIT_UPPER); //上限300
@@ -2415,7 +2492,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
             if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) && org.getShareClass() == 1) {
                 //生成预开班编号
-                classGrade.setOfficialName(createGradeCode(goodsId, businessVo));
+//                classGrade.setOfficialName(createGradeCode(goodsId, businessVo));
+                classGrade.setOfficialName(ServletUtils.getEncoded("PIY"));
             }
 
         } else {
@@ -2431,7 +2509,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         Boolean classFlag = true;
         if (businessFull.contains("继续教育") && businessFull.contains("施工现场专业人员")
                 && StringUtils.isNotBlank(goods.getSevenYear()) && !Arrays.asList("2021","2022").contains(goods.getSevenYear())){
-            List<ClassGrade> gradeName = baseMapper.getClassNameByGoods(goods.getEducationTypeId(),goods.getProjectId().longValue(),goods.getBusinessId(),goods.getMajorId());
+            List<ClassGrade> gradeName = new ArrayList<>();
+            if (ObjectUtils.isNotNull(sysTenant.getSevenClass()) && sysTenant.getSevenClass() == 1){
+                //七大员继教班级共享
+                gradeName = baseMapper.getClassNameByGoodsNotTenant(goods.getEducationTypeId(),goods.getProjectId().longValue(),goods.getBusinessId(),goods.getMajorId());
+            }else {
+                gradeName = baseMapper.getClassNameByGoods(goods.getEducationTypeId(),goods.getProjectId().longValue(),goods.getBusinessId(),goods.getMajorId());
+            }
             if (CollectionUtils.isNotEmpty(gradeName)){
                 ClassGrade grade = gradeName.stream().filter(x -> ObjectUtils.isNotNull(x.getClassStatus()) && x.getClassStatus() == 1).findFirst().orElse(null);
                 if (ObjectUtils.isNotEmpty(grade)){
@@ -2494,7 +2578,88 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         iClassGradeGoodsService.save(classGradeGoods);
         //锁定班级
         lockGrade(orderGoodsId, classGrade.getGradeId(), userId, goodsId, orderSn,orderGoods.getSevenYear());
-        return true;
+        if ((("继续教育二级建造师".equals(businessFull)) || ("继续教育二级造价师".equals(businessFull))) && sysTenant.getShareClass() == 1) {
+            //二建继教班级创建,所有共享班级机构同步创建
+            synchronousCreation(classGrade,sysTenant,goodsId);
+            //通知旧系统
+            CreateSameClassBo classBo = new CreateSameClassBo();
+            if (ObjectUtils.isNotNull(bo.getClassStatus()) && bo.getClassStatus() == 1){
+                classBo.setClassNo(classGrade.getOfficialName());
+                classBo.setOpenclassState(1);
+                classBo.setBeginTime(DateUtils.timestampToDateFormat(classGrade.getClassStartTime(),"yyyy-MM-dd HH:mm:ss"));
+                classBo.setEndTime(DateUtils.timestampToDateFormat(classGrade.getClassEndTime(),"yyyy-MM-dd HH:mm:ss"));
+            }else {
+                classBo.setClassNo(classGrade.getOfficialName());
+                classBo.setOpenclassState(0);
+            }
+            classBo.setCategoryName(classGrade.getClassName());
+            classBo.setPlatformId("继续教育二级造价师".equals(businessFull)?8:5);
+            Major major = iMajorService.getById(goods.getMajorId());
+            if (ObjectUtils.isNotNull(major)){
+                classBo.setMajorName(major.getCategoryName());
+            }
+
+            Long nowTime = DateUtils.getNowTime();
+            String sign = ToolsUtils.EncoderByMd5(classBo.getClassNo()+nowTime.toString() + "pubilc2022");
+            classBo.setSign(sign);
+            classBo.setStamp(nowTime);
+            JSONObject param = JSONObject.parseObject(JSONObject.toJSONString(classBo));
+            String respone = "";
+            try {
+                respone = HttpUtils.sendPost(CREATE_EXAM_PATH, param);
+                if (!respone.contains("\"Status\":true")) {
+                    log.error("旧系统创建班级错误" + respone);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("旧系统创建班级错误" + respone);
+            }
+        }
+       return true;
+    }
+
+    private void synchronousCreation(ClassGrade classGrade, SysTenant sysTenant,Long goodsId) {
+        List<SysTenant> tenantList = iSysTenantService.getListNoTenant(0L);
+        if (CollectionUtils.isEmpty(tenantList)){
+            return;
+        }
+        Goods goods = iGoodsService.getById(goodsId);
+        String businessName = iGoodsService.getGoodsBusinessName(goodsId);
+        Major major = iMajorService.getById(goods.getMajorId());
+        tenantList.forEach(tenant -> {
+            //是否存在对应课程商品
+            List<Goods> relGoods = iGoodsService.getRelGoodsNoTenant(businessName,major.getCategoryName(),tenant.getTenantId());
+            if (CollectionUtils.isEmpty(relGoods)){
+                return;
+            }
+            //班级是否存在
+            ClassGrade grade = iClassGradeService.getCodeNoTenant(classGrade.getOfficialName(),tenant.getTenantId());
+            if (ObjectUtils.isNotNull(grade)){
+                //已经存在 过滤已经创建过班级的商品
+                List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+            }
+            if (CollectionUtils.isEmpty(relGoods)){
+                return;
+            }
+
+            //同步班级
+            classGrade.setGradeId(null);
+            classGrade.setTenantId(tenant.getTenantId());
+            iClassGradeService.save(classGrade);
+
+            List<ClassGradeGoods> gradeGoods = relGoods.stream().map(item -> {
+                ClassGradeGoods classGradeGoods = new ClassGradeGoods();
+                classGradeGoods.setGradeId(classGrade.getGradeId());
+                classGradeGoods.setGoodsId(item.getGoodsId());
+                classGradeGoods.setCreateTime(DateUtils.getNowTime());
+                classGradeGoods.setUpdateTime(DateUtils.getNowTime());
+                classGradeGoods.setTenantId(tenant.getTenantId());
+                return classGradeGoods;
+            }).collect(Collectors.toList());
+            iClassGradeGoodsService.saveBatch(gradeGoods);
+        });
     }
 
     private String getSevenCode(Long goodsId) {
@@ -2522,6 +2687,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return ServletUtils.getEncoded("SEV");
     }
 
+    private String getSevenCodeNoTenant(Long goodsId) {
+        Goods g = iGoodsService.getById(goodsId);
+        String businessName = iGoodsService.getGoodsBusinessName(g.getGoodsId());
+        Major major = iMajorService.getById(g.getMajorId());
+        List<Goods> list = iGoodsService.getRelevanceGoodsNoTenant(businessName,major.getCategoryName(),g.getGoodsId());
+        if (CollectionUtils.isNotEmpty(list)){
+            List<ClassGradeGoods> classGradeList = iClassGradeGoodsService
+                    .getClassNoTenant(list.stream().map(Goods::getGoodsId).collect(Collectors.toList()));
+            if (CollectionUtils.isNotEmpty(classGradeList)){
+                ClassGrade classGrade = baseMapper.getSevenGradeNoTenant(classGradeList.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()));
+                if (ObjectUtils.isNotNull(classGrade)){
+                    return classGrade.getSevenCode();
+                }
+            }
+        }
+        return ServletUtils.getEncoded("SEV");
+    }
+
     @Override
     public Map<String, String> getActivityGoods(OrderAddBo bo) {
         String key = "ORDER-" + "-" + bo.getUserId();

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

@@ -114,4 +114,7 @@ public interface IScheduleService extends IService<PolyvVideo> {
 
     void updatePredictPayTime();
 
+    void syncUserDateStudyLog();
+
+    void usbUserDownload();
 }

+ 231 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -14,9 +14,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
+import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
@@ -98,6 +103,9 @@ import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
 import com.zhongzheng.modules.system.bo.SysTenantBadBillConfigBo;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
+import com.zhongzheng.modules.system.domain.SysTask;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTaskService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
@@ -127,7 +135,14 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -135,6 +150,7 @@ import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 定时任务
@@ -327,6 +343,10 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     private ICourseProjectTypeService iCourseProjectTypeService;
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
+    @Autowired
+    private ISysTaskService iSysTaskService;
+    @Autowired
+    private OssService ossService;
 
 
     @Value("${aliyun.sms.OpenTheGoodsCode}")
@@ -1728,8 +1748,18 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 examApply.setProjectId(projectId);
                 examApply.setBusinessId(businessId);
                 examApply.setCode(ServletUtils.getEncoded("KSAP"));
+                examApply.setRelCode(ServletUtils.getEncoded("SHEX"));
                 examApply.setReportStatus(0);
                 examApply.setApplyNature(1);//普通场次
+                //是否公用祥粤考场
+                String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+                SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
+                if (ObjectUtils.isNotNull(sysTenant.getExamRoom()) && sysTenant.getExamRoom() == 1){
+                   String code = iExamApplyService.getExamRelCodeNotTenant(examApply.getApplyName());
+                   if (StringUtils.isNotEmpty(code)){
+                       examApply.setRelCode(code);
+                   }
+                }
                 iExamApplyService.save(examApply);
 
                 //考试商品
@@ -1799,6 +1829,207 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         iTopDivideLogService.updateSellerPredictPayTime();
     }
 
+    @Override
+    public void syncUserDateStudyLog() {
+        iUserStudyRecordService.syncUserDateStudyLog();
+    }
+
+    @Override
+    public void usbUserDownload() {
+        int count = iSysTaskService
+                .count(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getStatus, 1)
+                .eq(SysTask::getTaskStatus, 2));
+        if (count > 0){
+            //已有任务在执行中 不同步执行
+            return;
+        }
+        SysTask task = iSysTaskService.getOne(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getTaskStatus, 1)
+                .eq(SysTask::getStatus, 1)
+                .orderByAsc(SysTask::getCreateTime)
+                .last("limit 1"));
+        if (ObjectUtils.isNull(task)){
+            return;
+        }
+
+        //执行下载任务
+        SubUserExportBo subUserExportBo = JSONObject.parseObject(task.getTaskParam(), SubUserExportBo.class);
+        List<UserSubscribe> subscribeList = iUserSubscribeService.listByTimeNoTenant(subUserExportBo);
+        if (CollectionUtils.isEmpty(subscribeList)){
+            task.setTaskStatus(3);//完成
+            iSysTaskService.updateById(task);
+            return;
+        }
+        task.setTaskStatus(2);//执行中
+        iSysTaskService.updateById(task);
+        String zhiyuan = System.getProperty("user.dir");
+        String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试",DateUtils.timestampToDateFormat(subUserExportBo.getApplyTime(),"yyyy-MM-dd"));
+        List<UserStudyRecordExport> recordExports = new ArrayList<>();
+        for (int i = 0; i < subscribeList.size(); i++) {
+            UserSubscribe item = subscribeList.get(i);
+            User user = iUserService.getByIdNoTenant(item.getUserId());
+            String userPhotoPath = destDirPath+"/"+user.getRealname()+"/"+"个人相片";
+            File dirw = new File(userPhotoPath);
+            if (!dirw.exists()){
+                dirw.mkdirs();
+            }
+            //获取个人近照和身份证照片
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getOneInchPhotos());
+                //写入本地文件
+                String inchPath = userPhotoPath + "/"+String.format("%s$头像.jpg", EncryptHandler.decrypt(user.getIdCard()));
+                FileOutputStream fileOutputStream = new FileOutputStream(inchPath);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getIdCardImg2());
+                //写入本地文件
+                String cardPath1 = userPhotoPath + "/"+String.format("%s身份证反面.jpg", user.getRealname());
+                FileOutputStream fileOutputStream = new FileOutputStream(cardPath1);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            try {
+                InputStream inputStream = ossService.getStreamByObject(user.getIdCardImg1());
+                //写入本地文件
+                String cardPath2 = userPhotoPath + "/"+String.format("%s身份证正面.jpg", user.getRealname());
+                FileOutputStream fileOutputStream = new FileOutputStream(cardPath2);
+                byte[] buffer = new byte[1024];
+                int len = 0;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    fileOutputStream.write(buffer, 0, len);
+                }
+                inputStream.close();
+                fileOutputStream.close();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //学习照片
+            OrderGoods orderGoods = iOrderGoodsService.getByIdNoTenant(item.getOrderGoodsId());
+            Goods goods = iGoodsService.getGoodsByIdNotTenant(orderGoods.getGoodsId());
+            String goodsPath = destDirPath+"/"+user.getRealname()+"/"+goods.getGoodsName();
+            File dirw2 = new File(goodsPath);
+            if (!dirw2.exists()){
+                dirw2.mkdirs();
+            }
+            List<UserStudyRecord> recordList = iUserStudyRecordService.getStudyRecordNoTenant(orderGoods.getOrderGoodsId());
+            if (CollectionUtils.isEmpty(recordList)){
+                continue;
+            }
+            Map<Long, List<UserStudyRecord>> map = recordList.stream().collect(Collectors.groupingBy(UserStudyRecord::getSectionId));
+            map.forEach((k,v) -> {
+                CourseSection section = iCourseSectionService.getSectionByNotTenant(k);
+                String sectionPath = goodsPath+"/"+section.getName();
+                File dirw3 = new File(sectionPath);
+                if (!dirw3.exists()){
+                    dirw3.mkdirs();
+                }
+                //视频拍照信息
+                v.stream().filter(x -> ObjectUtils.isNotNull(x.getPhoto())).forEach(photo -> {
+                    try {
+                        InputStream inputStream = ossService.getStreamByObject(photo.getPhoto());
+                        //写入本地文件
+                        String photoPath1 = sectionPath + "/"+String.format("%s.jpg",DateUtils.getNowTime());
+                        FileOutputStream fileOutputStream = new FileOutputStream(photoPath1);
+                        byte[] buffer = new byte[1024];
+                        int len = 0;
+                        while ((len = inputStream.read(buffer)) != -1) {
+                            fileOutputStream.write(buffer, 0, len);
+                        }
+                        inputStream.close();
+                        fileOutputStream.close();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                });
+            });
+
+            //学习记录
+           List<UserStudyRecordExport> exports = iExamApplyService.getUserStudyRecordNoTenant(item.getOrderGoodsId());
+            if (CollectionUtils.isEmpty(exports)) {
+                continue;
+            }
+            exports.forEach(recordItem -> {
+                recordItem.setUserName(user.getRealname());
+                recordItem.setIdCard(EncryptHandler.decrypt(user.getIdCard()));
+                recordItem.setCompanyName(user.getCompanyName());
+                recordItem.setSectionTime(DateUtils.secondConvertHourMinSecond(recordItem.getDurationTime()));
+                if (ObjectUtils.isNotNull(recordItem.getStatus()) && recordItem.getStatus() == 1) {
+                    //已学完
+                    recordItem.setStudyTime(DateUtils.secondConvertHourMinSecond(recordItem.getDurationTime()));
+                    recordItem.setFinish("已完成");
+                } else {
+                    recordItem.setFinish("未完成");
+                }
+                recordItem.setStudyStartTime(DateUtils.timestampToDateFormat(recordItem.getStartTime(), "yyyy/MM/dd HH:mm:ss"));
+                recordItem.setStudyEndTime(DateUtils.timestampToDateFormat(recordItem.getEndTime(), "yyyy/MM/dd HH:mm:ss"));
+            });
+            recordExports.addAll(exports);
+            task.setFinishNum(i+1);
+            iSysTaskService.updateById(task);
+        }
+        ExcelUtil<UserStudyRecordExport> util = new ExcelUtil<UserStudyRecordExport>(UserStudyRecordExport.class);
+        String path = destDirPath + "/" +"学习记录表" + ".xlsx";
+        util.exportEasyExcelStudy(util.exportEasyData(recordExports), path);
+        //打包zip 上传oss
+        String zipPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试.zip",DateUtils.timestampToDateFormat(subUserExportBo.getApplyTime(),"yyyy-MM-dd"));
+        FileUtils.toZip(zipPath,destDirPath,true);
+        //上传oss
+        OssRequest ossRequest = new OssRequest();
+        ossRequest.setGradeId(0L);
+        ossRequest.setUserId(0L);
+        ossRequest.setImageStatus(7);
+        File file1 = new File(zipPath);
+        ossRequest.setFile(FileUtils.getMultipartFile(file1));
+        try {
+            String upload = ossService.upload(ossRequest);
+            task.setTaskPath(upload);
+            task.setTaskStatus(3);//完成
+            iSysTaskService.updateById(task);
+            //删除本地资源
+            Path pathStr = Paths.get(destDirPath);
+            try (Stream<Path> walk = Files.walk(pathStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+
+            Path zipStr = Paths.get(zipPath);
+            try (Stream<Path> walk = Files.walk(zipStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
     private String getWeeks(Long time){
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(DateUtils.timeToDate(time));

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysTask.java

@@ -0,0 +1,44 @@
+package com.zhongzheng.modules.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 系统商户对象 sys_tenant
+ *
+ * @author hjl
+ * @date 2021-08-03
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("sys_task")
+public class SysTask implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long createTime;
+    private Long updateTime;
+    /** 0 失效 1启用 */
+    private Integer status;
+    /** 任务名称 */
+    private String taskName;
+    /** 任务数量 */
+    private Integer taskNum;
+    /** 完成数量 */
+    private Integer finishNum;
+    /** 执行参数 */
+    private String taskParam;
+    /** 下载路径 */
+    private String taskPath;
+    /** 1未开始 2执行中 3已完成 */
+    private Integer taskStatus;
+
+    private Long tenantId;
+
+}

Неке датотеке нису приказане због велике количине промена