我需要汇总员工的年假,规则如下:
- 任意一天显示员工可休假的天数
- 不同员工假期总和
- 不同年同一员工假期总和 例如:
employeeId | 日期 | 节假日 | 1 | 2020-12-30 | 30 | 1
---|---|---|
2020-12-31 | 30 | |
2021-01-01 | 30 | |
2020-12-30 | 30 | |
2020-12-31 | 30 | |
2021-01-01 | 30 |
最后,我创建了一个自定义聚合器。我在构造函数中传递了一个上下文对象,在这个对象中,我有字段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 };
}