Java 流式编程实现业务分组并根据分组后的数据条数做对比

news/2024/11/7 7:35:55/

业务场景:

1.需要根据路由表中运单id和数据状态(为 107妥投 ,117部分妥投, 108拒签 )的数据进行分组,并取出分组后数量

2.需要根据运单id 的集合去订单表及订单详情表查询对应的数据,并运单id 进行分组,并取出分组后数量

3.判断条件,如果路由表根据运单id和状态分组后的数量 == 订单详情表中的数量 ,做后续业务处理

数据库:

路由表:billIdstatus
TESTXS20210517117
TESTXS20210517117
TESTXS20210517107
TESTXS20210517108
TESTXS20210519117
TESTXS20210519108
订单详情:billIdmess
TESTXS202105171
TESTXS202105171
TESTXS202105170
TESTXS202105170
TESTXS202105190
TESTXS202105191

思路:

  1. 首先根据条件查询出所有数据
  2. 其次查询出符合状态的数据: 使用stream().filter() 进行过滤拦截
  3. 然后对取的数据做处理: 需要根据账单1分组,在根据状态分组,最后取得不同账单的不同状态数据。 Map<账单1, Map<状态, List<数据vo>>> billMap
  4. 有了账单1,就可以根据账单1关联订单数据,查询出订单集合
  5. 所以需要获取账单1的集合,根据账单1集合查询账单1的所以订单 List<String> billList = whList.stream().map(WaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList());
  6. 变更后进行了优化去重:List<String> billList = whList.stream().map(AuxWaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
  7. 获取根据账单1获取订单数据 List<WayCallBackVo> orderList = WaybillStatusOutsideMapper.findWayBillDetailData(billList);
  8. 将订单数据按照账单1号 进行分组 Map<String, List<WayCallBackVo>> orderMap = orderList.stream().collect(Collectors.groupingBy(WayCallBackVo::getRelatedBill1));
  9. 最后在循环账单1 进行判断,订单数量及账单数量
 billMap.forEach((billId, valueMap) -> {valueMap.forEach((stutus,vos) ->{// 如果条数相等if (orderMap.get(billId).size() == vos.size()) {// 业务处理} else {failCount.getAndIncrement();map.put(billId, back.getMsgContent());failNos.add(map);}}});});

代码:

try {// 查询所有数据List<WaybillStatusOutsideVo> list = WaybillStatusOutsideMapper.findWayBillData(SonyaConstant.COMP_CODE);// 查询符合状态数据List<WaybillStatusOutsideVo> whList = list.stream().filter(l -> !l.getXiaomiStatus().equals(SonyaConstant.XIAOMISTATUS)&& (l.getOrderStatus().equals(SonyaConstant.GOP_WAY_SIGN)|| l.getOrderStatus().equals(SonyaConstant.GOP_WAY_UNSIGN)|| l.getOrderStatus().equals(SonyaConstant.GOP_WAY_PARTSIGN))).collect(Collectors.toList());// 路由分组MapMap<String, Map<String, List<WaybillStatusOutsideVo>>> billMap = new HashMap<>();whList.stream().collect(Collectors.groupingBy(WaybillStatusOutsideVo::getRelatedBill1)).forEach((bill1, billVos) -> {Map<String, List<WaybillStatusOutsideVo>> result = new HashMap<>();billVos.stream().collect(Collectors.groupingBy(WaybillStatusOutsideVo::getOrderStatus)).forEach((status, vos) ->result.put(status, vos));billMap.put(bill1, result);});// 查询所有订单信息List<String> billList = whList.stream().map(WaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList());// 订单分组MapList<WayCallBackVo> orderList = WaybillStatusOutsideMapper.findWayBillDetailData(billList);Map<String, List<WayCallBackVo>> orderMap = orderList.stream().collect(Collectors.groupingBy(WayCallBackVo::getRelatedBill1));billMap.forEach((billId, valueMap) -> {valueMap.forEach((stutus,vos) ->{// 如果条数相等if (orderMap.get(billId).size() == vos.size()) {// 业务处理} else {failCount.getAndIncrement();map.put(billId, back.getMsgContent());failNos.add(map);}}});});
} catch (Exception e) {e.printStackTrace();//业务处理
}

开发总是在变更中进行,心态很重要

业务场景

1.需要根据路由表中运单id和数据状态(为 107妥投 ,117部分妥投, 108拒签 )的数据进行分组,并取出分组后数量

2.需要根据运单id 的集合去订单表及订单详情表查询对应的数据,并运单id 进行分组,并取出分组后数量

3.判断条件,如果路由表根据运单id和状态分组后的数量 == 订单详情表中的数量 ,做后续业务处理
4.需求变更 1.妥投状态为(order_status=107+117,waybill_status = 107),拒签状态为(order_status=108,waybill_status = 108)
5.需求变更2:拒签数据可能存在一条拒签,一条未拒签情况,所以只要有一条拒签,我们就默认全部拒签

思路:

  1. 首先根据条件查询出所有数据
  2. 其次查询出符合状态的数据: 使用stream().filter() 进行过滤拦截
  3. 然后对取的数据做处理: 需要根据账单1分组,在根据状态分组,最后取得不同账单的不同状态数据。 Map<账单1, Map<状态, List<数据vo>>> billMap
  4. 需求变更后,状态的类型不为107,117,108,而是变更为sign,unsign,为了区分妥投和拒签。
  5. 所以有了一个判断,如果状态为107或者117,存入sign,否则存入unsign,
  6. 有了账单1,就可以根据账单1关联订单数据,查询出订单集合
  7. 所以需要获取账单1的集合,根据账单1集合查询账单1的所以订单 List<String> billList = whList.stream().map(WaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList());
  8. 变更后进行了优化去重:List<String> billList = whList.stream().map(AuxWaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
  9. 获取根据账单1获取订单数据 List<WayCallBackVo> orderList = WaybillStatusOutsideMapper.findWayBillDetailData(billList);
  10. 将订单数据按照账单1号 进行分组 Map<String, List<WayCallBackVo>> orderMap = orderList.stream().collect(Collectors.groupingBy(WayCallBackVo::getRelatedBill1));
  11. 最后在循环账单1 进行判断,订单数量及账单数量

代码:

 public void wayBillJob() {AtomicInteger failCount = new AtomicInteger();List<Map<String, String>> failNos = new ArrayList<>();try {//获取奥克斯客户账号String accountNo = getKey();// 查询所有数据List<WaybillStatusOutsideVo> list = waybillStatusOutsideMapper.findWayBillData(accountNo);if(!list.isEmpty()){// 查询符合状态数据List<WaybillStatusOutsideVo> whList = list.stream().filter(l -> !l.getXiaomiStatus().equals(SonyaConstant.XIAOMISTATUS)&& (l.getOrderStatus().equals(SonyaConstant.GOP_WAY_SIGN)|| l.getOrderStatus().equals(SonyaConstant.GOP_WAY_UNSIGN)|| l.getOrderStatus().equals(SonyaConstant.GOP_WAY_PARTSIGN))).collect(Collectors.toList());if (!whList.isEmpty()){// 路由分组Map// 类型: 账单1-bill1,状态-status,数据-vosMap<String, Map<String, List<WaybillStatusOutsideVo>>> billMap = new HashMap<>();whList.stream().collect(Collectors.groupingBy(WaybillStatusOutsideVo::getRelatedBill1)).forEach((bill1, billVos) -> {// 类型: 状态-status,数据-vos    eg: 117,vos; 107 vos; 108 vos;Map<String, List<WaybillStatusOutsideVo>> result = new HashMap<>();billVos.stream().collect(Collectors.groupingBy(WaybillStatusOutsideVo::getOrderStatus)).forEach((status, vos) ->{// 状态-status,sign=117+107; unsign= 108;// 第11版需求变更,过滤数据 waybill_status = 108 拒签(order_status=108,waybill_status = 108)if(status.equals(SonyaConstant.GOP_WAY_UNSIGN)){if(result.get(unsign) != null ) {List<WaybillStatusOutsideVo> un = result.get(unsign);un.addAll(vos.stream().filter(v -> v.getWaybillStatus().equals(SonyaConstant.GOP_WAY_UNSIGN)).collect(Collectors.toList()));result.put(unsign,un);}else{result.put(unsign, vos.stream().filter(v -> v.getWaybillStatus().equals(SonyaConstant.GOP_WAY_UNSIGN)).collect(Collectors.toList()));}}else{if(result.get(sign) != null ) {List<WaybillStatusOutsideVo> sn = result.get(sign);sn.addAll(vos.stream().filter(v -> v.getWaybillStatus().equals(SonyaConstant.GOP_WAY_SIGN)).collect(Collectors.toList()));result.put(sign,sn);}else{result.put(sign, vos.stream().filter(v -> v.getWaybillStatus().equals(SonyaConstant.GOP_WAY_SIGN)).collect(Collectors.toList()));}}});billMap.put(bill1, result);});// 查询所有订单信息List<String> billList = whList.stream().map(WaybillStatusOutsideVo::getRelatedBill1).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());// 订单分组Mapif(!billList.isEmpty()){List<WayCallBackVo> orderList = WaybillStatusOutsideMapper.findWayBillDetailData(billList);if(!orderList.isEmpty()){Map<String, List<WayCallBackVo>> orderMap = orderList.stream().collect(Collectors.groupingBy(WayCallBackVo::getRelatedBill1));// 从redis获取tokenString signature = OrderService.getToken();billMap.forEach((billId, valueMap) -> {valueMap.forEach((stutus,vos) ->{// 第12版需求变更,拒签108, 可能存在多个商品,只有一条拒签记录的请况,所以如果这样,我们默认一条拒签为全部拒签if ( !orderMap.get(billId).isEmpty() && !vos.isEmpty() ){if(orderMap.get(billId).size() == vos.size() || stutus.equals(unsign)) {// 判断条件  对比订单详情数量 和 路由表中数据数量,一致为妥投回传,不一致不回传Map<String, String> map = new HashMap<>();// 业务处理if (SonyaConstant.SUCCESS_TRUE.equals(back.getSuccess())) {// 业务处理} else {failCount.getAndIncrement();map.put(billId, back.getMsgContent());failNos.add(map);}}}});});}}}}} catch (Exception e) {e.printStackTrace();// 业务处理}}

加油!


http://www.ppmy.cn/news/806798.html

相关文章

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

springboot+redis+mysql+quartz-使用pipeline+lua技术将缓存数据定时更新到数据库

一、重点 代码讲解&#xff1a;7.3点赞功能-定时持久化到数据库-Java程序整合pipelinelua_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1Lg4y1w7U9 代码&#xff1a; blogLike_schedule/like08 xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://g…

常用的公共 DNS 服务器 IP 地址

公共 DNS 服务器 IP 地址 名称DNS 服务器 IP 地址阿里 AliDNS223.5.5.5223.6.6.6CNNIC SDNS1.2.4.8210.2.4.8114 DNS114.114.114.114114.114.115.115oneDNS112.124.47.27114.215.126.16DNS 派 电信/移动/铁通101.226.4.6218.30.118.6DNS 派 联通123.125.81.6140.207.198.6Goog…

dns协议

目录 简介&#xff1a;域名的构成DNS记录类型介绍命令:nslookup国内DNS公共服务器 简介&#xff1a; DNS (Domain Name System)域名系统是一种用于TCP/IP应用程序的分布式数据库&#xff0c;它提供域名和IP地址之间的转换及有关电子邮件的选路信息 IP地址是面向主机的&#xff…

Linux--进程

什么叫做进程&#xff1f; 程序加载到内存就叫进程&#xff08;看不懂是吧&#xff0c;看下面更详细一些&#xff09; 进程对应的代码和数据进程对应的PCB结构体

丹东dns服务器位置,各省主要DNS服务器对照表

Jquery中文网 > 服务器技术 > DNS服务器 > 正文 各省主要DNS服务器对照表 各省主要DNS服务器对照表 发布时间&#xff1a;2014-07-20 编辑&#xff1a;www.jquerycn.cn 各省主要DNS服务器对照表&#xff0c;很实用哦。 省 主服务器 辅服务器 北京 202.96.199…

全国运营商DNS服务器IPv4IPv6地址记录

公共DNS 百度 IPv4 DNS IPv6 DNS 180.76.76.76 2400:da00::6666 阿里 …

2020 dns排名_2020年新版全球/全国各地ISP的DNS服务器地址表

【第一】国内外知名的公共DNS服务器(排列不分先后): 腾讯公共DNS(119.29.29.29、182.254.116.116) 阿里公共DNS(223.5.5.5、223.6.6.6) 百度公共DNS(180.76.76.76) 360安全DNS(123.125.81.6) Google(8.8.8.8、8.8.4.4) 114DNS(114.114.114.114、114.114.115.115) OpenDNS(208.…