From 8b3243745fbadfc4bada0ee7ec0083c2760c3731 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 25 Feb 2025 21:45:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=85=E5=A4=B4bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/mybatis/DataScopeHandler.java | 1 - .../baotou/entity/ReturnTrainingDetail.java | 5 +- .../baotou/entity/WorkerAdmissionDetail.java | 5 +- .../mapper/xml/ReturnTrainingDetailMapper.xml | 4 - .../xml/WorkerAdmissionDetailMapper.xml | 4 - .../impl/CivilizeConstructionServiceImpl.java | 10 +- .../ConstructionEquipmentToolServiceImpl.java | 2 +- .../ContractorMonthlyApproveServiceImpl.java | 10 +- .../EngineerControllerCheckServiceImpl.java | 2 + .../service/impl/ProjectGroupServiceImpl.java | 2 +- .../ReturnTrainingApplicationServiceImpl.java | 4 +- .../WorkerAdmissionDetailServiceImpl.java | 5 +- .../impl/WorkerAdmissionServiceImpl.java | 5 +- .../impl/FlowOrgRepositoryServiceImpl.java | 46 +++-- .../exam/mapper/xml/ExamTrainRecordMapper.xml | 18 +- .../modules/exam/vo/ExamTrainRecordVo.java | 4 +- .../ProjectEnterpriseController.java | 159 ++++++++++-------- .../controller/WorkerInfoController.java | 105 ++++++++++-- .../modules/worker/entity/WorkerInfo.java | 7 +- .../worker/mapper/xml/WorkerInfoMapper.xml | 11 +- .../impl/EnterpriseInfoServiceImpl.java | 2 + .../service/impl/WorkerInfoServiceImpl.java | 7 +- .../XzWorkerSafeWatchAlarmController.java | 4 +- .../task/EnterpriseQualificationTask.java | 10 +- .../java/com/zhgd/xmgl/task/WorkerTask.java | 2 +- .../java/com/zhgd/xmgl/util/ExcelUtils.java | 20 +-- .../resources/excel/人员入场导入模板.xlsx | Bin 12384 -> 12368 bytes src/main/resources/excel/人员导入模板.xlsx | Bin 14305 -> 14287 bytes 28 files changed, 276 insertions(+), 178 deletions(-) diff --git a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java index 75ec974a3..5ffb64951 100644 --- a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java +++ b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java @@ -260,7 +260,6 @@ public class DataScopeHandler implements DataPermissionHandler { tables.put("pipeline_welder", new MapBuilder().put(DEVICE_COLUMN, "device_unit_id").build()); tables.put("project_schedule", new MapBuilder().put(DEVICE_COLUMN, "device_unit_id").build()); tables.put("quality_supervise", new MapBuilder().put(DEVICE_COLUMN, "device_id").build()); - tables.put("worker_admission_detail", new MapBuilder().put(DEVICE_COLUMN, "work_area").build()); tables.put("danger_environment_evaluate", new MapBuilder().put(DEVICE_COLUMN, "device_id").put(PROJECT_COLUMN, "project_group_id").build()); tables.put("civilize_construction", new MapBuilder().put(DEVICE_COLUMN, "device_id").put(PROJECT_COLUMN, "project_group_id").build()); diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ReturnTrainingDetail.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ReturnTrainingDetail.java index 6428dac8b..ef840eb06 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ReturnTrainingDetail.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ReturnTrainingDetail.java @@ -47,7 +47,7 @@ public class ReturnTrainingDetail implements Serializable { * 工作区域(装置) */ @ApiModelProperty(value = "工作区域(装置)") - private java.lang.Long workArea; + private java.lang.String workAreaName; /** * 岗位(工种) */ @@ -94,9 +94,6 @@ public class ReturnTrainingDetail implements Serializable { @ApiModelProperty(value = "更新时间") private java.util.Date updateDate; - @TableField(exist = false) - @ApiModelProperty(value = "工作区域(装置)名称") - private java.lang.String workAreaName; @TableField(exist = false) @ApiModelProperty(value = "岗位(工种)名称") private java.lang.String postWorkTypeName; diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java index d249c2d66..0e4ac3e41 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java @@ -78,7 +78,7 @@ public class WorkerAdmissionDetail implements Serializable { */ @Excel(name = "工作区域(装置)", width = 15) @ApiModelProperty(value = "工作区域(装置)") - private java.lang.Long workArea; + private java.lang.String workAreaName; /** * 岗位(工种) */ @@ -191,9 +191,6 @@ public class WorkerAdmissionDetail implements Serializable { @ApiModelProperty(value = "单位名称") private java.lang.String enterpriseName; @TableField(exist = false) - @ApiModelProperty(value = "工作区域(装置)名称") - private java.lang.String workAreaName; - @TableField(exist = false) @ApiModelProperty(value = "岗位(工种)名称") private java.lang.String postWorkTypeName; @TableField(exist = false) diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/ReturnTrainingDetailMapper.xml b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/ReturnTrainingDetailMapper.xml index 9ccc214e0..319a6969b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/ReturnTrainingDetailMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/ReturnTrainingDetailMapper.xml @@ -4,7 +4,6 @@ select * from ( select t.* - ,du.device_unit_name as work_area_name ,if(a.person_type=1,wt.type_name,c.department_name) as post_work_type_name ,etr.score ,etr.id as record_id @@ -41,7 +38,6 @@ from return_training_detail t join return_training_application rta on rta.id=t.application_id left join exam_train_record etr on etr.application_id=rta.id and etr.worker_card=t.id_card and etr.submit = 1 - left join device_unit du on du.id=t.work_area LEFT JOIN worker_info a on a.id_card=t.id_card LEFT JOIN team_info b ON a.team_id = b.id LEFT JOIN department_info c ON a.department_id = c.id diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/WorkerAdmissionDetailMapper.xml b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/WorkerAdmissionDetailMapper.xml index cf8854ff8..1bb2ff0e4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/WorkerAdmissionDetailMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/WorkerAdmissionDetailMapper.xml @@ -18,7 +18,6 @@ from (select t.*, ei1.enterprise_name as epc_cbs_name, ei2.enterprise_name as enterprise_name, - du1.device_unit_name as work_area_name, t2.name as post_work_type_name, tr.start_exam_time, tr.is_pass, @@ -31,7 +30,6 @@ left join worker_admission wa on wa.id=t.worker_admission_id left join enterprise_info ei1 on ei1.id=t.epc_cbs left join enterprise_info ei2 on ei2.id=t.enterprise_id - left join device_unit du1 on du1.id=t.work_area @@ -76,12 +74,10 @@ from (select t.*, ei1.enterprise_name as epc_cbs_name, ei2.enterprise_name as enterprise_name, - du1.device_unit_name as work_area_name, t2.name as post_work_type_name from worker_admission_detail t left join enterprise_info ei1 on ei1.id=t.epc_cbs left join enterprise_info ei2 on ei2.id=t.enterprise_id - left join device_unit du1 on du1.id=t.work_area left join ( diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CivilizeConstructionServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CivilizeConstructionServiceImpl.java index c74367609..b91a2663c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CivilizeConstructionServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CivilizeConstructionServiceImpl.java @@ -189,11 +189,11 @@ public class CivilizeConstructionServiceImpl extends ServiceImpl userIdsByUnit = noticeService.getUserIdsByUnit(new NoticeUnit(record.getProjectSn(), record.getProjectGroupId(), record.getSupervisingUnitId(), record.getEpcContractorId(), record.getConstructionUnitId())); - EnterpriseInfo enterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getId, record.getConstructionUnitId()).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); - noticeService.addUsersNotice(userIdsByUnit, "新增文明施工检查", - StrUtil.format("标题:文明施工检查,内容:{}发现文明施工问题,请及时整改。发送时间:{}", - enterpriseInfo.getEnterpriseName(), DateUtil.now()), "10"); +// List userIdsByUnit = noticeService.getUserIdsByUnit(new NoticeUnit(record.getProjectSn(), record.getProjectGroupId(), record.getSupervisingUnitId(), record.getEpcContractorId(), record.getConstructionUnitId())); +// EnterpriseInfo enterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getId, record.getConstructionUnitId()).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); +// noticeService.addUsersNotice(userIdsByUnit, "新增文明施工检查", +// StrUtil.format("标题:文明施工检查,内容:{}发现文明施工问题,请及时整改。发送时间:{}", +// enterpriseInfo.getEnterpriseName(), DateUtil.now()), "10"); baseMapper.insert(record); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ConstructionEquipmentToolServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ConstructionEquipmentToolServiceImpl.java index 9ac6abe06..d17b7de03 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ConstructionEquipmentToolServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ConstructionEquipmentToolServiceImpl.java @@ -157,7 +157,7 @@ public class ConstructionEquipmentToolServiceImpl extends ServiceImpl detailList = contractorMonthlyDetailService.list(new LambdaQueryWrapper() .eq(ContractorMonthlyDetail::getApproveId, approveId)); diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java index beaa5ccf1..7bfc2f271 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java @@ -131,6 +131,8 @@ public class EngineerControllerCheckServiceImpl extends ServiceImpl m.getWorkerName()).orElse(null)); - detail.setWorkArea(FlowUtil.getPullDownLong(jo, "field4239411495267")); + detail.setWorkAreaName(FlowUtil.getString(jo, "field6900388110980")); detail.setPostWorkType(FlowUtil.getPullDownLong(jo, "field7484411505770")); detail.setSex(FlowUtil.getPullDownInteger(jo, "field9370711501896")); detail.setAge(Convert.toStr(FlowUtil.getInteger(jo, "field9087611515056"))); @@ -159,7 +159,7 @@ public class ReturnTrainingApplicationServiceImpl extends ServiceImpl m.getWorkerName()).orElse(null)); - detail.setWorkArea(FlowUtil.getPullDownLong(jo, "field2982911864361")); + detail.setWorkAreaName(FlowUtil.getString(jo, "field9629988265932")); detail.setPostWorkType(FlowUtil.getPullDownLong(jo, "field4744811867669")); detail.setSex(FlowUtil.getPullDownInteger(jo, "field1418511843858")); detail.setAge(FlowUtil.getString(jo, "field1290511871434")); diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java index 29a03a68a..317e989a9 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java @@ -450,7 +450,6 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl idCardMap = IdCardUtils.getBirthdayAgeSex(idCard); Integer sex = Integer.valueOf(idCardMap.get("sex")); Integer isCertificateQualified = FlowUtil.getPullDownInteger(m, "field1062926653275"); @@ -238,7 +237,7 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl op = workerTypeList.stream().filter(p -> Objects.equals(p.getData(), postWorkType + "")).findFirst(); String team = null; @@ -426,7 +425,7 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl o.getEnterpriseName().equals(importInfo.get("单位"))).findFirst().map(EnterpriseInfo::getId).orElse(null)); - detail.setWorkArea(deviceUnits.stream().filter(o -> o.getDeviceUnitName().equals(importInfo.get("*工作区域"))).findFirst().map(o -> o.getId()).orElse(null)); + detail.setWorkAreaName(importInfo.get("*工作区域")); detail.setPostWorkType(workerTypeList.stream().filter(o -> o.getName().equals(importInfo.get("*岗位(工种)"))).findFirst().map(o -> Integer.valueOf(o.getData())).orElse(null)); //detail.setTeam(""); Map idCardInfoMap = IdCardUtils.getBirthdayAgeSex(importInfo.get("*身份证号")); diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java index 91803d2d0..f87e7c2fc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java @@ -9,7 +9,9 @@ import com.wflow.bean.do_.DeptDo; import com.wflow.bean.do_.RoleDo; import com.wflow.bean.do_.UserDeptDo; import com.wflow.bean.do_.UserDo; -import com.wflow.bean.entity.*; +import com.wflow.bean.entity.WflowModelHistorys; +import com.wflow.bean.entity.WflowModelPerms; +import com.wflow.bean.entity.WflowModels; import com.wflow.bean.vo.ModelGroupVo; import com.wflow.bean.vo.OrgTreeVo; import com.wflow.bean.vo.UserVo; @@ -18,19 +20,26 @@ import com.wflow.mapper.WflowModelsMapper; import com.wflow.service.OrgRepositoryService; import com.wflow.workflow.bean.dto.NotifyDto; import com.wflow.workflow.bean.process.OrgUser; +import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.basicdata.entity.BaseRole; import com.zhgd.xmgl.modules.basicdata.entity.BaseRoleUser; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.mapper.BaseRoleMapper; import com.zhgd.xmgl.modules.basicdata.mapper.BaseRoleUserMapper; import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper; +import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; +import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import com.zhgd.xmgl.modules.worker.mapper.DepartmentInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.TeamInfoMapper; +import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl; +import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzProjectOrg; import com.zhgd.xmgl.modules.xz.mapper.XzProjectOrgMapper; import com.zhgd.xmgl.tenant.TenantContextHolder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -41,35 +50,35 @@ import java.util.stream.Collectors; @Service public class FlowOrgRepositoryServiceImpl implements OrgRepositoryService { + @Autowired + @Lazy + EnterpriseInfoServiceImpl enterpriseInfoService; @Autowired private SystemUserMapper systemUserMapper; - @Autowired private BaseRoleUserMapper baseRoleUserMapper; - @Autowired private BaseRoleMapper systemRoleMapper; - @Autowired private XzProjectOrgMapper xzProjectOrgMapper; - @Autowired private WflowModelPermsMapper modelPermsMapper; - @Autowired private WflowModelsMapper wflowModelsMapper; - @Autowired private TeamInfoMapper teamInfoMapper; - @Autowired private DepartmentInfoMapper departmentInfoMapper; - @Autowired private EnterpriseInfoMapper enterpriseInfoMapper; - @Autowired private NoticeServiceImpl noticeService; + @Lazy + @Autowired + private ISystemUserService systemUserService; + @Lazy + @Autowired + private WorkerInfoServiceImpl workerInfoService; @Override public List getModelsByPerm(String userId) { @@ -104,7 +113,7 @@ public class FlowOrgRepositoryServiceImpl implements OrgRepositoryService { return list; } - private void getList(Long deptId, List orgList){ + private void getList(Long deptId, List orgList) { XzProjectOrg parentId = xzProjectOrgMapper.selectOne(Wrappers.lambdaQuery().eq(XzProjectOrg::getId, deptId)); if (parentId != null) { getList(parentId.getParentId(), orgList); @@ -318,6 +327,21 @@ public class FlowOrgRepositoryServiceImpl implements OrgRepositoryService { noticeService.addUserNoticeAndApp(Long.valueOf(notify.getTarget()), notify.getTitle(), notify.getContent(), "10"); } + @Override + public com.alibaba.fastjson2.JSONObject getEnterpriseByUserId(String id) { + SystemUser systemUser = systemUserService.getById(id); + if (systemUser != null) { + List workerInfos = workerInfoService.list(new LambdaQueryWrapper() + .eq(WorkerInfo::getId, systemUser.getWorkerId()).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); + if (CollUtil.isNotEmpty(workerInfos)) { + List enterpriseInfos = enterpriseInfoService.list(new LambdaQueryWrapper() + .eq(EnterpriseInfo::getId, workerInfos.get(0).getEnterpriseId()).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); + return CollUtil.isNotEmpty(enterpriseInfos) ? com.alibaba.fastjson2.JSONObject.parseObject(JSON.toJSONString(enterpriseInfos.get(0))) : new com.alibaba.fastjson2.JSONObject(); + } + } + return null; + } + @Override public List selectEnterpriseByPy(String py) { String tenantId = TenantContextHolder.getTenantId(); diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/mapper/xml/ExamTrainRecordMapper.xml b/src/main/java/com/zhgd/xmgl/modules/exam/mapper/xml/ExamTrainRecordMapper.xml index 0ff14dc38..7ccb98e81 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/mapper/xml/ExamTrainRecordMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/exam/mapper/xml/ExamTrainRecordMapper.xml @@ -12,8 +12,7 @@ ei.enterprise_name, null as epc_cbs, null as epc_cbs_name, - wi.work_area as work_area, - du.device_unit_name as work_area_name, + wi.work_area_name as work_area_name, ifnull(wt.type_name,di.department_name) as work_type, wi.sex as sex, YEAR(CURDATE())-YEAR(wi.birthday) as age, @@ -31,7 +30,6 @@ left join enterprise_info ei on ei.id=wi.enterprise_id left join (select worker_id,certificate_number from worker_certificate group by worker_id) wc on ec.worker_id = wc.worker_id - left join device_unit du on du.id=wi.work_area where es.type!=1 and ec.submit = 1 ) a ${ew.customSqlSegment} @@ -45,8 +43,7 @@ ei.enterprise_name, wi.epc_cbs as epc_cbs, ei1.enterprise_name as epc_cbs_name, - wi.work_area as work_area, - du.device_unit_name as work_area_name, + wi.work_area_name as work_area_name, dt.name as work_type, wi.sex as sex, wi.age as age, @@ -62,7 +59,6 @@ left join enterprise_info ei1 on ei1.id=wi.epc_cbs left join (select worker_admission_detail_id,certificate_number from worker_admission_certificate_detail group by worker_admission_detail_id) wc on wc.worker_admission_detail_id = wi.id - left join device_unit du on du.id=wi.work_area left join ( SELECT * FROM dictionary_item @@ -208,7 +204,7 @@ wi.safe_score, wi.send_success_status, wi.exit_safe_score, - wi.work_area, + wi.work_area_name, wi.num, wi.worker_admission_detail_id, wi.entry_deadline, @@ -252,8 +248,7 @@ ei.enterprise_name, null as epc_cbs, null as epc_cbs_name, - wi.work_area as work_area, - du.device_unit_name as work_area_name, + wi.work_area_name as work_area_name, ifnull(wt.type_name,di.department_name) as work_type, wi.sex as sex, YEAR(CURDATE())-YEAR(wi.birthday) as age, @@ -270,7 +265,6 @@ left join enterprise_info ei on ei.id=wi.enterprise_id left join (select worker_id,certificate_number from worker_certificate group by worker_id) wc on ec.worker_id = wc.worker_id - left join device_unit du on du.id=wi.work_area where es.type!=1 and ec.submit = 1 ) a where a.id=#{recordId} @@ -284,8 +278,7 @@ ei.enterprise_name, wi.epc_cbs as epc_cbs, ei1.enterprise_name as epc_cbs_name, - wi.work_area as work_area, - du.device_unit_name as work_area_name, + wi.work_area_name as work_area_name, dt.name as work_type, wi.sex as sex, wi.age as age, @@ -300,7 +293,6 @@ left join enterprise_info ei1 on ei1.id=wi.epc_cbs left join (select worker_admission_detail_id,certificate_number from worker_admission_certificate_detail group by worker_admission_detail_id) wc on wc.worker_admission_detail_id = wi.id - left join device_unit du on du.id=wi.work_area left join ( SELECT * FROM dictionary_item diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamTrainRecordVo.java b/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamTrainRecordVo.java index 63eea0da8..882a837dd 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamTrainRecordVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamTrainRecordVo.java @@ -251,7 +251,7 @@ public class ExamTrainRecordVo extends ExamTrainRecord { */ @Excel(name = "工作区域(装置)", width = 15) @ApiModelProperty(value = "工作区域(装置)") - private java.lang.Long workArea; + private java.lang.String workAreaName; @ApiModelProperty(value = "班组名称") private String teamName; @@ -277,8 +277,6 @@ public class ExamTrainRecordVo extends ExamTrainRecord { private java.lang.String certificateNumber; @ApiModelProperty(value = "EPC承包商名称") private java.lang.String epcCbsName; - @ApiModelProperty(value = "工作区域(装置)名称") - private java.lang.String workAreaName; @ApiModelProperty(value = "分类:1:入场培训;2:复工培训;3:专项培训") private Integer subjectType; @ApiModelProperty(value = "岗位(工种)名称") diff --git a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java index 9be6d2144..aaedc58c6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java @@ -5,6 +5,8 @@ import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gexin.fastjson.JSON; +import com.gexin.fastjson.JSONArray; +import com.gexin.fastjson.JSONObject; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.execption.OpenAlertException; @@ -30,6 +32,8 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.PostMapping; @@ -243,41 +247,64 @@ public class ProjectEnterpriseController { throw new OpenAlertException("企业资质不能为空"); } String title = "承包商入场申请"; - EnterpriseInfo existEnterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getSocialCode, socialCode).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); - if (existEnterpriseInfo != null) { - List projectEnterpriseList = projectEnterpriseService.list(new LambdaQueryWrapper() - .eq(ProjectEnterprise::getEnterpriseId, existEnterpriseInfo.getId()) - .eq(ProjectEnterprise::getProjectSn, projectSn)); - if (CollUtil.isNotEmpty(projectEnterpriseList)) { - String msg = sub + "已存在"; - noticeService.addProjectLevelNotice(projectSn, title, msg, "10", null); - throw new OpenAlertException(msg); - } - } - HashSet haveQualificationTypes = new HashSet<>(); - if (Objects.equals(enterpriseTypeId, 6)) { - //专业分包 - haveQualificationTypes.add(1); - haveQualificationTypes.add(3); - haveQualificationTypes.add(4); - haveQualificationTypes.add(5); - haveQualificationTypes.add(6); - haveQualificationTypes.add(7); - } else { - haveQualificationTypes.add(1); - haveQualificationTypes.add(2); - } - for (Object qr : enterpriseQualifications) { - Map map1 = (Map) qr; - Integer qualificationType = Optional.ofNullable(map1.get("field6906058457282")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); - haveQualificationTypes.remove(qualificationType); +// EnterpriseInfo existEnterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getSocialCode, socialCode).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); +// if (existEnterpriseInfo != null) { +// List projectEnterpriseList = projectEnterpriseService.list(new LambdaQueryWrapper() +// .eq(ProjectEnterprise::getEnterpriseId, existEnterpriseInfo.getId()) +// .eq(ProjectEnterprise::getProjectSn, projectSn)); +// if (CollUtil.isNotEmpty(projectEnterpriseList)) { +// String msg = sub + "已存在"; +// noticeService.addProjectLevelNotice(projectSn, title, msg, "10", null); +// throw new OpenAlertException(msg); +// } +// } +// HashSet haveQualificationTypes = new HashSet<>(); +// if (Objects.equals(enterpriseTypeId, 6)) { +// //专业分包 +// haveQualificationTypes.add(1); +// haveQualificationTypes.add(3); +// haveQualificationTypes.add(4); +// haveQualificationTypes.add(5); +// haveQualificationTypes.add(6); +// haveQualificationTypes.add(7); +// } else { +// haveQualificationTypes.add(1); +// haveQualificationTypes.add(2); +// } +// for (Object qr : enterpriseQualifications) { +// Map map1 = (Map) qr; +// Integer qualificationType = Optional.ofNullable(map1.get("field6906058457282")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); +// haveQualificationTypes.remove(qualificationType); +// } +// if (CollUtil.isNotEmpty(haveQualificationTypes)) { +// if (Objects.equals(enterpriseTypeId, 6L)) { +// throw new OpenAlertException("需要上传营业执照、企业资质、设计资质(设计专业提供)、安全生产许可证、职业健康安全管理体系认证证书、环境管理体系认证证书"); +// } else { +// throw new OpenAlertException("需要上传营业执照、资质证书"); +// } +// } + HashSet haveQualificationTypes = new HashSet<>(); + haveQualificationTypes.add("6"); + haveQualificationTypes.add("7"); + haveQualificationTypes.add("8"); + JSONArray ja = JSON.parseArray(JSON.toJSONString(map.get("field4204582838396"))); + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + String type = FlowUtil.getPullDownString(jo, "field6906058457282"); + haveQualificationTypes.remove(type); } if (CollUtil.isNotEmpty(haveQualificationTypes)) { - if (Objects.equals(enterpriseTypeId, 6L)) { - throw new OpenAlertException("需要上传营业执照、企业资质、设计资质(设计专业提供)、安全生产许可证、职业健康安全管理体系认证证书、环境管理体系认证证书"); - } else { - throw new OpenAlertException("需要上传营业执照、资质证书"); + String typeName = ""; + if (haveQualificationTypes.contains("6")) { + typeName += "职业健康安全管理体系认证证书、"; } + if (haveQualificationTypes.contains("7")) { + typeName += "环境管理体系认证证书、"; + } + if (haveQualificationTypes.contains("8")) { + typeName += "质量管理体系认证证书、"; + } + throw new OpenAlertException("需要上传" + StringUtils.removeEnd(typeName, "、")); } return Result.ok(); } @@ -346,35 +373,35 @@ public class ProjectEnterpriseController { enterpriseInfo.setProjectDirectorName(projectDirectorName); enterpriseInfo.setProjectDirectorPhone(projectDirectorPhone); enterpriseInfo.setProjectSn(projectSn); - String sub = enterpriseName + "(信用代码:" + socialCode + ")"; - EnterpriseInfo existEnterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getSocialCode, socialCode).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); - if (existEnterpriseInfo != null) { - List projectEnterpriseList = projectEnterpriseService.list(new LambdaQueryWrapper() - .eq(ProjectEnterprise::getEnterpriseId, existEnterpriseInfo.getId()) - .eq(ProjectEnterprise::getProjectSn, projectSn)); - if (CollUtil.isNotEmpty(projectEnterpriseList)) { - String msg = sub + "已存在"; - noticeService.addProjectLevelNotice(projectSn, title, msg, "10", null); - return Result.ok(); - } - } +// String sub = enterpriseName + "(信用代码:" + socialCode + ")"; +// EnterpriseInfo existEnterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getSocialCode, socialCode).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); +// if (existEnterpriseInfo != null) { +// List projectEnterpriseList = projectEnterpriseService.list(new LambdaQueryWrapper() +// .eq(ProjectEnterprise::getEnterpriseId, existEnterpriseInfo.getId()) +// .eq(ProjectEnterprise::getProjectSn, projectSn)); +// if (CollUtil.isNotEmpty(projectEnterpriseList)) { +// String msg = sub + "已存在"; +// noticeService.addProjectLevelNotice(projectSn, title, msg, "10", null); +// return Result.ok(); +// } +// } List enterpriseQualifications = Optional.ofNullable(map.get("enterpriseQualifications")).map(o -> ((List) o)).orElse(null); if (CollUtil.isEmpty(enterpriseQualifications)) { throw new OpenAlertException("企业资质不能为空"); } - HashSet haveQualificationTypes = new HashSet<>(); - if (Objects.equals(enterpriseTypeId, 6)) { - //专业分包 - haveQualificationTypes.add(1); - haveQualificationTypes.add(3); - haveQualificationTypes.add(4); - haveQualificationTypes.add(5); - haveQualificationTypes.add(6); - haveQualificationTypes.add(7); - } else { - haveQualificationTypes.add(1); - haveQualificationTypes.add(2); - } +// HashSet haveQualificationTypes = new HashSet<>(); +// if (Objects.equals(enterpriseTypeId, 6)) { +// //专业分包 +// haveQualificationTypes.add(1); +// haveQualificationTypes.add(3); +// haveQualificationTypes.add(4); +// haveQualificationTypes.add(5); +// haveQualificationTypes.add(6); +// haveQualificationTypes.add(7); +// } else { +// haveQualificationTypes.add(1); +// haveQualificationTypes.add(2); +// } ArrayList qualificationList = new ArrayList<>(); for (Object qr : enterpriseQualifications) { Map map1 = (Map) qr; @@ -386,7 +413,7 @@ public class ProjectEnterpriseController { Integer qualificationType = Optional.ofNullable(map1.get("field6906058457282")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); Date qualificationStartTime = FlowUtil.getStartDate(map1, "field8056482998908"); Date qualificationEndTime = FlowUtil.getEndDate(map1, "field8056482998908"); - haveQualificationTypes.remove(qualificationType); +// haveQualificationTypes.remove(qualificationType); EnterpriseQualification qualification = new EnterpriseQualification(); // qualification.setEnterpriseId(0L); qualification.setFileName(fileName); @@ -399,14 +426,14 @@ public class ProjectEnterpriseController { qualification.setQualificationEndTime(qualificationEndTime); qualificationList.add(qualification); } - if (CollUtil.isNotEmpty(haveQualificationTypes)) { - if (Objects.equals(enterpriseTypeId, 6L)) { - throw new OpenAlertException("需要上传营业执照、企业资质、设计资质(设计专业提供)、安全生产许可证、职业健康安全管理体系认证证书、环境管理体系认证证书"); - } else { - throw new OpenAlertException("需要上传营业执照、资质证书"); - } - } - enterpriseInfoService.saveEnterpriseInfo(enterpriseInfo); +// if (CollUtil.isNotEmpty(haveQualificationTypes)) { +// if (Objects.equals(enterpriseTypeId, 6L)) { +// throw new OpenAlertException("需要上传营业执照、企业资质、设计资质(设计专业提供)、安全生产许可证、职业健康安全管理体系认证证书、环境管理体系认证证书"); +// } else { +// throw new OpenAlertException("需要上传营业执照、资质证书"); +// } +// } + enterpriseInfoService.saveObj(enterpriseInfo); for (EnterpriseQualification qualification : qualificationList) { qualification.setEnterpriseId(enterpriseInfo.getId()); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java index dd176b287..ab6df854f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java @@ -1,7 +1,18 @@ package com.zhgd.xmgl.modules.worker.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gexin.fastjson.TypeReference; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.mybatis.EntityMap; @@ -12,20 +23,29 @@ import com.zhgd.xmgl.base.entity.vo.TrendOneVo; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import com.zhgd.xmgl.modules.worker.entity.vo.*; import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; +import com.zhgd.xmgl.util.JoBuilder; +import com.zhgd.xmgl.util.MapBuilder; +import com.zhgd.xmgl.util.MinioUtils; +import com.zhgd.xmgl.util.PathUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** @@ -40,6 +60,9 @@ import java.util.*; @Slf4j @Api(tags = "劳务人员") public class WorkerInfoController { + @Lazy + @Autowired + MinioUtils minioUtils; @Autowired private IWorkerInfoService workerInfoService; @Autowired @@ -113,7 +136,6 @@ public class WorkerInfoController { return Result.ok(); } - /** * 通过id查询 * @@ -128,7 +150,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.queryById(MapUtils.getString(map, "id"))); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "分页列表查询劳务人员") @ApiOperation(value = "分页列表查询劳务人员(常用)", notes = "分页列表查询劳务人员(常用)", httpMethod = "POST") @ApiImplicitParams({ @@ -167,7 +188,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.selectWorkerInfoList(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "人员总览人员类型和教育统计") @ApiOperation(value = "人员总览人员类型和教育统计(常用)", notes = "人员总览人员类型和教育统计(常用)") @ApiImplicitParams({ @@ -204,7 +224,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.selectWorkerInfoList(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "查询全部人员信息") @ApiOperation(value = "查询全部人员信息", notes = "查询全部人员信息", httpMethod = "GET") @ApiImplicitParams({ @@ -229,7 +248,6 @@ public class WorkerInfoController { return Result.success(Collections.singleton(workerInfoService.selectWorkerInfoList(map))); } - @ApiIdempotent @OperLog(operModul = "劳务管理", operType = "批量修改劳务人员班组", operDesc = "批量修改劳务人员班组") @ApiOperation(value = "批量修改劳务人员班组", notes = "批量修改劳务人员班组", httpMethod = "POST") @@ -301,7 +319,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.getLaborManagementInfoList(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "统计企业下项目各人员统计") @ApiOperation(value = "统计企业下项目各人员统计", notes = "统计企业下项目各人员统计") @ApiImplicitParams({ @@ -356,7 +373,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.selectWorkerManageEnterpriseStatistics(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "项目人员统计") @ApiOperation(value = "项目人员统计", notes = "项目人员统计") @ApiImplicitParams({ @@ -377,7 +393,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.selectProjectPresentWorkerList(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "查询所有工种出勤、在场人数列表") @ApiOperation(value = "查询所有工种出勤、在场人数列表", notes = "查询所有工种出勤、在场人数列表") @ApiImplicitParams({ @@ -503,7 +518,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.getPersonnelSituationNum(projectSn)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "指挥中心-人员概况") @ApiOperation(value = "指挥中心-人员概况", notes = "指挥中心-人员概况") @ApiImplicitParams({ @@ -514,7 +528,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.getPersonnelSituation(projectSn)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "人员管理-通过项目id,获取各种人员数量") @ApiOperation(value = "人员管理-通过项目id,获取各种人员数量", notes = "人员管理-通过项目id,以及时间区间查询人员增长趋势") @ApiImplicitParams({ @@ -539,7 +552,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.getDeclareAge(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "人员管理-通过项目sn,以及时间区间查询人员增长趋势") @ApiOperation(value = "人员管理-通过项目sn,以及时间区间查询人员增长趋势", notes = "人员管理-通过项目id,以及时间区间查询人员增长趋势") @ApiImplicitParams({ @@ -577,7 +589,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.selectWorkerTeamAndDepartmentStatistics(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "批量将要向住建局下发的人下发") @ApiIdempotent @ApiOperation(value = "批量将要向住建局下发的人下发", notes = "批量将要向住建局下发的人下发") @@ -746,7 +757,6 @@ public class WorkerInfoController { return Result.success(workerInfoService.statsEnterprise(map)); } - @OperLog(operModul = "劳务管理", operType = "查询", operDesc = "企业安全评分汇总表") @ApiOperation(value = "企业安全评分汇总表", notes = "企业安全评分汇总表", httpMethod = "POST") @ApiImplicitParams({ @@ -803,10 +813,77 @@ public class WorkerInfoController { @ApiImplicitParam(name = "enterpriseId", value = "企业id", paramType = "body", required = true, dataType = "String"), }) @PostMapping(value = "/getPostWorkTypeList") - public Result>> getPostWorkTypeList(@RequestBody Map map) { + public Result>> getPostWorkTypeList(@RequestBody Map map) { return Result.success(workerInfoService.getPostWorkTypeList(map)); } + @OperLog(operModul = "劳务管理", operType = "", operDesc = "人员制卡信息导出") + @ApiOperation(value = "人员制卡信息导出", notes = "人员制卡信息导出", httpMethod = "POST") + @ApiImplicitParam(name = "workerIdList", value = "劳务人员ID列表", paramType = "body", required = true) + @PostMapping(value = "/batchPrintCard") + public Result batchPrintCard(@ApiIgnore @RequestBody HashMap param) throws IOException { + List workerIdList = com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(param.get("workerIdList")), new TypeReference>() { + }); + if (CollUtil.isEmpty(workerIdList)) { + return Result.ok(); + } + List workerInfoList = workerInfoService.selectWorkerInfoList(new MapBuilder() + .put("workerIdList", param.get("workerIdList")) + .build()).getRecords(); + Map idCardMap = workerInfoList.stream().collect(Collectors.toMap(WorkerInfo::getIdCard, Function.identity())); + String foldName = "batchPrintCard/" + IdUtil.simpleUUID(); + File foldFile = new File(PathUtil.getBasePath() + "/" + foldName); + File head = new File(foldFile, "头像"); + File qrCode = new File(foldFile, "二维码"); + foldFile.mkdirs(); + head.mkdirs(); + qrCode.mkdirs(); + List entity = new ArrayList(); + entity.add(new ExcelExportEntity("编号", "num")); + entity.add(new ExcelExportEntity("姓名", "name")); + entity.add(new ExcelExportEntity("岗位/工种", "post")); + entity.add(new ExcelExportEntity("单位", "enterprise")); + entity.add(new ExcelExportEntity("发证日期", "date")); + List> excelList = new ArrayList>(); + Set workerNames = new HashSet<>(); + for (WorkerInfo detail : workerInfoList) { + String workerName = detail.getWorkerName(); + while (workerNames.contains(workerName)) { + workerName += workerName + "(1)"; + } + workerNames.add(workerName); + Map map = new HashMap(); + String num = detail.getNum(); + map.put("num", num); + map.put("name", workerName); + map.put("post", detail.getPostWorkTypeName()); + map.put("enterprise", detail.getEnterpriseName()); + map.put("date", DateUtil.today()); + excelList.add(map); + try { + String url = detail.getFieldAcquisitionUrl(); + MinioUtils.downloadFile(url); + FileUtil.move(FileUtil.file(PathUtil.getBasePath(), url), FileUtil.file(head, workerName + "." + StrUtil.subAfter(url, ".", true)), true); + } catch (Exception e) { + log.error("批量制卡", e); + } + // 生成指定url对应的二维码到文件,宽和高都是300像素 + QrCodeUtil.generate("/pages/projectEnd/laborManage/searchTeam/personDetail?id=" + idCardMap.get(detail.getIdCard()).getId(), 300, 300, FileUtil.file(qrCode, num + ".jpg")); + } + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entity, excelList); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(foldFile + "/人员.xlsx"); + workbook.write(fos); + } finally { + if (fos != null) { + fos.close(); + } + } + ZipUtil.zip(foldFile.getAbsolutePath()); + minioUtils.uploadBySameName(foldName + ".zip", false); + return Result.success(new JoBuilder().put("file", foldName + ".zip").build()); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java index 47beaf63f..b8078d647 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java @@ -346,7 +346,7 @@ public class WorkerInfo implements Serializable { */ @Excel(name = "工作区域(装置)", width = 15) @ApiModelProperty(value = "工作区域(装置)") - private java.lang.Long workArea; + private java.lang.String workAreaName; @ApiModelProperty(value = "编号") private java.lang.String num; @ApiModelProperty(value = "人员入场明细ID") @@ -425,9 +425,6 @@ public class WorkerInfo implements Serializable { @ApiModelProperty(value = "岗位(工种)名称") private java.lang.String postWorkTypeName; @TableField(exist = false) - @ApiModelProperty(value = "工作区域(装置)名称") - private java.lang.String workAreaName; - @TableField(exist = false) @ApiModelProperty(value = "EPC承包商名称") private java.lang.String epcCbsName; @TableField(exist = false) @@ -442,7 +439,7 @@ public class WorkerInfo implements Serializable { ", workerName='" + workerName + '\'' + ", idCard='" + idCard + '\'' + ", enterpriseId=" + enterpriseId + - ", workArea='" + workArea + '\'' + + ", workArea='" + workAreaName + '\'' + ", num='" + num + '\'' + ", entryDeadline='" + entryDeadline + '\'' + ", epcCbs='" + epcCbs + '\'' + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index 706ac2e40..755f400de 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -32,7 +32,6 @@ wt.type_name, if(wap.id is not null,1,2) presence ,if(a.person_type=1,b.team_name,c.department_name) as post_work_type_name - ,du.device_unit_name as work_area_name ,wt.id as worker_type_id ,if(a.person_type=1,b.id,c.id) as post_work_type_id from worker_info a @@ -51,7 +50,6 @@ and create_time>=current_date group by person_sn ) wa on wa.person_sn = a.person_sn - LEFT JOIN device_unit du on du.id=a.work_area WHERE 1 = 1 and a.num like concat('%', #{param.num},'%') @@ -837,7 +835,6 @@ or (TIMESTAMPDIFF(HOUR, a.nad_time, now()) >= 168 and a.worker_classify = 1)) then '核酸已超时' else '核酸未超时' end) as acid_status_name ,if(a.person_type=1,wt.type_name,c.department_name) as post_work_type_name - ,du.device_unit_name as work_area_name from worker_info a LEFT JOIN team_info b ON a.team_id = b.id LEFT JOIN enterprise_info en ON en.id = a.enterprise_id @@ -845,7 +842,6 @@ LEFT JOIN worker_type wt ON b.worker_type_id = wt.id LEFT JOIN dictionaries_record d ON a.job_type = d.id LEFT JOIN dictionaries_record e ON a.job_name = e.id - LEFT JOIN device_unit du on du.id=a.work_area WHERE a.project_sn = #{projectSn} and a.enterprise_id in @@ -1218,7 +1214,6 @@ else 0 end) work_day_num, ru.rule_name ,if(a.person_type=1,wt.type_name,c.department_name) as post_work_type_name - ,du.device_unit_name as work_area_name ,ei1.enterprise_name as epc_cbs_name from worker_info a INNER JOIN project p ON a.project_sn = p.project_sn @@ -1229,7 +1224,6 @@ LEFT JOIN dictionaries_record e ON a.job_name = e.id LEFT JOIN enterprise_info en ON a.enterprise_id = en.id LEFT JOIN worker_attendance_rule ru ON a.rule_id = ru.id - LEFT JOIN device_unit du on du.id=a.work_area LEFT JOIN enterprise_info ei1 on ei1.id=a.epc_cbs WHERE a.id = #{workerId} @@ -2646,11 +2640,10 @@ diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java index 844b4bcfe..2e71eefc7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java @@ -1,6 +1,7 @@ package com.zhgd.xmgl.modules.worker.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -601,6 +602,7 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl infoList = enterpriseInfoMapper.getEnterpriseInfoList(map); if (CollUtil.isNotEmpty(infoList)) { + enterpriseInfo.setId(Convert.toLong(infoList.get(0).get("id"))); this.updateEnterpriseInfo(enterpriseInfo); } else { this.saveEnterpriseInfo(enterpriseInfo); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index c10847745..4f477d35c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -1986,7 +1986,7 @@ public class WorkerInfoServiceImpl extends ServiceImpl m.getId()).orElse(null)); + workerInfo.setWorkAreaName(importInfo.get("工作区域")); workerInfo.setNum(importInfo.get("编号")); workerInfo.setEntryDeadline(importInfo.get("计划入场截止时间")); workerInfo.setPersonMail(importInfo.get("邮箱")); @@ -2225,9 +2225,6 @@ public class WorkerInfoServiceImpl extends ServiceImpl page = PageUtil.getPage(map); queryWrapper.lambda().orderByDesc(XzWorkerSafeWatchAlarm::getAlarmTime); IPage pageList = xzWorkerSafeWatchAlarmService.page(page, queryWrapper); - String[] typeName = {"人员日常考勤", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过", "同一企业同一隐患连续检查到(x)次", "一级安全隐患未整改超过(x)分钟", "一级安全隐患未复查超过(x)分钟", "一级安全隐患未核验超过(x)分钟", "二级安全隐患未整改超过(x)分钟", "二级安全隐患未复查超过(x)分钟", "二级安全隐患未核验超过(x)分钟", "三级安全隐患未整改超过(x)分钟", "三级安全隐患未复查超过(x)分钟", "三级安全隐患未核验超过(x)分钟", "四级安全隐患未整改超过(x)分钟", "四级安全隐患未复查超过(x)分钟", "四级安全隐患未核验超过(x)分钟"}; + String[] typeName = {"一个月内连续缺勤超过", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过", "同一企业同一隐患连续检查到(x)次", "一级安全隐患未整改超过(x)分钟", "一级安全隐患未复查超过(x)分钟", "一级安全隐患未核验超过(x)分钟", "二级安全隐患未整改超过(x)分钟", "二级安全隐患未复查超过(x)分钟", "二级安全隐患未核验超过(x)分钟", "三级安全隐患未整改超过(x)分钟", "三级安全隐患未复查超过(x)分钟", "三级安全隐患未核验超过(x)分钟", "四级安全隐患未整改超过(x)分钟", "四级安全隐患未复查超过(x)分钟", "四级安全隐患未核验超过(x)分钟"}; for (XzWorkerSafeWatchAlarm record : pageList.getRecords()) { record.setType(typeName[Integer.parseInt(record.getType()) - 1]); } @@ -222,7 +222,7 @@ public class XzWorkerSafeWatchAlarmController { QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(XzWorkerSafeWatchAlarm.class, map); queryWrapper.lambda().orderByDesc(XzWorkerSafeWatchAlarm::getAlarmTime); IPage pageList = xzWorkerSafeWatchAlarmService.page(new Page<>(-1, -1), queryWrapper); - String [] typeName = {"人员日常考勤", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过"}; + String[] typeName = {"一个月内连续缺勤超过", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过"}; for (XzWorkerSafeWatchAlarm record : pageList.getRecords()) { record.setType(typeName[Integer.parseInt(record.getType()) - 1]); } diff --git a/src/main/java/com/zhgd/xmgl/task/EnterpriseQualificationTask.java b/src/main/java/com/zhgd/xmgl/task/EnterpriseQualificationTask.java index ad782bf95..a1de7dbea 100644 --- a/src/main/java/com/zhgd/xmgl/task/EnterpriseQualificationTask.java +++ b/src/main/java/com/zhgd/xmgl/task/EnterpriseQualificationTask.java @@ -55,17 +55,17 @@ public class EnterpriseQualificationTask { * 企业资质,提前一个月预警,预警一次 */ @SchedulerLock(name = "warnEnterpriseQualification", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) - @Scheduled(cron = "0 5 0 * * ?") + @Scheduled(cron = "0 1 0 * * ?") @RequestMapping("warnEnterpriseQualification") public void warnEnterpriseQualification() { try { List qualifications = enterpriseQualificationService.list(new LambdaQueryWrapper() - .ge(EnterpriseQualification::getQualificationEndTime, DateUtil.formatDateTime(DateUtil.offsetMonth(new Date(), -1))) - .le(EnterpriseQualification::getQualificationEndTime, DateUtil.formatDateTime(new Date())) + .ge(EnterpriseQualification::getQualificationEndTime, DateUtil.formatDateTime(new Date())) + .le(EnterpriseQualification::getQualificationEndTime, DateUtil.formatDateTime(DateUtil.offsetMonth(new Date(), 1))) ); List haveWarns = enterpriseQualificationWarnService.list(new LambdaQueryWrapper() - .ge(EnterpriseQualificationWarn::getQualificationEndTime, DateUtil.formatDateTime(DateUtil.offsetMonth(new Date(), -1))) - .le(EnterpriseQualificationWarn::getQualificationEndTime, DateUtil.formatDateTime(new Date())) + .ge(EnterpriseQualificationWarn::getQualificationEndTime, DateUtil.formatDateTime(new Date())) + .le(EnterpriseQualificationWarn::getQualificationEndTime, DateUtil.formatDateTime(DateUtil.offsetMonth(new Date(), 1))) ); List pushList = xzEmergencyPushService.list(new LambdaQueryWrapper().eq(XzEmergencyPush::getType, 3)); Map> projectSnMap = pushList.stream().collect(Collectors.groupingBy(XzEmergencyPush::getProjectSn)); diff --git a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java index 12b037177..d81c9f241 100644 --- a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java +++ b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java @@ -303,7 +303,7 @@ public class WorkerTask { @RequestMapping("/workerSafeWatchAlarm") public void workerSafeWatchAlarm() { log.info("开始执行对人员未履职情况进行监测"); - String[] typeName = {"人员日常考勤", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过"}; + String[] typeName = {"一个月内连续缺勤超过", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过"}; List projects = projectMapper.selectList(Wrappers.lambdaQuery().eq(Project::getStatus, 2)); for (Project project : projects) { if (project.getEnableWorkerSafeWatch() != null && project.getEnableWorkerSafeWatch() == 1) { diff --git a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java index babe7cc85..efc17e98e 100644 --- a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java @@ -494,16 +494,16 @@ public class ExcelUtils { } //工作区域 - XSSFSheet sheet3 = workbook.getSheet("工作区域"); - if (deviceUnits.size() > 0) { - for (int i = 0; i < deviceUnits.size(); i++) { - XSSFRow row1 = sheet3.createRow(i); - XSSFCell cell1 = row1.createCell(0); - DeviceUnit obj = deviceUnits.get(i); - cell1.setCellType(CellType.STRING); - cell1.setCellValue(obj.getDeviceUnitName()); - } - } +// XSSFSheet sheet3 = workbook.getSheet("工作区域"); +// if (deviceUnits.size() > 0) { +// for (int i = 0; i < deviceUnits.size(); i++) { +// XSSFRow row1 = sheet3.createRow(i); +// XSSFCell cell1 = row1.createCell(0); +// DeviceUnit obj = deviceUnits.get(i); +// cell1.setCellType(CellType.STRING); +// cell1.setCellValue(obj.getDeviceUnitName()); +// } +// } //岗位(工种) XSSFSheet sheet4 = workbook.getSheet("岗位(工种)"); diff --git a/src/main/resources/excel/人员入场导入模板.xlsx b/src/main/resources/excel/人员入场导入模板.xlsx index 470002867f3dcd4b689be7c1dadd0429308b86f1..87b004a9f1f684e93cb2b64dfe631a2fb0b03830 100644 GIT binary patch delta 3532 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 delta 3525 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 diff --git a/src/main/resources/excel/人员导入模板.xlsx b/src/main/resources/excel/人员导入模板.xlsx index 6ff048281822c86b1c3ce6d53fc3b64946858a84..d526945efddc3c83c385e2d166419f422ea0b559 100644 GIT binary patch delta 6761 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 HKZpJo7-W(J delta 6789 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