Browse Source

成本中心重构

contract
Yen 2 years ago
parent
commit
757d82df97
  1. 11
      src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java
  2. 3
      src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java
  3. 145
      src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java
  4. 1
      src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendServiceImpl.java

11
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());

3
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;

145
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<BmsCenterExtend
List<BmsCenterExtendTreeVo> treeVoList = centerExtendService.transferTree();
List<BmsCenterExtendBuild> buildTreeList = new ArrayList<>();
List<BmsCenterExtendBuild> 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<BmsCenterExtendTreeVo> allTreeList,List<BmsCenterExtendTreeVo> childList, List<BmsCenterExtendBuild> buildTreeList,List<BmsCenterExtendBuild> buildDataList, BmsCenterExtendBuild parent) {
private void recursionBuildExtendCenter(List<BmsCenterExtendTreeVo> allTreeList,List<BmsCenterExtendTreeVo> childList, List<BmsCenterExtendBuild> buildTreeList,List<BmsCenterExtendBuild> 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<String> 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<BmsCenterExtend
build.setStopTime(source.getStopTime());
build.setStopFlag(source.getStopFlag());
build.setWeightRate(source.getWeightRate());
//是否有子节点
boolean lastFlag = source.getChildren()==null||source.getChildren().size()==0;
build.setLastType(1);
buildTreeList.add(build);
//判断是否最后一级
if(source.getChildren()==null||source.getChildren().size()==0){
if(lastFlag){
//自下而上查询返回所有占比
BmsCenterExtendBuild buildData = buildDataByTreeVo(source,source.getWeightRate());
buildData.setPathIds(build.getPathIds());
buildData.setPathCenterIds(build.getPathCenterIds());
buildData.setPathCenterCodes(build.getPathCenterCodes());
buildData.setPathCenterNames(build.getPathCenterNames());
//自身lastType==2
buildData.setLastType(2);
buildDataList.add(buildData);
//提取父级节点
List<BmsCenterExtendTreeVo> parents = new ArrayList<>();
this.filterParents(allTreeList, source, parents);
List<BmsCenterExtendTreeVo> 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<BmsCenterExtendTreeVo> parents = new ArrayList<>();
List<BmsCenterExtendTreeVo> 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<BmsCenterExtendTreeVo> allTreeList, String centerType, String pathCenterIds, List<BmsCenterExtendTreeVo> 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<BmsCenterExtend
*/
private BmsCenterExtendBuild buildDataByTreeVo(BmsCenterExtendTreeVo source, BigDecimal currParentWeightRate) {
BmsCenterExtendBuild parentData = new BmsCenterExtendBuild();
parentData.setRowId(source.getId());
parentData.setBuildType(CenterExtendBuildType.DATA);
parentData.setSourceId(source.getSourceId());
parentData.setCenterType(source.getCenterType());
parentData.setCenterId(source.getCenterId());
parentData.setCenterCode(source.getCenterCode());
@ -138,6 +178,20 @@ public class BmsCenterExtendBuildServiceImpl extends ServiceImpl<BmsCenterExtend
return parentData;
}
/**
* 树数据转list
* @param allTreeList
* @param outDataList
*/
private void buildAllTreeToList(List<BmsCenterExtendTreeVo> allTreeList,List<BmsCenterExtendTreeVo> 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<BmsCenterExtend
if(!treeVo.getComboParentId().equals("0")){
this.filterParents(allTreeList,treeVo,parents);
}
break;
}
}
}

1
src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendServiceImpl.java

@ -126,6 +126,7 @@ public class BmsCenterExtendServiceImpl extends ServiceImpl<BmsCenterExtendMappe
treeNode.setStartTime(exCenter.getStartTime());
treeNode.setStopTime(exCenter.getStopTime());
treeNode.setStopFlag(exCenter.getStopFlag());
//这是分配的比率,不是自身(除ComboParentId=0)
treeNode.setWeightRate(exCenter.getWeightRate());
return treeNode;
}

Loading…
Cancel
Save