Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
#	zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/bo/TopOldOrderQueryBo.java
yangdamao 2 лет назад
Родитель
Сommit
aa55e40495
100 измененных файлов с 2742 добавлено и 387 удалено
  1. 32 1
      run-prod.sh
  2. 0 105
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderAttachmentController.java
  3. 16 9
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java
  4. 3 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  5. 1 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  6. 3 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  7. 16 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/alioss/OssController.java
  8. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  9. 88 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  10. 55 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/EnterpriseController.java
  11. 25 19
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseEducationTypeController.java
  12. 3 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseSubjectController.java
  13. 84 21
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  14. 38 31
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  15. 59 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  16. 7 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  17. 2 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java
  18. 11 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserMockSubscribeController.java
  19. 5 2
      zhongzheng-admin/src/main/resources/application-dev.yml
  20. 1 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  21. 3 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  22. 1 1
      zhongzheng-admin/src/main/resources/application.yml
  23. 3 3
      zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  24. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java
  25. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/UserProfileStampController.java
  26. 50 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  27. 13 5
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonCourseController.java
  28. 17 8
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java
  29. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  30. 4 4
      zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  31. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/inform/InformUserController.java
  32. 2 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/mock/MockApplyController.java
  33. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  34. 3 3
      zhongzheng-api/src/main/java/com/zhongzheng/controller/plan/UserPlanController.java
  35. 7 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java
  36. 2 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserBankRecordController.java
  37. 27 7
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  38. 1 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserNoteController.java
  39. 8 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyRecordController.java
  40. 5 2
      zhongzheng-api/src/main/resources/application-dev.yml
  41. 1 0
      zhongzheng-api/src/main/resources/application-pre.yml
  42. 3 0
      zhongzheng-api/src/main/resources/application-prod.yml
  43. 5 0
      zhongzheng-common/pom.xml
  44. 161 12
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  45. 46 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/JavaMailUtils.java
  46. 125 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  47. 147 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java
  48. 49 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java
  49. 6 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  50. 11 4
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java
  51. 1 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  52. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java
  53. 137 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserLoginKeyServiceImpl.java
  54. 356 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  55. 4 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  56. 23 14
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxTokenService.java
  57. 2 0
      zhongzheng-generator/src/main/java/com/zhongzheng/generator/controller/FilterController.java
  58. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java
  59. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  60. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/IAliSmsService.java
  61. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  62. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  63. 361 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  64. 23 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  65. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseBusinessQueryBo.java
  66. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java
  67. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseBusinessMapper.java
  68. 8 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMapper.java
  69. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuExamMapper.java
  70. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMenuMapper.java
  71. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseModuleChapterMapper.java
  72. 6 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSectionMapper.java
  73. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseBusinessService.java
  74. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseEducationTypeService.java
  75. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  76. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseMenuExamService.java
  77. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseMenuService.java
  78. 5 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSectionService.java
  79. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java
  80. 17 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseBusinessServiceImpl.java
  81. 31 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseEducationTypeServiceImpl.java
  82. 53 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  83. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuExamServiceImpl.java
  84. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java
  85. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseModuleChapterServiceImpl.java
  86. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionServiceImpl.java
  87. 22 32
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java
  88. 102 21
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  89. 5 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseEducationTypeVo.java
  90. 10 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java
  91. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyDetailBo.java
  92. 10 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java
  93. 6 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyQueryBo.java
  94. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultBo.java
  95. 118 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyRoomQueryBo.java
  96. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySendmailBo.java
  97. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyUserImportBo.java
  98. 9 11
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  99. 7 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApplySiteTime.java
  100. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamSite.java

+ 32 - 1
run-prod.sh

@@ -1,5 +1,36 @@
 #!/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秒内随机

+ 0 - 105
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderAttachmentController.java

@@ -1,105 +0,0 @@
-package com.zhongzheng.controller.order;
-
-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.common.utils.poi.ExcelUtil;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderAttachmentAddBo;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderAttachmentEditBo;
-import com.zhongzheng.modules.top.goods.bo.TopOldOrderAttachmentQueryBo;
-import com.zhongzheng.modules.top.goods.service.ITopOldOrderAttachmentService;
-import com.zhongzheng.modules.top.goods.vo.TopOldOrderAttachmentVo;
-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 java.util.Arrays;
-import java.util.List;
-
-/**
- * 订单附件Controller
- * 
- * @author ruoyi
- * @date 2023-04-20
- */
-@Api(value = "订单附件控制器", tags = {"订单附件管理"})
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/system/order/attachment")
-public class TopOldOrderAttachmentController extends BaseController {
-
-    private final ITopOldOrderAttachmentService iTopOrderAttachmentService;
-
-    /**
-     * 查询订单附件列表
-     */
-    @ApiOperation("查询订单附件列表")
-    @PreAuthorize("@ss.hasPermi('system:attachment:list')")
-    @GetMapping("/list")
-    public TableDataInfo<TopOldOrderAttachmentVo> list(TopOldOrderAttachmentQueryBo bo) {
-        startPage();
-        List<TopOldOrderAttachmentVo> list = iTopOrderAttachmentService.queryList(bo);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出订单附件列表
-     */
-    @ApiOperation("导出订单附件列表")
-    @PreAuthorize("@ss.hasPermi('system:attachment:export')")
-    @Log(title = "订单附件", businessType = BusinessType.EXPORT)
-    @GetMapping("/export")
-    public AjaxResult<TopOldOrderAttachmentVo> export(TopOldOrderAttachmentQueryBo bo) {
-        List<TopOldOrderAttachmentVo> list = iTopOrderAttachmentService.queryList(bo);
-        ExcelUtil<TopOldOrderAttachmentVo> util = new ExcelUtil<TopOldOrderAttachmentVo>(TopOldOrderAttachmentVo.class);
-        return util.exportExcel(list, "订单附件");
-    }
-
-    /**
-     * 获取订单附件详细信息
-     */
-    @ApiOperation("获取订单附件详细信息")
-    @PreAuthorize("@ss.hasPermi('system:attachment:query')")
-    @GetMapping("/{id}")
-    public AjaxResult<TopOldOrderAttachmentVo> getInfo(@PathVariable("id" ) Long id) {
-        return AjaxResult.success(iTopOrderAttachmentService.queryById(id));
-    }
-
-    /**
-     * 新增订单附件
-     */
-    @ApiOperation("新增订单附件")
-    @PreAuthorize("@ss.hasPermi('system:attachment:add')")
-    @Log(title = "订单附件", businessType = BusinessType.INSERT)
-    @PostMapping()
-    public AjaxResult<Void> add(@RequestBody TopOldOrderAttachmentAddBo bo) {
-        return toAjax(iTopOrderAttachmentService.insertByAddBo(bo) ? 1 : 0);
-    }
-
-    /**
-     * 修改订单附件
-     */
-    @ApiOperation("修改订单附件")
-    @PreAuthorize("@ss.hasPermi('system:attachment:edit')")
-    @Log(title = "订单附件", businessType = BusinessType.UPDATE)
-    @PutMapping()
-    public AjaxResult<Void> edit(@RequestBody TopOldOrderAttachmentEditBo bo) {
-        return toAjax(iTopOrderAttachmentService.updateByEditBo(bo) ? 1 : 0);
-    }
-
-    /**
-     * 删除订单附件
-     */
-    @ApiOperation("删除订单附件")
-    @PreAuthorize("@ss.hasPermi('system:attachment:remove')")
-    @Log(title = "订单附件" , businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
-        return toAjax(iTopOrderAttachmentService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
-    }
-}

+ 16 - 9
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java

@@ -20,7 +20,6 @@ import com.zhongzheng.modules.top.goods.vo.TopOrderStatisticsVo;
 import com.zhongzheng.modules.top.goods.vo.TopRefundOrderDetailVo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderCommissionExportVo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderCompanyExportVo;
-import com.zhongzheng.modules.top.order.vo.TopOldOrderExportVo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderSellerExportVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -29,9 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -72,7 +68,7 @@ public class TopOldOrderController extends BaseController {
     public AjaxResult<TopOldOrderVo> export(TopOldOrderQueryBo bo) {
         List<TopOldOrderVo> list = iTopOldOrderService.queryList(bo);
         ExcelUtil<TopOldOrderVo> util = new ExcelUtil<TopOldOrderVo>(TopOldOrderVo.class);
-        return util.exportExcel(list, "订单");
+        return util.exportExcel(list, "订单信息");
     }
 
     /**
@@ -95,6 +91,17 @@ public class TopOldOrderController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 订单学员信息导出
+     */
+    @ApiOperation("订单学员信息导出")
+    @GetMapping("/student/export")
+    public AjaxResult<TopOldOrderGoodsListVo> exportStudent(TopOldOrderGoodsQuery bo) {
+        List<TopOldOrderGoodsListVo> list = iTopOldOrderService.getOrderGoodsList(bo);
+        ExcelUtil<TopOldOrderGoodsListVo> util = new ExcelUtil<TopOldOrderGoodsListVo>(TopOldOrderGoodsListVo.class);
+        return util.exportExcel(list, "订单学员信息");
+    }
+
     /**
      * 新增订单
      */
@@ -220,7 +227,7 @@ public class TopOldOrderController extends BaseController {
     @ApiOperation("批量修改订单备注")
     @PostMapping("/update/remark")
     public AjaxResult<Void> updateRemark(@RequestBody TopUpdateRemarkBo bo) {
-        return toAjax(iTopOldOrderService.updateRemark(bo) ? 1 : 0);
+        return toAjax(iTopOldOrderService.updateFinanceRemark(bo) ? 1 : 0);
     }
 
     /**
@@ -239,9 +246,9 @@ public class TopOldOrderController extends BaseController {
      * 订单统计
      */
     @ApiOperation("订单统计")
-    @PostMapping("/statistics")
-    public AjaxResult<TopOrderStatisticsVo> statisticsOrder() {
-        return AjaxResult.success(iTopOldOrderService.statisticsOrder());
+    @GetMapping("/statistics")
+    public AjaxResult<TopOrderStatisticsVo> statisticsOrder(TopOldOrderQueryBo bo) {
+        return AjaxResult.success(iTopOldOrderService.statisticsOrder(bo));
     }
 
     @ApiOperation("订单应收应付统计")

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

@@ -163,9 +163,12 @@ oldOrder:
     checkOrderBrokerage: http://gdxypx.xy.com/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:5030/common/platform/pay
     refundPayHandle: http://192.168.1.222:5030/common/platform/pay/handle
+    updateRemark: http://gdxypx.xy.com/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://gdxypx.xy.com
 
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
+
+liveHost: http://192.168.1.222:6009

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

@@ -163,6 +163,7 @@ oldOrder:
     checkOrderBrokerage: http://test.jqbao.net/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:6030/common/platform/pay
     refundPayHandle: http://192.168.1.222:6030/common/platform/pay/handle
+    updateRemark: http://test.jqbao.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://test.jqbao.net

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

@@ -163,9 +163,12 @@ oldOrder:
     checkOrderBrokerage: http://www.xyyxt.net/WitSystem/BussinessApi/CommissionRate
     refundPay: https://cloud.xyyxt.net/common/platform/pay
     refundPayHandle: https://cloud.xyyxt.net/common/platform/pay/handle
+    updateRemark: http://www.xyyxt.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: https://www.xyyxt.net
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
+
+liveHost: https://sso.xyyxt.net

+ 16 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/alioss/OssController.java

@@ -18,6 +18,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStream;
 import java.util.Map;
 
 /**
@@ -70,4 +72,18 @@ public class OssController extends BaseController {
         return AjaxResult.success("返回图片路径",result);
     }
 
+    @ApiOperation("上传file图片")
+    @PostMapping("/uploadTest")
+    public AjaxResult<String> uploadTest() throws Exception {
+        InputStream in = ossService.getStreamByObject("oss/images/avatar/114/1315/1686203595404_1371903125");
+        FileOutputStream fos = new FileOutputStream("D:\\testfile\\b.jpg");
+        byte[] b = new byte[1024];
+        while ((in.read(b)) != -1) {
+            fos.write(b);// 写入数据
+        }
+        in.close();
+        fos.close();// 保存数据
+        return AjaxResult.success("返回图片路径","");
+    }
+
 }

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

@@ -279,4 +279,14 @@ public class QuestionController extends BaseController {
         Map<String,Object> result = iQuestionService.importWordQuestionList(file,  eduId,  projectId,  businessId, subjectId);
         return AjaxResult.success(result);
     }
+
+
+    @ApiOperation("导入建匠题目Word模板列表")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importJJWordQuestionList")
+    public AjaxResult<Map<String,Object>> importJJWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId) throws Exception
+    {
+        Map<String,Object> result = iQuestionService.importJJWordQuestionList(file,  eduId,  projectId,  businessId, subjectId);
+        return AjaxResult.success(result);
+    }
 }

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

@@ -14,6 +14,7 @@ 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.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
@@ -30,6 +31,10 @@ import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsSer
 import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
 import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.exam.bo.ExamApplyDetailBo;
+import com.zhongzheng.modules.exam.bo.ExamApplyResultBo;
+import com.zhongzheng.modules.exam.service.IExamApplyService;
+import com.zhongzheng.modules.exam.vo.ExamApplyDetailVo;
 import com.zhongzheng.modules.goods.bo.AlikeGoodsBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsStudyUrlBo;
@@ -40,7 +45,9 @@ import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.goods.vo.UserGoodsListVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.service.IClassGradeService;
+import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
+import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
 import com.zhongzheng.modules.order.bo.TopOldOrderRefundBo;
 import com.zhongzheng.modules.order.domain.Order;
@@ -129,6 +136,10 @@ public class CommonController extends BaseController {
     private IDistributionActivityGoodsService iDistributionActivityGoodsService;
     @Autowired
     private IOrderGoodsRefundService iOrderGoodsRefundService;
+    @Autowired
+    private IExamApplyService iExamApplyService;
+    @Autowired
+    private IClassGradeUserService iClassGradeUserService;
 
     /**
      * 通用下载请求
@@ -148,11 +159,10 @@ public class CommonController extends BaseController {
             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
             FileUtils.setAttachmentResponseHeader(response, realFileName);
             FileUtils.writeBytes(filePath, response.getOutputStream());
-           /* if (delete)
+            if (delete)
             {
                 FileUtils.deleteFile(filePath);
-            }*/
-            FileUtils.deleteFile(filePath);
+            }
         } catch (Exception e) {
             log.error("下载文件失败", e);
         }
@@ -249,6 +259,25 @@ public class CommonController extends BaseController {
         return AjaxResult.success(voList);
     }
 
+    @ApiOperation("七大员新考结果")
+    @PostMapping("common/apply/result")
+    public AjaxResult examApplyResult(@RequestBody ExamApplyResultBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        iExamApplyService.examApplyResult(bo);
+        return AjaxResult.success();
+    }
+
+
+    @ApiOperation("获取某场考试信息")
+    @PostMapping("common/apply/detail")
+    public AjaxResult examApplyDetail(@RequestBody ExamApplyDetailBo bo) {
+        List<ExamApplyDetailVo> voList = iExamApplyService.examApplyDetail(bo);
+        return AjaxResult.success(voList);
+    }
+
+
     @ApiOperation("旧系统获取商品学习中心路径")
     @PostMapping("common/get/goods/studyUrl")
     public AjaxResult getGoodsStudyUrl(@RequestBody GoodsStudyUrlBo bo) {
@@ -492,6 +521,9 @@ public class CommonController extends BaseController {
         Map<String, Object> map = new HashMap<>();
         String jsonStr = configService.selectConfigByKey("home.header");
         JSONObject objectJson = JSON.parseObject(jsonStr);
+        if(Validator.isEmpty(objectJson)){
+            throw new CustomException("数据错误");
+        }
         map.put("companyName", String.valueOf(objectJson.get("companyName")));
         return AjaxResult.success(map);
     }
@@ -536,4 +568,57 @@ public class CommonController extends BaseController {
         List<ActivityGoodsPriceVo> list = iDistributionActivityGoodsService.getGoodsList(bo);
         return getDataTable(list);
     }
+
+    @ApiOperation("学时抽查")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "学时抽查", businessType = BusinessType.INSERT)
+    @PostMapping("/common/free/decryptOfficialInfo")
+    public AjaxResult<ClassPeriodStudentVo> decryptOfficialInfo(@RequestBody ClassGradeDecryptQueryBo bo) {
+        return AjaxResult.success(iClassGradeUserService.DecryptOfficialInfo(bo));
+    }
+
+    @ApiOperation("学时抽查加密")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @PostMapping("/common/free/encryptDes")
+    public AjaxResult encryptDes(@RequestBody ClassGradeDecryptQueryBo bo) {
+        try{
+            byte[] Keys = new byte[]{0x22, 0x34, 0x76, 0x58, (byte) 0x90, (byte) 0xAB, (byte) 0xAD, (byte) 0xBF};
+            byte[] rgbKey = "0ca175b9c0f726a831d895e26933246".substring(0, 8).getBytes("UTF-8");
+            String source = "bh="+bo.getBh()+"&idnum="+bo.getIdnum()+"&datetime=20230627";
+            System.out.println(source);
+            return AjaxResult.success(ToolsUtils.encryptDesNew(source,bo.getToken().substring(0, 8)));
+        }catch (Exception e){
+            System.out.println(e.getMessage());
+            return null;
+        }
+    }
+
+    @ApiOperation("学时抽查解密")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @PostMapping("/common/free/dncryptDes")
+    public AjaxResult dncryptDes(@RequestBody ClassGradeDecryptQueryBo bo) {
+        try{
+            byte[] Keys = new byte[]{0x22, 0x34, 0x76, 0x58, (byte) 0x90, (byte) 0xAB, (byte) 0xAD, (byte) 0xBF};
+            byte[] rgbKey = "01b5d9833987efdff54483cdc9720da6".substring(0, 8).getBytes("UTF-8");
+            System.out.println(ToolsUtils.decryptDesNew(bo.getData(), bo.getToken().substring(0, 8)));
+            return AjaxResult.success();
+        }catch (Exception e){
+            System.out.println(e.getMessage());
+            return null;
+        }
+    }
+
+
+    @ApiOperation("商品列表")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "商品列表", businessType = BusinessType.INSERT)
+    @GetMapping("/common/free/goods/list")
+    public TableDataInfo<GoodsVo> goodsList(GoodsQueryBo bo) {
+      /*  bo.setStatus(new ArrayList<Integer>(){{
+            add(1);
+        }});*/
+        startPage();
+        List<GoodsVo> list = iGoodsService.selectList(bo);
+        return getDataTable(list);
+    }
 }

+ 55 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/EnterpriseController.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.controller.common;
+
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
+import com.zhongzheng.modules.course.service.ICourseBusinessService;
+import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
+import com.zhongzheng.modules.course.vo.CourseBusinessVo;
+import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月28日 11:39
+ */
+@Api(value = "B端接口控制器", tags = {"B端接口控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/enterprise/api")
+public class EnterpriseController {
+
+    private final ICourseEducationTypeService iCourseEducationTypeService;
+
+    private final ICourseBusinessService iCourseBusinessService;
+
+    /**
+     * 查询教育类型列表
+     */
+    @ApiOperation("查询教育类型列表")
+    @GetMapping("/education/list")
+    public AjaxResult<List<CourseEducationTypeVo>> getEducationList(CourseEducationTypeQueryBo bo) {
+        bo.setStatus(Arrays.asList(0,1));
+        return AjaxResult.success(iCourseEducationTypeService.queryList(bo));
+    }
+
+    /**
+     * 查询教育类型列表
+     */
+    @ApiOperation("查询教育类型列表")
+    @GetMapping("/business/list")
+    public AjaxResult<List<CourseBusinessVo>> getBusinessList(CourseBusinessQueryBo bo) {
+        bo.setStatus(Arrays.asList(0,1));
+        return AjaxResult.success(iCourseBusinessService.queryList(bo));
+    }
+
+}

+ 25 - 19
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseEducationTypeController.java

@@ -1,36 +1,29 @@
 package com.zhongzheng.controller.course;
 
-import java.util.List;
-import java.util.Arrays;
-
-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.course.vo.CourseEducationTypeVo;
-import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeAddBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeEditBo;
+import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
 import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
-import com.zhongzheng.common.utils.poi.ExcelUtil;
-import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
 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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 教育类型Controller
- * 
+ *
  * @author ruoyi
  * @date 2021-10-08
  */
@@ -50,10 +43,23 @@ public class CourseEducationTypeController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CourseEducationTypeVo> list(CourseEducationTypeQueryBo bo) {
         startPage();
+        bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
         List<CourseEducationTypeVo> list = iCourseEducationTypeService.queryList(bo);
         return getDataTable(list);
     }
 
+
+    /**
+     * 查询教育类型列表
+     */
+    @ApiOperation("查询所有业务层次列表")
+    @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);
+    }
     /**
      * 导出教育类型列表
      */

