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 太长就会影响代码的可读性,所以也可以改成枚举类的方式

类型 - 字段名


Ex - ploooosion!