Commit cb2b42bfbed2ef1d6b104b1aac053ecc132eb90d

Authored by 王彪总
1 parent d531bc79

feat(garden): 优化城市部件导出功能并添加二维码页面

- 实现三级合并表头的Excel导出功能,支持资产类型、基础信息和规格设备信息分类
- 在导出文件的图片列中嵌入实际图片,提升数据可视化效果
- 添加城市部件二维码扫码展示页面,提供移动端友好的资产信息查看界面
- 更新坐标字段命名从xCoord/yCoord/zCoord改为coordx/coordy/coordz
- 调整导入模板读取配置,支持多级表头结构解析
- 重构CityComponentExportVO数据传输对象,优化字段结构和排序
docs/城市部件-建表SQL.sql
... ... @@ -168,9 +168,9 @@ CREATE TABLE `garden_city_component` (
168 168 `area` varchar(128) DEFAULT NULL COMMENT '所属区域',
169 169 `road_code` varchar(16) DEFAULT NULL COMMENT '道路编码',
170 170 `road_name` varchar(128) DEFAULT NULL COMMENT '道路名称',
171   - `x_coord` decimal(12,8) DEFAULT NULL COMMENT 'X坐标(WGS84经度)',
172   - `y_coord` decimal(12,8) DEFAULT NULL COMMENT 'Y坐标(WGS84纬度)',
173   - `z_coord` decimal(10,4) DEFAULT NULL COMMENT 'Z坐标(高程)',
  171 + `coordx` decimal(18,8) DEFAULT NULL COMMENT 'X坐标(WGS84经度)',
  172 + `coordy` decimal(18,8) DEFAULT NULL COMMENT 'Y坐标(WGS84纬度)',
  173 + `coordz` decimal(18,8) DEFAULT NULL COMMENT 'Z坐标(高程)',
174 174 `longitude_amap` decimal(12,8) DEFAULT NULL COMMENT '高德经度(GCJ02,自动转换)',
175 175 `latitude_amap` decimal(12,8) DEFAULT NULL COMMENT '高德纬度(GCJ02,自动转换)',
176 176 `install_orientation` varchar(32) DEFAULT NULL COMMENT '安装方位(人行道/车行道/绿化带)',
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/citycomponent/CityComponentController.java
1 1 package com.zteits.urbanops.module.garden.controller.admin.citycomponent;
2 2  
3 3 import cn.idev.excel.FastExcelFactory;
  4 +import cn.idev.excel.converters.longconverter.LongStringConverter;
4 5 import com.zteits.urbanops.framework.excel.core.handler.ColumnWidthMatchStyleStrategy;
5   -import com.zteits.urbanops.framework.excel.core.handler.SelectSheetWriteHandler;
6   -import com.zteits.urbanops.framework.excel.core.util.ExcelUtils;
7 6 import com.zteits.urbanops.module.garden.controller.admin.citycomponent.vo.*;
8 7 import com.zteits.urbanops.module.garden.dal.dataobject.citycomponent.CityComponentDO;
9 8 import com.zteits.urbanops.module.garden.dal.dataobject.citycomponenttype.CityComponentTypeDO;
10 9 import com.zteits.urbanops.module.garden.dal.mysql.citycomponenttype.CityComponentTypeMapper;
11 10 import com.zteits.urbanops.module.garden.service.citycomponent.CityComponentService;
  11 +import org.apache.poi.ss.usermodel.*;
12 12 import org.springframework.web.bind.annotation.*;
13 13 import org.springframework.web.multipart.MultipartFile;
14 14 import jakarta.annotation.Resource;
... ... @@ -19,8 +19,13 @@ import io.swagger.v3.oas.annotations.Operation;
19 19 import jakarta.validation.*;
20 20 import jakarta.servlet.http.HttpServletResponse;
21 21  
  22 +import javax.imageio.ImageIO;
  23 +import java.awt.image.BufferedImage;
22 24 import java.math.BigDecimal;
  25 +import java.io.ByteArrayOutputStream;
  26 +import java.io.ByteArrayInputStream;
23 27 import java.io.IOException;
  28 +import java.net.URL;
24 29 import java.net.URLEncoder;
25 30 import java.nio.charset.StandardCharsets;
26 31 import java.time.LocalDate;
... ... @@ -89,14 +94,97 @@ public class CityComponentController {
89 94 List<CityComponentDO> list = cityComponentService.getList(reqVO);
90 95 List<CityComponentExportVO> exportList = BeanUtils.toBean(list, CityComponentExportVO.class);
91 96 String filename = "城市部件" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx";
92   - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
93   - response.setCharacterEncoding("utf-8");
94   - response.setHeader("Content-disposition",
95   - "attachment;filename*=utf-8''" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
96   - FastExcelFactory.write(response.getOutputStream(), CityComponentExportVO.class)
  97 +
  98 + // 三级合并表头(列优先:headList.get(col).get(row))
  99 + List<List<String>> headList = new ArrayList<>();
  100 + // 资产类型(col 0-2)
  101 + headList.add(java.util.Arrays.asList("资产类型", "一级资产类型"));
  102 + headList.add(java.util.Arrays.asList("", "二级资产类型"));
  103 + headList.add(java.util.Arrays.asList("", "三级资产类型"));
  104 + // 基础信息(col 3-10)
  105 + headList.add(java.util.Arrays.asList("基础信息", "资产ID"));
  106 + headList.add(java.util.Arrays.asList("", "所属区域"));
  107 + headList.add(java.util.Arrays.asList("", "X"));
  108 + headList.add(java.util.Arrays.asList("", "Y"));
  109 + headList.add(java.util.Arrays.asList("", "Z"));
  110 + headList.add(java.util.Arrays.asList("", "道路名称"));
  111 + headList.add(java.util.Arrays.asList("", "安装方位"));
  112 + headList.add(java.util.Arrays.asList("", "所属网格"));
  113 + // 规格与设备信息(col 11-25)
  114 + headList.add(java.util.Arrays.asList("规格与设备信息", "品牌/厂家"));
  115 + headList.add(java.util.Arrays.asList("", "型号规格"));
  116 + headList.add(java.util.Arrays.asList("", "材质"));
  117 + headList.add(java.util.Arrays.asList("", "长"));
  118 + headList.add(java.util.Arrays.asList("", "宽"));
  119 + headList.add(java.util.Arrays.asList("", "高"));
  120 + headList.add(java.util.Arrays.asList("", "胸径"));
  121 + headList.add(java.util.Arrays.asList("", "安装时间/种植时间"));
  122 + headList.add(java.util.Arrays.asList("", "资产状态"));
  123 + headList.add(java.util.Arrays.asList("", "管理单位"));
  124 + headList.add(java.util.Arrays.asList("", "责任人"));
  125 + headList.add(java.util.Arrays.asList("", "投入年限"));
  126 + headList.add(java.util.Arrays.asList("", "维保到期日"));
  127 + headList.add(java.util.Arrays.asList("", "采购批次/项目名称"));
  128 + headList.add(java.util.Arrays.asList("", "图片"));
  129 + List<org.apache.poi.ss.util.CellRangeAddress> mergeList = java.util.Arrays.asList(
  130 + new org.apache.poi.ss.util.CellRangeAddress(0, 0, 0, 2),
  131 + new org.apache.poi.ss.util.CellRangeAddress(0, 0, 3, 10),
  132 + new org.apache.poi.ss.util.CellRangeAddress(0, 0, 11, 25)
  133 + );
  134 +
  135 + // 先写数据到内存(含三级合并表头)
  136 + ByteArrayOutputStream baos = new ByteArrayOutputStream();
  137 + FastExcelFactory.write(baos)
  138 + .head(headList)
97 139 .registerWriteHandler(new ColumnWidthMatchStyleStrategy())
98   - .registerWriteHandler(new SelectSheetWriteHandler(CityComponentExportVO.class))
  140 + .registerWriteHandler(new com.zteits.urbanops.framework.excel.core.handler.HeadMergeHandler(
  141 + mergeList.toArray(new org.apache.poi.ss.util.CellRangeAddress[0])))
  142 + .registerConverter(new LongStringConverter())
99 143 .sheet("数据").doWrite(exportList);
  144 +
  145 + // 重新打开 workbook,在"图片"列嵌入图片(列索引 25)
  146 + try (Workbook workbook = WorkbookFactory.create(new ByteArrayInputStream(baos.toByteArray()))) {
  147 + Sheet sheet = workbook.getSheetAt(0);
  148 + int imgCol = 25; // "图片"列固定在第26列(索引25)
  149 + if (imgCol >= 0) {
  150 + sheet.setColumnWidth(imgCol, 25 * 256);
  151 + for (int i = 0; i < exportList.size(); i++) {
  152 + String urls = exportList.get(i).getImageUrls();
  153 + if (urls == null || urls.isEmpty()) continue;
  154 + String[] parts = urls.split(",");
  155 + Row row = sheet.getRow(i + 2); // +2 跳过两行表头
  156 + if (row == null) row = sheet.createRow(i + 2);
  157 + row.setHeightInPoints(70);
  158 + Cell urlCell = row.getCell(imgCol);
  159 + if (urlCell != null) urlCell.setBlank();
  160 +
  161 + for (int j = 0; j < Math.min(parts.length, 3); j++) {
  162 + try {
  163 + BufferedImage img = ImageIO.read(new URL(parts[j].trim()));
  164 + if (img == null) continue;
  165 + ByteArrayOutputStream ibaos = new ByteArrayOutputStream();
  166 + ImageIO.write(img, "jpg", ibaos);
  167 + int picIdx = workbook.addPicture(ibaos.toByteArray(), Workbook.PICTURE_TYPE_JPEG);
  168 +
  169 + Drawing<?> drawing = sheet.createDrawingPatriarch();
  170 + ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
  171 + anchor.setCol1(imgCol + j * 2);
  172 + anchor.setRow1(i + 2);
  173 + anchor.setDx1(200); anchor.setDy1(200);
  174 + anchor.setCol2(imgCol + j * 2 + 2);
  175 + anchor.setRow2(i + 3);
  176 + anchor.setDx2(-200); anchor.setDy2(-200);
  177 + drawing.createPicture(anchor, picIdx);
  178 + } catch (Exception ignored) {}
  179 + }
  180 + }
  181 + }
  182 +
  183 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  184 + response.setHeader("Content-Disposition",
  185 + "attachment;filename*=UTF-8''" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
  186 + workbook.write(response.getOutputStream());
  187 + }
100 188 }
101 189  
102 190 @GetMapping("/generate-qr")
... ... @@ -106,6 +194,51 @@ public class CityComponentController {
106 194 return success(cityComponentService.generateQrCode(id));
107 195 }
108 196  
  197 + @GetMapping("/qr-page")
  198 + @Operation(summary = "二维码扫码页面(公开)")
  199 + @jakarta.annotation.security.PermitAll
  200 + public void qrPage(@RequestParam("code") String componentCode, HttpServletResponse response) throws IOException {
  201 + CityComponentDO comp = cityComponentService.getByComponentCode(componentCode);
  202 + StringBuilder html = new StringBuilder();
  203 + html.append("<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">");
  204 + html.append("<title>").append(comp.getComponentCode()).append("</title>");
  205 + html.append("<style>body{font-family:-apple-system,BlinkMacSystemFont,sans-serif;margin:0;padding:16px;background:#f5f5f5}");
  206 + html.append(".card{background:#fff;border-radius:8px;padding:16px;margin-bottom:12px;box-shadow:0 1px 3px rgba(0,0,0,.1)}");
  207 + html.append(".label{color:#999;font-size:12px;margin-bottom:4px}.val{color:#333;font-size:16px;font-weight:500}");
  208 + html.append(".title{text-align:center;font-size:18px;font-weight:bold;color:#1a73e8;margin-bottom:16px}");
  209 + html.append(".row{display:flex;flex-wrap:wrap}.col{width:50%;margin-bottom:12px}</style></head><body>");
  210 + html.append("<div class=\"card title\">资产信息</div>");
  211 + html.append("<div class=\"card\">");
  212 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">资产ID</div><div class=\"val\">").append(nvl(comp.getComponentCode())).append("</div></div>");
  213 + html.append("<div class=\"col\"><div class=\"label\">资产状态</div><div class=\"val\">").append(nvl(comp.getAssetStatus())).append("</div></div></div>");
  214 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">一级类型</div><div class=\"val\">").append(nvl(comp.getLevelOneTypeName())).append("</div></div>");
  215 + html.append("<div class=\"col\"><div class=\"label\">二级类型</div><div class=\"val\">").append(nvl(comp.getLevelTwoTypeName())).append("</div></div></div>");
  216 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">三级类型</div><div class=\"val\">").append(nvl(comp.getLevelThreeTypeName())).append("</div></div>");
  217 + html.append("<div class=\"col\"><div class=\"label\">所属区域</div><div class=\"val\">").append(nvl(comp.getArea())).append("</div></div></div>");
  218 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">道路名称</div><div class=\"val\">").append(nvl(comp.getRoadName())).append("</div></div>");
  219 + html.append("<div class=\"col\"><div class=\"label\">安装方位</div><div class=\"val\">").append(nvl(comp.getInstallOrientation())).append("</div></div></div>");
  220 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">品牌/厂家</div><div class=\"val\">").append(nvl(comp.getBrand())).append("</div></div>");
  221 + html.append("<div class=\"col\"><div class=\"label\">型号规格</div><div class=\"val\">").append(nvl(comp.getModelSpec())).append("</div></div></div>");
  222 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">材质</div><div class=\"val\">").append(nvl(comp.getMaterial())).append("</div></div>");
  223 + html.append("<div class=\"col\"><div class=\"label\">管理单位</div><div class=\"val\">").append(nvl(comp.getManagementUnit())).append("</div></div></div>");
  224 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">责任人</div><div class=\"val\">").append(nvl(comp.getResponsiblePerson())).append("</div></div>");
  225 + html.append("<div class=\"col\"><div class=\"label\">安装时间</div><div class=\"val\">").append(comp.getInstallDate()!=null?comp.getInstallDate().toString():"-").append("</div></div></div>");
  226 + html.append("<div class=\"row\"><div class=\"col\"><div class=\"label\">维保到期日</div><div class=\"val\">").append(comp.getMaintenanceDeadline()!=null?comp.getMaintenanceDeadline().toString():"-").append("</div></div>");
  227 + html.append("<div class=\"col\"><div class=\"label\">采购批次</div><div class=\"val\">").append(nvl(comp.getProcurementBatch())).append("</div></div></div>");
  228 + html.append("</div>");
  229 + // 显示图片
  230 + if (comp.getImageUrls() != null && !comp.getImageUrls().isEmpty()) {
  231 + html.append("<div class=\"card\"><div class=\"label\">图片信息</div>");
  232 + for (String url : comp.getImageUrls().split(",")) {
  233 + html.append("<img src=\"").append(url.trim()).append("\" style=\"width:100%;max-width:300px;margin:4px 0;border-radius:4px\"/>");
  234 + }
  235 + html.append("</div>");
  236 + }
  237 + html.append("</body></html>");
  238 + response.setContentType("text/html;charset=UTF-8");
  239 + response.getWriter().write(html.toString());
  240 + }
  241 +
