Browse Source

:memo: 暂存

Twelve615 1 year ago
parent
commit
7e8245fb0f

+ 275 - 21
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/DemoRabbitMqListener3.java

@@ -18,7 +18,10 @@ package org.jeecg.modules.api;
  * ░
  */
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.base.Strings;
 import com.rabbitmq.client.Channel;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -57,10 +60,7 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.*;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
@@ -71,6 +71,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static org.bouncycastle.crypto.tls.ConnectionEnd.client;
+
+/**
+ * FIXME: 当前版本耦合严重,后期需要再次封装
+ */
 @Slf4j
 @Profile("prod")
 @RabbitComponent(value = "testListener")
@@ -130,26 +135,38 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
 //                    航班机位动态信息更新(STLS)
                     if (STYP.equals( "STLS" )) {
                         log.info("开始处理【STLS】航班机位动态信息更新消息");
-                        //航班标识  (航班号)
-                        String FFID = (String) xpath.evaluate( "/MSG/DFLT/FFID", doc,
-                                XPathConstants.STRING );
                         //航班唯一编号
-                        String FLID = (String) xpath.evaluate( "/MSG/DFLT/FLID", doc,
-                                XPathConstants.STRING );
+                        String FLID = (String) xpath.evaluate( "/MSG/DFLT/FLID", doc, XPathConstants.STRING );
+                        // 被删除的航班
+                        if (redisUtil.hasKey( "DFDE_" + FLID)) {
+                            LambdaQueryWrapper<AdminAircraftPosition> queryWrapper2 = new LambdaQueryWrapper<>();
+                            queryWrapper2.eq( AdminAircraftPosition::getFlightSole, FLID );
+                            AdminAircraftPosition one2 = adminAircraftPositionService.getOne( queryWrapper2,
+                                    false );
+                            if (one2 != null) {
+                                // 表中有就 清空机位
+                                adminAircraftPositionService.dept( one2.getId() );
+                            }
+                            return;
+                        }
+
+                        //航班标识  (航班号)
+                        String FFID = (String) xpath.evaluate( "/MSG/DFLT/FFID", doc, XPathConstants.STRING );
                         //判断航班标识的最后一个字符 为A A为进站  D为出站
                         String lastChar = FFID.substring( FFID.length() - 1 );
                         //这是过滤掉 D出站的
                         if (lastChar.equals( "A" )) {
                             log.info("执行进站逻辑开始");
                             //机位编号
-                            String CODE = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/CODE", doc,
-                                    XPathConstants.STRING );
+                            String CODE = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/CODE", doc, XPathConstants.STRING );
                             //根据机位编号查询  之后存入各种数据
                             LambdaQueryWrapper<AdminAircraftPosition> queryWrapper = new LambdaQueryWrapper<>();
                             queryWrapper.eq( AdminAircraftPosition::getAircraftPositionNum, CODE );
                             AdminAircraftPosition one = adminAircraftPositionService.getOne( queryWrapper,
                                     false );
                             if (one != null) {
+                                //表中有这个机位
+                                //开始换机位处理
                                 //判断是否是换机位的STLS
                                 LambdaQueryWrapper<AdminAircraftPosition> queryWrapper2 = new LambdaQueryWrapper<>();
                                 queryWrapper2.eq( AdminAircraftPosition::getFlightSole, FLID );
@@ -158,6 +175,7 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                                 if (one2!=null){
 //                                    FLID匹配到的机位号 和 进来的机位号  不是  一个   换机位  清空原机位信息
                                     if (!one2.getAircraftPositionNum().equals( CODE )){
+                                        //表中有但不是一个机位
                                         //给新匹配到的机位上附上信息
                                         one.setAircraftNum( one2.getAircraftNum() );
                                         one.setType( one2.getType() );
@@ -166,9 +184,95 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                                         one.setFlightAfid( one2.getFlightAfid() );
 //                                        清空one2对应的机位
                                         adminAircraftPositionService.dept( one2.getId() );
+                                    } else {
+                                        // 是一个机位号
+                                        // 判断是否空置
+                                        if ("空置".equals(one.getType())) {
+                                            // 是空置
+
+                                        } else {
+                                            // 不是空置
+                                            if(!one.getFlightNum().equals( one2.getFlightNum())) {
+                                                // 不是一个航班
+                                                // 表中有判断当前是否有机位冲突 否则换机位
+                                                AdminAircraftPosition adminAircraftPosition = new AdminAircraftPosition();
+                                                setStlsTime(doc, xpath, adminAircraftPosition);
+                                                Date estr = one.getEstr();
+                                                Date eend = one.getEend();
+                                                Date estr1 = adminAircraftPosition.getEstr();
+                                                Date eend1 = adminAircraftPosition.getEend();
+                                                Date date = new Date();
+                                                if (eend != null && estr1!=null) {
+                                                    if (eend.before(estr1)&&eend.after(date)) {
+                                                        // 表中的结束占用时间在新数据的开始占用时间之前 但超过当前时间
+                                                        // 不更新数据,直接返回
+                                                        return;
+                                                    } else if (eend.before(estr1)&&eend.before(date)) {
+                                                        // 表中的结束占用时间在新数据的开始占用时间之前 但未超过当前时间
+                                                        //换数据
+                                                        AdminAircraftPosition xmldfdl2 = XMLDFDL2( xmlString, FLID);
+                                                        if (xmldfdl2 == null) {
+                                                            if (redisUtil.hasKey("DFIE_"+FLID)) {
+                                                                xmldfdl2 = XMLDFIE((String) redisUtil.get("DFIE_"+FLID));
+                                                            } else {
+                                                                return;
+                                                            }
+                                                        }
+                                                        one.setAircraftNum(xmldfdl2.getAircraftNum());
+                                                        one.setFlightNum(xmldfdl2.getFlightNum());
+                                                        one.setFlightAfid(xmldfdl2.getFlightAfid());
+                                                        one.setAircraftPositionNum(CODE);
+                                                    }else {
+                                                        //表中的结束占用时间在新数据的开始占用时间之后
+                                                        if (estr != null) {
+                                                            if (estr.after(eend1)) {
+                                                                // 表中的开始时间在新数据的结束时间之后
+                                                                //换数据
+                                                                AdminAircraftPosition xmldfdl2 = XMLDFDL2( xmlString, FLID);
+                                                                if (xmldfdl2 == null) {
+                                                                    if (redisUtil.hasKey("DFIE_"+FLID)) {
+                                                                        xmldfdl2 = XMLDFIE((String) redisUtil.get("DFIE_"+FLID));
+                                                                    } else {
+                                                                        return;
+                                                                    }
+                                                                }
+                                                                one.setAircraftNum(xmldfdl2.getAircraftNum());
+                                                                one.setFlightNum(xmldfdl2.getFlightNum());
+                                                                one.setFlightAfid(xmldfdl2.getFlightAfid());
+                                                                one.setAircraftPositionNum(CODE);
+                                                            } else {
+                                                                //在新数据时间范围中    不变
+                                                                return;
+                                                            }
+                                                        } else {
+                                                            // 没有预计开始占用时间可能第一次设置计划 什么都不做
+                                                        }
+                                                    }
+                                                } else {
+                                                    // 没有预计结束占用时间可能第一次设置计划 什么都不做
+                                                }
+
+                                            }
+                                        }
+                                    }
+                                } else {
+                                    // 表中没有
+                                    //开始是否新增加航班处理
+                                    //判断是否在新增计划里面
+                                    if (redisUtil.hasKey("DFIE_"+FLID)) {
+                                        AdminAircraftPosition item = XMLDFIE((String) redisUtil.get("DFIE_"+FLID));
+                                        //one.setDropTime( item.getDropTime() );
+                                        one.setType( "使用中" );
+                                        one.setAircraftNum(item.getAircraftNum());
+                                        one.setFlightNum(item.getFlightNum());
+                                        one.setFlightAfid(item.getFlightAfid());
                                     }
+                                    //结束是否新增加航班处理
                                 }
+                                //结束换机位处理
 
+                                //设置时间
+                                setStlsTime(doc, xpath, one);
                                 one.setFlightSole( FLID );
 //                                one.setType( "使用中" );
                                 adminAircraftPositionService.updateById( one );
@@ -299,6 +403,15 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                                 String dfdl = (String) redisUtil.get( "DFDL" );
                                 xmldfdl = XMLDFDL( dfdl, FLID );
                             }
+                            //判断是否在新增计划里面
+                            if (redisUtil.hasKey("DFIE_"+FLID)) {
+                                AdminAircraftPosition item = XMLDFIE((String) redisUtil.get("DFIE_"+FLID));
+                                //one.setDropTime( item.getDropTime() );
+                                xmldfdl.setType( "使用中" );
+                                xmldfdl.setAircraftNum(item.getAircraftNum());
+                                xmldfdl.setFlightNum(item.getFlightNum());
+                                xmldfdl.setFlightAfid(item.getFlightAfid());
+                            }
                             //变化 判断是否有航班变更
                             if (redisUtil.hasKey( "CFCE_" + FLID )) {
                                 String CFCE = (String) redisUtil.get( "CFCE_" + FLID );
@@ -334,6 +447,60 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                         log.info("结束处理【CFCE】航班更换飞机消息");
                     }
 
+
+                    // 航班动态增加信息
+                    if (STYP.equals( "DFIE" )) {
+                        log.info("开始处理【DFIE】航班动态增加信息");
+                        //航班唯一编号
+                        String FLID = (String) xpath.evaluate( "/MSG/DFLT/FLID", doc, XPathConstants.STRING );
+                        //log.info( "CFCE::" + xmlString );
+                        //存入缓存
+                        redisUtil.set( "DFIE_" + FLID, xmlString, EXPIRATION_TIME );
+                        log.info("存入Redis key: CFCE_{}", FLID);
+                        log.info("结束处理【DFIE】航班动态增加信息");
+                    }
+
+                    // 动态航班删除
+                    if (STYP.equals( "DFDE" )) {
+                        log.info("开始处理【DFDE】动态航班删除");
+                        String FLID = (String) xpath.evaluate( "/MSG/DFLT/FLID", doc, XPathConstants.STRING );
+                        //log.info( "CFCE::" + xmlString );
+                        //存入缓存
+                        redisUtil.set( "DFDE_" + FLID, xmlString, EXPIRATION_TIME );
+                        log.info("存入Redis key: DFDE_{}", FLID);
+                        log.info("结束处理【DFDE】动态航班删除");
+                    }
+
+                    // 航班号变更
+                    if (STYP.equals( "HBTT" )) {
+                        log.info("开始处理【HBTT】航班号变更");
+                        String FLID = (String) xpath.evaluate( "/MSG/DFLT/FLID", doc, XPathConstants.STRING );
+                        // 原来的航班标识
+                        String FFID = (String) xpath.evaluate( "/MSG/DFLT/FFID", doc, XPathConstants.STRING );
+                        // 变更后航班标识
+                        String HBID = (String) xpath.evaluate( "/MSG/DFLT/HBID", doc, XPathConstants.STRING );
+                        // 变更后飞机号
+                        String NFLN = (String) xpath.evaluate( "/MSG/DFLT/NFLN", doc, XPathConstants.STRING );
+                        String[] parts = HBID.split( "-" ); // 分割字符串
+                        String an = parts[0] + "-" + parts[1]; // 连接前两个部分 航班号
+                        // 旧的航班号
+                        String[] FFIDParts = FFID.split( "-" ); // 分割字符串
+                        String HBH = FFIDParts[0] + "-" + FFIDParts[1]; // 连接前两个部分 航班号
+                        LambdaQueryWrapper<AdminAircraftPosition> wrapper = new LambdaQueryWrapper<AdminAircraftPosition>();
+                        wrapper.eq(AdminAircraftPosition::getFlightSole,FLID);
+                        wrapper.eq(AdminAircraftPosition::getFlightNum,HBH);
+                        AdminAircraftPosition one = adminAircraftPositionService.getOne(wrapper, false);
+                        if (one != null) {
+                            one.setAircraftNum(NFLN);
+                            one.setFlightNum(an);
+                            adminAircraftPositionService.updateById(one);
+                        }
+                        //存入缓存
+                        redisUtil.set( "HBTT_" + FLID, xmlString, EXPIRATION_TIME );
+                        log.info("存入Redis key: HBTT_{}", FLID);
+                        log.info("结束处理【DFDE】动态航班删除");
+                    }
+
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
@@ -341,7 +508,43 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
         } );
     }
 
