From f80956f5f0f910bc3cd3bb6b4f8fcec01852631d Mon Sep 17 00:00:00 2001 From: du <1725534722@qq.com> Date: Thu, 10 Apr 2025 16:32:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BF=E5=8A=A1=E9=A6=96=E9=A1=B5=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gysl/controller/XmpjqdController.java | 2 +- .../gysl/controller/ZwStatsController.java | 39 ++- .../ruoyi/gysl/entity/BasicInformation.java | 50 ++-- .../request/BasicInformationPageReq.java | 4 - .../response/XmhxDetail/XmhxDetail.java | 5 + .../mapper/BuildingInformationMapper.java | 15 + .../com/ruoyi/gysl/mapper/XmpjqdMapper.java | 18 +- .../service/BuildingInformationService.java | 18 ++ .../impl/BuildingInformationServiceImpl.java | 24 ++ .../gysl/service/impl/XmpjqdServiceImpl.java | 262 +++++++----------- .../mapper/BuildingInformationMapper.xml | 40 +++ .../main/resources/mapper/QyStatsMapper.xml | 2 +- .../main/resources/mapper/XmpjqdMapper.xml | 66 +---- .../main/resources/mapper/ZwStatsMapper.xml | 55 ++-- ruoyi-admin/src/main/resources/ztbgmb.docx | Bin 17902 -> 17820 bytes 15 files changed, 302 insertions(+), 298 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/XmpjqdController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/XmpjqdController.java index 342c20b..127c046 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/XmpjqdController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/XmpjqdController.java @@ -68,7 +68,7 @@ public class XmpjqdController extends BaseController { */ @ApiOperation(value = "通过主键查询单条项目画像",response = XmhxResponse.class) @GetMapping("/oneXmhx/{id}") - public AjaxResult oneXmhx(@PathVariable Serializable id) { + public AjaxResult oneXmhx(@PathVariable Long id) { return success(xmpjqdService.oneXmhx(id)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java index 6ea103f..f88684c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java @@ -166,9 +166,42 @@ public class ZwStatsController extends BaseController { dt.put("{{currentBuilding1}}",allProjectResponse.getCurrentBuilding1()); dt.put("{{currentBuilding2}}",allProjectResponse.getCurrentBuilding2()); dt.put("{{currentBuilding3}}",allProjectResponse.getCurrentBuilding3()); - -// String fatherFile = fileAddress + "/out.docx"; -// FileUtil.newFile(fatherFile); + ribbon.forEach(x->{ + switch (x.getSsgnq()) { + case "高端制造与国际贸易区": + dt.put("{{gn1}}",x.getCount()); + break; + case "阳澄湖半岛旅游度假区": + dt.put("{{gn2}}",x.getCount()); + break; + case "金鸡湖商务区": + dt.put("{{gn3}}",x.getCount()); + break; + case "苏相合作区": + dt.put("{{gn4}}",x.getCount()); + break; + case "独墅湖科教创新区": + dt.put("{{gn5}}",x.getCount()); + break; + default: + break; + } + }); + investors.forEach(x->{ + switch (x.getSsgnq()) { + case "国企": + dt.put("{{tz1}}",x.getCount()); + break; + case "民营企业": + dt.put("{{tz2}}",x.getCount()); + break; + case "外资企业": + dt.put("{{tz3}}",x.getCount()); + break; + default: + break; + } + }); ClassPathResource classPathResource = new ClassPathResource("ztbgmb.docx"); try ( InputStream inputStream = classPathResource.getStream(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java index 78ba250..4f142cc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java @@ -30,110 +30,110 @@ public class BasicInformation extends BaseModel { private Long id; - @Excel(name = "统一社会信用代码*", sort = 2, required = true, type = Excel.Type.ALL,headerBackgroundColor= IndexedColors.RED1) + @Excel(name = "统一社会信用代码*", sort = 2, required = true, type = Excel.Type.ALL, headerBackgroundColor = IndexedColors.RED1) @ApiModelProperty("统一社会信用代码") private String tyshxydm; @NotBlank - @Excel(name = "项目名称*", sort = 2, required = true, type = Excel.Type.ALL,headerBackgroundColor= IndexedColors.RED1) + @Excel(name = "项目名称*", sort = 2, required = true, type = Excel.Type.ALL, headerBackgroundColor = IndexedColors.RED1) @ApiModelProperty("项目名称") private String name; @ApiModelProperty("总用地面积") - @Excel(name = "总用地面积", sort = 8,type= Excel.Type.ALL) + @Excel(name = "总用地面积", sort = 8, type = Excel.Type.ALL) @TableField(exist = false) private BigDecimal zydmj; @ApiModelProperty("总建筑面积") - @Excel(name = "总建筑面积",type = Excel.Type.EXPORT) + @Excel(name = "总建筑面积", type = Excel.Type.EXPORT) @TableField(exist = false) private BigDecimal zjzmj; @NotBlank - @Excel(name = "项目法人单位*", sort = 4, required = true,type= Excel.Type.ALL,headerBackgroundColor= IndexedColors.RED1) + @Excel(name = "项目法人单位*", sort = 4, required = true, type = Excel.Type.ALL, headerBackgroundColor = IndexedColors.RED1) @ApiModelProperty("项目法人单位") private String xmfrdwxz; @NotBlank @ApiModelProperty("项目法人单位性质") - @Excel(name = "项目法人单位性质",dictType = "xmfrdwxz",comboReadDict = true,type = Excel.Type.EXPORT) + @Excel(name = "项目法人单位性质", dictType = "xmfrdwxz", comboReadDict = true, type = Excel.Type.EXPORT) private Integer nature; @ApiModelProperty("施工单位") - @Excel(name = "施工单位",type = Excel.Type.EXPORT) + @Excel(name = "施工单位", type = Excel.Type.EXPORT) private String sgdw; @ApiModelProperty("设计单位") - @Excel(name = "设计单位",type = Excel.Type.EXPORT) + @Excel(name = "设计单位", type = Excel.Type.EXPORT) private String sjdw; @ApiModelProperty("总投资额") - @Excel(name = "总投资额", sort = 7,type= Excel.Type.ALL) + @Excel(name = "总投资额", sort = 7, type = Excel.Type.ALL) private BigDecimal ztze; @NotBlank @ApiModelProperty("所属功能区") - @Excel(name = "所属功能区",dictType = "ssgnq",comboReadDict = true,type = Excel.Type.EXPORT) + @Excel(name = "所属功能区", dictType = "ssgnq", comboReadDict = true, type = Excel.Type.EXPORT) private Integer ssgnq; @ApiModelProperty("建设开始时间 yyyy-MM") - @Excel(name = "建设开始时间", sort = 5,type= Excel.Type.ALL) + @Excel(name = "建设开始时间", sort = 5, width = 24, type = Excel.Type.EXPORT) private String begainTime; @ApiModelProperty("建设结束时间 yyyy-MM") - @Excel(name = "建设结束时间", sort = 6,type= Excel.Type.ALL) + @Excel(name = "建设结束时间", sort = 6, width = 24, type = Excel.Type.EXPORT) private String endTime; @NotBlank - @Excel(name = "现状分类", sort = 3, dictType = "xzfl", comboReadDict = true,type= Excel.Type.ALL) + @Excel(name = "现状分类", sort = 3, dictType = "xzfl", comboReadDict = true, type = Excel.Type.ALL) @ApiModelProperty("现状分类") private Integer xzfl; @NotBlank - @Excel(name = "建设地点",type = Excel.Type.EXPORT) + @Excel(name = "建设地点", type = Excel.Type.EXPORT) @ApiModelProperty("建设地点") private String jsdd; @NotBlank - @Excel(name = "重点发展产业",type = Excel.Type.EXPORT) + @Excel(name = "重点发展产业", type = Excel.Type.EXPORT) @ApiModelProperty("重点发展产业") private String prioritize; @NotBlank - @Excel(name = "建设模式",dictType = "jsms",comboReadDict = true,type = Excel.Type.EXPORT) + @Excel(name = "建设模式", dictType = "jsms", comboReadDict = true, type = Excel.Type.EXPORT) @ApiModelProperty("建设模式") private Integer jsms; @ApiModelProperty("项目标签") - @Excel(name = "项目标签",type = Excel.Type.EXPORT) + @Excel(name = "项目标签", type = Excel.Type.EXPORT) private String label; @NotBlank @ApiModelProperty("项目负责人") - @Excel(name = "项目负责人",type = Excel.Type.EXPORT) + @Excel(name = "项目负责人", type = Excel.Type.EXPORT) private String projectLeader; @NotBlank @ApiModelProperty("联系方式") - @Excel(name = "联系方式",type = Excel.Type.EXPORT) + @Excel(name = "联系方式", type = Excel.Type.EXPORT) private String phone; @ApiModelProperty("施工许可证发放时间") - @Excel(name = "施工许可证发放时间",type = Excel.Type.EXPORT) + @Excel(name = "施工许可证发放时间", type = Excel.Type.EXPORT) private String issuingTime; @ApiModelProperty("竣工验收时间") - @Excel(name = "竣工验收时间",type = Excel.Type.EXPORT) + @Excel(name = "竣工验收时间", type = Excel.Type.EXPORT) private String acceptanceTime; @ApiModelProperty("建设进度") - @Excel(name = "建设进度",type = Excel.Type.EXPORT) + @Excel(name = "建设进度", type = Excel.Type.EXPORT) private String jsjd; @NotBlank @@ -148,11 +148,11 @@ public class BasicInformation extends BaseModel { private String fj; @ApiModelProperty("经度") - @Excel(name = "经度",type = Excel.Type.EXPORT) + @Excel(name = "经度", type = Excel.Type.EXPORT) private String longitude; - @Excel(name = "纬度",type = Excel.Type.EXPORT ) + @Excel(name = "纬度", type = Excel.Type.EXPORT) @ApiModelProperty("纬度") private String latitude; @@ -163,7 +163,7 @@ public class BasicInformation extends BaseModel { private Integer isFmqd; @ApiModelProperty("计划投资额") - @Excel(name = "计划投资额",type = Excel.Type.EXPORT ) + @Excel(name = "计划投资额", type = Excel.Type.EXPORT) private BigDecimal jhtze; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/request/BasicInformationPageReq.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/request/BasicInformationPageReq.java index 5189c3f..9f82f19 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/request/BasicInformationPageReq.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/request/BasicInformationPageReq.java @@ -25,13 +25,9 @@ public class BasicInformationPageReq { private String xmfrdwxz; @ApiModelProperty("建设起止时间-开始时间 yyyy-MM") -// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM", timezone = "GMT+8") -// @DateTimeFormat(pattern = "yyyy-MM") private String startTime; @ApiModelProperty("建设起止时间-结束时间 yyyy-MM") -// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM", timezone = "GMT+8") -// @DateTimeFormat(pattern = "yyyy-MM") private String endTime; @ApiModelProperty("现状分类") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/XmhxDetail/XmhxDetail.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/XmhxDetail/XmhxDetail.java index 1739a57..44715f1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/XmhxDetail/XmhxDetail.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/XmhxDetail/XmhxDetail.java @@ -13,6 +13,11 @@ public class XmhxDetail { @ApiModelProperty("要素名称") private String ysmc; + public XmhxDetail(String ysmc, String pjpm) { + this.ysmc = ysmc; + this.pjpm = pjpm; + } + @ApiModelProperty("具体数值") private String pjpm; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BuildingInformationMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BuildingInformationMapper.java index b8193a7..20ba082 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BuildingInformationMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BuildingInformationMapper.java @@ -22,5 +22,20 @@ public interface BuildingInformationMapper extends BaseMapper selectAll(@Param("req") ZwIdPageReq zwIdPageReq); + + /** + * 分组之后拿到每个项目id对应的一个每个值都是max的楼栋 + */ + BuildingInformation getOneXmIdToMax(@Param("id") Long id); + + /** + * 最大值 + */ + BuildingInformation getAllMax(); + + /** + * 查询所有的建筑信息,只保留是重要楼栋的max条 + */ + List getImportantBuildings(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/XmpjqdMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/XmpjqdMapper.java index fc3c340..37c0c7c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/XmpjqdMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/XmpjqdMapper.java @@ -37,30 +37,22 @@ public interface XmpjqdMapper extends BaseMapper { */ List selectOnePj(@Param("id") Long id); - /** - * 查询所有的建筑信息,只保留是重要楼栋的第一条 - */ - List getImportantBuildings(); - /** - * 通过主键查询单条项目画像 - * - * @param id 主键 - * @return 单条数据 + * 总投资额本项目 */ - List oneXmhx(@Param("id") Serializable id); + XmhxDetail meZtze(@Param("id") Long id); /** * 总投资额中位数 */ - List zwsXmhx(); + List zwsZtze(); /** - * 最大值 + * 总投资额最大值 */ - List maxXmhx(); + XmhxDetail zdzZtze(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BuildingInformationService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BuildingInformationService.java index dffebc0..9f7f882 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BuildingInformationService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BuildingInformationService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.gysl.entity.BuildingInformation; import com.ruoyi.gysl.entity.request.ZwIdPageReq; +import javax.management.Query; import java.util.List; /** @@ -21,5 +22,22 @@ public interface BuildingInformationService extends IService selectAll(ZwIdPageReq zwIdPageReq); + + + /** + * 分组之后拿到每个项目id对应的一个每个值都是max的楼栋 + */ + BuildingInformation getOneXmIdToMax(Long id); + + /** + * 所有数据的最大值 + */ + BuildingInformation getAllMax(); + + /** + * 查询所有的建筑信息,只保留是重要楼栋的max条 + */ + List getImportantBuildings(); } + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BuildingInformationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BuildingInformationServiceImpl.java index 4228f3f..cbdc95e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BuildingInformationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BuildingInformationServiceImpl.java @@ -28,5 +28,29 @@ public class BuildingInformationServiceImpl extends ServiceImpl selectAll(ZwIdPageReq zwIdPageReq) { return baseMapper.selectAll(zwIdPageReq); } + + /** + * 分组之后拿到每个项目id对应的一个每个值都是max的楼栋 + */ + @Override + public BuildingInformation getOneXmIdToMax(Long id) { + return baseMapper.getOneXmIdToMax(id); + } + + /** + * 最大值 + */ + @Override + public BuildingInformation getAllMax() { + return baseMapper.getAllMax(); + } + + /** + * 查询所有的建筑信息,只保留是重要楼栋Max + */ + @Override + public List getImportantBuildings() { + return baseMapper.getImportantBuildings(); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java index 5be3c82..e96e9e2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.gysl.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.gysl.entity.BuildingInformation; +import com.ruoyi.gysl.entity.Pjpz; import com.ruoyi.gysl.entity.Xmpjqd; import com.ruoyi.gysl.entity.request.XmpjqdPageReq; import com.ruoyi.gysl.entity.response.XmhxDetail.XmhxDetail; @@ -66,72 +67,11 @@ public class XmpjqdServiceImpl extends ServiceImpl impleme public List selectOnePj(Long id) { List xmpjqdOneResponses = xmpjqdMapper.selectOnePj(id); //获取项目评价配置 - pjpzService.list().forEach(x->{ + pjpzService.list().forEach(x -> { XmpjqdOneResponse xr = new XmpjqdOneResponse(); xr.setYsmc(x.getPjys()); xmpjqdOneResponses.add(xr); }); - //查询所有的建筑信息,只保留是重要楼栋的随机一条 -// List list = xmpjqdMapper.getImportantBuildings(); - -// //层数 -// list.sort(Comparator.comparing(BuildingInformation::getFloor).reversed()); -// XmpjqdOneResponse a1 = new XmpjqdOneResponse(); -// a1.setYsmc("层数"); -// for (int i = 0; i < list.size(); i++) { -// if (Objects.equals(list.get(i).getXmId(), id)) { -// a1.setPjpm(i + 1); -// } -// } -// a1.setCount(String.valueOf(list.size())); -// xmpjqdOneResponses.add(a1); -// //首层层高 -// XmpjqdOneResponse a2 = new XmpjqdOneResponse(); -// list.sort(Comparator.comparing(BuildingInformation::getScgd).reversed()); -// a2.setYsmc("首层层高"); -// for (int i = 0; i < list.size(); i++) { -// if (Objects.equals(list.get(i).getXmId(), id)) { -// a2.setPjpm(i + 1); -// } -// } -// a2.setCount(String.valueOf(list.size())); -// xmpjqdOneResponses.add(a2); -// -// //二层及以上层高 -// XmpjqdOneResponse a3 = new XmpjqdOneResponse(); -// list.sort(Comparator.comparing(BuildingInformation::getTwoAndFourCg).reversed()); -// a3.setYsmc("二层及以上层高"); -// for (int i = 0; i < list.size(); i++) { -// if (Objects.equals(list.get(i).getXmId(), id)) { -// a3.setPjpm(i + 1); -// } -// } -// a3.setCount(String.valueOf(list.size())); -// xmpjqdOneResponses.add(a3); -// -// //首层地面载荷 -// XmpjqdOneResponse a4 = new XmpjqdOneResponse(); -// list.sort(Comparator.comparing(BuildingInformation::getScdmhz).reversed()); -// a4.setYsmc("首层地面载荷"); -// for (int i = 0; i < list.size(); i++) { -// if (Objects.equals(list.get(i).getXmId(), id)) { -// a4.setPjpm(i + 1); -// } -// } -// a4.setCount(String.valueOf(list.size())); -// xmpjqdOneResponses.add(a4); -// -// //二层及以上楼面荷载 -// XmpjqdOneResponse a5 = new XmpjqdOneResponse(); -// list.sort(Comparator.comparing(BuildingInformation::getTwoAndThreeLmhz).reversed()); -// a5.setYsmc("二层及以上楼面荷载"); -// for (int i = 0; i < list.size(); i++) { -// if (Objects.equals(list.get(i).getXmId(), id)) { -// a5.setPjpm(i + 1); -// } -// } -// a5.setCount(String.valueOf(list.size())); -// xmpjqdOneResponses.add(a5); return xmpjqdOneResponses; } @@ -143,122 +83,120 @@ public class XmpjqdServiceImpl extends ServiceImpl impleme */ @Override public List oneXmhx(Serializable id) { + //返回体 List obj = new ArrayList<>(); - XmhxResponse xr = new XmhxResponse(); - xr.setType(1); - xr.setList(xmpjqdMapper.maxXmhx()); - - XmhxResponse xr1 = new XmhxResponse(); - List xmhxDetails = xmpjqdMapper.oneXmhx(id); - BuildingInformation one = buildingInformationService.lambdaQuery() - .eq(BuildingInformation::getXmId, id) - .eq(BuildingInformation::getSfwzyld, 1) - .groupBy(BuildingInformation::getXmId).one(); - if (one != null) { - XmhxDetail a1 = new XmhxDetail(); - a1.setYsmc("层数"); - a1.setPjpm(one.getFloor() == null ? "" : String.valueOf(one.getFloor())); - XmhxDetail a2 = new XmhxDetail(); - a2.setYsmc("首层层高"); - a2.setPjpm(String.valueOf(one.getScgd() == null ? "" : one.getScgd())); - XmhxDetail a3 = new XmhxDetail(); - a3.setYsmc("二层及以上层高"); - a3.setPjpm(String.valueOf(one.getTwoAndFourCg() == null ? "" : one.getTwoAndFourCg())); - XmhxDetail a4 = new XmhxDetail(); - a4.setYsmc("二层及以上楼面荷载"); - a4.setPjpm(String.valueOf(one.getTwoAndThreeLmhz() == null ? "" : one.getTwoAndThreeLmhz())); - xr1.setType(2); - xmhxDetails.add(a1); - xmhxDetails.add(a2); - xmhxDetails.add(a3); - xmhxDetails.add(a4); - xr1.setList(xmhxDetails); - } else { - xr1.setType(2); - xr1.setList(new ArrayList<>()); - } - - XmhxResponse xr2 = new XmhxResponse(); - xr2.setType(3); - List zws = new ArrayList<>(); - //总投资额 - List bigDecimals = xmpjqdMapper.zwsXmhx(); - XmhxDetail z1 = getXmhxDetails(bigDecimals, "总投资额"); - zws.add(z1); - //获取建筑信息表 - List ib = xmpjqdMapper.getImportantBuildings(); - //层数拿出来 - List floor = ib.stream() - .map(BuildingInformation::getFloor) - .filter(Objects::nonNull) - .sorted() - .collect(Collectors.toList()); - XmhxDetail xmhxDetail = new XmhxDetail(); - xmhxDetail.setYsmc("层数"); - if (floor.size() % 2 == 1) { - xmhxDetail.setPjpm(String.valueOf(floor.get(floor.size() / 2))); - } else { - if(!floor.isEmpty()){ - Integer lower = floor.get(floor.size() / 2 - 1); - Integer upper = floor.get(floor.size() / 2); - xmhxDetail.setPjpm(String.valueOf((lower + upper) / 2)); - }else { - xmhxDetail.setPjpm("0"); + //最大值 + BuildingInformation allMax = buildingInformationService.getAllMax(); + //本项目 + BuildingInformation th = buildingInformationService.getOneXmIdToMax((Long) id); + //查询所有的建筑信息,只保留是重要楼栋的max条 + List ib = buildingInformationService.getImportantBuildings(); + //获取项目评价配置数据 + List list = pjpzService.list(); + list.forEach(x -> { + XmhxResponse xr1 = new XmhxResponse(); + xr1.setType(1); + List l1 = new ArrayList<>(); + XmhxResponse xr2 = new XmhxResponse(); + xr2.setType(2); + List l2 = new ArrayList<>(); + XmhxResponse xr3 = new XmhxResponse(); + xr3.setType(3); + List l3 = new ArrayList<>(); + if (allMax != null && th != null) { + switch (x.getPjys()) { + case "总投资额": + l1.add(xmpjqdMapper.zdzZtze()); + l2.add(xmpjqdMapper.meZtze((Long) id)); + l3.add(getXmhxDetails(xmpjqdMapper.zwsZtze(), "总投资额")); + break; + case "层数": + l1.add(new XmhxDetail("层数", String.valueOf(allMax.getFloor()))); + l2.add(new XmhxDetail("层数", String.valueOf(th.getFloor()))); + //层数拿出来 + List floor = ib.stream() + .map(BuildingInformation::getFloor) + .filter(Objects::nonNull) + .sorted() + .collect(Collectors.toList()); + String s; + if (floor.size() % 2 == 1) { + s = String.valueOf(floor.get(floor.size() / 2)); + } else { + if (!floor.isEmpty()) { + Integer lower = floor.get(floor.size() / 2 - 1); + Integer upper = floor.get(floor.size() / 2); + s = String.valueOf((lower + upper) / 2); + } else { + s = "0"; + } + } + l3.add(new XmhxDetail("层数", s)); + break; + case "首层层高": + l1.add(new XmhxDetail("首层层高", String.valueOf(allMax.getScgd()))); + l2.add(new XmhxDetail("首层层高", String.valueOf(th.getScgd()))); + List sccg = ib.stream() + .map(BuildingInformation::getScgd) + .filter(Objects::nonNull) + .sorted() + .collect(Collectors.toList()); + l3.add(getXmhxDetails(sccg, "首层层高")); + break; + case "二层及以上层高": + l1.add(new XmhxDetail("二层及以上层高", String.valueOf(allMax.getTwoAndFourCg()))); + l2.add(new XmhxDetail("二层及以上层高", String.valueOf(th.getTwoAndFourCg()))); + List ec = ib.stream() + .map(BuildingInformation::getTwoAndFourCg) + .filter(Objects::nonNull) + .sorted() + .collect(Collectors.toList()); + l3.add(getXmhxDetails(ec, "二层及以上层高")); + break; + case "二层及以上楼面荷载": + l1.add(new XmhxDetail("二层及以上楼面荷载", String.valueOf(allMax.getTwoAndThreeLmhz()))); + l2.add(new XmhxDetail("二层及以上楼面荷载", String.valueOf(th.getTwoAndThreeLmhz()))); + List zh = ib.stream() + .map(BuildingInformation::getTwoAndThreeLmhz) + .filter(Objects::nonNull) + .sorted() + .collect(Collectors.toList()); + l3.add(getXmhxDetails(zh, "二层及以上楼载荷")); + break; + default: + l1.add(new XmhxDetail(x.getPjys(), null)); + l2.add(new XmhxDetail(x.getPjys(), null)); + l3.add(new XmhxDetail(x.getPjys(), null)); + break; + } } - } - zws.add(xmhxDetail); - //首层层高 - List sccg = ib.stream() - .map(BuildingInformation::getScgd) - .filter(Objects::nonNull) - .sorted() - .collect(Collectors.toList()); - zws.add(getXmhxDetails(sccg, "首层层高")); - //二层及以上层高 - List ec = ib.stream() - .map(BuildingInformation::getTwoAndFourCg) - .filter(Objects::nonNull) - .sorted() - .collect(Collectors.toList()); - zws.add(getXmhxDetails(ec, "二层及以上层高")); - //二层及以上楼载荷 - List zh = ib.stream() - .map(BuildingInformation::getTwoAndThreeLmhz) - .filter(Objects::nonNull) - .sorted() - .collect(Collectors.toList()); - zws.add(getXmhxDetails(zh, "二层及以上楼载荷")); - - xr2.setList(zws); - obj.add(xr); - obj.add(xr1); - obj.add(xr2); + xr1.setList(l1); + xr2.setList(l2); + xr3.setList(l3); + }); return obj; } private static XmhxDetail getXmhxDetails(List bigDecimals, String content) { - XmhxDetail xmhxDetail = new XmhxDetail(); - xmhxDetail.setYsmc(content); + String s; int length = bigDecimals.size(); int middleIndex = length / 2; // 根据奇偶性计算中位数 if (length % 2 == 1) { - xmhxDetail.setPjpm(String.valueOf(bigDecimals.get(middleIndex))); + s = String.valueOf(bigDecimals.get(middleIndex)); } else { - if(!bigDecimals.isEmpty()){ + if (!bigDecimals.isEmpty()) { BigDecimal lower = bigDecimals.get(middleIndex - 1); BigDecimal upper = bigDecimals.get(middleIndex); - xmhxDetail.setPjpm( - String.valueOf( - lower.add(upper) - .divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP) // 2 表示保留两位小数 - ) + s = String.valueOf( + lower.add(upper) + .divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP) // 2 表示保留两位小数 ); - }else { - xmhxDetail.setPjpm("0"); + } else { + s = "0"; } } - return xmhxDetail; + return new XmhxDetail(content, s); } } diff --git a/ruoyi-admin/src/main/resources/mapper/BuildingInformationMapper.xml b/ruoyi-admin/src/main/resources/mapper/BuildingInformationMapper.xml index 92874f7..c88e63c 100644 --- a/ruoyi-admin/src/main/resources/mapper/BuildingInformationMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/BuildingInformationMapper.xml @@ -10,6 +10,46 @@ + + + diff --git a/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml b/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml index 37050da..d29ce3e 100644 --- a/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml @@ -31,7 +31,7 @@ - - + select IFNULL(MAX(ztze),0) as pjpm, + '总投资额' as ysmc from gysl_basic_information - where id = #{id} - - - SELECT ztze FROM gysl_basic_information where ztze is not null order by ztze desc + diff --git a/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml b/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml index 7c7c5e9..4e5a365 100644 --- a/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml @@ -72,95 +72,84 @@ diff --git a/ruoyi-admin/src/main/resources/ztbgmb.docx b/ruoyi-admin/src/main/resources/ztbgmb.docx index c5beacf5e53a58b5bbc5912a0fbdceb961a6a292..3905b52648f9b8fbf06ec87b235362a865a145f3 100644 GIT binary patch delta 5991 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 delta 6027 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