8 Commits

14 changed files with 711 additions and 299 deletions

View File

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

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library" scope="TEST">
<library name="JUnit4">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/junit-4.13.1.jar!/" />
<root url="jar://$MODULE_DIR$/lib/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</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: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" 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" 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-annotations:2.9.8" level="project" />
</component>
</module>

View File

@@ -0,0 +1,348 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CodeStyleManager">
<option name="USE_DEFAULT_CODE_STYLE_SCHEME" value="true" />
<option name="CODE_STYLE_SCHEME" value="" />
</component>
<component name="CompilerConfiguration">
<wildcardResourcePatterns>
<entry name="!?*.java" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="disaster_warning" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="disaster_warning" target="1.8" />
</bytecodeTargetLevel>
</component>
<component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="PROJECT" charset="UTF-8" />
</component>
<component name="ExportToHTMLSettings">
<option name="PRINT_LINE_NUMBERS" value="false" />
<option name="OPEN_IN_BROWSER" value="false" />
<option name="OUTPUT_DIRECTORY" />
</component>
<component name="ImportConfiguration">
<option name="VENDOR" />
<option name="RELEASE_TAG" />
<option name="LOG_MESSAGE" />
<option name="CHECKOUT_AFTER_IMPORT" value="true" />
</component>
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
</profile>
<version value="1.0" />
</component>
<component name="JUnitGeneratorProjectSettings">
<option name="selectedTemplateKey" value="JUnit 4" />
<option name="vmTemplates">
<map>
<entry key="JUnit 3" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package test.$entry.packageName; &#10;&#10;import junit.framework.Test; &#10;import junit.framework.TestSuite; &#10;import junit.framework.TestCase; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author &lt;Authors name&gt; &#10;* @since &lt;pre&gt;$today&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass extends TestCase { &#10;public $testClass(String name) { &#10;super(name); &#10;} &#10;&#10;public void setUp() throws Exception { &#10;super.setUp(); &#10;} &#10;&#10;public void tearDown() throws Exception { &#10;super.tearDown(); &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;&#10;public static Test suite() { &#10;return new TestSuite(${testClass}.class); &#10;} &#10;} &#10;#end" />
<entry key="JUnit 4" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package $entry.packageName; &#10;&#10;import org.junit.Test; &#10;import org.junit.Before; &#10;import org.junit.After; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author &lt;Authors name&gt; &#10;* @since &lt;pre&gt;$date&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass { &#10;&#10;@Before&#10;public void before() throws Exception { &#10;} &#10;&#10;@After&#10;public void after() throws Exception { &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;} &#10;#end" />
</map>
</option>
</component>
<component name="JUnitProjectSettings">
<option name="TEST_RUNNER" value="UI" />
</component>
<component name="JavadocGenerationManager">
<option name="OPTION_HIERARCHY" value="false" />
<option name="OPTION_NAVIGATOR" value="false" />
<option name="OPTION_INDEX" value="false" />
<option name="OPTION_SEPARATE_INDEX" value="false" />
<option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="false" />
<option name="OPTION_DEPRECATED_LIST" value="false" />
<option name="OPEN_IN_BROWSER" value="false" />
</component>
<component name="JikesSettings">
<option name="DEBUGGING_INFO" value="true" />
<option name="DEPRECATION" value="true" />
<option name="GENERATE_NO_WARNINGS" value="false" />
<option name="GENERATE_MAKE_FILE_DEPENDENCIES" value="false" />
<option name="DO_FULL_DEPENDENCE_CHECK" value="false" />
<option name="IS_INCREMENTAL_MODE" value="false" />
<option name="IS_EMACS_ERRORS_MODE" value="true" />
<option name="ADDITIONAL_OPTIONS_STRING" value="" />
<option name="MAXIMUM_HEAP_SIZE" value="128" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/disaster_warning.iml" filepath="$PROJECT_DIR$/disaster_warning.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="1.8" />
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
<component name="SwUserDefinedSpecifications">
<option name="specTypeByUrl">
<map />
</option>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
<component name="libraryTable">
<library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.oracle:ojdbc8:19.3.0.0.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-codec:commons-codec:1.11">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-logging:commons-logging:1.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: junit:junit:4.13.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.httpcomponents:httpclient:4.5.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.httpcomponents:httpcore:4.4.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.hamcrest:hamcrest-core:1.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
</SOURCES>
</library>
</component>
</project>

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.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true;
java.util.logging.FileHandler.append = true

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cpic.xim</groupId>
<artifactId>disaster_warning</artifactId>
@@ -10,80 +8,35 @@
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath>
<version>19.3.0.0.0</version>
<!-- <scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath> -->
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.4.1</version>
</dependency>
<!-- <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency> -->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</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>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.18.2</version>
<version>2.9.8</version>
</dependency>
<!-- <dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency> -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.2</version>
<version>2.9.8</version>
</dependency>
</dependencies>
<properties>

