yangdamao 2 년 전
부모
커밋
8620d3b62b
100개의 변경된 파일2313개의 추가작업 그리고 226개의 파일을 삭제
  1. 0 79
      run-prod.sh
  2. 92 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstitutionController.java
  3. 10 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  4. 28 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  5. 0 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseEducationTypeController.java
  6. 18 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  7. 20 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  8. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInputController.java
  9. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/tool/TestController.java
  10. 37 43
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  11. 8 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ShoppingCartController.java
  12. 18 6
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  13. 1 1
      zhongzheng-common/pom.xml
  14. 2 5
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ServletUtils.java
  15. 20 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/ImageUtils.java
  16. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  17. 10 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  18. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java
  19. 30 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  20. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  21. 495 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  22. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ShoppingCartAddBo.java
  23. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ShoppingCartEditBo.java
  24. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/ShoppingCart.java
  25. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IShoppingCartService.java
  26. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ShoppingCartServiceImpl.java
  27. 6 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/ShoppingCartVo.java
  28. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CheckSectionWatchVo.java
  29. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java
  30. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java
  31. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseFile.java
  32. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseHandouts.java
  33. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseChapterSectionMapper.java
  34. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseFileMapper.java
  35. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseHandoutsMapper.java
  36. 5 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuExamMapper.java
  37. 3 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseModuleChapterMapper.java
  38. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseChapterSectionService.java
  39. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java
  40. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  41. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseMenuExamService.java
  42. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseModuleChapterService.java
  43. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseChapterSectionServiceImpl.java
  44. 8 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java
  45. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  46. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuExamServiceImpl.java
  47. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseModuleChapterServiceImpl.java
  48. 16 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionServiceImpl.java
  49. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java
  50. 36 13
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  51. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java
  52. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamBeforeKnowBo.java
  53. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java
  54. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java
  55. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  56. 96 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  57. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamBeforeKnowVo.java
  58. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamSessionVo.java
  59. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamUserApplyVo.java
  60. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java
  61. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  62. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  63. 379 28
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  64. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsConfigVo.java
  65. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  66. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  67. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  68. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  69. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  70. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  71. 2 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  72. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderBusinessConfigGoodsQueryBo.java
  73. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderBusinessConfigQueryBo.java
  74. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsMapper.java
  75. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  76. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderBusinessConfigServiceImpl.java
  77. 31 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  78. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderBusinessConfigGoodsVo.java
  79. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java
  80. 37 10
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  81. 0 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java
  82. 8 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/service/impl/TopOrderRecNoteServiceImpl.java
  83. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionAddBo.java
  84. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionEditBo.java
  85. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionQueryBo.java
  86. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/domain/TopInstitution.java
  87. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/mapper/TopInstitutionMapper.java
  88. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/service/ITopInstitutionService.java
  89. 124 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/service/impl/TopInstitutionServiceImpl.java
  90. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/vo/TopInstitutionVo.java
  91. 22 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeQueryBo.java
  92. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  93. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMapper.java
  94. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java
  95. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSubscribeMapper.java
  96. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  97. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordPhotoService.java
  98. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  99. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordPhotoServiceImpl.java
  100. 8 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

+ 0 - 79
run-prod.sh

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

+ 92 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstitutionController.java

@@ -0,0 +1,92 @@
+package com.zhongzheng.controller.top;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.modules.top.system.bo.TopInstitutionAddBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionEditBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionQueryBo;
+import com.zhongzheng.modules.top.system.service.ITopInstitutionService;
+import com.zhongzheng.modules.top.system.vo.TopInstitutionVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 职能机构Controller
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Api(value = "职能机构控制器", tags = {"职能机构管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/top/institution")
+public class TopInstitutionController extends BaseController {
+
+    private final ITopInstitutionService iTopInstitutionService;
+
+    /**
+     * 查询职能机构列表
+     */
+    @ApiOperation("查询职能机构列表")
+    @PreAuthorize("@ss.hasPermi('system:institution:list')")
+    @GetMapping("/list")
+    public TableDataInfo<TopInstitutionVo> list(TopInstitutionQueryBo bo) {
+        startPage();
+        List<TopInstitutionVo> list = iTopInstitutionService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 获取职能机构详细信息
+     */
+    @ApiOperation("获取职能机构详细信息")
+    @PreAuthorize("@ss.hasPermi('system:institution:query')")
+    @GetMapping("/{instId}")
+    public AjaxResult<TopInstitutionVo> getInfo(@PathVariable("instId" ) Long instId) {
+        return AjaxResult.success(iTopInstitutionService.queryById(instId));
+    }
+
+    /**
+     * 新增职能机构
+     */
+    @ApiOperation("新增职能机构")
+    @PreAuthorize("@ss.hasPermi('system:institution:add')")
+    @Log(title = "职能机构", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody TopInstitutionAddBo bo) {
+        return toAjax(iTopInstitutionService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改职能机构
+     */
+    @ApiOperation("修改职能机构")
+    @PreAuthorize("@ss.hasPermi('system:institution:edit')")
+    @Log(title = "职能机构", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody TopInstitutionEditBo bo) {
+        return toAjax(iTopInstitutionService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+
+}

+ 10 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -270,7 +270,7 @@ public class QuestionController extends BaseController {
         return AjaxResult.success(errorLog);
     }
 
-    @Log(title = "" +"", businessType = BusinessType.IMPORT)
+    @Log(title = "导入题目Word模板列表", businessType = BusinessType.IMPORT)
     @ApiOperation("导入题目Word模板列表")
     @PreAuthorize("@ss.hasPermi('system:question:import')")
     @PostMapping("/importWordQuestionList")
@@ -289,4 +289,13 @@ public class QuestionController extends BaseController {
         Map<String,Object> result = iQuestionService.importJJWordQuestionList(file,  eduId,  projectId,  businessId, subjectId);
         return AjaxResult.success(result);
     }
+
+    @ApiOperation("导入学监题目Word模板列表")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importXueJianWordQuestionList")
+    public AjaxResult<Map<String,Object>> importXueJianWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) throws Exception
+    {
+        Map<String,Object> result = iQuestionService.importXueJianWordQuestionList(file,  eduId,  projectId,  businessId, subjectId);
+        return AjaxResult.success(result);
+    }
 }

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

@@ -33,6 +33,8 @@ import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
 import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
 import com.zhongzheng.modules.exam.bo.ExamApplyResultBo;
+import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
+import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.vo.ExamApplyDetailVo;
 import com.zhongzheng.modules.goods.bo.AlikeGoodsBo;
@@ -67,6 +69,7 @@ import com.zhongzheng.modules.system.vo.SysTenantVo;
 import com.zhongzheng.modules.top.user.bo.TopSysTenantRegisterAddBo;
 import com.zhongzheng.modules.top.user.service.ITopSysTenantRegisterService;
 import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import io.swagger.annotations.ApiOperation;
@@ -139,6 +142,8 @@ public class CommonController extends BaseController {
     @Autowired
     private IExamApplyService iExamApplyService;
     @Autowired
+    private IUserSubscribeService iUserSubscribeService;
+    @Autowired
     private IClassGradeUserService iClassGradeUserService;
 
     /**
@@ -269,6 +274,28 @@ public class CommonController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("七大员考试预约")
+    @PostMapping("common/apply/subscribe")
+    public AjaxResult examApplySubscribe(@RequestBody ExamApplySubscribeBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        ServletUtils.getResponse().setHeader("TenantId",bo.getTenantId().toString());
+        iUserSubscribeService.examApplySubscribe(bo);
+        return AjaxResult.success();
+    }
+
+
+    @ApiOperation("学员学时图片修改")
+    @PostMapping("common/student/image/update")
+    public AjaxResult updateStudentImage(@RequestBody UpdateStudentImageBo bo) {
+//        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+//            return AjaxResult.error("签名错误");
+//        }
+        String base = iUserSubscribeService.updateStudentImage(bo);
+        return AjaxResult.success(base);
+    }
+
 
     @ApiOperation("获取某场考试信息")
     @PostMapping("common/apply/detail")
@@ -621,4 +648,5 @@ public class CommonController extends BaseController {
         List<GoodsVo> list = iGoodsService.selectList(bo);
         return getDataTable(list);
     }
+
 }

+ 0 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseEducationTypeController.java

@@ -56,7 +56,6 @@ public class CourseEducationTypeController extends BaseController {
     @GetMapping("/allList")
     public TableDataInfo<CourseEducationTypeVo> allList(CourseEducationTypeQueryBo bo) {
         startPage();
-        bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
         List<CourseEducationTypeVo> list = iCourseEducationTypeService.queryAllList(bo);
         return getDataTable(list);
     }

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

@@ -69,6 +69,24 @@ public class ExamApplyController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 获取七大员考前需知
+     */
+    @ApiOperation("获取七大员考前需知")
+    @GetMapping("/before/know")
+    public AjaxResult<ExamBeforeKnowVo> getBeforeKnow() {
+        return AjaxResult.success(iExamApplyService.getBeforeKnow());
+    }
+
+    /**
+     * 七大员考前需知新增/修改
+     */
+    @ApiOperation("七大员考前需知新增/修改")
+    @PostMapping("/saveorup/before/know")
+    public AjaxResult<Void> saveOrUpBeforeKnow(@RequestBody ExamBeforeKnowBo bo) {
+        return toAjax(iExamApplyService.saveOrUpBeforeKnow(bo)? 1 : 0);
+    }
+
     /**
      * 考场邮件信息
      */

+ 20 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -346,6 +346,15 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.goodsNodeCopyAddTenant(bo) ? 1 : 0);
     }
 
+    /**
+     * 商品讲义复制
+     */
+    @ApiOperation("商品讲义复制")
+    @PostMapping("/handouts/copy/add")
+    public AjaxResult<Void> goodsHandoutsCopyAddTenant(@RequestBody GoodsHandoutsCopyTenantBo bo) {
+        return toAjax(iGoodsService.goodsHandoutsCopyAddTenant(bo) ? 1 : 0);
+    }
+
     /**
      * 商品关系ID处理(全量复制后的处理方法)
      */
@@ -374,4 +383,15 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.updateGoodsRepair(bo) ? 1 : 0);
     }
 
+    @ApiOperation("查询商品普通列表")
+    @PreAuthorize("@ss.hasPermi('system:goods:list')")
+    @GetMapping("/queryList")
+    public AjaxResult<List<GoodsVo>> queryList(GoodsQueryBo bo) {
+        bo.setStatus(new ArrayList<Integer>(){{
+            add(1);
+        }});
+        List<GoodsVo> list = iGoodsService.queryList(bo);
+        return AjaxResult.success(list);
+    }
+
 }

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInputController.java

