背景需求
关联公司作为客户,在出账龄时,有时候希望排除在账龄核销范围之外,即不参与账龄核销。同时,当关联公司参与核销时,能在查询结果中标示出来,以便财务人员区分。
主要思路
1,在客户表中增加一列“是否关联公司”,用于标示客户的身份。
2,过滤条件界面,增加一个选项:客户维度关联公司不参与核销(默认不勾选,表示参与);在显示隐藏列增加一列:“是否关联公司”,用于当参与核销时,在最终查询结果表中显示。
3,查询时,当核算维度为客户时,如果“客户维度关联公司不参与核销”不勾选,则按原有逻辑处理,但在结果中需要显示“是否关联公司”一列。否则,在主取数SQL条件上增加“不等于关联公司”这一过滤条件,以便排除关联公司。这样便达到了关联公司不参与核销的效果。
详细步骤
1,客户表中增加一列“是否关联公司”,略
2,显示隐藏表中增加列:如下图所示:
3,快捷条件中,增加选项:客户维度关联公司不参与核销(默认不勾选,表示参与)。当选择的核算维度中有客户时,该选项才可用,否则不可用且不勾选。当勾选时,显示隐藏列中的“是否有关联公司”取消勾选,反之,勾选。
4,插件开发,这是二开的核心,
1)插件类继承官方原插件类,如: public class AgingScheduleForABC : AgingScheduleReportService,作为服务端插件,挂在“总账账龄分析表”的服务器插件上,需要同时取消官方原插件,否则会重复。
2)在插件中取“客户维度关联公司不参与核销”选项的值,以便后面使用。
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { //快捷过滤条件 DynamicObject dyFilterobj = filter.FilterParameter.CustomFilter; if (dyFilterobj != null) { if (dyFilterobj.Contains("PriorityStartDate")) { //是否关联公司不参与核销 filterIsAffiliate = Convert.ToBoolean(dyFilterobj["IsAffiliate"]); } } //继续执行父类的方法 base.BuilderReportSqlAndTempTable(filter, tableName); }
3)当勾选“客户维度关联公司不参与核销”时,在取数SQL中添加过滤条件
public override string BuilderBaseDataSql() { //父类生成的SQL。 var strSql = base.BuilderBaseDataSql(); if(包含客户 && !filterIsAffiliate) { return 取strSql的条件,并拼接“ AND 是否关系公司=‘N’”//难点,需要仔细研究父类生成的SQL,并恰当的增加新条件。 } }
4)如果勾选了显示隐藏列中的“是否有关联公司”,则在结果中显示“是否有关联公司”列
public override ReportHeader GetReportHeaders(IRptParams filter) { var header = base.GetReportHeaders(filter); //添加表头列 List<ColumnField> fields = filter.FilterParameter.ColumnInfo; for (int i = 0, j = 0; i < fields.Count; i++) { ColumnField field = fields[i]; switch (field.Key.ToUpperInvariant()) { case "是否关系公司ID": //添加是否关系公司列 header.AddChild(field.Key,"是否关系公司", SqlStorageType.Sqlnvarchar, field.Visible).ColIndex = j++; break; } } return header; }
推荐阅读