View File

@@ -1,8 +1,9 @@
/*
* @Author: Kane
* @Date: 2022-04-22 10:53:49
* @LastEditors: Kane
* @LastEditTime: 2022-05-10 16:28:07
* @LastEditTime: 2022-06-07 13:16:35
* @FilePath: \DisasterWarning\src\main\java\AppMain.java
* @Description: 和风天气预警推送厦门太保公众号主程序!
*
@@ -11,6 +12,7 @@
import com.cpic.xim.config.AppConfigManager;
import com.cpic.xim.config.City;
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.wechat.officalAccount.sendMessage;
import com.cpic.xim.config.WeatherDisasterNotifyConfig;
@@ -20,43 +22,34 @@ import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.*;
public class AppMain
{
public class AppMain {
// 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;
WeatherDisasterNotifyConfig config = null;
QWeatherDisasterWarning warning = null;
Logger logger = null;
// 配置logger
try
{
try {
setRootLogger();
logger = Logger.getLogger( "com.cpicxim" );
}
catch ( IOException error )
{
System.out.println( "配置logger失败原因" + error.getMessage() );
logger = Logger.getLogger("com.cpicxim");
} catch (IOException error) {
System.out.println("配置logger失败原因" + error.getMessage());
return;
}
// 读取配置
try
{
try {
config = AppConfigManager.getConfig();
}
catch ( IOException error )
{
System.out.println( "读取配置文件失败!" );
System.out.println( error.getMessage() );
} catch (IOException error) {
System.out.println("读取配置文件失败!");
System.out.println(error.getMessage());
logger.log( Level.SEVERE, "读取配置文件失败:{0}", error.getMessage() );
logger.log(Level.SEVERE, "读取配置文件失败:{0}", error.getMessage());
return;
}
@@ -66,73 +59,68 @@ public class AppMain
String userKey = config.getKey();
// 遍历所有城市,查询是否有警报,有则推送。
while (true)
{
for ( City city : cities )
{
try
{
json = WeatherDisasterWarningGrabber.getWeatherDisasterWarningJSON( queryURL,
userKey, city.getCityCode() );
warning = WeatherDisasterWarningGrabber.convertWeatherDisasterWarning( json );
while (true) {
for (City city : cities) {
try {
json = WeatherDisasterWarningGrabber.getWeatherDisasterWarningJSON(queryURL,
userKey, city.getCityCode());
warning = WeatherDisasterWarningGrabber.convertWeatherDisasterWarning(json);
logger.log( Level.INFO, "查询{0}天气预警,结果:{1}。", new Object[]
{ city.getCityName(), json} );
logger.log(Level.INFO, "查询{0}天气预警,结果:{1}。", new Object[] { city.getCityName(), json });
// 判断是否有警报
if ( warning.getWarning().isEmpty() == true)
{
logger.log( Level.INFO, "查询{0}天气预警,无警报!。", new Object[]
{ city.getCityName()} );
Vector<QWeatherDisasterWarningItem> warningItems = warning.getWarning();
// 判断是否有警报,没有警报就结束当前城市的处理
if (warningItems.isEmpty() == true) {
logger.log(Level.INFO, "查询{0}天气预警,无警报!。", new Object[] { city.getCityName() });
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(),
warning );
continue;
}
logger.log( Level.INFO, "{0}天气预警,日志发送成功。", new Object[]
{ city.getCityName()} );
// 没有发送过
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() );
sendMessage.sendWeatherDisasterWarning(config.getWechatOfficalAccountURL(),
item);
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()} );
logger.log(Level.INFO, "{0}天气预警,日志发送成功", new Object[] { city.getCityName() });
}
catch ( Exception error )
{
logger.log( Level.SEVERE, "查询 {0} 出现未知错误:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
// 将发送的警报,保存起来
sendMessage.saveWeatherDisasterWarning(city.getCityName(), item);
}
} 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() });
} 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
{
logger.log( Level.INFO, "查询结束,休眠{0}分钟。", config.getQueryInterval() );
Thread.sleep( config.getQueryInterval() * 1000 * 60 );
}
catch ( InterruptedException error )
{
logger.log( Level.SEVERE, "线程休眠异常,错误信息:{0}", new Object[]
{ error.getMessage()} );
try {
logger.log(Level.INFO, "查询结束,休眠{0}分钟。", config.getQueryInterval());
Thread.sleep(config.getQueryInterval() * 1000 * 60);
} catch (InterruptedException error) {
logger.log(Level.SEVERE, "线程休眠异常,错误信息:{0}", new Object[] { error.getMessage() });
}
}
}
@@ -140,17 +128,16 @@ public class AppMain
/**
* 设置JUL的logger。
*/
private static void setRootLogger() throws IOException
{
private static void setRootLogger() throws IOException {
LogManager logManager = LogManager.getLogManager();
// 使用外部的配置文件。
FileInputStream configFile = new FileInputStream( "./logging.properties" );
FileInputStream configFile = new FileInputStream("./logging.properties");
// 使用jar中的配置文件。
// InputStream configFile =
// 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;
@JsonProperty( "updateTime")
@JsonFormat( pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
@JsonFormat( pattern = "yyyy-MM-dd'T'HH:mmXXX")
private Date updateTime;
@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.JsonIgnore;
public class QWeatherDisasterWarningItem
{
public QWeatherDisasterWarningItem()
{}
public class QWeatherDisasterWarningItem {
public QWeatherDisasterWarningItem() {
}
public QWeatherDisasterWarningItem( String id, String sender, Date pubTime, String title,
String status, String level, String type, String typeName, String text, String related,
String urgency, String certainty)
{
public QWeatherDisasterWarningItem(String id, String sender, Date pubTime, String title, String status,
String level, String severity, String severityColor, String type, String typeName, String text,
String related, String urgency, String certainty) {
this.id = id;
this.sender = sender;
this.pubTime = pubTime;
this.title = title;
this.status = status;
this.level = level;
this.severity = severity;
this.severityColor = severityColor;
this.type = type;
this.typeName = typeName;
this.text = text;
@@ -31,163 +31,233 @@ public class QWeatherDisasterWarningItem
}
@Override
public boolean equals( Object o )
{
if ( this == o)
{
return true;
}
if ( o == null || getClass() != o.getClass())
{
return false;
}
QWeatherDisasterWarningItem that = (QWeatherDisasterWarningItem) o;
return id.equals( that.id ) && Objects.equals( sender, that.sender )
&& Objects.equals( pubTime, that.pubTime ) && Objects.equals( title, that.title )
&& Objects.equals( status, that.status ) && Objects.equals( level, that.level )
&& Objects.equals( type, that.type ) && Objects.equals( typeName, that.typeName )
&& Objects.equals( text, that.text ) && Objects.equals( related, that.related )
&& Objects.equals( urgency, that.urgency )
&& Objects.equals( certainty, that.certainty );
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((certainty == null) ? 0 : certainty.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((pubTime == null) ? 0 : pubTime.hashCode());
result = prime * result + ((related == null) ? 0 : related.hashCode());
result = prime * result + ((sender == null) ? 0 : sender.hashCode());
result = prime * result + ((severity == null) ? 0 : severity.hashCode());
result = prime * result + ((severityColor == null) ? 0 : severityColor.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result + ((text == null) ? 0 : text.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((typeName == null) ? 0 : typeName.hashCode());
result = prime * result + ((urgency == null) ? 0 : urgency.hashCode());
return result;
}
@Override
public int hashCode()
{
return Objects.hash( id, sender, pubTime, title, status, level, type, typeName, text,
related, urgency, certainty );
public boolean equals(Object obj) {
if (this == obj)
return true;
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;
}
public void setId( String id )
{
public void setId(String id) {
this.id = id;
}
public String getSender()
{
public String getSender() {
return sender;
}
public void setSender( String sender )
{
public void setSender(String sender) {
this.sender = sender;
}
public Date getPubTime()
{
public Date getPubTime() {
return pubTime;
}
public void setPubTime( Date pubTime )
{
public void setPubTime(Date pubTime) {
this.pubTime = pubTime;
}
public String getTitle()
{
public String getTitle() {
return title;
}
public void setTitle( String title )
{
public void setTitle(String title) {
this.title = title;
}
public String getStatus()
{
public String getStatus() {
return status;
}
public void setStatus( String status )
{
public void setStatus(String status) {
this.status = status;
}
public String getLevel()
{
public String getLevel() {
return level;
}
public void setLevel( String level )
{
public void setLevel(String 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;
}
public void setType( String type )
{
public void setType(String type) {
this.type = type;
}
public String getTypeName()
{
public String getTypeName() {
return typeName;
}
public void setTypeName( String typeName )
{
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getText()
{
public String getText() {
return text;
}
public void setText( String text )
{
public void setText(String text) {
this.text = text;
}
public String getRelated()
{
public String getRelated() {
return related;
}
public void setRelated( String related )
{
public void setRelated(String related) {
this.related = related;
}
public String getUrgency()
{
public String getUrgency() {
return urgency;
}
public void setUrgency( String urgency )
{
public void setUrgency(String urgency) {
this.urgency = urgency;
}
public String getCertainty()
{
public String getCertainty() {
return certainty;
}
public void setCertainty( String certainty )
{
public void setCertainty(String certainty) {
this.certainty = certainty;
}
private String id;
private String sender;
@JsonProperty( "pubTime")
@JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
@JsonProperty("pubTime")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
private Date pubTime;
private String title;
private String status;
private String level;
private String severity;
private String severityColor;
private String type;
private String typeName;
private String text;

View File

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

View File

@@ -2,7 +2,7 @@
* @Author: Kane
* @Date: 2022-04-22 10:53:49
* @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
* @Description:
*
@@ -75,7 +75,7 @@ public class sendMessageTest
String city = "东山县";
sendMessage.saveWeatherDisasterWarning( city, warning );
// sendMessage.saveWeatherDisasterWarning( city, warning );
}
catch ( Exception error )
{

View File

@@ -8,6 +8,14 @@
{
"city_name": "厦门",
"city_code": "101230201"
},
{
"city_name": "同安",
"city_code": "101230202"
},
{
"city_name": "翔安",
"city_code": "101230207"
}
],
"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"] },
"testURL": "https://devapi.qweather.com/v7/warning/now?key=fe9fa8eeeb6f4301a92541eed565dd15&location=101230608"
"testURL": "https://devapi.qweather.com/v7/warning/now?key=fe9fa8eeeb6f4301a92541eed565dd15&location=101230201"
}