先来实体类
@Data
@Table(name = "goods_project")
@NoArgsConstructor
@AllArgsConstructor
public class GoodsProjectDBEntity {
@Id
private Long id;
private String goodsCode; // 物资编码,对应goods_detail中的goods_code
private String projectCode; // 计划批号,对应计划表中的project_code
private String goodsName; // 物资名称
private String goodsPrec; // 物资规格
private String goodsUnit; // 物资单位
private String goodsPrice; // 系统价
private String goodsReferencePrice; // 参考价
private Integer projectCount; // 计划数量
private Integer lastMonthStockCount; // 上月库存量
private Integer threeMonthAverageCount; // 三个月库存量
private String note; // 备注
private String fieldArea; // 场区
private String goodsUsage; // 用法
private String supportCompany; // 供应商
private String buyFormCode; // 对应采购单
private Integer surplusProjectCount; // 未到货的数量
private String goodsType; // 商品类别
private Long goodsTypeNumber;
private Long warehouseId; //计划表对应的仓库
@Transient // 实体类中有字段,但是数据库中没有
private String serialNumber; // 商品编号
@Transient // 实体类中有字段,但是数据库中没有
private String name; // 计划数量所在名字
}
之后上代码操作
List<GoodsProjectDBEntity> goodsProjectDBEntities = goodsProjectDBMapper.selectByExample(example);
if (CollectionUtils.isNotEmpty(goodsProjectDBEntities)) {
// 把goodsCode一样的视为同一种,则计划数量增加,未到货数量增加
List<GoodsProjectDBEntity> add = new ArrayList<>();
goodsProjectDBEntities.parallelStream()
.collect(Collectors.groupingBy(GoodsProjectDBEntity::getGoodsCode, Collectors.toList())).forEach(
(id, transfer) -> {
transfer.stream()
.reduce((a, b) -> new GoodsProjectDBEntity(
null,
a.getGoodsCode(),
null,
a.getGoodsName(),
a.getGoodsPrec(),
a.getGoodsUnit(),
a.getGoodsPrice(),
a.getGoodsReferencePrice(),
a.getProjectCount() + b.getProjectCount(),
a.getLastMonthStockCount(),
a.getThreeMonthAverageCount(),
a.getNote(),
a.getFieldArea(),
a.getGoodsUsage(),
a.getSupportCompany(),
a.getBuyFormCode(),
a.getSurplusProjectCount() + b.getSurplusProjectCount(),
a.getGoodsType(),
a.getGoodsTypeNumber(),
null,
a.getSerialNumber(),
a.getName()))
.ifPresent(add :: add);
});
return Result.success().addData("vaccineProjects", add);
}
先根据属性group by分组,然后进行属性赋值(需要实体类有对应构造方法)