package biz.report;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
import biz.constants.IReportConstant;
|
import biz.report.agg.AggDimension;
|
import biz.report.agg.AggPeroid;
|
import biz.report.agg.AggPeroidType;
|
import biz.report.agg.PerformanceEngine;
|
import foundation.dao.DataReader;
|
import foundation.dao.IDataLetter;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.entity.GroupBy;
|
import foundation.data.entity.SummaryFields;
|
import foundation.data.entity.SummaryType;
|
import foundation.data.object.DataObject;
|
import foundation.json.JSONReader;
|
import foundation.json.JType;
|
import foundation.util.Util;
|
import foundation.variant.provider.IVariantsProvider;
|
import foundation.workflow.ActionProvider;
|
|
public class ReportHandler extends ActionProvider{
|
|
@Override
|
protected void publishMethod() {
|
//1. 更新指定报表数据
|
addMethod("oneReportGenerate");
|
|
//2. 更新全部报表数据
|
addMethod("allReportGenerate");
|
|
//3. 聚合计算
|
addMethod("execAgg");
|
|
//4. 排名计算
|
addMethod("getAggRank");
|
}
|
|
public void oneReportGenerate() throws Exception {
|
String reportCode = step.getStepParam();
|
|
if (Util.isEmpty(reportCode)) {
|
if (dataReader == null) {
|
return ;
|
}
|
|
reportCode = dataReader.getString("code");
|
}
|
|
ReportBucket reportBucket = ReportBucket.getInstance();
|
Report report = reportBucket.get(reportCode);
|
|
report.exec();
|
}
|
|
public void allReportGenerate() throws Exception {
|
ReportBucket reportBucket = ReportBucket.getInstance();
|
|
for (Report report : reportBucket) {
|
report.exec();
|
}
|
}
|
|
public void execAgg() throws Exception {
|
String resultId = step.getStepParam();
|
|
if (dataReader != null) {
|
resultId = dataReader.getString("result_id");
|
}
|
|
PerformanceEngine engine = new PerformanceEngine(resultId);
|
engine.init();
|
List<AggDimension> peroidDimensionList = engine.getPeroidDimensionList();
|
|
List<AggPeroid> periods = null;
|
|
if (dataReader != null) {
|
periods = getPeroidByDataReader(dataReader, peroidDimensionList);
|
}
|
else {
|
periods = getPeroidDefault(peroidDimensionList);
|
}
|
|
for (AggPeroid aggPeroid : periods) {
|
engine.setPeroid(aggPeroid);
|
engine.syncExec(engine.getStepCode());
|
}
|
}
|
|
private List<AggPeroid> getPeroidDefault(List<AggDimension> peroidDimensionList) {
|
List<AggPeroid> periods = new ArrayList<AggPeroid>();
|
|
// 获取最小颗粒度
|
AggPeroidType peroidType = AggPeroidType.year;
|
|
for (AggDimension dimension : peroidDimensionList) {
|
if (dimension.isQuarter() && peroidType != AggPeroidType.month) {
|
peroidType = AggPeroidType.quarter;
|
}
|
else if (dimension.isMonth()) {
|
peroidType = AggPeroidType.month;
|
}
|
}
|
|
Date toDate = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(toDate);
|
calendar.add(Calendar.MONTH, -1);
|
Date fromDate = calendar.getTime();
|
|
// 起始时间
|
AggPeroid aggPeroid = creatAggPeroidByDate(fromDate, peroidType);
|
periods.add(aggPeroid);
|
|
// 截止时间
|
aggPeroid = creatAggPeroidByDate(toDate, peroidType);
|
periods.add(aggPeroid);
|
|
return periods;
|
}
|
|
private AggPeroid creatAggPeroidByDate(Date date, AggPeroidType peroidType) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(new Date());
|
int monthNo = calendar.get(Calendar.MONTH) + 1;
|
int season = (monthNo - 1)/3 + 1;
|
int year = calendar.get(Calendar.YEAR);
|
AggPeroid aggPeroid = null;
|
|
if (peroidType == AggPeroidType.year) {
|
aggPeroid = new AggPeroid();
|
aggPeroid.setYear(year);
|
}
|
else if (peroidType == AggPeroidType.quarter) {
|
aggPeroid = new AggPeroid();
|
aggPeroid.setYear(year);
|
aggPeroid.setQuarter(String.valueOf(season));
|
}
|
else if (peroidType == AggPeroidType.month) {
|
String month = monthNo > 10 ? "" + monthNo : "0" + monthNo;
|
aggPeroid = AggPeroid.createByMonth(year, month);
|
}
|
|
return aggPeroid;
|
}
|
|
private List<AggPeroid> getPeroidByDataReader(DataReader dataReader, List<AggDimension> peroidDimensionList) {
|
List<AggPeroid> periods = new ArrayList<AggPeroid>();
|
|
JSONReader periodJson = dataReader.getReader("periord", JType.Object);
|
int year = 0; String months = null, seasons = null;
|
// 获取最小颗粒度
|
int cyclceNum = 12;
|
for (AggDimension dimension : peroidDimensionList) {
|
if (dimension.isYear()) {
|
year = periodJson.getInteger(dimension.getCodeField(), 0);
|
}
|
else if (dimension.isQuarter()) {
|
seasons = periodJson.getString(dimension.getCodeField());
|
cyclceNum = Math.min(cyclceNum, 3);
|
}
|
else if (dimension.isMonth()) {
|
months = periodJson.getString(dimension.getCodeField());
|
cyclceNum = Math.min(cyclceNum, 1);
|
}
|
}
|
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(new Date());
|
int month = calendar.get(Calendar.MONTH) + 1;
|
int season = (month-1)/3 + 1;
|
|
if (Util.isEmpty(year) || year == 0) {
|
year = calendar.get(Calendar.YEAR);
|
}
|
|
if (cyclceNum == AggPeroidType.year.getCycleNum()) {
|
AggPeroid aggPeroid = new AggPeroid();
|
aggPeroid.setYear(year);
|
periods.add(aggPeroid);
|
|
return periods;
|
}
|
else if (cyclceNum == AggPeroidType.quarter.getCycleNum()) {
|
if (Util.isEmpty(seasons)) {
|
seasons = String.valueOf(season);
|
}
|
|
String[] seasonList = seasons.split(",");
|
for (String oneSeason : seasonList) {
|
AggPeroid aggPeroid = new AggPeroid();
|
aggPeroid.setYear(year);
|
aggPeroid.setQuarter(oneSeason);
|
periods.add(aggPeroid);
|
}
|
|
return periods;
|
}
|
|
if (cyclceNum == AggPeroidType.month.getCycleNum()) {
|
if (Util.isEmpty(months)) {
|
months = String.valueOf(month);
|
}
|
|
String[] monthList = months.split(",");
|
for (String oneMonth : monthList) {
|
AggPeroid aggPeroid = AggPeroid.createByMonth(year, oneMonth);
|
periods.add(aggPeroid);
|
}
|
|
return periods;
|
}
|
|
return periods;
|
}
|
|
public void getAggRank() throws Exception {
|
String dataName = dataReader.getString(IDataLetter.DataName);
|
Filter dataFilter = new Filter(dataReader.getString(IDataLetter.Filter));
|
String groupBy = dataReader.getString("group");
|
List<String> sum = dataReader.getStringList("sum");
|
List<String> measureList = dataReader.getStringList("measure");
|
SummaryFields sumFields = SummaryFields.getInstance(sum, SummaryType.sum);
|
SummaryFields cntFields = SummaryFields.getInstance(null, SummaryType.count);
|
|
RankEntitySet rankSet = ReportHandler.getAggRankSet(dataName, sumFields, cntFields, measureList, groupBy, dataFilter);
|
|
dataWriter.addValue(rankSet);
|
}
|
|
public static RankEntitySet getAggRankSet(String dataName, SummaryFields sumFields, SummaryFields cntFields, List<String> measureList, String groupBy, IVariantsProvider... providers) throws Exception {
|
DataObject dataObject = DataObject.getInstance(dataName);
|
String customerizeSql = null;
|
String[] rankFields = measureList.toArray(new String[measureList.size()]);
|
if ("agg_month_position_bu_rank".equals(dataName)) {
|
customerizeSql = "ifnull(sales_actual_sum/sales_bp_sum,0) sales_achieve_sum,"
|
+ "ifnull(implant_actual_sum/implant_bp_sum,0) implant_achieve_sum, "
|
+ "(select step_param_value from v_fee_model_sales_step where ifnull(implant_actual_sum*100/implant_bp_sum,0) >= left_step_level and ifnull(implant_actual_sum*100/implant_bp_sum,0) < right_step_level and type_Code = 'implant' and v_fee_model_sales_step.position_level = sumTable.position_level) implant_factor_sum, "
|
+ "(select step_param_value from v_fee_model_sales_step where ifnull(sales_actual_sum*100/sales_bp_sum,0) >= left_step_level and ifnull(sales_actual_sum*100/sales_bp_sum,0) < right_step_level and type_Code = 'sale' and v_fee_model_sales_step.position_level = sumTable.position_level) sales_factor_sum, "
|
+ "0.9 finished_factor_sum, "
|
+ "(select step_param_value from v_fee_model_sales_step\r\n" +
|
"where v_fee_model_sales_step.position_level = sumTable.position_level and \r\n" +
|
"v_fee_model_sales_step.left_step_level <= ifnull(implant_actual_sum*sales_actual_sum*100/(implant_bp_sum*sales_bp_sum),0) and \r\n" +
|
"v_fee_model_sales_step.right_step_level > ifnull(implant_actual_sum*sales_actual_sum*100/(implant_bp_sum*sales_bp_sum),0) and type_code = 'team') team_factor_sum";
|
}
|
|
EntitySet summarySet = dataObject.getSummary(sumFields.getValue(), cntFields.getValue(), customerizeSql, new GroupBy(groupBy), null, providers);
|
RankEntitySet rankSet = new RankEntitySet(IReportConstant.FIELD_Position_Duty, rankFields);
|
BigDecimal percent60 = new BigDecimal(0.6),percent30 = new BigDecimal(0.3);
|
//分组
|
for (Entity entity : summarySet) {
|
BigDecimal implantFactor = entity.getBigDecimal("implant_factor_sum");
|
BigDecimal salesFactor = entity.getBigDecimal("sales_factor_sum");
|
BigDecimal teamFactor = entity.getBigDecimal("team_factor_sum");
|
String duty = entity.getString("position_duty");
|
if (IReportConstant.Duty_SalesDirector.equals(duty) || IReportConstant.Duty_SalesRegionDirector.equals(duty)) {
|
BigDecimal finishedFactor = teamFactor.multiply(implantFactor.multiply(percent30).add(salesFactor.multiply(percent60)));
|
entity.set("finished_factor_sum", finishedFactor);
|
}
|
else {
|
BigDecimal finishedFactor = implantFactor.multiply(percent60).add(salesFactor.multiply(percent30));
|
entity.set("finished_factor_sum", finishedFactor);
|
}
|
RankEntity rankEntity = new RankEntity(entity);
|
rankSet.appendOne(rankEntity);
|
}
|
|
rankSet.calculateRank();
|
|
return rankSet;
|
}
|
}
|