he2802 2 years ago
parent
commit
ee0f80ef06
91 changed files with 1808 additions and 232 deletions
  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. 3 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  6. 22 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  7. 0 13
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  8. 7 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  9. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysProfileController.java
  10. 2 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java
  11. 33 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  12. 3 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  13. 3 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  14. 3 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  15. 11 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  16. 3 0
      zhongzheng-api/src/main/resources/application-dev.yml
  17. 3 0
      zhongzheng-api/src/main/resources/application-pre.yml
  18. 4 0
      zhongzheng-api/src/main/resources/application-prod.yml
  19. 17 11
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  20. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  21. 2 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/MybatisPlusConfig.java
  22. 1 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  23. 82 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java
  24. 120 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/FindInSetExpression.java
  25. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/DistributionSellerServiceImpl.java
  26. 5 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  27. 7 7
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  28. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java
  29. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Major.java
  30. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  31. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/MajorServiceImpl.java
  32. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/distribution/service/impl/DistributionActivityGoodsServiceImpl.java
  33. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java
  34. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplySiteServiceImpl.java
  35. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  36. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  37. 70 30
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  38. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  39. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenBo.java
  40. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/CreateSameClassBo.java
  41. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java
  42. 15 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  43. 5 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java
  44. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java
  45. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  46. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  47. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java
  48. 181 34
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  49. 9 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  50. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  51. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassStudentExportVo.java
  52. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  53. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java
  54. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  55. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  56. 190 14
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  57. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  58. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  59. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysTenant.java
  60. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysTenantMapper.java
  61. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysTenantService.java
  62. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysDictDataServiceImpl.java
  63. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderAddBo.java
  64. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java
  65. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyLogMapper.java
  66. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java
  67. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java
  68. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserVisitLogMapper.java
  69. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyLogService.java
  70. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  71. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserVisitLogService.java
  72. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyLogServiceImpl.java
  73. 73 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  74. 94 65
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  75. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserVisitLogServiceImpl.java
  76. 108 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/CdUserStudyLogVo.java
  77. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java
  78. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  79. 2 1
      zhongzheng-system/src/main/resources/mapper/modules/activity/ActivityRecommendMapper.xml
  80. 20 1
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml
  81. 38 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  82. 15 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeGoodsMapper.xml
  83. 56 2
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  84. 49 14
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml
  85. 47 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml
  86. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/system/SysTenantMapper.xml
  87. 159 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml
  88. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyLogMapper.xml
  89. 96 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml
  90. 11 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml
  91. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserVisitLogMapper.xml

+ 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

+ 3 - 0
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,6 +176,8 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
 exam:
     applySave: http://39.108.7.155:9099/cd/exam/save
     applyUpdate: http://39.108.7.155:9099/cd/exam/update

+ 22 - 3
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -26,8 +26,11 @@ import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
+import com.zhongzheng.modules.bank.bo.QuestionQueryBo;
 import com.zhongzheng.modules.bank.service.IExamService;
 import com.zhongzheng.modules.bank.service.IQuestionOtherService;
+import com.zhongzheng.modules.bank.service.IQuestionService;
+import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.bo.ReplenishExamBo;
@@ -95,6 +98,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;
@@ -162,7 +168,6 @@ public class CommonController extends BaseController {
     private IQuestionOtherService iQuestionOtherService;
     @Autowired
     private OssService ossService;
-
     /**
      * 通用下载请求
      *
@@ -429,6 +434,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) {
@@ -745,15 +761,18 @@ 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) {
         return AjaxResult.success(iClassGradeUserService.sendClientPost(bo));
     }
+
+
 }

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

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

@@ -437,4 +437,11 @@ public class ScheduleController extends BaseController {
         iScheduleService.createExamApply();
         return AjaxResult.success();
     }
+
+    @ApiOperation("每日汇总用户学习数据")
+    @GetMapping("/syncUserDateStudyLog")
+    public AjaxResult syncUserDateStudyLog(){
+        iScheduleService.syncUserDateStudyLog();
+        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()));

+ 33 - 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,7 +13,10 @@ 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.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
@@ -49,6 +55,8 @@ public class UserSubscribeController extends BaseController {
 
     private final IExamApplyGoodsService iExamApplyGoodsService;
 
+    private final IExamApplySiteTimeService iExamApplySiteTimeService;
+
     /**
      * 查询用户预约考试列表
      */
@@ -211,6 +219,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 +229,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 +262,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

+ 3 - 0
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,6 +176,8 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
 exam:
     applySave: http://39.108.7.155:9099/cd/exam/save
     applyUpdate: http://39.108.7.155:9099/cd/exam/update

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

+ 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

+ 4 - 0
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,6 +188,9 @@ invoice:
 
 liveHost: https://sso.xyyxt.net
 
+fileHost: http://39.108.7.155:9099
+
+
 exam:
     applySave: http://39.108.7.155:9099/cd/exam/save
     applyUpdate: http://39.108.7.155:9099/cd/exam/update

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

@@ -368,13 +368,15 @@ public class ToolsUtils {
         return result;
     }
 
+
+
     public static String EncoderByMd5(String str) {
         String result = "";
         MessageDigest md5 = null;
         try {
             md5 = MessageDigest.getInstance("MD5");
             // 这句是关键
-            md5.update(str.getBytes("gb2312"));
+            md5.update(str.getBytes("gbk"));
         } catch (NoSuchAlgorithmException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
@@ -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());

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

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import com.zhongzheng.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
 import com.zhongzheng.framework.mybatisplus.CustomTenantLineHandler;
+import com.zhongzheng.framework.mybatisplus.CustomTenantLineInnerInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -25,7 +26,7 @@ public class MybatisPlusConfig {
 	public MybatisPlusInterceptor mybatisPlusInterceptor() {
 		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
 		// 多租户插件(注意:这个一定要放在最上面)
-		interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(customTenantLineHandler));
+		interceptor.addInnerInterceptor(new CustomTenantLineInnerInterceptor(customTenantLineHandler));
 		// 分页插件
 		interceptor.addInnerInterceptor(paginationInnerInterceptor());
 		// 乐观锁插件

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

+ 82 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java

@@ -0,0 +1,82 @@
+package com.zhongzheng.framework.mybatisplus;
+
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.Parenthesis;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
+import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.update.Update;
+import org.springframework.stereotype.Component;
+
+
+public class CustomTenantLineInnerInterceptor extends TenantLineInnerInterceptor {
+    private TenantLineHandler tenantLineHandler;
+    public CustomTenantLineInnerInterceptor(TenantLineHandler tenantLineHandler) {
+        super(tenantLineHandler);
+        this.tenantLineHandler = tenantLineHandler;
+    }
+
+
+    @Override
+    protected Expression builderExpression(Expression currentExpression, Table table) {
+        Column aliasColumn = this.getAliasColumn(table);
+        boolean presenceOfField=true;
+        if(!this.tenantLineHandler.ignoreTable(table.getName())) {
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            if (currentExpression == null) {
+                return findInSetExpression;
+            } else {
+                return currentExpression instanceof OrExpression ? new AndExpression(new Parenthesis(currentExpression), findInSetExpression) : new AndExpression(currentExpression, findInSetExpression);
+            }
+        }else{
+            return currentExpression;
+        }
+
+    }
+
+    @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);
+    }
+}

+ 120 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/FindInSetExpression.java

@@ -0,0 +1,120 @@
+package com.zhongzheng.framework.mybatisplus;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.operators.relational.ItemsList;
+import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
+import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
+import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+
+public class FindInSetExpression extends ASTNodeAccessImpl implements Expression {
+    private Expression leftExpression;
+    private ItemsList leftItemsList;
+    private ItemsList rightItemsList;
+    private boolean not = false;
+    private Expression rightExpression;
+    private MultiExpressionList multiExpressionList;
+    private int oldOracleJoinSyntax = 0;
+
+    public FindInSetExpression() {
+    }
+
+    public FindInSetExpression(Expression leftExpression, ItemsList itemsList) {
+        this.setLeftExpression(leftExpression);
+        this.setRightItemsList(itemsList);
+    }
+
+    public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
+        this.oldOracleJoinSyntax = oldOracleJoinSyntax;
+        if (oldOracleJoinSyntax < 0 || oldOracleJoinSyntax > 1) {
+            throw new IllegalArgumentException("unexpected join type for oracle found with IN (type=" + oldOracleJoinSyntax + ")");
+        }
+    }
+
+    public int getOldOracleJoinSyntax() {
+        return this.oldOracleJoinSyntax;
+    }
+
+    public ItemsList getRightItemsList() {
+        return this.rightItemsList;
+    }
+
+    public Expression getLeftExpression() {
+        return this.leftExpression;
+    }
+
+    public final void setRightItemsList(ItemsList list) {
+        this.rightItemsList = list;
+    }
+
+    public final void setLeftExpression(Expression expression) {
+        this.leftExpression = expression;
+    }
+
+    public boolean isNot() {
+        return this.not;
+    }
+
+    public void setNot(boolean b) {
+        this.not = b;
+    }
+
+    public ItemsList getLeftItemsList() {
+        return this.leftItemsList;
+    }
+
+    public void setLeftItemsList(ItemsList leftItemsList) {
+        this.leftItemsList = leftItemsList;
+    }
+
+    public Expression getRightExpression() {
+        return this.rightExpression;
+    }
+
+    public void setRightExpression(Expression rightExpression) {
+        this.rightExpression = rightExpression;
+    }
+
+
+
+    private String getLeftExpressionString() {
+        return this.leftExpression + (this.oldOracleJoinSyntax == 1 ? "(+)" : "");
+    }
+
+    public String toString() {
+        StringBuilder statementBuilder = new StringBuilder();
+
+        statementBuilder.append("FIND_IN_SET ");
+        statementBuilder.append("(");
+        statementBuilder.append(this.getLeftExpressionString());
+        statementBuilder.append(",");
+        statementBuilder.append(this.rightExpression);
+        statementBuilder.append(")");
+
+        return statementBuilder.toString();
+    }
+
+    public int getOraclePriorPosition() {
+        return 0;
+    }
+
+    public void setOraclePriorPosition(int priorPosition) {
+        if (priorPosition != 0) {
+            throw new IllegalArgumentException("unexpected prior for oracle found");
+        }
+    }
+
+    public MultiExpressionList getMultiExpressionList() {
+        return this.multiExpressionList;
+    }
+
+    public void setMultiExpressionList(MultiExpressionList multiExpressionList) {
+        this.multiExpressionList = multiExpressionList;
+    }
+
+    @Override
+    public void accept(ExpressionVisitor expressionVisitor) {
+
+    }
+}
+

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

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

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

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

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

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

