Przeglądaj źródła

Merge branch 'dev'

yangdamao 2 lat temu
rodzic
commit
b8a8c56ce7
100 zmienionych plików z 2336 dodań i 101 usunięć
  1. 33 7
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 22 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  3. 62 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysOldOrgController.java
  4. 2 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  5. 2 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  6. 2 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  7. 2 0
      zhongzheng-admin/src/main/resources/application-trial.yml
  8. 1 0
      zhongzheng-admin/src/main/resources/application.yml
  9. BIN
      zhongzheng-admin/src/main/resources/config/apiclient_cert.p12
  10. 4 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonGoodsController.java
  11. 11 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java
  12. 4 5
      zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  13. 10 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  14. 2 0
      zhongzheng-api/src/main/resources/application-dev.yml
  15. 2 0
      zhongzheng-api/src/main/resources/application-pre.yml
  16. 2 0
      zhongzheng-api/src/main/resources/application-prod.yml
  17. 2 0
      zhongzheng-api/src/main/resources/application-trial.yml
  18. 1 0
      zhongzheng-api/src/main/resources/application.yml
  19. 1 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysMenu.java
  20. 73 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java
  21. 21 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  22. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  23. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  24. 17 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  25. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  26. 43 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityOrder.java
  27. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ActivityOrderMapper.java
  28. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IActivityOrderService.java
  29. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityOrderServiceImpl.java
  30. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileAddBo.java
  31. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileEditBo.java
  32. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileQueryBo.java
  33. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java
  34. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java
  35. 6 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsQueryBo.java
  36. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseFile.java
  37. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseHandouts.java
  38. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseBusinessMapper.java
  39. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseEducationTypeMapper.java
  40. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseFileMapper.java
  41. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseHandoutsMapper.java
  42. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSubjectMapper.java
  43. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseBusinessService.java
  44. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseEducationTypeService.java
  45. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java
  46. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  47. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSubjectService.java
  48. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseBusinessServiceImpl.java
  49. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseEducationTypeServiceImpl.java
  50. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java
  51. 56 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  52. 11 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSubjectServiceImpl.java
  53. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java
  54. 10 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseHandoutsVo.java
  55. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAddBo.java
  56. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAttachedQueryBo.java
  57. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java
  58. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankEditBo.java
  59. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsEditBo.java
  60. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsStudyUrlBo.java
  61. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/UserGoodsListBo.java
  62. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/Goods.java
  63. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  64. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  65. 130 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  66. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsAttachedVo.java
  67. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsListAllVo.java
  68. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserQuestionVo.java
  69. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  70. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  71. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeBatchQueryBo.java
  72. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeListBo.java
  73. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenBo.java
  74. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenUpBo.java
  75. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeQueryBo.java
  76. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeSortBo.java
  77. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassNpUserInfoBo.java
  78. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassOfficialNumBo.java
  79. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java
  80. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGradeGoods.java
  81. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java
  82. 27 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  83. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java
  84. 13 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  85. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java
  86. 464 37
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  87. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeVo.java
  88. 141 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassNpUserInfoExportVo.java
  89. 112 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassNpUserInfoVo.java
  90. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  91. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsRefundEditBo.java
  92. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java
  93. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoodsRefund.java
  94. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderInputTemplate.java
  95. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  96. 47 14
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java
  97. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  98. 60 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  99. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java
  100. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderListVo.java

+ 33 - 7
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -23,12 +23,10 @@ import com.zhongzheng.modules.goods.bo.UserGoodsListBo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsJzsVo;
 import com.zhongzheng.modules.goods.vo.UserGoodsListVo;
-import com.zhongzheng.modules.grade.bo.ClassGradeBatchQueryBo;
-import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
-import com.zhongzheng.modules.grade.bo.RollBackPeriodBo;
-import com.zhongzheng.modules.grade.bo.UserPeriodEditBo;
+import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.service.IClassGradeService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
+import com.zhongzheng.modules.grade.vo.ClassNpUserInfoVo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportAllVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
 import com.zhongzheng.modules.order.bo.OrderAddBo;
@@ -197,14 +195,14 @@ public class CommonController
 
 
     @ApiOperation("测试列表")
-    @GetMapping("common/jzs/test")
-    public AjaxResult<Void> testList()
+    @PostMapping("common/jzs/test")
+    public AjaxResult<Void> testList(@RequestBody UserPeriodEditBo bo)
     {
         UserPeriodEditBo queryBo = new UserPeriodEditBo();
         queryBo.setGoodsId(1085L);
         queryBo.setGradeId(978L);
         queryBo.setUserId(114L);
-        iUserPeriodService.syncStudyLogToOld(queryBo);
+        iUserPeriodService.syncStudyLogToOld(bo);
         return AjaxResult.success();
     }
 
@@ -266,6 +264,34 @@ public class CommonController
         return AjaxResult.success(numList);
     }
 
+    @ApiOperation("查询官方班级详情")
+    @PostMapping("common/free/officialGradeDetail")
+    public AjaxResult officialGradeDetail(@RequestBody ClassNpUserInfoBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success(iClassGradeService.officialGradeDetail(bo));
+    }
+
+    @ApiOperation("查询预开班官方班级编号")
+    @PostMapping("common/free/officialGrade/num")
+    public AjaxResult getOfficialGradeNum(@RequestBody ClassOfficialNumBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success(iClassGradeService.getOfficialGradeNum(bo));
+    }
+
+    @ApiOperation("预报名班级开班")
+    @PostMapping("common/free/open/class")
+    public AjaxResult openOfficialGrade(@RequestBody ClassGradeOpenBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        iClassGradeService.openOfficialGrade(bo);
+        return AjaxResult.success();
+    }
+
     @ApiOperation("测试分班")
     @GetMapping("common/jzs/grade")
     public AjaxResult<Void> testGrade()

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

@@ -10,6 +10,7 @@ import java.util.stream.Collectors;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.github.pagehelper.PageInfo;
 import com.zhongzheng.common.core.domain.entity.SysRole;
@@ -115,6 +116,27 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询其他平台班级详情
+     */
+    @ApiOperation("查询其他平台班级学员列表")
+    @GetMapping("/other/Class/user")
+    public AjaxResult<List<ClassNpUserInfoVo>> otherClassUserList(ClassNpUserInfoBo bo) {
+        return AjaxResult.success(iClassGradeService.otherClassUserList(bo));
+    }
+
+    /**
+     * 导出查询其他平台班级详情
+     */
+    @ApiOperation("查询其他平台班级学员列表")
+    @GetMapping("/other/Class/user/export")
+    public AjaxResult<List<ClassNpUserInfoVo>> otherClassUserListExport(ClassNpUserInfoBo bo) {
+        List<ClassNpUserInfoVo> list = iClassGradeService.otherClassUserList(bo);
+        List<ClassNpUserInfoExportVo> exportVos = list.stream().map(item -> BeanUtil.toBean(item,ClassNpUserInfoExportVo.class)).collect(Collectors.toList());
+        ExcelUtil<ClassNpUserInfoExportVo> util = new ExcelUtil<ClassNpUserInfoExportVo>(ClassNpUserInfoExportVo.class);
+        return util.exportExcel(exportVos, "班级学员列表");
+    }
+
     /**
      * 查询班级列表
      */

+ 62 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysOldOrgController.java

@@ -0,0 +1,62 @@
+package com.zhongzheng.controller.system;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.annotation.RepeatSubmit;
+import com.zhongzheng.common.constant.UserConstants;
+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.SecurityUtils;
+import com.zhongzheng.framework.web.domain.server.Sys;
+import com.zhongzheng.modules.order.bo.OrderUserCheckBuyBo;
+import com.zhongzheng.modules.system.domain.SysOldOrg;
+import com.zhongzheng.modules.system.domain.vo.SysOldOrgVo;
+import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysOldOrgService;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 参数配置 信息操作处理
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="旧系统机构")
+@RestController
+@RequestMapping("/system/old/org")
+public class SysOldOrgController extends BaseController
+{
+    @Autowired
+    private ISysOldOrgService iSysOldOrgService;
+
+    /**
+     * 获取新/旧系统机构列表
+     */
+    @ApiOperation("获取新/旧系统机构列表")
+    @GetMapping("/list")
+    public AjaxResult<List<SysOldOrgVo>> list() {
+        List<SysOldOrg> list = iSysOldOrgService
+                .list(new LambdaQueryWrapper<SysOldOrg>()
+                .eq(SysOldOrg::getStatus, 1)
+                .eq(SysOldOrg::getShareClass,1));
+        if (CollectionUtils.isEmpty(list)){
+            return AjaxResult.success(new ArrayList<>());
+        }
+        List<SysOldOrgVo> result = list.stream().map(item -> BeanUtil.toBean(item, SysOldOrgVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(result);
+    }
+
+}

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

@@ -139,6 +139,8 @@ oldStudySys:
     searchGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCount
     pushGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -139,6 +139,8 @@ oldStudySys:
     searchGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -139,6 +139,8 @@ oldStudySys:
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -138,6 +138,8 @@ oldStudySys:
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -141,6 +141,7 @@ mybatis-plus:
   executorType: SIMPLE
   # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
   configurationProperties: null
+  typeHandlersPackage: com.zhongzheng.common.type
   configuration:
     # 自动驼峰命名规则(camel case)映射
     # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名

BIN
zhongzheng-admin/src/main/resources/config/apiclient_cert.p12


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

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.cmmon;
 
+import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
@@ -47,6 +48,9 @@ public class CommonGoodsController extends BaseController {
     @ApiOperation("查询商品列表")
     @GetMapping("/list")
     public TableDataInfo<GoodsVo> list(GoodsQueryBo bo) {
+        if(Validator.isNotEmpty(bo.getGoodsName())){
+            bo.setGoodsName(bo.getGoodsName().replaceAll(" ",""));
+        }
         bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
         bo.setGoodsStatus(1);
         startPage();

+ 11 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java

@@ -21,7 +21,7 @@ import java.util.List;
 
 /**
  * 讲义列Controller
- * 
+ *
  * @author ruoyi
  * @date 2021-11-02
  */
@@ -44,7 +44,16 @@ public class CourseHandoutsController extends BaseController {
         return getDataTable(list);
     }
 
-
+    /**
+     * 查询讲义列列表
+     */
+    @ApiOperation("查询商品讲义列列表")
+    @GetMapping("/listByGoods")
+    public TableDataInfo<CourseHandoutsVo> listByGoods(CourseHandoutsQueryBo bo) {
+        startPage();
+        List<CourseHandoutsVo> list = iCourseHandoutsService.queryByGoodsList(bo);
+        return getDataTable(list);
+    }
 
     /**
      * 获取讲义列详细信息

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

@@ -325,11 +325,10 @@ public class GoodsController extends BaseController {
      */
     @ApiOperation("获取用户所有购买商品")
     @PostMapping("/user/all")
-    public AjaxResult<List<GoodsSectionListVo>> getUserGoodsListAll(@RequestBody UserGoodsListAllBo bo) {
-//        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
-//        bo.setUserId(loginUser.getUser().getUserId());
-//        return AjaxResult.success(iGoodsService.getUserGoodsListAll(bo));
-        return null;
+    public AjaxResult<List<GoodsListAllVo>> getUserGoodsListAll(@RequestBody UserGoodsListAllBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iGoodsService.getUserGoodsListAll(bo));
     }
 
 

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

@@ -63,6 +63,16 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询班级
+     */
+    @ApiOperation("查询班级")
+    @GetMapping("/class/{gradeId}")
+    public AjaxResult<ClassGradeVo> getClassGradeVo(@PathVariable("gradeId")Long gradeId) {
+        ClassGradeVo vo = iClassGradeService.getClassGradeVo(gradeId);
+        return AjaxResult.success(vo);
+    }
+
     /**
      * 获取班级详细信息
      */

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

@@ -140,6 +140,8 @@ oldStudySys:
     searchGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCount
     pushGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -139,6 +139,8 @@ oldStudySys:
     searchGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -151,6 +151,8 @@ oldStudySys:
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
     educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -150,6 +150,8 @@ oldStudySys:
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

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

@@ -138,6 +138,7 @@ mybatis-plus:
   executorType: SIMPLE
   # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
   configurationProperties: null
+  typeHandlersPackage: com.zhongzheng.common.type
   configuration:
     # 自动驼峰命名规则(camel case)映射
     # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名

+ 1 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysMenu.java

@@ -113,6 +113,7 @@ public class SysMenu implements Serializable
     private String remark;
 
     /** 备注 */
+//    @TableField(exist = false)
     private Long tenantId;
 
     /** 请求参数 */

+ 73 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java

@@ -0,0 +1,73 @@
+package com.zhongzheng.common.type;
+
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.symmetric.AES;
+import org.apache.ibatis.type.*;
+import org.springframework.util.StringUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class EncryptHandler  implements TypeHandler<String> {
+    /**
+     * 线上运行后勿修改,会影响已加密数据解密
+     */
+    private static final byte[] KEYS = "base20230213zzkj".getBytes(StandardCharsets.UTF_8);
+
+
+
+    public String decrypt(String value) {
+        if (null == value) {
+            return null;
+        }
+        if (value.length()<20 ) {
+            return value;
+        }
+        return SecureUtil.aes(KEYS).decryptStr(value);
+    }
+
+    public static String encrypt(String value){
+        if (null == value) {
+            return null;
+        }
+        AES aes = SecureUtil.aes(KEYS);
+        String encrypt = aes.encryptHex(value);
+        return encrypt;
+    }
+
+    @Override
+    public void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
+        if (StringUtils.isEmpty(s)) {
+            preparedStatement.setString(i, null);
+            return;
+        }
+        preparedStatement.setString(i, s);
+    //    String encrypt = encrypt(s);
+    //    preparedStatement.setString(i, encrypt);
+
+    }
+
+    @Override
+    public String getResult(ResultSet resultSet, String s) throws SQLException {
+        return resultSet.getString(s);
+    //    return decrypt(resultSet.getString(s));
+
+    }
+
+    @Override
+    public String getResult(ResultSet resultSet, int i) throws SQLException {
+        return null;
+    }
+
+    @Override
+    public String getResult(CallableStatement callableStatement, int i) throws SQLException {
+        return null;
+    }
+
+
+}

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

@@ -1,5 +1,6 @@
 package com.zhongzheng.common.utils;
 
+import cn.hutool.core.lang.Validator;
 import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.aliyun.teaopenapi.models.Config;
@@ -11,6 +12,8 @@ import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -315,4 +318,22 @@ public class ToolsUtils {
         return result;
     }
 
+    public static boolean verifPwd(String passWord) {
+        if(Validator.isEmpty(passWord)){
+            return false;
+        }
+        if(passWord.length()<6||passWord.length()>18){
+            return false;
+        }
+       /* String regExp = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)(?![a-zA-Z0-9]+$)(?![a-zA-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9\\W_!@#$%^&*`~()-+=]+$)(?![0-9A-Z\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{6,16}$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(passWord);
+        if (m.matches()){
+            return true;
+        } else {
+            return false;
+        }*/
+        return true;
+    }
+
 }

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -53,6 +53,7 @@ public class CustomTenantLineHandler implements TenantLineHandler {
         add("tables");
         add("columns");
         add("sys_logininfor");
+        add("sys_old_org");
     }};
 
     /**

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

@@ -34,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 

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

@@ -22,6 +22,7 @@ import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.UserStatus;
 import com.zhongzheng.common.exception.BaseException;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.*;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
@@ -690,6 +691,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getPwd()==null){
             throw new CustomException("密码不能为空");
         }
+        if(!ToolsUtils.verifPwd(bo.getPwd())){
+            throw new CustomException("密码长度为6-18个字符");
+        }
         String key = Constants.REGISTER_SMS + bo.getTel();
         String code =  redisCache.getCacheObject(key);
         if(code==null){
@@ -930,6 +934,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return baseMapper.queryUserByTelphoneTenant(telphone,tenantId);
     }
 
+    @Override
+    public User queryUserByIdNumTenant(String idNum, Long tenantId) {
+        return baseMapper.queryUserByIdNumTenant(idNum, tenantId);
+    }
+
     @Override
     public Map<String, Object> telphone_login(UserAppTelphoneLoginBo bo) {
         String tenantId = ServletUtils.getRequest().getHeader("TenantId");
@@ -941,7 +950,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(Validator.isEmpty(phoneBo.getTelphone())){
             throw new CustomException("账号不能为空");
         }
-        User user = baseMapper.queryUserByTelphoneTenant(phoneBo.getTelphone(), phoneBo.getTenantId());
+        User user;
+        if (StringUtils.isNotBlank(phoneBo.getIdNum())){
+            //身份证登入
+            user = baseMapper.queryUserByIdNumTenant(phoneBo.getIdNum(), phoneBo.getTenantId());
+        }else {
+            user = baseMapper.queryUserByTelphoneTenant(phoneBo.getTelphone(), phoneBo.getTenantId());
+        }
+
         if(Validator.isEmpty(user)){
             throw new CustomException("该账号不存在");
         }

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

@@ -1210,7 +1210,7 @@ public class WxLoginService implements IWxLoginService {
 
         String userInfoParam = String.format(gzh_wxUserInfoParam, access_token, openId);
         String userInfoResultString = HttpUtils.sendGet(gzh_wxUserInfoUrl, userInfoParam);
-        System.out.println(userInfoResultString);
+
         //解析json
         JSONObject jsonObject1 = (JSONObject) JSONObject.parse(userInfoResultString);
         String unionId = String.valueOf(jsonObject1.get("unionid"));

+ 43 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityOrder.java

@@ -0,0 +1,43 @@
+package com.zhongzheng.modules.activity.domain;
+
+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;
+
+/**
+ * 商品推荐对象 activity_recommend
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("activity_order")
+public class ActivityOrder implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    @TableId(value = "id")
+    private Long id;
+    /** 活动类型:1,分销红包活动 */
+    private Integer type;
+    /** 订单编号 */
+    private String orderSn;
+    /** 备注 */
+    private Integer status;
+    /** 1有效 0无效 */
+    private String remark;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    /** 商户ID */
+    private Long tenantId;
+}

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ActivityOrderMapper.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.activity.bo.ActivityRecommendQueryBo;
+import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.domain.ActivityRecommend;
+import com.zhongzheng.modules.activity.vo.ActivityRecommendVo;
+
+import java.util.List;
+
+/**
+ * 商品推荐Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface ActivityOrderMapper extends BaseMapper<ActivityOrder> {
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IActivityOrderService.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.domain.ActivityRecommend;
+
+/**
+ * 商品推荐Service接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface IActivityOrderService extends IService<ActivityOrder> {
+
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityOrderServiceImpl.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.activity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.mapper.ActivityOrderMapper;
+import com.zhongzheng.modules.activity.service.IActivityOrderService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 商品推荐Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+@Service
+public class ActivityOrderServiceImpl extends ServiceImpl<ActivityOrderMapper, ActivityOrder> implements IActivityOrderService {
+}

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileAddBo.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 文件添加对象 course_file
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Data
+@ApiModel("文件添加对象")
+public class CourseFileAddBo {
+
+    /** 地址 */
+    @ApiModelProperty("地址")
+    private String url;
+    /** 文件名字 */
+    @ApiModelProperty("文件名字")
+    private String urlName;
+    /** 1启用 0关闭 */
+    @ApiModelProperty("1启用 0关闭")
+    private Integer status;
+    /** 添加时间 */
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 讲义ID */
+    @ApiModelProperty("讲义ID")
+    private Long handoutsId;
+    /** 排序 */
+    @ApiModelProperty("排序")
+    private Integer sort;
+}

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileEditBo.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 文件编辑对象 course_file
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Data
+@ApiModel("文件编辑对象")
+public class CourseFileEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long fileId;
+
+    /** 地址 */
+    @ApiModelProperty("地址")
+    private String url;
+
+    /** 文件名字 */
+    @ApiModelProperty("文件名字")
+    private String urlName;
+
+    /** 1启用 0关闭 */
+    @ApiModelProperty("1启用 0关闭")
+    private Integer status;
+
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+    /** 讲义ID */
+    @ApiModelProperty("讲义ID")
+    private Long handoutsId;
+
+    /** 排序 */
+    @ApiModelProperty("排序")
+    private Integer sort;
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileQueryBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 文件分页查询对象 course_file
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("文件分页查询对象")
+public class CourseFileQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 地址 */
+	@ApiModelProperty("地址")
+	private String url;
+	/** 文件名字 */
+	@ApiModelProperty("文件名字")
+	private String urlName;
+	/** 1启用 0关闭 */
+	@ApiModelProperty("1启用 0关闭")
+	private Integer status;
+	/** 讲义ID */
+	@ApiModelProperty("讲义ID")
+	private Long handoutsId;
+	/** 排序 */
+	@ApiModelProperty("排序")
+	private Integer sort;
+}

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

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.course.bo;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.zhongzheng.modules.course.domain.CourseFile;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -48,4 +49,6 @@ public class CourseHandoutsAddBo {
     /** 绑定类型 */
     @ApiModelProperty("绑定类型")
     private List<CourseHandoutsBusinessAddBo> courseHandoutsBusinessAddBos;
+    @ApiModelProperty("文件列表")
+    private List<CourseFileAddBo> fileList;
 }

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

