文章目录
一、背景
最近有个需求是要从外系统接收的发票数据的结果集List,过滤出有效数据。对方未给每条数据打标,允许多次开票,只想保留未被冲红的订单。记录筛选过程,方便备查。
二、实现思路
第一步、遍历出所有有效蓝票,即invType为蓝票-1,status为成功-1
第二步、用有效蓝票list匹配所有,匹配上则移除
第三步、全量List信息遍历打标,是否有效isEffect
三、代码实现
1、构造测试数据
java
// 测试数据
String str = "[\r\n" +
" {\r\n" +
" \"serialNo\": \"100001\",\r\n" +
" \"invNo\": \"200001\",\r\n" +
" \"businessDate\": \"2024-05-01\",\r\n" +
" \"isEffect\": \"\",\r\n" +
" \"invType\": \"1\",\r\n" +
" \"status\": \"1\",\r\n" +
" \"originalInvNo\": \"\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"serialNo\": \"100002\",\r\n" +
" \"invNo\": \"200002\",\r\n" +
" \"businessDate\": \"2024-05-02\",\r\n" +
" \"isEffect\": \"\",\r\n" +
" \"invType\": \"0\",\r\n" +
" \"status\": \"1\",\r\n" +
" \"originalInvNo\": \"200001\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"serialNo\": \"100003\",\r\n" +
" \"invNo\": \"200003\",\r\n" +
" \"businessDate\": \"2024-05-01\",\r\n" +
" \"isEffect\": \"\",\r\n" +
" \"invType\": \"1\",\r\n" +
" \"status\": \"1\",\r\n" +
" \"originalInvNo\": \"\"\r\n" +
" }\r\n" +
" ]\r\n" ;
List<InvInfoDto> allInvList = JsonUtils.parseArray(str, InvInfoDto.class);
logger.info("------> 原始所有发票allInvList为:" + JsonUtils.parseObject(allInvList));
发票数据结果InvInfoDto 如下
java
@Data
public class InvInfoDto {
/**
* 序列号
*/
private String serialNo;
/**
* 单号
*/
private String invNo;
/**
* 日期
*/
private String businessDate;
/**
* 类型:1-蓝票,0-红票
*/
private String invType;
/**
* 是否有效:1-有效
*/
private String isEffect;
/**
* 状态:1-成功
*/
private String status;
/**
* 原始单号
*/
private String originalInvNo;
}
2、获取有效list
遍历所有list,取出所有为蓝票,即有效票,组装成 effectInvList
java
// 第一步、遍历出所有有效蓝票,即invType为蓝票-1,status为成功-1
List<InvInfoDto> effectInvList = allInvList.stream()
.filter(inv -> "1".equals(inv.getInvType()))
.collect(Collectors.toList());
logger.info("------> 有效蓝票effectInvList:" + JsonUtils.parseObject(effectInvList));
遍历结果如下图所示。
3、去除重复并保留有效list
从有效蓝票list中过滤所有发票集合中,InvNo和OriginalInvNo相等的记录,使用 noneMatch 来匹配。
java
// 第二步、用有效蓝票list匹配所有,匹配上则移除
List<InvInfoDto> resultInvList = effectInvList.stream()
.filter(e -> allInvList.stream()
.noneMatch(inv -> e.getInvNo().equals(inv.getOriginalInvNo() &&"1".equals(inv.getStatus())))
.collect(Collectors.toList());
logger.info("------> 过滤出有效resultInvList为:" + JsonUtils.parseObject(resultInvList));
过滤完的结果如下。
4、结果打标
数据打标,即遍历数据,对在有效list中的数据is_effect赋值为1,其他赋值为0。
java
// 第三步、全量List信息遍历打标,是否有效isEffect
List<InvInfoDto> finallyInvList = allInvList.stream()
.filter(all -> resultInvList.stream().anyMatch(inv -> {
if (all.getInvNo().equals(inv.getInvNo())
&& "1".equals(inv.getStatus())) {
all.setIsEffect("1");
} else {
all.setIsEffect("0");
}
return true;
})).collect(Collectors.toList());
logger.info("------> 所有结果finallyInvList为:" + JsonUtils.parseObject(finallyInvList));
数据打标结果如下图所示。