Compare commits

...

8 Commits

13 changed files with 333 additions and 336 deletions

View File

@ -8,6 +8,14 @@
{ {
"city_name": "厦门", "city_name": "厦门",
"city_code": "101230201" "city_code": "101230201"
},
{
"city_name": "同安",
"city_code": "101230202"
},
{
"city_name": "翔安",
"city_code": "101230207"
} }
], ],
"notify_stuffs": [ "notify_stuffs": [

View File

@ -21,17 +21,13 @@
<SOURCES /> <SOURCES />
</library> </library>
</orderEntry> </orderEntry>
<orderEntry type="library" name="Maven: com.oracle:ojdbc8:19.3.0.0.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" /> <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.4" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:20040616" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
<orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
<orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.8" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.8" level="project" />

View File

@ -267,15 +267,15 @@
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: commons-beanutils:commons-beanutils:1.9.4"> <library name="Maven: com.oracle:ojdbc8:19.3.0.0.0">
<CLASSES> <CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0.jar!/" />
</CLASSES> </CLASSES>
<JAVADOC> <JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4-javadoc.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-javadoc.jar!/" />
</JAVADOC> </JAVADOC>
<SOURCES> <SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: commons-codec:commons-codec:1.11"> <library name="Maven: commons-codec:commons-codec:1.11">
@ -289,37 +289,15 @@
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: commons-collections:commons-collections:20040616"> <library name="Maven: commons-logging:commons-logging:1.2">
<CLASSES> <CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/20040616/commons-collections-20040616.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2.jar!/" />
</CLASSES> </CLASSES>
<JAVADOC> <JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/20040616/commons-collections-20040616-javadoc.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-javadoc.jar!/" />
</JAVADOC> </JAVADOC>
<SOURCES> <SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/20040616/commons-collections-20040616-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-lang:commons-lang:2.6">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-logging:commons-logging:1.1.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: junit:junit:4.13.2"> <library name="Maven: junit:junit:4.13.2">
@ -333,28 +311,6 @@
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: net.sf.ezmorph:ezmorph:1.0.6">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: net.sf.json-lib:json-lib:jdk15:2.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/json-lib/json-lib/2.4/json-lib-2.4-jdk15.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/json-lib/json-lib/2.4/json-lib-2.4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/json-lib/json-lib/2.4/json-lib-2.4-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.httpcomponents:httpclient:4.5.13"> <library name="Maven: org.apache.httpcomponents:httpclient:4.5.13">
<CLASSES> <CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" />

View File

@ -7,4 +7,4 @@ java.util.logging.FileHandler.pattern = ./logs/log_%u.log
java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true; java.util.logging.FileHandler.append = true

View File

@ -8,9 +8,9 @@
<dependency> <dependency>
<groupId>com.oracle</groupId> <groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId> <artifactId>ojdbc8</artifactId>
<version>1.0</version> <version>19.3.0.0.0</version>
<scope>system</scope> <!-- <scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath> <systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath> -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
@ -23,37 +23,6 @@
<version>4.13.2</version> <version>4.13.2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- <dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>20040616</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency> -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId> <artifactId>jackson-core</artifactId>

View File

@ -1,8 +1,9 @@
/* /*
* @Author: Kane * @Author: Kane
* @Date: 2022-04-22 10:53:49 * @Date: 2022-04-22 10:53:49
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2022-05-10 16:28:07 * @LastEditTime: 2022-06-07 13:16:35
* @FilePath: \DisasterWarning\src\main\java\AppMain.java * @FilePath: \DisasterWarning\src\main\java\AppMain.java
* @Description: 和风天气预警推送厦门太保公众号主程序 * @Description: 和风天气预警推送厦门太保公众号主程序
* *
@ -11,6 +12,7 @@
import com.cpic.xim.config.AppConfigManager; import com.cpic.xim.config.AppConfigManager;
import com.cpic.xim.config.City; import com.cpic.xim.config.City;
import com.cpic.xim.notify.disaster.QWeatherDisasterWarning; import com.cpic.xim.notify.disaster.QWeatherDisasterWarning;
import com.cpic.xim.notify.disaster.QWeatherDisasterWarningItem;
import com.cpic.xim.notify.disaster.WeatherDisasterWarningGrabber; import com.cpic.xim.notify.disaster.WeatherDisasterWarningGrabber;
import com.cpic.xim.wechat.officalAccount.sendMessage; import com.cpic.xim.wechat.officalAccount.sendMessage;
import com.cpic.xim.config.WeatherDisasterNotifyConfig; import com.cpic.xim.config.WeatherDisasterNotifyConfig;
@ -20,43 +22,34 @@ import java.sql.SQLException;
import java.util.Vector; import java.util.Vector;
import java.util.logging.*; import java.util.logging.*;
public class AppMain {
public class AppMain
{
// private final static String LOG_FILE_PATH = "./logs/app%u.log"; // private final static String LOG_FILE_PATH = "./logs/app%u.log";
public static void main( String[] args ) public static void main(String[] args) {
{
String json; String json;
WeatherDisasterNotifyConfig config = null; WeatherDisasterNotifyConfig config = null;
QWeatherDisasterWarning warning = null; QWeatherDisasterWarning warning = null;
Logger logger = null; Logger logger = null;
// 配置logger // 配置logger
try try {
{
setRootLogger(); setRootLogger();
logger = Logger.getLogger( "com.cpicxim" ); logger = Logger.getLogger("com.cpicxim");
} } catch (IOException error) {
catch ( IOException error ) System.out.println("配置logger失败原因" + error.getMessage());
{
System.out.println( "配置logger失败原因" + error.getMessage() );
return; return;
} }
// 读取配置 // 读取配置
try try {
{
config = AppConfigManager.getConfig(); config = AppConfigManager.getConfig();
} } catch (IOException error) {
catch ( IOException error ) System.out.println("读取配置文件失败!");
{ System.out.println(error.getMessage());
System.out.println( "读取配置文件失败!" );
System.out.println( error.getMessage() );
logger.log( Level.SEVERE, "读取配置文件失败:{0}", error.getMessage() ); logger.log(Level.SEVERE, "读取配置文件失败:{0}", error.getMessage());
return; return;
} }
@ -66,73 +59,68 @@ public class AppMain
String userKey = config.getKey(); String userKey = config.getKey();
// 遍历所有城市查询是否有警报有则推送 // 遍历所有城市查询是否有警报有则推送
while (true) while (true) {
{ for (City city : cities) {
for ( City city : cities ) try {
{ json = WeatherDisasterWarningGrabber.getWeatherDisasterWarningJSON(queryURL,
try userKey, city.getCityCode());
{ warning = WeatherDisasterWarningGrabber.convertWeatherDisasterWarning(json);
json = WeatherDisasterWarningGrabber.getWeatherDisasterWarningJSON( queryURL,
userKey, city.getCityCode() );
warning = WeatherDisasterWarningGrabber.convertWeatherDisasterWarning( json );
logger.log( Level.INFO, "查询{0}天气预警,结果:{1}。", new Object[] logger.log(Level.INFO, "查询{0}天气预警,结果:{1}。", new Object[] { city.getCityName(), json });
{ city.getCityName(), json} );
// 判断是否有警报 Vector<QWeatherDisasterWarningItem> warningItems = warning.getWarning();
if ( warning.getWarning().isEmpty() == true)
{ // 判断是否有警报没有警报就结束当前城市的处理
logger.log( Level.INFO, "查询{0}天气预警,无警报!。", new Object[] if (warningItems.isEmpty() == true) {
{ city.getCityName()} ); logger.log(Level.INFO, "查询{0}天气预警,无警报!。", new Object[] { city.getCityName() });
continue; continue;
} }
logger.log( Level.INFO, "查询{0}天气预警,发送日志。", new Object[] // 有警报就遍历警报数组
{ city.getCityName()} ); for (QWeatherDisasterWarningItem item : warningItems) {
// 先检查是否已经发送过
if (sendMessage.checkWarningHasSended(item.getId()) == false) {
logger.log(Level.INFO, "查询{0}天气预警ID:{1},已有发送记录,跳过。",
new Object[] { city.getCityName(), item.getId() });
sendMessage.sendWeatherDisasterWarning( config.getWechatOfficalAccountURL(), continue;
warning );
logger.log( Level.INFO, "{0}天气预警,日志发送成功。", new Object[]
{ city.getCityName()} );
sendMessage.saveWeatherDisasterWarning( city.getCityName(), warning );
} }
catch ( IOException error )
{
System.out.println( "查询" + city.getCityName() + "出现异常!" );
System.out.println( error.getMessage() );
logger.log( Level.SEVERE, "查询 {0} 出现异常:{1}。", new Object[] // 没有发送过
{ city.getCityName(), error.getMessage()} ); logger.log(Level.INFO, "查询{0}天气预警,发送日志。", new Object[] { city.getCityName() });
}
catch ( SQLException error )
{
logger.log( Level.SEVERE, "查询 {0} 写入数据库失败:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
}
catch ( ClassNotFoundException error )
{
logger.log( Level.SEVERE, "查询 {0} 加载oracle驱动失败:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
sendMessage.sendWeatherDisasterWarning(config.getWechatOfficalAccountURL(),
item);
logger.log(Level.INFO, "{0}天气预警,日志发送成功。", new Object[] { city.getCityName() });
// 将发送的警报保存起来
sendMessage.saveWeatherDisasterWarning(city.getCityName(), item);
} }
catch ( Exception error ) } catch (IOException error) {
{ System.out.println("查询" + city.getCityName() + "出现异常!");
logger.log( Level.SEVERE, "查询 {0} 出现未知错误:{1}。", new Object[] System.out.println(error.getMessage());
{ city.getCityName(), error.getMessage()} );
logger.log(Level.SEVERE, "查询 {0} 出现异常:{1}。",
new Object[] { city.getCityName(), error.getMessage() });
} catch (SQLException error) {
logger.log(Level.SEVERE, "查询 {0} 写入数据库失败:{1}。",
new Object[] { city.getCityName(), error.getMessage() });
} catch (ClassNotFoundException error) {
logger.log(Level.SEVERE, "查询 {0} 加载oracle驱动失败:{1}。",
new Object[] { city.getCityName(), error.getMessage() });
} catch (Exception error) {
logger.log(Level.SEVERE, "查询 {0} 出现未知错误:{1}。",
new Object[] { city.getCityName(), error.getMessage() });
} }
} }
try try {
{ logger.log(Level.INFO, "查询结束,休眠{0}分钟。", config.getQueryInterval());
logger.log( Level.INFO, "查询结束,休眠{0}分钟。", config.getQueryInterval() ); Thread.sleep(config.getQueryInterval() * 1000 * 60);
Thread.sleep( config.getQueryInterval() * 1000 * 60 ); } catch (InterruptedException error) {
} logger.log(Level.SEVERE, "线程休眠异常,错误信息:{0}", new Object[] { error.getMessage() });
catch ( InterruptedException error )
{
logger.log( Level.SEVERE, "线程休眠异常,错误信息:{0}", new Object[]
{ error.getMessage()} );
} }
} }
} }
@ -140,17 +128,16 @@ public class AppMain
/** /**
* 设置JUL的logger * 设置JUL的logger
*/ */
private static void setRootLogger() throws IOException private static void setRootLogger() throws IOException {
{
LogManager logManager = LogManager.getLogManager(); LogManager logManager = LogManager.getLogManager();
// 使用外部的配置文件 // 使用外部的配置文件
FileInputStream configFile = new FileInputStream( "./logging.properties" ); FileInputStream configFile = new FileInputStream("./logging.properties");
// 使用jar中的配置文件 // 使用jar中的配置文件
// InputStream configFile = // InputStream configFile =
// AppMain.class.getClassLoader().getResourceAsStream( "logging.properties" ); // AppMain.class.getClassLoader().getResourceAsStream( "logging.properties" );
logManager.readConfiguration( configFile ); logManager.readConfiguration(configFile);
Logger.getLogger( "com.cpicxim" ); Logger.getLogger("com.cpicxim");
} }
} }

