浏览代码

1、增加统计分析导出接口
2、获取关注企业和用户收藏职位接口更改为get请求

rayson 10 月之前
父节点
当前提交
b7abc82b59
共有 16 个文件被更改,包括 553 次插入17 次删除
  1. 33 1
      citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelUtils.java
  2. 27 0
      citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelWriteDTO.java
  3. 3 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/DictTypeConstants.java
  4. 68 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/AnalysisController.java
  5. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java
  6. 78 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/analysis/AppRecruitAnalysisController.java
  7. 98 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitInterviewInviteAnalysisExcelRespVO.java
  8. 71 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitJobAnalysisExcelRespVO.java
  9. 80 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitJobCvRelAnalysisExcelRespVO.java
  10. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobCvRelSimpleRespVO.java
  11. 42 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/InterviewInviteConvert.java
  12. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobAdvertisedConvert.java
  13. 36 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobCvRelConvert.java
  14. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteService.java
  15. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  16. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java

+ 33 - 1
citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelUtils.java

@@ -1,9 +1,11 @@
 package com.citu.framework.excel.core.util;
 
-import com.citu.framework.excel.core.handler.SelectSheetWriteHandler;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.converters.longconverter.LongStringConverter;
+import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.citu.framework.excel.core.handler.SelectSheetWriteHandler;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -44,6 +46,36 @@ public class ExcelUtils {
         response.setContentType("application/vnd.ms-excel;charset=UTF-8");
     }
 
+    /**
+     * 将列表以 Excel 响应给前端
+     *
+     * @param response     响应
+     * @param filename     文件名
+     * @param writeDTOList Excel 写入列表
+     * @param <T>          泛型,保证 head 和 data 类型的一致性
+     * @throws IOException 写入失败的情况
+     */
+    public static <T> void write(HttpServletResponse response, String filename, List<ExcelWriteDTO> writeDTOList)
+            throws IOException {
+        // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
+        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
+        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).autoCloseStream(false).build()) {
+            for (ExcelWriteDTO writeDTO : writeDTOList) {
+                WriteSheet writeSheet = null;
+                writeSheet = EasyExcel.writerSheet(writeDTO.getSheetName()).head(writeDTO.getHead())
+                        // 不要自动关闭,交给 Servlet 自己处理
+                        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
+                        .registerWriteHandler(new SelectSheetWriteHandler(writeDTO.getHead())) // 基于固定 sheet 实现下拉框
+                        .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
+                        .build();
+                excelWriter.write(writeDTO.getData(), writeSheet);
+            }
+        }
+
+
+    }
+
     public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {
         return EasyExcel.read(file.getInputStream(), head, null)
                 .autoCloseStream(false)  // 不要自动关闭,交给 Servlet 自己处理

+ 27 - 0
citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelWriteDTO.java

@@ -0,0 +1,27 @@
+package com.citu.framework.excel.core.util;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * excel 写入包装类
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExcelWriteDTO {
+
+    /** sheet 名称 **/
+    private  String sheetName;
+
+    /** 包装对象类型 **/
+    private Class<Object> head;
+
+    /** 数据 **/
+    private List<Object> data;
+}

+ 3 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/DictTypeConstants.java

@@ -24,4 +24,7 @@ public interface DictTypeConstants {
 
     String MENDUNER_EXP_TYPE = "menduner_exp_type"; // 工作经验
 
+    String MENDUNER_JOB_STATUS = "menduner_job_status"; // 求职状态
+    String MENDUNER_SEX = "menduner_sex";
+
 }

+ 68 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/AnalysisController.java

@@ -1,7 +1,12 @@
 package com.citu.module.menduner.system.controller.admin.analysis;
 
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.framework.excel.core.util.ExcelWriteDTO;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
@@ -9,6 +14,12 @@ import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisR
 import com.citu.module.menduner.system.controller.base.analysis.RecruitInterviewInviteAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobCvRelAnalysisRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitInterviewInviteAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobCvRelAnalysisExcelRespVO;
+import com.citu.module.menduner.system.convert.InterviewInviteConvert;
+import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
+import com.citu.module.menduner.system.convert.JobCvRelConvert;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
@@ -21,11 +32,15 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static com.citu.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 统计分析")
@@ -126,4 +141,57 @@ public class AnalysisController {
         return success(jobAdvertisedService.getJobNum(reqVO));
     }
 
+    @GetMapping("/export")
+    @Operation(summary = "导出统计分析 Excel")
+    @ApiAccessLog(operateType = EXPORT)
+    public void export(@Valid RecruitAnalysisReqVO reqVO,
+                       HttpServletResponse response) throws IOException {
+        reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ExcelWriteDTO> writeDTOList = new ArrayList<>();
+        packExcelData(writeDTOList,
+                RecruitJobCvRelAnalysisExcelRespVO.class,
+                JobCvRelConvert.INSTANCE.convertList(jobCvcRelService.getNewCvRel(reqVO).getList()),
+                "新投递简历明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobCvRelAnalysisExcelRespVO.class,
+                JobCvRelConvert.INSTANCE.convertList(jobCvcRelService.getLookCvRel(reqVO).getList()),
+                "已查看简历明细");
+
+        packExcelData(writeDTOList,
+                RecruitInterviewInviteAnalysisExcelRespVO.class,
+                InterviewInviteConvert.INSTANCE.convertList(interviewInviteService.getWaitInterview(reqVO).getList()),
+                "已邀面试明细");
+
+        packExcelData(writeDTOList,
+                RecruitInterviewInviteAnalysisExcelRespVO.class,
+                InterviewInviteConvert.INSTANCE.convertList(interviewInviteService.getCompleteInterview(reqVO).getList()),
+                "完成面试明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobAnalysisExcelRespVO.class,
+                JobAdvertisedConvert.INSTANCE.convertList6(jobAdvertisedService.getBrowseNum(reqVO).getList()),
+                "职位浏览量明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobAnalysisExcelRespVO.class,
+                JobAdvertisedConvert.INSTANCE.convertList6(jobAdvertisedService.getJobNum(reqVO).getList()),
+                "已发布职位明细");
+
+        // 导出 Excel
+        ExcelUtils.write(response, "统计分析明细.xls",writeDTOList);
+    }
+
+    public void packExcelData
+            (List<ExcelWriteDTO> writeDTOList, Class head, List data, String sheetName) {
+        if (CollUtil.isEmpty(data)) {
+            return;
+        }
+        ExcelWriteDTO writeDTO = new ExcelWriteDTO();
+        writeDTO.setHead(head);
+        writeDTO.setData(data);
+        writeDTO.setSheetName(sheetName);
+        writeDTOList.add(writeDTO);
+    }
+
 }

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java

