场景
先说一下大概要做的事情。我需要先从数据库A中筛选出一周的基础数据,调用接口获取数据库B中的规则,再做一次数据筛选,然后入库数据库B。定时任务每周跑一次。
呐,说到这里,也大概知道了,在数据筛选那里,将会有业务判断。伪代码就集中展示那里。
第1版
考虑时间等各种因素,先实现再说。此处并没有用到数据库B中的规则,直接在项目中写的固定值。
for(CustomerResource customerResource : customerResourceList){
//TODO
//V1
//条件1
if(customerResource.getFactoryPrice().intValue() < -10){
condition1 = true;
}else {
continue;//条件1未满足,直接忽略
}
//条件2
if(customerResource.getLastWeekSales().intValue() > 100){
condition2 = true;
}else {
continue;//条件2未满足,直接忽略
}
//条件3
if(factoryDay.get(customerResource.getFactoryCode()) == null ? false : factoryDay.get(customerResource.getFactoryCode()) > 3){
condition3 = true;
}else{
condition3 = false;}
//条件4
if(factorySales.get(customerResource.getFactoryCode()) == null ? false :
customerResource.getLastWeekSales().divide(factorySales.get(customerResource.getFactoryCode()),2,BigDecimal.ROUND_HALF_UP).doubleValue() > 1.1){
condition4 = true;
}else{
condition4 = false;}
//根据4个条件归类
}
第2版
等到第1版本实现以后,筛选出的数据基本上已经是想要的数据。但是不利于规则的扩展。便于维护,后续在后管系统做页面。
存在每个工厂的规则数量(目前4条)是一样,但是规则中比较的数值存在变动,比较存在变动(符号)。
如此一来,第1版本显然已经不符合需求了。
for(CustomerResource customerResource : customerResourceList){
//获取工厂的规则
List<CustomerResourceRule> rules = factoryRulesMap.get(customerResource.getFactoryCode());
if(rules == null){
//未获取到该工厂的规则
continue;
}
for(CustomerResourceRule rule : rules){
// V2
//条件1
if(ConditionEnum.CONDITION1.getRuleCode().equals(rule.getRuleCode())){
switch (SymbolEnum.getBySymbol(rule.getSymbol())){
case GT:
condition1 = customerResource.getFactoryPrice().intValue() > Integer.parseInt(rule.getSetValue());
break;
case LT:
condition1 = customerResource.getFactoryPrice().intValue() < Integer.parseInt(rule.getSetValue