yangdamao hai 1 semana
pai
achega
e9d6f47f2b
Modificáronse 35 ficheiros con 1570 adicións e 20 borrados
  1. 2 2
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  2. 9 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java
  3. 28 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  4. 2 2
      zhongzheng-api/src/main/resources/application-prod.yml
  5. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ArtisanCheck.java
  6. 35 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ArtisanData.java
  7. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ArtisanCheckMapper.java
  8. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ArtisanDataMapper.java
  9. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IArtisanCheckService.java
  10. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IArtisanDataService.java
  11. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ArtisanCheckServiceImpl.java
  12. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ArtisanDataServiceImpl.java
  13. 48 11
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  14. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/CourseSubjectMapper.java
  15. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java
  16. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseSubjectService.java
  17. 180 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  18. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSubjectServiceImpl.java
  19. 5 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  20. 78 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/AssistantCheckBo.java
  21. 78 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/EngineerCheckBo.java
  22. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  23. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java
  24. 60 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/TechnicianCheckBo.java
  25. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/WorkExperienceBo.java
  26. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  27. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsService.java
  28. 793 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  29. 11 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  30. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/AssistantCheckVo.java
  31. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/AssistantResultVo.java
  32. 8 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderListVo.java
  33. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysUserMapper.java
  34. 11 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseSubjectMapper.xml
  35. 6 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

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

@@ -142,8 +142,8 @@ officialPush:
     periodPath: https://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: GDSXY
     token: 01b5d9833987efdff54483cdc9720da6
-    sevenInfoPath: http://sgry.gdcic.net/organjxjy/ShangBaoMingdan
-    sevenPeriodPath: http://sgry.gdcic.net/organjxjy/XueshiShenqing
+    sevenInfoPath: https://sgry.gdcic.net/organjxjy/ShangBaoMingdan
+    sevenPeriodPath: https://sgry.gdcic.net/organjxjy/XueshiShenqing
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData

+ 9 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -284,4 +284,13 @@ public class CourseController extends BaseController {
         return AjaxResult.success(result);
     }
 
+    @ApiOperation("七大员视频导入")
+    @PostMapping("/importQDY")
+    public AjaxResult<Map<String,Object>> importQDY(MultipartFile file,String param) throws Exception
+    {
+        List<CourseEJVo> questionList2 = EasyPoiUtil.importExcel(file,0,1,CourseEJVo.class);
+        Map<String,Object> result = iCourseService.importQDY(questionList2,param);
+        return AjaxResult.success(result);
+    }
+
 }

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

@@ -291,4 +291,32 @@ public class OrderController extends BaseController {
         return AjaxResult.success(iOrderGoodsService.checkBuyGoods(goodsId));
     }
 
+    @ApiOperation("助理工程师")
+    @PostMapping("/assistant/check")
+    public AjaxResult<AssistantResultVo> assistantCheck(@RequestBody AssistantCheckBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iOrderGoodsService.assistantCheck(bo,loginUser.getUser().getUserId()));
+    }
+
+    @ApiOperation("技术员校验")
+    @PostMapping("/technician/check")
+    public AjaxResult<AssistantResultVo> technicianCheck(@RequestBody TechnicianCheckBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iOrderGoodsService.technicianCheck(bo,loginUser.getUser().getUserId()));
+    }
+
+    @ApiOperation("中级工程师")
+    @PostMapping("/engineer/intermediate/check")
+    public AjaxResult<AssistantResultVo> engineerIntermediateCheck(@RequestBody EngineerCheckBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iOrderGoodsService.engineerIntermediateCheck(bo,loginUser.getUser().getUserId()));
+    }
+
+    @ApiOperation("高级工程师")
+    @PostMapping("/engineer/advanced/check")
+    public AjaxResult<AssistantResultVo> engineerAdvancedCheck(@RequestBody EngineerCheckBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iOrderGoodsService.engineerAdvancedCheck(bo,loginUser.getUser().getUserId()));
+    }
+
 }

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

@@ -154,8 +154,8 @@ officialPush:
     periodPath: https://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: GDSXY
     token: 01b5d9833987efdff54483cdc9720da6
-    sevenInfoPath: http://sgry.gdcic.net/organjxjy/ShangBaoMingdan
-    sevenPeriodPath: http://sgry.gdcic.net/organjxjy/XueshiShenqing
+    sevenInfoPath: https://sgry.gdcic.net/organjxjy/ShangBaoMingdan
+    sevenPeriodPath: https://sgry.gdcic.net/organjxjy/XueshiShenqing
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ArtisanCheck.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.activity.domain;
+
+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;
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("artisan_check")
+public class ArtisanCheck implements Serializable {
+
+    @TableId(value = "id")
+    private Long id;
+    /** 类型:1技术员 2助力工程师 3工程师 4高级工程师 */
+    private Integer type;
+    /** 专业 */
+    private String major;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    /** 商户ID */
+    private Long tenantId;
+}

+ 35 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ArtisanData.java

