从零开始写一套公式引擎

公司系统里总保费字段是没有记录到表里的,导致有些页面展示的地方需要在select里计算. 对于多页的查询,效率很慢,页面要一段时间才能加载完.

这次把所有费用放进另一个表里去维护.只在保费会变的地方调用保费计算逻辑,其他地方都是取表里的值.

这都很简单,所以额外做了个优化, 系统里是没有公式引擎的概念的. 计算写在代码里,没有扩展性,也不好维护.也不好以后做优化.

现在计算保费整个系统里只有一个地方.借这个机会. 那就把计算保费用公式引擎管理起来.这样会好很多,各种意义上.
在这里插入图片描述
好爽! ,截图直接就可以粘贴!!

先创建两张表
在这里插入图片描述
在这里插入图片描述

然后代码:

// 这个方法是递归的方法. 外部调用的时候判断最外层调用的地方得到的返回值,
	//	是Error开头的,就抛出异常,异常的提示是Error开头的字符串. 否则string 转 double,作为最终结果.
	public String test1(){
		System.out.println("5555555555555555555");
		
		String formula_id = "A";
		
		//获取公式body
		ExeSQL tExeSQL = new ExeSQL();
		String tSql = "select f_body from formula_body where f_id = '"+formula_id+"'";
		SSRS tSSRSStr = tExeSQL.execSQL(tSql);
		if (tSSRSStr.MaxRow == 0){
			return "Error: 公式id不存在 :"+formula_id;
		}
		
		String fBody = "";
		for (int n = 1; n <= tSSRSStr.MaxRow; n++) {
			fBody = tSSRSStr.GetText(n,1);
		}
		HashMap paramMap = new HashMap();
		paramMap.put("i", 5);
//		paramMap.put("j", 6);
		
		//获取该公式的参数列表
		String tSql2 = "select f_param,f_defaultvalue from formula_param "
				+ "where f_id = '"+formula_id+"'";
		SSRS tSSRSStr2 = tExeSQL.execSQL(tSql2);
		String fBody2 = "";
		for (int n = 1; n <= tSSRSStr2.MaxRow; n++) {
			String param = tSSRSStr2.GetText(n,1);
			String paramDefaultValue = tSSRSStr2.GetText(n,2);
			
			(设定一个规则. 简单参数用小写开头, 公式用大写开头)
			在这个地方判断参数是简单的参数还是另一个公式.如果是公式不从map里取值,递归的调用本方法. 
			retrun 的string如果是Error开头的, 直接return
			如果是参数,如下
			
			//如果传入的map里没这个参数
			if (paramMap.get(param) == null){ 
				//就用默认值填充公式body
				fBody = fBody.replaceAll(":"+param, paramDefaultValue); 
			}else{
				//否则用map里的参数
				fBody = fBody.replaceAll(":"+param, paramMap.get(param).toString());
			}
		}
		
		//check  如果全部替换后还有参数,而不是全都是数字.
		if(fBody.indexOf(":")>=0){
			return "Error: 公式"+formula_id +"中参数没有全部都配置在 formula_param 里";
		}
		
		//计算结果
		String tSql3 = "select "+fBody+" from dual";
		SSRS tSSRSStr3 = tExeSQL.execSQL(tSql3);
		String result = "";
		for (int n = 1; n <= tSSRSStr3.MaxRow; n++) {
			result = tSSRSStr3.GetText(n, 1);
		}
		
		return result;
		
	}

代码还没写完. 没啥难度,就一个递归

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值