@@ -54,4 +54,6 @@ public class CourseHandoutsEditBo {
     /** 绑定类型 */
     @ApiModelProperty("绑定类型")
     private List<CourseHandoutsBusinessAddBo> courseHandoutsBusinessAddBos;
+    @ApiModelProperty("文件列表")
+    private List<CourseFileAddBo> fileList;
 }

+ 6 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsQueryBo.java

@@ -37,7 +37,9 @@ public class CourseHandoutsQueryBo extends BaseEntity {
 	/** 排序的方向desc或者asc */
 	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
 	private String isAsc;
-
+	/** 讲义id */
+	@ApiModelProperty("讲义id")
+	private Long handoutsId;
 
 	/** id */
 	@ApiModelProperty("id")
@@ -74,6 +76,8 @@ public class CourseHandoutsQueryBo extends BaseEntity {
 	@ApiModelProperty("文件名字")
 	private String urlName;
 
-
+	/** goodsId */
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
 
 }

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

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.course.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 文件对象 course_file
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("course_file")
+public class CourseFile implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "file_id")
+    private Long fileId;
+    /** 地址 */
+    private String url;
+    /** 文件名字 */
+    private String urlName;
+    /** 1启用 0关闭 */
+    private Integer status;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 讲义 */
+    private Long handoutsId;
+    /** 排序 */
+    private Integer sort;
+}

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

@@ -1,6 +1,8 @@
 package com.zhongzheng.modules.course.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.zhongzheng.modules.course.vo.CourseFileVo;