@@ -76,7 +76,7 @@ public class OrderInputController extends BaseController {
     /**
      * 新增录单
      */
-    @ApiOperation("新增录单")
+    @ApiOperation("获取新增录单单号")
     @PreAuthorize("@ss.hasPermi('system:input:add')")
     @Log(title = "录单", businessType = BusinessType.INSERT)
     @PostMapping()

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/tool/TestController.java

@@ -60,7 +60,7 @@ public class TestController extends BaseController
     @PostMapping("/zip")
     public AjaxResult zip(UserEntity user)
     {
-    //    ossService.zipPeopleDownload(18L,523L,"李盛仁","445224199901040003");
+        ossService.processObject("oss/images/avatar/318/1686645474183_748829657","oss/images/avatar/318/1686645474183_748829657","image/rotate,90");
         return AjaxResult.success(users.put(user.getUserId(), user));
     }
 

+ 37 - 43
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java

@@ -1,53 +1,36 @@
 package com.zhongzheng.controller.user;
 
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.zhongzheng.common.core.domain.model.LoginUser;
-import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
-import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
-import com.zhongzheng.modules.exam.bo.ExamApplyGoodsQueryBo;
-import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
-import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
-import com.zhongzheng.modules.exam.vo.ExamApplyVo;
-import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
-import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
-import com.zhongzheng.modules.grade.vo.ClassStudentExportVo;
-import com.zhongzheng.modules.user.bo.*;
-import com.zhongzheng.modules.user.domain.UserBankRecord;
-import com.zhongzheng.modules.user.service.IUserExamGoodsService;
-import com.zhongzheng.modules.user.vo.*;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
-import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
-import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
+import com.zhongzheng.modules.exam.vo.ExamSessionVo;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.service.IUserExamGoodsService;
+import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import com.zhongzheng.modules.user.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 用户预约考试Controller
  *
@@ -78,6 +61,16 @@ public class UserSubscribeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 根据月份获取当月考试场次
+     */
+    @ApiOperation("根据月份获取当月考试场次")
+    @GetMapping("/session/{applyDate}")
+    public AjaxResult<List<ExamSessionVo>> getExamSession(@PathVariable("applyDate")String applyDate) {
+        List<ExamSessionVo> list = iUserSubscribeService.getExamSession(applyDate);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 修改用户预约考试
      */
@@ -211,12 +204,12 @@ public class UserSubscribeController extends BaseController {
     @GetMapping("/exportNew")
     public AjaxResult<Map<String,Object>> exportNew(UserSubscribeExportBo bo) {
         Map<String,Object> map = new HashMap<>();
-        ExamApplyGoodsQueryBo examApplyGoodsQueryBo = new ExamApplyGoodsQueryBo();
-        examApplyGoodsQueryBo.setApplyId(bo.getApplyId());
-        List<ExamApplyGoodsVo> goodsList = iExamApplyGoodsService.listGoods(examApplyGoodsQueryBo);
-        ExcelUtil<ExamApplyGoodsVo> goodsUtil = new ExcelUtil<ExamApplyGoodsVo>(ExamApplyGoodsVo.class);
+//        ExamApplyGoodsQueryBo examApplyGoodsQueryBo = new ExamApplyGoodsQueryBo();
+//        examApplyGoodsQueryBo.setApplyId(bo.getApplyId());
+//        List<ExamApplyGoodsVo> goodsList = iExamApplyGoodsService.listGoods(examApplyGoodsQueryBo);
+//        ExcelUtil<ExamApplyGoodsVo> goodsUtil = new ExcelUtil<ExamApplyGoodsVo>(ExamApplyGoodsVo.class);
         String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        map.put("goodsExcel",goodsUtil.exportEasyExcel(goodsUtil.exportEasyData(goodsList), bo.getApplyName()+"商品列表"+timeStr));
+//        map.put("goodsExcel",goodsUtil.exportEasyExcel(goodsUtil.exportEasyData(goodsList), bo.getApplyName()+"商品列表"+timeStr));
 
         if(Validator.isEmpty(bo.getApplySiteAddressTrain())){
             UserSubscribeExport export = new UserSubscribeExport();
@@ -227,8 +220,9 @@ public class UserSubscribeController extends BaseController {
             export.setApplySiteAddress(bo.getApplySiteAddress());
             export.setApplySiteExamTime("2021/10/21");
             export.setApplySiteTime("9:00-12:00");
-            export.setCode("SP6415428604");
-            export.setGoodsName("一级建造师继续教育(必修课+机电工程)");
+            export.setMajorName("土建质量员");
+//            export.setCode("SP6415428604");
+//            export.setGoodsName("一级建造师继续教育(必修课+机电工程)");
 
             List<UserSubscribeExport> list = new ArrayList<>();
             list.add(export);

+ 8 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ShoppingCartController.java

@@ -113,4 +113,12 @@ public class ShoppingCartController extends BaseController {
         ClientLoginUser loginUser = WxTokenService.getLoginUser(ServletUtils.getRequest());
         return toAjax(iShoppingCartService.deleteById(id, loginUser.getUser().getUserId()) ? 1 : 0);
     }
+
+    @ApiOperation("批量修改购物车状态")
+    @PostMapping("/updateBatchChoice")
+    public AjaxResult<Void> updateBatchChoice(@RequestBody ShoppingCartEditBo bo) {
+        ClientLoginUser loginUser = WxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iShoppingCartService.updateBatchChoice(bo) ? 1 : 0);
+    }
 }

+ 18 - 6
zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -8,14 +8,19 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
-import com.zhongzheng.modules.exam.bo.*;
-import com.zhongzheng.modules.exam.service.IExamActivityService;
+import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamRecommendGoodsQueryBo;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteService;
-import com.zhongzheng.modules.exam.vo.*;
+import com.zhongzheng.modules.exam.vo.ExamBeforeKnowVo;
+import com.zhongzheng.modules.exam.vo.ExamUserApplySiteVo;
+import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
-import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.bo.UserAppSubscribeEditBo;
+import com.zhongzheng.modules.user.bo.UserSubscribeAddBo;
+import com.zhongzheng.modules.user.bo.UserSubscribeQueryBo;
+import com.zhongzheng.modules.user.bo.UserSubscribeSignReportBo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.user.vo.UserSubscribeVo;
@@ -23,9 +28,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.text.ParseException;
 import java.util.List;
@@ -176,4 +179,13 @@ public class ExamApplyController extends BaseController {
         return iExamApplyService.getRecommendGoodsList(bo);
     }
 
+    /**
+     * 获取七大员考前需知
+     */
+    @ApiOperation("获取七大员考前需知")
+    @GetMapping("/before/know")
+    public AjaxResult<ExamBeforeKnowVo> getBeforeKnow() {
+        return AjaxResult.success(iExamApplyService.getBeforeKnow());
+    }
+
 }

+ 1 - 1
zhongzheng-common/pom.xml

@@ -96,7 +96,7 @@
         <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
-            <version>3.10.2</version>
+            <version>3.15.2</version>
         </dependency>
 
         <dependency>

+ 2 - 5
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ServletUtils.java

@@ -2,7 +2,6 @@ package com.zhongzheng.common.utils;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.StrUtil;
-import org.apache.tomcat.util.http.MimeHeaders;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -11,8 +10,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Map;
 
 /**
  * 客户端工具类
@@ -27,8 +24,8 @@ public class ServletUtils
      */
     public static String getEncoded(String tag)
     {
-        String time = String.valueOf(System.currentTimeMillis()/1000);
-        return tag+Integer.valueOf(time.substring(1))+""+(((int)(Math.random() * 90 + 10)));
+        String time = String.valueOf(System.currentTimeMillis());
+        return tag+Long.valueOf(time.substring(1));
     }
     //导入生成编号使用
     public static String getImportEncoded(String tag)

+ 20 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/ImageUtils.java

@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
 import sun.misc.BASE64Encoder;
 
 import javax.imageio.ImageIO;
+import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
@@ -106,4 +107,23 @@ public class ImageUtils
         return s;
 
     }
+
+    /** * 旋转图片为指定角度  图片宽高不变*
+     * @param bufferedimage * 目标图像 *
+     * @param degree * 旋转角度 *
+     * @return */
+    public static BufferedImage rotateImage(final BufferedImage bufferedimage, final int degree)
+    {
+        int w= bufferedimage.getWidth(); // 得到图片宽度。
+        int h= bufferedimage.getHeight();// 得到图片高度。
+        int type= bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
+        BufferedImage img;// 空的图片。
+        Graphics2D graphics2d;// 空的画笔。
+        (graphics2d= (img= new BufferedImage(w, h, type)).createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        graphics2d.rotate(Math.toRadians(degree), w/2, h/2);// 旋转,degree是整型,度数,比如垂直90度。   •rotate(double arc,double x, double y):图形以点(x,y)为轴点,旋转arc弧度。
+        graphics2d.drawImage(bufferedimage, 0, 0, null);// 从bufferedimagecopy图片至img,0,0是img的坐标。
+        graphics2d.dispose();
+
+        return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
+    }
 }

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

@@ -140,6 +140,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/apply/detail").anonymous()
+                .antMatchers("/common/student/image/update").anonymous()
                 .antMatchers("/common/platform/pay").anonymous()
                 .antMatchers("/common/platform/pay/handle").anonymous()
                 .antMatchers("/common/alike/goods").anonymous()

+ 10 - 2
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -1513,11 +1513,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
         Map<String, String> split = Splitter.on("&").withKeyValueSeparator("=").split(param);
         Long goodsId = Long.valueOf(split.get("gid"));
+        Long tenantId = user.getTenantId();
 
         //获取对应商品
-        Goods goods = iGoodsService.getGoodsByIdNotTenant(goodsId);
+        Goods goods = iGoodsService.queryGoodsByIdTenant(goodsId,tenantId);
+        if (ObjectUtils.isNull(goods)){
+            throw new CustomException("账号不匹配,请重新登录!");
+        }
 
-        Long tenantId = user.getTenantId();
         //组装跳转路径
         SysTenant tenant = iSysTenantService.getById(tenantId);
         String post = "";
@@ -1565,6 +1568,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return vo;
     }
 
+    @Override
+    public List<User> listByIdsNotTenant(List<Long> userIds) {
+        return baseMapper.listByIdsNotTenant(userIds);
+    }
+
 
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java

@@ -38,4 +38,6 @@ public interface OssService {
     void zipWisdomDownload(List<FileBean> list, ZipOutputStream outStream);
 
     InputStream getStreamByObject(String filePath) throws Exception;
+
+    void processObject(String targetImage ,String sourceImage,String styleType) ;
 }

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

@@ -6,9 +6,12 @@ import cn.hutool.json.JSONUtil;
 
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.OSSException;
 import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.common.utils.IOUtils;
 import com.aliyun.oss.internal.OSSUtils;
 import com.aliyun.oss.model.*;
+import com.aliyuncs.exceptions.ClientException;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.exception.CustomException;
@@ -20,7 +23,6 @@ import com.zhongzheng.modules.alioss.vo.ResultBean;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
 import com.zhongzheng.modules.grade.vo.WeekDataVo;
 import com.zhongzheng.modules.user.service.IUserStudyRecordPhotoService;
-import org.apache.commons.io.IOUtils;
 import org.apache.xmlbeans.impl.values.XmlValueNotNillableException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -242,9 +244,8 @@ public class OssServiceImpl implements OssService {
             //获取上传文件输入流
             InputStream inputStream = file.getFile().getInputStream();
             String originalFilename = file.getFile().getOriginalFilename();
-            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
 
-            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) + "." + suffix;
+            String fileName = ALIYUN_OSS_DIR_PREFIX + generateRandomFilename(file) ;
 
             //调用oss方法实现上传
             //第一个参数  Bucket名称
@@ -344,6 +345,32 @@ public class OssServiceImpl implements OssService {
             return ossObject.getObjectContent();
     }
 
+    @Override
+    public void processObject(String targetImage,String sourceImage, String styleType) {
+        try {
+            StringBuilder sbStyle = new StringBuilder();
+            Formatter styleFormatter = new Formatter(sbStyle);
+            styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
+                    BinaryUtil.toBase64String(targetImage.getBytes()),
+                    BinaryUtil.toBase64String(ALIYUN_OSS_BUCKET_NAME.getBytes()));
+            ProcessObjectRequest request = new ProcessObjectRequest(ALIYUN_OSS_BUCKET_NAME, sourceImage, sbStyle.toString());
+            GenericResult processResult = ossClient.processObject(request);
+            String json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
+            processResult.getResponse().getContent().close();
+        } catch (OSSException oe) {
+            System.out.println("Caught an OSSException, which means your request made it to OSS, "
+                    + "but was rejected with an error response for some reason.");
+            System.out.println("Error Message:" + oe.getErrorMessage());
+            System.out.println("Error Code:" + oe.getErrorCode());
+            System.out.println("Request ID:" + oe.getRequestId());
+            System.out.println("Host ID:" + oe.getHostId());
+        }catch (IOException e) {
+
+        } finally {
+
+        }
+    }
+
     public void zipFile(List<String> fileList, ZipOutputStream zipOut,String dir) {
         if (CollectionUtils.isEmpty(fileList)) {
             return;

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

@@ -87,6 +87,8 @@ public interface IQuestionService extends IService<Question> {
 
 	Map<String,Object> importJJWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);
 
+	Map<String,Object> importXueJianWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);
+
     boolean batchDelQuestion(QuestionBatchDelBo bo);
 
     List<BankGoodsExamVo> getBankGoodsExamList(Long goodsId);

+ 495 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -1061,11 +1061,55 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return false;
     }
 
