From 834fcf7e2d44fe15782ff46b4cb3623e0be74f5f Mon Sep 17 00:00:00 2001 From: weitang Date: Sat, 7 Jun 2025 11:20:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8A=A5=E5=91=8A=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlgorithmArrangeController.java | 126 +++++++++++++++++- .../SubstationMaindeviceController.java | 2 +- .../resources/templates/布点报告模板.docx | Bin 0 -> 13231 bytes 3 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 riis-system/src/main/resources/templates/布点报告模板.docx diff --git a/riis-system/src/main/java/com/yfd/platform/modules/algorithm/controller/AlgorithmArrangeController.java b/riis-system/src/main/java/com/yfd/platform/modules/algorithm/controller/AlgorithmArrangeController.java index f8e0bd6..4ace801 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/algorithm/controller/AlgorithmArrangeController.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/algorithm/controller/AlgorithmArrangeController.java @@ -1,21 +1,43 @@ package com.yfd.platform.modules.algorithm.controller; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.data.Pictures; +import com.deepoove.poi.plugin.table.HackLoopTableRenderPolicy; +import com.deepoove.poi.util.PoitlIOUtils; +import com.yfd.platform.config.HttpServerConfig; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.modules.algorithm.domain.AlgorithmArrange; +import com.yfd.platform.modules.algorithm.service.IAlgorithmArrangeDeviceService; import com.yfd.platform.modules.algorithm.service.IAlgorithmArrangeService; +import com.yfd.platform.modules.basedata.domain.Substation; +import com.yfd.platform.system.service.ISysDictionaryItemsService; +import com.yfd.platform.utils.FileUtil; import com.yfd.platform.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ClassUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLDecoder; +import java.nio.file.Files; import java.time.LocalDateTime; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** *

