Browse Source

:white_check_mark: 完善STLS消息可能会删除掉时间机位的逻辑,修改机位中落地时间赋值逻辑。。

Twelve615 1 year ago
parent
commit
188514793d

+ 2 - 0
airport/jeecg-boot-module-system/src/main/java/org/jeecg/modules/admin_aircraft_position/entity/AdminAircraftPosition.java

@@ -57,6 +57,7 @@ public class AdminAircraftPosition implements Serializable {
     @ApiModelProperty(value = "落地时间")
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Date dropTime;
 	/**航班号*/
 	@Excel(name = "航班号", width = 15)
@@ -99,6 +100,7 @@ public class AdminAircraftPosition implements Serializable {
     @ApiModelProperty(value = "预计落地时间")
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Date predictDropTime;
 
     @ApiModelProperty(value = "到岗人数")

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

@@ -2,10 +2,8 @@ package org.jeecg.modules.admin_dfdl_list.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableField;
+
+import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -75,24 +73,28 @@ public class AdminDfdlList {
 	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "预计开始使用时间")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private java.util.Date estr;
 	/**预计结束使用时间*/
 	@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 = "预计结束使用时间")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private java.util.Date eend;
 	/**实际开始使用时间*/
 	@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 = "实际开始使用时间")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private java.util.Date rstr;
 	/**实际结束使用时间*/
 	@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 = "实际结束使用时间")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private java.util.Date rend;
 	/**是否到达(业务自定义);0:未到达,1:到达*/
 	@Excel(name = "是否到达(业务自定义);0:未到达,1:到达", width = 15)
