|
@@ -0,0 +1,137 @@
|
|
|
+package org.jeecg.modules.api.imf;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jeecg.modules.admin_aircraft_position.entity.AdminAircraftPosition;
|
|
|
+import org.jeecg.modules.admin_dfdl_list.entity.AdminDfdlList;
|
|
|
+import org.jeecg.modules.api.imf.msg.ImfMsgAbstract;
|
|
|
+import org.jeecg.modules.api.imf.msg.ImfMsgType;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.quartz.Job;
|
|
|
+import org.quartz.JobExecutionContext;
|
|
|
+import org.quartz.JobExecutionException;
|
|
|
+
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Vector;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author 王葆权
|
|
|
+ * @Title: 机场定时任务类
|
|
|
+ * @Package org.jeecg.modules.api.imf
|
|
|
+ * @Description: 主要解决消息中实际占用时间预计占用时间提前或者延后或者没有的问题
|
|
|
+ * @date 2023/7/26 10:26
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+public class AirportJob extends ImfMsgAbstract implements Job {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 空的xml消息,禁用来占位排除一些错误
|
|
|
+ */
|
|
|
+ private static String nullMsgXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MSG><META><SNDR></SNDR><RCVR/><REFE></REFE><SEQN></SEQN><DDTM></DDTM><TYPE></TYPE><STYP></STYP></META><DFLT><FLID></FLID><FFID></FFID><FLTK></FLTK><FATT></FATT><STLS><STND><STNO></STNO><CODE></CODE><ESTR></ESTR><EEND></EEND><RSTR></RSTR><REND/><CSSI/><BTSC/></STND></STLS></DFLT></MSG>";
|
|
|
+
|
|
|
+ public AirportJob() {
|
|
|
+ super(nullMsgXml, ImfMsgType.NONE);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void execute(JobExecutionContext context) throws JobExecutionException {
|
|
|
+ log.debug(">>>>>>>>>>>>>>>>>>>>场机位动态更新定时任务开始>>>>>>>>>>>>>>>>>>>>");
|
|
|
+ handle();
|
|
|
+ log.debug("<<<<<<<<<<<<<<<<<<<<场机位动态更新定时任务结束<<<<<<<<<<<<<<<<<<<<");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理机位数据
|
|
|
+ * 1.查询当前时间应该占用机位的飞机
|
|
|
+ * 2.缓存三分钟应该起飞的飞机
|
|
|
+ * 3.查询当前机位表的所有飞机对应的任务,移除应该起飞的飞机
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ protected synchronized void handle() {
|
|
|
+ // 当前时间
|
|
|
+ Date now = new Date();
|
|
|
+ // 机位上所有的数据
|
|
|
+ List<AdminAircraftPosition> positionList = getAdminAircraftPositionService().list();
|
|
|
+ List<AdminAircraftPosition> adminAircraftPositions = Collections.synchronizedList(positionList);
|
|
|
+ if (positionList == null || positionList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 应该占用机位的计划(既有出站又有进站)
|
|
|
+ List<AdminDfdlList> dfdlList = getAdminDfdlListService().queryPermitAirplaneByDate(now);
|
|
|
+ try {
|
|
|
+ log.debug("当前应占用机位航班{}", getObjectMapper().writeValueAsString(dfdlList));
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.debug("当前应占用机位航班{}", dfdlList);
|
|
|
+ }
|
|
|
+ List<AdminDfdlList> dfdlPlan = Collections.synchronizedList(dfdlList);
|
|
|
+ // 清空机位
|
|
|
+ for (AdminAircraftPosition position : adminAircraftPositions) {
|
|
|
+ setNullPosition(position);
|
|
|
+ for (AdminDfdlList adminDfdlList : dfdlPlan) {
|
|
|
+ if (position.getAircraftPositionNum().equals(adminDfdlList.getPositionCode())) {
|
|
|
+ // 机位号相等
|
|
|
+ adminDfdlCopyToAirPosition(adminDfdlList,position);
|
|
|
+ position.setType("使用中");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ boolean b = getAdminAircraftPositionService().updateBatchById(adminAircraftPositions);
|
|
|
+ if (b) {
|
|
|
+ log.info("更新机位成功!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setNullPosition(AdminAircraftPosition adminAircraftPosition) {
|
|
|
+ adminAircraftPosition.setFlightSole(null);
|
|
|
+ adminAircraftPosition.setFlightAfid(null);
|
|
|
+ adminAircraftPosition.setFlightNum(null);
|
|
|
+ adminAircraftPosition.setAircraftNum(null);
|
|
|
+ adminAircraftPosition.setEstr(null);
|
|
|
+ adminAircraftPosition.setEend(null);
|
|
|
+ adminAircraftPosition.setRstr(null);
|
|
|
+ adminAircraftPosition.setRend(null);
|
|
|
+ adminAircraftPosition.setType("空置");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取机位上最终应该展示的飞机列表
|
|
|
+ * @param dfdlList 想要展示的计划列表
|
|
|
+ * @param dfdlDList 需要排除的计划列表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @NotNull
|
|
|
+ private Vector<AdminDfdlList> getPositionDfdlList(List<AdminDfdlList> dfdlList, List<AdminDfdlList> dfdlDList) {
|
|
|
+ Vector<AdminDfdlList> dfdlListVector = new Vector<>();
|
|
|
+ if (dfdlList != null && !dfdlList.isEmpty()) {
|
|
|
+ // 列表是空的直接返回空
|
|
|
+ return dfdlListVector;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dfdlDList !=null && !dfdlDList.isEmpty()) {
|
|
|
+ // 排除的计划是空的直接返回全部计划
|
|
|
+ dfdlListVector.addAll(dfdlList);
|
|
|
+ return dfdlListVector;
|
|
|
+ }
|
|
|
+ for (AdminDfdlList dFlid : dfdlDList) {
|
|
|
+ for (AdminDfdlList aFdlList : dfdlList) {
|
|
|
+ if ("A".equals(aFdlList.getFlio())) {
|
|
|
+ // 进站的对比flid
|
|
|
+ if (dFlid.getFlid().equals(aFdlList.getAfid())) {
|
|
|
+ dfdlListVector.add(aFdlList);
|
|
|
+ }
|
|
|
+ } else if ("D".equals(aFdlList.getFlid())) {
|
|
|
+ // 出站的对比flid
|
|
|
+ if (dFlid.getFlid().equals(aFdlList.getFlid())) {
|
|
|
+ dfdlListVector.add(aFdlList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dfdlListVector;
|
|
|
+ }
|
|
|
+}
|