View File

@ -74,7 +74,7 @@ public class QWeatherDisasterWarning
private String code; private String code;
@JsonProperty( "updateTime") @JsonProperty( "updateTime")
@JsonFormat( pattern = "yyyy-MM-dd\'T\'HH:mmXXX") @JsonFormat( pattern = "yyyy-MM-dd'T'HH:mmXXX")
private Date updateTime; private Date updateTime;
@JsonProperty( "fxLink") @JsonProperty( "fxLink")

View File

@ -7,21 +7,21 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
//import com.fasterxml.jackson.annotation.JsonIgnore; //import com.fasterxml.jackson.annotation.JsonIgnore;
public class QWeatherDisasterWarningItem public class QWeatherDisasterWarningItem {
{ public QWeatherDisasterWarningItem() {
public QWeatherDisasterWarningItem() }
{}
public QWeatherDisasterWarningItem( String id, String sender, Date pubTime, String title, public QWeatherDisasterWarningItem(String id, String sender, Date pubTime, String title, String status,
String status, String level, String type, String typeName, String text, String related, String level, String severity, String severityColor, String type, String typeName, String text,
String urgency, String certainty) String related, String urgency, String certainty) {
{
this.id = id; this.id = id;
this.sender = sender; this.sender = sender;
this.pubTime = pubTime; this.pubTime = pubTime;
this.title = title; this.title = title;
this.status = status; this.status = status;
this.level = level; this.level = level;
this.severity = severity;
this.severityColor = severityColor;
this.type = type; this.type = type;
this.typeName = typeName; this.typeName = typeName;
this.text = text; this.text = text;
@ -31,163 +31,233 @@ public class QWeatherDisasterWarningItem
} }
@Override @Override
public boolean equals( Object o ) public int hashCode() {
{ final int prime = 31;
if ( this == o) int result = 1;
{ result = prime * result + ((certainty == null) ? 0 : certainty.hashCode());
return true; result = prime * result + ((id == null) ? 0 : id.hashCode());
} result = prime * result + ((level == null) ? 0 : level.hashCode());
if ( o == null || getClass() != o.getClass()) result = prime * result + ((pubTime == null) ? 0 : pubTime.hashCode());
{ result = prime * result + ((related == null) ? 0 : related.hashCode());
return false; result = prime * result + ((sender == null) ? 0 : sender.hashCode());
} result = prime * result + ((severity == null) ? 0 : severity.hashCode());
QWeatherDisasterWarningItem that = (QWeatherDisasterWarningItem) o; result = prime * result + ((severityColor == null) ? 0 : severityColor.hashCode());
return id.equals( that.id ) && Objects.equals( sender, that.sender ) result = prime * result + ((status == null) ? 0 : status.hashCode());
&& Objects.equals( pubTime, that.pubTime ) && Objects.equals( title, that.title ) result = prime * result + ((text == null) ? 0 : text.hashCode());
&& Objects.equals( status, that.status ) && Objects.equals( level, that.level ) result = prime * result + ((title == null) ? 0 : title.hashCode());
&& Objects.equals( type, that.type ) && Objects.equals( typeName, that.typeName ) result = prime * result + ((type == null) ? 0 : type.hashCode());
&& Objects.equals( text, that.text ) && Objects.equals( related, that.related ) result = prime * result + ((typeName == null) ? 0 : typeName.hashCode());
&& Objects.equals( urgency, that.urgency ) result = prime * result + ((urgency == null) ? 0 : urgency.hashCode());
&& Objects.equals( certainty, that.certainty ); return result;
} }
@Override @Override
public int hashCode() public boolean equals(Object obj) {
{ if (this == obj)
return Objects.hash( id, sender, pubTime, title, status, level, type, typeName, text, return true;
related, urgency, certainty ); if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
QWeatherDisasterWarningItem other = (QWeatherDisasterWarningItem) obj;
if (certainty == null) {
if (other.certainty != null)
return false;
} else if (!certainty.equals(other.certainty))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (level == null) {
if (other.level != null)
return false;
} else if (!level.equals(other.level))
return false;
if (pubTime == null) {
if (other.pubTime != null)
return false;
} else if (!pubTime.equals(other.pubTime))
return false;
if (related == null) {
if (other.related != null)
return false;
} else if (!related.equals(other.related))
return false;
if (sender == null) {
if (other.sender != null)
return false;
} else if (!sender.equals(other.sender))
return false;
if (severity == null) {
if (other.severity != null)
return false;
} else if (!severity.equals(other.severity))
return false;
if (severityColor == null) {
if (other.severityColor != null)
return false;
} else if (!severityColor.equals(other.severityColor))
return false;
if (status == null) {
if (other.status != null)
return false;
} else if (!status.equals(other.status))
return false;
if (text == null) {
if (other.text != null)
return false;
} else if (!text.equals(other.text))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
if (typeName == null) {
if (other.typeName != null)
return false;
} else if (!typeName.equals(other.typeName))
return false;
if (urgency == null) {
if (other.urgency != null)
return false;
} else if (!urgency.equals(other.urgency))
return false;
return true;
} }
public String getId() public String getId() {
{
return id; return id;
} }
public void setId( String id ) public void setId(String id) {
{
this.id = id; this.id = id;
} }
public String getSender() public String getSender() {
{
return sender; return sender;
} }
public void setSender( String sender ) public void setSender(String sender) {
{
this.sender = sender; this.sender = sender;
} }
public Date getPubTime() public Date getPubTime() {
{
return pubTime; return pubTime;
} }
public void setPubTime( Date pubTime ) public void setPubTime(Date pubTime) {
{
this.pubTime = pubTime; this.pubTime = pubTime;
} }
public String getTitle() public String getTitle() {
{
return title; return title;
} }
public void setTitle( String title ) public void setTitle(String title) {
{
this.title = title; this.title = title;
} }
public String getStatus() public String getStatus() {
{
return status; return status;
} }
public void setStatus( String status ) public void setStatus(String status) {
{
this.status = status; this.status = status;
} }
public String getLevel() public String getLevel() {
{
return level; return level;
} }
public void setLevel( String level ) public void setLevel(String level) {
{
this.level = level; this.level = level;
} }
public String getType() public String getSeverity() {
{ return severity;
}
public void setSeverity(String severity) {
this.severity = severity;
}
public String getSeverityColor() {
return severityColor;
}
public void setSeverityColor(String severityColor) {
this.severityColor = severityColor;
}
public String getType() {
return type; return type;
} }
public void setType( String type ) public void setType(String type) {
{
this.type = type; this.type = type;
} }
public String getTypeName() public String getTypeName() {
{
return typeName; return typeName;
} }
public void setTypeName( String typeName ) public void setTypeName(String typeName) {
{
this.typeName = typeName; this.typeName = typeName;
} }
public String getText() public String getText() {
{
return text; return text;
} }
public void setText( String text ) public void setText(String text) {
{
this.text = text; this.text = text;
} }
public String getRelated() public String getRelated() {
{
return related; return related;
} }
public void setRelated( String related ) public void setRelated(String related) {
{
this.related = related; this.related = related;
} }
public String getUrgency() public String getUrgency() {
{
return urgency; return urgency;
} }
public void setUrgency( String urgency ) public void setUrgency(String urgency) {
{
this.urgency = urgency; this.urgency = urgency;
} }
public String getCertainty() public String getCertainty() {
{
return certainty; return certainty;
} }
public void setCertainty( String certainty ) public void setCertainty(String certainty) {
{
this.certainty = certainty; this.certainty = certainty;
} }
private String id; private String id;
private String sender; private String sender;
@JsonProperty( "pubTime") @JsonProperty("pubTime")
@JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
private Date pubTime; private Date pubTime;
private String title; private String title;
private String status; private String status;
private String level; private String level;
private String severity;
private String severityColor;
private String type; private String type;
private String typeName; private String typeName;
private String text; private String text;

View File

@ -2,7 +2,7 @@
* @Author: Kane * @Author: Kane
* @Date: 2022-04-22 10:53:49 * @Date: 2022-04-22 10:53:49
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2022-05-06 11:14:32 * @LastEditTime: 2022-05-12 09:51:13
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\wechat\officalAccount\sendMessage.java * @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\wechat\officalAccount\sendMessage.java
* @Description: 用来推送公众号消息的程序库 * @Description: 用来推送公众号消息的程序库
* *
@ -14,16 +14,17 @@ import com.cpic.xim.config.db.OracleConfigManager;
import com.cpic.xim.config.db.OracleConfig; import com.cpic.xim.config.db.OracleConfig;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.IOException; import java.io.IOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Vector;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import com.cpic.xim.notify.disaster.*; import com.cpic.xim.notify.disaster.*;
import com.cpic.xim.httpUtil.HttpUtils; import com.cpic.xim.httpUtil.HttpUtils;
@ -39,13 +40,14 @@ public class sendMessage
/** /**
* 推送天气灾害预警接口文档参考 彭奕洁 编写消息发送接口调用文档 * 推送天气灾害预警接口文档参考 彭奕洁 编写消息发送接口调用文档
* 使用 post 方式请求体内容以最基础的 post 格式 * 使用 post 方式请求体内容以最基础的 post 格式
*
* @param officalAccountURL 产险厦门分公司公众号接口网址 * @param officalAccountURL 产险厦门分公司公众号接口网址
* @param warning 灾害预警对象 * @param warningItem 灾害预警对象
*/ */
public static void sendWeatherDisasterWarning( String officalAccountURL, public static void sendWeatherDisasterWarning( String officalAccountURL,
QWeatherDisasterWarning warning ) QWeatherDisasterWarningItem warningItem )
{ {
Vector<QWeatherDisasterWarningItem> warningItems = warning.getWarning(); // Vector<QWeatherDisasterWarningItem> warningItems = warningItem.getWarning();
StringBuilder requestBody = null; StringBuilder requestBody = null;
// 设置请求头参数 // 设置请求头参数
@ -56,13 +58,12 @@ public class sendMessage
headers.put( "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" ); headers.put( "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" );
// 遍历消息将消息推送出去 // 遍历消息将消息推送出去
for ( QWeatherDisasterWarningItem item : warningItems )
{
// 拼接消息内容 // 拼接消息内容
String title = item.getTitle(); String title = warningItem.getTitle();
String text = item.getText(); String text = warningItem.getText();
String color = warningLevel.keySet().contains( item.getLevel() ) String color = warningLevel.containsKey( warningItem.getLevel() )
? warningLevel.get( item.getLevel() ) ? warningLevel.get( warningItem.getLevel() )
: "#000000"; : "#000000";
requestBody = new StringBuilder(); requestBody = new StringBuilder();
@ -79,13 +80,14 @@ public class sendMessage
{ {
error.printStackTrace(); error.printStackTrace();
} }
}
} }
/** /**
* 检查预警是否已经推送过通过 QWeatherDisasterWarningItem 对象的 id 属性 * 检查预警是否已经推送过通过 QWeatherDisasterWarningItem 对象的 id 属性
* 查询 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify * 查询 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify
* 统计 warningID 的数量如果不为0,说明该预警已经保存过视为已经推送过 * 统计 warningID 的数量如果不为0,说明该预警已经保存过视为已经推送过
*
* @param warningID 预警的id * @param warningID 预警的id
* @return 如果推送过返回false否则返回 true * @return 如果推送过返回false否则返回 true
*/ */
@ -94,7 +96,7 @@ public class sendMessage
{ {
boolean result = false; boolean result = false;
OracleConfig dbConfig = OracleConfigManager.getOracleConfig();; OracleConfig dbConfig = OracleConfigManager.getOracleConfig();
Connection conn = null; Connection conn = null;
PreparedStatement stmt = null; PreparedStatement stmt = null;
@ -117,7 +119,7 @@ public class sendMessage
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if ( rs.next() && rs.getInt( 1 ) == 0) if ( rs.next() && rs.getInt( 1 ) == 0 )
{ {
result = true; result = true;
} }
@ -126,7 +128,7 @@ public class sendMessage
{ {
try try
{ {
if ( rs != null) if ( rs != null )
{ {
rs.close(); rs.close();
} }
@ -138,7 +140,7 @@ public class sendMessage
try try
{ {
if ( stmt != null) if ( stmt != null )
{ {
stmt.close(); stmt.close();
} }
@ -150,7 +152,7 @@ public class sendMessage
try try
{ {
if ( conn != null) if ( conn != null )
{ {
conn.close(); conn.close();
} }
@ -168,21 +170,24 @@ public class sendMessage
* 保存天气预警警报数据 * 保存天气预警警报数据
* 保存至 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify * 保存至 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify
* 保存的数据用来判断预警是否已经推送过以防止反复推送数据 * 保存的数据用来判断预警是否已经推送过以防止反复推送数据
*
* @param city 城市名称 * @param city 城市名称
* @param warning 预警数据 QWeatherDisasterWarningItem 对象 * @param warning 预警数据 QWeatherDisasterWarningItem 对象
* @throws SQLException 执行sql时可能抛出的异常出现sql异常就回滚事务 * @throws SQLException 执行sql时可能抛出的异常出现sql异常就回滚事务
* @throws IOException 读取数据库配置文件时可能抛出的异常 * @throws IOException 读取数据库配置文件时可能抛出的异常
* @throws ClassNotFoundException 加载oracle jdbc驱动时可能抛出的异常 * @throws ClassNotFoundException 加载oracle jdbc驱动时可能抛出的异常
*/ */
public static void saveWeatherDisasterWarning( String city, QWeatherDisasterWarning warnings ) public static void saveWeatherDisasterWarning( String city,
QWeatherDisasterWarningItem warning )
throws SQLException, IOException, ClassNotFoundException throws SQLException, IOException, ClassNotFoundException
{ {
Connection conn = null; Connection conn = null;
PreparedStatement stmt = null; PreparedStatement stmt = null;
String sql = "insert into weather_disaster_notify(notify_id, sender, city," String sql = new StringBuilder().append( "insert into weather_disaster_notify(notify_id, sender, city," )
+ "warning_level, warning_type_code, warning_type_name, title," .append( "warning_level, warning_type_code, warning_type_name, title," )
+ "text, pub_time) values( ?,?,?,?,?,?,?,?,?)"; .append( "text, pub_time) values( ?,?,?,?,?,?,?,?,?)" )
.toString();
OracleConfig dbConfig = OracleConfigManager.getOracleConfig(); OracleConfig dbConfig = OracleConfigManager.getOracleConfig();
@ -197,10 +202,9 @@ public class sendMessage
conn = DriverManager.getConnection( jdbcURL, userName, password ); conn = DriverManager.getConnection( jdbcURL, userName, password );
stmt = conn.prepareStatement( sql ); stmt = conn.prepareStatement( sql );
for ( QWeatherDisasterWarningItem warning : warnings.getWarning() ) conn.setAutoCommit( false );
{
java.sql.Timestamp pubTime = java.sql.Timestamp pubTime = new java.sql.Timestamp( warning.getPubTime().getTime() );
new java.sql.Timestamp( warning.getPubTime().getTime() );
stmt.setString( 1, warning.getId() ); stmt.setString( 1, warning.getId() );
stmt.setString( 2, warning.getSender() ); stmt.setString( 2, warning.getSender() );
@ -213,7 +217,6 @@ public class sendMessage
stmt.setTimestamp( 9, pubTime ); stmt.setTimestamp( 9, pubTime );
stmt.execute(); stmt.execute();
}
// 没有问题就提交 // 没有问题就提交
conn.commit(); conn.commit();
@ -221,7 +224,7 @@ public class sendMessage
catch ( SQLException error ) catch ( SQLException error )
{ {
// 出现sql错误就回滚 // 出现sql错误就回滚
if ( conn != null) if ( conn != null )
{ {
conn.rollback(); conn.rollback();
} }
@ -232,7 +235,7 @@ public class sendMessage
{ {
try try
{ {
if ( stmt != null) if ( stmt != null )
{ {
stmt.close(); stmt.close();
} }
@ -244,7 +247,7 @@ public class sendMessage
try try
{ {
if ( conn != null) if ( conn != null )
{ {
conn.close(); conn.close();
} }
@ -256,7 +259,6 @@ public class sendMessage
} }
} }
static static
{ {
// 预警级别色彩 // 预警级别色彩
@ -269,7 +271,6 @@ public class sendMessage
} }
} }
class WechatOfficalAccountMessageParameter class WechatOfficalAccountMessageParameter
{ {
@ -279,40 +280,40 @@ class WechatOfficalAccountMessageParameter
groupID = 1; groupID = 1;
} }
@JsonProperty( "tplid") @JsonProperty("tplid")
private int tplID; private int tplID;
@JsonProperty( "groupid") @JsonProperty("groupid")
private int groupID; private int groupID;
@JsonProperty( "first") @JsonProperty("first")
private String first; private String first;
@JsonProperty( "keyword1") @JsonProperty("keyword1")
private String keyword1; private String keyword1;
@JsonProperty( "keyword1color") @JsonProperty("keyword1color")
private String keyword1Color; private String keyword1Color;
@JsonProperty( "keyword2") @JsonProperty("keyword2")
private String keyword2; private String keyword2;
@JsonProperty( "keyword2color") @JsonProperty("keyword2color")
private String keyword2Color; private String keyword2Color;
@JsonProperty( "remark") @JsonProperty("remark")
private String remark; private String remark;
@JsonProperty( "remarkcolor") @JsonProperty("remarkcolor")
private String remarkColor; private String remarkColor;
@JsonProperty( "url") @JsonProperty("url")
private String url; private String url;
@JsonProperty( "appid") @JsonProperty("appid")
private String appid; private String appid;
@JsonProperty( "pagepath") @JsonProperty("pagepath")
private String pagePath; private String pagePath;
public int getTplID() public int getTplID()

View File

@ -2,7 +2,7 @@
* @Author: Kane * @Author: Kane
* @Date: 2022-04-22 10:53:49 * @Date: 2022-04-22 10:53:49
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2022-05-10 11:33:41 * @LastEditTime: 2022-05-12 09:54:36
* @FilePath: \DisasterWarning\src\test\java\com\cpic\xim\wechat\officalAccount\sendMessageTest.java * @FilePath: \DisasterWarning\src\test\java\com\cpic\xim\wechat\officalAccount\sendMessageTest.java
* @Description: * @Description:
* *
@ -75,7 +75,7 @@ public class sendMessageTest
String city = "东山县"; String city = "东山县";
sendMessage.saveWeatherDisasterWarning( city, warning ); // sendMessage.saveWeatherDisasterWarning( city, warning );
} }
catch ( Exception error ) catch ( Exception error )
{ {

View File

@ -8,6 +8,14 @@
{ {
"city_name": "厦门", "city_name": "厦门",
"city_code": "101230201" "city_code": "101230201"
},
{
"city_name": "同安",
"city_code": "101230202"
},
{
"city_name": "翔安",
"city_code": "101230207"
} }
], ],
"notify_stuffs": [ "notify_stuffs": [

2
应用/1.0/run.bat Normal file
View File

@ -0,0 +1,2 @@
java -jar disaster_warning-1.0-SNAPSHOT-jar-with-dependencies.jar
pause

View File

@ -19,5 +19,5 @@
} }
], ],
"refer": { "sources": ["12379"], "license": ["no commercial use"] }, "refer": { "sources": ["12379"], "license": ["no commercial use"] },
"testURL": "https://devapi.qweather.com/v7/warning/now?key=fe9fa8eeeb6f4301a92541eed565dd15&location=101230608" "testURL": "https://devapi.qweather.com/v7/warning/now?key=fe9fa8eeeb6f4301a92541eed565dd15&location=101230201"
} }