Gqingci 3 дней назад
Родитель
Сommit
7d69e1ee96

+ 26 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainPostApplyController.java

@@ -4,14 +4,21 @@ import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.main.domain.bo.MainPostApplyBo;
+import org.dromara.main.domain.vo.MainPostApplyImportVo;
 import org.dromara.main.domain.vo.MainPostApplyVo;
+import org.dromara.main.listener.MainPostApplyImportListener;
 import org.dromara.main.service.IMainPostApplyService;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 
 @RequiredArgsConstructor
@@ -55,4 +62,23 @@ public class MainPostApplyController extends BaseController {
     public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
         return toAjax(mainPostApplyService.deleteWithValidByIds(Arrays.asList(ids), true));
     }
+
+    /**
+     * 批量导入岗位数据
+     *
+     * @param file 导入文件
+     */
+    @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
+        ExcelResult<MainPostApplyImportVo> result = ExcelUtil.importExcel(file.getInputStream(), MainPostApplyImportVo.class, new MainPostApplyImportListener());
+        return R.ok(result.getAnalysis());
+    }
+
+    /**
+     * 下载岗位导入模板
+     */
+    @PostMapping("/importTemplate")
+    public void importTemplate(jakarta.servlet.http.HttpServletResponse response) {
+        ExcelUtil.exportExcel(new ArrayList<>(), "岗位数据", MainPostApplyImportVo.class, response);
+    }
 }

+ 83 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainPostApplyImportVo.java

@@ -0,0 +1,83 @@
+package org.dromara.main.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 岗位申请导入VO
+ */
+@Data
+@NoArgsConstructor
+public class MainPostApplyImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "岗位名称")
+    private String postName;
+
+    @ExcelProperty(value = "岗位类型")
+    private String postType;
+
+    @ExcelProperty(value = "岗位级别")
+    private String postLevel;
+
+    @ExcelProperty(value = "工作省份")
+    private String workProvince;
+
+    @ExcelProperty(value = "工作城市")
+    private String workCity;
+
+    @ExcelProperty(value = "工作区县")
+    private String workDistrict;
+
+    @ExcelProperty(value = "工作地址")
+    private String workAddress;
+
+    @ExcelProperty(value = "学历要求")
+    private String educationRequirement;
+
+    @ExcelProperty(value = "招聘人数")
+    private Integer recruitNum;
+
+    @ExcelProperty(value = "最低薪资")
+    private BigDecimal minSalary;
+
+    @ExcelProperty(value = "最高薪资")
+    private BigDecimal maxSalary;
+
+    @ExcelProperty(value = "是否急招(0否1是)")
+    private Integer isUrgent;
+
+    @ExcelProperty(value = "性别要求")
+    private String genderRequirement;
+
+    @ExcelProperty(value = "到岗时间")
+    private String arrivalTime;
+
+    @ExcelProperty(value = "实习时长")
+    private String internshipDuration;
+
+    @ExcelProperty(value = "是否愿意出差(0否1是)")
+    private Integer willingToTravel;
+
+    @ExcelProperty(value = "福利标签")
+    private String welfareTags;
+
+    @ExcelProperty(value = "岗位描述")
+    private String postDescription;
+
+    @ExcelProperty(value = "岗位要求")
+    private String jobRequirement;
+
+    @ExcelProperty(value = "学校要求")
+    private String schoolRequirement;
+
+    @ExcelProperty(value = "年级要求")
+    private String gradeRequirement;
+}

+ 127 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/listener/MainPostApplyImportListener.java

@@ -0,0 +1,127 @@
+package org.dromara.main.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.idev.excel.context.AnalysisContext;
+import cn.idev.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.excel.core.ExcelListener;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.main.domain.MainAudit;
+import org.dromara.main.domain.MainPostApply;
+import org.dromara.main.domain.bo.MainPostApplyBo;
+import org.dromara.main.domain.vo.MainPostApplyImportVo;
+import org.dromara.main.mapper.MainAuditMapper;
+import org.dromara.main.mapper.MainPostApplyMapper;
+import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.service.ISysTenantService;
+
+import java.util.List;
+
+/**
+ * 岗位申请批量导入监听器
+ */
+@Slf4j
+public class MainPostApplyImportListener extends AnalysisEventListener<MainPostApplyImportVo> implements ExcelListener<MainPostApplyImportVo> {
+
+    private final MainPostApplyMapper postApplyMapper;
+    private final MainAuditMapper auditMapper;
+    private final ISysTenantService tenantService;
+
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public MainPostApplyImportListener() {
+        this.postApplyMapper = SpringUtils.getBean(MainPostApplyMapper.class);
+        this.auditMapper = SpringUtils.getBean(MainAuditMapper.class);
+        this.tenantService = SpringUtils.getBean(ISysTenantService.class);
+    }
+
+    @Override
+    public void invoke(MainPostApplyImportVo importVo, AnalysisContext context) {
+        try {
+            if (StrUtil.isBlank(importVo.getPostName())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、岗位名称不能为空");
+                return;
+            }
+
+            String tenantId = LoginHelper.getTenantId();
+            MainPostApplyBo bo = BeanUtil.toBean(importVo, MainPostApplyBo.class);
+            bo.setTenantId(tenantId);
+
+            // 自动填充公司名称
+            if (StrUtil.isBlank(bo.getCompanyName()) && StrUtil.isNotBlank(tenantId)) {
+                SysTenantVo tenantVo = tenantService.queryByTenantId(tenantId);
+                if (tenantVo != null) {
+                    bo.setCompanyName(tenantVo.getCompanyName());
+                }
+            }
+
+            MainPostApply entity = BeanUtil.toBean(bo, MainPostApply.class);
+
+            // 招聘人数校验
+            if (entity.getRecruitNum() != null && entity.getRecruitNum() <= 0) {
+                throw new ServiceException("招聘人数必须大于0");
+            }
+
+            boolean flag = postApplyMapper.insert(entity) > 0;
+            if (flag) {
+                // 创建待审核记录
+                MainAudit audit = new MainAudit();
+                audit.setAuditType(2);
+                audit.setTargetId(entity.getId());
+                audit.setAuditResult(0);
+                audit.setTenantId(tenantId);
+                auditMapper.insert(audit);
+
+                entity.setAuditId(audit.getId());
+                entity.setApplyStatus(0);
+                postApplyMapper.updateById(entity);
+
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、岗位 ").append(importVo.getPostName()).append(" 导入成功");
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、岗位 " + (importVo.getPostName() == null ? "未知" : importVo.getPostName()) + " 导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+    }
+
+    @Override
+    public ExcelResult<MainPostApplyImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<MainPostApplyImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}