Browse Source

:white_check_mark: 增加完善消息

Twelve615 1 year ago
parent
commit
53cf5d1494
18 changed files with 661 additions and 48 deletions
  1. 46 7
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/admin_dfdl_list/entity/AdminDfdlList.java
  2. 9 8
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/admin_dfdl_list/mapper/xml/AdminDfdlListMapper.xml
  3. 23 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/ImfMqListener.java
  4. 42 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/AirlImfMsg.java
  5. 44 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/BakeImfMsg.java
  6. 45 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/CaneImfMsg.java
  7. 2 4
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DepeImfMsg.java
  8. 4 2
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfdlImfMsg.java
  9. 5 1
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfieImfMsg.java
  10. 57 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfueImfMsg.java
  11. 67 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DlyeImfMsg.java
  12. 41 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FettImfMsg.java
  13. 41 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FpttImfMSg.java
  14. 43 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FrttImfMsg.java
  15. 121 24
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgAbstract.java
  16. 9 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgType.java
  17. 18 2
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgUtil.java
  18. 44 0
      airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/RtneImfMsg.java

+ 46 - 7
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/admin_dfdl_list/entity/AdminDfdlList.java

@@ -63,11 +63,15 @@ public class AdminDfdlList {
 	@Excel(name = "航班任务;W/Z(正班)", width = 15)
     @ApiModelProperty(value = "航班任务;W/Z(正班)")
 	private java.lang.String fltk;
-	/**航班属性;2403 国内,2401 国际,2404 混合,2402 地区
-*/
+	/**航班属性;2403 国内,2401 国际,2404 混合,2402 地区*/
 	@Excel(name = "航班属性;2403 国内,2401 国际,2404 混合,2402 地区", width = 15)
     @ApiModelProperty(value = "航班属性;2403 国内,2401 国际,2404 混合,2402 地区")
 	private java.lang.String fatt;
+	/**对应机位表admin_aircraft_position.aircraft_position_num*/
+	@Excel(name = "对应机位", width = 15)
+	@ApiModelProperty(value = "对应机位")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private java.lang.String positionCode;
 	/**预计开始使用时间*/
 	@Excel(name = "预计开始使用时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
 	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@@ -116,11 +120,30 @@ public class AdminDfdlList {
 	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
 	@ApiModelProperty(value = "实际起飞时间")
 	private java.util.Date frtt;
-	/**对应机位表admin_aircraft_position.aircraft_position_num*/
-	@Excel(name = "对应机位", width = 15)
-	@ApiModelProperty(value = "对应机位")
-	@TableField(updateStrategy = FieldStrategy.IGNORED)
-	private java.lang.String positionCode;
+	/**预计起飞时间*/
+	@Excel(name = "预计起飞时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "预计起飞时间")
+	private java.util.Date fett;
+	/**预计到达时间*/
+	@Excel(name = "预计到达时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "预计到达时间")
+	private java.util.Date felt;
+	/**计划起飞时间*/
+	@Excel(name = "计划起飞时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "计划起飞时间")
+	private java.util.Date fptt;
+	/**计划降落时间*/
+	@Excel(name = "计划降落时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "计划降落时间")
+	private java.util.Date fplt;
 	/**updateTime*/
 	@Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
 	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@@ -137,4 +160,20 @@ public class AdminDfdlList {
 	@Excel(name = "是否删除(业务自定义):0:未删除,1:删除", width = 15)
     @ApiModelProperty(value = "是否删除(业务自定义):0:未删除,1:删除")
 	private java.lang.Integer del;
+	/**航班延误标志位,0:正常,1:延误*/
+	@Excel(name = "航班延误标志位,0:正常,1:延误", width = 15)
+	@ApiModelProperty(value = "航班延误标志位,0:正常,1:延误")
+	private java.lang.Integer dlye;
+	/**航班返航标志位,0:正常,1:返航*/
+	@Excel(name = "航班返航标志位,0:正常,1:返航", width = 15)
+	@ApiModelProperty(value = "航班返航标志位,0:正常,1:返航")
+	private java.lang.Integer rtne;
+	/**航班取消标志位,0:正常,1:取消*/
+	@Excel(name = "航班取消标志位,0:正常,1:取消", width = 15)
+	@ApiModelProperty(value = "航班取消标志位,0:正常,1:取消")
+	private java.lang.Integer cane;
+	/**航班滑回标志位,0:正常,1:滑回*/
+	@Excel(name = "航班滑回标志位,0:正常,1:滑回", width = 15)
+	@ApiModelProperty(value = "航班滑回标志位,0:正常,1:滑回")
+	private java.lang.Integer bake;
 }

+ 9 - 8
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/admin_dfdl_list/mapper/xml/AdminDfdlListMapper.xml

@@ -20,36 +20,37 @@
     <select id="queryPermitAirplaneByDate" parameterType="date" resultType="org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList">
         <![CDATA[
         SELECT *
-        FROM (
-              SELECT *
+        FROM (SELECT *
               FROM admin_dfdl_list
               WHERE position_code IS NOT NULL
                 AND position_code != ''
                 AND arrival = 1
-                AND IFNULL(IFNULL(frlt, IFNULL(rstr, estr)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
+                AND IFNULL(IFNULL(frlt, IFNULL(felt, IFNULL(rstr, IFNULL(fplt, estr)))), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
-                AND IFNULL(IFNULL(frtt, IFNULL(rend, eend)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
+                AND IFNULL(IFNULL(frtt, IFNULL(fett, IFNULL(rend, IFNULL(fptt, eend)))), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
                 AND (depe != 1 OR depe IS NULL)
                 AND del = 0
+                AND cane = 0
               GROUP BY cfno, position_code
               HAVING max(estr)
-              UNION
+              union
               SELECT *
               FROM admin_dfdl_list
               WHERE position_code IS NOT NULL
                 AND position_code != ''
                 AND flio = 'D'
-                AND IFNULL(IFNULL(frlt, IFNULL(rstr, estr)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
+                AND IFNULL(IFNULL(frlt, IFNULL(felt, IFNULL(rstr, IFNULL(fplt, estr)))), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
-                AND IFNULL(IFNULL(frtt, IFNULL(rend, eend)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
+                AND IFNULL(IFNULL(frtt, IFNULL(fett, IFNULL(rend, IFNULL(fptt, eend)))), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
                 AND (depe != 1 OR depe IS NULL)
                 AND afid IS NULL
                 AND del = 0
+                AND cane = 0
               GROUP BY cfno, position_code
               HAVING max(estr)) a
-        ORDER BY flio ASC,frlt ASC
+        ORDER BY flio ASC, fett ASC
             ]]>
     </select>
 

+ 23 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/ImfMqListener.java

@@ -8,10 +8,12 @@ import com.google.common.base.Strings;
 import com.rabbitmq.client.Channel;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;
 import org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler;
 import org.jeecg.boot.starter.rabbitmq.listenter.MqListener;
 import org.jeecg.common.annotation.RabbitComponent;
 import org.jeecg.common.base.BaseMap;
+import org.jeecg.common.util.SpringContextUtils;
 import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
 import org.jeecg.modules.api.imf.msg.ImfMsg;
 import org.jeecg.modules.api.imf.msg.ImfMsgUtil;
@@ -19,6 +21,7 @@ import org.jeecg.modules.utils.ConversionUtil;
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.amqp.support.AmqpHeaders;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Profile;
 import org.springframework.messaging.handler.annotation.Header;
 import org.w3c.dom.Document;
@@ -51,7 +54,20 @@ import java.util.Date;
 @RabbitComponent(value = "ImfMqListener")
 public class ImfMqListener extends BaseRabbiMqHandler<Object> {
 
+    /**
+     * rabbitMq客户端
+     */
+    private RabbitMqClient rabbitMqClient;
+
+    /**
+     * 是否转发处理消息事件
+     */
+    private boolean msgHandlerEvent;
+
     public ImfMqListener() {
+        rabbitMqClient = SpringContextUtils.getBean(RabbitMqClient.class);
+        ApplicationContext applicationContext = SpringContextUtils.getApplicationContext();
+        msgHandlerEvent = applicationContext.getEnvironment().getProperty("airport.mq.msgHandlerEvent", boolean.class);
         System.out.println("¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ImfMqListener创建了¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥");
     }
 
@@ -63,6 +79,12 @@ public class ImfMqListener extends BaseRabbiMqHandler<Object> {
             public void handler(Message message2, Channel channel) {
                 String xml = new String(message2.getBody(), StandardCharsets.UTF_8);
                 if (!Strings.isNullOrEmpty(xml)) {
+                    if (msgHandlerEvent) {
+                        //转发消息到消息总栈测试, 避免本地测试消费消息
+                        BaseMap params = new BaseMap();
+                        params.put("xml", xml);
+                        rabbitMqClient.sendMessage("Test3HandlerEvent", params);
+                    }
                     log.info("消息内容:{}", xml);
                     ImfMsg imfMsgObject = ImfMsgUtil.getImfMsgObject(xml);
                     if (imfMsgObject != null) {
@@ -73,6 +95,7 @@ public class ImfMqListener extends BaseRabbiMqHandler<Object> {
                         log.info(">>>>>>>>>>>>>>>>>>>>结束处理消息<<<<<<<<<<<<<<<<<<<<");
                     }
                 }
+                log.info("----------------------------------------------------------------");
             }
         });
     }

+ 42 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/AirlImfMsg.java

@@ -0,0 +1,42 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班航线变更消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description:
+ * @date 2023/8/18 10:35
+ */
+@Slf4j
+public class AirlImfMsg extends ImfMsgAbstract {
+    public AirlImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.AIRL);
+    }
+
+    @Override
+    protected void handle() {
+        String flid = getFlid();
+        String content = getContent();
+        ObjectMapper objectMapper = getObjectMapper();
+        if (!Strings.isNullOrEmpty(flid)) {
+            AdminDfdlList adminDfdlList = getAdminDfdlListService().getById(flid);
+            if (adminDfdlList == null) {
+                log.info("【{}】没有找到对应计划,flid:{}", getMsgType().getName(), flid);
+                return;
+            }
+            //待处理计划时间(预计起飞降落、计划起飞降落)
+            boolean upFlag = setAirlArpt(objectMapper, content, adminDfdlList);
+            if (upFlag) {
+                boolean b = getAdminDfdlListService().updateById(adminDfdlList);
+                log.info("【{}】更新{}", getMsgType().getName(), b ? "成功" : "失败");
+            }
+        } else {
+            log.info("【{}】没有找到对应flid:{} 的计划,", getMsgType().getName(), flid);
+        }
+    }
+}

+ 44 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/BakeImfMsg.java

@@ -0,0 +1,44 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班滑回消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 设置航班滑回标志位
+ * @date 2023/8/15 15:15
+ */
+@Slf4j
+public class BakeImfMsg extends ImfMsgAbstract{
+
+    public BakeImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.BAKE);
+    }
+
+    @Override
+    protected void handle() {
+        String flid = getFlid();
+        if (Strings.isNullOrEmpty(flid)) {
+            log.error("flid 为空");
+            return;
+        }
+        AdminDfdlList byId = getAdminDfdlListService().getById(flid);
+        if (byId == null) {
+            log.error("未找到对应计划:{}", flid);
+            return;
+        }
+        // 设置航班滑回标志位
+        // 文档中说明”如果ISTA标签值为空,表示撤销航班滑回状态“,实际消息中并没有这个标签,这个标签改为ABST了
+        String ABST = getStrVal("/MSG/DFLT/ABST");
+        if (Strings.isNullOrEmpty(ABST)) {
+            // 取消航班滑回状态
+            byId.setBake(0);
+        } else {
+            byId.setBake(1);
+        }
+        getAdminDfdlListService().updateById(byId);
+    }
+}

+ 45 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/CaneImfMsg.java

@@ -0,0 +1,45 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班取消消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 标记航班取消
+ * 如果ISTA标签值为空,表示撤销航班取消状态
+ * @date 2023/8/15 15:13
+ */
+@Slf4j
+public class CaneImfMsg extends ImfMsgAbstract{
+
+    public CaneImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.CANE);
+    }
+
+    @Override
+    protected void handle() {
+        String flid = getFlid();
+        if (Strings.isNullOrEmpty(flid)) {
+            log.error("flid 为空");
+            return;
+        }
+        AdminDfdlList byId = getAdminDfdlListService().getById(flid);
+        if (byId == null) {
+            log.error("未找到对应计划:{}", flid);
+            return;
+        }
+        // 设置航班取消标志位
+        // 文档中说明”如果ISTA标签值为空,表示撤销航班滑回状态“,实际消息中并没有这个标签,这个标签改为ABST了
+        String ABST = getStrVal("/MSG/DFLT/ABST");
+        if (Strings.isNullOrEmpty(ABST)) {
+            // 撤销航班取消状态
+            byId.setCane(0);
+        } else {
+            byId.setCane(1);
+        }
+        getAdminDfdlListService().updateById(byId);
+    }
+}

+ 2 - 4
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DepeImfMsg.java

@@ -44,7 +44,7 @@ public class DepeImfMsg extends ImfMsgAbstract {
         if (date != null) {
             // 已经起飞
             AdminDfdlList byId = getAdminDfdl(FLID);
-            // 删除订单 以起飞创建的
+            // 删除订单按照机位
             depeHandle(byId, date);
             if (byId != null) {
                 byId.setFrtt(date);
@@ -53,13 +53,11 @@ public class DepeImfMsg extends ImfMsgAbstract {
                 //判断起飞航班
                 if ("D".equals(byId.getFlio()) && byId.getAfid() != null) {
                     AdminDfdlList adminDfdlList = getAdminDfdl(String.valueOf(byId.getAfid()));
-                    if (adminDfdlList.getEstr()!=null && !byId.getEstr().before(adminDfdlList.getEstr())) {
+                    if (adminDfdlList.getEstr()!=null && byId.getEstr()!=null && !byId.getEstr().before(adminDfdlList.getEstr())) {
                         //先入站再出站才设置否则不设置 A -> D
                         adminDfdlList.setDepe(1);
                         adminDfdlList.setFrtt(date);
                         updateAdminDfdl(adminDfdlList);
-                        //删除订单 以入站创建的
-                        depeHandle(adminDfdlList, date);
                     } else {
                         // 先出站再入站情况 D -> A
                     }

+ 4 - 2
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfdlImfMsg.java

@@ -66,8 +66,10 @@ public class DfdlImfMsg extends ImfMsgAbstract {
                 String json = ConversionUtil.xmlToJson(nodeStr);
                 //json转对象
                 AdminDfdlList adminDfdlList = objectMapper.readValue(json, AdminDfdlList.class);
-                //处理日期
+                //处理机位占用时间
                 setStlsStnd(objectMapper, nodeStr, adminDfdlList);
+                //待处理计划时间(预计起飞降落、计划起飞降落)
+                setAirlArpt(objectMapper, nodeStr, adminDfdlList);
                 dfdlList.add(adminDfdlList);
                 //存入缓存 json格式
                 //getRedisUtil().set(getMsgType().getRedisKey() + adminDfdlList.getFlid(), json);
@@ -113,7 +115,7 @@ public class DfdlImfMsg extends ImfMsgAbstract {
                 .isNotNull(AdminDfdlList::getAfid);
         // 需要矫正的进港计划
         List<AdminDfdlList> aDfdlList = getAdminDfdlListService().list(adminDfdlListLambdaQueryWrapper);
-        if (aDfdlList == null || aDfdlList.isEmpty()){
+        if (aDfdlList == null || aDfdlList.isEmpty()) {
             //不需要矫正
             return;
         }

+ 5 - 1
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfieImfMsg.java

@@ -34,7 +34,11 @@ public class DfieImfMsg extends ImfMsgAbstract {
         } catch (JsonProcessingException e) {
             throw new RuntimeException(e);
         }
-        boolean save = getAdminDfdlListService().save(adminDfdlList);
+        //处理机位占用时间
+        setStlsStnd(objectMapper, content, adminDfdlList);
+        //待处理计划时间(预计起飞降落、计划起飞降落)
+        setAirlArpt(objectMapper, content, adminDfdlList);
+        boolean save = getAdminDfdlListService().saveOrUpdate(adminDfdlList);
         // 添加缓存
         if (save) {
             // 计划缓存

+ 57 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DfueImfMsg.java

@@ -0,0 +1,57 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+import org.jeecg.modules.utils.ConversionUtil;
+
+/**
+ * @author 王葆权
+ * @Title: 航班动态信息更新
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description:
+ * @date 2023/8/18 9:44
+ */
+@Slf4j
+public class DfueImfMsg extends ImfMsgAbstract {
+
+    public DfueImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.DFUE);
+    }
+
+    @Override
+    protected void handle() {
+        String flid = getFlid();
+        String content = getContent();
+        ObjectMapper objectMapper = getObjectMapper();
+        if (!Strings.isNullOrEmpty(flid)) {
+            AdminDfdlList adminDfdlList = getAdminDfdlListService().getById(flid);
+            if (adminDfdlList == null) {
+                log.info("【{}】没有找到对应计划,flid:{}", getMsgType().getName(), flid);
+                String json = ConversionUtil.xmlToJson(content);
+                try {
+                    adminDfdlList = objectMapper.readValue(json, AdminDfdlList.class);
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+                //处理机位占用时间
+                setStlsStnd(objectMapper, content, adminDfdlList);
+                boolean save = getAdminDfdlListService().saveOrUpdate(adminDfdlList);
+                log.info("直接保存对应计划{}:{}", save ? "成功" : "失败", adminDfdlList);
+                if (!save) {
+                    return;
+                }
+            }
+            //待处理计划时间(预计起飞降落、计划起飞降落)
+            boolean upFlag = setAirlArpt(objectMapper, content, adminDfdlList);
+            if (upFlag) {
+                boolean b = getAdminDfdlListService().updateById(adminDfdlList);
+                log.info("【{}】更新{}", getMsgType().getName(), b ? "成功" : "失败");
+            }
+        } else {
+            log.info("【{}】没有找到对应flid:{} 的计划,", getMsgType().getName(), flid);
+        }
+    }
+}

+ 67 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/DlyeImfMsg.java

@@ -0,0 +1,67 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.saxon.trans.SymbolicName;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班延误消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 标记某条航班延误
+ * 如果ISTA标签值为空,表示取消航班延误状态
+ * 如果FETT标签值为空,表示将航班预计时间设置为NULL
+ * 计划时间说明:进港为本站计划降落时间,出港为本站计划起飞时间
+ * @date 2023/8/15 15:11
+ */
+@Slf4j
+public class DlyeImfMsg extends ImfMsgAbstract {
+
+    public DlyeImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.DLYE);
+    }
+
+    @Override
+    protected void handle() {
+        String FLID = getFlid();
+        if (Strings.isNullOrEmpty(FLID)) {
+            log.error("flid 为空");
+            return;
+        }
+        String FFID = getStrVal("/MSG/DFLT/FFID");
+        if (Strings.isNullOrEmpty(FFID)) {
+            log.error("ffid 为空,查询计划");
+            AdminDfdlList byId = getAdminDfdlListService().getById(FLID);
+            if (Strings.isNullOrEmpty(byId.getFfid())) {
+                log.error("ffid 为空");
+                return;
+            }
+            FFID = byId.getFfid();
+        }
+        String FETT = getStrVal("/MSG/DFLT/FETT");
+        LambdaUpdateWrapper<AdminDfdlList> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(AdminDfdlList::getFlid, FLID);
+        if (FFID.endsWith("-D")) {
+            // 出港起飞计划, 改起飞时间
+            setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFett, FETT);
+        } else if (FFID.endsWith("-A")) {
+            // 进港降落计划, 改到达时间
+            setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFelt, FETT);
+        } else {
+            log.error("未知的计划类型{}", FFID);
+            return;
+        }
+        // 航班延误标志位
+        String ABST = getStrVal("/MSG/DFLT/ABST");
+        if (Strings.isNullOrEmpty(ABST)) {
+            // 取消航班延误状态
+            updateWrapper.set(AdminDfdlList::getDlye,0);
+        } else {
+            updateWrapper.set(AdminDfdlList::getDlye,1);
+        }
+        boolean update = getAdminDfdlListService().update(updateWrapper);
+        log.info("修改计划 {} {}", FLID, update ? "成功" : "失败");
+    }
+}

+ 41 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FettImfMsg.java

@@ -0,0 +1,41 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班预计时间变更消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 如果FETT标签出现但值为空,将预计起飞时间设置为NULL
+ * 如果FELT标签出现但值为空,将预计到达时间设置为NULL
+ * @date 2023/8/15 15:07
+ */
+@Slf4j
+public class FettImfMsg extends ImfMsgAbstract {
+    public FettImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.FETT);
+    }
+
+    @Override
+    protected void handle() {
+        String FLID = getStrVal("/MSG/DFLT/FLID");
+        if (Strings.isNullOrEmpty(FLID)) {
+            log.error("flid 为空");
+            return;
+        }
+        String FETT = getStrVal("/MSG/DFLT/FETT");
+        String FELT = getStrVal("/MSG/DFLT/FELT");
+
+        LambdaUpdateWrapper<AdminDfdlList> updateWrapper = new LambdaUpdateWrapper<>();
+        //预计起飞时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFett, FETT);
+        //预计到达时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFelt, FELT);
+        updateWrapper.eq(AdminDfdlList::getFlid, FLID);
+        boolean update = getAdminDfdlListService().update(updateWrapper);
+        log.info("修改计划{}预计起飞时间与预计到达时间{}", FLID, update ? "成功" : "失败");
+    }
+}

+ 41 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FpttImfMSg.java

@@ -0,0 +1,41 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班计划时间变更消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 更改航班计划起飞降落时间
+ * @date 2023/8/15 15:01
+ */
+@Slf4j
+public class FpttImfMSg extends ImfMsgAbstract{
+
+    public FpttImfMSg(String xmlStr) {
+        super(xmlStr, ImfMsgType.FPTT);
+    }
+
+    @Override
+    protected void handle() {
+        String FLID = getFlid();
+        if (Strings.isNullOrEmpty(FLID)) {
+            log.error("flid 为空");
+            return;
+        }
+        String FPTT = getStrVal("/MSG/DFLT/FPTT");
+        String FPLT = getStrVal("/MSG/DFLT/FPLT");
+
+        LambdaUpdateWrapper<AdminDfdlList> updateWrapper = new LambdaUpdateWrapper<>();
+        //计划起飞时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFptt, FPTT);
+        //计划到达时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFplt, FPLT);
+        updateWrapper.eq(AdminDfdlList::getFlid, FLID);
+        boolean update = getAdminDfdlListService().update(updateWrapper);
+        log.info("修改计划{}预计起飞时间与预计到达时间{}", FLID, update ? "成功" : "失败");
+    }
+}

+ 43 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/FrttImfMsg.java

@@ -0,0 +1,43 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班实际时间变更消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 变更计划中的实际到达实际起飞时间
+ * 如果FRTT标签出现但值为空,将实际时间设置为NULL
+ * 如果FRLT标签出现但值为空,将实际时间设置为NULL
+ * @date 2023/8/15 15:09
+ */
+@Slf4j
+public class FrttImfMsg extends ImfMsgAbstract{
+
+    public FrttImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.FRTT);
+    }
+
+    @Override
+    protected void handle() {
+        String FLID = getFlid();
+        if (Strings.isNullOrEmpty(FLID)) {
+            log.error("flid 为空");
+            return;
+        }
+        String FRTT = getStrVal("/MSG/DFLT/FRTT");
+        String FRLT = getStrVal("/MSG/DFLT/FRLT");
+        LambdaUpdateWrapper<AdminDfdlList> updateWrapper = new LambdaUpdateWrapper<>();
+        //实际起飞时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFrtt, FRTT);
+        //实际到达时间设置
+        setLambdaUpdateWrapperAsTime(updateWrapper, AdminDfdlList::getFrlt, FRLT);
+        updateWrapper.eq(AdminDfdlList::getFlid, FLID);
+        boolean update = getAdminDfdlListService().update(updateWrapper);
+        log.info("修改计划{}实际起飞时间与实际到达时间{}", FLID, update ? "成功" : "失败");
+    }
+}

+ 121 - 24
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgAbstract.java

@@ -1,5 +1,7 @@
 package org.jeecg.modules.api.imf.msg;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.MapperFeature;
@@ -33,6 +35,7 @@ import java.io.StringReader;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -83,6 +86,9 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
     // 到达时间的正则
     public static final String STND_REGEX = "<STND>(.*?)</STND>";
 
+    // 到达时间的正则
+    public static final String AIRL_REGEX = "<ARPT>(.*?)</ARPT>";
+
     //xml字符串
     private String xmlStr;
 
@@ -110,12 +116,6 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
     @Override
     public synchronized void process() {
         log.info("【{}】开始处理", getTypeDescription());
-        if (msgHandlerEvent) {
-            //转发消息到消息总栈测试, 避免本地测试消费消息
-            BaseMap params = new BaseMap();
-            params.put("xml", getXmlStr());
-            rabbitMqClient.sendMessage("Test3HandlerEvent", params);
-        }
         handle();
         log.info("【{}】结束处理", getTypeDescription());
     }
@@ -239,6 +239,24 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
     }
 
     /**
+     * 获取DFDL计划中AIRL标签中的多个ARPT标签的json
+     *
+     * @param str
+     * @return
+     */
+    public List<String> regAirlArpt(String str) {
+        Pattern pattern = Pattern.compile(AIRL_REGEX);
+        Matcher matcher = pattern.matcher(str);
+        int matcher_start = 0;
+        Vector<String> res = new Vector<>();
+        while (matcher.find(matcher_start)) {
+            res.add(ConversionUtil.xmlToJson(matcher.group()));
+            matcher_start = matcher.end();
+        }
+        return res;
+    }
+
+    /**
      * 获取类型描述
      *
      * @return
@@ -311,7 +329,7 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
      * @param str
      * @return
      */
-    public Date strToDate(String str) {
+    public static Date strToDate(String str) {
 
         if (!Strings.isNullOrEmpty(str)) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -494,24 +512,103 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
      * @return
      */
     protected AdminDfdlList getAdminDfdl(String FLID) {
-        AdminDfdlList dfdlList;
-/*        ObjectMapper objectMapper = getObjectMapper();
-        if (getRedisUtil().hasKey(ImfMsgType.DFDL.getRedisKey() + FLID)) {
-            String dfdlJson = (String) getRedisUtil().get(ImfMsgType.DFDL.getRedisKey() + FLID);
-            try {
-                dfdlList = objectMapper.readValue(dfdlJson, AdminDfdlList.class);
-            } catch (JsonProcessingException e) {
-                throw new RuntimeException(e);
+        AdminDfdlList dfdlList = getAdminDfdlListService().getById(FLID);
+        return dfdlList;
+    }
+
+    /**
+     * 获取flid
+     * @return
+     */
+    public String getFlid() {
+        return getStrVal("/MSG/DFLT/FLID");
+    }
+
+    /**
+     * 设置LambdaUpdateWrapper的时间,仅限时间类型 yyyyMMddHHmmss
+     * @param updateWrapper LambdaUpdateWrapper
+     * @param function 列方法
+     * @param timeStr 时间字符串
+     */
+    public static void setLambdaUpdateWrapperAsTime(LambdaUpdateWrapper<AdminDfdlList> updateWrapper, SFunction<AdminDfdlList, ?> function, String timeStr) {
+        if (Strings.isNullOrEmpty(timeStr)) {
+            updateWrapper.set(function, null);
+        } else {
+            updateWrapper.set(function, strToDate(timeStr));
+        }
+    }
+
+    /**
+     * 设置起飞时间
+     * @param objectMapper
+     * @param nodeStr
+     * @param adminDfdlList
+     */
+    protected boolean setAirlArpt(ObjectMapper objectMapper, String nodeStr, AdminDfdlList adminDfdlList) {
+        boolean updateFlag = false;
+        List<String> arptList = regAirlArpt(nodeStr);
+        if (arptList == null || arptList.isEmpty()) {
+            //为空不设置
+            return updateFlag;
+        }
+        ArrayList<Map> arptMaps = new ArrayList<>();
+        try {
+            for (String arpt : arptList) {
+                arptMaps.add(objectMapper.readValue(arpt, Map.class));
             }
-        } else {*/
-        // 缓存没有从表里面取
-        dfdlList = getAdminDfdlListService().getById(FLID);
-/*            try {
-                getRedisUtil().set(ImfMsgType.DFDL.getRedisKey() + FLID, objectMapper.writeValueAsString(dfdlList));
-            } catch (JsonProcessingException e) {
-                throw new RuntimeException(e);
+        } catch (JsonProcessingException e) {
+            log.error("转换ARPT标签时发生错误");
+            e.printStackTrace();
+        }
+        Map arptMap = null;
+        if ("A".equals(adminDfdlList.getFlio())) {
+            // 进港取最后一个
+            if (!arptMaps.isEmpty()) {
+                arptMap = arptMaps.get(arptMaps.size() - 1);
             }
-        }*/
-        return dfdlList;
+        } else if ("D".equals(adminDfdlList.getFlio())) {
+            // 出港取第一个
+            if (!arptMaps.isEmpty()) {
+                arptMap = arptMaps.get(0);
+            }
+        }
+
+        // 计划起飞时间
+        Object fptt = arptMap.get("FPTT");
+        if (fptt != null) {
+            adminDfdlList.setFptt(strToDate(String.valueOf(fptt).replace("null", "")));
+            updateFlag = true;
+        }
+        // 预计起飞时间
+        Object fett = arptMap.get("FETT");
+        if (fett != null) {
+            adminDfdlList.setFett(strToDate(String.valueOf(fett).replace("null", "")));
+            updateFlag = true;
+        }
+        // 实际起飞时间
+        Object frtt = arptMap.get("FRTT");
+        if (frtt != null) {
+            adminDfdlList.setEstr(strToDate(String.valueOf(frtt).replace("null", "")));
+            updateFlag = true;
+        }
+        // 计划降落时间
+        Object fplt = arptMap.get("FPLT");
+        if (fplt != null) {
+            adminDfdlList.setEstr(strToDate(String.valueOf(fplt).replace("null", "")));
+            updateFlag = true;
+        }
+        // 预计到达时间
+        Object felt = arptMap.get("FELT");
+        if (felt != null) {
+            adminDfdlList.setEstr(strToDate(String.valueOf(felt).replace("null", "")));
+            updateFlag = true;
+        }
+        // 实际到达时间
+        Object frlt = arptMap.get("FRLT");
+        if (frlt != null) {
+            adminDfdlList.setEstr(strToDate(String.valueOf(frlt).replace("null", "")));
+            updateFlag = true;
+        }
+        return updateFlag;
     }
 }

+ 9 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgType.java

@@ -21,6 +21,15 @@ public enum ImfMsgType {
     DFIE("DFIE", "航班动态增加信息", "DFIE_"),
     DFDE("DFDE", "动态航班删除", "DFDE_"),
     HBTT("HBTT", "航班号变更消息", "HBTT_"),
+    FPTT("FPTT", "航班计划时间变更消息", "FPTT_"),
+    FETT("FETT", "航班预计时间变更消息", "FETT_"),
+    FRTT("FRTT", "航班实际时间变更消息", "FRTT_"),
+    DLYE("DLYE", "航班延误消息", "DLYE_"),
+    CANE("CANE", "航班取消消息", "CANE_"),
+    RTNE("RTNE", "航班返航消息", "RTNE_"),
+    BAKE("BAKE", "航班滑回消息", "BAKE_"),
+    DFUE("DFUE", "航班动态信息更新", "DFUE_"),
+    AIRL("AIRL","航班航线变更消息","AIRL_" ),
     NONE("NONE", "空的消息", "NONE_");
     private final String name;
     private final String description;

+ 18 - 2
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/ImfMsgUtil.java

@@ -35,7 +35,6 @@ public class ImfMsgUtil {
         ImfMsgType byName = ImfMsgType.findByName(styp);
         if (byName != null) {
             if (byName.getName().equals(ImfMsgType.DFDL.getName())) {
-                // 计划消息
                 return new DfdlImfMsg(xmlString);
             } else if (byName.getName().equals(ImfMsgType.STLS.getName())) {
                 return new StlsImfMsg(xmlString);
@@ -51,7 +50,24 @@ public class ImfMsgUtil {
                 return new DfdeImfMsg(xmlString);
             } else if (byName.getName().equals(ImfMsgType.HBTT.getName())) {
                 return new HbttImfMsg(xmlString);
-
+            } else if (byName.getName().equals(ImfMsgType.FPTT.getName())) {
+                return new FpttImfMSg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.FETT.getName())) {
+                return new FettImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.FRTT.getName())) {
+                return new FrttImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.DLYE.getName())) {
+                return new DlyeImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.CANE.getName())) {
+                return new CaneImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.RTNE.getName())) {
+                return new RtneImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.BAKE.getName())) {
+                return new BakeImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.DFUE.getName())) {
+                return new DfueImfMsg(xmlString);
+            } else if (byName.getName().equals(ImfMsgType.AIRL.getName())) {
+                return new AirlImfMsg(xmlString);
             }
         }
         log.error("未知的消息类型{}", byName);

+ 44 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/imf/msg/RtneImfMsg.java

@@ -0,0 +1,44 @@
+package org.jeecg.modules.api.imf.msg;
+
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
+
+/**
+ * @author 王葆权
+ * @Title: 航班返航消息
+ * @Package org.jeecg.modules.api.imf.msg
+ * @Description: 设置航班返航标志位
+ * @date 2023/8/15 15:14
+ */
+@Slf4j
+public class RtneImfMsg extends ImfMsgAbstract{
+
+    public RtneImfMsg(String xmlStr) {
+        super(xmlStr, ImfMsgType.RTNE);
+    }
+
+    @Override
+    protected void handle() {
+        String flid = getFlid();
+        if (Strings.isNullOrEmpty(flid)) {
+            log.error("flid 为空");
+            return;
+        }
+        AdminDfdlList byId = getAdminDfdlListService().getById(flid);
+        if (byId == null) {
+            log.error("未找到对应计划:{}", flid);
+            return;
+        }
+        // 设置航班取消标志位
+        // 文档中说明”如果ISTA标签值为空,表示撤销航班滑回状态“,实际消息中并没有这个标签,这个标签改为ABST了
+        String ABST = getStrVal("/MSG/DFLT/ABST");
+        if (Strings.isNullOrEmpty(ABST)) {
+            // 取消航班返航状态
+            byId.setRtne(0);
+        } else {
+            byId.setRtne(1);
+        }
+        getAdminDfdlListService().updateById(byId);
+    }
+}