+ 3 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseSubjectController.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.course;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
 
@@ -30,7 +31,7 @@ import io.swagger.annotations.ApiOperation;
 
 /**
  * 科目Controller
- * 
+ *
  * @author ruoyi
  * @date 2021-10-09
  */
@@ -50,6 +51,7 @@ public class CourseSubjectController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CourseSubjectVo> list(CourseSubjectQueryBo bo) {
         startPage();
+        bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
         List<CourseSubjectVo> list = iCourseSubjectService.queryList(bo);
         return getDataTable(list);
     }

+ 84 - 21
zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -1,33 +1,30 @@
 package com.zhongzheng.controller.exam;
 
-import java.util.List;
-import java.util.Arrays;
-
-import com.zhongzheng.modules.exam.bo.*;
-import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
-import com.zhongzheng.modules.exam.service.IExamApplySiteService;
-import com.zhongzheng.modules.exam.service.IExamApplyUserService;
-import com.zhongzheng.modules.exam.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.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.poi.EasyPoiUtil;
+import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
-import com.zhongzheng.common.utils.poi.ExcelUtil;
-import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.exam.service.IExamApplySiteService;
+import com.zhongzheng.modules.exam.service.IExamApplyUserService;
+import com.zhongzheng.modules.exam.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.util.List;
 
 /**
  * 考试安排Controller
@@ -61,6 +58,36 @@ public class ExamApplyController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询考场列表
+     */
+    @ApiOperation("查询考场列表")
+    @GetMapping("/place")
+    public TableDataInfo<ExamApplyPlaceVo> placeList(ExamApplyRoomQueryBo bo) {
+        startPage();
+        List<ExamApplyPlaceVo> list = iExamApplyService.getPlaceList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 考场邮件信息
+     */
+    @ApiOperation("考场邮件地址")
+    @GetMapping("/sendmail")
+    public AjaxResult getSendmailUrl(ExamApplyQueryBo bo) {
+        String url = iExamApplyService.getSendmailUrl(bo.getIds());
+        return AjaxResult.success(url);
+    }
+
+    /**
+     * 考场邮件发送
+     */
+    @ApiOperation("考场邮件发送")
+    @PostMapping("/send")
+    public AjaxResult<Void> sendmail(@RequestBody ExamApplySendmailBo bo) {
+        return toAjax(iExamApplyService.sendmail(bo)? 1 : 0);
+    }
+
 
     /**
      * 获取考试安排详细信息
@@ -94,6 +121,24 @@ public class ExamApplyController extends BaseController {
         return toAjax(iExamApplyService.insertByAddBo(bo) ? 1 : 0);
     }
 
+    /**
+     * 新增考试安排
+     */
+    @ApiOperation("新增考试安排")
+    @PostMapping("/save")
+    public AjaxResult<Void> saveExamApply(MultipartFile file, String param) {
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数有误!");
+        }
+        ExamApplyAddBo addBo = JSONObject.parseObject(param, ExamApplyAddBo.class);
+        if (ObjectUtils.isNotNull(file)){
+            //学员资料解析
+            List<ExamApplyUserImportBo> applyUsers = EasyPoiUtil.importExcel(file,0,1,ExamApplyUserImportBo.class);
+            addBo.setApplyUsers(applyUsers);
+        }
+        return toAjax(iExamApplyService.saveExamApply(addBo) ? 1 : 0);
+    }
+
     /**
      * 修改考试安排
      */
@@ -105,6 +150,24 @@ public class ExamApplyController extends BaseController {
         return toAjax(iExamApplyService.updateByEditBo(bo) ? 1 : 0);
     }
 
+    /**
+     * 修改考试安排
+     */
+    @ApiOperation("修改考试安排")
+    @PostMapping("/editApply")
+    public AjaxResult<Void> editExamApply(MultipartFile file, String param) {
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数有误!");
+        }
+        ExamApplyEditBo editBo = JSONObject.parseObject(param, ExamApplyEditBo.class);
+        if (ObjectUtils.isNotNull(file)){
+            //学员资料解析
+            List<ExamApplyUserImportBo> applyUsers = EasyPoiUtil.importExcel(file,0,1,ExamApplyUserImportBo.class);
+            editBo.setApplyUsers(applyUsers);
+        }
+        return toAjax(iExamApplyService.editExamApply(editBo) ? 1 : 0);
+    }
+
     /**
      * 新增考试安排地点
      */

+ 38 - 31
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -1,47 +1,29 @@
 package com.zhongzheng.controller.goods;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
-
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
-import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.bank.bo.ExamQuestionQueryBo;
+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.common.utils.poi.ExcelUtil;
 import com.zhongzheng.modules.bank.service.IQuestionService;
-import com.zhongzheng.modules.bank.vo.ExamQuestionVo;
-import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.*;
-import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
-import com.zhongzheng.modules.goods.service.IGoodsAuditionConfigService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.*;
-import com.zhongzheng.modules.grade.vo.StudyAccountStatusExportVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
-import com.zhongzheng.modules.user.bo.UserExamRecordQueryBo;
-import com.zhongzheng.modules.user.entity.ClientLoginUser;
-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;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 商品Controller
@@ -200,6 +182,14 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.insertBankByAddBo(bo)>0 ? 1 : 0);
     }
 
+    @ApiOperation("新增讲义商品")
+    @PreAuthorize("@ss.hasPermi('system:goods:add')")
+    @Log(title = "商品", businessType = BusinessType.INSERT)
+    @PostMapping("/handouts")
+    public AjaxResult<Void> addHandouts(@RequestBody GoodsAddBo bo) {
+        return toAjax(iGoodsService.insertHandoutsByAddBo(bo)>0 ? 1 : 0);
+    }
+
     /**
      * 修改商品
      */
@@ -211,6 +201,14 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.updateBankByEditBo(bo) ? 1 : 0);
     }
 
+    @ApiOperation("修改讲义商品")
+    @PreAuthorize("@ss.hasPermi('system:goods:edit')")
+    @Log(title = "讲义商品", businessType = BusinessType.UPDATE)
+    @PostMapping("/handouts/edit")
+    public AjaxResult<Void> editHandouts(@RequestBody GoodsEditBo bo) {
+        return toAjax(iGoodsService.updateHandoutsByEditBo(bo) ? 1 : 0);
+    }
+
     /**
      * 查询题目业务层次关系列表
      */
@@ -339,6 +337,15 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.goodsBatchCopyIncrementTenant(bo) ? 1 : 0);
     }
 
+    /**
+     * 商品节点复制
+     */
+    @ApiOperation("商品节点复制")
+    @PostMapping("/node/copy/add")
+    public AjaxResult<Void> goodsNodeCopyAddTenant(@RequestBody GoodsNodeCopyTenantBo bo) {
+        return toAjax(iGoodsService.goodsNodeCopyAddTenant(bo) ? 1 : 0);
+    }
+
     /**
      * 商品关系ID处理(全量复制后的处理方法)
      */

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

@@ -237,6 +237,15 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("按周查询学员学时学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserPeriodWeekRecord")
+    public TableDataInfo<ClassPeriodStudentVo> listUserPeriodWeekRecord(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserPeriodWeekRecord(bo);
+        return getDataTable(list);
+    }
+
 
     @ApiOperation("查询学员视频学习记录列表")
     @PreAuthorize("@ss.hasPermi('grade:user:list')")
@@ -258,6 +267,15 @@ public class ClassGradeController extends BaseController {
         List<UserPeriodExportV2Vo> list = iClassGradeUserService.listUserStudyRecordV2(bo);
         return getDataTable(list);
     }
+
+    @ApiOperation("周查询学员学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserStudyRecordV2Week")
+    public TableDataInfo<UserPeriodExportV2Vo> listUserStudyRecordV2Week(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<UserPeriodExportV2Vo> list = iClassGradeUserService.listUserStudyRecordV2Week(bo);
+        return getDataTable(list);
+    }
     /**
      * 查询学时学员记录列表
      *//*
@@ -314,6 +332,47 @@ public class ClassGradeController extends BaseController {
         return AjaxResult.success(map);
     }
 
+    @ApiOperation("周导出学员学时列表")
+    @PreAuthorize("@ss.hasPermi('system:profile:export')")
+    @Log(title = "周导出学员学时列表", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportWeek")
+    public AjaxResult<Map<String,Object>> exportWeek(@RequestBody ClassGradeUserQueryBo bo) {
+        String fileName = "";
+        if(Validator.isEmpty(bo.getStudyStatus())){
+            bo.setStudyStatus(0);
+            fileName="全部";
+        }else{
+            if(bo.getStudyStatus()==0){
+                fileName="全部";
+            }
+            if(bo.getStudyStatus()==1){
+                fileName="未完成学习";
+            }
+            if(bo.getStudyStatus()==2){
+                fileName="完成学习";
+            }
+        }
+        bo.setUserPhoto(1);
+        Map<String,Object> map = iClassGradeUserService.exportWeekPo(bo);
+        List<ClassPeriodStudentExportWeekAllVo> list = (List<ClassPeriodStudentExportWeekAllVo>)map.get("list");
+        ExcelUtil<ClassPeriodStudentExportWeekAllVo> util = new ExcelUtil<ClassPeriodStudentExportWeekAllVo>(ClassPeriodStudentExportWeekAllVo.class);
+        ExportParams deptExportParams = new ExportParams();
+        // 设置sheet得名称
+        deptExportParams.setSheetName("表1");
+        String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        Map<String, Object> deptExportMap = new HashMap<>();
+        deptExportMap.put("title", deptExportParams);
+        deptExportMap.put("entity", ClassPeriodStudentExportWeekAllVo.class);
+        // sheet中要填充得数据
+        deptExportMap.put("data", list);
+        List<Map<String, Object>> sheetsList = new ArrayList<>();
+        sheetsList.add(deptExportMap);
+        String businessName = Validator.isNotEmpty(bo.getBusinessName())?bo.getBusinessName():"";
+        map.put("excel",util.exportEasyExcel(sheetsList, businessName+"-"+fileName+"-学员学习记录-"+timeStr));
+        map.remove("list");
+        return AjaxResult.success(map);
+    }
+
     /**
      * 查询学员学时信息列表
      */

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

@@ -430,4 +430,11 @@ public class ScheduleController extends BaseController {
         iScheduleService.distributionRebate();
         return AjaxResult.success();
     }
+
+    @ApiOperation("七大员考场创建")
+    @GetMapping("/examApply")
+    public AjaxResult createExamApply(){
+        iScheduleService.createExamApply();
+        return AjaxResult.success();
+    }
 }

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

@@ -300,9 +300,9 @@ public class SysUserController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         SysUser user = userService.selectUserById(loginUser.getUser().getUserId());
         boolean needUpdate = false;
-        if(Validator.isNotEmpty(user.getPwdTime())&&(DateUtils.getNowTime().longValue()-user.getPwdTime().longValue())>90*24*3600){
+       /* if(Validator.isNotEmpty(user.getPwdTime())&&(DateUtils.getNowTime().longValue()-user.getPwdTime().longValue())>90*24*3600){
             needUpdate = true;
-        }
+        }*/
         return AjaxResult.success(needUpdate);
     }
 }

+ 11 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserMockSubscribeController.java

@@ -22,7 +22,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.text.ParseException;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -53,6 +52,17 @@ public class UserMockSubscribeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 模考导出
+     */
+    @ApiOperation("模考导出")
+    @GetMapping("/listSubscribe/export")
+    public AjaxResult<UserMockSubscribeVo> listSubscribeExport(UserMockSubscribeQueryBo bo) {
+        List<UserMockSubscribeVo> list = iUserMockSubscribeService.listSubscribe(bo);
+        ExcelUtil<UserMockSubscribeVo> util = new ExcelUtil<UserMockSubscribeVo>(UserMockSubscribeVo.class);
+        return util.exportExcel(list, "模考数据");
+    }
+
     /**
      * 导出用户预约模考列表
      */

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

@@ -121,7 +121,7 @@ certificate:
 
 liveGotoURL: http://
 
-enCodeVersion: develop
+enCodeVersion: trial
 
 oldStudySys:
     syncPath: http://gdxypx.xy.com/System/BussinessApi/PostUserStudyRecords
@@ -136,7 +136,7 @@ oldStudySys:
     updateInvoicePath: http://gdxypx.xy.com/system/BussinessApi/UpdateInvoiceData
 
 officialPush:
-    infoPath: https://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
+    infoPath: closehttps://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
     periodPath: https://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
@@ -165,9 +165,12 @@ oldOrder:
     checkOrderBrokerage: http://gdxypx.xy.com/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:5030/common/platform/pay
     refundPayHandle: http://192.168.1.222:5030/common/platform/pay/handle
+    updateRemark: http://gdxypx.xy.com/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://gdxypx.xy.com
 
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
+
+liveHost: http://192.168.1.222:6009

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

@@ -163,6 +163,7 @@ oldOrder:
     checkOrderBrokerage: http://test.jqbao.net/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:6030/common/platform/pay
     refundPayHandle: http://192.168.1.222:6030/common/platform/pay/handle
+    updateRemark: http://test.jqbao.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://test.jqbao.net

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

@@ -163,9 +163,12 @@ oldOrder:
     checkOrderBrokerage: http://www.xyyxt.net/WitSystem/BussinessApi/CommissionRate
     refundPay: https://cloud.xyyxt.net/common/platform/pay
     refundPayHandle: https://cloud.xyyxt.net/common/platform/pay/handle
+    updateRemark: http://www.xyyxt.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://test.jqbao.net
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
+
+liveHost: https://sso.xyyxt.net

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

@@ -117,7 +117,7 @@ token:
     # 令牌密钥
     secret: abcdefghijklmnopqrstuvwxyz
     # 令牌有效期(默认30分钟)
-    expireTime: 360
+    expireTime: 720
 
 # MyBatis配置
 # https://baomidou.com/config/

