he2802 2 lat temu
rodzic
commit
436d9f79de
29 zmienionych plików z 525 dodań i 20 usunięć
  1. 2 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 2 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  3. 22 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java
  4. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/mapper/UserProfileMapper.java
  5. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/IUserProfileService.java
  6. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  7. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/mapper/MajorMapper.java
  8. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/IMajorService.java
  9. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/MajorServiceImpl.java
  10. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamApplyService.java
  11. 7 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java
  12. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java
  13. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeGoodsMapper.java
  14. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeGoodsService.java
  15. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeGoodsServiceImpl.java
  16. 20 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  17. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  18. 6 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  19. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTaskVo.java
  20. 25 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubQueryBo.java
  21. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  22. 223 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  23. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserExamApplyExport.java
  24. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubApplyExport.java
  25. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/base/UserProfileMapper.xml
  26. 3 0
      zhongzheng-system/src/main/resources/mapper/modules/course/MajorMapper.xml
  27. 5 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeGoodsMapper.xml
  28. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  29. 19 4
      zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

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

@@ -332,8 +332,8 @@ public class CommonController extends BaseController {
     @ApiOperation("七大员新考证书")
     @PostMapping("common/apply/result/certificate")
     public AjaxResult examApplyResultCertificate(List<MultipartFile> files) {
-        iExamApplyService.examApplyResultCertificate(files);
-        return AjaxResult.success();
+        String msg = iExamApplyService.examApplyResultCertificate(files);
+        return AjaxResult.success(msg);
     }
 
     @ApiOperation("七大员考试结果回执")

+ 2 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -196,7 +196,8 @@ public class ClassGradeController extends BaseController {
     @PreAuthorize("@ss.hasPermi('grade:grade:list')")
     @GetMapping("/listGrade")
     public TableDataInfo<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo) {
-        if (ObjectUtils.isNotNull(bo.getGradeId())){
+        if (ObjectUtils.isNotNull(bo.getSevenCodeSign()) && bo.getSevenCodeSign() == 1
+                && ObjectUtils.isNotNull(bo.getGradeId())){
             ClassGrade gradeGrade = iClassGradeService.getById(bo.getGradeId());
             if (StringUtils.isNotBlank(gradeGrade.getSevenCode())){
                 bo.setSevenCode(gradeGrade.getSevenCode());

+ 22 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserSubscribeController.java

@@ -18,6 +18,7 @@ import com.zhongzheng.modules.exam.domain.ExamApplySiteTime;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteTimeService;
 import com.zhongzheng.modules.exam.vo.ExamSessionVo;
+import com.zhongzheng.modules.system.vo.SysTaskVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
@@ -81,14 +82,33 @@ public class UserSubscribeController extends BaseController {
     }
 
     /**
-     * 预约学员资料下载
+     * 预约学员档案资料下载
      */
-    @ApiOperation("预约学员资料下载")
+    @ApiOperation("预约学员档案资料下载")
     @GetMapping("/sub/user/export")
     public AjaxResult<Void> subUserExport(SubUserExportBo bo) {
         return toAjax(iUserSubscribeService.subUserExport(bo) ? 1 : 0);
     }
 
+    /**
+     * 预约学员信息下载
+     */
+    @ApiOperation("预约学员信息下载")
+    @PostMapping("/sub/record/user/export")
+    public AjaxResult<String> subRecordUserExport(@RequestBody SubUserExportBo bo) {
+        String path = iUserSubscribeService.subRecordUserExport(bo);
+        return AjaxResult.success("操作成功",path);
+    }
+
+    /**
+     * 学员档案下载任务列表
+     */
+    @ApiOperation("学员档案下载任务列表")
+    @GetMapping("/sub/user/export/list")
+    public AjaxResult<List<SysTaskVo>> subUserExportList() {
+        return AjaxResult.success(iUserSubscribeService.subUserExportList());
+    }
+
 
     /**
      * 根据月份获取当月考试场次

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/mapper/UserProfileMapper.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.base.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
@@ -29,4 +30,7 @@ public interface UserProfileMapper extends BaseMapper<UserProfile> {
     Long selectGrade(@Param("userId") Long userId,@Param("goodsId") Long goodsId);
 
     Integer getProfileStatusNum(ConsoleQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId);
 }

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

@@ -77,4 +77,6 @@ public interface IUserProfileService extends IService<UserProfile> {
 	Map<String,Object> exportPo(UserProfileQueryBo bo);
 
 	Integer getProfileStatusNum(ConsoleQueryBo bo);
+
+    UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java

@@ -997,6 +997,11 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         return baseMapper.getProfileStatusNum(bo);
     }
 
+    @Override
+    public UserProfile getByOrderGoodsIdNoTenant(Long orderGoodsId) {
+        return baseMapper.getByOrderGoodsIdNoTenant(orderGoodsId);
+    }
+
     /**
      * url读取image转换为Base64字符串
      *

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

@@ -28,4 +28,7 @@ public interface MajorMapper extends BaseMapper<Major> {
 
     @InterceptorIgnore(tenantLine = "true")
     Major getMajorByTenant(@Param("encoder") String encoder,@Param("newTenantId") Long newTenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Major getMajorByIdNoTenant(Long majorId);
 }

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

@@ -51,4 +51,6 @@ public interface IMajorService extends IService<Major> {
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     Major getMajorByTenant(String encoder, Long newTenantId);
+
+    Major getMajorByIdNoTenant(Long majorId);
 }

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

@@ -175,4 +175,9 @@ public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements
     public Major getMajorByTenant(String encoder, Long newTenantId) {
         return baseMapper.getMajorByTenant(encoder,newTenantId);
     }
+
+    @Override
+    public Major getMajorByIdNoTenant(Long majorId) {
+        return baseMapper.getMajorByIdNoTenant(majorId);
+    }
 }

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

@@ -109,5 +109,5 @@ public interface IExamApplyService extends IService<ExamApply> {
 
     void examApplyResultReceipt(List<ExamApplyResultExportBo> exportBo, String time);
 
-    void examApplyResultCertificate(List<MultipartFile> files);
+    String examApplyResultCertificate(List<MultipartFile> files);
 }

+ 7 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamApplyServiceImpl.java

@@ -1305,10 +1305,11 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
     }
 
     @Override
-    public void examApplyResultCertificate(List<MultipartFile> files) {
+    public String examApplyResultCertificate(List<MultipartFile> files) {
         if (CollectionUtils.isEmpty(files)){
-            return;
+            return "请勿上传空文件!";
         }
+        List<String> msgList = new ArrayList<>();
         files.forEach(multipartFile -> {
             //文件名= 身份证号码_岗位名称_证书编号_发证日期
             String fileName = multipartFile.getOriginalFilename();
@@ -1317,6 +1318,7 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             User user = iUserService.getByCardNoTenant(collect.get(0));
             if (ObjectUtils.isNull(user)){
                 log.error("学员信息查询不到:"+collect.get(0));
+                msgList.add("学员信息查询不到:"+collect.get(0));
                 return;
             }
             SubscribeInfoBo infoBo = new SubscribeInfoBo();
@@ -1324,6 +1326,7 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
             infoBo.setUserId(user.getUserId());
             UserSubscribe subscribe = baseMapper.getExamPassSub(infoBo);
             if (ObjectUtils.isNull(subscribe)){
+                msgList.add("学员预约信息查询不到:"+collect.get(0));
                 return;
             }
             subscribe.setCertificateCode(collect.get(2));
@@ -1348,10 +1351,12 @@ public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply
                 subscribe.setCertificateUrl(upload);
             } catch (Exception e) {
                 log.error("证书上传有误:"+collect.get(0));
+                msgList.add("证书上传有误:"+collect.get(0));
                 e.printStackTrace();
             }
             iUserSubscribeService.updateByIdNoTenant(subscribe);
         });
+        return msgList.stream().collect(Collectors.joining());
     }
 
     private String getMajorName(String majorName) {

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java

@@ -299,6 +299,9 @@ public class ClassGradeUserQueryBo extends BaseEntity {
 	@ApiModelProperty("七大员继教班级关联code")
 	private String sevenCode;
 
+	@ApiModelProperty("七大员继教班级关联code标签:1 是 0否")
+	private Integer sevenCodeSign;
+
 	private List<WeekDataVo> weekList;
 
 }

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

@@ -24,4 +24,7 @@ public interface ClassGradeGoodsMapper extends BaseMapper<ClassGradeGoods> {
 
     @InterceptorIgnore(tenantLine = "true")
     ClassGradeGoods getOneNoTenant(@Param("gradeId") Long gradeId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ClassGradeGoods> listByIdNoTenant(Long gradeId);
 }

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

@@ -57,4 +57,6 @@ public interface IClassGradeGoodsService extends IService<ClassGradeGoods> {
     List<ClassGradeGoods> getClassNoTenant(List<Long> collect);
 
     ClassGradeGoods getOneNoTenant(Long gradeId);
+
+    List<ClassGradeGoods> listByIdNoTenant(Long gradeId);
 }

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

@@ -117,4 +117,9 @@ public class ClassGradeGoodsServiceImpl extends ServiceImpl<ClassGradeGoodsMappe
     public ClassGradeGoods getOneNoTenant(Long gradeId) {
         return baseMapper.getOneNoTenant(gradeId);
     }
+
+    @Override
+    public List<ClassGradeGoods> listByIdNoTenant(Long gradeId) {
+        return baseMapper.listByIdNoTenant(gradeId);
+    }
 }

+ 20 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -121,6 +121,8 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
 
     @Autowired
     private IUserUpdateService iUserUpdateService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
 
     @Autowired
     private IInformRemindService informRemindService;
@@ -507,7 +509,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             //班级是否存在
             ClassGrade grade = baseMapper.getCodeNoTenant(classGrade.getOfficialName(),tenant.getTenantId());
             if (ObjectUtils.isNotNull(grade)){
-                //已经存在 不创建
+                //已经存在 过滤已经创建过班级的商品
+                List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+            }
+            if (CollectionUtils.isEmpty(relGoods)){
                 return;
             }
 
@@ -878,6 +885,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             if (Validator.isNotEmpty(classGradeStudentVo.getRebuyOrderGoodsId()) && classGradeStudentVo.getRebuyOrderGoodsId().longValue() > 0) {
                 classGradeStudentVo.setRebuy(orderMapper.getGradePeriod(classGradeStudentVo.getRebuyOrderGoodsId(), classGradeStudentVo.getUserId()));
             }
+            if (ObjectUtils.isNotNull(classGradeStudentVo.getOrgId())){
+                SysTenant tenant = iSysTenantService.getById(classGradeStudentVo.getOrgId());
+                if (ObjectUtils.isNotNull(tenant)){
+                    classGradeStudentVo.setTenantName(tenant.getTenantName());
+                }
+            }
         }
         return classGradeStudentVos;
     }
@@ -1647,7 +1660,12 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
             if (StringUtils.isNotBlank(bo.getRegisterCode())){
                 ClassGrade grade = baseMapper.getCodeNoTenant(bo.getRegisterCode(),tenant.getTenantId());
                 if (ObjectUtils.isNotNull(grade)){
-                    //已经存在 不创建
+                    //已经存在 过滤已经创建过班级的商品
+                    List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                    List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                    relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+                }
+                if (CollectionUtils.isEmpty(relGoods)){
                     return;
                 }
             }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java

@@ -236,6 +236,12 @@ public class ClassGradeStudentVo {
 	@ApiModelProperty("官方信息推送结果")
 	private String officialStatusMsg;
 
+	@ApiModelProperty("机构ID")
+	private Long orgId;
+
+	@ApiModelProperty("所属机构")
+	private String tenantName;
+
 
 
 }

+ 6 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -2629,7 +2629,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //班级是否存在
             ClassGrade grade = iClassGradeService.getCodeNoTenant(classGrade.getOfficialName(),tenant.getTenantId());
             if (ObjectUtils.isNotNull(grade)){
-                //已经存在 不创建
+                //已经存在 过滤已经创建过班级的商品
+                List<ClassGradeGoods> classGradeGoods = iClassGradeGoodsService.listByIdNoTenant(grade.getGradeId());
+                List<Long> goodsIds = classGradeGoods.stream().map(ClassGradeGoods::getGoodsId).collect(Collectors.toList());
+                relGoods = relGoods.stream().filter(x -> !goodsIds.contains(x.getGoodsId())).collect(Collectors.toList());
+            }
+            if (CollectionUtils.isEmpty(relGoods)){
                 return;
             }
 

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/vo/SysTaskVo.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.system.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 系统商户对象 sys_tenant
+ *
+ * @author hjl
+ * @date 2021-08-03
+ */
+@Data
+public class SysTaskVo implements Serializable {
+
+    private Long id;
+
+    private Long createTime;
+    private Long updateTime;
+    /** 0 失效 1启用 */
+    private Integer status;
+    /** 任务名称 */
+    @ApiModelProperty("任务名称")
+    private String taskName;
+    /** 任务数量 */
+    @ApiModelProperty("任务数量")
+    private Integer taskNum;
+    /** 完成数量 */
+    @ApiModelProperty("完成数量")
+    private Integer finishNum;
+    /** 执行参数 */
+    @ApiModelProperty("执行参数")
+    private String taskParam;
+    /** 下载路径 */
+    @ApiModelProperty("下载路径")
+    private String taskPath;
+    /** 1未开始 2执行中 3已完成 */
+    @ApiModelProperty("1未开始 2执行中 3已完成")
+    private Integer taskStatus;
+
+    private Long tenantId;
+
+}

+ 25 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubQueryBo.java

@@ -47,15 +47,36 @@ public class UserSubQueryBo extends BaseEntity {
 	@ApiModelProperty("关键字")
 	private String keyWord;
 
-	@ApiModelProperty("考试时间月份")
-	private Long applyTime;
+	@ApiModelProperty("月份")
+	private String ApplyDateTime;
 
-	@ApiModelProperty("考试时间")
-	private String examTime;
+	@ApiModelProperty("月份开始时间")
+	private Long monthStartTime;
+
+	@ApiModelProperty("月份结束时间")
+	private Long monthEndTime;
+
+	/** 考试开始时间段 */
+	@ApiModelProperty("考试开始时间段")
+	private String applySiteStartTime;
+
+	/** 考试结束时间段 */
+	@ApiModelProperty("考试结束时间段")
+	private String applySiteEndTime;
+
+	/** 考试日期 */
+	@ApiModelProperty("考试日期")
+	private Long applySiteExamTime;
 
 	@ApiModelProperty("当前时间")
 	private Long dataTime;
 
+	@ApiModelProperty("教育类型ID")
+	private Long educationId;
+
+	@ApiModelProperty("业务层次ID")
+	private Long businessId;
+
 
 	private List<Long> tenantIds;
 

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

@@ -4,6 +4,7 @@ import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.exam.bo.ExamApplySubscribeBo;
 import com.zhongzheng.modules.exam.bo.UpdateStudentImageBo;
 import com.zhongzheng.modules.exam.vo.ExamSessionVo;
+import com.zhongzheng.modules.system.vo.SysTaskVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.vo.*;
@@ -120,4 +121,8 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
 	List<UserSubscribe> listByTimeNoTenant(SubUserExportBo subUserExportBo);
 
 	void updateByIdNoTenant(UserSubscribe subscribe);
+
+	String subRecordUserExport(SubUserExportBo bo);
+
+	List<SysTaskVo> subUserExportList();
 }

+ 223 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -26,11 +26,14 @@ import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.file.ImageUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alioss.vo.FileBean;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.bo.UserProfileFit;
+import com.zhongzheng.modules.base.domain.UserProfile;
+import com.zhongzheng.modules.base.service.IUserProfileService;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseProjectType;
@@ -61,6 +64,7 @@ import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.grade.service.IUserPeriodService;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
 import com.zhongzheng.modules.inform.service.IInformRemindService;
@@ -73,6 +77,7 @@ import com.zhongzheng.modules.system.domain.SysTask;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysTaskService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.vo.SysTaskVo;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
@@ -99,6 +104,9 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -110,6 +118,7 @@ import java.util.List;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import java.util.zip.ZipOutputStream;
 
 import static java.util.stream.Collectors.toCollection;
@@ -132,6 +141,8 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
 
     @Autowired
     private IGoodsService iGoodsService;
+    @Autowired
+    private IMajorService iMajorService;
 
     @Autowired
     private IInformUserService iInformUserService;
@@ -148,6 +159,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IUserProfileService iUserProfileService;
+
     @Autowired
     private IExamApplySiteService iExamApplySiteService;
 
@@ -2655,6 +2669,32 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         }
         Long zeroTime = DateUtils.getTodayZeroTime();
         bo.setDataTime(zeroTime);
+        if (ObjectUtils.isNotNull(bo.getApplyDateTime()) && bo.getApplyDateTime().length() == 6){
+            //根据月份筛选
+            String dateStr = String.format(bo.getApplyDateTime()); // 指定年月
+            LocalDate date = LocalDate.parse(dateStr + "01", DateTimeFormatter.BASIC_ISO_DATE);
+            LocalDate dateFirst = date.with(TemporalAdjusters.firstDayOfMonth()); // 指定年月的第一天
+            LocalDate dateEnd = date.with(TemporalAdjusters.lastDayOfMonth()); // 指定年月的最后一天
+            ZonedDateTime zonedDateTime1 = dateFirst.atStartOfDay(ZoneId.systemDefault());
+            Date date1 = Date.from(zonedDateTime1.toInstant());
+            ZonedDateTime zonedDateTime = dateEnd.atStartOfDay(ZoneId.systemDefault());
+            Date date2 = Date.from(zonedDateTime.toInstant());
+            Long startTime = date1.getTime()/1000;
+            Long endTime = (date2.getTime()/1000) + 86400;
+            bo.setMonthStartTime(startTime);
+            bo.setMonthEndTime(endTime);
+        }else if (ObjectUtils.isNotNull(bo.getApplyDateTime()) && bo.getApplyDateTime().length() > 6){
+            //根据某天筛选
+            String dateStr = String.format(bo.getApplyDateTime());
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            try {
+                Date parse = sdf.parse(dateStr);
+                bo.setMonthStartTime(parse.getTime()/1000);
+                bo.setMonthEndTime(parse.getTime()/1000);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
         List<UserSubVo> userSubVos = baseMapper.getListSubscribe(bo);
         if (CollectionUtils.isEmpty(userSubVos)){
             return new ArrayList<>();
@@ -2690,7 +2730,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
     public Boolean subUserExport(SubUserExportBo bo) {
         //加入任务列表
         SysTask sysTask = new SysTask();
-        sysTask.setTaskName(String.format("%s 学员预约下载任务",DateUtils.getTime()));
+        sysTask.setTaskName(String.format("(%s)学员档案下载任务",DateUtils.getTime()));
         //下载数量
         String tenantId = ServletUtils.getRequest().getHeader("TenantId");
         SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
@@ -2723,6 +2763,188 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         baseMapper.updateByIdNoTenant(subscribe);
     }
 
+    @Override
+    public String subRecordUserExport(SubUserExportBo bo) {
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant sysTenant = iSysTenantService.getById(Long.valueOf(tenantId));
+        if (ObjectUtils.isNotNull(sysTenant.getExamRoom()) && sysTenant.getExamRoom() == 1){
+            //公用祥粤考场
+            List<SysTenant> list = iSysTenantService
+                    .list(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getStatus, 1)
+                            .eq(SysTenant::getExamRoom, 1));
+            bo.setTenantIds(list.stream().map(SysTenant::getTenantId).collect(Collectors.toList()));
+        }else {
+            bo.setTenantIds(Arrays.asList(Long.valueOf(tenantId)));
+        }
+        List<UserSubscribe> subscribeList = baseMapper.listByTimeNoTenant(bo);
+        if (CollectionUtils.isEmpty(subscribeList)){
+            throw new CustomException("该场次没有预约的学员!");
+        }
+        //商品分组
+        Map<Long, List<UserSubscribe>> map = subscribeList.stream().collect(Collectors.groupingBy(UserSubscribe::getGoodsId));
+        String zhiyuan = System.getProperty("user.dir");
+        String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试%s",DateUtils.timestampToDateFormat(bo.getApplyTime(),"yyyy-MM-dd"),DateUtils.getNowTime());
+        List<UserExamApplyExport> examApplyExports = new ArrayList<>();
+        map.forEach((k,v) -> {
+            Goods goods = iGoodsService.getGoodsByIdNotTenant(k);
+            if (ObjectUtils.isNull(goods) || ObjectUtils.isNull(goods.getMajorId())){
+                return;
+            }
+            Major major = iMajorService.getMajorByIdNoTenant(goods.getMajorId());
+            String majorPath = destDirPath+"/"+major.getCategoryName();
+            File dirw = new File(majorPath);
+            if (!dirw.exists()){
+                dirw.mkdirs();
+            }
+            String photoPath = majorPath+"/"+"广东省祥粤建设职业培训学校";
+            File dirw2 = new File(photoPath);
+            if (!dirw2.exists()){
+                dirw2.mkdirs();
+            }
+            List<UserSubApplyExport> applyExports = new ArrayList<>();
+            //学员头像
+            v.forEach(item -> {
+                User user = iUserService.getByIdNoTenant(item.getUserId());
+                //获取个人近照
+                try {
+                    InputStream inputStream = ossService.getStreamByObject(user.getOneInchPhotos());
+                    //写入本地文件
+                    String inchPath = photoPath + "/"+String.format("%s$头像.jpg", EncryptHandler.decrypt(user.getIdCard()));
+                    FileOutputStream fileOutputStream = new FileOutputStream(inchPath);
+                    byte[] buffer = new byte[1024];
+                    int len = 0;
+                    while ((len = inputStream.read(buffer)) != -1) {
+                        fileOutputStream.write(buffer, 0, len);
+                    }
+                    inputStream.close();
+                    fileOutputStream.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                //报考资料
+                UserProfile profile = iUserProfileService.getByOrderGoodsIdNoTenant(item.getOrderGoodsId());
+                if (ObjectUtils.isNull(profile)){
+                    return;
+                }
+                UserSubApplyExport applyExport = new UserSubApplyExport();
+                applyExport.setUserName(user.getRealname());
+                applyExport.setIdCard(EncryptHandler.decrypt(user.getIdCard()));
+                applyExport.setPhone(EncryptHandler.decrypt(user.getTelphone()));
+
+                String keyValue = profile.getKeyValue();
+                applyExport.setSex(getUserProfileValue(keyValue,"sex"));
+                applyExport.setEducation(getUserProfileValue(keyValue,"education"));
+                applyExport.setCompanyName(getUserProfileValue(keyValue,"work_unit"));
+                applyExport.setPostName(getUserProfileValue(keyValue,"apply_post"));
+                applyExport.setMajorName(getUserProfileValue(keyValue,"major"));
+                applyExport.setAge(getUserProfileValue(keyValue,"working_years"));
+                applyExport.setGraduateTime(getUserProfileValue(keyValue,"graduation_time"));
+                applyExports.add(applyExport);
+
+                //测试计划
+                UserExamApplyExport export = new UserExamApplyExport();
+                export.setUserName(user.getRealname());
+                export.setIdCard(EncryptHandler.decrypt(user.getIdCard()));
+                export.setPhone(EncryptHandler.decrypt(user.getTelphone()));
+                export.setPostName(getUserProfileValue(keyValue,"apply_post"));
+                export.setApplyName(
+                        String.format("%s测试%s-%s",DateUtils.timestampToDateFormat(item.getApplySiteExamTime(),"yyyy.MM.dd")
+                                ,applyTimeTransition(item.getApplySiteStartTime()),applyTimeTransition(item.getApplySiteEndTime())));
+                examApplyExports.add(export);
+            });
+            //打包zip
+            String zipPath = majorPath+"/"+"广东省祥粤建设职业培训学校.zip";
+            FileUtils.toZip(zipPath,photoPath,true);
+            //删除本地资源
+            Path pathStr = Paths.get(photoPath);
+            try (Stream<Path> walk = Files.walk(pathStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+            //报考资料
+            if (CollectionUtils.isNotEmpty(applyExports)){
+                ExcelUtil<UserSubApplyExport> util = new ExcelUtil<UserSubApplyExport>(UserSubApplyExport.class);
+                String path = majorPath + "/" +String.format("%s报名信息表",major.getCategoryName()) + ".xlsx";
+                util.exportEasyExcelStudy(util.exportEasyData(applyExports), path);
+            }
+        });
+
+        //测试计划
+        if (CollectionUtils.isNotEmpty(examApplyExports)){
+            ExcelUtil<UserExamApplyExport> util = new ExcelUtil<UserExamApplyExport>(UserExamApplyExport.class);
+            String path = destDirPath + "/测试计划.xlsx";
+            util.exportEasyExcelStudy(util.exportEasyData(examApplyExports), path);
+        }
+
+        //打包zip 上传oss
+        String zipPath = zhiyuan+"/zhongzheng-admin/src/main/resources/"
+                +String.format("%s预约考试%s.zip",DateUtils.timestampToDateFormat(bo.getApplyTime(),"yyyy-MM-dd"),DateUtils.getNowTime());
+        FileUtils.toZip(zipPath,destDirPath,true);
+        //上传oss
+        OssRequest ossRequest = new OssRequest();
+        ossRequest.setGradeId(0L);
+        ossRequest.setUserId(0L);
+        ossRequest.setImageStatus(7);
+        File file1 = new File(zipPath);
+        ossRequest.setFile(FileUtils.getMultipartFile(file1));
+        try {
+            String upload = ossService.upload(ossRequest);
+            //删除本地资源
+            Path pathStr = Paths.get(destDirPath);
+            try (Stream<Path> walk = Files.walk(pathStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+
+            Path zipStr = Paths.get(zipPath);
+            try (Stream<Path> walk = Files.walk(zipStr)) {
+                walk.sorted(Comparator.reverseOrder())
+                        .forEach(FileUtils::deleteDirectoryStream);
+            }catch (IOException e) {
+                log.error("删除本地资源失败:"+ DateUtils.getNowTime());
+            }
+            return upload;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    @Override
+    public List<SysTaskVo> subUserExportList() {
+        List<SysTask> list = iSysTaskService.list(new LambdaQueryWrapper<SysTask>().eq(SysTask::getStatus, 1));
+        if (CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        return list.stream().map(item -> BeanUtil.toBean(item,SysTaskVo.class)).collect(Collectors.toList());
+    }
+
+    private String applyTimeTransition(String time){
+        List<String> collect = Arrays.stream(time.split(":")).collect(Collectors.toList());
+        StringBuffer result = new StringBuffer();
+        for (String s : collect) {
+            result.append(s);
+        }
+        return result.toString();
+    }
+
+    private String getUserProfileValue(String keyValue,String key){
+        JSONObject jsonObject = JSONObject.parseObject(keyValue);
+        if (ObjectUtils.isNotNull(jsonObject.get(key))){
+            Object o = jsonObject.get(key);
+            JSONObject jsonObject1 = JSONObject.parseObject(JSONObject.toJSONString(o));
+            if (ObjectUtils.isNotNull(jsonObject1.get("value"))){
+                return jsonObject1.get("value").toString();
+            }
+        }
+        return "";
+    }
+
 
     /**
      * 学员学时图片修改

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserExamApplyExport.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.user.vo;
+
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 用户预约考试视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("测试计划")
+public class UserExamApplyExport implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Excel(name = "姓名",width = 30)
+	private String userName;
+
+	@Excel(name = "身份证号" ,width = 30)
+	private String idCard;
+
+	@Excel(name = "手机号" ,width = 30)
+	private String phone;
+
+	@Excel(name = "岗位",width = 30)
+	private String postName;
+
+	@Excel(name = "场次名称",width = 30)
+	private String applyName;
+
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserSubApplyExport.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.user.vo;
+
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 用户预约考试视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("学员预约报名资料")
+public class UserSubApplyExport implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Excel(name = "姓名",width = 30)
+	private String userName;
+
+	@Excel(name = "性别",width = 30)
+	private String sex;
+
+	@Excel(name = "身份证号" ,width = 30)
+	private String idCard;
+
+	@Excel(name = "手机号" ,width = 30)
+	private String phone;
+
+	@Excel(name = "学历" ,width = 30)
+	private String education;
+
+	@Excel(name = "工作单位",width = 30)
+	private String companyName;
+
+	@Excel(name = "岗位",width = 30)
+	private String postName;
+
+	@Excel(name = "所学专业",width = 30)
+	private String majorName;
+
+	@Excel(name = "工作年限",width = 30)
+	private String age;
+
+	@Excel(name = "毕业时间",width = 30)
+	private String graduateTime;
+
+}

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/base/UserProfileMapper.xml

@@ -266,4 +266,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and g.business_id = #{businessId}
         </if>
     </select>
+
+    <select id="getByOrderGoodsIdNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.base.domain.UserProfile">
+        SELECT * FROM user_profile WHERE order_goods_id = #{orderGoodsId} AND current_status = 1 AND `status` NOT IN (3,-1)
+    </select>
 </mapper>

+ 3 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/MajorMapper.xml

@@ -107,4 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getMajorByTenant" parameterType="map"  resultType="com.zhongzheng.modules.course.domain.Major">
         SELECT * FROM major where encoder = #{encoder} and tenant_id = #{newTenantId}
     </select>
+    <select id="getMajorByIdNoTenant" parameterType="java.lang.Long"  resultType="com.zhongzheng.modules.course.domain.Major">
+        SELECT * FROM major where id = #{majorId}
+    </select>
 </mapper>

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

@@ -41,4 +41,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         cgg.grade_id = #{gradeId}
     </select>
 
+    <select id="listByIdNoTenant" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.grade.domain.ClassGradeGoods">
+        SELECT cgg.* FROM class_grade_goods cgg
+        WHERE
+            cgg.grade_id = #{gradeId}
+    </select>
 </mapper>

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -171,6 +171,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="projectName" column="project_name"/>
         <result property="businessName" column="business_name"/>
         <result property="sevenYear" column="seven_year"/>
+        <result property="orgId" column="org_id"/>
 
         <result property="userBindWx" column="user_bind_wx"/>
         <result property="userFollowWx" column="user_follow_wx"/>
@@ -436,6 +437,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         g.major_id,
         u.province,
         cgu.reason,
+        cgu.tenant_id as org_id,
         cb.business_name,
         cpt.project_name,
         (case WHEN u.union_id is null then 0 ELSE 1 end) as user_bind_wx,

+ 19 - 4
zhongzheng-system/src/main/resources/mapper/modules/user/UserSubscribeMapper.xml

@@ -698,11 +698,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="keyWord != null and keyWord != '' ">
             AND (u.realname LIKE concat('%',#{keyWord},'%') OR u.id_card = #{keyWord,typeHandler=com.zhongzheng.common.type.EncryptHandler})
         </if>
-        <if test="applyTime != null and applyTime != '' ">
-            AND us.apply_site_exam_time = #{applyTime}
+        <if test="applySiteExamTime != null and applySiteExamTime != '' ">
+            and us.apply_site_exam_time = #{applySiteExamTime}
+        </if>
+        <if test="monthStartTime != null and monthStartTime != '' ">
+            and us.apply_site_exam_time &gt;= #{monthStartTime}
+        </if>
+        <if test="monthEndTime != null and monthEndTime != '' ">
+            and us.apply_site_exam_time &lt;= #{monthEndTime}
         </if>
-        <if test="examTime != null and examTime != '' ">
-            AND us.apply_site_start_time = #{examTime}
+        <if test="applySiteStartTime != null and applySiteStartTime != '' ">
+            and us.apply_site_start_time = #{applySiteStartTime}
+        </if>
+        <if test="applySiteEndTime != null and applySiteEndTime != '' ">
+            and us.apply_site_end_time = #{applySiteEndTime}
+        </if>
+        <if test="educationId != null and educationId != '' ">
+            AND g.education_type_id = #{educationId}
+        </if>
+        <if test="businessId != null and businessId != '' ">
+            AND g.business_id = #{businessId}
         </if>
         <if test="tenantIds != null and tenantIds.size()!=0 " >
             AND us.tenant_id in