package com.ruoyi.web.controller.tool; import java.text.SimpleDateFormat; import java.util.*; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.system.domain.resume.Resume; import com.ruoyi.system.domain.resume.ResumeFile; import com.ruoyi.system.service.resume.IResumeService; import com.ruoyi.utils.resumeAnalysis.FileUtils; import com.ruoyi.utils.resumeAnalysis.ResumeAnalysisUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Base64Utils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; /** * 简历管理Controller * * @author ruoyi * @date 2024-02-18 */ @Api(tags = "智能简历系统") @RestController @RequestMapping("/system/resume") public class ResumeController extends BaseController { @Autowired private IResumeService resumeService; @Autowired private ServerConfig serverConfig; private static final List TYPE_LIST = Arrays.asList(".jpg", ".jpe", ".jpeg", ".jfif", ".png", ".webp", ".bmp", ".tif", ".tiff"); /** * 查询简历管理列表 */ //@PreAuthorize("@ss.hasPermi('system:resume:list')") @ApiOperation(value = "分页查询简历管理列表") @GetMapping("/list") public TableDataInfo list(Resume resume) { startPage(); if (StringUtils.isNotEmpty( SecurityUtils.getLoginUser().getCorpid())){ resume.setCorpId(SecurityUtils.getLoginUser().getCorpid()); } List list = resumeService.selectResumeList(resume); return getDataTable(list); } /** * 导出简历管理列表 */ //@PreAuthorize("@ss.hasPermi('system:resume:export')") //@Log(title = "简历管理", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, Resume resume) { if (StringUtils.isNotEmpty(SecurityUtils.getLoginUser().getCorpid())) { resume.setCorpId(SecurityUtils.getLoginUser().getCorpid()); } List list = resumeService.selectResumeList(resume); ExcelUtil util = new ExcelUtil(Resume.class); util.exportExcel(response, list, "简历管理数据"); } /** * 获取简历管理详细信息 */ @ApiOperation(value = "查询简历管理详情") //@PreAuthorize("@ss.hasPermi('system:resume:query')") @GetMapping(value = "/{resumeId}") public AjaxResult getInfo(@PathVariable("resumeId") Long resumeId) { String corpid = SecurityUtils.getPrincipal(); return success(resumeService.selectResumeByResumeId(resumeId,corpid)); } /** * 新增简历管理 */ @ApiOperation(value = "新增简历管理") //@PreAuthorize("@ss.hasPermi('system:resume:add')") //@Log(title = "简历管理", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody Resume resume) { if (StringUtils.isNotEmpty(SecurityUtils.getLoginUser().getCorpid())) { resume.setCorpId(SecurityUtils.getLoginUser().getCorpid()); } return toAjax(resumeService.insertResume(resume)); } /** * 方法描述 上传简历并进行解析 * @author * @date */ @ApiOperation(value = "上传简历并进行解析") @PostMapping(value = "/uploadResumeSimilarity",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public AjaxResult uploadResumeSimilarity(MultipartFile file) { String corpId = ""; if (StringUtils.isNotEmpty(SecurityUtils.getLoginUser().getCorpid())) { corpId = SecurityUtils.getLoginUser().getCorpid(); } try{ if (file == null || StringUtils.isBlank(file.getOriginalFilename())) { return AjaxResult.error("请上传简历"); } String path = RuoYiConfig.getUploadPath(); String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); String fileName = FileUploadUtils.upload(path, file); String newFileName = com.ruoyi.common.utils.file.FileUtils.getName(fileName); // 上传位置 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String ymd = sdf.format(new Date()); String lastPath = "/" + ymd + "/"; String fileUrl = path + lastPath + newFileName; if(suffix.equals(".doc")||suffix.equals(".docx")||TYPE_LIST.contains(suffix)){ List content = null; try { if(suffix.equals(".doc")){ content = FileUtils.readWord(fileUrl); } else if (suffix.equals(".docx")) { content = FileUtils.readWordDocx(fileUrl); }else if (TYPE_LIST.contains(suffix)){ String encodeToString = Base64Utils.encodeToString(file.getBytes()); RestTemplate restTemplate = new RestTemplate(); Map map = new HashMap<>(); map.put("base64",encodeToString); Map options = new HashMap<>(); options.put("tbpu.parser","single_line"); options.put("data.format","text"); options.put("ocr.angle",false); options.put("ocr.language","简体中文"); options.put("ocr.maxSideLen",1024); map.put("options",options); ResponseEntity responseEntity = restTemplate.postForEntity( "http://127.0.0.1:1224/api/ocr", map, String.class); JSONObject parse = JSONObject.parse(responseEntity.getBody()); if (100 != parse.getInteger("code")) { return AjaxResult.error("文件不存在解析失败"); } content=new ArrayList<>(); String[] split = parse.getString("data").split("\n"); content.addAll(Arrays.asList(split)); } } catch (Exception e) { return AjaxResult.error("文件不存在解析失败"); } //处理标识分段,并判断内容情况 Resume resume = ResumeAnalysisUtil.toResumeAnalysis(content); resume.setCorpId(corpId); //处理文件信息 String url = serverConfig.getUrl() + fileName; ResumeFile resumeFile = new ResumeFile(); resumeFile.setUploadPath(url); resumeFile.setUploadName(newFileName); resumeFile.setUploadType(newFileName.split("\\.")[1]); resume.setResumeFile(resumeFile); return AjaxResult.success(resume); }else{ return AjaxResult.error("文件格式不正确请上传.doc或者.docx格式文件!"); } } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("解析失败!请手动录入"); } } /** * 修改简历管理 */ @ApiOperation(value = "修改简历管理") //@PreAuthorize("@ss.hasPermi('system:resume:edit')") //@Log(title = "简历管理", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody Resume resume) { return toAjax(resumeService.updateResume(resume)); } /** * 删除简历管理 */ @ApiOperation(value = "删除简历管理") //@PreAuthorize("@ss.hasPermi('system:resume:remove')") //@Log(title = "简历管理", businessType = BusinessType.DELETE) @DeleteMapping("/{resumeIds}") public AjaxResult remove(@PathVariable Long[] resumeIds) { return toAjax(resumeService.deleteResumeByResumeIds(resumeIds)); } }