diff --git a/src/main/java/com/zhgd/mqtt/server/MqttConfig.java b/src/main/java/com/zhgd/mqtt/server/MqttConfig.java index 47461ca88..858045445 100644 --- a/src/main/java/com/zhgd/mqtt/server/MqttConfig.java +++ b/src/main/java/com/zhgd/mqtt/server/MqttConfig.java @@ -1,14 +1,6 @@ package com.zhgd.mqtt.server; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.zhgd.mybatis.DataScopeHandler; import com.zhgd.xmgl.constant.Cts; -import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; -import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; -import com.zhgd.xmgl.modules.xz.service.IXzHikvisionSyncService; -import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.slf4j.Logger; @@ -185,8 +177,8 @@ public class MqttConfig { String topic = message.getHeaders().get("mqtt_receivedTopic").toString(); LOGGER.info("消息主题:{}", topic); Object payLoad = message.getPayload(); - LOGGER.info("主题:{},消息接收到的数据:{}", message.getHeaders().get("mqtt_receivedTopic"),payLoad); - LOGGER.error("===================={}============", payLoad); + LOGGER.info("主题:{},消息接收到的数据:{}", message.getHeaders().get("mqtt_receivedTopic"), payLoad); + LOGGER.info("===================={}============", payLoad); dispatchHandler.message(topic, payLoad); } catch (Exception e) { } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/EnterpriseInfoController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/EnterpriseInfoController.java index c72f795f3..b9cb383c7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/EnterpriseInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/EnterpriseInfoController.java @@ -21,7 +21,9 @@ import com.zhgd.xmgl.modules.worker.entity.vo.StatsEnterpriseWeekVo; import com.zhgd.xmgl.modules.worker.service.IDepartmentInfoService; import com.zhgd.xmgl.modules.worker.service.IEnterpriseInfoService; import com.zhgd.xmgl.modules.worker.service.ITeamInfoService; +import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; import com.zhgd.xmgl.util.ListUtils; +import com.zhgd.xmgl.util.MapBuilder; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -60,6 +62,9 @@ public class EnterpriseInfoController { @Lazy @Autowired private ITeamInfoService teamInfoService; + @Lazy + @Autowired + private IWorkerInfoService workerInfoService; /** * 列表查询 @@ -293,6 +298,10 @@ public class EnterpriseInfoController { .eq(DepartmentInfo::getProjectSn, projectSn)); List teamInfoList = teamInfoService.list(new LambdaQueryWrapper() .eq(TeamInfo::getProjectSn, projectSn)); + Map> personType2DepartmentTeamId2WorkerNumMap = workerInfoService.countDepartTeamWorkerNumByPersonType(new MapBuilder() + .put("projectSn", projectSn) + .put("inServiceType", 1) + .build()); Map enterpriseId2UniqueIdMap = new HashMap<>(); List enterprises = enterpriseInfoService.getEnterpriseInfos(param).stream().map(e -> { enterpriseId2UniqueIdMap.put(e.getId(), e.getId() + ""); @@ -313,6 +322,7 @@ public class EnterpriseInfoController { vo.setOriginalId(d.getId() + ""); vo.setTypeName("部门"); vo.setCategory(2); + vo.setWorkerNum(Optional.ofNullable(personType2DepartmentTeamId2WorkerNumMap.get(2)).map(m -> m.get(d.getId())).orElse(null)); return vo; }).collect(Collectors.toList()); List teams = teamInfoList.stream().filter(t -> Objects.nonNull(enterpriseId2UniqueIdMap.get(t.getEnterpriseId()))).map(t -> { @@ -323,6 +333,7 @@ public class EnterpriseInfoController { vo.setOriginalId(t.getId() + ""); vo.setTypeName("班组"); vo.setCategory(3); + vo.setWorkerNum(Optional.ofNullable(personType2DepartmentTeamId2WorkerNumMap.get(1)).map(m -> m.get(t.getId())).orElse(null)); return vo; }).collect(Collectors.toList()); all.addAll(enterprises); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java index 7db125f77..88d2ebdb2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java @@ -552,12 +552,15 @@ public class WorkerAttendanceController { @ApiOperation(value = "人员考勤导出excel记录", notes = "人员考勤导出excel记录", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "idList", value = "考勤idList", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/exportXls") public void exportXls(HttpServletResponse response, @RequestBody HashMap param) { String templateUrl = null; try { Map map = new HashMap<>(); + param.put("pageNo", 1); + param.put("pageSize", -1); List records = workerAttendanceService.selectWorkerAttendancePage(param).getRecords(); List> listMap = new ArrayList<>(); for (int i = 0; i < records.size(); i++) { @@ -596,7 +599,6 @@ public class WorkerAttendanceController { templateUrl = Fileutils.getExportTemplateFile("excel/人员考勤记录导出.xlsx").getAbsolutePath(); TemplateExportParams params = new TemplateExportParams(templateUrl); Workbook workbook = ExcelExportUtil.exportExcel(params, map); - //设置下拉 ExcelUtils.downLoadExcel("风险点清单导出模板.xlsx", response, workbook); } catch (IOException e) { log.error("", e); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java index 9d62597ec..5bb8d5736 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java @@ -780,6 +780,8 @@ public class WorkerDailyAttendanceStatisticsV2Controller { @ApiImplicitParam(name = "departmentId", value = "部门ID", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "inserviceType", value = "在职状态 1在职 2离职", paramType = "body", required = false, dataType = "Integer"), @ApiImplicitParam(name = "containEnterpriseId", value = "包含下级的单位的人员的单位id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "attendanceStatus", value = "正常出勤,异常出勤,未出勤(多个,分割)", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "downloadType", value = "1每日明细(上下午打卡)2进出场打卡", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/getWorkerDailyAttendancePageForWorkerByDate") public Result> getWorkerDailyAttendancePageForWorkerByDate(@RequestBody HashMap param) { @@ -903,7 +905,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { value = getExcelAmPmAttendanceByDate(personSn2Date2AttendancesMap, vo, dateTime, downloadType); } else if (Objects.equals(downloadType, 3)) { //每日工时 - value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse(""); + value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(BigDecimal::toString).orElse("0.0"); } else { //每日明细 value = Optional.ofNullable(vo.getDailyAttendanceMap().get(DateUtil.formatDate(dateTime))).map(integer -> Objects.equals(integer, 1) ? "√" : "×").orElse("x"); @@ -1032,7 +1034,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { DateTime dateTime = dateTimes.get(z); sheetMap2.put("date" + (z + 1), DateUtil.format(dateTime, "M/d")); //每日工时 - String value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse(""); + String value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse("0.0"); map.put("attendanceByDate" + (z + 1), value); } listMap2.add(map); 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 bd0506ef5..a4b950f7e 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 @@ -211,10 +211,14 @@ public class WorkerInfoController { @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "projectSnList", value = "项目SN列表", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "userEnterpriseId", value = "用户能查看的企业", paramType = "body", required = false, dataType = "String"), - @ApiImplicitParam(name = "containEnterpriseId", value = "包含下级的单位的人员的单位id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "isContainSubEnterprise", value = "1包含下级的单位", paramType = "body", required = false, dataType = "String"), }) @PostMapping("/selectPersonTypeAndEduStatistics") public Result selectPersonTypeAndEduStatistics(@RequestBody Map map) { + if (Objects.equals(MapUtils.getInteger(map, "isContainSubEnterprise"), 1)) { + map.put("containEnterpriseId", map.get("userEnterpriseId")); + map.put("userEnterpriseId", null); + } return Result.success(workerInfoService.selectPersonTypeAndEduStatistics(map)); } @@ -882,13 +886,11 @@ public class WorkerInfoController { public Result getEmploymentOverview(@ApiIgnore @RequestBody Map paramMap) { WorkerInfo workerInfo = workerInfoService.queryById(MapUtils.getString(paramMap, "workerId")); EmploymentOverviewVo vo = new EmploymentOverviewVo(); - if (StrUtil.isNotBlank(workerInfo.getEnterDate())) { - vo.setInServe((int) DateUtil.betweenDay(DateUtil.parseDate(workerInfo.getEnterDate()), new Date(), true) + 1); - paramMap.put("personSn", workerInfo.getPersonSn()); - int count = workerAttendanceService.getWorkerAttendanceCountDay(paramMap); - vo.setAttendance(count); - vo.setAbsence(vo.getInServe() - vo.getAttendance()); - } + vo.setInServe((int) DateUtil.betweenDay(StrUtil.isNotBlank(workerInfo.getEnterDate()) ? DateUtil.parseDate(workerInfo.getEnterDate()) : workerInfo.getAddTime(), new Date(), true) + 1); + paramMap.put("personSn", workerInfo.getPersonSn()); + int count = workerAttendanceService.getWorkerAttendanceCountDay(paramMap); + vo.setAttendance(count); + vo.setAbsence(vo.getInServe() - vo.getAttendance()); return Result.success(vo); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerDailyAttendanceStatisticsV2.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerDailyAttendanceStatisticsV2.java index 50829c678..5174ac2a6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerDailyAttendanceStatisticsV2.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerDailyAttendanceStatisticsV2.java @@ -77,4 +77,25 @@ public class WorkerDailyAttendanceStatisticsV2 implements Serializable { */ @ApiModelProperty(value = "在职状态 1在职 2离职") private java.lang.Integer inserviceType; + + /** + * 进场打卡(首次) + */ + @ApiModelProperty(value = "进场打卡(首次)") + private String firstInTime; + /** + * 出场打卡(末次) + */ + @ApiModelProperty(value = "出场打卡(末次)") + private String endOutTime; + /** + * 上午打卡(首次) + */ + @ApiModelProperty(value = "上午打卡(首次)") + private String firstTimeAm; + /** + * 下午打卡(未次) + */ + @ApiModelProperty(value = "下午打卡(未次)") + private String endTimePm; } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/CountDepartTeamWorkerNumByPersonTypeBo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/CountDepartTeamWorkerNumByPersonTypeBo.java new file mode 100644 index 000000000..5d0ccea5c --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/CountDepartTeamWorkerNumByPersonTypeBo.java @@ -0,0 +1,10 @@ +package com.zhgd.xmgl.modules.worker.entity.bo; + +import lombok.Data; + +@Data +public class CountDepartTeamWorkerNumByPersonTypeBo { + private Integer personType; + private Long departTeamId; + private Integer countNum; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamTreeVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamTreeVo.java index a43c3949c..37b490380 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamTreeVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamTreeVo.java @@ -42,4 +42,9 @@ public class EnterpriseDepartmentTeamTreeVo { */ @ApiModelProperty("children") private List children; + /** + * 人员数量 + */ + @ApiModelProperty("人员数量") + private Integer workerNum; } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerAttendanceMapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerAttendanceMapper.java index 5bc4d59c9..73dcfa922 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerAttendanceMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerAttendanceMapper.java @@ -7,6 +7,7 @@ import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.entity.vo.NumberTimeTableVo; import com.zhgd.xmgl.modules.realnamestatistics.entity.vo.WorkerAttendanceVo; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import com.zhgd.xmgl.modules.worker.entity.bo.WorkerAttendanceBo; import com.zhgd.xmgl.modules.worker.entity.dto.GetPassRecordDto; import com.zhgd.xmgl.modules.worker.entity.vo.PresentByMonthVo; @@ -17,6 +18,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -331,4 +333,6 @@ public interface WorkerAttendanceMapper extends BaseMapper { * @return */ List getPresentDayByMonth(Map paramMap); + + List getAutoExitWorkers(HashMap param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java index 48416ffc7..f9a2f5470 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java @@ -7,7 +7,9 @@ import com.zhgd.annotation.DataScope; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.base.entity.vo.TrendOneVo; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.entity.bo.CountDepartTeamWorkerNumByPersonTypeBo; import com.zhgd.xmgl.modules.worker.entity.vo.*; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -730,4 +732,5 @@ public interface WorkerInfoMapper extends BaseMapper { int selectWorkerNumByMl(@Param("projectSn") String projectSn); + List countDepartTeamWorkerNumByPersonType(Map param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml index 998811569..2f5a0bb8d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml @@ -62,6 +62,12 @@ LEFT JOIN department_info d ON b.department_id = d.id LEFT JOIN enterprise_info ei on ei.id=b.enterprise_id WHERE a.project_sn = #{param.projectSn} + + and a.id in + + #{item} + + and (b.enterprise_id = #{param.containEnterpriseId} OR b.enterprise_id IN ( SELECT t.enterprise_id FROM project_enterprise t WHERE find_in_set((select id from project_enterprise where enterprise_id = @@ -1051,4 +1057,48 @@ group by month + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml index 5edc446a3..625738ee1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml @@ -34,6 +34,34 @@ and t.attendance_date <= DATE_FORMAT(#{param.endTime},'%Y-%m-%d') + + and ( 1=0 + + or (t.is_attendance = 1 and + + t.first_time_am is not null and t.end_time_pm is not null + + + t.first_in_time is not null and t.end_out_time is not null + + ) + + + or (t.is_attendance = 1 and ( + + t.first_time_am is null or t.end_time_pm is null + + + t.first_in_time is null or t.end_out_time is null + + ) + ) + + + or t.is_attendance = 0 + + ) + )t ${ew.customSqlSegment} 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 b2529f82f..84f9b2ba6 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 @@ -2690,11 +2690,36 @@ + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java index 1f843148d..4c1c33e12 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java @@ -2,7 +2,6 @@ package com.zhgd.xmgl.modules.worker.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.mybatis.EntityMap; @@ -10,15 +9,16 @@ import com.zhgd.xmgl.entity.vo.AttendanceOfEachCompanyVo; import com.zhgd.xmgl.entity.vo.NumberTimeTableVo; import com.zhgd.xmgl.modules.realnamestatistics.entity.vo.WorkerAttendanceVo; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import com.zhgd.xmgl.modules.worker.entity.dto.GetPassRecordDto; import com.zhgd.xmgl.modules.worker.entity.dto.WorkerAttendanceDto; import com.zhgd.xmgl.modules.worker.entity.vo.PresentByMonthVo; import com.zhgd.xmgl.modules.worker.entity.vo.PresentDayByMonthVo; import com.zhgd.xmgl.modules.worker.entity.vo.SafetyPerformanceAnalysisVo; import com.zhgd.xmgl.modules.worker.entity.vo.UploadAttendanceByDevDto; -import com.zhgd.xmgl.modules.xz.security.entity.vo.XzSecurityPostponeRectifyApplyVo; import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -321,4 +321,12 @@ public interface IWorkerAttendanceService extends IService { void mqttRec(String deviceSn, JSONObject obj); void zyMqttRec(JSONObject obj); + + /** + * 获取超期自动退场的人员 + * + * @param projectSn + * @return + */ + List getAutoExitWorkers(HashMap projectSn); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java index 96a747b4c..070cefd44 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java @@ -609,4 +609,12 @@ public interface IWorkerInfoService extends IService { * @return */ Map getWorkerMapByProjectSn(String projectSn); + + /** + * 统计班组、部门的人员数量 + * + * @param param + * @return + */ + Map> countDepartTeamWorkerNumByPersonType(Map param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java index dcc6e7d7e..cb73493dd 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java @@ -1497,6 +1497,11 @@ status 状态码 String 1表示成功;其余表示失败 uploadAttendanceByDev(dto); } + @Override + public List getAutoExitWorkers(HashMap param) { + return baseMapper.getAutoExitWorkers(param); + } + private void setTotalCount(List vos, SafetyPerformanceAnalysisVo vo) { Integer notPerformNum = 0; Integer inServiceNum = 0; diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java index 85e60ce14..3bfb36c67 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java @@ -189,7 +189,13 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl attendances, List allAttendances) { + public void calAndSaveStatistics(String projectSn, + String personSn, + Integer inserviceType, + DateTime date, + WorkerAttendanceRuleV2 ruleV2, + List attendances, + List allAttendances) { attendances = attendances.stream().filter(o -> Objects.equals(o.getPersonSn(), personSn) && (DateUtil.isSameDay(DateUtil.offsetDay(date, -1), o.getDate()) || DateUtil.isSameDay(date, o.getDate()) @@ -296,8 +302,17 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl DateUtil.isSameDay(date, o.getDate())) ? 1 : 0); + sta.setFirstInTime(allAttendances.stream().filter(w -> Objects.equals(w.getPassType(), 1)).min(Comparator.comparing(CalAttendanceBo::getDate)) + .map(bo -> DateUtil.format(bo.getDate(), "HH:mm:ss")).orElse(null)); + sta.setEndOutTime(allAttendances.stream().filter(w -> Objects.equals(w.getPassType(), 2)).max(Comparator.comparing(CalAttendanceBo::getDate)) + .map(bo -> DateUtil.format(bo.getDate(), "HH:mm:ss")).orElse(null)); + sta.setFirstTimeAm(allAttendances.stream().filter(w -> DateUtil.compare(w.getDate(), DateUtil.parseDateTime(dateStr + " 12:00:00")) < 0).min(Comparator.comparing(CalAttendanceBo::getDate)) + .map(bo -> DateUtil.format(bo.getDate(), "HH:mm:ss")).orElse(null)); + sta.setEndTimePm(allAttendances.stream().filter(w -> DateUtil.compare(w.getDate(), DateUtil.parseDateTime(dateStr + " 12:00:00")) >= 0).max(Comparator.comparing(CalAttendanceBo::getDate)) + .map(bo -> DateUtil.format(bo.getDate(), "HH:mm:ss")).orElse(null)); if (sta.getId() == null) { this.save(sta); } else { @@ -307,6 +322,10 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl> workerAttendancesOpt = Optional.ofNullable(personSn2DateMap.get(vo.getPersonSn())).map(m -> m.get(date)); String firstInTime = workerAttendancesOpt.flatMap(m -> m.stream().filter(w -> Objects.equals(w.getPassType(), 1)).min(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime)).orElse(null); String endOutTime = workerAttendancesOpt.flatMap(m -> m.stream().filter(w -> Objects.equals(w.getPassType(), 2)).max(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime)).orElse(null); - vo.setFirstInTime(firstInTime); - vo.setEndOutTime(endOutTime); +// vo.setFirstInTime(firstInTime); +// vo.setEndOutTime(endOutTime); String firstTimeAm = workerAttendancesOpt.flatMap(m -> m.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(date + " 12:00:00")) < 0).min(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime)).orElse(null); - vo.setFirstTimeAm(firstTimeAm); +// vo.setFirstTimeAm(firstTimeAm); String endTimePm = workerAttendancesOpt.flatMap(m -> m.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(date + " 12:00:00")) >= 0).max(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime)).orElse(null); - vo.setEndTimePm(endTimePm); +// vo.setEndTimePm(endTimePm); } } return pageList; 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 094cb9f11..f5744eae3 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 @@ -64,6 +64,7 @@ import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatDev; import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDevMapper; import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareAlarmRecordMapper; import com.zhgd.xmgl.modules.worker.entity.*; +import com.zhgd.xmgl.modules.worker.entity.bo.CountDepartTeamWorkerNumByPersonTypeBo; import com.zhgd.xmgl.modules.worker.entity.bo.InServeByDateBo; import com.zhgd.xmgl.modules.worker.entity.dto.GetWorkerInfoByDevDto; import com.zhgd.xmgl.modules.worker.entity.vo.*; @@ -2951,4 +2952,19 @@ public class WorkerInfoServiceImpl extends ServiceImpl() .eq(WorkerInfo::getProjectSn, projectSn)).stream().collect(Collectors.toMap(WorkerInfo::getId, Function.identity(), (o1, o2) -> o1)); } + + @Override + public Map> countDepartTeamWorkerNumByPersonType(Map param) { + List bos = baseMapper.countDepartTeamWorkerNumByPersonType(param); + return bos.stream() + .collect(Collectors.groupingBy( + CountDepartTeamWorkerNumByPersonTypeBo::getPersonType, + Collectors.toMap( + CountDepartTeamWorkerNumByPersonTypeBo::getDepartTeamId, + CountDepartTeamWorkerNumByPersonTypeBo::getCountNum, + (existing, replacement) -> existing + ) + )); + } + } diff --git a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java index bd6c1755e..905b3b904 100644 --- a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java +++ b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java @@ -13,7 +13,6 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; @@ -34,10 +33,6 @@ import com.zhgd.xmgl.modules.project.mapper.ProjectExternalSystemServiceMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectUfaceConfigMapper; import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService; -import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; -import com.zhgd.xmgl.modules.worker.entity.WorkerBlacklist; -import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; -import com.zhgd.xmgl.modules.worker.entity.WorkerMonthAttendanceStatistics; import com.zhgd.xmgl.modules.quality.entity.QualityRegion; import com.zhgd.xmgl.modules.quality.service.IQualityRegionService; import com.zhgd.xmgl.modules.worker.entity.*; @@ -46,11 +41,6 @@ import com.zhgd.xmgl.modules.worker.mapper.WorkerCertificateMapper; import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; import com.zhgd.xmgl.modules.worker.service.*; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; -import com.zhgd.xmgl.modules.xz.entity.XzCertificateExpireAlarmRecord; -import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchAlarm; -import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchConfig; -import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchManager; -import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService; import com.zhgd.xmgl.modules.xz.entity.*; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityInspectTaskItemRecord; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityInspectTaskRecord; @@ -85,7 +75,6 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; -import static com.zhgd.xmgl.modules.project.enums.ProjectUfaceConfigSupplierTypeEnum.MQTT; import static com.zhgd.xmgl.modules.project.enums.ProjectUfaceConfigSupplierTypeEnum.ZYMQTT; /** @@ -172,6 +161,12 @@ public class WorkerTask { @Value("${basePath}") private String basePath; + @Lazy + @Autowired + private IWorkerExitConfigService workerExitConfigService; + @Lazy + @Autowired + private IWorkerBlacklistService workerBlacklistService; /** * 定时修改用户码状态 @@ -880,6 +875,29 @@ public class WorkerTask { workerAttendanceService.saveExternalPassRecord(map); } +// /** +// * MQTT同步下发人员信息 +// */ +// @Scheduled(cron = "0 0/15 * * * ?") +// @SchedulerLock(name = "mqttIssuedWorkerInfo", lockAtMostFor = 1000 * 55, lockAtLeastFor = 1000 * 55) +// @RequestMapping("mqttIssuedWorkerInfo") +// public void mqttIssuedWorkerInfo() { +// List configList = projectUfaceConfigMapper.selectList(Wrappers.lambdaQuery() +// .eq(ProjectUfaceConfig::getSupplierType, MQTT.getCode()) +// .eq(ProjectUfaceConfig::getIssueDev, 1)); +// for (ProjectUfaceConfig projectUfaceConfig : configList) { +// List list = xzHikvisionSyncService.list(Wrappers.lambdaQuery() +// .eq(XzHikvisionSync::getProjectSn, projectUfaceConfig.getProjectSn()) +// .eq(XzHikvisionSync::getIsSuccess, 0) +// .eq(XzHikvisionSync::getType, 1) +// .eq(XzHikvisionSync::getBigType, 1)); +// for (XzHikvisionSync sync : list) { +// WorkerInfo workerInfo = workerInfoMapper.selectById(sync.getWhoId()); +// MqttFaceDevUtil.addOrUpdatePerson(workerInfo, sync.getDeviceSn()); +// } +// } +// } + /** * 弹弓下发状态,把超过一个小时没有接受到异常状态的人员的图片,标志成正常状态 */ @@ -904,7 +922,6 @@ public class WorkerTask { } } - /** * 中水北方区域人员滞留超过一天进行记录 */ @@ -917,7 +934,7 @@ public class WorkerTask { List exist = violations.stream().map(v -> v.getWorkerId()).collect(Collectors.toList()); List regionList = qualityRegionService.list(Wrappers.lambdaQuery().eq(QualityRegion::getProjectSn, "554F52F52835441386247F5061D4F9DD")); for (QualityRegion qualityRegion : regionList) { - Map map = new HashMap(); + Map map = new HashMap(); map.put("projectSn", "554F52F52835441386247F5061D4F9DD"); map.put("pageNo", 1); map.put("pageSize", 1000); @@ -932,7 +949,7 @@ public class WorkerTask { regionViolation.setWorkerId(workerInfo.getId()); regionViolation.setEnterpriseName(workerInfo.getEnterpriseName()); String teamName = StringUtils.isNotEmpty(workerInfo.getTeamName()) ? workerInfo.getTeamName() : ""; - String departmentName =StringUtils.isNotEmpty(workerInfo.getDepartmentName()) ? workerInfo.getDepartmentName() : ""; + String departmentName = StringUtils.isNotEmpty(workerInfo.getDepartmentName()) ? workerInfo.getDepartmentName() : ""; regionViolation.setTeamName(teamName + departmentName); regionViolation.setWorkerName(workerInfo.getWorkerName()); regionViolation.setEnterTime(workerInfo.getAttendTime()); @@ -972,29 +989,6 @@ public class WorkerTask { regionViolationService.saveBatch(list); } -// /** -// * MQTT同步下发人员信息 -// */ -// @Scheduled(cron = "0 0/15 * * * ?") -// @SchedulerLock(name = "mqttIssuedWorkerInfo", lockAtMostFor = 1000 * 55, lockAtLeastFor = 1000 * 55) -// @RequestMapping("mqttIssuedWorkerInfo") -// public void mqttIssuedWorkerInfo() { -// List configList = projectUfaceConfigMapper.selectList(Wrappers.lambdaQuery() -// .eq(ProjectUfaceConfig::getSupplierType, MQTT.getCode()) -// .eq(ProjectUfaceConfig::getIssueDev, 1)); -// for (ProjectUfaceConfig projectUfaceConfig : configList) { -// List list = xzHikvisionSyncService.list(Wrappers.lambdaQuery() -// .eq(XzHikvisionSync::getProjectSn, projectUfaceConfig.getProjectSn()) -// .eq(XzHikvisionSync::getIsSuccess, 0) -// .eq(XzHikvisionSync::getType, 1) -// .eq(XzHikvisionSync::getBigType, 1)); -// for (XzHikvisionSync sync : list) { -// WorkerInfo workerInfo = workerInfoMapper.selectById(sync.getWhoId()); -// MqttFaceDevUtil.addOrUpdatePerson(workerInfo, sync.getDeviceSn()); -// } -// } -// } - /** * 正赢 MQTT同步下发人员信息 */ @@ -1018,4 +1012,62 @@ public class WorkerTask { } } } + + /** + * 更新人员自动退场 + */ + @Scheduled(cron = "0 0 1 * * ?") + @SchedulerLock(name = "updateWorkerExit", lockAtMostFor = 1000 * 55, lockAtLeastFor = 1000 * 55) + @RequestMapping("updateWorkerExit") + public void updateWorkerExit() { + Map project2ConfigMap = workerExitConfigService.list(new LambdaQueryWrapper() + .eq(WorkerExitConfig::getEnable, 1)).stream().collect(Collectors.toMap(WorkerExitConfig::getProjectSn, Function.identity(), (o1, o2) -> o1)); + List projects = projectMapper.selectList(new LambdaQueryWrapper()); + for (Project project : projects) { + String projectSn = project.getProjectSn(); + WorkerExitConfig config = project2ConfigMap.get(projectSn); + if (config != null) { + //退场人员列表 + HashMap param = new MapBuilder() + .put("projectSn", projectSn) + .put("exitIfAbsenceDay", config.getExitIfAbsenceDay()) + .build(); + param.put("workerIdList", StrUtil.split(config.getWorkerIds(), ",")); + param.put("departmentIdList", StrUtil.split(config.getDepartmentIds(), ",")); + param.put("teamIdList", StrUtil.split(config.getTeamIds(), ",")); + param.put("enterpriseIdList", StrUtil.split(config.getEnterpriseIds(), ",")); +// if (StrUtil.isNotBlank(config.getWorkerIds())) { +// } else if (StrUtil.isNotBlank(config.getDepartmentIds()) || StrUtil.isNotBlank(config.getTeamIds())) { +// } else if (StrUtil.isNotBlank(config.getEnterpriseIds())) { +// } + List exitWorkers = workerAttendanceService.getAutoExitWorkers(param); + if (CollUtil.isEmpty(exitWorkers)) { + continue; + } + try { + if (Objects.equals(config.getEnableBlack(), 1)) { + for (WorkerInfo worker : exitWorkers) { + WorkerBlacklist workerBlacklist = new WorkerBlacklist(); + workerBlacklist.setProjectSn(projectSn); + workerBlacklist.setWorkerId(worker.getId()); + workerBlacklist.setWorkerName(worker.getWorkerName()); + workerBlacklist.setIdCard(worker.getIdCard()); + workerBlacklist.setAddReason("超过" + config.getExitIfAbsenceDay() + "天自动退场"); + workerBlacklist.setReason(workerBlacklist.getAddReason()); + workerBlacklist.setAddTime(DateUtil.now()); + workerBlacklist.setCreateTime(new Date()); + workerBlacklist.setIsExit(1); + workerBlacklistService.addWorkerBlacklist(workerBlacklist); + } + } else { + workerInfoService.updateWorkerExit(new MapBuilder() + .put("workerIdStr", exitWorkers.stream().map(w -> w.getId() + "").collect(Collectors.joining(","))) + .build()); + } + } catch (Exception e) { + log.error("更新人员自动退场错误", e); + } + } + } + } } diff --git a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java index 02f8a19a7..e5adfbd87 100644 --- a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java @@ -367,6 +367,8 @@ public class EasyPoiUtil { image.setHeight(100); image.setWidth(250); image.setUrl(PathUtil.getBasePath() + "/" + fileName); + image.setType(ImageEntity.URL); + image.setRowspan(ImageEntity.EMBED); return image; } diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx index b680b62a9..ff389ce7a 100644 Binary files a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx and b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx differ diff --git a/src/main/resources/excel/人员考勤记录导出.xlsx b/src/main/resources/excel/人员考勤记录导出.xlsx index d0fef0f9a..e080fd9f0 100644 Binary files a/src/main/resources/excel/人员考勤记录导出.xlsx and b/src/main/resources/excel/人员考勤记录导出.xlsx differ