diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java index 2f36b6b14..8b8bc8f9e 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java @@ -8,7 +8,9 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.*; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gexin.fastjson.JSON; @@ -28,7 +30,6 @@ import com.zhgd.xmgl.modules.basicdata.service.IDictionariesRecordService; import com.zhgd.xmgl.modules.basicdata.service.IDictionaryItemService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; -import com.zhgd.xmgl.modules.exam.entity.ExamTrainRecord; import com.zhgd.xmgl.modules.exam.service.IExamTrainRecordService; import com.zhgd.xmgl.modules.project.service.IProjectEnterpriseService; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; @@ -620,8 +621,16 @@ public class WorkerAdmissionController { FileUtil.writeFromStream(zipFile.getInputStream(), zip); File unzip = ZipUtil.unzip(zip, Charset.forName("gbk")); File[] files = unzip.listFiles(); - if (!CollUtil.newArrayList(files).stream().anyMatch(o -> StringUtils.endsWith(o.getAbsolutePath(), ".xlsx"))) { - unzip = files[0]; + if (files == null || files.length == 0) { + throw new OpenAlertException("压缩文件为空"); + } + while (CollUtil.newArrayList(files).stream().noneMatch(o -> StringUtils.endsWith(o.getAbsolutePath(), ".xlsx"))) { + List dirList = Arrays.stream(files).filter(File::isDirectory).collect(Collectors.toList()); + if (dirList.size() != 1) { + throw new OpenAlertException("压缩文件目录结构有误,请检查"); + } + unzip = dirList.get(0); + files = unzip.listFiles(); } //设置一个压缩包,里面分别有人员信息excel,【人脸采集图片】文件夹、【身份证人像面文件夹】、【身份证国徽面】文件夹、【劳动合同】文件夹、【保险】文件夹、【体检报告】文件夹、【人员资质】文件夹、【人员资质验证】文件夹,文件夹中文件分别以姓名_身份证格式名称 List vos = parseUploadExcelWorkAdmission(unzip.getAbsolutePath(), projectSn); @@ -720,45 +729,65 @@ public class WorkerAdmissionController { throw new OpenAlertException(MessageUtil.get("excelNotDataErr")); } this.checkParams(list); + List absentWorkerTypes = new ArrayList<>(); + List absentGroups = new ArrayList<>(); + List absentEpcs = new ArrayList<>(); + List absentEdus = new ArrayList<>(); + List absentPolitics = new ArrayList<>(); + List absentBranchs = new ArrayList<>(); List enterpriseInfos = projectEnterpriseService.queryPageList(new MapBuilder() .put("projectSn", projectSn) .put(Cts.PAGE_SIZE, -1) .build()).getRecords(); - List deviceUnits = deviceUnitService.list(new LambdaQueryWrapper() - .eq(DeviceUnit::getProjectSn, projectSn).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); List workerTypeList = postWorkTypeService.list(new LambdaQueryWrapper() .eq(PostWorkType::getProjectSn, projectSn)); Map groupMap = projectGroupService.list(new LambdaQueryWrapper() .eq(ProjectGroup::getProjectSn, projectSn)).stream().collect(Collectors.toMap(ProjectGroup::getProjectGroupName, Function.identity(), (o1, o2) -> o1)); - Map certTypeMap = dictionariesRecordService.selectCertTypeList(new MapBuilder() - .put("type", 1) - .build()).stream().collect(Collectors.toMap(DictionariesRecord::getDictionaryName, Function.identity(), (o1, o2) -> o1)); List isc = Arrays.asList("市场监督管理局", "应急管理局", "住房和城乡建设厅", "人力资源和社会保障部(厅)"); Map orgMap = partyConstructionOrganizationService.list(new LambdaQueryWrapper() .eq(PartyConstructionOrganization::getProjectSn, projectSn)).stream().collect(Collectors.toMap(PartyConstructionOrganization::getClassificationName, Function.identity(), (o1, o2) -> o1)); for (Map importInfo : list) { UploadZipWorkAdmissionVo detail = new UploadZipWorkAdmissionVo(); - detail.setNum(importInfo.get("*编号")); - detail.setWorkerName(importInfo.get("*姓名")); + String num = StrUtil.trim(importInfo.get("*编号")); + detail.setNum(num); + String workerName = StrUtil.trim(importInfo.get("*姓名")); + detail.setWorkerName(workerName); detail.setEnterpriseId(enterpriseInfos.stream().filter(o -> o.getEnterpriseName().equals(importInfo.get("单位"))).findFirst().map(EnterpriseInfo::getId).orElse(null)); detail.setWorkAreaName(importInfo.get("*工作区域")); - detail.setPostWorkType(workerTypeList.stream().filter(o -> o.getPostWorkTypeName().equals(importInfo.get("*岗位(工种)"))).findFirst().map(o -> o.getId()).orElse(null)); - //detail.setTeam(""); - Map idCardInfoMap = IdCardUtils.getBirthdayAgeSex(importInfo.get("*身份证号")); + String idCardNo = importInfo.get("*身份证号"); + String workerType = importInfo.get("*岗位(工种)"); + Optional workType = workerTypeList.stream().filter(o -> o.getPostWorkTypeName().equals(workerType)).findFirst(); + Long postWorkTypeId = workType.map(PostWorkType::getId).orElse(null); + if (postWorkTypeId == null) { + absentWorkerTypes.add(StrUtil.format("{}的岗位(工种)({})", workerName, workerType)); + } + detail.setPostWorkType(postWorkTypeId); + Map idCardInfoMap = IdCardUtils.getBirthdayAgeSex(idCardNo); detail.setSex(MapUtils.getInteger(idCardInfoMap, "sex")); detail.setAge(idCardInfoMap.get("age")); - detail.setIdCard(importInfo.get("*身份证号")); + detail.setIdCard(idCardNo); detail.setEntryDeadline(importInfo.get("*计划截止时间")); detail.setRemark(importInfo.get("备注")); detail.setProjectSn(projectSn); - detail.setPersonType(NumberUtil.compare(detail.getPostWorkType(), 200) >= 0 ? 1 : 2); + detail.setPersonType(workType.map(PostWorkType::getWorkerType).orElse(null)); detail.setBirthday(idCardInfoMap.get("birthday")); - detail.setPhone(importInfo.get("电话")); - detail.setEpcCbs(enterpriseInfos.stream().filter(o -> o.getEnterpriseName().equals(importInfo.get("EPC承包商"))).findFirst().map(o -> o.getId()).orElse(null)); + String phone = StrUtil.trim(importInfo.get("电话")); + detail.setPhone(phone); + String epcName = StrUtil.trim(importInfo.get("EPC承包商")); + Long epcCbs = enterpriseInfos.stream().filter(o -> o.getEnterpriseName().equals(epcName)).findFirst().map(EnterpriseInfo::getId).orElse(null); + if (epcCbs == null && StrUtil.isNotBlank(epcName)) { + absentEpcs.add(StrUtil.format("{}的EPC承包商({})", workerName, epcName)); + } + detail.setEpcCbs(epcCbs); //项目组 资格证号 资质类型 发证机关 取证日期 截止日期 - detail.setProjectGroup(Optional.ofNullable(groupMap.get(importInfo.get("*项目组"))).map(m -> Convert.toLong(m.getId())).orElse(null)); - detail.setCertificateNumber(importInfo.get("资格证号")); - detail.setCertificateType(Optional.ofNullable(certTypeMap.get(importInfo.get("资质类型"))).map(m -> Convert.toStr(m.getId())).orElse(null)); + String groupName = StrUtil.trim(importInfo.get("*项目组")); + Long projectGroup = Optional.ofNullable(groupMap.get(groupName)).map(m -> Convert.toLong(m.getId())).orElse(null); + if (projectGroup == null) { + absentGroups.add(StrUtil.format("{}的项目组({})", workerName, groupName)); + } + detail.setProjectGroup(projectGroup); + String certificateNumber = StrUtil.trim(importInfo.get("资格证号")); + detail.setCertificateNumber(certificateNumber); int issueCompany = isc.indexOf(importInfo.get("发证机关")); detail.setIssueCompany(issueCompany != -1 ? issueCompany + 1 : null); String issueTime = importInfo.get("取证日期"); @@ -771,9 +800,14 @@ public class WorkerAdmissionController { List ps = Arrays.asList("群众", "正式党员", "预备党员"); - int p = ps.indexOf(importInfo.get("政治面貌")); + String readPolitics = StrUtil.trim(importInfo.get("政治面貌")); + int p = ps.indexOf(readPolitics); + if (p == -1 && StrUtil.isNotBlank(readPolitics)) { + absentPolitics.add(StrUtil.format("{}的政治面貌({})", workerName, readPolitics)); + } detail.setPoliticsStatus(p != -1 ? p + 1 : null); - detail.setPoliticsStatusStr(importInfo.get("政治面貌")); + detail.setPoliticsStatusStr(readPolitics); + String readEdu = StrUtil.trim(importInfo.get("学历")); List edus = Arrays.asList("小学", "初中", "中专", @@ -783,18 +817,53 @@ public class WorkerAdmissionController { "研究生", "博士", "博士后"); - int edu = edus.indexOf(importInfo.get("学历")); + int edu = edus.indexOf(readEdu); + if (edu == -1 && StrUtil.isNotBlank(readEdu)) { + absentEdus.add(StrUtil.format("{}的学历({})", workerName, readEdu)); + } detail.setEducational(edu != -1 ? edu + 1 : null); - detail.setEducationalStr(importInfo.get("学历")); - PartyConstructionOrganization organization = orgMap.get(importInfo.get("支部名称")); + detail.setEducationalStr(readEdu); + String readBranch = StrUtil.trim(importInfo.get("支部名称")); + PartyConstructionOrganization organization = orgMap.get(readBranch); if (organization != null) { List ids = StrUtil.split(organization.getAncestors(), ","); ids.remove("0"); ids.add(organization.getId() + ""); detail.setBranchIdStr(StrUtil.join("-", ids)); + } else { + if (StrUtil.isNotBlank(readBranch)) { + absentBranchs.add(StrUtil.format("{}的支部名称({})", workerName, readBranch)); + } } admissionVos.add(detail); } + if (absentWorkerTypes.size() > 0 || + absentGroups.size() > 0 || + absentEpcs.size() > 0 || + absentEdus.size() > 0 || + absentPolitics.size() > 0 || + absentBranchs.size() > 0) { + ArrayList lists = new ArrayList<>(); + if (absentWorkerTypes.size() > 0) { + lists.add(StrUtil.join("、", absentWorkerTypes) + "不存在"); + } + if (absentGroups.size() > 0) { + lists.add(StrUtil.join("、", absentGroups) + "不存在"); + } + if (absentEpcs.size() > 0) { + lists.add(StrUtil.join("、", absentEpcs) + "不存在"); + } + if (absentEdus.size() > 0) { + lists.add(StrUtil.join("、", absentEdus) + "不存在"); + } + if (absentPolitics.size() > 0) { + lists.add(StrUtil.join("、", absentPolitics) + "不存在"); + } + if (absentBranchs.size() > 0) { + lists.add(StrUtil.join("、", absentBranchs) + "不存在"); + } + throw new OpenAlertException(StrUtil.join("。", lists)); + } return admissionVos; } @@ -807,15 +876,6 @@ public class WorkerAdmissionController { if (StringUtils.isBlank(importInfo.get("*姓名"))) { throw new OpenAlertException("有姓名未填写"); } -// if (StringUtils.isBlank(importInfo.get("*电话"))) { -// throw new OpenAlertException("有电话未填写"); -// } - //if (StringUtils.isBlank(importInfo.get("EPC承包商"))) { - // throw new OpenAlertException("有EPC承包商未填写"); - //} - //if (StringUtils.isBlank(importInfo.get("单位"))) { - // throw new OpenAlertException("有单位未填写"); - //} if (StringUtils.isBlank(importInfo.get("*工作区域"))) { throw new OpenAlertException("有工作区域未填写"); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionServiceImpl.java index 34ca918ca..37c182895 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionServiceImpl.java @@ -428,11 +428,6 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl postWorkTypes = postWorkTypeService.list(new LambdaQueryWrapper() .eq(PostWorkType::getProjectSn, projectSn)); - //List epcIds = deviceUnits.stream().map(DeviceUnit::getEpcContractorIds).collect(Collectors.toList()).stream().flatMap(o -> StrUtil.split(o, ",").stream()).distinct().collect(Collectors.toList()); - //List epcInfos = new ArrayList<>(); - //if (CollUtil.isNotEmpty(epcIds)) { - // epcInfos = enterpriseInfos.stream().filter(o -> epcIds.contains(o.getId() + "")).collect(Collectors.toList()); - //} List epcInfos = deviceUnitService.getEpcList(new MapBuilder() .put("projectSn", projectSn) .build()); diff --git a/src/main/java/com/zhgd/xmgl/modules/car/controller/CarInfoController.java b/src/main/java/com/zhgd/xmgl/modules/car/controller/CarInfoController.java index f6533300b..a73a96067 100644 --- a/src/main/java/com/zhgd/xmgl/modules/car/controller/CarInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/car/controller/CarInfoController.java @@ -465,8 +465,16 @@ public class CarInfoController { FileUtil.writeFromStream(zipFile.getInputStream(), zip); File unzip = ZipUtil.unzip(zip, Charset.forName("gbk")); File[] files = unzip.listFiles(); - if (!CollUtil.newArrayList(files).stream().anyMatch(o -> StringUtils.endsWith(o.getAbsolutePath(), ".xlsx"))) { - unzip = files[0]; + if (files == null || files.length == 0) { + throw new OpenAlertException("压缩文件为空"); + } + while (CollUtil.newArrayList(files).stream().noneMatch(o -> StringUtils.endsWith(o.getAbsolutePath(), ".xlsx"))) { + List dirList = Arrays.stream(files).filter(File::isDirectory).collect(Collectors.toList()); + if (dirList.size() != 1) { + throw new OpenAlertException("压缩文件目录结构有误,请检查"); + } + unzip = dirList.get(0); + files = unzip.listFiles(); } Result result = carInfoService.uploadExcelCar(unzip, projectSn); if (result.isSuccess()) { diff --git a/src/main/java/com/zhgd/xmgl/util/FlowSeviceUtil.java b/src/main/java/com/zhgd/xmgl/util/FlowSeviceUtil.java index 1447677d5..c721a7ac8 100644 --- a/src/main/java/com/zhgd/xmgl/util/FlowSeviceUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/FlowSeviceUtil.java @@ -42,6 +42,7 @@ import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.task.api.Task; @@ -451,9 +452,35 @@ public class FlowSeviceUtil { HistoricProcessInstanceQuery instanceQuery = historyService.createHistoricProcessInstanceQuery(); instanceQuery.processInstanceTenantId(TenantContextHolder.getTenantId()); if (Objects.equals(customStatus, 1)) { - instanceQuery.or().startedBy(userId + "").involvedUser(userId + "").endOr(); + HistoricProcessInstanceQuery baseQuery = historyService.createHistoricProcessInstanceQuery() + .or().startedBy(userId) + .involvedUser(userId) + .endOr() + .unfinished(); + List processInstanceIds = baseQuery.list() + .stream() + .map(HistoricProcessInstance::getId) + .collect(Collectors.toList()); + // 获取当前用户待处理任务的流程实例ID + TaskQuery taskQuery = taskService.createTaskQuery(); + ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); + Set stringSet = processInstanceQuery.list().stream().map(Execution::getProcessInstanceId).collect(Collectors.toSet()); + taskQuery.active().taskTenantId(TenantContextHolder.getTenantId()) + .processInstanceIdIn(stringSet) + .taskCandidateOrAssigned(userId); + List activeTaskProcessIds = taskQuery.list() + .stream() + .map(Task::getProcessInstanceId) + .collect(Collectors.toList()); + // 排除待处理的流程实例ID + processInstanceIds.removeAll(activeTaskProcessIds); + if (processInstanceIds.isEmpty()) { + processInstanceIds.add("-100"); + } + // 构造最终查询并分页 + instanceQuery.processInstanceIds(new HashSet<>(processInstanceIds)); } else if (Objects.equals(customStatus, 2)) { - instanceQuery.or().startedBy(userId + "").involvedUser(userId + "").endOr(); + instanceQuery.or().startedBy(userId).involvedUser(userId).endOr(); instanceQuery.finished(); } Executor.builder() diff --git a/src/main/resources/excel/人员入场导入模板.xlsx b/src/main/resources/excel/人员入场导入模板.xlsx index 2477a695b..787008fb8 100644 Binary files a/src/main/resources/excel/人员入场导入模板.xlsx and b/src/main/resources/excel/人员入场导入模板.xlsx differ