@@ -28,10 +50,17 @@ import java.util.List; @RestController @RequestMapping("/algorithm/algorithm-arrange") @Api(value = "AlgorithmArrangeController", tags = "算法布点模块") +@Slf4j public class AlgorithmArrangeController { @Resource private IAlgorithmArrangeService algorithmArrangeService; + @Resource + private IAlgorithmArrangeDeviceService algorithmArrangeDeviceService; + @Resource + private ISysDictionaryItemsService sysDictionaryItemsService; + @Resource + private HttpServerConfig httpServerConfig; @GetMapping("/getAlgorithmArrangePage") @ApiOperation("查询算法布点") @@ -88,6 +117,24 @@ public class AlgorithmArrangeController { return ResponseResult.successData(algorithmArrange); } + @PostMapping("/saveArrangeImage") + @ApiOperation("保存布点图片") + public ResponseResult saveArrangeImage(String id, MultipartFile file) { + // 文件上传逻辑 + if (file != null && !file.isEmpty()) { + try { + // 上传文件 + String fileUrl = algorithmArrangeService.uploadImage(file); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AlgorithmArrange::getId, id).set(AlgorithmArrange::getArrangeImageUrl, fileUrl); + algorithmArrangeService.update(updateWrapper); + } catch (Exception e) { + return ResponseResult.error("文件上传失败:" + e.getMessage()); + } + } + return ResponseResult.success(); + } + @PostMapping("/updateAlgorithmArrange") @ApiOperation("修改算法布点") public ResponseResult updateAlgorithmArrange(AlgorithmArrange algorithmArrange, MultipartFile file) { @@ -129,9 +176,9 @@ public class AlgorithmArrangeController { } } - @PostMapping("/deleteAlgorithmArrange") + @PostMapping("/deleteAlgorithmArrangeByIds") @ApiOperation("删除布点数据") - public ResponseResult deleteAlgorithmArrange(@RequestBody List ids) { + public ResponseResult deleteAlgorithmArrangeByIds(@RequestBody List ids) { boolean b = algorithmArrangeService.removeByIds(ids); if (b) { return ResponseResult.success(); @@ -147,4 +194,77 @@ public class AlgorithmArrangeController { return ResponseResult.successData(algorithmArrange); } + @GetMapping("/exportArrangeById") + @ApiOperation("导出报告") + public void exportArrangeById(String id, HttpServletResponse response) throws IOException { + Map map = new HashMap<>(); + AlgorithmArrange algorithmArrange = algorithmArrangeService.getById(id); + map.put("arrangeName", algorithmArrange.getArrangeName()); + map.put("stationName", algorithmArrange.getStationName()); + Map businessTypeMap = sysDictionaryItemsService.getDeviceMapByType("businessType"); + Map stationTypeMap = sysDictionaryItemsService.getDeviceMapByType("stationType"); + JSONObject businessTypeJSON= JSONUtil.parseObj(businessTypeMap.get("resultMap")); + JSONObject stationTypeJSON= JSONUtil.parseObj(stationTypeMap.get("resultMap")); + String businessType = StrUtil.isNotBlank(algorithmArrange.getBusinessType()) ? businessTypeJSON.getStr(algorithmArrange.getBusinessType()) : ""; + String stationType = StrUtil.isNotBlank(algorithmArrange.getStationType()) ? stationTypeJSON.getStr(algorithmArrange.getStationType()) : ""; + map.put("stationType", stationType); + map.put("businessType",businessType); + map.put("voltLevel", algorithmArrange.getVoltLevel()); + map.put("status", "完成"); + map.put("date", DateUtil.now()); + List> arrangeDeviceInfo = algorithmArrangeDeviceService.getArrangeDeviceInfo(id); + arrangeDeviceInfo.forEach(a -> { + // 图片流 + a.put("index", arrangeDeviceInfo.indexOf(a) + 1); + }); + try { + + String arrangeImageUrl = algorithmArrange.getArrangeImageUrl(); + if (StrUtil.isNotBlank(arrangeImageUrl)) { + map.put("img", + Pictures.ofStream(Files.newInputStream(new File(httpServerConfig.getPlanFilePath() + arrangeImageUrl).toPath()), FileUtil.getPictureType(arrangeImageUrl)).size(800, 200).create()); + } + + } catch (Exception e) { + log.error(e.getMessage()); + } + List> demo = getMapData(); + //创建一个列表的规则 + HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy(); + //设置列表配置,如果有多个列表时需加.bind("list1", policy) 新列表配置即可 + Configure config = Configure.builder().bind("list", policy).build(); + if (!arrangeDeviceInfo.isEmpty()) { + map.put("list", arrangeDeviceInfo); + } else { + map.put("list", demo); + } + // 加载模板渲染数据 + String path = Objects.requireNonNull(Objects.requireNonNull(ClassUtils.getDefaultClassLoader()).getResource( + "")).getPath() + "templates" + File.separator + "布点报告模板.docx"; + XWPFTemplate compile = XWPFTemplate.compile(path, config); + XWPFTemplate template = compile.render(map); + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename='reportTemp.docx'"); + + OutputStream out = response.getOutputStream(); + BufferedOutputStream bos = new BufferedOutputStream(out); + template.write(bos); + bos.flush(); + out.flush(); + PoitlIOUtils.closeQuietlyMulti(template, bos, out); + } + + private List> getMapData() { + List> demo = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("index", ""); + map.put("areaName", ""); + map.put("1", ""); + map.put("2", ""); + map.put("3", ""); + map.put("4", ""); + demo.add(map); + return demo; + } + } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/basedata/controller/SubstationMaindeviceController.java b/riis-system/src/main/java/com/yfd/platform/modules/basedata/controller/SubstationMaindeviceController.java index 3ae1cf0..a74a942 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/basedata/controller/SubstationMaindeviceController.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/basedata/controller/SubstationMaindeviceController.java @@ -117,7 +117,7 @@ public class SubstationMaindeviceController { queryWrapper.eq(StrUtil.isNotBlank(stationCode), SubstationMaindevice::getStationCode, stationCode); queryWrapper.in(StrUtil.isNotBlank(deviceTypeList), SubstationMaindevice::getDeviceType, StrUtil.split(deviceTypeList , ",")); - queryWrapper.select(SubstationMaindevice::getMainDeviceId, SubstationMaindevice::getMainDeviceName, + queryWrapper.select(SubstationMaindevice::getMainDeviceId,SubstationMaindevice::getAreaId,SubstationMaindevice::getAreaName, SubstationMaindevice::getMainDeviceName, SubstationMaindevice::getDeviceType, SubstationMaindevice::getFileUrl); queryWrapper.eq(SubstationMaindevice::getDatastatus, "1"); List> maps = substationMaindeviceService.listMaps(queryWrapper); diff --git a/riis-system/src/main/resources/templates/布点报告模板.docx b/riis-system/src/main/resources/templates/布点报告模板.docx new file mode 100644 index 0000000000000000000000000000000000000000..4e1fa978ca4daaa634f50157a41fdee5d0b0ec94 GIT binary patch literal 13231 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 literal 0 HcmV?d00001