yangdamao 2 gadi atpakaļ
vecāks
revīzija
60c451fade
24 mainītis faili ar 611 papildinājumiem un 20 dzēšanām
  1. 20 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSubjectMapper.java
  3. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSubjectService.java
  4. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSubjectServiceImpl.java
  5. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeListBo.java
  6. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeSortBo.java
  7. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassNpUserInfoBo.java
  8. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassOfficialNumBo.java
  9. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/domain/ClassGrade.java
  10. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java
  11. 12 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java
  12. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java
  13. 5 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  14. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java
  15. 200 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  16. 94 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassNpUserInfoVo.java
  17. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  18. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java
  19. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  20. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  21. 10 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseSubjectMapper.xml
  22. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeGoodsMapper.xml
  23. 108 1
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  24. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

+ 20 - 4
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;
@@ -266,6 +264,24 @@ 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("测试分班")
     @GetMapping("common/jzs/grade")
     public AjaxResult<Void> testGrade()

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

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

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

@@ -54,4 +54,6 @@ public interface ICourseSubjectService extends IService<CourseSubject> {
     List<CourseSubjectVo> queryListAll(CourseSubjectQueryBo bo);
 
 	CourseSubject getSubjectByTenant(String encoder, Long newTenantId);
+
+    List<Long> getIdsByTenant(List<String> subNames);
 }

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

@@ -184,4 +184,9 @@ 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);
+    }
 }

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

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

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

@@ -0,0 +1,45 @@
+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("官方班级名称")
+    private String officialName;
+
+    @ApiModelProperty("机构ID")
+    private String tenantId;
+
+    @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;
 }

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

+ 12 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeMapper.java

@@ -3,14 +3,13 @@ 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.ClassGradeListBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
+import com.zhongzheng.modules.grade.bo.ClassNpUserInfoBo;
 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;
@@ -65,4 +64,13 @@ public interface ClassGradeMapper extends BaseMapper<ClassGrade> {
 
     @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);
 }

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

+ 5 - 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;
@@ -93,4 +90,8 @@ public interface IClassGradeService extends IService<ClassGrade> {
 	boolean gradeChangeEjjjPeople(Long businessId,Long gradeId);
 
 	ClassGradeVo getClassGradeVo(Long gradeId);
+
+	List<ClassNpUserInfoVo> officialGradeDetail(ClassNpUserInfoBo bo);
+
+	String getOfficialGradeNum(ClassOfficialNumBo 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);
+    }
 }

+ 200 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -19,13 +19,10 @@ 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.*;
@@ -42,6 +39,8 @@ 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.SysTenant;
+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.*;
@@ -50,6 +49,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;
@@ -88,9 +88,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;
 
@@ -133,6 +139,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     @Autowired
     private ICourseBusinessService iCourseBusinessService;
 
+    @Autowired
+    private IMajorService iMajorService;
+
+    @Autowired
+    private IClassGradeGoodsService iClassGradeGoodsService;
+
     @Autowired
     private com.zhongzheng.modules.alisms.service.IAliSmsService IAliSmsService;
 
@@ -211,6 +223,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.setRegisterCode(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.setRegisterCode(classGrade.getRegisterCode());
+                        add.setClassStatus(0);
+                    }else {
+                        //生成预报名官方编号
+                        add.setRegisterCode(ServletUtils.getEncoded("PIY"));
+                        add.setClassStatus(0);
+                    }
+                }
+            }
+        }
         boolean save = this.save(add);
         //添加班级商品
         if (bo.getClassGradeGoodsAddBos() != null) {
@@ -796,7 +853,7 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                     log.info("查询业务系统班级人数失败参数" + params, "");
                     throw new CustomException("同步查询班级人数请求错误" + e.getMessage());
                 }
-                if ((peopleNum + oldGradeNum) >= 3) { //全系统平台二建班级人数不能超300
+                if ((peopleNum + oldGradeNum) >= 300) { //全系统平台二建班级人数不能超300
                     return false;
                 }
             }