+ 10 - 0
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;
 
 
 
@@ -796,6 +799,8 @@ 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() == 0){
+                        goodsUserVo.setSubscribeSign(4);
                     }else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
                         goodsUserVo.setSubscribeSign(3);
                     }
@@ -924,6 +929,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();
@@ -931,6 +937,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;
     }

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

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

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

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

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

+ 6 - 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,8 @@ 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);
 }

+ 70 - 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,16 @@ 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;
 }

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

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

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

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

+ 5 - 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,7 @@ 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);
 
     List<Long> selectEnd(@Param("userId") Long userId,@Param("goodsId") Long goodsId,@Param("gradeId") Long gradeId);
 

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

@@ -53,4 +53,8 @@ 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);
 }

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

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

@@ -107,4 +107,14 @@ 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);
+    }
 }

+ 181 - 34
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;
@@ -178,6 +179,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 +263,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 +283,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 +293,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,6 +313,11 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 String sevenCode = getSevenCode(goodsId);
                 add.setSevenCode(sevenCode);
             }
+//            else if (("继续教育二级建造师".equals(businessName)) || ("继续教育二级造价师".equals(businessName))){
+//                erJfalg = true;
+//                ezJfalg = "继续教育二级造价师".equals(businessName);
+//                add.setOfficialName(ServletUtils.getEncoded("PIY"));
+//            }
         }
         //是否创建官方班级编号
         if (bo.getClassGradeGoodsAddBos() != null &&
@@ -425,6 +419,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             }
         }
         boolean save = this.save(add);
+
         //添加班级商品
         if (bo.getClassGradeGoodsAddBos() != null) {
             for (Long classGradeGoodsAddBo : bo.getClassGradeGoodsAddBos()) {
@@ -450,9 +445,90 @@ 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(sysTenant.getTenantId());
+        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)){
+                //已经存在 不创建
+                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,6 +566,8 @@ 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>()
@@ -607,24 +685,18 @@ 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);
+                    });
                 }
             }
         }
@@ -677,6 +749,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())) {
@@ -1228,7 +1304,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 +1518,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 +1635,76 @@ 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;
+            }
+            //班级是否存在
+            ClassGrade grade = baseMapper.getCodeNoTenant(bo.getRegisterCode(),tenant.getTenantId());
+            if (ObjectUtils.isNotNull(grade)){
+                //已经存在 不创建
+                return;
+            }
+            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.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());
+            classGrade.setRegisterCode(bo.getRegisterCode());
+            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 void creatClass(List<Long> goodsIds, Long tenantId, String code) {
         goodsIds.forEach(goodsId -> {

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

@@ -1733,6 +1733,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) {
@@ -1772,9 +1777,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));
             }
             //当审核状态状态为通过是采取解析身份证和一寸照
             if ("1".equals(classPeriodStudentVo.getProfileStatus()) && Validator.isNotEmpty(bo.getUserPhoto()) && bo.getUserPhoto() == 1) {
@@ -1858,9 +1863,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());

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

@@ -236,4 +236,6 @@ public class ClassGradeStudentVo {
 	@ApiModelProperty("官方信息推送结果")
 	private String officialStatusMsg;
 
+
+
 }

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

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

@@ -108,5 +108,8 @@ private static final long serialVersionUID=1L;
     @TableField(exist = false)
     private Long subOrderGoodsId;
 
+    @TableField(exist = false)
+    @ApiModelProperty("新B端考试订单标识:1题库开通 2补冲考是标识")
+    private Integer openQuestionSign;
 
 }

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

+ 190 - 14
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;
@@ -46,10 +47,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;
@@ -91,6 +89,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;
 
@@ -213,6 +212,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) {
@@ -686,9 +689,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());
@@ -855,7 +859,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);
         }
 //        //商品是否有活动模考
@@ -903,6 +910,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)){
@@ -2273,6 +2332,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);
@@ -2291,7 +2352,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<>();
@@ -2334,7 +2400,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 {
                 //临时锁定的班级学员数量
@@ -2380,7 +2451,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)
@@ -2394,8 +2465,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
@@ -2412,6 +2487,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             if ((("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) && org.getShareClass() == 1) {
                 //生成预开班编号
                 classGrade.setOfficialName(createGradeCode(goodsId, businessVo));
+//                classGrade.setOfficialName(ServletUtils.getEncoded("PIY"));
             }
 
         } else {
@@ -2427,7 +2503,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)){
@@ -2490,7 +2572,83 @@ 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(sysTenant.getTenantId());
+        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)){
+                //已经存在 不创建
+                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) {
@@ -2518,6 +2676,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();

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

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

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

@@ -1799,6 +1799,11 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         iTopDivideLogService.updateSellerPredictPayTime();
     }
 
+    @Override
+    public void syncUserDateStudyLog() {
+        iUserStudyRecordService.syncUserDateStudyLog();
+    }
+
     private String getWeeks(Long time){
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(DateUtils.timeToDate(time));

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

@@ -109,5 +109,7 @@ private static final long serialVersionUID=1L;
     private String postPassword;
     /** 排序字段 */
     private Integer sort;
+    /** 七大员班级标识:1使用祥粤班级 0正常 */
+    private Integer sevenClass;
 
 }

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

@@ -1,11 +1,14 @@
 package com.zhongzheng.modules.system.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 系统商户Mapper接口
  *