@@ -117,6 +119,7 @@ public class AdminDfdlList {
 	/**对应机位表admin_aircraft_position.aircraft_position_num*/
 	@Excel(name = "对应机位", width = 15)
 	@ApiModelProperty(value = "对应机位")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private java.lang.String positionCode;
 	/**updateTime*/
 	@Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")

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

@@ -14,6 +14,7 @@
                     date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
                 AND rend IS NULL
                 AND (depe != 1 OR depe IS NULL)
+                AND del = 0
               GROUP BY cfno, position_code
               HAVING max(estr)
               UNION
@@ -24,9 +25,10 @@
                 AND arrival = 1
                 AND IFNULL(IFNULL(frlt, IFNULL(rstr, estr)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
-                AND IFNULL(IFNULL(rend, eend), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
+                AND IFNULL(IFNULL(frtt, IFNULL(rend, 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
               GROUP BY cfno, position_code
               HAVING max(estr)
               UNION
@@ -37,10 +39,11 @@
                 AND flio = 'D'
                 AND IFNULL(IFNULL(frlt, IFNULL(rstr, estr)), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) <=
                   date_format(#{date,jdbcType=TIMESTAMP}, '%Y-%m-%d %H:%i:%s.%f')
-                AND IFNULL(IFNULL(rend, eend), DATE_ADD(CURDATE(), INTERVAL 1 DAY)) >=
+                AND IFNULL(IFNULL(frtt, IFNULL(rend, 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
               GROUP BY cfno, position_code
               HAVING max(estr)) a
         ORDER BY flio ASC,frlt ASC

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

@@ -94,6 +94,8 @@ public class AirportJob extends ImfMsgAbstract implements Job {
         adminAircraftPosition.setRstr(null);
         adminAircraftPosition.setRend(null);
         adminAircraftPosition.setType("空置");
+        adminAircraftPosition.setDropTime(null);
+        adminAircraftPosition.setPredictDropTime(null);
 
     }
 

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

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.MapperFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 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.core.BaseRabbiMqHandler;
 import org.jeecg.boot.starter.rabbitmq.listenter.MqListener;

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

@@ -43,8 +43,9 @@ public class DepeImfMsg extends ImfMsgAbstract {
         Date date = strToDate(FRTT);
         if (date != null) {
             // 已经起飞
-            //depeHandleD(FLID, date);
             AdminDfdlList byId = getAdminDfdl(FLID);
+            // 删除订单 以起飞创建的
+            depeHandle(byId, date);
             if (byId != null) {
                 byId.setFrtt(date);
                 byId.setDepe(1);
@@ -55,56 +56,27 @@ public class DepeImfMsg extends ImfMsgAbstract {
                     adminDfdlList.setDepe(1);
                     adminDfdlList.setFrtt(date);
                     updateAdminDfdl(adminDfdlList);
+                    //删除订单 以入站创建的
+                    depeHandle(adminDfdlList, date);
                 }
             }
         }
     }
 
     /**
-     * 通过出站飞机查找进站计划删除对应的机位
-     *
-     * @param FLID 出站飞机的flid
-     * @param date
-     */
-    @Transactional
-    public void depeHandleD(String FLID, Date date) {
-        LambdaQueryWrapper<AdminDfdlList> adminDfkQueryWrapper = new LambdaQueryWrapper<>();
-        adminDfkQueryWrapper.eq(AdminDfdlList::getAfid, FLID);
-        AdminDfdlList one = getAdminDfdlListService().getOne(adminDfkQueryWrapper);
-        if (one == null) {
-            log.info("计划中没有此航班的起飞航班是始发站航班,afid/flid:{}", FLID);
-            depeHandle(Integer.valueOf(FLID), date);
-        } else {
-            log.info("有起飞航班,{}", one);
-            depeHandle(one.getFlid(), date);
-        }
-    }
-
-    /**
      * flid对应机位起飞处理
      *
-     * @param FLID FLID
+     * @param adminDfdlList FLID
      * @param date
      */
     @Transactional
-    public void depeHandle(Integer FLID, Date date) {
-        LambdaQueryWrapper<AdminAircraftPosition> adminAircraftPositionLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        adminAircraftPositionLambdaQueryWrapper.eq(AdminAircraftPosition::getFlightSole, String.valueOf(FLID));
-        AdminAircraftPosition adminAircraftPosition = getAdminAircraftPositionService().getOne(adminAircraftPositionLambdaQueryWrapper);
-        if (adminAircraftPosition != null) {
-            log.info("航班已经起飞:{}", adminAircraftPosition);
-            // 设置为空置
-            getAdminAircraftPositionService().dept(adminAircraftPosition.getId());
-            // 设置计划已经起飞
-            AdminDfdlList adminDfdlList = new AdminDfdlList();
-            adminDfdlList.setFlid(FLID);
-            adminDfdlList.setArrival(1);
-            updateAdminDfdl(adminDfdlList);
-
+    public void depeHandle(AdminDfdlList adminDfdlList, Date date) {
+        if (adminDfdlList != null) {
+            log.info("航班已经起飞:{}", adminDfdlList);
             //还有改订单状态 删除安检信息
+            //飞机可能改机位所以不能按照机位删除,那就按照航班删除吧
             LambdaQueryWrapper<AdminOrder> adminOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
-
-            adminOrderLambdaQueryWrapper.eq(AdminOrder::getFlightSole, adminAircraftPosition.getFlightSole());
+            adminOrderLambdaQueryWrapper.eq(AdminOrder::getFlightSole, String.valueOf(adminDfdlList.getFlid()));
             adminOrderLambdaQueryWrapper.ne(AdminOrder::getType, "交接结束");
             List<AdminOrder> list1 = adminOrderService.list(adminOrderLambdaQueryWrapper);
             if (list1.size() != 0) {
@@ -118,7 +90,7 @@ public class DepeImfMsg extends ImfMsgAbstract {
             }
             //删安检
             LambdaQueryWrapper<AdminSecurityCheck> adminSecurityCheckLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            adminSecurityCheckLambdaQueryWrapper.eq(AdminSecurityCheck::getFlightSole, adminAircraftPosition.getFlightSole());
+            adminSecurityCheckLambdaQueryWrapper.eq(AdminSecurityCheck::getFlightSole, adminDfdlList.getFlid());
             List<AdminSecurityCheck> list = adminSecurityCheckService.list(adminSecurityCheckLambdaQueryWrapper);
             if (list.size() != 0) {
                 List<String> ids = list.stream()

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

@@ -1,6 +1,7 @@
 package org.jeecg.modules.api.imf.msg;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -20,6 +21,7 @@ import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author 王葆权
@@ -84,11 +86,57 @@ public class DfdlImfMsg extends ImfMsgAbstract {
             log.info("添加计划{}", b ? "成功" : "失败");
             //处理机位信息
             //updateAircraftPosition(dfdlList);
+            try {
+                correctiveEventsHandle();
+            } catch (Exception e) {
+                log.error("进港计划起飞事件矫正失败!");
+                e.printStackTrace();
+            }
         }
 
     }
 
     /**
+     * 进行事件矫正
+     * 发现有计划将还没有起飞标志的进港计划换到了已经出港的计划上面,由于出港计划已经起飞导致起飞的这个计划永远无法设置上起飞标志位,所以对进港计划进行矫正
+     */
+    private void correctiveEventsHandle() {
+        Calendar instance = Calendar.getInstance();
+        instance.add(Calendar.HOUR_OF_DAY, -1);
+        // 一小时之前,主要是更改被整表同步事件修改的内容,所以一小时就够了,出港进港计划中其中一个被修改另一个一定会被修改
+        Date anHourAgo = instance.getTime();
+        LambdaQueryWrapper<AdminDfdlList> adminDfdlListLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        adminDfdlListLambdaQueryWrapper.gt(AdminDfdlList::getUpdateTime, anHourAgo)
+                .eq(AdminDfdlList::getFlio, "A")
+                .eq(AdminDfdlList::getDepe, 0)
+                .isNotNull(AdminDfdlList::getAfid);
+        // 需要矫正的进港计划
+        List<AdminDfdlList> aDfdlList = getAdminDfdlListService().list(adminDfdlListLambdaQueryWrapper);
+        if (aDfdlList == null || aDfdlList.isEmpty()){
+            //不需要矫正
+            return;
+        }
+        List<Integer> dFlidList = aDfdlList.stream().map(item -> item.getAfid()).collect(Collectors.toList());
+        adminDfdlListLambdaQueryWrapper.clear();
+        adminDfdlListLambdaQueryWrapper.eq(AdminDfdlList::getDepe, 1)
+                .in(AdminDfdlList::getFlid, dFlidList);
+        // 需要矫正的进港计划的出港计划
+        List<AdminDfdlList> dDfdlList = getAdminDfdlListService().list(adminDfdlListLambdaQueryWrapper);
+        ArrayList<AdminDfdlList> updateList = new ArrayList<>();
+        for (AdminDfdlList adminDfdlList : aDfdlList) {
+            for (AdminDfdlList dfdlList : dDfdlList) {
+                if (dfdlList.getFlid().equals(adminDfdlList.getAfid()) && !dfdlList.getDepe().equals(adminDfdlList.getDepe())) {
+                    adminDfdlList.setDepe(dfdlList.getDepe());
+                    updateList.add(adminDfdlList);
+                }
+            }
+        }
+        if (!updateList.isEmpty()) {
+            getAdminDfdlListService().updateBatchById(updateList);
+        }
+    }
+
+    /**
      * 更新机位表数据
      * 同步前一天落地但没有起飞的  也就是没有AFID的
      *

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

@@ -341,10 +341,20 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
         airPosition.setEend(adminDfdlList.getEend());
         airPosition.setRstr(adminDfdlList.getRstr());
         airPosition.setRend(adminDfdlList.getRend());
+        airPosition.setDropTime(adminDfdlList.getFrlt());
+        airPosition.setPredictDropTime(adminDfdlList.getEstr());
     }
 
     void setStlsStnd(ObjectMapper objectMapper, String nodeStr, AdminDfdlList adminDfdlList) {
         String gateStr = regStr(STND_REGEX, nodeStr);
+        if (Strings.isNullOrEmpty(gateStr) && ImfMsgType.STLS.equals(getMsgType())) {
+            adminDfdlList.setEstr(null);
+            adminDfdlList.setEend(null);
+            adminDfdlList.setRstr(null);
+            adminDfdlList.setRend(null);
+            adminDfdlList.setPositionCode(null);
+            return;
+        }
         List<String> stnds = regStndStrs(nodeStr);
         if (stnds == null || stnds.size() == 0) {
             return;
@@ -367,10 +377,12 @@ public abstract class ImfMsgAbstract<T extends ImfMsgType> implements ImfMsg {
                 continue;
             }
             Date cpDate = strToDate(eend);
-            if (cpDate.after(date)) {
+            if (maps.size()>1 && cpDate.after(date)) {
                 map = stndMap;
                 // 只取第一个map
                 break;
+            } else {
+                map = maps.get(0);
             }
 
         }

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

@@ -57,30 +57,7 @@ public class StlsImfMsg extends ImfMsgAbstract {
         return codeAircraftPosition;
     }
 
-    /**
-     * 占用机位
-     *
-     * @param codeAircraftPosition
-     * @param dfdlList
-     * @param isChangeFlag
-     */
-    @Transactional
-    void setUsePosition(AdminAircraftPosition codeAircraftPosition, AdminDfdlList dfdlList, boolean isChangeFlag) {
-        // 到站
-        codeAircraftPosition.setType("使用中");
-        dfdlList.setArrival(1);
-        setStlsStnd(dfdlList);
-        if (!isChangeFlag) {
-            log.info("flid:{},copy", dfdlList.getFlid());
-            adminDfdlCopyToAirPosition(dfdlList, codeAircraftPosition);
-        }
-        // 更新机位
-        getAdminAircraftPositionService().updateById(codeAircraftPosition);
-        log.info("更新机位:{}", codeAircraftPosition);
-        // 更新计划
-        updateAdminDfdl(dfdlList);
-        // 结束
-    }
+
 
     /**
      * 判断已经到站的飞机是否需要占用机位
@@ -124,10 +101,4 @@ public class StlsImfMsg extends ImfMsgAbstract {
         log.info("当前机位【{}】不需要被FLID:{}占用", CODE, byId.getFlid());
         return false;
     }
-
-
-    private void updateAdminDfdlTime(AdminDfdlList dfdlList) {
-        setStlsStnd(dfdlList);
-        updateAdminDfdl(dfdlList);
-    }
 }

+ 1 - 2
airport/jeecg-boot-module-system/src/test/java/org/jeecg/modules/admin_aircraft_position/service/impl/AdminAircraftPositionServiceImplTest.java

@@ -41,8 +41,7 @@ class AdminAircraftPositionServiceImplTest {
 
     @Test
     void sendMq(){
-        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MSG><META><SNDR>AFOC</SNDR><RCVR/><SEQN>221</SEQN><DDTM>20230728084929</DDTM><TYPE>DFME</TYPE><STYP>STLS</STYP></META><DFLT><FLID>2452796</FLID><FFID>HO-1841-20230728-D</FFID><FIDE>W/Z</FIDE><STLS><STND><STNO>1</STNO><CODE>204</CODE><ESTR>20230727125500</ESTR><EEND>20230727132200</EEND><RSTR/><REND/><CSSI/><BTSC/></STND><STND><STNO>2</STNO><CODE>208A</CODE><ESTR>20230727132200</ESTR><EEND>20230728132000</EEND><RSTR/><REND/><CSSI/><BTSC/></STND></STLS></DFLT></MSG>";
-
+        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MSG><META><SNDR>AFOC</SNDR><RCVR/><REFE>AFOC</REFE><SEQN>120398</SEQN><DDTM>20230729024217</DDTM><TYPE>DFME</TYPE><STYP>STLS</STYP></META><DFLT><FLID>2454381</FLID><FFID>MF-8546-20230729034000-D</FFID><FLTK>A/N</FLTK><FATT>2403</FATT><STLS/></DFLT></MSG>";
         BaseMap params = new BaseMap();
         params.put("xml", xml);
         rabbitMqClient.sendMessage("Test3HandlerEvent", params);