报表统计的加减运算实现

322 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

1.报表统计需求的例子

在做报表的时候会遇到一些统计:
    如果是合计的可以直接在sql统计的时候直接运算
    如果是上级科目为子科目之和的时候,明细表没有自动处理父级科目
       则可以通过子sql的like处理 a.subjectcode like b.subjectcode||'%'
       也可以通过代码遍历处理只要是科目开头匹配的时候就加
    如果是动态的一些合计为明细加加减减的可以采用配置表达式方式处理
                           
设计表达式例子:
例如明细
       科目:金额
       1.1.1 1
       1.1.2 2
       1.1.3 3
       1.1.4 4
统计要求为多个明细之间的加减运算,可以通过配置表达式处理
   表达式配置例如:
                1.1=1.1.1+1.1.2-1.1.4
                1.2=1.1.2-1.1.3
   大科目统计例如:
                1=1.1+1.2
                只需要按照顺序计算就可以了,因为表达式的明细前面做过运算,这里直接处理就可以了

2.效果

image.png

3.实现

例如 -1.1+1.4-1.6
首先加号分组 (-1.1) (1.4-1.6)
遇见减号分组 (空 1.1)
            1.1不为首个匹配数做减法运算
                 (1.4 1.6)
                 1.4为首个运算做加法运算
                 1.6不为首个运算减法运算
//测试
public static void main(String[] args) {
	Map<String, BigDecimal> detail=new HashMap<String, BigDecimal>();
	detail.put("1.1", new BigDecimal(1));
	detail.put("1.2", new BigDecimal(2));
	detail.put("1.3", new BigDecimal(3));
	detail.put("1.4", new BigDecimal(4));
	detail.put("1.5", new BigDecimal(5));
	detail.put("1.6", new BigDecimal(6));
	
	String express1="-1.1+1.4-1.6";
	System.out.println(getAddSub(express1,detail));
	
	       express1="+1.1+1.4-1.6";
	System.out.println(getAddSub(express1,detail));
	
            express1="1.1+1.4-1.6-";
	System.out.println(getAddSub(express1,detail));
	
    express1="1.1+1.4-1.6-1.7";
	System.out.println(getAddSub(express1,detail));
}

public static BigDecimal getAddSub(String express,Map<String, BigDecimal> detail) {
	BigDecimal result=new BigDecimal(0);
	String[] expressAdd=express.split("\\+");
	for(String add:expressAdd) {
		String[] expressSub=add.split("\\-");
		for(int i=0;i<expressSub.length;i++) {
			String key=expressSub[i];
			if(detail.containsKey(key)) {
				if(i==0) {
					result=result.add(detail.get(key));
				}else {
					result=result.subtract(detail.get(key));
				}
			}
		}
	}
	return result;
}