@@ -908,6 +965,142 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         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("改业务层次下不存在商品,请检查!");
+        }
+        ServletUtils.getRequestAttributes().getRequest().setAttribute("TenantId",String.valueOf(tenantId));
+        //生成预报名官方编号
+        String encoded = ServletUtils.getEncoded("PIY");
+        if (CollectionUtils.isEmpty(classGrades)){
+            //创建新预报名班级
+            creatClass(goodsIds.get(0),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.getRegisterCode();
+            }else {
+                //创建新预报名班级
+                creatClass(goodsIds.get(0),encoded);
+            }
+        }
+        return encoded;
+    }
+
+    //创建预开班班级
+    private void creatClass(Long goodsId,String code){
+        //创建新班级
+        Goods goods = iGoodsService.getById(goodsId);
+        CourseBusinessVo businessVo = iCourseBusinessService.queryById(goods.getBusinessId());
+        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.setRegisterCode(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.getById(goods.getEducationTypeId());
+        String educationName = educationType.getEducationName();
+        String className = businessName + educationName;
+        if (net.polyv.common.v1.util.StringUtils.isNotBlank(goods.getSubjectIds())){
+            List<CourseSubject> subjects = iCourseSubjectService.listByIds(Arrays.stream(goods.getSubjectIds().split(",")).collect(Collectors.toList()));
+            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 = list(new LambdaQueryWrapper<ClassGrade>()
+                        .like(ClassGrade::getClassName, className));
+        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));
+
+        save(classGrade);
+        //绑定班级商品
+        ClassGradeGoods classGradeGoods = new ClassGradeGoods();
+        classGradeGoods.setGradeId(classGrade.getGradeId());
+        classGradeGoods.setGoodsId(goodsId);
+        classGradeGoods.setCreateTime(DateUtils.getNowTime());
+        classGradeGoods.setUpdateTime(DateUtils.getNowTime());
+        iClassGradeGoodsService.save(classGradeGoods);
+    }
+
 
     /**
      * 实体类转化成视图对象

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

@@ -0,0 +1,94 @@
+package com.zhongzheng.modules.grade.vo;
+
+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
+    private String tenantId; 
+    
+    /// 机构名称
+    private String orgName;
+    
+    /// 班级编号
+    private String classNo;
+
+    /// 班级名称
+    private String className;
+    
+    /// 课程类型id,5二建继教,8二造继教
+    private Integer platformId;
+    
+    /// 课程类型名称,二级建造师、二级造价师
+    private String platformName;
+    
+    /// 专业名称
+    private String majorName;
+    
+    /// 姓名
+    private String name;
+
+    /// 姓名
+    private String companyName;
+    
+    /// 身份证
+    private String idNum;
+    
+    /// 手机号
+    private String mobile;
+    
+    /// 是否完善必填信息,true是,false否
+    private Boolean isPerfect;
+    
+    /// 是否上报注册中心,1是 0否
+    private Integer reportStatu;
+    
+    /// 学时申报,1已申报 0未申报
+    private Integer studyQueueStatus;
+    
+    /// 开通方式,0线下,其他线上
+    private Integer orderId;
+    
+    /// 学习进度,已学学时
+    private Integer studyHours;
+    
+    /// 学习进度,总学时
+    private Integer totalHours;
+    
+    /// 下单时间
+    private String orderTime;
+
+    /// 下单时间
+    private Long orderTimeLong;
+    
+    /// 购买时间
+    private String createTime;
+
+    /// 购买时间
+    private Long createTimeLong;
+    
+    /// 上传报名时间
+    private String doTime;
+
+    /// 上传报名时间
+    private Long doTimeLong;
+    
+    /// 开始学习时间
+    private String beginTime;
+    
+    /// 完成学习时间
+    private String applyTime;
+}

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

@@ -6,6 +6,7 @@ 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;
@@ -17,6 +18,7 @@ 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;
@@ -1720,6 +1722,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             classGrade.setClassStatus(0);
             classGrade.setLearningStatus(2);//待定
             classGrade.setStudentUpper(ClassGrade.INIT_UPPER); //上限300
+            //生成官方班级编号
+            classGrade.setRegisterCode(ServletUtils.getEncoded("PIY"));
         } else {
             classGrade.setLearningStatus(1);//即刻
             classGrade.setStudentUpper(ClassGrade.INIT_UPPER2); //上限1000000

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

@@ -104,4 +104,7 @@ public interface UserStudyRecordMapper extends BaseMapper<UserStudyRecord> {
     List<CourseStatementVo> getCourseStatement(CourseStatementBo bo);
 
     List<Long> getPeriodIdByQuery(UserStudyRecord bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserStudyRecord getStudyRecord(@Param("userId") Long userId,@Param("gradeId") Long gradeId,@Param("sort") String sort);
 }

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

@@ -136,4 +136,6 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 	 * @return java.util.List<com.zhongzheng.modules.course.bo.UserWatchStatisticsVo>
 	 */
 	List<UserWatchStatisticsVo> getUserWatchStatistics(CourseSectionDetailBo bo);