@@ -0,0 +1,35 @@
+package com.zhongzheng.modules.activity.domain;
+
+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;
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("artisan_data")
+public class ArtisanData implements Serializable {
+
+    @TableId(value = "id")
+    private Long id;
+    /** 用户id */
+    private Long userId;
+    /** 课程ID */
+    private Long goodsId;
+    /** 专业名称 */
+    private String majorName;
+    /** 填写资料 */
+    private String dataStr;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    /** 商户ID */
+    private Long tenantId;
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ArtisanCheckMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.activity.domain.ArtisanCheck;
+
+/**
+ * 商品推荐Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface ArtisanCheckMapper extends BaseMapper<ArtisanCheck> {
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ArtisanDataMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.activity.domain.ArtisanCheck;
+import com.zhongzheng.modules.activity.domain.ArtisanData;
+
+/**
+ * 商品推荐Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface ArtisanDataMapper extends BaseMapper<ArtisanData> {
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IArtisanCheckService.java

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

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IArtisanDataService.java

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

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ArtisanCheckServiceImpl.java

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

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ArtisanDataServiceImpl.java

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

+ 48 - 11
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -4309,9 +4309,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 List<QuestionImportV4> questionImportV = questionList2.subList(i, i + a);
                 //第一个是内容
                 QuestionImportV4 v4 = questionImportV.get(0);
-                question.setContent(v4.getQuestionName());
+                question.setContent(questionImage(v4.getQuestionName()));
                 question.setType(1);
-                question.setAnswerQuestion(v4.getDescribe());
+                question.setAnalysisContent(v4.getDescribe());
                 question.setCode(ServletUtils.getEncoded("TM"));
                 //正确选项
                 Integer index = 0;
@@ -4334,9 +4334,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 List<QuestionImportV4> questionImportV1 = questionList2.subList(i, i + a);
                 //第一个是内容
                 QuestionImportV4 v41 = questionImportV1.get(0);
-                question.setContent(v41.getQuestionName());
+                question.setContent(questionImage(v41.getQuestionName()));
                 question.setType(2);
-                question.setAnswerQuestion(v41.getDescribe());
+                question.setAnalysisContent(v41.getDescribe());
                 //正确选项
                 List<Integer> index1 = new ArrayList<>();
                 //转换单选选项
@@ -4358,9 +4358,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 List<QuestionImportV4> questionImportV2 = questionList2.subList(i, i + a);
                 //第一个是内容
                 QuestionImportV4 v42 = questionImportV2.get(0);
-                question.setContent(v42.getQuestionName());
+                question.setContent(questionImage(v42.getQuestionName()));
                 question.setType(3);
-                question.setAnswerQuestion(v42.getDescribe());
+                question.setAnalysisContent(v42.getDescribe());
                 //正确选项
                 Integer index2 = 0;
                 //转换单选选项
@@ -4376,9 +4376,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 List<QuestionImportV4> questionImportV3 = questionList2.subList(i, i + a);
                 //第一个是内容
                 QuestionImportV4 v42 = questionImportV3.get(0);
-                question.setContent(v42.getQuestionName());
+                question.setContent(questionImage(v42.getQuestionName()));
                 question.setType(4);
-                question.setAnswerQuestion(v42.getDescribe());
+                question.setAnalysisContent(v42.getDescribe());
                 //截取案例题小题
                 List<QuestionImportV4> vv = new ArrayList<>();
                 for (int i1 = i+1; i1 < questionList2.size(); i1++) {
@@ -4400,7 +4400,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             List<QuestionImportV4> questionImportV5 = vv.subList(i1, i1 + y);
                             QuestionImportV4 questionImportV42 = questionImportV5.get(0);
                             QuestionInfoVo questionInfoVo = new QuestionInfoVo();
-                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setContent(questionImage(questionImportV42.getQuestionName()));
                             questionInfoVo.setType(1);
                             //正确选项
                             Integer index = 0;
@@ -4426,7 +4426,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             List<QuestionImportV4> questionImportV6 = vv.subList(i1, i1 + y);
                             QuestionImportV4 questionImportV42 = questionImportV6.get(0);
                             QuestionInfoVo questionInfoVo = new QuestionInfoVo();
-                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setContent(questionImage(questionImportV42.getQuestionName()));
                             questionInfoVo.setType(2);
                             //正确选项
                             List<Integer> index = new ArrayList<>();
@@ -4452,7 +4452,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                             List<QuestionImportV4> questionImportV7 = vv.subList(i1, i1 + y);
                             QuestionImportV4 questionImportV42 = questionImportV7.get(0);
                             QuestionInfoVo questionInfoVo = new QuestionInfoVo();
-                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setContent(questionImage(questionImportV42.getQuestionName()));
                             questionInfoVo.setType(3);
                             //正确选项
                             Integer index2 = 0;
@@ -4501,6 +4501,43 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return Collections.emptyMap();
     }
 
+    private String questionImage(String question){
+        //图片转换
+        Pattern pattern = Pattern.compile("src='(.*?)'");
+        Matcher matcher = pattern.matcher(question);
+        if (matcher.find()) {
+            String imagePath = matcher.group(1);
+            //下载图片
+            String ossPath = "";
+            //上传oss图片
+            try {
+                URL url = new URL(imagePath);
+                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+                connection.setRequestMethod("GET");
+                connection.setConnectTimeout(5000);
+                connection.setReadTimeout(5000);
+
+                // 检查响应码
+                int responseCode = connection.getResponseCode();
+                if (responseCode == HttpURLConnection.HTTP_OK) {
+                    try (InputStream inputStream = connection.getInputStream()) {
+                        String s = ossService.uploadInputStream(inputStream,6);
+                        ossPath = ossHost + "/" + s;
+
+                    }
+                }
+                connection.disconnect();
+                if (StringUtils.isNotBlank(ossPath)){
+                    String updatedHtml = question.replaceAll("src='.*?'", "src='" +ossPath+ "'");
+                    return updatedHtml;
+                }
+            } catch (Exception e) {
+                throw new CustomException("oss图片上传失败");
+            }
+        }
+        return question;
+    }
+
     @Override
     public Map<String, Object> importImage(List<QuestionImageVo> questionList2) {
         if (CollectionUtils.isEmpty(questionList2)){

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

@@ -43,4 +43,6 @@ public interface CourseSubjectMapper extends BaseMapper<CourseSubject> {
     List<CourseSubject> getListByIDs(@Param("ids") List<Long> ids);
 
     CourseSubject getOneByName(@Param("subjectName") String subjectName,@Param("proId") Long proId);
+
+    List<CourseSubject> listByProId(@Param("proId") Long proId);
 }

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

@@ -116,4 +116,6 @@ public interface ICourseService extends IService<Course> {
 	UserNewGoodsVo getOldGoodsRedirect(Long userId);
 
 	Map<String, Object> importEJ(List<CourseEJVo> questionList2, String param);
+
+    Map<String, Object> importQDY(List<CourseEJVo> questionList2, String param);
 }

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

@@ -65,4 +65,6 @@ public interface ICourseSubjectService extends IService<CourseSubject> {
     List<CourseSubject> getListByIDs(List<Long> ids);
 
 	CourseSubject getOneByName(String subjectName, Long id);
+
+    List<CourseSubject> listByProId(Long id);
 }

+ 180 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -1459,6 +1459,186 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return Collections.emptyMap();
     }
 
+    @Override
+    public Map<String, Object> importQDY(List<CourseEJVo> questionList2, String param) {
+        if (CollectionUtils.isEmpty(questionList2)){
+            return new HashMap<>();
+        }
+        //获取业务层次ID
+        CourseJsonEJVo importVo = JSON.parseObject(param, CourseJsonEJVo.class);
+        CourseEducationType educationType = iCourseEducationTypeService
+                .getOne(new LambdaQueryWrapper<CourseEducationType>()
+                        .eq(CourseEducationType::getEducationName, importVo.getEduName())
+                        .eq(CourseEducationType::getStatus, 1)
+                        .last("limit 1"));
+        CourseProjectType projectType = iCourseProjectTypeService.getOne(new LambdaUpdateWrapper<CourseProjectType>()
+                .eq(CourseProjectType::getEducationId, educationType.getId())
+                .eq(CourseProjectType::getProjectName, importVo.getProName())
+                .eq(CourseProjectType::getStatus, 1)
+                .last("limit 1"));
+        CourseBusiness business = iCourseBusinessService.getOne(new LambdaUpdateWrapper<CourseBusiness>()
+                .eq(CourseBusiness::getProjectId, projectType.getId())
+                .eq(CourseBusiness::getBusinessName, importVo.getBusinessName())
+                .eq(CourseBusiness::getStatus, 1)
+                .last("limit 1"));
+        List<CourseSubject> courseSubjects = new ArrayList<>();
+
+        //默认图片地址
+        String imagePath = "oss/images/avatar/20211013/1634097664410_1397766697";
+        CourseEJVo vo1 = questionList2.stream().filter(x -> x.getLevel().equals("1")).collect(Collectors.toList()).get(0);
+        if (ObjectUtils.isNull(vo1)){
+            throw new CustomException("模块获取失败");
+        }
+        //是否公共模块
+        Integer falg = vo1.getChapterName().contains("公共课")?1:0;
+        if (falg == 1){
+            //公共课包含所有科目
+            courseSubjects = iCourseSubjectService.listByProId(projectType.getId());
+        }else {
+            courseSubjects.add(iCourseSubjectService.getOneByName(importVo.getSubName(),projectType.getId()));
+        }
+        //新增课程模块
+        CourseModule module = new CourseModule();
+        module.setPrefixName("2026七大员继教");
+        module.setModuleName(vo1.getChapterName());
+        module.setPublishStatus(1L);
+        module.setCreateTime(DateUtils.getNowTime());
+        module.setUpdateTime(DateUtils.getNowTime());
+        module.setStatus(1);
+        module.setCode(ServletUtils.getEncoded("MK"));
+        module.setCommonSign(falg);
+        module.setViewSign(2);
+        module.setCoverUrl(imagePath);
+        iCourseModuleService.save(module);
+
+        //模块业务层次
+        courseSubjects.forEach(item ->{
+            CourseModuleBusiness moduleBusiness = new CourseModuleBusiness();
+            moduleBusiness.setModuleId(module.getModuleId());
+            moduleBusiness.setEducationTypeId(educationType.getId());
+            moduleBusiness.setProjectId(projectType.getId());
+            moduleBusiness.setBusinessId(business.getId());
+            moduleBusiness.setSubjectId(item.getId());
+            iCourseModuleBusinessService.save(moduleBusiness);
+        });
+
+
+        //根据章节名称分组
+        Map<String, List<CourseEJVo>> map = questionList2.stream().collect(Collectors.groupingBy(CourseEJVo::getChapterName));
+
+        // 使用 AtomicInteger 实现自增
+        AtomicInteger counter = new AtomicInteger(1);
+        map.forEach((k,v) -> {
+            CourseEJVo vo2 = v.get(0);
+            if (vo2.getLevel().equals("1")){
+                return;
+            }
+            int a = counter.getAndIncrement();
+            //新增章
+            CourseChapter chapter = new CourseChapter();
+            chapter.setName(k);
+            chapter.setSort(Long.valueOf(a));
+            chapter.setCreateTime(DateUtils.getNowTime());
+            chapter.setUpdateTime(DateUtils.getNowTime());
+            chapter.setStatus(1);
+            chapter.setPrefixName("2026七大员继教");
+            chapter.setPublishStatus(1L);
+            chapter.setCode(ServletUtils.getEncoded("Z"));
+            chapter.setCommonSign(falg+"");
+            chapter.setViewSign(2);
+            chapter.setCoverUrl(imagePath);
+            iCourseChapterService.save(chapter);
+
+            //章业务层
+            if (falg == 1){
+                //公共课包含所有科目
+                List<CourseSubject> courseSubjects1 = iCourseSubjectService.listByProId(projectType.getId());
+                courseSubjects1.forEach(item -> {
+                    CourseChapterBusiness chapterBusiness = new CourseChapterBusiness();
+                    chapterBusiness.setChapterId(chapter.getChapterId());
+                    chapterBusiness.setEducationTypeId(educationType.getId());
+                    chapterBusiness.setProjectId(projectType.getId());
+                    chapterBusiness.setBusinessId(business.getId());
+                    chapterBusiness.setSubjectId(item.getId());
+                    iCourseChapterBusinessService.save(chapterBusiness);
+                });
+            }else {
+                CourseSubject oneByName = iCourseSubjectService.getOneByName(importVo.getSubName(), projectType.getId());
+                CourseChapterBusiness chapterBusiness = new CourseChapterBusiness();
+                chapterBusiness.setChapterId(chapter.getChapterId());
+                chapterBusiness.setEducationTypeId(educationType.getId());
+                chapterBusiness.setProjectId(projectType.getId());
+                chapterBusiness.setBusinessId(business.getId());
+                chapterBusiness.setSubjectId(oneByName.getId());
+                iCourseChapterBusinessService.save(chapterBusiness);
+            }
+
+            //处理视频节
+            for (int i = 0; i < v.size(); i++) {
+                CourseEJVo vo = v.get(i);
+                if (vo.getLevel().equals("3")){
+                    CourseSection section = new CourseSection();
+                    section.setName(vo.getSectionName());
+                    section.setCreateTime(DateUtils.getNowTime());
+                    section.setUpdateTime(DateUtils.getNowTime());
+                    section.setStatus(1);
+                    section.setSort(i+1L);
+                    section.setPrefixName("2026七大员继教");
+                    section.setPublishStatus(1);
+                    section.setSectionType(1);
+                    section.setRecordingUrl(vo.getSectionKey());
+                    section.setTencentVideoUrl(vo.getSectionKey());
+                    section.setDurationTime(Long.valueOf(vo.getSectionTime()));
+                    section.setTencentVideoTime(Long.valueOf(vo.getSectionTime()));
+                    section.setCode(ServletUtils.getEncoded("J"));
+                    section.setViewSign(2);
+                    section.setCoverUrl(imagePath);
+                    iCourseSectionService.save(section);
+
+                    //节业务层
+                    if (falg == 1){
+                        //公共课包含所有科目
+                        List<CourseSubject> courseSubjects1 = iCourseSubjectService.listByProId(projectType.getId());
+                        courseSubjects1.forEach(item -> {
+                            CourseSectionBusiness sectionBusiness = new CourseSectionBusiness();
+                            sectionBusiness.setSectionId(section.getSectionId());
+                            sectionBusiness.setEducationTypeId(educationType.getId());
+                            sectionBusiness.setProjectId(projectType.getId());
+                            sectionBusiness.setBusinessId(business.getId());
+                            sectionBusiness.setSubjectId(item.getId());
+                            iCourseSectionBusinessService.save(sectionBusiness);
+                        });
+                    }else {
+                        CourseSubject oneByName = iCourseSubjectService.getOneByName(importVo.getSubName(), projectType.getId());
+                        CourseSectionBusiness sectionBusiness = new CourseSectionBusiness();
+                        sectionBusiness.setSectionId(section.getSectionId());
+                        sectionBusiness.setEducationTypeId(educationType.getId());
+                        sectionBusiness.setProjectId(projectType.getId());
+                        sectionBusiness.setBusinessId(business.getId());
+                        sectionBusiness.setSubjectId(oneByName.getId());
+                        iCourseSectionBusinessService.save(sectionBusiness);
+                    }
+
+                    //章节关联关系
+                    CourseChapterSection chapterSection = new CourseChapterSection();
+                    chapterSection.setChapterId(chapter.getChapterId());
+                    chapterSection.setSectionId(section.getSectionId());
+                    chapterSection.setSort(Long.valueOf(i));
+                    iCourseChapterSectionService.save(chapterSection);
+                }
+            }
+            //模块章关联
+            CourseModuleChapter moduleChapter = new CourseModuleChapter();
+            moduleChapter.setChapterId(chapter.getChapterId());
+            moduleChapter.setModuleId(module.getModuleId());
+            moduleChapter.setSort(Long.valueOf(a));
+            iCourseModuleChapterService.save(moduleChapter);
+
+        });
+
+        return Collections.emptyMap();
+    }
+
     private Long liveTime(Long nowTime, Integer day) {
         for (Integer i = 0; i < day; i++) {
             Long dayAfter = DateUtils.getDayAfter(nowTime, 1);

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

@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -198,4 +199,9 @@ public class CourseSubjectServiceImpl extends ServiceImpl<CourseSubjectMapper, C
     public CourseSubject getOneByName(String subjectName, Long proId) {
         return baseMapper.getOneByName(subjectName,proId);
     }
+
+    @Override
+    public List<CourseSubject> listByProId(Long id) {
+        return baseMapper.listByProId(id);
+    }
 }

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

@@ -100,6 +100,7 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.zip.ZipOutputStream;
@@ -774,9 +775,11 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         }
 
         // 正则表达式:只包含中文汉字
-        String regex = "^[\\u4e00-\\u9fa5]+$";
+//        String regex = "^[\\u4e00-\\u9fa5]+$";
 
-        return Pattern.matches(regex, name);
+        Pattern NAME_PATTERN = Pattern.compile("^[\\u4E00-\\u9FA5]{2,15}(?:·[\\u4E00-\\u9FA5]{1,10}){0,2}$");
+        Matcher matcher = NAME_PATTERN.matcher(name);
+        return matcher.matches();
     }
 
 

+ 78 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/AssistantCheckBo.java

@@ -0,0 +1,78 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class AssistantCheckBo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("评审/认定")
+    private String type;
+
+    @ApiModelProperty("申报人名称")
+    private String userName;
+
+    @ApiModelProperty("申报人专业")
+    private String major;
+
+    @ApiModelProperty("现有单位")
+    private String companyName;
+
+    @ApiModelProperty("参保单位")
+    private String insured;
+
+    @ApiModelProperty("参保开始时间")
+    private String insuredStartTime;
+
+    @ApiModelProperty("参保结束时间")
+    private String insuredEndTime;
+
+    @ApiModelProperty("学历等级")
+    private String eduLevel;
+
+    @ApiModelProperty("学历专业")
+    private String eduMajor;
+
+    @ApiModelProperty("毕业时间")
+    private String graduateTime;
+
+    @ApiModelProperty("继续教育(评审要,认定不需要)")
+    private String education;
+
+    @ApiModelProperty("现有资格等级")
+    private String existingLevel;
+
+    @ApiModelProperty("现有资格专业")
+    private String existingMajor;
+
+    @ApiModelProperty("职称发证机构")
+    private String existingTenant;
+
+    @ApiModelProperty("注册类证书")
+    private String certificate;
+
+    @ApiModelProperty("发证日期")
+    private String issueDate;
+
+    @ApiModelProperty("是否持有建筑类其他证书")
+    private String isCertificate;
+
+    @ApiModelProperty("是否获奖")
+    private String isAward;
+
+    @ApiModelProperty("其他说明")
+    private String explain;
+
+    @ApiModelProperty("工作经历及业绩情况")
+    private List<WorkExperienceBo> experienceBos;
+
+}

+ 78 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/EngineerCheckBo.java

@@ -0,0 +1,78 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class EngineerCheckBo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("评审/认定")
+    private String type;
+
+    @ApiModelProperty("申报人名称")
+    private String userName;
+
+    @ApiModelProperty("申报人专业")
+    private String major;
+
+    @ApiModelProperty("现有单位")
+    private String companyName;
+
+    @ApiModelProperty("参保单位")
+    private String insured;
+
+    @ApiModelProperty("参保开始时间")
+    private String insuredStartTime;
+
+    @ApiModelProperty("参保结束时间")
+    private String insuredEndTime;
+
+    @ApiModelProperty("学历等级")
+    private String eduLevel;
+
+    @ApiModelProperty("学历专业")
+    private String eduMajor;
+
+    @ApiModelProperty("毕业时间")
+    private String graduateTime;
+
+    @ApiModelProperty("继续教育(评审要,认定不需要)")
+    private String education;
+
+    @ApiModelProperty("论文")
+    private String thesis;
+
+    @ApiModelProperty("现有资格等级")
+    private String existingLevel;
+
+    @ApiModelProperty("现有资格专业")
+    private String existingMajor;
+
+    @ApiModelProperty("职称发证机构")
+    private String existingTenant;
+
+    @ApiModelProperty("注册类证书")
+    private String certificate;
+
+    @ApiModelProperty("发证日期")
+    private String issueDate;
+
+    @ApiModelProperty("是否持有建筑类其他证书")
+    private String isCertificate;
+
+    @ApiModelProperty("是否获奖")
+    private String isAward;
+
+    @ApiModelProperty("工作经历及业绩情况")
+    private List<WorkExperienceBo> experienceBos;
+
+}

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

@@ -121,4 +121,6 @@ public class OrderAddBo {
     private String consigneePhone;
     @ApiModelProperty("手机地址")
     private String consigneeSite;
+    @ApiModelProperty("技术助工id")
+    private String artisanDataId;
 }

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

@@ -117,4 +117,7 @@ public class OrderGoodsAddBo {
 
     @ApiModelProperty("业务员")
     private String salesman;
+
+    @ApiModelProperty("技术助工id")
+    private String artisanDataId;
 }

+ 60 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/TechnicianCheckBo.java

@@ -0,0 +1,60 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TechnicianCheckBo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("评审/认定")
+    private String type;
+
+    @ApiModelProperty("申报人员姓名")
+    private String userName;
+
+    @ApiModelProperty("申报专业")
+    private String major;
+
+    @ApiModelProperty("现工作单位")
+    private String companyName;
+
+    @ApiModelProperty("参保单位")
+    private String insured;
+
+    @ApiModelProperty("参保开始时间")
+    private String insuredStartTime;
+
+    @ApiModelProperty("参保结束时间")
+    private String insuredEndTime;
+
+    @ApiModelProperty("继续教育(评审要,认定不需要)")
+    private String education;
+
+    @ApiModelProperty("现有资格等级")
+    private String existingLevel;
+
+    @ApiModelProperty("现有资格专业")
+    private String existingMajor;
+
+    @ApiModelProperty("毕业时间")
+    private String graduateTime;
+
+    @ApiModelProperty("是否持有建筑类其他证书")
+    private String isCertificate;
+
+    @ApiModelProperty("其他说明")
+    private String explain;
+
+    @ApiModelProperty("工作经历及业绩情况")
+    private List<WorkExperienceBo> experienceBos;
+
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/WorkExperienceBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WorkExperienceBo implements Serializable {
+
+    @ApiModelProperty("单位名称")
+    private String companyName;
+
+    @ApiModelProperty("工程名称")
+    private String projectName;
+
+    @ApiModelProperty("开工开始时间")
+    private String projectStartTime;
+
+    @ApiModelProperty("开工结束时间")
+    private String projectEndTime;
+
+    @ApiModelProperty("工作")
+    private String work;
+
+    @ApiModelProperty("工程造价")
+    private String cost;
+
+    @ApiModelProperty("工程获奖情况")
+    private String condition;
+
+}

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

@@ -140,4 +140,7 @@ private static final long serialVersionUID=1L;
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long acquireTime;
 
+    /** 技术助工id */
+    private String artisanDataId;
+
 }

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