+import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -8,6 +10,8 @@ import lombok.experimental.Accessors;
 import java.io.Serializable;
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.List;
+
 import com.zhongzheng.common.annotation.Excel;
 
 /**
@@ -53,5 +57,9 @@ private static final long serialVersionUID=1L;
     private Long tenantId;
     @TableField(exist = false)
     private Long oId;
+    @TableField(exist = false)
+    private List<CourseFileVo> fileList;
+
+
 
 }

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

@@ -23,4 +23,7 @@ public interface CourseBusinessMapper extends BaseMapper<CourseBusiness> {
 
     @InterceptorIgnore(tenantLine = "true")
     CourseBusiness getBusinessByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseBusiness getBusinessByIdTenant(@Param("businessId") Long businessId,@Param("tenantId") Long tenantId);
 }

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

@@ -21,4 +21,7 @@ public interface CourseEducationTypeMapper extends BaseMapper<CourseEducationTyp
 
     @InterceptorIgnore(tenantLine = "true")
     CourseEducationType getEducationTypeBytenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CourseEducationType getEducationTypeByIdtenant(@Param("educationTypeId")Long educationTypeId,@Param("tenantId") Long tenantId);
 }

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

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.course.domain.CourseFile;
+
+/**
+ * 文件Mapper接口
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+public interface CourseFileMapper extends BaseMapper<CourseFile> {
+
+}

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

@@ -5,6 +5,7 @@ import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
 import com.zhongzheng.modules.course.domain.CourseHandouts;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
+import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
@@ -22,6 +23,8 @@ public interface CourseHandoutsMapper extends BaseMapper<CourseHandouts> {
 
     Collection<CourseHandouts> queryList(CourseHandoutsQueryBo bo);
 
+    List<CourseHandoutsVo> queryByGoodsList(CourseHandoutsQueryBo bo);
+
     @InterceptorIgnore(tenantLine = "true")
     CourseHandouts getHandoutsByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSubjectMapper.java

@@ -8,6 +8,7 @@ import com.zhongzheng.modules.course.domain.CourseSubject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.vo.CourseProjectTypeVo;
 import com.zhongzheng.modules.course.vo.CourseSubjectVo;
+import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
@@ -31,4 +32,10 @@ public interface CourseSubjectMapper extends BaseMapper<CourseSubject> {
 
     @InterceptorIgnore(tenantLine = "true")
     CourseSubject getSubjectByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Long> getIdsByTenant(@Param("subNames")List<String> subNames);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CourseSubject> listByIdsTenant(ClassGradeListBo bgListBo);
 }

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

@@ -63,4 +63,6 @@ public interface ICourseBusinessService extends IService<CourseBusiness> {
 	String queryFullName(CourseBusinessQueryBo bo);
 
     CourseBusiness getBusinessByTenant(String encoder, Long newTenantId);
+
+	CourseBusiness getBusinessByIdTenant(Long businessId, Long tenantId);
 }

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

@@ -56,4 +56,6 @@ public interface ICourseEducationTypeService extends IService<CourseEducationTyp
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     CourseEducationType getEducationTypeBytenant(String encoder, Long newTenantId);
+
+    CourseEducationType getEducationByIdtenant(Long educationTypeId, Long tenantId);
 }

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

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.course.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.course.bo.CourseFileAddBo;
+import com.zhongzheng.modules.course.bo.CourseFileEditBo;
+import com.zhongzheng.modules.course.bo.CourseFileQueryBo;
+import com.zhongzheng.modules.course.domain.CourseFile;
+import com.zhongzheng.modules.course.vo.CourseFileVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 文件Service接口
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+public interface ICourseFileService extends IService<CourseFile> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	CourseFileVo queryById(Long fileId);
+
+	/**
+	 * 查询列表
+	 */
+	List<CourseFileVo> queryList(CourseFileQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入文件
+	 * @param bo 文件新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(CourseFileAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改文件
+	 * @param bo 文件编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(CourseFileEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -28,6 +28,8 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 	 */
 	List<CourseHandoutsVo> queryList(CourseHandoutsQueryBo bo);
 
+	List<CourseHandoutsVo> queryByGoodsList(CourseHandoutsQueryBo bo);
+
 	/**
 	 * 根据新增业务对象插入讲义列
 	 * @param bo 讲义列新增业务对象

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSubjectService.java

@@ -7,6 +7,7 @@ import com.zhongzheng.modules.course.bo.CourseSubjectQueryBo;
 import com.zhongzheng.modules.course.bo.CourseSubjectAddBo;
 import com.zhongzheng.modules.course.bo.CourseSubjectEditBo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 
 import java.util.Collection;
 import java.util.List;
@@ -54,4 +55,9 @@ public interface ICourseSubjectService extends IService<CourseSubject> {
     List<CourseSubjectVo> queryListAll(CourseSubjectQueryBo bo);
 
 	CourseSubject getSubjectByTenant(String encoder, Long newTenantId);
+
+    List<Long> getIdsByTenant(List<String> subNames);
+
+	List<CourseSubject> listByIdsTenant(ClassGradeListBo bgListBo);
+
 }

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

@@ -237,4 +237,9 @@ public class CourseBusinessServiceImpl extends ServiceImpl<CourseBusinessMapper,
         return baseMapper.getBusinessByTenant(encoder,newTenantId);
     }
 
+    @Override
+    public CourseBusiness getBusinessByIdTenant(Long businessId, Long tenantId) {
+        return baseMapper.getBusinessByIdTenant(businessId, tenantId);
+    }
+
 }

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

@@ -188,4 +188,9 @@ public class CourseEducationTypeServiceImpl extends ServiceImpl<CourseEducationT
     public CourseEducationType getEducationTypeBytenant(String encoder, Long newTenantId) {
         return baseMapper.getEducationTypeBytenant(encoder,newTenantId);
     }
+
+    @Override
+    public CourseEducationType getEducationByIdtenant(Long educationTypeId, Long tenantId) {
+        return baseMapper.getEducationTypeByIdtenant(educationTypeId, tenantId);
+    }
 }

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java

@@ -0,0 +1,102 @@
+package com.zhongzheng.modules.course.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.course.bo.CourseFileAddBo;
+import com.zhongzheng.modules.course.bo.CourseFileEditBo;
+import com.zhongzheng.modules.course.bo.CourseFileQueryBo;
+import com.zhongzheng.modules.course.domain.CourseFile;
+import com.zhongzheng.modules.course.mapper.CourseFileMapper;
+import com.zhongzheng.modules.course.service.ICourseFileService;
+import com.zhongzheng.modules.course.vo.CourseFileVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 文件Service业务层处理
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Service
+public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseFile> implements ICourseFileService {
+
+    @Override
+    public CourseFileVo queryById(Long fileId){
+        CourseFile db = this.baseMapper.selectById(fileId);
+        return BeanUtil.toBean(db, CourseFileVo.class);
+    }
+
+    @Override
+    public List<CourseFileVo> queryList(CourseFileQueryBo bo) {
+        LambdaQueryWrapper<CourseFile> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StrUtil.isNotBlank(bo.getUrl()), CourseFile::getUrl, bo.getUrl());
+        lqw.like(StrUtil.isNotBlank(bo.getUrlName()), CourseFile::getUrlName, bo.getUrlName());
+        lqw.eq(bo.getStatus() != null, CourseFile::getStatus, bo.getStatus());
+        lqw.eq(bo.getHandoutsId() != null, CourseFile::getHandoutsId, bo.getHandoutsId());
+        lqw.eq(bo.getSort() != null, CourseFile::getSort, bo.getSort());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<CourseFileVo> entity2Vo(Collection<CourseFile> collection) {
+        List<CourseFileVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, CourseFileVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<CourseFile> page = (Page<CourseFile>)collection;
+            Page<CourseFileVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(CourseFileAddBo bo) {
+        CourseFile add = BeanUtil.toBean(bo, CourseFile.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(CourseFileEditBo bo) {
+        CourseFile update = BeanUtil.toBean(bo, CourseFile.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(CourseFile entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 56 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java

@@ -6,12 +6,16 @@ import cn.hutool.core.util.StrUtil;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.course.bo.CourseHandoutsBusinessAddBo;
-import com.zhongzheng.modules.course.domain.CourseEducationTier;
-import com.zhongzheng.modules.course.domain.CourseHandoutsBusiness;
+import com.zhongzheng.modules.course.bo.*;
+import com.zhongzheng.modules.course.domain.*;
+import com.zhongzheng.modules.course.service.ICourseFileService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsBusinessService;
 import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
+import com.zhongzheng.modules.course.vo.CourseMenuExamVo;
+import com.zhongzheng.modules.goods.bo.GoodsCourseAddBo;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsAttached;
+import com.zhongzheng.modules.goods.domain.GoodsCourse;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,18 +23,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
-import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
-import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
-import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
-import com.zhongzheng.modules.course.domain.CourseHandouts;
 import com.zhongzheng.modules.course.mapper.CourseHandoutsMapper;
 import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -46,19 +44,24 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
     private ICourseHandoutsBusinessService courseHandoutsBusinessService;
     @Autowired
     private IGoodsService iGoodsService;
+    @Autowired
+    private ICourseFileService iCourseFileService;
+
 
     @Override
     public CourseHandoutsVo queryById(Long handoutsId){
-        CourseHandoutsQueryBo courseHandoutsQueryBo = new CourseHandoutsQueryBo();
-        courseHandoutsQueryBo.setId(handoutsId);
-        List<CourseHandoutsVo> courseHandoutsVos = entity2Vo(baseMapper.queryList(courseHandoutsQueryBo));
-        if (CollectionUtils.isEmpty(courseHandoutsVos)){
+        CourseHandouts db = this.baseMapper.selectById(handoutsId);
+        if (Validator.isEmpty(db)){
             throw new CustomException("查无数据");
         }
         //获得讲义业务层
-        CourseHandoutsVo courseHandoutsVo = courseHandoutsVos.get(0);
+        CourseHandoutsVo courseHandoutsVo = BeanUtil.toBean(db, CourseHandoutsVo.class);
         List<CourseHandoutsBusinessVo> courseHandoutsBusinessVos = baseMapper.selectEntity(courseHandoutsVo.getHandoutsId());
         courseHandoutsVo.setCourseHandoutsBusinessVo(courseHandoutsBusinessVos);
+
+        CourseFileQueryBo queryBo = new CourseFileQueryBo();
+        queryBo.setHandoutsId(courseHandoutsVo.getHandoutsId());
+        courseHandoutsVo.setFileList(iCourseFileService.queryList(queryBo));
         return courseHandoutsVo;
     }
 
@@ -68,6 +71,11 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         return entity2Vo(baseMapper.queryList(bo));
     }
 
+    @Override
+    public List<CourseHandoutsVo> queryByGoodsList(CourseHandoutsQueryBo bo) {
+        return baseMapper.queryByGoodsList(bo);
+    }
+
     /**
     * 实体类转化成视图对象
     *
@@ -109,6 +117,22 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
             addBusiness.setUpdateTime(DateUtils.getNowTime());
             courseHandoutsBusinessService.save(addBusiness);
         }
+        //文件列表
+        if (bo.getFileList() != null && bo.getFileList().size() > 0) {
+            Collection<CourseFile> coll = new HashSet<>();
+            for (int i = 0; i < bo.getFileList().size(); i++) {
+                CourseFileAddBo item = bo.getFileList().get(i);
+                CourseFile addItem = new CourseFile();
+                addItem.setHandoutsId(add.getHandoutsId());
+                addItem.setUrl(item.getUrl());
+                addItem.setSort(item.getSort());
+                addItem.setUrlName(item.getUrlName());
+                addItem.setCreateTime(DateUtils.getNowTime());
+                addItem.setUpdateTime(DateUtils.getNowTime());
+                coll.add(addItem);
+            }
+            iCourseFileService.saveBatch(coll);
+        }
         return save;
     }
 
@@ -130,6 +154,23 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
                 courseHandoutsBusinessService.save(addBusiness);
             }
         }
+        //文件列表
+        if (bo.getFileList() != null && bo.getFileList().size() > 0) {
+            iCourseFileService.remove(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, update.getHandoutsId()));
+            Collection<CourseFile> coll = new HashSet<>();
+            for (int i = 0; i < bo.getFileList().size(); i++) {
+                CourseFileAddBo item = bo.getFileList().get(i);
+                CourseFile addItem = new CourseFile();
+                addItem.setHandoutsId(update.getHandoutsId());
+                addItem.setUrl(item.getUrl());
+                addItem.setSort(item.getSort());
+                addItem.setUrlName(item.getUrlName());
+                addItem.setCreateTime(DateUtils.getNowTime());
+                addItem.setUpdateTime(DateUtils.getNowTime());
+                coll.add(addItem);
+            }
+            iCourseFileService.saveBatch(coll);
+        }
         return this.updateById(update);
     }
 

+ 11 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSubjectServiceImpl.java

@@ -11,6 +11,7 @@ import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseSubjectProject;
 import com.zhongzheng.modules.course.service.ICourseSubjectProjectService;
 import com.zhongzheng.modules.course.vo.CourseProjectTypeVo;
+import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 import com.zhongzheng.modules.user.bo.SchoolProjectAddBo;
 import com.zhongzheng.modules.user.domain.SchoolProject;
 import com.zhongzheng.modules.user.vo.SchoolVo;
@@ -184,4 +185,14 @@ public class CourseSubjectServiceImpl extends ServiceImpl<CourseSubjectMapper, C
     public CourseSubject getSubjectByTenant(String encoder, Long newTenantId) {
         return baseMapper.getSubjectByTenant(encoder,newTenantId);
     }
+
+    @Override
+    public List<Long> getIdsByTenant(List<String> subNames) {
+        return baseMapper.getIdsByTenant(subNames);
+    }
+
+    @Override
+    public List<CourseSubject> listByIdsTenant(ClassGradeListBo bgListBo) {
+        return baseMapper.listByIdsTenant(bgListBo);
+    }
 }

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.course.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 文件视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2023-02-10
+ */
+@Data
+@ApiModel("文件视图对象")
+public class CourseFileVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long fileId;
+
+	/** 地址 */
+	@Excel(name = "地址")
+	@ApiModelProperty("地址")
+	private String url;
+	/** 文件名字 */
+	@Excel(name = "文件名字")
+	@ApiModelProperty("文件名字")
+	private String urlName;
+	/** 1启用 0关闭 */
+	@Excel(name = "1启用 0关闭")
+	@ApiModelProperty("1启用 0关闭")
+	private Integer status;
+
+	@Excel(name = "讲义")
+	@ApiModelProperty("讲义")
+	private Integer handoutsId;
+	/** 排序 */
+	@Excel(name = "排序")
+	@ApiModelProperty("排序")
+	private Integer sort;
+}

+ 10 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseHandoutsVo.java

@@ -32,9 +32,9 @@ public class CourseHandoutsVo {
 	@Excel(name = "0 未启用 1启用 ")
 	@ApiModelProperty("0 未启用 1启用 ")
 	private Integer status;
-	/** 文件地址 */
-	@Excel(name = "文件地址")
-	@ApiModelProperty("文件地址")
+	/** 地址 */
+	@Excel(name = "地址")
+	@ApiModelProperty("地址")
 	private String handoutsUrl;
 	/** 编码YW */
 	@Excel(name = "编码YW")
@@ -54,4 +54,11 @@ public class CourseHandoutsVo {
 	@Excel(name = "0不可下载 1下载")
 	@ApiModelProperty("0不可下载 1下载")
 	private Integer canDownload;
+
+	/** 地址 */
+	@Excel(name = "地址")
+	@ApiModelProperty("地址")
+	private String url;
+
+	private List<CourseFileVo> fileList;
 }

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

@@ -184,4 +184,8 @@ public class GoodsAddBo {
     /** 显示排序字段 */
     @ApiModelProperty("显示排序字段")
     private Long showSort;
+    @ApiModelProperty("外链")
+    private String externalLink;
+    @ApiModelProperty("是否外链商品:0否 1是")
+    private Integer externalLinkStatus;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsAttachedQueryBo.java

@@ -56,4 +56,8 @@ public class GoodsAttachedQueryBo extends BaseEntity {
 	private Long orderGoodsId;
 	@ApiModelProperty("试卷类型ID")
 	private Long paperId;
+	@ApiModelProperty("外链")
+	private String externalLink;
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
 }

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

@@ -130,4 +130,9 @@ public class GoodsBankAddBo {
     /** 显示排序字段 */
     @ApiModelProperty("显示排序字段")
     private Long showSort;
+
+    @ApiModelProperty("外链")
+    private String externalLink;
+    @ApiModelProperty("是否外链商品:0否 1是")
+    private Integer externalLinkStatus;
 }

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

@@ -159,4 +159,9 @@ public class GoodsBankEditBo {
     /** 显示排序字段 */
     @ApiModelProperty("显示排序字段")
     private Long showSort;
+
+    @ApiModelProperty("外链")
+    private String externalLink;
+    @ApiModelProperty("是否外链商品:0否 1是")
+    private Integer externalLinkStatus;
 }

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

@@ -218,4 +218,8 @@ public class GoodsEditBo {
     /** 显示排序字段 */
     @ApiModelProperty("显示排序字段")
     private Long showSort;
+    @ApiModelProperty("外链")
+    private String externalLink;
+    @ApiModelProperty("是否外链商品:0否 1是")
+    private Integer externalLinkStatus;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsStudyUrlBo.java

@@ -21,6 +21,10 @@ public class GoodsStudyUrlBo implements Serializable {
     @NotBlank(message = "用户手机号码不能为空")
     private String telphone;
 
+    @ApiModelProperty("用户身份证号码")
+    @NotBlank(message = "用户身份证号码不能为空")
+    private String idNum;
+
     @ApiModelProperty("当前时间戳")
     @NotBlank(message = "当前时间戳不能为空")
     private Long stamp;

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

@@ -17,6 +17,9 @@ public class UserGoodsListBo implements Serializable {
     @NotBlank(message = "手机号")
     private String telphone;
 
+    @ApiModelProperty("身份证")
+    private String idNum;
+
     @ApiModelProperty("当前时间戳")
     @NotBlank(message = "当前时间戳不能为空")
     private Long stamp;

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

@@ -149,4 +149,9 @@ private static final long serialVersionUID=1L;
 
     @TableField(exist = false)
     private Long oId;
+    /** 外链 */
+    private String externalLink;
+    /** 是否外链商品:0否 1是 */
+    private Integer externalLinkStatus;
+
 }

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

@@ -7,7 +7,9 @@ import com.zhongzheng.modules.course.vo.CourseVo;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.bo.UserGoodsListAllBo;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.vo.GoodsListAllVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.goods.vo.UserGoodsListVo;
 import com.zhongzheng.modules.goods.vo.UserOrderGoodsVo;
@@ -40,7 +42,7 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     Long getExamNum(Long goodsId);
 
-    GoodsVo getSectionNum(CourseQueryBo bo);
+    GoodsVo getSectionNumByBo(CourseQueryBo bo);
 
     Long getSectionNum(Long goodsId);
 
@@ -58,4 +60,8 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     Goods queryGoodsByIdTenant(@Param("goodsId") Long goodsId,@Param("tenantId") Long tenantId);
+
+    List<GoodsListAllVo> getUserGoodsListAll(UserGoodsListAllBo bo);
+
+    Long getCourseExamNum(@Param("goodsId") Long goodsId);
 }

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

@@ -113,4 +113,8 @@ public interface IGoodsService extends IService<Goods> {
 	boolean goodsBatchCopyDisposeTenant();
 
     List<GoodsVo> getShareList(Long time);
+
+	List<GoodsListAllVo> getUserGoodsListAll(UserGoodsListAllBo bo);
+
+    Goods getGoodsByIdTenant(Long goodsId, Long tenantId);
 }

+ 130 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -45,7 +45,9 @@ import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
 import com.zhongzheng.modules.inform.domain.InformRemind;
 import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.domain.OrderInputTemplate;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.order.service.IOrderInputTemplateService;
 import com.zhongzheng.modules.pay.domain.PayServe;
 import com.zhongzheng.modules.pay.domain.PaySupply;
 import com.zhongzheng.modules.pay.service.IPayServeService;
@@ -57,8 +59,10 @@ import com.zhongzheng.modules.polyv.service.IPolyvVideoService;
 import com.zhongzheng.modules.system.bo.GoodsCopyEnum;
 import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.domain.SysGoodsCopyRecord;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysGoodsCopyRecordService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserPhoneBo;
 import com.zhongzheng.modules.user.domain.School;
@@ -84,6 +88,7 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 import static java.math.RoundingMode.HALF_UP;
@@ -116,6 +121,8 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Autowired
     private IOrderGoodsService iOrderGoodsService;
 
+    @Autowired
+    private IOrderInputTemplateService iOrderInputTemplateService;
 
     @Autowired
     private ICourseMenuService iCourseMenuService;
@@ -244,9 +251,13 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Autowired
     private IInformRemindService iInformRemindService;
 
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
     @Autowired
     private ISysGoodsCopyRecordService iGoodsCopyRecordService;
 
+
     @Value("${oldStudySys.educationalInspector}")
     private String INFORM_PATH;
 
@@ -339,6 +350,19 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             } else {
                 goods.setExamRecord(0);
             }
+
+            //商品同步新机构时间
+            List<SysGoodsCopyRecord> copyRecords = iSysGoodsCopyRecordService.getGoodsCopy(goods.getGoodsId(),GoodsCopyEnum.GOODS.getType());
+            if (CollectionUtils.isNotEmpty(copyRecords)){
+                Map<Long, List<SysGoodsCopyRecord>> map = copyRecords.stream().collect(Collectors.groupingBy(SysGoodsCopyRecord::getTenantId));
+                List<String> msg = new ArrayList<>();
+                map.forEach((k,v) -> {
+                    SysGoodsCopyRecord record = v.stream().sorted(Comparator.comparing(SysGoodsCopyRecord::getCreateTime).reversed()).collect(Collectors.toList()).stream().findFirst().get();
+                    SysTenant tenant = iSysTenantService.getById(record.getTenantId());
+                    msg.add(String.format("%s【最新同步时间:%s】",tenant.getTenantName(),DateUtils.timestampToDateFormat(record.getCreateTime(),"yyyy-MM-dd HH:mm:ss")));
+                });
+                goods.setCopyTime(msg);
+            }
         });
         //继教二建统计学时
         if (Validator.isNotEmpty(bo.getChapterNum())) {
@@ -493,6 +517,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Override
     @Transactional(rollbackFor = Exception.class)
     public synchronized Boolean insertByAddBo(GoodsAddBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods add = BeanUtil.toBean(bo, Goods.class);
         add.setCode(ServletUtils.getEncoded("SP"));
         validEntityBeforeSave(add);
@@ -541,6 +571,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long insertBankByAddBo(GoodsBankAddBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods add = BeanUtil.toBean(bo, Goods.class);
         add.setCode(ServletUtils.getEncoded("SP"));
         validEntityBeforeSave(add);
@@ -569,6 +605,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateByEditBo(GoodsEditBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods update = BeanUtil.toBean(bo, Goods.class);
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
@@ -593,6 +635,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             }
             iGoodsCourseService.saveBatch(coll);
         }
+
         //购买须知
         if (Validator.isEmpty(bo.getBuyNote())) {
             LambdaUpdateWrapper<Goods> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
@@ -667,6 +710,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateBankByEditBo(GoodsBankEditBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods update = BeanUtil.toBean(bo, Goods.class);
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
@@ -754,6 +803,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Override
     public boolean insertMakeByAddBo(GoodsAddBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods add = BeanUtil.toBean(bo, Goods.class);
         add.setCode(ServletUtils.getEncoded("SP"));
         validEntityBeforeSave(add);
@@ -765,6 +820,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Override
     public boolean updateMakeByEditBo(GoodsEditBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods update = BeanUtil.toBean(bo, Goods.class);
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
@@ -773,6 +834,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Override
     public boolean insertFrontByAddBo(GoodsAddBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods add = BeanUtil.toBean(bo, Goods.class);
         add.setCode(ServletUtils.getEncoded("SP"));
         validEntityBeforeSave(add);
@@ -784,6 +851,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Override
     public boolean updateFrontByEditBo(GoodsEditBo bo) {
+        if (StringUtils.isNotBlank(bo.getExternalLink())){
+            Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
+            if (!pattern.matcher(bo.getExternalLink()).matches()){
+                throw new CustomException("请输入正确的商品外链");
+            }
+        }
         Goods update = BeanUtil.toBean(bo, Goods.class);
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
@@ -1073,6 +1146,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             UserPhoneBo phoneBo = new UserPhoneBo();
             phoneBo.setTelphone(bo.getTelphone());
             phoneBo.setTenantId(tenantId);
+            phoneBo.setIdNum(bo.getIdNum());
             //缓存用户手机号码 30分钟失效
             redisCache.setCacheObjectTenant(tenantId+":"+nowTime, JSONObject.toJSONString(phoneBo), 30, TimeUnit.MINUTES);
 
@@ -1172,12 +1246,19 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         if (ObjectUtils.isNotNull(bo.getTenantId()) && bo.getTenantId().equals(tenantId)){
             domain = "https://web.xyyxt.net/";
             domainH5 = "https://h.xyyxt.net";
+//            domain = "http://192.168.1.222:6002/";
+//            domainH5 = "https://h.xyyxt.net";
         }
         Goods goods = baseMapper.queryGoodsByIdTenant(bo.getGoodsId(), bo.getTenantId());
         if (ObjectUtils.isNull(goods)) {
             throw new CustomException("商品不存在!");
         }
-        User user = iUserService.queryUserByTelphoneTenant(bo.getTelphone(), bo.getTenantId());
+        User user;
+        if (StringUtils.isNotBlank(bo.getIdNum())){
+            user = iUserService.queryUserByIdNumTenant(bo.getIdNum(), bo.getTenantId());
+        }else {
+            user = iUserService.queryUserByTelphoneTenant(bo.getTelphone(), bo.getTenantId());
+        }
         if (ObjectUtils.isNull(user)) {
             throw new CustomException("用户不存在!");
         }
@@ -1223,6 +1304,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         UserPhoneBo phoneBo = new UserPhoneBo();
         phoneBo.setTelphone(user.getTelphone());
         phoneBo.setTenantId(bo.getTenantId());
+        phoneBo.setIdNum(bo.getIdNum());
         log.info(String.format("旧系统获取商品学习中心路径:%s(url),%s(tenantId)",url,bo.getTenantId()));
         //缓存用户手机号码 30分钟失效
         redisCache.setCacheObjectTenant(bo.getTenantId()+":"+nowTime, JSONObject.toJSONString(phoneBo), 30, TimeUnit.MINUTES);
@@ -3288,6 +3370,19 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             }).collect(Collectors.toList());
             iInformRemindService.saveBatch(newInformRemind);
         }
+
+        //下单模板
+        List<OrderInputTemplate> inputTemplateList = iOrderInputTemplateService.list();
+        if (CollectionUtils.isNotEmpty(inputTemplateList)){
+            List<OrderInputTemplate> newTemplateList = inputTemplateList.stream().map(x -> {
+                OrderInputTemplate inputTemplate = BeanUtil.toBean(x, OrderInputTemplate.class);
+                inputTemplate.setId(null);
+                inputTemplate.setTenantId(newTenantId);
+                return inputTemplate;
+            }).collect(Collectors.toList());
+            iOrderInputTemplateService.saveBatch(newTemplateList);
+        }
+
         //保存记录
         iSysGoodsCopyRecordService.saveBatch(copyRecordList);
         return true;
@@ -3854,6 +3949,40 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return goodsList.stream().map(item -> BeanUtil.toBean(item,GoodsVo.class)).collect(Collectors.toList());
     }
 
+    @Override
+    public List<GoodsListAllVo> getUserGoodsListAll(UserGoodsListAllBo bo) {
+        //获取用户购买的商品
+        List<GoodsListAllVo> voList = baseMapper.getUserGoodsListAll(bo);
+        if (CollectionUtils.isEmpty(voList)){
+            return new ArrayList<>();
+        }
+        for (GoodsListAllVo vo : voList) {
+            switch (vo.getGoodsType()){
+                case 1://视频
+                    //商品课程数目
+                    int courseCount = iGoodsCourseService.count(new LambdaQueryWrapper<GoodsCourse>()
+                            .eq(GoodsCourse::getGoodsId, vo.getGoodsId()));
+                    Long sectionNum = 0L;//总节数
+                    if (courseCount > 0){
+                        //获取课程节数量
+                        sectionNum = baseMapper.getSectionNum(vo.getGoodsId());
+                        vo.setGoodsCourseMsg(String.format("%s课程 %s节 %s学时",courseCount,sectionNum,vo.getClassHours()));
+                    }
+                    //学习进度
+                   Long examNum = baseMapper.getCourseExamNum(vo.getGoodsId());
+
+            }
+
+
+        }
+        return null;
+    }
+
+    @Override
+    public Goods getGoodsByIdTenant(Long goodsId, Long tenantId) {
+        return baseMapper.queryGoodsByIdTenant(goodsId,tenantId);
+    }
+
     private Long getNewId(Long oldId, Integer type){
         if (ObjectUtils.isNull(oldId) || oldId <= 0L){
             return null;

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsAttachedVo.java

@@ -84,4 +84,8 @@ public class GoodsAttachedVo {
 	private String code;
 	@ApiModelProperty("试卷类型名称")
 	private String paperName;
+	@ApiModelProperty("外链")
+	private String externalLink;
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
 }

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsListAllVo.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月20日 10:14
+ */
+@Data
+public class GoodsListAllVo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("商品类型:1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+    private Integer goodsType;
+
+    @ApiModelProperty("商品学时")
+    private BigDecimal classHours;
+
+    @ApiModelProperty("商品有效期开始")
+    private Long validityStartTime;
+
+    @ApiModelProperty("商品有效期结束")
+    private Long validityEndTime;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("服务有效期开始")
+    private Long serviceStartTime;
+
+    @ApiModelProperty("服务有效期结束")
+    private Long serviceEndTime;
+
+    @ApiModelProperty("商品课程信息")
+    private String goodsCourseMsg;
+
+    @ApiModelProperty("已学节数")
+    private Long stuAllNum;
+
+    @ApiModelProperty("总节数")
+    private Long secAllNum;
+
+    @ApiModelProperty("学习状态:0.未学习,1.学习中,2已学完")
+    private Integer studyStatus;
+
+    @ApiModelProperty("最后学习信息")
+    private String lastStudyMsg;
+
+    @ApiModelProperty("班级状态:0未开班(预报名) 1开班")
+    private Integer classStatus;
+
+    @ApiModelProperty("班级有效期开始时间")
+    private Long classStartTime;
+
+    @ApiModelProperty("班级有效期结束时间")
+    private Long classEndTime;
+
+    @ApiModelProperty("学时审批状态 0 未通过 1通过 2待审核 -1 不可审核")
+    private Integer periodStatus;
+}

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

@@ -278,4 +278,9 @@ public class GoodsUserQuestionVo {
 
 	@ApiModelProperty("试卷类型集合")
 	private List<ExamPaperVo> paperVos;
+
+	@ApiModelProperty("外链")
+	private String externalLink;
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
 }

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java

@@ -387,5 +387,8 @@ public class GoodsUserVo {
 	private Long sectionMaxNum;
 	@ApiModelProperty("0不限制 2限制整个目录顺序")
 	private Integer goodsLearningOrder;
-
+	@ApiModelProperty("外链")
+	private String externalLink;
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
 }

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

@@ -344,4 +344,12 @@ public class GoodsVo {
 	@ApiModelProperty("是否二建商品:1是 0否")
 	private Integer specialGoods;
 
+	@ApiModelProperty("商品复制时间")
+	private List<String> copyTime;
+
+	@ApiModelProperty("外链")
+	private String externalLink;
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
+
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeBatchQueryBo.java

@@ -32,4 +32,8 @@ public class ClassGradeBatchQueryBo extends BaseEntity {
 	/** 官方班级 */
 	@ApiModelProperty("官方班级名称,多个,拼接")
 	private String officialNameStr;
+
+	/** 官方班级 */
+	@ApiModelProperty("预开班班级编号")
+	private String registerCode;
 }

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeListBo.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.modules.grade.bo;
+
+import com.zhongzheng.common.annotation.Log;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月08日 15:40
+ */
+@Data
+public class ClassGradeListBo implements Serializable {
+
+    private String aliasName;
+
+    private List<Long> subIds;
+
+    private Long tenantId;
+}

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

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月10日 8:50
+ */
+@Data
+public class ClassGradeOpenBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("预开班班级编号")
+    private String registerCode;
+
+    @ApiModelProperty("官方班级编号")
+    private String officialName;
+
+    @ApiModelProperty("开班状态 0未开班(预报名) 1开班")
+    private Integer classStatus;
+
+    @ApiModelProperty("班级有效开始时间")
+    private Long classStartTime;
+
+    @ApiModelProperty("班级有效结束时间")
+    private Long classEndTime;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeOpenUpBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月10日 8:58
+ */
+@Data
+public class ClassGradeOpenUpBo implements Serializable {
+
+    private List<Long> gradeIds;
+
+    private Integer classStatus;
+
+    private String officialName;
+
+    private String registerCode;
+
+    @ApiModelProperty("班级有效开始时间")
+    private Long classStartTime;
+
+    @ApiModelProperty("班级有效结束时间")
+    private Long classEndTime;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+}

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

@@ -145,4 +145,10 @@ public class ClassGradeQueryBo extends BaseEntity {
 	/** 结束时间 */
 	@ApiModelProperty("结束时间")
 	private Long endTime;
+
+	private String businessNameOne;
+
+	private String businessNameTwo;
+
+	private String educationName;
 }

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeSortBo.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.grade.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月09日 9:02
+ */
+@Data
+public class ClassGradeSortBo implements Serializable {
+
+    private Long key;
+
+    private Integer size;
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassNpUserInfoBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月07日 11:50
+ */
+@Data
+public class ClassNpUserInfoBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("班级ID")
+    private String gradeId;
+
+    /** 官方班级 */
+    @ApiModelProperty("官方班级名称")
+    private String officialName;
+
+    @ApiModelProperty("班级编号")
+    private String classNo;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("旧机构ID")
+    private Integer trainOrgId;
+
+    @ApiModelProperty("课程类型id,5二建继教,8二造继教")
+    private Integer platformId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("身份证")
+    private String idNum;
+
+    @ApiModelProperty("手机号")
+    private String mobile;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassOfficialNumBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月08日 11:23
+ */
+@Data
+public class ClassOfficialNumBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("业务层次名称")
+    private String aliasName;
+
+    @ApiModelProperty("专业名称")
+    private String subName;
+
+    @ApiModelProperty("序号")
+    private Integer sortNum;
+}

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

@@ -83,4 +83,10 @@ private static final long serialVersionUID=1L;
     private String gradeCode;
     /** 官方学习地址 */
     private String officialLearningUrl;
+
+    /** 预报名官方编号 */
+    private String registerCode;
+
+    /** 企业ID */
+    private Long tenantId;
 }

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

@@ -37,4 +37,6 @@ public class ClassGradeGoods implements Serializable {
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;
+
+    private Long tenantId;
 }

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

@@ -2,6 +2,9 @@ package com.zhongzheng.modules.grade.mapper;
 
 import com.zhongzheng.modules.grade.domain.ClassGradeGoods;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 班级关联商品Mapper接口
@@ -11,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ClassGradeGoodsMapper extends BaseMapper<ClassGradeGoods> {
 
+    List<ClassGradeGoods> getGradeGoodsList(@Param("goodsId") Long goodsId);
 }

+ 27 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java

@@ -3,14 +3,10 @@ package com.zhongzheng.modules.grade.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
-import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
-import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
+import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.zhongzheng.modules.grade.vo.ClassGradeGoodsVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeStudentVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeUserListVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeVo;
+import com.zhongzheng.modules.grade.vo.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
@@ -62,4 +58,29 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
     Integer queryOfficialGradeCount(ClassGradeQueryBo bo);
 
     List<ClassGradeVo> queryGradeList(ClassGradeQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getClassUserNumByTenant(@Param("gradeId") Long gradeId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassNpUserInfoVo> getGradeDetailByTenant(ClassNpUserInfoBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> getGradeListByTenant(ClassGradeListBo bgListBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<Long> getGoodsIdByBoTenant(ClassGradeListBo bgListBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> queryListByNameTenantId(@Param("className") String className,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGrade> getGradeListByCodeTenant(@Param("registerCode") String registerCode);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void UpGradeStatusByTenant(ClassGradeOpenUpBo openUpBo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void UpGradeCodeByIdTenant(@Param("ids") List<Long> ids);
+
 }

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

@@ -49,4 +49,6 @@ public interface IClassGradeGoodsService extends IService<ClassGradeGoods> {
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<ClassGradeGoods> getGradeGoodsList(Long goodsId);
 }

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

@@ -4,10 +4,7 @@ import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.course.vo.CourseUserEducationTypeVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
-import com.zhongzheng.modules.grade.vo.ClassGradeGoodsVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeStudentVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeUserListVo;
-import com.zhongzheng.modules.grade.vo.ClassGradeVo;
+import com.zhongzheng.modules.grade.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.Collection;
@@ -91,4 +88,16 @@ public interface IClassGradeService extends IService<ClassGrade> {
 	List<ClassGradeVo> queryGradeList(ClassGradeQueryBo bo);
 
 	boolean gradeChangeEjjjPeople(Long businessId,Long gradeId);
+
+	ClassGradeVo getClassGradeVo(Long gradeId);
+
+	List<ClassNpUserInfoVo> officialGradeDetail(ClassNpUserInfoBo bo);
+
+	String getOfficialGradeNum(ClassOfficialNumBo bo);
+
+	List<ClassGrade> getGradeListByTenant(ClassGradeListBo bgListBo);
+
+	void openOfficialGrade(ClassGradeOpenBo bo);
+
+	List<ClassNpUserInfoVo> otherClassUserList(ClassNpUserInfoBo bo);
 }

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

@@ -97,4 +97,9 @@ public class ClassGradeGoodsServiceImpl extends ServiceImpl<ClassGradeGoodsMappe
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public List<ClassGradeGoods> getGradeGoodsList(Long goodsId) {
+        return baseMapper.getGradeGoodsList(goodsId);
+    }
 }

+ 464 - 37
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -19,18 +19,16 @@ import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
 import com.zhongzheng.modules.course.bo.CourseEducationTypeQueryBo;
 import com.zhongzheng.modules.course.bo.CourseProjectTypeQueryBo;
-import com.zhongzheng.modules.course.domain.CourseBusiness;
-import com.zhongzheng.modules.course.domain.CourseEducationType;
-import com.zhongzheng.modules.course.domain.CourseProjectType;
-import com.zhongzheng.modules.course.service.ICourseBusinessService;
-import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
-import com.zhongzheng.modules.course.service.ICourseProjectTypeService;
+import com.zhongzheng.modules.course.domain.*;
+import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
+import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGradeGoods;
 import com.zhongzheng.modules.grade.domain.ClassGradeSys;
+import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
 import com.zhongzheng.modules.grade.service.IClassGradeSysService;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
@@ -41,6 +39,10 @@ import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.order.mapper.OrderMapper;
+import com.zhongzheng.modules.system.domain.SysOldOrg;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysOldOrgService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserUpdateQueryBo;
 import com.zhongzheng.modules.user.domain.*;
@@ -49,6 +51,7 @@ import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import com.zhongzheng.modules.user.service.IUserUpdateService;
 import com.zhongzheng.modules.user.vo.SubjectStudyRecordVo;
 import com.zhongzheng.modules.user.vo.UserVo;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.Header;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.util.EntityUtils;
@@ -71,6 +74,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -87,9 +91,15 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     private IGoodsService iGoodsService;
 
+    @Autowired
+    private ISysTenantService sysTenantService;
+
     @Autowired
     private ICourseEducationTypeService courseEducationTypeService;
 
+    @Autowired
+    private ICourseSubjectService iCourseSubjectService;
+
     @Autowired
     private ICourseProjectTypeService courseProjectTypeService;
 
@@ -132,6 +142,15 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
 
+    @Autowired
+    private IMajorService iMajorService;
+
+    @Autowired
+    private IClassGradeGoodsService iClassGradeGoodsService;
+
+    @Autowired
+    private ISysOldOrgService iSysOldOrgService;
+
     @Autowired
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
 
@@ -144,6 +163,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Value("${oldStudySys.pushGradeCount}")
     private String GRADE_CHANGE_PATH;
 
+    @Value("${oldStudySys.classUserListPath}")
+    private String CLASS_LIST_PATH;
+
+    @Value("${oldStudySys.classOpenPath}")
+    private String CLASS_OPEN_PATH;
+
     @Override
     public ClassGradeVo queryById(Long gradeId) {
         ClassGradeQueryBo classGradeQueryBo = new ClassGradeQueryBo();
@@ -154,7 +179,15 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Override
     @DataScope(businessAlias = "cb")
     public List<ClassGradeVo> queryList(ClassGradeQueryBo bo) {
-        return entity2Vo(baseMapper.queryList(bo));
+        List<ClassGradeVo> classGradeVos = entity2Vo(baseMapper.queryList(bo));
+        if (CollectionUtils.isEmpty(classGradeVos)) {
+            return new ArrayList<>();
+        }
+        classGradeVos.forEach(item -> {
+            //获取班级总人数
+            item.setStudentNumAll(getClassUserNumAll(item.getGradeId()));
+        });
+        return classGradeVos;
     }
 
     @Override
@@ -202,6 +235,51 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         if (CollectionUtils.isNotEmpty(list)) {
             throw new RuntimeException("班级名称不能重复");
         }
+        //是否创建官方班级编号
+        if (bo.getClassGradeGoodsAddBos() != null &&
+                (ObjectUtils.isNull(bo.getClassStatus()) || 0 == bo.getClassStatus())) {
+            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
+            Goods goods = iGoodsService.getById(goodsId);
+            CourseBusiness business = iCourseBusinessService.getById(goods.getBusinessId());
+            if (ObjectUtils.isNotNull(business) && ObjectUtils.isNotNull(business.getTemplateStatus()) && business.getTemplateStatus() == 1){
+                List<CourseSubject> courseSubjectList = iCourseSubjectService.listByIds(Arrays.asList(goods.getSubjectIds().split(",")));
+                List<String> subNames = courseSubjectList.stream().map(CourseSubject::getSubjectName).collect(Collectors.toList());
+                List<Long> subIds = iCourseSubjectService.getIdsByTenant(subNames);
+                //获取业务层次下所有班级
+                ClassGradeListBo bgListBo = new ClassGradeListBo();
+                bgListBo.setAliasName(business.getAliasName());
+                bgListBo.setSubIds(subIds);
+                List<ClassGrade> classGrades = baseMapper.getGradeListByTenant(bgListBo);
+                if (CollectionUtils.isEmpty(classGrades)){
+                    //生成预报名官方编号
+                    add.setOfficialName(ServletUtils.getEncoded("PIY"));
+                    add.setClassStatus(0);
+                }else {
+                    //获取班级创建最多的机构
+                    Map<Long, List<ClassGrade>> map = classGrades.stream().collect(Collectors.groupingBy(ClassGrade::getTenantId));
+                    List<ClassGradeSortBo> sortList = new ArrayList<>();
+                    map.forEach((k,v) -> {
+                        ClassGradeSortBo sortBo = new ClassGradeSortBo();
+                        sortBo.setKey(k);
+                        sortBo.setSize(v.size());
+                        sortList.add(sortBo);
+                    });
+                    ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
+                    List<ClassGrade> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGrade::getCreateTime)).collect(Collectors.toList());
+                    //获取当前机构商品下的班级
+                    List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goodsId);
+                    if(gradeGoods.size() < classGradesMax.size()){
+                        ClassGrade classGrade = classGradesMax.get(gradeGoods.size());
+                        add.setOfficialName(classGrade.getRegisterCode());
+                        add.setClassStatus(0);
+                    }else {
+                        //生成预报名官方编号
+                        add.setOfficialName(ServletUtils.getEncoded("PIY"));
+                        add.setClassStatus(0);
+                    }
+                }
+            }
+        }
         boolean save = this.save(add);
         //添加班级商品
         if (bo.getClassGradeGoodsAddBos() != null) {
@@ -239,6 +317,23 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         ClassGrade update = BeanUtil.toBean(bo, ClassGrade.class);
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
+        //二建和二造班级开班预留预报名编号
+        if (update.getClassStatus() != null && update.getClassStatus().equals(1)) {
+            //二造和二建班级开班校验班级人数(300人)
+            ClassGradeGoods gradeGoods = iClassGradeGoodsService.getOne(new LambdaQueryWrapper<ClassGradeGoods>().eq(ClassGradeGoods::getGradeId,update.getGradeId()));
+            if (ObjectUtils.isNull(gradeGoods)){
+                throw new RuntimeException("班级商品信息查询失败");
+            }
+            Goods goods = iGoodsService.getById(gradeGoods.getGoodsId());
+            if (!checkEjjjPeopleNumLimit(goods.getBusinessId(),update.getGradeId())){
+                throw new RuntimeException("班级人数超过上限,不能开班,请检查!");
+            }
+
+            ClassGrade gradeGrade = getById(update.getGradeId());
+            if (StringUtils.isNotBlank(gradeGrade.getOfficialName())){
+                update.setRegisterCode(gradeGrade.getOfficialName());
+            }
+        }
         if (bo.getStatus() != -1) {
             LambdaQueryWrapper<ClassGrade> lqw = Wrappers.lambdaQuery();
             lqw.eq(ClassGrade::getClassName, update.getClassName());
@@ -262,6 +357,10 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             if (list.size() > 0) {
                 throw new RuntimeException("班级还有学员,无法删除");
             }
+            ClassGrade grade = getById(bo.getGradeId());
+            if (StringUtils.isNotBlank(grade.getOfficialName())){
+                throw new RuntimeException("二建/二造班级无法删除,请联系技术人员!");
+            }
         }
         if (bo.getStatus() == 0) {  //更新为无效
             ClassGradeVo oldGrade = this.queryById(bo.getGradeId());
@@ -273,6 +372,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     throw new RuntimeException("班级还有学员,无法设置为无效");
                 }
             }
+            if (StringUtils.isNotBlank(oldGrade.getOfficialName())){
+                throw new RuntimeException("二建/二造班级无法设置为无效,请联系技术人员!");
+            }
         }
         //更改班主任
         if (bo.getSysUserId() != null) {
@@ -309,7 +411,35 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             classGradeVo.setClassEndTime(update.getClassEndTime());
             sendClassSMS(classGradeVo);
         }
-        return this.updateById(update);
+        this.updateById(update);
+
+        ClassGrade grade = getById(update.getGradeId());
+        if (ObjectUtils.isNotNull(grade) && ObjectUtils.isNotNull(grade.getClassStatus())
+                && StringUtils.isNotBlank(grade.getOfficialName()) && grade.getClassStatus() == 1){
+            //官方班级开班通知旧系统
+            ClassGradeOpenBo openBo = new ClassGradeOpenBo();
+            openBo.setOfficialName(grade.getOfficialName());
+            openBo.setRegisterCode(grade.getRegisterCode());
+            openBo.setClassName(grade.getClassName());
+            openBo.setClassStartTime(grade.getClassStartTime());
+            openBo.setClassEndTime(grade.getClassEndTime());
+            Long nowTime = DateUtils.getNowTime();
+            String sign = ToolsUtils.EncoderByMd5(nowTime.toString()+"pubilc2022");
+            openBo.setSign(sign);
+            openBo.setStamp(nowTime);
+            JSONObject param = JSONObject.parseObject(JSONObject.toJSONString(openBo));
+            String respone = "";
+            try {
+                respone = HttpUtils.sendPost(CLASS_OPEN_PATH, param);
+                log.info("查询旧系统班级开班接口结果" + respone, "");
+                if (!respone.contains("\"Status\":true")) {
+                    throw new CustomException("同步请求错误" + respone);
+                }
+            } catch (Exception e) {
+                throw new CustomException("同步请求错误"+e.getMessage());
+            }
+        }
+        return true;
     }
 
     private void sendClassSMS(ClassGradeVo classGradeVo) {
@@ -378,9 +508,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     }
 
                     //E管证督学通知
-                    if (informRemindVo.getNoteStatus().equals(1) || informRemindVo.getWayStatus().equals(1) || informRemindVo.getGzhTpStatus().equals(1)){
-                        iGoodsService.informOldSys(userId,classGradeVo.getGoodsList().get(0).getGoodsId(),classGradeVo.getOrderGoodsId(),
-                                classGradeVo.getGradeId(),18,content, Arrays.asList(goodsName, startTime ,endTime,content));
+                    if (informRemindVo.getNoteStatus().equals(1) || informRemindVo.getWayStatus().equals(1) || informRemindVo.getGzhTpStatus().equals(1)) {
+                        iGoodsService.informOldSys(userId, classGradeVo.getGoodsList().get(0).getGoodsId(), classGradeVo.getOrderGoodsId(),
+                                classGradeVo.getGradeId(), 18, content, Arrays.asList(goodsName, startTime, endTime, content));
                     }
                 }
             }
@@ -585,9 +715,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         Header[] headers = loginResponse.getHeaders("Set-Cookie");
         try {
             loginHttpResponse = EntityUtils.toString(loginResponse.getEntity());
-        }catch (IOException e) {
+        } catch (IOException e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             // 关闭CloseableHttpResponse
             if (loginResponse != null) {
                 try {
@@ -611,7 +741,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     try {
                         hearders.put("Referer", "https://zjzyk.etledu.com/Student/TrainInfo");
                         getInfoHttpResponse = HttpUtils.postFormBodyHeader(getInfoRequestUrl, paramMap, hearders, headers);
-                    }catch (IOException e) {
+                    } catch (IOException e) {
                         e.printStackTrace();
                     }
                     if (getInfoHttpResponse.contains("{\"success\":true")) {
@@ -637,7 +767,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                         try {
                             hearders.put("Referer", "https://zjzyk.etledu.com/Student/TrainInfo");
                             getProductHttpResponse = HttpUtils.postFormBodyHeader(getProductUrl, paramMap, hearders, headers);
-                        }catch (IOException e) {
+                        } catch (IOException e) {
                             e.printStackTrace();
                         }
                         if (getProductHttpResponse.contains("{\"success\":true")) {
@@ -660,8 +790,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                             paramMap.put("WorkTypeCode", certInfoListItem.getWorkTypeCode());
                             paramMap.put("WorkTypeName", certInfoListItem.getWorkTypeName());
                             paramMap.put("productId", productsItem.getId().toString());
-                            certInfoListItem.getTrainInfos().forEach(trainInfo->{
-                                if (String.valueOf(cal.get(Calendar.YEAR)).equals(trainInfo.getTrainYear())){
+                            certInfoListItem.getTrainInfos().forEach(trainInfo -> {
+                                if (String.valueOf(cal.get(Calendar.YEAR)).equals(trainInfo.getTrainYear())) {
                                     paramMap.put("trainPeriodDate", trainInfo.getTrainStartTime());
                                 }
                             });
@@ -672,7 +802,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                             try {
                                 hearders.put("Referer", "");
                                 sumitHttpResponse = HttpUtils.postFormBodyHeader(sumitRequestUrl, paramMap, hearders, headers);
-                            }catch (IOException e) {
+                            } catch (IOException e) {
                                 e.printStackTrace();
                             }
 
@@ -695,7 +825,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             if (falseCount > 0) {
                 throw new CustomException(falseCount + "个开通失败");
             }
-        }else {
+        } else {
             throw new CustomException("登录官网失败,请检查信息");
         }
 
@@ -719,9 +849,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         CloseableHttpResponse codeResponse = HttpUtils.sendPostHeader(sendCodeUrl, codeJsonObject.toString(), hearders);
         try {
             codeHttpResponse = EntityUtils.toString(codeResponse.getEntity());
-        }catch (IOException e) {
+        } catch (IOException e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             // 关闭CloseableHttpResponse
             if (codeResponse != null) {
                 try {
@@ -757,17 +887,17 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
         businessQueryBo.setId(businessId);
         String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-        if(("继续教育二级建造师".equals(fullName))||("继续教育二级造价师".equals(fullName))){
+        if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
             //继教二建或者继教二造班级
             ClassGradeVo gradeVo = queryById(gradeId);
-            if(Validator.isNotEmpty(gradeVo)&&Validator.isNotEmpty(gradeVo.getOfficialName())){
+            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
                 ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
                 queryBo.setOfficialName(gradeVo.getOfficialName());
                 Integer peopleNum = queryOfficialGradeCount(queryBo);
                 //查询旧系统
                 Map<String, String> params = new HashMap<>();
                 Long nowTime = DateUtils.getNowTime();
-                String sign = ToolsUtils.EncoderByMd5(nowTime.toString()+"pubilc2022");
+                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
                 params.put("stamp", nowTime.toString());
                 params.put("sign", sign);
                 params.put("jsonstr", gradeVo.getOfficialName());
@@ -775,19 +905,19 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 Integer oldGradeNum = 0;
                 try {
                     respone = HttpUtils.postFormBody(GRADE_COUNT_PATH, params);
-                    log.info("查询业务系统班级人数结果"+respone,"");
+                    log.info("查询业务系统班级人数结果" + respone, "");
                     if (!respone.contains("\"Status\":true")) {
-                        throw new CustomException("同步请求错误"+respone);
+                        throw new CustomException("同步请求错误" + respone);
                     }
                     JSONObject jsonObject = (JSONObject) JSONObject.parse(respone);
-                    JSONArray dataArray =  jsonObject.getJSONArray("Data");
+                    JSONArray dataArray = jsonObject.getJSONArray("Data");
                     JSONObject fObject = dataArray.getJSONObject(0);
-                    oldGradeNum = (Integer)fObject.get("num");
+                    oldGradeNum = (Integer) fObject.get("num");
                 } catch (IOException e) {
-                    log.info("查询业务系统班级人数失败参数"+params,"");
-                    throw new CustomException("同步查询班级人数请求错误"+e.getMessage());
+                    log.info("查询业务系统班级人数失败参数" + params, "");
+                    throw new CustomException("同步查询班级人数请求错误" + e.getMessage());
                 }
-                if((peopleNum+oldGradeNum)>=3){ //全系统平台二建班级人数不能超300
+                if ((peopleNum + oldGradeNum) >= 5) { //全系统平台二建班级人数不能超300
                     return false;
                 }
             }
@@ -796,6 +926,47 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return true;
     }
 
+    private Integer getClassUserNumAll(Long gradeId) {
+        Integer numAll = 0;
+        ClassGradeVo gradeVo = queryById(gradeId);
+        if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
+            ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
+            queryBo.setOfficialName(gradeVo.getOfficialName());
+            Integer peopleNum = queryOfficialGradeCount(queryBo);
+            //查询旧系统
+            Map<String, String> params = new HashMap<>();
+            Long nowTime = DateUtils.getNowTime();
+            String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
+            params.put("stamp", nowTime.toString());
+            params.put("sign", sign);
+            params.put("jsonstr", gradeVo.getOfficialName());
+            String respone = "";
+            log.info("查询业务系统班级人数" + params, "");
+            Integer oldGradeNum = 0;
+            try {
+                respone = HttpUtils.postFormBody(GRADE_COUNT_PATH, params);
+                log.info("查询业务系统班级人数结果" + respone, "");
+                if (!respone.contains("\"Status\":true")) {
+                    throw new CustomException("同步请求错误" + respone);
+                }
+                JSONObject jsonObject = (JSONObject) JSONObject.parse(respone);
+                JSONArray dataArray = jsonObject.getJSONArray("Data");
+                JSONObject fObject = dataArray.getJSONObject(0);
+                oldGradeNum = (Integer) fObject.get("num");
+            } catch (IOException e) {
+                log.info("查询业务系统班级人数失败参数" + params, "");
+                throw new CustomException("同步查询班级人数请求错误" + e.getMessage());
+            }
+            numAll = peopleNum + oldGradeNum;
+        }else {
+            Long num = baseMapper.getClassUserNumByTenant(gradeId);
+            if (ObjectUtils.isNotNull(num)){
+                numAll = num.intValue();
+            }
+        }
+        return numAll;
+    }
+
     @Override
     public List<ClassGradeVo> queryGradeList(ClassGradeQueryBo bo) {
         return baseMapper.queryGradeList(bo);
@@ -806,10 +977,10 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
         businessQueryBo.setId(businessId);
         String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-        if(("继续教育二级建造师".equals(fullName))||("继续教育二级造价师".equals(fullName))){
+        if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
             //继教二建或者继教二造班级
             ClassGradeVo gradeVo = queryById(gradeId);
-            if(Validator.isNotEmpty(gradeVo)&&Validator.isNotEmpty(gradeVo.getOfficialName())){
+            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
                 ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
                 queryBo.setOfficialName(gradeVo.getOfficialName());
                 Integer num = queryOfficialGradeCount(queryBo);
@@ -821,19 +992,19 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                 //通知旧系统
                 Map<String, String> params = new HashMap<>();
                 Long nowTime = DateUtils.getNowTime();
-                String sign = ToolsUtils.EncoderByMd5(nowTime.toString()+"pubilc2022");
+                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
                 params.put("stamp", nowTime.toString());
                 params.put("sign", sign);
                 params.put("jsonstr", JSONArray.toJSONString(boList));
                 String respone = "";
                 try {
                     respone = HttpUtils.postFormBody(GRADE_CHANGE_PATH, params);
-                    log.info("同步系统班级人数结果"+respone,"");
+                    log.info("同步系统班级人数结果" + respone, "");
                     if (!respone.contains("\"Status\":true")) {
-                        throw new CustomException("旧系统接口请求错误"+respone);
+                        throw new CustomException("旧系统接口请求错误" + respone);
                     }
                 } catch (IOException e) {
-                    throw new CustomException("旧系统接口请求错误"+e.getMessage());
+                    throw new CustomException("旧系统接口请求错误" + e.getMessage());
                 }
             }
 
@@ -841,6 +1012,262 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return true;
     }
 
+    @Override
+    public ClassGradeVo getClassGradeVo(Long gradeId) {
+        ClassGrade gradeVo = getById(gradeId);
+        if (ObjectUtils.isNull(gradeVo)){
+            return null;
+        }
+        ClassGradeVo vo = BeanUtil.toBean(gradeVo, ClassGradeVo.class);
+        //班级人数
+        Integer count = iClassGradeUserService.count(new LambdaQueryWrapper<ClassGradeUser>()
+                .eq(ClassGradeUser::getGradeId, gradeId)
+                .eq(ClassGradeUser::getStatus, 1));
+        vo.setStudentNum(count);
+        //获取班级总人数
+        vo.setStudentNumAll(getClassUserNumAll(gradeId));
+        return vo;
+    }
+
+    @Override
+    public List<ClassNpUserInfoVo> officialGradeDetail(ClassNpUserInfoBo bo) {
+        List<ClassNpUserInfoVo> result = baseMapper.getGradeDetailByTenant(bo);
+        if (CollectionUtils.isEmpty(result)){
+            return new ArrayList<>();
+        }
+        result.forEach(item -> {
+            String date = "yyyy-MM-dd HH:mm:ss";
+            item.setOrderTime(DateUtils.timestampToDateFormat(item.getOrderTimeLong(),date));
+            item.setCreateTime(DateUtils.timestampToDateFormat(item.getCreateTimeLong(),date));
+            item.setDoTime(DateUtils.timestampToDateFormat(item.getDoTimeLong(),date));
+            //机构名称
+            SysTenant tenant = sysTenantService.getById(item.getTenantId());
+            if (ObjectUtils.isNotNull(tenant)){
+                item.setOrgName(tenant.getTenantName());
+            }
+            //获取学习开始时间和结束时间
+            UserStudyRecord startRecord = iUserStudyRecordService.getStudyRecord(item.getUserId(),item.getGradeId(),"ASC");
+            if (ObjectUtils.isNotNull(startRecord)){
+                item.setBeginTime(DateUtils.timestampToDateFormat(startRecord.getCreateTime(),date));
+                UserStudyRecord endRecord = iUserStudyRecordService.getStudyRecord(item.getUserId(),item.getGradeId(),"DESC");
+                item.setApplyTime(DateUtils.timestampToDateFormat(endRecord.getCreateTime(),date));
+            }
+            //科目名称
+            if(StringUtils.isNotBlank(item.getSubjectIds())){
+                List<CourseSubject> courseSubjectList = iCourseSubjectService.listByIds(Arrays.asList(item.getSubjectIds().split(",")));
+                item.setMajorName(courseSubjectList.stream().filter(x -> StringUtils.isNotBlank(x.getSubjectName())).map(CourseSubject::getSubjectName).collect(Collectors.joining(",")));
+            }
+        });
+        return result;
+    }
+
+    @Override
+    public String getOfficialGradeNum(ClassOfficialNumBo bo) {
+        List<Long> subIds = iCourseSubjectService.getIdsByTenant(Arrays.asList(bo.getSubName()));
+        //获取业务层次下所有班级
+        ClassGradeListBo bgListBo = new ClassGradeListBo();
+        bgListBo.setAliasName(bo.getAliasName());
+        bgListBo.setSubIds(subIds);
+        List<ClassGrade> classGrades = baseMapper.getGradeListByTenant(bgListBo);
+        //祥粤云
+        Long tenantId = 867735392558919680L;
+        bgListBo.setTenantId(tenantId);
+        List<Long> goodsIds = baseMapper.getGoodsIdByBoTenant(bgListBo);
+        if (CollectionUtils.isEmpty(goodsIds)){
+            throw new CustomException("改业务层次下不存在商品,请检查!");
+        }
+        //生成预报名官方编号
+        String encoded = ServletUtils.getEncoded("PIY");
+        if (CollectionUtils.isEmpty(classGrades)){
+            //创建新预报名班级
+            creatClass(goodsIds.get(0),tenantId,encoded);
+        }else {
+            //获取班级创建最多的机构
+            Map<Long, List<ClassGrade>> map = classGrades.stream().collect(Collectors.groupingBy(ClassGrade::getTenantId));
+            List<ClassGradeSortBo> sortList = new ArrayList<>();
+            map.forEach((k,v) -> {
+                ClassGradeSortBo sortBo = new ClassGradeSortBo();
+                sortBo.setKey(k);
+                sortBo.setSize(v.size());
+                sortList.add(sortBo);
+            });
+            ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
+            List<ClassGrade> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGrade::getCreateTime)).collect(Collectors.toList());
+            if(bo.getSortNum() < classGradesMax.size()){
+                ClassGrade classGrade = classGradesMax.get(bo.getSortNum());
+               return classGrade.getOfficialName();
+            }else {
+                //创建新预报名班级
+                creatClass(goodsIds.get(0),tenantId,encoded);
+            }
+        }
+        return encoded;
+    }
+
+    @Override
+    public List<ClassGrade> getGradeListByTenant(ClassGradeListBo bgListBo) {
+        return baseMapper.getGradeListByTenant(bgListBo);
+    }
+
+    @Override
+    public void openOfficialGrade(ClassGradeOpenBo bo) {
+       List<ClassGrade> list = baseMapper.getGradeListByCodeTenant(bo.getRegisterCode());
+       if (CollectionUtils.isEmpty(list)){
+           return;
+       }
+        List<Long> ids = list.stream().map(ClassGrade::getGradeId).collect(Collectors.toList());
+        //保留预报名编号
+        baseMapper.UpGradeCodeByIdTenant(ids);
+
+        ClassGradeOpenUpBo openUpBo = new ClassGradeOpenUpBo();
+        openUpBo.setGradeIds(ids);
+        openUpBo.setClassStatus(bo.getClassStatus());
+        openUpBo.setOfficialName(bo.getOfficialName());
+        openUpBo.setClassName(bo.getClassName());
+        openUpBo.setClassStartTime(bo.getClassStartTime());
+        openUpBo.setClassEndTime(bo.getClassEndTime());
+        baseMapper.UpGradeStatusByTenant(openUpBo);
+    }
+
+    @Override
+    public List<ClassNpUserInfoVo> otherClassUserList(ClassNpUserInfoBo bo) {
+        ClassGrade grade = getById(bo.getGradeId());
+        if (ObjectUtils.isNull(grade) || StringUtils.isBlank(grade.getOfficialName())){
+            throw new CustomException("班级信息有有误,请联系管理员!");
+        }
+        //查询旧机构对应新系统ID
+        if (ObjectUtils.isNotNull(bo.getTrainOrgId())){
+            List<SysOldOrg> list = iSysOldOrgService.list(new LambdaQueryWrapper<SysOldOrg>()
+                    .eq(SysOldOrg::getOrgId, bo.getTrainOrgId())
+                    .eq(SysOldOrg::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(list)){
+                SysOldOrg sysOldOrg = list.get(0);
+                bo.setTenantId(ObjectUtils.isNotNull(sysOldOrg.getTenantId())?sysOldOrg.getTenantId():0L);
+            }else {
+                bo.setTenantId(0L);
+            }
+        }
+        bo.setOfficialName(grade.getOfficialName());
+        //新系统二建/二造班级学员信息
+        List<ClassNpUserInfoVo> result = baseMapper.getGradeDetailByTenant(bo);
+        if (CollectionUtils.isNotEmpty(result)){
+            result.forEach(item -> {
+                String date = "yyyy-MM-dd HH:mm:ss";
+                item.setOrderTime(DateUtils.timestampToDateFormat(item.getOrderTimeLong(),date));
+                item.setCreateTime(DateUtils.timestampToDateFormat(item.getCreateTimeLong(),date));
+                item.setDoTime(DateUtils.timestampToDateFormat(item.getDoTimeLong(),date));
+                //机构名称
+                SysTenant tenant = sysTenantService.getById(item.getTenantId());
+                if (ObjectUtils.isNotNull(tenant)){
+                    item.setOrgName(tenant.getTenantName());
+                }
+                //获取学习开始时间和结束时间
+                UserStudyRecord startRecord = iUserStudyRecordService.getStudyRecord(item.getUserId(),item.getGradeId(),"ASC");
+                if (ObjectUtils.isNotNull(startRecord)){
+                    item.setBeginTime(DateUtils.timestampToDateFormat(startRecord.getCreateTime(),date));
+                    UserStudyRecord endRecord = iUserStudyRecordService.getStudyRecord(item.getUserId(),item.getGradeId(),"DESC");
+                    item.setApplyTime(DateUtils.timestampToDateFormat(endRecord.getCreateTime(),date));
+                }
+                //科目名称
+                if(StringUtils.isNotBlank(item.getSubjectIds())){
+                    List<CourseSubject> courseSubjectList = iCourseSubjectService.listByIds(Arrays.asList(item.getSubjectIds().split(",")));
+                    item.setMajorName(courseSubjectList.stream().filter(x -> StringUtils.isNotBlank(x.getSubjectName())).map(CourseSubject::getSubjectName).collect(Collectors.joining(",")));
+                }
+            });
+        }
+        //旧系统二建/二造班级学员信息
+        bo.setClassNo(bo.getOfficialName());
+//        Map<String, String> params = new HashMap<>();
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(nowTime.toString()+"pubilc2022");
+//        params.put("stamp", nowTime.toString());
+//        params.put("sign", sign);
+//        params.put("jsonstr", JSONObject.toJSONString(bo));
+        bo.setSign(sign);
+        bo.setStamp(nowTime);
+        JSONObject param = JSONObject.parseObject(JSONObject.toJSONString(bo));
+        String respone = "";
+        try {
+            respone = HttpUtils.sendPost(CLASS_LIST_PATH, param);
+            log.info("查询旧系统班级人数结果" + respone, "");
+            if (!respone.contains("\"Status\":true")) {
+                throw new CustomException("同步请求错误" + respone);
+            }
+            JSONObject jsonObject = (JSONObject) JSONObject.parse(respone);
+            JSONArray dataArray = jsonObject.getJSONArray("Message");
+            if (ObjectUtils.isNotNull(dataArray)){
+                List<ClassNpUserInfoVo> voList = JSONArray.parseArray(JSONArray.toJSONString(dataArray), ClassNpUserInfoVo.class);
+                result.addAll(voList);
+            }
+        } catch (Exception e) {
+            throw new CustomException("同步请求错误"+e.getMessage());
+        }
+        return result;
+    }
+
+    //创建预开班班级
+    private void creatClass(Long goodsId,Long tenantId,String code){
+        //创建新班级
+        Goods goods = iGoodsService.getGoodsByIdTenant(goodsId,tenantId);
+        CourseBusiness businessVo = iCourseBusinessService.getBusinessByIdTenant(goods.getBusinessId(),tenantId);
+        boolean isConfigTp = false; //商品是否有配置选班模板
+        if (Validator.isNotEmpty(businessVo) && Validator.isNotEmpty(businessVo.getTemplateStatus()) && businessVo.getTemplateStatus() == 1) {
+            isConfigTp = true;
+        }
+        ClassGrade classGrade = new ClassGrade();
+        classGrade.setCreateTime(DateUtils.getNowTime());
+        if (isConfigTp) {
+            classGrade.setClassStatus(0);
+            classGrade.setLearningStatus(2);//待定
+            classGrade.setStudentUpper(ClassGrade.INIT_UPPER); //上限300
+            //生成官方班级编号
+            classGrade.setOfficialName(code);
+        }
+        classGrade.setUpdateTime(DateUtils.getNowTime());
+        classGrade.setStatus(1);
+        String gradeCode = ServletUtils.getEncoded("BJ");
+        classGrade.setGradeCode(gradeCode);
+//        classGrade.setClassName(goodsName + gradeCode);
+        //班级名称 年份+期数+业务层次(俗名)+教育类型+科目(存在多个科目时,显示多个科目,用“+”分割)
+        String businessName = businessVo.getAliasName();
+        CourseEducationType educationType = courseEducationTypeService.getEducationByIdtenant(goods.getEducationTypeId(),tenantId);
+        String educationName = educationType.getEducationName();
+        String className = businessName + educationName;
+        if (net.polyv.common.v1.util.StringUtils.isNotBlank(goods.getSubjectIds())){
+            ClassGradeListBo bgListBo = new ClassGradeListBo();
+            bgListBo.setSubIds(Arrays.stream(goods.getSubjectIds().split(",")).map(x -> Long.valueOf(x)).collect(Collectors.toList()));
+            bgListBo.setTenantId(tenantId);
+            List<CourseSubject> subjects = iCourseSubjectService.listByIdsTenant(bgListBo);
+            List<String> names = subjects.stream().map(CourseSubject::getSubjectName).collect(Collectors.toList());
+            className = String.format("%s(%s)",className,org.apache.commons.lang3.StringUtils.join(names,'+'));
+        }
+        Integer nameSort = 1;
+        //获取排序值
+        List<ClassGrade> list = baseMapper.queryListByNameTenantId(className,tenantId);
+        if (CollectionUtils.isNotEmpty(list)){
+            List<Integer> collect = list.stream().filter(x -> x.getClassName().contains("第") && x.getClassName().contains("期")).map(item -> {
+                String name = item.getClassName();
+                String substring = name.substring(name.indexOf("第") + 1, name.indexOf("期"));
+                return Integer.parseInt(substring);
+            }).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(collect)){
+                Integer integer = collect.stream().sorted(Comparator.reverseOrder()).findFirst().get();
+                nameSort = integer + 1;
+            }
+        }
+        classGrade.setClassName(String.format("%s年第%s期%s",goods.getYear(),nameSort,className));
+        classGrade.setTenantId(tenantId);
+        save(classGrade);
+        //绑定班级商品
+        ClassGradeGoods classGradeGoods = new ClassGradeGoods();
+        classGradeGoods.setGradeId(classGrade.getGradeId());
+        classGradeGoods.setGoodsId(goodsId);
+        classGradeGoods.setCreateTime(DateUtils.getNowTime());
+        classGradeGoods.setUpdateTime(DateUtils.getNowTime());
+        classGradeGoods.setTenantId(tenantId);
+        iClassGradeGoodsService.save(classGradeGoods);
+    }
+
 
     /**
      * 实体类转化成视图对象

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeVo.java

@@ -134,6 +134,9 @@ public class ClassGradeVo {
 	@ApiModelProperty("学员人数")
 	private Integer studentNum;
 
+	@ApiModelProperty("学员总人数")
+	private Integer studentNumAll;
+
 	/** 学时变为待审核时间 */
 	@Excel(name = "学时变为待审核时间")
 	@ApiModelProperty("学时变为待审核时间")

+ 141 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassNpUserInfoExportVo.java

@@ -0,0 +1,141 @@
+package com.zhongzheng.modules.grade.vo;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月07日 11:44
+ */
+@Data
+public class ClassNpUserInfoExportVo implements Serializable {
+
+    private Long userId;
+
+    private Long gradeId;
+
+    private String subjectIds;
+
+    /// 机构id
+    @ApiModelProperty("机构id")
+    private String tenantId; 
+    
+    /// 机构名称
+    @ApiModelProperty("机构名称")
+    @Excel(name = "平台")
+    private String orgName;
+    
+    /// 班级编号
+    @ApiModelProperty("班级编号")
+    @Excel(name = "班级")
+    private String classNo;
+
+    /// 班级名称
+    @ApiModelProperty("班级名称")
+    private String categoryName;
+    
+    /// 课程类型id,5二建继教,8二造继教
+    private Integer platformId;
+    
+    /// 课程类型名称,二级建造师、二级造价师
+    @ApiModelProperty("项目")
+    @Excel(name = "项目")
+    private String platformName;
+    
+    /// 专业名称
+    @ApiModelProperty("科目")
+    @Excel(name = "专业")
+    private String majorName;
+    
+    /// 姓名
+    @ApiModelProperty("学员姓名")
+    @Excel(name = "学员姓名")
+    private String name;
+
+    /// 姓名
+    @ApiModelProperty("学员单位")
+    @Excel(name = "学员单位")
+    private String companyName;
+    
+    /// 身份证
+    @ApiModelProperty("身份证")
+    @Excel(name = "学员身份证")
+    private String idNum;
+    
+    /// 手机号
+    @ApiModelProperty("手机号")
+    @Excel(name = "学员手机")
+    private String mobile;
+    
+    /// 是否完善必填信息,true是,false否
+    private Boolean isPerfect;
+    
+    /// 是否上报注册中心,1是 0否
+    @ApiModelProperty("是否上报注册中心,1是 0否")
+    private Integer reportStatu;
+
+    public String getReportStatusStr() {
+        return ObjectUtils.isNotNull(this.reportStatu) && this.reportStatu == 1 ? "是":"否" ;
+    }
+
+    @Excel(name = "是否上传中心")
+    private String reportStatusStr;
+    
+    /// 学时申报,1已申报 0未申报
+    @ApiModelProperty("学时申报,1已申报 0未申报")
+    private Integer studyQueueStatus;
+
+    public String getStudyQueueStatusStr() {
+        return ObjectUtils.isNotNull(this.studyQueueStatus) && this.studyQueueStatus == 1 ? "是":"否" ;
+    }
+
+    @Excel(name = "学时是否申报中心")
+    private String studyQueueStatusStr;
+    
+    /// 开通方式,0线下,其他线上
+    private Integer orderId;
+    
+    /// 学习进度,已学学时
+    private Integer studyHours;
+    
+    /// 学习进度,总学时
+    private Integer totalHours;
+    
+    /// 下单时间
+    @ApiModelProperty("下单时间")
+    @Excel(name = "下单时间")
+    private String orderTime;
+
+    /// 下单时间
+    private Long orderTimeLong;
+    
+    /// 购买时间
+    @ApiModelProperty("报名时间")
+    @Excel(name = "报名时间")
+    private String createTime;
+
+    /// 购买时间
+    private Long createTimeLong;
+    
+    /// 上传报名时间
+    @ApiModelProperty("上传报名时间")
+    @Excel(name = "上传报名时间")
+    private String doTime;
+
+    /// 上传报名时间
+    private Long doTimeLong;
+    
+    /// 开始学习时间
+    @ApiModelProperty("开始学习时间")
+    @Excel(name = "学习开始时间")
+    private String beginTime;
+    
+    /// 完成学习时间
+    @ApiModelProperty("完成学习时间")
+    @Excel(name = "学习结束时间")
+    private String applyTime;
+}

+ 112 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassNpUserInfoVo.java

@@ -0,0 +1,112 @@
+package com.zhongzheng.modules.grade.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月07日 11:44
+ */
+@Data
+public class ClassNpUserInfoVo implements Serializable {
+
+    private Long userId;
+
+    private Long gradeId;
+
+    private String subjectIds;
+
+    /// 机构id
+    @ApiModelProperty("机构id")
+    private String tenantId; 
+    
+    /// 机构名称
+    @ApiModelProperty("机构名称")
+    private String orgName;
+    
+    /// 班级编号
+    @ApiModelProperty("班级编号")
+    private String classNo;
+
+    /// 班级名称
+    @ApiModelProperty("班级名称")
+    private String categoryName;
+    
+    /// 课程类型id,5二建继教,8二造继教
+    private Integer platformId;
+    
+    /// 课程类型名称,二级建造师、二级造价师
+    @ApiModelProperty("项目")
+    private String platformName;
+    
+    /// 专业名称
+    @ApiModelProperty("科目")
+    private String majorName;
+    
+    /// 姓名
+    @ApiModelProperty("学员姓名")
+    private String name;
+
+    /// 姓名
+    @ApiModelProperty("学员单位")
+    private String companyName;
+    
+    /// 身份证
+    @ApiModelProperty("身份证")
+    private String idNum;
+    
+    /// 手机号
+    @ApiModelProperty("手机号")
+    private String mobile;
+    
+    /// 是否完善必填信息,true是,false否
+    private Boolean isPerfect;
+    
+    /// 是否上报注册中心,1是 0否
+    @ApiModelProperty("是否上报注册中心,1是 0否")
+    private Integer reportStatu;
+    
+    /// 学时申报,1已申报 0未申报
+    @ApiModelProperty("学时申报,1已申报 0未申报")
+    private Integer studyQueueStatus;
+    
+    /// 开通方式,0线下,其他线上
+    private Integer orderId;
+    
+    /// 学习进度,已学学时
+    private Integer studyHours;
+    
+    /// 学习进度,总学时
+    private Integer totalHours;
+    
+    /// 下单时间
+    @ApiModelProperty("下单时间")
+    private String orderTime;
+
+    /// 下单时间
+    private Long orderTimeLong;
+    
+    /// 购买时间
+    @ApiModelProperty("报名时间")
+    private String createTime;
+
+    /// 购买时间
+    private Long createTimeLong;
+    
+    /// 上传报名时间
+    @ApiModelProperty("上传报名时间")
+    private String doTime;
+
+    /// 上传报名时间
+    private Long doTimeLong;
+    
+    /// 开始学习时间
+    @ApiModelProperty("开始学习时间")
+    private String beginTime;
+    
+    /// 完成学习时间
+    @ApiModelProperty("完成学习时间")
+    private String applyTime;
+}

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java

@@ -93,4 +93,8 @@ public class OrderAddBo {
     private Integer payStatus;
     @ApiModelProperty("公众号页面url")
     private String url;
+    @ApiModelProperty("订单机构标识(旧系统)")
+    private Integer orderOrg;
+    @ApiModelProperty("红包活动码")
+    private String shareActivityCode;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsRefundEditBo.java

@@ -42,6 +42,9 @@ public class OrderGoodsRefundEditBo {
     @ApiModelProperty("退款金额")
     private BigDecimal refundFee;
 
+    @ApiModelProperty("实际退款金额")
+    private BigDecimal realRefundFee;
+
     /** 修改时间 */
     @ApiModelProperty("修改时间")
     private Long updateTime;

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java

@@ -91,8 +91,50 @@ private static final long serialVersionUID=1L;
     private String inputOrderSn;
     /** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
     private Integer payStatus;
+    /** 老业务系统红包活动邀请码 */
+    private String shareActivityCode;
     /** 商户ID*/
     private Long tenantId;
 
+    //订单机构标识:1        祥粤云学堂
+    //2        中正云学堂
+    //3        祥粤云学堂
+    //4        云学堂
+    //5        深圳市农科培训中心
+    //6        九慧培训
+    //7        企帮
+    //8        广州建筑业云学堂
+    //9        昊拓消防
+    //10        广州市监理协会
+    //11        广州市勘察设计云学堂
+    //12        广州市招投标行业云学堂
+    //13        广州市造价行业云学堂
+    //14        中山市政协会云学堂
+    //15        建成教育
+    //16        广东省二级造价师考前培训课程
+    //17        广东邮电职业技术学院
+    //18        广州市市政公路协会云学堂
+    //19        珠海市建协建筑培训中心
+    //20        深圳市地质学会继续教育培训系统
+    //21        东莞市建设培训中心
+    //22        深圳建筑业协会
+    //23        广东省市政行业协会云学堂
+    //24        广东建工云学堂
+    //25        建通业务系统
+    //26        粤建教育
+    //27        佛山市顺德区市政建设工程协会
+    //28        中山市勘设工程咨询有限公司
+    //29        云浮云学堂
+    //30        肇庆云学堂
+    //31        顺德云学堂
+    //32        茂名云学堂
+    //33        南海云学堂
+    //34        东莞云学堂
+    //35        惠州云学堂
+    //36        凯文云学堂
+    //37        山西云学堂
+    //38        晋建云学堂
+    private Integer orderOrg;
+
 
 }

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

@@ -39,6 +39,8 @@ private static final long serialVersionUID=1L;
     private Long goodsId;
     /** 退款金额 */
     private BigDecimal refundFee;
+    /** 实际退款金额 */
+    private BigDecimal realRefundFee;
     /** 添加时间 */
     @TableField(fill = FieldFill.INSERT)
     private Long createTime;

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

@@ -40,4 +40,6 @@ private static final long serialVersionUID=1L;
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;
+
+    private Long tenantId;
 }

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

@@ -1,6 +1,8 @@
 package com.zhongzheng.modules.order.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
+import com.zhongzheng.modules.grade.domain.ClassGrade;
 import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.bo.OrderQueryBo;
 import com.zhongzheng.modules.order.domain.Order;

+ 47 - 14
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsRefundServiceImpl.java

@@ -6,12 +6,15 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.service.IActivityOrderService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
@@ -85,6 +88,8 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
     private IUserService iUserService;
     @Autowired
     private IOrderShareMoneyService iOrderShareMoneyService;
+    @Autowired
+    private IActivityOrderService iActivityOrderService;
     @Value("${oldStudySys.shareCanclePath}")
     private String SHARE_CANCLE_PATH;
 
@@ -156,6 +161,10 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
         if(orderGoods.getRefundStatus()!=0){
             throw new CustomException("订单商品目前无法退款");
         }
+        int count = iActivityOrderService.count(new LambdaQueryWrapper<ActivityOrder>().eq(ActivityOrder::getOrderSn, bo.getOrderSn()).eq(ActivityOrder::getStatus, 1));
+        if (count > 0){
+            throw new CustomException("该订单已参与红包活动,无法退款!");
+        }
         //订单商品
         Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn,bo.getOrderSn()));
         if(order.getStatus()==0){
@@ -215,15 +224,17 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
             add.setOrderGoodsId(orderGoods.getOrderGoodsId());
             this.save(add);
         }
-        Map<String, String> payResult =  iWxPayService.refund(out_trade_no,order.getTransid(),add.getRefundFee(),order.getPayPrice());
-        if("OK".equals(payResult.get("return_msg"))&&Validator.isNotEmpty(payResult.get("refund_id"))){
-            refundCall(payResult.get("refund_id"),add.getRefundId(),orderGoods.getOrderGoodsId(),order,goods.getGoodsType(),orderGoods.getGradeId(),bo.getUserId(),goods.getGoodsId());
-            //关闭C端用户的分销返利
-            shareClientCancelOldSys(order,orderGoods,add.getRefundFee());
-            return true;
-        }else{
-            throw new CustomException("退款错误"+ JSON.toJSONString(payResult));
-        }
+//        Map<String, String> payResult =  iWxPayService.refund(out_trade_no,order.getTransid(),add.getRefundFee(),order.getPayPrice());
+//        if("OK".equals(payResult.get("return_msg"))&&Validator.isNotEmpty(payResult.get("refund_id"))){
+//            refundCall(payResult.get("refund_id"),add.getRefundId(),orderGoods.getOrderGoodsId(),order,goods.getGoodsType(),orderGoods.getGradeId(),bo.getUserId(),goods.getGoodsId());
+//            //关闭C端用户的分销返利
+
+//        shareClientCancelOldSys(order,orderGoods,add.getRefundFee());
+//            return true;
+//        }else{
+//            throw new CustomException("退款错误"+ JSON.toJSONString(payResult));
+//        }
+        return true;
     }
 
     @Override
@@ -473,6 +484,7 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean confirmPeriod(List<OrderGoodsRefundEditBo> bos) {
         for(OrderGoodsRefundEditBo bo : bos){
             if(Validator.isEmpty(bo.getPeriodStatus())||Validator.isEmpty(bo.getRefundId())){
@@ -497,6 +509,10 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
             if(orderGoodsRefund.getPeriodStatus()==3&&bo.getPeriodStatus()==2){
                 throw new CustomException("操作状态错误");
             }
+            if (ObjectUtils.isNull(bo.getRealRefundFee())){
+                //如果实际退款金额为空 则默认全部退款
+                bo.setRealRefundFee(bo.getRefundFee());
+            }
             LambdaUpdateWrapper<OrderGoodsRefund> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(OrderGoodsRefund::getRefundId, bo.getRefundId());
             objectLambdaUpdateWrapper.set(OrderGoodsRefund::getPeriodStatus, bo.getPeriodStatus());
@@ -512,7 +528,8 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
             }
             //上一次是初审状态,本次已退款
             if(orderGoodsRefund.getPeriodStatus()==1&&bo.getPeriodStatus()==3){
-                objectLambdaUpdateWrapper.set(OrderGoodsRefund::getRefundTime,DateUtils.getNowTime());
+                objectLambdaUpdateWrapper.set(OrderGoodsRefund::getRefundTime,DateUtils.getNowTime())
+                .set(OrderGoodsRefund::getRealRefundFee,bo.getRealRefundFee());
             }
             //上一次是初审状态,本次待退款
             if(orderGoodsRefund.getPeriodStatus()==1&&bo.getPeriodStatus()==2){
@@ -529,10 +546,26 @@ public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMap
                 orderGoodsUpdate.setRefundStatus(2); //同意退款
                 orderGoodsUpdate.setUpdateTime(DateUtils.getNowTime());
                 iOrderGoodsService.updateById(orderGoodsUpdate);
-                //清除数据
-                OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>().eq(OrderGoods::getOrderGoodsId,orderGoodsRefund.getOrderGoodsId()));
-                Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,orderGoodsRefund.getGoodsId()));
-                clearData(orderGoods.getGradeId(),orderGoodsRefund.getUserId(),orderGoods.getOrderGoodsId(),orderGoodsRefund.getGoodsId(),goods.getGoodsType());
+                if (ObjectUtils.isNotNull(bo.getType()) && bo.getType() == 1){
+                    //小程序/H5/PC 同意退款处理
+                    Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+                    Map<String, String> payResult =  iWxPayService.refund(bo.getOrderSn(),order.getTransid(),bo.getRealRefundFee(),order.getPayPrice());
+                    if("OK".equals(payResult.get("return_msg"))&&Validator.isNotEmpty(payResult.get("refund_id"))){
+                        OrderGoods orderGoods = iOrderGoodsService.getById(bo.getOrderGoodsId());
+                        Goods goods = iGoodsService.getById(bo.getGoodsId());
+                        refundCall(payResult.get("refund_id"),bo.getRefundId(),orderGoods.getOrderGoodsId(),order,goods.getGoodsType(),orderGoods.getGradeId(),bo.getUserId(),goods.getGoodsId());
+                        //关闭C端用户的分销返利
+                        shareClientCancelOldSys(order,orderGoods,bo.getRealRefundFee());
+                        return true;
+                    }else{
+                        throw new CustomException("退款错误"+ JSON.toJSONString(payResult));
+                    }
+                }else {
+                    //清除数据
+                    OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>().eq(OrderGoods::getOrderGoodsId,orderGoodsRefund.getOrderGoodsId()));
+                    Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,orderGoodsRefund.getGoodsId()));
+                    clearData(orderGoods.getGradeId(),orderGoodsRefund.getUserId(),orderGoods.getOrderGoodsId(),orderGoodsRefund.getGoodsId(),goods.getGoodsType());
+                }
             }
             if(bo.getPeriodStatus()==-2){
                 //修改订单商品退款状态

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

@@ -568,6 +568,8 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                 goodsVo.setClassEndTime(classGradeVo.getClassEndTime());
                 goodsVo.setClassStatus(classGradeVo.getClassStatus());
                 goodsVo.setLearningStatus(classGradeVo.getLearningStatus());
+                goodsVo.setInterfaceAccountId(classGradeVo.getInterfaceAccountId());
+                goodsVo.setLearnStatus(classGradeVo.getLearnStatus());
 
                 LambdaQueryWrapper<UserSubscribe> lq = Wrappers.lambdaQuery();
                 lq.eq(UserSubscribe::getOrderGoodsId, goodsVo.getOrderGoodsId());

+ 60 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -6,17 +6,21 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.core.redis.RedisLockEntity;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.service.IActivityOrderService;
 import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.service.IShoppingCartService;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
+import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseSubject;
 import com.zhongzheng.modules.course.service.ICourseBusinessService;
@@ -35,7 +39,9 @@ import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
 import com.zhongzheng.modules.goods.service.IGoodsCourseService;
 import com.zhongzheng.modules.goods.service.IGoodsFreeBankService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
+import com.zhongzheng.modules.grade.bo.ClassGradeSortBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserTempQueryBo;
 import com.zhongzheng.modules.grade.domain.*;
 import com.zhongzheng.modules.grade.service.IClassGradeGoodsService;
@@ -144,6 +150,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private ICourseSubjectService courseSubjectService;
 
+    @Autowired
+    private IActivityOrderService iActivityOrderService;
+
 
     @Override
     public OrderVo queryById(Long orderId) {
@@ -859,6 +868,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             iOrderPayService.insertByAddBo(payAddBo);
         }
         this.save(add);
+
+        //判断是否红包活动订单
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(add.getShareActivityCode())){
+            ActivityOrder activityOrder = new ActivityOrder();
+            activityOrder.setOrderSn(out_trade_no);
+            activityOrder.setType(1);//分销红包活动
+            activityOrder.setRemark("红包活动订单");
+            activityOrder.setCreateTime(DateUtils.getNowTime());
+            activityOrder.setUpdateTime(DateUtils.getNowTime());
+            activityOrder.setStatus(0);
+            iActivityOrderService.save(activityOrder);
+        }
         //处理免费商品
         for (OrderGoods orderGoods : freeList) {
             dealFreeGoods(orderGoods, add);
@@ -1717,8 +1738,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         ClassGrade classGrade = new ClassGrade();
         classGrade.setCreateTime(DateUtils.getNowTime());
         if (isConfigTp) {
+            classGrade.setClassStatus(0);
             classGrade.setLearningStatus(2);//待定
             classGrade.setStudentUpper(ClassGrade.INIT_UPPER); //上限300
+            //生成预开班编号
+            classGrade.setOfficialName( createGradeCode(goodsId,businessVo));
         } else {
             classGrade.setLearningStatus(1);//即刻
             classGrade.setStudentUpper(ClassGrade.INIT_UPPER2); //上限1000000
@@ -1770,6 +1794,42 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return true;
     }
 
+    private String createGradeCode(Long goodsId,CourseBusinessVo business) {
+        Goods goods = iGoodsService.getById(goodsId);
+        List<CourseSubject> courseSubjectList = courseSubjectService.listByIds(Arrays.asList(goods.getSubjectIds().split(",")));
+        List<String> subNames = courseSubjectList.stream().map(CourseSubject::getSubjectName).collect(Collectors.toList());
+        List<Long> subIds = courseSubjectService.getIdsByTenant(subNames);
+        //获取业务层次下所有班级
+        ClassGradeListBo bgListBo = new ClassGradeListBo();
+        bgListBo.setAliasName(business.getAliasName());
+        bgListBo.setSubIds(subIds);
+        List<ClassGrade> classGrades = iClassGradeService.getGradeListByTenant(bgListBo);
+        if (CollectionUtils.isEmpty(classGrades)) {
+            return ServletUtils.getEncoded("PIY");
+        } else {
+            //获取班级创建最多的机构
+            Map<Long, List<ClassGrade>> map = classGrades.stream().collect(Collectors.groupingBy(ClassGrade::getTenantId));
+            List<ClassGradeSortBo> sortList = new ArrayList<>();
+            map.forEach((k, v) -> {
+                ClassGradeSortBo sortBo = new ClassGradeSortBo();
+                sortBo.setKey(k);
+                sortBo.setSize(v.size());
+                sortList.add(sortBo);
+            });
+            ClassGradeSortBo sortBo = sortList.stream().sorted(Comparator.comparing(ClassGradeSortBo::getSize).reversed()).findFirst().orElse(null);
+            List<ClassGrade> classGradesMax = map.get(sortBo.getKey()).stream().sorted(Comparator.comparing(ClassGrade::getCreateTime)).collect(Collectors.toList());
+            //获取当前机构商品下的班级
+            List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goods.getGoodsId());
+            if (gradeGoods.size() < classGradesMax.size()) {
+                ClassGrade classGrade = classGradesMax.get(gradeGoods.size());
+                return classGrade.getOfficialName();
+            } else {
+                //生成预报名官方编号
+                return ServletUtils.getEncoded("PIY");
+            }
+        }
+    }
+
 
     //选择新的班级
     @Override

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java

@@ -171,7 +171,7 @@ public class OrderGoodsVo {
 	/** 官方账号开通(有接口) */
 	@Excel(name = "官方账号开通(有接口)")
 	@ApiModelProperty("官方账号开通(有接口)")
-	private Integer interfaceAccountId;
+	private Long interfaceAccountId;
 
 	/** 官方信息推送接口 */
 	@Excel(name = "官方信息推送接口")
@@ -326,4 +326,10 @@ public class OrderGoodsVo {
 
 	@ApiModelProperty("内容")
 	private String context;
+
+	@ApiModelProperty("外链")
+	private String externalLink;
+
+	@ApiModelProperty("是否外链商品:0否 1是")
+	private Integer externalLinkStatus;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderListVo.java

@@ -245,4 +245,7 @@ public class OrderListVo {
     @Excel(name = "发票状态 1未开票 2已开票 -1 已退票")
     @ApiModelProperty("发票状态 1未开票 2已开票 -1 已退票")
     private Integer invoiceStatus;
+
+    @ApiModelProperty("审批状态 0 待审核 1初审通过 2复审通过待退款  -1初审不通过 -2复审不通过 3已退款")
+    private Integer periodStatus;
 }

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