+
+    UserStudyRecord getStudyRecord(Long userId, Long gradeId, String asc);
 }

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

@@ -860,6 +860,11 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         return result.stream().sorted(Comparator.comparing(UserWatchStatisticsVo::getStartTime).reversed()).collect(Collectors.toList());
     }
 
+    @Override
+    public UserStudyRecord getStudyRecord(Long userId, Long gradeId, String asc) {
+        return baseMapper.getStudyRecord(userId, gradeId, asc);
+    }
+
 
     /**
      * 获取最后一次看完的节

+ 10 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/CourseSubjectMapper.xml

@@ -133,4 +133,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getSubjectByTenant" parameterType="map"  resultType="com.zhongzheng.modules.course.domain.CourseSubject">
         select * from course_subject where encoder = #{encoder} and tenant_id = #{newTenantId}
     </select>
+
+    <select id="getIdsByTenant" parameterType="java.lang.String"  resultType="java.lang.Long">
+        select id from course_subject where `status` = 1
+        <if test="subNames != null and subNames.size()!=0 ">
+            AND subject_name in
+            <foreach collection="subNames" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+    </select>
 </mapper>

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

@@ -11,5 +11,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime" column="update_time"/>
     </resultMap>
 
+    <select id="getGradeGoodsList" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.grade.domain.ClassGradeGoods">
+        SELECT cgg.* FROM class_grade_goods cgg INNER JOIN class_grade cg ON cgg.grade_id = cg.grade_id WHERE cgg.goods_id = #{goodsId} AND cg.`status` = 1
+    </select>
 
 </mapper>

+ 108 - 1
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -861,7 +861,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and g.business_id = #{businessId}
     </select>
 
-    <select id="queryOfficialGradeCount" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeQueryBo" resultType="Integer">
+        <select id="queryOfficialGradeCount" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeQueryBo" resultType="Integer">
         SELECT
             ((
                  SELECT
@@ -902,4 +902,111 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM
             ( SELECT COUNT( user_id ) AS num FROM class_grade_user WHERE grade_id = #{gradeId} AND `status` = 1 AND change_grade = 0 GROUP BY user_id ) a
     </select>
+
+    <select id="getGradeDetailByTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassNpUserInfoBo" resultType="com.zhongzheng.modules.grade.vo.ClassNpUserInfoVo">
+        SELECT
+            CONCAT('',cg.tenant_id) as tenantId,
+            cg.official_name as classNo,
+            cb.alias_name as platformName,
+            cg.class_name as className,
+            u.realname as `name`,
+            u.id_card as idNum,
+            u.telphone as mobile,
+            u.company_name as companyName,
+            og.create_time as orderTimeLong,
+            cg.class_start_time as createTimeLong,
+            cgu.official_status_time as doTimeLong,
+            cgu.official_status as reportStatu,
+            cgu.period_plush as studyQueueStatus,
+            u.user_id,
+            cg.grade_id,
+            g.subject_ids
+        FROM class_grade cg
+                 LEFT JOIN class_grade_user cgu ON cg.grade_id = cgu.grade_id
+                <if test="tenantId != null and tenantId !=''">
+                    AND cgu.tenant_id = #{tenantId}
+                </if>
+                 LEFT JOIN class_grade_goods cgg ON cg.grade_id = cgg.grade_id
+                <if test="tenantId != null and tenantId !=''">
+                    AND cgg.tenant_id = #{tenantId}
+                </if>
+                 LEFT JOIN `user` u ON cgu.user_id = u.user_id
+                <if test="tenantId != null and tenantId !=''">
+                    AND u.tenant_id = #{tenantId}
+                </if>
+                 LEFT JOIN goods g ON cgg.goods_id = g.goods_id
+                <if test="tenantId != null and tenantId !=''">
+                    AND g.tenant_id = #{tenantId}
+                </if>
+                LEFT JOIN order_goods og ON cg.grade_id = og.grade_id
+                <if test="tenantId != null and tenantId !=''">
+                    AND og.tenant_id = #{tenantId}
+                </if>
+                 LEFT JOIN course_business cb ON g.business_id = cb.id
+                <if test="tenantId != null and tenantId !=''">
+                    AND cb.tenant_id = #{tenantId}
+                </if>
+        WHERE 1 = 1
+        <if test="officialName != null and officialName !=''">
+            AND cg.official_name = #{officialName}
+        </if>
+        <if test="tenantId != null and tenantId !=''">
+            AND cg.tenant_id = #{tenantId}
+        </if>
+        <if test="name != null and name !=''">
+            AND u.realname like concat('%', #{name}, '%')
+        </if>
+        <if test="idNum != null and idNum !=''">
+            AND u.id_card like concat('%', #{idNum}, '%')
+        </if>
+        <if test="mobile != null and mobile !=''">
+            AND u.telphone like concat('%', #{mobile}, '%')
+        </if>
+    </select>
+
+    <select id="getGradeListByTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeListBo" resultType="com.zhongzheng.modules.grade.domain.ClassGrade">
+        SELECT
+            cg.*
+        FROM
+            class_grade cg
+            LEFT JOIN class_grade_goods cgg ON cg.grade_id = cgg.grade_id
+            LEFT JOIN goods g ON cgg.goods_id = g.goods_id
+            LEFT JOIN course_business cb ON g.business_id = cb.id
+        WHERE
+            cb.alias_name = #{aliasName} AND cg.class_status = 0 AND cg.`status` = 1
+        <if test="subIds != null and subIds.size()!=0 ">
+            AND (
+            <foreach collection="subIds" item="id" index="index">
+                <if test="index != subIds.size()-1">
+                    FIND_IN_SET(g.subject_ids,#{id}) OR
+                </if>
+                <if test="index == subIds.size()-1">
+                    FIND_IN_SET(g.subject_ids,#{id})
+                </if>
+            </foreach>
+                )
+        </if>
+    </select>
+
+    <select id="getGoodsIdByBoTenant" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeListBo" resultType="java.lang.Long">
+        SELECT
+        g.goods_id
+        FROM
+            goods g
+            LEFT JOIN course_business cb ON g.business_id = cb.id AND cb.tenant_id = #{tenantId}
+        WHERE
+        cb.alias_name = #{aliasName} AND g.`status` = 1 AND g.tenant_id = #{tenantId}
+        <if test="subIds != null and subIds.size()!=0 ">
+            AND (
+            <foreach collection="subIds" item="id" index="index">
+                <if test="index != subIds.size()-1">
+                    FIND_IN_SET(g.subject_ids,#{id}) OR
+                </if>
+                <if test="index == subIds.size()-1">
+                    FIND_IN_SET(g.subject_ids,#{id})
+                </if>
+            </foreach>
+            )
+        </if>
+    </select>
 </mapper>

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

@@ -1569,4 +1569,7 @@
           AND current_status = 1
     </select>
 
+    <select id="getStudyRecord" parameterType="map" resultType="com.zhongzheng.modules.user.domain.UserStudyRecord">
+        SELECT * FROM user_study_record WHERE user_id = #{userId} AND grade_id = #{gradeId} ORDER BY create_time ${sort} LIMIT 1
+    </select>
 </mapper>