From 757d82df97001840466e474df4c81b85bf615978 Mon Sep 17 00:00:00 2001 From: Yen Date: Tue, 18 Jul 2023 19:04:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E6=9C=AC=E4=B8=AD=E5=BF=83=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bms/entity/BmsCenterExtendBuild.java | 11 +- .../bms/entity/vo/BmsCenterExtendTreeVo.java | 3 + .../impl/BmsCenterExtendBuildServiceImpl.java | 145 ++++++++++++------ .../impl/BmsCenterExtendServiceImpl.java | 1 + 4 files changed, 107 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java b/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java index 338a8216..955e8cf1 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java @@ -36,11 +36,7 @@ public class BmsCenterExtendBuild implements Serializable { /** 来源id */ @NotNull(message = "来源id不能为空") - private Long sourceId; - - /** 祖级id */ - @Length(max = 255,message = "祖级id长度不能超过255字") - private String pathIds; + private Long rowId; private String pathCenterIds; @@ -85,6 +81,9 @@ public class BmsCenterExtendBuild implements Serializable { @NotNull(message = "结束标识不能为空") private Integer stopFlag; + /** 仅用于测试 */ + private Integer lastType; + /** 权重 */ @NotNull(message = "权重不能为空") private BigDecimal weightRate; @@ -127,8 +126,6 @@ public class BmsCenterExtendBuild implements Serializable { public static BmsCenterExtendBuild toNewObject(BmsCenterExtendBuild source){ BmsCenterExtendBuild centerExtendBuild = new BmsCenterExtendBuild(); centerExtendBuild.setId(source.getId()); - centerExtendBuild.setSourceId(source.getSourceId()); - centerExtendBuild.setPathIds(source.getPathIds()); centerExtendBuild.setCenterType(source.getCenterType()); centerExtendBuild.setCenterId(source.getCenterId()); centerExtendBuild.setCenterCode(source.getCenterCode()); diff --git a/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java b/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java index c7c823a8..027a47b9 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java @@ -25,6 +25,9 @@ public class BmsCenterExtendTreeVo { private Long id; + //结束行id + private Long stopRowId; + //组合id private String comboId; diff --git a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java index d7eff705..4b6c697a 100644 --- a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java @@ -2,6 +2,7 @@ package com.qs.serve.modules.bms.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qs.serve.common.model.dto.TreeNode; +import com.qs.serve.common.util.CollectionUtil; import com.qs.serve.modules.bms.common.CenterExtendBuildType; import com.qs.serve.modules.bms.entity.vo.BmsCenterExtendTreeVo; import com.qs.serve.modules.bms.service.BmsCenterExtendService; @@ -13,9 +14,7 @@ import com.qs.serve.modules.bms.service.BmsCenterExtendBuildService; import com.qs.serve.modules.bms.mapper.BmsCenterExtendBuildMapper; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * 后继成本中心 服务实现类 @@ -34,35 +33,27 @@ public class BmsCenterExtendBuildServiceImpl extends ServiceImpl treeVoList = centerExtendService.transferTree(); List buildTreeList = new ArrayList<>(); List buildDataList = new ArrayList<>(); - this.recursionBuildExtendCenter(treeVoList,treeVoList, buildTreeList,buildDataList, null); - this.saveBatch(buildTreeList); + this.recursionBuildExtendCenter(treeVoList,treeVoList, buildTreeList,buildDataList); + //this.saveBatch(buildTreeList); this.saveBatch(buildDataList); } - private void recursionBuildExtendCenter(List allTreeList,List childList, List buildTreeList,List buildDataList, BmsCenterExtendBuild parent) { + private void recursionBuildExtendCenter(List allTreeList,List childList, List buildTreeList,List buildDataList) { //存放上级对象 for (BmsCenterExtendTreeVo source : childList) { BmsCenterExtendBuild build = new BmsCenterExtendBuild(); build.setBuildType(CenterExtendBuildType.TREE); - build.setSourceId(source.getSourceId()); - if(parent !=null){ - String[] centerIds = parent.getPathCenterIds().split("_"); - for (String centerId : centerIds) { - if(centerId.equals(source.getCenterId())){ - build.setBuildType(CenterExtendBuildType.ERROR); - break; - } - } - build.setPathIds(parent.getPathIds() + "_" + source.getId()); - build.setPathCenterIds(parent.getPathCenterIds() + "_" + source.getCenterId()); - build.setPathCenterIds(parent.getPathCenterCodes() + "_" + source.getCenterCode()); - build.setPathCenterIds(parent.getPathCenterNames() + "_" + source.getCenterName()); - }else { - build.setPathIds(source.getId()+""); - build.setPathCenterIds(source.getCenterId()); - build.setPathCenterCodes(source.getCenterCode()); - build.setPathCenterNames(source.getCenterName()); + build.setRowId(source.getId()); + + String[] centerIds = source.getPathCenterIds().split("_"); + Set centerIdsSet = new HashSet<>(Arrays.asList(centerIds)); + if(centerIds.length!=centerIdsSet.size()){ + build.setBuildType(CenterExtendBuildType.ERROR); } + build.setPathCenterIds(source.getPathCenterIds()); + build.setPathCenterCodes(source.getPathCenterCodes()); + build.setPathCenterNames(source.getPathCenterNames()); + build.setCenterType(source.getCenterType()); build.setCenterId(source.getCenterId()); build.setCenterCode(source.getCenterCode()); @@ -71,48 +62,97 @@ public class BmsCenterExtendBuildServiceImpl extends ServiceImpl parents = new ArrayList<>(); - this.filterParents(allTreeList, source, parents); + List allTreeToList = new ArrayList<>(); + this.buildAllTreeToList(allTreeList,allTreeToList); + this.filterParentTreeList(allTreeToList, build.getCenterType(), build.getPathCenterIds(), parents); //修改为 从上往下 Collections.reverse(parents); for (int i = 0; i < parents.size(); i++) { BmsCenterExtendTreeVo treeVo = parents.get(i); - //计算父级节点比率 + //TODO:感觉不对,需要测试 计算父级节点比率 BigDecimal currParentWeightRate = treeVo.getWeightRate(); - String pathIds = treeVo.getSourceId().toString(); - String pathCenterIds = treeVo.getSourceId().toString(); - String pathCenterCodes = treeVo.getCenterCode(); - String pathCenterNames = treeVo.getCenterName(); for (int j = i+1; j < parents.size(); j++) { BmsCenterExtendTreeVo nextTreeVo = parents.get(j); - currParentWeightRate = currParentWeightRate.multiply(nextTreeVo.getWeightRate()); - pathIds = nextTreeVo.getSourceId() + "_"+pathIds; - pathCenterIds = nextTreeVo.getCenterId() + "_"+pathCenterIds; - pathCenterCodes = nextTreeVo.getCenterCode() + "_"+pathCenterCodes; - pathCenterNames = nextTreeVo.getCenterName() + "_"+pathCenterNames; + //解决分叉,问题导致费用率异常 + if(nextTreeVo.getPathCenterIds().contains(treeVo.getPathCenterIds())){ + currParentWeightRate = currParentWeightRate.multiply(nextTreeVo.getWeightRate()) + .divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN); + }else { + break; + } } - BmsCenterExtendBuild buildParentData = this.buildDataByTreeVo(treeVo, currParentWeightRate); - buildParentData.setPathIds(pathIds+"_"+buildData.getSourceId()); - buildParentData.setPathCenterIds(pathCenterIds); - buildParentData.setPathCenterCodes(pathCenterCodes); - buildParentData.setPathCenterNames(pathCenterNames); + BmsCenterExtendBuild buildParentData = this.buildDataByTreeVo(source, currParentWeightRate); + buildParentData.setRowId(treeVo.getId()); + buildParentData.setPathCenterIds(treeVo.getPathCenterIds()); + buildParentData.setPathCenterCodes(treeVo.getPathCenterCodes()); + buildParentData.setPathCenterNames(treeVo.getPathCenterNames()); + buildParentData.setLastType(3); buildDataList.add(buildParentData); } + + /*//提取父级节点(有分支的) + List parents = new ArrayList<>(); + List allTreeToList = new ArrayList<>(); + this.buildAllTreeToList(allTreeList,allTreeToList); + this.filterParents(allTreeToList, source, parents); + //修改为 从上往下 + Collections.reverse(parents); + for (int i = 0; i < parents.size(); i++) { + BmsCenterExtendTreeVo treeVo = parents.get(i); + //计算父级节点比率 + BigDecimal currParentWeightRate = treeVo.getWeightRate(); + for (int j = i+1; j < parents.size(); j++) { + BmsCenterExtendTreeVo nextTreeVo = parents.get(j); + currParentWeightRate = currParentWeightRate.multiply(nextTreeVo.getWeightRate()) + .divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN); + } + BmsCenterExtendBuild buildParentData = this.buildDataByTreeVo(source, currParentWeightRate); + buildParentData.setRowId(treeVo.getId()); + buildParentData.setPathCenterIds(treeVo.getPathCenterIds()); + buildParentData.setPathCenterCodes(treeVo.getPathCenterCodes()); + buildParentData.setPathCenterNames(treeVo.getPathCenterNames()); + buildParentData.setLastType(3); + buildDataList.add(buildParentData); + }*/ }else { //递归调用 - this.recursionBuildExtendCenter(allTreeList,source.getChildren(), buildTreeList,buildDataList, build); + this.recursionBuildExtendCenter(allTreeList,source.getChildren(), buildTreeList,buildDataList); + } + } + } + + /** + * 过滤父级列表 + * @param allTreeList + * @param centerType + * @param pathCenterIds + * @param outDataParents + */ + private void filterParentTreeList(List allTreeList, String centerType, String pathCenterIds, List outDataParents) { + if(pathCenterIds.contains("_")){ + pathCenterIds = pathCenterIds.substring(0,pathCenterIds.lastIndexOf("_")); + for (BmsCenterExtendTreeVo treeVo : allTreeList) { + if(treeVo.getCenterType().equals(centerType)&& treeVo.getPathCenterIds().equals(pathCenterIds)){ + outDataParents.add(treeVo); + this.filterParentTreeList(allTreeList,centerType,treeVo.getPathCenterIds(),outDataParents); + } } } } @@ -125,8 +165,8 @@ public class BmsCenterExtendBuildServiceImpl extends ServiceImpl allTreeList,List outDataList){ + outDataList.addAll(allTreeList); + for (BmsCenterExtendTreeVo treeVo : allTreeList) { + if(CollectionUtil.isNotEmpty(treeVo.getChildren())){ + this.buildAllTreeToList(treeVo.getChildren(),outDataList); + } + } + } + /** * 过滤获取父级节点(自下而上) * @param allTreeList @@ -152,7 +206,6 @@ public class BmsCenterExtendBuildServiceImpl extends ServiceImpl