package biz.report;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Comparator;
|
import java.util.List;
|
|
import biz.constants.IReportConstant;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.json.IJSONProvider;
|
import foundation.json.IJSONWriter;
|
import foundation.util.MapList;
|
|
public class RankEntitySet implements IJSONProvider{
|
private MapList<String, RankEntitySet> children;
|
private List<RankEntity> entitySet; //当前级
|
private String keyField;
|
private String[] rankFields;
|
|
public RankEntitySet(EntitySet dataSet, String keyField, String[] rankFields) {
|
this.rankFields = rankFields;
|
this.entitySet = new ArrayList<RankEntity>();
|
this.children = new MapList<String, RankEntitySet>();
|
this.keyField = keyField;
|
|
for (Entity entity : dataSet) {
|
RankEntity rankEntity = new RankEntity(entity);
|
appendOne(rankEntity);
|
}
|
}
|
|
public RankEntitySet(String keyField, String[] rankFields) {
|
this.rankFields = rankFields;
|
entitySet = new ArrayList<RankEntity>();
|
children = new MapList<String, RankEntitySet>();
|
this.keyField = keyField;
|
}
|
|
public void appendOne(RankEntity rankEntity) {
|
Entity entity = rankEntity.getEntity();
|
String keyValue = entity.getString(keyField);
|
|
if(!IReportConstant.FIELD_Position_Duty.equals(keyField)) {
|
// 根据上级分组
|
RankEntitySet childrenRank = children.contains(keyValue) ? children.get(keyValue): new RankEntitySet(keyField, rankFields);
|
childrenRank.entitySet.add(rankEntity);
|
children.add(keyValue, childrenRank);
|
return ;
|
}
|
|
// 根据层级分组
|
if (IReportConstant.Duty_SalesDirector.equals(keyValue)) {
|
entitySet.add(rankEntity);
|
return ;
|
}
|
|
String nextKeyField = "position_level1";
|
if (!IReportConstant.Duty_SalesRegionDirector.equals(keyValue)) {
|
nextKeyField = "position_level2";
|
keyValue = IReportConstant.Duty_Sales;
|
}
|
|
RankEntitySet childrenRank = children.contains(keyValue)? children.get(keyValue): new RankEntitySet(nextKeyField, rankFields);
|
childrenRank.appendOne(rankEntity);
|
childrenRank.entitySet.add(rankEntity);
|
children.add(keyValue, childrenRank);
|
|
return ;
|
}
|
|
public void calculateRank() {
|
for (int fieldIndex = 0; fieldIndex < rankFields.length; fieldIndex++) {
|
String measureField = rankFields[fieldIndex] + "_sum";
|
Collections.sort(entitySet, new Comparator<RankEntity>() {
|
@Override
|
public int compare(RankEntity rankEntity1, RankEntity rankEntity2) {
|
Entity entity1 = rankEntity1.getEntity();
|
Entity entity2 = rankEntity2.getEntity();
|
BigDecimal value1 = entity1.getBigDecimal(measureField, BigDecimal.ZERO);
|
BigDecimal value2 = entity2.getBigDecimal(measureField, BigDecimal.ZERO);
|
return -value1.compareTo(value2); // 降序排序
|
}
|
});
|
|
int rankNo = 1;
|
for (RankEntity rankEntity : entitySet) {
|
rankEntity.setRank(fieldIndex, rankNo++);
|
}
|
}
|
|
|
List<RankEntity> allNextLevel = new ArrayList<RankEntity>();
|
for (RankEntitySet child : children) {
|
allNextLevel.addAll(allNextLevel.size(), child.getEntitySet());
|
}
|
// all child rank in whole
|
for (int fieldIndex = 0; fieldIndex < rankFields.length; fieldIndex++) {
|
String measureField = rankFields[fieldIndex] + "_sum";
|
Collections.sort(allNextLevel, new Comparator<RankEntity>() {
|
@Override
|
public int compare(RankEntity rankEntity1, RankEntity rankEntity2) {
|
Entity entity1 = rankEntity1.getEntity();
|
Entity entity2 = rankEntity2.getEntity();
|
BigDecimal value1 = entity1.getBigDecimal(measureField, BigDecimal.ZERO);
|
BigDecimal value2 = entity2.getBigDecimal(measureField, BigDecimal.ZERO);
|
return -value1.compareTo(value2); // 降序排序
|
}
|
});
|
|
int allRankNo = 1;
|
for (RankEntity rankEntity : allNextLevel) {
|
rankEntity.setAllRank(fieldIndex, allRankNo++);
|
}
|
}
|
|
// child rank in up level
|
for (RankEntitySet child : children) {
|
child.calculateRank();
|
}
|
}
|
|
public String[] getRankFields() {
|
return rankFields;
|
}
|
|
public List<RankEntity> getEntitySet() {
|
return entitySet;
|
}
|
|
@Override
|
public void writeJSON(IJSONWriter writer) {
|
int rankFieldLength = rankFields.length;
|
writer.beginArray();
|
|
for (RankEntity rankEntity : entitySet) {
|
writer.beginObject();
|
rankEntity.writeJSON(writer);
|
|
for (int i = 0; i < rankFieldLength; i++) {
|
writer.write(rankFields[i] + IReportConstant.Suffix_Rank, rankEntity.getRank(i));
|
writer.write(rankFields[i] + IReportConstant.Suffix_AllRank, rankEntity.getAllRank(i));
|
}
|
writer.endObject();
|
}
|
|
for (RankEntitySet child : children) {
|
List<RankEntity> childSet = child.getEntitySet();
|
for (RankEntity rankEntity : childSet) {
|
writer.beginObject();
|
rankEntity.writeJSON(writer);
|
|
for (int i = 0; i < rankFieldLength; i++) {
|
writer.write(rankFields[i] + IReportConstant.Suffix_Rank, rankEntity.getRank(i));
|
writer.write(rankFields[i] + IReportConstant.Suffix_AllRank, rankEntity.getAllRank(i));
|
}
|
writer.endObject();
|
}
|
}
|
|
writer.endArray();
|
}
|
|
}
|