Browse Source

错误文件夹

zhangzhanping 6 years ago
commit
d7764470e8
54 changed files with 2907 additions and 0 deletions
  1. 1 0
      .idea/.name
  2. 13 0
      .idea/compiler.xml
  3. 7 0
      .idea/encodings.xml
  4. 37 0
      .idea/inspectionProfiles/Project_Default.xml
  5. 17 0
      .idea/misc.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 6 0
      .idea/vcs.xml
  8. 85 0
      logs/2019-03-18/sys-2019-03-18.0.log
  9. 80 0
      logs/sys.log
  10. 155 0
      pom.xml
  11. 35 0
      src/main/java/com/zskk/dicom/UploaderZskkApplication.java
  12. 28 0
      src/main/java/com/zskk/dicom/config/NetCodeConfig.java
  13. 19 0
      src/main/java/com/zskk/dicom/config/OSSConfig.java
  14. 145 0
      src/main/java/com/zskk/dicom/monitor/config/Configs.java
  15. 12 0
      src/main/java/com/zskk/dicom/monitor/config/Constants.java
  16. 40 0
      src/main/java/com/zskk/dicom/monitor/config/CopyFile.java
  17. 20 0
      src/main/java/com/zskk/dicom/monitor/monitors/FileAction.java
  18. 19 0
      src/main/java/com/zskk/dicom/monitor/monitors/FileActionCallback.java
  19. 87 0
      src/main/java/com/zskk/dicom/monitor/monitors/NowFileChangeProc.java
  20. 93 0
      src/main/java/com/zskk/dicom/monitor/monitors/OldFileChangeProc.java
  21. 153 0
      src/main/java/com/zskk/dicom/monitor/monitors/WatchDir.java
  22. 29 0
      src/main/java/com/zskk/dicom/monitor/report/ErrReporter.java
  23. 66 0
      src/main/java/com/zskk/dicom/monitor/report/ErrReporterSender.java
  24. 19 0
      src/main/java/com/zskk/dicom/monitor/schedules/DirMonitor.java
  25. 23 0
      src/main/java/com/zskk/dicom/monitor/schedules/InitMonitor.java
  26. 20 0
      src/main/java/com/zskk/dicom/monitor/schedules/RetryDirMonitor.java
  27. 104 0
      src/main/java/com/zskk/dicom/monitor/schedules/StatRunner.java
  28. 49 0
      src/main/java/com/zskk/dicom/monitor/uploader/CurrentUploadRunner.java
  29. 102 0
      src/main/java/com/zskk/dicom/monitor/uploader/FileMover.java
  30. 188 0
      src/main/java/com/zskk/dicom/monitor/uploader/FileUploader.java
  31. 173 0
      src/main/java/com/zskk/dicom/monitor/uploader/FileUploader_two.java
  32. 25 0
      src/main/java/com/zskk/dicom/monitor/uploader/HistoryFile2UploadQuenu.java
  33. 31 0
      src/main/java/com/zskk/dicom/monitor/uploader/HistoryFile3UploadQuenu.java
  34. 51 0
      src/main/java/com/zskk/dicom/monitor/uploader/OldUploadRunner.java
  35. 46 0
      src/main/java/com/zskk/dicom/monitor/uploader/RetryUploadRunner.java
  36. 61 0
      src/main/java/com/zskk/dicom/monitor/uploader/SuccessUploadQuenu.java
  37. 47 0
      src/main/java/com/zskk/dicom/monitor/uploader/UploadsQueue.java
  38. 25 0
      src/main/java/com/zskk/dicom/monitor/utils/ExceptionUtil.java
  39. 140 0
      src/main/java/com/zskk/dicom/monitor/utils/FileHashUtil.java
  40. 167 0
      src/main/java/com/zskk/dicom/monitor/utils/LogEnginer.java
  41. 47 0
      src/main/java/com/zskk/dicom/monitor/utils/MailerUtil.java
  42. 126 0
      src/main/java/com/zskk/dicom/monitor/utils/MonitorFileUtils.java
  43. 8 0
      src/main/java/com/zskk/dicom/oss/BaseOSSHleper.java
  44. BIN
      src/main/java/com/zskk/dicom/oss/OSSFileAndCallbackHleper.java
  45. 21 0
      src/main/java/com/zskk/dicom/request/bean/ALiYunOSSCallbackBodyBean.java
  46. 60 0
      src/main/java/com/zskk/dicom/response/BaseResponse.java
  47. 10 0
      src/main/java/com/zskk/dicom/response/FileUploadChcekResponse.java
  48. 31 0
      src/main/java/com/zskk/dicom/response/ZskkResponseFactory.java
  49. 5 0
      src/main/java/com/zskk/dicom/response/bean/BaseResponseBean.java
  50. 12 0
      src/main/java/com/zskk/dicom/response/bean/FileUploadChcekResponseBean.java
  51. 21 0
      src/main/java/com/zskk/dicom/response/bean/FileUploadResponseBean.java
  52. 4 0
      src/main/resources/application.properties
  53. 18 0
      src/main/resources/project.properties
  54. 2 0
      uploader_zskk.iml

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+uploader_zskk

+ 13 - 0
.idea/compiler.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <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="uploader_zskk" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>

+ 7 - 0
.idea/encodings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
+    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>

+ 37 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,37 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="date" />
+    </inspection_tool>
+    <inspection_tool class="MavenModelInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+  </profile>
+</component>

+ 17 - 0
.idea/misc.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <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>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 85 - 0
logs/2019-03-18/sys-2019-03-18.0.log

@@ -0,0 +1,85 @@
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+

+ 80 - 0
logs/sys.log

@@ -0,0 +1,80 @@
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+
+Dicom dir monitor...
+--------------------------------------------------
+Monitoring directory:D:\zskk\zskk_system
+--------------------------------------------------
+

+ 155 - 0
pom.xml

@@ -0,0 +1,155 @@
+<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>dicom_monitor</groupId>
+    <artifactId>dicom_monitor</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+    <repositories>
+        <repository>
+            <id>org.dcm4che</id>
+            <name>dcm4che DICOM toolkit and utilities</name>
+            <url>http://github.com/dcm4che/dcm4che</url>
+        </repository>
+    </repositories>
+    <build>
+        <finalName>zskk-dicom-monitor</finalName>
+        <defaultGoal>compile</defaultGoal>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                    <mainClass>${start-class}</mainClass>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>springloaded</artifactId>
+                        <version>1.2.8.RELEASE</version>
+                    </dependency>
+                </dependencies>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.7.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.2-beta-5</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>com.dandian.platform.web.engines.WebStarts</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>assemble-all</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-email</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <version>2.0.4.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <version>2.0.4.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>2.0.4.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure-processor</artifactId>
+            <version>2.0.4.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot</artifactId>
+            <version>2.0.4.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.8.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.51</version>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 35 - 0
src/main/java/com/zskk/dicom/UploaderZskkApplication.java

@@ -0,0 +1,35 @@
+package com.zskk.dicom;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.schedules.InitMonitor;
+import com.zskk.dicom.monitor.schedules.StatRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+@SpringBootApplication(scanBasePackages = "com.zskk.dicom")
+@EnableScheduling
+@Configuration
+@CacheEvict(allEntries = true)
+public class UploaderZskkApplication {
+
+    public UploaderZskkApplication() {
+        Configs.sysLog.info("new WebStarts()...");
+    }
+
+    public static void main(String args[]) {
+        SpringApplication springApplication = new SpringApplication(UploaderZskkApplication.class);
+        // 初始化配置信息
+        Configs.initConfig();
+        StringBuilder sb = new StringBuilder();
+        sb.append("Dicom dir monitor...\n");
+        sb.append("--------------------------------------------------\n");
+        sb.append("Monitoring directory:" + Configs.monitorDir + "\n");
+        sb.append("--------------------------------------------------\n");
+        Configs.sysLog.info(sb.toString());
+        springApplication.run(args);
+        InitMonitor.start();
+        StatRunner.start();
+    }
+}

+ 28 - 0
src/main/java/com/zskk/dicom/config/NetCodeConfig.java

@@ -0,0 +1,28 @@
+package com.zskk.dicom.config;
+
+import com.zskk.dicom.response.BaseResponse;
+import com.zskk.dicom.response.ZskkResponseFactory;
+
+public class NetCodeConfig {
+	public static String SUCCESS = "0";
+	private static String FILE_PATH_IS_NULL_CODE = "1001";
+	private static String FILE_PATH_IS_NULL_MSG = "文件路径为空";
+	private static String FILE_IS_NOT_FOUND_CODE = "1002";
+	private static String FILE_IS_NOT_FOUND_MSG = "文件路径未找到";
+	private static String FILE_IS_NOT_FILE_CODE = "1003";
+	private static String FILE_IS_NOT_FILE_MSG = "传入的路径不是文件路径";
+	private static String FILE_RUNTIME_CODE = "2001";
+	private static String FILE_RUNTIME_MSG = "文件读取runtime异常具体信息请查看Exception信息";
+	private static String FILE_ALIOSS_UPLOAD_CODE = "2002";
+	private static String FILE_ALIOSS_UPLOAD_MSG = "阿里云文件上传出错";
+	private static String FILE_ALIOSS_FILE_ALREADY_CODE = "2003";
+	private static String FILE_ALIOSS_FILE_ALREADY_MSG = "阿里云文件已存在";
+
+	
+	public static BaseResponse FILE_PATH_IS_NULL = ZskkResponseFactory.getInstance().generate(FILE_PATH_IS_NULL_CODE, FILE_PATH_IS_NULL_MSG);
+	public static BaseResponse FILE_IS_NOT_FOUND = ZskkResponseFactory.getInstance().generate(FILE_IS_NOT_FOUND_CODE, FILE_IS_NOT_FOUND_MSG);
+	public static BaseResponse FILE_IS_NOT_FILE = ZskkResponseFactory.getInstance().generate(FILE_IS_NOT_FILE_CODE, FILE_IS_NOT_FILE_MSG);
+	public static BaseResponse FILE_RUNTIME = ZskkResponseFactory.getInstance().generate(FILE_RUNTIME_CODE, FILE_RUNTIME_MSG);
+	public static BaseResponse FILE_ALIOSS_FILE_ALREADY = ZskkResponseFactory.getInstance().generate(FILE_ALIOSS_FILE_ALREADY_CODE, FILE_ALIOSS_FILE_ALREADY_MSG);
+	public static BaseResponse FILE_ALIOSS_UPLOAD = ZskkResponseFactory.getInstance().generate(FILE_ALIOSS_UPLOAD_CODE, FILE_ALIOSS_UPLOAD_MSG);
+}