@@ -152,4 +152,11 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
 
     List<CertificateOrderVo> getCertificateOrder();
 
+    AssistantResultVo assistantCheck(AssistantCheckBo bo,Long userId);
+
+    AssistantResultVo technicianCheck(TechnicianCheckBo bo,Long userId);
+
+    AssistantResultVo engineerIntermediateCheck(EngineerCheckBo bo, Long userId);
+
+    AssistantResultVo engineerAdvancedCheck(EngineerCheckBo bo, Long userId);
 }

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

@@ -17,6 +17,10 @@ import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.activity.domain.ArtisanCheck;
+import com.zhongzheng.modules.activity.domain.ArtisanData;
+import com.zhongzheng.modules.activity.service.IArtisanCheckService;
+import com.zhongzheng.modules.activity.service.IArtisanDataService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.domain.ProfileTp;
 import com.zhongzheng.modules.base.domain.ShoppingCart;
@@ -91,7 +95,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -199,6 +209,12 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     @Autowired
     private IMajorService iMajorService;
 
+    @Autowired
+    private IArtisanCheckService iArtisanCheckService;
+
+    @Autowired
+    private IArtisanDataService iArtisanDataService;
+
 
 
     @Override
@@ -1022,6 +1038,783 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         return baseMapper.getCertificateOrder();
     }
 
