sunlogin id:orkj8471777m7nfe ```password m2mg2Lh*T9w ``` remote: 795906644 ```password 840la5 ``` windows password: ``` gzzn@123 ``` ``` gzzn@123 ``` 流水号 0026 类型 PLN 报文 ZCZC BTZ0026 060338 QU LLFZP8X . QU LLFZP8X .XIYOC9H 060338 PLN 07MAY 01 9H8313 B1163 XIY0455(07MAY) LLF 02 9H8313 B1163 LLF0755(07MAY) HAK 03 9H8314 B1163 HAK1050(07MAY) LLF 04 9H8314 B1163 LLF1405(07MAY) XIY = NNNN 接收时间 2025-05-07 12:16:32 ``` ZCZC BTZ0026 060338 QU LLFZP8X . QU LLFZP8X .XIYOC9H 060338 PLN 07MAY 01 9H8313 B1163 XIY0455(07MAY) LLF 02 9H8313 B1163 LLF0755(07MAY) HAK 03 9H8314 B1163 HAK1050(07MAY) LLF 04 9H8314 B1163 LLF1405(07MAY) XIY = NNNN ``` ```groovy // locations to search for config files that get merged into the main config; // config files can be ConfigSlurper scripts, Java properties files, or classes // in the classpath in ConfigSlurper format // grails.config.locations = [ "classpath:${appName}-config.properties", // "classpath:${appName}-config.groovy", // "file:${userHome}/.grails/${appName}-config.properties", // "file:${userHome}/.grails/${appName}-config.groovy"] grails.config.locations = [ "file:Quartz-config.groovy"] // if (System.properties["${appName}.config.location"]) { // grails.config.locations << "file:" + System.properties["${appName}.config.location"] // } grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format grails.mime.use.accept.header = false grails.mime.types = [ all: '*/*', atom: 'application/atom+xml', css: 'text/css', csv: 'text/csv', form: 'application/x-www-form-urlencoded', html: ['text/html','application/xhtml+xml'], js: 'text/javascript', json: ['application/json', 'text/json'], multipartForm: 'multipart/form-data', rss: 'application/rss+xml', text: 'text/plain', xml: ['text/xml', 'application/xml'] ] // URL Mapping Cache Max Size, defaults to 5000 //grails.urlmapping.cache.maxsize = 1000 // What URL patterns should be processed by the resources plugin grails.resources.adhoc.patterns = ['/images/*', '/css/*', '/js/*', '/plugins/*'] // The default codec used to encode data with ${} grails.views.default.codec = "none" // none, html, base64 grails.views.gsp.encoding = "UTF-8" grails.converters.encoding = "UTF-8" // enable Sitemesh preprocessing of GSP pages grails.views.gsp.sitemesh.preprocess = true // scaffolding templates configuration grails.scaffolding.templates.domainSuffix = 'Instance' // Set to false to use the new Grails 1.2 JSONBuilder in the render method grails.json.legacy.builder = false // enabled native2ascii conversion of i18n properties files grails.enable.native2ascii = true // packages to include in Spring bean scanning grails.spring.bean.packages = [] // whether to disable processing of multi part requests grails.web.disable.multipart=false // request parameters to mask when logging exceptions grails.exceptionresolver.params.exclude = ['password'] // configure auto-caching of queries by default (if false you can cache individual queries with 'cache: true') grails.hibernate.cache.queries = false environments { development { grails.logging.jul.usebridge = true } production { grails.logging.jul.usebridge = false // TODO: grails.serverURL = "http://www.changeme.com" } } // log4j configuration log4j = { // Example of changing the log pattern for the default console appender: // appenders { // console name:'stdout', layout:pattern(conversionPattern: '%d [%-15.15t] %-5p %-30.30c{1} - %m%n') appender new org.apache.log4j.DailyRollingFileAppender( name:"file", fileName:"logs/telegram.log", append: true, datePattern: '\'_\'yyyy-MM-dd', layout:pattern(conversionPattern: '%d{yy-MM-dd HHmmss}\t%p %-15.15c{1} :: %m%n')) appender new org.apache.log4j.DailyRollingFileAppender( name: "telegram", fileName:"logs/orginal.txt", append: true, datePattern: '\'_\'yyyy-MM-dd', layout:pattern(conversionPattern: '::%d{yyyy-MM-dd HHmmss}:: %m%n')) console name:'stdout', layout:pattern(conversionPattern: ' %d{yy-MM-dd HH:mm:ss} %-5p> %-15.15c{1} :: %m%n') } root { info 'stdout', 'file' // additivity = false } //trace 'org.hibernate.type' // info 'grails.app.services', // 'grails.app.utils.tbia.telegram.parser', // info 'grails.app.jobs' // additivity = false info 'org.grails.plugin' //debug 'grails.app.utils.tbia.telegram.TcpReader' // 'grails.app.services' // 'org.grails.plugin' // 'grails.app.jobs' // additivity: false // info 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration // info additivity: false, // telegram : ['grails.app.utils.tbia.telegram.TelegramTextLoggerUtils'], // info 'org.codehaus.groovy.grails.web.servlet', // controllers // 'org.hibernate', // 'org.springframework', // 'org.codehaus.groovy.grails.orm.hibernate' // hibernate integration debug telegram: 'grails.app.utils.tbia.telegram.TelegramTextLoggerUtils' // error 'org.codehaus.groovy.grails.web.servlet', // controllers error 'org.codehaus.groovy.grails.web.pages', // GSP 'org.codehaus.groovy.grails.web.sitemesh', // layouts 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping 'org.codehaus.groovy.grails.web.mapping', // URL mapping 'org.codehaus.groovy.grails.commons', // core / classloading 'org.codehaus.groovy.grails.plugins', // plugins 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration // 'org.springframework', 'org.hibernate', 'net.sf.ehcache.hibernate', 'grails.app.service.org.grails.plugin' // additivity: false } CIIMS = [ url:'http://192.168.50.39:8082/services/ExchangeService', user:'ATC', password:'ATCPASS' ] localICAO = 'ZGLG' TBIARoutes = [ estt:'FLOP-ESTT-ATC-ALL', dely:'FLOP-DELY-ATC-ALL', pdda:'FLOP-PDDA-ATC-ALL', actt:'FLOP-ACTT-ATC-ALL', reno:'FLOP-RENO-ATC-ALL', schd:'SCHD-NONE-ATC-ALL' ] SQL { MAPPING = "SELECT MAPPING_FLIGHT_NUMBER FROM TEL_FLIGHT_MAPPING WHERE OLD_FLIGHT_NUMBER=?" //GET_FLIGHT_YESTERDAY = "SELECT scheduled_datetime, route_type FROM TEL_FLIGHTSCHD_NEXTDAY_HISTORY WHERE flight_number = ? and arri_or_dept = ? and flight_date >= to_date(?, 'yyyy-mm-dd') order by flight_date desc" //直接查运营表 GET_FLIGHT_YESTERDAY_OPER = """ SELECT to_char(scheduled_datetime, 'yyyy-MM-dd HH24MI') as scheduled_datetime, route_type, start_airport, end_airport, aircraft_number FROM FIMS_FLIGHTSCHD_OPERATION WHERE REGEXP_LIKE(FLIGHT_NUMBER, ?) and arri_or_dept = ? and flight_date >= to_date(?, 'yyyy-mm-dd') order by flight_date asc """ GET_FLIGHT_YESTERDAY_HIS = """ SELECT to_char(scheduled_datetime, 'yyyy-MM-dd HH24MI') as scheduled_datetime, route_type, start_airport, end_airport, aircraft_number FROM FIMS_FLIGHTSCHD_HST WHERE REGEXP_LIKE(FLIGHT_NUMBER, ?) and arri_or_dept = ? and flight_date >= to_date(?, 'yyyy-mm-dd') order by flight_date asc """ // GET_FLIGHT = "SELECT scheduled_datetime, route_type FROM TEL_FLIGHTSCHD_NEXTDAY_HISTORY WHERE flight_number = ? and arri_or_dept = ? and flight_date = to_date(?, 'yyyy-mm-dd') order by flight_date desc" // 直接查询运营表 GET_FLIGHT = """ SELECT to_char(scheduled_datetime, 'yyyy-MM-dd HH24MI') as scheduled_datetime, route_type, start_airport, end_airport, aircraft_number FROM FIMS_FLIGHTSCHD_OPERATION WHERE REGEXP_LIKE(FLIGHT_NUMBER, ?) and arri_or_dept = ? and flight_date = to_date(?, 'yyyy-mm-dd') order by flight_date asc """ ICAO = "SELECT airline_code_iata FROM sys_airline WHERE airline_code_icao=?" COUNT_HIS_ARR_FLT = "SELECT count(*) FROM FIMS_FLIGHTSCHD_HST WHERE flight_number=? and pre_dept_datetime_actual is not null and actual_datetime is not null and arri_or_dept='A' " GET_HIS_ARR_FLT = """ select * from ( select rownum rn, t.* from ( SELECT flight_id id, to_char(pre_dept_datetime_actual, 'yyyy-MM-dd HH24MI') pdda, to_char(actual_datetime, 'yyyy-MM-dd HH24MI') actt, flight_date fd FROM FIMS_FLIGHTSCHD_HST WHERE flight_number = ? and pre_dept_datetime_actual is not null and actual_datetime is not null and arri_or_dept='A' order by actt desc ) t ) where rn <= ? """ GET_SEASON_SCHEDULE_FLIGHTS = """ SELECT FLIGHT_NUMBER, START_AIRPORT, END_AIRPORT, ARRI_OR_DEPT, to_char(ARRIVAL_TIME, 'HH24MI') as ARRIVAL_TIME, to_char(DEPARTURE_TIME, 'HH24MI') as DEPARTURE_TIME, FLYING_TIME, ROUTE_TYPE, FLIGHT_TASK, OPERATION_DAYS FROM FIMS_FLIGHTSCHD_SEASON, FIMS_FLIGHTSEASON WHERE FIMS_FLIGHTSCHD_SEASON.SEASON_REC_ID = FIMS_FLIGHTSEASON.SEASON_REC_ID and ACTIVESEASON_FLAG = 1 ORDER by ARRIVAL_TIME desc, DEPARTURE_TIME desc """ GET_AIRCRAFT = """ select AIRCRAFT_TYPE_CODE, AIRCRAFT_NUMBER from SYS_AIRCRAFT """ GET_AIRPORT = """ select AIRPORT_CODE_IATA as THREE, AIRPORT_CODE_ICAO as FOUR, AIRPORT_NAME_CHN as CHN, SYS_COUNTRY.COUNTRY_ID as COUNTRY from SYS_AIRPORT, SYS_CITY, SYS_COUNTRY WHERE SYS_AIRPORT.CITY_ID = SYS_CITY.CITY_ID and SYS_CITY.COUNTRY_ID = SYS_COUNTRY.COUNTRY_ID """ } pattern =[ /** * 上航(FM)解析 * 解析参考 *W/Z FM9134 B2688 1/1ILS (00) TSN0100 SHA *W/Z FM9133 B2688 1/1ILS (00) SHA0340 TSN */ FM:[ fields:[0:'task',1:'flightNumber',2:'registerNumber'], min:7, airway:5, company:"FM" ], /** * 解析厦航(MF)计划 *01) MF8193 B5595 ILS(8) HGH1100 1305TSN *02) MF8194 B5595 ILS(8) TSN1355 1550HGH */ MF:[ fields:[1:'flightNumber', 2:'registerNumber'], min:6, airway:4, company:"MF" ], /** * 解析奥凯(8X)计划 * 计划参考: *L1: 29OCT BK2735 B2863 ILS IS (3/6) TSN2350(28OCT) HAK *L2: 29OCT BK2735 B2863 ILS IS (3/6) HAK0435 NKG */ "8X":[ fields:[1:'flightDate',2:'flightNumber',3:'registerNumber'], min: 9, airway : 7, company : "8X(BK)" ], /** * 解析海航(HU)计划 * 计划参考 *L04 W/Z HU7204 B5637 (9) SZX/0500 TSN *L05 W/Z HU7205 B5406 (9) TSN/2355(30OCT) PVG * 1) JD5195 B6727 ILS I(9) SYX/0800 1135/TSN * *L07 W/Z GS6571 B3155 (7) XIY/0025 TSN/0245 CGQ */ HU:[ fields:[1:'task',2:'flightNumber',3:'registerNumber'], min: 5, airway : 5, company : "HU" ], /** * 1) JD5195 B6727 ILS I(9) SYX/0800 1135/TSN */ JD: [ fields:[1:'flightNumber', 2:'registerNumber'], min:7, airway : 5, company:"JD" ], /** * 解析天津航空(GS)公司计划 * 解析参考 * *L01 W/Z GS6503 B3122 (7) TSN/0730 DLC *L04 W/Z GS6516 B3192 (8) URC/0555 DSN/0920 TSN *L03 W/Z GS6515 B3183 (8) TSN/2320(30OCT) DSN/0145 URC *L55 CNL GS6601 TSN TYN *L44 W/Z GS7533 B3156 (7) XIY/0415 TSN/0645 CGQ *L45 W/Z GS7534 B3156 (7) CGQ/0905 TSN/1145 XIY * * changde * 01 GS7635 B3193 XIY0020(16APR) CGD */ GS: [ //fields:[1:'task',2:'flightNumber', 3:'registerNumber'], fields:[1:'flightNumber', 2:'registerNumber'], min:4, airway : 3, company:"GS" ], /** * 杨子快运(Y8) *01 Y87969 B2119 XMN 1540 HGH *13 Y87444 B2578 ICN 0235 TSN */ Y8: [ fields:[1:'flightNumber', 2:'registerNumber'], min:6, airway : 3, company:"Y8" ], /** * 四川航空 (3U) * 01) 31OCT 3U8863 B6598 CAT1 (10) CKG0010 0235TSN */ "3U":[ fields:[1:'flightDate',2:'flightNumber', 3:'registerNumber'], min:8, airway : 6, company:"3U" ], /** * 中国货运 (CK) *01)H/Z CK261 B2076 PVG1535(30OCT) 1705TPE */ CK:[ fields:[0:'task',1:'flightNumber', 2:'registerNumber'], min:4, airway : 3, company:"CK" ], /** * 华夏航空 (G5) *L01 W/Z G52665 B7762 (6) CKG/0725 CIH/0940 TSN * 01 G52653 B7762 (6) CKG0015(03FEB) LLF */ G5:[ fields:[1:'flightNumber', 2:'registerNumber'], min:4, airway : 3, company:"G5" ], /** * 春秋航空 (9C) *31OCT W/Z 9C8884 B6573 ILS1/1 (06) TSN0650 SYX */ "9C":[ fields:[0:'flightDate', 1:'task',2:'flightNumber', 3:'registerNumber'], min:8, airway : 6, company:"9C" ], /** * 深圳航空 (ZH) *204) W/Z 31OCT ZH9783 B5670 CAT1 (10) SZX0045 0355TSN */ ZH:[ fields:[2:'flightDate', 1:'task',3:'flightNumber', 4:'registerNumber'], min:9, airway : 7, company:"ZH" ], /** * 翔鹏航空 (8L) *L59 W/Z 8L9976 B6959 TSN/0510 CTU/0855 KMG */ "8L":[ fields:[1:'task',2:'flightNumber', 3:'registerNumber'], min:6, airway : 4, company:"8L" ], /** * 山东航空 (SC) *(1) SC4717 B3080 CRJ7 ILS I (6) TAO/2350 TSN */ SC:[ fields:[1:'flightNumber', 2:'registerNumber'], min:9, airway : 7, company:"SC" ], /** * 西部航空 (PN) *21) PN6237 B6763 ILS I(9) CKG/0000 0220/TSN *23) PN6235 B6763 ILS I(9) CKG/0905 1025/WUH/1100 1225/WNZ */ PN:[ fields:[1:'flightNumber', 2:'registerNumber'], min:7, airway : 5, company:"PN" ], /** * 南方航空 (CZ) * *83. CZ3301/2 B2823 B752 CAN0135 TSN0535 CAN *02. CZ6973/4 B5239 B737 YIN0235 URC0425 PVG0940 URC1545 YIN */ CZ: [ fields:[1:'flightNumber', 2:'registerNumber', 3:'aircraftType'], min:6, airway : 4, company:"CZ" ], //124) 14NOV W/Z HO1245 B6966 ILS(8) SHA0005 0255CKG //LLF new: //174 Ho1019 B6984 PVG0635(03FEB) LLF HO: [ //fields:[1:'flightDate', 2:'task', 3:'flightNumber', 4:'registerNumber'], fields:[1:'flightNumber', 2:'registerNumber'], //min:7, min:4, airway: 3, company: "HO" ], //05) 14NOV N/M NS3230 B3188 ILS(2) TSN2200 2240SJW NS: [ fields:[1:'flightDate', 2:'task', 3:'flightNumber', 4:'registerNumber'], min:7, airway: 6, company: "NS" ], //38)W/Z 27NOV EU2748 B6900 CAT1 (8) TSN0800 1055CTU EU: [ fields:[0:'task', 1:'flightDate', 2:'flightNumber', 3:'registerNumber'], min:7, airway: 6, company: "EU" ], //01 9H8313 B1163 XIY0455(07MAY) LLF "9H": [ fields:[1:'flightNumber', 2:'registerNumber'], min:4, airway: 3, company: "9H" ], ] flightType = [ H:["H/G", "H/Y"], //货机 O:["U/H"], //公务 B:["J/B"] //专机 ] // 17点定时发送计划 Plan17Cron = "0 50 16 * * ?" // 18点定时发送计划 Plan18Cron = "0 50 17 * * ?" //对于三字码相同的航空公司,使一部分不实用的机场失效 //如果机场真有相同三字码的航空公司,需要修改查询接口,支持多个航空公司 disabledAirport = [ // 曼谷航空 OKA:'PG' ] // 针对航空公司二字码相同,三字码不同的情况,追加电报本地映射 MyAirports = [ //内蒙古航空,二字码对应国航的CA CNM:"CA" ] //针对航班补班的情况,允许在航班号后面加1,2个字母 flightNumberPattern = '[A-Z]{0,2}' //yyyy-MM-dd 制定具体日期(系统测试) //now 取系统当前时间 // operDate="2012-10-30" operDate="now" // 检查过夜航班配置, 值是4表示在4点之前,如果电报中不包含DOF,则检查今天和昨天航班 checkHour = 4 // 计算飞行时长的历史航班数,30表示最近的30次历史飞行的平均值 hisFlyTime = 30 localThree="LLF" //中国ID,用于判断是否是国内航班 countryChinaID = 142 //socket = [server:"172.28.0.3", port:5555] socket = [server:"127.0.0.1", port:7000] socketCheckStatus = true serial = [baudRate:1200, dataBits:8, stopBits:1, parity:0] // windows 默认端口: COM1 serialPort = "/Users/windy/Dev/tmp/ttys0" //工作模式: //串口:serial, TCP: tcp serviceMode = "tcp" //测试模式,当为true的时候,查运营航班数据的时候可以查询历史表(优先查历史表) testMode = false ``` ParsePLN.groovy ```groovy static def NORMAL = [ '9H' //长安航空 ] ```