@@ -14,4 +17,7 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface SysTenantMapper extends BaseMapper<SysTenant> {
     Long findTenantId(SysTenantQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<SysTenant> getListNoTenant(Long tenantId);
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysTenantService.java

@@ -70,4 +70,5 @@ public interface ISysTenantService extends IService<SysTenant> {
 
 	boolean deleteTopTenant(SysTopTenantEditBo bo);
 
+    List<SysTenant> getListNoTenant(Long tenantId);
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysDictDataServiceImpl.java

@@ -148,6 +148,7 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
         SysDictData info = getOne(new LambdaQueryWrapper<SysDictData>()
                 .eq(SysDictData::getDictValue,entity.getDictValue())
                 .eq(SysDictData::getDictType,entity.getDictType())
+                .ne(Validator.isNotEmpty(entity.getDictCode()),SysDictData::getDictCode,entity.getDictCode())
                 .last("limit 1"));
         if (Validator.isNotNull(info)) {
             return true;

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

@@ -191,4 +191,7 @@ public class TopOldOrderAddBo {
 
     @ApiModelProperty("财务备注")
     private String financeRemark;
+
+    @ApiModelProperty("新B端订单审核标识:1需要 0不需要")
+    private Integer checkSign;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java

@@ -32,6 +32,9 @@ public interface UserMapper extends BaseMapper<User> {
 
     List<User> selectList(UserQueryBo bo);
 
+    @InterceptorIgnore(tenantLine = "true")
+    List<User> selectListNoTenant(UserQueryBo bo);
+
     List<UserStudyRecordVo> selectStudyRecordList(UserStudyRecordQueryBo bo);
 
     Integer selectByRankOneByTime(@Param("hourse") Integer toInt,@Param("startTime") long startTime,@Param("endTime") long endTime);

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyLogMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.user.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.user.bo.UserStudyLogQueryBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
@@ -17,4 +18,7 @@ import java.util.List;
  */
 public interface UserStudyLogMapper extends BaseMapper<UserStudyLog> {
     List<UserStudyLogVo> getList(UserStudyLogQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserStudyLog getOneNoTenant(Long userId);
 }

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

@@ -117,4 +117,13 @@ public interface UserStudyRecordMapper extends BaseMapper<UserStudyRecord> {
     UserPeriod selectSevenUserPeriod(UserStudyRecord bo);
 
     GoodsSectionNumVo getGoodsSectionNum(SubjectStudyRecordQueryBo queryBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CdUserStudyLogVo> syncUserDateStudyLog(UserStudyRecordQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CdUserStudyLogVo> syncUserDateStudyExamLog(UserStudyRecordQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CdUserStudyLogVo> syncUserList(UserStudyRecordQueryBo bo);
 }

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

@@ -38,6 +38,8 @@ public interface UserSubscribeMapper extends BaseMapper<UserSubscribe> {
 
     Long selectAddSubscribeId(@Param("applyId") Long applyId,@Param("goodsId") Long goodsId,@Param("userId")  Long userId);
 
+    Long selectAddSubscribeCount(@Param("orderGoodsId") Long orderGoodsId,@Param("userId")  Long userId);
+
     Long queryBusinessId(@Param("subscribeId")Long subscribeId,@Param("businessId")Long businessId);
 
     List<UserSubscribeVo> timeSend();

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserVisitLogMapper.java

@@ -1,7 +1,9 @@
 package com.zhongzheng.modules.user.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.user.domain.UserVisitLog;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 用户访问日志Mapper接口
@@ -11,4 +13,6 @@ import com.zhongzheng.modules.user.domain.UserVisitLog;
  */
 public interface UserVisitLogMapper extends BaseMapper<UserVisitLog> {
 
+    @InterceptorIgnore(tenantLine = "true")
+    UserVisitLog getOneNoTenant(@Param("userId") Long userId);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyLogService.java

@@ -51,4 +51,8 @@ public interface IUserStudyLogService extends IService<UserStudyLog> {
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    UserStudyLog getOneNoTenant(Long userId);
+
+
 }

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

@@ -148,4 +148,6 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 
 	GoodsSectionNumVo getGoodsSectionNum(SubjectStudyRecordQueryBo subjectStudyRecordQueryBo);
 
+	Boolean syncUserDateStudyLog();
+
 }

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

@@ -49,4 +49,6 @@ public interface IUserVisitLogService extends IService<UserVisitLog> {
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    UserVisitLog getOneNoTenant(Long userId);
 }

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

@@ -120,4 +120,10 @@ public class UserStudyLogServiceImpl extends ServiceImpl<UserStudyLogMapper, Use
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public UserStudyLog getOneNoTenant(Long userId) {
+        return baseMapper.getOneNoTenant(userId);
+    }
+
 }

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

@@ -3,6 +3,8 @@ package com.zhongzheng.modules.user.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -15,6 +17,7 @@ import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.*;
@@ -165,6 +168,9 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     @Autowired
     private ICourseMenuService iCourseMenuService;
 
+    @Value("${fileHost}")
+    private String fileHost;
+
     @Override
     public UserStudyRecordVo queryById(Long recordId) {
         UserStudyRecord db = this.baseMapper.selectById(recordId);
@@ -373,7 +379,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
                                 num = 3;
                             }
                             if(fullName.contains("继续教育")&&fullName.contains("施工现场专业人员")){
-                                num =  (int)Math.ceil(videoTime.intValue()/(46*60));
+                                num =  (int)Math.floor(videoTime.intValue()/(50*60))+1;
                             }
                             UserPeriodQueryBo userPeriodQueryBo2 = new UserPeriodQueryBo();
                             userPeriodQueryBo2.setSectionId(bo.getSectionId());
@@ -1371,6 +1377,72 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         return baseMapper.getGoodsSectionNum(queryBo);
     }
 
+    @Override
+    public Boolean syncUserDateStudyLog() {
+        Long zeroTime = DateUtils.getTodayZeroTime();
+        zeroTime = zeroTime - 24 * 3600;
+        Long endTime = zeroTime -1;
+        UserStudyRecordQueryBo queryBo1 = new UserStudyRecordQueryBo();
+        queryBo1.setStartTime(zeroTime);
+        queryBo1.setEndTime(endTime);
+        List<CdUserStudyLogVo> userList = baseMapper.syncUserList(queryBo1);
+        List<CdUserStudyLogVo> list = baseMapper.syncUserDateStudyLog(queryBo1);
+        List<CdUserStudyLogVo> examList = baseMapper.syncUserDateStudyExamLog(queryBo1);
+        for(CdUserStudyLogVo userVo : userList){
+            Long secLong = 0L;
+            Long studyLong = 0L;
+            SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
+            subjectStudyRecordQueryBo.setGoodsId(userVo.getGoodsId());
+            subjectStudyRecordQueryBo.setUserId(userVo.getUserId());
+            subjectStudyRecordQueryBo.setGradeId(userVo.getGradeId());
+            subjectStudyRecordQueryBo.setOrderGoodsId(userVo.getOrderGoodsId());
+            List<SubjectStudyRecordVo> subjectStudyRecordVos = iUserStudyRecordService.listSubject(subjectStudyRecordQueryBo);
+            for (SubjectStudyRecordVo subjectStudyRecordVo : subjectStudyRecordVos) {
+                secLong = new BigDecimal(secLong.toString()).add(new BigDecimal(subjectStudyRecordVo.getSectionNum().toString())).longValue();
+                studyLong = new BigDecimal(studyLong.toString()).add(new BigDecimal(subjectStudyRecordVo.getRecordNum().toString())).longValue();
+            }
+            userVo.setTotalClassHour(secLong+userVo.getExamNum());
+            userVo.setStudyClassHour(studyLong+userVo.getRecordNum());
+
+            for(CdUserStudyLogVo vo : list){
+                if(vo.getOrderGoodsId()==userVo.getOrderGoodsId()){
+                    userVo.setOnlineTime(vo.getOnlineTime());
+                    userVo.setStudyTime(vo.getStudyTime());
+                    break;
+                }
+            }
+        }
+        for(CdUserStudyLogVo vo : userList){
+            for(CdUserStudyLogVo voExam : examList){
+                if(vo.getOrderGoodsId()==voExam.getOrderGoodsId()){
+                    vo.setDoQuestionNum(voExam.getDoQuestionNum());
+                    vo.setRightQuestionNum(voExam.getRightQuestionNum());
+                    vo.setTotalQuestionNum(voExam.getTotalQuestionNum());
+                    vo.setPerformance(voExam.getPerformance());
+                    vo.setStudyTime(vo.getStudyTime().longValue()+voExam.getStudyTime().longValue());
+                    if(vo.getOnlineTime().longValue()>voExam.getOnlineTime().longValue()){
+                        vo.setOnlineTime(voExam.getOnlineTime());
+                    }
+                    break;
+                }
+            }
+        }
+        for(CdUserStudyLogVo vo : userList){
+            User user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserId, vo.getUserId()).last("limit 1"));
+            vo.setIdCard(user.getIdCard());
+            vo.setTelphone(user.getTelphone());
+            vo.setAvatar(user.getAvatar());
+            vo.setRealname(user.getRealname());
+            vo.setDateTime(zeroTime);
+            vo.setFromPlat(1);
+        }
+        String url = fileHost + "/common/free/ranking/log/batchAdd";
+        JSONObject obj = new JSONObject();
+        obj.put("list", userList);
+        String result = HttpUtils.sendPost(url,obj);
+        return null;
+    }
+
 
     /**
      * 获取最后一次看完的节

+ 94 - 65
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -69,6 +69,8 @@ import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
@@ -173,6 +175,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     private ICourseProjectTypeService iCourseProjectTypeService;
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
 
     @Value("${aliyun.sms.cancellationReminder}")
     private String cancellationReminder;
@@ -319,12 +323,29 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             return "当前选择的考试时间已过期,请重新预约,选择未过期考试时间";
         }
         validEntityBeforeSave(add);
+        //生成座位号
+        Integer tNum = getSeatNumber(bo,60L);
+        add.setSeatNumber(tNum.toString());
         add.setSubscribeStatus(1);
         add.setExamStatus(0);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
         add.setExamineeCode(ServletUtils.getEncoded("ZZ"+ ToolsUtils.autoGenericCode(String.valueOf(add.getApplyId()),4) +ToolsUtils.autoGenericCode(String.valueOf(add.getUserId()),4)));
         this.save(add);
+
+        //预约成功推送新B端
+        CdExamSubscribeBo cdExamSubscribeBo = new CdExamSubscribeBo();
+        cdExamSubscribeBo.setUserId(add.getUserId());
+        cdExamSubscribeBo.setOrderGoodsId(add.getOrderGoodsId());
+        cdExamSubscribeBo.setExamApplyId(add.getApplyId());
+        cdExamSubscribeBo.setSign(1);
+        cdExamSubscribeBo.setTenantId(Long.valueOf(ServletUtils.getRequest().getHeader("TenantId")));
+        cdExamSubscribeBo.setDataFrom(1);
+        cdExamSubscribeBo.setType(1);//默认七大员新考
+        cdExamSubscribeBo.setSeatNumber(tNum);
+        String param = JSONObject.toJSONString(cdExamSubscribeBo);
+        Map<String, String> headersMap = new HashMap<>();
+        HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_SAVE_EXAM, param, headersMap);
         //发送预约考试消息
         sendExamSucceed(bo);
         return null;
@@ -336,6 +357,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         if(Validator.isEmpty(add.getOrderGoodsId())){
             throw new CustomException("缺失订单商品ID");
         }
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
         //判断当前时间是否超过了选择时间
         Date date = new Date();
         Long times = add.getApplySiteExamTime()*1000;//时间戳
@@ -357,6 +380,14 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             queryTimeBo.setExamTime(bo.getApplySiteExamTime());
             queryTimeBo.setApplySiteAddress(bo.getApplySiteAddress());
             //考点已申报人数
+            if (ObjectUtils.isNotNull(sysTenant.getSevenClass()) && sysTenant.getSevenClass() == 1){
+                //共享祥粤考场
+                List<SysTenant> tenantList = iSysTenantService.list(new LambdaQueryWrapper<SysTenant>()
+                        .eq(SysTenant::getSevenClass, 1).eq(SysTenant::getStatus, 1));
+                tenantList.forEach(item -> {
+
+                });
+            }
             Long sitePeopleNum = examApplyMapper.sitePeopleNum(queryTimeBo);
             List<String> siteTimeJsonList = examApplyMapper.siteTimeJson(queryTimeBo);
             String siteTimeJson = siteTimeJsonList.stream().filter(x -> {
@@ -545,6 +576,20 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             }
             update.setUpdateTime(DateUtils.getNowTime());
             boolean b = this.updateById(update);
+            if (bo.getSubscribeStatus() == 2){
+                //取消预约推送新B端
+                CdExamSubscribeBo cdExamSubscribeBo = new CdExamSubscribeBo();
+                cdExamSubscribeBo.setUserId(userSubscribeVo.getUserId());
+                cdExamSubscribeBo.setOrderGoodsId(userSubscribeVo.getOrderGoodsId());
+                cdExamSubscribeBo.setExamApplyId(userSubscribeVo.getApplyId());
+                cdExamSubscribeBo.setSign(1);
+                cdExamSubscribeBo.setTenantId(Long.valueOf(ServletUtils.getRequest().getHeader("TenantId")));
+                cdExamSubscribeBo.setDataFrom(1);
+                cdExamSubscribeBo.setType(1);//默认七大员新考
+                String param = JSONObject.toJSONString(cdExamSubscribeBo);
+                Map<String, String> headersMap = new HashMap<>();
+                HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_UPDATE_EXAM, param, headersMap);
+            }
             if(b&&Validator.isNotEmpty(bo.getResult())){
                 if(!bo.getResult().equals(userSubscribeVo.getResult())){
                     //考试结果有变更,发送短信
@@ -642,6 +687,20 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             }
             update.setUpdateTime(DateUtils.getNowTime());
             b = this.updateById(update);
+            if (editBo.getSubscribeStatus() == 2){
+                //取消预约推送新B端
+                CdExamSubscribeBo cdExamSubscribeBo = new CdExamSubscribeBo();
+                cdExamSubscribeBo.setUserId(userSubscribeVo.getUserId());
+                cdExamSubscribeBo.setOrderGoodsId(userSubscribeVo.getOrderGoodsId());
+                cdExamSubscribeBo.setExamApplyId(userSubscribeVo.getApplyId());
+                cdExamSubscribeBo.setSign(1);
+                cdExamSubscribeBo.setTenantId(Long.valueOf(ServletUtils.getRequest().getHeader("TenantId")));
+                cdExamSubscribeBo.setDataFrom(1);
+                cdExamSubscribeBo.setType(1);//默认七大员新考
+                String param = JSONObject.toJSONString(cdExamSubscribeBo);
+                Map<String, String> headersMap = new HashMap<>();
+                HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_UPDATE_EXAM, param, headersMap);
+            }
             if(Validator.isNotEmpty(update.getResult())){
                 if(!update.getResult().equals(userSubscribeVo.getResult())){
                     //考试结果有变更,发送短信
@@ -795,7 +854,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
 
             //是否关联题库
             GoodsQuestionRel questionRel = iGoodsQuestionRelService.getOne(new LambdaQueryWrapper<GoodsQuestionRel>()
-                    .eq(GoodsQuestionRel::getOrderGoodsId, bo.getOrderGoodsId())
+                    .eq(GoodsQuestionRel::getOrderGoodsId, userSubscribeVo.getOrderGoodsId())
                     .eq(GoodsQuestionRel::getStatus, 1)
                     .gt(GoodsQuestionRel::getQuestionDoNum, 0));
             if (ObjectUtils.isNotNull(questionRel)){
@@ -805,9 +864,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
 
             //取消预约推送新B端
             CdExamSubscribeBo cdExamSubscribeBo = new CdExamSubscribeBo();
-            cdExamSubscribeBo.setUserId(bo.getUserId());
-            cdExamSubscribeBo.setOrderGoodsId(bo.getOrderGoodsId());
-            cdExamSubscribeBo.setExamApplyId(bo.getApplyId());
+            cdExamSubscribeBo.setUserId(userSubscribeVo.getUserId());
+            cdExamSubscribeBo.setOrderGoodsId(userSubscribeVo.getOrderGoodsId());
+            cdExamSubscribeBo.setExamApplyId(userSubscribeVo.getApplyId());
             cdExamSubscribeBo.setSign(1);
             cdExamSubscribeBo.setTenantId(Long.valueOf(ServletUtils.getRequest().getHeader("TenantId")));
             cdExamSubscribeBo.setDataFrom(1);
@@ -1069,8 +1128,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
                 continue;
             }
 
-            Long subscribeId = baseMapper.selectAddSubscribeId(applyId, goodsId, userId);
-            if (subscribeId != null) {
+            Long count = baseMapper.selectAddSubscribeCount(classGradeVo.getOrderGoodsId(), userId);
+            if (count > 0) {
                 userSubscribeImport.setCause("该学员在考试计划中有预约考试数据,请确认该学员预约考试状况");
                 userSubscribeImports.add(userSubscribeImport);
                 continue;
@@ -1120,8 +1179,6 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
                 startTime = split[0];
                 endTime = split[1];
 
-               /* startTime = startTime.replace(":", "-");
-                endTime = endTime.replace(":", "-");*/
                 if(Validator.isEmpty(startTime)||Validator.isEmpty(endTime)){
                     userSubscribeImport.setCause("考试时间段错误");
                     userSubscribeImports.add(userSubscribeImport);
@@ -2395,41 +2452,27 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         if (ObjectUtil.isNull(examApply)){
             throw new CustomException("考场信息查询不到!请检查");
         }
-        List<Long> goodsIds = iExamApplyService.getApplyGoodsId(examApply.getApplyId(),bo.getMajorName());
-        if (CollectionUtils.isEmpty(goodsIds)){
-            throw new CustomException("该专业下找不到考试对应的课程!请检查");
-        }
 
         //是否存在订单
-        List<OrderGoods> orderGoodsList = iOrderGoodsService.getApplyOrderGoods(goodsIds,user.getUserId());
-        if (CollectionUtils.isEmpty(orderGoodsList)){
-            throw new CustomException("当前学员没有购买该专业下的课程!请检查");
-        }
-        OrderGoods applyOrder = null;
-        for (OrderGoods orderGoods : orderGoodsList) {
-            ClassGradeUser gradeUser = iClassGradeUserService
-                    .getOne(new LambdaQueryWrapper<ClassGradeUser>()
-                    .eq(ClassGradeUser::getUserId, user.getUserId())
-                    .eq(ClassGradeUser::getGradeId, orderGoods.getGradeId())
-                    .eq(ClassGradeUser::getOrderGoodsId, orderGoods.getOrderGoodsId())
-                    .last("limit 1"));
-            if (ObjectUtil.isNotNull(gradeUser)){
-                //学时是否通过审核
-                if (ObjectUtils.isNotNull(gradeUser.getPeriodStatus()) && gradeUser.getPeriodStatus() == 1){
-                    applyOrder = orderGoods;
-                }
-            }
-        }
-
-        if(Validator.isEmpty(applyOrder)){
+        OrderGoods orderGoods = iOrderGoodsService.getById(bo.getOrderGoodsId());
+
+        //学时是否通过审核
+        ClassGradeUser gradeUser = iClassGradeUserService
+                .getOne(new LambdaQueryWrapper<ClassGradeUser>()
+                        .eq(ClassGradeUser::getUserId, user.getUserId())
+                        .eq(ClassGradeUser::getGradeId, orderGoods.getGradeId())
+                        .eq(ClassGradeUser::getOrderGoodsId, orderGoods.getOrderGoodsId())
+                        .ge(ClassGradeUser::getPeriodStatus,1)
+                        .last("limit 1"));
+        if (ObjectUtil.isNull(gradeUser)){
             throw new CustomException("该学员未学完,不能预约考试!");
         }
 
         //查询是否已预约考试
         ExamApplyQueryBo queryBo = new ExamApplyQueryBo();
         queryBo.setUserId(user.getUserId());
-        queryBo.setGoodsId(applyOrder.getGoodsId());
-        queryBo.setOrderGoodsId(applyOrder.getOrderGoodsId());
+        queryBo.setGoodsId(orderGoods.getGoodsId());
+        queryBo.setOrderGoodsId(orderGoods.getOrderGoodsId());
         Integer countHaveSubscribe = examApplyMapper.countHaveSubscribe(queryBo);
         if (countHaveSubscribe > 0) {
             throw new CustomException("您所报考的专业,已经预约成功,您可在“我的-我的考试预约”中查询详情");
@@ -2474,8 +2517,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
 
         //考场信息
         UserSubscribe add = new UserSubscribe();
-        add.setOrderGoodsId(applyOrder.getOrderGoodsId());
-        add.setGoodsId(applyOrder.getGoodsId());
+        add.setOrderGoodsId(orderGoods.getOrderGoodsId());
+        add.setGoodsId(orderGoods.getGoodsId());
         add.setUserId(user.getUserId());
         add.setSeatNumber(tNum.toString());
         add.setApplyId(examApply.getApplyId());
@@ -2483,7 +2526,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         add.setApplySiteEndTime(bo.getApplyEndTime());
         add.setApplySiteExamTime(bo.getApplyTime());
         add.setSiteId(site.getSiteId());
-        add.setExamExpend(1);
+        add.setExamExpend(0);
         add.setApplySiteAddress(site.getSiteAddress());
         add.setSubscribeStatus(1);
         add.setExamStatus(0);
@@ -2512,41 +2555,27 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         if (ObjectUtil.isNull(examApply)){
             throw new CustomException("考场信息查询不到!请检查");
         }
-        List<Long> goodsIds = iExamApplyService.getApplyGoodsId(examApply.getApplyId(),bo.getMajorName());
-        if (CollectionUtils.isEmpty(goodsIds)){
-            throw new CustomException("该专业下找不到考试对应的课程!请检查");
-        }
 
         //是否存在订单
-        List<OrderGoods> orderGoodsList = iOrderGoodsService.getApplyOrderGoods(goodsIds,user.getUserId());
-        if (CollectionUtils.isEmpty(orderGoodsList)){
-            throw new CustomException("当前学员没有购买该专业下的课程!请检查");
-        }
-        OrderGoods applyOrder = null;
-        for (OrderGoods orderGoods : orderGoodsList) {
-            ClassGradeUser gradeUser = iClassGradeUserService
-                    .getOne(new LambdaQueryWrapper<ClassGradeUser>()
-                            .eq(ClassGradeUser::getUserId, user.getUserId())
-                            .eq(ClassGradeUser::getGradeId, orderGoods.getGradeId())
-                            .eq(ClassGradeUser::getOrderGoodsId, orderGoods.getOrderGoodsId())
-                            .last("limit 1"));
-            if (ObjectUtil.isNotNull(gradeUser)){
-                //学时是否通过审核
-                if (ObjectUtils.isNotNull(gradeUser.getPeriodStatus()) && gradeUser.getPeriodStatus() == 1){
-                    applyOrder = orderGoods;
-                }
-            }
-        }
-
-        if(Validator.isEmpty(applyOrder)){
+        OrderGoods orderGoods = iOrderGoodsService.getById(bo.getOrderGoodsId());
+
+        //学时是否通过审核
+        ClassGradeUser gradeUser = iClassGradeUserService
+                .getOne(new LambdaQueryWrapper<ClassGradeUser>()
+                        .eq(ClassGradeUser::getUserId, user.getUserId())
+                        .eq(ClassGradeUser::getGradeId, orderGoods.getGradeId())
+                        .eq(ClassGradeUser::getOrderGoodsId, orderGoods.getOrderGoodsId())
+                        .ge(ClassGradeUser::getPeriodStatus,1)
+                        .last("limit 1"));
+        if (ObjectUtil.isNull(gradeUser)){
             throw new CustomException("该学员未预约考试!");
         }
 
         //查询是否已预约考试
         ExamApplyQueryBo queryBo = new ExamApplyQueryBo();
         queryBo.setUserId(user.getUserId());
-        queryBo.setGoodsId(applyOrder.getGoodsId());
-        queryBo.setOrderGoodsId(applyOrder.getOrderGoodsId());
+        queryBo.setGoodsId(orderGoods.getGoodsId());
+        queryBo.setOrderGoodsId(orderGoods.getOrderGoodsId());
         UserSubscribe subscribe = examApplyMapper.getHaveSubscribe(queryBo);
         if (ObjectUtils.isNull(subscribe)) {
             throw new CustomException("该学员未预约考试,请检查数据!");

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

@@ -117,4 +117,9 @@ public class UserVisitLogServiceImpl extends ServiceImpl<UserVisitLogMapper, Use
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public UserVisitLog getOneNoTenant(Long userId) {
+        return baseMapper.getOneNoTenant(userId);
+    }
 }

+ 108 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/CdUserStudyLogVo.java

@@ -0,0 +1,108 @@
+package com.zhongzheng.modules.user.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 用户学习记录添加对象 cd_user_study_log
+ *
+ * @author ruoyi
+ * @date 2023-09-12
+ */
+@Data
+@ApiModel("用户学习记录添加对象")
+public class CdUserStudyLogVo {
+
+    /** 真实姓名 */
+    @ApiModelProperty("真实姓名")
+    private String realname;
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
+    /** 录单订单编号 */
+    @ApiModelProperty("录单订单编号")
+    private String inputOrderSn;
+    /** 新B端培训计划ID */
+    @ApiModelProperty("新B端培训计划ID")
+    private Long planId;
+    /** 手机号码 */
+    @ApiModelProperty("手机号码")
+    private String telphone;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 商品ID */
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+    /** 总学时 */
+    @ApiModelProperty("总学时")
+    private Long totalClassHour;
+    /** 已学学时 */
+    @ApiModelProperty("已学学时")
+    private Long studyClassHour;
+    /** 统计日期时间 */
+    @ApiModelProperty("统计日期时间")
+    private Long dateTime;
+    /** 0 失效 1启用 */
+    @ApiModelProperty("0 失效 1启用")
+    private Integer status;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 头像 */
+    @ApiModelProperty("头像")
+    private String avatar;
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+    /** 来源平台 1新系统 2旧系统 */
+    @ApiModelProperty("来源平台 1新系统 2旧系统")
+    private Integer fromPlat;
+    /** 试卷总题数(含主观题) */
+    @ApiModelProperty("试卷总题数(含主观题)")
+    private Long totalQuestionNum;
+    /** 做对总题数 */
+    @ApiModelProperty("做对总题数")
+    private Long rightQuestionNum;
+    /** 做的题目数(含主观题) */
+    @ApiModelProperty("做的题目数(含主观题)")
+    private Long doQuestionNum;
+    /** 做错题目数 */
+    @ApiModelProperty("做错题目数")
+    private Long errorQuestionNum;
+    /** 总分 */
+    @ApiModelProperty("总分")
+    private BigDecimal totalScore;
+    /** 得分 */
+    @ApiModelProperty("得分")
+    private Long performance;
+    @ApiModelProperty("上线时间")
+    private Long onlineTime;
+    @ApiModelProperty("今天学习时长秒数")
+    private Long studyTime;
+    @ApiModelProperty("七大员年份")
+    private String sevenYear;
+    @ApiModelProperty("是否报名考试 0没有 1有")
+    private Integer applyExamStatus;
+    @ApiModelProperty("考试通过状态 0没有 1有")
+    private Integer passExamStatus;
+    @ApiModelProperty("考试补考状态 0没有 1有")
+    private Integer resitExamStatus;
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("试卷数量")
+    private Long examNum;
+    /** 已学学时 */
+    @ApiModelProperty("已做题目")
+    private Long recordNum;
+    private Long gradeId;
+    private String tenantId;
+}

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

@@ -299,8 +299,8 @@ public class UserVo {
 
 	public void setNull(){
 		this.setOpenId(null);
-		this.setIdCardImg1(null);
-		this.setIdCardImg2(null);
+/*		this.setIdCardImg1(null);
+		this.setIdCardImg2(null);*/
 		this.setCertifiedTime(null);
 		this.setGzhOpenId(null);
 	/*	if(this.getTelphone()!=null){

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -1081,7 +1081,8 @@ public class WxPayServiceImpl implements IWxPayService {
         }
         //增加考试次数
         if (goodsVo.getGoodsType().equals(3)) {
-            if (ObjectUtils.isNotNull(goodsVo.getUnifySign()) && goodsVo.getUnifySign() == 1 && ObjectUtils.isNotNull(g.getSubOrderGoodsId())){
+            if (ObjectUtils.isNotNull(goodsVo.getUnifySign()) && goodsVo.getUnifySign() == 1
+                    && ObjectUtils.isNotNull(g.getSubOrderGoodsId())){
                 //统一补考商品标识 补充考试次数
                 UserExamGoods examGoods = userExamGoodsService
                         .getOne(new LambdaQueryWrapper<UserExamGoods>()

+ 2 - 1
zhongzheng-system/src/main/resources/mapper/modules/activity/ActivityRecommendMapper.xml

@@ -56,7 +56,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             g.code,
             g.year,
             g.spec_template_id,
-            g.cover_url
+            g.cover_url,
+            g.goods_type
         FROM
             activity_recommend_goods rg
                 LEFT JOIN goods g ON rg.goods_id = g.goods_id

+ 20 - 1
zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml

@@ -215,6 +215,12 @@
         <result property="subjectNames" column="subject_names"/>
         <result property="sectionNum" column="section_num"/>
         <result property="goodsLearningOrder" column="goods_learning_order"/>
+        <result property="idCard" column="id_card" typeHandler="com.zhongzheng.common.type.EncryptHandler"/>
+        <result property="telPhone" column="telphone" typeHandler="com.zhongzheng.common.type.EncryptHandler"/>
+        <result property="startTime" column="start_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="openGoodsTime" column="open_goods_time"/>
+        <result property="oldOrderSn" column="old_order_sn"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.grade.vo.ClassGradeVo" id="ClassGradeVoResult">
@@ -594,13 +600,17 @@
         og.order_goods_id,
         og.grade_id,
         IFNULL(ge.exam_num,0) as exam_num,
-        (SELECT COUNT(DISTINCT ubr.module_id,ubr.chapter_id,ubr.exam_id) FROM user_bank_record ubr  where ubr.`status`=1 and ubr.`type` in (1,3) and ubr.report_status=1 and ubr.grade_id = og.grade_id and ubr.user_id = o.user_id and ubr.current_status = 1) as record_num
+        og.create_time as open_goods_time,
+        (SELECT COUNT(DISTINCT ubr.module_id,ubr.chapter_id,ubr.exam_id) FROM user_bank_record ubr  where ubr.`status`=1 and ubr.`type` in (1,3) and ubr.report_status=1 and ubr.grade_id = og.grade_id and ubr.user_id = o.user_id and ubr.current_status = 1) as record_num,
+        (SELECT cgu.period_wait_time FROM class_grade_user cgu  where cgu.`status`=1  and cgu.grade_id = og.grade_id and cgu.user_id = o.user_id and cgu.order_goods_id = og.order_goods_id) as end_time,
+        oi.old_order_sn
         FROM
         `order` o
         LEFT JOIN `user` u ON u.user_id = o.user_id
         LEFT JOIN order_goods og ON og.order_sn = o.order_sn
         LEFT JOIN goods g on og.goods_id = g.goods_id
         LEFT JOIN course_business cb on g.business_id = cb.id
+        LEFT JOIN order_input oi on oi.input_order_sn = o.input_order_sn
         LEFT JOIN (SELECT
         COUNT( m.id ) AS exam_num,
         c.goods_id
@@ -652,6 +662,15 @@
         <if test="telphone != null and telphone !='' ">
             AND u.telphone = #{telphone,typeHandler=com.zhongzheng.common.type.EncryptHandler}
         </if>
+        <if test="oldOrderSn != null and oldOrderSn != ''">
+            AND oi.old_order_sn = #{oldOrderSn}
+        </if>
+        <if test="studyFinishStatus != null and studyFinishStatus == 1">
+            AND (SELECT cgu.period_wait_time FROM class_grade_user cgu  where cgu.`status`=1  and cgu.grade_id = og.grade_id and cgu.user_id = o.user_id and cgu.order_goods_id = og.order_goods_id) >0
+        </if>
+        <if test="studyFinishStatus != null and studyFinishStatus == 2">
+            AND (SELECT cgu.period_wait_time FROM class_grade_user cgu  where cgu.`status`=1  and cgu.grade_id = og.grade_id and cgu.user_id = o.user_id and cgu.order_goods_id = og.order_goods_id) is null
+        </if>
         order by og.create_time desc
     </select>
 

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

@@ -837,6 +837,44 @@
           AND tenant_id = #{tenantId}
     </select>
 
+    <select id="getRelevanceGoodsNoTenant" parameterType="map" resultType="com.zhongzheng.modules.goods.domain.Goods">
+        SELECT
+            g.*
+        FROM
+            goods g
+                LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+                LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+                LEFT JOIN course_business cb ON g.business_id = cb.id
+                LEFT JOIN major m ON g.major_id = m.id
+        WHERE
+            g.`status` = 1
+          AND g.goods_status = 1
+          AND INSTR(#{businessName}, cet.education_name)
+          AND INSTR(#{businessName}, cpt.project_name)
+          AND INSTR(#{majName}, m.category_name)
+          AND g.goods_id != #{goodsId}
+    </select>
+
+
+    <select id="getRelGoodsNoTenant" parameterType="map" resultType="com.zhongzheng.modules.goods.domain.Goods">
+        SELECT
+            g.*
+        FROM
+            goods g
+                LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+                LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+                LEFT JOIN course_business cb ON g.business_id = cb.id
+                LEFT JOIN major m ON g.major_id = m.id
+        WHERE
+            g.`status` = 1
+            AND INSTR(#{businessName}, cet.education_name)
+            AND INSTR(#{businessName}, cpt.project_name)
+            AND INSTR(#{categoryName}, m.category_name)
+            AND INSTR(#{businessName},cb.business_name)
+            AND g.tenant_id = #{tenantId}
+            AND INSTR(g.goods_name,'测试') &lt;= 0
+    </select>
+
     <select id="queryGoodsByTenant" parameterType="map" resultType="com.zhongzheng.modules.goods.domain.Goods">
         SELECT *
         FROM `goods`

+ 15 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeGoodsMapper.xml

@@ -26,4 +26,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
     </select>
 
+    <select id="getClassNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.grade.domain.ClassGradeGoods">
+        SELECT cgg.* FROM class_grade_goods cgg
+        WHERE
+            cgg.goods_id in
+            <foreach collection="goodsIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+    </select>
+
+    <select id="getOneNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.grade.domain.ClassGradeGoods">
+        SELECT cgg.* FROM class_grade_goods cgg
+        WHERE
+        cgg.grade_id = #{gradeId}
+    </select>
+
 </mapper>

+ 56 - 2
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -1066,8 +1066,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             cg.*
         FROM
             class_grade cg
-        where cg.official_name = #{registerCode}
-          AND (SELECT COUNT(*) FROM sys_old_org sog WHERE sog.tenant_id = cg.tenant_id AND sog.share_class = 1) > 0
+        where cg.official_name = #{officialName}
+          AND (SELECT COUNT(*) FROM sys_tenant s WHERE s.tenant_id = cg.tenant_id AND s.share_class = 1) > 0
     </select>
 
     <update id="UpGradeStatusByTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeOpenUpBo" >
@@ -1292,4 +1292,58 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             cg.`status` != - 1
 	        AND cg.seven_code = #{sevenCode}
     </select>
+
+    <select id="listByIdsNoTenant" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="java.lang.Long">
+        SELECT
+            cg.*
+        FROM
+            class_grade cg
+        WHERE
+            cg.`status` != - 1
+            AND cg.grade_id in
+            <foreach collection="ids" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+    </select>
+
+    <select id="getListNoTenant" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="map">
+        SELECT
+            *
+        FROM
+            class_grade
+        WHERE
+            `status` = 1
+          AND seven_code = #{sevenCode}
+          AND grade_id != #{gradeId}
+    </select>
+
+    <update id="updateByIdNoTenant" parameterType="com.zhongzheng.modules.grade.domain.ClassGrade">
+        UPDATE class_grade
+        SET class_status = #{classStatus},
+            official_name = #{officialName},
+            class_name = #{className},
+            student_upper = #{studentUpper},
+            learning_time_start = #{learningTimeStart},
+            learning_status = #{learningStatus},
+            `status` = #{status},
+            class_start_time = #{classStartTime},
+            class_end_time = #{classEndTime},
+            examine_id = #{examineId},
+            areas_id = #{areasId}
+        WHERE
+            grade_id = #{gradeId}
+    </update>
+
+    <select id="getCodeNoTenant" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="map">
+        SELECT
+            *
+        FROM
+            class_grade
+        WHERE
+            `status` = 1
+            AND official_name = #{officialName}
+            AND tenant_id = #{tenantId}
+            LIMIT 1
+    </select>
+
 </mapper>

+ 49 - 14
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml

@@ -342,6 +342,42 @@
         order by u.create_time desc
     </select>
 
+    <select id="listUserNoTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo"
+            resultMap="ClassGradeUserGoodsVoResult">
+        SELECT
+        * ,
+        (select `code` FROM goods g LEFT JOIN class_grade_goods c on g.goods_id = c.goods_id where c.grade_id =
+        u.grade_id) as goods_code,
+        (select `year` FROM goods g LEFT JOIN class_grade_goods c on g.goods_id = c.goods_id where c.grade_id =
+        u.grade_id) as year,
+        (select goods_name FROM goods g LEFT JOIN class_grade_goods c on g.goods_id = c.goods_id where c.grade_id =
+        u.grade_id) as goods_name,
+        (select b.business_name FROM course_business b LEFT JOIN goods g on b.id = g.business_id LEFT JOIN
+        class_grade_goods c on g.goods_id = c.goods_id where c.grade_id = u.grade_id) as business_name,
+        (select b.project_name FROM course_project_type b LEFT JOIN goods g on b.id = g.project_id LEFT JOIN
+        class_grade_goods c on g.goods_id = c.goods_id where c.grade_id = u.grade_id) as project_name,
+        (select b.school_name FROM school b LEFT JOIN goods g on b.id = g.school_id LEFT JOIN class_grade_goods c on
+        g.goods_id = c.goods_id where c.grade_id = u.grade_id) as school_name,
+        (select b.education_name FROM course_education_type b LEFT JOIN goods g on b.id = g.education_type_id LEFT JOIN
+        class_grade_goods c on g.goods_id = c.goods_id where c.grade_id = u.grade_id) as education_name,
+        (SELECT g.grade_code FROM class_grade g where u.grade_id = g.grade_id) as grade_code,
+        (SELECT g.class_name FROM class_grade g where u.grade_id = g.grade_id) as grade_name,
+        (SELECT g.status FROM class_grade g where u.grade_id = g.grade_id) as grade_status
+        FROM
+        class_grade_user u
+        where 1=1
+        <if test="status != null and status.size()!=0 ">
+            AND u.status in
+            <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="userId != null and userId != ''">
+            and u.user_id= #{userId}
+        </if>
+        order by u.create_time desc
+    </select>
+
     <select id="listUserVideoRecord" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo"
             resultMap="ClassPeriodStudentVo">
         SELECT
@@ -1364,22 +1400,21 @@
 
     <select id="selectStart" parameterType="map" resultType="long">
         SELECT
-            usr.create_time
-        FROM
-            user_study_record usr
-        WHERE
-            usr.goods_id = #{goodsId}
-          AND usr.grade_id = #{gradeId}
-          AND usr.user_id = #{userId} UNION
-        SELECT
-            ubr.create_time
+            rp.create_time
         FROM
-            user_bank_record ubr
+            user_study_record_photo rp
+                LEFT JOIN user_period_status ups ON rp.period_id = ups.id
+                LEFT JOIN user_period up ON up.id = ups.period_id
         WHERE
-            ubr.goods_id =#{goodsId}
-          AND ubr.grade_id = #{gradeId}
-          AND ubr.user_id = #{userId}
-        ORDER BY create_time ASC
+            1=1
+        <if test="orderGoodsId != null ">
+            AND (up.order_goods_id = #{orderGoodsId} or up.order_goods_id is null)
+        </if>
+          AND ups.period_status = 1
+          AND up.grade_id = #{gradeId}
+          AND up.user_id = #{userId}
+        ORDER BY
+            rp.create_time ASC
     </select>
 
     <select id="selectEnd" parameterType="map" resultType="long">

+ 47 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

@@ -480,6 +480,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LIMIT 1
     </select>
 
+    <select id="getSevenGradeNoTenant" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="java.lang.Long">
+        SELECT cg.* FROM class_grade cg
+        WHERE cg.`status` = 1 AND (
+        (SELECT COUNT(DISTINCT cgu.user_id) FROM class_grade_user cgu WHERE cgu.grade_id = cg.grade_id AND cgu.`status` = 1 AND cgu.change_grade = 0) +
+        (SELECT COUNT(DISTINCT cgut.user_id) FROM class_grade_user_temp cgut WHERE cgut.grade_id = cg.grade_id AND cgut.`status` = 1 )
+        ) <![CDATA[   <  ]]> cg.student_upper AND cg.grade_id IN
+        <foreach collection="gradeIds" item="item" index="index" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        LIMIT 1
+    </select>
+
     <select id="getStudeCountByCode" resultType="java.lang.Integer" parameterType="java.lang.String">
         SELECT SUM(
                            (SELECT COUNT(DISTINCT cgu.user_id) FROM class_grade_user cgu WHERE cgu.grade_id = cg.grade_id AND cgu.`status` = 1 AND cgu.change_grade = 0) +
@@ -488,6 +500,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE cg.`status` = 1 AND  cg.seven_code = #{sevenCode}
     </select>
 
+    <select id="getStudeCountByCodeNoTenant" resultType="java.lang.Integer" parameterType="java.lang.String">
+        SELECT SUM(
+                           (SELECT COUNT(DISTINCT cgu.user_id) FROM class_grade_user cgu WHERE cgu.grade_id = cg.grade_id AND cgu.`status` = 1 AND cgu.change_grade = 0) +
+                           (SELECT COUNT(DISTINCT cgut.user_id) FROM class_grade_user_temp cgut WHERE cgut.grade_id = cg.grade_id AND cgut.`status` = 1 )
+                   ) as num FROM class_grade cg
+        WHERE cg.`status` = 1 AND  cg.seven_code = #{sevenCode}
+    </select>
+
     <select id="getClassNameByGoods" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="java.lang.Long">
         SELECT
             cg.*
@@ -514,4 +534,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 ) + ( SELECT COUNT( DISTINCT cgut.user_id ) FROM class_grade_user_temp cgut WHERE cgut.grade_id = cg.grade_id AND cgut.`status` = 1 )
             ) <![CDATA[ < ]]>  cg.student_upper
     </select>
+
+    <select id="getClassNameByGoodsNotTenant" resultType="com.zhongzheng.modules.grade.domain.ClassGrade" parameterType="java.lang.Long">
+        SELECT
+            cg.*
+        FROM
+            class_grade cg
+                LEFT JOIN class_grade_goods cgg ON cg.grade_id = cgg.grade_id
+                LEFT JOIN goods g ON cgg.goods_id = g.goods_id
+        WHERE
+            cg.`status` = 1
+          AND g.education_type_id = #{educationTypeId}
+          AND g.project_id = #{projectId}
+          AND g.business_id = #{businessId}
+          AND major_id = #{majorId}
+          AND (
+                      (
+                          SELECT
+                              COUNT( DISTINCT cgu.user_id )
+                          FROM
+                              class_grade_user cgu
+                          WHERE
+                              cgu.grade_id = cg.grade_id
+                            AND cgu.`status` = 1
+                            AND cgu.change_grade = 0
+                      ) + ( SELECT COUNT( DISTINCT cgut.user_id ) FROM class_grade_user_temp cgut WHERE cgut.grade_id = cg.grade_id AND cgut.`status` = 1 )
+                  ) <![CDATA[ < ]]>  cg.student_upper
+    </select>
 </mapper>

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

@@ -36,5 +36,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         from sys_tenant where (host_pc = #{hostPc} or host_h5 = #{hostH5} or host_live = #{hostLive} or host_h5_seller = #{hostH5Seller} or host_admin = #{hostAdmin})
     </select>
 
+    <select id="getListNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.system.domain.SysTenant">
+        SELECT * FROM sys_tenant WHERE share_class = 1 AND `status` = 1 AND tenant_id != #{tenantId}
+    </select>
+
 
 </mapper>

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

@@ -305,6 +305,165 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY u.user_id DESC
     </select>
 
+    <select id="selectListNoTenant" parameterType="com.zhongzheng.modules.user.bo.UserQueryBo" resultMap="UserResult">
+        SELECT DISTINCT
+        u.*,
+        (case WHEN u.union_id is null then 0 ELSE 1 end) as user_bind_wx
+        <if test="getOrderNum != null and getOrderNum == 1" >
+            ,ou.goods_course_num,ou.goods_bank_num,ou.goods_live_num
+        </if>
+        FROM
+        `user` u
+
+        <if test="getOrderNum != null and getOrderNum == 1" >
+            LEFT JOIN (
+            SELECT
+            sum( CASE WHEN g.goods_type = 1 THEN 1 ELSE 0 END ) AS goods_course_num,
+            sum( CASE WHEN g.goods_type = 2 THEN 1 ELSE 0 END ) AS goods_bank_num,
+            sum( CASE WHEN g.goods_type = 6 THEN 1 ELSE 0 END ) AS goods_live_num,
+            o.user_id
+            FROM
+            `order` o
+            LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+            LEFT JOIN goods g ON og.goods_id = g.goods_id
+            WHERE o.`status` = 1
+            AND og.refund_status in (0,1,3)
+            AND og.pay_status in (2,3,4)
+            GROUP BY
+            o.user_id
+            ) ou ON u.user_id = ou.user_id
+        </if>
+        <if test="businessId != null and businessId != ''">
+            LEFT JOIN `order` o ON u.user_id = o.user_id and o.`status` = 1
+            LEFT JOIN order_goods og ON o.order_sn = og.order_sn and og.`status` = 1
+            LEFT JOIN goods g ON og.goods_id = g.goods_id
+        </if>
+        WHERE
+        1 = 1
+        <if test="status != null and status.size()!=0 ">
+            AND u.status in
+            <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="businessId != null and businessId != ''">
+            and og.`status` = 1
+            and og.refund_status in (0,1,3)
+            and og.pay_status in (2,3,4)
+            AND g.business_id = #{businessId}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND u.create_time &gt; #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND u.create_time &lt; #{endTime}
+        </if>
+        <if test="userKerWord != null and userKerWord != ''" >
+            AND (u.realname like concat('%', #{userKerWord}, '%') OR u.telphone like concat('%', #{userKerWord,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%') OR u.id_card like concat('%', #{userKerWord,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%'))
+        </if>
+        <if test="nickname != null and nickname != ''" >
+            AND u.nickname like concat('%', #{nickname}, '%')
+        </if>
+        <if test="telphone != null and telphone != ''" >
+            AND u.telphone like concat('%', #{telphone,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%')
+        </if>
+        <if test="idCard != null and idCard != ''" >
+            AND u.id_card like concat('%', #{idCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%')
+        </if>
+        <if test="realname != null and realname != ''" >
+            AND u.realname like concat('%', #{realname}, '%')
+        </if>
+        <if test="companyName != null and companyName != ''" >
+            AND u.company_name like concat('%', #{companyName}, '%')
+        </if>
+        <if test="userId != null and userId != ''" >
+            AND u.user_id = #{userId}
+        </if>
+        <if test="empty != null and empty != ''" >
+            and u.realname is NOT NULL
+        </if>
+        <if test="goodsSearchKey != null and goodsSearchKey != ''" >
+            and ( SELECT
+            count(og.*)
+            FROM
+            `order` o
+            LEFT JOIN order_goods og on o.order_sn = og.order_sn
+            where 1=1
+            and og.`status` = 1
+            and og.refund_status in (0,1,3)
+            and og.pay_status in (2,3,4))
+            and (g.goods_name like concat('%', #{goodsSearchKey}, '%') or g.code like concat('%', #{goodsSearchKey}, '%'))
+            and o.user_id = u.user_id)>0
+        </if>
+        <if test="goodsSearchKey != null and goodsSearchKey != ''" >
+            and ( SELECT
+            count(*)
+            FROM
+            `order` o
+            LEFT JOIN order_goods og on o.order_sn = og.order_sn
+            LEFT JOIN goods g on og.goods_id = g.goods_id
+            where 1=1
+            and og.`status` = 1
+            and og.refund_status in (0,1,3)
+            and og.pay_status in (2,3,4)
+            and (g.goods_name like concat('%', #{goodsSearchKey}, '%') or g.code like concat('%', #{goodsSearchKey}, '%'))
+            and o.user_id = u.user_id)>0
+        </if>
+        <if test="gradePoint != null and gradePoint == 1" >
+            AND (SELECT COUNT(u.user_id) FROM class_grade_user cgu where 1=1 AND u.status in (1) and cgu.user_id= u.user_id) > 0
+        </if>
+        <if test="gradePoint != null and gradePoint == 2" >
+            AND (SELECT COUNT(u.user_id) FROM class_grade_user cgu where 1=1 AND u.status in (1) and cgu.user_id= u.user_id) = 0
+        </if>
+        <if test="searchKey != null and searchKey != '' and searchType == 0 ">
+            and (u.realname like concat('%', #{searchKey}, '%') or u.id_card like concat('%', #{searchKey,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%'))
+        </if>
+        <if test="idCards != null and idCards.size()!=0 and searchType == 0" >
+            AND u.id_card in
+            <foreach collection="idCards" item="item" index="index" open="(" close=")" separator=",">
+                #{item,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+            </foreach>
+        </if>
+        <if test="searchType == 1" >
+            and (u.realname like concat('%', #{searchKey}, '%') or u.id_card like concat('%', #{searchKey,typeHandler=com.zhongzheng.common.type.EncryptHandler}, '%') or
+            u.id_card in
+            <foreach collection="idCards" item="item" index="index" open="(" close=")" separator=",">
+                #{item,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+            </foreach>)
+        </if>
+        <if test="hasBindWx != null and hasBindWx == 1 ">
+            AND u.union_id is not null
+        </if>
+        <if test="hasBindWx != null and hasBindWx == 0 ">
+            AND u.union_id is null
+        </if>
+        <if test="visitStartTime != null and visitStartTime !=''">
+            and (SELECT
+            count(*)
+            FROM user_visit_log where user_id = u.user_id and create_time>= #{visitStartTime}  and #{visitEndTime} >= create_time)>0
+        </if>
+        <if test="studyStartTime != null and studyStartTime !=''">
+            and (SELECT
+            count(*)
+            FROM user_study_log where user_id = u.user_id and create_time>= #{studyStartTime}  and #{studyEndTime} >= create_time)>0
+        </if>
+        <if test="gradeName != null and gradeName != ''">
+            and ( SELECT
+            count(*)
+            FROM
+            `order` o
+            LEFT JOIN order_goods og on o.order_sn = og.order_sn
+            LEFT JOIN class_grade cg on cg.grade_id = og.grade_id
+            where 1=1
+            and og.`status` = 1
+            and og.refund_status in (0,1,3)
+            and og.pay_status in (2,3,4)
+            and (cg.class_name like concat('%', #{gradeName}, '%'))
+            and o.user_id = u.user_id)>0
+        </if>
+        ORDER BY u.user_id DESC
+    </select>
+
 
     <select id="selectStudyRecordList" resultMap="StudyRecordResult">
         SELECT

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyLogMapper.xml

@@ -58,4 +58,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         usl.id desc
     </select>
 
+    <select id="getOneNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.domain.UserStudyLog">
+        SELECT * FROM user_study_log WHERE user_id = #{userId} ORDER BY id DESC limit 1
+    </select>
+
 </mapper>

+ 96 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -1892,4 +1892,100 @@
         WHERE
             gc.goods_id = #{goodsId} AND cm.`status` = 1
     </select>
+
+
+    <select id="syncUserDateStudyLog" parameterType="com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo"
+            resultType="com.zhongzheng.modules.user.vo.CdUserStudyLogVo">
+        SELECT
+            u.*,
+            og.seven_year,
+            o.input_order_sn,
+            o.plan_id
+        FROM
+        (
+        SELECT
+        order_goods_id,
+        any_value ( user_id ) user_id,
+        any_value ( usr.goods_id ) goods_id,
+        MIN( usr.create_time ) online_time,
+        (
+        MAX( USR.update_time )- MIN( usr.create_time )) study_time,
+        any_value ( tenant_id ) tenant_id
+        FROM
+        user_study_record usr
+        WHERE
+        usr.create_time <![CDATA[ >= ]]> #{startTime}
+        AND usr.update_time <![CDATA[ <= ]]> #{endTime}
+        GROUP BY
+        order_goods_id
+        ) u
+        LEFT JOIN order_goods og ON u.order_goods_id = og.order_goods_id
+        LEFT JOIN `order` o ON og.order_sn = o.order_sn
+    </select>
+
+    <select id="syncUserDateStudyExamLog" parameterType="com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo"
+            resultType="com.zhongzheng.modules.user.vo.CdUserStudyLogVo">
+        SELECT
+        u.*,
+        og.seven_year,
+        o.input_order_sn,
+        o.plan_id
+        FROM
+        (
+        SELECT
+        order_goods_id,
+        any_value ( user_id ) user_id,
+        any_value ( ubr.goods_id ) goods_id,
+        MIN( ubr.create_time ) online_time,
+        (
+        MAX( ubr.update_time )- MIN( ubr.create_time )) study_time,
+        any_value ( tenant_id ) tenant_id,
+        MAX( total_question_num ) total_question_num,
+        MAX( right_question_num ) right_question_num,
+        MAX( do_question_num ) do_question_num,
+        MAX( performance ) performance
+        FROM
+        user_bank_record ubr
+        WHERE
+        ubr.create_time <![CDATA[ >= ]]> #{startTime}
+        AND ubr.update_time <![CDATA[ <= ]]> #{endTime}
+        GROUP BY
+        order_goods_id
+        ) u
+        LEFT JOIN order_goods og ON u.order_goods_id = og.order_goods_id
+        LEFT JOIN `order` o ON og.order_sn = o.order_sn
+    </select>
+
+    <select id="syncUserList" parameterType="com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo"
+            resultType="com.zhongzheng.modules.user.vo.CdUserStudyLogVo">
+        SELECT
+            o.user_id,
+            og.order_goods_id,
+            o.plan_id,
+            og.goods_id,
+            o.input_order_sn,
+            og.seven_year,
+            g.goods_name,
+            o.tenant_id,
+               og.grade_id,
+               0 as study_time,
+               0 as online_time,
+            IFNULL(ge.exam_num,0) as exam_num,
+            (SELECT COUNT(DISTINCT ubr.module_id,ubr.chapter_id,ubr.exam_id) FROM user_bank_record ubr  where ubr.`status`=1 and ubr.`type` in (1,3) and ubr.report_status=1 and ubr.grade_id = og.grade_id and ubr.user_id = o.user_id and ubr.current_status = 1) as record_num
+        FROM
+            `order` o
+                LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+                LEFT JOIN goods g ON og.goods_id = g.goods_id
+                LEFT JOIN (SELECT
+                               COUNT( m.id ) AS exam_num,
+                               c.goods_id
+                           FROM
+                               course_menu_exam m
+                                   LEFT JOIN goods_course c ON m.course_id = c.course_id
+                           where
+                               m.type in (1,3)
+                           GROUP BY c.goods_id ) ge on og.goods_id = ge.goods_id
+        WHERE
+            o.plan_id > 0
+    </select>
 </mapper>

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

@@ -358,6 +358,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          limit 1
     </select>
 
+    <select id="selectAddSubscribeCount" parameterType="map"  resultType="Long">
+        SELECT
+            COUNT(us.subscribe_id)
+        FROM
+            user_subscribe us
+        WHERE 1=1
+          and ((us.subscribe_status =1 and us.exam_status =0) or us.result = 1)
+          and us.order_goods_id = #{orderGoodsId}
+          and us.user_id = #{userId}
+    </select>
+
     <select id="queryBusinessId" parameterType="map"  resultType="Long">
         SELECT
             COUNT( 1 )

+ 3 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserVisitLogMapper.xml

@@ -14,5 +14,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="dateTime" column="date_time"/>
     </resultMap>
 
+    <select id="getOneNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.domain.UserVisitLog">
+        SELECT * FROM user_visit_log WHERE user_id = #{userId} ORDER BY id DESC limit 1
+    </select>
 
 </mapper>