diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/flop/GTDTHandler.java b/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/flop/GTDTHandler.java index b162e2cd..3a9b4825 100644 --- a/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/flop/GTDTHandler.java +++ b/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/flop/GTDTHandler.java @@ -1,8 +1,13 @@ package com.gzzn.omms.msgexchangeapi.msghandler.flop; +import java.math.BigInteger; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import com.gzzn.omms.msgexchangeapi.entity.msg.FLOP; import com.gzzn.omms.msgexchangeapi.entity.msg.GATEDATA; @@ -22,14 +27,120 @@ public class GTDTHandler extends FlopBaseHandler { @Override protected SCHD.FLTR updateFltr(FLOP flop,SCHD.FLTR fltr) { + //相同直接返回 + if(isTheSameGtdt(fltr.getGTDT(),flop.getGTDT())) + { + return fltr; + } + + + //先保存当前航班机位数据 + if(!CollectionUtils.isEmpty(fltr.getGTDT())) + { + fltr.setLgtdt(getGtdtAsStr(fltr.getGTDT())); + } + fltr.getGTDT().clear(); //清空旧数据 + + //清空登机门事件,直接返回 + if (isClearGtdtMsg(flop.getGTDT())) { + return fltr; + } + + //更新登记门信息 for(OPTGATEDATA optgatedata : flop.getGTDT() ) { GATEDATA gatedata = new GATEDATA(); BeanUtils.copyProperties(optgatedata, gatedata); fltr.getGTDT().add(gatedata); - } //添加新数据 + } return fltr; } + + /** + * 判断当前的登机门信息和要设置的登记门信息是否一致 + * @param lsGatedata 当前登记门信息 + * @param lsOptgatedata 要设置成的登记门信息 + * @return true ,false + */ + private Boolean isTheSameGtdt(List lsGatedata,List lsOptgatedata) + { + //特殊处理清空航班事件 + if( + isClearGtdtMsg(lsOptgatedata) + && + CollectionUtils.isEmpty(lsGatedata) + ) + { + return true;//当前为清除机位信息,同时当前登机门信息为空 + } + + //不相等,必然不同 + if (lsGatedata.size() != lsOptgatedata.size()) { + return false; + } + + //生成序列比较是否相等 + lsGatedata.sort((node1,node2)-> node1.getGATE().compareTo(node2.getGATE())); + lsOptgatedata.sort((node1,node2)-> node1.getGATE().compareTo(node2.getGATE())); + + + StringBuilder strGtdt = new StringBuilder(); + lsGatedata.forEach(node->{ + strGtdt.append(node.getGATE()); + strGtdt.append(","); + }); + + StringBuilder strOptGtdt = new StringBuilder(); + lsOptgatedata.forEach(node->{ + strOptGtdt.append(node.getGATE()); + strOptGtdt.append(","); + }); + + return strGtdt.toString().equals(strOptGtdt.toString()); + } + + + /** + * 判断是否清空登机门事件,内容为空的情况, + * @param lsOptgatedata 登机门数据列表 + * @return true 清空登机门事件 ,false 非清空登机门事件 + */ + private Boolean isClearGtdtMsg(List lsOptgatedata) + { + return ( + lsOptgatedata.size() == 1 + && lsOptgatedata.get(0).getGTNO().equals(new BigInteger("0")) + && StringUtils.isEmpty(lsOptgatedata.get(0).getGATE()) + ); + } + + + /** + * 将机位信息列表,组织成逗号分隔的字符串 + * @return + */ + private String getGtdtAsStr(List lsGatedata) + { + if(CollectionUtils.isEmpty(lsGatedata)) + { + return ""; + } + + + //先保存当前航班机位数据 + StringBuilder lgtdt= new StringBuilder(); + for(GATEDATA node : lsGatedata) + { + lgtdt.append(node.getGATE()); + lgtdt.append(","); + } + if(lgtdt.toString().endsWith(",")) + { + lgtdt.deleteCharAt(lgtdt.length()-1); + } + + return lgtdt.toString(); + }//end function }