From 3ea38f4805998744002ed4706c986543f1a67c8d Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Thu, 18 Sep 2025 18:39:42 +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 --- .../BigDeviceDriverRecordServiceImpl.java | 49 ++++++++ .../mapper/BridgeCraneAlarmMapper.java | 2 + .../mapper/xml/BridgeCraneAlarmMapper.xml | 15 ++- .../mapper/xml/BridgeCraneDataMapper.xml | 2 +- .../service/IBridgeCraneAlarmService.java | 2 + .../impl/BridgeCraneAlarmServiceImpl.java | 5 + .../impl/BridgeCraneDataServiceImpl.java | 1 + .../controller/RiskListSourceController.java | 3 + .../RiskListSourceDataCenterController.java | 1 + .../risk/mapper/xml/RiskListSourceMapper.xml | 3 + .../video/controller/VideoItemController.java | 38 +++++- .../worker/entity/WorkerExitConfig.java | 22 ++-- ...rityQualityInspectionRecordController.java | 17 +++ .../java/com/zhgd/xmgl/task/WorkerTask.java | 114 ++++++++++-------- .../videoitem/监控点导入模版(萤石云).xlsx | Bin 11282 -> 11293 bytes .../resources/excel/风险点清单导出模板.xlsx | Bin 9630 -> 9184 bytes 16 files changed, 210 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/bigdevice/service/impl/BigDeviceDriverRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/bigdevice/service/impl/BigDeviceDriverRecordServiceImpl.java index 27dd45375..906965b48 100644 --- a/src/main/java/com/zhgd/xmgl/modules/bigdevice/service/impl/BigDeviceDriverRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/bigdevice/service/impl/BigDeviceDriverRecordServiceImpl.java @@ -1,13 +1,24 @@ package com.zhgd.xmgl.modules.bigdevice.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.xmgl.modules.bigdevice.entity.BigDeviceDriverRecord; import com.zhgd.xmgl.modules.bigdevice.mapper.BigDeviceDriverRecordMapper; import com.zhgd.xmgl.modules.bigdevice.service.IBigDeviceDriverRecordService; +import com.zhgd.xmgl.modules.worker.entity.WorkerCertificate; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.service.IWorkerCertificateService; +import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Description: 塔吊升降机驾驶员记录 @@ -17,6 +28,13 @@ import java.util.List; */ @Service public class BigDeviceDriverRecordServiceImpl extends ServiceImpl implements IBigDeviceDriverRecordService { + @Lazy + @Autowired + private IWorkerInfoService workerInfoService; + @Lazy + @Autowired + private IWorkerCertificateService workerCertificateService; + @Override public void saveBigDeviceDriverRecord(List driverList, String bigDevId, String projectSn, int type) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -25,7 +43,23 @@ public class BigDeviceDriverRecordServiceImpl extends ServiceImpl 0) { + List workerIds = driverList.stream().map(BigDeviceDriverRecord::getWorkerId).collect(Collectors.toList()); + Map workerMap = workerInfoService.list(new LambdaQueryWrapper() + .in(WorkerInfo::getId, workerIds)).stream().collect(Collectors.toMap(WorkerInfo::getId, Function.identity(), (o1, o2) -> o1)); + Map certificateMap = workerCertificateService.list(new LambdaQueryWrapper() + .in(WorkerCertificate::getWorkerId, workerIds)).stream().filter(t -> getCerType(type, t.getId())).collect(Collectors.toMap(WorkerCertificate::getWorkerId, Function.identity(), (o1, o2) -> o1)); for (BigDeviceDriverRecord deviceDriverRecord : driverList) { + WorkerInfo workerInfo = workerMap.get(deviceDriverRecord.getWorkerId()); + if (workerInfo != null) { + deviceDriverRecord.setDriverName(workerInfo.getWorkerName()); + deviceDriverRecord.setDriverIdCard(workerInfo.getIdCard()); + deviceDriverRecord.setDriverPhone(workerInfo.getPhoneNumber()); + deviceDriverRecord.setImageUrl(workerInfo.getFieldAcquisitionUrl()); + WorkerCertificate certificate = certificateMap.get(deviceDriverRecord.getWorkerId()); + if (certificate != null) { + deviceDriverRecord.setCertificateNumber(certificate.getCertificateNumber()); + } + } deviceDriverRecord.setProjectSn(projectSn); deviceDriverRecord.setType(type); deviceDriverRecord.setDevSn(bigDevId); @@ -33,4 +67,19 @@ public class BigDeviceDriverRecordServiceImpl extends ServiceImpl { Integer countAlarmNumToday(HashMap paramMap); + Integer countAlarmNumYesterday(HashMap paramMap); + /** * 统计昨日报警次数 * diff --git a/src/main/java/com/zhgd/xmgl/modules/bridgeCrane/mapper/xml/BridgeCraneAlarmMapper.xml b/src/main/java/com/zhgd/xmgl/modules/bridgeCrane/mapper/xml/BridgeCraneAlarmMapper.xml index 8106ed474..150692a3d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/bridgeCrane/mapper/xml/BridgeCraneAlarmMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/bridgeCrane/mapper/xml/BridgeCraneAlarmMapper.xml @@ -15,14 +15,14 @@ + diff --git a/src/main/java/com/zhgd/xmgl/modules/video/controller/VideoItemController.java b/src/main/java/com/zhgd/xmgl/modules/video/controller/VideoItemController.java index 241f8c0f3..fcfb074fe 100644 --- a/src/main/java/com/zhgd/xmgl/modules/video/controller/VideoItemController.java +++ b/src/main/java/com/zhgd/xmgl/modules/video/controller/VideoItemController.java @@ -575,6 +575,7 @@ public class VideoItemController { if (list == null || list.size() == 0) { throw new OpenAlertException(MessageUtil.get("excelNotDataErr")); } + checkExcel(list, videoType); Map groupMap = videoGroupService.list(new LambdaQueryWrapper() .eq(VideoGroup::getProjectSn, projectSn)).stream().collect(Collectors.toMap(VideoGroup::getGroupName, Function.identity(), (o1, o2) -> o1)); ProjectVideoConfig videoConfig = projectVideoConfigService.getOne(new LambdaQueryWrapper() @@ -586,7 +587,6 @@ public class VideoItemController { } List videoItems = new ArrayList<>(); List sucList = new ArrayList<>(); - List failVideoList = new ArrayList<>(); List failGroupList = new ArrayList<>(); for (Map importInfo : list) { VideoGroup group = groupMap.get(importInfo.get("*视频分组")); @@ -619,11 +619,45 @@ public class VideoItemController { videoItem.setAiVideoUrl(aiVideoUrl); videoItem.setDefaultStreamType(defaultStreamType); videoItems.add(videoItem); + sucList.add(videoName); } videoItemService.saveBatch(videoItems); - return Result.ok(StrUtil.format("导入完成。导入成功:你好,阿爸{};导入失败:嘉兴、囧扥就(),军方,周邓个(){}")); + StringJoiner joiner = new StringJoiner(";"); + if (sucList.size() > 0) { + joiner.add("导入成功:" + StrUtil.join(",", sucList)); + } + if (failGroupList.size() > 0) { + joiner.add("导入失败(分组不存在):" + StrUtil.join(",", failGroupList)); + } + String result = "导入完成。" + (joiner.length() > 0 ? joiner.toString() : ""); + return Result.ok(result); + } catch (OpenAlertException e) { + throw e; } catch (Exception e) { throw new OpenAlertException("导入excel失败", e); } } + + private void checkExcel(List> list, Integer videoType) { + for (Map map : list) { + String videoName = map.get("*设备名称"); + String serialNumber = map.get("*监控点"); + String group = map.get("*视频分组"); + String verificationCode = map.get("*通道号"); + if (StrUtil.isBlank(videoName)) { + throw new OpenAlertException("设备名称不能为空"); + } + if (StrUtil.isBlank(serialNumber)) { + throw new OpenAlertException("监控点不能为空"); + } + if (StrUtil.isBlank(group)) { + throw new OpenAlertException("视频分组不能为空"); + } + if (Objects.equals(videoType, 1)) { + if (StrUtil.isBlank(verificationCode)) { + throw new OpenAlertException("通道号不能为空"); + } + } + } + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java index c8f7b55f6..84e91dd9d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java @@ -1,17 +1,15 @@ package com.zhgd.xmgl.modules.worker.entity; -import java.io.Serializable; -import java.util.Date; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; -import org.springframework.format.annotation.DateTimeFormat; -import org.jeecgframework.poi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; /** * @Description: 人员退场配置 @@ -62,10 +60,16 @@ public class WorkerExitConfig implements Serializable { @ApiModelProperty(value = "人员未打卡超过n天系统自动将人员退场") private java.lang.Integer exitIfAbsenceDay; /** - * 是否将此处退场人员拉入黑名库1是0否 + * 拉黑时是否退场1是0否 */ - @ApiModelProperty(value = "是否将此处退场人员拉入黑名库1是0否") - private java.lang.Integer enableBlack; + @ApiModelProperty(value = "拉黑时是否退场1是0否") + private java.lang.Integer enableExitWhenBlack; + /** + * 1将此处人员清除全部通行闸机授权2将此处人员退场3将此处人员拉入黑名单库 + */ + @ApiModelProperty(value = "1将此处人员清除全部通行闸机授权2将此处人员退场3将此处人员拉入黑名单库") + private java.lang.Integer exitType; + /** * 创建时间 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java index 6be5d9957..fa3f8ece7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java @@ -803,6 +803,23 @@ public class XzSecurityQualityInspectionRecordController { } } + @ApiOperation(value = "批量删除安全检查记录", notes = "批量删除安全检查记录", httpMethod = "POST") + @ApiImplicitParam(name = "ids", value = "安全检查记录ids(多个,分隔)", paramType = "body", required = true, dataType = "String") + @PostMapping(value = "/deleteBatch") + public Result deleteBatch(@ApiIgnore @RequestBody Map map) { + Result result = new Result<>(); + String ids = MapUtils.getString(map, "ids"); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + for (String id : Arrays.asList(ids.split(","))) { + qualityInspectionRecordService.deleteQualityInspectionRecord(id); + } + Result.success("删除成功!"); + } + return result; + } + public String getStatusText(Integer status) { if (status == null) { return ""; diff --git a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java index ebba7066b..300c2c25a 100644 --- a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java +++ b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java @@ -41,7 +41,10 @@ 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.*; +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.xz.security.entity.XzSecurityInspectTaskItemRecord; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityInspectTaskRecord; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord; @@ -56,7 +59,10 @@ import com.zhgd.xmgl.modules.xz.service.IXzWorkerSafeWatchAlarmService; import com.zhgd.xmgl.modules.xz.service.IXzWorkerSafeWatchConfigService; import com.zhgd.xmgl.modules.xz.service.IXzWorkerSafeWatchManagerService; import com.zhgd.xmgl.modules.xz.service.impl.XzCertificateExpireAlarmRecordServiceImpl; -import com.zhgd.xmgl.util.*; +import com.zhgd.xmgl.util.Base64Util; +import com.zhgd.xmgl.util.ElecardUtil; +import com.zhgd.xmgl.util.MapBuilder; +import com.zhgd.xmgl.util.NumberUtils; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.lang3.StringUtils; @@ -75,8 +81,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.ZYMQTT; - /** * @program: wisdomSite * @description: 劳务人员定时任务 @@ -585,7 +589,7 @@ public class WorkerTask { } List alarmUserIds = getAlarmWorkerIds(record); Integer safeWatchAlarmExceedMinute = record.getSafeWatchAlarmExceedMinute(); - if (safeWatchAlarmExceedMinute >= minute) { + if (safeWatchAlarmExceedMinute != null && safeWatchAlarmExceedMinute >= minute) { Integer mod = NumberUtils.mod(safeWatchAlarmExceedMinute, minute); if (mod == 0) { HashSet noticeUserIds = configIdToNoticeUserIdsMap.get(config.getId()); @@ -1020,54 +1024,64 @@ public class WorkerTask { @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()); + try { + 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.getExitType(), 3)) { + 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(config.getEnableExitWhenBlack()); + workerBlacklistService.addWorkerBlacklist(workerBlacklist); + } + } else if (Objects.equals(config.getExitType(), 2)) { + workerInfoService.updateWorkerExit(new MapBuilder() + .put("workerIdStr", exitWorkers.stream().map(w -> w.getId() + "").collect(Collectors.joining(","))) + .build()); + } else if (Objects.equals(config.getExitType(), 1)) { + for (WorkerInfo worker : exitWorkers) { + worker.setUfaceDevId(""); + worker.setUfaceDevGroupId(""); + workerInfoService.editWorkerInfo(worker); + } + } + } catch (Exception e) { + log.error("更新人员自动退场错误", e); } - } catch (Exception e) { - log.error("更新人员自动退场错误", e); } } + } catch (Exception e) { + log.error("更新人员自动退场错误", e); } } } diff --git a/src/main/resources/excel/videoitem/监控点导入模版(萤石云).xlsx b/src/main/resources/excel/videoitem/监控点导入模版(萤石云).xlsx index 765c9f9b036c36a05528896c5d8b4ceb4683bd52..6fa16a183b8ef89d1832754c13d1affcbc119490 100644 GIT binary patch delta 1918 zcmV-^2Z8vKSe;m~y8#5FmcIy-zX2bAO-{ow5QX~};4ldBkJo~h z=Ff&k={aR)_odtE5Vy}3ycIk5&Sagjs;ZzGG%;NM5I@du@0(TqOx3sIfYMlS$~7=s z=ya*Js;E?qd$sz0IWud*V%f>aDK)d1<0%=U8zRyE=;4Dw&c#YD2~iF(q;iOVmP%!z=gDYE z5-eSwkra03TqIb*t5|q469mV`C}CdEZuh(d(-c{TP;A4&=W`m7LmsUYk}69g2*V2W z%O%ZZ$#xxY#TN^lL#(Bq4T*<#r{eQ>8u}6%2`>3uxe-r1E3Fyjp0`(vGl?2Rze!et z#cG{B2I35Yn^8v9jS07Z6hzcdo;=UpJd$)HKbxaAGpYYo;cgJ*Tl+4$&TeD%YOy{DjcOQh}6? z+ts8IXTSizPC|7vBPYSvR;jh_yFpjC^9_SehV95?rJy!}SH?kM+<`EyvEO%h``eoD z6z1?O%sV}|x3zb0W2E;h^Pul`w)PG)Ys}$Uc<%;ou(dfP*_gw#FyF?zXVY&As~c@J z5IlEa2&+WfvYG{dUA9iwl*1OGswLDX!}>h&!#(JyNHduB86v0&m`PZ@8np-B6|_!N zAjZ1EfN}%j*AbH@BB&z{n}|*wanwZY)DcsQ*i_oBBaWMhULA4LMD*(j7*ZYWrkC9c z;X&HVp|W*|p&FN%QF!W8(uw#wg+z8Ck@YP{-DEHsj7o)n9LyNc#|)<{Q!%;Z`DvQ1 z)ftfzFYEy6#UmlOs4dz-9|z&sZ}04O`#o@^?}0VL{^;BL+wbq*etv!X_2a8Yt%I<2 zFz~9)fmavQ5csd6j)L&06s6CxL+?5cMC4BRP{(y6< z+a-7HY&)WUV$RJefgK^hfH4Rm&Pdqc13|aouUUJye_@Z|5^hV3`i0oEm)z5*@AJOx z)0%UyJ=a*oe~denSRgr*00t&$nsG?h0?(hN?mhwr7dFY*E+yCkZ!iaQXzGs1xiIuv z!Yz;!B0mcuPv@{_^BJ1QM9;jW%(I35Wm(Ac4BHu=!&rDOyq8Ekgr4mXV5Dh*2(9}V z7zN_ID&Qw00GZrDra-b=leG&I3S`0vi3ZdCss8Y{6~?0N>h(zgk(s70Wd_T>us}+; zgl>~B6&ZhuDbVy#EE4&>PNedeI$^6aI9!v}O3-^hlDs7~{_&=T?H}^!gY;K|*6D34 z=7ur;;lP63HMQCb-hKaH3mh!%42tWc>!$5LvZFx56AsRLvbj9mfM3^9AXV>3|FbM# zsK&?ng|JhR)noZ-KP+9wnez+U@T%!wo4;`?_m)uNoI$T1wvS|OQ=J#%bE^4OHM(PH zy%UG}-+IA8aY6*SvLVaoak@@_3_9^AM+p4VgdAk~i`pJbBPgAysxM2mcyzUO(C>C{ z#DV%zMLz+v7#4dG0?;Ls;UyK5swXN0DkA^@lWr*%lkO)P0Zx+%D3b)EmcIy-peV-y zc9Uo+HUXWJpD8UH>2Muf*8uyw)*Kmj9@+$vrPzsY04a{~YXk&{C!R|0_ulaUA-leQ}=0bP^fD=P+cCjbBd E00h#IZ2$lO delta 1900 zcmV-y2b1`nSdv(WWH8qyn+C z>}eY{aU$E0_6V$5au9BW#4T`=HlzZv^!z_>{)`;Wc17;IfYMnhW8`}TIUso{GP#b? zGM&3qdBV0kGaMtjg`mYknOyrR5RaHq-&l*vFlmLxUhRg5;qR1{;)H&8Ht?OBJk z;;K{yGxn+0xMFa5a1@FY(z0+B5tn1pV!#0M^@8ieC?R~qdo5|)@98eMoPPqbR zN|h|-R+hDl@SxV*FK5~;?5S5&8HlTW^7;Dq_5Kmz--?B`**hW#$EKlO_M`F;Uf-m1 zlmsLQToSm!C?ywk98yA_n!zXiO}eg79LE1o9J}PwCDW8l=qRNAXh1vyk~a70k4U}& zvoHg;0SQmNRv2dk002Le?*t)#%Wl*#6x}2755byklS$^)Mw6*J(@xt3Qbl>J-NZ9v z)ro`cXe&=bn3fA9lw3*C}(Zh>(^%Q4TOKRIw2tf8-H0TT8{$L#!~Gj7{Yq z^xT0ajX47bcseQ7#f+R3Ut6WtdgKNJUCuWQDjAkz6P1$M=&Fr_(zplPw8s9(-5qUf z-Y?BzEX{jEceu58aATy8YV%;^_O|v8J!{NiEWHl`H`v-7f^5uTEX}v^?%D90#Ogwu zj0G+sHmzoVLZ_`aFzK*KsB;PV$+139{BRHIDb@@Jx_lx8IRP^XvsaVu*t>$# ziA%)PA|P8e!fzsGZA8#S9JUd?Cc>042;cD1ZzASxrGqBoxQ!S#5hrcLsEL3k{WBiB zHNu0iS50N}kU%z`V@6@rr=%0}bp~PTLm-<=j=IUAGZ>YB3OSfDUQ8LzE=|VdiWjF@ zzE+Qklz3?yNKYOK!9`=zHu^LOr+&A;I~WbYk-i7k4EvKGAK(1^@c!%DH{UHtV{vq#=%)>#RLzO+oVo9N78CgKZc3n6Sg+27myW+W-h4b=) zE4bmRuNC}g5I8xyE;Q?cb5(u7HKBRWiCX7Qj&mZ;=_^~zTu}I>Fg+5XoC_r|Rr+4B zWOKu!@2>jSXYvcPfe5Dy3CX^Lf!F~606LQ~6dQldRAFn=Kp6fm>_3G2IB?ghh>qmO z5DNR|2mJxDJ=;KXSMRPv{j^$Jt7B`%*w$@bH^#8ySi5}~)0X*bdYANHcv)v*X+czw z9Z4Y1J@-8Cn|m(i+-uJ@7BS-vB^F4|B!GcQnr0l5wZQXdsk@JW!G%pSwo3`Nz#GiL z9GZW+V{$GGy_RqbFcR}@VCaI?dtVO0Fjxd zE@cMGzOX<_kAxl(%uBQ!|M;VY?H}^!gY;K|*6D3)=0-67VZ(ymHMQCb-hH3g;QtHGU}kMj#*ry{Gz^3#4;x{NdD7j!OF)4$GW z<5W@ZEyX#5UOj9d$=aqmFUIFo^Q&rf$IyBw4)wqFf`j4&1-Y^z%ja>rE`JO<@h2+; zerZAtviwDDkChRWPE^&GrCMBFZ5{Nx-5WYk|NGESvm+LJ5dp=MpC>>8ACurGGXX=B z6eyDf1Ncq1ldCAl0c(?UDK-I;ld35#8_B+df!F~606GN#02BZK000000096X0000E zlkzD+4S^T{0C;RKb98xZWpk6UCm@qxDh>g-lW!_E0pF9RDnJ1kljka42~WLN7-s_j m06&vXD^~(_2$Nwe6_dOxF9J~tlVK|rlL9Oi25Bb%0000o#EHcK diff --git a/src/main/resources/excel/风险点清单导出模板.xlsx b/src/main/resources/excel/风险点清单导出模板.xlsx index 5b6faae185922a8abe4095bf41f02ed572d53475..1b990ff16ab0bb4633d8557173fb6f312c5579d2 100644 GIT binary patch delta 5308 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 delta 5736 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