+ 19 - 0
src/main/java/com/zskk/dicom/config/OSSConfig.java

@@ -0,0 +1,19 @@
+package com.zskk.dicom.config;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+public class OSSConfig {
+//	public static String HOSPITAL_ID = "1234234";
+//	public static String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
+	// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+	public static final String ACCESS_KEY_ID = "LTAImzRGKfWaL7Vi";
+	public static final String ACCESS_KEY_SECRET = "GjWdd2cdHtbQkhhnhSxNbw0QChKD98";
+//	public static String BUCKET_NAME = "zskk";
+	public static final String ALIYUN_OSS_CALLBACK_URL = "http://api.aliyuoss.callback.pacsonline.cn/oss_callback";
+	public static final String BASE_ALIYUN_OSS_URL = ".oss-cn-beijing.aliyuncs.com/";
+
+	public static String generateBodyStr(String fileName , long size) {
+		String url = Configs.ossScheme + "://" + Configs.ossBucketName + BASE_ALIYUN_OSS_URL + fileName;
+		return "{\\\"hospital_id\\\":\\\"" + Configs.hospitalId +"\\\",\\\"region\\\":\\\"" + Configs.ossRegion + "\\\",\\\"md5\\\":\\\"" + fileName + "\\\",\\\"url\\\":\\\"" + url + "\\\",\\\"size\\\":" + size + "}";
+	}
+}

+ 145 - 0
src/main/java/com/zskk/dicom/monitor/config/Configs.java

@@ -0,0 +1,145 @@
+package com.zskk.dicom.monitor.config;
+
+import com.zskk.dicom.monitor.utils.LogEnginer;
+
+import java.io.File;
+import java.util.ResourceBundle;
+
+public class Configs {
+    /**
+     * 医院编号
+     */
+    public static String hospitalId = "11000001";
+
+    /**
+     * 监控的文件夹
+     */
+    public static String monitorDir = "d:\\test";
+    /**
+     * 监控的重试文件夹
+     */
+    public static String monitorRetryDir = "d:\\monitorRetry";
+    /**
+     * 重试失败文件夹
+     */
+    public static String eorrRetryDir = "d:\\eorrRetryDir";
+    /**
+     * 监控的备份文件夹(上传文件后,将文件转存出来)
+     */
+    public static String monitorBackDir = "d:\\test_back";
+
+    /**
+     * 上传的IP
+     */
+    public static String postHost = "127.0.0.1";
+
+    /**
+     * 上传的端口
+     */
+    public static Integer postPort = 1008;
+
+    /**
+     * 上传的URI
+     */
+    public static String postUri = "/upload";
+
+    /**
+     * 异常上报的邮件标题
+     */
+    public static String errReportTitle = "异常信息";
+
+    /**
+     * 异常上报的时间间隔(秒)
+     */
+    public static Long errReportTimeInterval = 60L;
+
+    /**
+     * 异常上报的接收邮箱<br />
+     * 多个邮箱接收,使用“;”号分隔
+     */
+    public static String errReportToEmail = null;
+
+    /**
+     * 邮件发送邮箱
+     */
+    public static String errReportFromEmail = null;
+
+    /**
+     * 邮件发送邮箱的host信息
+     */
+    public static String errReportFromEmailHost = null;
+
+    /**
+     * 邮件发送邮箱的密码
+     */
+    public static String errReportFromEmailPwd = null;
+
+    /**
+     * 系统日志(包含系统、异常、业务处理等)
+     */
+    public static LogEnginer sysLog = new LogEnginer("sys");
+    /**
+     * 阿里云OSS region
+     */
+    public static String ossRegion = "oss-cn-beijing";
+    /**
+     * 阿里云OSS endpoint
+     */
+    public static String ossEndpoint = "oss-cn-beijing.aliyuncs.com";
+    /**
+     * 阿里云OSS bucket   zskk
+     */
+    public static String ossBucketName = "zhangzhanping";
+    /**
+     * 阿里云OSS 访问协议默认http
+     */
+    public static String ossScheme = "http";
+    /**
+     * 阿里云OSS 回调url
+     */
+    //public static String ossCallbackUrl = "http://api.test.aliyuoss.callback.pacsonline.cn/oss_callback";
+    public static String ossCallbackUrl = "http://api.test.aliyuoss.callback.pacsonline.cn/oss_callback";
+
+    /**
+     * 初始化配置信息
+     */
+    public static void initConfig() {
+        ResourceBundle rb = ResourceBundle.getBundle("project");
+        hospitalId = rb.getString("monitor.hospitalId");
+        monitorDir = rb.getString("monitor.monitorDir");
+
+        if (monitorDir.endsWith(File.separator)) {
+            // 去掉路径最后一个路径分隔符
+            monitorDir = monitorDir.substring(0, monitorDir.lastIndexOf(File.separator));
+        }
+        monitorRetryDir = rb.getString("monitor.monitorRetryDir");
+        if (monitorRetryDir.endsWith(File.separator)) {
+            // 去掉路径最后一个路径分隔符
+            monitorRetryDir = monitorRetryDir.substring(0, monitorRetryDir.lastIndexOf(File.separator));
+        }
+        eorrRetryDir = rb.getString("monitor.eorrRetryDir");
+        if (eorrRetryDir.endsWith(File.separator)) {
+            // 去掉路径最后一个路径分隔符
+            eorrRetryDir = eorrRetryDir.substring(0, eorrRetryDir.lastIndexOf(File.separator));
+        }
+        monitorBackDir = monitorDir + "_back";
+        monitorRetryDir=monitorDir+"_Retry";
+        eorrRetryDir=monitorDir+"_Eorr";
+        postHost = rb.getString("monitor.postHost");
+        postUri = rb.getString("monitor.postUri");
+        postPort = Integer.parseInt(rb.getString("monitor.postPort"));
+        postUri = rb.getString("monitor.postUri");
+        errReportTitle = rb.getString("monitor.errReportTitle");
+        errReportTimeInterval = Long.parseLong(rb.getString("monitor.errReportTimeInterval"));
+        errReportToEmail = rb.getString("monitor.errReportToEmail");
+        errReportFromEmail = rb.getString("monitor.errReportFromEmail");
+        errReportFromEmailHost = rb.getString("monitor.errReportFromEmailHost");
+        errReportFromEmailPwd = rb.getString("monitor.errReportFromEmailPwd");
+
+        ossRegion = rb.getString("monitor.oss.region");
+        ossEndpoint = rb.getString("monitor.oss.endpoint");
+        ossBucketName = rb.getString("monitor.oss.bucket");
+        ossScheme = rb.getString("monitor.oss.scheme");
+        ossCallbackUrl = rb.getString("monitor.oss.callback_url");
+    }
+}

+ 12 - 0
src/main/java/com/zskk/dicom/monitor/config/Constants.java

@@ -0,0 +1,12 @@
+package com.zskk.dicom.monitor.config;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class Constants {
+
+	/**
+	 * 最后一次异常上报时间
+	 */
+	public static AtomicLong lastErrReportTime = new AtomicLong(0);
+
+}

+ 40 - 0
src/main/java/com/zskk/dicom/monitor/config/CopyFile.java

@@ -0,0 +1,40 @@
+package com.zskk.dicom.monitor.config;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+public class CopyFile {
+
+    public static void main(String[] args) throws Exception {
+        File file = new File("D:\\zskk\\zskk_system\\111.txt");
+        File file1 = new File("D:\\zskk\\zskk_system_back\\111.txt");
+     //   long l = copyFile(file, file1);
+        file.delete();
+
+    }
+        public static void copyFile(File f1, File f2)throws Exception{
+         //   long time=new Date().getTime();
+            int length=2097152;
+            FileInputStream in=new FileInputStream(f1);
+            FileOutputStream out=new FileOutputStream(f2);
+            byte[] buffer=new byte[length];
+           /* FileChannel inC=in.getChannel();
+            FileChannel outC=out.getChannel();*/
+            int i=0;
+            while(true) {
+                int ins = in.read(buffer);
+                if (ins == -1) {
+                    out.flush();
+                    out.close();
+                    in.close();
+
+                    f1.delete();
+                    Configs.sysLog.info("复制成功");
+                }else{
+                    out.write(buffer,0,ins);
+                }
+            }
+    }
+
+}

+ 20 - 0
src/main/java/com/zskk/dicom/monitor/monitors/FileAction.java

@@ -0,0 +1,20 @@
+package com.zskk.dicom.monitor.monitors;
+
+/**
+ * 文件变动行为枚举
+ * 
+ * @author Goofy <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>
+ * @Date 2015年7月3日 上午10:40:04
+ */
+public enum FileAction {
+	DELETE("ENTRY_DELETE"), CREATE("ENTRY_CREATE"), MODIFY("ENTRY_MODIFY");
+	private String value;
+
+	FileAction(String value) {
+		this.value = value;
+	}
+
+	public String getValue() {
+		return value;
+	}
+}

+ 19 - 0
src/main/java/com/zskk/dicom/monitor/monitors/FileActionCallback.java

@@ -0,0 +1,19 @@
+package com.zskk.dicom.monitor.monitors;
+
+import java.io.File;
+
+/**
+ * 文件操作的回调方法
+ */
+public abstract class FileActionCallback {
+
+	public void delete(File file) {
+	};
+
+	public void modify(File file) {
+	};
+
+	public void create(File file) {
+	};
+
+}

+ 87 - 0
src/main/java/com/zskk/dicom/monitor/monitors/NowFileChangeProc.java

