From 4ea32fd92d51871eb2181435c2a2af65b0ce0260 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Fri, 15 Aug 2025 18:45:55 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/system/query/QueryGenerator.java | 4 +- .../com/zhgd/mybatis/DataScopeHandler.java | 5 +- .../java/com/zhgd/xmgl/call/IccCarCall.java | 8 +- .../com/zhgd/xmgl/call/util/IccHttpUtil.java | 22 +++++ .../service/impl/CompanyServiceImpl.java | 14 +++ .../modules/car/mapper/xml/CarInfoMapper.xml | 2 + .../service/impl/ProjectServiceImpl.java | 9 +- .../mapper/xml/QualityRegionMapper.xml | 3 + .../controller/RiskListLibraryController.java | 1 + ...skListPotentialAccidentTypeController.java | 90 ++++++++++++++++++ .../controller/RiskListSourceController.java | 25 +++-- .../bo/RiskListPotentialAccidentTypeBo.java | 21 ++++ .../risk/entity/vo/RiskListLibraryVo.java | 2 + .../impl/RiskListLibraryServiceImpl.java | 12 ++- .../impl/RiskListSourceServiceImpl.java | 2 +- .../controller/EnterpriseInfoController.java | 31 +++++- ...DailyAttendanceStatisticsV2Controller.java | 14 ++- .../vo/EnterpriseDepartmentTeamStaticsVo.java | 24 +++++ .../com/zhgd/xmgl/task/ElectricalTask.java | 1 - ...出模板.xlsx => 动态危险源辨识清单导出模板.xlsx} | Bin .../excel/静态危险源辨识清单导出模板.xlsx | Bin 0 -> 10784 bytes 21 files changed, 268 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/risk/entity/bo/RiskListPotentialAccidentTypeBo.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamStaticsVo.java rename src/main/resources/excel/{辨识清单导出模板.xlsx => 动态危险源辨识清单导出模板.xlsx} (100%) create mode 100644 src/main/resources/excel/静态危险源辨识清单导出模板.xlsx diff --git a/src/main/java/com/zhgd/jeecg/common/system/query/QueryGenerator.java b/src/main/java/com/zhgd/jeecg/common/system/query/QueryGenerator.java index d53d1f759..ba276ef56 100644 --- a/src/main/java/com/zhgd/jeecg/common/system/query/QueryGenerator.java +++ b/src/main/java/com/zhgd/jeecg/common/system/query/QueryGenerator.java @@ -128,7 +128,9 @@ public class QueryGenerator { Map parameterMap = new HashMap<>(16); for (String key : map.keySet()) { if (key.contains(BEGIN) || key.contains(END)) { - parameterMap.put(key, new String[]{map.get(key).toString()}); + if (map.get(key) != null) { + parameterMap.put(key, new String[]{map.get(key).toString()}); + } } } return parameterMap; diff --git a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java index e45bc637a..bdfbde408 100644 --- a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java +++ b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java @@ -229,8 +229,9 @@ public class DataScopeHandler implements DataPermissionHandler { enterpriseIds.add("0"); List rids = xzSecurityQualityInspectionEnterpriseService.list(new LambdaQueryWrapper() .in(XzSecurityQualityInspectionEnterprise::getEnterpriseId, enterpriseIds)).stream().map(XzSecurityQualityInspectionEnterprise::getInspectionId).collect(Collectors.toList()); - for (Long rid : rids) { - inExpression(rid.toString(), enterpriseIds, plainSelect); + rids.add(0L); + for (String item : filterXzSecurityEnterprises) { + inExpression(item, rids.stream().map(Convert::toStr).collect(Collectors.toList()), plainSelect); } } diff --git a/src/main/java/com/zhgd/xmgl/call/IccCarCall.java b/src/main/java/com/zhgd/xmgl/call/IccCarCall.java index ae126c3c4..41f1ccf7d 100644 --- a/src/main/java/com/zhgd/xmgl/call/IccCarCall.java +++ b/src/main/java/com/zhgd/xmgl/call/IccCarCall.java @@ -183,7 +183,13 @@ public class IccCarCall implements CarManufacturer { } getAndSetSubjectIfNotExist(subject); try { - IccHttpUtil.VehicleInfo vehicleInfo = IccHttpUtil.getCar(carInfo.getCarNumber(), config); + IccHttpUtil.VehicleInfo vehicleInfo = null; + if (carInfo.getIccId() != null) { + vehicleInfo = IccHttpUtil.getCarById(carInfo.getIccId(), config); + } + if (vehicleInfo == null) { + vehicleInfo = IccHttpUtil.getCar(carInfo.getCarNumber(), config); + } IccHttpUtil.CarInfoExt extCar = buildCarInfoExt(carInfo); //下发车辆(包含拉黑) if (vehicleInfo == null) { diff --git a/src/main/java/com/zhgd/xmgl/call/util/IccHttpUtil.java b/src/main/java/com/zhgd/xmgl/call/util/IccHttpUtil.java index fe21fefbb..d5bd6a375 100644 --- a/src/main/java/com/zhgd/xmgl/call/util/IccHttpUtil.java +++ b/src/main/java/com/zhgd/xmgl/call/util/IccHttpUtil.java @@ -959,6 +959,28 @@ public class IccHttpUtil { } } + /** + * 通过ID查询车辆 + * + * @param config + * @return + */ + public static VehicleInfo getCarById(Long iccId, ProjectCarCameraConfig config) { + try { + JSONObject params = new JSONObject(); + params.put("iccId", iccId); + printReq(params, "通过ID查询车辆"); + GeneralResponse response = HttpUtils.executeJson("/evo-apigw/ipms/car/find/" + iccId, null, null, Method.GET, getOauthConfig(config), GeneralResponse.class); + printResp(response, "通过ID查询车辆"); + throwErrIf(response); + JSONObject jsonObject = Optional.ofNullable(JSON.parseObject(response.getResult())).map(m -> m.getJSONObject("data")).orElse(null); + return BeanUtil.toBean(jsonObject, VehicleInfo.class); + } catch (Exception e) { + throw new OpenAlertException("查询项目的车场(车场名称=项目名称)请求异常,请联系管理员", e); + } + } + + /** * 查询项目的车场(车场名称=项目名称) * diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/CompanyServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/CompanyServiceImpl.java index 715f5cb7c..b8809ad72 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/CompanyServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/CompanyServiceImpl.java @@ -41,6 +41,9 @@ import com.zhgd.xmgl.modules.risk.entity.RiskListRuleItem; import com.zhgd.xmgl.modules.risk.service.IRiskListRuleItemService; import com.zhgd.xmgl.modules.risk.service.IRiskListRuleService; import com.zhgd.xmgl.modules.standard.mapper.StandardDevMapper; +import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityDangerField; +import com.zhgd.xmgl.modules.xz.security.entity.vo.XzSecurityDangerFieldVo; +import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityDangerFieldService; import com.zhgd.xmgl.util.ListUtils; import com.zhgd.xmgl.util.MapBuilder; import com.zhgd.xmgl.util.MessageUtil; @@ -98,6 +101,9 @@ public class CompanyServiceImpl extends ServiceImpl impl @Lazy @Autowired private IRiskListRuleService riskListRuleService; + @Lazy + @Autowired + private IXzSecurityDangerFieldService xzSecurityDangerFieldService; @Override public Map getCompanyType(Map map) { @@ -752,6 +758,14 @@ public class CompanyServiceImpl extends ServiceImpl impl }); listRuleItems.forEach(riskListRuleItem -> riskListRuleItem.setSn(company.getHeadquartersSn())); riskListRuleItemService.saveBatch(listRuleItems); + + List fieldVos = JSON.parseArray(ResourceUtil.readUtf8Str("init/data/xzSecurityDangerField.json"), XzSecurityDangerFieldVo.class); + xzSecurityDangerFieldService.saveBatch(fieldVos.stream().map(o -> { + XzSecurityDangerField bean = BeanUtil.toBean(o, XzSecurityDangerField.class); + bean.setSn(company.getHeadquartersSn()); + bean.setCompanyProjectType(1); + return bean; + }).collect(Collectors.toList())); } private void checkParams(Company company) { diff --git a/src/main/java/com/zhgd/xmgl/modules/car/mapper/xml/CarInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/car/mapper/xml/CarInfoMapper.xml index 839e11e1a..ef71e20f1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/car/mapper/xml/CarInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/car/mapper/xml/CarInfoMapper.xml @@ -32,6 +32,8 @@ ei.enterprise_name, p.project_name, t.car_qr_code + , + t.icc_id FROM car_info t join project p on p.project_sn = t.project_sn LEFT JOIN car_type b ON (t.car_type = b.id and t.project_sn = b.project_sn) diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectServiceImpl.java index 58747f5c0..ed30ce6e3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectServiceImpl.java @@ -90,7 +90,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -260,7 +259,13 @@ public class ProjectServiceImpl extends ServiceImpl impl if (StringUtils.isBlank(projectSn)) { return null; } - ProjectInfoExtVo info = redisRepository.getOrSetEx(PROJECT_PREFIX_KEY + projectSn, (() -> projectMapper.getProjectInfoBySn(map))); + ProjectInfoExtVo info = redisRepository.getOrSetEx(PROJECT_PREFIX_KEY + projectSn, (() -> { + ProjectInfoExtVo projectInfoExtVo = projectMapper.getProjectInfoBySn(map); + if (projectInfoExtVo == null) { + throw new OpenAlertException("该项目不存在,请清除缓存再重试"); + } + return projectInfoExtVo; + })); if (info == null) { throw new NullPointerException(" 当前查询条件结果不存在!"); } diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml index 78e8cc947..c549130d7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml @@ -68,6 +68,9 @@ left join project_enterprise pe on pe.enterprise_id = ei.id and pe.project_sn = qr.project_sn left join enterprise_type et on et.id = pe.enterprise_type_id WHERE 1=1 + + and qr.region_name like CONCAT(CONCAT('%', #{regionName}), '%') + and qr.id = #{id} diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListLibraryController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListLibraryController.java index 670049a71..000b5d5f8 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListLibraryController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListLibraryController.java @@ -592,6 +592,7 @@ public class RiskListLibraryController { @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = false, dataType = "String"), @ApiImplicitParam(name = "generateDefault", value = "1生成默认数据", paramType = "query", required = false, dataType = "String"), @ApiImplicitParam(name = "projectType", value = "工程类别(字典值)", paramType = "query", required = false, dataType = "String"), + @ApiImplicitParam(name = "dynamicType", value = "1动态风险2静态风险", paramType = "query", required = false, dataType = "String"), }) @GetMapping(value = "/tree/page") public Result> queryTreePage(@ApiIgnore @RequestParam HashMap param) { diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPotentialAccidentTypeController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPotentialAccidentTypeController.java index 127823218..fe97064f3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPotentialAccidentTypeController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPotentialAccidentTypeController.java @@ -1,9 +1,12 @@ package com.zhgd.xmgl.modules.risk.controller; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.xmgl.modules.risk.entity.RiskListPotentialAccidentType; +import com.zhgd.xmgl.modules.risk.entity.bo.RiskListPotentialAccidentTypeBo; import com.zhgd.xmgl.modules.risk.service.IRiskListPotentialAccidentTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -11,14 +14,28 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** @@ -135,4 +152,77 @@ public class RiskListPotentialAccidentTypeController { return result; } + + /** + * 导出excel + */ + @ApiOperation(value = "导出excel风险清单的潜在事故类型", notes = "导出excel风险清单的潜在事故类型", httpMethod = "POST") + @PostMapping(value = "/exportXls") + public ModelAndView exportXls(@RequestBody HashMap param) { + param.put("pageSize", -1); + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = riskListPotentialAccidentTypeService.queryList(param); + AtomicInteger i = new AtomicInteger(); + List typeBos = pageList.stream().map(o -> { + RiskListPotentialAccidentTypeBo bo = new RiskListPotentialAccidentTypeBo(); + BeanUtil.copyProperties(o, bo); + bo.setNo(i.incrementAndGet()); + return bo; + }).collect(Collectors.toList()); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "潜在事故类型"); + mv.addObject(NormalExcelConstants.CLASS, RiskListPotentialAccidentTypeBo.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("潜在事故类型数据", "导出")); + mv.addObject(NormalExcelConstants.DATA_LIST, typeBos); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @ApiOperation(value = "通过excel导入风险清单的潜在事故类型", notes = "通过excel导入风险清单的潜在事故类型", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件", paramType = "form", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "sn", value = "总企业sn", paramType = "form", required = true, dataType = "Integer"), + }) + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap param) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + String sn = MapUtils.getString(param, "sn"); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(1); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List listStuffTypes = ExcelImportUtil.importExcel(file.getInputStream(), RiskListPotentialAccidentTypeBo.class, params); + listStuffTypes = CollUtil.reverse(listStuffTypes); + for (RiskListPotentialAccidentTypeBo bo : listStuffTypes) { + RiskListPotentialAccidentType stuffTypeExcel = new RiskListPotentialAccidentType(); + BeanUtil.copyProperties(bo, stuffTypeExcel); + stuffTypeExcel.setSn(sn); + riskListPotentialAccidentTypeService.save(stuffTypeExcel); + } + return Result.ok("文件导入成功!数据行数:" + listStuffTypes.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + log.error("error:", e); + } + } + } + return Result.ok("文件导入失败!"); + } + + } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java index 582998e55..06b726a64 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java @@ -415,8 +415,8 @@ public class RiskListSourceController { @ApiImplicitParam(name = "detailIds", value = "风险清单详情ids(多个,分割)", paramType = "body", required = false, dataType = "Integer"), }) @PostMapping(value = "/identifySource") + @Transactional(rollbackFor = Exception.class) public Result identifySource(@RequestBody @Validate HashMap param) { - List addList = new ArrayList<>(); List details = riskListDetailService.queryList(new MapBuilder() .put("detailIds", MapUtils.getString(param, "detailIds")) .build()); @@ -433,8 +433,8 @@ public class RiskListSourceController { source.setPointId(pointId); source.setCreateTime(new Date()); source.setUpdateTime(new Date()); - source.setEffectiveTimeBegin(source.getEffectiveTimeBegin()); - source.setEffectiveTimeEnd(source.getEffectiveTimeEnd()); + source.setEffectiveTimeBegin(point.getEffectiveTimeBegin()); + source.setEffectiveTimeEnd(point.getEffectiveTimeEnd()); source.setIdentificationTime(new Date()); source.setProjectSn(point.getProjectSn()); String[] pathSplit = detail.getFullPath().split("/"); @@ -442,10 +442,11 @@ public class RiskListSourceController { source.setSubProjectWorkTask(pathSplit[3]); } source.setWorkNameContent(StrUtils.getLastSegments(detail.getFullPath(), 4)); - addList.add(source); - } - if (CollUtil.isNotEmpty(addList)) { - riskListSourceService.saveBatch(addList); + RiskListSourceDto sourceDto = new RiskListSourceDto(); + BeanUtils.copyProperties(source, sourceDto); + sourceDto.setSpecificResponsibilityAreaIds(point.getSpecificResponsibilityAreaIds()); + sourceDto.setSpecificResponsibilityAreaNames(point.getSpecificResponsibilityAreaNames()); + riskListSourceService.add(sourceDto); } return Result.ok(); } @@ -521,7 +522,13 @@ public class RiskListSourceController { map.put("delete" + (i + 1), true); } map.put("listMap", listMap); - templateUrl = Fileutils.getExportTemplateFile("excel/辨识清单导出模板.xlsx").getAbsolutePath(); + String tempFileName; + if (Objects.equals(CollUtil.getFirst(sourceVos).getDynamicType(), 1)) { + tempFileName = "动态危险源辨识清单导出模板.xlsx"; + } else { + tempFileName = "静态危险源辨识清单导出模板.xlsx"; + } + templateUrl = Fileutils.getExportTemplateFile("excel/" + tempFileName).getAbsolutePath(); TemplateExportParams params = new TemplateExportParams(templateUrl); Workbook workbook = ExcelExportUtil.exportExcel(params, map); //合并列 @@ -530,7 +537,7 @@ public class RiskListSourceController { for (int i = 0; i < maxCol; i++) { SheetUtils.mergeSameContentCol(sheet, i + 2, 1); } - ExcelUtils.downLoadExcel("辨识清单导出模板.xlsx", response, workbook); + ExcelUtils.downLoadExcel(tempFileName, response, workbook); } catch (IOException e) { log.error("", e); throw new OpenAlertException("系统错误"); diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/entity/bo/RiskListPotentialAccidentTypeBo.java b/src/main/java/com/zhgd/xmgl/modules/risk/entity/bo/RiskListPotentialAccidentTypeBo.java new file mode 100644 index 000000000..d16655dd8 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/risk/entity/bo/RiskListPotentialAccidentTypeBo.java @@ -0,0 +1,21 @@ +package com.zhgd.xmgl.modules.risk.entity.bo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; + +@Data +public class RiskListPotentialAccidentTypeBo { + /** + * 序号 + */ + @ApiModelProperty(value = "序号") + @Excel(name = "序号", width = 15) + private java.lang.Integer no; + /** + * 类型 + */ + @ApiModelProperty(value = "类型") + @Excel(name = "潜在事故类型", width = 15) + private java.lang.String type; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListLibraryVo.java b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListLibraryVo.java index 43c80220f..583548b13 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListLibraryVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListLibraryVo.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.modules.risk.entity.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.zhgd.xmgl.modules.risk.entity.RiskListLibrary; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,6 +9,7 @@ import java.util.List; @Data public class RiskListLibraryVo extends RiskListLibrary { + @TableField(exist = false) @ApiModelProperty(value = "1动态风险2静态风险") private java.lang.Integer dynamicType; @ApiModelProperty(value = "全路径名(/划分)") diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListLibraryServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListLibraryServiceImpl.java index a2d2ad6df..5757e75f3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListLibraryServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListLibraryServiceImpl.java @@ -70,7 +70,7 @@ public class RiskListLibraryServiceImpl extends ServiceImpl getQueryWrapper(HashMap param) { - QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(RiskListLibraryVo.class, param, true); + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(RiskListLibraryVo.class, param, false); queryWrapper.orderByAsc(RefUtil.fieldNameUlc(RiskListLibraryVo::getId)); return queryWrapper; } @@ -215,6 +215,16 @@ public class RiskListLibraryServiceImpl extends ServiceImpl vos = BeanUtil.copyToList(ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(list)), "id", "parentId", "children"), RiskListLibraryVo.class); + //1动态风险2静态风险 + Integer dynamicType = MapUtils.getInteger(param, "dynamicType"); + if (Objects.nonNull(dynamicType)) { + for (RiskListLibraryVo vo : vos) { + List children = vo.getChildren(); + if (CollUtil.isNotEmpty(children)) { + vo.setChildren(children.stream().filter(o -> Objects.equals(o.getNodeName(), Objects.equals(dynamicType, 1) ? "动态风险" : "静态风险")).collect(Collectors.toList())); + } + } + } int i = cn.hutool.core.util.PageUtil.getStart(pageNo - 1, pageSize); List records = CollUtil.sub(vos, i, i + pageSize); IPage p = new Page<>(); diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java index aa6d6c7e8..02f6f09d2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java @@ -302,7 +302,7 @@ public class RiskListSourceServiceImpl extends ServiceImpl> getEnterpriseDepartmentTeamTree(@ApiIgnore @RequestBody Map param) { + List all = doGetEnterpriseDepartmentTeamVos(param); + List vos = BeanUtil.copyToList(ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(all)), "uniqueId", "parentId", "children"), EnterpriseDepartmentTeamTreeVo.class); + return Result.success(vos); + } + + /** + * 查询单位部门班组列表 + * + * @param param + * @return + */ + private List doGetEnterpriseDepartmentTeamVos(Map param) { String projectSn = MapUtils.getString(param, "projectSn"); String name = MapUtils.getString(param, "name"); List all = new ArrayList<>(); @@ -318,8 +331,22 @@ public class EnterpriseInfoController { if (StrUtil.isNotBlank(name)) { all = all.stream().filter(vo -> vo.getName().contains(name)).collect(Collectors.toList()); } - List vos = BeanUtil.copyToList(ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(all)), "uniqueId", "parentId", "children"), EnterpriseDepartmentTeamTreeVo.class); - return Result.success(vos); + return all; } + @ApiOperation(value = "统计单位部门班组数量", notes = "统计单位部门班组数量", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "enterpriseTypeId", value = "企业类型", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "name", value = "名称", paramType = "body", required = false, dataType = "String"), + }) + @PostMapping(value = "/getEnterpriseDepartmentTeamStatics") + public Result getEnterpriseDepartmentTeamStatics(@ApiIgnore @RequestBody Map param) { + List list = doGetEnterpriseDepartmentTeamVos(param); + EnterpriseDepartmentTeamStaticsVo vo = new EnterpriseDepartmentTeamStaticsVo(); + vo.setEnterpriseNum((int) list.stream().filter(v -> Objects.equals(v.getCategory(), 1)).count()); + vo.setDepartmentNum((int) list.stream().filter(v -> Objects.equals(v.getCategory(), 2)).count()); + vo.setTeamNum((int) list.stream().filter(v -> Objects.equals(v.getCategory(), 3)).count()); + return Result.success(vo); + } } 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 f067f0d7d..9cb0b3417 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 @@ -498,6 +498,12 @@ public class WorkerDailyAttendanceStatisticsV2Controller { @ApiImplicitParam(name = "attendanceDate", value = "考勤日期yyyy-MM-dd", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "body", required = true, dataType = "Integer"), @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "body", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "enterpriseTypeId", value = "企业类型id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseId", value = "所属企业id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "teamId", value = "班组ID", paramType = "body", required = false, dataType = "String"), + @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"), }) @PostMapping(value = "/getWorkerDailyAttendancePageByDate") public Result> getWorkerDailyAttendancePageByDate(@RequestBody HashMap param) { @@ -506,6 +512,8 @@ public class WorkerDailyAttendanceStatisticsV2Controller { } /** + * 分页查询考勤日报列表 + * * @param param * @return */ @@ -513,7 +521,9 @@ public class WorkerDailyAttendanceStatisticsV2Controller { String projectSn = MapUtils.getString(param, "projectSn"); String attendanceDate = MapUtils.getString(param, "attendanceDate"); param.put("addTime_end", attendanceDate); - IPage workerInfoList = workerInfoService.selectWorkerInfoList(param); + Map queryWorkerParam = BeanUtil.toBean(param, Map.class); + queryWorkerParam.put("inserviceType", null); + IPage workerInfoList = workerInfoService.selectWorkerInfoList(queryWorkerParam); Map personSnMap = workerDailyAttendanceStatisticsV2Service.queryList(param).stream() .collect(Collectors.toMap(WorkerDailyAttendanceStatisticsV2::getPersonSn, Function.identity())); Map> personSn2AttendancesMap = workerAttendanceService.list(new LambdaQueryWrapper() @@ -584,7 +594,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setInServiceCount((int) vos.stream().filter(v -> Objects.equals(v.getInserviceType(), 1)).count()); vo.setAttendanceCount((int) vos.stream().filter(v -> Objects.equals(v.getIsAttendance(), 1)).count()); vo.setAbsentCount((int) vos.stream().filter(v -> Objects.equals(v.getIsAttendance(), 0)).count()); - vo.setAttendanceRate(Objects.nonNull(vo.getInServiceCount()) ? NumberUtil.mul(NumberUtil.div(vo.getAttendanceCount(), vo.getInServiceCount(), 4), new BigDecimal("100")) : null); + vo.setAttendanceRate((Objects.nonNull(vo.getInServiceCount()) && !vo.getInServiceCount().equals(0)) ? NumberUtil.mul(NumberUtil.div(vo.getAttendanceCount(), vo.getInServiceCount(), 4), new BigDecimal("100")) : null); param.put("addTime_end", null); param.put("exitDate_begin", attendanceDate); param.put("exitDate_end", attendanceDate); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamStaticsVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamStaticsVo.java new file mode 100644 index 000000000..031fada83 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/EnterpriseDepartmentTeamStaticsVo.java @@ -0,0 +1,24 @@ +package com.zhgd.xmgl.modules.worker.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class EnterpriseDepartmentTeamStaticsVo { + /** + * 单位数量 + */ + @ApiModelProperty("单位数量") + private Integer enterpriseNum; + /** + * 部门数量 + */ + @ApiModelProperty("部门数量") + private Integer departmentNum; + /** + * 班组数量 + */ + @ApiModelProperty("班组数量") + private Integer teamNum; + +} diff --git a/src/main/java/com/zhgd/xmgl/task/ElectricalTask.java b/src/main/java/com/zhgd/xmgl/task/ElectricalTask.java index 09525257c..0df9dc1f9 100644 --- a/src/main/java/com/zhgd/xmgl/task/ElectricalTask.java +++ b/src/main/java/com/zhgd/xmgl/task/ElectricalTask.java @@ -6,7 +6,6 @@ import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baidubce.services.iotshc.model.token.GetTokenRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.xmgl.modules.electrical.entity.ElectricalData; import com.zhgd.xmgl.modules.electrical.entity.ElectricalDev; diff --git a/src/main/resources/excel/辨识清单导出模板.xlsx b/src/main/resources/excel/动态危险源辨识清单导出模板.xlsx similarity index 100% rename from src/main/resources/excel/辨识清单导出模板.xlsx rename to src/main/resources/excel/动态危险源辨识清单导出模板.xlsx diff --git a/src/main/resources/excel/静态危险源辨识清单导出模板.xlsx b/src/main/resources/excel/静态危险源辨识清单导出模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..739a4100b2caa11e734be25f8b7e7f5350d85560 GIT binary patch literal 10784 zcmaKSWk4O<&NlAOrdV;OK=A@CUfkWCO>uWhafhPCo#O89?p_>J6V~P%w#4jkE{eF6av`u2#{Xmd;b0JfCmwVRtB=RR@Qc}WkF&95CiU~ST=d; zCuVRkFjfdKFtmS)=~-JdI9r&fM7E1VG696Hy`Ru3tR`tl<(X-q(X||2OuG*?nLx6L ziKYtfquyXzYQi09B4m0Pw2v~fkZ~!g94)(D+uAX#PC6(>;e8zY_LUX)Gc|aYdC4$y z_I5~gJ30k;c0bSr`Kvvomvr|J!qFy&?{b2~OdY;4C1^{&<>|_@{fwa%LE?Ju6ig+b z`pxBxp?j6JlyoD)M6v{7%%GwLd8~E3sw9%9ZdS$?3;bVe(y=o@AoAFiOo{88(-=t$ zzmFOo<=9`jrRmFYqO3;sp5e&n&$uMt*`NI=*`JLxMxIj@t1aQfRA25O@ivYj9eW}7 zzIJBex)F9Hb9rgL-0E=jj*q;U1f{WuGJQR;gJD&`0A5eqaAKXPO^m1xxMR(WPNY-w zX0-KYzUMTXXzt*?u^aYx|B6dPMJj;&s|WHg`ak_^U}Xz@cCcU6ig+g@pywERC1ayS zYJQGWU}2RA#=FxCv%4`O*`k{rS*&V-%=s`IbqycB#m}U17zO&ZUCZ&qh!cuf&wj;; zHeXUx6b%BT_q&KDjC#$S9ZQ~5kv^7KvG!nbfnavsF^;!9;&qu#6O5BzAS~<{Q^~{x z>&3?h)Pw#f-M5BW#Ew@M?jupeSQY)QfBKRN0 z9NPG;KHevq#Pi)NG}k^MgSSvX^dSATt{V!9=}bCr1m#jx+gfG@TCcn4sI3t5}}z zBhtH!I!mr^GYWZY3>dn~g(O3kJ^s)d%pN;9puBaNqbjlC4S(PK zjb-s-&U98$F@7)igvEl5oC%Lu23;mjZ=g(%DSW`|mvtvEMDA4#vu@``4r+4Sca8d~ z9yY2c9HkJJ3-XEz;6x%yRN>(%p$);4_}}%$zo^oz{CJ7dwE8lqO`+O;`gkD4fZ#Bb zNIR6Ek~UYUg+Ud!OHcH?OqVGk(gjC|B&^f)O41w3y%*Dd`X*P_8mqzMqcwL@(1QNn zoe@IomZZH2>pV)8+Qf`*xg4avEK6uL$=Q zyIdS}&2sv1dh4^RTnnEJ{AuG6DX_;h^|RLwz4A}jDgbqfNF%RM*qR07`Pe{rPUN+4 zug4q4+v*P*32Ub@0n9HT?==jsj#o#C9yN2)<}~4e{JtFcvv%20kiGp6^?}acB7y?> z6Z%=#5I*G)NymQmmKl_m+o?(%F2Ot{t|^3r-EHlPs8stNQhtFQ8K{Isjzyxv_+(B< zKF2jbbCI?trI6ZLS+ZTp)@_qLb-H*p@{rjk1El;=usYb6pHp)mb3el4I?}fS|CQ<0 z+U_>#EwmS=bKNyD(v;I}-99{gbx`!S3zr3Nk+nL3$-xP;#NEOL&d0-XTh-UAv8V;qm zs7P<(U&RN{?99e$<}n6#`>6(_b$K0PLEbX^=AFz0d+P@*D0j6M%*~*)ToQCFYoBAy zsYhx#j|5*3b3RP;O&cywgDC|p7eIcrbjUM!Dt<+-#`$Wr@ZOONxfWLDG7h}?sv*hb zv-GCGu1h(*|D)p83v$tNy3G~S_<`$+j1!0Rw(7|?swPpV>$d$4+k2rHTL)NnNmwr6 zSi?*9`wW7YYrrfg^+RCXJ~=y z3%&Ek8g^pP1Z0tbQ8MzV22OrbwIu^`j7FIV(NG>C(()UmAbdLs)R9P0qy|1xn;lyX zbM%0c2+@}f!k{ylpsoxJa*TkZXNCxf0S;n_fEcMDhU@YR?zJ&Qj3B{MQF4@Kl1Pp& z9Qhz2Bny{t=dQ7w>p(H2L)Y-SuCbcyKq;g{xA2>;u^ubTES&jUi#33tMyphjzVUJG z8|{n^2nq-U=$o4JwQ84E)9GUstR)(qHzC+1a!bu66c+mTsy=AP;jD0Ko*m{C#Jd#u3AKUoLm$ebAgrS>bH1)j@>SGocJ3 zj-QE7*t-}`M9-8Qh?VwCsDTKbXF>@?tbm9(CS<__U;v)~%^)lM92pFYl<-wxr(|># zw?5P4hN0CuQvtK}GP6>Gww58Svx4F0TD*e1>5OJBKIv7Q+pbP9o{&Q9!MG3{1W&}( zGQ(5Gm|MNR_0cokgkj((JSs#7nu<`5w)#fr8NZ$^)-N=snp!wj-<3NoYOcAOEnOTu z*E@H4ycpx&J;Lb{X2iF%CL(kArJHTPq_WWZYVEAkj#6&L3dvtZXv_#j_! ziCXtIuS#rAby01~NxSpue_SNpw}=F`DzD@-O?&%D==F8TkCIl`hfa{|8*DH21ey(op!H08 zOSKB_2&ExkM6vGOIEna#Gu)>}P$Q!QX^w8}=pG6ii9T6FANJu;%|hNQ9;AOJl1MmI zq$Ty#BWEZ_$~`gfaP}tuxG6`mu>D|VH2*l88oaia5)(t$!)difrrn9w z4-bx-h&I=m0AJb+fn+OFqTVUgxHkY-z>&EFHTzhOoc!I+jnd<`iestbn6%#eO&E<% z%k(FN#t!0S%Uw#CF`O5M!8$uEI z058|aYxU;CM87u=R;4z}W_ccnrTq0zcX*!|cLV_RO)#4`J$NnJRu&HXFSLDZKiVO$ z6dYad(SxLzD0c0UwJca`8$+gJBjB@OrJWn)h^lH3wj}_Hf@)f(!SE8BIqDK)kUg+q zvV6hhV%(ggCs5F`ty=H<<1vpT-j^#*rW1sQZr{ohfAgOTO@-s=H|%XqC7DH+C@s}_ zxVh_QIlc_Z%?(dYx7IE&RH!yZoRo*kZEpBb-&*0SFvnjJZ*it zn6qmAvogq=%*UIg)&D$kVXKrbuS{iwQPfT=FMKtcB zPgYN^5H~8=6(4j^Zt_N0Y^wuB3@>Rmyc-}6aH&nOZx4@e7MybGgA{+0b5Gc=+%WpW zyD>ePG8^cXN5yi~x5+kCbVo3<3#C`gOneZlO-0VF&~%QwJm}cFvffqif}-5zih0CK zJnqYvlJ3t_< z4VpFG8q8-vT8GQVg(0Gfozg^f8+bXVCjqE)4A+s71WX zvdP+xNj2N9j)!k*h57hK41^HDwWs)Ca6(a!v2J z7&n=eEDXk|Uno)stKzV#$32C03)vw%7S8i2D9{-1rPx1gIYNq4@~QQvwH*@hP~uK~ zmZj2oPv(4!C7Nn=6GAP~<99%Uz70N;8C}RPK)yvtA=axh_Kn3uzm^DYhad^hN!T-$WeI*VSK{w$1Wl46^*R0krOpGm9X8xXd zBs6%d9P-HDkP4=y21_FCW@jBn+2tcy-rLQw&@0JlO&05aLkeLp!x#)JK!oOYK6`>8Fb0armBBlkFtp~x9I$@;W{+%A3y+8juE4wUWVB)r~BLLJD-sCtE8LL{!u@>Vkef8Fd%CHh0f;_eE~?baWZyso?Z7yHhRoZ`zr znu0`m2uDXgt%z!-N?wmvyg&OCpPZ^b1G^o4dOEPWI&Jvi!gIre8y2e@8;>H~-*~=n zm1acbI#>DCgNYZ13fp6=x!us2_0hI&jDvH)cIjw|vh+q^m&($xFL9#cqt4+3E>_?Ln+}cLqi#17@(n?FeT^~Ax?sr1N7zau|rqTL`Zp= zBm82qK6xm-dJI^5fc(8~_KXJidkMPNQb8pd>fhy2dcup+@aXJ z)nJzeg#iO4&8I|d0QDu4sdPgqdRVhUjr-pV_UgkY-KJ;y-R!~F>r54G)QxVoljah< zb~i~zL#fcBY_~`XtwwA}nD)f=fZ9_9YQm&GQ$FO%p#`<{%_5t`daciW`A-2(hc_fnWv0-E|@H&%w z?_b875<^so?w$d~5$7iQN~G=eW6SpA{0@4N1hGD7+)(rXV9mfaPb9>VlUo$7Z`mag z6n-IAO{@rhItJQX@x>1CK`MXk%{_df;iNkccb{9c2ydbII44WJ8Pdue7RB5#=q9eX zN8+}D!d7tV4t5to%MItoXiH1TV=(n*qUerQRcrHnbY+zH(=M)(Me{d5)rJE2Y1Fku zRkjRdvItq2uMH{w$!a2ijPm)Mn6{eFWf4!Gs^M0oP7|sGlOJ6dIfZh=v*=ndg&n4p z8e>fwmFlf!-^fqrmSax|u0VWv84o#gge>^#0GWQ~0J^=qYq1(E7udE`+R zJ$iC>!C}aRu5Ke}ulHT=@QcUFh;KME<7oNKV{S(>`14=S{6&uY6IeeRoc|DKR2wcV ze3|t`^^n(EiNqD$DJ8NxeQ4W!kk_nMRC}$ba%zq{^kM0;a@zC?*nG2?(^kq3*iYD( zvZ4xK&Y)}l!-ww1SiQ9RDy zc(JtaTCWsEnaZ?>U&F$@kZoWm-%xQmU1~1fWU#Qv%PJ)U0mu?-wBK=A4-*GYyk!mO z*{EP)7daVjvkCBrC0gU_VD)fcNEH3#{ZI`7bXtX*;5t=+dpRQ@s1$QZN%E# zS$U>{{upPSR;+WmCkd9Um#u-l%yq*Q+{igJgHWA&CV>O;m^rJ#J4SDuBm|K_j{a^kuwbWtFMASo*NNq4^RZbE!o_)^&s!!Ph?wZHz+ofG<&6b zs2cIQKNjb&H_K7BT8CIIMTmd#1cayrtx@nj-LIj$==OKD=;!yekiWKNk_%y8RcO`> z>l4wjo-NfB!~1R(-qA|05LYm|Dk0@zue%bqZYg6`nphIfSW4*FI^u>t;6)vss~U-7 z-;>r9ZF+8csR*Zyov{D_X^;?#nuGFFG`0zQr$Vfrf1=x%MVx&z!jnCB+)JgYy=wRx zPhG^Uffyz#{zwM*-N29AG+J>=R9EzCRxPKd^~U`!&BOZn-C;9R<1!3UoDTg#DkAZ5 zG=w6^g_gi693VrlJ&m^7q?v1FIcp_T=B=J5+_%_mDjV-RN4r|r68@3;V9)f=KT>kV z6%J~-cD3`#H;_&N?djW8X{B@WfhGibP}_LW`CWLIn-W_|`8ejj5g+l;dLB4 zCt6%Pci_{O7Y>k4tF%asE@~n22yUni%ezIv%DGu4uQIcDPAc)#7aT4?$CRGb$beiWihhUB9H2A6xAIXNcu_2Z`1tksmIshcp&$^*}qiQ`UX(ac0@SYEfpPdHEA|7+9~ZGLVB!@$8{==B^nN6OG?OSeZj(V zF{8h=6=jy1#+qox&LZeR|4Y)j!Q^%vNdnQVc=%cAr)+5+B3L1#8QXuPT5}RktzW>5 zY4sjWth1uM>2nwy; z3JTuLy{u@4!6l%K4tuB{Phs>l4v{u5GMu}Teha)ZVh%8iR5xTU;j1S5!lSD>E1gJj zn3*D2(6A2+wl9hSB~nEgjn8nGFF>%;N-7|Oq>~ApiT5nXoQ*-0G}HwPxp68--J-xD zo8LZFrHKz^guvZmoGqw{(vbKpAp*S5L;z;(o#EH>T^AsT)87ZS5fkaxRP9TO5W6?VsNJM|F&((l3_{F&zeBzAMh9(riuv`h;O3W=^jYG+M z&plalE!ThZgP2Z)cAmzDRkwzrEeE42FU(OST_nEil1OZqgs6rcd4UTDc^IAUOH#>) z%Q1O3RGvfz=_wH(ICU&5VPfa;EjT9aew^?_1A-lcy$wv(>@-Jf&g`^WNS>WSvy$}$ zZd9u%{^_ePYTfsE3{Zt*TJWJt_StJG?AQYNw98F)B&tAftZo%`S$8+CgT#{0PR`@1 z<0=H2NWIiU3@>^mL%kYI1bnYKlqh!MB|b=qs)kDIS)O|D0&@BpaC#Zn?bZc zzjv8@8r<~XyrZWz%+!>9iK6$N!3cdql|LrFkF+c`sT<3_EdC>OBa2|MH>ruZ-}~5( zGusq7qqBD>{0ZKg)jT=z5Ti`h%2G^hFJlDRpgC>b6CuLjqT#=`19C2~a^7<0@9`7T zA%sXK_=uR!Ul>+YKAhqv@x%|nghK`uB`LAKDz!pnammXvB-nb1_d4jy{_s5{hPuYM%rUEb;Ai{hp>OL%ppQHG@|IBPLeOne`{N*@>*OPil+v zoz_7Y>JJ}-E?mLu=qwNQ=(RyS+vh(vBxc1t&>t%5sspN>ZOl*yfuO^FTz4@yQe5@g zH^QDZHfILoL%sT+YAsju3VJG={dnA!?^aZe9kjXdZp^NnaYSM#H=&g~B6A*^!9q>4 zl4J*W&oe~9Wih@>^1i-Wa%nRNVnM$y2KVqHH*A%^g{ye z0Z3ac4zVG?-B`2G(j<{GH=l#>APY#n8y(qvPK)FaovLb-@<1Q7j?Z&soyQUIK8ga@ zm{k&$xiT_Dt%KAJZ>!B`IV3tz#(KbxR$NXGejH%)^140Mg5&HYgOgD$`OtImq)dA7 zrgA@;fO!r{?tT}PljC~*bn`NB=!p=6AO3U4cT66+c-+nf)B;|FybP4req8~=nGwF+ zFfb0hG)O#NXg;^2OO>#r+pV7fWBe)n2!fU}fq8mYyHvSUI?3GcTyB3f=E^xwNoAcl zr`gABJ?MCFH(qP=ph zoCpH$UF3i#+_cBtje)M^r+X$DWEm^@*@iJ*I8GWQmnz%tGwP~DR46I2)Cd=%NI#=< zuk?J>uEqemsw5ECop_nIuf8U)Tsn<6ehIl5vN(njqy56OPaVwmxH1Ca7@biW+bj9u zcC)_|&G#DKHkM;x_F;YDoR>Rs>1pZUDCIUFEugGPhgv`oJubX`Z4SlMPzY!8++#Uu z<%bm?iVQa+u|QfPx9f|VZ7l)xhOUFj=rZnOVxMRfNF>IqW568Rk zx8K(*sZd9G?!I5drODQIcPa~0>Y=@wE)@gPU?CsB8cV^((H<7=yhpvLg*L{UGj>iZ zSY4WuOT!4n?8)wUt1Pvn8l(>3nIuZUOyWA@P z@^NJuro1QRPqM!3TIHD}!IOnFGgXQwfK~@jig5KQaWY7j!n!m6HM3I2D5a@i<|?-e zmaFA6YYg>O%$OZW7W=#!B2N|SKbG&!wRS3l)H95oM~e};-~6)RVCzUBX*X7VOf+tB zJl5O(n)#S2NE-sfvJo|W=i_&_7 zZgqA*0_nPRmC$E9-z~2V#da!&4g<$q+-_~6#WmP_DtXHuu?vcHqL<${oiVi3G1rUY zz8>&_2Z=y)s(W|7TjXabv3UT<*lM)P#cuSp^S|J7mEnDbDV*`W%*c-v{2pdr_p&y< zULaEf{?St|Gk6A#cPv}>LiM6K2hqdCJ_<*=XkGV^qDC_s8uK>DCiRsHtUTXC&Re~B z?sI24)8xH)zfdt{AHNTbFXn?jdpXY0$(Jf)9wdCmt{@TrQ9me68>^`DSV7Gtv&fK1 z0bmP#4zE#3{^)W6m@@FiBnmvYGWI-$)8ubqs{RgjAhS1rB%PIQKj5IGFu1pTr0vou zXYr+Q`g4uSOkqRL)UsDO6qfC%KVs6VYEgidV3WhnEM*RgK*TCGAva|;ukYI#sq42R z#bum?m6UAPFI5HgHP%UN<@dcdrJFt*$OKr2HI5<^CQ^aV3Kww`s!&w-LV2dRk5=~> zi9(`+%j>}@pfgTX=U5lTx;Ik3_3~X+ZOrU&}*gAC0wExSbB*hJPvN0E!iE*9-_h%ZMWd769TA9N_wXhWz_%+2IB zlK0wou!iF-$^_d4{f8^~CBXcgoB+dHU-Vs2BoqfbisTaW;SZ%Ov-#+Vm#JL+P)7`C>&IGlSud?6%Dg#ym_WrVGltt9Imem@iFm#hpx+q$AKsD~2>EHYMY`u$_XCRN% z`Y1of9PpMV+GKoJQI;?5Et^m-C$9mS4|}tvtmVL&a8DYctkk>iW!gZuMi?6ozouI& ztAhQJ@7xJlf}(IX3K`o${* zFK%kK+R!ERYDyCYQ=|{y@=Z=|ceF>2Yg7%2a`{qZ?mv+;_jYZ>y6~{+h}xdf7drj_ zefggj%D=fY$qAhn4Fmz80QIQxepR5q#GZT6|J~5|k9U_$eHqdGjuG7h7_Zq(J*a`} z%P}3xHCNyQFFjkWZhVwkDYvqp!l5S)($~%VLW8FT ze>1dllcE^M9ZXbUeQ#iT-zq>Uh0MEBMh^47ybAvUZ-C9B1C>IZ~(G*Kg(=jMdc z4)nvc+zH$R^N-bn8+9%^o+iY}l*ahl+Mz|A$xu`e-&{FKinI~KLBWO-MkGO2)!>+| z!rNTXp5@mqt<~&3xBI8D%ia?PS@58>;*bAQ70?T&UK%R}PVUA>ODq+(K!! zN%o2nKG*jY#k2;-Fl+U2ShoVj6I$tQky^C8^V&-wq_XZNB*%Qhov~0RF!_{tLvzS; z<=Pch(>1Owo4Fd#oWt2GUo~E_sbuG}M-0lR$a(ptxf&ZL2@bswY3|2e#Q=Frcr2wY zmf0OoCqti8A7969kG7g4pUfb2ex?^p&4?20b!WCO-T9>b3)X32&F^*DZOy^Pf8q`&|i$e% zp+jv8>ZG^#w)XnGP%p)3VN_i$V+r@+9i-^G5ZjDXv(?wb*NDd-PabMt{(z8`0EYnl z+!_9b?)o!epqPPygAs#{isb(qzF!mkJAUIiS^XN%K(Pdpzf;%mM*mD+&pN-1Hvgsb z^I`j6#-5+%U*p->^Y{mV?RR^BLfD>#f7zq@r`mr2ZGXDxPk`3n+5wk!I-wgP>m;TIw z&vt%!35o0