@@ -88,7 +88,7 @@ public class AppPersonController {
     }
 
     @PreAuthenticated
-    @PostMapping("/get/job/favorite/page")
+    @GetMapping("/get/job/favorite/page")
     @Operation(summary = "获取收藏的招聘职位分页")
     public CommonResult<PageResult<AppJobAdvertisedRespVO>> getJobFavoritePage
             (@Valid @RequestBody PageParam reqVO) {
@@ -96,7 +96,7 @@ public class AppPersonController {
     }
 
     @PreAuthenticated
-    @PostMapping("/get/enterprise/subscribe/page")
+    @GetMapping("/get/enterprise/subscribe/page")
     @Operation(summary = "获取关注的企业分页")
     public CommonResult<PageResult<EnterpriseBaseSimpleRespVO>> getEnterpriseSubscribePage
             (@Valid @RequestBody PageParam reqVO) {

+ 78 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/analysis/AppRecruitAnalysisController.java

@@ -1,15 +1,27 @@
 package com.citu.module.menduner.system.controller.app.recruit.analysis;
 
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.framework.excel.core.util.ExcelWriteDTO;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
-import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisReqVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisReqVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitInterviewInviteAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobCvRelAnalysisRespVO;
-import com.citu.module.menduner.system.dal.mysql.interview.InterviewInviteMapper;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitInterviewInviteAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobCvRelAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.hunt.HuntRespVO;
+import com.citu.module.menduner.system.convert.InterviewInviteConvert;
+import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
+import com.citu.module.menduner.system.convert.JobCvRelConvert;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
@@ -22,11 +34,15 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static com.citu.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "招聘端 - 统计分析")
@@ -74,7 +90,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/job/cv/new/page")
-    @Operation(summary = "获取新投递简历统计分析明细")
+    @Operation(summary = "获取新投递简历明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitJobCvRelAnalysisRespVO>> getNewCvRel(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -83,7 +99,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/job/cv/look/page")
-    @Operation(summary = "获取已查看简历统计分析明细")
+    @Operation(summary = "获取已查看简历明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitJobCvRelAnalysisRespVO>> getLookCvRel(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -92,7 +108,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/interview/wait/page")
-    @Operation(summary = "获取待面试统计分析明细")
+    @Operation(summary = "获取待面试明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitInterviewInviteAnalysisRespVO>> getWaitInterview(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -101,7 +117,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/interview/complete/page")
-    @Operation(summary = "获取完成面试统计分析明细")
+    @Operation(summary = "获取完成面试明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitInterviewInviteAnalysisRespVO>> getCompleteInterview(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -110,7 +126,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/job/browse/num/page")
-    @Operation(summary = "获取发布职位浏览量统计分析明细")
+    @Operation(summary = "获取发布职位浏览量明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitJobAnalysisRespVO>> getBrowseNum(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -127,7 +143,7 @@ public class AppRecruitAnalysisController {
     }
 
     @GetMapping("/get/job/num/page")
-    @Operation(summary = "获取发布职位统计分析明细")
+    @Operation(summary = "获取发布职位明细")
     @PreAuthenticated
     public CommonResult<PageResult<RecruitJobAnalysisRespVO>> getJobNum(
             @Valid RecruitAnalysisReqVO reqVO) {
@@ -135,6 +151,60 @@ public class AppRecruitAnalysisController {
         return success(jobAdvertisedService.getJobNum(reqVO));
     }
 
+    @GetMapping("/export")
+    @Operation(summary = "导出统计分析 Excel")
+    @ApiAccessLog(operateType = EXPORT)
+    public void export(@Valid RecruitAnalysisReqVO reqVO,
+                       HttpServletResponse response) throws IOException {
+        setCommonCondition(reqVO);
+        reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ExcelWriteDTO> writeDTOList = new ArrayList<>();
+        packExcelData(writeDTOList,
+                RecruitJobCvRelAnalysisExcelRespVO.class,
+                JobCvRelConvert.INSTANCE.convertList(jobCvcRelService.getNewCvRel(reqVO).getList()),
+                "新投递简历明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobCvRelAnalysisExcelRespVO.class,
+                JobCvRelConvert.INSTANCE.convertList(jobCvcRelService.getLookCvRel(reqVO).getList()),
+                "已查看简历明细");
+
+        packExcelData(writeDTOList,
+                RecruitInterviewInviteAnalysisExcelRespVO.class,
+                InterviewInviteConvert.INSTANCE.convertList(interviewInviteService.getWaitInterview(reqVO).getList()),
+                "已邀面试明细");
+
+        packExcelData(writeDTOList,
+                RecruitInterviewInviteAnalysisExcelRespVO.class,
+                InterviewInviteConvert.INSTANCE.convertList(interviewInviteService.getCompleteInterview(reqVO).getList()),
+                "完成面试明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobAnalysisExcelRespVO.class,
+                JobAdvertisedConvert.INSTANCE.convertList6(jobAdvertisedService.getBrowseNum(reqVO).getList()),
+                "职位浏览量明细");
+
+        packExcelData(writeDTOList,
+                RecruitJobAnalysisExcelRespVO.class,
+                JobAdvertisedConvert.INSTANCE.convertList6(jobAdvertisedService.getJobNum(reqVO).getList()),
+                "已发布职位明细");
+
+        // 导出 Excel
+        ExcelUtils.write(response, "统计分析明细.xls",writeDTOList);
+    }
+
+    public void packExcelData
+            (List<ExcelWriteDTO> writeDTOList, Class head, List data, String sheetName) {
+        if (CollUtil.isEmpty(data)) {
+            return;
+        }
+        ExcelWriteDTO writeDTO = new ExcelWriteDTO();
+        writeDTO.setHead(head);
+        writeDTO.setData(data);
+        writeDTO.setSheetName(sheetName);
+        writeDTOList.add(writeDTO);
+    }
+
 
     private void setCommonCondition(RecruitAnalysisReqVO reqVO) {
         reqVO.setEnterpriseId(LoginUserContext.getEnterpriseId());

+ 98 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitInterviewInviteAnalysisExcelRespVO.java

@@ -0,0 +1,98 @@
+package com.citu.module.menduner.system.controller.base.analysis.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.citu.framework.excel.core.annotations.DictFormat;
+import com.citu.framework.excel.core.convert.DictConvert;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
+import static com.citu.module.menduner.system.enums.DictTypeConstants.MENDUNER_EDUCATION_TYPE;
+
+@Schema(description = "面试明细导出 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RecruitInterviewInviteAnalysisExcelRespVO {
+
+    @ExcelProperty("投递用户姓名")
+    @Schema(description = "真实姓名", example = "王五")
+    private String name;
+
+    @ExcelProperty(value = "用户性别", converter = DictConvert.class)
+    @DictFormat(MENDUNER_SEX)
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @ExcelProperty("出生日期")
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
+    @ExcelProperty(value = "求职状态", converter = DictConvert.class)
+    @DictFormat(MENDUNER_JOB_STATUS)
+    @Schema(description = "求职状态(0离职-随时到岗 1在职-月内到岗 2在职-考虑机会 3在职-暂不考虑)", example = "1")
+    private String jobStatus;
+
+    @ExcelProperty(value = "工作经验", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EXP_TYPE)
+    @Schema(description = "工作经验", example = "1")
+    private String expType;
+
+    @ExcelProperty(value = "学历要求", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EDUCATION_TYPE)
+    @Schema(description = "学历", example = "2")
+    private String eduType;
+
+    // ========== 招聘职位信息 ==========
+
+    @ExcelProperty("招聘职位标题")
+    @Schema(description = "招聘职位标题", example = "项目经理")
+    private String jobName;
+
+    @ExcelProperty("薪酬from")
+    @Schema(description = "薪酬from", example = "6")
+    private BigDecimal payFrom;
+
+    @ExcelProperty("薪酬to")
+    @Schema(description = "薪酬to", example = "12")
+    private BigDecimal payTo;
+
+    @ExcelProperty(value = "薪酬单位", converter = DictConvert.class)
+    @DictFormat(MENDUNER_PAY_UNIT)
+    @Schema(description = "薪酬单位(menduner_pay_unit)", example = "月/年")
+    private String payUnit;
+
+    // ========== 面试 ==========
+
+    @Schema(description = "面试时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("面试时间")
+    private LocalDateTime time;
+
+    @Schema(description = "受邀方联系电话", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("受邀方联系电话|冗余")
+    private String phone;
+
+    @Schema(description = "邀请方联系电话", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("邀请方联系电话|冗余")
+    private String invitePhone;
+
+    @Schema(description = "面试地址")
+    @ExcelProperty("面试地址")
+    private String address;
+
+    @Schema(description = "原因")
+    @ExcelProperty("原因")
+    private String reason;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "反馈评价")
+    @ExcelProperty("反馈评价")
+    private String evaluate;
+
+}

+ 71 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitJobAnalysisExcelRespVO.java

@@ -0,0 +1,71 @@
+package com.citu.module.menduner.system.controller.base.analysis.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.citu.framework.excel.core.annotations.DictFormat;
+import com.citu.framework.excel.core.convert.DictConvert;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
+
+@Schema(description = "职位明细导出 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RecruitJobAnalysisExcelRespVO {
+
+    @Schema(description = "职位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @ExcelProperty("职位名称")
+    private String name;
+
+    @Schema(description = "工作经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "工作经验", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EXP_TYPE)
+    private String expType;
+
+    @Schema(description = "学历要求", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "学历要求", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EDUCATION_TYPE)
+    private String eduType;
+
+    @Schema(description = "薪酬from")
+    @ExcelProperty("薪酬from")
+    private BigDecimal payFrom;
+
+    @Schema(description = "薪酬to")
+    @ExcelProperty("薪酬to")
+    private BigDecimal payTo;
+
+    @Schema(description = "薪酬单位")
+    @ExcelProperty(value = "薪酬单位", converter = DictConvert.class)
+    @DictFormat(MENDUNER_PAY_UNIT)
+    private String payUnit;
+
+    @Schema(description = "是否雇佣 (众聘)")
+    @ExcelProperty("是否雇佣 (众聘)")
+    private Boolean hire;
+
+    @Schema(description = "雇佣金额")
+    @ExcelProperty("雇佣金额")
+    private Long hirePrice;
+
+    @Schema(description = "职位状态", example = "2")
+    @ExcelProperty(value = "职位状态", converter = DictConvert.class)
+    @DictFormat(MENDUNER_STATUS)
+    private String status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+    @ExcelProperty("职位浏览量")
+    @Schema(description = "浏览量")
+    private Long num;
+}

+ 80 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/analysis/excel/RecruitJobCvRelAnalysisExcelRespVO.java

@@ -0,0 +1,80 @@
+package com.citu.module.menduner.system.controller.base.analysis.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.citu.framework.excel.core.annotations.DictFormat;
+import com.citu.framework.excel.core.convert.DictConvert;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
+
+@Schema(description = "简历明细导出 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RecruitJobCvRelAnalysisExcelRespVO {
+
+    @ExcelProperty("简历附件标题")
+    @Schema(description = "简历附件标题")
+    private String title;
+
+    @ExcelProperty("简历附件地址")
+    @Schema(description = "简历附件地址")
+    private String url;
+
+    @ExcelProperty("投递用户姓名")
+    @Schema(description = "真实姓名", example = "王五")
+    private String name;
+
+    @ExcelProperty(value = "用户性别", converter = DictConvert.class)
+    @DictFormat(MENDUNER_SEX)
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @ExcelProperty("出生日期")
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
+    @ExcelProperty(value = "求职状态", converter = DictConvert.class)
+    @DictFormat(MENDUNER_JOB_STATUS)
+    @Schema(description = "求职状态(0离职-随时到岗 1在职-月内到岗 2在职-考虑机会 3在职-暂不考虑)", example = "1")
+    private String jobStatus;
+
+    @ExcelProperty(value = "工作经验", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EXP_TYPE)
+    @Schema(description = "工作经验", example = "1")
+    private String expType;
+
+    @ExcelProperty(value = "学历要求", converter = DictConvert.class)
+    @DictFormat(MENDUNER_EDUCATION_TYPE)
+    @Schema(description = "学历", example = "2")
+    private String eduType;
+
+    @ExcelProperty(value = "投递时间")
+    @Schema(description = "投递时间")
+    private LocalDateTime createTime;
+
+    // ========== 招聘职位信息 ==========
+
+    @ExcelProperty("招聘职位标题")
+    @Schema(description = "招聘职位标题", example = "项目经理")
+    private String jobName;
+
+    @ExcelProperty("薪酬from")
+    @Schema(description = "薪酬from", example = "6")
+    private BigDecimal payFrom;
+
+    @ExcelProperty("薪酬to")
+    @Schema(description = "薪酬to", example = "12")
+    private BigDecimal payTo;
+
+    @ExcelProperty(value = "薪酬单位", converter = DictConvert.class)
+    @DictFormat(MENDUNER_PAY_UNIT)
+    @Schema(description = "薪酬单位(menduner_pay_unit)", example = "月/年")
+    private String payUnit;
+
+
+}

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobCvRelSimpleRespVO.java

@@ -30,4 +30,7 @@ public class JobCvRelSimpleRespVO {
     @Schema(description = "更新时间")
     private LocalDateTime updateTime;
 
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
 }

+ 42 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/InterviewInviteConvert.java

@@ -0,0 +1,42 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.base.analysis.RecruitInterviewInviteAnalysisRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitJobCvRelAnalysisRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitInterviewInviteAnalysisExcelRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobCvRelAnalysisExcelRespVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface InterviewInviteConvert {
+
+    InterviewInviteConvert INSTANCE = Mappers.getMapper(InterviewInviteConvert.class);
+
+
+    @Mappings({
+            @Mapping(source = "resp.person.name", target = "name"),
+            @Mapping(source = "resp.person.sex", target = "sex"),
+            @Mapping(source = "resp.person.birthday", target = "birthday"),
+            @Mapping(source = "resp.person.jobStatus", target = "jobStatus"),
+            @Mapping(source = "resp.person.expType", target = "expType"),
+            @Mapping(source = "resp.person.eduType", target = "eduType"),
+            @Mapping(source = "resp.job.name", target = "jobName"),
+            @Mapping(source = "resp.job.payFrom", target = "payFrom"),
+            @Mapping(source = "resp.job.payTo", target = "payTo"),
+            @Mapping(source = "resp.job.payUnit", target = "payUnit"),
+            @Mapping(source = "resp.time", target = "time"),
+            @Mapping(source = "resp.phone", target = "phone"),
+            @Mapping(source = "resp.invitePhone", target = "invitePhone"),
+            @Mapping(source = "resp.address", target = "address"),
+            @Mapping(source = "resp.reason", target = "reason"),
+            @Mapping(source = "resp.remark", target = "remark"),
+            @Mapping(source = "resp.evaluate", target = "evaluate"),
+    })
+    RecruitInterviewInviteAnalysisExcelRespVO convert(RecruitInterviewInviteAnalysisRespVO resp);
+
+    List<RecruitInterviewInviteAnalysisExcelRespVO> convertList(List<RecruitInterviewInviteAnalysisRespVO> list);
+}

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobAdvertisedConvert.java

@@ -5,6 +5,8 @@ import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobAdver
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobDetailRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobSaveReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobAnalysisExcelRespVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.es.job.ESJobAdvertisedMergeDO;
 import org.mapstruct.Mapper;
@@ -38,4 +40,8 @@ public interface JobAdvertisedConvert {
     AppRecruitJobRespVO convert4(JobAdvertisedDO bean);
 
     AppRecruitJobDetailRespVO convert5(AppJobAdvertisedDetailRespVO resp);
+
+    RecruitJobAnalysisExcelRespVO convert6(RecruitJobAnalysisRespVO bean);
+
+    List<RecruitJobAnalysisExcelRespVO> convertList6(List<RecruitJobAnalysisRespVO> list);
 }

+ 36 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobCvRelConvert.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.base.analysis.RecruitJobCvRelAnalysisRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobCvRelAnalysisExcelRespVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface JobCvRelConvert {
+
+    JobCvRelConvert INSTANCE = Mappers.getMapper(JobCvRelConvert.class);
+
+
+    @Mappings({
+            @Mapping(source = "resp.title", target = "title"),
+            @Mapping(source = "resp.url", target = "url"),
+            @Mapping(source = "resp.createTime", target = "createTime"),
+            @Mapping(source = "resp.person.name", target = "name"),
+            @Mapping(source = "resp.person.sex", target = "sex"),
+            @Mapping(source = "resp.person.birthday", target = "birthday"),
+            @Mapping(source = "resp.person.jobStatus", target = "jobStatus"),
+            @Mapping(source = "resp.person.expType", target = "expType"),
+            @Mapping(source = "resp.person.eduType", target = "eduType"),
+            @Mapping(source = "resp.job.name", target = "jobName"),
+            @Mapping(source = "resp.job.payFrom", target = "payFrom"),
+            @Mapping(source = "resp.job.payTo", target = "payTo"),
+            @Mapping(source = "resp.job.payUnit", target = "payUnit"),
+    })
+    RecruitJobCvRelAnalysisExcelRespVO convert(RecruitJobCvRelAnalysisRespVO resp);
+
+    List<RecruitJobCvRelAnalysisExcelRespVO> convertList(List<RecruitJobCvRelAnalysisRespVO> list);
+}

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteService.java

@@ -165,10 +165,10 @@ public interface InterviewInviteService {
 
     // ========== 统计分析 ==========
 
-    /** 获取待面试统计分析明细 */
+    /** 获取待面试明细 */
     PageResult<RecruitInterviewInviteAnalysisRespVO> getWaitInterview(RecruitAnalysisReqVO reqVO);
 
-    /** 获取完成面试统计分析明细 */
+    /** 获取完成面试明细 */
     PageResult<RecruitInterviewInviteAnalysisRespVO> getCompleteInterview(RecruitAnalysisReqVO reqVO);
 
 }

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java

@@ -175,13 +175,13 @@ public interface JobAdvertisedService {
      **/
     void top(List<Long> ids);
 
-    /** 获取发布职位浏览量统计分析明细 */
+    /** 获取发布职位浏览量明细 */
     PageResult<RecruitJobAnalysisRespVO> getBrowseNum(RecruitAnalysisReqVO reqVO);
 
     /** 获取发布职位浏览量总数 */
     Long getBrowseNumCount(RecruitAnalysisReqVO reqVO);
 
-    /** 获取发布职位统计分析明细 */
+    /** 获取发布职位明细 */
     PageResult<RecruitJobAnalysisRespVO> getJobNum(RecruitAnalysisReqVO reqVO);
 
 

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java

@@ -137,9 +137,9 @@ public interface JobCvRelService {
      **/
     Map<String, Object[]> getJobCvExpCount(RecruitAnalysisReqVO reqVO);
 
-    /** 获取新投递简历统计分析明细 */
+    /** 获取新投递简历明细 */
     PageResult<RecruitJobCvRelAnalysisRespVO> getNewCvRel(RecruitAnalysisReqVO reqVO);
 
-    /** 获取已查看简历统计分析明细 */
+    /** 获取已查看简历明细 */
     PageResult<RecruitJobCvRelAnalysisRespVO> getLookCvRel(RecruitAnalysisReqVO reqVO);
 }