nrecoc . pivotdata的自定义聚合器



我需要汇总员工的年假,规则如下:

  1. 任意一天显示员工可休假的天数
  2. 不同员工假期总和
  3. 不同年同一员工假期总和
  4. 例如:

tbody> <<tr>11222
employeeId 日期 节假日
12020-12-3030
2020-12-3130
2021-01-0130
2020-12-3030
2020-12-3130
2021-01-0130

最后,我创建了一个自定义聚合器。我在构造函数中传递了一个上下文对象,在这个对象中,我有字段employeeid的位置(字段的顺序可以改变)和当前索引维度。我正在创建一个树,例如:

总和(假期)→employeeId,总和(假期)→employeeId,年总和(假期)→employeeId,年,日期,假期

public class AccumAggregatorFactory : IAggregatorFactory {
private readonly CubeContext cc;
public AccumAggregatorFactory(CubeContext cc) {
this.cc = cc;
}
public IAggregator Create() => (IAggregator)new AccumAggregator(cc);
public IAggregator Create(object state) => (IAggregator)new AccumAggregator(cc, state);
public override bool Equals(object obj) => obj is AccumAggregatorFactory aggregatorFactory;
public override string ToString() => "Accum of Holidays";
}
public class AccumAggregator : IAggregator {
private object id;
private Decimal total;
private Decimal closuresValue;
private uint count;
private readonly CubeContext cc;

public AccumAggregator(CubeContext cc) {
this.cc = cc;
}
public object Value => total;
public uint Count => count;
public string Keys { get; internal set; }
public void Merge(IAggregator aggr) {
if (!(aggr is AccumAggregator accum))
throw new ArgumentException(nameof(aggr));

decimal curAccum = 0; //Add to accumulated value if is needed
if (cc.DimIndexIdItem == cc.dim) {
curAccum = closuresValue; //I need to accum closures
if (IsClosure(accum, cc.DateEnd))
closuresValue += accum.total;
} else if (cc.dim < cc.DimIndexIdItem) {
if (IsClosure(accum, cc.DateEnd)) {
curAccum = closuresValue;
closuresValue += accum.total;
}
}
total = curAccum + accum.total;

id = accum.id;
date = accum.date;
}
private static bool IsClosure(AccumAggregator accum, DateTime dateEnd) {
if (accum.id == null)
return false;
if (accum.date == DateTime.MinValue)
return false;
if (dateEnd == accum.date)
return true;
return accum.date.Month==12 && accum.date.Day==31;
}
public object GetState() => new object[2] { Count, Value };
}

最新更新