From 62f4aa40963ae30e84651f90796dbb37753424a9 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 17 Jun 2025 10:53:42 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A3=8E=E9=99=A9=E7=82=B9=E3=80=81=E5=8D=B1?= =?UTF-8?q?=E9=99=A9=E6=BA=90=E3=80=81=E6=9C=88=E5=BA=A6=E3=80=81=E9=9A=90?= =?UTF-8?q?=E6=82=A3=E6=8E=92=E6=9F=A5=E3=80=81=E6=8E=92=E6=9F=A5=E6=89=A7?= =?UTF-8?q?=E8=A1=8Cbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RiskListMonthlyController.java | 17 ++++++ .../controller/RiskListPointController.java | 11 ++-- .../controller/RiskListSourceController.java | 56 ++++++++++++++---- .../modules/risk/entity/RiskListSource.java | 8 +-- .../risk/mapper/xml/RiskListDetailMapper.xml | 3 + .../resources/excel/辨识清单导出模板.xlsx | Bin 11292 -> 11179 bytes 6 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListMonthlyController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListMonthlyController.java index 30b50f6b9..601be5fe8 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListMonthlyController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListMonthlyController.java @@ -23,6 +23,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -146,4 +147,20 @@ public class RiskListMonthlyController { return Result.ok(); } + + @ApiOperation(value = "批量删除月度清单", notes = "批量删除月度清单", httpMethod = "POST") + @ApiImplicitParam(name = "ids", value = "月度清单ID字符串(多个以,分割)", paramType = "body", required = true, dataType = "String") + @PostMapping(value = "/deleteBatch") + public Result deleteBatch(@ApiIgnore @RequestBody HashMap paramMap) { + String ids = MapUtils.getString(paramMap, "ids"); + Result result = new Result<>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + riskListMonthlyService.removeByIds(Arrays.asList(ids.split(","))); + Result.success("删除成功!"); + } + return result; + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java index 34d457c36..416826d43 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java @@ -319,10 +319,13 @@ public class RiskListPointController { .eq(StrUtil.isNotBlank(monthlyId), RiskListPoint::getMonthlyId, monthlyId) ).stream().map(RiskListPoint::getId).collect(Collectors.toList()); int pointCount = (int) pointIds.size(); - int sourceCount = riskListSourceService.count(new LambdaQueryWrapper() - .eq(RiskListSource::getProjectSn, projectSn) - .in(StrUtil.isNotBlank(monthlyId), RiskListSource::getPointId, pointIds) - ); + int sourceCount = 0; + if (CollUtil.isNotEmpty(pointIds)) { + sourceCount = riskListSourceService.count(new LambdaQueryWrapper() + .eq(RiskListSource::getProjectSn, projectSn) + .in(StrUtil.isNotBlank(monthlyId), RiskListSource::getPointId, pointIds) + ); + } CountRiskNumVo vo = new CountRiskNumVo(); vo.setRiskPointNum(pointCount); vo.setHazardSourceNum(sourceCount); 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 bb5a46bce..9a5b785ee 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 @@ -12,17 +12,16 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gexin.fastjson.serializer.SerializerFeature; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.execption.OpenAlertException; -import com.zhgd.xmgl.modules.risk.entity.RiskListDetail; import com.zhgd.xmgl.modules.risk.entity.RiskListPoint; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; import com.zhgd.xmgl.modules.risk.entity.vo.RegionV2Vo; +import com.zhgd.xmgl.modules.risk.entity.vo.RiskListDetailVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo; import com.zhgd.xmgl.modules.risk.service.*; @@ -283,7 +282,7 @@ public class RiskListSourceController { * @param param * @param dir */ - public void generateRegionQrCode(HashMap param, String dir) { + private void generateRegionQrCode(HashMap param, String dir) { String projectSn = MapUtils.getString(param, "projectSn"); List regionIds = StrUtil.split(MapUtils.getString(param, "regionIds"), ","); List regionV2Vos = regionV2Service.queryList(new MapBuilder() @@ -291,8 +290,8 @@ public class RiskListSourceController { .build()); regionV2Vos.stream().filter(regionV2Vo -> regionIds.contains(regionV2Vo.getId() + "")).forEach(regionV2Vo -> { // 1. 创建空白图片 (白底) - int width = 600; - int height = 800; + int width = 1200; + int height = 1067; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); @@ -308,7 +307,7 @@ public class RiskListSourceController { String title = "【" + regionV2Vo.getRegionName() + "】风险分级管控清单"; Font titleFont = new Font("微软雅黑", Font.BOLD, 48); g.setFont(titleFont); - g.setColor(Color.BLACK); + g.setColor(Color.BLACK); // 标题保持黑色 // 计算标题居中位置 int titleWidth = g.getFontMetrics().stringWidth(title); @@ -318,8 +317,9 @@ public class RiskListSourceController { // 3. 绘制小号字体居中说明文字 String description = "区域:" + regionV2Vo.getFullPath(); - Font descFont = new Font("宋体", Font.PLAIN, 28); + Font descFont = new Font("宋体", Font.BOLD, 32); g.setFont(descFont); + g.setColor(Color.BLACK); // 说明文字保持黑色 // 处理多行文本 String[] lines = description.split("\n"); @@ -333,9 +333,27 @@ public class RiskListSourceController { } // 4. 生成并绘制居中二维码 - int qrSize = 200; // 二维码尺寸 + int qrSize = 600; // 二维码尺寸 int qrX = (width - qrSize) / 2; - int qrY = startY + (lines.length * lineHeight) + 50; + int qrY = startY + (lines.length * lineHeight) + 100; + + // 计算虚线位置(在描述文字和二维码之间) + int dashY = startY + (lines.length * lineHeight) + 25; // 位于文字和二维码中间位置 + + // --- 虚线颜色修改在这里 --- + g.setColor(Color.GRAY); // 将绘制颜色设置为灰色 + // --- 虚线颜色修改结束 --- + + // 设置虚线样式(10像素实线 + 10像素空白) + Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, + 0, new float[]{10, 10}, 0); + g.setStroke(dashed); + g.drawLine(0, dashY, width, dashY); + + // 恢复实线样式和黑色(避免影响后续绘制,如二维码如果还有边框等) + g.setStroke(new BasicStroke()); + g.setColor(Color.BLACK); // 恢复黑色,因为二维码默认是黑色的 + // --- 虚线绘制结束 --- // 使用Hutool生成二维码图片 QrConfig config = new QrConfig(qrSize, qrSize); @@ -349,9 +367,15 @@ public class RiskListSourceController { g.drawImage(qrImage, qrX, qrY, null); // 6. 保存图片 - File outputFile = new File(dir, description + ".png"); + // 确保目录存在,否则可能报错 + File outputDir = new File(dir); + if (!outputDir.exists()) { + outputDir.mkdirs(); // 创建所有不存在的父目录 + } + File outputFile = new File(outputDir, regionV2Vo.getFullPath() + ".png"); ImgUtil.write(image, outputFile); + // 释放资源 g.dispose(); System.out.println("模板图片已生成: " + outputFile.getAbsolutePath()); @@ -367,14 +391,15 @@ public class RiskListSourceController { @PostMapping(value = "/identifySource") public Result identifySource(@RequestBody @Validate HashMap param) { List addList = new ArrayList<>(); - List details = riskListDetailService.list(new LambdaQueryWrapper() - .in(RiskListDetail::getId, StrUtil.split(MapUtils.getString(param, "detailIds"), ","))); + List details = riskListDetailService.queryList(new MapBuilder() + .put("detailIds", MapUtils.getString(param, "detailIds")) + .build()); Long pointId = MapUtils.getLong(param, "pointId"); RiskListPoint point = riskListPointService.getById(pointId); if (point == null) { throw new OpenAlertException("管控清单风险点不存在"); } - for (RiskListDetail detail : details) { + for (RiskListDetailVo detail : details) { RiskListSource source = new RiskListSource(); BeanUtils.copyProperties(detail, source); source.setId(null); @@ -386,6 +411,11 @@ public class RiskListSourceController { source.setEffectiveTimeEnd(source.getEffectiveTimeEnd()); source.setIdentificationTime(new Date()); source.setProjectSn(point.getProjectSn()); + String[] pathSplit = detail.getFullPath().split("/"); + if (pathSplit.length >= 4) { + source.setSubProjectWorkTask(pathSplit[3]); + } + source.setWorkNameContent(StrUtils.getLastSegments(detail.getFullPath(), 4)); addList.add(source); } if (CollUtil.isNotEmpty(addList)) { diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/entity/RiskListSource.java b/src/main/java/com/zhgd/xmgl/modules/risk/entity/RiskListSource.java index d5f609d02..76ada7c8c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/entity/RiskListSource.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/entity/RiskListSource.java @@ -236,14 +236,14 @@ public class RiskListSource implements Serializable { @ApiModelProperty(value = "规格型号") private java.lang.String specificationsModel; /** - * 分部分项工程/作业任务 + * 分部分项工程/作业任务(第4项) */ - @ApiModelProperty(value = "分部分项工程/作业任务") + @ApiModelProperty(value = "分部分项工程/作业任务(第4项)") private java.lang.String subProjectWorkTask; /** - * 作业活动名称及内容 + * 作业活动名称及内容(第5项及以后) */ - @ApiModelProperty(value = "作业活动名称及内容") + @ApiModelProperty(value = "作业活动名称及内容(第5项及以后)") private java.lang.String workNameContent; /** * 辨识人名称 diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListDetailMapper.xml b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListDetailMapper.xml index 2eeea3cb2..25c3db564 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListDetailMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListDetailMapper.xml @@ -12,6 +12,9 @@ and t.library_id in (select id from risk_list_library where find_in_set(#{param.containLibraryId},ancestors) or id=#{param.containLibraryId}) + + and find_in_set(t.id , #{param.detailIds}) + )t ${ew.customSqlSegment} diff --git a/src/main/resources/excel/辨识清单导出模板.xlsx b/src/main/resources/excel/辨识清单导出模板.xlsx index 484ca5dd4b267997077b2f9dc655ce8890202ac1..67527cc1d6a598b011cfbc261b83e9ef20ce1b19 100644 GIT binary patch delta 5111 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 delta 5213 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

s2Bhc)}E(k4c(D?4`lYP%*VlTnuIP z$%VlOSf~%;@_}q<+4#bfm{3GX%*MtzpDu$6n>72-@ErWJZGDpa`0a&bz#Vj|75a)X zgyGxSXT7K}mSo+DwOT2{I&j5QJ$xy9@z$M_h`5l3jJdctDMxt|rdFz`rX?p6`{mqG zFUnE8^-n#O?uVyr(v*hGl*J$5em6-{p{KjZ*A9%q9yecgIbBYf5^B{=V~wtz4a~m0 z?6m_*mW0E*oX_V^euga-glY%N(lI-);!AHj3)fxYX!-fd2N;d-y$< zr;I_n;(Xs^Dhc$XRi4XA?8k8<0eYlqEG>fv)}VaMxM8)PsPwCH#gXEGsJhkX4P_+F ze?k8ZC&dlC8nVU;BZhhp&2)_Vf2t!r9kOuD?0-yNHXP-l+GQpzqAL$Xr?YB&Dg1%9 zif4o^6$zNx?0qg}CY*E(^;snUI{(i5`vvA*jS4P;`vgy(=LE0DmIg;4d+*Vg=s_3l znE8LlI{yoZHcA35&zl0fD&CZftx?g9xA|MqS-$3ene^2ppR)k ztD-;+>e($`0f<{noyxF=U5e*)7r9oL#TT=X%Pw43%&kUpN>7Lzom_|QOqhl!3+(ku z?OKb;56JL+GzDC*dK&6*e0#)$JK6#nBYK=1aFU1wiD&gZ)?CBm7%wbLe?&i`#z)Wa zHMgF49?l_`Z_X(mV4A0uu^w7+H%3#Xwxd`ULM^%$H_I<~VK1xK$sXA$EUR9r!{gzB zN;UUVCe@nZ$b(gVl57C%xr^cyd>10N)nC=JrmWMcW8i5Ezb5DYA>@@4)cEd;ER{ck zHh(}4`eS$_1$TxozTkWsb?%QlL%Re0wbS7g1dkKUdiMI%aC|SDe6W)tcpm(1+c^hl zf@k9H0{w=mPTdDAs-73KWUO~e-4WudR4Fn;bV~<3*e6|!O@ac^gkApFywgh=a~?V8 z93sKck|jgbW>&GYy{kL4y3H~@+uqD=KTt$T)Ti-=C;?Q82qdzQBX}(x9MrU2sWe*) zukqmzC+Ixc5vcslyujoJTlREU?mx{Csr-E010Z}(ON^M(K)bphG+8f& zCw2*tZ=QYzS4vZ2>>d2dk*Q;$@yAJ4S9%+VKvano*|pR6i9E(8E4EvYV_%0@&jct{ zi=jrn7Ww_Ynzx$sxi_IS%$8Bc36@3h`HIG-dO$V-#fYJjU%}p)yxLQZVFH&dj`IPr zEe(*+i0RyIA#z$k=!aeTK2e}z%QdMgXQodw)hcgD90mQkFe6!*t%h_gLPcDVn5XyC zyCtJ~JBf8Q`W(qj%?p{S%&ui1jx#~dr;mDIVgCek0mox&*V8>}mA;ebS^lC{!YqMO zgu&2py|3D^60`4R#+4Pbetvn{kmG|R+Lnqhhfs`nJH&)8^jtr#dC$`?<8*FUFzDG# z8WL-Z?b`gO^yEP#_msa|!=v?dfKA1Y&j~!5s1c z04vgkLlD5uip=Fm`R|LJ7^fj7J~Dw*9@7Ci%E=GVVME?=iU54skW6g!NCPe~fSLsv z!X*PxWkI%c=>VKakc41%`v2@v7#M^Y|2|9%rhCEh2&oH}0Epos;SD?DU3SPpXu niODUE8H1GNW~Tqo#R~(2`hQs)u#w}~w8&I$k_R3fe>?vLX>i*P