diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java new file mode 100644 index 0000000..168f12e --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java @@ -0,0 +1,439 @@ +package com.casic.missiles.modular.system.dto; + +import java.util.List; + +/** + * 第三方洋流数据模型 + * + * @author a203 + */ +public class OceanDetailRemoteData { + + /** + * code : 0 + * data : {"lon":114.338597,"lat":18.273134,"date":"2021-10-21","hour":10,"list":[{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}]} + * message : success + * etime : 1634786517992 + */ + + private int code; + private DataBean data; + private String message; + private long etime; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getEtime() { + return etime; + } + + public void setEtime(long etime) { + this.etime = etime; + } + + public static class DataBean { + /** + * lon : 114.338597 + * lat : 18.273134 + * date : 2021-10-21 + * hour : 10 + * list : [{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}] + */ + + private double lon; + private double lat; + private String date; + private int hour; + private List list; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * date : 2021-10-21 + * ytx : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + * meteo : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + */ + + private String date; + private YtxBean ytx; + private MeteoBean meteo; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public YtxBean getYtx() { + return ytx; + } + + public void setYtx(YtxBean ytx) { + this.ytx = ytx; + } + + public MeteoBean getMeteo() { + return meteo; + } + + public void setMeteo(MeteoBean meteo) { + this.meteo = meteo; + } + + public static class YtxBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + + public static class MeteoBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + } + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java new file mode 100644 index 0000000..168f12e --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java @@ -0,0 +1,439 @@ +package com.casic.missiles.modular.system.dto; + +import java.util.List; + +/** + * 第三方洋流数据模型 + * + * @author a203 + */ +public class OceanDetailRemoteData { + + /** + * code : 0 + * data : {"lon":114.338597,"lat":18.273134,"date":"2021-10-21","hour":10,"list":[{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}]} + * message : success + * etime : 1634786517992 + */ + + private int code; + private DataBean data; + private String message; + private long etime; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getEtime() { + return etime; + } + + public void setEtime(long etime) { + this.etime = etime; + } + + public static class DataBean { + /** + * lon : 114.338597 + * lat : 18.273134 + * date : 2021-10-21 + * hour : 10 + * list : [{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}] + */ + + private double lon; + private double lat; + private String date; + private int hour; + private List list; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * date : 2021-10-21 + * ytx : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + * meteo : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + */ + + private String date; + private YtxBean ytx; + private MeteoBean meteo; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public YtxBean getYtx() { + return ytx; + } + + public void setYtx(YtxBean ytx) { + this.ytx = ytx; + } + + public MeteoBean getMeteo() { + return meteo; + } + + public void setMeteo(MeteoBean meteo) { + this.meteo = meteo; + } + + public static class YtxBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + + public static class MeteoBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + } + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java index 8216ae1..1d2e6f5 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.model.Typhoon; @@ -40,4 +41,16 @@ * @return TyphoonDetailDTO */ TyphoonDetailDTO typhoonDetail(String typhoonId); + + /** + * 查询洋流数据 + * + * @param lng 经度 + * @param lat 纬度 + * @param date 预报起报日期 + * @param days 预报的是几天后,0表示当天,1表示明天,以此类推 + * @param hour 预报的是days的哪一个小时 + * @return OceanDetailDTO + */ + OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour); } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java new file mode 100644 index 0000000..168f12e --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java @@ -0,0 +1,439 @@ +package com.casic.missiles.modular.system.dto; + +import java.util.List; + +/** + * 第三方洋流数据模型 + * + * @author a203 + */ +public class OceanDetailRemoteData { + + /** + * code : 0 + * data : {"lon":114.338597,"lat":18.273134,"date":"2021-10-21","hour":10,"list":[{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}]} + * message : success + * etime : 1634786517992 + */ + + private int code; + private DataBean data; + private String message; + private long etime; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getEtime() { + return etime; + } + + public void setEtime(long etime) { + this.etime = etime; + } + + public static class DataBean { + /** + * lon : 114.338597 + * lat : 18.273134 + * date : 2021-10-21 + * hour : 10 + * list : [{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}] + */ + + private double lon; + private double lat; + private String date; + private int hour; + private List list; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * date : 2021-10-21 + * ytx : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + * meteo : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + */ + + private String date; + private YtxBean ytx; + private MeteoBean meteo; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public YtxBean getYtx() { + return ytx; + } + + public void setYtx(YtxBean ytx) { + this.ytx = ytx; + } + + public MeteoBean getMeteo() { + return meteo; + } + + public void setMeteo(MeteoBean meteo) { + this.meteo = meteo; + } + + public static class YtxBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + + public static class MeteoBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + } + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java index 8216ae1..1d2e6f5 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.model.Typhoon; @@ -40,4 +41,16 @@ * @return TyphoonDetailDTO */ TyphoonDetailDTO typhoonDetail(String typhoonId); + + /** + * 查询洋流数据 + * + * @param lng 经度 + * @param lat 纬度 + * @param date 预报起报日期 + * @param days 预报的是几天后,0表示当天,1表示明天,以此类推 + * @param hour 预报的是days的哪一个小时 + * @return OceanDetailDTO + */ + OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour); } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java index 9cc6e5a..0e7bcca 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.system.service.IAisLogService; import com.casic.missiles.modular.system.service.IShipService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; +import okhttp3.Request; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; @@ -46,7 +47,9 @@ if (age < ShipConstant.MIN_AGE || age > ShipConstant.MAX_AGE) { throw new IllegalArgumentException("时间范围错误"); } - //调AIS数据 + /** + * 封装请求参数 + * */ JSONObject jsonObject = new JSONObject(); try { jsonObject.put("rgn", rgn); @@ -58,7 +61,12 @@ /** * 获取AIS接口数据 * */ - String res = HttpRequestHelper.doPost(ShipConstant.SHIPS_IN_CIRCLE, jsonObject.toJSONString()); + Request request = new Request.Builder() + .addHeader(ShipConstant.AIS_HEADER_NAME, ShipConstant.AIS_KEY_VALUE) + .url(ShipConstant.SHIPS_IN_CIRCLE) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + String res = HttpRequestHelper.doPost(request); //先解析出code,根据code判断 if (SUCCESS_CODE.equals(getResponseCode(res))) { //请求成功才保存ais访问记录 diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java new file mode 100644 index 0000000..168f12e --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java @@ -0,0 +1,439 @@ +package com.casic.missiles.modular.system.dto; + +import java.util.List; + +/** + * 第三方洋流数据模型 + * + * @author a203 + */ +public class OceanDetailRemoteData { + + /** + * code : 0 + * data : {"lon":114.338597,"lat":18.273134,"date":"2021-10-21","hour":10,"list":[{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}]} + * message : success + * etime : 1634786517992 + */ + + private int code; + private DataBean data; + private String message; + private long etime; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getEtime() { + return etime; + } + + public void setEtime(long etime) { + this.etime = etime; + } + + public static class DataBean { + /** + * lon : 114.338597 + * lat : 18.273134 + * date : 2021-10-21 + * hour : 10 + * list : [{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}] + */ + + private double lon; + private double lat; + private String date; + private int hour; + private List list; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * date : 2021-10-21 + * ytx : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + * meteo : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + */ + + private String date; + private YtxBean ytx; + private MeteoBean meteo; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public YtxBean getYtx() { + return ytx; + } + + public void setYtx(YtxBean ytx) { + this.ytx = ytx; + } + + public MeteoBean getMeteo() { + return meteo; + } + + public void setMeteo(MeteoBean meteo) { + this.meteo = meteo; + } + + public static class YtxBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + + public static class MeteoBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + } + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java index 8216ae1..1d2e6f5 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.model.Typhoon; @@ -40,4 +41,16 @@ * @return TyphoonDetailDTO */ TyphoonDetailDTO typhoonDetail(String typhoonId); + + /** + * 查询洋流数据 + * + * @param lng 经度 + * @param lat 纬度 + * @param date 预报起报日期 + * @param days 预报的是几天后,0表示当天,1表示明天,以此类推 + * @param hour 预报的是days的哪一个小时 + * @return OceanDetailDTO + */ + OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour); } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java index 9cc6e5a..0e7bcca 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.system.service.IAisLogService; import com.casic.missiles.modular.system.service.IShipService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; +import okhttp3.Request; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; @@ -46,7 +47,9 @@ if (age < ShipConstant.MIN_AGE || age > ShipConstant.MAX_AGE) { throw new IllegalArgumentException("时间范围错误"); } - //调AIS数据 + /** + * 封装请求参数 + * */ JSONObject jsonObject = new JSONObject(); try { jsonObject.put("rgn", rgn); @@ -58,7 +61,12 @@ /** * 获取AIS接口数据 * */ - String res = HttpRequestHelper.doPost(ShipConstant.SHIPS_IN_CIRCLE, jsonObject.toJSONString()); + Request request = new Request.Builder() + .addHeader(ShipConstant.AIS_HEADER_NAME, ShipConstant.AIS_KEY_VALUE) + .url(ShipConstant.SHIPS_IN_CIRCLE) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + String res = HttpRequestHelper.doPost(request); //先解析出code,根据code判断 if (SUCCESS_CODE.equals(getResponseCode(res))) { //请求成功才保存ais访问记录 diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java index 979ee78..eeba903 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java @@ -1,16 +1,15 @@ package com.casic.missiles.modular.system.service.impl; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.constants.ShipConstant; import com.casic.missiles.modular.system.constants.TyphoonConstant; import com.casic.missiles.modular.system.dao.TyphoonMapper; -import com.casic.missiles.modular.system.dto.TyphoonDTO; -import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.dto.TyphoonDetailRemoteData; -import com.casic.missiles.modular.system.dto.TyphoonRemoteData; +import com.casic.missiles.modular.system.dto.*; import com.casic.missiles.modular.system.model.Typhoon; import com.casic.missiles.modular.system.model.TyphoonDetail; import com.casic.missiles.modular.system.model.TyphoonLand; @@ -20,6 +19,7 @@ import com.casic.missiles.modular.system.service.ITyphoonPointService; import com.casic.missiles.modular.system.service.ITyphoonService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; +import okhttp3.Request; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,7 +56,7 @@ * 获取台风接口数据 * */ String res = HttpRequestHelper.doGet(TyphoonConstant.TYPHOON_LIST + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getResponseCode(res))) { + if (SUCCESS_CODE.equals(getAisCode(res))) { TyphoonRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); //先清空之前的台风表,再保存最新的台风 @@ -96,7 +96,7 @@ String res = HttpRequestHelper.doGet( TyphoonConstant.TYPHOON_DETAIL.replace("ID", typhoon.getTyphoonId()) + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getResponseCode(res))) { + if (SUCCESS_CODE.equals(getAisCode(res))) { TyphoonDetailRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); TyphoonDetailRemoteData.ShowapiResBodyBean.ObjBean objBean = remoteData.getShowapi_res_body().getObj(); @@ -181,11 +181,80 @@ return new TyphoonDetailDTO(detail, landList, pointList); } - public String getResponseCode(String value) { + @Override + public OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour) { + /** + * 获取洋流数据Token + * */ + JSONObject object = new JSONObject(); + try { + object.put("appId", ShipConstant.OCEAN_APPID); + object.put("appKey", ShipConstant.OCEAN_APP_KEY); + } catch (JSONException e) { + e.printStackTrace(); + } + Request tokenRequest = new Request.Builder() + .url(ShipConstant.OCEAN_TOKEN) + .post(HttpRequestHelper.createRequestBody(object.toJSONString())) + .build(); + String tokenJson = HttpRequestHelper.doPost(tokenRequest); + if ("".equals(tokenJson)) { + return null; + } + /** + * 解析token + * */ + JSONObject tokenObject = JSON.parseObject(tokenJson); + JSONObject dataObject = tokenObject.getJSONObject("data"); + String token = dataObject.getString("token"); + /** + * 封装请求参数 + * */ + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("lon", lng); + jsonObject.put("lat", lat); + jsonObject.put("date", date); + jsonObject.put("hour", days); + jsonObject.put("days", hour); + } catch (JSONException e) { + e.printStackTrace(); + } + /** + * 获取洋流数据 + * */ + Request request = new Request.Builder() + .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) + .url(ShipConstant.OCEAN_DETAIL) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + String oceanData = HttpRequestHelper.doPost(request); + /** + * 解析洋流数据返回给前端 + * */ + OceanDetailDTO oceanDetailDTO = null; + if (SUCCESS_CODE.equals(getOceanCode(oceanData))) { + OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { + }); + oceanDetailDTO = new OceanDetailDTO(remoteData); + } + return oceanDetailDTO; + } + + public String getAisCode(String value) { if ("".equals(value)) { return value; } JSONObject jsonObject = JSON.parseObject(value); return jsonObject.getString("showapi_res_code"); } + + public String getOceanCode(String value) { + if ("".equals(value)) { + return value; + } + JSONObject jsonObject = JSON.parseObject(value); + Integer code = jsonObject.getInteger("code"); + return String.valueOf(code); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java index b5174a3..2937ebe 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/constants/ShipConstant.java @@ -6,12 +6,18 @@ * @author a203 */ public class ShipConstant { - private static final String BASE_URL = "https://api3.myships.com"; - public static final String HEADER_NAME = "appKey"; - public static final String KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + private static final String AIS_BASE_URL = "https://api3.myships.com"; + private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn"; + public static final String AIS_HEADER_NAME = "appKey"; + public static final String AIS_KEY_VALUE = "de26d070af5f42fabb13a02f7c0ec065"; + public static final String OCEAN_HEADER_NAME = "Authorization"; + public static final String OCEAN_APPID = "WXZH888888"; + public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb"; public static final String CONTENT_TYPE = "application/json; charset=utf-8"; - public static final String SHIPS_IN_CIRCLE = BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String SHIPS_IN_CIRCLE = AIS_BASE_URL + "/sp/region/latest/shipinfoCircle"; + public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token"; + public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx"; public static final int MIN_AGE = 1; public static final int MAX_AGE = 240; diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java index 7677950..9a3f00e 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/controller/TyphoonController.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.controller; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.service.ITyphoonService; @@ -45,4 +46,14 @@ TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonId); return ResponseData.success(detailDTO); } + + /** + * 洋流详情 + */ + @GetMapping(value = "/ocean") + @ResponseBody + public Object oceanDetail(double lng, double lat, String date, String days, String hour) { + OceanDetailDTO detailDTO = typhoonService.oceanDetail(lng, lat, date, days, hour); + return ResponseData.success(detailDTO); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java new file mode 100644 index 0000000..a4b2bac --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.text.DecimalFormat; + +/** + * @author a203 + */ +@Data +public class OceanDetailDTO { + + /** + * 海温, 单位: ℃(摄氏度) + */ + private Double temperature; + + /** + * 海拔, 单位: m(米) + */ + private Double altitude; + + /** + * 气压, 单位: hPa + */ + private Double pressure; + + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 海流速度, 单位: m/s + */ + private Double speed; + + /** + * 海流方向, 单位: 度[0,360] + */ + private Double oceanDir; + + /** + * 海浪预测 + */ + private PreviewBean forecast; + + @Data + public static class PreviewBean { + /** + * 涌浪高度, 单位: m(米) + */ + private Double swellHeight; + + /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 风浪高度, 单位: m(米) + */ + private Double waveHeight; + + /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + } + + public OceanDetailDTO(OceanDetailRemoteData remoteData) { + OceanDetailRemoteData.DataBean.ListBean listBean = remoteData.getData().getList().get(0); + OceanDetailRemoteData.DataBean.ListBean.YtxBean ytxBean = listBean.getYtx(); + OceanDetailRemoteData.DataBean.ListBean.MeteoBean meteoBean = listBean.getMeteo(); + if (ytxBean != null) { + this.temperature = formatData(ytxBean.getSurfaceTem()); + this.altitude = formatData(0.00); + this.pressure = formatData(ytxBean.getSurfPres()); + this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.speed = formatData(ytxBean.getWindMag()); + this.oceanDir = formatData(ytxBean.getCurrentDir()); + } + PreviewBean bean = new PreviewBean(); + if (meteoBean != null) { + bean.swellHeight = formatData(meteoBean.getSwellHgt()); + bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.waveHeight = formatData(meteoBean.getWaveHgt()); + bean.waveDir = formatData(meteoBean.getWaveDir()); + } + this.forecast = bean; + } + + private Double formatData(Double data) { + DecimalFormat df = new DecimalFormat("#.00"); + return Double.parseDouble(df.format(data)); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java new file mode 100644 index 0000000..168f12e --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailRemoteData.java @@ -0,0 +1,439 @@ +package com.casic.missiles.modular.system.dto; + +import java.util.List; + +/** + * 第三方洋流数据模型 + * + * @author a203 + */ +public class OceanDetailRemoteData { + + /** + * code : 0 + * data : {"lon":114.338597,"lat":18.273134,"date":"2021-10-21","hour":10,"list":[{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}]} + * message : success + * etime : 1634786517992 + */ + + private int code; + private DataBean data; + private String message; + private long etime; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getEtime() { + return etime; + } + + public void setEtime(long etime) { + this.etime = etime; + } + + public static class DataBean { + /** + * lon : 114.338597 + * lat : 18.273134 + * date : 2021-10-21 + * hour : 10 + * list : [{"date":"2021-10-21","ytx":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516},"meteo":{"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516}}] + */ + + private double lon; + private double lat; + private String date; + private int hour; + private List list; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * date : 2021-10-21 + * ytx : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + * meteo : {"currentMag":0.8194745182991028,"currentDir":311.85589599609375,"swellDir":54.90005874633789,"swellHgt":1.0300003290176392,"swellPrd":6.740001201629639,"waveDir":51.860050201416016,"waveHgt":1.0500003099441528,"wavePrd":6.740001201629639,"windMag":4.520016193389893,"windDir":84.48993682861328,"surfPres":101099.5625,"surface_Tem":301.4056800842285,"surfaceTem":28.255680084228516,"surfTem":28.255680084228516} + */ + + private String date; + private YtxBean ytx; + private MeteoBean meteo; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public YtxBean getYtx() { + return ytx; + } + + public void setYtx(YtxBean ytx) { + this.ytx = ytx; + } + + public MeteoBean getMeteo() { + return meteo; + } + + public void setMeteo(MeteoBean meteo) { + this.meteo = meteo; + } + + public static class YtxBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + + public static class MeteoBean { + /** + * currentMag : 0.8194745182991028 + * currentDir : 311.85589599609375 + * swellDir : 54.90005874633789 + * swellHgt : 1.0300003290176392 + * swellPrd : 6.740001201629639 + * waveDir : 51.860050201416016 + * waveHgt : 1.0500003099441528 + * wavePrd : 6.740001201629639 + * windMag : 4.520016193389893 + * windDir : 84.48993682861328 + * surfPres : 101099.5625 + * surface_Tem : 301.4056800842285 + * surfaceTem : 28.255680084228516 + * surfTem : 28.255680084228516 + */ + + private double currentMag; + private double currentDir; + private double swellDir; + private double swellHgt; + private double swellPrd; + private double waveDir; + private double waveHgt; + private double wavePrd; + private double windMag; + private double windDir; + private double surfPres; + private double surface_Tem; + private double surfaceTem; + private double surfTem; + + public double getCurrentMag() { + return currentMag; + } + + public void setCurrentMag(double currentMag) { + this.currentMag = currentMag; + } + + public double getCurrentDir() { + return currentDir; + } + + public void setCurrentDir(double currentDir) { + this.currentDir = currentDir; + } + + public double getSwellDir() { + return swellDir; + } + + public void setSwellDir(double swellDir) { + this.swellDir = swellDir; + } + + public double getSwellHgt() { + return swellHgt; + } + + public void setSwellHgt(double swellHgt) { + this.swellHgt = swellHgt; + } + + public double getSwellPrd() { + return swellPrd; + } + + public void setSwellPrd(double swellPrd) { + this.swellPrd = swellPrd; + } + + public double getWaveDir() { + return waveDir; + } + + public void setWaveDir(double waveDir) { + this.waveDir = waveDir; + } + + public double getWaveHgt() { + return waveHgt; + } + + public void setWaveHgt(double waveHgt) { + this.waveHgt = waveHgt; + } + + public double getWavePrd() { + return wavePrd; + } + + public void setWavePrd(double wavePrd) { + this.wavePrd = wavePrd; + } + + public double getWindMag() { + return windMag; + } + + public void setWindMag(double windMag) { + this.windMag = windMag; + } + + public double getWindDir() { + return windDir; + } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public double getSurfPres() { + return surfPres; + } + + public void setSurfPres(double surfPres) { + this.surfPres = surfPres; + } + + public double getSurface_Tem() { + return surface_Tem; + } + + public void setSurface_Tem(double surface_Tem) { + this.surface_Tem = surface_Tem; + } + + public double getSurfaceTem() { + return surfaceTem; + } + + public void setSurfaceTem(double surfaceTem) { + this.surfaceTem = surfaceTem; + } + + public double getSurfTem() { + return surfTem; + } + + public void setSurfTem(double surfTem) { + this.surfTem = surfTem; + } + } + } + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java index 8216ae1..1d2e6f5 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/ITyphoonService.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; import com.casic.missiles.modular.system.model.Typhoon; @@ -40,4 +41,16 @@ * @return TyphoonDetailDTO */ TyphoonDetailDTO typhoonDetail(String typhoonId); + + /** + * 查询洋流数据 + * + * @param lng 经度 + * @param lat 纬度 + * @param date 预报起报日期 + * @param days 预报的是几天后,0表示当天,1表示明天,以此类推 + * @param hour 预报的是days的哪一个小时 + * @return OceanDetailDTO + */ + OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour); } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java index 9cc6e5a..0e7bcca 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/ShipServiceImpl.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.system.service.IAisLogService; import com.casic.missiles.modular.system.service.IShipService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; +import okhttp3.Request; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; @@ -46,7 +47,9 @@ if (age < ShipConstant.MIN_AGE || age > ShipConstant.MAX_AGE) { throw new IllegalArgumentException("时间范围错误"); } - //调AIS数据 + /** + * 封装请求参数 + * */ JSONObject jsonObject = new JSONObject(); try { jsonObject.put("rgn", rgn); @@ -58,7 +61,12 @@ /** * 获取AIS接口数据 * */ - String res = HttpRequestHelper.doPost(ShipConstant.SHIPS_IN_CIRCLE, jsonObject.toJSONString()); + Request request = new Request.Builder() + .addHeader(ShipConstant.AIS_HEADER_NAME, ShipConstant.AIS_KEY_VALUE) + .url(ShipConstant.SHIPS_IN_CIRCLE) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + String res = HttpRequestHelper.doPost(request); //先解析出code,根据code判断 if (SUCCESS_CODE.equals(getResponseCode(res))) { //请求成功才保存ais访问记录 diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java index 979ee78..eeba903 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java @@ -1,16 +1,15 @@ package com.casic.missiles.modular.system.service.impl; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.constants.ShipConstant; import com.casic.missiles.modular.system.constants.TyphoonConstant; import com.casic.missiles.modular.system.dao.TyphoonMapper; -import com.casic.missiles.modular.system.dto.TyphoonDTO; -import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.dto.TyphoonDetailRemoteData; -import com.casic.missiles.modular.system.dto.TyphoonRemoteData; +import com.casic.missiles.modular.system.dto.*; import com.casic.missiles.modular.system.model.Typhoon; import com.casic.missiles.modular.system.model.TyphoonDetail; import com.casic.missiles.modular.system.model.TyphoonLand; @@ -20,6 +19,7 @@ import com.casic.missiles.modular.system.service.ITyphoonPointService; import com.casic.missiles.modular.system.service.ITyphoonService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; +import okhttp3.Request; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,7 +56,7 @@ * 获取台风接口数据 * */ String res = HttpRequestHelper.doGet(TyphoonConstant.TYPHOON_LIST + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getResponseCode(res))) { + if (SUCCESS_CODE.equals(getAisCode(res))) { TyphoonRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); //先清空之前的台风表,再保存最新的台风 @@ -96,7 +96,7 @@ String res = HttpRequestHelper.doGet( TyphoonConstant.TYPHOON_DETAIL.replace("ID", typhoon.getTyphoonId()) + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getResponseCode(res))) { + if (SUCCESS_CODE.equals(getAisCode(res))) { TyphoonDetailRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); TyphoonDetailRemoteData.ShowapiResBodyBean.ObjBean objBean = remoteData.getShowapi_res_body().getObj(); @@ -181,11 +181,80 @@ return new TyphoonDetailDTO(detail, landList, pointList); } - public String getResponseCode(String value) { + @Override + public OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour) { + /** + * 获取洋流数据Token + * */ + JSONObject object = new JSONObject(); + try { + object.put("appId", ShipConstant.OCEAN_APPID); + object.put("appKey", ShipConstant.OCEAN_APP_KEY); + } catch (JSONException e) { + e.printStackTrace(); + } + Request tokenRequest = new Request.Builder() + .url(ShipConstant.OCEAN_TOKEN) + .post(HttpRequestHelper.createRequestBody(object.toJSONString())) + .build(); + String tokenJson = HttpRequestHelper.doPost(tokenRequest); + if ("".equals(tokenJson)) { + return null; + } + /** + * 解析token + * */ + JSONObject tokenObject = JSON.parseObject(tokenJson); + JSONObject dataObject = tokenObject.getJSONObject("data"); + String token = dataObject.getString("token"); + /** + * 封装请求参数 + * */ + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("lon", lng); + jsonObject.put("lat", lat); + jsonObject.put("date", date); + jsonObject.put("hour", days); + jsonObject.put("days", hour); + } catch (JSONException e) { + e.printStackTrace(); + } + /** + * 获取洋流数据 + * */ + Request request = new Request.Builder() + .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) + .url(ShipConstant.OCEAN_DETAIL) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + String oceanData = HttpRequestHelper.doPost(request); + /** + * 解析洋流数据返回给前端 + * */ + OceanDetailDTO oceanDetailDTO = null; + if (SUCCESS_CODE.equals(getOceanCode(oceanData))) { + OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { + }); + oceanDetailDTO = new OceanDetailDTO(remoteData); + } + return oceanDetailDTO; + } + + public String getAisCode(String value) { if ("".equals(value)) { return value; } JSONObject jsonObject = JSON.parseObject(value); return jsonObject.getString("showapi_res_code"); } + + public String getOceanCode(String value) { + if ("".equals(value)) { + return value; + } + JSONObject jsonObject = JSON.parseObject(value); + Integer code = jsonObject.getInteger("code"); + return String.valueOf(code); + } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java index 1aeaa52..26438b1 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java @@ -15,13 +15,11 @@ */ public class HttpRequestHelper { - public static String doPost(String url, String value) { - RequestBody requestBody = RequestBody.create(MediaType.parse(ShipConstant.CONTENT_TYPE), value); - Request request = new Request.Builder() - .addHeader(ShipConstant.HEADER_NAME, ShipConstant.KEY_VALUE) - .url(url) - .post(requestBody) - .build(); + public static RequestBody createRequestBody(String value) { + return RequestBody.create(MediaType.parse(ShipConstant.CONTENT_TYPE), value); + } + + public static String doPost(Request request) { return streamResponse(request); }