Eg & About
...
// 支付类型判断
if (MallConstants.PAY_WAY_AlIPAY.equals(main.getPayWay())) {
// 订单类型判断: 销售单 / 销售退货单
boolean flag = MallConstants.BILL_TYPE_30.equals(main.getBillType());
main.getItems().forEach(v -> {
// 通过该类型取修改对应字段的值
data.setAlipayMoney(flag ? /* add() */ : /* subtract() */);
// refund summary
if (!flag) data.setRefundMoney(data.getRefundMoney().add(v.getAcqtualAmt()));
});
}
...
上述代码算是一个比较典型的例子,进行数据统计时的几步必要的判断,以及后续对特定字段值的修改
...
然而大多数情况下统计会放在SQL中完成,而我这边之前也是如此,但是由于单表数据量过大且目前没办法进行分表的原因,也就导致在多条请求同时涌入的情况下会有一定几率查询超时(门店会在特定的时间段内进行销售数据的汇总统计
目前的解决方案则是将当天的数据同步到Redis中,对当天数据的统计直接通过Redis进行查询 🤒
使用反射进行优化
/**
* Value handle.
*
* @param data the data
* @param column the column
* @param main the main
*/
public static void valueHandle(StoreDayDataVo data, String column, SoMain main) {
try {
Class c = StoreDayDataVo.class;
Field f = c.getDeclaredField(column);
// 使 private 修饰的变量可编辑
f.setAccessible(true);
for (SoItem item : main.getItems()) {
BigDecimal value = new BigDecimal(f.get(data).toString());
if (MallConstants.BILL_TYPE_30.equals(main.getBillType())) {
// 变量值修改
f.set(data, value.add(item.getAcqtualAmt()));
} else if(MallConstants.BILL_TYPE_31.equals(main.getBillType())) {
// 变量值修改
f.set(data, value.subtract(item.getAcqtualAmt()));
data.setRefundMoney(data.getRefundMoney().add(item.getAcqtualAmt()));
}
}
}catch (Exception e) {
log.error(e.getMessage());
}
}
...
// 支付类型判断
if (MallConstants.PAY_WAY_AlIPAY.equals(main.getPayWay())) {
valueHandle(data, "alipayMoney", main);
}
...
对于类型特别多的,if-else 太长就会影响代码的可读性,所以也可以改成枚举类的方式
类型 - 字段名
Comments | NOTHING