@@ -0,0 +1,87 @@
+package com.zskk.dicom.monitor.monitors;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.uploader.UploadsQueue;
+
+import java.io.File;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class NowFileChangeProc {
+
+    public void startMonitor(String dir) {
+
+        if (dir == null) {
+            String msg = "error, the monitor dir con't is null!";
+            ErrReporter.report(msg);
+            return;
+        }
+
+        final File file = new File(dir);
+
+        new Thread(new Runnable() {
+
+            public void run() {
+                try {
+                    new WatchDir(file, true, new FileActionCallback() {
+                        @Override
+                        public void create(File file) {
+                            if (file.isDirectory()) {
+                                // 创建文件夹不处理
+                                return;
+                            }
+                            String msg = "File create \t" + file.getAbsolutePath();
+//							if(file.renameTo(file)) {
+//								msg += "\r\n add to queue";
+                            String absolutePath = file.getAbsolutePath();
+                            if(absolutePath.endsWith("txt")) {
+                                Timer timer = new Timer();
+                                timer.schedule(new TimerTask() {
+
+                                    @Override
+                                    public void run() {
+                                        // TODO Auto-generated method stub
+                                        UploadsQueue.addCurrent(new File(absolutePath));
+                                    }
+                                }, 1000);
+                            }
+                            Configs.sysLog.info(msg+"---------监听新文件夹创建");
+                        }
+
+                        @Override
+                        public void delete(File file) {
+                            String msg = "File delete \t" + file.getAbsolutePath();
+                            Configs.sysLog.info(msg);
+                        }
+
+                        @Override
+                        public void modify(File file) {
+                            String msg = "File update \t" + file.getAbsolutePath();
+                            String absolutePath = file.getAbsolutePath();
+                            if(absolutePath.endsWith("txt")) {
+                                Timer timer = new Timer();
+                                timer.schedule(new TimerTask() {
+
+                                    @Override
+                                    public void run() {
+                                        // TODO Auto-generated method stub
+                                        UploadsQueue.addCurrent(new File(absolutePath));
+                                    }
+                                }, 1000);
+                            }
+                            Configs.sysLog.info(msg+"---------监听新文件夹移动");
+                        }
+                    });
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+        Configs.sysLog.info("--------------------------------------------------\nMonitoring:" + file.getAbsolutePath() + "\t >>> ");
+    }
+
+    public static void main(String[] args) throws Exception {
+        new NowFileChangeProc().startMonitor("D:\\upload");
+    }
+}

+ 93 - 0
src/main/java/com/zskk/dicom/monitor/monitors/OldFileChangeProc.java

@@ -0,0 +1,93 @@
+package com.zskk.dicom.monitor.monitors;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.uploader.FileUploader;
+
+import java.io.File;
+import java.util.Timer;
+import java.util.TimerTask;
+/**
+ *
+ * 功能描述: 监测重试文件
+ *
+ * @param:
+ * @return:
+ * @auther: zzp
+ * @date:
+ */
+public class OldFileChangeProc{
+    public void startMonitor(String dir) {
+
+        if (dir == null) {
+            String msg = "error, the monitor dir con't is null!";
+            ErrReporter.report(msg);
+            return;
+        }
+
+        final File file = new File(dir);
+
+        new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                try {
+                    new WatchDir(file, true, new FileActionCallback() {
+                        @Override
+                        public void create(File file) {
+                            if (file.isDirectory()) {
+                                // 创建文件夹不处理
+                                return;
+                            }
+                            String msg = "File create \t" + file.getAbsolutePath();
+//							if(file.renameTo(file)) {
+//								msg += "\r\n add to queue";
+                            String absolutePath = file.getAbsolutePath();
+                            //dcm 后缀
+                            if(absolutePath.endsWith("txt")) {
+                                //定时器
+                                Timer timer = new Timer();
+                                timer.schedule(new TimerTask() {
+
+                                    @Override
+                                    public void run() {
+                                        // TODO Auto-generated method stub
+                                        FileUploader.add(new File(absolutePath));
+                                    }
+                                }, 1000);
+                            }
+                            Configs.sysLog.info(msg+"---------监听重试文件夹创建");
+                        }
+
+                        @Override
+                        public void delete(File file) {
+                            String msg = "File delete \t" + file.getAbsolutePath();
+                            Configs.sysLog.info(msg);
+                        }
+
+                        @Override
+                        public void modify(File file) {
+                            String msg = "File update \t" + file.getAbsolutePath();
+                            String absolutePath = file.getAbsolutePath();
+                            if(absolutePath.endsWith("txt")) {
+                                Timer timer = new Timer();
+                                timer.schedule(new TimerTask() {
+
+                                    @Override
+                                    public void run() {
+                                        // TODO Auto-generated method stub
+                                        FileUploader.add(new File(absolutePath));
+                                    }
+                                }, 1000);
+                            }
+                            Configs.sysLog.info(msg+"---------监听重试文件夹移动");
+                        }
+                    });
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+        Configs.sysLog.info("--------------------------------------------------\nMonitoring:" + file.getAbsolutePath() + "\t >>> ");
+    }
+}

+ 153 - 0
src/main/java/com/zskk/dicom/monitor/monitors/WatchDir.java

@@ -0,0 +1,153 @@
+package com.zskk.dicom.monitor.monitors;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.WatchEvent.Kind;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
+
+/**
+ * 文件夹监控
+ *
+ */
+public class WatchDir {
+
+	private final WatchService watcher;
+	private final Map<WatchKey, Path> keys;
+	private final boolean subDir;
+
+	/**
+	 * 构造方法
+	 * 
+	 * @param file
+	 *            文件目录,不可以是文件
+	 * @param subDir
+	 * @throws Exception
+	 */
+	public WatchDir(File file, boolean subDir, FileActionCallback callback) throws Exception {
+		if (!file.isDirectory()) {
+			Exception newExce = new Exception(file.getAbsolutePath() + "is not a directory!");
+			Configs.sysLog.info(ExceptionUtil.getExceptionTxt(newExce));
+			throw newExce;
+		}
+
+		this.watcher = FileSystems.getDefault().newWatchService();
+		this.keys = new HashMap<WatchKey, Path>();
+		this.subDir = subDir;
+
+		Path dir = Paths.get(file.getAbsolutePath());
+
+		if (subDir) {
+			registerAll(dir);
+		} else {
+			register(dir);
+		}
+		processEvents(callback);
+	}
+
+	@SuppressWarnings("unchecked")
+	static <T> WatchEvent<T> cast(WatchEvent<?> event) {
+		return (WatchEvent<T>) event;
+	}
+
+	/**
+	 * 观察指定的目录
+	 * 
+	 * @param dir
+	 * @throws IOException
+	 */
+	private void register(Path dir) throws IOException {
+		WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
+		keys.put(key, dir);
+	}
+
+	/**
+	 * 观察指定的目录,并且包括子目录
+	 */
+	private void registerAll(final Path start) throws IOException {
+		Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
+			@Override
+			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+				register(dir);
+				return FileVisitResult.CONTINUE;
+			}
+		});
+	}
+
+	/**
+	 * 发生文件变化的回调函数
+	 */
+	@SuppressWarnings("rawtypes")
+	void processEvents(FileActionCallback callback) {
+		for (;;) {
+			WatchKey key;
+			try {
+				key = watcher.take();
+			} catch (InterruptedException x) {
+				return;
+			}
+			Path dir = keys.get(key);
+			if (dir == null) {
+				// 操作未识别
+				continue;
+			}
+
+			for (WatchEvent<?> event : key.pollEvents()) {
+				Kind kind = event.kind();
+
+				// 事件可能丢失或遗弃
+				if (kind == StandardWatchEventKinds.OVERFLOW) {
+					continue;
+				}
+
+				// 目录内的变化可能是文件或者目录
+				WatchEvent<Path> ev = cast(event);
+				Path name = ev.context();
+				Path child = dir.resolve(name);
+				File file = child.toFile();
+				if (kind.name().equals(FileAction.DELETE.getValue())) {
+					callback.delete(file);
+				} else if (kind.name().equals(FileAction.CREATE.getValue())) {
+					callback.create(file);
+				} else if (kind.name().equals(FileAction.MODIFY.getValue())) {
+					callback.modify(file);
+				} else {
+					continue;
+				}
+
+				// if directory is created, and watching recursively, then
+				// register it and its sub-directories
+				if (subDir && (kind == StandardWatchEventKinds.ENTRY_CREATE)) {
+					try {
+						if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
+							registerAll(child);
+						}
+					} catch (IOException x) {
+						// ignore to keep sample readbale
+					}
+				}
+			}
+
+			boolean valid = key.reset();
+			if (!valid) {
+				// 移除不可访问的目录
+				// 因为有可能目录被移除,就会无法访问
+				keys.remove(key);
+				// 如果待监控的目录都不存在了,就中断执行
+				if (keys.isEmpty()) {
+					String msg = "WatchDir break because keys isEmpty";
+					Configs.sysLog.info(msg);
+					break;
+				}
+			}
+		}
+	}
+
+}

+ 29 - 0
src/main/java/com/zskk/dicom/monitor/report/ErrReporter.java

@@ -0,0 +1,29 @@
+package com.zskk.dicom.monitor.report;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ErrReporter {
+
+	/**
+	 * 准备上报的异常队列<br />
+	 * 异常将只存储最近的3种错误或异常
+	 */
+	protected static List<String> errReportsQueue = Collections.synchronizedList(new ArrayList<String>());
+
+	private static ExecutorService pools = Executors.newFixedThreadPool(2);
+
+	/**
+	 * 将错误上报
+	 * 
+	 * @param errMsg
+	 */
+	public static void report(String errMsg) {
+		// 异步线程发送异常
+		pools.execute(new ErrReporterSender(errMsg));
+	}
+
+}

+ 66 - 0
src/main/java/com/zskk/dicom/monitor/report/ErrReporterSender.java

@@ -0,0 +1,66 @@
+package com.zskk.dicom.monitor.report;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.config.Constants;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MailerUtil;
+import org.apache.commons.mail.EmailException;
+
+public class ErrReporterSender implements Runnable {
+
+	/**
+	 * 准备上报的异常信息
+	 */
+	private String errMsg;
+
+	public ErrReporterSender(String errMsg) {
+		this.errMsg = errMsg;
+		Configs.sysLog.info("error:\n" + errMsg);
+	}
+
+	@Override
+	public void run() {
+		Long curTime = System.currentTimeMillis();
+		if ((curTime - Constants.lastErrReportTime.get()) / 1000 < Configs.errReportTimeInterval) {
+			// 异常发送间隔太短
+			// 暂时放入队列
+			if (!ErrReporter.errReportsQueue.contains(errMsg)) {
+				ErrReporter.errReportsQueue.add(errMsg);
+			}
+			return;
+		} else {
+			ErrReporter.errReportsQueue.add(errMsg);
+		}
+
+		if (ErrReporter.errReportsQueue.isEmpty()) {
+			return;
+		}
+		// 保存异常同步的时间
+		Constants.lastErrReportTime.set(System.currentTimeMillis());
+		// 准备发送邮件
+		StringBuilder sb = new StringBuilder();
+		for (String msg : ErrReporter.errReportsQueue) {
+			sb.append(msg).append("\r\n<br />");
+		}
+		// 清除队列
+		ErrReporter.errReportsQueue.clear();
+		try {
+			String to = Configs.errReportToEmail;
+			String cc = null;
+			if (to.contains(";")) {
+				// 将to中的多个邮箱,放到cc中
+				if (cc == null) {
+					cc = to.substring(to.indexOf(";") + 1);
+				}
+				to = to.substring(0, to.indexOf(";"));
+			}
+			// 开始邮件发送异常信息
+			MailerUtil.SendMail(Configs.errReportFromEmailHost, Configs.errReportFromEmail, Configs.errReportFromEmail, Configs.errReportFromEmailPwd, to, cc, "utf8", Configs.hospitalId + "--" + Configs.errReportTitle, sb.toString(), null);
+		} catch (EmailException e) {
+			e.printStackTrace();
+			Configs.sysLog.info(ExceptionUtil.getExceptionTxt(e));
+		}
+		sb = null;
+	}
+
+}

+ 19 - 0
src/main/java/com/zskk/dicom/monitor/schedules/DirMonitor.java

@@ -0,0 +1,19 @@
+package com.zskk.dicom.monitor.schedules;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.monitors.NowFileChangeProc;
+/**
+ *
+ * 功能描述: 监测新文件
+ *
+ * @param:
+ * @return: 
+ * @auther: zzp
+ * @date:
+ */
+public class DirMonitor implements Runnable{
+    @Override
+    public void run() {
+        new NowFileChangeProc().startMonitor(Configs.monitorDir);
+    }
+}

+ 23 - 0
src/main/java/com/zskk/dicom/monitor/schedules/InitMonitor.java

@@ -0,0 +1,23 @@
+package com.zskk.dicom.monitor.schedules;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+import java.io.File;
+
+public class InitMonitor {
+    /**
+     * 系统启动时,将目录中的图片进行上传处理
+     */
+    public static void start() {
+        Configs.sysLog.info("Dicom monitor check waiting files ...");
+        //读取监听文件
+        File monitorDir = new File(Configs.monitorDir);
+        //创建备份文件夹
+         MonitorFileUtils.touchBackDir(monitorDir);
+         File monitorRetryDir = new File(Configs.monitorRetryDir);
+         MonitorFileUtils.touchRetryDir(monitorRetryDir);
+         File eorrRetryDir = new File(Configs.eorrRetryDir);
+         MonitorFileUtils.touchEorrDir(eorrRetryDir);
+    }
+}

+ 20 - 0
src/main/java/com/zskk/dicom/monitor/schedules/RetryDirMonitor.java

@@ -0,0 +1,20 @@
+package com.zskk.dicom.monitor.schedules;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.monitors.OldFileChangeProc;
+
+/**
+ *
+ * 功能描述: 重试文件夹监听
+ *
+ * @param:
+ * @return: 
+ * @auther: zzp
+ * @date: 2019/3/18 11:43
+ */
+public class RetryDirMonitor implements Runnable{
+    @Override
+    public void run() {
+        new OldFileChangeProc().startMonitor(Configs.monitorRetryDir);
+    }
+}

+ 104 - 0
src/main/java/com/zskk/dicom/monitor/schedules/StatRunner.java

@@ -0,0 +1,104 @@
+package com.zskk.dicom.monitor.schedules;
+
+import com.zskk.dicom.monitor.uploader.*;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ *
+ * 功能描述:
+ *
+ * @param: dirMonitorPools 监控文件线程池 oldUploadPools 旧文件
+ * @return:
+ * @auther: zzp
+ * @date: 2019/3/10 10:35
+ */
+public class StatRunner {
+
+/*
+    private static  ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("dirMonitorThread-call-runner-%d").build();
+    private static  ExecutorService dirMonitorPools = new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory);
+    private static  ThreadFactory namedThreadFactory1 = new ThreadFactoryBuilder().setNameFormat("oldUploadThread-call-runner-%d").build();
+    private static  ExecutorService oldUploadPools = new ThreadPoolExecutor(1,2,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory1);
+    private static  ThreadFactory namedThreadFactory2 = new ThreadFactoryBuilder().setNameFormat("currentUploadThread-call-runner-%d").build();
+    private static  ExecutorService currentUploadPools = new ThreadPoolExecutor(1,2,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory2);
+    private static  ThreadFactory namedThreadFactory3 = new ThreadFactoryBuilder().setNameFormat("addHistoryFileThread-call-runner-%d").build();
+    private static  ExecutorService addHistoryFile2UploadPools = new ThreadPoolExecutor(1,2,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory3);
+*/
+
+    private static ExecutorService dirMonitorPools = null;
+    private static ExecutorService oldUploadPools = null;
+    //新
+    private static ExecutorService currentUploadPools = null;
+    //历史文件记录
+    private static ExecutorService addHistoryFile2UploadPools = null;
+    //重试历史文件记录
+    private static ExecutorService retryHistoryFile2UploadPools = null;
+    //成功备份移除
+    private static ExecutorService successPools = null;
+    //重试文件夹
+    private static ExecutorService retryDirMonitorPools = null;
+    //重试上传线程
+    private static ExecutorService retryUploadPools = null;
+
+    public static void start() {
+      dirMonitorPools = generateSinglePools(dirMonitorPools);
+        dirMonitorPools.execute(new DirMonitor() );
+  //重试文件监听
+       retryDirMonitorPools = generateSinglePools(retryDirMonitorPools);
+        retryDirMonitorPools.execute(new RetryDirMonitor() );
+//成功备份移除
+        successPools = generatePools(successPools, 2);
+        successPools.execute(new SuccessUploadQuenu());
+//老文件放入老文件集合
+        addHistoryFile2UploadPools = generatePools(addHistoryFile2UploadPools, 2);
+        addHistoryFile2UploadPools.execute(new HistoryFile2UploadQuenu());
+        //重试老文件放入老文件集合
+        retryHistoryFile2UploadPools = generatePools(retryHistoryFile2UploadPools, 2);
+        retryHistoryFile2UploadPools.execute(new HistoryFile2UploadQuenu());
+        try {
+            TimeUnit.SECONDS.sleep(1);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+ //老上传
+        oldUploadPools = generatePools(oldUploadPools, 2);
+        oldUploadPools.execute(new OldUploadRunner());
+//新上传
+        currentUploadPools = generatePools(currentUploadPools, 2);
+        currentUploadPools.execute(new CurrentUploadRunner());
+//重试
+        retryUploadPools = generatePools(retryUploadPools, 2);
+        retryUploadPools.execute(new RetryUploadRunner());
+
+    }
+
+
+
+
+
+
+
+    public static ExecutorService generatePools(ExecutorService oldPool, int length) {
+        if (oldPool != null && !oldPool.isTerminated()) {
+            oldPool.shutdown();
+            while (oldPool.isTerminated()) {
+                try {
+                    oldPool.awaitTermination(200, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if(length == 1) {
+           return Executors.newSingleThreadExecutor();
+        }
+        return Executors.newFixedThreadPool(length);
+    }
+    public static ExecutorService generateSinglePools(ExecutorService oldPool) {
+        return generatePools(oldPool, 1);
+    }
+
+}

+ 49 - 0
src/main/java/com/zskk/dicom/monitor/uploader/CurrentUploadRunner.java

@@ -0,0 +1,49 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+public class CurrentUploadRunner implements  Runnable{
+    public CurrentUploadRunner() {
+    }
+
+    @Override
+    public void run() {
+        while(true) {
+            boolean flag = upload();
+            Configs.sysLog.info("--CurrentFileQueue-- System upload flag:" + flag + "\nUploadsQueue.currentFileQueue.size:" + UploadsQueue.currentFileQueue.size());
+            try {
+                if(flag) {
+                    TimeUnit.MILLISECONDS.sleep(10);
+                } else {
+                    TimeUnit.SECONDS.sleep(1);
+                }
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    public synchronized static boolean upload() {
+        boolean flag = false;
+        try {
+            // 从队列中移除已完成任务
+            if(UploadsQueue.currentFileQueue.size() > 0) {
+                System.out.println("新文件"+UploadsQueue.currentFileQueue.size()+"-----------------------");
+                File file = UploadsQueue.currentFileQueue.remove(0);
+                FileUploader.upload(file);
+                flag = true;
+            }
+        } catch (Throwable e) {
+            ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}

+ 102 - 0
src/main/java/com/zskk/dicom/monitor/uploader/FileMover.java

@@ -0,0 +1,102 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.FileHashUtil;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class FileMover implements Runnable {
+
+	File sourceFile;
+	File targetFile;
+
+	public FileMover(File sourceFile, File targetFile) {
+		this.sourceFile = sourceFile;
+		this.targetFile = targetFile;
+	}
+
+	@SuppressWarnings("static-access")
+	@Override
+	public void run() {
+		try {
+			// 暂停一秒,等待系统处理完文件的占用
+			Thread.currentThread().sleep(100);
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+		String targetFileStr;
+		try {
+			targetFileStr = targetFile.getCanonicalPath();
+			if (targetFile.exists()) {
+				// 如果移动的文件,已经在目标地址存在
+				// 那么,比对Hash值,看是否为同一个文件
+				// 如果是同一个文件,只需要删除当前文件,不必移除
+				// 如果不是同一个文件,另备份目录
+				Configs.sysLog.info("备份目标文件已经存在,需要比对文件Hash值");
+				String tHash = FileHashUtil.getFileMD5(targetFile);
+				String sHash = FileHashUtil.getFileMD5(sourceFile);
+				Configs.sysLog.info(sourceFile.getAbsolutePath() + "[" + sHash + "] ----->>----- " + targetFile.getAbsolutePath() + "[" + tHash + "]");
+				if (tHash.equals(sHash)) {
+					// 2个文件的Hash值相同
+					// 不再移动文件,删除原文件
+					boolean isSucDel = sourceFile.delete();
+					Configs.sysLog.info("删除源文件:" + sourceFile.getAbsolutePath() + "  结果:" + isSucDel);
+					if (!isSucDel) {
+						// 文件没有成功删除
+						ErrReporter.report("文件删除失败:" + sourceFile.getCanonicalPath());
+					}
+				} else {
+					// 2个文件的Hash值不同
+					targetFile = new File(targetFileStr + "2");
+					if (targetFile.exists()) {
+						// 如果备份文件也存在,
+						// 先删除,再将源文件移至此文件
+						targetFile.delete();
+					}
+					// 移动文件到另一个名称下
+					try {
+						FileUtils.moveFile(sourceFile, targetFile);
+						Configs.sysLog.info("文件移动---------:" + sourceFile.getCanonicalPath() + " to:" + targetFileStr + "2    成功");
+					} catch (IOException ioe) {
+						if (ioe instanceof FileNotFoundException) {
+							// 源文件已不存在
+							Configs.sysLog.info("文件移动-------:" + sourceFile.getCanonicalPath() + " to:" + targetFileStr + "2    " + ioe.getMessage());
+						} else {
+							// 文件没有成功删除
+							ErrReporter.report("文件移动失败---------:" + sourceFile.getCanonicalPath() + " to:" + targetFileStr + "2    " + ioe.getMessage());
+						}
+					}
+				}
+			} else {
+				// 上传完成后,移除文件
+				try {
+					FileUtils.moveFile(sourceFile, targetFile);
+					Configs.sysLog.info("文件移动-----------:" + sourceFile.getCanonicalPath() + " to:" + targetFile.getAbsolutePath() + "    成功");
+				} catch (IOException ioe) {
+					if (ioe instanceof FileNotFoundException) {
+						// 源文件已不存在
+						Configs.sysLog.info("文件移动------------:" + sourceFile.getCanonicalPath() + " to:" + targetFile.getAbsolutePath() + "    " + ioe.getMessage());
+					} else {
+						// 文件没有成功删除
+						ErrReporter.report("文件移动失败----------:" + sourceFile.getCanonicalPath() + " to:" + targetFileStr + "    " + ioe.getMessage());
+					}
+				}
+			}
+
+
+		} catch (IOException e) {
+			e.printStackTrace();
+			// 文件没有成功删除
+			ErrReporter.report("文件(" + targetFile.getAbsolutePath() + ")获取getCanonicalPath时遇到错误:" + ExceptionUtil.getExceptionTxt(e));
+		}
+		// 移除空的目录
+		MonitorFileUtils.removeBeforeTodayEmptyDir(sourceFile.getParentFile());
+	}
+
+}

+ 188 - 0
src/main/java/com/zskk/dicom/monitor/uploader/FileUploader.java

@@ -0,0 +1,188 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class FileUploader {
+	/**
+	 * 上传成功的文件队列
+	 */
+	protected static List<File> successFileQueue = Collections.synchronizedList(new ArrayList<File>());
+	/**
+	 * 上传失败的文件队列
+	 */
+	protected static List<File> failFileQueue = Collections.synchronizedList(new ArrayList<File>());
+	private static ExecutorService pools = Executors.newFixedThreadPool(2);
+	public static void add(File file) {
+		if (failFileQueue.contains(file)) {
+			// 文件已经在队列中
+			Configs.sysLog.info(file + ", The file is already in the old queue!");
+		} else {
+			failFileQueue.add(file);
+			Configs.sysLog.info(file + ", The file is added to the old queue!");
+		}
+	}
+
+
+//	private static ExecutorService pools = Executors.newFixedThreadPool(2);
+	File file;
+	public FileUploader(File file) {
+		this.file = file;
+
+	}
+
+	public static void upload(File file) {
+		if(file == null || !file.exists()) {
+			ErrReporter.report("file 为空 或者 file不存在");
+			return;
+		}
+		try {
+			String boundaryKey = UUID.randomUUID().toString().replaceAll("-", "").substring(8, 24);
+			String content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + renameFileName(file.getName()) + "\"; filename=\"" + renameFileName(file.getName()) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n";
+			String postUrl = "http://" + Configs.postHost + ":" + Configs.postPort + Configs.postUri;
+			Boolean uploadResult = uploadToUrl(postUrl, boundaryKey, content, "", file);
+			if (uploadResult == true) {
+				//放入成功队列
+				successFileQueue.add(file);
+				// 创建备份目录
+				//String targetFileStr = MonitorFileUtils.touchBackDir(file);
+				//pools.execute(new FileMover(file, new File(targetFileStr)));
+			} else {
+				//第一次失败 加入失败队列
+				failFileQueue.add(file);
+				System.out.println("上传失败----------"+failFileQueue.size()+"个@@@@@----------");
+				// 文件上传失败
+				String targetFileStr = MonitorFileUtils.touchRetryDir(file);
+				pools.execute(new FileMover(file, new File(targetFileStr)));
+				//复制到重试文件夹
+			//	CopyFile.copyFile(file,new File(targetFileStr));
+			//	ErrReporter.report("文件上传失败:" + file.getPath());
+			}
+		} catch (Exception e) {
+			ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+			e.printStackTrace();
+		}
+	}
+
+	private static String renameFileName(String name) {
+		return Configs.hospitalId + "-" + name;
+	}
+
+	@SuppressWarnings("static-access")
+	private static boolean uploadToUrl(String url, String boundaryKey, String contentBinary, String fileId, File fromFile) throws Exception {
+		String uri = url;
+		String enddata = "\r\n----" + boundaryKey + "--";
+		// 获取文件输入流
+		InputStream in = null;
+		try {
+			in = new FileInputStream(fromFile);
+		} catch (FileNotFoundException fnfe) {
+			// 有些图片格式,会被系统临时占用,抛出文件被占用异常
+			Thread.currentThread().sleep(1000);
+			// 多线程竞争时,文件流可能是空的,读之前做一次判断,以免处理已经上传过的文件(或已被删除)
+			if (fromFile.exists()) {
+				in = new FileInputStream(fromFile);
+			}
+		}
+		if (in == null) {
+			// 多线程竞争时,文件流可能是空的
+			// 第二次尝试
+			// 有些图片格式,会被系统临时占用,抛出文件被占用异常
+			Thread.currentThread().sleep(1000);
+			// 多线程竞争时,文件流可能是空的,读之前做一次判断,以免处理已经上传过的文件(或已被删除)
+			if (fromFile.exists()) {
+				in = new FileInputStream(fromFile);
+			}
+		}
+		if (in == null) {
+			// 多线程竞争时,文件流可能是空的
+			return false;
+		}
+		URL urlObj = new URL(uri);
+		HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
+		try {
+			con.setRequestMethod("POST"); // 设置关键值,以Post方式提交表单,默认get方式
+			con.setDoInput(true);
+			con.setDoOutput(true);
+			con.setUseCaches(false); // post方式不能使用缓存
+			// 设置请求头信息
+			// con.setRequestProperty("Connection", "Keep-Alive");
+			con.setRequestProperty("Charset", "UTF-8");
+			// 设置边界
+			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=--" + boundaryKey);
+			// 设置文件大小
+			con.setRequestProperty("Content-Length", String.valueOf(fromFile.length()));
+			// 请求正文信息
+			// 第一部分:
+			StringBuilder sb = new StringBuilder();
+			sb.append(contentBinary);
+			// 未知文件类型,以流的方式上传
+			byte[] head = sb.toString().getBytes("utf-8");
+			// 获得输出流
+			OutputStream out = new DataOutputStream(con.getOutputStream());
+			// 输出表头
+			out.write(head);
+			// 文件正文部分
+			// 把文件以流文件的方式 推入到url中
+			DataInputStream dataIn = new DataInputStream(in);
+			int bytes = 0;
+			byte[] bufferOut = new byte[1024];
+			while ((bytes = dataIn.read(bufferOut)) != -1) {
+				out.write(bufferOut, 0, bytes);
+			}
+			dataIn.close();
+			try {
+				in.close();
+			} catch (Exception e) {
+			}
+			// 结尾部分
+			byte[] foot = (enddata).getBytes("utf-8");// 定义最后数据分隔线
+			out.write(foot);
+			out.flush();
+			out.close();
+			// 读取返回数据
+			StringBuilder strBuf = new StringBuilder();
+			BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
+			try {
+				String line = null;
+				while ((line = reader.readLine()) != null) {
+					strBuf.append(line).append("\n");
+				}
+			} finally {
+				reader.close();
+			}
+			String rs = strBuf.toString();
+			Configs.sysLog.info("The file (" + fromFile.getName() + ") uploaded ! result:" + rs);
+			if (strBuf.indexOf("success\":true") > 0) {
+				return true;
+			} else {
+				return false;
+			}
+		} finally {
+			try {
+				con.disconnect();
+				con = null;
+			} catch (Exception e) {
+			}
+			try {
+				in.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+
+}

+ 173 - 0
src/main/java/com/zskk/dicom/monitor/uploader/FileUploader_two.java

@@ -0,0 +1,173 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+/**
+ *
+ * 功能描述: 重试上传
+ *
+ * @param:
+ * @return: 
+ * @auther: zzp
+ * @date:
+ */
+public class FileUploader_two {
+    private static ExecutorService pools = Executors.newFixedThreadPool(2);
+    File file;
+    public FileUploader_two(File file) {
+        this.file = file;
+
+    }
+
+    public static void upload(File file) {
+        if(file == null || !file.exists()) {
+            ErrReporter.report("file 为空 或者 file不存在");
+            return;
+        }
+        try {
+            String boundaryKey = UUID.randomUUID().toString().replaceAll("-", "").substring(8, 24);
+            String content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + renameFileName(file.getName()) + "\"; filename=\"" + renameFileName(file.getName()) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n";
+            String postUrl = "http://" + Configs.postHost + ":" + Configs.postPort + Configs.postUri;
+            Boolean uploadResult = uploadToUrl(postUrl, boundaryKey, content, "", file);
+            if (uploadResult == true) {
+                //放入成功队列
+                FileUploader.successFileQueue.add(file);
+                // 创建备份目录
+                //String targetFileStr = MonitorFileUtils.touchBackDir(file);
+                //pools.execute(new FileMover(file, new File(targetFileStr)));
+            } else {
+              //第二次失败移动到错误文件夹
+                //生成重试文件名
+                String targetFileStr = MonitorFileUtils.touchEorrDir(file);
+                pools.execute(new FileMover(file, new File(targetFileStr)));
+                //复制到重试文件夹
+              //  CopyFile.copyFile(file,new File(targetFileStr));
+                // 文件上传失败
+                ErrReporter.report("文件第二次上传失败:" + file.getPath());
+            }
+        } catch (Exception e) {
+            ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+            e.printStackTrace();
+        }
+    }
+
+    private static String renameFileName(String name) {
+
+        return Configs.hospitalId + "-" + name;
+    }
+
+    @SuppressWarnings("static-access")
+    private static boolean uploadToUrl(String url, String boundaryKey, String contentBinary, String fileId, File fromFile) throws Exception {
+            String uri = url;
+            String enddata = "\r\n----" + boundaryKey + "--";
+            // 获取文件输入流
+            InputStream in = null;
+            try {
+                in = new FileInputStream(fromFile);
+            } catch (FileNotFoundException fnfe) {
+                // 有些图片格式,会被系统临时占用,抛出文件被占用异常
+                Thread.currentThread().sleep(1000);
+                // 多线程竞争时,文件流可能是空的,读之前做一次判断,以免处理已经上传过的文件(或已被删除)
+                if (fromFile.exists()) {
+                    in = new FileInputStream(fromFile);
+                }
+            }
+            if (in == null) {
+                // 多线程竞争时,文件流可能是空的
+                // 第二次尝试
+                // 有些图片格式,会被系统临时占用,抛出文件被占用异常
+                Thread.currentThread().sleep(1000);
+                // 多线程竞争时,文件流可能是空的,读之前做一次判断,以免处理已经上传过的文件(或已被删除)
+                if (fromFile.exists()) {
+                    in = new FileInputStream(fromFile);
+                }
+            }
+            if (in == null) {
+                // 多线程竞争时,文件流可能是空的
+                return false;
+            }
+            URL urlObj = new URL(uri);
+            HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
+            try {
+                con.setRequestMethod("POST"); // 设置关键值,以Post方式提交表单,默认get方式
+                con.setDoInput(true);
+                con.setDoOutput(true);
+                con.setUseCaches(false); // post方式不能使用缓存
+                // 设置请求头信息
+                // con.setRequestProperty("Connection", "Keep-Alive");
+                con.setRequestProperty("Charset", "UTF-8");
+                // 设置边界
+                con.setRequestProperty("Content-Type", "multipart/form-data; boundary=--" + boundaryKey);
+                // 设置文件大小
+                con.setRequestProperty("Content-Length", String.valueOf(fromFile.length()));
+                // 请求正文信息
+                // 第一部分:
+                StringBuilder sb = new StringBuilder();
+                sb.append(contentBinary);
+                // 未知文件类型,以流的方式上传
+                byte[] head = sb.toString().getBytes("utf-8");
+                // 获得输出流
+                OutputStream out = new DataOutputStream(con.getOutputStream());
+                // 输出表头
+                out.write(head);
+                // 文件正文部分
+                // 把文件以流文件的方式 推入到url中
+                DataInputStream dataIn = new DataInputStream(in);
+                int bytes = 0;
+                byte[] bufferOut = new byte[1024];
+                while ((bytes = dataIn.read(bufferOut)) != -1) {
+                    out.write(bufferOut, 0, bytes);
+                }
+                dataIn.close();
+                try {
+                    in.close();
+                } catch (Exception e) {
+                }
+                // 结尾部分
+                byte[] foot = (enddata).getBytes("utf-8");// 定义最后数据分隔线
+                out.write(foot);
+                out.flush();
+                out.close();
+                // 读取返回数据
+                StringBuilder strBuf = new StringBuilder();
+                BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
+                try {
+                    String line = null;
+                    while ((line = reader.readLine()) != null) {
+                        strBuf.append(line).append("\n");
+                    }
+                } finally {
+                    reader.close();
+                }
+                String rs = strBuf.toString();
+                Configs.sysLog.info("The file (" + fromFile.getName() + ") uploaded ! result:" + rs);
+                if (strBuf.indexOf("success\":true") > 0) {
+                    return true;
+                } else {
+                    return false;
+                }
+            } finally {
+                try {
+                    con.disconnect();
+                    con = null;
+                } catch (Exception e) {
+                }
+                try {
+                    in.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+}

+ 25 - 0
src/main/java/com/zskk/dicom/monitor/uploader/HistoryFile2UploadQuenu.java

@@ -0,0 +1,25 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.util.Iterator;
+
+public class HistoryFile2UploadQuenu implements Runnable {
+    @SuppressWarnings("static-access")
+    @Override
+    public void run() {
+        //读取监控文件夹
+        File dir = new File(Configs.monitorDir);
+        Iterator<File> its = FileUtils.iterateFiles(dir, new String[]{"txt"}, true);
+        while(its.hasNext()){
+            File file = its.next();
+            if(file.exists() && file.isFile()) {
+                UploadsQueue.add(new File(file.getAbsolutePath()));
+            }
+        }
+
+
+    }
+}

+ 31 - 0
src/main/java/com/zskk/dicom/monitor/uploader/HistoryFile3UploadQuenu.java

@@ -0,0 +1,31 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.util.Iterator;
+/**
+ *
+ * 功能描述: 重试文件放入失败队列
+ *
+ * @param:
+ * @return: 
+ * @auther: zzp
+ * @date: 2019/3/19 11:44
+ */
+public class HistoryFile3UploadQuenu implements Runnable{
+    @SuppressWarnings("static-access")
+    @Override
+    public void run() {
+        //读取监控文件夹
+        File dir = new File(Configs.monitorRetryDir);
+        Iterator<File> its = FileUtils.iterateFiles(dir, new String[]{"txt"}, true);
+        while(its.hasNext()){
+            File file = its.next();
+            if(file.exists() && file.isFile()) {
+                FileUploader.add(new File(file.getAbsolutePath()));
+            }
+        }
+    }
+}

+ 51 - 0
src/main/java/com/zskk/dicom/monitor/uploader/OldUploadRunner.java

@@ -0,0 +1,51 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+public class OldUploadRunner implements Runnable{
+    public OldUploadRunner() {
+    }
+    @Override
+    public void run() {
+        while(true) {
+            boolean flag = upload();
+            Configs.sysLog.info("--老上传队列-- System upload flag:" + flag + "\nUploadsQueue.fileQueue.size:" + UploadsQueue.fileQueue.size());
+            try {
+                TimeUnit.MILLISECONDS.sleep(10);
+                if(UploadsQueue.fileQueue.size() == 0) {
+                    Configs.sysLog.info("The old UploadQueue is empty");
+                    return;
+                }
+                if(!flag) {
+                    TimeUnit.SECONDS.sleep(1);
+                }
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public synchronized static boolean upload() {
+        boolean flag = false;
+        try {
+            // 从队列中移除已完成任务
+            if(UploadsQueue.fileQueue.size() > 0) {
+                System.out.println("老文件"+UploadsQueue.fileQueue.size()+"-----------------------");
+                File file = UploadsQueue.fileQueue.remove(0);
+                //上传
+                FileUploader.upload(file);
+                flag = true;
+            }
+        } catch (Throwable e) {
+            ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}

+ 46 - 0
src/main/java/com/zskk/dicom/monitor/uploader/RetryUploadRunner.java

@@ -0,0 +1,46 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+public class RetryUploadRunner implements Runnable{
+    @Override
+    public void run() {
+        while(true) {
+            boolean flag = upload();
+            Configs.sysLog.info("--RetryFileQueue-- System upload flag:" + flag + "\nFileUploader.failFileQueue.size:" + FileUploader.failFileQueue.size());
+            try {
+                if(flag) {
+                    TimeUnit.MILLISECONDS.sleep(10);
+                } else {
+                    TimeUnit.SECONDS.sleep(1);
+                }
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public synchronized static boolean upload() {
+        boolean flag = false;
+        try {
+            // 从队列中移除已完成任务
+            if(FileUploader.failFileQueue.size() > 0) {
+                System.out.println("重试文件"+FileUploader.failFileQueue.size()+"个-----------------------");
+                File file = FileUploader.failFileQueue.remove(0);
+                FileUploader_two.upload(file);
+
+                flag = true;
+            }
+        } catch (Throwable e) {
+            ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}

+ 61 - 0
src/main/java/com/zskk/dicom/monitor/uploader/SuccessUploadQuenu.java

@@ -0,0 +1,61 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+import java.io.File;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+/**
+ *
+ * 功能描述: 备份移除源文件
+ *
+ * @param:
+ * @return: 
+ * @auther: zzp
+ * @date: 2019/3/18 15:36
+ */
+public class SuccessUploadQuenu implements  Runnable {
+    private static ExecutorService pools = Executors.newFixedThreadPool(2);
+    @Override
+    public void run() {
+        while(true) {
+            boolean flag = mover();
+            Configs.sysLog.info("--SuccessFileQueue-- System upload flag:" + flag + "\nUploadsQueue.SuccessFileQueue.size:" + FileUploader.successFileQueue.size());
+            try {
+                if(flag) {
+                    TimeUnit.MILLISECONDS.sleep(10);
+                } else {
+                    TimeUnit.SECONDS.sleep(1);
+                }
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+    public synchronized static boolean mover() {
+        boolean flag = false;
+        try {
+            // 从队列中移除已完成任务
+            if(FileUploader.successFileQueue.size() > 0) {
+                System.out.println("成功文件队列"+FileUploader.successFileQueue.size()+"个-----------------------");
+                File file = FileUploader.successFileQueue.remove(0);
+                //备份
+                String targetFileStr = MonitorFileUtils.touchBackDir(file);
+                //移除源文件
+                pools.execute(new FileMover(file, new File(targetFileStr)));
+                flag = true;
+            }
+        } catch (Throwable e) {
+            ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}

+ 47 - 0
src/main/java/com/zskk/dicom/monitor/uploader/UploadsQueue.java

@@ -0,0 +1,47 @@
+package com.zskk.dicom.monitor.uploader;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class UploadsQueue {
+    /**
+     * 待处理的文件队列
+     */
+    protected static List<File> fileQueue = Collections.synchronizedList(new ArrayList<File>());
+    /**
+     * 新处理的文件队列
+     */
+    protected static List<File> currentFileQueue = Collections.synchronizedList(new ArrayList<File>());
+    /**
+     *
+     * 功能描述: 新文件添加到集合
+     *
+     * @param: [file]
+     * @return: void
+     * @auther: zzp
+     * @date: 2019/3/12 10:54
+     */
+    public static void addCurrent(File file) {
+        if (currentFileQueue.contains(file)) {
+            // 文件已经在队列中
+            Configs.sysLog.info(file + ", The file is [already] in the [current] queue!");
+        } else {
+            currentFileQueue.add(file);
+            Configs.sysLog.info(file + ", The file is [added] to the [current] queue!");
+        }
+    }
+
+    public static void add(File file) {
+        if (fileQueue.contains(file)) {
+            // 文件已经在队列中
+            Configs.sysLog.info(file + ", The file is already in the [old] queue!");
+        } else {
+            fileQueue.add(file);
+            Configs.sysLog.info(file + ", The file is added to the [old] queue!");
+        }
+    }
+}

+ 25 - 0
src/main/java/com/zskk/dicom/monitor/utils/ExceptionUtil.java

@@ -0,0 +1,25 @@
+package com.zskk.dicom.monitor.utils;
+
+public class ExceptionUtil {
+
+	/**
+	 * 获取异常信息
+	 * 
+	 * @param e
+	 * @return
+	 */
+	public static String getExceptionTxt(Throwable e) {
+		StringBuilder sOut = new StringBuilder();
+		sOut.append("----------\r\n<br />");
+		sOut.append(e.getMessage() + "\r\n<br />");
+		StackTraceElement[] trace = e.getStackTrace();
+		for (StackTraceElement s : trace) {
+			String ste = s.toString();
+			if (ste.contains("com.zskk")) {
+				sOut.append(s + "\r\n<br />");
+			}
+		}
+		return sOut.toString();
+	}
+
+}

+ 140 - 0
src/main/java/com/zskk/dicom/monitor/utils/FileHashUtil.java

@@ -0,0 +1,140 @@
+package com.zskk.dicom.monitor.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * 得到文件Md5值<br />
+ * 文件比较时使用
+ * 
+ * @author dandian
+ *
+ */
+public class FileHashUtil {
+
+	private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+	/**
+	 * Get MD5 of a file (lower case)
+	 * 
+	 * @return empty string if I/O error when get MD5
+	 */
+	public static String getFileMD5(File file) {
+
+		FileInputStream in = null;
+		try {
+			in = new FileInputStream(file);
+			FileChannel ch = in.getChannel();
+			return MD5(ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()));
+		} catch (FileNotFoundException e) {
+			return "文件找不到";
+		} catch (IOException e) {
+			return "IO异常";
+		} finally {
+			if (in != null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+					// 关闭流产生的错误一般都可以忽略
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * MD5校验字符串
+	 * 
+	 * @param s
+	 *            String to be MD5
+	 * @return 'null' if cannot get MessageDigest
+	 */
+
+	private static String getStringMD5(String s) {
+		MessageDigest mdInst;
+		try {
+			// 获得MD5摘要算法的 MessageDigest 对象
+			mdInst = MessageDigest.getInstance("MD5");
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+			return "";
+		}
+
+		byte[] btInput = s.getBytes();
+		// 使用指定的字节更新摘要
+		mdInst.update(btInput);
+		// 获得密文
+		byte[] md = mdInst.digest();
+		// 把密文转换成十六进制的字符串形式
+		int length = md.length;
+		char str[] = new char[length * 2];
+		int k = 0;
+		for (byte b : md) {
+			str[k++] = hexDigits[b >>> 4 & 0xf];
+			str[k++] = hexDigits[b & 0xf];
+		}
+		return new String(str);
+	}
+
+	@SuppressWarnings("unused")
+	private static String getSubStr(String str, int subNu, char replace) {
+		int length = str.length();
+		if (length > subNu) {
+			str = str.substring(length - subNu, length);
+		} else if (length < subNu) {
+			// NOTE: padding字符填充在字符串的右侧,和服务器的算法是一致的
+			str += createPaddingString(subNu - length, replace);
+		}
+		return str;
+	}
+
+	private static String createPaddingString(int n, char pad) {
+		if (n <= 0) {
+			return "";
+		}
+
+		char[] paddingArray = new char[n];
+		Arrays.fill(paddingArray, pad);
+		return new String(paddingArray);
+	}
+
+	/**
+	 * 计算MD5校验
+	 * 
+	 * @param buffer
+	 * @return 空串,如果无法获得 MessageDigest实例
+	 */
+
+	private static String MD5(ByteBuffer buffer) {
+		String s = "";
+		try {
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			md.update(buffer);
+			byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
+			// 用字节表示就是 16 个字节
+			char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
+			// 所以表示成 16 进制需要 32 个字符
+			int k = 0; // 表示转换结果中对应的字符位置
+			for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
+				// 转换成 16 进制字符的转换
+				byte byte0 = tmp[i]; // 取第 i 个字节
+				str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, >>>,
+				// 逻辑右移,将符号位一起右移
+				str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
+			}
+			s = new String(str); // 换后的结果转换为字符串
+
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		}
+		return s;
+	}
+
+}

+ 167 - 0
src/main/java/com/zskk/dicom/monitor/utils/LogEnginer.java

@@ -0,0 +1,167 @@
+package com.zskk.dicom.monitor.utils;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.filter.LevelFilter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
+import ch.qos.logback.core.spi.FilterReply;
+import ch.qos.logback.core.util.FileSize;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+/**
+ * log4j
+ * 
+ */
+public class LogEnginer {
+
+	/**
+	 * 单个文件最大大小(500M)
+	 */
+	private static FileSize MaxFileSize = FileSize.valueOf("500MB");
+
+	/**
+	 * (全部)日志最大大小限制
+	 */
+	private static FileSize TotalSizeCap = FileSize.valueOf("100GB");
+
+	private static String AppenderFile = "./logs/{logName}.log";
+
+	private static String FileNamePattern = "./logs/%d{yyyy-MM-dd}/{logName}-%d{yyyy-MM-dd}.%i.log";
+
+	/**
+	 * 日志输出对象
+	 */
+	private Logger log;
+
+	/**
+	 * 日志Appender配置
+	 */
+	private RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<ILoggingEvent>();
+
+	private LoggerContext lc;
+
+	/**
+	 * 日志(文件)名
+	 */
+	String logName;
+
+	@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
+	public LogEnginer(String logName) {
+
+		org.slf4j.Logger slog = (org.slf4j.Logger) LoggerFactory.getLogger(logName);
+
+		Object fobj = LoggerFactory.getILoggerFactory();
+		if (fobj instanceof org.slf4j.helpers.SubstituteLoggerFactory) {
+			org.slf4j.helpers.SubstituteLoggerFactory slf = (org.slf4j.helpers.SubstituteLoggerFactory) fobj;
+		} else {
+			lc = (LoggerContext) fobj;
+		}
+
+		// lc.reset(); // 重置之前的配置(注意:全局)
+
+		log = (Logger) slog;
+		log.detachAndStopAllAppenders();
+
+		this.logName = logName;
+
+		appender.setFile(AppenderFile.replaceAll("\\{logName\\}", logName));
+
+		SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
+		policy.setContext(lc);
+		policy.setFileNamePattern(FileNamePattern.replaceAll("\\{logName\\}", logName));
+		policy.setMaxHistory(Integer.MAX_VALUE);
+		policy.setTotalSizeCap(TotalSizeCap);
+		policy.setMaxFileSize(MaxFileSize);
+		policy.setParent(appender);
+		policy.start();
+
+		appender.setTriggeringPolicy(policy);
+		appender.setRollingPolicy(policy);
+
+		appender.setAppend(true); // 可追加
+
+		PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
+		layoutEncoder.setCharset(Charset.forName("utf8"));
+		// layoutEncoder.setPattern("%-5p [%d] %C:%L - %m %n");
+		layoutEncoder.setPattern("%m%n");
+		layoutEncoder.setContext(lc);
+		layoutEncoder.start();
+		appender.setEncoder(layoutEncoder);
+
+		LevelFilter filter = new LevelFilter();
+		filter.setLevel(Level.INFO);
+		filter.setOnMatch(FilterReply.ACCEPT);
+		filter.setOnMismatch(FilterReply.DENY);
+
+		appender.setName(logName + ".STDOUT");
+
+		// System.out.println("......................");
+		// StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
+		// System.out.println("......................");
+
+		appender.setContext(lc);
+		log.addAppender(appender);
+		log.setLevel(Level.ALL);
+		log.setAdditive(false);
+		appender.start();
+	}
+
+	/**
+	 * info:一般信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void info(String logMsg) {
+		System.out.println(logMsg);
+		log.info(logMsg);
+	}
+
+	/**
+	 * error:出错信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void error(String logMsg) {
+		log.error(logMsg);
+	}
+
+	/**
+	 * debug:调试信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void debug(String logMsg) {
+		log.debug(logMsg);
+	}
+
+	/**
+	 * trace:追踪信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void trace(String logMsg) {
+		log.trace(logMsg);
+	}
+
+	/**
+	 * warn:警告信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void warn(String logMsg) {
+		log.warn(logMsg);
+	}
+
+}

+ 47 - 0
src/main/java/com/zskk/dicom/monitor/utils/MailerUtil.java

@@ -0,0 +1,47 @@
+package com.zskk.dicom.monitor.utils;
+
+import com.zskk.dicom.monitor.config.Configs;
+import org.apache.commons.mail.EmailAttachment;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
+
+public class MailerUtil {
+
+	public static void SendMail(String host, String from, String username, String password, String to, String cc, String charset, String subject, String mailConent, EmailAttachment[] atts) throws EmailException {
+		if (charset == null || charset.equals("")) {
+			charset = "GB2312";
+		}
+		HtmlEmail email = new HtmlEmail();
+		email.setAuthentication(username, password);
+		email.setHostName(host);
+		email.addTo(to, from);
+		if (cc != null && !"".equals(cc)) {
+			if (cc.contains(";")) {
+				String ccs[] = cc.split(";");
+				for (int i = 0; i < ccs.length; i++) {
+					email.addCc(ccs[i]);
+				}
+			} else {
+				email.addCc(cc);
+			}
+		}
+		email.setFrom(from);
+		email.setSubject(subject);
+		email.setCharset(charset);
+		email.setHtmlMsg(mailConent); /* 邮件内容 */
+		// 添加附件对象
+		if (atts != null && atts.length > 0) {
+			for (int i = 0; i < atts.length; i++) {
+				if (atts[i] != null)
+					email.attach(atts[i]);
+			}
+		}
+		email.send();
+		// 保存系统日志
+		StringBuilder logMsg = new StringBuilder();
+		logMsg.append("SendMail:" + from + " --> " + to + (cc == null ? "" : ";cc:" + cc) + "[" + subject + "]:\n");
+		logMsg.append(mailConent);
+		Configs.sysLog.info(logMsg.toString());
+		logMsg = null;
+	}
+}

+ 126 - 0
src/main/java/com/zskk/dicom/monitor/utils/MonitorFileUtils.java

@@ -0,0 +1,126 @@
+package com.zskk.dicom.monitor.utils;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class MonitorFileUtils {
+
+	/**
+	 * 移除空的目录
+	 * 
+	 * @param dirFile
+	 */
+	public static void removeEmptyDir(File dirFile) {
+		// 文件的上级目录
+		String fs[] = dirFile.list();
+		if (fs == null || fs.length < 1) {
+			String filePath = dirFile.getAbsolutePath();
+			Boolean delRs = dirFile.delete();
+			if (delRs) {
+				Configs.sysLog.info("Dir is delete suc:" + filePath);
+			} else {
+				Configs.sysLog.info("Dir is delete fail:" + filePath);
+			}
+		}
+	}
+          //移除今天之前的空目录
+	public static void removeBeforeTodayEmptyDir(File dirFile) {
+		// 文件的上级目录
+		String fs[] = dirFile.list();
+		if (fs == null || fs.length < 1) {
+			DateFormat df = new SimpleDateFormat("yyyyMMdd");
+			Calendar ca = Calendar.getInstance();
+			ca.setTimeInMillis(dirFile.lastModified());
+			String fileDay = df.format(ca.getTime());
+			String curDay = df.format(new Date());
+			if (!fileDay.equals(curDay)) {
+				String filePath = dirFile.getAbsolutePath();
+				// 不是同一天
+				Boolean delRs = dirFile.delete();
+				if (delRs) {
+					Configs.sysLog.info("Dir is delete suc:" + filePath);
+				} else {
+					Configs.sysLog.info("Dir is delete fail:" + filePath);
+				}
+			}
+		}
+	}
+
+	/**
+	 * 检测备份目录并返回 备份目标 文件(路径)
+	 * 
+	 * @param dcomFile
+	 * @return
+	 */
+	public static String touchBackDir(File dcomFile) {
+		String targetFile = dcomFile.getAbsolutePath();
+		targetFile = targetFile.replace(Configs.monitorDir, "");
+		targetFile = Configs.monitorBackDir + targetFile;
+		String targetFileDirStr = targetFile.substring(0, targetFile.lastIndexOf(File.separator));
+		Configs.sysLog.info("64-----64-----错误文件:" + targetFile + "/r/n 目录名称:" + targetFileDirStr);
+		File targetFileDir = new File(targetFileDirStr);
+		if (!targetFileDir.exists()) {
+			Boolean cr = targetFileDir.mkdirs();
+			if (cr) {
+				Configs.sysLog.info("Create backup dir :" + targetFileDir.getAbsolutePath());
+			} else {
+				Configs.sysLog.info("Create backup dir failed :" + targetFileDir.getAbsolutePath());
+			}
+		}
+		return targetFile;
+	}
+	/**
+	 * 检测备份目录无创建并返回 重试目标 文件(路径)
+	 *
+	 * @param dcomFile
+	 * @return
+	 */
+	public static String touchRetryDir(File dcomFile) {
+		String targetFile = dcomFile.getAbsolutePath();
+		targetFile = targetFile.replace(Configs.monitorDir, "");
+		targetFile = Configs.monitorRetryDir + targetFile;
+		String targetFileDirStr = targetFile.substring(0, targetFile.lastIndexOf(File.separator));
+		Configs.sysLog.info("11-----11-----备份文件:" + targetFile + "/r/n 目录名称:" + targetFileDirStr);
+		File targetFileDir = new File(targetFileDirStr);
+		if (!targetFileDir.exists()) {
+			System.out.println("------------------------------------------------------------------------------------------");
+			Boolean cr = targetFileDir.mkdirs();
+			if (cr) {
+				Configs.sysLog.info("Create backup dir :" + targetFileDir.getAbsolutePath());
+			} else {
+				Configs.sysLog.info("Create backup dir failed :" + targetFileDir.getAbsolutePath());
+			}
+		}
+		return targetFile;
+	}
+	/**
+	 * 检测备份目录无创建并返回 错误目标 文件(路径)
+	 *
+	 * @param dcomFile
+	 * @return
+	 */
+	public static String touchEorrDir(File dcomFile) {
+		String targetFile = dcomFile.getAbsolutePath();
+		targetFile = targetFile.replace(Configs.monitorDir, "");
+		targetFile = Configs.eorrRetryDir + targetFile;
+		String targetFileDirStr = targetFile.substring(0, targetFile.lastIndexOf(File.separator));
+		Configs.sysLog.info("11-----11-----备份文件:" + targetFile + "/r/n 目录名称:" + targetFileDirStr);
+		File targetFileDir = new File(targetFileDirStr);
+		if (!targetFileDir.exists()) {
+			System.out.println("------------------------------------------------------------------------------------------");
+			Boolean cr = targetFileDir.mkdirs();
+			if (cr) {
+				Configs.sysLog.info("Create backup dir :" + targetFileDir.getAbsolutePath());
+			} else {
+				Configs.sysLog.info("Create backup dir failed :" + targetFileDir.getAbsolutePath());
+			}
+		}
+		return targetFile;
+	}
+
+}

+ 8 - 0
src/main/java/com/zskk/dicom/oss/BaseOSSHleper.java

@@ -0,0 +1,8 @@
+package com.zskk.dicom.oss;
+
+import java.io.File;
+
+public interface BaseOSSHleper {
+	boolean upload(File file) throws Exception;
+	boolean exist(String md5);
+}

BIN
src/main/java/com/zskk/dicom/oss/OSSFileAndCallbackHleper.java


+ 21 - 0
src/main/java/com/zskk/dicom/request/bean/ALiYunOSSCallbackBodyBean.java

@@ -0,0 +1,21 @@
+package com.zskk.dicom.request.bean;
+
+import java.io.Serializable;
+
+public class ALiYunOSSCallbackBodyBean implements Serializable{
+	public String hospital_id;
+	public String region;
+	public String md5;
+	public String url;
+	public long size;
+	
+	public ALiYunOSSCallbackBodyBean(String hospital_id,String region,String md5,String url,long size) {
+		this.hospital_id = hospital_id;
+		this.region = region;
+		this.md5 = md5;
+		this.url = url;
+		this.size = size;
+		
+	}
+//	String callbackBodyStr = "{\\\"hospital_id\\\":\\\"12345432\\\",\\\"region\\\":\\\"oss-cn-beijing\\\",\\\"md5\\\":\\\""+md5+"\\\",\\\"url\\\":\\\""+url+"\\\",\\\"size\\\":"+size+"}";
+}

+ 60 - 0
src/main/java/com/zskk/dicom/response/BaseResponse.java

@@ -0,0 +1,60 @@
+package com.zskk.dicom.response;
+
+import com.zskk.dicom.config.NetCodeConfig;
+import com.zskk.dicom.response.bean.BaseResponseBean;
+
+public class BaseResponse<T extends BaseResponseBean>{
+	private String code;
+	private String msg;
+	private Exception error;
+	private T data;
+	public BaseResponse(String code, String msg , Exception e) {
+		this.code = code;
+		this.msg = msg;
+		this.error = e;
+	}
+	
+	public String getCode() {
+		return this.code;
+	}
+	
+	public String getMsg() {
+		return this.msg;
+	}
+	
+	public Exception getError() {
+		return this.error;
+	}
+	
+	public BaseResponse setCode(String code) {
+		this.code = code;
+		return this;
+	}
+	
+	public BaseResponse setMsg(String msg) {
+		this.msg = msg;
+		return this;
+	}
+	
+	public BaseResponse setError(Exception e) {
+		this.error = e;
+		return this;
+	}
+	
+	public BaseResponse setData(T data) {
+		this.data = data;
+		return this;
+	}
+	
+	public T getData() {
+		return this.data;
+	}
+	
+	public boolean isError() {
+		return !isSuccess();
+	}
+	
+	public boolean isSuccess() {
+		return NetCodeConfig.SUCCESS.equals(this.getCode());
+	}
+}

+ 10 - 0
src/main/java/com/zskk/dicom/response/FileUploadChcekResponse.java

@@ -0,0 +1,10 @@
+package com.zskk.dicom.response;
+
+public class FileUploadChcekResponse extends BaseResponse {
+
+	public FileUploadChcekResponse(String code, String msg, Exception e) {
+		super(code, msg, e);
+	}
+
+	
+}

+ 31 - 0
src/main/java/com/zskk/dicom/response/ZskkResponseFactory.java

@@ -0,0 +1,31 @@
+package com.zskk.dicom.response;
+
+import com.zskk.dicom.config.NetCodeConfig;
+
+public class ZskkResponseFactory {
+	private static class ZskkExceptionFactoryHoler {
+		private static ZskkResponseFactory INSTANCE = new ZskkResponseFactory();
+	}
+	public static ZskkResponseFactory getInstance() {
+		return ZskkExceptionFactoryHoler.INSTANCE;
+	}
+	private ZskkResponseFactory instance;
+	private ZskkResponseFactory() {	
+		
+	}
+	public BaseResponse generateSuccess() {
+		return this.generate(NetCodeConfig.SUCCESS,null,null);
+	}
+	
+	public BaseResponse generate(String code) {
+		return this.generate(code,null,null);
+	}
+	
+	public BaseResponse generate(String code,String msg) {
+		return this.generate(code,msg,null);
+	}
+	
+	public BaseResponse generate(String code,String msg, Exception e) {
+		return new BaseResponse(code, msg, e);
+	}
+}

+ 5 - 0
src/main/java/com/zskk/dicom/response/bean/BaseResponseBean.java

@@ -0,0 +1,5 @@
+package com.zskk.dicom.response.bean;
+
+public class BaseResponseBean {
+	
+}

+ 12 - 0
src/main/java/com/zskk/dicom/response/bean/FileUploadChcekResponseBean.java

@@ -0,0 +1,12 @@
+package com.zskk.dicom.response.bean;
+
+import java.io.File;
+
+public class FileUploadChcekResponseBean extends BaseResponseBean{
+	public String filename;
+	public File file;
+	public FileUploadChcekResponseBean(String filename,File file) {
+		this.filename = filename;
+		this.file = file;
+	}
+}

+ 21 - 0
src/main/java/com/zskk/dicom/response/bean/FileUploadResponseBean.java

@@ -0,0 +1,21 @@
+package com.zskk.dicom.response.bean;
+
+import java.io.Serializable;
+
+public class FileUploadResponseBean extends BaseResponseBean implements Serializable{
+	public int code;
+	public String msg;
+	public String error;
+	
+	public FileUploadResponseBean(int code,String msg,String error) {
+		this.code  = code;
+		this.msg   = msg;
+		this.error = error;
+	}
+	
+	@Override
+	public String toString() {
+		// TODO Auto-generated method stub
+		return "code :" + code + "\r\nmsg:" + msg + "\r\nerror:"+error;
+	}
+}

+ 4 - 0
src/main/resources/application.properties

@@ -0,0 +1,4 @@
+server.port=80
+spring.resources.chain.cache=false
+
+

+ 18 - 0
src/main/resources/project.properties

@@ -0,0 +1,18 @@
+monitor.monitorDir=D:\\zskk\\zskk_system
+monitor.monitorRetryDir=D:\\zskk\\zskk_system_Retry
+monitor.eorrRetryDir=D:\\zskk\\zskk_system_eorr
+monitor.hospitalId=73090001
+monitor.postHost=api.pacsonline.cn
+monitor.postPort=80
+monitor.postUri=/upload
+monitor.errReportTitle=dicome-error-report
+monitor.errReportTimeInterval=60
+monitor.errReportToEmail=liu.tao@pacsonline.cn;fu.yu@pacsonline.cn
+monitor.errReportFromEmail=zskk@pacsonline.cn
+monitor.errReportFromEmailHost=smtp.exmail.qq.com
+monitor.errReportFromEmailPwd=Abc1234
+monitor.oss.region=oss-cn-beijing
+monitor.oss.endpoint=oss-cn-beijing.aliyuncs.com
+monitor.oss.scheme=dicomweb
+monitor.oss.bucket=zskk-dcm
+monitor.oss.callback_url=http://api.aliyuoss.callback.pacsonline.cn/oss_callback

+ 2 - 0
uploader_zskk.iml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4" />