+ 3 - 3
zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -65,9 +65,9 @@ public class QuestionController extends BaseController {
     @ApiOperation("查询用户拥有题库商品")
     @GetMapping("/listGoodsUserQuestion")
     public TableDataInfo<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<GoodsUserQuestionVo> list = iQuestionService.listGoodsUserQuestionVo(bo);
         for (GoodsUserQuestionVo g : list) {
             UserExamRecordQueryBo userExamRecordQueryBo = new UserExamRecordQueryBo();
@@ -88,9 +88,9 @@ public class QuestionController extends BaseController {
     @ApiOperation("查询用户拥有免费题库商品")
     @GetMapping("/listFreeGoodsList")
     public TableDataInfo<GoodsUserQuestionVo> listFreeGoodsList(GoodsQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<GoodsUserQuestionVo> list = iQuestionService.listUserFreeGoodsList(bo);
         for (GoodsUserQuestionVo g : list) {
             UserExamRecordQueryBo userExamRecordQueryBo = new UserExamRecordQueryBo();
@@ -110,9 +110,9 @@ public class QuestionController extends BaseController {
     @ApiOperation("查询用户拥有免费+自购题库商品")
     @GetMapping("/listUserFreeUnionBuyGoodsList")
     public TableDataInfo<GoodsUserQuestionVo> listUserFreeUnionBuyGoodsList(GoodsQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<GoodsUserQuestionVo> list = iQuestionService.listUserFreeUnionBuyGoodsList(bo);
         if (!CollectionUtils.isEmpty(list)){
             for (GoodsUserQuestionVo g : list) {

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

@@ -126,10 +126,10 @@ public class ProfileTpController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:profile:list')")
     @GetMapping("/listProfile")
     public TableDataInfo<UserProfileVo> list(UserProfileQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
         bo.setTypeStatus(1L);
+        startPage();
         List<UserProfileVo> list = iUserProfileService.queryList(bo);
         return getDataTable(list);
     }

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

@@ -114,11 +114,11 @@ public class UserProfileStampController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:profile:list')")
     @GetMapping("/listProfile")
     public TableDataInfo<UserProfileVo> list(UserProfileQueryBo bo) {
-        startPage();
         //2为承诺书审核
         bo.setTypeStatus(2L);
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserProfileVo> list = iUserProfileService.queryList(bo);
         return getDataTable(list);
     }

+ 50 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -7,11 +7,14 @@ 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.core.redis.RedisCache;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
+import com.zhongzheng.modules.alisms.bo.SmsAddBo;
+import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.bo.CourseTopicGoodsQueryBo;
@@ -35,6 +38,9 @@ import com.zhongzheng.modules.order.domain.Printer;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.user.bo.UserLiveAccountLoginBo;
+import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.vo.UserLiveAccountLoginVo;
 import com.zhongzheng.modules.wx.bo.WxInfoBo;
 import com.zhongzheng.modules.wx.bo.WxInfoQuery;
 import com.zhongzheng.modules.wx.bo.WxServerBody;
@@ -89,6 +95,10 @@ public class CommonController extends BaseController {
 
     private final IDistributionActivityGoodsService iDistributionActivityGoodsService;
 
+    private final IUserService iUserService;
+
+    private final IAliSmsService iSmsService;
+
     @PostMapping("/returnStream")
     public AjaxResult returnStream(MultipartFile file, HttpServletResponse response) throws IOException {
         ServletOutputStream out = null;
@@ -368,4 +378,44 @@ public class CommonController extends BaseController {
         List<ActivityGoodsPriceVo> list = iDistributionActivityGoodsService.getGoodsList(bo);
         return getDataTable(list);
     }
+
+    @RequestMapping("/token_offline")
+    public void loginAuthFailOffLine() {
+        throw new CustomException("用户验证错误",409);
+    }
+
+    @ApiOperation("直播短信统一登录")
+    @PostMapping("/live/sms_login")
+    public AjaxResult<UserLiveAccountLoginVo> sms_login(@RequestBody UserLiveAccountLoginBo bo) {
+        UserLiveAccountLoginVo vo = iUserService.smsLiveUnifyLogin(bo);
+        return AjaxResult.success(vo);
+    }
+
+    @ApiOperation("直播账号统一登录")
+    @PostMapping("/live/account_login")
+    public AjaxResult<UserLiveAccountLoginVo> account_login(@RequestBody UserLiveAccountLoginBo bo) {
+        UserLiveAccountLoginVo vo = iUserService.liveUnifyLogin(bo);
+        return AjaxResult.success(vo);
+    }
+
+    @ApiOperation("直播账号统一登录刷新")
+    @PostMapping("/live/account_login/refresh")
+    public AjaxResult<UserLiveAccountLoginVo> account_loginRefresh(@RequestBody UserLiveAccountLoginBo bo) {
+        UserLiveAccountLoginVo vo = iUserService.liveUnifyLoginRefresh(bo);
+        return AjaxResult.success(vo);
+    }
+
+    @ApiOperation("获取登录短信")
+    @PostMapping("/live/sms")
+    public AjaxResult liveSms(@RequestBody SmsAddBo bo) {
+        iSmsService.sendLiveSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("获取7个工作日后的时间")
+    @GetMapping("/live/time")
+    public AjaxResult getLiveTime() {
+        Long time = iCourseService.getLiveTime();
+        return AjaxResult.success(time);
+    }
 }

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

@@ -16,12 +16,10 @@ import com.zhongzheng.modules.bank.service.IQuestionModuleChapterService;
 import com.zhongzheng.modules.bank.vo.ExamQuestionVo;
 import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionChapterVo;
+import com.zhongzheng.modules.course.bo.CourseHandoutsFileQueryBo;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.bo.CourseSubjectQueryBo;
-import com.zhongzheng.modules.course.service.ICourseChapterSectionService;
-import com.zhongzheng.modules.course.service.ICourseMenuService;
-import com.zhongzheng.modules.course.service.ICourseModuleChapterService;
-import com.zhongzheng.modules.course.service.ICourseSubjectService;
+import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
 import com.zhongzheng.modules.goods.bo.GoodsAttachedQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsCourseTeacherQueryBo;
@@ -66,7 +64,7 @@ public class CommonCourseController extends BaseController {
 
     private final ICourseSubjectService iCourseSubjectService;
 
-
+    private final ICourseHandoutsService iCourseHandoutsService;
 
     /**
      * 查询课程目录结构列表
@@ -120,4 +118,14 @@ public class CommonCourseController extends BaseController {
         List<CourseSubjectVo> list = iCourseSubjectService.queryList(bo);
         return AjaxResult.success(list);
     }
+
+    /**
+     * 获取讲义列详细信息
+     */
+    @ApiOperation("获取讲义列详细信息去地址")
+    @GetMapping("/handouts/file/detail")
+    public AjaxResult<CourseHandoutsVo> getInfo(CourseHandoutsFileQueryBo queryBo) {
+        CourseHandoutsVo detail = iCourseHandoutsService.queryByIdNoUrl(queryBo);
+        return AjaxResult.success(detail);
+    }
 }

+ 17 - 8
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -1,24 +1,23 @@
 package com.zhongzheng.controller.course;
 
-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.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 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.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
@@ -47,9 +46,9 @@ public class CourseController extends BaseController {
     @ApiOperation("查询商品下的课程列表")
     @GetMapping("/courseList")
     public TableDataInfo<CourseUserVo> courseList(CourseQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<CourseUserVo> list = iCourseService.courseList(bo);
         return getDataTable(list);
     }
@@ -69,13 +68,23 @@ public class CourseController extends BaseController {
     @ApiOperation("查询用户拥有的商品")
     @GetMapping("/goodsList")
     public TableDataInfo<GoodsUserVo> goodsList(CourseQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<GoodsUserVo> list = iCourseService.goodsList(bo);
         return getDataTable(list);
     }
 
+    @ApiOperation("查询用户拥有的讲义商品")
+    @GetMapping("/goodsHandoutsList")
+    public TableDataInfo<GoodsUserVo> goodsHandoutsList(CourseQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<GoodsUserVo> list = iCourseService.goodsHandoutsList(bo);
+        return getDataTable(list);
+    }
+
     @ApiOperation("查询用户商品重修状态")
     @GetMapping("/goodsRebuildStatus")
     public AjaxResult<Long> goodsRebuildStatus(CourseQueryBo bo) {
@@ -90,9 +99,9 @@ public class CourseController extends BaseController {
     @ApiOperation("查询课程目录结构列表")
     @GetMapping("/menuList")
     public TableDataInfo<CourseUserMenuVo> menuList(CourseMenuQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<CourseUserMenuVo> list = iCourseMenuService.menuList(bo);
         return getDataTable(list);
     }

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

@@ -133,9 +133,9 @@ public class ExamApplyController extends BaseController {
     @ApiOperation("查询报考数据列表")
     @GetMapping("/list")
     public TableDataInfo<UserSubscribeVo> listSubscribe(UserSubscribeQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserSubscribeVo> list = iUserSubscribeService.listSubscribe(bo);
         return getDataTable(list);
     }

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

@@ -259,9 +259,9 @@ public class GoodsController extends BaseController {
     @ApiOperation("查询用户拥有直播商品")
     @GetMapping("/listGoodsUserLive")
     public TableDataInfo<OrderGoodsVo> listGoodsUserQuestionVo(GoodsQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<OrderGoodsVo> list = iOrderGoodsService.listGoodsUserLive(bo);
         return getDataTable(list);
     }
@@ -272,9 +272,9 @@ public class GoodsController extends BaseController {
     @ApiOperation("查询用户拥有视频+直播商品")
     @GetMapping("/listUserVideoLive")
     public TableDataInfo<OrderGoodsVo> listUserVideoLive(GoodsQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<OrderGoodsVo> list = iOrderGoodsService.listUserVideoLive(bo);
         return getDataTable(list);
     }
@@ -295,8 +295,8 @@ public class GoodsController extends BaseController {
     @ApiOperation("获取直播提醒列表")
     @GetMapping("/getLiveList")
     public TableDataInfo<CourseLiveVo> liveList() {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        startPage();
         List<CourseLiveVo> list = iOrderGoodsService.getLiveList(loginUser.getUser().getUserId());
         return getDataTable(list);
     }
@@ -330,9 +330,9 @@ public class GoodsController extends BaseController {
     @ApiOperation("获取用户所有购买商品")
     @PostMapping("/user/all")
     public TableDataInfo<GoodsListAllVo> getUserGoodsListAll(@RequestBody UserGoodsListAllBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<GoodsListAllVo> result = iGoodsService.getUserGoodsListAll(bo);
         return getDataTable(result);
     }

+ 1 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/inform/InformUserController.java

@@ -53,9 +53,9 @@ public class InformUserController extends BaseController {
     @ApiOperation("查询通知学员列表")
     @GetMapping("/list")
     public TableDataInfo<InformUserVo> list(InformUserQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         bo.setStatus(1);
         List<InformUserVo> list = iInformUserService.queryList(bo);
         return getDataTable(list);

+ 2 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/mock/MockApplyController.java

@@ -33,7 +33,7 @@ import java.util.List;
 
 /**
  * 模考安排Controller
- * 
+ *
  * @author ruoyi
  * @date 2022-05-24
  */
@@ -122,9 +122,9 @@ public class MockApplyController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:apply:list')")
     @GetMapping("/listApply")
     public TableDataInfo<MockApplyVo> listApply(MockApplyQueryBo bo){
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<MockApplyVo> list = iMockApplyService.queryApplyList(bo);
         return getDataTable(list);
     }

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

@@ -51,9 +51,9 @@ public class OrderController extends BaseController {
     @ApiOperation("查询订单列表")
     @GetMapping("/list")
     public TableDataInfo<OrderListVo> list(OrderQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<OrderListVo> list = iOrderService.selectListApp(bo);
         return getDataTable(list);
     }

+ 3 - 3
zhongzheng-api/src/main/java/com/zhongzheng/controller/plan/UserPlanController.java

@@ -37,7 +37,7 @@ import io.swagger.annotations.ApiOperation;
 
 /**
  * 学习计划Controller
- * 
+ *
  * @author ruoyi
  * @date 2021-12-08
  */
@@ -57,13 +57,13 @@ public class UserPlanController extends BaseController {
     @ApiOperation("查询学习计划列表")
     @GetMapping("/list")
     public TableDataInfo<UserPlanVo> list(UserPlanQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserPlanVo> list = iUserPlanService.queryList(bo);
         return getDataTable(list);
     }
-    
+
 
     /**
      * 获取学习计划详细信息

+ 7 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java

@@ -64,4 +64,11 @@ public class LoginController extends BaseController {
         Map<String,Object> map = iUserService.telphone_login(bo);
         return AjaxResult.success(map);
     }
+
+    @ApiOperation("用户账号自动登入")
+    @PostMapping("/automatic/account_login")
+    public AjaxResult automaticAccountLogin(@RequestBody UserAppTelphoneLoginBo bo) {
+        Map<String,Object> map = iUserService.automaticAccountLogin(bo);
+        return AjaxResult.success(map);
+    }
 }

+ 2 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserBankRecordController.java

@@ -57,9 +57,9 @@ public class UserBankRecordController extends BaseController {
     @ApiOperation("视频商品查询用户的做题历史列表")
     @GetMapping("/list")
     public TableDataInfo<UserBankRecordVo> list(UserBankRecordQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserBankRecordVo> list = iUserBankRecordService.queryList(bo);
         return getDataTable(list);
     }
@@ -70,9 +70,9 @@ public class UserBankRecordController extends BaseController {
     @ApiOperation("视频商品查询用户的做题历史列表")
     @GetMapping("/bankList")
     public TableDataInfo<UserBankRecordVo> getUserBankList(UserBankRecordQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserBankRecordVo> list = iUserBankRecordService.getUserBankList(bo);
         return getDataTable(list);
     }

+ 27 - 7
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -1,25 +1,24 @@
 package com.zhongzheng.controller.user;
 
 import cn.hutool.core.lang.Validator;
-import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.entity.SysUser;
-import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.controller.alioss.OssController;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserWxFollow;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserLoginKeyService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserVisitLogService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.user.vo.RanKingUser;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import io.swagger.annotations.Api;
@@ -56,6 +55,10 @@ public class UserController extends BaseController {
 
     private final WxLoginService wxLoginService;
 
+    private final ISysTenantService sysTenantService;
+
+    private final IUserLoginKeyService iUserLoginKeyService;
+
     private static Logger log = LoggerFactory.getLogger(UserController.class);
     /**
      * 修改客户端用户
@@ -119,6 +122,12 @@ public class UserController extends BaseController {
             vo.setUserFollowWx(1);
         }
         vo.setNull();
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isNotBlank(tenantId)){
+            SysTenant tenant = sysTenantService.getById(Long.valueOf(tenantId));
+            vo.setEduPhone(tenant.getEduPhone());
+        }
+
         bo.setUserId(loginUser.getUser().getUserId());
         iUserVisitLogService.insertByAddBo(bo);
         return AjaxResult.success(vo);
@@ -160,9 +169,9 @@ public class UserController extends BaseController {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         UserVo userVo = iUserService.queryById(loginUser.getUser().getUserId());
         boolean needUpdate = false;
-        if(Validator.isNotEmpty(userVo.getPwdTime())&&(DateUtils.getNowTime().longValue()-userVo.getPwdTime().longValue())>90*24*3600){
+       /* if(Validator.isNotEmpty(userVo.getPwdTime())&&(DateUtils.getNowTime().longValue()-userVo.getPwdTime().longValue())>90*24*3600){
             needUpdate = true;
-        }
+        }*/
         return AjaxResult.success(needUpdate);
     }
 
@@ -185,4 +194,15 @@ public class UserController extends BaseController {
         UserVo userVo = iUserService.queryById(loginUser.getUser().getUserId());
         return AjaxResult.success("成功",userVo.getGzhOpenId());
     }
+
+    @ApiOperation("把其他用户踢下线")
+    @Log(title = "把其他用户踢下线", businessType = BusinessType.UPDATE)
+    @PostMapping("/offline")
+    public AjaxResult<Void> offline(){
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        UserLoginKeyEditBo editBo = new UserLoginKeyEditBo();
+        editBo.setUserId(loginUser.getUser().getUserId());
+        editBo.setUserKey(loginUser.getToken());
+        return toAjax(iUserLoginKeyService.offline(editBo) ? 1 : 0);
+    }
 }

+ 1 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserNoteController.java

@@ -54,9 +54,9 @@ public class UserNoteController extends BaseController {
     @ApiOperation("查询用户笔记记录列表")
     @GetMapping("/listDate")
     public TableDataInfo<UserDateNoteVo> listDate(UserNoteQueryBo bo) {
-        startPage();
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
         List<UserDateNoteVo> list = iUserNoteService.listDate(bo);
         return getDataTable(list);
     }

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

@@ -142,6 +142,14 @@ public class UserStudyRecordController extends BaseController {
         return AjaxResult.success(iUserStudyRecordService.menuAllListWithExam(bo));
     }
 
+    @ApiOperation("查询商品所有子目录带试卷结构列表")
+    @GetMapping("/goodsAllListWithExam")
+    public AjaxResult<List<ClassPeriodVo>> goodsAllListWithExam(UserStudyRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserStudyRecordService.goodsAllListWithExam(bo));
+    }
+
     @ApiOperation("查询用户每天学习记录列表")
     @GetMapping("/listUserRecord")
     public TableDataInfo<SectionStudyRecordVo> listUserRecord(UserStudyRecordQueryBo bo) {

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

@@ -121,7 +121,7 @@ certificate:
 
 
 
-liveGotoURL: http://120.79.166.78:19014/
+liveGotoURL: http://
 
 
 enCodeVersion: trial
@@ -166,9 +166,12 @@ oldOrder:
     checkOrderBrokerage: http://gdxypx.xy.com/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:5030/common/platform/pay
     refundPayHandle: http://192.168.1.222:5030/common/platform/pay/handle
+    updateRemark: http://gdxypx.xy.com/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://gdxypx.xy.com
 
 invoice:
-    host: http://192.168.1.222:7077/sys/common/openMplatform/log
+    host: http://192.168.1.222:7077/sys/common/openMplatform/log
+
+liveHost: http://192.168.1.222:6009

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

@@ -163,6 +163,7 @@ oldOrder:
     checkOrderBrokerage: http://test.jqbao.net/WitSystem/BussinessApi/CommissionRate
     refundPay: http://192.168.1.222:6030/common/platform/pay
     refundPayHandle: http://192.168.1.222:6030/common/platform/pay/handle
+    updateRemark: http://test.jqbao.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://test.jqbao.net

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

@@ -175,9 +175,12 @@ oldOrder:
     checkOrderBrokerage: http://www.xyyxt.net/WitSystem/BussinessApi/CommissionRate
     refundPay: https://cloud.xyyxt.net/common/platform/pay
     refundPayHandle: https://cloud.xyyxt.net/common/platform/pay/handle
+    updateRemark: http://www.xyyxt.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
     host: http://test.jqbao.net
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
+
+liveHost: https://sso.xyyxt.net

+ 5 - 0
zhongzheng-common/pom.xml

@@ -237,6 +237,11 @@
             <groupId>io.undertow</groupId>
             <artifactId>undertow-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>mail</artifactId>
+            <version>1.4.7</version>
+        </dependency>
 
     </dependencies>
 

+ 161 - 12
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -1,20 +1,15 @@
 package com.zhongzheng.common.utils;
 
+import cn.hutool.core.lang.Validator;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import cn.hutool.core.lang.Validator;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.lang3.time.DateFormatUtils;
+import java.util.*;
 
 /**
  * 时间工具类
@@ -29,6 +24,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String YYYY_MM_DD = "yyyy-MM-dd";
 
+    public static String YYYYMMDD = "yyyyMMdd";
+
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
@@ -123,6 +120,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(date, "yyyy/MM/dd");
     }
 
+    public static Date timeToDate(Long times){
+        long t = times.longValue();
+        t = t * 1000;
+        return new Date(t);
+    }
+
+    public static String timestampToDateFormatMonth(Long times){
+        if(Validator.isEmpty(times)){
+            return "";
+        }
+        long t = times.longValue();
+        t = t * 1000;
+        Date date = new Date(t);
+        return DateFormatUtils.format(date, "MM月dd号");
+    }
+
+    public static String timestampToDateFormatMonthTwo(Long times){
+        if(Validator.isEmpty(times)){
+            return "";
+        }
+        long t = times.longValue();
+        t = t * 1000;
+        Date date = new Date(t);
+        return DateFormatUtils.format(date, "MM.dd");
+    }
+
     public static String timestampToDateFormat(Long times,String patternStr){
         if(Validator.isEmpty(times)){
             return "";
@@ -133,6 +156,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(date, patternStr);
     }
 
+
+    /**
+     * 将秒转为时分秒格式【01:01:01】
+     * @param second 需要转化的秒数
+     * @return
+     */
+    public static String secondConvertHourMinSecond(Long second) {
+        String str = "";
+        if (second == null || second < 0) {
+            return str;
+        }
+
+        // 得到小时
+        long h = second / 3600;
+        str = h > 0 ? ((h < 10 ? ("0" + h) : h) + "时") : "";
+
+        // 得到分钟
+        long m = (second % 3600) / 60;
+        str += m > 0? (m < 10 ? ("0" + m) : m) + "分":"";
+
+        //得到剩余秒
+        long s = second % 60;
+        str += s > 0?(s < 10 ? ("0" + s) : s)+"秒":"";
+        return str;
+    }
+
     public static String timestampToDate(Long times){
         if(Validator.isEmpty(times)){
             return "";
@@ -360,8 +409,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
                 timeStr = "00:"+unitFormat(minute) + ":" + unitFormat(second);
             } else {
                 hour = minute / 60;
-                if (hour > 99)
+                if (hour > 99){
                     return "99:59:59";
+                }
                 minute = minute % 60;
                 second = time - hour * 3600 - minute * 60;
                 timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second);
@@ -427,4 +477,103 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
                 return 7;
         }
     }
+
+
+    public static LocalDate[] getDateArray() {
+        // 创建一个长度为30的数组
+        LocalDate[] dates = new LocalDate[30];
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+        // 用循环给数组赋值
+        for (int i = 0; i < dates.length; i++) {
+            // 用today.plusDays(i)得到第i天的日期
+            dates[i] = today.plusDays(i);
+        }
+        // 返回数组
+        return dates;
+    }
+
+    static List<String> holiday =new ArrayList<>();
+    static List<String> extraWorkDay =new ArrayList<>();
+    public static Boolean isWorkingDay(long time) {
+        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of("+8"));
+        String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        initHoliday();
+        initExtraWorkDay();
+        //是否加班日
+        if(extraWorkDay.contains(formatTime)){
+            return true;
+        }
+        //是否节假日
+        if(holiday.contains(formatTime)){
+            return false;
+        }
+        //如果是1-5表示周一到周五  是工作日
+        DayOfWeek week = dateTime.getDayOfWeek();
+        if(week==DayOfWeek.SATURDAY||week==DayOfWeek.SUNDAY){
+            return false;
+        }
+        return true;
+
+    }
+
+    /**
+     *  初始化节假日
+     */
+    public static void initHoliday(){
+        holiday.add("2023-06-22");
+        holiday.add("2023-06-23");
+        holiday.add("2023-09-29");
+        holiday.add("2023-09-30");
+        holiday.add("2023-10-01");
+        holiday.add("2023-10-02");
+        holiday.add("2023-10-03");
+        holiday.add("2023-10-04");
+        holiday.add("2023-10-05");
+        holiday.add("2023-10-06");
+    }
+    /**
+     *  初始化额外加班日
+     */
+    public static void initExtraWorkDay(){
+        extraWorkDay.add("2023-06-25");
+        extraWorkDay.add("2023-10-07");
+        extraWorkDay.add("2023-10-08");
+    }
+
+
+    /**
+     * 指定时间往前或往后推n天
+     *
+     * @param dateTime 指定时间
+     * @param x 指定天数
+     * @return
+     */
+    public static Long getDayBefore(Long dateTime, int x) {
+        Calendar c = Calendar.getInstance();
+        Date date = new Date(dateTime*1000);
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day - x);    //往前推几天
+        //c.set(Calendar.DATE, day + x);  往后推几天
+        return c.getTime().getTime()/1000;
+    }
+
+    /**
+     * 指定时间往前或往后推n天
+     *
+     * @param dateTime 指定时间
+     * @param x 指定天数
+     * @return
+     */
+    public static Long getDayAfter(Long dateTime, int x) {
+        Calendar c = Calendar.getInstance();
+        Date date = new Date(dateTime*1000);
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+//        c.set(Calendar.DATE, day - x);    //往前推几天
+        c.set(Calendar.DATE, day + x);  //往后推几天
+        return c.getTime().getTime()/1000;
+    }
+
 }

+ 46 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/JavaMailUtils.java

@@ -0,0 +1,46 @@
+package com.zhongzheng.common.utils;
+
+
+import javax.mail.Authenticator;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import java.util.Properties;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月19日 10:11
+ */
+public class JavaMailUtils {
+
+    public static Session createsession(String postAccount,String postPassword,String STMPserver,String post) {
+        // SMTP服务器地址
+        String smtp = STMPserver;
+
+        // 邮箱账号和密码(授权密码)
+        String userName = postAccount;
+        String password = postPassword;
+
+        // SMTP服务器的连接信息
+        Properties props = new Properties();
+        props.put("mail.smtp.host", smtp); // SMTP主机号
+        props.put("mail.smtp.port", post); // 主机端口号
+        props.put("mail.smtp.auth", "true"); // 是否需要认证
+        props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
+        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+
+        // 创建Session
+        // 参数1:SMTP服务器的连接信息
+        // 参数2:用户认证对象(Authenticator接口的匿名实现类)
+        Session session = Session.getInstance(props, new Authenticator() {
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication(userName, password);
+            }
+        });
+
+        // 开启调试模式
+        session.setDebug(true);
+
+        return session;
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.zhongzheng.common.utils;
 
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
@@ -12,6 +13,13 @@ import com.zhongzheng.common.exception.CustomException;
 import io.micrometer.core.lang.NonNull;
 import net.sf.jsqlparser.expression.LongValue;
 
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.DESedeKeySpec;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
@@ -489,4 +497,121 @@ public class ToolsUtils {
         return buffer.toString();
     }
 
+    public static String dataSign(String sourceMsg, String pKey) throws NoSuchAlgorithmException {
+        String tempPKey = MD5PubHasher(pKey.getBytes(StandardCharsets.UTF_8));
+        tempPKey = sourceMsg + tempPKey;
+        tempPKey = MD5PubHasher(tempPKey.getBytes(StandardCharsets.UTF_8));
+        return tempPKey;
+    }
+
+    private static String MD5PubHasher(byte[] hashText) throws NoSuchAlgorithmException {
+        MessageDigest md5 = MessageDigest.getInstance("MD5");
+        byte[] b = md5.digest(hashText);
+        StringBuilder ret = new StringBuilder();
+        for (int i = 0; i < b.length; i++) {
+            ret.append(String.format("%02x", b[i]));
+        }
+        return ret.toString();
+    }
+
+    public static String encryptDes(String source, byte[] key, byte[] iv) throws Exception {
+        SecretKey secretKey = new SecretKeySpec(key, "DES");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
+        byte[] inputByteArray = source.getBytes(StandardCharsets.UTF_8);
+        byte[] encryptedByteArray = cipher.doFinal(inputByteArray);
+        return new String(java.util.Base64.getEncoder().encode(encryptedByteArray));
+    }
+
+    public static String decryptDes(String source, byte[] key, byte[] iv) throws Exception {
+        SecretKey secretKey = new SecretKeySpec(key, "DES");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
+        byte[] inputByteArray = java.util.Base64.getDecoder().decode(source.getBytes(StandardCharsets.UTF_8));
+        byte[] decryptedByteArray = cipher.doFinal(inputByteArray);
+        return new String(decryptedByteArray, StandardCharsets.UTF_8);
+    }
+
+    /*public static String encryptDesNew(String source, String pass) throws Exception {
+        byte[] rgbKey = pass.getBytes("UTF-8");
+        byte[] rgbIV = pass.getBytes("UTF-8");
+                DESedeKeySpec desKeySpec = new DESedeKeySpec(rgbKey);
+             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+             SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+             Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
+            byte[] inputByteArray = source.getBytes("UTF-8");
+            IvParameterSpec ivParameterSpec = new IvParameterSpec(rgbIV);
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
+            byte[] encrypted = cipher.doFinal(inputByteArray);
+            return Base64.getEncoder().encodeToString(encrypted);}
+    }*/
+
+    /**
+
+     Des解密
+     @param source 源字符串
+     @param pass 密钥,长度必须8位
+     @return 解密后的字符串 */
+    /*public static String decryptDesNew(String source, String pass) throws Exception {
+        byte[] rgbKey = pass.getBytes("UTF-8");
+        byte[] rgbIV = pass.getBytes("UTF-8");
+        DESedeKeySpec desKeySpec = new DESedeKeySpec(rgbKey);
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding")) {
+        byte[] inputByteArray = Base64.getDecoder().decode(source);
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(rgbIV);
+        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
+        byte[] decrypted = cipher.doFinal(inputByteArray);
+        return new String(decrypted, "UTF-8");
+        }
+    }*/
+
+
+ public static String encryptDesNew(String source, String pass) throws Exception {
+        byte[] rgbKey = pass.getBytes(StandardCharsets.UTF_8);
+        byte[] rgbIV = pass.getBytes(StandardCharsets.UTF_8);
+        DESKeySpec desKeySpec = new DESKeySpec(rgbKey);
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+        byte[] inputByteArray = source.getBytes(StandardCharsets.UTF_8);
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(rgbIV);
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
+        byte[] encryptedByteArray = cipher.doFinal(inputByteArray);
+        return Base64.getEncoder().encodeToString(encryptedByteArray);
+    }
+
+   public static String decryptDesNew(String source, String pass) throws Exception {
+        byte[] rgbKey = pass.getBytes(StandardCharsets.UTF_8);
+        byte[] rgbIV = pass.getBytes(StandardCharsets.UTF_8);
+        DESKeySpec desKeySpec = new DESKeySpec(rgbKey);
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+        byte[] inputByteArray = Base64.getDecoder().decode(source);
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(rgbIV);
+        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
+        byte[] decryptedByteArray = cipher.doFinal(inputByteArray);
+        return new String(decryptedByteArray, StandardCharsets.UTF_8);
+    }
+
+    private static String base64Encode(byte[] bytes) throws IOException {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        Base64.getEncoder().wrap(output).write(bytes);
+        return output.toString(StandardCharsets.UTF_8.name());
+    }
+
+    /*private static byte[] base64Decode(String str) throws IOException {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        Base64.getDecoder().wrap(output).write(str.getBytes(StandardCharsets.UTF_8));
+        return output.toByteArray();
+    }*/
+    private static byte[] base64Decode(String str) throws IOException {
+        byte[] decodedString = Base64.getDecoder().decode(new String(str).getBytes("UTF-8"));
+        return decodedString;
+    }
+
 }

+ 147 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java

@@ -7,6 +7,7 @@ import com.zhongzheng.common.exception.CustomException;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
@@ -22,8 +23,11 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.security.MessageDigest;
 import java.util.Comparator;
+import java.util.List;
 import java.util.UUID;
 import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 文件处理工具类
@@ -32,6 +36,8 @@ import java.util.stream.Stream;
  */
 public class FileUtils extends org.apache.commons.io.FileUtils
 {
+
+    private static final byte[] buf = new byte[1024];
     public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
 
     /**
@@ -297,4 +303,145 @@ public class FileUtils extends org.apache.commons.io.FileUtils
             throw new CustomException(e.getMessage());
         }
     }
+
+    /**
+     * 压缩成ZIP 方法1
+     *
+     * @param zipFileName       压缩文件夹路径
+     * @param sourceFileName    要压缩的文件路径
+     * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
+     *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+     * @throws RuntimeException 压缩失败会抛出运行时异常
+     */
+    public static Boolean toZip(String zipFileName, String sourceFileName, boolean KeepDirStructure) {
+        Boolean result = true;
+        long start = System.currentTimeMillis();//开始
+        ZipOutputStream zos = null;
+        try {
+            FileOutputStream fileOutputStream = new FileOutputStream(zipFileName);
+            zos = new ZipOutputStream(fileOutputStream);
+            File sourceFile = new File(sourceFileName);
+            compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
+            long end = System.currentTimeMillis();//结束
+            System.out.println("压缩完成,耗时:" + (end - start) + " 毫秒");
+        } catch (Exception e) {
+            result = false;
+            e.printStackTrace();
+        } finally {
+            if (zos != null) {
+                try {
+                    zos.close();
+                } catch (IOException e) {
+                    e.getStackTrace();
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @Title: compress
+     * @Description: TODO
+     * @param filePaths 需要压缩的文件地址列表(绝对路径)
+     * @param zipFilePath 需要压缩到哪个zip文件(无需创建这样一个zip,只需要指定一个全路径)
+     * @param keepDirStructure 压缩后目录是否保持原目录结构
+     * @throws IOException
+     * @return int   压缩成功的文件个数
+     */
+    public static Boolean compressList(List<String> filePaths, String zipFilePath, Boolean keepDirStructure){
+        byte[] buf = new byte[1024];
+        File zipFile = new File(zipFilePath);
+        int fileCount = 0;//记录压缩了几个文件?
+        try {
+            //zip文件不存在,则创建文件,用于压缩
+            if(!zipFile.exists()){
+                zipFile.createNewFile();
+            }
+            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
+            for(int i = 0; i < filePaths.size(); i++){
+                String relativePath = filePaths.get(i);
+                if(StringUtils.isEmpty(relativePath)){
+                    continue;
+                }
+                File sourceFile = new File(relativePath);//绝对路径找到file
+                if(sourceFile == null || !sourceFile.exists()){
+                    continue;
+                }
+
+                FileInputStream fis = new FileInputStream(sourceFile);
+                if(keepDirStructure!=null && keepDirStructure){
+                    //保持目录结构
+                    zos.putNextEntry(new ZipEntry(relativePath));
+                }else{
+                    //直接放到压缩包的根目录
+                    zos.putNextEntry(new ZipEntry(sourceFile.getName()));
+                }
+                //System.out.println("压缩当前文件:"+sourceFile.getName());
+                int len;
+                while((len = fis.read(buf)) > 0){
+                    zos.write(buf, 0, len);
+                }
+                zos.closeEntry();
+                fis.close();
+                fileCount++;
+            }
+            zos.close();
+            //System.out.println("压缩完成");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return fileCount > 0;
+    }
+
+
+    /**
+     * 递归压缩方法
+     *
+     * @param sourceFile       源文件
+     * @param zos              zip输出流
+     * @param name             压缩后的名称
+     * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
+     *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+     * @throws Exception
+     */
+    public static void compress(File sourceFile, ZipOutputStream zos, String name,
+                                boolean KeepDirStructure) throws Exception {
+
+        if (sourceFile.isFile()) {
+            // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
+            zos.putNextEntry(new ZipEntry(name));
+            // copy文件到zip输出流中
+            int len;
+            FileInputStream in = new FileInputStream(sourceFile);
+            while ((len = in.read(buf)) != -1) {
+                zos.write(buf, 0, len);
+            }
+            // Complete the entry
+            zos.closeEntry();
+            in.close();
+        } else {
+            File[] listFiles = sourceFile.listFiles();
+            if (listFiles == null || listFiles.length == 0) {
+                // 需要保留原来的文件结构时,需要对空文件夹进行处理
+                if (KeepDirStructure) {
+                    // 空文件夹的处理
+                    zos.putNextEntry(new ZipEntry(name + "/"));
+                    // 没有文件,不需要文件的copy
+                    zos.closeEntry();
+                }
+            } else {
+                for (File file : listFiles) {
+                    // 判断是否需要保留原来的文件结构
+                    if (KeepDirStructure) {
+                        // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
+                        // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
+                        compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
+                    } else {
+                        compress(file, zos, file.getName(), KeepDirStructure);
+                    }
+                }
+            }
+        }
+    }
+
 }

+ 49 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/ExcelUtil.java

@@ -30,7 +30,6 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -388,6 +387,55 @@ public class ExcelUtil<T>
         }
     }
 
+    public void exportEasyExcelStudy(List<Map<String, Object>> sheetsList,String path)
+    {
+        OutputStream out = null;
+        //     Workbook workbook = null;
+        try
+        {
+            Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
+            File desc = new File(path);
+            if (!desc.getParentFile().exists())
+            {
+                desc.getParentFile().mkdirs();
+            }
+            out = new FileOutputStream(path);
+            workbook.write(out);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            log.error("导出Excel异常{}", e.getMessage());
+            throw new CustomException("导出Excel失败,请联系网站管理员!");
+        }
+        finally
+        {
+
+            if (wb != null)
+            {
+                try
+                {
+                    wb.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+            if (out != null)
+            {
+                try
+                {
+                    out.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
      *

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

@@ -139,6 +139,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/merge/file").anonymous()
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
+                .antMatchers("/common/apply/detail").anonymous()
                 .antMatchers("/common/platform/pay").anonymous()
                 .antMatchers("/common/platform/pay/handle").anonymous()
                 .antMatchers("/common/alike/goods").anonymous()
@@ -148,6 +149,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/free/**").anonymous()
                 .antMatchers("/common/download**").anonymous()
                 .antMatchers("/common/download/resource**").anonymous()
+                .antMatchers("/grade/grade/listPeriod").anonymous()
+                .antMatchers("/course/business/queryFullId").anonymous()
+                .antMatchers("/grade/grade/listUserPeriod").anonymous()
+                .antMatchers("/grade/grade/listPeriodAudit").anonymous()
+                .antMatchers("/grade/grade/listUserVideoRecord").anonymous()
                 .antMatchers("/swagger-ui.html").anonymous()
                 .antMatchers("/swagger-resources/**").anonymous()
                 .antMatchers("/webjars/**").anonymous()

+ 11 - 4
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -4,6 +4,7 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.http.HttpStatus;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.framework.web.service.TopTokenService;
 import com.zhongzheng.modules.user.entity.ClientLoginSeller;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
@@ -55,10 +56,15 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
             if(StringUtils.isNoneEmpty(wxToken)){
                 ClientLoginUser clientLoginUser = wxTokenService.getLoginUser(request);
                 if(clientLoginUser!=null){
-                    wxTokenService.verifyToken(clientLoginUser);
-                    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(clientLoginUser, null,null);
-                    authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-                    SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+                    if(Validator.isNull(clientLoginUser.getUser())){
+                        request.getRequestDispatcher("/app/common/token_offline").forward(request, response);
+                        return;
+                    }else{
+                        wxTokenService.verifyToken(clientLoginUser);
+                        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(clientLoginUser, null,null);
+                        authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+                        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+                    }
                 }
             }else{
                 if(!enabledTenant){
@@ -88,6 +94,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
             }
         }catch (Exception e){
             request.getRequestDispatcher("/filter/token_auth_fail").forward(request, response);
+            return;
         }
         chain.doFilter(request, response);
     }

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

@@ -3,7 +3,6 @@ package com.zhongzheng.framework.web.service;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
-
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -36,7 +35,6 @@ import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
@@ -471,6 +469,7 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
         tenant.setBillDay(bo.getBillDay());
         tenant.setAccountInformation(JSONArray.toJSONString(bo.getAccountList()));
         tenant.setInvoiceInformation(JSONObject.toJSONString(bo.getInvoiceBo()));
+        tenant.setEduPhone(bo.getEduPhone());
         return updateById(tenant);
     }
 

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

@@ -114,7 +114,7 @@ public class TokenService
             }
         }
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        loginUser.setExpireTime(System.currentTimeMillis()+200);
+        loginUser.setExpireTime(System.currentTimeMillis());
         return loginUser;
     }
 

+ 137 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserLoginKeyServiceImpl.java

@@ -0,0 +1,137 @@
+package com.zhongzheng.framework.web.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.user.bo.UserLoginKeyAddBo;
+import com.zhongzheng.modules.user.bo.UserLoginKeyEditBo;
+import com.zhongzheng.modules.user.bo.UserLoginKeyQueryBo;
+import com.zhongzheng.modules.user.domain.UserLoginKey;
+import com.zhongzheng.modules.user.mapper.UserLoginKeyMapper;
+import com.zhongzheng.modules.user.service.IUserLoginKeyService;
+import com.zhongzheng.modules.user.vo.UserLoginKeyVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户登录KEYService业务层处理
+ *
+ * @author hjl
+ * @date 2023-06-14
+ */
+@Service
+public class UserLoginKeyServiceImpl extends ServiceImpl<UserLoginKeyMapper, UserLoginKey> implements IUserLoginKeyService {
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Override
+    public UserLoginKeyVo queryById(Long id){
+        UserLoginKey db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, UserLoginKeyVo.class);
+    }
+
+    @Override
+    public Boolean queryByUserKey(String userKey) {
+        UserLoginKey loginKey = getOne(new LambdaQueryWrapper<UserLoginKey>()
+                .eq(UserLoginKey::getUserKey, userKey).last("limit 1"));
+        if(Validator.isNotEmpty(loginKey)&&loginKey.getStatus()==0){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public List<UserLoginKeyVo> queryList(UserLoginKeyQueryBo bo) {
+        LambdaQueryWrapper<UserLoginKey> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, UserLoginKey::getUserId, bo.getUserId());
+        lqw.eq(StrUtil.isNotBlank(bo.getUserKey()), UserLoginKey::getUserKey, bo.getUserKey());
+        lqw.eq(bo.getStatus() != null, UserLoginKey::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getIp()), UserLoginKey::getIp, bo.getIp());
+        lqw.eq(StrUtil.isNotBlank(bo.getBrowser()), UserLoginKey::getBrowser, bo.getBrowser());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<UserLoginKeyVo> entity2Vo(Collection<UserLoginKey> collection) {
+        List<UserLoginKeyVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, UserLoginKeyVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<UserLoginKey> page = (Page<UserLoginKey>)collection;
+            Page<UserLoginKeyVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(UserLoginKeyAddBo bo) {
+        UserLoginKey add = BeanUtil.toBean(bo, UserLoginKey.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(UserLoginKeyEditBo bo) {
+        UserLoginKey update = BeanUtil.toBean(bo, UserLoginKey.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(UserLoginKey entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    @Override
+    public Boolean offline(UserLoginKeyEditBo bo) {
+        if(Validator.isEmpty(bo.getUserId())||Validator.isEmpty(bo.getUserKey())){
+            throw new CustomException("参数错误");
+        }
+        LambdaUpdateWrapper<UserLoginKey> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        objectLambdaUpdateWrapper.eq(UserLoginKey::getUserId, bo.getUserId());
+        objectLambdaUpdateWrapper.ne(UserLoginKey::getUserKey, bo.getUserKey());
+        objectLambdaUpdateWrapper.set(UserLoginKey::getStatus, 0);
+        this.update(null, objectLambdaUpdateWrapper);
+        String key = "LockAppAction_"+"bank"+"-"+bo.getUserId();
+        String key2 = "LockAppAction_"+"jxjy"+"-"+bo.getUserId();
+        redisCache.deleteObject(key);
+        redisCache.deleteObject(key2);
+        return true;
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ObjectUtil;
@@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
+import com.google.common.base.Splitter;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
@@ -30,20 +32,30 @@ import com.zhongzheng.modules.collect.domain.CollectNote;
 import com.zhongzheng.modules.collect.mapper.CollectBankMapper;
 import com.zhongzheng.modules.collect.mapper.CollectCourseMapper;
 import com.zhongzheng.modules.collect.mapper.CollectNoteMapper;
+import com.zhongzheng.modules.course.domain.Course;
+import com.zhongzheng.modules.course.domain.CourseSection;
 import com.zhongzheng.modules.course.domain.CourseSubject;
+import com.zhongzheng.modules.course.service.ICourseSectionService;
+import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.service.ICourseSubjectService;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
-import com.zhongzheng.modules.inform.domain.InformRemind;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
-import com.zhongzheng.modules.user.domain.*;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.domain.UserStudyLog;
+import com.zhongzheng.modules.user.domain.UserVisitLog;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
 import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -115,6 +127,17 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     private IUserLoginErrorService iUserLoginErrorService;
     @Autowired
     private  ISysConfigService configService;
+    @Autowired
+    private IGoodsService iGoodsService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
+    @Autowired
+    private ICourseService iCourseService;
+    @Autowired
+    private ICourseSectionService iCourseSectionService;
+    @Value("${liveGotoURL}")
+    private String liveGotoURL;
 
 
     @Override
@@ -1089,6 +1112,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         });
     }
 
+
+
     private Long findSubjectId(String subject){
         if(subject!=null){
             String key = "SUB_"+subject;
@@ -1212,6 +1237,335 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return this.updateById(update);
     }
 
+    @Override
+    public UserLiveAccountLoginVo liveUnifyLogin(UserLiveAccountLoginBo bo) {
+        if (bo.getType() != 1){
+            throw new CustomException("登录错误");
+        }
+        if(Validator.isEmpty(bo.getAccount())){
+            throw new CustomException("账号不能为空");
+        }
+
+        List<User> userList = baseMapper.getUserByTel(bo.getAccount());
+        if (CollectionUtils.isEmpty(userList)){
+            throw new CustomException("账号不存在!请检查");
+        }
+        //参数解析
+        String param = new String(Base64.decode(bo.getParam()));
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数为空");
+        }
+
+        Map<String, String> split = Splitter.on("&").withKeyValueSeparator("=").split(param);
+        //商品ID
+        Long goodsId = Long.valueOf(split.get("gid"));
+        //观看权限
+        String per = split.get("watchPer");
+        //课程ID
+        String cid = split.get("cid");
+        //节ID
+        String sid = split.get("sid");
+
+        //获取对应商品
+        Goods goods = iGoodsService.getGoodsByIdNotTenant(goodsId);
+        User user = new User();
+        if (StringUtils.isNotBlank(per) && Integer.valueOf(per) == 2){
+            //所有人都可以看
+            user = userList.stream().filter(item -> {
+                Long tenantId = item.getTenantId();
+                Course course = iCourseService.getCourseByNotTenant(Long.valueOf(cid));
+                Long courseId = iCourseService.getCourseByTenantTwo(course.getCourseName(),course.getCode(),tenantId);
+                CourseSection section = iCourseSectionService.getSectionByNotTenant(Long.valueOf(sid));
+                CourseSection courseSection = iCourseSectionService.getSectionByTenantTwo(section.getName(),section.getCode(),tenantId);
+                Goods goodsTwo = iGoodsService.getGoodsByTenantTwo(goods.getGoodsName(),goods.getCode(),tenantId);
+                return ObjectUtils.isNotNull(courseId) && ObjectUtils.isNotNull(courseSection) && ObjectUtils.isNotNull(goodsTwo);
+            }).findFirst().orElse(null);
+
+        }else {
+            user = userList.stream().filter(item -> {
+                //判断用户是否购买商品
+                Long count = baseMapper.getUserOrderCount(item.getUserId(), item.getTenantId(), goods.getCode(), goods.getGoodsName());
+                return count > 0;
+            }).findFirst().orElse(null);
+        }
+
+        if(Validator.isEmpty(user)){
+            throw new CustomException("登录错误,请联系管理员!");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            throw new BaseException("对不起,您的账号:已停用");
+        }
+        String password = null;
+        if(bo.getPwd().length()>20){
+            String rsaPrivate = null;
+            try {
+                InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/pri.key");
+                rsaPrivate = AES.getStringByInputStream_1(certStream);
+                certStream.close();
+                password = AES.decrypt(bo.getPwd(),rsaPrivate);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }else{
+            password = bo.getPwd();
+        }
+        if (!SecurityUtils.matchesPassword(password,user.getPassword()))
+        {
+            iUserLoginErrorService.saveErrorLog(bo.getAccount());
+            throw new BaseException("登录信息错误");
+        }
+        Long tenantId = user.getTenantId();
+        //组装跳转路径
+        SysTenant tenant = iSysTenantService.getById(tenantId);
+        String post = "";
+        String path = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                post = tenant.getHostH5();
+                path = "pages/webview/index";
+                break;
+            case 2://PC
+                post = tenant.getHostPc();
+                path = "living-room";
+                break;
+        }
+
+        Course course = iCourseService.getCourseByNotTenant(Long.valueOf(cid));
+        Long courseId = iCourseService.getCourseByTenantTwo(course.getCourseName(),course.getCode(),tenantId);
+        CourseSection section = iCourseSectionService.getSectionByNotTenant(Long.valueOf(sid));
+        CourseSection courseSection = iCourseSectionService.getSectionByTenantTwo(section.getName(),section.getCode(),tenantId);
+        Goods goodsTwo = iGoodsService.getGoodsByTenantTwo(goods.getGoodsName(),goods.getCode(),tenantId);
+
+        String url = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                String format1 = String.format("cid=%s&gid=%s&sid=%s&a=1", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s1 = Base64.encode(format1);
+                url = String.format("%s/%s/%s?scene=%s",liveGotoURL, post,path, s1);
+                break;
+            case 2://Pc
+                String format = String.format("cid=%s&gid=%s&sid=%s", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s = Base64.encode(format);
+                url = String.format("%s/%s/%s/%s?a=1&%s",liveGotoURL, post,path,courseSection.getLiveUrl(), s);
+                break;
+            default:
+                break;
+        }
+
+        UserLiveAccountLoginVo vo = new UserLiveAccountLoginVo();
+        vo.setTel(user.getTelphone());
+        vo.setUser_account(user.getUserAccount());
+        vo.setUrl(url);
+        vo.setTenantId(tenantId);
+        return vo;
+    }
+
+    @Override
+    public Map<String, Object> automaticAccountLogin(UserAppTelphoneLoginBo bo) {
+        User user = baseMapper.getUserByAccount(bo.getUserAccount());
+
+        if(Validator.isEmpty(user)){
+            throw new CustomException("该账号不存在");
+        }
+        ClientLoginUser loginUser = new ClientLoginUser();
+        loginUser.setUser(user);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN,wxTokenService.createToken(loginUser));
+        map.put("user_account",user.getUserAccount());
+        map.put("full_info",Validator.isEmpty(user.getIdCard())?false:true); //是否完善身份信息
+        return map;
+    }
+
+    @Override
+    public UserLiveAccountLoginVo smsLiveUnifyLogin(UserLiveAccountLoginBo bo) {
+        if(bo.getTel()==null){
+            throw new CustomException("手机号不能为空");
+        }
+        String key = Constants.LOGIN_SMS + bo.getTel();
+        String code =  redisCache.getCacheObjectNoTenant(key);
+        if(code==null){
+            throw new CustomException("验证码错误");
+        }
+        if(!code.equals(bo.getCode())){
+            throw new CustomException("验证码错误");
+        }
+        redisCache.deleteObject(key);
+
+        if (bo.getType() != 1){
+            throw new CustomException("登录错误");
+        }
+
+        List<User> userList = baseMapper.getUserByTel(bo.getTel());
+        if (CollectionUtils.isEmpty(userList)){
+            throw new CustomException("请联系管理员!");
+        }
+        //参数解析
+        String param = new String(Base64.decode(bo.getParam()));
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数为空");
+        }
+
+        Map<String, String> split = Splitter.on("&").withKeyValueSeparator("=").split(param);
+        //商品ID
+        Long goodsId = Long.valueOf(split.get("gid"));
+        //观看权限
+        String per = split.get("watchPer");
+        //课程ID
+        String cid = split.get("cid");
+        //节ID
+        String sid = split.get("sid");
+        //获取对应商品
+        Goods goods = iGoodsService.getGoodsByIdNotTenant(goodsId);
+        User user = new User();
+        if (StringUtils.isNotBlank(per) && Integer.valueOf(per) == 2){
+            //所有人都可以看
+            user = userList.stream().filter(item -> {
+                Long tenantId = item.getTenantId();
+                Course course = iCourseService.getCourseByNotTenant(Long.valueOf(cid));
+                Long courseId = iCourseService.getCourseByTenantTwo(course.getCourseName(),course.getCode(),tenantId);
+                CourseSection section = iCourseSectionService.getSectionByNotTenant(Long.valueOf(sid));
+                CourseSection courseSection = iCourseSectionService.getSectionByTenantTwo(section.getName(),section.getCode(),tenantId);
+                Goods goodsTwo = iGoodsService.getGoodsByTenantTwo(goods.getGoodsName(),goods.getCode(),tenantId);
+                return ObjectUtils.isNotNull(courseId) && ObjectUtils.isNotNull(courseSection) && ObjectUtils.isNotNull(goodsTwo);
+            }).findFirst().orElse(null);
+
+        }else {
+            user = userList.stream().filter(item -> {
+                //判断用户是否购买商品
+                Long count = baseMapper.getUserOrderCount(item.getUserId(), item.getTenantId(), goods.getCode(), goods.getGoodsName());
+                return count > 0;
+            }).findFirst().orElse(null);
+        }
+
+        if(Validator.isEmpty(user)){
+            throw new CustomException("登录错误,请联系管理员!");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            throw new BaseException("对不起,您的账号:已停用");
+        }
+
+        Long tenantId = user.getTenantId();
+        //组装跳转路径
+        SysTenant tenant = iSysTenantService.getById(tenantId);
+        String post = "";
+        String path = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                post = tenant.getHostH5();
+                path = "pages/webview/index";
+                break;
+            case 2://PC
+                post = tenant.getHostPc();
+                path = "living-room";
+                break;
+        }
+        Course course = iCourseService.getCourseByNotTenant(Long.valueOf(cid));
+        Long courseId = iCourseService.getCourseByTenantTwo(course.getCourseName(),course.getCode(),tenantId);
+        CourseSection section = iCourseSectionService.getSectionByNotTenant(Long.valueOf(sid));
+        CourseSection courseSection = iCourseSectionService.getSectionByTenantTwo(section.getName(),section.getCode(),tenantId);
+        Goods goodsTwo = iGoodsService.getGoodsByTenantTwo(goods.getGoodsName(),goods.getCode(),tenantId);
+
+        String url = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                String format1 = String.format("cid=%s&gid=%s&sid=%s&a=1", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s1 = Base64.encode(format1);
+                url = String.format("%s/%s/%s?scene=%s",liveGotoURL, post,path, s1);
+                break;
+            case 2://Pc
+                String format = String.format("cid=%s&gid=%s&sid=%s", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s = Base64.encode(format);
+                url = String.format("%s/%s/%s/%s?a=1&%s",liveGotoURL, post,path,courseSection.getLiveUrl(), s);
+                break;
+            default:
+                break;
+        }
+
+        UserLiveAccountLoginVo vo = new UserLiveAccountLoginVo();
+        vo.setTel(user.getTelphone());
+        vo.setUser_account(user.getUserAccount());
+        vo.setUrl(url);
+        vo.setTenantId(tenantId);
+        return vo;
+    }
+
+    @Override
+    public UserLiveAccountLoginVo liveUnifyLoginRefresh(UserLiveAccountLoginBo bo) {
+        if(Validator.isEmpty(bo.getUser_account())){
+            throw new CustomException("账号不能为空");
+        }
+
+        User user = baseMapper.getUserByAccount(bo.getUser_account());
+        if(Validator.isEmpty(user)){
+            throw new CustomException("登录信息错误");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            throw new BaseException("对不起,您的账号:已停用");
+        }
+        //参数解析
+        String param = new String(Base64.decode(bo.getParam()));
+        if (StringUtils.isBlank(param)){
+            throw new CustomException("参数为空");
+        }
+
+        Map<String, String> split = Splitter.on("&").withKeyValueSeparator("=").split(param);
+        Long goodsId = Long.valueOf(split.get("gid"));
+
+        //获取对应商品
+        Goods goods = iGoodsService.getGoodsByIdNotTenant(goodsId);
+
+        Long tenantId = user.getTenantId();
+        //组装跳转路径
+        SysTenant tenant = iSysTenantService.getById(tenantId);
+        String post = "";
+        String path = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                post = tenant.getHostH5();
+                path = "pages/webview/index";
+                break;
+            case 2://PC
+                post = tenant.getHostPc();
+                path = "living-room";
+                break;
+        }
+
+        String cid = split.get("cid");
+        String sid = split.get("sid");
+        Course course = iCourseService.getCourseByNotTenant(Long.valueOf(cid));
+        Long courseId = iCourseService.getCourseByTenantTwo(course.getCourseName(),course.getCode(),tenantId);
+        CourseSection section = iCourseSectionService.getSectionByNotTenant(Long.valueOf(sid));
+        CourseSection courseSection = iCourseSectionService.getSectionByTenantTwo(section.getName(),section.getCode(),tenantId);
+        Goods goodsTwo = iGoodsService.getGoodsByTenantTwo(goods.getGoodsName(),goods.getCode(),tenantId);
+
+        String url = "";
+        switch (bo.getUrlType()){
+            case 1://H5
+                String format1 = String.format("cid=%s&gid=%s&sid=%s&a=1", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s1 = Base64.encode(format1);
+                url = String.format("%s/%s/%s?scene=%s",liveGotoURL, post,path, s1);
+                break;
+            case 2://Pc
+                String format = String.format("cid=%s&gid=%s&sid=%s", courseId, goodsTwo.getGoodsId(), courseSection.getSectionId());
+                String s = Base64.encode(format);
+                url = String.format("%s/%s/%s/%s?a=1&%s",liveGotoURL, post,path,courseSection.getLiveUrl(), s);
+                break;
+            default:
+                break;
+        }
+
+        UserLiveAccountLoginVo vo = new UserLiveAccountLoginVo();
+        vo.setTel(user.getTelphone());
+        vo.setUser_account(user.getUserAccount());
+        vo.setUrl(url);
+        vo.setTenantId(tenantId);
+        return vo;
+    }
+
+
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {
         if(Validator.isEmpty(bo.getAccount())){

+ 4 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -1277,6 +1277,10 @@ public class WxLoginService implements IWxLoginService {
             throw new CustomException("您尚未注册,请前往小程序注册");
         }
         if(Validator.isNotEmpty(loginBody.getGzhOpenid())){
+            DistributionSeller seller2 = iDistributionSellerService.getOne(new LambdaQueryWrapper<DistributionSeller>().ne(DistributionSeller::getSellerId,loginBody.getSellerId()).eq(DistributionSeller::getGzhOpenId,loginBody.getGzhOpenid()));
+            if (Validator.isNotEmpty(seller2)) {
+                throw new CustomException("该微信已绑定其他用户");
+            }
             seller.setGzhOpenId(loginBody.getGzhOpenid());
         }
         if(Validator.isNotEmpty(loginBody.getUnionId())){

+ 23 - 14
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxTokenService.java

@@ -5,18 +5,14 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
 import com.zhongzheng.common.constant.Constants;
-import com.zhongzheng.common.core.domain.model.LoginUser;
-import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
-import com.zhongzheng.common.utils.MessageUtils;
-import com.zhongzheng.framework.manager.AsyncManager;
-import com.zhongzheng.framework.manager.factory.AsyncFactory;
-import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ip.AddressUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
+import com.zhongzheng.modules.user.bo.UserLoginKeyAddBo;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserLoginKeyService;
 import com.zhongzheng.modules.user.service.IUserService;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
@@ -24,9 +20,6 @@ import io.jsonwebtoken.SignatureAlgorithm;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -67,6 +60,9 @@ public class WxTokenService
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IUserLoginKeyService iUserLoginKeyService;
+
     @Resource
     private AuthenticationManager authenticationManager;
 
@@ -75,8 +71,7 @@ public class WxTokenService
      *
      * @return 用户信息
      */
-    public ClientLoginUser getLoginUser(HttpServletRequest request)
-    {
+    public ClientLoginUser getLoginUser(HttpServletRequest request) {
         //测试用户
         String test_token = request.getHeader("X-Auth-Token");
         if("test".equals(test_token)){
@@ -89,6 +84,10 @@ public class WxTokenService
             Claims claims = parseToken(token);
             // 解析对应的权限以及用户信息
             String uuid = (String) claims.get(Constants.WX_LOGIN_USER_KEY);
+            if(!iUserLoginKeyService.queryByUserKey(uuid)){
+                ClientLoginUser errorUser =  new ClientLoginUser();
+                return errorUser;
+            }
             String userKey = getTokenKey(uuid);
             ClientLoginUser user = redisCache.getCacheObject(userKey);
             return user;
@@ -142,7 +141,17 @@ public class WxTokenService
         refreshToken(loginUser);
         Map<String, Object> claims = new HashMap<>();
         claims.put(Constants.WX_LOGIN_USER_KEY, token);
-        return createToken(claims);
+        String secret = createToken(claims);
+        if(Validator.isNotEmpty(token)){
+            UserLoginKeyAddBo addBo = new UserLoginKeyAddBo();
+            addBo.setUserId(loginUser.getUser().getUserId());
+            addBo.setUserKey(token);
+            addBo.setIp(loginUser.getIpaddr());
+            addBo.setBrowser(loginUser.getBrowser());
+            addBo.setSecret(secret);
+            iUserLoginKeyService.insertByAddBo(addBo);
+        }
+        return secret;
     }
 
     /**

+ 2 - 0
zhongzheng-generator/src/main/java/com/zhongzheng/generator/controller/FilterController.java

@@ -15,4 +15,6 @@ public class FilterController {
     public void loginAuthFail(HttpServletRequest request) {
         throw new AccessDeniedException("用户验证错误");
     }
+
+
 }

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

@@ -6,6 +6,7 @@ import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.vo.FileBean;
 import com.zhongzheng.modules.alioss.vo.ResultBean;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
+import com.zhongzheng.modules.grade.vo.WeekDataVo;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -30,7 +31,11 @@ public interface OssService {
 
     void zipPeopleDownload(ClassPeriodStudentExportVo vo, ZipOutputStream outStream);
 
+    void zipPeopleWeekDownload(ClassPeriodStudentExportVo vo, ZipOutputStream outStream, WeekDataVo weekDataVo);
+
     void zipCommonDownload(List<String> fileList, ZipOutputStream zipOut, String dir);
 
     void zipWisdomDownload(List<FileBean> list, ZipOutputStream outStream);
+
+    InputStream getStreamByObject(String filePath) throws Exception;
 }

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

@@ -18,6 +18,7 @@ import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alioss.vo.FileBean;
 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;
@@ -337,6 +338,7 @@ public class OssServiceImpl implements OssService {
         }
     }
 
+    @Override
     public InputStream getStreamByObject(String filePath) throws Exception {
             OSSObject ossObject = ossClient.getObject(ALIYUN_OSS_BUCKET_NAME, filePath);
             return ossObject.getObjectContent();
@@ -418,6 +420,25 @@ public class OssServiceImpl implements OssService {
         zipFile(listInfo, outStream,vo.getRealName()+"-"+vo.getIdCard()+"-"+vo.getGradeId()+"/"+"资料照片");  //
     }
 
+    @Override
+    public void zipPeopleWeekDownload(ClassPeriodStudentExportVo vo, ZipOutputStream outStream, WeekDataVo weekDataVo) {
+        //学时照片
+        List<String> list = iUserStudyRecordPhotoService.selectGradePhotoWeek(vo.getUserId(),vo.getGradeId(),weekDataVo.getSearchWeekStartTime(),weekDataVo.getSearchWeekEndTime());
+        zipFile(list, outStream,weekDataVo.getWeekCxt()+"/"+vo.getRealName()+"-"+vo.getIdCard()+"-"+vo.getGradeId()+"/"+"学习照片");  //
+        //个人资料
+        List<String> listInfo = new ArrayList<>();
+        if(Validator.isNotEmpty(vo.getOneInchPhotosOss())){
+            listInfo.add(vo.getOneInchPhotosOss());
+        }
+        if(Validator.isNotEmpty(vo.getIdCardImg1Oss())){
+            listInfo.add(vo.getIdCardImg1Oss());
+        }
+        if(Validator.isNotEmpty(vo.getIdCardImg2Oss())){
+            listInfo.add(vo.getIdCardImg2Oss());
+        }
+        zipFile(listInfo, outStream,weekDataVo.getWeekCxt()+"/"+vo.getRealName()+"-"+vo.getIdCard()+"-"+vo.getGradeId()+"/"+"资料照片");  //
+    }
+
     @Override
     public void zipCommonDownload(List<String> fileList, ZipOutputStream zipOut,String dir) {
         zipFile(fileList, zipOut,dir);

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/IAliSmsService.java

@@ -3,8 +3,6 @@ package com.zhongzheng.modules.alisms.service;
 
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 
-import javax.servlet.http.HttpServletRequest;
-
 public interface IAliSmsService {
     ResultBean sendSms(String tel,String param);
 
@@ -26,4 +24,6 @@ public interface IAliSmsService {
     Boolean sendSellerForgetSms(String tel);
 
     Boolean sendSellerLoginSms(String tel);
+
+    Boolean sendLiveSms(String tel);
 }

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

@@ -349,4 +349,36 @@ public class AliSmsServiceImpl implements IAliSmsService {
         }
         return false;
     }
+
+    @Override
+    public Boolean sendLiveSms(String tel) {
+        if(tel==null){
+            throw new CustomException("手机号码不能为空");
+        }
+        User user = iUserService.getUserByTelNotTenant(tel).stream().findFirst().orElse(null);
+        if(Validator.isEmpty(user)){
+            throw new CustomException("该手机号未注册");
+        }
+        ServletUtils.getResponse().setHeader("TenantId",user.getTenantId().toString());
+        String code = ToolsUtils.getSmsCode();
+        String key = Constants.LOGIN_SMS + tel;
+        redisCache.setCacheObjectTenant(key,code,5, TimeUnit.MINUTES);//5分钟
+        try{
+            Map<String,Object> param = new HashMap<>();
+            param.put("code",code);
+            SendSmsResponse response = SmsUtils.sendSms(tel,SIGNNAME,LOGINTEMPLATECODE, JSON.toJSONString(param),ACCESSKEYID,ACCESSKEYSECRET);
+            if(response.getBody().getMessage().equals("OK")){
+                SmsAddBo smsAddBo = new SmsAddBo();
+                smsAddBo.setCode(code);
+                smsAddBo.setTel(tel);
+                smsAddBo.setType(3L);
+                smsAddBo.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                iSmsService.insertByAddBo(smsAddBo);
+                return true;
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+        return false;
+    }
 }

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

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

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

@@ -1019,7 +1019,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
 
     private String dealTxt(String txt) {
         if(Validator.isEmpty(txt)){
-            return null;
+            return "";
         }
         txt = txt.trim();
         if (txt.startsWith("\\t")) {
@@ -1887,6 +1887,366 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return result;
     }
 
+    @Override
+    public Map<String, Object> importJJWordQuestionList(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("请选择文件");
+        }
+        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;  //题目类型
+                int aType = -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<>(); //判断列表
+                Map<String,QuestionAddBo> allQues = new LinkedHashMap<>();
+                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;
+                boolean answerStatus = false;
+                int cIndex = 1;
+                int nIndex = 2;
+                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("案例(十)");
+                String indexKey = null;
+                for (XWPFParagraph paragraph : paragraphList) {
+                    content = paragraph.getText();
+                    List<XWPFRun> runs = paragraph.getRuns();
+                    imgUrl = null;
+                //    System.out.println(content);
+                    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");
+                            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(type==5){
+                                //正文图片
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                cAddBo.setContent(cAddBo.getContent()+"<br />" +"<p><img src=\"" + ossHost + "/" + imgUrl + "\"></p>");
+                            }
+                        }
+                    }
+                    content = dealTxt(content);
+                //   System.out.println("新行开始"+content);
+                    if (content.startsWith("#")) { //导入结束
+                        break;
+                    }
+                    if(content.indexOf("单项选择题")>0&&!answerStatus){
+                        type = 1;
+                        continue;
+                    }
+                    if(content.indexOf("多项选择题")>0&&!answerStatus){
+                        type = 2;
+                        continue;
+                    }
+                    if(content.indexOf("案例分析题")>0&&!answerStatus){
+                        type = 5;
+                        continue;
+                    }
+                    //单选,多选
+                    if((type==1||type==2)&&!answerStatus){
+                        if(content.startsWith(cIndex+".")||content.startsWith(nIndex+".")){
+                            if(content.startsWith(nIndex+".")){
+                                indexKey =nIndex+".";
+                                //上一道结束
+                                cIndex++;
+                                nIndex++;
+                            }else{
+                                indexKey =cIndex+".";
+                            }
+                            QuestionAddBo addBo = new QuestionAddBo();
+                            qContent = content.replace(indexKey, "");
+                            addBo.setContent(qContent);
+                            addBo.setType(type);
+                            addBo.setOptionsList(new ArrayList<>());
+                            allQues.put(indexKey,addBo);
+                        }
+                        //第一个选项
+                        if(content.startsWith("A.")) {
+                            String[] strArr = content.split("\t");
+                            if(strArr.length==2){ //AB一起
+                                String str1 = strArr[0];
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(1L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(str1.replace("A.", ""));
+                                cAddBo.getOptionsList().add(bo1);
+
+                                String str2 = strArr[1];
+                                QuestionChildAddBo bo2;
+                                bo2 = new QuestionChildAddBo();
+                                bo2.setOptionsId(2L);
+                                bo2.setImgUrl(imgUrl);
+                                bo2.setContent(str2.replace("B.", ""));
+                                QuestionAddBo cAddBo2 = allQues.get(indexKey);
+                                cAddBo2.getOptionsList().add(bo2);
+                            }else{
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(1L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(content.replace("A.", ""));
+                                cAddBo.getOptionsList().add(bo1);
+                            }
+
+                        }
+                        //第二个选项
+                        if (content.startsWith("B.")) {
+                            QuestionChildAddBo bo1;
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(2L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(content.replace("B.", ""));
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.getOptionsList().add(bo1);
+                        }
+                        //第三个选项
+                        if (content.startsWith("C.")) {
+                            String[] strArr = content.split("\t");
+                            if(strArr.length==2){
+                                String str1 = strArr[0];
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(3L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(str1.replace("C.", ""));
+                                cAddBo.getOptionsList().add(bo1);
+
+                                String str2 = strArr[1];
+                                QuestionChildAddBo bo2;
+                                bo2 = new QuestionChildAddBo();
+                                bo2.setOptionsId(4L);
+                                bo2.setImgUrl(imgUrl);
+                                bo2.setContent(str2.replace("D.", ""));
+                                QuestionAddBo cAddBo2 = allQues.get(indexKey);
+                                cAddBo2.getOptionsList().add(bo2);
+                            }else{
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(3L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(content.replace("C.", ""));
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                cAddBo.getOptionsList().add(bo1);
+                            }
+
+                        }
+                        //第四个选项
+                        if (content.startsWith("D.")) {
+                            QuestionChildAddBo bo1;
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(4L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(content.replace("D.", ""));
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.getOptionsList().add(bo1);
+                        }
+                        //第五个选项
+                        if (content.startsWith("E.")) {
+                            String[] strArr = content.split("\t");
+                            if(strArr.length==2){
+                                String str1 = strArr[0];
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(5L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(str1.replace("E.", ""));
+                                cAddBo.getOptionsList().add(bo1);
+
+                                String str2 = strArr[1];
+                                QuestionChildAddBo bo2;
+                                bo2 = new QuestionChildAddBo();
+                                bo2.setOptionsId(6L);
+                                bo2.setImgUrl(imgUrl);
+                                bo2.setContent(str2.replace("F.", ""));
+                                QuestionAddBo cAddBo2 = allQues.get(indexKey);
+                                cAddBo2.getOptionsList().add(bo2);
+                            }else{
+                                QuestionChildAddBo bo1;
+                                bo1 = new QuestionChildAddBo();
+                                bo1.setOptionsId(5L);
+                                bo1.setImgUrl(imgUrl);
+                                bo1.setContent(content.replace("E.", ""));
+                                QuestionAddBo cAddBo = allQues.get(indexKey);
+                                cAddBo.getOptionsList().add(bo1);
+                            }
+
+                        }
+                        //第六个选项
+                        if (content.startsWith("F.")) {
+                            QuestionChildAddBo bo1;
+                            bo1 = new QuestionChildAddBo();
+                            bo1.setOptionsId(6L);
+                            bo1.setImgUrl(imgUrl);
+                            bo1.setContent(content.replace("F.", ""));
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.getOptionsList().add(bo1);
+                        }
+                    }
+
+                    //问答
+                    if(type==5&&!answerStatus){
+                        if(alKeyList.contains(content)){
+                            indexKey = content;
+                            QuestionAddBo addBo = new QuestionAddBo();
+                            addBo.setType(type);
+                            addBo.setContent("");
+                            allQues.put(indexKey,addBo);
+                        }else{
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.setContent(cAddBo.getContent()+ content+"<br />");
+                        }
+                    }
+                    if(content.startsWith("参考答案及解析")){
+                        answerStatus = true;
+                        type = -1;
+                    }
+                    if(content.indexOf("单项选择题")>0&&answerStatus){
+                        aType = 1;
+                        continue;
+                    }
+                    if(content.indexOf("多项选择题")>0&&answerStatus){
+                        aType = 2;
+                        continue;
+                    }
+                    if(content.indexOf("案例分析题")>0&&answerStatus){
+                        aType = 5;
+                        continue;
+                    }
+                    if(aType>0){
+                        String[] strArr = content.split("\\.");
+                        if(aType==1&&strArr.length==2){
+                            System.out.println(strArr);
+                            indexKey = strArr[0]+".";
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            answerQuestion = dealImportAnswer(strArr[1]);
+                            cAddBo.setAnswerQuestion(answerQuestion);
+                            cAddBo.setAnalysisContent("");
+                        }
+                        else if(aType==1){
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.setAnalysisContent(cAddBo.getAnalysisContent()+content+"<br />");
+                        }
+                        if(aType==2&&strArr.length==2){
+                            indexKey = strArr[0]+".";
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            answerQuestion = dealImportAnswer(strArr[1]);
+                            cAddBo.setAnswerQuestion(answerQuestion);
+                            cAddBo.setAnalysisContent("");
+                        }
+                        else if(aType==2){
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.setAnalysisContent(cAddBo.getAnalysisContent()+content+"<br />");
+                        }
+                        if(aType==5&&alKeyList.contains(content)){
+                            indexKey = content;
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.setAnalysisContent("");
+                        }
+                        else if(aType==5){
+                            QuestionAddBo cAddBo = allQues.get(indexKey);
+                            cAddBo.setAnalysisContent(cAddBo.getAnalysisContent()+content+"<br />");
+                        }
+
+                    }
+
+                }
+                //遍历正文
+                int importSort = 1;
+                for (String key : allQues.keySet()) {
+                    QuestionAddBo addBo = allQues.get(key);
+                    list.add(addBo);
+                    importSort++;
+                }
+
+
+            } else {
+                throw new CustomException("请导入word文件!");
+            }
+        } catch (IOException e) {
+            System.out.println("此文件不是word文件!" + e.getMessage() + e.toString() + e.getLocalizedMessage());
+        }
+        result.put("list",list);
+        result.put("errorLog",errorLog);
+        return result;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean batchDelQuestion(QuestionBatchDelBo bo) {

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

@@ -493,13 +493,13 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         String keyValue = bo.getKeyValue();
         if (Validator.isNotEmpty(keyValue)) {
             Map<String, String> maps = JSONObject.parseObject(keyValue, Map.class);
-            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post;
+            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post,telphone;
             LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
+            UserVo user = iUserService.queryById(bo.getUserId());
             if (maps.containsKey("idcard")) {
                 idcard = JSONObject.parseObject(String.valueOf(maps.get("idcard")), UserProfileFit.class).getValue();
                 if(Validator.isNotEmpty(idcard)){
-                    UserVo user = iUserService.queryById(bo.getUserId());
                     if(Validator.isNotEmpty(user)&&Validator.isEmpty(user.getIdCard())){ //身份证为空是覆盖
                         User user2 = iUserService.getOne(new LambdaQueryWrapper<User>()
                                 .eq(User::getIdCard, EncryptHandler.encrypt(idcard)).last("limit 1"));
@@ -507,15 +507,31 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
                             throw new CustomException("身份证号码已存在,创建失败");
                         }
                         objectLambdaUpdateWrapper.set(User::getIdCard, idcard);
-                        if (maps.containsKey("name")) {
-                            name = JSONObject.parseObject(String.valueOf(maps.get("name")), UserProfileFit.class).getValue();
-                            if(Validator.isNotEmpty(name)){
-                                objectLambdaUpdateWrapper.set(User::getRealname, name);
-                            }
+                    }
+                }
+            }
+            if (maps.containsKey("telphone")) {
+                telphone = JSONObject.parseObject(String.valueOf(maps.get("telphone")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(telphone)){
+                    if(Validator.isNotEmpty(user)&&Validator.isEmpty(user.getTelphone())){ //手机号码为空是覆盖
+                        User user2 = iUserService.getOne(new LambdaQueryWrapper<User>()
+                                .eq(User::getTelphone, EncryptHandler.encrypt(telphone)).last("limit 1"));
+                        if(Validator.isNotEmpty(user2)){
+                            throw new CustomException("手机号码已存在,创建失败");
                         }
+                        objectLambdaUpdateWrapper.set(User::getTelphone, telphone);
                     }
                 }
             }
+            if (maps.containsKey("name")) {
+                name = JSONObject.parseObject(String.valueOf(maps.get("name")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(name)){
+                    if(Validator.isNotEmpty(user)&&Validator.isEmpty(user.getRealname())) { //姓名为空是覆盖
+                        objectLambdaUpdateWrapper.set(User::getRealname, name);
+                    }
+
+                }
+            }
             if (maps.containsKey("recent_photos")) {
                 recent_photos = JSONObject.parseObject(String.valueOf(maps.get("recent_photos")), UserProfileFit.class).getValue();
                 if(Validator.isNotEmpty(recent_photos)){

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

@@ -60,7 +60,7 @@ public class CourseBusinessQueryBo extends BaseEntity {
 
 	/** 教育类型id */
 	@ApiModelProperty("教育类型id")
-	private Integer educationId;
+	private Long educationId;
 
 	@Excel(name = "模板选用")
 	@ApiModelProperty("模板选用")

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

@@ -114,4 +114,7 @@ public class CourseQueryBo extends BaseEntity {
 
 	@ApiModelProperty("手机号码")
 	private List<CourseProgressQueryBo> telphoneList;
+
+	@ApiModelProperty("1未开始 2未完成 3已完成")
+	private Integer studyStatus;
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseBusinessMapper.java

@@ -5,9 +5,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.vo.CourseBusinessVo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseBusinessQueryBo;
+import com.zhongzheng.modules.top.goods.vo.TopCourseBusinessVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
+import java.util.List;
 
 /**
  * 业务层次Mapper接口
@@ -28,4 +31,6 @@ public interface CourseBusinessMapper extends BaseMapper<CourseBusiness> {
     CourseBusiness getBusinessByIdTenant(@Param("businessId") Long businessId,@Param("tenantId") Long tenantId);
 
     CourseBusinessVo queryFullId(CourseBusinessQueryBo bo);
+
+    List<CourseBusinessVo> queryAllList(CourseBusinessQueryBo bo);
 }

+ 8 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseMapper.java

@@ -3,8 +3,6 @@ package com.zhongzheng.modules.course.mapper;
 
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.zhongzheng.common.core.domain.entity.SysRole;
-import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.domain.Course;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
@@ -18,7 +16,6 @@ import com.zhongzheng.modules.user.bo.UserPlanQueryBo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 课程Mapper接口
@@ -39,6 +36,8 @@ public interface CourseMapper extends BaseMapper<Course> {
 
     List<GoodsUserVo> goodsList(CourseQueryBo bo);
 
+    List<GoodsUserVo> goodsHandoutsList(CourseQueryBo bo);
+
     List<CourseUserVo> courseList(CourseQueryBo bo);
 
     CourseUserVo getCourseUserVoInfo(Long id);
@@ -59,4 +58,10 @@ public interface CourseMapper extends BaseMapper<Course> {
 
     @InterceptorIgnore(tenantLine = "true")
     Course getCourseByTenant(@Param("code") String code,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Course getCourseByNotTenant(@Param("cid") Long cid);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getCourseByTenantTwo(@Param("courseName") String courseName,@Param("code") String code,@Param("tenantId") Long tenantId);
 }

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

@@ -22,4 +22,8 @@ public interface CourseMenuExamMapper extends BaseMapper<CourseMenuExam> {
 
     @InterceptorIgnore(tenantLine = "true")
     void deleteByIdTenant(@Param("newCourseId") Long newCourseId,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void deleteModuleByIdTenant(@Param("newCourseId")Long newCourseId,@Param("newModuleId") Long newModuleId,@Param("newTenantId") Long newTenantId);
+
 }

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

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

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

@@ -19,7 +19,7 @@ import java.util.List;
  * @date 2021-10-11
  */
 public interface CourseModuleChapterMapper extends BaseMapper<CourseModuleChapter> {
-    List<CourseModuleChapterVo> getListById(Long id);
+    List<CourseModuleChapterVo> getListById(@Param("id") Long id,@Param("tenantId") Long tenantId);
 
     List<CourseUserModuleChapterVo> chapterList(CourseMenuQueryBo bo);
 

+ 6 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSectionMapper.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
 import com.zhongzheng.modules.course.domain.CourseSection;
-import com.zhongzheng.modules.course.domain.CourseStreamingBusiness;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -30,4 +28,10 @@ public interface CourseSectionMapper extends BaseMapper<CourseSection> {
 
     @InterceptorIgnore(tenantLine = "true")
     CourseSection getSectionByTenant(@Param("code") String code,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseSection getSectionByNotTenant(@Param("sid") Long sid);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseSection getSectionByTenantTwo(@Param("name") String name,@Param("code") String code,@Param("tenantId") Long tenantId);
 }

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

@@ -6,7 +6,9 @@ import com.zhongzheng.modules.course.bo.CourseBusinessEditBo;
 import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.vo.CourseBusinessVo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseBusinessQueryBo;
 import com.zhongzheng.modules.top.goods.domain.TopCourseBusiness;
+import com.zhongzheng.modules.top.goods.vo.TopCourseBusinessVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -68,4 +70,6 @@ public interface ICourseBusinessService extends IService<CourseBusiness> {
 	CourseBusiness getBusinessByIdTenant(Long businessId, Long tenantId);
 
 	CourseBusinessVo queryFullId(CourseBusinessQueryBo bo);
+
+	List<CourseBusinessVo> queryAllList(CourseBusinessQueryBo bo);
 }

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

@@ -7,6 +7,8 @@ import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeAddBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeEditBo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.goods.bo.TopCourseEducationTypeQueryBo;
+import com.zhongzheng.modules.top.goods.vo.TopCourseEducationTypeVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -33,6 +35,8 @@ public interface ICourseEducationTypeService extends IService<CourseEducationTyp
 	 */
 	List<CourseEducationTypeVo> queryList(CourseEducationTypeQueryBo bo);
 
+	List<CourseEducationTypeVo> queryAllList(CourseEducationTypeQueryBo bo);
+
 	/**
 	 * 根据新增业务对象插入教育类型
 	 * @param bo 教育类型新增业务对象

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

@@ -24,6 +24,8 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 	 */
 	CourseHandoutsVo queryById(CourseHandoutsFileQueryBo queryBo);
 
+	CourseHandoutsVo queryByIdNoUrl(CourseHandoutsFileQueryBo queryBo);
+
 	/**
 	 * 查询列表
 	 */

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

@@ -53,4 +53,6 @@ public interface ICourseMenuExamService extends IService<CourseMenuExam> {
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     void deleteByIdTenant(Long newCourseId, Long newTenantId);
+
+    void deleteModuleByIdTenant(Long newCourseId, Long newModuleId, Long newTenantId);
 }

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

@@ -66,4 +66,6 @@ public interface ICourseMenuService extends IService<CourseMenu> {
 	List<CourseUserMenuVo> getGoodsRebuildMenuList(CourseMenuQueryBo bo);
 
     void deleteByIdTenant(Long newCourseId, Long newTenantId);
+
+    List<CourseMenu> selectByNotTenant(Long newCourseId, Integer type, Long newModuleId,Long newTenantId);
 }

+ 5 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSectionService.java

@@ -2,7 +2,6 @@ package com.zhongzheng.modules.course.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
 import com.zhongzheng.modules.course.bo.CourseSectionAddBo;
 import com.zhongzheng.modules.course.bo.CourseSectionBusinessAddBo;
 import com.zhongzheng.modules.course.bo.CourseSectionEditBo;
@@ -13,7 +12,6 @@ import com.zhongzheng.modules.course.vo.CourseSectionImport;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
 import com.zhongzheng.modules.goods.bo.GoodsBatchDelBo;
 import net.polyv.live.v1.entity.chat.LiveGetMessageListResponse;
-import org.apache.ibatis.annotations.Param;
 
 import java.io.IOException;
 import java.security.NoSuchAlgorithmException;
@@ -79,4 +77,9 @@ public interface ICourseSectionService extends IService<CourseSection> {
     boolean batchDelSection(GoodsBatchDelBo bo);
 
     CourseSection getSectionByTenant(String code, Long newTenantId);
+
+    CourseSection getSectionByNotTenant(Long sid);
+
+	CourseSection getSectionByTenantTwo(String name, String code, Long tenantId);
+
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java

@@ -74,6 +74,8 @@ public interface ICourseService extends IService<Course> {
 
     List<GoodsUserVo> goodsList(CourseQueryBo bo);
 
+	List<GoodsUserVo> goodsHandoutsList(CourseQueryBo bo);
+
 	List<CourseUserVo> courseList(CourseQueryBo bo);
 
 	CourseUserVo getCourseUserVoInfo(Long courseId);
@@ -89,4 +91,11 @@ public interface ICourseService extends IService<Course> {
     Course getCourseByTenant(String code, Long newTenantId);
 
 	Boolean checkTime();
+
+    Course getCourseByNotTenant(Long cid);
+
+	Long getCourseByTenantTwo(String courseName, String code, Long tenantId);
+
+	Long getLiveTime();
+
 }

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

@@ -54,7 +54,16 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
         if (Validator.isEmpty(courseBusinessVos)||courseBusinessVos.size()<1){
             throw new IllegalArgumentException("请输入正确业务ID");
         }
-        return BeanUtil.toBean(courseBusinessVos.get(0), CourseBusinessVo.class);
+        CourseBusinessVo vo = courseBusinessVos.get(0);
+        CourseBusinessQueryBo queryBo = new CourseBusinessQueryBo();
+        queryBo.setId(id);
+        String fullName = queryFullName(queryBo);
+        if(Validator.isNotEmpty(fullName)){
+            if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")||fullName.equals("考前培训七大员施工现场专业人员")){
+                vo.setGoodsLearningOrder(2);
+            }
+        }
+        return BeanUtil.toBean(vo, CourseBusinessVo.class);
     }
 
     @Override
@@ -178,7 +187,8 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
     @Override
     public boolean editLearningOrder(CourseBusinessEditBo bo) {
         for (Long businessId : bo.getBusinessIds()) {
-            CourseBusinessVo oldBusiness = this.queryById(businessId);
+            CourseBusiness oldBusiness = getOne(new LambdaQueryWrapper<CourseBusiness>()
+                    .eq(CourseBusiness::getId, businessId));
             if(oldBusiness.getGoodsLearningOrder()!=0){
                 throw new CustomException("无法修改学习顺序");
             }
@@ -243,4 +253,9 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
         return baseMapper.queryFullId(bo);
     }
 
+    @Override
+    public List<CourseBusinessVo> queryAllList(CourseBusinessQueryBo bo) {
+        return baseMapper.queryAllList(bo);
+    }
+
 }

+ 31 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseEducationTypeServiceImpl.java

@@ -12,17 +12,20 @@ import com.github.pagehelper.Page;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.base.vo.BaseFilterVo;
-import com.zhongzheng.modules.course.bo.CourseEducationTierAddBo;
-import com.zhongzheng.modules.course.bo.CourseEducationTypeAddBo;
-import com.zhongzheng.modules.course.bo.CourseEducationTypeEditBo;
-import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseEducationTier;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.mapper.CourseEducationTypeMapper;
+import com.zhongzheng.modules.course.service.ICourseBusinessService;
 import com.zhongzheng.modules.course.service.ICourseEducationTierService;
 import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
+import com.zhongzheng.modules.course.vo.CourseBusinessVo;
 import com.zhongzheng.modules.course.vo.CourseEducationTierVo;
 import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseBusinessQueryBo;
+import com.zhongzheng.modules.top.goods.domain.TopCourseEducationType;
+import com.zhongzheng.modules.top.goods.vo.TopCourseBusinessVo;
+import com.zhongzheng.modules.top.goods.vo.TopCourseEducationTypeVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -44,6 +47,9 @@ public class CourseEducationTypeServiceImpl extends ServiceImpl<CourseEducationT
     @Autowired
     private ICourseEducationTierService courseEducationTierService;
 
+    @Autowired
+    private ICourseBusinessService iCourseBusinessService;
+
     @Override
     public CourseEducationTypeVo queryById(Long id){
         CourseEducationType db = this.baseMapper.selectById(id);
@@ -77,6 +83,27 @@ public class CourseEducationTypeServiceImpl extends ServiceImpl<CourseEducationT
         return entity2Vo(this.list(lqw));
     }
 
+    @Override
+    public List<CourseEducationTypeVo> queryAllList(CourseEducationTypeQueryBo bo) {
+        LambdaQueryWrapper<CourseEducationType> lqw = Wrappers.lambdaQuery();
+        lqw.like(StrUtil.isNotBlank(bo.getEducationName()), CourseEducationType::getEducationName, bo.getEducationName());
+        lqw.eq(StrUtil.isNotBlank(bo.getEncoder()), CourseEducationType::getEncoder, bo.getEncoder());
+        lqw.eq(bo.getStatus() != null, CourseEducationType::getStatus, bo.getStatus());
+        lqw.in(CourseEducationType::getStatus, 1);
+        lqw.eq(bo.getSort() != null, CourseEducationType::getSort, bo.getSort());
+        List<CourseEducationTypeVo> courseEducationTypeVos = entity2Vo(this.list(lqw));
+        if (CollectionUtils.isEmpty(courseEducationTypeVos)){
+            return new ArrayList<>();
+        }
+        courseEducationTypeVos.forEach(item -> {
+            CourseBusinessQueryBo queryBo = new CourseBusinessQueryBo();
+            queryBo.setEducationId(item.getId());
+            List<CourseBusinessVo> businessVoList = iCourseBusinessService.queryAllList(queryBo);
+            item.setBusinessList(businessVoList);
+        });
+        return courseEducationTypeVos;
+    }
+
     /**
     * 实体类转化成视图对象
     *

+ 53 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java

@@ -79,7 +79,7 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
                 String path = file.getUrlName();
                 file.setFilePath(getFilePath(file, path));
                 if (file.getType() == 2) {
-                    handleCourseFile(file);
+                    handleCourseFile(file,true);
                 }
             });
             courseHandoutsVo.setFileList(courseFileVos);
@@ -87,7 +87,48 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
             List<CourseFileVo> fileVos = courseFileVos.stream().filter(item -> item.getParentId() == 0L).collect(Collectors.toList());
             if (!CollectionUtils.isEmpty(fileVos)) {
                 fileVos.forEach(file -> {
-                    assembleFile(file, courseFileVos);
+                    assembleFile(file, courseFileVos,true);
+                });
+                courseHandoutsVo.setFileList(fileVos);
+            }
+        }
+        return courseHandoutsVo;
+    }
+
+    @Override
+    public CourseHandoutsVo queryByIdNoUrl(CourseHandoutsFileQueryBo queryBo) {
+        CourseHandouts db = this.baseMapper.selectById(queryBo.getHandoutsId());
+        if (Validator.isEmpty(db)) {
+            throw new CustomException("查无数据");
+        }
+        //获得讲义业务层
+        CourseHandoutsVo courseHandoutsVo = BeanUtil.toBean(db, CourseHandoutsVo.class);
+        List<CourseHandoutsBusinessVo> courseHandoutsBusinessVos = baseMapper.selectEntity(courseHandoutsVo.getHandoutsId());
+        courseHandoutsVo.setCourseHandoutsBusinessVo(courseHandoutsBusinessVos);
+
+        CourseFileQueryBo bo = new CourseFileQueryBo();
+        bo.setHandoutsId(courseHandoutsVo.getHandoutsId());
+        bo.setUrlName(queryBo.getFileName());
+        List<CourseFileVo> courseFileVos = iCourseFileService.queryList(bo);
+        if (CollectionUtils.isEmpty(courseFileVos)) {
+            courseHandoutsVo.setFileList(new ArrayList<>());
+            return courseHandoutsVo;
+        }
+        if (StringUtils.isNotBlank(queryBo.getFileName())) {
+            courseFileVos.forEach(file -> {
+                //获取路径
+                String path = file.getUrlName();
+                file.setFilePath(getFilePath(file, path));
+                if (file.getType() == 2) {
+                    handleCourseFile(file,false);
+                }
+            });
+            courseHandoutsVo.setFileList(courseFileVos);
+        } else {
+            List<CourseFileVo> fileVos = courseFileVos.stream().filter(item -> item.getParentId() == 0L).collect(Collectors.toList());
+            if (!CollectionUtils.isEmpty(fileVos)) {
+                fileVos.forEach(file -> {
+                    assembleFile(file, courseFileVos,false);
                 });
                 courseHandoutsVo.setFileList(fileVos);
             }
@@ -104,7 +145,10 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         return getFilePath(BeanUtil.toBean(courseFile, CourseFileVo.class), urlName);
     }
 
-    private void handleCourseFile(CourseFileVo file) {
+    private void handleCourseFile(CourseFileVo file,Boolean withUrl) {
+        if(!withUrl){
+            file.setUrl(null);
+        }
         List<CourseFile> list = iCourseFileService
                 .list(new LambdaQueryWrapper<CourseFile>()
                         .eq(CourseFile::getParentId, file.getFileId())
@@ -113,12 +157,15 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
             return;
         }
         list.forEach(item -> {
-            handleCourseFile(BeanUtil.toBean(item, CourseFileVo.class));
+            handleCourseFile(BeanUtil.toBean(item, CourseFileVo.class),withUrl);
         });
         file.setChildren(list.stream().map(x -> BeanUtil.toBean(x, CourseFileVo.class)).collect(Collectors.toList()));
     }
 
-    private void assembleFile(CourseFileVo parent, List<CourseFileVo> childs) {
+    private void assembleFile(CourseFileVo parent, List<CourseFileVo> childs,Boolean withUrl) {
+        if(!withUrl){
+            parent.setUrl(null);
+        }
         if (CollectionUtils.isEmpty(childs)) {
             return;
         }
@@ -128,7 +175,7 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         }
         parent.setChildren(collect);
         collect.forEach(item -> {
-            assembleFile(item, childs);
+            assembleFile(item, childs,withUrl);
         });
     }
 

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

@@ -114,4 +114,9 @@ public class CourseMenuExamServiceImpl extends ServiceImpl<CourseMenuExamMapper,
     public void deleteByIdTenant(Long newCourseId, Long newTenantId) {
         baseMapper.deleteByIdTenant(newCourseId, newTenantId);
     }
+
+    @Override
+    public void deleteModuleByIdTenant(Long newCourseId, Long newModuleId, Long newTenantId) {
+        baseMapper.deleteModuleByIdTenant(newCourseId,newModuleId, newTenantId);
+    }
 }

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

@@ -332,4 +332,9 @@ public class CourseMenuServiceImpl extends ServiceImpl<CourseMenuMapper, CourseM
     public void deleteByIdTenant(Long newCourseId, Long newTenantId) {
         baseMapper.deleteByIdTenant(newCourseId, newTenantId);
     }
+
+    @Override
+    public List<CourseMenu> selectByNotTenant(Long newCourseId, Integer type, Long newModuleId,Long newTenantId) {
+        return baseMapper.selectByNotTenant(newCourseId, type, newModuleId,newTenantId);
+    }
 }

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

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.bo.CourseModuleChapterAddBo;
 import com.zhongzheng.modules.course.bo.CourseModuleChapterEditBo;
@@ -45,7 +46,8 @@ public class CourseModuleChapterServiceImpl extends ServiceImpl<CourseModuleChap
 
     @Override
     public List<CourseModuleChapterVo> getListById(Long id) {
-        return courseModuleChapterMapper.getListById(id);
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        return courseModuleChapterMapper.getListById(id, Long.valueOf(tenantId));
     }
 
 

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

@@ -659,6 +659,16 @@ public class CourseSectionServiceImpl extends ServiceImpl<CourseSectionMapper, C
         return baseMapper.getSectionByTenant(code, newTenantId);
     }
 
+    @Override
+    public CourseSection getSectionByNotTenant(Long sid) {
+        return baseMapper.getSectionByNotTenant(sid);
+    }
+
+    @Override
+    public CourseSection getSectionByTenantTwo(String name, String code, Long tenantId) {
+        return baseMapper.getSectionByTenantTwo(name, code, tenantId);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public String insertByAddBoImport(CourseSectionAddBo bo, String errorLog, Integer no) {
         CourseSection add = BeanUtil.toBean(bo, CourseSection.class);

+ 22 - 32
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java

@@ -2,13 +2,11 @@ package com.zhongzheng.modules.course.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.codec.Base64;
-
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.course.bo.CheckSectionWatchVo;
 import com.zhongzheng.modules.course.bo.SectionWatchPerAddBo;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
@@ -51,40 +49,23 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
     @Value("${liveGotoURL}")
     private String liveGotoURL;
 
+    @Value("${liveHost}")
+    private String liveHost;
+
     @Override
     public CourseSectionWatchPerVo getSectionWatchPer(SectionWatchPerBo bo) {
         CourseSectionWatchPerVo vo = new CourseSectionWatchPerVo();
-        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
-        //获取课程节信息
-        CourseSection section = courseSectionService.getById(bo.getSectionId());
-//        String url = "";
-        String live = "living-room/";
-        vo.setEnCode(wxLoginService.getLiveEnCode(bo));
-        String format = String.format("cid=%s&gid=%s&sid=%s", bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
-
-        String s = Base64.encode(format);
+//        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+//        //获取课程节信息
+//        CourseSection section = courseSectionService.getById(bo.getSectionId());
+//        String live = "living-room/";
+//        vo.setEnCode(wxLoginService.getLiveEnCode(bo));
+//        String format = String.format("cid=%s&gid=%s&sid=%s", bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
+//        String s = Base64.encode(format);
+//        String domainPc =  iSysTenantService.getById(tenantId).getHostPc();
+//        String url = String.format("%s%s/%s%s?a=1&%s",liveGotoURL, domainPc,live,section.getLiveUrl(), s);
+//        vo.setEnCodePC(url);
 
-//        String s = DigestUtils.md5Hex(format);
-//        String url = String.format("%s%s%s?a=1&cid=%s&gid=%s&sid=%s", liveGotoURL,live,section.getLiveUrl(), bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
-        // https://web.xyyxt.net/
-        String domainPc =  iSysTenantService.getById(tenantId).getHostPc();
-        String url = String.format("%s%s/%s%s?a=1&%s",liveGotoURL, domainPc,live,section.getLiveUrl(), s);
-//        //生成微信小程序码
-//        switch (bo.getSectionType()){
-//            case 2://直播 living-room/
-//                String live = "living-room/";
-//                vo.setEnCode(wxLoginService.getLiveEnCode(bo));
-//                url = String.format("%s%s%s?a=1&cid=%s&gid=%s&sid=%s", liveGotoURL,live,section.getLiveUrl(), bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
-//                break;
-//            case 3://回放 my-live-detail/
-//                String detail = "my-live-detail/";
-//                vo.setEnCode(wxLoginService.getBackEnCode(bo));
-//                url = String.format("%s%s%s?a=1&cid=%s&gid=%s&sid=%s", liveGotoURL,detail,bo.getGoodsId(), bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
-//                break;
-//            default:
-//                throw new CustomException("课程节类型不正确,请检查");
-//        }
-        vo.setEnCodePC(url);
         CourseSectionWatchPer watchPer = getOne(new LambdaQueryWrapper<CourseSectionWatchPer>()
                 .eq(ObjectUtils.isNotNull(bo.getCourseId()), CourseSectionWatchPer::getCourseId, bo.getCourseId())
                 .eq(ObjectUtils.isNotNull(bo.getChapterId()), CourseSectionWatchPer::getChapterId, bo.getChapterId())
@@ -93,6 +74,15 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
                 .eq(ObjectUtils.isNotNull(bo.getGoodsId()), CourseSectionWatchPer::getGoodsId, bo.getGoodsId())
                 .eq(CourseSectionWatchPer::getStatus, 1)
                 .last("LIMIT 1"));
+
+        String format = String.format("cid=%s&gid=%s&sid=%s", bo.getCourseId(), bo.getGoodsId(), bo.getSectionId());
+        if (ObjectUtils.isNotNull(watchPer)){
+            format = format + "&watchPer="+watchPer.getWatchPer();
+        }
+        String s = Base64.encode(format);
+        String url = String.format("%s?param=%s",liveHost,s);
+        vo.setEnCodePC(url);
+        vo.setEnCode(url);
         if (ObjectUtils.isNull(watchPer)){
             return vo;
         }

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

@@ -3,11 +3,11 @@ package com.zhongzheng.modules.course.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
-
-
+import com.alibaba.fastjson.JSONArray;
 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.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
@@ -24,13 +24,9 @@ import com.zhongzheng.modules.course.service.ICoursePhotoLogService;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
 import com.zhongzheng.modules.course.vo.CourseVo;
-import com.zhongzheng.modules.exam.domain.ExamApplyUser;
-import com.zhongzheng.modules.exam.domain.ExamBefore;
-import com.zhongzheng.modules.exam.domain.ExamBeforeApply;
-import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
-import com.zhongzheng.modules.exam.service.IExamApplyUserService;
-import com.zhongzheng.modules.exam.service.IExamBeforeApplyService;
-import com.zhongzheng.modules.exam.service.IExamBeforeService;
+import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeTwoAddBo;
+import com.zhongzheng.modules.exam.domain.*;
+import com.zhongzheng.modules.exam.service.*;
 import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
 import com.zhongzheng.modules.goods.bo.GoodsBatchDelBo;
 import com.zhongzheng.modules.goods.domain.GoodsCourse;
@@ -67,6 +63,7 @@ import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -110,9 +107,15 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     @Autowired
     private IExamApplyGoodsService iExamApplyGoodsService;
 
+    @Autowired
+    private IExamApplyService iExamApplyService;
+
     @Autowired
     private IExamApplyUserService iExamApplyUserService;
 
+    @Autowired
+    private IExamApplySiteTimeService iExamApplySiteTimeService;
+
     @Autowired
     private IExamBeforeApplyService iExamBeforeApplyService;
 
@@ -450,6 +453,14 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             if(Validator.isEmpty(classGradeVo)){
                 continue;
             }
+            String fullName = goodsUserVo.getEducationName()+goodsUserVo.getBusinessName()+goodsUserVo.getProjectName();
+            goodsUserVo.setErJianErZao(false);
+            if(Validator.isNotEmpty(fullName)){
+                if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")){
+                    goodsUserVo.setErJianErZao(true);
+                }
+            }
+
             goodsUserVo.setGradeId(classGradeVo.getGradeId());
             goodsUserVo.setLearningStatus(classGradeVo.getLearningStatus());
             goodsUserVo.setLearningTimeStart(classGradeVo.getLearningTimeStart());
@@ -467,6 +478,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             goodsUserVo.setLearnStatus(classGradeVo.getLearnStatus());
             goodsUserVo.setPeriodPlush(classGradeVo.getPeriodPlush());
             goodsUserVo.setOfficialName(classGradeVo.getOfficialName());
+            goodsUserVo.setPeriodWaitTime(classGradeVo.getPeriodWaitTime());
             Long secLong = 0L;
             Long studyLong = 0L;
             SubjectStudyRecordQueryBo subjectStudyRecordQueryBo = new SubjectStudyRecordQueryBo();
@@ -487,19 +499,47 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                 List<ExamApplyGoodsVo> examApplyGoodsVos = new ArrayList<>();
                 List<ExamApplyGoodsVo> examApplyGoodsVos2 = new ArrayList<>();
                 examApplyGoodsVoList.forEach(examApplyGoodsVo -> {
-                    LambdaQueryWrapper<ExamApplyUser> lqw = Wrappers.lambdaQuery();
-                    lqw.eq(ExamApplyUser::getApplyId, examApplyGoodsVo.getApplyId());
-                    List<ExamApplyUser> examApplyUserList = iExamApplyUserService.list(lqw);
-                    if (examApplyUserList != null && examApplyUserList.size() > 0) {
-                        ArrayList<Long> userIds = new ArrayList<>();
-                        examApplyUserList.forEach(examApplyUser -> {
-                            userIds.add(examApplyUser.getUserId());
-                        });
-                        if (userIds.contains(bo.getUserId())) {
-                            examApplyGoodsVos.add(examApplyGoodsVo);
+                    ExamApply examApply = iExamApplyService.getById(examApplyGoodsVo.getApplyId());
+                    List<ExamApplySiteTime> siteTimes = iExamApplySiteTimeService.list(new LambdaQueryWrapper<ExamApplySiteTime>()
+                            .eq(ExamApplySiteTime::getApplyId, examApplyGoodsVo.getApplyId()));
+                    if (CollectionUtils.isNotEmpty(siteTimes)){
+                        ExamApplySiteTime timeTime = siteTimes.get(0);
+                        List<ExamApplySiteTimeTwoAddBo> siteTimeTwoAddBos = JSONArray.parseArray(timeTime.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
+                        ExamApplySiteTimeTwoAddBo twoAddBo = siteTimeTwoAddBos.get(0);
+                        if (ObjectUtils.isNotNull(twoAddBo)){
+                           Long time = timeTime.getExamTime()+28800L;
+                           String format = String.format("%s-%s", twoAddBo.getStartTime(), twoAddBo.getEndTime());
+                            examApplyGoodsVo.setApplyTime(time);
+                            examApplyGoodsVo.setApplyMoment(format);
                         }
-                    }else {
-                        examApplyGoodsVos2.add(examApplyGoodsVo);
+                    }
+                    switch (examApply.getApplyNature()){
+                        case 1: //普通场
+                            LambdaQueryWrapper<ExamApplyUser> lqw = Wrappers.lambdaQuery();
+                            lqw.eq(ExamApplyUser::getApplyId, examApplyGoodsVo.getApplyId());
+                            List<ExamApplyUser> examApplyUserList = iExamApplyUserService.list(lqw);
+                            if (examApplyUserList != null && examApplyUserList.size() > 0) {
+                                ArrayList<Long> userIds = new ArrayList<>();
+                                examApplyUserList.forEach(examApplyUser -> {
+                                    userIds.add(examApplyUser.getUserId());
+                                });
+                                if (userIds.contains(bo.getUserId())) {
+                                    examApplyGoodsVos.add(examApplyGoodsVo);
+                                }
+                            }else {
+                                examApplyGoodsVos2.add(examApplyGoodsVo);
+                            }
+                            break;
+                        case 2://专场
+                            List<ExamApplyUser> applyUsers = iExamApplyUserService
+                                    .list(new LambdaQueryWrapper<ExamApplyUser>().eq(ExamApplyUser::getApplyId, examApply.getApplyId()));
+                            if (CollectionUtils.isNotEmpty(applyUsers) &&
+                                    applyUsers.stream().anyMatch(x -> x.getUserId().equals(bo.getUserId()))){
+                                examApplyGoodsVos.add(examApplyGoodsVo);
+                            }
+                            break;
+                        default:
+                            break;
                     }
                 });
                 examApplyGoodsVos.addAll(examApplyGoodsVos2);
@@ -529,6 +569,12 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return goodsUserVos;
     }
 
+    @Override
+    public List<GoodsUserVo> goodsHandoutsList(CourseQueryBo bo) {
+        List<GoodsUserVo> goodsUserVos = baseMapper.goodsHandoutsList(bo);
+        return goodsUserVos;
+    }
+
 
     @Override
     public List<GoodsUserVo> goodsProgressList(CourseQueryBo bo) {
@@ -599,6 +645,41 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return true;
     }
 
+    @Override
+    public Course getCourseByNotTenant(Long cid) {
+        return baseMapper.getCourseByNotTenant(cid);
+    }
+
+    @Override
+    public Long getCourseByTenantTwo(String courseName, String code, Long tenantId) {
+        return baseMapper.getCourseByTenantTwo(courseName, code, tenantId);
+    }
+
+    @Override
+    public Long getLiveTime() {
+        Long nowTime = DateUtils.getNowTime();
+        Long aLong = liveTime(nowTime, 7);
+        return aLong;
+    }
+
+    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);
+        }
+
+        //判断当前是否为工作日
+        if (!DateUtils.isWorkingDay(dayAfter)) {
+            liveTime(nowTime,day + 1);
+        }
+        return dayAfter;
+    }
+
     private List<UserStudyRecordPhotoVo> entity2PhotoVo(Collection<UserStudyRecordPhoto> collection) {
         List<UserStudyRecordPhotoVo> voList = collection.stream()
                 .map(any -> BeanUtil.toBean(any, UserStudyRecordPhotoVo.class))

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

@@ -2,11 +2,12 @@ package com.zhongzheng.modules.course.vo;
 
 import com.zhongzheng.common.annotation.Excel;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zhongzheng.modules.top.goods.vo.TopCourseBusinessVo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import java.util.Date;
-
+import java.util.List;
 
 
 /**
@@ -48,4 +49,7 @@ public class CourseEducationTypeVo {
 	@Excel(name = "排序")
 	@ApiModelProperty("排序")
 	private Integer sort;
+
+	@ApiModelProperty("业务层级列表")
+	private List<CourseBusinessVo> businessList;
 }

+ 10 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java

@@ -2,10 +2,9 @@ package com.zhongzheng.modules.exam.bo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
 
+import java.util.List;
 
 
 /**
@@ -68,6 +67,15 @@ public class ExamApplyAddBo {
     /** 是否需要签署承诺书 1是,0否 */
     @ApiModelProperty("编码")
     private Integer reportStatus;
+    /** 考场性质:1普通场,2专场 */
+    @ApiModelProperty("考场性质:1普通场,2专场 ")
+    private Integer applyNature;
+
+    @ApiModelProperty("专场学员资料地址 ")
+    private String natureUrl;
+
+    @ApiModelProperty("专场预约学员")
+    private List<ExamApplyUserImportBo> applyUsers;
 
 
 }

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyDetailBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月26日 15:13
+ */
+@Data
+public class ExamApplyDetailBo implements Serializable {
+
+    @ApiModelProperty("考试开始日期")
+    private Long examStartTime;
+    @ApiModelProperty("考试结束日期")
+    private Long examEndTime;
+    @ApiModelProperty("考点开始时间")
+    private String startTime;
+    @ApiModelProperty("考点结束时间")
+    private String endTime;
+}

+ 10 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java

@@ -2,9 +2,9 @@ package com.zhongzheng.modules.exam.bo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
+
+import java.util.List;
 
 
 /**
@@ -74,5 +74,13 @@ public class ExamApplyEditBo {
     @ApiModelProperty("编码")
     private Integer reportStatus;
 
+    @ApiModelProperty("考场性质:1普通场,2专场 ")
+    private Integer applyNature;
+
+    @ApiModelProperty("专场学员资料地址 ")
+    private String natureUrl;
+
+    @ApiModelProperty("专场学员")
+    private List<ExamApplyUserImportBo> applyUsers;
 
 }

+ 6 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyQueryBo.java

@@ -1,17 +1,13 @@
 package com.zhongzheng.modules.exam.bo;
 
 import com.zhongzheng.common.annotation.Excel;
+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;
 
 /**
  * 考试安排分页查询对象 exam_apply
@@ -55,10 +51,10 @@ public class ExamApplyQueryBo extends BaseEntity {
 	private Integer applyStatus;
 	/** 开始日期 */
 	@ApiModelProperty("开始日期")
-	private Long applyStartTime;
+	private String applyStartTime;
 	/** 结束日期 */
 	@ApiModelProperty("结束日期")
-	private Long applyEndTime;
+	private String applyEndTime;
 	/** 1 启用 0未启用 -1删除 2已过期 */
 	@ApiModelProperty("1 启用 0未启用 -1删除 2已过期")
 	private List<Integer> status;
@@ -116,4 +112,7 @@ public class ExamApplyQueryBo extends BaseEntity {
 
 	@ApiModelProperty("关键词")
 	private String searchKey;
+
+	@ApiModelProperty("数据IDs")
+	private List<Long> ids;
 }

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultBo.java

@@ -0,0 +1,45 @@
+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 ExamApplyResultBo implements Serializable {
+
+    @ApiModelProperty("考生姓名")
+    private String userName;
+
+    @ApiModelProperty("考生身份证号")
+    private String idCard;
+
+    @ApiModelProperty("联系方式")
+    private String telphone;
+
+    @ApiModelProperty("岗位名称")
+    private String majorName;
+
+    @ApiModelProperty("考试状态:0 待登记 1正常 2缺考 3作弊 4替考")
+    private Integer applyStatus;
+
+    @ApiModelProperty("成绩")
+    private Long score;
+
+    @ApiModelProperty("证书编码")
+    private String certificateCode;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+}

+ 118 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyRoomQueryBo.java

@@ -0,0 +1,118 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+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.List;
+
+/**
+ * 考试安排分页查询对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("考试安排分页查询对象")
+public class ExamApplyRoomQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 考试Id */
+	@ApiModelProperty("考试Id")
+	private Long applyId;
+	/** 考试封面 */
+	@ApiModelProperty("考试封面")
+	private String applyUrl;
+	/** 考试标题 */
+	@ApiModelProperty("考试标题")
+	private String applyName;
+	/** 考试简介 */
+	@ApiModelProperty("考试简介")
+	private String applyIntroduce;
+	/** 1非补考学员 2补考学员 3都有 */
+	@ApiModelProperty("1非补考学员 2补考学员")
+	private Integer applyStatus;
+	/** 开始日期 */
+	@ApiModelProperty("开始日期")
+	private String applyStartTime;
+	/** 结束日期 */
+	@ApiModelProperty("结束日期")
+	private String applyEndTime;
+	/** 1 启用 0未启用 -1删除 2已过期 */
+	@ApiModelProperty("1 启用 0未启用 -1删除 2已过期")
+	private List<Integer> status;
+
+	/** 商品类型 1视频2题库 3补考 4前培  */
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 ")
+	private Integer goodsType;
+
+	/** 教育类型id */
+	@ApiModelProperty("教育类型id")
+	private Long educationTypeId;
+
+	/** 教育类型id */
+	@ApiModelProperty("1考试地点 2考培地点 ")
+	private Long addressStatus;
+
+	/** 业务层次id */
+	@ApiModelProperty("业务层次id")
+	private Long businessId;
+
+	/** 项目ID */
+	@ApiModelProperty("项目ID")
+	private Long projectId;
+
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+
+	/** 商品Id */
+	@ApiModelProperty("商品Id")
+	private Long goodsId;
+
+	/** 班级ID */
+	@ApiModelProperty("班级ID")
+	private Long gradeId;
+
+	/** 考试地点 */
+	@Excel(name = "*考试地点")
+	private String applySiteAddress;
+
+	@ApiModelProperty("考试开始时间")
+	private Long startTime;
+
+	@ApiModelProperty("考试 结束时间")
+	private Long endTime;
+
+	@ApiModelProperty("考试地址Id")
+	private Long applySiteId;
+
+	@ApiModelProperty("考试日期")
+	private Long examTime;
+
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+
+	@ApiModelProperty("关键词")
+	private String searchKey;
+
+	@ApiModelProperty("数据IDs")
+	private List<Long> ids;
+}

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySendmailBo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 考试安排添加对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试安排添加对象")
+public class ExamApplySendmailBo {
+
+    @ApiModelProperty("ids")
+    private List<Long> ids;
+
+    @ApiModelProperty("邮件标题")
+    private String mailName;
+
+    @ApiModelProperty("发送人地址")
+    private List<String> mailAttrList;
+
+    @ApiModelProperty("附件地址")
+    private String mailUrl;
+
+    @ApiModelProperty("附件标题")
+    private String mailUrlName;
+
+    @ApiModelProperty("内容")
+    private String mailText;
+
+
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyUserImportBo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.exam.bo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 考试安排添加对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试安排添加对象")
+public class ExamApplyUserImportBo implements Serializable {
+
+    @Excel(name = "姓名")
+    private String userName;
+
+    @Excel(name = "身份证号")
+    private String idCard;
+
+}

+ 9 - 11
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java

@@ -1,14 +1,14 @@
 package com.zhongzheng.modules.exam.domain;
 
-import com.baomidou.mybatisplus.annotation.*;
-import io.swagger.annotations.ApiModelProperty;
+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 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;
 
 /**
  * 考试安排对象 exam_apply
@@ -47,22 +47,20 @@ private static final long serialVersionUID=1L;
     private Long updateTime;
     /** 1 启用 0未启用 -1删除 2已过期 */
     private Integer status;
-
     /** 商品类型 1视频2题库 3补考 4前培  */
     private Integer goodsType;
-
     /** 教育类型id */
     private Long educationTypeId;
-
     /** 业务层次id */
     private Long businessId;
-
     /** 项目ID */
     private Long projectId;
-
     /** 编码 */
     private String code;
-    
     /** 是否需要签署承诺书 1是,0否 */
     private Integer reportStatus;
+    /** 考场性质:1普通场,2专场 */
+    private Integer applyNature;
+    /** 专场学员资料地址 */
+    private String natureUrl;
 }

+ 7 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApplySiteTime.java

@@ -1,14 +1,14 @@
 package com.zhongzheng.modules.exam.domain;
 
-import com.baomidou.mybatisplus.annotation.*;
-import io.swagger.annotations.ApiModelProperty;
+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 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;
 
 /**
  * 考试安排地点绑定时间对象 exam_apply_site_time
@@ -41,4 +41,6 @@ private static final long serialVersionUID=1L;
     /** 更新时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;
+    /** 是否发送邮件:0未发送 1已发送 */
+    private Integer sendmail;
 }

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

@@ -44,4 +44,6 @@ private static final long serialVersionUID=1L;
     private Integer fromPlat;
     /** 智慧考场ID */
     private Long centerId;
+    /** 是否默认标签:1是 0否 */
+    private Integer sign;
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов