From 2bdd14aec215c38b70a86ca182f52525a8aafcb1 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Fri, 22 Aug 2025 19:47:15 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zhgd/mqtt/server/MqttConfig.java | 12 +- .../controller/EnterpriseInfoController.java | 11 ++ .../WorkerAttendanceController.java | 4 +- ...DailyAttendanceStatisticsV2Controller.java | 6 +- .../controller/WorkerInfoController.java | 18 +-- .../WorkerDailyAttendanceStatisticsV2.java | 21 +++ ...ountDepartTeamWorkerNumByPersonTypeBo.java | 10 ++ .../vo/EnterpriseDepartmentTeamTreeVo.java | 5 + .../worker/mapper/WorkerAttendanceMapper.java | 4 + .../worker/mapper/WorkerInfoMapper.java | 3 + .../mapper/xml/WorkerAttendanceMapper.xml | 50 +++++++ ...orkerDailyAttendanceStatisticsV2Mapper.xml | 28 ++++ .../worker/mapper/xml/WorkerInfoMapper.xml | 37 ++++- .../service/IWorkerAttendanceService.java | 12 +- .../worker/service/IWorkerInfoService.java | 8 ++ .../impl/WorkerAttendanceServiceImpl.java | 5 + ...ailyAttendanceStatisticsV2ServiceImpl.java | 29 +++- .../service/impl/WorkerInfoServiceImpl.java | 16 +++ .../java/com/zhgd/xmgl/task/WorkerTask.java | 126 +++++++++++++----- .../java/com/zhgd/xmgl/util/EasyPoiUtil.java | 2 + .../考勤月报-按单位-出勤人数与考勤报表.xlsx | Bin 12422 -> 12397 bytes .../resources/excel/人员考勤记录导出.xlsx | Bin 9271 -> 9317 bytes 22 files changed, 336 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/CountDepartTeamWorkerNumByPersonTypeBo.java 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 b680b62a9707f1371f19ca8bb0243a714f92d494..ff389ce7ab7805800179a3460785f6081a0dc835 100644 GIT binary patch delta 1878 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 LJq9Bz0000090;i} diff --git a/src/main/resources/excel/人员考勤记录导出.xlsx b/src/main/resources/excel/人员考勤记录导出.xlsx index d0fef0f9a93f97b90a752b4d9c198b537bcfb1be..e080fd9f033970e6682537ffe945271cdd8593d8 100644 GIT binary patch delta 1661 zcmV-@27>vwNaaYdumJ_Zg0)ptleGaVf3cI$sl^nbhns=6BJm-v|weW zAxAr~Xj+_}WW1)lGH_$68jO=*15eVH@;XOr=W2?vZuW#E`L#dlvaX>{TIOPVIt4wh&l+@BX(^MHA zD9sg1X5HK$d?`U(?26CVx3Bk)NDTj0JhI)Otz|gDd z=TDPL=_j)Wuml+jlhC!btfL2@Z3`H#roxCea|7#r(}$l%`>OPCvw#YF1&bO+I@m&g(BNUp(yPmkX|y zQJD?6%ELOfewCwe)TuM)J)$FGLE=YO z2QI{wL{@x~T;MhsP?EFfgq~7T)r|2l7!EL;dmVSnG@*6Sa2JICyP!c7M5Fk;`CYsl zj^ut#%>BP>hIPJP9p~wEqE$t(-%&tU>Hy8CGi{4UWlQF^X*?dG0omvqT#JrCVI*(dj@5D_X5g%AFt0CBuElGUf#rz25z>M1?kOMas zM<54wd^rL+@Z;_XYOliSKa-&Z8nf32L;2|oa)N#5rae@p%31tbCv*cC+pNjM12gj!UrjTd*xb zY)jf|*j1g-LejR-qViL1pR37Og|}btD{R_+o=z^%ygr)uM$5sd*;V0V)O(5^`v0)I zSM}CjX0x-pY7J&DA8OEuXX<*a`YX=a=e=r-Bkk15O0Qa~A^4CDmaj#bU+ZE}9v%dkepAV%F0hyCUAV37(8vp>4A0if$ zpCB3n0vwaOAd&^ag0)ptlTsm60VR{CAwUOz1ONbdY%i0aBOH?oA`Sv79g`X&H33nR zP$DfG;YhaaYykiOuL1x76aWAK000000RSKX001wOm?A*|>yz3dIsxC46(cqR1_+V} z6_a8kDgn)tjUzk(pp(iYAsZ8??GW7p002)1000;O0000000031AOHXW%##KrD+Wj) H00000yM*`{ delta 1616 zcmV-W2Cw<$NViC^umJ`2(Dn$d zS#l6=gv2dyk~Xvgu^hiQ-@F;Qm~2!Xy?}MH(IrYo1Vx~EBcxuI=x#oZ&rsw%(}LBF zh7xVTp-FXmQgB0gW8ua&2CSFhqCnD)a#Ny}_l9EZ_zDzrqu|g%Tr^fOA4-BoH&bk;Oe}W%o*SFoOvDEFYIH0N!oN^1yH?}$#N^0r6ZL0zw zDD4$%=KL%id?7(xY^%@Lx3Bk)O#=T`0>t!_{Qtx}CTDS)&dHc&gy#7HaSy1v+{gc-`UX%-0|b+>AsVwo z1D62`s=LH|x&iUuplr@_Tckv=l_BS}5&GyQ^y1%d>GNVAYAU zwjs1%zhehdLeQ!&$etV@pE)yQ#<#m%k}YT>RFTj)h$w-At5g)Lg#P+Dzqp~qSXQJ= zssa-F3WnZJK7SflO23#jfF;OKn1rsaEk|K!_!@F%0#!nRUoxe0W^sS3SD`62u+$&Q zW!Q_N>o8}cpf$rte}qG2ncy%}e3L_AYZ48TS=4XVqBIA#UHT!uRI>_mJ?J@-IIF)j zd~v^{FBe=ZqcR(Cm4~&oZkEGv*vd2K9ilU4IX{t>BNCv->;u^)e`dIGUpTPG&CqC{=1 z6a{>RElB+6^Ei$nNkRwia;_xaguf&gZZs&#*)E|t4^@3j+zZhi28M8gZC;$=n#lqZ>4cJMS9*tpoMU5p#=|L-Eg(M9}i zT)b&`z0dbG;_?VFY$K*!M0`?;*%`=5EgsH5PKq%<139V2;~B_FIdF(w%Et-C@Aas? ztY@q4&XTR*8`CRM7$PA0m=Q)z*Zw|}z}S}JWd6V?q*O*Z!|ZvLA;naMwp9<%)iKn4lL z?gNfs0RRAflSU3Fe=>BVs=Y8JyGrY&M^GD3L4nRm6@EqDmrI7{P4Lr)rIaDm{tZyMpD#AVD z2OM&!1`_3+)fHPxWtl9OIaE<9%wjCv3NRv5K?vNCQXm*nf95I5ScU?KCo2Go`FJy( z&R|9;N0u8@xibG|kX7Y$zY5#G1;>`uv6Z8HCwem0-J7rXu8oyr<9Ypu#l7cva*Aio z(X2mOgi-ricORnuV{||GhuyyFx85R~9yfJoIDPrh!&WlW7h^qGa!x<*bZZ)9ngn~-gBMcTzD&;{)gkq+x0E8v?xMtr9 z3N$J265$nUVS+g%Qj#(pl3KD=K-rv0GMi_Ut&|yOQTUC<-z?aikMj+)%@3sz0c(?U zAV2}Ile8c+0@NFm=^&B?_2eGSRg-`rR01XglR*O&lj|WW2Y>_s0C;RKlg%R>lQ<#{ z0{k44NFp@>Ba?n2EgQw|1CC$;004ag000yK0000000031AOHXW4U@(qK>@v!2qQWH zy^}*DHUi`alY1jS0iTn*BRm12llUVc8>+j+e7XVv0I3E502lxO000000096X0002Z OlQbkN1{xp$0000rS>Sm9