109 242 @GetMapping("/import-template")
110 243 @Operation(summary = "下载导入模板")
111 244 @jakarta.annotation.security.PermitAll
... ... @@ -122,7 +255,7 @@ public class CityComponentController {
122 255 @PreAuthorize("@ss.hasPermission('garden:city-component:create')")
123 256 public CommonResult<String> importExcel(@RequestParam("file") MultipartFile file) throws IOException {
124 257 List<CityComponentImportVO> importList = FastExcelFactory.read(file.getInputStream())
125   - .head(CityComponentImportVO.class).headRowNumber(1).sheet().doReadSync();
  258 + .head(CityComponentImportVO.class).headRowNumber(2).sheet().doReadSync();
126 259 List<String> errors = new ArrayList<>();
127 260 // 第一遍:全量校验
128 261 for (int i = 0; i < importList.size(); i++) {
... ... @@ -178,4 +311,6 @@ public class CityComponentController {
178 311 }
179 312 return success("成功导入 " + count + " 条记录");
180 313 }
  314 +
  315 + private String nvl(String s) { return s != null ? s : "-"; }
181 316 }
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/citycomponent/vo/CityComponentExportVO.java
1 1 package com.zteits.urbanops.module.garden.controller.admin.citycomponent.vo;
2 2  
3   -import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4   -import cn.idev.excel.annotation.ExcelProperty;
5 3 import io.swagger.v3.oas.annotations.media.Schema;
6 4 import lombok.Data;
7 5  
8 6 import java.math.BigDecimal;
9 7 import java.time.LocalDate;
10   -import java.time.LocalDateTime;
11 8  
12 9 @Schema(description = "城市部件导出 VO")
13 10 @Data
14   -@ExcelIgnoreUnannotated
15 11 public class CityComponentExportVO {
16 12  
17   - @ExcelProperty("资产ID")
18   - private String componentCode;
19   - @ExcelProperty("一级类型")
20   - private String levelOneTypeName;
21   - @ExcelProperty("二级类型")
22   - private String levelTwoTypeName;
23   - @ExcelProperty("三级类型")
24   - private String levelThreeTypeName;
25   - @ExcelProperty("所属区域")
26   - private String area;
27   - @ExcelProperty("道路名称")
28   - private String roadName;
29   - @ExcelProperty("安装方位")
30   - private String installOrientation;
31   - @ExcelProperty("所属网格")
32   - private String grid;
33   - @ExcelProperty("品牌")
34   - private String brand;
35   - @ExcelProperty("型号规格")
36   - private String modelSpec;
37   - @ExcelProperty("材质")
38   - private String material;
39   - @ExcelProperty("安装时间")
40   - private LocalDate installDate;
41   - @ExcelProperty("资产状态")
42   - private String assetStatus;
43   - @ExcelProperty("管理单位")
44   - private String managementUnit;
45   - @ExcelProperty("责任人")
46   - private String responsiblePerson;
47   - @ExcelProperty("维保到期日")
48   - private LocalDate maintenanceDeadline;
49   - @ExcelProperty("巡检周期")
50   - private String inspectionCycle;
51   - @ExcelProperty("最近巡检时间")
52   - private LocalDateTime lastInspectionTime;
53   - @ExcelProperty("巡检结果")
54   - private String inspectionResult;
55   - @ExcelProperty("异常描述")
56   - private String abnormalDescription;
57   - @ExcelProperty("报修工单编号")
58   - private String repairOrderNo;
59   - @ExcelProperty("维修完成时间")
60   - private LocalDateTime repairCompleteTime;
61   - @ExcelProperty("维修单位")
62   - private String repairUnit;
63   - @ExcelProperty("图片信息")
64   - private String imageUrls;
65   - @ExcelProperty("备注")
66   - private String remark;
  13 + private String levelOneTypeName; // 1. 一级资产类型
  14 + private String levelTwoTypeName; // 2. 二级资产类型
  15 + private String levelThreeTypeName; // 3. 三级资产类型
  16 +
  17 + private String componentCode; // 4. 资产ID
  18 + private String area; // 5. 所属区域
  19 + private BigDecimal coordx; // 6. X
  20 + private BigDecimal coordy; // 7. Y
  21 + private BigDecimal coordz; // 8. Z
  22 + private String roadName; // 9. 道路名称
  23 + private String installOrientation; // 10. 安装方位
  24 + private String grid; // 11. 所属网格
  25 +
  26 + private String brand; // 12. 品牌/厂家
  27 + private String modelSpec; // 13. 型号规格
  28 + private String material; // 14. 材质
  29 + private BigDecimal length; // 15. 长
  30 + private BigDecimal width; // 16. 宽
  31 + private BigDecimal height; // 17. 高
  32 + private BigDecimal dbh; // 18. 胸径
  33 + private LocalDate installDate; // 19. 安装时间/种植时间
  34 + private String assetStatus; // 20. 资产状态
  35 + private String managementUnit; // 21. 管理单位
  36 + private String responsiblePerson; // 22. 责任人
  37 + private BigDecimal serviceYears; // 23. 投入年限
  38 + private LocalDate maintenanceDeadline; // 24. 维保到期日
  39 + private String procurementBatch; // 25. 采购批次/项目名称
  40 + private String imageUrls; // 26. 图片
67 41 }
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/citycomponent/vo/CityComponentRespVO.java
... ... @@ -43,11 +43,10 @@ public class CityComponentRespVO {
43 43 private String roadCode;
44 44  
45 45 @ExcelProperty("X坐标")
46   - private BigDecimal xCoord;
  46 + private BigDecimal coordx;
47 47 @ExcelProperty("Y坐标")
48   - private BigDecimal yCoord;
49   -
50   - private BigDecimal zCoord;
  48 + private BigDecimal coordy;
  49 + private BigDecimal coordz;
51 50 private BigDecimal longitudeAmap;
52 51 private BigDecimal latitudeAmap;
53 52  
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/citycomponent/CityComponentDO.java
... ... @@ -37,9 +37,9 @@ public class CityComponentDO extends BaseDO {
37 37 private String area;
38 38 private String roadCode;
39 39 private String roadName;
40   - private BigDecimal xCoord;
41   - private BigDecimal yCoord;
42   - private BigDecimal zCoord;
  40 + private BigDecimal coordx;
  41 + private BigDecimal coordy;
  42 + private BigDecimal coordz;
43 43 private BigDecimal longitudeAmap;
44 44 private BigDecimal latitudeAmap;
45 45 private String installOrientation;
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/citycomponent/CityComponentService.java
... ... @@ -23,4 +23,6 @@ public interface CityComponentService {
23 23 List<CityComponentDO> getList(CityComponentPageReqVO reqVO);
24 24  
25 25 String generateQrCode(Long id);
  26 +
  27 + CityComponentDO getByComponentCode(String componentCode);
26 28 }
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/citycomponent/CityComponentServiceImpl.java
... ... @@ -34,9 +34,9 @@ public class CityComponentServiceImpl implements CityComponentService {
34 34 public Long create(@Valid CityComponentSaveReqVO reqVO) {
35 35 validateCodeUnique(reqVO.getComponentCode(), null);
36 36 CityComponentDO comp = BeanUtils.toBean(reqVO, CityComponentDO.class);
37   - if (reqVO.getCoordx() != null) comp.setXCoord(new BigDecimal(reqVO.getCoordx()));
38   - if (reqVO.getCoordy() != null) comp.setYCoord(new BigDecimal(reqVO.getCoordy()));
39   - if (reqVO.getCoordz() != null) comp.setZCoord(new BigDecimal(reqVO.getCoordz()));
  37 + if (reqVO.getCoordx() != null) comp.setCoordx(new BigDecimal(reqVO.getCoordx()));
  38 + if (reqVO.getCoordy() != null) comp.setCoordy(new BigDecimal(reqVO.getCoordy()));
  39 + if (reqVO.getCoordz() != null) comp.setCoordz(new BigDecimal(reqVO.getCoordz()));
40 40 fillTypeNames(comp);
41 41 convertCoordinates(comp);
42 42 cityComponentMapper.insert(comp);
... ... @@ -55,9 +55,9 @@ public class CityComponentServiceImpl implements CityComponentService {
55 55 }
56 56 validateCodeUnique(reqVO.getComponentCode(), reqVO.getId());
57 57 CityComponentDO comp = BeanUtils.toBean(reqVO, CityComponentDO.class);
58   - if (reqVO.getCoordx() != null) comp.setXCoord(new BigDecimal(reqVO.getCoordx()));
59   - if (reqVO.getCoordy() != null) comp.setYCoord(new BigDecimal(reqVO.getCoordy()));
60   - if (reqVO.getCoordz() != null) comp.setZCoord(new BigDecimal(reqVO.getCoordz()));
  58 + if (reqVO.getCoordx() != null) comp.setCoordx(new BigDecimal(reqVO.getCoordx()));
  59 + if (reqVO.getCoordy() != null) comp.setCoordy(new BigDecimal(reqVO.getCoordy()));
  60 + if (reqVO.getCoordz() != null) comp.setCoordz(new BigDecimal(reqVO.getCoordz()));
61 61 fillTypeNames(comp);
62 62 convertCoordinates(comp);
63 63 cityComponentMapper.updateById(comp);
... ... @@ -95,12 +95,21 @@ public class CityComponentServiceImpl implements CityComponentService {
95 95 @Override
96 96 public String generateQrCode(Long id) {
97 97 CityComponentDO comp = get(id);
98   - String url = "https://urbanops.zteits.com/component/" + comp.getComponentCode();
  98 + String url = "https://test.jichengshanshui.com.cn:28302/admin-api/garden/city-component/qr-page?code=" + comp.getComponentCode();
99 99 comp.setQrCodeUrl(url);
100 100 cityComponentMapper.updateById(comp);
101 101 return url;
102 102 }
103 103  
  104 + @Override
  105 + public CityComponentDO getByComponentCode(String componentCode) {
  106 + CityComponentDO comp = cityComponentMapper.selectByComponentCode(componentCode);
  107 + if (comp == null) {
  108 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CITY_COMPONENT_NOT_EXISTS);
  109 + }
  110 + return comp;
  111 + }
  112 +
104 113 private void validateCodeUnique(String code, Long excludeId) {
105 114 if (code == null || code.isEmpty()) return;
106 115 CityComponentDO exist = cityComponentMapper.selectByComponentCode(code);
... ... @@ -125,10 +134,10 @@ public class CityComponentServiceImpl implements CityComponentService {
125 134 }
126 135  
127 136 private void convertCoordinates(CityComponentDO comp) {
128   - if (comp.getXCoord() != null && comp.getYCoord() != null) {
  137 + if (comp.getCoordx() != null && comp.getCoordy() != null) {
129 138 double[] gcj02 = GisCoordinateUtil.wgs84ToGcj02(
130   - comp.getXCoord().doubleValue(),
131   - comp.getYCoord().doubleValue());
  139 + comp.getCoordx().doubleValue(),
  140 + comp.getCoordy().doubleValue());
132 141 comp.setLongitudeAmap(BigDecimal.valueOf(gcj02[0]));
133 142 comp.setLatitudeAmap(BigDecimal.valueOf(gcj02[1]));
134 143 }
... ...