package com.engine.organization.service.impl; import com.api.browser.bean.SearchConditionItem; import com.engine.core.impl.Service; import com.engine.organization.entity.DeleteParam; import com.engine.organization.entity.company.bo.CompBO; import com.engine.organization.entity.company.po.CompPO; import com.engine.organization.entity.department.bo.DepartmentBO; import com.engine.organization.entity.department.po.DepartmentPO; import com.engine.organization.entity.hrmresource.bo.ResourceBO; import com.engine.organization.entity.hrmresource.po.ResourcePO; import com.engine.organization.entity.job.bo.JobBO; import com.engine.organization.entity.job.po.JobPO; import com.engine.organization.entity.resume.po.HrmFamilyInfoPO; import com.engine.organization.entity.resume.po.PersonnelResumeColumn; import com.engine.organization.entity.resume.po.PersonnelResumePO; import com.engine.organization.entity.resume.po.PersonnelResumeTable; import com.engine.organization.entity.searchtree.SearchTree; import com.engine.organization.entity.searchtree.SearchTreeParams; import com.engine.organization.enums.ModuleTypeEnum; import com.engine.organization.mapper.comp.CompMapper; import com.engine.organization.mapper.department.DepartmentMapper; import com.engine.organization.mapper.job.JobMapper; import com.engine.organization.mapper.resource.HrmResourceMapper; import com.engine.organization.service.PersonnelResumeService; import com.engine.organization.util.MenuBtn; import com.engine.organization.util.OrganizationAssert; import com.engine.organization.util.OrganizationFormItemUtil; import com.engine.organization.util.db.MapperProxyFactory; import com.engine.organization.util.detach.DetachUtil; import com.engine.organization.util.page.PageUtil; import com.engine.organization.util.tree.SearchTreeUtil; import com.engine.organization.util.word.CustomXWPFDocument; import com.engine.organization.util.word.WordUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import weaver.conn.RecordSet; import weaver.general.GCONST; import weaver.general.StringUtil; import weaver.general.Util; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @author:dxfeng * @createTime: 2022/12/28 * @version: 1.0 */ public class PersonnelResumeServiceImpl extends Service implements PersonnelResumeService { private DepartmentMapper getDepartmentMapper() { return MapperProxyFactory.getProxy(DepartmentMapper.class); } private CompMapper getCompMapper() { return MapperProxyFactory.getProxy(CompMapper.class); } private JobMapper getJobMapper() { return MapperProxyFactory.getProxy(JobMapper.class); } private HrmResourceMapper getHrmResourceMapper() { return MapperProxyFactory.getProxy(HrmResourceMapper.class); } @Override public Map getSearchTree(SearchTreeParams params) { // 查询所有满足条件的人员ID、根据人员向上查找对应的组织架构 List resourcePOList = null; if (CollectionUtils.isNotEmpty(params.getSubcompanyid1()) || CollectionUtils.isNotEmpty(params.getDepartmentid()) || CollectionUtils.isNotEmpty(params.getJobId()) || CollectionUtils.isNotEmpty(params.getResourceId())) { params.setPersonnelScreening(true); // 人员筛选 resourcePOList = getHrmResourceMapper().getPersonnelScreening(params.getSubcompanyid1(), params.getDepartmentid(), params.getJobId(), params.getResourceId()); resourcePOList.removeIf(item->!item.getLastName().contains(params.getKeyword())); } List treeList = getFilterDatas(params, resourcePOList); return SearchTreeUtil.getSearchTree(Util.null2String(params.getType()), treeList); } @Override public Map getResumeList(Integer uId) { Map resultMap = new HashMap<>(); // 根据ID查询用户信息 PersonnelResumePO personnelResumePO = getHrmResourceMapper().getPersonnelResumeById(uId); OrganizationAssert.notNull(personnelResumePO, "未找到对应人员"); resultMap.put("lastName", Util.null2String(personnelResumePO.getLastName())); resultMap.put("sex", Util.null2String(personnelResumePO.getSex())); resultMap.put("birthday", Util.null2String(personnelResumePO.getBirthday())); resultMap.put("image", Util.null2String(personnelResumePO.getImage())); resultMap.put("native", Util.null2String(personnelResumePO.getNativePlace())); resultMap.put("politics", Util.null2String(personnelResumePO.getPolitics())); resultMap.put("department", Util.null2String(personnelResumePO.getDepartment())); resultMap.put("marriage", Util.null2String(personnelResumePO.getMarriage())); resultMap.put("jobtitle", Util.null2String(personnelResumePO.getJobTitle())); resultMap.put("companystartdate", Util.null2String(personnelResumePO.getCompanyStartDate())); resultMap.put("workstartdate", Util.null2String(personnelResumePO.getWorkStartDate())); resultMap.put("idCard", Util.null2String(personnelResumePO.getIdCard())); resultMap.put("address", Util.null2String(personnelResumePO.getAddress())); resultMap.put("telephone", Util.null2String(personnelResumePO.getTelephone())); resultMap.put("email", Util.null2String(personnelResumePO.getEmail())); resultMap.put("selfStatement", ""); // 简历相关表格,待拓展 resultMap.put("tables", getPersonnelResumeTable(uId)); return resultMap; } @Override public Map hasRight() { Map resultMap = new HashMap<>(); resultMap.put("hasRight", true); ArrayList topMenuList = new ArrayList<>(); ArrayList rightMenuList = new ArrayList<>(); // 新增 topMenuList.add(MenuBtn.builder().isBatch("0").isTop("1").menuFun("screening").menuIcon("icon-coms-man").menuName("人员筛选").type("BTN_Screening").build()); topMenuList.add(MenuBtn.builder().isBatch("0").isTop("1").menuFun("currentExport").menuIcon("icon-coms-export").menuName("导出当前").type("BTN_CurrentExport").build()); topMenuList.add(MenuBtn.builder().isBatch("0").isTop("1").menuFun("mergeExport").menuIcon("icon-coms02-coms2-Batch-export").menuName("全部导出(合并)").type("BTN_MergeExport").build()); topMenuList.add(MenuBtn.builder().isBatch("0").isTop("1").menuFun("allExport").menuIcon("icon-coms02-coms2-export").menuName("全部导出").type("BTN_AllExport").build()); resultMap.put("topMenu", topMenuList); // 新增 rightMenuList.add(MenuBtn.builder().isBatch("0").isTop("0").menuFun("screening").menuIcon("icon-coms-man").menuName("人员筛选").type("BTN_Screening").build()); rightMenuList.add(MenuBtn.builder().isBatch("0").isTop("0").menuFun("currentExport").menuIcon("icon-coms-export").menuName("导出当前").type("BTN_CurrentExport").build()); rightMenuList.add(MenuBtn.builder().isBatch("0").isTop("0").menuFun("mergeExport").menuIcon("icon-coms02-coms2-Batch-export").menuName("全部导出(合并)").type("BTN_MergeExport").build()); rightMenuList.add(MenuBtn.builder().isBatch("0").isTop("0").menuFun("allExport").menuIcon("icon-coms02-coms2-export").menuName("全部导出").type("BTN_AllExport").build()); resultMap.put("rightMenu", rightMenuList); return resultMap; } @Override public String downloadPerResume(Integer type, HttpServletResponse response) throws Exception { //首先定义一个XWPFDocument 集合 这个对象可以进行word 解析 合并 还有下载都离不开这个对象 List xwpfDocuments = new ArrayList<>(); //模板地址 String outPutPath = GCONST.getRootPath() + "hrm" + File.separator + "import" + File.separator + "template" + File.separator; String filePath = outPutPath + "PerResume.docx"; //创建压缩包位置 File fileZip = new File(outPutPath + "wordZip"); if (!fileZip.exists()) { fileZip.mkdirs(); } // 处理赋值的数据 List> dataMapList = getAllResumeList(); // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); String filesPath = outPutPath + "wordZip" + File.separator + "全部简历"; String fileAllWordPath = outPutPath + "wordZip"; String wordName = "全体人员简历(合并)"; File files = new File(filesPath); if (!files.exists()) { files.mkdirs(); } else { delFolder(files.getPath()); files.mkdirs(); } //处理所有数据 for (int count = 0; count < dataMapList.size(); count++) { //处理单人数据 Map paramMap = dataMapList.get(count); WordUtil wordUtil = new WordUtil(); //返回一个新的xwpfDocument对象 File file = new File(filePath); CustomXWPFDocument doc = null; InputStream is = new FileInputStream(file); doc = new CustomXWPFDocument(is); wordUtil.replaceInPara(doc, paramMap); wordUtil.replaceInTable(doc, paramMap); xwpfDocuments.add(doc); is.close(); String fileName = paramMap.get("${lastName}") + ".docx"; System.out.println(fileName); FileOutputStream os = null; os = new FileOutputStream(filesPath + File.separator + new File(fileName)); doc.write(os); } if (xwpfDocuments.size() > 0) { //这样第一步将所有word内容替换之后生成多个 xwpfDocument //现在将多个xwpfDocument 进行合并 追加 生成word文件 CustomXWPFDocument xwpfDocument = xwpfDocuments.get(0); for (int i = 0; i < xwpfDocuments.size(); i++) { //每次的追加为了避免样式和格式混乱 加上分页符 //当是只有一条数据的时候 直接输出 if (i == 0) { xwpfDocument = xwpfDocuments.get(0); xwpfDocument.write(new FileOutputStream(fileAllWordPath + File.separator + new File(wordName + ".docx"))); continue; } else { //当存在多条时候 xwpfDocument = mergeWord(xwpfDocument, xwpfDocuments.get(i)); xwpfDocument.write(new FileOutputStream(fileAllWordPath + File.separator + new File(wordName + ".docx"))); } } } String resPath = fileAllWordPath + File.separator + new File(wordName + ".docx"); if (type == 1) { compressFileToZip(filesPath); resPath = filesPath + ".zip"; } return resPath; } // 简历相关表格,待拓展(数据先写死) public List getPersonnelResumeTable(Integer uId){ List tables = new ArrayList<>(); List insurancesTitles = new ArrayList<>(); List familyInfoTitles = new ArrayList<>(); List insuranceDatas = new ArrayList<>(); List> datas = new ArrayList<>(); insurancesTitles.add(PersonnelResumeColumn.builder().name("首次参保时间").colspans(2).rowspans(1).build()); insurancesTitles.add(PersonnelResumeColumn.builder().name("养老保险").colspans(1).rowspans(1).build()); insurancesTitles.add(PersonnelResumeColumn.builder().name("医疗保险").colspans(1).rowspans(1).build()); insurancesTitles.add(PersonnelResumeColumn.builder().name("失业保险").colspans(1).rowspans(1).build()); insurancesTitles.add(PersonnelResumeColumn.builder().name("住房公积金").colspans(1).rowspans(1).build()); insurancesTitles.add(PersonnelResumeColumn.builder().name("企业年金").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("2022-10-02").colspans(2).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("80").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("36").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("360").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("180").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("20000").colspans(1).rowspans(1).build()); datas.add(insuranceDatas); insuranceDatas = new ArrayList<>(); insuranceDatas.add(PersonnelResumeColumn.builder().value("2022-11-02").colspans(2).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("90").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("46").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("361").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("181").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("20001").colspans(1).rowspans(1).build()); datas.add(insuranceDatas); insuranceDatas = new ArrayList<>(); insuranceDatas.add(PersonnelResumeColumn.builder().value("2022-12-02").colspans(2).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("100").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("56").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("362").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("180").colspans(1).rowspans(1).build()); insuranceDatas.add(PersonnelResumeColumn.builder().value("20000").colspans(1).rowspans(1).build()); datas.add(insuranceDatas); tables.add(PersonnelResumeTable.builder().title("二、社会保险及住房公积金缴纳情况(单位/元)").columns(insurancesTitles).datas(datas).build()); // 家庭情况 familyInfoTitles.add(PersonnelResumeColumn.builder().name("关系").colspans(1).rowspans(1).build()); familyInfoTitles.add(PersonnelResumeColumn.builder().name("姓名").colspans(1).rowspans(1).build()); familyInfoTitles.add(PersonnelResumeColumn.builder().name("工作单位").colspans(2).rowspans(1).build()); familyInfoTitles.add(PersonnelResumeColumn.builder().name("职务").colspans(1).rowspans(1).build()); familyInfoTitles.add(PersonnelResumeColumn.builder().name("住址").colspans(2).rowspans(1).build()); List hrmFamilyInfoByUser = getHrmResourceMapper().getHrmFamilyInfoByUser(uId); if (CollectionUtils.isEmpty(hrmFamilyInfoByUser)) { hrmFamilyInfoByUser.add(new HrmFamilyInfoPO()); } List> objects = new ArrayList<>(); for (HrmFamilyInfoPO hrmFamilyInfoPO : hrmFamilyInfoByUser) { List familyInfoDatas = new ArrayList<>(); familyInfoDatas.add(PersonnelResumeColumn.builder().value(hrmFamilyInfoPO.getTitle()).colspans(1).rowspans(1).build()); familyInfoDatas.add(PersonnelResumeColumn.builder().value(hrmFamilyInfoPO.getMember()).colspans(1).rowspans(1).build()); familyInfoDatas.add(PersonnelResumeColumn.builder().value(hrmFamilyInfoPO.getCompany()).colspans(2).rowspans(1).build()); familyInfoDatas.add(PersonnelResumeColumn.builder().value(hrmFamilyInfoPO.getJobTitle()).colspans(1).rowspans(1).build()); familyInfoDatas.add(PersonnelResumeColumn.builder().value(hrmFamilyInfoPO.getAddress()).colspans(2).rowspans(1).build()); objects.add(familyInfoDatas); } tables.add(PersonnelResumeTable.builder().title("三、家庭成员信息(包括父母、配偶、子女)").columns(familyInfoTitles).datas(objects).build()); return tables; } public List> getAllResumeList() { List personnelResumeList = getHrmResourceMapper().getPersonnelResumeList(); OrganizationAssert.notNull(personnelResumeList, "未找到对应人员"); List> dataMapList = new ArrayList<>(); for (PersonnelResumePO personnelResumePO : personnelResumeList) { Map resultMap = new HashMap<>(); resultMap.put("${lastName}", Util.null2String(personnelResumePO.getLastName())); resultMap.put("${sex}", Util.null2String(personnelResumePO.getSex())); resultMap.put("${birthday}", Util.null2String(personnelResumePO.getBirthday())); resultMap.put("${@image}", Util.null2String(personnelResumePO.getImageId())); resultMap.put("${native}", Util.null2String(personnelResumePO.getNativePlace())); resultMap.put("${politics}", Util.null2String(personnelResumePO.getPolitics())); resultMap.put("${department}", Util.null2String(personnelResumePO.getDepartment())); resultMap.put("${marriage}", Util.null2String(personnelResumePO.getMarriage())); resultMap.put("${jobtitle}", Util.null2String(personnelResumePO.getJobTitle())); resultMap.put("${companystartdate}", Util.null2String(personnelResumePO.getCompanyStartDate())); resultMap.put("${workstartdate}", Util.null2String(personnelResumePO.getWorkStartDate())); resultMap.put("${idCard}", Util.null2String(personnelResumePO.getIdCard())); resultMap.put("${address}", Util.null2String(personnelResumePO.getAddress())); resultMap.put("${telephone}", Util.null2String(personnelResumePO.getTelephone())); resultMap.put("${email}", Util.null2String(personnelResumePO.getEmail())); resultMap.put("${selfStatement}", ""); List tables = getPersonnelResumeTable(personnelResumePO.getId()); for (int t = 0; t < tables.size(); t++) { PersonnelResumeTable personnelResumeTable = tables.get(t); int length = personnelResumeTable.getColumns().size(); if (personnelResumeTable.getDatas().size() > 0) { List> datas = personnelResumeTable.getDatas(); if (datas.size() > 0) { for (int d = 0;d dataList = datas.get(d); for (int i = 0; i < length; i++) {//i表示列 //社保9行开始,家庭成员10行开始 int row = 100 + i + d; resultMap.put("${c" + t + i + row + "}", Util.null2String(dataList.get(i).getValue())); } } } } } resultMap.put("sbDataCounts",tables.get(0).getDatas().size()); resultMap.put("jtDataCounts",tables.get(1).getDatas().size()); dataMapList.add(resultMap); } return dataMapList; } //两个对象进行追加 public CustomXWPFDocument mergeWord(CustomXWPFDocument document, CustomXWPFDocument doucDocument2) throws Exception { CustomXWPFDocument src1Document = document; XWPFParagraph p = src1Document.createParagraph(); //设置分页符 p.setPageBreak(true); CTBody src1Body = src1Document.getDocument().getBody(); CustomXWPFDocument src2Document = doucDocument2; CTBody src2Body = src2Document.getDocument().getBody(); XWPFParagraph p2 = src2Document.createParagraph(); //处理合并后文档图片冲突 List allPictures = src2Document.getAllPictures(); Map map = new HashMap(); for (XWPFPictureData picture : allPictures) { String before = src2Document.getRelationId(picture); //将原文档中的图片加入到目标文档中 String after = src1Document.addPictureData(picture.getData(), Document.PICTURE_TYPE_JPEG); map.put(before, after); } XmlOptions optionsOuter = new XmlOptions(); optionsOuter.setSaveOuter(); String appendString = src2Body.xmlText(optionsOuter); String srcString = src1Body.xmlText(); String prefix = srcString.substring(0, srcString.indexOf(">") + 1); String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<")); String sufix = srcString.substring(srcString.lastIndexOf("<")); String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); if (map != null && !map.isEmpty()) { ListIterator> i = new ArrayList<>(map.entrySet()).listIterator(map.size()); LinkedHashMap linkedHashMap = new LinkedHashMap(); while (i.hasPrevious()) { Map.Entry entry = i.previous(); linkedHashMap.put(entry.getKey(), entry.getValue()); } Iterator it1 = linkedHashMap.entrySet().iterator(); while (it1.hasNext()) { Map.Entry entry = (Map.Entry) it1.next(); addPart = addPart.replace(" personnelScreening() { List items = new ArrayList<>(); // 所属分部 SearchConditionItem companyItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "分部", "194", "subcompanyid1", ""); // 所属部门 SearchConditionItem departmentItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "部门", "57", "departmentid", ""); SearchConditionItem jobItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "岗位", "666", "jobId", ""); SearchConditionItem resourceItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "人员", "17", "resourceId", ""); items.add(companyItem); items.add(departmentItem); items.add(jobItem); items.add(resourceItem); return items; } public List getFilterDatas(SearchTreeParams params, List resourcePOList) { String keyword = params.getKeyword(); String id = params.getId(); String type = Util.null2String(params.getType()); List searchTree = new ArrayList<>(); // 通过分部、公司 组装数据 if (StringUtil.isEmpty(id) || ModuleTypeEnum.subcompanyfielddefined.getValue().toString().equals(type)) { Integer subCompanyId1 = StringUtil.isEmpty(id) ? null : Integer.parseInt(id); if (params.isPersonnelScreening()) { new DetachUtil(user).filterResourceList(resourcePOList); if (null != subCompanyId1) { resourcePOList.removeIf(item -> !subCompanyId1.equals(item.getSubcompanyid1())); } } DepartmentPO departmentBuild = DepartmentPO.builder().departmentName(keyword).subCompanyId1(subCompanyId1).canceled(0).build(); CompPO compBuild = CompPO.builder().subCompanyName(keyword).supSubComId(subCompanyId1).canceled(0).build(); // 所属分部下的岗位 JobPO jobBuild = JobPO.builder().jobTitleName(keyword).ecCompany(subCompanyId1).forbiddenTag(0).build(); ResourcePO resourcePO = ResourcePO.builder().lastName(keyword).subcompanyid1(subCompanyId1).build(); searchTree = buildTreeByCompAndDept(params, resourcePOList, departmentBuild, compBuild, jobBuild, resourcePO); } else if (ModuleTypeEnum.departmentfielddefined.getValue().toString().equals(type)) { Integer departmentId = Integer.parseInt(id); if (null != resourcePOList) { new DetachUtil(user).filterResourceList(resourcePOList); resourcePOList.removeIf(item -> !departmentId.equals(item.getDepartmentid())); } DepartmentPO departmentBuild = DepartmentPO.builder().departmentName(keyword).supDepId(departmentId).canceled(0).build(); // 所属分部下的岗位 JobPO jobBuild = JobPO.builder().jobTitleName(keyword).ecDepartment(departmentId).forbiddenTag(0).build(); ResourcePO resourcePO = ResourcePO.builder().lastName(keyword).departmentid(departmentId).build(); searchTree = buildTreeByDeptAndJob(params, resourcePOList, departmentBuild, jobBuild, resourcePO); } else if (ModuleTypeEnum.jobfielddefined.getValue().toString().equals(type)) { Long jobId = Long.parseLong(id); JobPO jobById = getJobMapper().getJobById(jobId); if (null != resourcePOList) { new DetachUtil(user).filterResourceList(resourcePOList); resourcePOList.removeIf(item -> !(jobById.getEcCompany().equals(item.getSubcompanyid1()) && jobById.getEcDepartment().equals(item.getDepartmentid())) && jobById.getEcJobTitle().equals(item.getJobtitle())); return SearchTreeUtil.builderTreeMode(ResourceBO.buildSetToSearchTree(resourcePOList)); } ResourcePO resourcePO = ResourcePO.builder().lastName(keyword).subcompanyid1(jobById.getEcCompany()).departmentid(jobById.getEcDepartment()).jobtitle(jobById.getEcJobTitle()).build(); List resourcePOS = getHrmResourceMapper().listByFilter(resourcePO); searchTree = SearchTreeUtil.builderTreeMode(ResourceBO.buildSetToSearchTree(resourcePOS)); } return searchTree; } /** * 分部、部门 组装左侧树 * * @param departmentBuild * @param compBuild * @param jobBuild * @return */ private List buildTreeByCompAndDept(SearchTreeParams params, List resourcePOList, DepartmentPO departmentBuild, CompPO compBuild, JobPO jobBuild, ResourcePO resourcePO) { // 查询人员数据 List resourcePOS; if (params.isPersonnelScreening()) { resourcePOS = resourcePOList; } else { resourcePOS = getHrmResourceMapper().listByFilter(resourcePO); } Set builderJobs = new HashSet<>(); // 补充人员所有岗位,关联人员及聚才林岗位 for (ResourcePO resource : resourcePOS) { if (null == resource) { continue; } JobPO jobByResource = getJobByResource(resource); if (null != jobByResource) { resource.setJobId(jobByResource.getId()); builderJobs.add(jobByResource); } } List resourceTrees = SearchTreeUtil.builderTreeMode(ResourceBO.buildSetToSearchTree(resourcePOS)); List jobPOS = getJobMapper().listPOsByFilter(jobBuild); if (params.isPersonnelScreening()) { jobPOS.removeIf(item -> !params.getJobId().contains(item.getId())); } new DetachUtil(user).filterJobList(jobPOS); List filterDeparts = getDepartmentMapper().listByFilter(departmentBuild, "showorder"); if (params.isPersonnelScreening()) { filterDeparts.removeIf(item -> !params.getDepartmentid().contains(item.getId())); } new DetachUtil(user).filterDepartmentList(filterDeparts); // 添加父级岗位 builderJobs.addAll(jobPOS); // 添加岗位的上级部门或分部 List jobTrees = SearchTreeUtil.builderTreeMode(JobBO.buildSetToSearchTree(builderJobs), resourceTrees); String parentDeptS = jobTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(",")); if (!StringUtil.isEmpty(parentDeptS)) { // 兼容SQLServer每次最多in,2100条数据 List ids = DeleteParam.builder().ids(parentDeptS).build().getIds(); int ceilCount = (int) Math.ceil((double) ids.size() / 1000); List departmentsByIds = new ArrayList<>(); for (int i = 1; i < ceilCount + 1; i++) { List longs = PageUtil.subList(i, 1000, ids); List departmentsById = getDepartmentMapper().getDeptsByIds(longs); if (CollectionUtils.isNotEmpty(departmentsById)) { departmentsByIds.addAll(departmentsById); } } if (CollectionUtils.isNotEmpty(departmentsByIds)) { departmentsByIds.removeIf(item -> item.getCanceled() != null && item.getCanceled() != 0); filterDeparts.addAll(departmentsByIds); } } // 查询分部信息 List filterComps = getCompMapper().listByFilter(compBuild, "showorder"); if (params.isPersonnelScreening()) { filterComps.removeIf(item -> !params.getSubcompanyid1().contains(item.getId())); } new DetachUtil(user).filterCompanyList(filterComps); Set builderDeparts = new HashSet<>(); Map departmentPOMap = getDepartmentMapper().listAll("showorder").stream().collect(Collectors.toMap(DepartmentPO::getId, item -> item)); for (DepartmentPO departmentPO : filterDeparts) { buildParentDepts(departmentPO, builderDeparts,departmentPOMap); } List departmentList = DepartmentBO.buildSetToSearchTree(builderDeparts); List deptTrees = SearchTreeUtil.builderTreeMode(departmentList); List searchTrees = SearchTreeUtil.builderTreeMode(departmentList, jobTrees); // 添加部门的上级分部 String parentCompS = deptTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(",")); if (!StringUtil.isEmpty(parentCompS)) { List compsByIds = getCompMapper().getCompsByIds(DeleteParam.builder().ids(parentCompS).build().getIds()); if (CollectionUtils.isNotEmpty(compsByIds)) { filterComps.addAll(compsByIds); } } List allCompanys = getCompMapper().listAll("showorder"); new DetachUtil(user).filterCompanyList(allCompanys); Map allMaps = allCompanys.stream().collect(Collectors.toMap(CompPO::getId, item -> item, (k1, k2) -> k1)); Set builderComps = new HashSet<>(); for (CompPO compPO : filterComps) { buildParentComps(compPO, builderComps, allMaps); } return SearchTreeUtil.builderTreeMode(CompBO.buildSetToSearchTree(builderComps), searchTrees); } private List buildTreeByDeptAndJob(SearchTreeParams params, List resourcePOList, DepartmentPO departmentBuild, JobPO jobBuild, ResourcePO resourcePO) { // 查询人员数据 List resourcePOS; if (params.isPersonnelScreening()) { resourcePOS = resourcePOList; } else { resourcePOS = getHrmResourceMapper().listByFilter(resourcePO); } Set builderJobs = new HashSet<>(); // 补充人员所有岗位,关联人员及聚才林岗位 for (ResourcePO resource : resourcePOS) { if (null == resource) { continue; } JobPO jobByResource = getJobByResource(resource); if (null != jobByResource) { resource.setJobId(jobByResource.getId()); builderJobs.add(jobByResource); } } List resourceTrees = SearchTreeUtil.builderTreeMode(ResourceBO.buildSetToSearchTree(resourcePOS)); List jobPOS = getJobMapper().listPOsByFilter(jobBuild); if (params.isPersonnelScreening()) { jobPOS.removeIf(item -> !params.getJobId().contains(item.getId())); } List filterDeparts = getDepartmentMapper().listByFilter(departmentBuild, "showorder"); if (params.isPersonnelScreening()) { filterDeparts.removeIf(item -> !params.getDepartmentid().contains(item.getId())); } // 添加父级岗位 builderJobs.addAll(jobPOS); // 添加岗位的上级部门或分部 List jobTrees = SearchTreeUtil.builderTreeMode(JobBO.buildSetToSearchTree(builderJobs), resourceTrees); String parentDeptS = jobTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(",")); if (!StringUtil.isEmpty(parentDeptS)) { // 兼容SQLServer每次最多in,2100条数据 List ids = DeleteParam.builder().ids(parentDeptS).build().getIds(); int ceilCount = (int) Math.ceil((double) ids.size() / 1000); List departmentsByIds = new ArrayList<>(); for (int i = 0; i < ceilCount - 1; i++) { List departmentsById = getDepartmentMapper().getDeptsByIds(PageUtil.subList(i, 1000, ids)); if (CollectionUtils.isNotEmpty(departmentsById)) { departmentsByIds.addAll(departmentsById); } } if (CollectionUtils.isNotEmpty(departmentsByIds)) { departmentsByIds.removeIf(item -> item.getCanceled() != null && item.getCanceled() != 0); filterDeparts.addAll(departmentsByIds); } } // 查询分部信息 Map departmentPOMap = getDepartmentMapper().listAll("showorder").stream().collect(Collectors.toMap(DepartmentPO::getId, item -> item)); Set builderDeparts = new HashSet<>(); for (DepartmentPO departmentPO : filterDeparts) { buildParentDepts(departmentPO, builderDeparts,departmentPOMap); } return SearchTreeUtil.builderTreeMode(DepartmentBO.buildSetToSearchTree(builderDeparts), jobTrees); } /** * 添加查询元素的父级元素 * * @param departmentPO * @param builderDeparts */ private void buildParentDepts(DepartmentPO departmentPO, Set builderDeparts,Map departmentPOMap) { builderDeparts.add(departmentPO); if (SearchTreeUtil.isTop(departmentPO.getSupDepId())) { return; } DepartmentPO parentDept = departmentPOMap.get(departmentPO.getSupDepId()); if (null != parentDept) { buildParentDepts(parentDept, builderDeparts,departmentPOMap); } } /** * 添加查询元素的父级元素 * * @param compPO * @param builderComps */ private void buildParentComps(CompPO compPO, Set builderComps, Map allMaps) { if (null != compPO.getCanceled() && 0 != compPO.getCanceled()) { return; } builderComps.add(compPO); CompPO parentComp = allMaps.get(compPO.getSupSubComId()); if (null != parentComp) { buildParentComps(parentComp, builderComps, allMaps); } } private JobPO getJobByResource(ResourcePO resourcePO) { RecordSet rs = new RecordSet(); String sql = "select\n" + " t.id,\n" + " t.job_no,\n" + " h.jobtitlename,\n" + " t.ec_jobTitle,\n" + " t.ec_company,\n" + " t.ec_department,\n" + " t.sequence_id,\n" + " t.scheme_id,\n" + " t.parent_job,\n" + " t.is_key,\n" + " t.workplace,\n" + " t.description,\n" + " t.work_duty,\n" + " t.work_authority,\n" + " t.show_order,\n" + " t.forbidden_tag,\n" + " t.grade_id,\n" + " t.level_id\n" + " from jcl_org_job t\n" + " left join hrmjobtitles h on t.ec_jobTitle = h.id\n" + " where t.delete_type = 0 "; if (null != resourcePO.getSubcompanyid1()) { sql += " and t.ec_company = '" + resourcePO.getSubcompanyid1() + "'"; } if (null == resourcePO.getSubcompanyid1()) { sql += " and t.ec_company is null"; } if (null != resourcePO.getDepartmentid()) { sql += " and t.ec_department = '" + resourcePO.getDepartmentid() + "'"; } if (null != resourcePO.getDepartmentid()) { sql += " and t.ec_department is null"; } if (null != resourcePO.getJobtitle()) { sql += " and t.ec_jobTitle = '" + resourcePO.getJobtitle() + "'"; } rs.executeQuery(sql); if (rs.next()) { String id = rs.getString("id"); String job_no = rs.getString("job_no"); String jobtitlename = rs.getString("jobtitlename"); String ec_jobTitle = rs.getString("ec_jobTitle"); String ec_company = rs.getString("ec_company"); String ec_department = rs.getString("ec_department"); String sequence_id = rs.getString("sequence_id"); String scheme_id = rs.getString("scheme_id"); String parent_job = rs.getString("parent_job"); String is_key = rs.getString("is_key"); String workplace = rs.getString("workplace"); String description = rs.getString("description"); String work_duty = rs.getString("work_duty"); String work_authority = rs.getString("work_authority"); String show_order = rs.getString("show_order"); String forbidden_tag = rs.getString("forbidden_tag"); String grade_id = rs.getString("grade_id"); String level_id = rs.getString("level_id"); JobPO jobPO = new JobPO(); jobPO.setId(StringUtils.isBlank(id) ? null : Long.parseLong(id)); jobPO.setJobNo(job_no); jobPO.setJobTitleName(jobtitlename); jobPO.setEcJobTitle(StringUtils.isBlank(ec_jobTitle) ? null : Integer.parseInt(ec_jobTitle)); jobPO.setEcCompany(StringUtils.isBlank(ec_company) ? null : Integer.parseInt(ec_company)); jobPO.setEcDepartment(StringUtils.isBlank(ec_department) ? null : Integer.parseInt(ec_department)); jobPO.setSequenceId(StringUtils.isBlank(sequence_id) ? null : Long.parseLong(sequence_id)); jobPO.setSchemeId(StringUtils.isBlank(scheme_id) ? null : Long.parseLong(scheme_id)); jobPO.setParentJob(StringUtils.isBlank(parent_job) ? null : Long.parseLong(parent_job)); jobPO.setIsKey(StringUtils.isBlank(is_key) ? null : Integer.parseInt(is_key)); jobPO.setWorkplace(workplace); jobPO.setDescription(description); jobPO.setWorkDuty(work_duty); jobPO.setWorkAuthority(work_authority); jobPO.setShowOrder(StringUtils.isBlank(show_order) ? null : Integer.parseInt(show_order)); jobPO.setForbiddenTag(StringUtils.isBlank(forbidden_tag) ? null : Integer.parseInt(forbidden_tag)); jobPO.setGradeId(grade_id); jobPO.setLevelId(level_id); return jobPO; } return null; } }