+    @Override
+    public AssistantResultVo assistantCheck(AssistantCheckBo bo,Long userId) {
+        AssistantResultVo resultVo = new AssistantResultVo();
+        List<AssistantCheckVo> vos = new ArrayList<>();
+        //基础中文名校验 - 纯汉字,2-4个字
+        String regex = "^[\u4e00-\u9fa5]{2,4}$";
+        boolean matches = Pattern.matches(regex, bo.getUserName());
+        if (StringUtils.isBlank(bo.getUserName()) || !matches){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("userName");
+            vo.setReason("申报人姓名输入不合法");
+            vos.add(vo);
+        }
+
+        //专业
+        List<ArtisanCheck> artisanChecks = iArtisanCheckService
+                .list(new LambdaQueryWrapper<ArtisanCheck>().eq(ArtisanCheck::getType, 1).eq(ArtisanCheck::getStatus, 1));
+        if (StringUtils.isBlank(bo.getMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("major");
+            vo.setReason("申报专业不符合");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getCompanyName())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("companyName");
+            vo.setReason("现工作单位不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getInsured())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insured");
+            vo.setReason("参保单位不能为空");
+            vos.add(vo);
+        }
+
+        //参保时间
+        if (StringUtils.isBlank(bo.getInsuredStartTime()) || StringUtils.isBlank(bo.getInsuredEndTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间不能为空");
+            vos.add(vo);
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date1 = LocalDate.parse(bo.getInsuredStartTime(), formatter);
+        LocalDate date2 = LocalDate.parse(bo.getInsuredEndTime(), formatter);
+        // 计算两个日期之间的月数差异
+        long monthsBetween = ChronoUnit.MONTHS.between(date1, date2);
+        // 取绝对值并判断是否大于6个月
+        if (Math.abs(monthsBetween) < 6){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间小于半年");
+            vos.add(vo);
+        }
+
+        //学历情况
+        //学历等级
+        if (StringUtils.isBlank(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不能为空");
+            vos.add(vo);
+        }
+
+        List<String> list = Arrays.asList("职高", "高中", "专科", "本科", "硕士研究生", "博士研究生");
+        if (StringUtils.isBlank(bo.getEduLevel()) || !list.contains(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不符合标准");
+            vos.add(vo);
+        }
+
+        //学历专业
+        if (StringUtils.isBlank(bo.getEduMajor())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不能为空");
+            vos.add(vo);
+        }
+
+        if (!artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getEduMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不符合");
+            vos.add(vo);
+        }
+
+        //毕业时间
+        if (StringUtils.isBlank(bo.getGraduateTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("graduateTime");
+            vo.setReason("毕业时间不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel())){
+            if (bo.getEduLevel().equals("职高") || bo.getEduLevel().equals("高中")){
+                //从事本专业技术工作满4年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",4)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于职高/高中,从事本专业技术工作满4年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("专科")){
+                //从事本专业技术工作满2年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",2)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于专科,从事本专业技术工作满2年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("本科")){
+                //从事本专业技术工作满1年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",1)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于本科,从事本专业技术工作满1年");
+                    vos.add(vo);
+                }
+            }
+        }
+
+        if (bo.getType().equals("评审") && !bo.getEducation().equals("有")){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("education");
+            vo.setReason("评审需有继续教育证明");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("认定")){
+            //认定:学历专业和申报专业需一样
+            if (!bo.getExistingMajor().equals(bo.getMajor())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("major");
+                vo.setReason("认定:学历专业和申报专业需要一样");
+                vos.add(vo);
+            }
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel()) && (bo.getEduLevel().equals("职高") || bo.getEduLevel().equals("高中") || bo.getEduLevel().equals("专科"))){
+
+            if (StringUtils.isBlank(bo.getExistingLevel())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingLevel");
+                vo.setReason("学历为职高/高中/专科,需取得技术员职称后才能申请助工");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getExistingMajor()))){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingMajor");
+                vo.setReason("学历为职高/高中/专科,需取得技术员职称后才能申请助工");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingTenant())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingTenant");
+                vo.setReason("学历为职高/高中/专科,需取得技术员职称后才能申请助工");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getCertificate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("certificate");
+                vo.setReason("学历为职高/高中/专科,需取得技术员职称后才能申请助工");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getIssueDate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("issueDate");
+                vo.setReason("学历为职高/高中/专科,需取得技术员职称后才能申请助工");
+                vos.add(vo);
+            }
+        }
+
+        if (CollectionUtils.isEmpty(vos)){
+            //校验通过
+            ArtisanData data = new ArtisanData();
+            data.setCreateTime(DateUtils.getNowTime());
+            data.setUpdateTime(DateUtils.getNowTime());
+            data.setUserId(userId);
+            data.setGoodsId(bo.getGoodsId());
+            data.setMajorName(bo.getMajorName());
+            data.setDataStr(JSON.toJSONString(bo));
+            iArtisanDataService.save(data);
+            resultVo.setId(data.getId());
+        }else {
+            resultVo.setCheckVos(vos);
+        }
+        return resultVo;
+    }
+
+    @Override
+    public AssistantResultVo technicianCheck(TechnicianCheckBo bo,Long userId) {
+        //技术员校验
+        List<AssistantCheckVo> vos = new ArrayList<>();
+
+        //基础中文名校验 - 纯汉字,2-4个字
+        String regex = "^[\u4e00-\u9fa5]{2,4}$";
+        boolean matches = Pattern.matches(regex, bo.getUserName());
+        if (StringUtils.isBlank(bo.getUserName()) || !matches){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("userName");
+            vo.setReason("申报人姓名输入不合法");
+            vos.add(vo);
+        }
+
+        //专业
+        List<ArtisanCheck> artisanChecks = iArtisanCheckService
+                .list(new LambdaQueryWrapper<ArtisanCheck>().eq(ArtisanCheck::getType, 1).eq(ArtisanCheck::getStatus, 1));
+        if (StringUtils.isBlank(bo.getMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("major");
+            vo.setReason("申报专业不符合");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getCompanyName())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("companyName");
+            vo.setReason("现工作单位不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getInsured())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insured");
+            vo.setReason("参保单位不能为空");
+            vos.add(vo);
+        }
+
+        //参保时间
+        if (StringUtils.isBlank(bo.getInsuredStartTime()) || StringUtils.isBlank(bo.getInsuredEndTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间不能为空");
+            vos.add(vo);
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date1 = LocalDate.parse(bo.getInsuredStartTime(), formatter);
+        LocalDate date2 = LocalDate.parse(bo.getInsuredEndTime(), formatter);
+        // 计算两个日期之间的月数差异
+        long monthsBetween = ChronoUnit.MONTHS.between(date1, date2);
+        // 取绝对值并判断是否大于6个月
+        if (Math.abs(monthsBetween) < 6){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间小于半年");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("评审") && !bo.getEducation().equals("有")){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("education");
+            vo.setReason("评审需有继续教育证明");
+            vos.add(vo);
+        }
+
+        List<String> list = Arrays.asList("职高", "高中", "专科", "本科", "硕士研究生", "博士研究生");
+        if (StringUtils.isBlank(bo.getExistingLevel()) || !list.contains(bo.getExistingLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("existingLevel");
+            vo.setReason("学历等级不符合标准");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isNotBlank(bo.getExistingLevel()) && (bo.getExistingLevel().equals("职高") || bo.getExistingLevel().equals("高中"))){
+            //职高或者高中毕业时间要大于一年
+            if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",1)){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingLevel");
+                vo.setReason("学历属于职高/高中,毕业时间需满1年");
+                vos.add(vo);
+            }
+
+        }
+
+
+        if (StringUtils.isBlank(bo.getExistingMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getExistingMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("existingMajor");
+            vo.setReason("学历专业不符合");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("认定")){
+            //认定:学历专业和申报专业需一样
+            if (!bo.getExistingMajor().equals(bo.getMajor())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("major");
+                vo.setReason("认定:学历专业和申报专业需要一样");
+                vos.add(vo);
+            }
+        }
+
+        if (StringUtils.isBlank(bo.getGraduateTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("graduateTime");
+            vo.setReason("毕业时间不能为空");
+            vos.add(vo);
+        }
+        AssistantResultVo resultVo = new AssistantResultVo();
+        if (CollectionUtils.isEmpty(vos)){
+            //校验通过
+            ArtisanData data = new ArtisanData();
+            data.setCreateTime(DateUtils.getNowTime());
+            data.setUpdateTime(DateUtils.getNowTime());
+            data.setUserId(userId);
+            data.setGoodsId(bo.getGoodsId());
+            data.setMajorName(bo.getMajorName());
+            data.setDataStr(JSON.toJSONString(bo));
+            iArtisanDataService.save(data);
+            resultVo.setId(data.getId());
+        }else {
+            resultVo.setCheckVos(vos);
+        }
+
+        return resultVo;
+    }
+
+    @Override
+    public AssistantResultVo engineerIntermediateCheck(EngineerCheckBo bo, Long userId) {
+        AssistantResultVo resultVo = new AssistantResultVo();
+        List<AssistantCheckVo> vos = new ArrayList<>();
+        //基础中文名校验 - 纯汉字,2-4个字
+        String regex = "^[\u4e00-\u9fa5]{2,4}$";
+        boolean matches = Pattern.matches(regex, bo.getUserName());
+        if (StringUtils.isBlank(bo.getUserName()) || !matches){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("userName");
+            vo.setReason("申报人姓名输入不合法");
+            vos.add(vo);
+        }
+
+        //专业
+        List<ArtisanCheck> artisanChecks = iArtisanCheckService
+                .list(new LambdaQueryWrapper<ArtisanCheck>().eq(ArtisanCheck::getType, 1).eq(ArtisanCheck::getStatus, 1));
+        if (StringUtils.isBlank(bo.getMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("major");
+            vo.setReason("申报专业不符合");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getCompanyName())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("companyName");
+            vo.setReason("现工作单位不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getInsured())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insured");
+            vo.setReason("参保单位不能为空");
+            vos.add(vo);
+        }
+
+        //参保时间
+        if (StringUtils.isBlank(bo.getInsuredStartTime()) || StringUtils.isBlank(bo.getInsuredEndTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间不能为空");
+            vos.add(vo);
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date1 = LocalDate.parse(bo.getInsuredStartTime(), formatter);
+        LocalDate date2 = LocalDate.parse(bo.getInsuredEndTime(), formatter);
+        // 计算两个日期之间的月数差异
+        long monthsBetween = ChronoUnit.MONTHS.between(date1, date2);
+        // 取绝对值并判断是否大于6个月
+        if (Math.abs(monthsBetween) < 6){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间小于半年");
+            vos.add(vo);
+        }
+
+        //学历情况
+        //学历等级
+        if (StringUtils.isBlank(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不能为空");
+            vos.add(vo);
+        }
+
+        List<String> list = Arrays.asList("专科", "本科", "硕士研究生", "博士研究生");
+        if (StringUtils.isBlank(bo.getEduLevel()) || !list.contains(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不符合标准");
+            vos.add(vo);
+        }
+
+        //学历专业
+        if (StringUtils.isBlank(bo.getEduMajor())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不能为空");
+            vos.add(vo);
+        }
+
+        if (!artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getEduMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不符合");
+            vos.add(vo);
+        }
+
+        //毕业时间
+        if (StringUtils.isBlank(bo.getGraduateTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("graduateTime");
+            vo.setReason("毕业时间不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel())){
+            if (bo.getEduLevel().equals("专科")){
+                //从事本专业技术工作满4年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",4)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于专科,从事本专业技术工作满4年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("本科")){
+                //从事本专业技术工作满4年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",4)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于本科,从事本专业技术工作满4年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("硕士研究生")){
+                //从事本专业技术工作满2年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",2)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于硕士研究生,从事本专业技术工作满2年");
+                    vos.add(vo);
+                }
+            }
+        }
+
+        //技术总结、论文
+        if (StringUtils.isBlank(bo.getThesis())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("thesis");
+            vo.setReason("在公开出版发行专业期刊上独立发表1篇本专业相关学术论文");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("评审") && !bo.getEducation().equals("有")){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("education");
+            vo.setReason("评审需有继续教育证明");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("认定")){
+            //认定:学历专业和申报专业需一样
+            if (!bo.getExistingMajor().equals(bo.getMajor())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("major");
+                vo.setReason("认定:学历专业和申报专业需要一样");
+                vos.add(vo);
+            }
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel()) && (bo.getEduLevel().equals("专科") || bo.getEduLevel().equals("本科") || bo.getEduLevel().equals("硕士研究生"))){
+
+            if (StringUtils.isBlank(bo.getExistingLevel())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingLevel");
+                vo.setReason("学历为专科/本科/硕士研究生,需取得助理工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getExistingMajor()))){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingMajor");
+                vo.setReason("学历为专科/本科/硕士研究生,需取得助理工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingTenant())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingTenant");
+                vo.setReason("学历为专科/本科/硕士研究生,需取得助理工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getCertificate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("certificate");
+                vo.setReason("学历为专科/本科/硕士研究生,需取得助理工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getIssueDate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("issueDate");
+                vo.setReason("学历为专科/本科/硕士研究生,需取得助理工程师职称后才能申请");
+                vos.add(vo);
+            }
+        }
+
+        if (CollectionUtils.isEmpty(vos)){
+            //校验通过
+            ArtisanData data = new ArtisanData();
+            data.setCreateTime(DateUtils.getNowTime());
+            data.setUpdateTime(DateUtils.getNowTime());
+            data.setUserId(userId);
+            data.setGoodsId(bo.getGoodsId());
+            data.setMajorName(bo.getMajorName());
+            data.setDataStr(JSON.toJSONString(bo));
+            iArtisanDataService.save(data);
+            resultVo.setId(data.getId());
+        }else {
+            resultVo.setCheckVos(vos);
+        }
+        return resultVo;
+    }
+
+    @Override
+    public AssistantResultVo engineerAdvancedCheck(EngineerCheckBo bo, Long userId) {
+        AssistantResultVo resultVo = new AssistantResultVo();
+        List<AssistantCheckVo> vos = new ArrayList<>();
+        //基础中文名校验 - 纯汉字,2-4个字
+        String regex = "^[\u4e00-\u9fa5]{2,4}$";
+        boolean matches = Pattern.matches(regex, bo.getUserName());
+        if (StringUtils.isBlank(bo.getUserName()) || !matches){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("userName");
+            vo.setReason("申报人姓名输入不合法");
+            vos.add(vo);
+        }
+
+        //专业
+        List<ArtisanCheck> artisanChecks = iArtisanCheckService
+                .list(new LambdaQueryWrapper<ArtisanCheck>().eq(ArtisanCheck::getType, 1).eq(ArtisanCheck::getStatus, 1));
+        if (StringUtils.isBlank(bo.getMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("major");
+            vo.setReason("申报专业不符合");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getCompanyName())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("companyName");
+            vo.setReason("现工作单位不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isBlank(bo.getInsured())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insured");
+            vo.setReason("参保单位不能为空");
+            vos.add(vo);
+        }
+
+        //参保时间
+        if (StringUtils.isBlank(bo.getInsuredStartTime()) || StringUtils.isBlank(bo.getInsuredEndTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间不能为空");
+            vos.add(vo);
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date1 = LocalDate.parse(bo.getInsuredStartTime(), formatter);
+        LocalDate date2 = LocalDate.parse(bo.getInsuredEndTime(), formatter);
+        // 计算两个日期之间的月数差异
+        long monthsBetween = ChronoUnit.MONTHS.between(date1, date2);
+        // 取绝对值并判断是否大于6个月
+        if (Math.abs(monthsBetween) < 6){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("insuredStartTime");
+            vo.setReason("参保时间小于半年");
+            vos.add(vo);
+        }
+
+        //学历情况
+        //学历等级
+        if (StringUtils.isBlank(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不能为空");
+            vos.add(vo);
+        }
+
+        List<String> list = Arrays.asList("本科", "硕士研究生", "博士研究生");
+        if (StringUtils.isBlank(bo.getEduLevel()) || !list.contains(bo.getEduLevel())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduLevel");
+            vo.setReason("学历等级不符合标准");
+            vos.add(vo);
+        }
+
+        //学历专业
+        if (StringUtils.isBlank(bo.getEduMajor())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不能为空");
+            vos.add(vo);
+        }
+
+        if (!artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getEduMajor()))){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("eduMajor");
+            vo.setReason("学历专业不符合");
+            vos.add(vo);
+        }
+
+        //毕业时间
+        if (StringUtils.isBlank(bo.getGraduateTime())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("graduateTime");
+            vo.setReason("毕业时间不能为空");
+            vos.add(vo);
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel())){
+            if (bo.getEduLevel().equals("本科")){
+                //从事本专业技术工作满5年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",5)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduMajor");
+                    vo.setReason("学历属于本科,从事本专业技术工作满5年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("硕士研究生")){
+                //从事本专业技术工作满5年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",5)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于硕士研究生,从事本专业技术工作满5年");
+                    vos.add(vo);
+                }
+            }
+
+            if (bo.getEduLevel().equals("博士研究生")){
+                //从事本专业技术工作满2年
+                if (isFullYear(bo.getGraduateTime(),"yyyy-MM-dd",2)){
+                    AssistantCheckVo vo = new AssistantCheckVo();
+                    vo.setField("eduLevel");
+                    vo.setReason("学历属于博士研究生,从事本专业技术工作满2年");
+                    vos.add(vo);
+                }
+            }
+        }
+
+        //技术总结、论文
+        if (StringUtils.isBlank(bo.getThesis())){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("thesis");
+            vo.setReason("在公开出版发行专业期刊上独立发表1篇本专业相关学术论文");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("评审") && !bo.getEducation().equals("有")){
+            AssistantCheckVo vo = new AssistantCheckVo();
+            vo.setField("education");
+            vo.setReason("评审需有继续教育证明");
+            vos.add(vo);
+        }
+
+        if (bo.getType().equals("认定")){
+            //认定:学历专业和申报专业需一样
+            if (!bo.getExistingMajor().equals(bo.getMajor())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("major");
+                vo.setReason("认定:学历专业和申报专业需要一样");
+                vos.add(vo);
+            }
+        }
+
+        if (StringUtils.isNotBlank(bo.getEduLevel()) && (bo.getEduLevel().equals("本科") || bo.getEduLevel().equals("硕士研究生") || bo.getEduLevel().equals("博士研究生"))){
+
+            if (StringUtils.isBlank(bo.getExistingLevel())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingLevel");
+                vo.setReason("学历为专科/硕士研究生/博士研究生,需取得工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingMajor()) || !artisanChecks.stream().anyMatch(x -> x.getMajor().equals(bo.getExistingMajor()))){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingMajor");
+                vo.setReason("学历为专科/硕士研究生/博士研究生,需取得工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getExistingTenant())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("existingTenant");
+                vo.setReason("学历为专科/硕士研究生/博士研究生,需取得工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getCertificate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("certificate");
+                vo.setReason("学历为专科/硕士研究生/博士研究生,需取得工程师职称后才能申请");
+                vos.add(vo);
+            }
+
+            if (StringUtils.isBlank(bo.getIssueDate())){
+                AssistantCheckVo vo = new AssistantCheckVo();
+                vo.setField("issueDate");
+                vo.setReason("学历为专科/硕士研究生/博士研究生,需取得工程师职称后才能申请");
+                vos.add(vo);
+            }
+        }
+
+        if (CollectionUtils.isEmpty(vos)){
+            //校验通过
+            ArtisanData data = new ArtisanData();
+            data.setCreateTime(DateUtils.getNowTime());
+            data.setUpdateTime(DateUtils.getNowTime());
+            data.setUserId(userId);
+            data.setGoodsId(bo.getGoodsId());
+            data.setMajorName(bo.getMajorName());
+            data.setDataStr(JSON.toJSONString(bo));
+            iArtisanDataService.save(data);
+            resultVo.setId(data.getId());
+        }else {
+            resultVo.setCheckVos(vos);
+        }
+        return resultVo;
+    }
+
+    private static boolean isFullYear(String dateString, String pattern,Integer year) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+            Date targetDate = sdf.parse(dateString);
+            Date currentDate = new Date();
+
+            Calendar targetCalendar = Calendar.getInstance();
+            targetCalendar.setTime(targetDate);
+
+            Calendar currentCalendar = Calendar.getInstance();
+            currentCalendar.setTime(currentDate);
+
+            // 增加一年到目标日期
+            targetCalendar.add(Calendar.YEAR, year);
+
+            // 判断增加一年后的日期是否小于等于当前日期
+            return !targetCalendar.after(currentCalendar);
+
+        } catch (ParseException e) {
+            throw new IllegalArgumentException("日期格式错误或解析失败", e);
+        }
+    }
+
     private boolean checkUnique(Long GoodsId,Long UserId) {
         ShoppingCart info = iShoppingCartService.getOne(new LambdaQueryWrapper<ShoppingCart>()
                 .eq(ShoppingCart::getUserId,UserId).eq(ShoppingCart::getGoodsId,GoodsId).last("limit 1"));

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

@@ -24,8 +24,10 @@ import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
 import com.zhongzheng.modules.activity.domain.ActivityOrder;
+import com.zhongzheng.modules.activity.domain.ArtisanData;
 import com.zhongzheng.modules.activity.service.IActivityGoodsPriceService;
 import com.zhongzheng.modules.activity.service.IActivityOrderService;
+import com.zhongzheng.modules.activity.service.IArtisanDataService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.service.IShoppingCartService;
@@ -222,6 +224,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private IOrderHandleService iOrderHandleService;
 
+    @Autowired
+    private IArtisanDataService iArtisanDataService;
+
     @Override
     public OrderVo queryById(Long orderId) {
         Order db = this.baseMapper.selectById(orderId);
@@ -279,6 +284,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             } else if (vo.getGoodsPayStatus() > 1) {
                 vo.setOrderGoodsStatus(1);
             }
+
+            if (vo.getOrderType() == 7 && ObjectUtils.isNotNull(vo.getArtisanDataId())){
+                //技工订单
+                ArtisanData artisanData = iArtisanDataService.getById(vo.getArtisanDataId());
+                vo.setArtisanData(artisanData.getDataStr());
+            }
         }
         return orderListVos;
     }

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/AssistantCheckVo.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class AssistantCheckVo implements Serializable {
+
+    @ApiModelProperty("字段名称")
+    private String field;
+
+    @ApiModelProperty("原因")
+    private String reason;
+}

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/AssistantResultVo.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class AssistantResultVo implements Serializable {
+
+    private Long id;
+
+    @ApiModelProperty("校验结果")
+    private List<AssistantCheckVo> checkVos;
+}

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

@@ -153,6 +153,8 @@ public class OrderListVo {
     private String schoolName;
     @ApiModelProperty("专业名称")
     private String categoryName;
+    @ApiModelProperty("专业名称")
+    private String subjectNames;
 
     /**
      * 真实姓名
@@ -266,4 +268,10 @@ public class OrderListVo {
 
     @ApiModelProperty("业务员")
     private String salesman;
+
+    @ApiModelProperty("技工ID")
+    private Long artisanDataId;
+
+    @ApiModelProperty("报名信息")
+    private String artisanData;
 }

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysUserMapper.java

@@ -42,9 +42,9 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
 
     @InterceptorIgnore(tenantLine = "true")
     public SysUser selectUserByTenant(@Param("userName") String userName,@Param("tenantId") Long tenantId);
-
-    @InterceptorIgnore(tenantLine = "true")
-    Integer saveSysUser(SysUser admin);
+//
+//    @InterceptorIgnore(tenantLine = "true")
+//    Integer saveSysUser(SysUser admin);
 
     List<String> getUserNameByRoleKey(@Param("roleKey") String roleKey);
 

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

@@ -177,4 +177,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND cs.`status` = 1
             LIMIT 1
     </select>
+
+    <select id="listByProId"  resultType="com.zhongzheng.modules.course.domain.CourseSubject">
+        SELECT
+            cs.*
+        FROM
+            course_subject cs
+                LEFT JOIN course_subject_project csp ON cs.id = csp.subject_id
+        WHERE
+            csp.project_id = #{proId}
+          AND cs.`status` = 1
+    </select>
 </mapper>

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

@@ -61,6 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="businessName" column="business_name"/>
         <result property="schoolName" column="school_name"/>
         <result property="salesman" column="salesman"/>
+        <result property="subjectNames" column="category_name"/>
 
         <result property="goodsPrice" column="goods_price"/>
         <result property="goodsRealPrice" column="goods_real_price"/>
@@ -83,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="serviceEndTime" column="service_end_time"/>
         <result property="handleOrderSn" column="handle_order_sn"/>
         <result property="offlineRefundSign" column="offline_refund_sign"/>
+        <result property="artisanDataId" column="artisan_data_id"/>
     </resultMap>
 
     <select id="getGradePeriod" parameterType="Map" resultType="integer">
@@ -121,6 +123,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             m.category_name,
             og.goods_received,
             og.refund_status,
+            og.artisan_data_id,
             og.pay_status as goods_pay_status,
         (select cgu.period_plush from  class_grade_user cgu where cgu.grade_id = og.grade_id and cgu.order_goods_id = og.order_goods_id and cgu.user_id = o.user_id limit 1 ) period_plush,
         (SELECT oi.invoice_status FROM order_invoice oi LEFT JOIN order_invoice_order oio ON oio.invoice_id = oi.invoice_id WHERE
@@ -152,6 +155,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="orderSn != null and orderSn != ''">
             AND o.order_sn = #{orderSn}
         </if>
+        <if test="orderType != null and orderType != ''">
+            AND o.order_type = #{orderType}
+        </if>
         <if test="orderStatus != null ">
             AND o.order_status in
             <foreach collection="orderStatus" item="item" index="index" open="(" close=")" separator=",">