From ed46d50732bfcf6c04bb0fe3dad47dcf11e73f1b Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 9 Apr 2025 19:11:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=85=E5=A4=B4bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContractorMonthlyDetailController.java | 71 ++++++- .../controller/DeviceUnitController.java | 2 +- .../controller/WorkerAdmissionController.java | 67 ++++--- .../baotou/entity/AnticorrosionEntrust.java | 3 - .../entity/ConstructionEquipmentTool.java | 48 ++--- .../ConstructionProjectQualityPrevention.java | 61 +++--- .../entity/EngineerControllerCheck.java | 57 +++--- .../entity/EngineerControllerLevel.java | 2 +- .../baotou/entity/FirstExampleManage.java | 6 +- .../baotou/entity/QualityAcceptance.java | 9 + .../baotou/entity/UnitEngineerOpen.java | 2 +- .../service/impl/DeviceUnitServiceImpl.java | 4 +- .../EngineerControllerCheckServiceImpl.java | 4 +- ...ProjectDivisionApplicationServiceImpl.java | 173 +++++++++++++----- .../controller/SystemUserController.java | 9 +- .../java/com/zhgd/xmgl/util/FlowUtil.java | 14 ++ .../base/service/impl/ZwLoginServiceImpl.java | 15 +- .../resources/excel/导出人员申请表模板.xlsx | Bin 11794 -> 11764 bytes 18 files changed, 383 insertions(+), 164 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ContractorMonthlyDetailController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ContractorMonthlyDetailController.java index 1b40a6876..a686fa2c7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ContractorMonthlyDetailController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ContractorMonthlyDetailController.java @@ -1,5 +1,9 @@ package com.zhgd.xmgl.modules.baotou.controller; +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; @@ -15,6 +19,11 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.IOUtils; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -25,10 +34,13 @@ import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; /** @@ -219,18 +231,61 @@ public class ContractorMonthlyDetailController { return Result.success(contractorMonthlyDetailService.countQuantityExcel(param)); } - @ApiOperation(value = "月报周报html转word", notes = "月报周报html转word", httpMethod = "POST") + @ApiOperation(value = "导出excel", notes = "导出excel", httpMethod = "POST") @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "file", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "content", value = "excel的json", paramType = "body", required = true, dataType = "String"), }) - @PostMapping(value = "/html2Word") - public void html2Word(HttpServletResponse response, MultipartFile file) { + @PostMapping(value = "/exportExcel") + public void exportExcel(HttpServletResponse response, @RequestBody HashMap map) { + XSSFWorkbook workbook = null; try { - String html = IOUtils.toString(file.getInputStream(), StandardCharsets.UTF_8); - WordUtils.html2Word(response, html); - } catch (IOException e) { + // 1. 创建工作簿 + workbook = new XSSFWorkbook(); + // 2. 创建工作表 + XSSFSheet sheet = workbook.createSheet("Sheet1"); + + //填充数据、设置边框 + JSONObject root = JSON.parseObject(MapUtils.getString(map, "content")); + JSONObject sheets = root.getJSONObject("sheets"); + JSONObject readSheet = (JSONObject) (sheets.entrySet().iterator().next().getValue()); + JSONObject cellData = readSheet.getJSONObject("cellData"); + for (Map.Entry readRow : cellData.entrySet()) { + JSONObject cols = (JSONObject) readRow.getValue(); + XSSFRow r = sheet.createRow(Convert.toInt(readRow.getKey())); + for (Map.Entry readCol : cols.entrySet()) { + JSONObject col = (JSONObject) readCol.getValue(); + Integer columnIndex = Convert.toInt(readCol.getKey()); + r.createCell(columnIndex).setCellValue(col.getString("v")); + XSSFCell cell = r.getCell(columnIndex); + //设置边框 +// r.setRowStyle(); + } + } + + //合并单元格 + JSONArray mergeDatas = readSheet.getJSONArray("mergeData"); + for (int i = 0; i < mergeDatas.size(); i++) { + JSONObject mergeData = mergeDatas.getJSONObject(i); + sheet.addMergedRegion(new CellRangeAddress(mergeData.getInteger("startRow"), mergeData.getInteger("endRow"), mergeData.getInteger("startColumn"), mergeData.getInteger("endColumn"))); + } + + // 5. 设置响应头 + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("导出", "UTF-8")); + // 6. 输出到客户端 + workbook.write(response.getOutputStream()); + } catch (Exception e) { log.error("", e); + } finally { + try { + if (workbook != null) { + workbook.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } } - } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/DeviceUnitController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/DeviceUnitController.java index bc4433131..4c4f9ba68 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/DeviceUnitController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/DeviceUnitController.java @@ -134,7 +134,7 @@ public class DeviceUnitController { @OperLog(operModul = "装置管理管理", operType = "", operDesc = "根据施工或epc单位查询epc承包商列表") @ApiOperation(value = "根据施工或epc单位查询epc承包商列表", notes = "根据施工或epc单位查询epc承包商列表", httpMethod = "GET") @ApiImplicitParams({ - @ApiImplicitParam(name = "enterpriseId", value = "单位ID", paramType = "query", required = true, dataType = "String"), + @ApiImplicitParam(name = "enterpriseId", value = "单位ID", paramType = "query", required = false, dataType = "String"), @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String"), }) @GetMapping(value = "/getEpcList") diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java index 2fb6f40cf..b67d06df5 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java @@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; @@ -304,7 +305,6 @@ public class WorkerAdmissionController { throw new OpenAlertException("【" + StrUtil.join(",", existNums) + "】编号已存在"); } } - Map allCeNameMap = dictionariesRecordService.selectCertTypeList(new MapBuilder().build()).stream().collect(Collectors.toMap(DictionariesRecord::getId, Function.identity(), (o1, o2) -> o1)); if (CollUtil.isNotEmpty(tableList)) { List errs = new ArrayList<>(); Map typeMap = postWorkTypeService.list(new LambdaQueryWrapper() @@ -316,17 +316,30 @@ public class WorkerAdmissionController { Long workerType = jo.getJSONArray("field3008722075250").getLong(0); PostWorkType type = typeMap.get(workerType); if (type != null) { - //需要证书 - if (JSON.parseArray(jo.getString("field5960144013031")).size() == 0) { - errs.add(jo.getString("field1767683295945") + "需要上传" + type.getPostWorkTypeName() + "资质证"); + //需要上传证书 + String workerName = jo.getString("field1767683295945"); + if (jo.getString("field5960144013031") == null || JSON.parseArray(jo.getString("field5960144013031")).size() == 0) { + errs.add(workerName + "需要上传" + type.getPostWorkTypeName() + "资质证"); } - if (JSON.parseArray(jo.getString("field5342644024091")).size() == 0) { - errs.add(jo.getString("field1767683295945") + "需要上传" + type.getPostWorkTypeName() + "资质验证"); + if (jo.getString("field5342644024091") == null || FlowUtil.isBlank(jo.getString("field5342644024091"))) { + errs.add(workerName + "需要上传" + type.getPostWorkTypeName() + "资质验证"); + } + if (StrUtil.isBlank(jo.getString("field9354421203736"))) { + errs.add(workerName + "需要填写资格证号"); + } + if (FlowUtil.isBlank(jo.getString("field1492921345638"))) { + errs.add(workerName + "需要选择发证机关"); + } + if (StrUtil.isBlank(jo.getString("field2436120887995"))) { + errs.add(workerName + "需要填写取证日期"); + } + if (StrUtil.isBlank(jo.getString("field7888920890828"))) { + errs.add(workerName + "需要填写截止日期"); } } - } - if (CollUtil.isNotEmpty(errs)) { - throw new OpenAlertException(StrUtil.join(",", errs)); + if (CollUtil.isNotEmpty(errs)) { + throw new OpenAlertException(StrUtil.join(",", errs)); + } } } return Result.ok(); @@ -428,9 +441,11 @@ public class WorkerAdmissionController { if (CollUtil.isNotEmpty(l)) { WorkerAdmissionCertificateDetail d = l.get(0); String certificateNumber = d.getCertificateNumber(); - Integer issueCompany = d.getIssueCompany(); - dm.put("certificateNumber", certificateNumber + "、" + getIssueCompany(issueCompany)); - //dm.put("issueCompany", getIssueCompany(issueCompany)); + String issueCompany = getIssueCompany(d.getIssueCompany()); + if (StrUtil.isNotBlank(certificateNumber) || StrUtil.isNotBlank(issueCompany)) { + List list = Arrays.asList(certificateNumber, issueCompany).stream().filter(Objects::nonNull).collect(Collectors.toList()); + dm.put("certificateNumber", StrUtil.join("、", list)); + } } listMap.add(dm); } @@ -646,17 +661,25 @@ public class WorkerAdmissionController { * @param con */ private void setUploadFileName(File unzip, Map nameIdCardMap, String name, Consumer> con) { - List list = FileUtil.listFileNames(unzip.getAbsolutePath() + "/" + name); - for (String filename : list) { - UploadZipWorkAdmissionVo vo = nameIdCardMap.get(StringUtils.substringBeforeLast(new File(filename).getName(), ".")); - if (vo != null) { - String path = minioUtils.uploadGetName(new File(new File(unzip.getAbsolutePath(), name), filename).getAbsolutePath(), true); - HashMap map = new MapBuilder() - .put("name", filename) - .put("url", path) - .build(); - con.accept(new ImmutablePair(vo, JSON.toJSONString(map))); + try { + String path1 = unzip.getAbsolutePath() + "/" + name; + if (!FileUtil.exist(path1)) { + return; } + List list = FileUtil.listFileNames(path1); + for (String filename : list) { + UploadZipWorkAdmissionVo vo = nameIdCardMap.get(StringUtils.substringBeforeLast(new File(filename).getName(), ".")); + if (vo != null) { + String path = minioUtils.uploadGetName(new File(new File(unzip.getAbsolutePath(), name), filename).getAbsolutePath(), true); + HashMap map = new MapBuilder() + .put("name", filename) + .put("url", path) + .build(); + con.accept(new ImmutablePair(vo, JSON.toJSONString(map))); + } + } + } catch (IORuntimeException e) { + log.error("", e); } } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/AnticorrosionEntrust.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/AnticorrosionEntrust.java index 192fc348f..7eef4d136 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/AnticorrosionEntrust.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/AnticorrosionEntrust.java @@ -53,9 +53,6 @@ public class AnticorrosionEntrust implements Serializable { /** * 填报时间 */ - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "填报时间") private java.util.Date reportingTime; /** * 填报人 diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionEquipmentTool.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionEquipmentTool.java index afa1c6cdb..14f83b1b2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionEquipmentTool.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionEquipmentTool.java @@ -135,29 +135,29 @@ public class ConstructionEquipmentTool implements Serializable { @TableField(exist = false) @ApiModelProperty(value="施工设备机具分类名称") - private String classificationName ; - @TableField(exist = false) - @ApiModelProperty(value="设备管理员名称") - private java.lang.String equipmentManagerName ; - @TableField(exist = false) - @ApiModelProperty(value="进场经办人名称") - private java.lang.String onSiteHandlerName ; - @TableField(exist = false) - @ApiModelProperty(value="施工单位人员名称") - private java.lang.String constructionUnitPersonnelName ; - @TableField(exist = false) - @ApiModelProperty(value = "EPC安全人员名称") - private java.lang.String epcSafetyPersonnelName; - @TableField(exist = false) - @ApiModelProperty(value = "监理安全人员名称") - private java.lang.String supervisionSafetyPersonnelName; - @TableField(exist = false) - @ApiModelProperty(value = "项目安全经理名称") - private java.lang.String projectSafetySupervisionName; - @TableField(exist = false) - @ApiModelProperty(value = "安质环部设备工程师名称") - private java.lang.String safetyQualityDepartmentName; - @TableField(exist = false) - @ApiModelProperty(value = "所属单位") + private String classificationName; + @TableField(exist = false) + @ApiModelProperty(value = "设备管理员名称") + private java.lang.String equipmentManagerName; + @TableField(exist = false) + @ApiModelProperty(value = "进场经办人名称") + private java.lang.String onSiteHandlerName; + @TableField(exist = false) + @ApiModelProperty(value = "施工单位人员名称") + private java.lang.String constructionUnitPersonnelName; + @TableField(exist = false) + @ApiModelProperty(value = "EPC安全人员名称") + private java.lang.String epcSafetyPersonnelName; + @TableField(exist = false) + @ApiModelProperty(value = "监理安全人员名称") + private java.lang.String supervisionSafetyPersonnelName; + @TableField(exist = false) + @ApiModelProperty(value = "项目安全经理名称") + private java.lang.String projectSafetySupervisionName; + @TableField(exist = false) + @ApiModelProperty(value = "安质环部设备工程师名称") + private java.lang.String safetyQualityDepartmentName; + @TableField(exist = false) + @ApiModelProperty(value = "所属单位名称") private java.lang.String equipmentSourceUnitName ; } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionProjectQualityPrevention.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionProjectQualityPrevention.java index c4c031061..da99444bd 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionProjectQualityPrevention.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/ConstructionProjectQualityPrevention.java @@ -44,29 +44,44 @@ public class ConstructionProjectQualityPrevention implements Serializable { @ApiModelProperty(value="批 准") private java.lang.Long approval ; /**批准日期*/ - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") - @DateTimeFormat(pattern="yyyy-MM-dd") - @ApiModelProperty(value="批准日期") - private java.util.Date approvalDate ; - /**施工承包商*/ - @ApiModelProperty(value="施工承包商") - private java.lang.Long constructionContractor ; - /**单位工程*/ - @ApiModelProperty(value="单位工程") - private java.lang.String unitProject ; - /**涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;6:其他;*/ - @ApiModelProperty(value="涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;6:其他;") - private java.lang.Integer technicalSpecialtiesInvolved ; - /**技术负责人*/ - @ApiModelProperty(value="技术负责人") - private java.lang.Long technicalPersonInCharge ; - /**涉及操作班组*/ - @ApiModelProperty(value="涉及操作班组") - private java.lang.String operationTeamInvolved ; - /**明细表*/ - @ApiModelProperty(value="明细表") - private java.lang.String detailedList ; - /**选择明细表*/ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value = "批准日期") + private java.util.Date approvalDate; + /** + * 施工承包商 + */ + @ApiModelProperty(value = "施工承包商") + private java.lang.Long constructionContractor; + /** + * 单位工程 + */ + @ApiModelProperty(value = "单位工程") + private java.lang.String unitProject; + /** + * 涉及技术专业:1:土建;2:管道;3:动设备;4:静设备;5:电气;6:仪表; + */ + @Excel(name = "涉及技术专业", width = 15, replace = {"土建_1", "管道_2", "动设备_3", "静设备_4", "电气_5", "仪表_6"}) + @ApiModelProperty(value = "涉及技术专业:1:土建;2:管道;3:动设备;4:静设备;5:电气;6:仪表;") + private java.lang.Integer technicalSpecialtiesInvolved; + /** + * 技术负责人 + */ + @ApiModelProperty(value = "技术负责人") + private java.lang.Long technicalPersonInCharge; + /** + * 涉及操作班组 + */ + @ApiModelProperty(value = "涉及操作班组") + private java.lang.String operationTeamInvolved; + /** + * 明细表 + */ + @ApiModelProperty(value = "明细表") + private java.lang.String detailedList; + /** + * 选择明细表 + */ @ApiModelProperty(value="选择明细表") private java.lang.String selectDetailedList ; diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerCheck.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerCheck.java index 72a583c93..1928ee989 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerCheck.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerCheck.java @@ -41,29 +41,40 @@ public class EngineerControllerCheck implements Serializable { @ApiModelProperty(value="装置/单元工程") private java.lang.Long deviceUnitProject ; @ApiModelProperty(value="项目组") - private java.lang.Long projectGroup ; - /**单元号*/ - @ApiModelProperty(value="单元号") - private java.lang.String unitNumber ; - /**EPC承包商*/ - @ApiModelProperty(value="EPC承包商") - private java.lang.Long epcContractor ; - /**施工单位*/ - @ApiModelProperty(value="施工单位") - private java.lang.Long constructionUnit ; - /**涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;6:其他;*/ - @ApiModelProperty(value="涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;6:其他;") - private java.lang.Integer technicalExpertiseInvolved ; - /**联系人*/ - @ApiModelProperty(value="联系人") - private java.lang.Long contactPerson ; - /**联系人电话*/ - @ApiModelProperty(value="联系人电话") - private java.lang.String contactPhoneNumber ; - /**检查、检测时间*/ - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value="检查、检测时间") + private java.lang.Long projectGroup; + /** + * 单元号 + */ + @ApiModelProperty(value = "单元号") + private java.lang.String unitNumber; + /** + * EPC承包商 + */ + @ApiModelProperty(value = "EPC承包商") + private java.lang.Long epcContractor; + /** + * 施工单位 + */ + @ApiModelProperty(value = "施工单位") + private java.lang.Long constructionUnit; + @ApiModelProperty(value = "涉及技术专业:1:土建;2:管道;3:动设备;4:静设备;5:电气;6:仪表;") + private java.lang.Integer technicalExpertiseInvolved; + /** + * 联系人 + */ + @ApiModelProperty(value = "联系人") + private java.lang.Long contactPerson; + /** + * 联系人电话 + */ + @ApiModelProperty(value = "联系人电话") + private java.lang.String contactPhoneNumber; + /** + * 检查、检测时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "检查、检测时间") private java.util.Date inspectionAndTestingTime ; /**检查、检测地点*/ @ApiModelProperty(value="检查、检测地点") diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerLevel.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerLevel.java index 09b12c0a8..ce381073f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerLevel.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/EngineerControllerLevel.java @@ -127,7 +127,7 @@ public class EngineerControllerLevel implements Serializable { private java.lang.Long projectManager; @ApiModelProperty(value = "施工部专业负责人") private java.lang.Long constructionDepartmentProfessionalDirector; - @ApiModelProperty(value = "专业:1:土建工程;2:土建特种;3:静设备工程;4:动设备工程;5:管道工程;6:电气工程;7:仪表工程;8:其他;") + @ApiModelProperty(value = "专业:2:土建;3:静设备工程;4:动设备工程;5:管道工程;6:电气工程;7:仪表工程;8:其他;") private java.lang.String major; @TableField(exist = false) @ApiModelProperty(value = "编制名称") diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/FirstExampleManage.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/FirstExampleManage.java index fa80fee7b..b1ad7c9a8 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/FirstExampleManage.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/FirstExampleManage.java @@ -87,10 +87,10 @@ public class FirstExampleManage implements Serializable { @ApiModelProperty(value = "首件样板视频") private java.lang.String firstExampleVideo; /** - * 涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表;7:其他; + * 涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表; */ - @Excel(name = "涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表;7:其他;", width = 15) - @ApiModelProperty(value = "涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表;7:其他;") + @Excel(name = "涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表;", width = 15) + @ApiModelProperty(value = "涉及技术作业:1:土建;2:动设备;3:静设备;4:管道;5:电气;6:仪表;") private java.lang.Integer technicalOperation; /** * 所属项目SN diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/QualityAcceptance.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/QualityAcceptance.java index 984908025..99342dc55 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/QualityAcceptance.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/QualityAcceptance.java @@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.List; @@ -79,6 +81,13 @@ public class QualityAcceptance implements Serializable { */ @ApiModelProperty(value = "更新时间") private java.util.Date updateTime; + /** + * 验收时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "验收时间") + private java.util.Date receptionTime; @TableField(exist = false) private java.lang.String deviceName; diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/UnitEngineerOpen.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/UnitEngineerOpen.java index 14306b0b4..acfbb7f6c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/UnitEngineerOpen.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/UnitEngineerOpen.java @@ -83,7 +83,7 @@ public class UnitEngineerOpen implements Serializable { /** * 涉及技术专业 */ - @ApiModelProperty(value="涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;6:其他;") + @ApiModelProperty(value = "涉及技术专业:1:土建;2:管道;3:设备;4:电气;5:仪表;") private java.lang.Integer technicalExpertiseInvolved ; /** * 开工内容 diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/DeviceUnitServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/DeviceUnitServiceImpl.java index fd1df8b0c..1e3c34a68 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/DeviceUnitServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/DeviceUnitServiceImpl.java @@ -178,7 +178,7 @@ public class DeviceUnitServiceImpl extends ServiceImpl deviceUnits = this.queryList(new MapBuilder() - .put("seeI", 1) +// .put("seeI", 1) .put("projectSn", projectSn) .build()); List enterpriseIds = deviceUnits.stream().filter(o -> StrUtil.isNotBlank(o.getEpcContractorIds())).flatMap(o -> { @@ -188,7 +188,7 @@ public class DeviceUnitServiceImpl extends ServiceImpl(); } else { return enterpriseInfoService.list(new LambdaQueryWrapper() - .in(EnterpriseInfo::getId, enterpriseIds)); + .in(EnterpriseInfo::getId, enterpriseIds).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); } } else { //根据施工或epc单位查询epc承包商列表 diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java index 7bfc2f271..5f174fc07 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/EngineerControllerCheckServiceImpl.java @@ -59,7 +59,7 @@ public class EngineerControllerCheckServiceImpl extends ServiceImpl implements IUnitProjectDivisionApplicationService { @Autowired private UnitProjectDivisionApplicationMapper unitProjectDivisionApplicationMapper; + @Lazy + @Autowired + private IQualityAcceptanceService qualityAcceptanceService; + @Override public IPage queryPageList(HashMap param) { QueryWrapper queryWrapper = this.getQueryWrapper(param); Page page = PageUtil.getPage(param); - IPage pageList = baseMapper.queryList(page, queryWrapper,param); + IPage pageList = baseMapper.queryList(page, queryWrapper, param); pageList.setRecords(this.dealList(pageList.getRecords())); return pageList; } @@ -43,7 +53,7 @@ public class UnitProjectDivisionApplicationServiceImpl extends ServiceImpl queryList(HashMap param) { QueryWrapper queryWrapper = getQueryWrapper(param); - return dealList(baseMapper.queryList(queryWrapper,param)); + return dealList(baseMapper.queryList(queryWrapper, param)); } private QueryWrapper getQueryWrapper(HashMap param) { @@ -65,7 +75,7 @@ public class UnitProjectDivisionApplicationServiceImpl extends ServiceImpl map) { UnitProjectDivisionApplication e = new UnitProjectDivisionApplication(); - e.setProjectSn(FlowUtil.getString(map,"projectSn")); - e.setNo(FlowUtil.getString(map,"no")); - e.setDeviceUnitProject(FlowUtil.getPullDownLong(map,"deviceUnitProject")); - e.setDeviceUnitNumber(FlowUtil.getString(map,"deviceUnitNumber")); - e.setContractingMethod(FlowUtil.getPullDownInteger(map,"contractingMethod")); - e.setContractor(FlowUtil.getPullDownLong(map,"contractor")); - e.setEngineeringSupervisionUnit(FlowUtil.getPullDownLong(map,"engineeringSupervisionUnit")); - e.setEngineeringSubcontractor(FlowUtil.getPullDownLong(map,"engineeringSubcontractor")); - e.setRegionalProjectTeam(FlowUtil.getPullDownLong(map,"regionalProjectTeam")); - e.setDetailedList(FlowUtil.getJSONString(map,"detailedList")); - e.setContractorManager(FlowUtil.getPullDownLong(map,"contractorManager")); - e.setContractorManagerDate(FlowUtil.getDate(map,"contractorManagerDate")); - e.setRelatedProfessionalEngineer(FlowUtil.getString(map,"relatedProfessionalEngineer")); - e.setRelatedProfessionalEngineerSignature(FlowUtil.getPullDownLong(map,"relatedProfessionalEngineerSignature")); - e.setRelatedProfessionalEngineerSignatureDate(FlowUtil.getDate(map,"relatedProfessionalEngineerSignatureDate")); - e.setConstructionManager(FlowUtil.getString(map,"constructionManager")); - e.setConstructionManagerSignature(FlowUtil.getPullDownLong(map,"constructionManagerSignature")); - e.setConstructionManagerSignatureDate(FlowUtil.getDate(map,"constructionManagerSignatureDate")); - e.setProjectManager(FlowUtil.getString(map,"projectManager")); - e.setProjectManagerSignature(FlowUtil.getPullDownLong(map,"projectManagerSignature")); - e.setProjectManagerSignatureDate(FlowUtil.getDate(map,"projectManagerSignatureDate")); - e.setConstructionManagementDepartment(FlowUtil.getString(map,"constructionManagementDepartment")); - e.setConstructionManagementDepartmentSignature(FlowUtil.getPullDownLong(map,"constructionManagementDepartmentSignature")); - e.setConstructionManagementDepartmentSignatureDate(FlowUtil.getDate(map,"constructionManagementDepartmentSignatureDate")); + String projectSn = FlowUtil.getString(map, "projectSn"); + e.setProjectSn(projectSn); + e.setNo(FlowUtil.getString(map, "no")); + e.setDeviceUnitProject(FlowUtil.getPullDownLong(map, "deviceUnitProject")); + e.setDeviceUnitNumber(FlowUtil.getString(map, "deviceUnitNumber")); + e.setContractingMethod(FlowUtil.getPullDownInteger(map, "contractingMethod")); + e.setContractor(FlowUtil.getPullDownLong(map, "contractor")); + e.setEngineeringSupervisionUnit(FlowUtil.getPullDownLong(map, "engineeringSupervisionUnit")); + e.setEngineeringSubcontractor(FlowUtil.getPullDownLong(map, "engineeringSubcontractor")); + e.setRegionalProjectTeam(FlowUtil.getPullDownLong(map, "regionalProjectTeam")); + e.setDetailedList(FlowUtil.getJSONString(map, "detailedList")); + e.setContractorManager(FlowUtil.getPullDownLong(map, "contractorManager")); + e.setContractorManagerDate(FlowUtil.getDate(map, "contractorManagerDate")); + e.setRelatedProfessionalEngineer(FlowUtil.getString(map, "relatedProfessionalEngineer")); + e.setRelatedProfessionalEngineerSignature(FlowUtil.getPullDownLong(map, "relatedProfessionalEngineerSignature")); + e.setRelatedProfessionalEngineerSignatureDate(FlowUtil.getDate(map, "relatedProfessionalEngineerSignatureDate")); + e.setConstructionManager(FlowUtil.getString(map, "constructionManager")); + e.setConstructionManagerSignature(FlowUtil.getPullDownLong(map, "constructionManagerSignature")); + e.setConstructionManagerSignatureDate(FlowUtil.getDate(map, "constructionManagerSignatureDate")); + e.setProjectManager(FlowUtil.getString(map, "projectManager")); + e.setProjectManagerSignature(FlowUtil.getPullDownLong(map, "projectManagerSignature")); + e.setProjectManagerSignatureDate(FlowUtil.getDate(map, "projectManagerSignatureDate")); + e.setConstructionManagementDepartment(FlowUtil.getString(map, "constructionManagementDepartment")); + e.setConstructionManagementDepartmentSignature(FlowUtil.getPullDownLong(map, "constructionManagementDepartmentSignature")); + e.setConstructionManagementDepartmentSignatureDate(FlowUtil.getDate(map, "constructionManagementDepartmentSignatureDate")); baseMapper.insert(e); + + //添加到质量验收里面 + if (StrUtil.isNotBlank(e.getDetailedList())) { + Long deviceId = e.getDeviceUnitProject(); + List haveList = qualityAcceptanceService.list( + new LambdaQueryWrapper() + .eq(QualityAcceptance::getDeviceId, deviceId) + ); + JSONArray detailList = JSON.parseArray(e.getDetailedList()); + for (int i = 0; i < detailList.size(); i++) { + JSONObject jsonObject = detailList.getJSONObject(i); + Long currentId = null; + // 处理各级节点 + currentId = processLevel(projectSn, haveList, jsonObject, "field9876885180342", 0L, 1, deviceId); + currentId = processLevel(projectSn, haveList, jsonObject, "field7965485184055", currentId, 2, deviceId); + currentId = processLevel(projectSn, haveList, jsonObject, "field3241485188089", currentId, 3, deviceId); + currentId = processLevel(projectSn, haveList, jsonObject, "field8142185195371", currentId, 4, deviceId); + currentId = processLevel(projectSn, haveList, jsonObject, "field4526985201904", currentId, 5, deviceId); + } + } + } + + /** + * 处理单个层级的方法 + * + * @param projectSn + * @param haveList + * @param jsonObject + * @param fieldName + * @param parentId + * @param levelType + * @param deviceId + * @return + */ + private Long processLevel(String projectSn, List haveList, JSONObject jsonObject, String fieldName, Long parentId, int levelType, Long deviceId) { + String name = jsonObject.getString(fieldName); + + // 查找现有记录 + Optional existing = haveList.stream() + .filter(o -> Objects.equals(o.getName(), name) + && o.getLevelType() == levelType + && Objects.equals(o.getParentId(), parentId)) + .findFirst(); + + if (existing.isPresent()) { + return existing.get().getId(); + } else { + // 不存在则新增 + return addQualityAcceptance(projectSn, name, parentId, levelType, deviceId, haveList); + } + } + + /** + * 添加质量验收 + * + * @param projectSn + * @param name + * @param parentId + * @param levelType + * @param deviceId + * @param haveList + * @return + */ + private Long addQualityAcceptance(String projectSn, String name, long parentId, int levelType, Long deviceId, List haveList) { + QualityAcceptance accept = new QualityAcceptance(); + accept.setDeviceId(deviceId); + accept.setName(name); + accept.setNum(name); + accept.setProjectSn(projectSn); + accept.setParentId(parentId); + accept.setLevelType(levelType); + qualityAcceptanceService.add(accept); + haveList.add(accept); + return accept.getId(); } } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/SystemUserController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/SystemUserController.java index e50d13afe..685e602de 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/SystemUserController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/SystemUserController.java @@ -249,7 +249,14 @@ public class SystemUserController { }) @PostMapping(value = "/getProjectChilderSystemUserList") public Result> getProjectChilderSystemUserList(@RequestBody Map map) { - return Result.success(systemUserService.getProjectChildernSystemUserList(map)); + map.put(Cts.IGNORE_DATA_SCOPE, Cts.IGNORE_DATA_SCOPE); + List userList = systemUserService.getProjectChildernSystemUserList(map); + for (SystemUser systemUser : userList) { + systemUser.setPassword(null); + systemUser.setOldPassword(null); + systemUser.setShowPassword(null); + } + return Result.success(userList); } @OperLog(operModul = "账号管理", operType = "分页查找项目子账号列表", operDesc = "分页查找项目子账号列表") diff --git a/src/main/java/com/zhgd/xmgl/util/FlowUtil.java b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java index 9a070ff47..cb8b7cb48 100644 --- a/src/main/java/com/zhgd/xmgl/util/FlowUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java @@ -241,4 +241,18 @@ public class FlowUtil { return CollUtil.isNotEmpty(classs) ? Long.valueOf(classs.get(classs.size() - 1)) : null; } + /** + * 判断是否为空 + * + * @param obj + * @return + */ + public static boolean isBlank(String obj) { + Object parse = JSON.parse(obj); + if (parse instanceof List) { + return Optional.ofNullable((List) parse).map(m -> m.size() == 0 || m.get(0) == null || StrUtil.isBlank(m.get(0) + "")).orElse(null); + } else { + return false; + } + } } diff --git a/src/main/java/com/zhwl/zw/modules/base/service/impl/ZwLoginServiceImpl.java b/src/main/java/com/zhwl/zw/modules/base/service/impl/ZwLoginServiceImpl.java index 5c94c1686..c8936043d 100644 --- a/src/main/java/com/zhwl/zw/modules/base/service/impl/ZwLoginServiceImpl.java +++ b/src/main/java/com/zhwl/zw/modules/base/service/impl/ZwLoginServiceImpl.java @@ -67,16 +67,19 @@ public class ZwLoginServiceImpl implements IZwLoginService { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(MapUtils.getString(map,"account"), password)); String token=jwtTokenProvider.createToken(MapUtils.getString(map,"account"),60*60*24); - result.put("token",token); - result.put("userId",systemUser.getUserId()); - result.put("account",systemUser.getAccount()); - result.put("userTel",systemUser.getUserTel()); - result.put("realName",systemUser.getRealName()); - result.put("accountType",systemUser.getAccountType()); + result.put("token", token); + result.put("userId", systemUser.getUserId()); + result.put("account", systemUser.getAccount()); + result.put("userTel", systemUser.getUserTel()); + result.put("realName", systemUser.getRealName()); + result.put("accountType", systemUser.getAccountType()); return result; } catch (AuthenticationException e) { log.error("error:", e); throw new CustomException("Invalid username/password supplied", HttpStatus.UNPROCESSABLE_ENTITY); + } catch (Exception e) { + log.error("error:", e); + throw new OpenAlertException(e.getMessage()); } } } diff --git a/src/main/resources/excel/导出人员申请表模板.xlsx b/src/main/resources/excel/导出人员申请表模板.xlsx index f5769caaa88149fdaeca38352ce4b7085503ddf5..717ba636fd8104f48969df0167533f3138cc4179 100644 GIT binary patch delta 6546 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

-Q%%!ws#pNb#gV+DAP!gtazqVk!^eS{~%&r%8D8m%qvQd^|uw$Ju7~{d#?!$4M zQC~s^@cAPry6_*(G4W?p*6muYFeX?&xO7_mfK^edKjGdW<>pz5cK&L7d3t5upnuu3 z!YQz7n$o^@%W5)wx4CVgrEx?`cz1O9ez=fF(j{_}={$G?5Gia9+|QdQ9j6U`Cy&GCZ#vcR8{Z?U=sRPt+QW)6#*< zKa;6j%vho>PO5q}XyzLt#KweS5bCmhgO{h`@^*yG+0T1Dsn}!%Y;d|9UoN)1o~16K z8k-}CpPHl2b!DHsXRZDR2Fip+ z>UDpz>c_J>u)`Q9n}`DW7Enrzl?kqG4RX z1^>|IXEvYE=!`IBSwdwGM0Ar)OBe3WRg0d^Nb2-bW5wl&g~Db^-~3Sxl_}wH`e0C) zFLYs)ZZiJWge?cqxl7oRbnT5CSEA{FO4z&5AvrU zkCNW|^-e^52l{W|pT=^Q3cac96ENd@NK%R1;`x);M)Sd8j3jLB@hr-hpXz$v85oq-2F?C_TcYV4}q+o~dH3LcO`dK0*Sgwv0a*eVq}< zM>w2^YXEa*sZ7<;|G@92OyS0{hR)5r+Yi+bJ!sfb^UMe0MOb`;BUvAs29k=moPAe} z%SEgmH&_xnlWH61>WfGnyz>dz>xsUSJ52q)W>=V%iXL;f|5l&ZjZ7kE7hxwC>Ykaf zxHdS$B*N_T-LlMu9;x5|r978?-CAY@Zwp59#kSV5m`go0OU6NoA3Vz+FGeOx?XjJ+772~RG5320$mJUt8WkYk(b%}2LzU<|%*vLQ>lx}%w@a3MpU$^O7g_rjy zOJ$wbk?r|~WvAVd?z|!`lU;@Dfw(oYt?{<+D~?TzRR)FA_6q;EHg5_jW+gwQea*!2J9i$5Cn|Y{{*AO` zx{qKA#qY#S#=&bCMg|_0CRAPqKZ{@~u!)8LU~OONKmbaV^39oiF-L5!?g#NLTwOlcyvoWL>w@L{UP|JaI7MW(DtM%<<3>-ifAzhiA z869J`<(W5M>Z14FYSPu+DruGRr+uF~wal6J+C$|uI73MVDp_O*<~5^`c#829*}M9E ze#_|6B+KyABumKAB=@`zgfBwo)&!SHlcm(iGT2@p?i%4Il(@gI{UcPOcz#sM3Rf-k z*EfL~yBT6kuI%0oFXikwaY4W@C`FffYoM7?C)fr0IN|UnQR+Nw7>qB|F@eF~@fTg? z9BSlaTm%5rHk4)d1@ldD%(;~b=Zr%r`2AhV?^@XtQMK%ez887sm`Dl>@u+LV)T{1n zKy+e@#dW-Aw+(pm0sGkfR~I?*O$P5ee<({AwOT5JiL5(!URIDw7Tq-{<7Dw+mA~xPLMVlrT7nfY?N({(6|BinshAg1H52}YouN%qs+oPMx@OB zF}J;M8X925Um+NWZj91c$|{V~DhEh4?xm8alTkw#IJX2%5#%J41${cSabKfcH_=j= zl_;THQW~$NjhyI8lS3%Nh$5nyFFO_qhXr4x#OWbwYZzH-Yx*&`%Y`3^gkoIfRB`E+ zrgsB$F+?y|PcjwO2m-uU$Z6k)ojA+xJ861|P#~;6coT10_p!}|pXB*Kcw$d@kC7up z76vLwUk}kFr8F=x2z2n!>?I`&vLqvL7$wlnIhd7FT{L5rKcHOz zzx6O@h8UOXS(p$vo+^;OcV)vJ^>J0kmD2~77D9Q{SpClKl)J`53S`J$2HK!&5I0?! znfwi@y;Y(apPs{Wj>F#^hv%HXDX&QWvUsy0R|m|SJhUbpgBT{c*Y6I;r9`z)%ZNM` zg5F$9;`mNZxIFlr7O-6@h{wDzdf!EOaJ^f8pXT5EWwbg!QzOI#!2EO&F1^UT5+Tc7 zZ%4bykAM_IIqK?1#)UVTIVXWPVNpk=lEA^F+hv&GRbN8W-G~lY4h}zJ5;imRxcsn+ zGH1}`>EU8!BeNjQPs8Gln^B4&m2*Ot#o~xt{ME&L{1nwo6K^y|`Z=nu*MW}8jaqV) zj3+J|b1?R6xjZp0Fo@C;V2N28C+zU3Up5(q=}8hyHSxxaat531K=kXVHSydQRNX>vl6f34C(tn7LF z}AIbO@nwVOVe+hY5CWZ2JkE@lk$QHW5X?wi?j(6+XE4BXvVnfz5l9p*KlZNk3! zGsBY=YjaFYRQ&FI<8l5s?uu}3`b((eH<7^k?)s5m;!kd_e}Zh2hP`_cG(Nn!6#_1H z&uUh4?~gssfpt@9K_0~Lt$S}9HM%bW9)4$MC(`KOu@YpO*TsPw^pDv~egg)f-W-?7vo`jq&fHG= zZwliJ56GD?AjAr{IR+2x?s_rysfe}k-EM}SEw3h= zEae1T$TAF_BY2^^S_KY{4NNqYzlk}Gz)XN|(Ud?9pU_9f!yyb^+fz54(7m9>*`(%F zQoxINd8}4)qjr5`Mm<+Fh%g#v9Nx3tbrU-__7p_%Ml8tVX=4+23^=n>G4yF-fLguc z{CY48gz?eoU=I;x#BIxHW!6M&Ck}6`Teg#@YjJ(~CE4xz(*6^HGP_UBOL<8PZF)Wr zH6fogB%KA8t(p&(DRl1zo1ORlHqs~7c<+FWM_FGANW8Pe-vyQ7?>BY;>`I62I=cx zEp`qFfunl=Fkh+{EiZURYLdM*I^Q6_!TJ4A({j4Pe8Uk(SqN#bYh89cftODhRD54H z(6ai`K2z;{QaPP=d^MV|P^~n5+?qsouERso&$r#%UR|_MUH?#%8q8RhRlA;bTJ%b7 z&5<1R=oe50DR@C6CTR+udwiOTj-d#g9+`OpC6U(&G8!Nul)Qwlza)Z|v#=t889^YZ z6B{w~n1vk72t{XwqW|Zg0$Rk%kM!3-hpw^`BOoF|IT4AVSZu7QCeMcObJGt!W~YSe zv*CbMp|))NU=L_68wbUIOcPWP=&ud`cYr~(&k+&2%l4Au|34o7m)C%@unU3fpjPbs z;00(lI}^pt+_leV-+kBJ=d82$XP?4SOe=Fy00T?M7X~OGkPRvbLg2>JwSHdtWg-bE(YcT^967uI><|Cl-!;jm*q7%?-QP!`x!uj#;F)pkJ_XI#VM z^3dS#@xa8(N`B@0v|YvK#N`VegLn)Mse}DX+8@ZCo$nmi_6ilW;t22A?t|L5LA~U` z5S5GW{?Vy=*I!y!l+r*PJ^3W?_4dpAU-M<+`Aj6)o@j%=i^M6^oE&quzTnYw%#(51 z&3DiTbIO^zyd9qWT5*wxcW)$By=bu%ffdXq;ZkY5&z^3)PD_TZ%EqYLDbBh2uA7r} zt%@f2*P<;g-7mMB`z~P?)u%C)RvH%(loPh-MSSgGOu zU^$$9l+J~FFbKp5f$v~b!RNq~0OMC;Ut(138YxNTFs}ObDy80>ioCQao94aDe%x^Q z_}gD9^JDYF6~a~0j=J64G&61$?l9rEQ@le23fIFjMKW$KC2N-TxFl(#?{D9xoey6x z0?m>&D}_>e{XB^2aS6is19St9828gPO!$v)xCyi}D1_%!fkNSz-$L*E zA9h3y0#h%z2Xppd^;N<%Z#Bnm1U!O`G4^J_Iy-%4c5)wf=d0u&Q@0)L#F_9Lh?5a> zSWoZPZC9(`YqlICN;! z>mWP5g`?RJf*O%2Ib9m@`=vg2=+&+$9Sbp*+K6 zim{IP)wUC+|2a$3a_^6{6l-u-O55rq8G=0+%-Vfd>eJD3FC$Hx7*NUMyP}#sYJa6l zg4`UTdnHSx{+%oMxg)o5s4dJ9`LQ({q0N6$(JsgGb&I$c@eJymQ8Lwf-5im_lSE!> z4nAN0&cOx8;T9qM@!I2c5H5@u`wHz4-3Df1fO-|M*ybf|xiuPnR7}NWYbn_Aof3@% zPeXve^E)jXE*`hQArKXAk5|fn7!fXlAxi20<2wyTy~y`)=sP|CdsqaQKI)Pj_R@Ij zcO}*lJbhGr12(g9n^LM7n}YEEF853g5rwQlVVw-HCcM$k0UnJ3h0BfGe5RUNLkHCy zmaqks^^vVM^-VcoG&sAoRt$yvF%v9()j~CqrCJ)d@fwdi1Bxj}gz#4D`zY(EcqO!~ zHAi>y9P*F13$C;!If@r*2yng}nCg44MPoQ6>xQR4A~hIc*Bo`r6R6Y+!vzMr8;i&I zC=y)StACdAz1l_;9J!F{EdmsM%ZB>ig6`DC(aN^-&^MSp4Qdro7X?EItp2RTy+loe za`cdEkxs7*C@he@7F&M85|&(GI?4GIWUbVg3|HEn_|VCt*Hs%C0p{O%6$j?;Nv3$@ zrrVhQAUN|#(Yp)E*M$gJdc^Q5x?A(NTTSN-Xwa<9628G!{R@*~veZC&@fG6dS*Y8F zC%Tqj->d|9T1>K|^~&`+Ku){752y!F)BJD>vFQQF6riqXb zZ(c7u43F~;n{dPwmTgdcSXd1CkQ2S^P-2T4AeigCBOe$jY9vBH{Hx!?yEL75_^FKZ zk0a{lH(gZ%w0oCl5lCfgcODy<3iS&NMb>7GkrSH>ePcbJpX!b;lfF)ly_w>SR0~3x zW5F{8=HIP9AzGyiNcB`i_A+}|hwTzcA7Po|&L9Vw`LAb@9nAbov&b1{{?D_>UUq)S zEOL;YzkCKc#?EgxgY0ML=bJ%xv-1z<#%!)+GnFS|5VceE8Y*mQUq_Fc~LBoDv@+bncXqMFEAI zxd~nxJ;$Dp?7n*9kPsa>-g}U}PK=JyYGwB`t# z0S8+{nAFH(z(q2*K*CcL#PChC2+l1Mx7qT8ZkmqAoI}|0U9Oq~FaX+XWg8AQU`A zHjspfR`m|P+N#Zg)p*HR4jcE*$6^R1`Z7nv@SpM8X!F9Rt#aOUmDYW;KL|bPHGeT( zQMM*UTSbY3aqTlqLQ2e(?3X(L4LPoS^OLoT|DY>(EK?gW>@Qgfkt;1jY2=;DLs(y( za5|Ihw?`Lixx7K9aqTl0UyH5R&P11~RhhQ^R$O?V=iPWwv}@Y5jM1-XMRZqEf-aEb zBPXOvbk9(vZ&jxge_y_T<8b(=%WxIf=qP<0D!L$d|G2DbDo1XPdW`Bo+46NHM#MV_ zxj7Z4m|1baY0NlY^zi%%2Iudru08y$IGNZ#cMg<6%#?Iqv2v4*@qv|(M)PMwl^;Ev zp6JQX{L8{u;8VJ>*D7{J8K_rm>F~{daG-}xv(Vpqv zW>N`$?y{6`hd7tR96qV~qZy=QzylA9PX~n|k2?qf=KjN~w#!iU`661|4JQ@%AZz%U z)#PV(K`+Gdn5``}+7BpOY4lh2vmuQ-6TH|ub^9KCx5_lB%2vD5l`8Ryfo`(tgY6x0 z%T)|QKcWLmr`9g&gPz_$R>+R_kQ=x5UiIPEZ7==2yl@B^r34?@V6AyB+)x~a2;|kK zP)XKMzsyt!S24LI{O6?n&Al{Oc%gINEmo0L|&jr5J&V z?C*7HfmS}exZfu|;p@x?;xlp}W9MYR!BBd3xq<(s^MM=|(y6~)_aeiYs(fTYQW#0$ zU2>0u?`q!A-j;uB^a6&e%E>d%9$o6F6ji<&P2QfcA(u5#5V=BhM}`TXI#O`wSDUlp z_f)Wl^oSM8RchQ=?D8HM$sJ#RTPd_1tT;D4GEn9564J0$Y9cdlA@`G?8IJ=pBO_GA z^L$+Nvoy7))ddfTKULlNw0qaomSt<*6C&~Q@@<~9_m#6B?!Rn#anU7RTEA$P(z^6R z!i@K7l_Kls%8u{ZdNBIsrY!a@E!}>=$=c1qCII@s(T*mmp^L`_fm9qpApC~}+~0-I z%R9iu){7T-D0cQ#Z7n7 zxqOnWDM8@O3sx3CEta*cBOWMMyOhN=fxviX_wyXbGPG~dhgv52HrXZhJO2g;|DERz+Y9V({Fe9_~(*ZP&0pV@`1%-?dYRUYyYt~TsQr-jHAyGy;@_)#kI*@UF-}+7>?7YGf6jlLs*0`5qGv)Wnr>+P*`zec1@8h`X1rlkhT zPn(X?P9Fso!(O7SSR_8}0w?W-!8ea z$ka01v+P3rlQtP)P!Dx{?PBFzJdNygc39&>^riN#&SibPjF?|7)t!Ha0k4UP*t(Fz zJ?9BWyeV>s543YsD8H0q#6ax&3pxWj%@b3ce6`6vtiu;Nh4Wb# zb^%H~Bl4_zuyq-MK}2+YgrfD?^Yh%xt>+v^N?JT=dxF?i_?>E&a$|%WiIZ)Pv5o1)uT(#(Ijc#aOwzr3A{Z$3XQT>Xa@x)z zsA@g{ES^7EoeIl}m3Ty-23e|IvU2s2D4R%eF%&_<63U!Kj=$2va<0lJre7rRXzmE7 z**p6+BSZ*q)3gF|80Qs)QtVS;C&z(>znw(5&g^QY^$`8Xdz0To)g9}%4a0PYGQZT^ zaapwLmWVhbj10?c=FySo>1%+UrkQJI@-5;6)wH>4=2kxY^@OSU%YQU9RFhI|;|`_b zKYQ=g#^QD>SblmFb6ij0aba_n{i9Q-M*Utepf>(5K<}M;QO1HzhwEPJ-l;{j*0FKU z7n|wVIkPjglp%y}ERRl>lD-9=6E&9A0#67hYU@RVib5@5S0DoQaK%G47E4D$qobK> zKL_7MaGA@o9(_Q4TY)Z<@#S{p+gRmcTKs5ZeM(X#kC)%FrWuIsfx#?}Kh=XoxQ9f9j=cNSB9YUz?>}0cX))zWfipB5S2DJNfx^S8X z#%3t?pgOA8<0kIh#_hvC#%oWK!@`D3>;(O6&9zJ^htLY+#ZYFE1Z zkMFM>8r;RHZ*ygT8THx$Ie+GfsVU^~21?Ks;v^K8p8jGqvcOJ0Hx!WDxT?VmhbmJ?(X{T86j3gqH!g5TVUyG^CxhggHzlLIgMLsd;{$x;yMa_?@+#qFD6aV}JUA7OON6eZ73H&IOHFyPNNUm53xtl+4y>HVfI&~UY0$1 zm;N9gY@Gj^IRD3_eC_WlWHS4Fn`0G+!HlP$*euV!yWytG zb86n&LYj@TGFc^7To(`{iRKtPc`jg1;^zI{JNM24${FD#PZ|_dB?2X{Bad861P@-9 zH?JrJOou_ARry5`eaT7h(4Mli-Cn>+-kxYXj6Wt0(r z7yolEN-N67by9&^eoJ=T!iIb1G(gz%Ne#d>OkNS~-TMsu*t(bBZHSX^1^7buOp1eg zZ6%(kw_3iv!1P;(@plG_3M2bb&TE=aLQrPJ3O>BA|Cv@Zt|v2V(_ZP|Da9y{*_S7O zPVeaVk)z5Xp;@8gG7QP=EA{I~t38{9iwfa0^ciUW9N^~V*b31>thtuk-M;ywVZisO z-5phcgY{|L6PO4xH_UzW1~4b=Nd$q7WvrgfNWNvP8z(^k#e7#7n=hSKe6kt> z94+Y^X9g8Ewq)9%58I?;eJYz+r>|&WBiTF6C@%m_qE) zk;F~WASzP3pAwbPRk0B0D>B#h*B_U*$5-|9qdf=gqt71{FUGH;IBk^AmFes0>*S4^qv z0Vr8L;Oe+zp=xhzp*Ku}!Z?&;Ki`H#cAl66!PKMVbdUR4pY^_Vx^y1P zOf8Pt#2FmLE%-cS+hV{^g+yQsILWB>`I|yezy>DEv82Ecz zf!{P6nzMz_nFkGZfG|~@e%NXy-f1RoB1xpN*fL|1QkLp9ab9(TBj3>gHyu4z=!eg7aGA^xusAN;n&=ZwEu9}AQ0uhLH|KDgW(6*WN=L$KGZ|(hevAo XJ02+N5-xlZmm0pn1Ho|Q{EPn|_&iTm