公司系统里总保费字段是没有记录到表里的,导致有些页面展示的地方需要在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;
}
代码还没写完. 没啥难度,就一个递归