+    private boolean isXueJianQuestionStart(String content,Integer type,List<String> alKeyList) {
+        content = dealTxt(content);
+        if (Validator.isNotEmpty(content)) {
+            if(type==5){
+                if(alKeyList.contains(content)){
+                    return true;
+                }else{
+                    return false;
+                }
+            }else {
+                String[] strArr = content.split("\\.");
+                if(strArr.length>1){
+                    if(isNumeric1(strArr[0])){
+                        int qIndex = content.indexOf(".");
+                        if (qIndex > 0 && qIndex < 5) { //序号支持千位数
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    public  boolean isNumeric1(String str) {
+        try {
+            Double.parseDouble(str);
+            return true;
+        } catch(Exception e){
+            return false;
+        }
+    }
+
     private boolean isLineStart(String content) {
         if (Validator.isNotEmpty(content)) {
             if(isQuestionStart(content)||content.startsWith("А.")||content.startsWith("A.")||content.startsWith("B.")||content.startsWith("C.")||content.startsWith("D.")||content.startsWith("E.")
                     ||content.startsWith("F.")||content.startsWith("正确答案")||content.startsWith("解题思路")||content.startsWith("考查考点")||content.startsWith("老师解答")
-                    ||content.startsWith("单选题模板")||content.startsWith("判读题模板")||content.startsWith("问答题模板")||content.startsWith("多选题题模板")){
+                    ||content.startsWith("单选题模板")||content.startsWith("判读题模板")||content.startsWith("问答题模板")||content.startsWith("多选题题模板")||content.startsWith("【参考答案】")||content.startsWith("【老师解析】")){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isXueJianLineStart(String content,Integer type,List<String> alKeyList) {
+        if (Validator.isNotEmpty(content)) {
+            if(isXueJianQuestionStart(content,type,alKeyList)||content.startsWith("А.")||content.startsWith("A.")||content.startsWith("B.")||content.startsWith("C.")||content.startsWith("D.")||content.startsWith("E.")
+                    ||content.startsWith("F.")||content.startsWith("正确答案")||content.startsWith("解题思路")||content.startsWith("考查考点")||content.startsWith("老师解答")
+                    ||content.startsWith("单选题模板")||content.startsWith("判读题模板")||content.startsWith("问答题模板")||content.startsWith("多选题题模板")||content.startsWith("【参考答案】")||content.startsWith("【老师解析】")){
                 return true;
             }
         }
@@ -1887,6 +1931,442 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return result;
     }
 
+    @Override
+    public Map<String, Object> importXueJianWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) {
+        Map<String,Object> result = new HashMap<>();
+        List<QuestionAddBo> list = new ArrayList<>();
+        String errorLog = ""; //错误提示
+        String buffer = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        Long sort = 1L;
+        if(Validator.isEmpty(file)){
+            throw new CustomException("请选择文件");
+        }
+        List<String> alKeyList  = new ArrayList<>();
+        alKeyList.add("案例(一)");
+        alKeyList.add("案例(二)");
+        alKeyList.add("案例(三)");
+        alKeyList.add("案例(四)");
+        alKeyList.add("案例(五)");
+        alKeyList.add("案例(六)");
+        alKeyList.add("案例(七)");
+        alKeyList.add("案例(八)");
+        alKeyList.add("案例(九)");
+        alKeyList.add("案例(十)");
+        try {
+            Long nowTime = DateUtils.getNowTime();
+            String path = file.getOriginalFilename();
+            if (path.endsWith(".doc")) {
+                throw new CustomException("不支持doc格式");
+            } else if (path.endsWith("docx")) {
+                InputStream is = file.getInputStream();
+                XWPFDocument doc = new XWPFDocument(is);
+                List<XWPFParagraph> paragraphList = doc.getParagraphs();
+                int type = -1;  //题目类型
+                boolean isOption = false; //是否判断题
+                List<QuestionChildAddBo> optionsList = new ArrayList<>(); //题目选项
+                String content = ""; //每行正文
+                String qContent = ""; //题目正文
+                String answerQuestion = null; //答案
+                String analysisContent = ""; //解析文本
+                int index = 1; //题目序列号
+                List<QuestionBusinessAddBo> businessList = new ArrayList<>();
+                QuestionBusinessAddBo questionBusinessAddBo = new QuestionBusinessAddBo();
+                questionBusinessAddBo.setEducationTypeId(eduId);
+                questionBusinessAddBo.setProjectId(projectId);
+                questionBusinessAddBo.setBusinessId(businessId);
+                questionBusinessAddBo.setSubjectId(subjectId);
+                businessList.add(questionBusinessAddBo);
+
+                List<QuestionAddBo> list1 = new ArrayList<>(); //单选列表
+                List<QuestionAddBo> list2 = new ArrayList<>(); //多选列表
+                List<QuestionAddBo> list3 = new ArrayList<>(); //简答列表
+                List<QuestionAddBo> list4 = new ArrayList<>(); //判断列表
+
+                Integer nowPart = -1;//0正文 1选项A 2选项B 3选项C 4选项D 5选项E 6选项F
+                String strContent = "";
+                String imgUrl = "";
+                boolean hasQuestion = false;
+                boolean hasRightTag = false;
+                boolean hasError = false;
+                for (XWPFParagraph paragraph : paragraphList) {
+                    content = paragraph.getText();
+                    List<XWPFRun> runs = paragraph.getRuns();
+                    imgUrl = null;
+                    for (XWPFRun run : runs) {
+                        Node node = run.getCTR().getDomNode();
+
+                        // drawing 一个绘画的图片
+                        Node drawingNode = getChildNode(node, "w:drawing");
+                        if (drawingNode == null && content == null) {
+                            imgUrl = null;
+                            continue;
+                        }
+                        //上传图片
+                        if (Validator.isNotEmpty(drawingNode)) {
+                            // 绘画图片的宽和高
+                            Node extentNode = getChildNode(drawingNode, "wp:extent");
+                            NamedNodeMap extentAttrs = extentNode.getAttributes();
+                            int wPx = ToolsUtils.emuToPx(Double.valueOf(extentAttrs.getNamedItem("cx").getNodeValue()));
+                            //            System.out.println("宽:".concat(extentAttrs.getNamedItem("cx").getNodeValue()).concat("emu"));
+                            //            System.out.println("高:".concat(extentAttrs.getNamedItem("cy").getNodeValue()).concat("emu"));
+                            int HPx = ToolsUtils.emuToPx(Double.valueOf(extentAttrs.getNamedItem("cy").getNodeValue()));
+
+                            // 绘画图片具体引用
+                            Node blipNode = getChildNode(drawingNode, "a:blip");
+                            if(Validator.isEmpty(blipNode)){
+                                System.out.println(3243);
+                            }
+                            NamedNodeMap blipAttrs = blipNode.getAttributes();
+                            String rid = blipAttrs.getNamedItem("r:embed").getNodeValue();
+                            //            System.out.println("word中图片ID:".concat(rid));
+
+                            // 获取图片信息
+                            PackagePart part = doc.getPartById(rid);
+                            String ossPath = null;
+                            try {
+                                ossPath = ossService.uploadInputStream(part.getInputStream(), 8);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                            imgUrl =  ossPath + "?x-oss-process=image/resize,w_" + wPx + ",h_" + HPx;
+                            if(isOptionStart(content)||(nowPart>0&&nowPart<7&&!isNotOptionStart(content))){
+                                //选项图片路径不用处理
+
+                            }else{
+                                //正文图片
+                                content =   "<br /><p><img src=\"" + ossHost + "/" + imgUrl + "\"></p><br />" + content;
+                            }
+                        }
+                    }
+                    content = dealTxt(content);
+                    if (content.startsWith("#")||isXueJianQuestionStart(content,type,alKeyList)) {
+                        if(hasQuestion){
+                            index++;
+                            hasQuestion = false;
+                            //插入上一条
+                            QuestionAddBo addBo = new QuestionAddBo();
+                            qContent = removeXueJianNo(qContent,type);
+                            if (Validator.isEmpty(qContent)) {
+                                hasError = true;
+                                errorLog += "第" + index + "条题目内容错误\n";
+                                continue;
+                            }
+                            QuestionAddBo bo = new QuestionAddBo();
+                            if (type == -1) {
+                                hasError = true;
+                                errorLog += "第" + index + "条题目选项错误\n";
+                                continue;
+
+                            }
+                            if(!hasError){
+                                if (Validator.isEmpty(answerQuestion)) {
+                                    errorLog += "第" + index + "正确答案错误\n";
+                                    continue;
+
+                                }
+                                if(type==5){
+                                    answerQuestion = null;
+                                }
+                                bo.setType(type);
+                                bo.setStatus(1);
+                                bo.setContent(qContent);
+                                bo.setAnswerQuestion(answerQuestion);
+                                bo.setAnalysisContent(analysisContent);
+                                bo.setOptionsList(copyList(optionsList));
+                                bo.setCreateBy(SecurityUtils.getUsername());
+                                bo.setImportNo(importNo);
+                                bo.setPublishStatus(1);
+                                bo.setBusinessList(businessList);
+                                bo.setCreateTime(nowTime);
+                                if(type==1){
+                                    list1.add(bo);
+                                }
+                                if(type==2){
+                                    list2.add(bo);
+                                }
+                                if(type==3){
+                                    list4.add(bo);
+                                }
+                                if(type==5){
+                                    list3.add(bo);
+                                }
+                            }
+
+                            sort++;
+                            hasError = false;
+                            //清空数据
+                            isOption = false;
+                            qContent = "";
+                            answerQuestion = null;
+                            analysisContent = "";
+                            optionsList.clear();
+                            nowPart = -1;
+                            hasRightTag= false;
+                        }
+                    }
+                    if (content.startsWith("【参考答案】")){
+                        if(!hasRightTag){
+                            hasRightTag = true;
+                        }else{
+                            errorLog += "第" + index + "题目序号可能错误\n";
+                            hasRightTag =false;
+                            continue;
+                        }
+                    }
+                    if (content.startsWith("#")) { //导入结束
+                        break;
+                    }
+                    if(Validator.isEmpty(content)||content.equals("")){
+                        continue;
+                    }
+                    if (content.startsWith("一、单项选择题")) {
+                        type = 1;
+                        continue;
+                    }
+                    if (content.startsWith("二、多项选择题")) {
+                        type = 2;
+                        continue;
+                    }
+                    if (content.startsWith("三、实务操作和案例分析题")) {
+                        type = 5;
+                        continue;
+                    }
+                    if (isXueJianQuestionStart(content,type,alKeyList)||(nowPart==0&&!isXueJianLineStart(content,type,alKeyList))) {
+                        hasQuestion = true;
+                        if(nowPart!=0){
+                            qContent = "";
+                        }
+                        nowPart = 0;
+                        //新题开头
+                        if(!alKeyList.contains(content)){
+                            qContent = qContent +   content +"<br />";
+                        }
+                        continue;
+                    }
+                    //第一个选项
+                    if(content.startsWith("А.")||content.startsWith("A.")||(nowPart==1&&!isXueJianLineStart(content,type,alKeyList))) {
+                        hasQuestion = true;
+                        if(nowPart!=1){
+                            strContent = "";
+                        }
+                        isOption = true; //是选择题
+                        nowPart = 1;
+                        strContent = strContent +   content ;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<1){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(1L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("A.", "").replace("А.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(0);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("A.", "").replace("А.", ""));
+                        }
+                        continue;
+                    }
+                    //第二个选项
+                    if (content.startsWith("B.")||(nowPart==2&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if (optionsList.size()<1) {
+                            errorLog += "第" + index + "条题目选项A错误\n";
+                            continue;
+                        }
+                        if(nowPart!=2){
+                            strContent = "";
+                        }
+                        nowPart = 2;
+                        strContent = strContent +  content ;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<2){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(2L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("B.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(1);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("B.", ""));
+                        }
+                        continue;
+                    }
+                    //第三个选项
+                    if (content.startsWith("C.")||(nowPart==3&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if(nowPart!=3){
+                            strContent = "";
+                        }
+                        nowPart = 3;
+                        strContent = strContent +   content;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<3){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(3L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("C.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(2);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("C.", ""));
+                        }
+                        continue;
+                    }
+                    //第四个选项
+                    if (content.startsWith("D.")||(nowPart==4&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if(nowPart!=4){
+                            strContent = "";
+                        }
+                        nowPart = 4;
+                        strContent = strContent +   content ;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<4){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(4L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("D.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(3);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("D.", ""));
+                        }
+                        continue;
+                    }
+                    //第五个选项
+                    if (content.startsWith("E.")||(nowPart==5&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if(nowPart!=5){
+                            strContent = "";
+                        }
+                        nowPart = 5;
+                        strContent = strContent +   content ;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<5){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(5L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("E.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(4);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("E.", ""));
+                        }
+                        continue;
+                    }
+                    //第六个选项
+                    if (content.startsWith("F.")||(nowPart==6&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if(nowPart!=6){
+                            strContent = "";
+                        }
+                        nowPart = 6;
+                        strContent = strContent +   content ;
+                        QuestionChildAddBo bo1;
+                        if(optionsList.size()<6){
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(6L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("F.", ""));
+                            optionsList.add(bo1);
+                        }else{
+                            bo1 = optionsList.get(5);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(strContent.replace("F.", ""));
+                        }
+                        continue;
+                    }
+                    //答案和题型
+                    if (content.startsWith("【参考答案】")||(nowPart==7&&!isXueJianLineStart(content,type,alKeyList))) {
+                        if(nowPart!=7){
+                            strContent = "";
+                        }
+
+                        nowPart = 7;
+
+                        if(Validator.isNotEmpty(answerQuestion)){
+                            answerQuestion = answerQuestion +  "<br />" + content ;
+                        }else{
+                            answerQuestion = content.replace("【参考答案】", "");
+                        }
+                        if (isOption) {
+                            //选择题
+                            answerQuestion = dealImportAnswer(answerQuestion);
+                            if (answerQuestion.length() > 1) {
+                        //        type = 2; //多选
+                            } else {
+                        //        type = 1; //单选
+                            }
+                        } else {
+                            if ("正确".equals(answerQuestion)) {
+                                answerQuestion = "1";
+                        //        type = 3; //判断
+                            } else if ("错误".equals(answerQuestion)) {
+                                answerQuestion = "0";
+                       //         type = 3;
+                            } else {
+                                analysisContent = answerQuestion; //简答题把正确答案填充到解析文本
+                       //         type = 5; //简答题
+                            }
+                        }
+                        continue;
+                    }
+                    else if (content.startsWith("解题思路")||(nowPart==8&&!isXueJianLineStart(content,type,alKeyList))) {
+                        nowPart = 8;
+                        analysisContent = analysisContent +   content +"<br />";
+                        continue;
+                    }
+                    else if (content.startsWith("考查考点")||(nowPart==9&&!isXueJianLineStart(content,type,alKeyList))) {
+                        nowPart = 9;
+                        analysisContent = analysisContent +   content +"<br />";
+                        continue;
+                    }
+                    else if (content.startsWith("【老师解析】")||(nowPart==10&&!isXueJianLineStart(content,type,alKeyList))) {
+                        nowPart = 10;
+                        analysisContent = analysisContent +   content +"<br />";
+                    }
+                }
+                //遍历正文
+                int importSort = 1;
+                Collections.reverse(list4);
+                Collections.reverse(list3);
+                Collections.reverse(list2);
+                Collections.reverse(list1);
+                for(QuestionAddBo addBo : list3){
+                    addBo.setImportSort(importSort + addBo.getCreateTime());
+                    list.add(addBo);
+                    importSort++;
+                }
+                for(QuestionAddBo addBo : list4){
+                    addBo.setImportSort(importSort + addBo.getCreateTime());
+                    list.add(addBo);
+                    importSort++;
+                }
+                for(QuestionAddBo addBo : list2){
+                    addBo.setImportSort(importSort + addBo.getCreateTime());
+                    list.add(addBo);
+                    importSort++;
+                }
+                for(QuestionAddBo addBo : list1){
+                    addBo.setImportSort(importSort + addBo.getCreateTime());
+                    list.add(addBo);
+                    importSort++;
+                }
+                //    buffer = extractor.getText();
+                //extractor.close();
+
+            } else {
+                throw new CustomException("请导入word文件!");
+            }
+        } catch (IOException e) {
+            System.out.println("此文件不是word文件!" + e.getMessage() + e.toString() + e.getLocalizedMessage());
+        }
+        Collections.reverse(list);
+        result.put("list",list);
+        result.put("errorLog",errorLog);
+        return result;
+    }
+
     @Override
     public Map<String, Object> importJJWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) {
         Map<String,Object> result = new HashMap<>();
@@ -2247,6 +2727,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return result;
     }
 
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean batchDelQuestion(QuestionBatchDelBo bo) {
@@ -2495,6 +2977,18 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return format.format(d1 / d2);
     }
 
+    private String removeXueJianNo(String txt,Integer type) {
+        if(type!=5){
+            int intIndex = txt.indexOf(".");
+            if (intIndex != -1) {
+                txt = txt.substring(intIndex + 1);
+            }
+            return txt;
+        }else{
+            return txt;
+        }
+
+    }
 
 
     private String removeNo(String txt) {

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ShoppingCartAddBo.java

@@ -37,4 +37,6 @@ public class ShoppingCartAddBo {
     private Integer status;
     @ApiModelProperty("分销码")
     private String distributionCode;
+    @ApiModelProperty("勾选状态 0无 1已勾选")
+    private Integer choiceStatus;
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ShoppingCartEditBo.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import java.util.Date;
+import java.util.List;
 
 
 /**
@@ -37,4 +38,10 @@ public class ShoppingCartEditBo {
     @ApiModelProperty("1 启用 0未启用 -1删除")
     private Integer status;
 
+    @ApiModelProperty("勾选状态 0无 1已勾选")
+    private Integer choiceStatus;
+
+    private List<Long> ids;
+
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/ShoppingCart.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
@@ -41,4 +42,6 @@ private static final long serialVersionUID=1L;
     private Integer status;
     /** 分销码*/
     private String distributionCode;
+
+    private Integer choiceStatus;
 }

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

@@ -55,4 +55,6 @@ public interface IShoppingCartService extends IService<ShoppingCart> {
 	Boolean deleteById(Long id, Long userId);
 
 	Boolean deleteByGoodsId(Long goodsId, Long userId);
+
+	Boolean updateBatchChoice(ShoppingCartEditBo bo);
 }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ShoppingCartServiceImpl.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.base.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -20,8 +21,12 @@ import com.zhongzheng.modules.base.domain.ShoppingCart;
 import com.zhongzheng.modules.base.mapper.ShoppingCartMapper;
 import com.zhongzheng.modules.base.service.IShoppingCartService;
 import com.zhongzheng.modules.base.vo.ShoppingCartVo;
+import com.zhongzheng.modules.course.domain.CourseChapter;
 import com.zhongzheng.modules.distribution.domain.DistributionActivity;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
+import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
+import com.zhongzheng.modules.grade.service.IClassGradeService;
+import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -48,6 +53,9 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, Sho
     @Autowired
     private IActivityGoodsPriceService iActivityGoodsPriceService;
 
+    @Autowired
+    private IClassGradeService iClassGradeService;
+
     @Override
     public ShoppingCartVo queryById(Long id){
         ShoppingCart db = this.baseMapper.selectById(id);
@@ -82,6 +90,12 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, Sho
                     item.setDistributionStatus(1);
                 }
             }
+            ClassGradeQueryBo gradeQueryBo = new ClassGradeQueryBo();
+            gradeQueryBo.setGoodsId(item.getGoodsId());
+            gradeQueryBo.setPastDue(1L);
+            List<ClassGradeVo> gradeList = iClassGradeService.getList(gradeQueryBo);
+            item.setGradeList(gradeList);
+
         });
         return shoppingCartVos;
     }
@@ -174,6 +188,18 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, Sho
         return this.remove(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getUserId,userId).eq(ShoppingCart::getGoodsId,goodsId));
     }
 
+    @Override
+    public Boolean updateBatchChoice(ShoppingCartEditBo bo) {
+        for(Long id : bo.getIds()){
+            update(new LambdaUpdateWrapper<ShoppingCart>()
+                    .set(ShoppingCart::getChoiceStatus,bo.getChoiceStatus())
+                    .set(ShoppingCart::getUpdateTime,DateUtils.getNowTime())
+                    .eq(ShoppingCart::getId,id)
+                    .eq(ShoppingCart::getUserId,bo.getUserId()));
+        }
+        return true;
+    }
+
     private boolean checkUnique(ShoppingCart entity) {
         ShoppingCart info = getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,entity.getUserId()).eq(ShoppingCart::getGoodsId,entity.getGoodsId()).last("limit 1"));

+ 6 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/ShoppingCartVo.java

@@ -1,12 +1,13 @@
 package com.zhongzheng.modules.base.vo;
 
 import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
-
+import java.util.List;
 
 
 /**
@@ -65,4 +66,8 @@ public class ShoppingCartVo {
 	private String distributionCode;
 	@ApiModelProperty("活动状态是否已结束:1已结束,0未结束")
 	private Integer distributionStatus;
+	@ApiModelProperty("勾选状态 0无 1已勾选")
+	private Integer choiceStatus;
+	@ApiModelProperty("班级列表")
+	private List<ClassGradeVo> gradeList;
 }

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

@@ -58,4 +58,10 @@ public class CheckSectionWatchVo implements Serializable {
 
     @ApiModelProperty("录播和回放的url地址")
     private String recordingUrl;
+
+    @ApiModelProperty("直播开始时间")
+    private Long liveStartTime;
+
+    @ApiModelProperty("直播结束时间")
+    private Long liveEndTime;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java

@@ -52,4 +52,6 @@ public class CourseHandoutsAddBo {
     private List<CourseHandoutsBusinessAddBo> courseHandoutsBusinessAddBos;
     @ApiModelProperty("文件列表")
     private List<CourseFileAddBo> fileList;
+    @ApiModelProperty("时间戳标识")
+    private Long timeSign;
 }

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

@@ -62,4 +62,7 @@ public class CourseHandoutsEditBo {
 
     @ApiModelProperty("新增文件名称")
     private List<String> addFileNames;
+
+    @ApiModelProperty("时间戳标识")
+    private Long timeSign;
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseFile.java

@@ -47,4 +47,9 @@ private static final long serialVersionUID=1L;
     private Long parentId;
     /** 类型:1文件 2文件夹 */
     private Integer type;
+
+    private Long tenantId;
+
+    @TableField(exist = false)
+    private Long oldId;
 }

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

@@ -47,6 +47,7 @@ private static final long serialVersionUID=1L;
     private String urlName;
 
     /** 0不可下载 1下载 */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer canDownload;
 
     /** 修改状态:1正常 0修改中 */

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

@@ -49,4 +49,7 @@ public interface CourseChapterSectionMapper extends BaseMapper<CourseChapterSect
 
     @InterceptorIgnore(tenantLine = "true")
     void deleteByIdAndTenant(@Param("chapterId") Long chapterId,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseChapterSection getByTenant(@Param("newChapterId") Long newChapterId,@Param("newSectionId") Long newSectionId,@Param("newTenantId") Long newTenantId);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseFileMapper.java

@@ -1,7 +1,9 @@
 package com.zhongzheng.modules.course.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.domain.CourseFile;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 文件Mapper接口
@@ -11,4 +13,6 @@ import com.zhongzheng.modules.course.domain.CourseFile;
  */
 public interface CourseFileMapper extends BaseMapper<CourseFile> {
 
+    @InterceptorIgnore(tenantLine = "true")
+    void deleteByTenant(@Param("handoutsId") Long handoutsId,@Param("newTenantId") Long newTenantId);
 }

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseHandoutsMapper.java

@@ -27,4 +27,17 @@ public interface CourseHandoutsMapper extends BaseMapper<CourseHandouts> {
 
     @InterceptorIgnore(tenantLine = "true")
     CourseHandouts getHandoutsByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Long> getGoodsIds(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandouts(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandoutsBusiness(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void removeHandoutsFile(@Param("handoutsId") Long handoutsId,@Param("tenantId") Long tenantId);
+
 }

+ 5 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuExamMapper.java

@@ -3,10 +3,8 @@ package com.zhongzheng.modules.course.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.bo.CourseMenuExamQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.domain.CourseMenuExam;
 import com.zhongzheng.modules.course.vo.CourseMenuExamVo;
-import com.zhongzheng.modules.course.vo.CourseVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -26,4 +24,9 @@ public interface CourseMenuExamMapper extends BaseMapper<CourseMenuExam> {
     @InterceptorIgnore(tenantLine = "true")
     void deleteModuleByIdTenant(@Param("newCourseId")Long newCourseId,@Param("newModuleId") Long newModuleId,@Param("newTenantId") Long newTenantId);
 
+    @InterceptorIgnore(tenantLine = "true")
+    void deleteChapterByIdTenant(@Param("newCourseId")Long newCourseId, @Param("newModuleId")Long newModuleId,@Param("newChapterId") Long newChapterId,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void deleteSectionByIdTenant(@Param("newCourseId")Long newCourseId, @Param("newModuleId")Long newModuleId,@Param("newChapterId") Long newChapterId,@Param("newSectionId") Long newSectionId,@Param("newTenantId") Long newTenantId);
 }

+ 3 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseModuleChapterMapper.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.domain.CourseModuleChapter;
-import com.zhongzheng.modules.course.vo.CourseChapterSectionVo;
 import com.zhongzheng.modules.course.vo.CourseModuleChapterVo;
-import com.zhongzheng.modules.course.vo.CourseUserChapterSectionVo;
 import com.zhongzheng.modules.course.vo.CourseUserModuleChapterVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -32,4 +30,7 @@ public interface CourseModuleChapterMapper extends BaseMapper<CourseModuleChapte
 
     @InterceptorIgnore(tenantLine = "true")
     void deleteByIdAndTenant(@Param("newModuleId") Long newModuleId,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseModuleChapter getByTenant(@Param("newModuleId") Long newModuleId,@Param("newChapterId") Long newChapterId,@Param("newTenantId") Long newTenantId);
 }

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

@@ -62,4 +62,6 @@ public interface ICourseChapterSectionService extends IService<CourseChapterSect
 	List<CourseUserChapterSectionVo> sectionExamList(CourseMenuQueryBo bo);
 
     void deleteByIdAndTenant(Long chapterId, Long newTenantId);
+
+    CourseChapterSection getByTenant(Long newChapterId, Long newSectionId, Long newTenantId);
 }

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

@@ -51,4 +51,6 @@ public interface ICourseFileService extends IService<CourseFile> {
 	boolean editHandouts(CourseHandoutsEditBo bo);
 
     boolean addHandouts(CourseHandoutsAddBo bo);
+
+    void deleteByTenant(Long newId, Long newTenantId);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java

@@ -57,4 +57,7 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 
     CourseHandouts getHandoutsByTenant(String encoder, Long newTenantId);
 
+    List<Long> getGoodsIds(Long handoutsId, Long tenantId);
+
+	void removeHandouts(Long handoutsId, Long tenantId);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseMenuExamService.java

@@ -55,4 +55,8 @@ public interface ICourseMenuExamService extends IService<CourseMenuExam> {
     void deleteByIdTenant(Long newCourseId, Long newTenantId);
 
     void deleteModuleByIdTenant(Long newCourseId, Long newModuleId, Long newTenantId);
+
+	void deleteChapterByIdTenant(Long newCourseId, Long newModuleId, Long newChapterId, Long newTenantId);
+
+    void deleteSectionByIdTenant(Long newCourseId, Long newModuleId, Long newChapterId, Long newSectionId, Long newTenantId);
 }

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

@@ -56,4 +56,6 @@ public interface ICourseModuleChapterService extends IService<CourseModuleChapte
     List<CourseUserModuleChapterVo> chapterList(CourseMenuQueryBo bo);
 
     void deleteByIdAndTenant(Long newModuleId, Long newTenantId);
+
+    CourseModuleChapter getByTenant(Long newModuleId, Long newChapterId, Long newTenantId);
 }

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

@@ -210,4 +210,9 @@ public class CourseChapterSectionServiceImpl extends ServiceImpl<CourseChapterSe
     public void deleteByIdAndTenant(Long chapterId, Long newTenantId) {
         baseMapper.deleteByIdAndTenant(chapterId, newTenantId);
     }
+
+    @Override
+    public CourseChapterSection getByTenant(Long newChapterId, Long newSectionId, Long newTenantId) {
+        return baseMapper.getByTenant(newChapterId,newSectionId, newTenantId);
+    }
 }

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

@@ -135,7 +135,9 @@ public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseF
                 throw new CustomException("已有商品关联此讲义,不能改动!");
             }
         }
-        iCourseHandoutsService.update(new LambdaUpdateWrapper<CourseHandouts>().set(CourseHandouts::getUpdateStatus,0).eq(CourseHandouts::getHandoutsId,bo.getHandoutsId()));
+        iCourseHandoutsService.update(new LambdaUpdateWrapper<CourseHandouts>()
+                .set(CourseHandouts::getUpdateStatus,0)
+                .eq(CourseHandouts::getHandoutsId,bo.getHandoutsId()));
         Long nowTime = DateUtils.getNowTime();
         String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
         bo.setSign(sign);
@@ -161,4 +163,9 @@ public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseF
         return true;
     }
 
+    @Override
+    public void deleteByTenant(Long handoutsId, Long newTenantId) {
+        baseMapper.deleteByTenant(handoutsId, newTenantId);
+    }
+
 }

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

@@ -325,5 +325,17 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         return baseMapper.getHandoutsByTenant(encoder, newTenantId);
     }
 
+    @Override
+    public List<Long> getGoodsIds(Long handoutsId, Long tenantId) {
+        return baseMapper.getGoodsIds(handoutsId,tenantId);
+    }
+
+    @Override
+    public void removeHandouts(Long handoutsId, Long tenantId) {
+        baseMapper.removeHandouts(handoutsId, tenantId);
+        baseMapper.removeHandoutsBusiness(handoutsId, tenantId);
+        baseMapper.removeHandoutsFile(handoutsId, tenantId);
+    }
+
 
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuExamServiceImpl.java

@@ -119,4 +119,14 @@ public class CourseMenuExamServiceImpl extends ServiceImpl<CourseMenuExamMapper,
     public void deleteModuleByIdTenant(Long newCourseId, Long newModuleId, Long newTenantId) {
         baseMapper.deleteModuleByIdTenant(newCourseId,newModuleId, newTenantId);
     }
+
+    @Override
+    public void deleteChapterByIdTenant(Long newCourseId, Long newModuleId, Long newChapterId, Long newTenantId) {
+        baseMapper.deleteChapterByIdTenant(newCourseId,newModuleId,newChapterId, newTenantId);
+    }
+
+    @Override
+    public void deleteSectionByIdTenant(Long newCourseId, Long newModuleId, Long newChapterId, Long newSectionId, Long newTenantId) {
+        baseMapper.deleteSectionByIdTenant(newCourseId, newModuleId, newChapterId, newSectionId, newTenantId);
+    }
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseModuleChapterServiceImpl.java

@@ -162,4 +162,9 @@ public class CourseModuleChapterServiceImpl extends ServiceImpl<CourseModuleChap
     public void deleteByIdAndTenant(Long newModuleId, Long newTenantId) {
         baseMapper.deleteByIdAndTenant(newModuleId, newTenantId);
     }
+
+    @Override
+    public CourseModuleChapter getByTenant(Long newModuleId, Long newChapterId, Long newTenantId) {
+        return baseMapper.getByTenant(newModuleId,newChapterId,newTenantId);
+    }
 }

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

@@ -321,8 +321,8 @@ public class CourseSectionServiceImpl extends ServiceImpl<CourseSectionMapper, C
             bo.setImportNo(importNo);
             bo.setSectionType(sectionType);
         //    bo.setDurationTime(sectionImport.getDurationTime());
-            bo.setRecordingUrl(sectionImport.getRecordingUrl());
-            bo.setLiveUrl(sectionImport.getLiveUrl());
+            bo.setRecordingUrl(dealTxt(sectionImport.getRecordingUrl()));
+            bo.setLiveUrl(dealTxt(sectionImport.getLiveUrl()));
             bo.setPublishStatus(sectionImport.getPublishStatus().equals("发布")?1:0);
             bo.setStatus(1);
             bo.setCoverUrl("oss/images/avatar/20211013/1634097664410_1397766697");
@@ -377,6 +377,20 @@ public class CourseSectionServiceImpl extends ServiceImpl<CourseSectionMapper, C
         return rs;
     }
 
+    private String dealTxt(String txt) {
+        if(Validator.isEmpty(txt)){
+            return "";
+        }
+        txt = txt.trim();
+        if (txt.startsWith("\\t")) {
+            txt = txt.replace("\\t", "");
+        }
+        if (txt.startsWith("\t")) {
+            txt = txt.replace("\t", "");
+        }
+        return txt;
+    }
+
     @Override
     public Map<String, Object> importChapterSection(List<CourseChapterSectionImport> sectionList,List<CourseSectionBusinessAddBo> businessList, String operName) throws ParseException {
         if (Validator.isNull(sectionList) || sectionList.size() == 0) {

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

@@ -153,6 +153,8 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
         watchVo.setCheckStatus(1);
         watchVo.setSectionType(courseSection.getSectionType());
         watchVo.setRecordingUrl(courseSection.getRecordingUrl());
+        watchVo.setLiveStartTime(courseSection.getLiveStartTime());
+        watchVo.setLiveEndTime(courseSection.getLiveEndTime());
         return watchVo;
     }
 }

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

@@ -492,10 +492,29 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             }
             goodsUserVo.setSecAllNum(secLong);
             goodsUserVo.setStuAllNum(studyLong);
+            goodsUserVo.setSubscribeSign(2);
+
 
             //查询对应考试安排
             List<ExamApplyGoodsVo> examApplyGoodsVoList = iExamApplyGoodsService.listByGoodsId(goodsUserVo.getGoodsId());
             if (examApplyGoodsVoList != null && examApplyGoodsVoList.size() > 0) {
+                //是否满足预约考试条件
+                if (ObjectUtils.isNotNull(classGradeVo.getPeriodStatus())
+                        && classGradeVo.getPeriodStatus() == 1
+                        && (DateUtils.getNowTime() >= goodsUserVo.getServiceStartTime() && DateUtils.getNowTime() <= goodsUserVo.getServiceEndTime())){
+                    UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                            .eq(UserSubscribe::getUserId, bo.getUserId())
+                            .eq(UserSubscribe::getGoodsId, goodsUserVo.getGoodsId())
+                            .eq(UserSubscribe::getSubscribeStatus, 1)
+                            .orderByDesc(UserSubscribe::getCreateTime)
+                            .last("limit 1"));
+                    if (ObjectUtils.isNull(userSubscribe)){
+                        goodsUserVo.setSubscribeSign(1);
+                    }else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
+                        goodsUserVo.setSubscribeSign(3);
+                    }
+                }
+
                 List<ExamApplyGoodsVo> examApplyGoodsVos = new ArrayList<>();
                 List<ExamApplyGoodsVo> examApplyGoodsVos2 = new ArrayList<>();
                 examApplyGoodsVoList.forEach(examApplyGoodsVo -> {
@@ -663,21 +682,25 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     }
 
     private Long liveTime(Long nowTime, Integer day) {
-        Long dayAfter = DateUtils.getDayAfter(nowTime, day);
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(DateUtils.timeToDate(dayAfter));
-        int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
-        String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
-        if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
-            //周末
-            liveTime(nowTime,day + 1);
-        }
+        for (Integer i = 0; i < day; i++) {
+            Long dayAfter = DateUtils.getDayAfter(nowTime, 1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(dayAfter));
+            int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+            String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
 
-        //判断当前是否为工作日
-        if (!DateUtils.isWorkingDay(dayAfter)) {
-            liveTime(nowTime,day + 1);
+            if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
+                day += 1;
+
+            }
+            //判断当前是否为工作日
+            if (!DateUtils.isWorkingDay(dayAfter)) {
+                day += 1;
+            }
+            nowTime = dayAfter;
         }
-        return dayAfter;
+
+        return nowTime;
     }
 
     private List<UserStudyRecordPhotoVo> entity2PhotoVo(Collection<UserStudyRecordPhoto> collection) {

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

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplySubscribeBo implements Serializable {
+
+    @ApiModelProperty("考生身份证号")
+    private String idCard;
+
+    @ApiModelProperty("联系方式")
+    private String telphone;
+
+    @ApiModelProperty("标识ID")
+    private Integer signId;
+
+    @ApiModelProperty("学员类型:1非补考 2补考")
+    private Integer studentType;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("考试日期")
+    private Long applyTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String applyStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String applyEndTime;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamBeforeKnowBo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月05日 10:49
+ */
+@Data
+public class ExamBeforeKnowBo implements Serializable {
+
+    private String key;
+
+    private String value;
+
+    private String type;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月18日 14:25
+ */
+@Data
+public class UpdateStudentImageBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("图片地址")
+    private String imageUrl;
+
+    @ApiModelProperty("学员身份证")
+    private String idCard;
+
+    @ApiModelProperty("旋转角度")
+    private Integer degree;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamApplyMapper.java

@@ -87,4 +87,6 @@ public interface ExamApplyMapper extends BaseMapper<ExamApply> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<ExamApplyUserDetailVo> getExamUserInfo(ExamApplyDetailVo bo);
+
+    List<Long> getApplyGoodsId(@Param("applyId") Long applyId,@Param("majorName")  String majorName);
 }

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

@@ -5,6 +5,7 @@ import com.zhongzheng.modules.exam.bo.*;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 
 import java.util.Collection;
@@ -88,4 +89,10 @@ public interface IExamApplyService extends IService<ExamApply> {
 	void examApplyResult(ExamApplyResultBo bo);
 
     List<ExamApplyDetailVo> examApplyDetail(ExamApplyDetailBo bo);
+
+	ExamBeforeKnowVo getBeforeKnow();
+
+	boolean saveOrUpBeforeKnow(ExamBeforeKnowBo bo);
+
+    List<Long> getApplyGoodsId(Long applyId, String majorName);
 }

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

@@ -34,6 +34,7 @@ import com.zhongzheng.modules.exam.domain.*;
 import com.zhongzheng.modules.exam.mapper.ExamApplyMapper;
 import com.zhongzheng.modules.exam.service.*;
 import com.zhongzheng.modules.exam.vo.*;
+import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.system.domain.SysConfig;
@@ -399,9 +400,59 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
         if (examUserApplyVo == null) {
             throw new CustomException("商品无考试计划,无需预约考试");
         }
+
+        //如果成绩已经出了,第2次约考需要等待15个工作日
+        UserSubscribe subscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                .eq(UserSubscribe::getUserId, bo.getUserId())
+                .eq(UserSubscribe::getGoodsId, bo.getGoodsId())
+                .eq(UserSubscribe::getSubscribeStatus, 1)
+                .eq(UserSubscribe::getOrderGoodsId, bo.getOrderGoodsId())
+                .eq(UserSubscribe::getResult, 2)
+                .orderByDesc(UserSubscribe::getCreateTime)
+                .last("limit 1"));
+        if (ObjectUtils.isNotNull(subscribe)) {
+            Long examTime = subscribe.getApplySiteExamTime();
+            //向后推15个工作日
+            Long applyEndTime = getApplyEndTime(examTime * 1000, 15);
+            if (DateUtils.getNowTime() < applyEndTime){
+                throw new CustomException("成绩审核中,请等待15个工作日后再预约!");
+            }
+        }
+
+        ExamApplySite site = iExamApplySiteService
+                .getOne(new LambdaQueryWrapper<ExamApplySite>()
+                .eq(ExamApplySite::getApplyId, examUserApplyVo.getApplyId())
+                .eq(ExamApplySite::getStatus, 1)
+                .last("limit 1"));
+        if (ObjectUtils.isNotNull(site)){
+            ExamSite examSite = iExamSiteService.getById(site.getSiteId());
+            examUserApplyVo.setApplySite(examSite.getSiteAddress());
+        }
         return examUserApplyVo;
     }
 
+    private Long getApplyEndTime(Long millisecond, Integer day) {
+        for (Integer i = 0; i < day; i++) {
+            Long dayAfter = DateUtils.getDayBefore(millisecond, 1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(dayAfter));
+            int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+            String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+
+            if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
+                day += 1;
+
+            }
+            //判断当前是否为工作日
+            if (!DateUtils.isWorkingDay(dayAfter)) {
+                day += 1;
+            }
+            millisecond = dayAfter;
+        }
+
+        return millisecond;
+    }
+
     @Override
     public Long subscribeNext(ExamApplyQueryBo bo) {
         //查看是否有无考试记录
@@ -888,6 +939,51 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
         return vo;
     }
 
+    @Override
+    public ExamBeforeKnowVo getBeforeKnow() {
+        SysConfig config = iSysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
+                .eq(SysConfig::getConfigKey, "before.exam.know").last("limit 1"));
+        if (ObjectUtils.isNull(config)){
+            return new ExamBeforeKnowVo();
+        }
+        ExamBeforeKnowVo knowVo = new ExamBeforeKnowVo();
+        knowVo.setKey(config.getConfigKey());
+        knowVo.setValue(config.getConfigValue());
+        knowVo.setType(config.getConfigType());
+        return knowVo;
+    }
+
+    @Override
+    public boolean saveOrUpBeforeKnow(ExamBeforeKnowBo bo) {
+        if (StringUtils.isNotBlank(bo.getKey())){
+            //修改
+            iSysConfigService.update(new LambdaUpdateWrapper<SysConfig>()
+            .set(StringUtils.isNotBlank(bo.getValue()),SysConfig::getConfigValue,bo.getValue())
+            .set(StringUtils.isNotBlank(bo.getType()),SysConfig::getConfigType,bo.getType())
+            .eq(SysConfig::getConfigKey,bo.getKey()));
+        }else {
+            //新增
+            SysConfig sysConfig = new SysConfig();
+            sysConfig.setConfigKey("before.exam.know");
+            sysConfig.setConfigName("七大员考前需知");
+            sysConfig.setConfigValue(bo.getValue());
+            sysConfig.setConfigType(bo.getType());
+            sysConfig.setCreateBy("admin");
+            sysConfig.setCreateTime(new Date());
+            sysConfig.setUpdateBy("admin");
+            sysConfig.setUpdateTime(new Date());
+            sysConfig.setConfigModule("sys");
+            iSysConfigService.save(sysConfig);
+        }
+        return true;
+    }
+
+    @Override
+    public List<Long> getApplyGoodsId(Long applyId, String majorName) {
+        return baseMapper.getApplyGoodsId(applyId, majorName);
+    }
+
+
     private void userStudyRecord(String userPath, List<UserSubscribe> list) {
         Map<Long, List<UserSubscribe>> map = list.stream().collect(Collectors.groupingBy(UserSubscribe::getUserId));
         map.forEach((k, v) -> {

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamBeforeKnowVo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.exam.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月05日 10:49
+ */
+@Data
+public class ExamBeforeKnowVo implements Serializable {
+
+    private String key;
+
+    private String value;
+
+    private String type;
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamSessionVo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月04日 14:51
+ */
+@Data
+public class ExamSessionVo implements Serializable {
+
+    @ApiModelProperty("考场场次")
+    private String examSession;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考点开始时间")
+    private String examStartTime;
+
+    @ApiModelProperty("考点结束时间")
+    private String examEndTime;
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamUserApplyVo.java

@@ -36,6 +36,9 @@ public class ExamUserApplyVo {
 	@ApiModelProperty("考试简介")
 	private String applyIntroduce;
 
+	@ApiModelProperty("考试地点")
+	private String applySite;
+
 	/** 开始日期 */
 	@Excel(name = "开始日期")
 	@ApiModelProperty("开始日期")

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月28日 9:28
+ */
+@Data
+public class GoodsHandoutsCopyTenantBo implements Serializable {
+
+    @ApiModelProperty("机构ID")
+    private List<Long> tenantId;
+
+    @ApiModelProperty("讲义ID")
+    private Long handoutsId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+}

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

@@ -75,4 +75,7 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     Goods getGoodsByTenantTwo(@Param("goodsName") String goodsName,@Param("code") String code,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateHandoutsId(@Param("goodsId") Long goodsId,@Param("tenantId") Long tenantId,@Param("handoutsId") Long handoutsId);
 }

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

@@ -138,4 +138,8 @@ public interface IGoodsService extends IService<Goods> {
     Goods getGoodsByTenantTwo(String goodsName, String code, Long tenantId);
 
     boolean goodsNodeCopyAddTenant(GoodsNodeCopyTenantBo bo);
+
+	Goods queryGoodsByIdTenant(Long goodsId, Long tenantId);
+
+    boolean goodsHandoutsCopyAddTenant(GoodsHandoutsCopyTenantBo bo);
 }

+ 379 - 28
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -157,6 +157,8 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     private ICourseHandoutsService iCourseHandoutsService;
     @Autowired
     private ICourseHandoutsBusinessService iCourseHandoutsBusinessService;
+    @Autowired
+    private ICourseFileService iCourseFileService;
 
     @Autowired
     private ICourseEducationTierService iCourseEducationTierService;
@@ -497,6 +499,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         lqw.eq(StrUtil.isNotBlank(bo.getCoverUrl()), Goods::getCoverUrl, bo.getCoverUrl());
         lqw.eq(bo.getClassHours() != null, Goods::getClassHours, bo.getClassHours());
         lqw.eq(StrUtil.isNotBlank(bo.getStandPriceJson()), Goods::getStandPriceJson, bo.getStandPriceJson());
+        lqw.in(bo.getGoodsIds() != null, Goods::getGoodsId, bo.getGoodsIds());
         return entity2Vo(this.list(lqw));
     }
 
@@ -571,7 +574,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             menuListAddBo.setMenuList(bo.getMenuList());
             iCourseMenuService.insertByGoodsAddBo(menuListAddBo);
         }
-
+        Long goodsId = add.getGoodsId();
         //七大员商品,默认绑定七大员学员资料模板
         CourseEducationType educationType = iCourseEducationTypeService.getById(add.getEducationTypeId());
         CourseBusiness business = iCourseBusinessService.getById(add.getBusinessId());
@@ -587,9 +590,8 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                 .eq(ProfileTp::getStatus,1));
                 profileTpList.forEach(item -> {
                     if (StringUtils.isNotBlank(item.getGoodsIds())){
-                        List<String> goodsIds = Arrays.asList(item.getGoodsIds().split(","));
-                        goodsIds.add(add.getGoodsId().toString());
-                        item.setGoodsIds(goodsIds.stream().collect(Collectors.joining(",")));
+                        String ids = item.getGoodsIds();
+                        item.setGoodsIds(ids+","+goodsId);
                     }
                 });
                 iProfileTpService.updateBatchById(profileTpList);
@@ -737,20 +739,20 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         }
 
         //修改商品课程节观看权限
-       /* List<CourseMenuAddBo> menuList = bo.getMenuList();
-        if (CollectionUtils.isEmpty(menuList)) {
-            //商品下没有课程/节
-            iCourseSectionWatchPerService.update(new LambdaUpdateWrapper<CourseSectionWatchPer>()
-                    .set(CourseSectionWatchPer::getStatus, 0)
-                    .eq(CourseSectionWatchPer::getGoodsId, bo.getGoodsId()));
-        } else {
-            //对比观看权限
-            List<Long> courseIds = menuList.stream().map(CourseMenuAddBo::getCourseId).collect(Collectors.toList());
-            iCourseSectionWatchPerService.update(new LambdaUpdateWrapper<CourseSectionWatchPer>()
-                    .set(CourseSectionWatchPer::getStatus, 0)
-                    .eq(CourseSectionWatchPer::getGoodsId, bo.getGoodsId())
-                    .notIn(CourseSectionWatchPer::getCourseId, courseIds));
-        }*/
+//        List<CourseMenuAddBo> menuList = bo.getMenuList();
+//        if (CollectionUtils.isEmpty(menuList)) {
+//            //商品下没有课程/节
+//            iCourseSectionWatchPerService.update(new LambdaUpdateWrapper<CourseSectionWatchPer>()
+//                    .set(CourseSectionWatchPer::getStatus, 0)
+//                    .eq(CourseSectionWatchPer::getGoodsId, bo.getGoodsId()));
+//        } else {
+//            //对比观看权限
+//            List<Long> courseIds = menuList.stream().map(CourseMenuAddBo::getCourseId).collect(Collectors.toList());
+//            iCourseSectionWatchPerService.update(new LambdaUpdateWrapper<CourseSectionWatchPer>()
+//                    .set(CourseSectionWatchPer::getStatus, 0)
+//                    .eq(CourseSectionWatchPer::getGoodsId, bo.getGoodsId())
+//                    .notIn(CourseSectionWatchPer::getCourseId, courseIds));
+//        }
 
         return this.updateById(update);
     }
@@ -1518,10 +1520,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                     if (ObjectUtil.isNotNull(courseHandouts)){
                         Long oid = courseHandouts.getHandoutsId();
                         Long newId = getNewIdByTenant(oid, GoodsCopyEnum.COURSE_HANDOUTS.getType(),newTenantId);
-//                    CourseHandouts newCourseHandouts = iCourseHandoutsService.getHandoutsByTenant(courseHandouts.getEncoder(),newTenantId);
-                        if (ObjectUtil.isNotNull(newId)){
-                            goods.setHandoutsId(newId);
-                        }else {
+                        if (ObjectUtil.isNull(newId)){
                             //讲义业务层次
                             List<CourseHandoutsBusiness> handoutsBusinessList = iCourseHandoutsBusinessService
                                     .list(new LambdaQueryWrapper<CourseHandoutsBusiness>()
@@ -1529,6 +1528,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                             courseHandouts.setHandoutsId(null);
                             courseHandouts.setTenantId(newTenantId);
                             iCourseHandoutsService.save(courseHandouts);
+                            newId = courseHandouts.getHandoutsId();
                             addSysGoodsRecord(oid,courseHandouts.getHandoutsId(),GoodsCopyEnum.COURSE_HANDOUTS.getType(),newTenantId,recordList);
                             goods.setHandoutsId(courseHandouts.getHandoutsId());
                             if (CollectionUtils.isNotEmpty(handoutsBusinessList)){
@@ -1548,6 +1548,14 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                                 iCourseHandoutsBusinessService.saveBatch(collect);
                             }
                         }
+                        goods.setHandoutsId(newId);
+                        //讲义文件
+                        iCourseFileService.deleteByTenant(newId,newTenantId);
+                        List<CourseFile> courseFileList = iCourseFileService.list(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, oid).eq(CourseFile::getStatus, 1));
+                        if (CollectionUtils.isNotEmpty(courseFileList)){
+                            //重新添加讲义文件
+                            handleCourseFile(courseFileList,newId,newTenantId);
+                        }
                     }
                 }
 
@@ -1751,6 +1759,37 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return true;
     }
 
+    private void handleCourseFile(List<CourseFile> courseFileList, Long newId, Long newTenantId) {
+        //父级
+        List<CourseFile> collect = courseFileList.stream().filter(x -> ObjectUtils.isNull(x.getParentId()) || x.getParentId() == 0).collect(Collectors.toList());
+        List<CourseFile> collect1 = courseFileList.stream().filter(x -> ObjectUtils.isNotNull(x.getParentId()) && x.getParentId() != 0).collect(Collectors.toList());
+        for (CourseFile item : collect) {
+            item.setOldId(item.getFileId());
+            item.setFileId(null);
+            item.setHandoutsId(newId);
+            item.setTenantId(newTenantId);
+            iCourseFileService.save(item);
+            recursionHandle(item,collect1,newId,newTenantId);
+        }
+
+    }
+
+    private void recursionHandle(CourseFile file, List<CourseFile> courseFiles, Long newId, Long newTenantId) {
+        List<CourseFile> collect = courseFiles.stream().filter(x -> x.getParentId().equals(file.getOldId())).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(collect)){
+            for (CourseFile courseFile : collect) {
+                courseFile.setOldId(courseFile.getFileId());
+                courseFile.setFileId(null);
+                courseFile.setHandoutsId(newId);
+                courseFile.setTenantId(newTenantId);
+                courseFile.setParentId(file.getFileId());
+                iCourseFileService.save(courseFile);
+                recursionHandle(courseFile,courseFiles,newId,newTenantId);
+            }
+        }
+    }
+
+    @Override
     public boolean goodsCopyOne(GoodsBatchCopyTenantBo bo){
 
         log.info("一建商品复制开始:"+ DateUtils.getTime());
@@ -2575,15 +2614,16 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                     .eq(CourseMenuExam::getCourseId, oldCourseId)
                     .eq(CourseMenuExam::getModuleId, oldModuleId));
             if (CollectionUtils.isNotEmpty(examList)){
+                List<CourseMenuExam> newCourseExams = new ArrayList<>();
                 for (CourseMenuExam menuExam : examList) {
-                    if (ObjectUtils.isNotNull(menuExam.getChapterId()) || menuExam.getChapterId() != 0){
+                    if (ObjectUtils.isNotNull(menuExam.getChapterId()) && menuExam.getChapterId() != 0){
                         Long newChapterId = getNewIdByTenant(menuExam.getChapterId(),GoodsCopyEnum.COURSE_CHAPTER.getType(),newTenantId);
                         if (ObjectUtils.isNull(newChapterId)){
                             continue;
                         }
                         menuExam.setChapterId(newChapterId);
                     }
-                    if (ObjectUtils.isNotNull(menuExam.getSectionId()) || menuExam.getSectionId() != 0){
+                    if (ObjectUtils.isNotNull(menuExam.getSectionId()) && menuExam.getSectionId() != 0){
                         Long newSectionId = getNewIdByTenant(menuExam.getSectionId(),GoodsCopyEnum.COURSE_SECTION.getType(),newTenantId);
                         if (ObjectUtils.isNull(newSectionId)){
                             continue;
@@ -2595,8 +2635,11 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                     menuExam.setModuleId(newModuleId);
                     menuExam.setExamId(getNewExamId(menuExam.getExamId(),newTenantId,array));
                     menuExam.setTenantId(newTenantId);
+                    newCourseExams.add(menuExam);
+                }
+                if (CollectionUtils.isNotEmpty(newCourseExams)){
+                    iCourseMenuExamService.saveBatch(newCourseExams);
                 }
-                iCourseMenuExamService.saveBatch(examList);
             }
         }
 
@@ -2653,6 +2696,131 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         }
         return null;
     }
+
+    private void disposeChapter(Long oldChapterId,Long oldModuleId,Long newTenantId,Long oldCourseId,Long newCourseId,List<SysGoodsCopyRecord> array){
+        CourseChapter chapter = iCourseChapterService.getById(oldChapterId);
+        if (ObjectUtils.isNotNull(chapter)){
+            Long oid = chapter.getChapterId();
+            Long newChapterId = getNewIdByTenant(oid,GoodsCopyEnum.COURSE_CHAPTER.getType(),newTenantId);
+            if (ObjectUtils.isNull(newChapterId)){
+                chapter.setChapterId(null);
+                chapter.setTenantId(newTenantId);
+                iCourseChapterService.save(chapter);
+                newChapterId = chapter.getChapterId();
+                addSysGoodsRecord(oid,newChapterId,GoodsCopyEnum.COURSE_CHAPTER.getType(),newTenantId,array);
+            }
+            //删除之前的关联
+            iCourseChapterBusinessService.deleteByIdAndTenant(newChapterId,newTenantId);
+            //新关联
+            List<CourseChapterBusiness> chapterBusinessList = iCourseChapterBusinessService
+                    .list(new LambdaQueryWrapper<CourseChapterBusiness>()
+                            .eq(CourseChapterBusiness::getChapterId, oldChapterId));
+            if (CollectionUtils.isNotEmpty(chapterBusinessList)){
+                for (CourseChapterBusiness item : chapterBusinessList) {
+                    item.setId(null);
+                    item.setChapterId(newChapterId);
+                    item.setTenantId(newTenantId);
+                    item.setEducationTypeId(getNewEducationTypeId(item.getEducationTypeId(), newTenantId,array));
+                    item.setBusinessId(getNewBusinessId(item.getBusinessId(), newTenantId,array));
+                    item.setSubjectId(getNewSubjectId(item.getSubjectId(), newTenantId,array));
+                    item.setProjectId(getNewProjectTypeId(item.getProjectId(), newTenantId,array));
+                }
+                iCourseChapterBusinessService.saveBatch(chapterBusinessList);
+            }
+
+            //章节关联
+            iCourseChapterSectionService.deleteByIdAndTenant(newChapterId,newTenantId);
+            List<CourseChapterSection> chapterSectionList = iCourseChapterSectionService
+                    .list(new LambdaQueryWrapper<CourseChapterSection>()
+                            .eq(CourseChapterSection::getChapterId, oldChapterId));
+            if (CollectionUtils.isNotEmpty(chapterSectionList)){
+                for (CourseChapterSection item : chapterSectionList) {
+                    item.setId(null);
+                    item.setChapterId(newChapterId);
+                    item.setTenantId(newTenantId);
+                    item.setSectionId(getNewSectionId(item.getSectionId(),newTenantId,array));
+                }
+                iCourseChapterSectionService.saveBatch(chapterSectionList);
+            }
+
+            if (ObjectUtils.isNotNull(oldModuleId)){
+                //模块章关联
+                Long newModuleId = getNewIdByTenant(oldModuleId,GoodsCopyEnum.COURSE_MODULE.getType(),newTenantId);
+                if (ObjectUtils.isNull(newModuleId)){
+                    throw new CustomException("当前章节模块在对应机构不存在,请检查!");
+                }
+               CourseModuleChapter moduleChapter =  iCourseModuleChapterService.getByTenant(newModuleId,newChapterId,newTenantId);
+                if (ObjectUtils.isNull(moduleChapter)){
+                    //不存在就新增
+                    CourseModuleChapter oldEntity = iCourseModuleChapterService
+                            .getOne(new LambdaQueryWrapper<CourseModuleChapter>()
+                            .eq(CourseModuleChapter::getModuleId, oldModuleId)
+                            .eq(CourseModuleChapter::getChapterId, oldChapterId)
+                            .last("limit 1"));
+                    if (ObjectUtils.isNotNull(oldEntity)){
+                        oldEntity.setId(null);
+                        oldEntity.setModuleId(newModuleId);
+                        oldEntity.setChapterId(newChapterId);
+                        oldEntity.setTenantId(newTenantId);
+                        iCourseModuleChapterService.save(oldEntity);
+                    }
+                }
+
+                //课程章试卷
+                iCourseMenuExamService.deleteChapterByIdTenant(newCourseId,newModuleId,newChapterId,newTenantId);
+                List<CourseMenuExam> examList = iCourseMenuExamService
+                        .list(new LambdaQueryWrapper<CourseMenuExam>()
+                                .eq(CourseMenuExam::getCourseId, oldCourseId)
+                                .eq(CourseMenuExam::getModuleId, oldModuleId)
+                                .eq(CourseMenuExam::getChapterId,oldChapterId));
+                if (CollectionUtils.isNotEmpty(examList)){
+                    List<CourseMenuExam> newCourseExams = new ArrayList<>();
+                    for (CourseMenuExam menuExam : examList) {
+                        if (ObjectUtils.isNotNull(menuExam.getSectionId()) && menuExam.getSectionId() != 0){
+                            Long newSectionId = getNewIdByTenant(menuExam.getSectionId(),GoodsCopyEnum.COURSE_SECTION.getType(),newTenantId);
+                            if (ObjectUtils.isNull(newSectionId)){
+                                continue;
+                            }
+                            menuExam.setSectionId(newSectionId);
+                        }
+                        menuExam.setId(null);
+                        menuExam.setCourseId(newCourseId);
+                        menuExam.setModuleId(newModuleId);
+                        menuExam.setChapterId(newChapterId);
+                        menuExam.setExamId(getNewExamId(menuExam.getExamId(),newTenantId,array));
+                        menuExam.setTenantId(newTenantId);
+                        newCourseExams.add(menuExam);
+                    }
+                    if (CollectionUtils.isNotEmpty(newCourseExams)){
+                        iCourseMenuExamService.saveBatch(newCourseExams);
+                    }
+                }
+
+            }else {
+                //课程章关联
+                List<CourseMenu> courseMenus = iCourseMenuService.selectByNotTenant(newCourseId,2,newChapterId,newTenantId);
+                if (CollectionUtils.isEmpty(courseMenus)){
+                    //新增
+                    List<CourseMenu> list = iCourseMenuService
+                            .list(new LambdaQueryWrapper<CourseMenu>()
+                            .eq(CourseMenu::getCourseId, oldCourseId)
+                            .eq(CourseMenu::getMenuId, oldChapterId)
+                            .eq(CourseMenu::getType, 2));
+                    if (CollectionUtils.isNotEmpty(list)){
+                        for (CourseMenu item : list) {
+                            item.setId(null);
+                            item.setCourseId(newCourseId);
+                            item.setMenuId(newChapterId);
+                            item.setTenantId(newTenantId);
+                        }
+                        iCourseMenuService.saveBatch(list);
+                    }
+                }
+            }
+
+        }
+    }
+
     private Long getNewSectionId(Long oldSectionId,Long newTenantId,List<SysGoodsCopyRecord> array){
         CourseSection section = iCourseSectionService.getById(oldSectionId);
         if (ObjectUtils.isNotNull(section)){
@@ -2689,6 +2857,109 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         }
         return null;
     }
+
+    private void disposeSection(Long oldSectionId,Long oldChapterId,Long oldModuleId,Long newTenantId,Long oldCourseId,Long newCourseId,List<SysGoodsCopyRecord> array){
+        CourseSection section = iCourseSectionService.getById(oldSectionId);
+        if (ObjectUtils.isNotNull(section)){
+            Long oid = section.getSectionId();
+            Long newSectionId = getNewIdByTenant(oid,GoodsCopyEnum.COURSE_SECTION.getType(),newTenantId);
+            if (ObjectUtils.isNull(newSectionId)){
+                //新增
+                section.setSectionId(null);
+                section.setTenantId(newTenantId);
+                iCourseSectionService.save(section);
+                newSectionId = section.getSectionId();
+                addSysGoodsRecord(oid,newSectionId,GoodsCopyEnum.COURSE_SECTION.getType(),newTenantId,array);
+            }
+            //删除之前的关联
+            iCourseSectionBusinessService.deleteByIdAndTenant(newSectionId,newTenantId);
+            //新关联
+            List<CourseSectionBusiness> sectionBusinessList = iCourseSectionBusinessService
+                    .list(new LambdaQueryWrapper<CourseSectionBusiness>()
+                            .eq(CourseSectionBusiness::getSectionId, oldSectionId));
+            if (CollectionUtils.isNotEmpty(sectionBusinessList)){
+                for (CourseSectionBusiness item : sectionBusinessList) {
+                    item.setId(null);
+                    item.setSectionId(newSectionId);
+                    item.setTenantId(newTenantId);
+                    item.setEducationTypeId(getNewEducationTypeId(item.getEducationTypeId(), newTenantId,array));
+                    item.setBusinessId(getNewBusinessId(item.getBusinessId(), newTenantId,array));
+                    item.setSubjectId(getNewSubjectId(item.getSubjectId(), newTenantId,array));
+                    item.setProjectId(getNewProjectTypeId(item.getProjectId(), newTenantId,array));
+                }
+                iCourseSectionBusinessService.saveBatch(sectionBusinessList);
+            }
+
+            if (ObjectUtils.isNotNull(oldChapterId)){
+                //模块章节关联
+                Long newChapterId = getNewIdByTenant(oldChapterId,GoodsCopyEnum.COURSE_CHAPTER.getType(),newTenantId);
+                if (ObjectUtils.isNull(newChapterId)){
+                    throw new CustomException("当前章节在对应机构不存在,请检查!");
+                }
+                CourseChapterSection moduleChapter =  iCourseChapterSectionService.getByTenant(newChapterId,newSectionId,newTenantId);
+                if (ObjectUtils.isNull(moduleChapter)){
+                    //不存在就新增
+                    CourseChapterSection oldEntity = iCourseChapterSectionService
+                            .getOne(new LambdaQueryWrapper<CourseChapterSection>()
+                                    .eq(CourseChapterSection::getChapterId, oldChapterId)
+                                    .eq(CourseChapterSection::getSectionId, oldSectionId)
+                                    .last("limit 1"));
+                    if (ObjectUtils.isNotNull(oldEntity)){
+                        oldEntity.setId(null);
+                        oldEntity.setSectionId(newSectionId);
+                        oldEntity.setChapterId(newChapterId);
+                        oldEntity.setTenantId(newTenantId);
+                        iCourseChapterSectionService.save(oldEntity);
+                    }
+                }
+                Long newModuleId = getNewIdByTenant(oldModuleId,GoodsCopyEnum.COURSE_MODULE.getType(),newTenantId);
+                //课程章试卷
+                iCourseMenuExamService.deleteSectionByIdTenant(newCourseId,newModuleId,newChapterId,newSectionId,newTenantId);
+                List<CourseMenuExam> examList = iCourseMenuExamService
+                        .list(new LambdaQueryWrapper<CourseMenuExam>()
+                                .eq(CourseMenuExam::getCourseId, oldCourseId)
+                                .eq(CourseMenuExam::getModuleId, oldModuleId)
+                                .eq(CourseMenuExam::getChapterId,oldChapterId)
+                                .eq(CourseMenuExam::getSectionId,oldSectionId));
+                if (CollectionUtils.isNotEmpty(examList)){
+                    for (CourseMenuExam menuExam : examList) {
+                        menuExam.setSectionId(newSectionId);
+                        menuExam.setId(null);
+                        menuExam.setCourseId(newCourseId);
+                        menuExam.setModuleId(newModuleId);
+                        menuExam.setChapterId(newChapterId);
+                        menuExam.setExamId(getNewExamId(menuExam.getExamId(),newTenantId,array));
+                        menuExam.setTenantId(newTenantId);
+                    }
+                    iCourseMenuExamService.saveBatch(examList);
+                }
+
+            }else {
+                //课程节关联
+                List<CourseMenu> courseMenus = iCourseMenuService.selectByNotTenant(newCourseId,3,newSectionId,newTenantId);
+                if (CollectionUtils.isEmpty(courseMenus)){
+                    //新增
+                    List<CourseMenu> list = iCourseMenuService
+                            .list(new LambdaQueryWrapper<CourseMenu>()
+                                    .eq(CourseMenu::getCourseId, oldCourseId)
+                                    .eq(CourseMenu::getMenuId, oldChapterId)
+                                    .eq(CourseMenu::getType, 2));
+                    if (CollectionUtils.isNotEmpty(list)){
+                        for (CourseMenu item : list) {
+                            item.setId(null);
+                            item.setCourseId(newCourseId);
+                            item.setMenuId(newSectionId);
+                            item.setTenantId(newTenantId);
+                        }
+                        iCourseMenuService.saveBatch(list);
+                    }
+                }
+            }
+        }
+    }
+
+
+
     private Long getNewCertificateId(Long certificateId,Long newTenantId,List<SysGoodsCopyRecord> array){
         CertificateCommon certificateCommon = iCertificateCommonService.getById(certificateId);
         if (ObjectUtils.isNotNull(certificateCommon)){
@@ -4534,13 +4805,13 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     }
 
     @Override
+    @Transactional
     public boolean goodsNodeCopyAddTenant(GoodsNodeCopyTenantBo bo) {
         Goods goods = getById(bo.getGoodsId());
         if (ObjectUtils.isNull(goods)){
             throw new CustomException("商品信息获取有误");
         }
         Long oldGoodsId = goods.getGoodsId();
-        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
         switch (bo.getType()){
             case 1://课程复制
                 bo.getTenantId().forEach(newTenantId -> {
@@ -4587,14 +4858,94 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                     if (ObjectUtils.isNull(newCourseId)){
                         throw new CustomException("该机构不存在此商品课程,请先复制商品课程!");
                     }
-//                    disposeModule(bo.getModelId(),newTenantId,bo.getCourseId(),newCourseId,recordList);
+                    disposeChapter(bo.getChapterId(),bo.getModelId(),newTenantId,bo.getCourseId(),newCourseId,recordList);
                 });
                 break;
+            case 4://节复制
+                Course courseSection = iCourseService.getById(bo.getCourseId());
+                bo.getTenantId().forEach(newTenantId -> {
+                    List<SysGoodsCopyRecord> recordList = new ArrayList<>();
+                    Long newCourseId = iCourseService.getCourseByTenantTwo(courseSection.getCourseName(), courseSection.getCode(), newTenantId);
+                    if (ObjectUtils.isNull(newCourseId)){
+                        throw new CustomException("该机构不存在此商品课程,请先复制商品课程!");
+                    }
+                    disposeSection(bo.getSectionId(),bo.getChapterId(),bo.getModelId(),newTenantId,bo.getCourseId(),newCourseId,recordList);
+                });
+                break;
+            default:
+                break;
+        }
+        return true;
+    }
 
+    @Override
+    public Goods queryGoodsByIdTenant(Long goodsId, Long tenantId) {
+        return baseMapper.queryGoodsByIdTenant(goodsId,tenantId);
+    }
 
+    @Override
+    public boolean goodsHandoutsCopyAddTenant(GoodsHandoutsCopyTenantBo bo) {
+        CourseHandouts handouts = iCourseHandoutsService.getById(bo.getHandoutsId());
+        if (ObjectUtils.isNull(handouts)){
+            throw new CustomException("讲义不存在,请检查!");
         }
+        List<SysGoodsCopyRecord> array = new ArrayList<>();
+
+        Long oldId = handouts.getHandoutsId();
+        Goods goods = getById(bo.getGoodsId());
+        for (Long tenantId : bo.getTenantId()) {
+            //讲义复制
+            Goods goodsTwo = baseMapper.getGoodsByTenantTwo(goods.getGoodsName(), goods.getCode(), tenantId);
+            if (ObjectUtils.isNull(goodsTwo)){
+                continue;
+            }
+           List<Long> goodsIds = iCourseHandoutsService.getGoodsIds(goodsTwo.getHandoutsId(),tenantId);
+            if (goodsIds.stream().allMatch(x -> x.equals(goodsTwo.getGoodsId()))){
+                //删除讲义
+                iCourseHandoutsService.removeHandouts(goodsTwo.getHandoutsId(),tenantId);
+            }
+
+            //新增
+            handouts.setHandoutsId(null);
+            handouts.setTenantId(tenantId);
+            iCourseHandoutsService.save(handouts);
+            Long newId = handouts.getHandoutsId();
+
+            //业务层次
+            List<CourseHandoutsBusiness> list = iCourseHandoutsBusinessService
+                    .list(new LambdaQueryWrapper<CourseHandoutsBusiness>()
+                    .eq(CourseHandoutsBusiness::getHandoutsId, oldId));
+            if (CollectionUtils.isNotEmpty(list)){
+                List<CourseHandoutsBusiness> collect = list.stream().map(business -> {
+                    business.setId(null);
+                    business.setTenantId(tenantId);
+                    //项目
+                    business.setEducationId(getNewEducationTypeId(business.getEducationId(), tenantId,array));
+                    //业务
+                    business.setBusinessId(getNewBusinessId(business.getBusinessId(), tenantId,array));
+                    //科目
+                    business.setSubjectId(getNewSubjectId(business.getSubjectId(), tenantId,array));
+                    //讲义
+                    business.setHandoutsId(newId);
+                    return business;
+                }).collect(Collectors.toList());
+                iCourseHandoutsBusinessService.saveBatch(collect);
+            }
+
+            //讲义文件
+            List<CourseFile> courseFileList = iCourseFileService.list(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, oldId).eq(CourseFile::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(courseFileList)){
+                //重新添加讲义文件
+                handleCourseFile(courseFileList,newId,tenantId);
+            }
+
+            updateHandoutsId(goodsTwo.getGoodsId(),tenantId,newId);
+        }
+        return true;
+    }
 
-        return false;
+    private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
+        baseMapper.updateHandoutsId(goodsId,tenantId,handoutsId);
     }
 
     @Override

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsConfigVo.java

@@ -63,4 +63,9 @@ public class GoodsConfigVo {
 	@ApiModelProperty("班级名称")
 	private String gradeName;
 
+	@ApiModelProperty("官方班级名称")
+	private String officialName;
+
+	@ApiModelProperty("科目名称拼接")
+	private String subjectNames;
 }

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

@@ -396,4 +396,6 @@ public class GoodsUserVo {
 	private Long periodWaitTime;
 	@ApiModelProperty("是否是二建二造")
 	private Boolean erJianErZao;
+	@ApiModelProperty("是否可以预约标识:1未参加考试 2已参加考试 3考试成绩未通过")
+	private Integer subscribeSign;
 }

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

@@ -364,4 +364,7 @@ public class GoodsVo {
 	/** 班级类型 1基础班 2强化班 3私塾班 */
 	@ApiModelProperty("班级类型 1基础班 2强化班 3私塾班")
 	private Integer gradeType;
+	@ApiModelProperty("官方班级名称")
+	private String officialName;
+
 }

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

@@ -22,6 +22,7 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
 
     Collection<ClassGradeVo> queryList(ClassGradeQueryBo bo);
 
+
     List<GoodsVo> queryGoodsList(Long classId);
 
 

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

@@ -28,6 +28,8 @@ public interface IClassGradeService extends IService<ClassGrade> {
 	 */
 	List<ClassGradeVo> queryList(ClassGradeQueryBo bo);
 
+	List<ClassGradeVo> getList(ClassGradeQueryBo bo);
+
 	List<ClassGradeGoodsVo> listGoodsBatch(ClassGradeQueryBo bo);
 
 	/**

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

@@ -54,6 +54,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	String pushOfficialInfo(ClassGradeUserQueryBo bo);
 
+
+
 	ClassPeriodStudentVo DecryptOfficialInfo(ClassGradeDecryptQueryBo bo);
 
 	String pushOfficialInfoMore(List<ClassGradeUserQueryBo> list);

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

@@ -193,6 +193,15 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return classGradeVos;
     }
 
+    @Override
+    public List<ClassGradeVo> getList(ClassGradeQueryBo bo) {
+        List<ClassGradeVo> classGradeVos = entity2Vo(baseMapper.queryList(bo));
+        if (CollectionUtils.isEmpty(classGradeVos)) {
+            return new ArrayList<>();
+        }
+        return classGradeVos;
+    }
+
     @Override
     public List<ClassGradeGoodsVo> listGoodsBatch(ClassGradeQueryBo bo) {
         return baseMapper.listGoodsBatch(bo);

+ 2 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -151,7 +151,6 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
     @Autowired
     private ISysConfigService configService;
 
-
     @Value("${aliyun.oss.endpoint}")
     private String ALIYUN_OSS_ENDPOINT;
 
@@ -2525,7 +2524,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                         if (Validator.isNotEmpty(classPeriodSectionVo.getStudyEndTime()) && ChapterEndTime.longValue() < classPeriodSectionVo.getStudyEndTime().longValue()) {
                             ChapterEndTime = classPeriodSectionVo.getStudyEndTime();
                         }
-                        if (ChapterStartTime == 0L || ChapterStartTime.longValue() > classPeriodSectionVo.getStudyStartTime().longValue()) {
+                        if ((Validator.isNotEmpty(classPeriodSectionVo.getStudyStartTime())&&ChapterStartTime == 0L) || (Validator.isNotEmpty(classPeriodSectionVo.getStudyStartTime())&&ChapterStartTime.longValue() > classPeriodSectionVo.getStudyStartTime().longValue())) {
                             ChapterStartTime = classPeriodSectionVo.getStudyStartTime();
                         }
                     }
@@ -2570,7 +2569,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                     if ((Validator.isNotEmpty(classPeriodVo.getStudyStartTime()) && startTotalTime == 0L) || (Validator.isNotEmpty(classPeriodVo.getStudyStartTime()) && startTotalTime.longValue() > classPeriodVo.getStudyStartTime().longValue())) {
                         startTotalTime = classPeriodVo.getStudyStartTime();
                     }
-                    if (endTotalTime == 0L || (Validator.isNotEmpty(classPeriodVo.getStudyEndTime()) && endTotalTime.longValue() < classPeriodVo.getStudyEndTime().longValue())) {
+                    if ((Validator.isNotEmpty(classPeriodVo.getStudyEndTime()) &&endTotalTime == 0L) || (Validator.isNotEmpty(classPeriodVo.getStudyEndTime()) && endTotalTime.longValue() < classPeriodVo.getStudyEndTime().longValue())) {
                         endTotalTime = classPeriodVo.getStudyEndTime();
                     }
                     classPeriodVo.setPeriodStatus(userPeriodStatusVo.getPeriodStatus());

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderBusinessConfigGoodsQueryBo.java

@@ -48,4 +48,26 @@ public class OrderBusinessConfigGoodsQueryBo extends BaseEntity {
 	/** 0 未启用 1启用 */
 	@ApiModelProperty("0 未启用 1启用")
 	private Integer status;
+
+	/** 业务层次id */
+	@ApiModelProperty("业务层次ID")
+	private Long businessId;
+	@ApiModelProperty("项目类型ID")
+	private Long projectId;
+	@ApiModelProperty("教育类型ID")
+	private Long educationId;
+	/** 班级类型 1基础班 2强化班 3私塾班 */
+	@ApiModelProperty("班级类型 1基础班 2强化班 3私塾班")
+	private Integer gradeType;
+	/** 项目名称 */
+	@ApiModelProperty("项目名称")
+	private String projectName;
+
+	/** 教育类型名称 */
+	@ApiModelProperty("教育类型名称")
+	private String educationName;
+	@ApiModelProperty("业务名称")
+	private String businessName;
+	@ApiModelProperty("科目名称")
+	private Long subjectName;
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderBusinessConfigQueryBo.java

@@ -56,4 +56,13 @@ public class OrderBusinessConfigQueryBo extends BaseEntity {
 	/** 科目ID */
 	@ApiModelProperty("科目ID")
 	private Long subjectId;
+	/** 项目名称 */
+	@ApiModelProperty("项目名称")
+	private String projectName;
+
+	/** 教育类型名称 */
+	@ApiModelProperty("教育类型名称")
+	private String educationName;
+	@ApiModelProperty("业务名称")
+	private String businessName;
 }

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

@@ -66,4 +66,6 @@ public interface OrderGoodsMapper extends BaseMapper<OrderGoods> {
     List<TopOldOrderGoodsListVo> listByOrderSn(TopOldOrderGoodsQuery query);
 
     String getBusinessById(@Param("orderGoodsId") Long orderGoodsId);
+
+    List<OrderGoods> getApplyOrderGoods(@Param("goodsIds")List<Long> goodsIds,@Param("userId") Long userId);
 }

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

@@ -116,4 +116,6 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
     List<TopOldOrderGoodsListVo> listByOrderSn(TopOldOrderGoodsQuery query);
 
     String getBusinessById(Long orderGoodsId);
+
+    List<OrderGoods> getApplyOrderGoods(List<Long> goodsIds, Long userId);
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderBusinessConfigServiceImpl.java

@@ -11,8 +11,11 @@ import com.zhongzheng.modules.order.bo.OrderBusinessConfigEditBo;
 import com.zhongzheng.modules.order.bo.OrderBusinessConfigQueryBo;
 import com.zhongzheng.modules.order.domain.OrderBusinessConfig;
 import com.zhongzheng.modules.order.mapper.OrderBusinessConfigMapper;
+import com.zhongzheng.modules.order.service.IOrderBusinessConfigGoodsService;
 import com.zhongzheng.modules.order.service.IOrderBusinessConfigService;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.vo.OrderBusinessConfigVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -33,6 +36,10 @@ import java.util.stream.Collectors;
 @Service
 public class OrderBusinessConfigServiceImpl extends ServiceImpl<OrderBusinessConfigMapper, OrderBusinessConfig> implements IOrderBusinessConfigService {
 
+    @Autowired
+    private IOrderBusinessConfigGoodsService iOrderBusinessConfigGoodsService;
+
+
     @Override
     public OrderBusinessConfigVo queryById(Long id){
         OrderBusinessConfig db = this.baseMapper.selectById(id);
@@ -53,6 +60,7 @@ public class OrderBusinessConfigServiceImpl extends ServiceImpl<OrderBusinessCon
         return this.baseMapper.getList(bo);
     }
 
+
     @Override
     public OrderBusinessConfigVo getDetail(OrderBusinessConfigQueryBo bo) {
         return this.baseMapper.getDetail(bo);

+ 31 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java

@@ -552,6 +552,7 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
 
             Long secLong = 0L;
             Long studyLong = 0L;
+            Integer studyStatus = 0;
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
             subjectStudyRecordQueryBo.setGoodsId(goodsVo.getGoodsId());
             subjectStudyRecordQueryBo.setUserId(bo.getUserId());
@@ -561,9 +562,15 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
             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();
+                studyStatus = studyStatus + subjectStudyRecordVo.getStudyStatus();
             }
             goodsVo.setSecAllNum(secLong);
             goodsVo.setStuAllNum(studyLong);
+            if(studyStatus>0){
+                goodsVo.setStudyStatus(2);
+            }else{
+                goodsVo.setStudyStatus(1);
+            }
             if(goodsVo.getGoodsType()==1){
                 //视频商品
                 //获得当前所在班级
@@ -582,7 +589,7 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                 goodsVo.setInterfaceAccountId(classGradeVo.getInterfaceAccountId());
                 goodsVo.setLearnStatus(classGradeVo.getLearnStatus());
                 goodsVo.setPeriodWaitTime(classGradeVo.getPeriodWaitTime());
-
+                goodsVo.setSubscribeSign(2);
                 LambdaQueryWrapper<UserSubscribe> lq = Wrappers.lambdaQuery();
                 lq.eq(UserSubscribe::getOrderGoodsId, goodsVo.getOrderGoodsId());
                 lq.eq(UserSubscribe::getSubscribeStatus, 1);
@@ -603,9 +610,27 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                         }
                     }
                 }
+
                 //查询对应考试安排
                 List<ExamApplyGoodsVo> examApplyGoodsVoList = iExamApplyGoodsService.listByGoodsId(goodsVo.getGoodsId());
                 if (examApplyGoodsVoList != null && examApplyGoodsVoList.size() > 0) {
+                    //是否满足预约考试条件
+                    if (ObjectUtils.isNotNull(classGradeVo.getPeriodStatus())
+                            && classGradeVo.getPeriodStatus() == 1
+                            && (DateUtils.getNowTime() >= goodsVo.getServiceStartTime() && DateUtils.getNowTime() <= goodsVo.getServiceEndTime())){
+                        UserSubscribe subscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                                .eq(UserSubscribe::getUserId, bo.getUserId())
+                                .eq(UserSubscribe::getGoodsId, goodsVo.getGoodsId())
+                                .eq(UserSubscribe::getSubscribeStatus, 1)
+                                .orderByDesc(UserSubscribe::getCreateTime)
+                                .last("limit 1"));
+                        if (ObjectUtils.isNull(subscribe)){
+                            goodsVo.setSubscribeSign(1);
+                        }else if (ObjectUtils.isNotNull(subscribe.getResult()) && subscribe.getResult() == 0){
+                            goodsVo.setSubscribeSign(3);
+                        }
+                    }
+
                     List<ExamApplyGoodsVo> examApplyGoodsVos = new ArrayList<>();
                     List<ExamApplyGoodsVo> examApplyGoodsVos2 = new ArrayList<>();
                     examApplyGoodsVoList.forEach(examApplyGoodsVo -> {
@@ -694,6 +719,11 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         return baseMapper.getBusinessById(orderGoodsId);
     }
 
+    @Override
+    public List<OrderGoods> getApplyOrderGoods(List<Long> goodsIds, Long userId) {
+        return baseMapper.getApplyOrderGoods(goodsIds,userId);
+    }
+
     private boolean checkUnique(Long GoodsId,Long UserId) {
         ShoppingCart info = iShoppingCartService.getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,UserId).eq(ShoppingCart::getGoodsId,GoodsId).last("limit 1"));

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

@@ -51,5 +51,9 @@ public class OrderBusinessConfigGoodsVo {
 	private String educationName;
 	@ApiModelProperty("项目名称")
 	private String projectName;
+	/** 配置名称 */
+	@Excel(name = "配置名称")
+	@ApiModelProperty("配置名称")
+	private String configName;
 	private List<GoodsVo> goodsList;
 }

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

@@ -341,4 +341,9 @@ public class OrderGoodsVo {
 	private Long periodWaitTime;
 	@ApiModelProperty("是否是二建二造")
 	private Boolean erJianErZao;
+	@ApiModelProperty("1未开始 2已开始")
+	private Integer studyStatus;
+
+	@ApiModelProperty("是否可以预约标识:1未参加考试 2已参加考试 3考试成绩未通过")
+	private Integer subscribeSign;
 }

+ 37 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -1705,16 +1705,16 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                 //创建考试
                 ExamApply examApply = new ExamApply();
                 examApply.setApplyUrl("oss/images/avatar/20211013/1634097664410_1397766697");//默认图片地址
-                examApply.setApplyName(String.format("【%s-%s】考试",getTimeStr(millisecond,item.getStartTime()),getTimeStr(millisecond,item.getEndTime())));
+                examApply.setApplyName(String.format("【%s-%s】【%s】的考试",getTimeStr(millisecond,item.getStartTime()),getTimeStr(millisecond,item.getEndTime()),getWeeks(millisecond)));
                 examApply.setApplyIntroduce("系统生成");
                 examApply.setApplyStatus("1,2");
 
-                Long dayBefore = DateUtils.getDayBefore(millisecond,14);
+                Long dayBefore = getApplyEndTime(millisecond,7);
                 if (DateUtils.getNowTime() > dayBefore){
                     examApply.setApplyStartTime(DateUtils.getDayBefore(dayBefore,30));
                     examApply.setApplyEndTime(dayBefore);
                 }else {
-                    examApply.setApplyStartTime(DateUtils.getNowTime());
+                    examApply.setApplyStartTime(DateUtils.getDayBefore(dayBefore,30));
                     examApply.setApplyEndTime(dayBefore);
                 }
                 examApply.setCreateTime(DateUtils.getNowTime());
@@ -1773,6 +1773,36 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
 
     }
 
+    private String getWeeks(Long time){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(DateUtils.timeToDate(time));
+        int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+        String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+        return weeks[index];
+    }
+
+    private Long getApplyEndTime(Long millisecond, Integer day) {
+        for (Integer i = 0; i < day; i++) {
+            Long dayAfter = DateUtils.getDayBefore(millisecond, 1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtils.timeToDate(dayAfter));
+            int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+            String[] weeks = new String[]{"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+
+            if (weeks[index].equals("星期六") || weeks[index].equals("星期天")) {
+                day += 1;
+
+            }
+            //判断当前是否为工作日
+            if (!DateUtils.isWorkingDay(dayAfter)) {
+                day += 1;
+            }
+            millisecond = dayAfter;
+        }
+
+        return millisecond;
+    }
+
     private Long getTime(Long applyTime,String siteTime){
         String content = DateUtils.timestampToDateFormat(applyTime, "yyyy-MM-dd");
         String format1 = String.format("%s %s", content, siteTime);
@@ -2359,26 +2389,23 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     public void liveToReplay(UserQueryBo bo) {
         Long nowTime = DateUtils.getNowTime();
         Long startTime = nowTime - 3600 * 24 * 7;
-        //获取今天直播结束的所有直播节
         List<CourseSectionVo> list = iCourseSectionService.overSectionList(startTime, nowTime);
         for (CourseSectionVo sectionVo : list) {
             PolyvLiveQueryBo queryBo = new PolyvLiveQueryBo();
             try {
-                queryBo.setChannelId(sectionVo.getLiveUrl()); //频道房间ID
+                queryBo.setChannelId(sectionVo.getLiveUrl());
                 queryBo.setStartTime(startTime);
                 queryBo.setEndTime(nowTime);
                 LiveChannelVideoListResponse.ChannelVedioInfo info = iPolyvLiveService.getListChannelSession(queryBo);
                 if (Validator.isNotEmpty(info)) {
-                    //秒数误差在3个小时以内的判定为节的保利威直播
                     if (Math.abs(sectionVo.getLiveEndTime().longValue() - (info.getEndTime().getTime() / 1000)) < 10800) {
                         if ("complete".equals(info.getRecordFileType())) {
                             CourseSection oldSection = iCourseSectionService.getOne(new LambdaQueryWrapper<CourseSection>()
                                     .eq(CourseSection::getSessionId, info.getChannelSessionId())
                                     .last("limit 1"));
                             if (Validator.isEmpty(oldSection)) {
-                                //录播完成状态且场次ID没被使用
-                                sectionVo.setSessionId(info.getChannelSessionId());//场次ID
-                                sectionVo.setRealDuration(info.getDuration().longValue()); //视频秒数
+                                sectionVo.setSessionId(info.getChannelSessionId());
+                                sectionVo.setRealDuration(info.getDuration().longValue());
                                 sectionVo.setDurationTime(info.getDuration().longValue());
                                 sectionVo.setRealLiveEndTime(info.getEndTime().getTime() / 1000);
                                 sectionVo.setRealLiveStartTime(info.getStartTime().getTime() / 1000);
@@ -2387,7 +2414,7 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
                                 queryBo1.setSessionId(info.getChannelSessionId());
                                 LiveListChannelVideoLibraryResponse.ChannelVideoLibrary channelVideoLibrary = iPolyvLiveService.ListChannelVideoLibrary(queryBo1);
                                 sectionVo.setRecordingUrl(channelVideoLibrary.getVideoPoolId());*/
-                                sectionVo.setSectionType(3); //直播变为回放
+                                sectionVo.setSectionType(3);
                                 CourseSection section = BeanUtil.toBean(sectionVo, CourseSection.class);
                                 section.setUpdateTime(DateUtils.getNowTime());
                                 iCourseSectionService.updateById(section);

+ 0 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java

@@ -1308,8 +1308,6 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                             }
                         }
                     });
-                    //消息通知教务
-//                    this.informRemind(userNames);
                     break;
                 case 2: //审核未通过
                     topOldOrderGoods.forEach(item -> {

+ 8 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/service/impl/TopOrderRecNoteServiceImpl.java

@@ -198,9 +198,9 @@ public class TopOrderRecNoteServiceImpl extends ServiceImpl<TopOrderRecNoteMappe
         }
         //每周
         TopOrderRecNoteQueryBo queryBo2 = new TopOrderRecNoteQueryBo();
-        queryBo1.setNoteType(3L);
-        queryBo1.setStatus(1);
-        queryBo1.setLastTime(DateUtils.getNowTime()-(24*3600));//一天只推一次
+        queryBo2.setNoteType(3L);
+        queryBo2.setStatus(1);
+        queryBo2.setLastTime(DateUtils.getNowTime()-(24*3600));//一天只推一次
         List<TopOrderRecNoteVo> list2 = queryList(queryBo2);
         for(TopOrderRecNoteVo vo : list2){
             String[] splitWeek=vo.getWeekTime().split(",");
@@ -218,16 +218,16 @@ public class TopOrderRecNoteServiceImpl extends ServiceImpl<TopOrderRecNoteMappe
         }
         //每月
         TopOrderRecNoteQueryBo queryBo3 = new TopOrderRecNoteQueryBo();
-        queryBo1.setNoteType(4L);
-        queryBo1.setStatus(1);
-        queryBo1.setLastTime(DateUtils.getNowTime()-(24*3600));//一天只推一次
+        queryBo3.setNoteType(4L);
+        queryBo3.setStatus(1);
+        queryBo3.setLastTime(DateUtils.getNowTime()-(24*3600));//一天只推一次
         List<TopOrderRecNoteVo> list3 = queryList(queryBo3);
         for(TopOrderRecNoteVo vo : list3){
             String[] splitMonth=vo.getMonthTime().split(",");
             for(String month : splitMonth){
                 Calendar cal = Calendar.getInstance();
-                Integer day_moneth=cal.get(Calendar.DAY_OF_MONTH);
-                if(day_moneth==Integer.parseInt(month)){
+                Integer day_month=cal.get(Calendar.DAY_OF_MONTH);
+                if(day_month==Integer.parseInt(month)){
                     String dayStr = DateUtils.getDate();
                     String timeStr = dayStr+" "+vo.getDayTime()+":00";
                     Long time = DateUtils.dateTimeSec(DateUtils.YYYY_MM_DD_HH_MM_SS,timeStr);

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionAddBo.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.top.system.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 职能机构添加对象 top_institution
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Data
+@ApiModel("职能机构添加对象")
+public class TopInstitutionAddBo {
+
+    /** 职能部门名称 */
+    @ApiModelProperty("职能部门名称")
+    private String instName;
+    /** 开户名 */
+    @ApiModelProperty("开户名")
+    private String bankName;
+    /** 开户行 */
+    @ApiModelProperty("开户行")
+    private String bank;
+    /** 开户账号 */
+    @ApiModelProperty("开户账号")
+    private String bankAccount;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 1正常 0关闭 */
+    @ApiModelProperty("1正常 0关闭")
+    private Integer status;
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionEditBo.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.top.system.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 职能机构编辑对象 top_institution
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Data
+@ApiModel("职能机构编辑对象")
+public class TopInstitutionEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long instId;
+
+    /** 职能部门名称 */
+    @ApiModelProperty("职能部门名称")
+    private String instName;
+
+    /** 开户名 */
+    @ApiModelProperty("开户名")
+    private String bankName;
+
+    /** 开户行 */
+    @ApiModelProperty("开户行")
+    private String bank;
+
+    /** 开户账号 */
+    @ApiModelProperty("开户账号")
+    private String bankAccount;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+
+    /** 1正常 0关闭 */
+    @ApiModelProperty("1正常 0关闭")
+    private Integer status;
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/bo/TopInstitutionQueryBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.top.system.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 职能机构分页查询对象 top_institution
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("职能机构分页查询对象")
+public class TopInstitutionQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 职能部门名称 */
+	@ApiModelProperty("职能部门名称")
+	private String instName;
+	/** 开户名 */
+	@ApiModelProperty("开户名")
+	private String bankName;
+	/** 开户行 */
+	@ApiModelProperty("开户行")
+	private String bank;
+	/** 开户账号 */
+	@ApiModelProperty("开户账号")
+	private String bankAccount;
+	/** 1正常 0关闭 */
+	@ApiModelProperty("1正常 0关闭")
+	private Integer status;
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/domain/TopInstitution.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.top.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 职能机构对象 top_institution
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_institution")
+public class TopInstitution implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "inst_id")
+    private Long instId;
+    /** 职能部门名称 */
+    private String instName;
+    /** 开户名 */
+    private String bankName;
+    /** 开户行 */
+    private String bank;
+    /** 开户账号 */
+    private String bankAccount;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 1正常 0关闭 */
+    private Integer status;
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/mapper/TopInstitutionMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.system.domain.TopInstitution;
+
+/**
+ * 职能机构Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+public interface TopInstitutionMapper extends BaseMapper<TopInstitution> {
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/service/ITopInstitutionService.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.top.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionAddBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionEditBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionQueryBo;
+import com.zhongzheng.modules.top.system.domain.TopInstitution;
+import com.zhongzheng.modules.top.system.vo.TopInstitutionVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 职能机构Service接口
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+public interface ITopInstitutionService extends IService<TopInstitution> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	TopInstitutionVo queryById(Long instId);
+
+	/**
+	 * 查询列表
+	 */
+	List<TopInstitutionVo> queryList(TopInstitutionQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入职能机构
+	 * @param bo 职能机构新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(TopInstitutionAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改职能机构
+	 * @param bo 职能机构编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(TopInstitutionEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 124 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/service/impl/TopInstitutionServiceImpl.java

@@ -0,0 +1,124 @@
+package com.zhongzheng.modules.top.system.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.base.domain.Certificate;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionAddBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionEditBo;
+import com.zhongzheng.modules.top.system.bo.TopInstitutionQueryBo;
+import com.zhongzheng.modules.top.system.domain.TopInstitution;
+import com.zhongzheng.modules.top.system.mapper.TopInstitutionMapper;
+import com.zhongzheng.modules.top.system.service.ITopInstitutionService;
+import com.zhongzheng.modules.top.system.vo.TopInstitutionVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 职能机构Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Service
+public class TopInstitutionServiceImpl extends ServiceImpl<TopInstitutionMapper, TopInstitution> implements ITopInstitutionService {
+
+    @Override
+    public TopInstitutionVo queryById(Long instId){
+        TopInstitution db = this.baseMapper.selectById(instId);
+        return BeanUtil.toBean(db, TopInstitutionVo.class);
+    }
+
+    @Override
+    public List<TopInstitutionVo> queryList(TopInstitutionQueryBo bo) {
+        LambdaQueryWrapper<TopInstitution> lqw = Wrappers.lambdaQuery();
+        lqw.like(StrUtil.isNotBlank(bo.getInstName()), TopInstitution::getInstName, bo.getInstName());
+        lqw.like(StrUtil.isNotBlank(bo.getBankName()), TopInstitution::getBankName, bo.getBankName());
+        lqw.eq(StrUtil.isNotBlank(bo.getBank()), TopInstitution::getBank, bo.getBank());
+        lqw.eq(StrUtil.isNotBlank(bo.getBankAccount()), TopInstitution::getBankAccount, bo.getBankAccount());
+        lqw.eq(bo.getStatus() != null, TopInstitution::getStatus, bo.getStatus());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<TopInstitutionVo> entity2Vo(Collection<TopInstitution> collection) {
+        List<TopInstitutionVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, TopInstitutionVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<TopInstitution> page = (Page<TopInstitution>)collection;
+            Page<TopInstitutionVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(TopInstitutionAddBo bo) {
+        TopInstitution add = BeanUtil.toBean(bo, TopInstitution.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(TopInstitutionEditBo bo) {
+        TopInstitution update = BeanUtil.toBean(bo, TopInstitution.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(TopInstitution entity){
+        //TODO 做一些数据校验,如唯一约束
+        if(checkNameUnique(entity)){
+            throw new CustomException("名称重复");
+        }
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    private boolean checkNameUnique(TopInstitution entity) {
+        TopInstitution info = getOne(new LambdaQueryWrapper<TopInstitution>()
+                .eq(TopInstitution::getInstName,entity.getInstName()).ne(TopInstitution::getStatus,-1)
+                .last("limit 1"));
+        if (Validator.isNotNull(info)) {
+            if(Validator.isNotEmpty(entity.getInstId())){
+                if(entity.getInstId().longValue() != info.getInstId().longValue()){
+                    return true;
+                }
+            }else{
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/system/vo/TopInstitutionVo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.top.system.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 职能机构视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-07-17
+ */
+@Data
+@ApiModel("职能机构视图对象")
+public class TopInstitutionVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long instId;
+
+	/** 职能部门名称 */
+	@Excel(name = "职能部门名称")
+	@ApiModelProperty("职能部门名称")
+	private String instName;
+	/** 开户名 */
+	@Excel(name = "开户名")
+	@ApiModelProperty("开户名")
+	private String bankName;
+	/** 开户行 */
+	@Excel(name = "开户行")
+	@ApiModelProperty("开户行")
+	private String bank;
+	/** 开户账号 */
+	@Excel(name = "开户账号")
+	@ApiModelProperty("开户账号")
+	private String bankAccount;
+	/** 1正常 0关闭 */
+	@Excel(name = "1正常 0关闭")
+	@ApiModelProperty("1正常 0关闭")
+	private Integer status;
+}

+ 22 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeQueryBo.java

@@ -1,16 +1,12 @@
 package com.zhongzheng.modules.user.bo;
 
+import com.zhongzheng.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.util.Date;
 import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-
-import com.zhongzheng.common.core.domain.BaseEntity;
 
 /**
  * 用户预约考试分页查询对象 user_subscribe
@@ -41,6 +37,9 @@ public class UserSubscribeQueryBo extends BaseEntity {
 	@ApiModelProperty("绑定的商品")
 	private Long goodsId;
 
+	@ApiModelProperty("商品班型:1基础班 2强化班 3私塾班")
+	private Integer gradeType;
+
 	/** 报考数据ID */
 	@ApiModelProperty("报考数据ID")
 	private Long subscribeId;
@@ -166,4 +165,22 @@ public class UserSubscribeQueryBo extends BaseEntity {
 	@ApiModelProperty("考试日期")
 	private Long applySiteExamTime;
 
+	/** 月份 */
+	@ApiModelProperty("时间")
+	private String ApplyDateTime;
+
+	@ApiModelProperty("月份开始时间")
+	private Long monthStartTime;
+
+	@ApiModelProperty("月份结束时间")
+	private Long monthEndTime;
+
+	@ApiModelProperty("业务员名称")
+	private String createUsername;
+
+	@ApiModelProperty("题库开通次数")
+	private Integer questionOpenNum;
+	@ApiModelProperty("题库商家名称")
+	private String questionMerchantName;
+
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java

@@ -222,4 +222,10 @@ private static final long serialVersionUID=1L;
     private String shareActivityCode;
     /** 密码最后修改时间 */
     private Long pwdTime;
+
+    /** 题库开通次数 */
+    private Integer questionOpenNum;
+    /** 题库商家名称 */
+    private String questionMerchantName;
+
 }

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

@@ -72,4 +72,7 @@ public interface UserMapper extends BaseMapper<User> {
 
     @InterceptorIgnore(tenantLine = "true")
     User getUserByAccount(@Param("userAccount")String userAccount);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<User> listByIdsNotTenant(@Param("userIds")List<Long> userIds);
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordPhotoMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.user.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.user.domain.UserStudyRecordPhoto;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
@@ -18,4 +19,10 @@ public interface UserStudyRecordPhotoMapper extends BaseMapper<UserStudyRecordPh
     String selectGradeRecentOnePhoto(@Param("userId") Long userId,@Param("gradeId") Long gradeId);
 
     List<String> selectGradePhotoWeek(@Param("userId") Long userId,@Param("gradeId") Long gradeId,@Param("searchWeekStartTime") Long searchWeekStartTime,@Param("searchWeekEndTime") Long searchWeekEndTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserStudyRecordPhoto> listByPhoto(@Param("imageUrl") String imageUrl);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateBatchByIdNotTenant(@Param("ids") List<Long> ids,@Param("upload") String upload);
 }

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

@@ -57,4 +57,8 @@ public interface UserSubscribeMapper extends BaseMapper<UserSubscribe> {
     List<UserVo> listUserExport(UserSubscribeQueryBo bo);
 
     List<UserSubscribeVo> listSignExport(UserSubscribeQueryBo bo);
+
+    Long selectMajorId(@Param("majorName")String majorName);
+
+    List<Long> getGoodsIds(@Param("userId")Long userId, @Param("applyId")Long applyId,@Param("majorId") Long majorId);
 }

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

@@ -133,4 +133,6 @@ public interface IUserService extends IService<User> {
 	UserLiveAccountLoginVo smsLiveUnifyLogin(UserLiveAccountLoginBo bo);
 
 	UserLiveAccountLoginVo liveUnifyLoginRefresh(UserLiveAccountLoginBo bo);
+
+    List<User> listByIdsNotTenant(List<Long> userIds);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordPhotoService.java

@@ -57,4 +57,7 @@ public interface IUserStudyRecordPhotoService extends IService<UserStudyRecordPh
 
 	List<String> selectGradePhotoWeek(Long userId,Long gradeId,Long searchWeekStartTime,Long searchWeekEndTime);
 
+    List<UserStudyRecordPhoto> getListByPhoto(String imageUrl);
+
+	void updateBatchByIdNotTenant(List<Long> ids, String upload);
 }

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java

@@ -1,6 +1,9 @@
 package com.zhongzheng.modules.user.service;
 
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
+import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
+import com.zhongzheng.modules.exam.vo.ExamSessionVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.vo.*;
@@ -102,4 +105,9 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
 
 	Long saveByAddBo(UserSubscribeAddBo bo) throws ParseException;
 
+	List<ExamSessionVo> getExamSession(String applyDate);
+
+    void examApplySubscribe(ExamApplySubscribeBo bo);
+
+    String updateStudentImage(UpdateStudentImageBo bo);
 }

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordPhotoServiceImpl.java

@@ -135,4 +135,14 @@ public class UserStudyRecordPhotoServiceImpl extends ServiceImpl<UserStudyRecord
     public List<String> selectGradePhotoWeek(Long userId, Long gradeId,Long searchWeekStartTime,Long searchWeekEndTime) {
         return this.baseMapper.selectGradePhotoWeek(userId,gradeId,searchWeekStartTime,searchWeekEndTime);
     }
+
+    @Override
+    public List<UserStudyRecordPhoto> getListByPhoto(String imageUrl) {
+        return baseMapper.listByPhoto(imageUrl);
+    }
+
+    @Override
+    public void updateBatchByIdNotTenant(List<Long> ids, String upload) {
+        baseMapper.updateBatchByIdNotTenant(ids, upload);
+    }
 }

+ 8 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -339,13 +339,14 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         if(Validator.isEmpty(courseSectionVo)){
             throw new CustomException("节数据错误");
         }
+        GoodsVo goodsVo = iGoodsService.queryById(bo.getGoodsId());
+        String fullName;
+        CourseBusinessQueryBo queryBusinessBo = new CourseBusinessQueryBo();
+        queryBusinessBo.setId(goodsVo.getBusinessId());
+        fullName = iCourseBusinessService.queryFullName(queryBusinessBo);
         //判断录播拍照是否达标
         if(courseSectionVo.getSectionType()==1&&Validator.isNotEmpty(bo.getStatus())&&bo.getStatus()==1){
-            GoodsVo goodsVo = iGoodsService.queryById(bo.getGoodsId());
             if(Validator.isNotEmpty(goodsVo)){
-                CourseBusinessQueryBo queryBo = new CourseBusinessQueryBo();
-                queryBo.setId(goodsVo.getBusinessId());
-                String fullName = iCourseBusinessService.queryFullName(queryBo);
                 if(Validator.isNotEmpty(fullName)){
                     if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")||fullName.equals("考前培训七大员施工现场专业人员")){
                         if(Validator.isNotEmpty(courseSectionVo.getDurationTime())||Validator.isNotEmpty(bo.getVideoCurrentTime())){
@@ -477,6 +478,9 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
             UserStudyRecordVo lastVo = queryLast(queryBo);
             if(Validator.isEmpty(lastVo)||Validator.isNotEmpty(bo.getPhoto())||Validator.isEmpty(lastVo.getVideoCurrentTime())||lastVo.getVideoCurrentTime().longValue()>add.getVideoCurrentTime().longValue()){
                 //如果没有历史数据或者之前播放时长比现在晚,或者携带照片则新增观看记录
+                if(Validator.isNotEmpty(fullName)&&(fullName.equals("考前培训七大员施工现场专业人员")||fullName.equals("考前培训一级建造师"))){
+                    bo.setErJianErZao(true);
+                }
                 if(Validator.isNotEmpty(lastVo)&&Validator.isNotEmpty(lastVo.getSectionId())
                         &&Validator.isNotEmpty(bo.getErJianErZao())&&bo.getErJianErZao()
                         &&Validator.isEmpty(bo.getPhoto())&&(lastVo.getVideoCurrentTime().longValue()>add.getVideoCurrentTime().longValue())){

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.