+    private void setStlsTime(Document doc, XPath xpath, AdminAircraftPosition one) throws XPathExpressionException {
+        String ESTR = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/ESTR", doc, XPathConstants.STRING );
+        String EEND = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/EEND", doc, XPathConstants.STRING );
+        String RSTR = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/RSTR", doc, XPathConstants.STRING );
+        String REND = (String) xpath.evaluate( "/MSG/DFLT/STLS/STND/REND", doc, XPathConstants.STRING );
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmss" );
+        if (!Strings.isNullOrEmpty(ESTR)){
+            LocalDateTime ESTRDateTime = LocalDateTime.parse( ESTR, formatter );
+            //预计开始占用时间
+            Date estrTime = Date.from( ESTRDateTime.atZone( ZoneId.systemDefault() ).toInstant() );
+            one.setEstr(estrTime);
+        }
+        if (!Strings.isNullOrEmpty(EEND)){
+            LocalDateTime EENDDateTime = LocalDateTime.parse( EEND, formatter );
+            //预计结束占用时间
+            Date eendTime = Date.from( EENDDateTime.atZone( ZoneId.systemDefault() ).toInstant() );
+            one.setEend(eendTime);
+        }
+        if (!Strings.isNullOrEmpty(RSTR)){
+            LocalDateTime RSTRDateTime = LocalDateTime.parse( RSTR, formatter );
+            //实际开始占用时间
+            Date rstrTime = Date.from( RSTRDateTime.atZone( ZoneId.systemDefault() ).toInstant() );
+            one.setRstr(rstrTime);
+        }
+        if (!Strings.isNullOrEmpty(REND)){
+            LocalDateTime RENDDateTime = LocalDateTime.parse( REND, formatter );
+            //实际结束占用时间
+            Date rendTime = Date.from( RENDDateTime.atZone( ZoneId.systemDefault() ).toInstant() );
+            one.setRend(rendTime);
+        }
+
+    }
+
     AdminAircraftPosition XMLDFDL2(String DFDL, String FLID2) {
+        if (redisUtil.hasKey( "DFDE_" + FLID2)){
+            return null;
+        }
         // 将XML字符串转换为字符流
         StringReader sr = new StringReader( DFDL );
         // 读取XML文档
@@ -355,6 +558,7 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
             XPathExpression expr = xpath.compile( "//DFLT" );
             NodeList nodes = (NodeList) expr.evaluate( doc, XPathConstants.NODESET );
             AdminAircraftPosition adminAircraftPosition = new AdminAircraftPosition();
+            String FLID = "";
             if (nodes.getLength() >= 1) {
                 for (int i = 0; i < nodes.getLength(); i++) {
                     Node node = nodes.item( i );
@@ -368,7 +572,7 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                     //飞机号
                     String CFNO = (String) xpath.evaluate( "/DFLT/CFNO", doc2, XPathConstants.STRING );
                     // 航班唯一编号
-                    String FLID = (String) xpath.evaluate( "/DFLT/FLID", doc2, XPathConstants.STRING );
+                    FLID = (String) xpath.evaluate( "/DFLT/FLID", doc2, XPathConstants.STRING );
 //                    关联航班ID   AFID
                     String AFID = (String) xpath.evaluate( "/DFLT/AFID", doc2, XPathConstants.STRING );
                     //航班标识
@@ -378,6 +582,14 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                     String HBH = parts[0] + "-" + parts[1]; // 连接前两个部分 航班号
 
                     if (FLID.equals( FLID2 )) {
+                        //判断是否在新增计划里面
+                        if (redisUtil.hasKey("DFIE_"+FLID)) {
+                            AdminAircraftPosition item = XMLDFIE((String) redisUtil.get("DFIE_"+FLID));
+                            adminAircraftPosition.setAircraftNum(item.getAircraftNum());
+                            adminAircraftPosition.setFlightNum(item.getFlightNum());
+                            adminAircraftPosition.setFlightAfid(item.getFlightAfid());
+                            return adminAircraftPosition;
+                        }
                         adminAircraftPosition.setAircraftNum( CFNO );
                         adminAircraftPosition.setFlightNum( HBH );
                         adminAircraftPosition.setFlightAfid( AFID );
@@ -429,6 +641,43 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
         }
     }
 
+    AdminAircraftPosition XMLDFIE(String DFIE) {
+        // 将XML字符串转换为字符流
+        StringReader sr = new StringReader( DFIE );
+        // 读取XML文档
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        Document doc = null;
+        try {
+            doc = factory.newDocumentBuilder().parse( new InputSource( sr ) );
+            // 创建XPath对象
+            XPathFactory xPathfactory = XPathFactory.newInstance();
+            XPath xpath = xPathfactory.newXPath();
+
+            AdminAircraftPosition adminAircraftPosition = new AdminAircraftPosition();
+            //飞机号
+            String CFNO = (String) xpath.evaluate( "/MSG/DFLT/CFNO", doc, XPathConstants.STRING );
+            // 航班唯一编号
+//            String FLID = (String) xpath.evaluate( "/DFLT/FLID", doc2, XPathConstants.STRING );
+//                    关联航班ID   AFID
+            String AFID = (String) xpath.evaluate( "/MSG/DFLT/AFID", doc, XPathConstants.STRING );
+            //航班标识
+            String FFID = (String) xpath.evaluate( "/MSG/DFLT/FFID", doc, XPathConstants.STRING );
+            String[] parts = FFID.split( "-" ); // 分割字符串
+//                    航班号
+            String HBH = parts[0] + "-" + parts[1]; // 连接前两个部分 航班号
+
+
+            adminAircraftPosition.setAircraftNum( CFNO );
+            adminAircraftPosition.setFlightNum( HBH );
+            adminAircraftPosition.setFlightAfid( AFID );
+            return adminAircraftPosition;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
     AdminAircraftPosition XMLDFDL(String DFDL, String FLID2) {
         // 将XML字符串转换为字符流
         StringReader sr = new StringReader( DFDL );
@@ -453,21 +702,26 @@ public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<Object> {
                     //下面就是取多个里面的 具体数值
                     StringReader sr2 = new StringReader( buf.toString() );
                     Document doc2 = factory.newDocumentBuilder().parse( new InputSource( sr2 ) );
-                    //飞机号
-                    String CFNO = (String) xpath.evaluate( "/DFLT/CFNO", doc2, XPathConstants.STRING );
+
                     // 航班唯一编号
                     String FLID = (String) xpath.evaluate( "/DFLT/FLID", doc2, XPathConstants.STRING );
-//                    关联航班ID   AFID
-                    String AFID = (String) xpath.evaluate( "/DFLT/AFID", doc2, XPathConstants.STRING );
-                    //航班标识
-                    String FFID = (String) xpath.evaluate( "/DFLT/FFID", doc2, XPathConstants.STRING );
-                    String[] parts = FFID.split( "-" ); // 分割字符串
-//                    航班号
-                    String HBH = parts[0] + "-" + parts[1]; // 连接前两个部分 航班号
+
 
                     if (FLID.equals( FLID2 )) {
+                        //飞机号
+                        String CFNO = (String) xpath.evaluate( "/DFLT/CFNO", doc2, XPathConstants.STRING );
+                        //                    关联航班ID   AFID
+                        String AFID = (String) xpath.evaluate( "/DFLT/AFID", doc2, XPathConstants.STRING );
+                        //航班标识
+                        String FFID = (String) xpath.evaluate( "/DFLT/FFID", doc2, XPathConstants.STRING );
+                        String[] parts = FFID.split( "-" ); // 分割字符串
+//                    航班号
+                        String HBH = parts[0] + "-" + parts[1]; // 连接前两个部分 航班号
+                        //飞机号
                         adminAircraftPosition.setAircraftNum( CFNO );
+                        //航班号
                         adminAircraftPosition.setFlightNum( HBH );
+                        //关联航班号
                         adminAircraftPosition.setFlightAfid( AFID );
                         return adminAircraftPosition;
                     }