397946820@qq.com %!s(int64=6) %!d(string=hai) anos
achega
30fa024a64
Modificáronse 100 ficheiros con 13781 adicións e 0 borrados
  1. 1 0
      manage
  2. 51 0
      project/ocs/.classpath
  3. 48 0
      project/ocs/.project
  4. 13 0
      project/ocs/.settings/.jsdtscope
  5. 4 0
      project/ocs/.settings/org.eclipse.core.resources.prefs
  6. 13 0
      project/ocs/.settings/org.eclipse.jdt.core.prefs
  7. 4 0
      project/ocs/.settings/org.eclipse.m2e.core.prefs
  8. 5 0
      project/ocs/.settings/org.eclipse.m2e.wtp.prefs
  9. 10 0
      project/ocs/.settings/org.eclipse.wst.common.component
  10. 7 0
      project/ocs/.settings/org.eclipse.wst.common.project.facet.core.xml
  11. 1 0
      project/ocs/.settings/org.eclipse.wst.jsdt.ui.superType.container
  12. 1 0
      project/ocs/.settings/org.eclipse.wst.jsdt.ui.superType.name
  13. 9 0
      project/ocs/.settings/org.eclipse.wst.validation.prefs
  14. 469 0
      project/ocs/pom.xml
  15. 52 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/controller/AdvertisementFeaturesController.java
  16. 11 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/dao/IAdvertisementFeaturesDao.java
  17. 39 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/model/AdvertisingFeaturesModel.java
  18. 31 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/service/IAdvertisementFeaturesService.java
  19. 84 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/service/impl/AdvertisementFeaturesService.java
  20. 14 0
      project/ocs/src/main/java/com/it/ocs/advertisementFeatures/vo/AdvertisingFeaturesVo.java
  21. 212 0
      project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonHttpClient.java
  22. 3439 0
      project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonReportServiceClient.java
  23. 155 0
      project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonSignature.java
  24. 39 0
      project/ocs/src/main/java/com/it/ocs/amazon/controller/AmazonReportController.java
  25. 29 0
      project/ocs/src/main/java/com/it/ocs/amazon/controller/FBAInventoryReportController.java
  26. 4 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IAdjustmentInventoryDAO.java
  27. 10 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonFinancialDAO.java
  28. 9 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonReportBaseDAO.java
  29. 108 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonReportDao.java
  30. 5 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/ICustomerReturnDAO.java
  31. 5 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/ICustomerShipmentDAO.java
  32. 20 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IInboundShipmentDAO.java
  33. 18 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IInboundShipmentDetailDAO.java
  34. 5 0
      project/ocs/src/main/java/com/it/ocs/amazon/dao/IRemovalShipmentDAO.java
  35. 75 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonMyiUnsuppressedExportModel.java
  36. 52 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonReportExportModel.java
  37. 181 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonRequestConfig.java
  38. 127 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonRequestMode.java
  39. 302 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/ColumnData.java
  40. 197 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/MyiUnsuppressedVO.java
  41. 183 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/OrderReportVO.java
  42. 55 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/ParseAmazonReportRequstListXMLModel.java
  43. 99 0
      project/ocs/src/main/java/com/it/ocs/amazon/model/ReportRequestListModel.java
  44. 143 0
      project/ocs/src/main/java/com/it/ocs/amazon/order/AmazonClientRun.java
  45. 88 0
      project/ocs/src/main/java/com/it/ocs/amazon/order/AmazonRequest.java
  46. 29 0
      project/ocs/src/main/java/com/it/ocs/amazon/order/GetAmazonClient.java
  47. 48 0
      project/ocs/src/main/java/com/it/ocs/amazon/run/AmazonDownloadTest.java
  48. 908 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/AmazonReportService.java
  49. 16 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonOrderReportService.java
  50. 5 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonReportParserService.java
  51. 5 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonRequestReportService.java
  52. 249 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/InventoryReportParseSupport.java
  53. 179 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/ReportDataSaveSupport.java
  54. 24 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AdjustmentRequestService.java
  55. 44 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AjustmentParserService.java
  56. 107 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonFinancialService.java
  57. 47 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonMyiUnsuppressedExportService.java
  58. 79 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonOrderReportService.java
  59. 38 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReissueOrderService.java
  60. 44 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReportExportService.java
  61. 185 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReportParserBaseService.java
  62. 241 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonRequestBaseService.java
  63. 44 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerReturnParserService.java
  64. 19 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerReturnRequestService.java
  65. 44 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerShipmentParserService.java
  66. 107 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/InboundShipmentDetailService.java
  67. 193 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/InboundShipmentService.java
  68. 47 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/MyCount.java
  69. 49 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/RemovalParserService.java
  70. 21 0
      project/ocs/src/main/java/com/it/ocs/amazon/service/impl/RemovalRequestService.java
  71. 106 0
      project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonHttpUtil.java
  72. 175 0
      project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonReportTest.java
  73. 665 0
      project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonUtils.java
  74. 138 0
      project/ocs/src/main/java/com/it/ocs/amazon/utils/FindTimeLine.java
  75. 226 0
      project/ocs/src/main/java/com/it/ocs/amazon/utils/SiteDateParseUtils.java
  76. 157 0
      project/ocs/src/main/java/com/it/ocs/api/constant/WarehouseConstant.java
  77. 133 0
      project/ocs/src/main/java/com/it/ocs/api/controller/DeInOrderController.java
  78. 42 0
      project/ocs/src/main/java/com/it/ocs/api/controller/DeOperLogController.java
  79. 135 0
      project/ocs/src/main/java/com/it/ocs/api/controller/DeOutOrderController.java
  80. 114 0
      project/ocs/src/main/java/com/it/ocs/api/controller/DeWarehouseController.java
  81. 196 0
      project/ocs/src/main/java/com/it/ocs/api/controller/TestController.java
  82. 86 0
      project/ocs/src/main/java/com/it/ocs/api/dao/IDeInOrderDao.java
  83. 380 0
      project/ocs/src/main/java/com/it/ocs/api/dao/IDeWarehouseDao.java
  84. 33 0
      project/ocs/src/main/java/com/it/ocs/api/dao/IWmsProviderTokenDao.java
  85. 37 0
      project/ocs/src/main/java/com/it/ocs/api/ex/Oms2WmsException.java
  86. 45 0
      project/ocs/src/main/java/com/it/ocs/api/ex/SkuInventoryException.java
  87. 79 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeAbnormalReasonModel.java
  88. 215 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeInWmsOrderDetailModel.java
  89. 280 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeInWmsOrderMainModel.java
  90. 116 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeOutOrderExportModel.java
  91. 120 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeOutWmsOrderDetailModel.java
  92. 348 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeOutWmsOrderMainModel.java
  93. 90 0
      project/ocs/src/main/java/com/it/ocs/api/model/DeWmsOperateLogModel.java
  94. 64 0
      project/ocs/src/main/java/com/it/ocs/api/model/WmsProviderToken.java
  95. 295 0
      project/ocs/src/main/java/com/it/ocs/api/service/DeWmsTaskService.java
  96. 49 0
      project/ocs/src/main/java/com/it/ocs/api/service/IDeInOrderService.java
  97. 40 0
      project/ocs/src/main/java/com/it/ocs/api/service/IDeOperLogService.java
  98. 175 0
      project/ocs/src/main/java/com/it/ocs/api/service/IDeWarehouseService.java
  99. 43 0
      project/ocs/src/main/java/com/it/ocs/api/service/impl/DeInOrderExportService.java
  100. 0 0
      project/ocs/src/main/java/com/it/ocs/api/service/impl/DeInOrderServiceImpl.java

+ 1 - 0
manage

@@ -0,0 +1 @@
+Subproject commit 2210e8794f718bddb52a87ef8915c94e2dc7cfc3

+ 51 - 0
project/ocs/.classpath

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/user"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/commons-codec-1.11.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/commons-logging-1.2.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/fluent-hc-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpclient-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpclient-cache-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpclient-osgi-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpclient-win-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpcore-4.4.11.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/httpmime-4.5.8.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/jna-4.5.2.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/httpcomponents-client-4.5.8/lib/jna-platform-4.5.2.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/commons-codec-1.6.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/commons-logging-api-1.1.1.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/httpclient-4.2.3.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/httpcore-4.2.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/MWSClientJavaRuntime-1.0.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/dist/MWSOrders_2013-09-01_v2018-10-31.jar"/>
+	<classpathentry kind="lib" path="D:/work/jar/report/dist/MaWSJavaClientLibrary-1.1.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 48 - 0
project/ocs/.project

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ocs</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.springframework.ide.eclipse.core.springbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.springframework.ide.eclipse.core.springnature</nature>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>

+ 13 - 0
project/ocs/.settings/.jsdtscope

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/webapp"/>
+	<classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="target/m2e-wtp/web-resources"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>

+ 4 - 0
project/ocs/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding/<project>=UTF-8

+ 13 - 0
project/ocs/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8

+ 4 - 0
project/ocs/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 5 - 0
project/ocs/.settings/org.eclipse.m2e.wtp.prefs

@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.m2e.wtp.ear.applicationXmlInBuilDir=false
+org.eclipse.m2e.wtp.enableM2eWtp=true
+org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=true
+org.eclipse.m2e.wtp.war.archiverFilesInBuilDir=true

+ 10 - 0
project/ocs/.settings/org.eclipse.wst.common.component

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="ocs">
+        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
+        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+        <property name="context-root" value="ocs"/>
+        <property name="java-output-path" value="/ocs/target/classes"/>
+    </wb-module>
+</project-modules>

+ 7 - 0
project/ocs/.settings/org.eclipse.wst.common.project.facet.core.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <fixed facet="wst.jsdt.web"/>
+  <installed facet="java" version="1.8"/>
+  <installed facet="jst.web" version="3.0"/>
+  <installed facet="wst.jsdt.web" version="1.0"/>
+</faceted-project>

+ 1 - 0
project/ocs/.settings/org.eclipse.wst.jsdt.ui.superType.container

@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary

+ 1 - 0
project/ocs/.settings/org.eclipse.wst.jsdt.ui.superType.name

@@ -0,0 +1 @@
+Window

+ 9 - 0
project/ocs/.settings/org.eclipse.wst.validation.prefs

@@ -0,0 +1,9 @@
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorList
+USER_MANUAL_PREFERENCE=enabledManualValidatorList
+USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.700.v201508251749
+disabled=06target
+eclipse.preferences.version=1
+override=true
+suspend=false
+vf.version=3

+ 469 - 0
project/ocs/pom.xml

@@ -0,0 +1,469 @@
+<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/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.it.le</groupId>
+	<artifactId>ocs</artifactId>
+	<packaging>war</packaging>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>ocs Maven Webapp</name>
+	<url>http://maven.apache.org</url>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<encoding>UTF-8</encoding>
+		<java.version>1.8</java.version>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<commons-lang3.version>3.1</commons-lang3.version>
+	</properties>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-beans</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-tx</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.mybatis</groupId>
+			<artifactId>mybatis</artifactId>
+			<version>3.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mybatis</groupId>
+			<artifactId>mybatis-spring</artifactId>
+			<version>1.2.0</version>
+		</dependency>
+		<!-- <dependency> <groupId>com.oracle</groupId> <artifactId>oracle-connector-java</artifactId> 
+			<version>10.2.0.1.0</version> </dependency> -->
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>6.0.5</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid</artifactId>
+			<version>0.2.23</version>
+		</dependency>
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjweaver</artifactId>
+			<version>1.7.3</version>
+		</dependency>
+		<!-- <dependency> <groupId>org.freemaker.shiro</groupId> <artifactId>shiro-freemaker</artifactId> 
+			<version>1.0</version> </dependency> -->
+		<dependency>
+			<groupId>net.mingsoft</groupId>
+			<artifactId>shiro-freemarker-tags</artifactId>
+			<version>0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.codehaus.jackson</groupId>
+			<artifactId>jackson-mapper-asl</artifactId>
+			<version>1.9.12</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<version>3.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>4.2.5.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.freemarker</groupId>
+			<artifactId>freemarker</artifactId>
+			<version>2.3.20</version>
+		</dependency>
+		<dependency>
+			<groupId>opensymphony</groupId>
+			<artifactId>sitemesh</artifactId>
+			<version>2.4.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.7.24</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jcl-over-slf4j</artifactId>
+			<version>1.7.24</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.7.24</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<version>1.5.2</version>
+		</dependency>
+		<dependency>
+			<groupId>net.fckeditor</groupId>
+			<artifactId>java-core</artifactId>
+			<version>2.4.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jsoup</groupId>
+			<artifactId>jsoup</artifactId>
+			<version>1.7.2</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>jstl</artifactId>
+			<version>1.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.shiro</groupId>
+			<artifactId>shiro-core</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.shiro</groupId>
+			<artifactId>shiro-web</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.shiro</groupId>
+			<artifactId>shiro-spring</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml-schemas</artifactId>
+			<version>3.9</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi</artifactId>
+			<version>3.9</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.9</version>
+		</dependency>
+		<!-- 分页插件 -->
+		<dependency>
+			<groupId>com.github.pagehelper</groupId>
+			<artifactId>pagehelper</artifactId>
+			<version>4.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.validation</groupId>
+			<artifactId>validation-api</artifactId>
+			<version>1.1.0.Final</version>
+		</dependency>
+		<!-- <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> 
+			<version>1.8.5</version> </dependency> -->
+		<dependency>
+			<groupId>net.sf.json-lib</groupId>
+			<artifactId>json-lib-ext-spring</artifactId>
+			<version>1.0.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>16.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-core</artifactId>
+			<version>2.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-annotations</artifactId>
+			<version>2.1.0</version>
+		</dependency>
+		<!-- fastjson -->
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.13</version>
+		</dependency>
+		<!-- ebay sdk 所需的第三方maven依赖 -->
+		<!-- <dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>activation</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>ebaycalls</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>ebaysdkcore</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>fastInfoset</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>helper</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>httpClient</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jakartaoro</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxbapi</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxbimpl</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxbxjc</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxwsapi</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxwsrt</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jaxwstools</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jsr173api</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jsr181api</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>jsr250api</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>log4j</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>mimepull</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>resolver</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>saajapi</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>saajimpl</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>serializer</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>sjsxp</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>slf4japi</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>slf4jlog4j</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>staxex</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>streambuffer</classifier> </dependency> 
+			<dependency> <groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>xalan</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> <classifier>xalan</classifier> </dependency> <dependency> 
+			<groupId>com.it.ocs.ebay.finding</groupId> <artifactId>developer-sdk</artifactId> 
+			<version>1.0</version> </dependency> -->
+		<!-- xml解析包 -->
+		<!-- https://mvnrepository.com/artifact/org.jdom/jdom -->
+		<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>1.6.1</version>
+		</dependency>
+		<!-- <dependency> <groupId>com.it.ocs</groupId> <artifactId>jaxen</artifactId> 
+			<version>1.16</version> </dependency> <dependency> <groupId>com.it.ocs</groupId> 
+			<artifactId>xom</artifactId> <version>1.1</version> </dependency> -->
+		<!-- mysql 驱动 -->
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.18</version>
+		</dependency>
+		<!-- <dependency> <groupId>com.amazonservices.mws</groupId> <artifactId>MWSClientJavaRuntime</artifactId> 
+			<version>1.0</version> </dependency> <dependency> <groupId>org.apache.http</groupId> 
+			<artifactId>httpclient</artifactId> <version>4.2.3</version> </dependency> 
+			<dependency> <groupId>org.apache.http</groupId> <artifactId>httpcore</artifactId> 
+			<version>4.2</version> </dependency> <dependency> <groupId>org.apache.http</groupId> 
+			<artifactId>httpclient</artifactId> <version>4.2.3</version> </dependency> -->
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.5.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-mongodb</artifactId>
+			<version>1.10.6.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mongodb</groupId>
+			<artifactId>mongo-java-driver</artifactId>
+			<version>3.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.quartz-scheduler</groupId>
+			<artifactId>quartz</artifactId>
+			<version>2.3.1</version>
+		</dependency>
+		<!-- <dependency> <groupId>com.amazonservices.mws</groupId> <artifactId>MWSOrders_2013-09-01_v2017-02-22</artifactId> 
+			<version>2013-09-01_v2017-02-22</version> </dependency> <dependency> <groupId>com.amazonservices.mws</groupId> 
+			<artifactId>MaWSJavaClientLibrary</artifactId> <version>1.1</version> </dependency> 
+			<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> 
+			<version>2.21</version> </dependency> <dependency> <groupId>com.walmart.marketplace</groupId> 
+			<artifactId>digitalSignatureUtil</artifactId> <version>1.0.0</version> </dependency> 
+			<dependency> <groupId>com.aopalliance</groupId> <artifactId>aopalliance</artifactId> 
+			<version>1.0</version> </dependency> -->
+		<!-- XML解析 -->
+		<!-- <dependency> <groupId>com.it.ocs.xml</groupId> <artifactId>jsoup</artifactId> 
+			<version>1.10.2</version> </dependency> <dependency> <groupId>com.it.ocs.xml</groupId> 
+			<artifactId>jsoup-1.10.2-javadoc</artifactId> <version>1.10.2</version> <classifier>javadoc</classifier> 
+			</dependency> <dependency> <groupId>com.it.ocs.xml</groupId> <artifactId>jsoup-1.10.2-sources</artifactId> 
+			<version>1.0</version> <classifier>sources</classifier> </dependency> -->
+		<dependency>
+			<groupId>com.paypal.sdk</groupId>
+			<artifactId>rest-api-sdk</artifactId>
+			<version>1.14.0</version>
+		</dependency><!-- <dependency> <groupId>com.paypal.sdk</groupId> <artifactId>paypal-core</artifactId> 
+			<version>LATEST</version> </dependency> -->
+		<dependency>
+			<groupId>com.paypal.sdk</groupId>
+			<artifactId>merchantsdk</artifactId>
+			<version>2.15.122</version>
+		</dependency>
+		<dependency>
+			<groupId>com.braintreepayments.gateway</groupId>
+			<artifactId>braintree-java</artifactId>
+			<version>2.74.0</version>
+		</dependency>
+		<!-- FTPClient依赖 -->
+		<dependency>
+			<groupId>com.jcraft</groupId>
+			<artifactId>jsch</artifactId>
+			<version>0.1.49</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-httpclient</groupId>
+			<artifactId>commons-httpclient</artifactId>
+			<version>3.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>${commons-lang3.version}</version>
+		</dependency>
+
+		<!-- html parser -->
+		<dependency>
+			<groupId>org.jsoup</groupId>
+			<artifactId>jsoup</artifactId>
+			<version>1.7.3</version>
+		</dependency>
+		<!-- 亚马逊jar本地依赖 -->
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>commons-codec</artifactId>
+			<version>1.6</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>commons-logging-api</artifactId>
+			<version>1.1.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.2.3</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>httpcore</artifactId>
+			<version>4.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>MWSClientJavaRuntime</artifactId>
+			<version>1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>MWSOrders_2013-09-01_v2018-10-31</artifactId>
+			<version>1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazon</groupId>
+			<artifactId>MaWSJavaClientLibrary</artifactId>
+			<version>1.1</version>
+		</dependency>
+		<!-- <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> 
+			<version>1.6.0</version> </dependency> -->
+		<dependency>
+			<groupId>javax.mail</groupId>
+			<artifactId>mail</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.mail </groupId>
+			<artifactId>javax.mail </artifactId>
+			<version>1.5.4 </version>
+		</dependency>
+	</dependencies>
+	<profiles>
+		<profile>
+			<id>jdk-1.8</id>
+			<!-- 另外一种激活方式 -->
+			<activation>
+				<activeByDefault>true</activeByDefault>
+				<jdk>1.8</jdk>
+			</activation>
+			<properties>
+				<maven.compiler.source>1.8</maven.compiler.source>
+				<maven.compiler.target>1.8</maven.compiler.target>
+				<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
+			</properties>
+		</profile>
+	</profiles>
+	<build>
+		<finalName>ocs</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<failOnMissingWebXml>false</failOnMissingWebXml>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>

+ 52 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/controller/AdvertisementFeaturesController.java

@@ -0,0 +1,52 @@
+package com.it.ocs.advertisementFeatures.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.advertisementFeatures.service.IAdvertisementFeaturesService;
+import com.it.ocs.advertisementFeatures.vo.AdvertisingFeaturesVo;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+/**
+ * 广告特色控制层
+ * @author yecaiqing
+ *
+ */
+@Controller
+@RequestMapping("/advertisementFeatures")
+public class AdvertisementFeaturesController {
+
+	@Autowired
+	private IAdvertisementFeaturesService advertisementFeaturesService;
+	
+	//跳转到广告特色主页
+	@RequestMapping("/tolist")
+	public String skipList() {
+		return "admin/advertisementFeatures/list";
+	}
+	
+	//查找所有的
+	@RequestMapping("/findAll")
+	public @ResponseBody ResponseResult<AdvertisingFeaturesVo> findAll(RequestParam param) {
+		ResponseResult<AdvertisingFeaturesVo> pageResult = advertisementFeaturesService.findAll(param);
+		
+		return pageResult;
+	}
+	
+	//添加和修改
+	@RequestMapping("/saveEdit")
+	public @ResponseBody OperationResult saveEdit(AdvertisingFeaturesVo featuresVo) {
+		
+		return advertisementFeaturesService.saveEditAdvertisingFeatures(featuresVo);
+	}
+	
+	@RequestMapping("/remove")
+	public @ResponseBody OperationResult removeAdvertisingFeatures(String ids) {
+		return advertisementFeaturesService.removeAdvertisingFeatures(ids);
+	}
+	
+}

+ 11 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/dao/IAdvertisementFeaturesDao.java

@@ -0,0 +1,11 @@
+package com.it.ocs.advertisementFeatures.dao;
+
+import org.springframework.stereotype.Repository;
+
+import com.it.ocs.advertisementFeatures.model.AdvertisingFeaturesModel;
+import com.it.ocs.common.dao.IBaseDAO;
+
+@Repository
+public interface IAdvertisementFeaturesDao extends IBaseDAO<AdvertisingFeaturesModel> {
+
+}

+ 39 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/model/AdvertisingFeaturesModel.java

@@ -0,0 +1,39 @@
+package com.it.ocs.advertisementFeatures.model;
+
+import com.it.ocs.common.model.BaseModel;
+
+//广告特色实体类
+public class AdvertisingFeaturesModel extends BaseModel {
+
+	// 站点
+	private Long siteId;
+	// 特色属性
+	private String featureProperty;
+	// 站点图片地址
+	private String ico;
+
+	public String getIco() {
+		return ico;
+	}
+
+	public void setIco(String ico) {
+		this.ico = ico;
+	}
+
+	public Long getSiteId() {
+		return siteId;
+	}
+
+	public void setSiteId(Long siteId) {
+		this.siteId = siteId;
+	}
+
+	public String getFeatureProperty() {
+		return featureProperty;
+	}
+
+	public void setFeatureProperty(String featureProperty) {
+		this.featureProperty = featureProperty;
+	}
+
+}

+ 31 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/service/IAdvertisementFeaturesService.java

@@ -0,0 +1,31 @@
+package com.it.ocs.advertisementFeatures.service;
+
+import com.it.ocs.advertisementFeatures.vo.AdvertisingFeaturesVo;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+public interface IAdvertisementFeaturesService {
+	
+	/**
+	 * 分页查询
+	 * @param param
+	 * @return
+	 */
+	ResponseResult<AdvertisingFeaturesVo> findAll(RequestParam param);
+
+	/**
+	 * 保存,修改广告特色
+	 * @param featuresVo
+	 * @return
+	 */
+	OperationResult saveEditAdvertisingFeatures(AdvertisingFeaturesVo featuresVo);
+	
+	/**
+	 * 逻辑删除
+	 * @param ids 要删除的id
+	 * @return
+	 */
+	OperationResult removeAdvertisingFeatures(String ids);
+	
+}

+ 84 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/service/impl/AdvertisementFeaturesService.java

@@ -0,0 +1,84 @@
+package com.it.ocs.advertisementFeatures.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.it.ocs.advertisementFeatures.dao.IAdvertisementFeaturesDao;
+import com.it.ocs.advertisementFeatures.model.AdvertisingFeaturesModel;
+import com.it.ocs.advertisementFeatures.service.IAdvertisementFeaturesService;
+import com.it.ocs.advertisementFeatures.vo.AdvertisingFeaturesVo;
+import com.it.ocs.common.BeanConvertUtil;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+import com.it.ocs.common.service.BaseService;
+import com.it.ocs.common.util.CollectionUtil;
+
+@Service
+@Transactional
+public class AdvertisementFeaturesService extends BaseService implements IAdvertisementFeaturesService {
+
+	@Autowired
+	private IAdvertisementFeaturesDao advertisementFeaturesDao;
+
+	@Override
+	public ResponseResult<AdvertisingFeaturesVo> findAll(RequestParam param) {
+		ResponseResult<AdvertisingFeaturesVo> result = new ResponseResult<>();
+
+		AdvertisingFeaturesVo features = BeanConvertUtil.mapToObject(param.getParam(), AdvertisingFeaturesVo.class);
+
+		List<AdvertisingFeaturesModel> models = advertisementFeaturesDao.queryByPage(features, param.getStartRow(),
+				param.getEndRow());
+
+		List<AdvertisingFeaturesVo> vos = CollectionUtil.beansConvert(models, AdvertisingFeaturesVo.class);
+
+		int total = advertisementFeaturesDao.count(features);
+
+		result.setRows(vos);
+
+		result.setTotal(total);
+
+		return result;
+	}
+
+	@Override
+	public OperationResult saveEditAdvertisingFeatures(AdvertisingFeaturesVo featuresVo) {
+		OperationResult result = new OperationResult();
+		try {
+			if (featuresVo.getId() == null) {
+				insertInit(featuresVo);
+				advertisementFeaturesDao.add(featuresVo);
+			} else {
+				updateInit(featuresVo);
+				advertisementFeaturesDao.update(featuresVo);
+			}
+		} catch (Exception e) {
+			result.setErrorCode(1);
+			result.setDescription("操作失败");
+			throw new RuntimeException();
+		}
+		return result;
+	}
+
+	@Override
+	public OperationResult removeAdvertisingFeatures(String ids) {
+		OperationResult result = new OperationResult();
+		try {
+			String[] split = ids.split(",");
+			for (String id : split) {
+				AdvertisingFeaturesVo model = (AdvertisingFeaturesVo) advertisementFeaturesDao.getById(new Long(id));
+				updateInit(model);
+				model.setEnabledFlag("N");
+				advertisementFeaturesDao.update(model);
+			}
+		} catch (Exception e) {
+			result.setErrorCode(1);
+			result.setDescription("删除失败");
+			throw new RuntimeException();
+		}
+		return result;
+	}
+}

+ 14 - 0
project/ocs/src/main/java/com/it/ocs/advertisementFeatures/vo/AdvertisingFeaturesVo.java

@@ -0,0 +1,14 @@
+package com.it.ocs.advertisementFeatures.vo;
+
+import java.io.Serializable;
+
+import com.it.ocs.advertisementFeatures.model.AdvertisingFeaturesModel;
+
+public class AdvertisingFeaturesVo extends AdvertisingFeaturesModel implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7687296368194803472L;
+
+}

+ 212 - 0
project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonHttpClient.java

@@ -0,0 +1,212 @@
+package com.it.ocs.amazon.common;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.protocol.ClientContext;
+import org.apache.http.conn.params.ConnRoutePNames;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.PoolingClientConnectionManager;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.protocol.BasicHttpContext;
+
+import com.amazonaws.mws.MarketplaceWebServiceClient;
+import com.amazonaws.mws.model.GetReportRequestListRequest;
+import com.amazonaws.mws.model.GetReportRequestListResponse;
+import com.amazonservices.mws.client.MwsUtl;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+import com.it.ocs.amazon.order.AmazonRequest;
+import com.it.ocs.amazon.order.GetAmazonClient;
+import com.it.ocs.amazon.utils.AmazonUtils;
+
+public class AmazonHttpClient {
+	private String action;
+	private String version;
+	private String timestamp;
+	private String aWSAccessKeyId;
+	private static URI uri;
+	private Map<String, String> headers;
+	private String userAgent = "ocs/1.0 (Language=zh_CN)";
+
+	private void addRequiredParametersToRequest(HttpPost request) {
+
+		action = "ListOrders";
+		version = "2";
+		aWSAccessKeyId = "AKIAJAQWT7A5XPYZ3ANA";
+		Map<String, String> parameters = new TreeMap<String, String>();
+		parameters.put("Action", "ListOrders");
+		parameters.put("Version", "2013-09-01");
+		parameters.put("Timestamp", AmazonUtils.getFormattedTimestamp());
+		parameters.put("AWSAccessKeyId", aWSAccessKeyId);
+		parameters.put("MarketplaceId.Id.1", "A2EUQ1WTGCTBG2");
+		parameters.put("MWSAuthToken", "YCFXlCQ+0PRE5bs1a/b7DHAN/6w0TN3AiprhuKZ7");
+		parameters.put("SellerId", "A3W1ARFCWJR0HL");
+		//parameters.put("SignatureVersion", "2");
+		parameters.put("LastUpdatedAfter", "2017-08-31T16:00:00Z");
+		parameters.put("LastUpdatedBefore", "2017-09-03T16:00:00Z");
+		String signature = AmazonUtils.signParameters(uri, version, action, parameters, aWSAccessKeyId);
+		parameters.put("Signature", signature);
+		//parameters.put("SignatureMethod", "HmacSHA256");
+		List<NameValuePair> parameterList = new ArrayList<NameValuePair>();
+		for (Entry<String, String> entry : parameters.entrySet()) {
+			String key = entry.getKey();
+			String value = entry.getValue();
+			if (!(key == null || key.equals("") || value == null || value.equals(""))) {
+				parameterList.add(new BasicNameValuePair(key, value));
+			}
+		}
+		try {
+			request.setEntity(new UrlEncodedFormEntity(parameterList, "UTF-8"));
+		} catch (Exception e) {
+			throw MwsUtl.wrap(e);
+		}
+	}
+
+	private HttpPost createRequest() {
+		HttpPost request = new HttpPost(uri);
+		try {
+			request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
+			request.addHeader("X-Amazon-User-Agent", userAgent);
+			/*
+			 * headers = Collections.unmodifiableMap(headers); for
+			 * (Map.Entry<String, String> header : headers.entrySet()) {
+			 * request.addHeader(header.getKey(), header.getValue()); }
+			 */
+			addRequiredParametersToRequest(request);
+		} catch (Exception e) {
+			request.releaseConnection();
+			e.printStackTrace();
+		}
+		return request;
+	}
+
+	private void executeRequest(HttpPost request){
+		try {
+
+	        BasicHttpParams httpParams = new BasicHttpParams();
+	        httpParams.setParameter(CoreProtocolPNames.USER_AGENT, userAgent);
+	        HttpConnectionParams.setConnectionTimeout(httpParams, 50000);
+	        HttpConnectionParams.setSoTimeout(httpParams, 50000);
+	        HttpConnectionParams.setStaleCheckingEnabled(httpParams, true);
+	        HttpConnectionParams.setTcpNoDelay(httpParams, true);
+
+			HttpClient httpClient = new DefaultHttpClient(httpParams);
+			/*if (proxyHost != null && proxyPort != 0) {
+				String scheme = AmazonUtils.usesHttps(uri) ? "https" : "http";
+				HttpHost hostConfiguration = new HttpHost(proxyHost, 443, scheme);
+				httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, hostConfiguration);
+			}*/
+			HttpResponse response = httpClient.execute(request);
+			StatusLine statusLine = response.getStatusLine();
+			int status = statusLine.getStatusCode();
+			String message = statusLine.getReasonPhrase();
+		
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	private String getResponseBody(HttpResponse postResponse) {
+		InputStream input = null;
+		try {
+			input = postResponse.getEntity().getContent();
+			Reader reader = new InputStreamReader(input, AmazonUtils.DEFAULT_ENCODING);
+			StringBuilder b = new StringBuilder();
+			char[] c = new char[1024];
+			int len;
+			while (0 < (len = reader.read(c))) {
+				b.append(c, 0, len);
+			}
+			return b.toString();
+		} catch (Exception e) {
+			throw MwsUtl.wrap(e);
+		} finally {
+			MwsUtl.close(input);
+		}
+	}
+
+	/*public static void main(String[] args) {
+		try {
+			uri = new URI("https://mws.amazonservices.com/Orders/2013-09-01");
+		} catch (URISyntaxException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+		AmazonHttpClient ama = new AmazonHttpClient();
+		try {
+			ama.executeRequest(ama.createRequest());
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}*/
+	public static void main(String[] args) throws Exception {
+		/*MwsConnection connection = new MwsConnection();
+		connection.setAwsAccessKeyId("AKIAJKN2XEOEH4DE4NEQ");
+        connection.setAwsSecretKeyId("HlO24NtOL4BW4jiHI+xtug61gaNZweOLadWhhPlA");
+        connection.setApplicationName("ocs");//"ocs", "1.0"
+        connection.setApplicationVersion("1.0");
+        connection.setLibraryVersion("2017-02-22");
+        connection.setConnectionTimeout(5000);
+        connection.setSocketTimeout(5000);
+        connection.setSignatureVersion("2");
+        connection.setSignatureMethod("HmacSHA256");
+        URI fullURI = URI.create("https://mws.amazonservices.com/");
+        URI partialURI = new URI(fullURI.getScheme(), null, fullURI.getHost(), fullURI.getPort(), null, null, null);
+        connection.setEndpoint(partialURI);
+        RequestModel request = new RequestModel();
+        request.setSellerId("AAF37WJS3P6BT");
+        connection.call(new AmazonRequestType("GetReportRequestList",HashMap.class , "?GetReportRequestList/2013-09-01"), request);*/
+        
+        
+       /* AmazonRequestMode requestMode = new AmazonRequestMode();
+		requestMode.setServiceURL("https://mws.amazonservices.com/");
+		requestMode.setAccessKey("AKIAJKN2XEOEH4DE4NEQ");//"AKIAIQJPPHYX7ZMKPTNQ"
+		requestMode.setSecretKey("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");//"oreVInCN3zs+gEdjUmxuVXRIAre+EQf6aLQh6OFS"
+		requestMode.setSellerId("AAF37WJS3P6BT");//AV7KSH7XB8RNM
+        List list = new ArrayList();
+        list.add("ATVPDKIKX0DER");
+		requestMode.setMarketplaceId(list);
+        
+        MarketplaceWebServiceOrdersClient client = GetAmazonClient.createClient(requestMode);
+        ListOrdersRequest request1 = AmazonRequest.createOrderRequest(requestMode,1);
+        // Make the call.
+        String responseXML = AmazonClientRun.invokeListOrders(client, request1);*/
+		AmazonRequestMode requestMode = new AmazonRequestMode();
+		requestMode.setServiceURL("https://mws.amazonservices.com/");
+		requestMode.setAccessKey("AKIAJKN2XEOEH4DE4NEQ");//"AKIAIQJPPHYX7ZMKPTNQ"
+		requestMode.setSecretKey("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");//"oreVInCN3zs+gEdjUmxuVXRIAre+EQf6aLQh6OFS"
+		requestMode.setSellerId("AAF37WJS3P6BT");//AV7KSH7XB8RNM
+        List list = new ArrayList();
+        list.add("ATVPDKIKX0DER");
+		requestMode.setMarketplaceId(list);
+		MarketplaceWebServiceClient client = GetAmazonClient.createReportClient(requestMode);
+		GetReportRequestListRequest request = AmazonRequest.createReportRequestListRequest(requestMode);
+		GetReportRequestListResponse response = client.getReportRequestList(request);
+
+	}
+	
+	
+
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3439 - 0
project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonReportServiceClient.java


+ 155 - 0
project/ocs/src/main/java/com/it/ocs/amazon/common/AmazonSignature.java

@@ -0,0 +1,155 @@
+package com.it.ocs.amazon.common;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.security.SignatureException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TimeZone;
+import java.util.TreeMap;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.protocol.HTTP;
+import org.apache.log4j.Logger;
+
+/**
+ * amazon 签名服务类
+ * @author chenyong
+ *
+ */
+public class AmazonSignature {
+	private final static Logger log = Logger.getLogger(AmazonSignature.class);
+	public static final String CHARACTER_ENCODING = "UTF-8";
+	public final static String ALGORITHM = "HmacSHA256";
+
+	/**
+	 * 生成签名字符串
+	 * @param parameters
+	 * @param awsSecretAccessKey
+	 * @param url
+	 * @return
+	 * @throws SignatureException
+	 */
+	public static String signParameters(Map<String, String> parameters, String awsSecretAccessKey,String url) throws SignatureException {
+		String stringToSign  = calculateStringToSignV2(parameters,url);
+		return calculateRFC2104HMAC(stringToSign,awsSecretAccessKey);
+	}
+
+
+	
+	 /**
+	 * 签名
+     * Computes RFC 2104-compliant HMAC signature.
+     * * @param data
+     * The signed data.
+     * @param key
+     * The signing key.
+     * @return
+     * The Base64-encoded RFC 2104-compliant HMAC signature.
+     * @throws
+     * java.security.SignatureException when signature generation fails
+     */
+    public static String calculateRFC2104HMAC(String data, String key)throws java.security.SignatureException{
+        String result;
+        try {
+            // Get an hmac_sha256 key from the raw key bytes.
+            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF8"), ALGORITHM);
+            // Get an hmac_sha256 Mac instance and initialize with the signing key.
+            Mac mac = Mac.getInstance(ALGORITHM);
+            mac.init(signingKey);
+            // Compute the hmac on input data bytes.
+            byte[] rawHmac = mac.doFinal(data.getBytes("UTF8"));
+            // Base64-encode the hmac by using the utility in the SDK
+            result = new String(Base64.encodeBase64(rawHmac),"UTF8");//BinaryUtils.toBase64(rawHmac);
+        } catch (Exception e) {
+            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
+        }
+        return result;
+    }
+	
+    /**
+     * 签名前参数格式化
+     * @param parameters
+     * @param url
+     * @return
+     */
+	private static String calculateStringToSignV2(Map<String, String> parameters,String url) {
+		StringBuilder data = new StringBuilder();
+		data.append("POST");
+		data.append("\n");
+		URI endpoint = null;
+		try {
+			endpoint = new URI(url);
+		} catch (URISyntaxException ex) {
+			log.error("URI Syntax Exception,解析url地址失败", ex);
+			throw new RuntimeException();
+		}
+		data.append(endpoint.getHost());
+		data.append("\n");
+		String uri = endpoint.getPath();
+		if (uri == null || uri.length() == 0) {
+			uri = "/";
+		}
+		data.append(uri);
+		data.append("\n");
+		Map<String, String> sorted = new TreeMap<String, String>();
+		sorted.putAll(parameters);
+		Iterator<Map.Entry<String, String>> pairs = sorted.entrySet().iterator();
+		while (pairs.hasNext()) {
+			Map.Entry<String, String> pair = pairs.next();
+			String key = pair.getKey();
+			data.append(key);
+			data.append("=");
+			String value = pair.getValue();
+			data.append(urlEncode(value));
+			if (pairs.hasNext()) {
+				data.append("&");
+			}
+		}
+		log.info(data.toString());
+		return data.toString();
+	}
+	/**
+	 * url编码
+	 * @param rawValue
+	 * @return
+	 */
+	private static String urlEncode(String rawValue) {
+		String value = rawValue == null ? "" : rawValue;
+		String encoded = null;
+		try {
+			encoded = URLEncoder.encode(value, CHARACTER_ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E","~");
+		} catch (UnsupportedEncodingException ex) {
+			log.error("Unsupported Encoding Exception", ex);
+			throw new RuntimeException(ex);
+		}
+		return encoded;
+	}
+}

+ 39 - 0
project/ocs/src/main/java/com/it/ocs/amazon/controller/AmazonReportController.java

@@ -0,0 +1,39 @@
+package com.it.ocs.amazon.controller;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.amazon.model.OrderReportVO;
+import com.it.ocs.amazon.service.IAmazonOrderReportService;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+import com.it.ocs.publication.vo.ComboBoxVO;
+
+@Controller
+@RequestMapping("/amazonReport")
+public class AmazonReportController {
+	@Autowired
+	private IAmazonOrderReportService amazonOrderReportService;
+	
+	@RequestMapping("/show")
+	public String show() {
+		return "admin/salesStatistics/amazonOrderReport";
+	}
+	
+	@RequestMapping(value="/list")
+	@ResponseBody 
+	public ResponseResult<OrderReportVO> findOrderReportList(RequestParam param){  
+		return amazonOrderReportService.findOrderReportList(param);
+	}
+	
+	@RequestMapping("/getOrderTypeBySite")
+	@ResponseBody
+	public List<ComboBoxVO> getOrderTypeBySite(String site){
+		return amazonOrderReportService.getOrderTypeBySite(site);
+	}
+}

+ 29 - 0
project/ocs/src/main/java/com/it/ocs/amazon/controller/FBAInventoryReportController.java

@@ -0,0 +1,29 @@
+package com.it.ocs.amazon.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.amazon.model.MyiUnsuppressedVO;
+import com.it.ocs.amazon.service.ReportDataSaveSupport;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+@Controller
+@RequestMapping("/fbainventory")
+public class FBAInventoryReportController {
+	@Autowired
+	private ReportDataSaveSupport reportDataSaveSupport;
+	
+	@RequestMapping("/index")
+	public String index() {
+		return "admin/fbainventory/myi_unsuppressed";
+	}
+	
+	@RequestMapping(value="/list")
+	@ResponseBody 
+	public ResponseResult<MyiUnsuppressedVO> findMyiUnsuppressed(RequestParam param){  
+		return reportDataSaveSupport.findMyiUnsuppressed(param);
+	}
+}

+ 4 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IAdjustmentInventoryDAO.java

@@ -0,0 +1,4 @@
+package com.it.ocs.amazon.dao;
+
+public interface IAdjustmentInventoryDAO extends IAmazonReportBaseDAO {
+}

+ 10 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonFinancialDAO.java

@@ -0,0 +1,10 @@
+package com.it.ocs.amazon.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface IAmazonFinancialDAO {
+	public List<Long> queryGeneratedReportId(@Param(value="site") String site,
+			@Param(value="startT") String startT,@Param(value="endT") String endT);
+}

+ 9 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonReportBaseDAO.java

@@ -0,0 +1,9 @@
+package com.it.ocs.amazon.dao;
+
+import java.util.Map;
+
+public interface IAmazonReportBaseDAO {
+	public void save(Map<String, Object> saveData);
+	
+	public void delByReportId(String reportGetId);
+}

+ 108 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IAmazonReportDao.java

@@ -0,0 +1,108 @@
+package com.it.ocs.amazon.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.it.ocs.amazon.model.ColumnData;
+import com.it.ocs.amazon.model.MyiUnsuppressedVO;
+import com.it.ocs.amazon.model.OrderReportVO;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.publication.vo.ComboBoxVO;
+
+public interface IAmazonReportDao {
+
+	public void saveData(Map<String, Object> request);
+	public ReportRequestListModel getUnaskRequestByTime(Map<String,String> map);
+	public ReportRequestListModel getLastDoneReportByParam(Map<String,String> map);
+
+	public List<ReportRequestListModel> getDownloadReportByAccount(String platform);
+
+	public void updateReportRequest(ReportRequestListModel request);
+
+	public int dataRangeReportMonthU(@Param(value="reportIds") List<String> reportIds,
+			@Param(value="site") String site,@Param(value="month") String month);
+	
+	public List<ReportRequestListModel> getParseReport(Map<String, Object> map);
+	
+	public List<ReportRequestListModel> getParsedReport(Map<String, String> map);
+
+	public List<ColumnData> getColumnData(Map<String,Object> map);
+
+	public String getPlatformBySite(String site);
+	
+	public int isExist(String orderId);
+
+	public void addOrderReport(Map<String, Object> data);
+
+	public void deleteReportDataById(String report_id);
+
+	public void updateParseStatus(ReportRequestListModel reportMode);
+
+	public int countOrderReport(@Param("param")Map<String, Object> map);
+
+	public List<OrderReportVO> queryOrderReportByPage(@Param("param")Map<String, Object> map, @Param("start")int startRow, @Param("end")int endRow);
+
+	public void updateRequestSite(ReportRequestListModel reportMode);
+
+	public ReportRequestListModel getParseStart(String site);
+
+	public ReportRequestListModel getNextParseReport(ReportRequestListModel reportMode);
+
+	public void addOrderReportException(ReportRequestListModel reportMode);
+
+	public int isBreakOff(Map map);
+
+	public String getEndTime(ReportRequestListModel reportMode);
+
+	public void chooseByRequestList(ReportRequestListModel reportMode);
+
+	public List<ReportRequestListModel> getExceptionTimeData(String site);
+
+	public List<ReportRequestListModel> getAllBetweenData(ReportRequestListModel reportMode);
+
+	public void updateReportExceptionStatus(ReportRequestListModel reportMode);
+
+	public List<Map<String, Object>> getExportDataByParam(@Param("param")Map<String, Object> map);
+
+	public List<Map<String, Object>> getAmazonChangeData();
+
+	public void countAmazonDataByCreateTime(Map<String, Object> map);
+	
+	public void countAmazonDataByUpdateTime(Map<String, Object> map);
+	
+	public void countAmazonDataByShipTime(Map<String, Object> map);
+
+	public List<ComboBoxVO> getOrderTypeBySite(String site);
+
+	public List<Map<String, Object>> getTotalByContry(@Param("param")Map<String, Object> map);
+
+	public List<Map<String, Object>> getTotalByType(@Param("param")Map<String, Object> map);
+
+	public int countThisReportData(String reportGetId);
+
+	public void saveRequest(@Param("request") Map<String, Object> request);
+	
+	public void deleteInventoryReportDataById(String reportGetId);
+
+	public void inventorySave(Map<String, Object> data);
+
+	public int countThisInventoryReportData(String reportGetId);
+
+	public int countMyiUnsuppressed(@Param("param") Map<String, Object> map);
+
+	public void deleteInventoryReservedReportDataById(String reportGetId);
+
+	public int countThisInventoryReservedReportData(String reportGetId);
+
+	public void inventoryReservedSave(Map<String, Object> saveData);
+
+	public List<MyiUnsuppressedVO> findMyiUnsuppressed(@Param("param")Map<String, Object> map, @Param("start")int startRow, @Param("end")int endRow);
+	
+	public List<Map<String, Object>> getMyiUnsuppressedExportData(@Param("param")Map<String, Object> map);
+
+	public void refreshReportUKSiste();
+	
+	public void refreshReservedUKSiste();
+}

+ 5 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/ICustomerReturnDAO.java

@@ -0,0 +1,5 @@
+package com.it.ocs.amazon.dao;
+
+public interface ICustomerReturnDAO extends IAmazonReportBaseDAO {
+
+}

+ 5 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/ICustomerShipmentDAO.java

@@ -0,0 +1,5 @@
+package com.it.ocs.amazon.dao;
+
+public interface ICustomerShipmentDAO extends IAmazonReportBaseDAO {
+
+}

+ 20 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IInboundShipmentDAO.java

@@ -0,0 +1,20 @@
+package com.it.ocs.amazon.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface IInboundShipmentDAO extends IAmazonReportBaseDAO {
+	public void add(@Param(value = "data") Map<String, Object> data);
+
+	public void batchAdd(List<Map<String, Object>> list);
+
+	public Map<String, Object> getByShipmentId(@Param(value = "shipmentId") String shipmentId);
+
+	public List<Map<String, Object>> getByShipmentIds(@Param(value = "list") List<String> shimentIds);
+
+	public Map<String, Object> getLastUpdate();
+
+	public int update(@Param(value = "data") Map<String, Object> data);
+}

+ 18 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IInboundShipmentDetailDAO.java

@@ -0,0 +1,18 @@
+package com.it.ocs.amazon.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface IInboundShipmentDetailDAO {
+	public List<Map<String,String>> getShipmentIds(@Param(value = "platform") String platform);
+
+	public int add(Map<String, Object> map);
+	
+	public int update(Map<String,Object> map);
+
+	public Map<String, Object> getShipIdSku(@Param(value = "shipmentId") String shipmentId,
+			@Param(value = "sku") String sku);
+
+}

+ 5 - 0
project/ocs/src/main/java/com/it/ocs/amazon/dao/IRemovalShipmentDAO.java

@@ -0,0 +1,5 @@
+package com.it.ocs.amazon.dao;
+
+public interface IRemovalShipmentDAO extends IAmazonReportBaseDAO {
+	
+}

+ 75 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonMyiUnsuppressedExportModel.java

@@ -0,0 +1,75 @@
+package com.it.ocs.amazon.model;
+
+import com.it.ocs.excel.annotation.ExcelLink;
+
+public class AmazonMyiUnsuppressedExportModel {
+
+	@ExcelLink(title = "request_created_at", index = -3)
+	private String request_created_at;
+	
+	@ExcelLink(title = "request_updated_at", index = -2)
+	private String request_updated_at;
+
+	@ExcelLink(title = "report_id", index = -1)
+	private String report_id;
+
+	@ExcelLink(title = "site", index = 0)
+	private String site;
+	
+	@ExcelLink(title = "sku", index = 1)
+	private String sku;
+	
+	@ExcelLink(title = "fnsku", index = 2)
+	private String fnsku;
+	
+	@ExcelLink(title = "asin", index = 3)
+	private String asin;
+	
+	@ExcelLink(title = "product_name", index = 4)
+	private String product_name;
+	
+	@ExcelLink(title = "condition", index = 5)
+	private String condition;
+	
+	@ExcelLink(title = "your_price", index = 6)
+	private String your_price;
+	
+	@ExcelLink(title = "mfn_listing_exists", index = 7)
+	private String mfn_listing_exists;
+	
+	@ExcelLink(title = "mfn_fulfillable_quantity", index = 8)
+	private String mfn_fulfillable_quantity;
+	
+	@ExcelLink(title = "afn_listing_exists", index = 9)
+	private String afn_listing_exists;
+	
+	@ExcelLink(title = "afn_warehouse_quantity", index = 10)
+	private String afn_warehouse_quantity;
+	
+	@ExcelLink(title = "afn_fulfillable_quantity", index = 11)
+	private String afn_fulfillable_quantity;
+	
+	@ExcelLink(title = "afn_unsellable_quantity", index = 12)
+	private String afn_unsellable_quantity;
+	
+	@ExcelLink(title = "afn_reserved_quantity", index = 13)
+	private String afn_reserved_quantity;
+	
+	@ExcelLink(title = "afn_total_quantity", index = 14)
+	private String afn_total_quantity;
+	
+	@ExcelLink(title = "per_unit_volume", index = 15)
+	private String per_unit_volume;
+	
+	@ExcelLink(title = "afn_inbound_working_quantity", index = 16)
+	private String afn_inbound_working_quantity;
+	
+	@ExcelLink(title = "afn_inbound_shipped_quantity", index = 17)
+	private String afn_inbound_shipped_quantity;
+	
+	@ExcelLink(title = "afn_inbound_receiving_quantity", index = 18)
+	private String afn_inbound_receiving_quantity;
+
+	@ExcelLink(title = "reserved_fc_transfers", index = 19)
+	private String reserved_fc_transfers;
+}

+ 52 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonReportExportModel.java

@@ -0,0 +1,52 @@
+package com.it.ocs.amazon.model;
+
+import com.it.ocs.excel.annotation.ExcelLink;
+
+public class AmazonReportExportModel {
+	@ExcelLink(title="data/time",index=0)
+	private String selfDate;
+	@ExcelLink(title="settlement id",index=1)
+    private String settlementId;
+	@ExcelLink(title="type",index=2)
+    private String type;
+	@ExcelLink(title="order id",index=3)
+    private String orderId;
+	@ExcelLink(title="sku",index=4)
+    private String sku;
+	@ExcelLink(title="description",index=5)
+    private String description;
+	@ExcelLink(title="quantity",index=6)
+    private String quantity;
+	@ExcelLink(title="marketplace",index=7)
+    private String marketplace;
+	@ExcelLink(title="fulfillment",index=8)
+    private String fulfillment;
+	@ExcelLink(title="order city",index=9)
+    private String orderCity;
+	@ExcelLink(title="order state",index=10)
+    private String orderState;
+	@ExcelLink(title="order postal",index=11)
+    private String orderPostal;
+	@ExcelLink(title="product sales",index=12)
+    private String productSales;
+	@ExcelLink(title="shipping credits",index=13)
+    private String shippingCredits;
+	@ExcelLink(title="gift wrap credits",index=14)
+    private String giftWrapCredits;
+	@ExcelLink(title="promotional rebates",index=15)
+    private String promotionalRebates;
+	@ExcelLink(title="sales tax collected",index=16)
+    private String salesTaxCollected;
+	@ExcelLink(title="selling fees",index=17)
+    private String sellingFees;
+	@ExcelLink(title="fba fees",index=18)
+    private String fbaFees;
+	@ExcelLink(title="other transaction fees",index=19)
+    private String otherTransactionFees;
+	@ExcelLink(title="other",index=20)
+    private String other;
+	@ExcelLink(title="total",index=21)
+    private String total;
+	@ExcelLink(title="platform",index=22)
+    private String platform;
+}

+ 181 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonRequestConfig.java

@@ -0,0 +1,181 @@
+package com.it.ocs.amazon.model;
+
+import java.security.SignatureException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+import com.it.ocs.amazon.common.AmazonSignature;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+
+/**
+ * 亚马逊请求参数
+ * @author chenyong
+ *
+ */
+public class AmazonRequestConfig {
+	
+	private String url;
+	private String action;
+	private String sellerId;
+	private String aWSAccessKeyId;
+	private String version;
+	private String signatureVersion = "2";
+	private String timestamp;
+	private String signature;
+	private String awsSecretAccessKey;
+	private String nextToken;
+	private String pageAction;
+	private Map<String, String> baseParameters;
+	private Map<String,String> queryParameters;
+	
+	public AmazonRequestConfig(){}
+	
+	/**
+	 * 
+	 * @param account 账号信息
+	 * @param action 方法名
+	 * @param version 版本
+	 */
+	public AmazonRequestConfig(AmazonAccountModel account,String action,String version){
+		this.url = account.getUrl();
+		this.sellerId = account.getSellerId();
+		this.aWSAccessKeyId = account.getAccessKey();
+		this.awsSecretAccessKey = account.getSecretKey();
+		this.action = action;
+		this.version = version;
+	}
+	
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getAction() {
+		return action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
+
+	public String getSellerId() {
+		return sellerId;
+	}
+
+	public void setSellerId(String sellerId) {
+		this.sellerId = sellerId;
+	}
+
+	public String getaWSAccessKeyId() {
+		return aWSAccessKeyId;
+	}
+
+	public void setaWSAccessKeyId(String aWSAccessKeyId) {
+		this.aWSAccessKeyId = aWSAccessKeyId;
+	}
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public String getSignatureVersion() {
+		return signatureVersion;
+	}
+
+	public void setSignatureVersion(String signatureVersion) {
+		this.signatureVersion = signatureVersion;
+	}
+
+	public String getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(String timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getSignature() {
+		return signature;
+	}
+
+	public void setSignature(String signature) {
+		this.signature = signature;
+	}
+
+	public String getAwsSecretAccessKey() {
+		return awsSecretAccessKey;
+	}
+
+	public void setAwsSecretAccessKey(String awsSecretAccessKey) {
+		this.awsSecretAccessKey = awsSecretAccessKey;
+	}
+
+	public Map<String, String> getBaseParameters() throws SignatureException {
+		Map<String, String> parameters = new HashMap<>();
+		if(null == this.nextToken){
+			parameters.put("Action", this.action);
+			//params.put("Marketplace", request.getMarketplace());
+			parameters.put("SellerId", this.sellerId);
+			parameters.put("AWSAccessKeyId", this.aWSAccessKeyId);
+			parameters.put("Version", this.version);
+			parameters.put("SignatureVersion", "2");
+			parameters.put("Timestamp",getFormattedTimestamp());
+			//接口请求参数
+			if(null != this.queryParameters){
+				for(Map.Entry<String, String> entry:this.queryParameters.entrySet()){
+					parameters.put(entry.getKey(), entry.getValue());
+				}
+			}
+			parameters.put("SignatureMethod", AmazonSignature.ALGORITHM);
+			parameters.put("Signature", AmazonSignature.signParameters(parameters, awsSecretAccessKey,this.url));
+			
+		}else{
+			parameters.put("Action", this.pageAction);
+			parameters.put("NextToken", this.nextToken);
+		}
+		return parameters;
+	}
+	
+	private String getFormattedTimestamp() {
+		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+		df.setTimeZone(TimeZone.getTimeZone("UTC"));
+		return df.format(new Date());
+	}
+
+	public Map<String, String> getQueryParameters() {
+		return queryParameters;
+	}
+
+	public void setQueryParameters(Map<String, String> queryParameters) {
+		this.queryParameters = queryParameters;
+	}
+
+	public String getNextToken() {
+		return nextToken;
+	}
+
+	public void setNextToken(String nextToken) {
+		this.nextToken = nextToken;
+	}
+
+	public String getPageAction() {
+		return pageAction;
+	}
+
+	public void setPageAction(String pageAction) {
+		this.pageAction = pageAction;
+	}
+	
+	
+	
+}

+ 127 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/AmazonRequestMode.java

@@ -0,0 +1,127 @@
+package com.it.ocs.amazon.model;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import com.it.ocs.amazon.utils.AmazonUtils;
+
+public class AmazonRequestMode {
+	private String serviceURL;
+	private String accessKey;
+	private String secretKey;
+	private String sellerId;
+	private String nextToken;
+	private List<String> marketplaceId;
+	private XMLGregorianCalendar createdAfter;
+	private XMLGregorianCalendar createdBefore;
+	private XMLGregorianCalendar updatedAfter;
+	private XMLGregorianCalendar updatedBefore;
+	private Map<String,Object> param;
+	public String getServiceURL() {
+		return serviceURL;
+	}
+	public void setServiceURL(String serviceURL) {
+		this.serviceURL = serviceURL;
+	}
+	public String getAccessKey() {
+		return accessKey;
+	}
+	public void setAccessKey(String accessKey) {
+		this.accessKey = accessKey;
+	}
+	public String getSecretKey() {
+		return secretKey;
+	}
+	public void setSecretKey(String secretKey) {
+		this.secretKey = secretKey;
+	}
+	public String getSellerId() {
+		return sellerId;
+	}
+	public void setSellerId(String sellerId) {
+		this.sellerId = sellerId;
+	}
+	public List<String> getMarketplaceId() {
+		return marketplaceId;
+	}
+	public void setMarketplaceId(List<String> marketplaceId) {
+		this.marketplaceId = marketplaceId;
+	}
+	public XMLGregorianCalendar getCreatedAfter() {
+		return createdAfter;
+	}
+	/**
+	 * YYYY-MM-ddTHH:MM:SS.000Z
+	 * @param createdAfter
+	 */
+	public void setCreatedAfter(String createdAfter) {
+		this.createdAfter = formateXMLGregorianCalendar(createdAfter);
+	}
+	public XMLGregorianCalendar getCreatedBefore() {
+		return createdBefore;
+	}
+	public void setCreatedBefore(String createdBefore) {
+		this.createdBefore = formateXMLGregorianCalendar(createdBefore);
+	}
+	public static int toInt(String intStr){
+		return Integer.parseInt(intStr);
+	}
+	public static XMLGregorianCalendar formateXMLGregorianCalendar(String dateTimeStr){
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+		try {
+			Date da = format.parse(dateTimeStr);
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(da);
+			cal.add(Calendar.MINUTE, -2);
+			dateTimeStr = format.format(cal.getTime());
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		String dateTime[] = dateTimeStr.split("T");
+		String date[] = dateTime[0].split("-");
+		String time[] = dateTime[1].split(":");
+		return AmazonUtils.getDTF().newXMLGregorianCalendar(toInt(date[0]), toInt(date[1]), toInt(date[2]), toInt(time[0]), toInt(time[1]), toInt(time[2].substring(0, time[2].indexOf("."))), 0, 0);
+
+	}
+	
+	public static void main(String[] args) {
+		/*AmazonRequestMode a = new AmazonRequestMode();
+		a.setUpdatedAfter(UTCTimeUtils.getUTCTimeStrByMINUTE(-2));
+		System.out.println(a.getUpdatedAfter().toString());*/
+		System.out.println(AmazonRequestMode.formateXMLGregorianCalendar("2017-09-01T00:00:00.000Z"));
+	}
+	public String getNextToken() {
+		return nextToken;
+	}
+	public void setNextToken(String nextToken) {
+		this.nextToken = nextToken;
+	}
+	public Map<String, Object> getParam() {
+		return param;
+	}
+	public void setParam(Map<String, Object> param) {
+		this.param = param;
+	}
+	public XMLGregorianCalendar getUpdatedAfter() {
+		return updatedAfter;
+	}
+	public void setUpdatedAfter(String updatedAfter) {
+		this.updatedAfter = formateXMLGregorianCalendar(updatedAfter);
+	}
+	public XMLGregorianCalendar getUpdatedBefore() {
+		return updatedBefore;
+	}
+	public void setUpdatedBefore(String updatedBefore) {
+		this.updatedBefore = formateXMLGregorianCalendar(updatedBefore);
+	}
+
+	
+}

+ 302 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/ColumnData.java

@@ -0,0 +1,302 @@
+package com.it.ocs.amazon.model;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import com.it.ocs.amazon.utils.SiteDateParseUtils;
+
+public class ColumnData {
+	private final static int REPORT_STRING = 0;
+	private final static int IT_DATE = 1;
+	private final static int US_DATE = 2;
+	private final static int DE_DATE = 3;
+	private final static int CA_DATE = 4;
+	private final static int JP_DATE = 5;
+	private final static int FR_DATE = 6;
+	private final static int ES_DATE = 7;
+	private final static int UK_DATE = 8;
+	private final static int REPORT_NUMBER = 9;
+	private final static int AU_DATE = 10;
+	
+	private Integer id;
+	private String reportType;
+	private String columnName;
+	private String linkName;
+	private Integer columnType;
+	private String site;
+	private String value;
+	
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public String getReportType() {
+		return reportType;
+	}
+	public void setReportType(String reportType) {
+		this.reportType = reportType;
+	}
+	public String getColumnName() {
+		return columnName;
+	}
+	public void setColumnName(String columnName) {
+		this.columnName = columnName;
+	}
+	public String getLinkName() {
+		return linkName;
+	}
+	public void setLinkName(String linkName) {
+		this.linkName = linkName;
+	}
+	public Integer getColumnType() {
+		return columnType;
+	}
+	public void setColumnType(Integer columnType) {
+		this.columnType = columnType;
+	}
+	
+	public String getSite() {
+		return site;
+	}
+	public void setSite(String site) {
+		this.site = site;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+	public String getValue() {
+		
+		String reValue = value;
+		
+		switch(columnType){
+			case IT_DATE:
+				//11/nov/2017 23.06.29 GMT+00.00
+				/*value = value.replace("GMT+00.00", "GMT+00:00");
+				value = value.replace("GMT+01.00", "GMT+01:00");
+				value = value.replace("GMT+02.00", "GMT+02:00");
+				reValue = formatDateString("dd/MMM/yyyy HH.mm.ss zzz",Locale.ITALY,value);*/
+				reValue = SiteDateParseUtils.it(value);
+				break;
+			
+			case US_DATE:
+				//Nov 13, 2017 12:00:08 AM PST
+				/*reValue = formatDateString("MMM dd, yyyy hh:mm:ss aaa zzz",Locale.US,value);*/
+				reValue = SiteDateParseUtils.us(value);
+				break;
+			
+			case DE_DATE:
+				//11.11.2017 23:00:37 GMT+00:00
+				/*reValue = formatDateString("dd.MM.yyyy HH:mm:ss zzz",Locale.GERMAN,value);*/
+				reValue = SiteDateParseUtils.de(value);
+				break;
+				
+			case CA_DATE:
+				//2017-11-10 12:25:54 AM PST
+				/*reValue = formatDateString("yyyy-MM-dd hh:mm:ss aaa zzz",Locale.CANADA,value);*/
+				reValue = SiteDateParseUtils.ca(value);
+				break;
+				
+			case UK_DATE:
+				//12 Nov 2017 00:01:31 GMT+00:00
+				/*reValue = formatDateString("dd MMM yyyy HH:mm:ss zzz",Locale.UK,value);*/
+				reValue = SiteDateParseUtils.uk(value);
+				break;
+				
+			case FR_DATE:
+				//11 nov. 2017 23:13:26 UTC+00:00
+				/*reValue = formatDateString("dd MMM yyyy HH:mm:ss zzz",Locale.FRANCE,value);*/
+				reValue = SiteDateParseUtils.fr(value);
+				break;
+				
+			case ES_DATE:
+				//12/11/2017 13:35:53 GMT+00:00
+				/*reValue = formatDateString("dd/MM/yyyy HH:mm:ss zzz",Locale.GERMAN,value);*/
+				reValue = SiteDateParseUtils.es(value);
+				break;
+				
+			case JP_DATE:
+				//2017/11/11 00:09:37JST
+				/*reValue = formatDateString("yyyy/MM/dd HH:mm:sszzz",Locale.JAPAN,value);*/
+				reValue = SiteDateParseUtils.jp(value);
+				break;
+				
+			case AU_DATE:
+				//02/03/2018 5:20:26 PM GMT+09:00
+				/*reValue = formatDateString("dd/MM/yyyy HH:mm:ss aaa zzz",Locale.ROOT,value);*/
+				reValue = SiteDateParseUtils.au(value);
+				break;
+				
+			case REPORT_STRING:
+				reValue = value;
+				break;
+			case REPORT_NUMBER:
+				if("amazon.com".equals(site) ||"amazon.ca".equals(site)||"amazon.co.uk".equals(site)||"amazon.jp".equals(site)||"amazon.com.au".equals(site)){
+					reValue = value.replace(",", "");
+				}else{
+					reValue = value.replace(".", "").replace(",", ".");
+				}
+				/////////下面一行未更换特殊字符(类似空格),请勿修改删除//////
+				reValue = reValue.replaceAll(" ", "").trim();
+				///////////////////////////////////////////////
+				reValue = reValue.replace(" ", "");
+				break;
+			default :	
+		}
+		return reValue;
+	}
+	
+	public static String getSelfDateValue(String value,int site) {
+		String reValue = value;
+		String str[] = null;
+		String zone = null;
+		switch(site){
+			case IT_DATE:
+				//11/nov/2017 23.06.29 GMT+00.00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				value = value.replace(zone, zone.replace(".", ":"));
+				reValue = formatSelfDateString("dd/MMM/yyyy HH.mm.ss zzz",Locale.ITALY,value,zone.replace(".", ":"));*/
+				reValue = SiteDateParseUtils.it(value);
+				break;
+			
+			case US_DATE:
+				//Nov 13, 2017 12:00:08 AM PST
+				reValue = SiteDateParseUtils.us(value);
+				break;
+			
+			case DE_DATE:
+				//11.11.2017 23:00:37 GMT+00:00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("dd.MM.yyyy HH:mm:ss zzz",Locale.GERMAN,value,zone);*/
+				reValue = SiteDateParseUtils.de(value);
+				break;
+				
+			case CA_DATE:
+				//2017-11-10 12:25:54 AM PST
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("yyyy-MM-dd hh:mm:ss aaa zzz",Locale.CANADA,value,zone);*/
+				reValue = SiteDateParseUtils.ca(value);
+				break;
+				
+			case UK_DATE:
+				//12 Nov 2017 00:01:31 GMT+00:00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("dd MMM yyyy HH:mm:ss zzz",Locale.UK,value,zone);*/
+				reValue = SiteDateParseUtils.uk(value);
+				break;
+				
+			case FR_DATE:
+				//11 nov. 2017 23:13:26 UTC+00:00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("dd MMM yyyy HH:mm:ss zzz",Locale.FRANCE,value,zone);*/
+				reValue = SiteDateParseUtils.fr(value);
+				break;
+				
+			case ES_DATE:
+				//12/11/2017 13:35:53 GMT+00:00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("dd/MM/yyyy HH:mm:ss zzz",Locale.GERMAN,value,zone);*/
+				reValue = SiteDateParseUtils.es(value);
+				break;
+				
+			case JP_DATE:
+				//2017/11/11 00:09:37JST
+				/*reValue = formatSelfDateString("yyyy/MM/dd HH:mm:sszzz",Locale.JAPAN,value,"JST");*/
+				reValue = SiteDateParseUtils.jp(value);
+				break;
+			case AU_DATE:
+				//02/03/2018 5:20:26 PM GMT+09:00
+				/*str = value.split(" ");
+				zone = str[str.length-1];
+				reValue = formatSelfDateString("dd/MM/yyyy HH:mm:ss aaa zzz",Locale.ROOT,value,zone);*/
+				reValue = SiteDateParseUtils.au(value);
+				break;
+				
+			case REPORT_STRING:
+				reValue = value;
+				break;
+			default :	
+		}
+		return reValue;
+	}
+	
+	public static String formatDateString(String pattern,Locale locale,String value){
+		return formatSelfDateString(pattern,locale,value,"UTC");
+	}
+	
+	public static String formatSelfDateString(String pattern,Locale locale,String value,String zone){
+		SimpleDateFormat sdf = new SimpleDateFormat(pattern,locale);
+		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		sdf1.setTimeZone(TimeZone.getTimeZone(zone));
+		Date date =null;
+		try {
+			date = sdf.parse(value);
+			return sdf1.format(date);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		return "";
+	}
+	
+	public static void main(String[] args) throws ParseException {
+		/*System.out.println();
+		System.out.println("11/nov/2017 23.06.29 GMT+00.00");
+		System.out.println(getSelfDateValue("11/nov/2017 23.06.29 GMT+00.00",ColumnData.IT_DATE));//formatSelfDateString("dd/MMM/yyyy HH.mm.ss zzz",Locale.ITALY,value,zone.replace(".", ":")));
+	
+		System.out.println("Nov 13, 2017 12:00:08 AM PST");
+		System.out.println(getSelfDateValue("Nov 13, 2017 12:00:08 AM PST",ColumnData.US_DATE));//formatSelfDateString("MMM dd, yyyy hh:mm:ss aaa zzz",Locale.US,value,zone);
+	
+		System.out.println("11.11.2017 23:00:37 GMT+00:00");
+		System.out.println(getSelfDateValue("11.11.2017 23:00:37 GMT+00:00",ColumnData.DE_DATE));//formatSelfDateString("dd.MM.yyyy HH:mm:ss zzz",Locale.GERMAN,value,zone);
+		
+		System.out.println("2017-11-10 12:25:54 AM PST");
+		System.out.println(getSelfDateValue("2017-11-10 12:25:54 AM PST",ColumnData.CA_DATE));//formatSelfDateString("yyyy-MM-dd hh:mm:ss aaa zzz",Locale.CANADA,value,zone);
+		
+		System.out.println("12 Nov 2017 00:01:31 GMT+00:00");
+		System.out.println(getSelfDateValue("12 Nov 2017 00:01:31 GMT+00:00",ColumnData.UK_DATE));//formatSelfDateString("dd MMM yyyy HH:mm:ss zzz",Locale.UK,value,zone);
+		
+		System.out.println("11 nov. 2017 23:13:26 UTC+00:00");
+		System.out.println(getSelfDateValue("11 nov. 2017 23:13:26 UTC+00:00",ColumnData.FR_DATE));//formatSelfDateString("dd MMM yyyy HH:mm:ss zzz",Locale.FRANCE,value,zone);
+		System.out.println("12/11/2017 13:35:53 GMT+00:00");
+		System.out.println(getSelfDateValue("12/11/2017 13:35:53 GMT+00:00",ColumnData.ES_DATE));//formatSelfDateString("dd/MM/yyyy HH:mm:ss zzz",Locale.GERMAN,value,zone);
+		
+		System.out.println("2017/11/11 00:09:37JST");
+		System.out.println(getSelfDateValue("2017/11/11 00:09:37JST",ColumnData.JP_DATE));//formatSelfDateString("yyyy/MM/dd HH:mm:sszzz",Locale.JAPAN,value,"JST");
+		String dis = " ";
+		System.out.println("-43 897,49".replaceAll(" ", ""));*/
+		//System.out.println(getSelfDateValue("Nov 13, 2017 12:00:08 AM PST",2));
+		
+	/*	System.out.println("11 nov. 2017 23:13:26 UTC+00:00");
+		System.out.println(getSelfDateValue("11 nov. 2017 23:13:26 UTC+00:00",ColumnData.FR_DATE));//formatSelfDateString("dd MMM yyyy HH:mm:ss zzz",Locale.FRANCE,value,zone);
+		System.out.println("12/11/2017 13:35:53 GMT+09:00");
+		System.out.println(getSelfDateValue("12/11/2017 13:35:53 GMT+09:00",ColumnData.ES_DATE));//formatSelfDateString("dd/MM/yyyy HH:mm:ss zzz",Locale.GERMAN,value,zone);
+	*/
+		
+		System.out.println(formatDateString("yyyy-MM-dd hh:mm:ss aaa zzz",Locale.US,"2018-05-13 2:33:25 PM PDT"));
+		System.out.println(formatSelfDateString("yyyy-MM-dd hh:mm:ss aaa zzz",Locale.US,"2018-05-13 2:33:25 PM PDT","PDT"));
+		
+		System.out.println(formatDateString("MMM dd, yyyy hh:mm:ss aaa",Locale.US,"May 1, 2018 12:00:37 AM"));
+		System.out.println(formatSelfDateString("MMM dd, yyyy hh:mm:ss aaa zzz",Locale.US,"May 1, 2018 12:00:37 AM PDT","PDT"));
+		
+		
+		SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss aaa");
+		Date date = sdf.parse("May 1, 2018 12:00:37 AM");
+		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//sdf1.setTimeZone(TimeZone.getTimeZone(Locale.US));
+		System.out.println(sdf1.format(date));
+		
+	}
+}

+ 197 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/MyiUnsuppressedVO.java

@@ -0,0 +1,197 @@
+package com.it.ocs.amazon.model;
+
+public class MyiUnsuppressedVO implements java.io.Serializable {
+	
+	private static final long serialVersionUID = 7804999857131474354L;
+	
+	private Long id;
+	private String sku;
+	private String fnsku;
+	private String asin;
+	private String product_name;
+	private String condition;
+	private String your_price;
+	private String mfn_listing_exists;
+	private String mfn_fulfillable_quantity;
+	private String afn_listing_exists;
+	private String afn_warehouse_quantity;
+	private String afn_fulfillable_quantity;
+	private String afn_unsellable_quantity;
+	private String afn_reserved_quantity;
+	private String afn_total_quantity;
+	private String per_unit_volume;
+	private String afn_inbound_working_quantity;
+	private String afn_inbound_shipped_quantity;
+	private String afn_inbound_receiving_quantity;
+	private String created_at;
+	private String updated_at;
+	private String enabled_flag;
+	private String report_id;
+	private String site;
+	private String reserved_fc_transfers;
+	private String request_created_at;
+	private String request_updated_at;
+	
+	public String getRequest_created_at() {
+		return request_created_at;
+	}
+	public void setRequest_created_at(String request_created_at) {
+		this.request_created_at = request_created_at;
+	}
+	public String getRequest_updated_at() {
+		return request_updated_at;
+	}
+	public void setRequest_updated_at(String request_updated_at) {
+		this.request_updated_at = request_updated_at;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public String getSku() {
+		return sku;
+	}
+	public void setSku(String sku) {
+		this.sku = sku;
+	}
+	public String getFnsku() {
+		return fnsku;
+	}
+	public void setFnsku(String fnsku) {
+		this.fnsku = fnsku;
+	}
+	public String getAsin() {
+		return asin;
+	}
+	public void setAsin(String asin) {
+		this.asin = asin;
+	}
+	public String getProduct_name() {
+		return product_name;
+	}
+	public void setProduct_name(String product_name) {
+		this.product_name = product_name;
+	}
+	public String getCondition() {
+		return condition;
+	}
+	public void setCondition(String condition) {
+		this.condition = condition;
+	}
+	public String getYour_price() {
+		return your_price;
+	}
+	public void setYour_price(String your_price) {
+		this.your_price = your_price;
+	}
+	public String getMfn_listing_exists() {
+		return mfn_listing_exists;
+	}
+	public void setMfn_listing_exists(String mfn_listing_exists) {
+		this.mfn_listing_exists = mfn_listing_exists;
+	}
+	public String getMfn_fulfillable_quantity() {
+		return mfn_fulfillable_quantity;
+	}
+	public void setMfn_fulfillable_quantity(String mfn_fulfillable_quantity) {
+		this.mfn_fulfillable_quantity = mfn_fulfillable_quantity;
+	}
+	public String getAfn_listing_exists() {
+		return afn_listing_exists;
+	}
+	public void setAfn_listing_exists(String afn_listing_exists) {
+		this.afn_listing_exists = afn_listing_exists;
+	}
+	public String getAfn_warehouse_quantity() {
+		return afn_warehouse_quantity;
+	}
+	public void setAfn_warehouse_quantity(String afn_warehouse_quantity) {
+		this.afn_warehouse_quantity = afn_warehouse_quantity;
+	}
+	public String getAfn_fulfillable_quantity() {
+		return afn_fulfillable_quantity;
+	}
+	public void setAfn_fulfillable_quantity(String afn_fulfillable_quantity) {
+		this.afn_fulfillable_quantity = afn_fulfillable_quantity;
+	}
+	public String getAfn_unsellable_quantity() {
+		return afn_unsellable_quantity;
+	}
+	public void setAfn_unsellable_quantity(String afn_unsellable_quantity) {
+		this.afn_unsellable_quantity = afn_unsellable_quantity;
+	}
+	public String getAfn_reserved_quantity() {
+		return afn_reserved_quantity;
+	}
+	public void setAfn_reserved_quantity(String afn_reserved_quantity) {
+		this.afn_reserved_quantity = afn_reserved_quantity;
+	}
+	public String getAfn_total_quantity() {
+		return afn_total_quantity;
+	}
+	public void setAfn_total_quantity(String afn_total_quantity) {
+		this.afn_total_quantity = afn_total_quantity;
+	}
+	public String getPer_unit_volume() {
+		return per_unit_volume;
+	}
+	public void setPer_unit_volume(String per_unit_volume) {
+		this.per_unit_volume = per_unit_volume;
+	}
+	public String getAfn_inbound_working_quantity() {
+		return afn_inbound_working_quantity;
+	}
+	public void setAfn_inbound_working_quantity(String afn_inbound_working_quantity) {
+		this.afn_inbound_working_quantity = afn_inbound_working_quantity;
+	}
+	public String getAfn_inbound_shipped_quantity() {
+		return afn_inbound_shipped_quantity;
+	}
+	public void setAfn_inbound_shipped_quantity(String afn_inbound_shipped_quantity) {
+		this.afn_inbound_shipped_quantity = afn_inbound_shipped_quantity;
+	}
+	public String getAfn_inbound_receiving_quantity() {
+		return afn_inbound_receiving_quantity;
+	}
+	public void setAfn_inbound_receiving_quantity(String afn_inbound_receiving_quantity) {
+		this.afn_inbound_receiving_quantity = afn_inbound_receiving_quantity;
+	}
+	public String getCreated_at() {
+		return created_at;
+	}
+	public void setCreated_at(String created_at) {
+		this.created_at = created_at;
+	}
+	public String getUpdated_at() {
+		return updated_at;
+	}
+	public void setUpdated_at(String updated_at) {
+		this.updated_at = updated_at;
+	}
+	public String getEnabled_flag() {
+		return enabled_flag;
+	}
+	public void setEnabled_flag(String enabled_flag) {
+		this.enabled_flag = enabled_flag;
+	}
+	public String getReport_id() {
+		return report_id;
+	}
+	public void setReport_id(String report_id) {
+		this.report_id = report_id;
+	}
+	public String getSite() {
+		return site;
+	}
+	public void setSite(String site) {
+		this.site = site;
+	}
+	public String getReserved_fc_transfers() {
+		return reserved_fc_transfers;
+	}
+	public void setReserved_fc_transfers(String reserved_fc_transfers) {
+		this.reserved_fc_transfers = reserved_fc_transfers;
+	}
+}

+ 183 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/OrderReportVO.java

@@ -0,0 +1,183 @@
+package com.it.ocs.amazon.model;
+
+import java.io.Serializable;
+
+public class OrderReportVO implements Serializable{
+	private Integer id;
+    private String selfDate;
+    private String settlementId;
+    private String type;
+    private String orderId;
+    private String sku;
+    private String description;
+    private String quantity;
+    private String marketplace;
+    private String fulfillment;
+    private String orderCity;
+    private String orderState;
+    private String orderPostal;
+    private String productSales;
+    private String shippingCredits;
+    private String giftWrapCredits;
+    private String promotionalRebates;
+    private String salesTaxCollected;
+    private String sellingFees;
+    private String fbaFees;
+    private String otherTransactionFees;
+    private String other;
+    private String total;
+    private String reportId;
+    private String platform;
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public String getSelfDate() {
+		return selfDate;
+	}
+	public void setSelfDate(String selfDate) {
+		this.selfDate = selfDate;
+	}
+	public String getSettlementId() {
+		return settlementId;
+	}
+	public void setSettlementId(String settlementId) {
+		this.settlementId = settlementId;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getOrderId() {
+		return orderId;
+	}
+	public void setOrderId(String orderId) {
+		this.orderId = orderId;
+	}
+	public String getSku() {
+		return sku;
+	}
+	public void setSku(String sku) {
+		this.sku = sku;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getQuantity() {
+		return quantity;
+	}
+	public void setQuantity(String quantity) {
+		this.quantity = quantity;
+	}
+	public String getMarketplace() {
+		return marketplace;
+	}
+	public void setMarketplace(String marketplace) {
+		this.marketplace = marketplace;
+	}
+	public String getFulfillment() {
+		return fulfillment;
+	}
+	public void setFulfillment(String fulfillment) {
+		this.fulfillment = fulfillment;
+	}
+	public String getOrderCity() {
+		return orderCity;
+	}
+	public void setOrderCity(String orderCity) {
+		this.orderCity = orderCity;
+	}
+	public String getOrderState() {
+		return orderState;
+	}
+	public void setOrderState(String orderState) {
+		this.orderState = orderState;
+	}
+	public String getOrderPostal() {
+		return orderPostal;
+	}
+	public void setOrderPostal(String orderPostal) {
+		this.orderPostal = orderPostal;
+	}
+	public String getProductSales() {
+		return productSales;
+	}
+	public void setProductSales(String productSales) {
+		this.productSales = productSales;
+	}
+	public String getShippingCredits() {
+		return shippingCredits;
+	}
+	public void setShippingCredits(String shippingCredits) {
+		this.shippingCredits = shippingCredits;
+	}
+	public String getGiftWrapCredits() {
+		return giftWrapCredits;
+	}
+	public void setGiftWrapCredits(String giftWrapCredits) {
+		this.giftWrapCredits = giftWrapCredits;
+	}
+	public String getPromotionalRebates() {
+		return promotionalRebates;
+	}
+	public void setPromotionalRebates(String promotionalRebates) {
+		this.promotionalRebates = promotionalRebates;
+	}
+	public String getSalesTaxCollected() {
+		return salesTaxCollected;
+	}
+	public void setSalesTaxCollected(String salesTaxCollected) {
+		this.salesTaxCollected = salesTaxCollected;
+	}
+	public String getSellingFees() {
+		return sellingFees;
+	}
+	public void setSellingFees(String sellingFees) {
+		this.sellingFees = sellingFees;
+	}
+	public String getFbaFees() {
+		return fbaFees;
+	}
+	public void setFbaFees(String fbaFees) {
+		this.fbaFees = fbaFees;
+	}
+	public String getOtherTransactionFees() {
+		return otherTransactionFees;
+	}
+	public void setOtherTransactionFees(String otherTransactionFees) {
+		this.otherTransactionFees = otherTransactionFees;
+	}
+	public String getOther() {
+		return other;
+	}
+	public void setOther(String other) {
+		this.other = other;
+	}
+	public String getTotal() {
+		return total;
+	}
+	public void setTotal(String total) {
+		this.total = total;
+	}
+	public String getReportId() {
+		return reportId;
+	}
+	public void setReportId(String reportId) {
+		this.reportId = reportId;
+	}
+	public String getPlatform() {
+		return platform;
+	}
+	public void setPlatform(String platform) {
+		this.platform = platform;
+	}
+    
+    
+}

+ 55 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/ParseAmazonReportRequstListXMLModel.java

@@ -0,0 +1,55 @@
+package com.it.ocs.amazon.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.springframework.beans.BeanUtils;
+
+import com.it.ocs.synchronou.model.ParseXMLModel;
+import com.it.ocs.synchronou.model.XMLNode;
+
+public class ParseAmazonReportRequstListXMLModel extends ParseXMLModel {
+
+	public ParseAmazonReportRequstListXMLModel(Document document, String nameSpace) {
+		super(document, nameSpace);
+	}
+
+	@Override
+	public List<Map<String, Object>> getResult() {
+		XMLNode [] columns = {XMLNode.getInstance("ReportType"),
+					      XMLNode.getInstance("ReportProcessingStatus"),
+					      XMLNode.getInstance("EndDate",XMLNode.AMAZON_REPORT_DATE),
+					      XMLNode.getInstance("Scheduled"),
+					      XMLNode.getInstance("ReportRequestId"),
+					      XMLNode.getInstance("StartedProcessingDate",XMLNode.AMAZON_REPORT_DATE),
+					      XMLNode.getInstance("SubmittedDate",XMLNode.AMAZON_REPORT_DATE),
+					      XMLNode.getInstance("CompletedDate",XMLNode.AMAZON_REPORT_DATE),
+					      XMLNode.getInstance("StartDate",XMLNode.AMAZON_REPORT_DATE),
+					      XMLNode.getInstance("GeneratedReportId")
+					      };
+		List<Map<String,Object>> list = new ArrayList<>();
+		List<Element> elements = this.getElementChild("GetReportRequestListResult_ReportRequestInfo");
+		if(elements.size() == 0){
+			elements = this.getElementChild("GetReportRequestListByNextTokenResult_ReportRequestInfo");
+		}
+		for(Element element :elements){
+			element = this.formateElement(element);
+			Map<String,Object> map = parseRecord(element,columns);
+			list.add(map);
+		}
+		return list;
+	}
+	
+	public String getNextToken() {
+		return this.getValueByName(this.getRoot(), "NextToken");
+	}
+	
+	public boolean hasNext() {
+		String hasNext = this.getValueByName(this.getRoot(), "HasNext");
+		return "true".equalsIgnoreCase(hasNext)?true:false;
+	}
+}

+ 99 - 0
project/ocs/src/main/java/com/it/ocs/amazon/model/ReportRequestListModel.java

@@ -0,0 +1,99 @@
+package com.it.ocs.amazon.model;
+
+import java.util.List;
+
+public class ReportRequestListModel {
+	private Integer id;
+	private String reportGetId;
+	private String platform;
+	private String filePathName;
+	private String site;
+	private Integer isParse;
+	private String startDate;
+	private String endDate;
+	private Integer isGetData;
+	private List<ReportRequestListModel> children;
+	private String reportType;
+	private String generateMode; // 枚举值: 'sys_auto' - 系统自动生成
+	
+	public String getGenerateMode() {
+		return generateMode;
+	}
+	public void setGenerateMode(String generateMode) {
+		this.generateMode = generateMode;
+	}
+	public String getReportType() {
+		return reportType;
+	}
+	public void setReportType(String reportType) {
+		this.reportType = reportType;
+	}
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public String getReportGetId() {
+		return reportGetId;
+	}
+	public void setReportGetId(String reportGetId) {
+		this.reportGetId = reportGetId;
+	}
+	public String getPlatform() {
+		return platform;
+	}
+	public void setPlatform(String platform) {
+		this.platform = platform;
+	}
+	public String getFilePathName() {
+		return filePathName;
+	}
+	public void setFilePathName(String filePathName) {
+		this.filePathName = filePathName;
+	}
+	public String getSite() {
+		return site;
+	}
+	public void setSite(String site) {
+		this.site = site;
+	}
+	public Integer getIsParse() {
+		return isParse;
+	}
+	public void setIsParse(Integer isParse) {
+		this.isParse = isParse;
+	}
+	public String getStartDate() {
+		return startDate;
+	}
+	public void setStartDate(String startDate) {
+		this.startDate = startDate;
+	}
+	public String getEndDate() {
+		return endDate;
+	}
+	public void setEndDate(String endDate) {
+		this.endDate = endDate;
+	}
+	public Integer getIsGetData() {
+		return isGetData;
+	}
+	public void setIsGetData(Integer isGetData) {
+		this.isGetData = isGetData;
+	}
+	public List<ReportRequestListModel> getChildren() {
+		return children;
+	}
+	public void setChildren(List<ReportRequestListModel> children) {
+		this.children = children;
+	}
+	public boolean hasChild(){
+		if(null == children||children.size() == 0){
+			return false;
+		}else{
+			return true;
+		}
+	}
+	
+}

+ 143 - 0
project/ocs/src/main/java/com/it/ocs/amazon/order/AmazonClientRun.java

@@ -0,0 +1,143 @@
+package com.it.ocs.amazon.order;
+
+import org.apache.log4j.Logger;
+
+import com.amazonservices.mws.orders._2013_09_01.MarketplaceWebServiceOrders;
+import com.amazonservices.mws.orders._2013_09_01.MarketplaceWebServiceOrdersException;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrderItemsRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrderItemsResponse;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersByNextTokenRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersByNextTokenResponse;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersResponse;
+import com.amazonservices.mws.orders._2013_09_01.model.ResponseHeaderMetadata;
+
+public class AmazonClientRun {
+	private final static Logger log = Logger.getLogger(AmazonClientRun.class);
+	
+	public static String invokeListOrders(MarketplaceWebServiceOrders client, ListOrdersRequest request) {
+		try {
+			// Call the service.
+			ListOrdersResponse response = client.listOrders(request);
+			ResponseHeaderMetadata rhmd = response.getResponseHeaderMetadata();
+			// We recommend logging every the request id and timestamp of every
+			// call.
+			log.info("Response:");
+			log.info("RequestId: " + rhmd.getRequestId());
+			log.info("Timestamp: " + rhmd.getTimestamp());
+			String responseXml = response.toXML();
+			log.info(responseXml);
+			return responseXml;
+		} catch (MarketplaceWebServiceOrdersException ex) {
+			// Exception properties are important for diagnostics.
+			log.info("Service Exception:");
+			ResponseHeaderMetadata rhmd = ex.getResponseHeaderMetadata();
+			if (rhmd != null) {
+				log.info("RequestId: " + rhmd.getRequestId());
+				log.info("Timestamp: " + rhmd.getTimestamp());
+			}
+			log.info("Message: " + ex.getMessage());
+			log.info("StatusCode: " + ex.getStatusCode());
+			log.info("ErrorCode: " + ex.getErrorCode());
+			log.info("ErrorType: " + ex.getErrorType());
+			log.error("请求订单列表异常", ex);
+			//防止请求被扼杀
+
+			try {
+				Thread.sleep(60000);
+			} catch (InterruptedException e) {
+				
+			}
+			String xml = invokeListOrders(client,request);
+			if(!"".equals(xml)){
+				return xml;
+			}
+
+			return "";
+		}
+	}
+
+	public static String invokeListOrdersByNextToken(MarketplaceWebServiceOrders client,
+			ListOrdersByNextTokenRequest request) {
+		try {
+			// Call the service.
+			ListOrdersByNextTokenResponse response = client.listOrdersByNextToken(request);
+			ResponseHeaderMetadata rhmd = response.getResponseHeaderMetadata();
+			// We recommend logging every the request id and timestamp of every
+			// call.
+			log.info("Response:");
+			log.info("RequestId: " + rhmd.getRequestId());
+			log.info("Timestamp: " + rhmd.getTimestamp());
+			String responseXml = response.toXML();
+			log.info(responseXml);
+			return responseXml;
+		} catch (MarketplaceWebServiceOrdersException ex) {
+			// Exception properties are important for diagnostics.
+			log.info("Service Exception:");
+			ResponseHeaderMetadata rhmd = ex.getResponseHeaderMetadata();
+			if (rhmd != null) {
+				log.info("RequestId: " + rhmd.getRequestId());
+				log.info("Timestamp: " + rhmd.getTimestamp());
+			}
+			log.info("Message: " + ex.getMessage());
+			log.info("StatusCode: " + ex.getStatusCode());
+			log.info("ErrorCode: " + ex.getErrorCode());
+			log.info("ErrorType: " + ex.getErrorType());
+			log.error("根据byNexttoken请求订单异常", ex);
+			//防止请求被扼杀
+		
+			try {
+				Thread.sleep(60000);
+			} catch (InterruptedException e) {
+				
+			}
+			String xml = invokeListOrdersByNextToken(client,request);
+			if(!"".equals(xml)){
+				return xml;
+			}
+
+			return "";
+		}
+	}
+
+	public static String invokeListOrderItems(MarketplaceWebServiceOrders client, ListOrderItemsRequest request) {
+		try {
+			// Call the service.
+			ListOrderItemsResponse response = client.listOrderItems(request);
+			ResponseHeaderMetadata rhmd = response.getResponseHeaderMetadata();
+
+			log.info("Response:");
+			log.info("RequestId: " + rhmd.getRequestId());
+			log.info("Timestamp: " + rhmd.getTimestamp());
+			String responseXml = response.toXML();
+			log.info(responseXml);
+			return responseXml;
+		} catch (MarketplaceWebServiceOrdersException ex) {
+			log.info("Service Exception:");
+			ResponseHeaderMetadata rhmd = ex.getResponseHeaderMetadata();
+			if (rhmd != null) {
+				log.info("RequestId: " + rhmd.getRequestId());
+				log.info("Timestamp: " + rhmd.getTimestamp());
+			}
+			log.info("Message: " + ex.getMessage());
+			log.info("StatusCode: " + ex.getStatusCode());
+			log.info("ErrorCode: " + ex.getErrorCode());
+			log.info("ErrorType: " + ex.getErrorType());
+			log.error("请求订单详情异常", ex);
+			//防止请求被扼杀
+	
+			try {
+				Thread.sleep(2500);
+			} catch (InterruptedException e) {
+				
+			}
+			String xml = invokeListOrderItems(client,request);
+			if(!"".equals(xml)){
+				return xml;
+			}
+
+			return "";
+		}
+		
+	}
+}

+ 88 - 0
project/ocs/src/main/java/com/it/ocs/amazon/order/AmazonRequest.java

@@ -0,0 +1,88 @@
+package com.it.ocs.amazon.order;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.amazonaws.mws.model.GetReportRequest;
+import com.amazonaws.mws.model.GetReportRequestListByNextTokenRequest;
+import com.amazonaws.mws.model.GetReportRequestListRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrderItemsRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersByNextTokenRequest;
+import com.amazonservices.mws.orders._2013_09_01.model.ListOrdersRequest;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+
+public class AmazonRequest {
+	public final static int BY_UPDATE_DATE = 0;
+	public final static int BY_CREATE_DATE = 1;
+	
+	public static ListOrdersRequest createOrderRequest(AmazonRequestMode requestMode,int type){
+		ListOrdersRequest request = new ListOrdersRequest();
+		request.setSellerId(requestMode.getSellerId());
+
+		if(type == BY_CREATE_DATE){
+			request.setCreatedAfter(requestMode.getCreatedAfter());
+			request.setCreatedBefore(requestMode.getCreatedBefore());
+		}
+		if(type == BY_UPDATE_DATE){
+			request.setLastUpdatedAfter(requestMode.getUpdatedAfter());
+			request.setLastUpdatedBefore(requestMode.getUpdatedBefore());
+		}
+		
+		
+		List<String> orderStatus = new ArrayList<String>();
+		request.setOrderStatus(orderStatus);
+		request.setMarketplaceId(requestMode.getMarketplaceId());
+		List<String> fulfillmentChannel = new ArrayList<String>();
+		request.setFulfillmentChannel(fulfillmentChannel);
+		List<String> paymentMethod = new ArrayList<String>();
+		request.setPaymentMethod(paymentMethod);
+		Integer maxResultsPerPage = 100;
+		request.setMaxResultsPerPage(maxResultsPerPage);
+		List<String> tfmShipmentStatus = new ArrayList<String>();
+		request.setTFMShipmentStatus(tfmShipmentStatus);
+		return request;
+	}
+	
+	public static ListOrdersByNextTokenRequest createOrderByNextTokenRequest(AmazonRequestMode requestMode){
+		ListOrdersByNextTokenRequest request = new ListOrdersByNextTokenRequest();
+	    String sellerId = requestMode.getSellerId();
+	    request.setSellerId(sellerId);
+	    String nextToken = requestMode.getNextToken();
+	    request.setNextToken(nextToken);
+	    return request;
+    }
+	
+	public static ListOrderItemsRequest createOrderItemRequest(AmazonRequestMode requestMode){
+		ListOrderItemsRequest request = new ListOrderItemsRequest();
+        String sellerId = requestMode.getSellerId();
+        request.setSellerId(sellerId);
+        String amazonOrderId = (String)requestMode.getParam().get("AmazonOrderId");
+        request.setAmazonOrderId(amazonOrderId);
+        return request;
+    }
+	
+	public static GetReportRequestListRequest createReportRequestListRequest(AmazonRequestMode requestMode){
+		GetReportRequestListRequest request = new GetReportRequestListRequest();
+		request.setMerchant(requestMode.getSellerId());
+		request.setRequestedFromDate(requestMode.getCreatedAfter());
+		request.setRequestedToDate(requestMode.getCreatedBefore());
+		request.setMaxCount(50);
+		return request;
+	}
+	
+	public static GetReportRequestListByNextTokenRequest createReportRequestListByNextTokenRequest(AmazonRequestMode requestMode){
+		GetReportRequestListByNextTokenRequest request = new GetReportRequestListByNextTokenRequest();
+		request.setMerchant(requestMode.getSellerId());
+		request.setNextToken(requestMode.getNextToken());
+		return request;
+	}
+	
+	public static GetReportRequest createReportRequest(AmazonRequestMode requestMode){
+		GetReportRequest request = new GetReportRequest();
+		request.setMerchant(requestMode.getSellerId());
+		String reportId = (String)requestMode.getParam().get("reportId");
+		request.setReportId(reportId);
+		return request;
+	}
+
+}

+ 29 - 0
project/ocs/src/main/java/com/it/ocs/amazon/order/GetAmazonClient.java

@@ -0,0 +1,29 @@
+package com.it.ocs.amazon.order;
+import com.amazonaws.mws.MarketplaceWebServiceClient;
+import com.amazonaws.mws.MarketplaceWebServiceConfig;
+import com.amazonservices.mws.orders._2013_09_01.MarketplaceWebServiceOrdersAsyncClient;
+import com.amazonservices.mws.orders._2013_09_01.MarketplaceWebServiceOrdersConfig;
+import com.it.ocs.amazon.common.AmazonReportServiceClient;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+public class GetAmazonClient {
+	
+	public static MarketplaceWebServiceOrdersAsyncClient createClient(AmazonRequestMode requestMode){
+		 MarketplaceWebServiceOrdersConfig config = new MarketplaceWebServiceOrdersConfig();
+         config.setServiceURL(requestMode.getServiceURL());
+         // Set other client connection configurations here.
+         return new MarketplaceWebServiceOrdersAsyncClient(requestMode.getAccessKey(), requestMode.getSecretKey(), "ocs", "1.0", config, null);
+	}
+	
+	public static MarketplaceWebServiceClient createReportClient(AmazonRequestMode requestMode){
+		 MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
+         config.setServiceURL(requestMode.getServiceURL());
+         return new MarketplaceWebServiceClient(requestMode.getAccessKey(), requestMode.getSecretKey(), "ocs", "1.0", config);
+	}
+	
+	public static AmazonReportServiceClient createReportDownloadClient(AmazonRequestMode requestMode){
+		 MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
+        config.setServiceURL(requestMode.getServiceURL());
+        return new AmazonReportServiceClient(requestMode.getAccessKey(), requestMode.getSecretKey(), "ocs", "1.0", config);
+	}
+
+}

+ 48 - 0
project/ocs/src/main/java/com/it/ocs/amazon/run/AmazonDownloadTest.java

@@ -0,0 +1,48 @@
+package com.it.ocs.amazon.run;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import com.amazonaws.mws.MarketplaceWebServiceConfig;
+import com.amazonaws.mws.MarketplaceWebServiceException;
+import com.amazonaws.mws.model.GetReportRequest;
+import com.it.ocs.amazon.common.AmazonReportServiceClient;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.amazon.order.AmazonRequest;
+import com.it.ocs.amazon.order.GetAmazonClient;
+
+public class AmazonDownloadTest {
+
+	public static void main(String[] args) {
+		download(null, null);
+	}
+	public static AmazonReportServiceClient createReportDownloadClient(AmazonRequestMode requestMode){
+		 MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
+       config.setServiceURL("https://mws.amazonservices.com");
+//       return new AmazonReportServiceClient(requestMode.getAccessKey(), requestMode.getSecretKey(), "ocs", "1.0", config);
+       
+       return new AmazonReportServiceClient("AKIAJRZYZHYY5FVC2PUQ", "Cpb6k2afwvPvU6z3afAqK5Ga+R6cxejoGUIhn9bW", "APP", "1.0", config);
+	}
+	public static GetReportRequest createReportRequest(AmazonRequestMode requestMode) {
+		GetReportRequest request = new GetReportRequest();
+//		request.setMerchant(requestMode.getSellerId());
+		request.setMerchant("A2PH6LYOY5868R");
+//		String reportId = (String)requestMode.getParam().get("reportId");
+//		request.setReportId(reportId);
+		request.setReportId("14627154281018014");
+		return request;
+	 }
+	public static void download(AmazonRequestMode requestMode,ReportRequestListModel request){
+		AmazonReportServiceClient client = createReportDownloadClient(requestMode);
+		GetReportRequest getReportRequest = createReportRequest(requestMode);
+			try {
+				String data = client.downloadReport(getReportRequest);
+				System.out.println(data);
+			} catch (MarketplaceWebServiceException e) {
+				e.printStackTrace();
+			}
+	}
+
+}

+ 908 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/AmazonReportService.java

@@ -0,0 +1,908 @@
+package com.it.ocs.amazon.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.amazonaws.mws.MarketplaceWebServiceClient;
+import com.amazonaws.mws.MarketplaceWebServiceException;
+import com.amazonaws.mws.model.GetReportRequest;
+import com.amazonaws.mws.model.GetReportRequestListByNextTokenRequest;
+import com.amazonaws.mws.model.GetReportRequestListByNextTokenResponse;
+import com.amazonaws.mws.model.GetReportRequestListRequest;
+import com.amazonaws.mws.model.GetReportRequestListResponse;
+import com.it.ocs.amazon.common.AmazonReportServiceClient;
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+import com.it.ocs.amazon.model.ColumnData;
+import com.it.ocs.amazon.model.ParseAmazonReportRequstListXMLModel;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.amazon.order.AmazonRequest;
+import com.it.ocs.amazon.order.GetAmazonClient;
+import com.it.ocs.amazon.utils.AmazonHttpUtil;
+import com.it.ocs.amazon.utils.AmazonUtils;
+import com.it.ocs.amazon.utils.FindTimeLine;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.common.util.Counter;
+import com.it.ocs.common.util.StringUtil;
+import com.it.ocs.synchronou.dao.ISyncAmazonOrderDao;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+import com.it.ocs.synchronou.model.ParseXMLModel2;
+import com.it.ocs.synchronou.model.XMLNode;
+import com.it.ocs.synchronou.util.UTCTimeUtils;
+import com.it.ocs.task.core.TaskExecutorUtil;
+import com.it.ocs.task.core.TaskRunnable;
+/**
+ * amazon 报表同步
+ * @author chenyong
+ *
+ */
+@Service
+public class AmazonReportService {
+	private final static Logger log = Logger.getLogger(AmazonReportService.class);
+	
+	private final static String BASE_PATH = "/ocs/report/";
+	private final static String AMAZON_COM = "amazon.com";
+	private final static String AMAZON_CA = "amazon.ca";
+	private final static String AMAZON_JP = "amazon.jp";
+	private final static String AMAZON_ES = "amazon.es";
+	private final static String AMAZON_CO_UK = "amazon.co.uk";
+	private final static String AMAZON_FR = "amazon.fr";
+	private final static String AMAZON_DE = "amazon.de";
+	private final static String AMAZON_IT = "amazon.it";
+	private final static String AMAZON_AU = "amazon.com.au";
+	
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	@Autowired
+	private ISyncAmazonOrderDao syncAmazonOrderDao;
+	
+	@Autowired
+	private ReportDataSaveSupport reportDataSaveSupport;
+
+	private static final String _GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_ = "_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_";
+	
+	private static final String _GET_RESERVED_INVENTORY_DATA_ = "_GET_RESERVED_INVENTORY_DATA_";
+	
+	private static final String[] FBA_INVENTORIES = new String[] { _GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_, _GET_RESERVED_INVENTORY_DATA_ };
+	
+	/**
+	 * Spring Schedule:生成亚马逊FBA库存报表请求清单</br>
+	 * <p>
+	 * 调用亚马逊商城网络服务(亚马逊MWS)下的亚马逊物流 (FBA) 报告相关API:</br>
+	 * <tt>
+	 * 1. 亚马逊物流管理库存(<code>ReportType</code> = <code>_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_</code>);</br>
+	 * 2. 亚马逊物流预留库存(<code>ReportType</code> = <code>_GET_RESERVED_INVENTORY_DATA_</code>)</br>
+	 * </tt>
+	 * 并且将请求列表数据预插入到当前系统亚马逊报表请求数据表(<code>table: amazon_reports_request</code>)中
+	 * </p>
+	 */
+	public void genFBAInventoryRequests() {
+		CollectionUtil.each(this.syncAmazonOrderDao.getAmazonAccounts(), new IAction<AmazonAccountModel>() {
+			@SuppressWarnings("unchecked")
+			public void excute(AmazonAccountModel account) {
+				for (String type : FBA_INVENTORIES) {
+					String response = postAmazonReport(account, type);
+					Map<String, Object> data = parseAmazonFBAInventoryResponseXml(response);
+					if(null != data) {
+						String site = siteid2site.get(account.getSiteId());
+						if(StringUtils.isNotBlank(site)) {
+							saveRequests((List<Map<String,Object>>) data.get("data"),  account, site, true);	
+						}
+					} else {
+						try {
+							log.warn(String.format(">>> 获取或解析请求列表失败:Account=%s; ReportType=%s; Response=%s", StringUtil.instanceDetail(account), type, response));
+						} catch (Exception e) {
+							log.error(">>> exec 'log.warn' error >>>" + e.getMessage(), e);
+						}
+					}
+
+					//扩大每次请求的时间间隔,避免触发亚马逊的请求保护机制。
+					try {
+						log.info("获取reportRequest清单,下一次请求等待中(45s).......");
+						Thread.sleep(45 * 1000);
+					} catch (InterruptedException e) {
+						
+					}
+				}
+			}
+		});
+	}
+	
+	private static final Map<String, String> siteid2site = new HashMap<String, String>();
+
+	private static final String SITE_CO_UK = "amazon.co.uk";
+	
+	private static final String SITE_DE = "amazon.de";
+	
+	static {
+		siteid2site.put("ATVPDKIKX0DER", "amazon.com");
+		siteid2site.put("A1VC38T7YXB528", "amazon.jp");
+		siteid2site.put("A2EUQ1WTGCTBG2", "amazon.ca");
+		siteid2site.put("A1RKKUPIHCS9HS", "amazon.es");
+		siteid2site.put("A1F83G8C2ARO7P", SITE_CO_UK);
+		siteid2site.put("A1PA6795UKMFR9", SITE_DE);
+		siteid2site.put("A1RKKUPIHCS9HS,A1F83G8C2ARO7P,A1PA6795UKMFR9,A13V1IB3VIYZZH,APJ6JRA9NG5V4", SITE_DE);
+		siteid2site.put("A13V1IB3VIYZZH", "amazon.fr");
+		siteid2site.put("APJ6JRA9NG5V4", "amazon.it");
+		siteid2site.put("A39IBJ37TRP1C6", "amazon.com.au");
+	}
+	
+	/**
+	 * @deprecated
+	 */
+	@SuppressWarnings("unused")
+	private Map<String, String> amazonPOST(AmazonAccountModel account, String reportType) {
+		Map<String, String> result = new HashMap<String, String>();
+		AmazonRequestConfig config = new AmazonRequestConfig(account, "RequestReport", "2009-01-01");
+		if("DE".equals(account.getPlatform().toUpperCase())) {
+			Map<String, String> de = new HashMap<>(), uk = new HashMap<>();
+			de.put("ReportType", reportType);
+			uk.put("ReportType", reportType);
+			Counter counter = new Counter();
+			CollectionUtil.each(account.getSiteId().split(","), new IAction<String>() {
+				public void excute(String siteid) {
+					if(SITE_CO_UK.equals(siteid2site.get(siteid))) {
+						uk.put("MarketplaceIdList.Id.1", siteid);
+					} else {
+						de.put("MarketplaceIdList.Id." + counter.beforePlus(), siteid);
+					}
+				}
+			});
+			config.setQueryParameters(de);
+			result.put(SITE_DE, AmazonHttpUtil.amazonPOST(config));
+			config.setQueryParameters(uk);
+			result.put(SITE_CO_UK, AmazonHttpUtil.amazonPOST(config));
+		} else {
+			Map<String, String> param = new HashMap<>();
+			param.put("ReportType", reportType);
+			param.put("MarketplaceIdList.Id.1", account.getSiteId());	
+			config.setQueryParameters(param);
+			result.put(siteid2site.get(account.getSiteId()), AmazonHttpUtil.amazonPOST(config));
+		}
+		return result;
+	}
+	
+	private String postAmazonReport(AmazonAccountModel account, String reportType) {
+		AmazonRequestConfig config = new AmazonRequestConfig(account, "RequestReport", "2009-01-01");
+		Map<String, String> param = new HashMap<>();
+		param.put("ReportType", reportType);
+		Counter counter = new Counter();
+		CollectionUtil.each(account.getSiteId().split(","), new IAction<String>() {
+			public void excute(String siteId) {
+				param.put("MarketplaceIdList.Id." + counter.beforePlus(), siteId);
+			}
+		});
+		config.setQueryParameters(param);
+		return AmazonHttpUtil.amazonPOST(config);
+	}
+	
+	/**
+	 * 同步报表清单
+	 */
+	public void syncReportRequestList(){
+		List<AmazonAccountModel> accounts = syncAmazonOrderDao.getAmazonAccounts();
+		for(AmazonAccountModel account : accounts){
+			this.getReportRequestListByAccount(account);
+		}
+	}
+	
+	/**
+	 * 根据亚马逊账号获取报表清单
+	 * @param account
+	 */
+	public void getReportRequestListByAccount(AmazonAccountModel account){
+		AmazonRequestMode requestMode = AmazonUtils.getRequestModel(account);
+		requestMode.setCreatedAfter(UTCTimeUtils.getUTCTimeStr(-24*3));
+		requestMode.setCreatedBefore(UTCTimeUtils.getUTCTimeStr(0));
+		MarketplaceWebServiceClient client = GetAmazonClient.createReportClient(requestMode);
+		GetReportRequestListRequest request = AmazonRequest.createReportRequestListRequest(requestMode);
+		try {
+			GetReportRequestListResponse response = client.getReportRequestList(request);
+			Map<String,Object> data = paseReportRequestList(response.toXML());
+			if(null == data){
+				return;
+			}
+			List<Map<String,Object>> requestList = (List<Map<String,Object>>)data.get("data");
+			saveData(requestList,account);
+			String nextToken = (String)data.get("nextToken");
+			boolean hasNext = (boolean)data.get("hasNext");
+			while(hasNext){
+				requestMode.setNextToken(nextToken);
+				GetReportRequestListByNextTokenRequest requestByNextToken = AmazonRequest.createReportRequestListByNextTokenRequest(requestMode);
+				GetReportRequestListByNextTokenResponse responseByNextToken = client.getReportRequestListByNextToken(requestByNextToken);
+				data = paseReportRequestList(responseByNextToken.toXML());
+				if(null == data){
+					return;
+				}
+				requestList = (List<Map<String,Object>>)data.get("data");
+				saveData(requestList,account);
+				nextToken = (String)data.get("nextToken");
+				hasNext = (boolean)data.get("hasNext");
+				try {
+					log.info("获取reportRequest清单,下一次请求等待中(45s).......");
+					Thread.sleep(45*1000);
+				} catch (InterruptedException e) {
+					
+				}
+			}
+			
+		} catch (MarketplaceWebServiceException e) {
+			log.info("获取亚马逊报表请求清单失败", e);
+		}
+	}
+	
+	/**
+	 * 保存报表清单数据
+	 * @param requestList
+	 * @param account
+	 */
+	private void saveData(List<Map<String, Object>> requestList, AmazonAccountModel account) {
+		for(Map<String, Object> request : requestList){
+			request.put("platform", account.getPlatform());
+			request.put("account", account.getSellerId());
+			iAmazonReportDao.saveData(request);
+		}
+		
+	}
+	
+	/**
+	 * 保存报表请求订单
+	 * @param requests
+	 * @param account
+	 * @param site 站点,例如: "amazon.com"
+	 * @param sysAuto 是否属于当前平台自动保存	
+	 */
+	public void saveRequests(List<Map<String, Object>> requests, AmazonAccountModel account, String site, boolean sysAuto) {
+		CollectionUtil.each(requests, new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> request) {	
+				request.put("platform", account.getPlatform());
+				request.put("account", account.getSellerId());
+				request.put("site", site);
+				if(sysAuto) {
+					request.put("generateMode", "sys_auto");
+				}
+				iAmazonReportDao.saveRequest(request);
+			}
+		});
+	}
+
+	private static final String MWS_URL_PREFIX = "https://mws.amazonservices.";
+	
+	private static final String SITE_PREFIX = "amazon.";
+	
+	/**
+	 * @deprecated
+	 * @param account
+	 * @return
+	 */
+	private String genSite(AmazonAccountModel account) {
+		String url = account.getUrl();
+		String temp = url.replace(MWS_URL_PREFIX, "");
+		int index = temp.indexOf("/");
+		String country = index >= 0 ? temp.substring(0, index) : temp;
+		return SITE_PREFIX + country;
+	}
+	
+	/**
+	 * 解析报表清单xml数据
+	 * @param xml
+	 * @return
+	 */
+	public Map<String,Object> paseReportRequestList(String xml){
+		Map<String,Object> map = null;
+		try {
+			Document doc = DocumentHelper.parseText(xml);
+			ParseAmazonReportRequstListXMLModel parse = new ParseAmazonReportRequstListXMLModel(doc,"http://mws.amazonaws.com/doc/2009-01-01/");
+			map = new HashMap<>();
+			map.put("data", parse.getResult());
+			map.put("nextToken",  parse.getNextToken());
+			map.put("hasNext",  parse.hasNext());
+		} catch (DocumentException e) {
+			log.info("获取亚马逊报表请求清单解析失败", e);
+		}
+		return map;
+	}
+
+	public Map<String, Object> parseAmazonFBAInventoryResponseXml(String response) {
+		Map<String,Object> map = null;
+		try {
+			ParseXMLModel2 parser = new ParseXMLModel2(response, "http://mws.amazonaws.com/doc/2009-01-01/") {
+				@Override
+				public List<Map<String, Object>> getResult() {
+					XMLNode [] columns = {
+						XMLNode.getInstance("ReportType"),
+						XMLNode.getInstance("ReportProcessingStatus"),
+						XMLNode.getInstance("EndDate", XMLNode.DATE_UTC),
+						XMLNode.getInstance("Scheduled"),
+						XMLNode.getInstance("ReportRequestId"),
+						XMLNode.getInstance("StartedProcessingDate", XMLNode.DATE_UTC),
+						XMLNode.getInstance("SubmittedDate", XMLNode.DATE_UTC),
+						XMLNode.getInstance("CompletedDate", XMLNode.DATE_UTC),
+						XMLNode.getInstance("StartDate", XMLNode.DATE_UTC),
+						XMLNode.getInstance("GeneratedReportId")
+					};
+					
+					List<Map<String,Object>> list = new ArrayList<>();
+					List<Element> elements = this.getElementChild("RequestReportResult_ReportRequestInfo");
+					for(Element element : elements) {
+						element = this.formateElement(element);
+						Map<String,Object> map = parseRecord(element,columns);
+						list.add(map);
+					}
+					return list;
+				}
+			};
+			map = new HashMap<>();
+			map.put("data", parser.getResult());
+		} catch(Exception e) {
+			log.error("解析Amazon请求返回的Xml数据失败", e);
+		}
+		return map;
+	}
+	
+	/**
+	 * task调用方法,获取所有的亚马逊账号,并下载所属订单报告
+	 */
+	public void downloadReportFile(){
+		List<AmazonAccountModel> accounts = syncAmazonOrderDao.getAmazonAccounts();
+		for(AmazonAccountModel account : accounts){
+			List<ReportRequestListModel> requests = iAmazonReportDao.getDownloadReportByAccount(account.getPlatform());
+			int size = requests == null ? 0 : requests.size();
+			for (int i = size - 1; i >= 0 ; i--) {
+				if(isNotNeedDownload(requests.get(i))) {
+					requests.remove(i);
+				}
+			}
+			downloadReportByAccount(account, requests);
+		}
+	}
+	
+	/**
+	 * 判断之情的请求是否属于不需要下载的请求
+	 * @param request
+	 * @return true-不需要下载; false-需要下载
+	 */
+	private boolean isNotNeedDownload(ReportRequestListModel request) {
+		//"sys_auto"表示由当前系统平台自动生成,而非人工在Amazon FBA Inventory平台上操作生成的请求列表
+		return (_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_.equals(request.getReportType()) 
+				|| _GET_RESERVED_INVENTORY_DATA_.equals(request.getReportType())) && !"sys_auto".equals(request.getGenerateMode());
+	}
+	
+	@SuppressWarnings("static-access")
+	private boolean canUpdateStite(String reportType) {
+		return reportDataSaveSupport._GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_.equals(reportType);
+	}
+	
+	/**
+	 * 下载报告根据亚马逊账号
+	 * @param account
+	 */
+	public void downloadReportByAccount(AmazonAccountModel account, List<ReportRequestListModel> requests) {
+		TaskExecutorUtil.threadRun(new TaskRunnable(){
+
+			@Override 
+			public void runTask() {
+				AmazonRequestMode requestMode = AmazonUtils.getRequestModel(account);
+				Map<String,Object> param = new HashMap<>();
+				for(ReportRequestListModel request : requests){
+					param.put("reportId", request.getReportGetId());
+					requestMode.setParam(param);
+					download(requestMode,request);
+					try {
+						log.info(account.getPlatform()+" 下载report,下一次请求等待中(60).......");
+						Thread.sleep(60*1000);
+					} catch (InterruptedException e) {
+						
+					}
+				}
+			}
+			private void download(AmazonRequestMode requestMode,ReportRequestListModel request){
+				AmazonReportServiceClient client = GetAmazonClient.createReportDownloadClient(requestMode);
+				GetReportRequest getReportRequest = AmazonRequest.createReportRequest(requestMode);
+				FileWriter writer = null;
+				String fileName = request.getPlatform()+"-"+request.getReportGetId()+"-"+System.currentTimeMillis()+".txt";
+				String filePathName = createFilePath()+File.separator+fileName;
+				try {
+					String data = client.downloadReport(getReportRequest);
+					if(null !=data && !"".equals(data)){
+						
+						File file = new File(filePathName);
+		        		if(!file.exists()){
+		        			file.createNewFile();
+		        		}
+		        		writer = new FileWriter(file);
+		        		writer.write(data);
+		                writer.flush();
+		                request.setFilePathName(filePathName);
+		                iAmazonReportDao.updateReportRequest(request);
+		                writer.close();
+		                if(canUpdateStite(request.getReportType())) {
+			                updateRequestSite(request,filePathName);
+		                }
+					}
+	        		
+				} catch (Exception e) {
+					log.info("获取亚马逊报表数据失败", e);
+				}finally{
+					if(null != writer){
+						try {
+							writer.close();
+						} catch (IOException e) {
+						}
+					}
+				}
+				
+				
+			}
+			
+			private void updateRequestSite(ReportRequestListModel request, String filePathName) {
+				FileInputStream fis = null;
+				InputStreamReader isr = null;
+				BufferedReader br = null;
+				try {
+					fis = new FileInputStream(filePathName);
+					isr= new InputStreamReader(fis, "UTF-8");
+			        br = new BufferedReader(isr);
+			        String line="";
+			        String data[] = null;
+			        String site = "";
+			        boolean isTitle = true;
+			        List<String> getSiteData = new ArrayList<>();
+			        
+			        while ((line=br.readLine())!=null) {
+			        	if(line.length()<10){
+			        		continue;
+			        	}
+			        	line = line.substring(1, line.length()-1);
+			        	data = line.split("\",\"");
+			        	if(data.length > 10){
+			        		if(isTitle){
+			        			isTitle = false;
+			        		}else{
+			        			if(getSiteData.size()<100){
+			        				getSiteData.add(line);
+			        			}else{
+			        				break;
+			        			}
+			        		}
+			        	}
+			        }
+			        if(getSiteData.size()>0){
+			        	site = getSite(getSiteData,filePathName);
+			        	request.setSite(site);
+			        	iAmazonReportDao.updateRequestSite(request);
+			        }
+			        
+				} catch (Exception e) {
+					log.info("解析订单报表数据失败",e);
+				}finally {
+					if(null !=br){
+						try {
+							br.close();
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+					}
+					if(null != isr){
+						try {
+							isr.close();
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+					}
+			        if(null != fis){
+			        	try {
+							fis.close();
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+			        }
+				}
+			}
+		});
+	}
+	
+	
+
+	/**
+	 * 根据日期创建目录
+	 * @return
+	 */
+	public static String createFilePath(){
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		String day = sdf.format(new Date());
+		String path = BASE_PATH + day;
+		File fileDir = new File(path);
+		if(!fileDir.exists()){
+			fileDir.mkdirs();
+		}
+		return path;
+	}
+	
+	/**
+	 * 获取带解析文件清单
+	 */
+	public void paseOrderReport(){
+		String sites[] = {"amazon.ca","amazon.jp","amazon.es","amazon.it","amazon.fr","amazon.co.uk","amazon.com","amazon.de","amazon.com.au"};
+		for(String site : sites){
+			//先处理异常数据
+			//paseExceptionData(site);
+			paseSysClickData(site);
+		}
+		
+	}
+	
+	private void paseExceptionData(String site){
+		List<ReportRequestListModel> reports = iAmazonReportDao.getExceptionTimeData(site);
+		for(ReportRequestListModel reportMode: reports){
+			List<ReportRequestListModel> startData = iAmazonReportDao.getAllBetweenData(reportMode);
+			if(null == startData || startData.size() == 0){
+				continue;
+			}
+			FindTimeLine line = new FindTimeLine(startData, reportMode.getStartDate(), reportMode.getEndDate());
+			//解析
+			List<ReportRequestListModel> re = line.getReturn();
+			if(null != re){
+				for(ReportRequestListModel data : re){
+					paseData(data);
+				}
+				//更新此条异常数据
+				iAmazonReportDao.updateReportExceptionStatus(reportMode);
+			}
+			
+		}
+	}
+	
+
+
+	private void paseSysClickData(String site){
+		ReportRequestListModel reportMode = iAmazonReportDao.getParseStart(site);
+		if(null == reportMode){
+			return;
+		}
+		String startTime = "";
+		String endTime = "";
+		while(null != reportMode){
+			if(reportMode.getIsParse() == 0&&reportMode.getIsGetData()==1){
+				paseData(reportMode);
+			}
+			startTime = reportMode.getEndDate();
+			reportMode.setStartDate(startTime);
+			//获取中断的结束时间
+			endTime = iAmazonReportDao.getEndTime(reportMode);
+			reportMode.setEndDate(endTime);
+			reportMode = iAmazonReportDao.getNextParseReport(reportMode);
+		}
+		if(null == reportMode&&isBreakOff(site,startTime)){
+			log.info("--------------------------------------------------------------------------");
+			log.info("----站点"+site+"订单报表数据中断 time:"+startTime+"------------------");
+			log.info("--------------------------------------------------------------------------");
+			reportMode = new ReportRequestListModel();
+			reportMode.setSite(site);
+			reportMode.setStartDate(startTime);
+			reportMode.setEndDate(endTime);
+			//选择所有的请求清单(包含白天点击的报表数据)中此时间段的数据
+			//根据起始时间和结束时间判断
+			String platform = site.substring(site.lastIndexOf(".")).toUpperCase();
+			if("COM".equals(platform)){
+				platform = "US";
+			}else if("CA".equals(platform)||"JP".equals(platform)){
+				platform = platform;
+			}else{
+				platform = "DE";
+			}
+			reportMode.setPlatform(platform);
+			iAmazonReportDao.chooseByRequestList(reportMode);
+			iAmazonReportDao.addOrderReportException(reportMode);
+		}
+	}
+	
+	
+	private void paseData(ReportRequestListModel reportMode) {
+		iAmazonReportDao.deleteReportDataById(reportMode.getReportGetId());
+		paseOrderReportData(reportMode);
+		
+	}
+	/**
+	 * 判断数据是否中断
+	 * 依据:此时间之后,存在系统点的报表
+	 * @param site
+	 * @param startTime
+	 * @return
+	 */
+	private boolean isBreakOff(String site, String startTime) {
+		Map map = new HashMap<>();
+		map.put("site", site);
+		map.put("startTime", startTime);
+		//return iAmazonReportDao.isBreakOff(map)>0?true:false;
+		return false;
+	}
+	
+	/**
+	 * 读取文件解析数据
+	 * @param reportMode
+	 */
+	private void paseOrderReportData(ReportRequestListModel reportMode) {
+		FileInputStream fis = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		try {
+			fis = new FileInputStream(reportMode.getFilePathName());
+			isr= new InputStreamReader(fis, "UTF-8");
+	        br = new BufferedReader(isr);
+	        String line="";
+	        String title[] = null;
+	        String data[] = null;
+	        String site = "";
+	        boolean isTitle = true;
+	        boolean getsiteDataFlag = true;
+	        List<String> getSiteData = new ArrayList<>();
+	        List<String[]> reportData = new ArrayList<>();
+	        List<ColumnData> columnSet = new ArrayList<>();
+	        //计数,避免同一个report被多次解析
+	        int count = 0;
+	        while ((line=br.readLine())!=null) {
+	        	if(line.length()<10){
+	        		continue;
+	        	}
+	        	while(line.contains("\",,") || line.contains(",,\"")){
+	        		line = line.replace(",,", ",\"\",");
+	    		}
+	        	line = line.substring(1, line.length()-1);
+	        	data = line.split("\",\"");
+	        	if(data.length > 10){
+	        		if(isTitle){
+	        			title = data;
+	        			isTitle = false;
+	        		}else{
+	        			count++;
+	        			if(getSiteData.size()<100){
+	        				getSiteData.add(line);
+	        			}
+	        			if(getSiteData.size()>=100 && getsiteDataFlag){
+	        				site = getSite(getSiteData,reportMode.getFilePathName());
+	        				columnSet = reportDataSaveSupport.getColumnData(site,reportDataSaveSupport._GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_);
+	        				getsiteDataFlag = false;
+	        			}
+	        			reportData.add(data);
+	        			if(reportData.size()>0&&reportData.size()%100==0){
+	        				reportDataSaveSupport.saveData(reportData,title,columnSet,reportMode,site);
+	        				reportData.clear();
+	        			}
+	        			
+	        			
+	        		}
+	        	}
+	        }
+	        if(getSiteData.size()<100){
+	        	site = getSite(getSiteData,reportMode.getFilePathName());
+				columnSet = reportDataSaveSupport.getColumnData(site,reportDataSaveSupport._GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_);
+	        }
+
+	        if(reportData.size()> 0){
+	        	//最后数据不足100条,数据处理
+		        reportDataSaveSupport.saveData(reportData,title,columnSet,reportMode,site);
+	        }
+	        //验证计数与数据库数量是否匹配
+	        if(iAmazonReportDao.countThisReportData(reportMode.getReportGetId()) > count){
+	        	iAmazonReportDao.deleteReportDataById(reportMode.getReportGetId());
+	        }else{
+	        	iAmazonReportDao.updateParseStatus(reportMode);
+	        }
+	        
+		} catch (Exception e) {
+			iAmazonReportDao.deleteReportDataById(reportMode.getReportGetId());
+			log.info("解析订单报表数据失败",e);
+		}finally {
+			if(null !=br){
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if(null != isr){
+				try {
+					isr.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+	        if(null != fis){
+	        	try {
+					fis.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+	        }
+		}
+	}
+	/**
+	 * 根据数据判断站点信息,
+	 * <取100条数据,判断站点名称出现次数>
+	 * @param getSiteData
+	 * @param fileName 
+	 * @return
+	 */
+	private String getSite(List<String> getSiteData, String fileName) {
+		String dataDemo = null;
+		Map<String,Integer> map = new HashMap();
+		for(String str : getSiteData){
+			if(null == dataDemo){
+				dataDemo = str;
+			}
+			if(str.indexOf(this.AMAZON_AU)>-1){
+				Integer count = map.get(AMAZON_AU);
+				if(null == count){
+					map.put(AMAZON_AU, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_AU, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_COM)>-1){
+				Integer count = map.get(AMAZON_COM);
+				if(null == count){
+					map.put(AMAZON_COM, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_COM, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_CA)>-1){
+				Integer count = map.get(AMAZON_CA);
+				if(null == count){
+					map.put(AMAZON_CA, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_CA, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_CO_UK)>-1){
+				Integer count = map.get(AMAZON_CO_UK);
+				if(null == count){
+					map.put(AMAZON_CO_UK, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_CO_UK, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_DE)>-1){
+				Integer count = map.get(AMAZON_DE);
+				if(null == count){
+					map.put(AMAZON_DE, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_DE, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_ES)>-1){
+				Integer count = map.get(AMAZON_ES);
+				if(null == count){
+					map.put(AMAZON_ES, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_ES, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_FR)>-1){
+				Integer count = map.get(AMAZON_FR);
+				if(null == count){
+					map.put(AMAZON_FR, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_FR, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_JP)>-1){
+				Integer count = map.get(AMAZON_JP);
+				if(null == count){
+					map.put(AMAZON_JP, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_JP, count);
+				}
+				continue;
+			}else if(str.indexOf(this.AMAZON_IT)>-1){
+				Integer count = map.get(AMAZON_IT);
+				if(null == count){
+					map.put(AMAZON_IT, 1);
+				}else{
+					count = count + 1;
+					map.put(AMAZON_IT, count);
+				}
+				continue;
+			}
+		}
+		
+		//不含站点信息
+		if(map.isEmpty()){
+			if(fileName.contains("US-")){
+				return AMAZON_COM;
+			}else if(fileName.contains("CA-")){
+				return AMAZON_CA;
+			}else if(fileName.contains("JP-")){
+				return AMAZON_JP;
+			}else if(fileName.contains("AU-")){
+				return AMAZON_AU;
+			}else if(fileName.contains("DE-")){
+				String dateTimeStr = dataDemo.split("\",\"")[0];
+				if(dateTimeStr.contains("/")){
+					String month = dateTimeStr.split("/")[1];
+					if(isNumeric(month)){
+						return AMAZON_ES;
+					}else{
+						return AMAZON_IT;
+					}
+				}
+				if(dateTimeStr.contains(".")){
+					String month = dateTimeStr.split("\\.")[1];
+					if(isNumeric(month)){
+						return AMAZON_DE;
+					}else{
+						return AMAZON_FR;
+					}
+				}
+				
+				return AMAZON_CO_UK;
+			}
+		}
+		String site = "";
+		int max = 0;
+		for(Map.Entry<String, Integer> entry:map.entrySet()){
+			if(entry.getValue() > max){
+				max = entry.getValue();
+				site = entry.getKey();
+			}
+		}
+		return site;
+	}
+
+	
+	public final static boolean isNumeric(String s) {  
+        if (s != null && !"".equals(s.trim()))  
+            return s.matches("^[0-9]*$");  
+        else {
+            return false;
+        }
+    }
+	public void amazonDataOneDay(){
+		List<Map<String,Object>> list = iAmazonReportDao.getAmazonChangeData();
+		for(Map<String,Object> map : list){
+			int dateType = Integer.parseInt(map.get("DATETYPE").toString());
+			if(dateType == 1){
+				iAmazonReportDao.countAmazonDataByCreateTime(map);
+			}
+			if(dateType == 2){
+				iAmazonReportDao.countAmazonDataByUpdateTime(map);
+			}
+			if(dateType == 3){
+				iAmazonReportDao.countAmazonDataByShipTime(map);
+			}
+			
+		}
+	}
+}

+ 16 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonOrderReportService.java

@@ -0,0 +1,16 @@
+package com.it.ocs.amazon.service;
+
+import java.util.List;
+
+import com.it.ocs.amazon.model.OrderReportVO;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+import com.it.ocs.publication.vo.ComboBoxVO;
+
+public interface IAmazonOrderReportService {
+
+	public ResponseResult<OrderReportVO> findOrderReportList(RequestParam param);
+
+	public List<ComboBoxVO> getOrderTypeBySite(String site);
+
+}

+ 5 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonReportParserService.java

@@ -0,0 +1,5 @@
+package com.it.ocs.amazon.service;
+
+public interface IAmazonReportParserService {
+	public void parserReportData();
+}

+ 5 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/IAmazonRequestReportService.java

@@ -0,0 +1,5 @@
+package com.it.ocs.amazon.service;
+
+public interface IAmazonRequestReportService {
+	public void genRequests();
+}

+ 249 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/InventoryReportParseSupport.java

@@ -0,0 +1,249 @@
+package com.it.ocs.amazon.service;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.ColumnData;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+
+/**
+ * Amazon FBA Inventory 
+ * @author chenyong
+ *
+ */
+@Service
+public class InventoryReportParseSupport {
+	private final static Logger log = Logger.getLogger(InventoryReportParseSupport.class);
+	private final static String sites[] = {"amazon.ca","amazon.jp","amazon.es","amazon.it","amazon.fr","amazon.co.uk","amazon.com","amazon.de","amazon.com.au"};
+	
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	@Autowired
+	private ReportDataSaveSupport reportDataSaveSupport;
+	
+	/**
+	 * 解析启动的task方法
+	 */
+	public void paseInventoryReport(){
+		
+		for(String site : sites){
+			//解析FBAInventory
+			parseFBAInventoryReportData(site);
+			//解析 Inventory Reserved
+			parseInventoryReservedReportData(site);
+		}
+		
+	}
+	
+	/**
+	 * InventoryReserved
+	 * @param site
+	 */
+	private void parseInventoryReservedReportData(String site) {
+		Map<String,Object> map = new HashMap<>();
+		map.put("site", site);
+		map.put("reportType", reportDataSaveSupport._GET_RESERVED_INVENTORY_DATA_);
+		List<ReportRequestListModel> inventoryReportList = iAmazonReportDao.getParseReport(map);
+		for(ReportRequestListModel report : inventoryReportList){
+			parseInventoryReservedReport(report);
+		}
+		
+	}
+	/**
+	 * 解析 InventoryReserved
+	 * @param report
+	 */
+	private void parseInventoryReservedReport(ReportRequestListModel reportMode) {
+		//清除此报表数据
+		iAmazonReportDao.deleteInventoryReservedReportDataById(reportMode.getReportGetId());
+		//解析数据
+		FileInputStream fis = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		try {
+			fis = new FileInputStream(reportMode.getFilePathName());
+			isr= new InputStreamReader(fis, "UTF-8");
+	        br = new BufferedReader(isr);
+	        String line="";
+	        String title[] = null;
+	        String data[] = null;
+	        boolean isTitle = true;
+	        List<String[]> reportData = new ArrayList<>();
+	        List<ColumnData> columnSet = reportDataSaveSupport.getColumnData(reportMode.getSite(),reportDataSaveSupport._GET_RESERVED_INVENTORY_DATA_);
+	        
+	        //计数,避免同一个report被多次解析
+	        int count = 0;
+	        while ((line=br.readLine())!=null) {
+	        	data = line.split("\t");
+	        	if(isTitle){
+        			title = data;
+        			isTitle = false;
+        		}else{
+        			count++;
+        			reportData.add(data);
+        			if(reportData.size()>0&&reportData.size()%100==0){
+        				reportDataSaveSupport.saveInventoryReservedData(reportData,title,columnSet,reportMode);
+        				reportData.clear();
+        			}
+        		}
+	        }
+
+	        if(reportData.size()> 0){
+	        	//最后数据不足100条,数据处理
+		        reportDataSaveSupport.saveInventoryReservedData(reportData,title,columnSet,reportMode);
+	        }
+	        //验证计数与数据库数量是否匹配
+	        if(iAmazonReportDao.countThisInventoryReservedReportData(reportMode.getReportGetId()) > count){
+	        	iAmazonReportDao.deleteInventoryReservedReportDataById(reportMode.getReportGetId());
+	        }else{
+	        	iAmazonReportDao.updateParseStatus(reportMode);
+	        }
+	        
+		} catch (Exception e) {
+			iAmazonReportDao.deleteInventoryReservedReportDataById(reportMode.getReportGetId());
+			log.info("解析订单报表数据失败",e);
+		}finally {
+			if(null !=br){
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if(null != isr){
+				try {
+					isr.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+	        if(null != fis){
+	        	try {
+					fis.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+	        }
+		}
+		
+	}
+
+	/**
+	 * FBA库存数据
+	 * @param site
+	 */
+	private void parseFBAInventoryReportData(String site) {
+		Map<String,Object> map = new HashMap<>();
+		map.put("site", site);
+		map.put("reportType", reportDataSaveSupport._GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_);
+		List<ReportRequestListModel> inventoryReportList = iAmazonReportDao.getParseReport(map);
+		for(ReportRequestListModel report : inventoryReportList){
+			parseInventoryReport(report);
+		}
+		
+	}
+
+
+	/**
+	 * 解析FBA库存数据
+	 * @param reportMode
+	 */
+	private void parseInventoryReport(ReportRequestListModel reportMode) {
+		//清除此报表数据
+		iAmazonReportDao.deleteInventoryReportDataById(reportMode.getReportGetId());
+		//解析数据
+		FileInputStream fis = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		try {
+			fis = new FileInputStream(reportMode.getFilePathName());
+			isr= new InputStreamReader(fis, "UTF-8");
+	        br = new BufferedReader(isr);
+	        String line="";
+	        String title[] = null;
+	        String data[] = null;
+	        boolean isTitle = true;
+	        List<String[]> reportData = new ArrayList<>();
+	        List<ColumnData> columnSet = reportDataSaveSupport.getColumnData(reportMode.getSite(),reportDataSaveSupport._GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_);
+	        
+	        //计数,避免同一个report被多次解析
+	        int count = 0;
+	        while ((line=br.readLine())!=null) {
+	        	data = line.split("\t");
+	        	if(isTitle){
+        			title = data;
+        			isTitle = false;
+        		}else{
+        			count++;
+        			reportData.add(data);
+        			if(reportData.size()>0&&reportData.size()%100==0){
+        				reportDataSaveSupport.saveInventoryData(reportData,title,columnSet,reportMode);
+        				reportData.clear();
+        			}
+        		}
+	        }
+
+	        if(reportData.size()> 0){
+	        	//最后数据不足100条,数据处理
+		        reportDataSaveSupport.saveInventoryData(reportData,title,columnSet,reportMode);
+	        }
+	        //验证计数与数据库数量是否匹配
+	        if(iAmazonReportDao.countThisInventoryReportData(reportMode.getReportGetId()) > count){
+	        	iAmazonReportDao.deleteInventoryReportDataById(reportMode.getReportGetId());
+	        }else{
+	        	iAmazonReportDao.updateParseStatus(reportMode);
+	        }
+	        
+		} catch (Exception e) {
+			iAmazonReportDao.deleteInventoryReportDataById(reportMode.getReportGetId());
+			log.info("解析订单报表数据失败",e);
+		}finally {
+			if(null !=br){
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if(null != isr){
+				try {
+					isr.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+	        if(null != fis){
+	        	try {
+					fis.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+	        }
+		}
+		
+	}
+	
+	/**
+	 * Spring Schedule: 刷新亚马逊FBA库存报表UK站点
+	 * <p>
+	 * 因业务需要,亚马逊UK下的FBA库存是基于DE请求列表产生的,其解析保存的数据也是DE("amazon.de")。</br>
+	 * 该Task的作用就是,定时扫描FBA库存数据表,将本属于UK的数据的站点更新为"amazon.co.uk"。
+	 * </p>
+	 */
+	public void refreshFBAInventoryUKSiste() {
+		this.iAmazonReportDao.refreshReportUKSiste();
+		this.iAmazonReportDao.refreshReservedUKSiste();
+	}
+}

+ 179 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/ReportDataSaveSupport.java

@@ -0,0 +1,179 @@
+package com.it.ocs.amazon.service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.ColumnData;
+import com.it.ocs.amazon.model.MyiUnsuppressedVO;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+@Service
+public class ReportDataSaveSupport {
+	public final static String _GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_ ="_GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_";
+	public final static String _GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_ ="_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_";
+	public final static String _GET_RESERVED_INVENTORY_DATA_ = "_GET_RESERVED_INVENTORY_DATA_";
+	
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	public List<ColumnData> getColumnData(String site,String reportType){
+		Map<String,Object> map = new HashMap<>();
+		map.put("site", site);
+		map.put("reportType", reportType);
+		return iAmazonReportDao.getColumnData(map);
+	}
+   public String getPlatformBySite(String site){
+	   return iAmazonReportDao.getPlatformBySite(site);
+   }
+	
+	public void saveData(List<String[]> reportData, String[] title, List<ColumnData> columnData, ReportRequestListModel reportMode,String site) {
+		for(String[] data : reportData){
+			formatDataForSet(data,title,columnData,reportMode,site);
+		}
+	}
+	
+	private void formatDataForSet(String[] data, String[] title, List<ColumnData> columnData,ReportRequestListModel reportMode,String site) {
+		Map<String,String> map = new HashMap<>();
+		for(int i=0;i<title.length;i++){
+			map.put(title[i], data[i]);
+		}
+		getSaveData(map,columnData,reportMode,site);
+	}
+    
+	private void getSaveData(Map<String, String> map, List<ColumnData> columnData,ReportRequestListModel reportMode,String site) {
+		Map<String,Object> data = new HashMap<>();
+		for(ColumnData column : columnData){
+			String value = map.get(column.getLinkName());
+			String columnName = column.getColumnName();
+			if(null != value&&!"".equals(value)){
+				column.setValue(value);
+				data.put(columnName, column.getValue());
+				if("date_time".equals(columnName)){
+					data.put("self_date", ColumnData.getSelfDateValue(value, column.getColumnType()));
+				}
+			}else{
+				data.put(columnName, "");
+			}
+		}
+		data.put("report_id", reportMode.getReportGetId());
+		data.put("platform", reportMode.getPlatform());
+		data.put("site", site);
+		save(data);
+	}
+
+	private void save(Map<String, Object> data) {
+		Object time = data.get("date_time");
+		if(null == time || "".equals(time.toString())){
+			return ;
+		}
+		iAmazonReportDao.addOrderReport(data);
+	}
+	
+	public void saveInventoryData(List<String[]> reportData, String[] title, List<ColumnData> columnSet,
+			ReportRequestListModel reportMode) {
+		for(String[] data : reportData){
+			Map<String,String> map = new HashMap<>();
+			for(int i=0;i<title.length;i++){
+				map.put(title[i], data[i]);
+			}
+			Map<String,Object> saveData = formatData(map,columnSet,reportMode);
+			if(!saveData.isEmpty()){
+				iAmazonReportDao.inventorySave(saveData);
+			}
+		}
+	}
+	
+	/**
+	 * 根据映射组装数据存储
+	 * @param map 报表数据
+	 * @param columnData 报表标题和数据字段映射关系
+	 * @param reportMode 报表mode
+	 * @return
+	 */
+	private Map<String,Object> formatData(Map<String, String> map, List<ColumnData> columnData, ReportRequestListModel reportMode) {
+		Map<String,Object> data = new HashMap<>();
+		for(ColumnData column : columnData){
+			String value = map.get(column.getLinkName());
+			String columnName = column.getColumnName();
+			if(null != value&&!"".equals(value)){
+				column.setValue(value);
+				data.put(columnName, column.getValue());
+			}else{
+				data.put(columnName, "");
+			}
+		}
+		data.put("REPORT_ID", reportMode.getReportGetId());
+		data.put("SITE", reportMode.getSite());
+		return data;
+	}
+	
+	public void saveInventoryReservedData(List<String[]> reportData, String[] title, List<ColumnData> columnSet,
+			ReportRequestListModel reportMode) {
+		for(String[] data : reportData){
+			Map<String,String> map = new HashMap<>();
+			for(int i=0;i<title.length;i++){
+				map.put(title[i], data[i]);
+			}
+			Map<String,Object> saveData = formatData(map,columnSet,reportMode);
+			if(!saveData.isEmpty()){
+				iAmazonReportDao.inventoryReservedSave(saveData);
+			}
+		}
+		
+	}
+	
+	public static void main(String[] args) {
+		/*String c[] = {"date_time","settlement id","type","order id","sku","description","quantity","marketplace","fulfillment","order city","order state","order postal","product sales","shipping credits","gift wrap credits","promotional rebates","selling fees","fba fees","other transaction fees","other","total"};
+		String t[] = {"Data/Ora:","Numero pagamento","Tipo","Numero ordine","SKU","Descrizione","Quantità","Marketplace","Gestione","Città di provenienza dell'ordine","Provincia di provenienza dell'ordine","CAP dell'ordine","Vendite","Accrediti per le spedizioni","Accrediti per confezioni regalo","Sconti promozionali","Commissioni di vendita","Costi del servizio Logistica di Amazon","Altri costi relativi alle transazioni","Altro","totale"};
+		for(int i=0;i<c.length;i++){
+			String str = c[i].trim();
+			String str1 = str.replaceAll("\\s+", "_");
+			String str2 = t[i].trim();
+			//System.out.println(str+ "  VARCHAR2(256),");
+			System.out.println("INSERT INTO AMAZON_REPORT_COLUMN_SET(ID,REPORT_TYPE,COLUMN_NAME,LINK_NAME,COLUMN_TYPE,PLATFORM,SITE_NAME,CREATE_DATE,UPDATE_DATE)VALUES(AMAZON_REPORT_COLUMN_SET_SEQ.NEXTVAL,'_GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_','"+str1+"','"+str2+"',0,'DE','amazon.it',SYSDATE,SYSDATE);");
+		}*/
+		/*String str = "\",,,,,,,\"";
+		System.out.println(str);
+		while(str.contains("\",,") || str.contains(",,\"")){
+			str = str.replace(",,", ",\"\",");
+		}
+		System.out.println(str);*/
+		/*String str = "sku	fnsku	asin	product-name	condition	your-price	mfn-listing-exists	mfn-fulfillable-quantity	afn-listing-exists	afn-warehouse-quantity	afn-fulfillable-quantity	afn-unsellable-quantity	afn-reserved-quantity	afn-total-quantity	per-unit-volume	afn-inbound-working-quantity	afn-inbound-shipped-quantity	afn-inbound-receiving-quantity";
+		String stra[] = str.split("\t");
+		String strB = "sku	fnsku	asin	product-name	condition	your-price	mfn-listing-exists	mfn-fulfillable-quantity	afn-listing-exists	afn-warehouse-quantity	afn-fulfillable-quantity	afn-unsellable-quantity	afn-reserved-quantity	afn-total-quantity	per-unit-volume	afn-inbound-working-quantity	afn-inbound-shipped-quantity	afn-inbound-receiving-quantity";
+		String strb[] = strB.split("\t");
+		for(int i = 0;i<stra.length;i++){
+			System.out.println("insert into AMAZON_REPORT_COLUMN_SET(ID,REPORT_TYPE,COLUMN_NAME,LINK_NAME,SITE_NAME,COLUMN_TYPE,CREATE_DATE,UPDATE_DATE,PLATFORM)values(AMAZON_REPORT_COLUMN_SET_SEQ.NEXTVAL,'_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_','"+stra[i].toUpperCase().replace("-", "_")+"','"+strb[i]+"','amazon.ca',0,sysdate,sysdate,'CA');");
+		}
+		*/
+		//sku	fnsku	asin	product-name	reserved_qty	reserved_customerorders	reserved_fc-transfers	reserved_fc-processing
+		String str = "sku	fnsku	asin	product-name	reserved_qty	reserved_customerorders	reserved_fc-transfers	reserved_fc-processing";
+		String stra[] = str.split("\t");
+		String strB = "sku	fnsku	asin	product-name	reserved_qty	reserved_customerorders	reserved_fc-transfers	reserved_fc-processing";
+		String strb[] = strB.split("\t");
+		for(int i = 0;i<stra.length;i++){
+			System.out.println("insert into AMAZON_REPORT_COLUMN_SET(ID,REPORT_TYPE,COLUMN_NAME,LINK_NAME,SITE_NAME,COLUMN_TYPE,CREATE_DATE,UPDATE_DATE,PLATFORM)values(AMAZON_REPORT_COLUMN_SET_SEQ.NEXTVAL,'_GET_RESERVED_INVENTORY_DATA_','"+stra[i].toUpperCase().replace("-", "_")+"','"+strb[i]+"','amazon.com',0,sysdate,sysdate,'US');");
+			//System.out.println("#{"+stra[i].toUpperCase().replace("-", "_")+",jdbcType=VARCHAR},");
+		}
+	}
+	
+	public ResponseResult<MyiUnsuppressedVO> findMyiUnsuppressed(RequestParam param) {
+		Map<String,Object> map = param.getParam();
+		String marketplace = (String) map.get("marketplace");
+		map.put("requestMarketplace", "amazon.co.uk".equals(marketplace) ? "amazon.de" : marketplace); //特殊逻辑:英国站点下的数据对应请求列表的站点为德国
+		int count = iAmazonReportDao.countMyiUnsuppressed(map);
+		ResponseResult<MyiUnsuppressedVO> result = new ResponseResult<MyiUnsuppressedVO>();
+		result.setRows(iAmazonReportDao.findMyiUnsuppressed(map, param.getStartRow(), param.getEndRow()));
+		result.setTotal(count);
+		return result;
+	}
+
+
+}

+ 24 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AdjustmentRequestService.java

@@ -0,0 +1,24 @@
+package com.it.ocs.amazon.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.service.IAmazonRequestReportService;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+
+@Service
+public class AdjustmentRequestService extends AmazonRequestBaseService implements IAmazonRequestReportService {
+	public final String _GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_ = "_GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_";
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_;
+	}
+
+	@Override
+	public void genRequests() {
+		super.doRequests();
+	}
+
+
+
+}

+ 44 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AjustmentParserService.java

@@ -0,0 +1,44 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAdjustmentInventoryDAO;
+import com.it.ocs.amazon.dao.IAmazonReportBaseDAO;
+import com.it.ocs.amazon.service.IAmazonReportParserService;
+
+@Service
+public class AjustmentParserService extends AmazonReportParserBaseService implements IAmazonReportParserService {
+	public final String _GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_ = "_GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_";
+	@Autowired
+	private IAdjustmentInventoryDAO adjustmentInventoryDAO;
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_;
+	}
+
+	@Override
+	public void parserReportData() {
+		super.parserDate();
+	}
+
+	@Override
+	protected IAmazonReportBaseDAO getDao() {
+		return adjustmentInventoryDAO;
+	}
+
+	@Override
+	protected void saveDate(Map<String, Object> saveData) {
+		if (!saveData.isEmpty()) {
+			if (saveData.containsKey("ADJUSTED_DATE")) {
+				String shipDate = saveData.get("ADJUSTED_DATE").toString();
+				saveData.put("ADJUSTED_DATE", shipDate.replace("T", " ").substring(0, 19));
+				adjustmentInventoryDAO.save(saveData);
+			}
+		}
+	}
+
+}

+ 107 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonFinancialService.java

@@ -0,0 +1,107 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.common.util.TimeConvertUtil;
+import com.mysql.jdbc.StringUtils;
+
+@Service
+public class AmazonFinancialService {
+	@Autowired
+	private IAmazonReportDao amazonReportDao;
+	private static List<Map<String,String>> TIME_MAP = Lists.newArrayList();
+	public static Map<String,String> TIMEZON_MAPPING = Maps.newConcurrentMap();
+	static {
+		Map<String,String> fivem = Maps.newConcurrentMap();
+		fivem.put("st", "2018-05-01 00:00:00");
+		fivem.put("et", "2018-06-01 00:00:00");
+		TIME_MAP.add(fivem);
+		Map<String,String> sixm = Maps.newConcurrentMap();
+		sixm.put("st", "2018-06-01 00:00:00");
+		sixm.put("et", "2018-07-01 00:00:00");
+		TIME_MAP.add(sixm);
+		Map<String,String> sevenm = Maps.newConcurrentMap();
+		sevenm.put("st", "2018-07-01 00:00:00");
+		sevenm.put("et", "2018-08-01 00:00:00");
+		TIME_MAP.add(sevenm);
+		Map<String,String> eightm = Maps.newConcurrentMap();
+		eightm.put("st", "2018-08-01 00:00:00");
+		eightm.put("et", "2018-09-01 00:00:00");
+		TIME_MAP.add(eightm);
+		Map<String,String> nighm = Maps.newConcurrentMap();
+		nighm.put("st", "2018-09-01 00:00:00");
+		nighm.put("et", "2018-10-01 00:00:00");
+		TIME_MAP.add(nighm);
+		Map<String,String> tenm = Maps.newConcurrentMap();
+		tenm.put("st", "2018-10-01 00:00:00");
+		tenm.put("et", "2018-11-01 00:00:00");
+		TIME_MAP.add(tenm);
+		TIMEZON_MAPPING.put("amazon.it", "Europe/Rome");
+		TIMEZON_MAPPING.put("amazon.co.uk", "Europe/London");
+		TIMEZON_MAPPING.put("amazon.fr", "Europe/Paris");
+		TIMEZON_MAPPING.put("amazon.ca", "America/Los_Angeles");
+		TIMEZON_MAPPING.put("amazon.com", "America/Los_Angeles");
+		TIMEZON_MAPPING.put("amazon.es", "Europe/Madrid");
+		TIMEZON_MAPPING.put("amazon.jp", "Asia/Tokyo");
+		TIMEZON_MAPPING.put("amazon.com.au", "Australia/Sydney");
+		TIMEZON_MAPPING.put("amazon.de", "Europe/Berlin");
+	}
+	public void updateMonth() {
+		CollectionUtil.each(TIME_MAP, new IAction<Map<String,String>>() {
+			@Override
+			public void excute(Map<String, String> tm) {
+				CollectionUtil.each(TIMEZON_MAPPING.entrySet(), new IAction<Entry<String, String>>() {
+					@Override
+					public void excute(Entry<String, String> entry) {
+						try {
+							Map<String,String> param = Maps.newConcurrentMap();
+							String cstartT = TimeConvertUtil.timeConvert(tm.get("st"), entry.getValue(), "UTC");
+							String cendT = TimeConvertUtil.timeConvert(tm.get("et"), entry.getValue(), "UTC");
+							param.put("startTime", cstartT);
+							param.put("endTime", cendT);
+							param.put("site", entry.getKey());
+							List<ReportRequestListModel> list = amazonReportDao.getParsedReport(param);
+							List<String> reportIds = Lists.newArrayList();
+							CollectionUtil.each(list, new IAction<ReportRequestListModel>() {
+								@Override
+								public void excute(ReportRequestListModel requestModel) {
+									if (!StringUtils.isNullOrEmpty(requestModel.getReportGetId())) {
+										reportIds.add(requestModel.getReportGetId());
+									}
+								}
+							});
+							if (!CollectionUtil.isNullOrEmpty(reportIds)) {
+								amazonReportDao.dataRangeReportMonthU(reportIds, entry.getKey(), getUpdateMonth(tm.get("st")));
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			}
+		});
+	}
+	public static void main(String[] args) {
+		try {
+			System.out.println(TimeConvertUtil.timeConvert("2018-09-01 00:00:00", "amazon.co.uk", "UTC"));
+			System.out.println(TimeConvertUtil.timeConvert("2018-10-01 00:00:00", "amazon.co.uk", "UTC"));
+		} catch (Exception e) {
+			// TODO: handle exception
+		}
+	}
+	private String getUpdateMonth(String time) {
+		return time.replace("-", ".").substring(0,7);
+	}
+
+}

+ 47 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonMyiUnsuppressedExportService.java

@@ -0,0 +1,47 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.AmazonMyiUnsuppressedExportModel;
+import com.it.ocs.excel.service.AExcelDynamicExport;
+
+
+@Service("amazonMyiUnsuppressed")
+public class AmazonMyiUnsuppressedExportService extends AExcelDynamicExport {
+
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	@Override
+	protected List<Map<String, Object>> getData(HttpServletRequest request) {
+		Map<String,Object> map = new HashMap<>();
+		String marketplace = request.getParameter("marketplace");
+		map.put("marketplace", marketplace);
+		map.put("requestMarketplace", "amazon.co.uk".equals(marketplace) ? "amazon.de" : marketplace); //特殊逻辑:英国站点下的数据对应请求列表的站点为德国
+		String startTime = request.getParameter("startTime");
+		map.put("startTime", startTime);
+		return iAmazonReportDao.getMyiUnsuppressedExportData(map);
+	}
+
+	@Override
+	protected void init(HttpServletRequest request) {
+		String site =  request.getParameter("marketplace");
+		site = site.substring(site.lastIndexOf(".") + 1).toUpperCase();
+		String startTime = request.getParameter("startTime");
+		String endTime = request.getParameter("endTime");
+		String filename = String.format("Amazon_FBA_Inventory_%s_%s_%s.xlsx", site, startTime, endTime);
+		String paramIncludeFields = request.getParameter("includeFields");
+		String[] includeFields = StringUtils.isBlank(paramIncludeFields) ? null : paramIncludeFields.split(",");
+		super.initModel(AmazonMyiUnsuppressedExportModel.class, filename, includeFields);
+	}
+
+}

+ 79 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonOrderReportService.java

@@ -0,0 +1,79 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.OrderReportVO;
+import com.it.ocs.amazon.service.IAmazonOrderReportService;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+import com.it.ocs.publication.vo.ComboBoxVO;
+
+@Service
+public class AmazonOrderReportService implements IAmazonOrderReportService {
+	
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	@Override
+	public ResponseResult<OrderReportVO> findOrderReportList(RequestParam param) {
+		Map<String,Object> map = param.getParam();
+		int count = iAmazonReportDao.countOrderReport(map);
+		ResponseResult<OrderReportVO> result = new ResponseResult<>();
+		result.setRows(iAmazonReportDao.queryOrderReportByPage(map,param.getStartRow(),param.getEndRow()));
+		result.setTotal(count);
+		result.setFooter(this.getTotalFooter(map));
+		return result;
+	}
+
+	private List getTotalFooter(Map<String, Object> map) {
+		List<Map<String,String>> footer = new ArrayList<>();
+		String site = map.get("marketplace").toString();
+		List<Map<String,Object>> data = new ArrayList<>();
+				
+		//合计头信息
+		if(null == site || "".equals(site)){
+			//统计所有国家
+			data = iAmazonReportDao.getTotalByContry(map);
+			
+		}else{
+			//统计单个国家
+			data = iAmazonReportDao.getTotalByType(map);
+		}
+		footer = this.formatData(data);
+		return footer;
+	}
+
+	private List<Map<String, String>> formatData(List<Map<String, Object>> data) {
+		String[] title = {"marketplace","quantity","productSales","shippingCredits","giftWrapCredits",
+				  "promotionalRebates","salesTaxCollected","sellingFees","fbaFees",
+				  "otherTransactionFees","other","total"};
+		List<Map<String, String>> list = new ArrayList<>();
+		for(Map<String, Object> map : data){
+			Map<String, String> row = new HashMap<>();
+			for(int i= 0;i<title.length;i++){
+				Object obj = map.get(title[i].toUpperCase());
+				if(null == obj){
+					obj = 0;
+				}
+				row.put(title[i], String.valueOf(obj));
+			}
+			list.add(row);
+		}
+		return list;
+	}
+	
+
+	
+	@Override
+	public List<ComboBoxVO> getOrderTypeBySite(String site) {
+		return iAmazonReportDao.getOrderTypeBySite(site);
+	}
+
+}

+ 38 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReissueOrderService.java

@@ -0,0 +1,38 @@
+package com.it.ocs.amazon.service.impl;
+
+import com.amazonaws.mws.MarketplaceWebServiceClient;
+import com.amazonaws.mws.MarketplaceWebServiceException;
+import com.amazonaws.mws.model.GetReportRequestListRequest;
+import com.amazonaws.mws.model.GetReportRequestListResponse;
+import com.it.ocs.amazon.model.AmazonRequestMode;
+import com.it.ocs.amazon.order.AmazonRequest;
+import com.it.ocs.amazon.order.GetAmazonClient;
+import com.it.ocs.amazon.utils.AmazonUtils;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+import com.it.ocs.synchronou.util.UTCTimeUtils;
+
+public class AmazonReissueOrderService {
+	public static void main(String[] args) throws MarketplaceWebServiceException {
+		AmazonAccountModel account = new AmazonAccountModel();
+		account.setPlatform("US");
+		account.setSellerId("AAF37WJS3P6BT");
+		account.setSecretKey("HlO24NtOL4BW4jiHI+xtug61gaNZweOLadWhhPlA");
+		account.setAccessKey("AKIAJKN2XEOEH4DE4NEQ");
+		account.setUrl("https://mws.amazonservices.com");//https://mws.amazonservices.com/FulfillmentOutboundShipment/2010-10-01
+		account.setSiteId("ATVPDKIKX0DER");
+		/*AmazonRequestMode requestMode = AmazonUtils.getRequestModel(account);
+		requestMode.setCreatedAfter(UTCTimeUtils.getUTCTimeStr(-24*3));
+		AmazonReportServiceClient client = GetAmazonClient.createReissueOrderClient(requestMode);
+		ReissueOrderRequest request = AmazonRequest.createReissueOrderListRequest(requestMode);
+		String dom = client.getReissueOrderList(request);
+		System.out.println(dom);*/
+		
+		AmazonRequestMode requestMode = AmazonUtils.getRequestModel(account);
+		requestMode.setCreatedAfter(UTCTimeUtils.getUTCTimeStr(-24*3));
+		requestMode.setCreatedBefore(UTCTimeUtils.getUTCTimeStr(0));
+		MarketplaceWebServiceClient client = GetAmazonClient.createReportClient(requestMode);
+		GetReportRequestListRequest request = AmazonRequest.createReportRequestListRequest(requestMode);
+		GetReportRequestListResponse response = client.getReportRequestList(request);
+		System.out.println(response.toXML());
+	}
+}

+ 44 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReportExportService.java

@@ -0,0 +1,44 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.AmazonReportExportModel;
+import com.it.ocs.excel.service.AExcelExport;
+
+@Service("amazonReportDataExport")
+public class AmazonReportExportService extends AExcelExport{
+	
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	
+	@Override
+	protected List<Map<String, Object>> getData(HttpServletRequest request) {
+		Map<String,Object> map = new HashMap<>();
+		map.put("marketplace",request.getParameter("marketplace"));
+		map.put("orderId",request.getParameter("orderId"));
+		map.put("sku",request.getParameter("sku"));
+		map.put("startTime",request.getParameter("startTime"));
+		map.put("endTime",request.getParameter("endTime"));
+		map.put("orderType", request.getParameter("orderType"));
+		return iAmazonReportDao.getExportDataByParam(map);
+	}
+
+	@Override
+	protected void init(HttpServletRequest request) {
+		String startTime = request.getParameter("startTime");
+		String endTime = request.getParameter("endTime");
+		String platform =  request.getParameter("marketplace");
+		platform = platform.substring(platform.lastIndexOf(".")).toUpperCase();
+		super.initModel(AmazonReportExportModel.class, "Amazon报表数据_"+platform+"_"+startTime+"_"+endTime+".xlsx");
+		
+	}
+
+}

+ 185 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonReportParserBaseService.java

@@ -0,0 +1,185 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.it.ocs.amazon.dao.IAmazonReportBaseDAO;
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.ColumnData;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.amazon.service.InventoryReportParseSupport;
+import com.it.ocs.amazon.service.ReportDataSaveSupport;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+
+public abstract class AmazonReportParserBaseService {
+	private final Logger log = Logger.getLogger(InventoryReportParseSupport.class);
+	private final String sites[] = { "amazon.ca", "amazon.jp" ,
+			"amazon.com", "amazon.de", "amazon.com.au" };
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	@Autowired
+	private ReportDataSaveSupport reportDataSaveSupport;
+
+	/**
+	 * 解析启动的task方法
+	 */
+	public void parserDate() {
+		CollectionUtil.each(sites, new IAction<String>() {
+			public void excute(String site) {
+				parseData(site);
+			}
+		});
+
+	}
+
+	protected abstract String getReportType();
+
+	/**
+	 * Customer Return Report
+	 * 
+	 * @param site
+	 */
+	private void parseData(String site) {
+		Map<String, Object> map = new HashMap<>();
+		map.put("site", site);
+		map.put("reportType", getReportType());
+		List<ReportRequestListModel> inventoryReportList = iAmazonReportDao.getParseReport(map);
+		CollectionUtil.each(inventoryReportList, new IAction<ReportRequestListModel>() {
+			@Override
+			public void excute(ReportRequestListModel requestModel) {
+				parseReportData(requestModel);
+				iAmazonReportDao.updateParseStatus(requestModel);
+			}
+		});
+		
+	}
+
+	/**
+	 * 解析FBA库存数据
+	 * 
+	 * @param reportMode
+	 */
+	private void parseReportData(ReportRequestListModel reportMode) {
+		// 清除此报表数据
+		getDao().delByReportId(reportMode.getReportGetId());
+		// 解析数据
+		FileInputStream fis = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		try {
+			fis = new FileInputStream(reportMode.getFilePathName());
+			isr = new InputStreamReader(fis, "UTF-8");
+			br = new BufferedReader(isr);
+			String line = "";
+			String title[] = null;
+			String data[] = null;
+			boolean isTitle = true;
+			List<String[]> reportData = new ArrayList<>();
+			List<ColumnData> columnSet = reportDataSaveSupport.getColumnData(reportMode.getSite(), getReportType());
+			while ((line = br.readLine()) != null) {
+				data = line.split("\t");
+				if (isTitle) {
+					title = data;
+					isTitle = false;
+				} else {
+					reportData.add(data);
+					if (reportData.size() > 0 && reportData.size() % 100 == 0) {
+						saveReportData(reportData, title, columnSet, reportMode);
+						reportData.clear();
+					}
+				}
+			}
+			if (reportData.size() > 0) {
+				// 最后数据不足100条,数据处理
+				saveReportData(reportData, title, columnSet, reportMode);
+			}
+
+		} catch (Exception e) {
+			// iAmazonReportDao.deleteInventoryReportDataById(reportMode.getReportGetId());
+			log.info("解析订单报表数据失败", e);
+			throw new RuntimeException("解析订单报表数据失败",e);
+		} finally {
+			if (null != br) {
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != isr) {
+				try {
+					isr.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != fis) {
+				try {
+					fis.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+	}
+
+	protected abstract IAmazonReportBaseDAO getDao();
+	protected abstract void saveDate(Map<String,Object> data);
+
+	public void saveReportData(List<String[]> reportData, String[] title, List<ColumnData> columnSet,
+			ReportRequestListModel reportMode) {
+		for (String[] data : reportData) {
+			Map<String, String> map = new HashMap<>();
+			for (int i = 0; i < title.length; i++) {
+				if (i>=data.length) {
+					map.put(title[i], null);
+					continue;
+				}
+				map.put(title[i], data[i]);
+			}
+			Map<String, Object> saveData = formatData(map, columnSet, reportMode);
+			saveDate(saveData);
+		}
+	}
+
+
+	/**
+	 * 根据映射组装数据存储
+	 * 
+	 * @param map
+	 *            报表数据
+	 * @param columnData
+	 *            报表标题和数据字段映射关系
+	 * @param reportMode
+	 *            报表mode
+	 * @return
+	 */
+	private Map<String, Object> formatData(Map<String, String> map, List<ColumnData> columnData,
+			ReportRequestListModel reportMode) {
+		Map<String, Object> data = new HashMap<>();
+		for (ColumnData column : columnData) {
+			String value = map.get(column.getLinkName());
+			String columnName = column.getColumnName();
+			if (null != value && !"".equals(value)) {
+				column.setValue(value);
+				data.put(columnName, column.getValue());
+			} else {
+				data.put(columnName, "");
+			}
+		}
+		data.put("REPORT_ID", reportMode.getReportGetId());
+		data.put("SITE", reportMode.getSite());
+		return data;
+	}
+}

+ 241 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/AmazonRequestBaseService.java

@@ -0,0 +1,241 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.dom4j.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.it.ocs.amazon.dao.IAmazonReportDao;
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.amazon.model.ReportRequestListModel;
+import com.it.ocs.amazon.utils.AmazonHttpUtil;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.salesStatistics.utils.TimeTools;
+import com.it.ocs.synchronou.dao.ISyncAmazonOrderDao;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+import com.it.ocs.synchronou.model.ParseXMLModel2;
+import com.it.ocs.synchronou.model.XMLNode;
+
+public abstract class AmazonRequestBaseService {
+	private final static Logger log = Logger.getLogger(AmazonRequestBaseService.class);
+	@Autowired
+	private ISyncAmazonOrderDao syncAmazonOrderDao;
+	@Autowired
+	private IAmazonReportDao iAmazonReportDao;
+	protected static final Map<String, String> SITE_RELATE_MAP = new HashMap<String, String>();
+	protected static Map<String, String> TIME_CONVERT_MAP = Maps.newConcurrentMap();
+	protected static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	static {
+		// 根据报表数据反馈定的时间转义ID
+		TIME_CONVERT_MAP.put("amazon.com", "America/Los_Angeles");
+		TIME_CONVERT_MAP.put("amazon.ca", "America/Los_Angeles");
+		TIME_CONVERT_MAP.put("amazon.jp", "Asia/Tokyo");
+		TIME_CONVERT_MAP.put("amazon.de", "Europe/Berlin");
+		TIME_CONVERT_MAP.put("amazon.fr", "Europe/Paris");
+		TIME_CONVERT_MAP.put("amazon.co.uk", "Europe/London");
+		TIME_CONVERT_MAP.put("amazon.es", "Europe/Madrid");
+		TIME_CONVERT_MAP.put("amazon.it", "Europe/Rome");
+		TIME_CONVERT_MAP.put("amazon.com.au", "Australia/ACT");
+		SITE_RELATE_MAP.put("ATVPDKIKX0DER", "amazon.com");
+		SITE_RELATE_MAP.put("A1VC38T7YXB528", "amazon.jp");
+		SITE_RELATE_MAP.put("A2EUQ1WTGCTBG2", "amazon.ca");
+		SITE_RELATE_MAP.put("A1RKKUPIHCS9HS", "amazon.es");
+		SITE_RELATE_MAP.put("A1F83G8C2ARO7P", "amazon.co.uk");
+		SITE_RELATE_MAP.put("A1PA6795UKMFR9", "amazon.de");
+		SITE_RELATE_MAP.put("A1RKKUPIHCS9HS,A1F83G8C2ARO7P,A1PA6795UKMFR9,A13V1IB3VIYZZH,APJ6JRA9NG5V4", "amazon.de");
+		SITE_RELATE_MAP.put("A13V1IB3VIYZZH", "amazon.fr");
+		SITE_RELATE_MAP.put("APJ6JRA9NG5V4", "amazon.it");
+		SITE_RELATE_MAP.put("A39IBJ37TRP1C6", "amazon.com.au");
+	}
+
+	protected abstract String getReportType();
+
+	public boolean isRequest(AmazonAccountModel account) {
+		boolean result = false;
+		Map<String, String> queryParam = Maps.newConcurrentMap();
+		queryParam.put("ReportType", getReportType());
+		queryParam.put("PlateForm", account.getPlatform());
+		ReportRequestListModel unaskRequestModel = iAmazonReportDao.getUnaskRequestByTime(queryParam);
+		if (unaskRequestModel != null) {
+			return result;
+		}
+		ReportRequestListModel requestModel = iAmazonReportDao.getLastDoneReportByParam(queryParam);
+		if (null == requestModel) {
+			result = true;
+		} else {
+			try {
+				Date siteEndDate = convertDateBySite(requestModel.getEndDate(), "UTC",
+						TIME_CONVERT_MAP.get(SITE_RELATE_MAP.get(account.getSiteId())));
+				Date siteCurDate = convertDateBySite(sdf.format(new Date()), "Asia/Shanghai",
+						TIME_CONVERT_MAP.get(SITE_RELATE_MAP.get(account.getSiteId())));
+				return siteEndDate.compareTo(TimeTools.getChangeDay(siteCurDate, -1)) < 0;
+			} catch (ParseException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return result;
+
+	}
+
+	protected Date convertDateBySite(String date, String srcSite, String tarSite) throws ParseException {
+		String ssite = srcSite.equals("UTC") ? "UTC" : srcSite;
+		String tsite = tarSite.equals("UTC") ? "UTC" : tarSite;
+		String convertTime = TimeTools.timeConvert(date, ssite, tsite);
+		if (!Strings.isNullOrEmpty(convertTime)) {
+			return sdf.parse(convertTime);
+		}
+		return null;
+	}
+
+	/**
+	 * Spring Schedule:生成亚马逊FBA库存报表请求清单</br>
+	 * <p>
+	 * 调用亚马逊商城网络服务(亚马逊MWS)下的亚马逊物流 (FBA) 报告相关API:</br>
+	 * <tt>
+	 * 1. 亚马逊物流管理库存(<code>ReportType</code> =
+	 * <code>_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_</code>);</br>
+	 * 2. 亚马逊物流预留库存(<code>ReportType</code> =
+	 * <code>_GET_RESERVED_INVENTORY_DATA_</code>)</br>
+	 * </tt>
+	 * 并且将请求列表数据预插入到当前系统亚马逊报表请求数据表(<code>table: amazon_reports_request</code>)中
+	 * </p>
+	 */
+	public void doRequests() {
+		CollectionUtil.each(this.syncAmazonOrderDao.getAmazonAccounts(), new IAction<AmazonAccountModel>() {
+			@SuppressWarnings("unchecked")
+			public void excute(AmazonAccountModel account) {
+				if (isRequest(account)) {
+					String response = postAmazonReport(account, getReportType());
+					Map<String, Object> data = parseAmazonFBAInventoryResponseXml(response);
+					if (null != data) {
+						saveRequests((List<Map<String, Object>>) data.get("data"), account,
+								SITE_RELATE_MAP.get(account.getSiteId()), true);
+					}
+				}
+			}
+		});
+	}
+
+	public Map<String, Object> parseAmazonFBAInventoryResponseXml(String response) {
+		Map<String, Object> map = null;
+		try {
+			ParseXMLModel2 parser = new ParseXMLModel2(response, "http://mws.amazonaws.com/doc/2009-01-01/") {
+				@Override
+				public List<Map<String, Object>> getResult() {
+					XMLNode[] columns = { XMLNode.getInstance("ReportType"),
+							XMLNode.getInstance("ReportProcessingStatus"),
+							XMLNode.getInstance("EndDate", XMLNode.DATE_UTC), XMLNode.getInstance("Scheduled"),
+							XMLNode.getInstance("ReportRequestId"),
+							XMLNode.getInstance("StartedProcessingDate", XMLNode.DATE_UTC),
+							XMLNode.getInstance("SubmittedDate", XMLNode.DATE_UTC),
+							XMLNode.getInstance("CompletedDate", XMLNode.DATE_UTC),
+							XMLNode.getInstance("StartDate", XMLNode.DATE_UTC),
+							XMLNode.getInstance("GeneratedReportId") };
+
+					List<Map<String, Object>> list = new ArrayList<>();
+					List<Element> elements = this.getElementChild("RequestReportResult_ReportRequestInfo");
+					for (Element element : elements) {
+						element = this.formateElement(element);
+						Map<String, Object> map = parseRecord(element, columns);
+						list.add(map);
+					}
+					return list;
+				}
+			};
+			map = new HashMap<>();
+			map.put("data", parser.getResult());
+		} catch (Exception e) {
+			log.error("解析Amazon请求返回的Xml数据失败", e);
+		}
+		return map;
+	}
+
+	private String postAmazonReport(AmazonAccountModel account, String reportType) {
+		AmazonRequestConfig config = new AmazonRequestConfig(account, "RequestReport", "2009-01-01");
+		Map<String, String> param = queryParam(account);
+		config.setQueryParameters(param);
+		return AmazonHttpUtil.amazonPOST(config);
+	}
+
+	protected Map<String, String> queryParam(AmazonAccountModel account) {
+		Map<String, String> result = Maps.newConcurrentMap();
+		result.put("ReportOptions", "ShowSalesChannel=true");
+		result.put("ReportType", getReportType());
+		result.put("PlateForm", account.getPlatform());
+		ReportRequestListModel requestModel = iAmazonReportDao.getLastDoneReportByParam(result);
+		try {
+			if (null != requestModel) {
+				result.put("StartDate", timeConvertUTCFormat(requestModel.getEndDate()));
+				result.put("EndDate",
+						timeConvertUTCFormat(sdf.format(TimeTools.getChangeDay(sdf.parse(requestModel.getEndDate()),
+								getIntervalDay(requestModel.getEndDate(),
+										TIME_CONVERT_MAP.get(SITE_RELATE_MAP.get(account.getSiteId())),account)))));
+			} else {
+				Date startTime = convertDateBySite("2018-06-01 00:00:00", TIME_CONVERT_MAP.get(SITE_RELATE_MAP.get(account.getSiteId())),
+						"UTC");
+				result.put("StartDate", timeConvertUTCFormat(sdf.format(startTime)));
+				result.put("EndDate",
+						timeConvertUTCFormat(sdf.format(TimeTools.getChangeDay(startTime,
+								getIntervalDay("2018-06-01 00:00:00",
+										TIME_CONVERT_MAP.get(SITE_RELATE_MAP.get(account.getSiteId())),account)))));
+				
+			}
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	private String timeConvertUTCFormat(String time) {
+		if (Strings.isNullOrEmpty(time))
+			return time;
+		return time.replace(" ", "T") + "+00:00";
+	}
+	protected Integer getDefaultIntervalDay(AmazonAccountModel account) {
+		if ("DE".equals(account.getPlatform()) || "US".equals(account.getPlatform())) {
+			return 10;
+		}
+		return 15;
+	};
+	protected Integer getIntervalDay(String startUTCDate, String tarZoneId,AmazonAccountModel account) throws ParseException {
+		Date stard = convertDateBySite(startUTCDate, "UTC", tarZoneId);
+		Date currentd = convertDateBySite(sdf.format(new Date()), "Asia/Shanghai", tarZoneId);
+		int intervalDay = (int) ((currentd.getTime()-stard.getTime())/(1000*3600*24));
+		return intervalDay>getDefaultIntervalDay(account)?getDefaultIntervalDay(account):intervalDay;
+	};
+
+	/**
+	 * 保存报表请求订单
+	 * 
+	 * @param requests
+	 * @param account
+	 * @param site
+	 *            站点,例如: "amazon.com"
+	 * @param sysAuto
+	 *            是否属于当前平台自动保存
+	 */
+	public void saveRequests(List<Map<String, Object>> requests, AmazonAccountModel account, String site,
+			boolean sysAuto) {
+		CollectionUtil.each(requests, new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> request) {
+				request.put("platform", account.getPlatform());
+				request.put("account", account.getSellerId());
+				request.put("site", site);
+				if (sysAuto) {
+					request.put("generateMode", "sys_auto");
+				}
+				iAmazonReportDao.saveRequest(request);
+			}
+		});
+	}
+}

+ 44 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerReturnParserService.java

@@ -0,0 +1,44 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportBaseDAO;
+import com.it.ocs.amazon.dao.ICustomerReturnDAO;
+import com.it.ocs.amazon.service.IAmazonReportParserService;
+
+@Service
+public class CustomerReturnParserService extends AmazonReportParserBaseService implements IAmazonReportParserService {
+	@Autowired
+	private ICustomerReturnDAO customerReturnDAO;
+	public final String _GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_ = "_GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_";
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_;
+	}
+
+	@Override
+	public void parserReportData() {
+		super.parserDate();
+	}
+
+	@Override
+	protected void saveDate(Map<String, Object> saveData) {
+		if (!saveData.isEmpty()) {
+			if (saveData.containsKey("RETURN_DATE")) {
+				String shipDate = saveData.get("RETURN_DATE").toString();
+				saveData.put("RETURN_DATE", shipDate.replace("T", " ").substring(0, 19));
+				customerReturnDAO.save(saveData);
+			}
+		}
+	}
+
+	@Override
+	protected IAmazonReportBaseDAO getDao() {
+		return customerReturnDAO;
+	}
+
+}

+ 19 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerReturnRequestService.java

@@ -0,0 +1,19 @@
+package com.it.ocs.amazon.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.service.IAmazonRequestReportService;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+@Service
+public class CustomerReturnRequestService extends AmazonRequestBaseService implements IAmazonRequestReportService {
+	public final String _GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_ = "_GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_";
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_;
+	}
+	@Override
+	public void genRequests() {
+		super.doRequests();
+	}
+
+}

+ 44 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/CustomerShipmentParserService.java

@@ -0,0 +1,44 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportBaseDAO;
+import com.it.ocs.amazon.dao.ICustomerShipmentDAO;
+import com.it.ocs.amazon.service.IAmazonReportParserService;
+
+@Service
+public class CustomerShipmentParserService extends AmazonReportParserBaseService implements IAmazonReportParserService {
+	@Autowired
+	private ICustomerShipmentDAO customerShipmentDAO;
+	public final String _GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_SALES_DATA_ = "_GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_SALES_DATA_";
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_SALES_DATA_;
+	}
+
+	@Override
+	public void parserReportData() {
+		super.parserDate();
+	}
+
+	@Override
+	protected void saveDate(Map<String, Object> saveData) {
+		if (!saveData.isEmpty()) {
+			if (saveData.containsKey("SHIPMENT_DATE")) {
+				String shipDate = saveData.get("SHIPMENT_DATE").toString();
+				saveData.put("SHIPMENT_DATE", shipDate.replace("T", " ").substring(0,19));
+				customerShipmentDAO.save(saveData);
+			}
+		}
+		
+	}
+
+	@Override
+	protected IAmazonReportBaseDAO getDao() {
+		return customerShipmentDAO;
+	}
+}

+ 107 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/InboundShipmentDetailService.java

@@ -0,0 +1,107 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.dom4j.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.it.ocs.amazon.dao.IInboundShipmentDetailDAO;
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.amazon.utils.AmazonHttpUtil;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.synchronou.dao.ISyncAmazonOrderDao;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+import com.it.ocs.synchronou.model.ParseXMLModel2;
+import com.it.ocs.synchronou.model.XMLNode;
+
+@Service
+public class InboundShipmentDetailService {
+	// https://www.cnblogs.com/wangzhongqiu/p/6402940.html
+	@Autowired
+	private IInboundShipmentDetailDAO inboundShipmentDetailDAO;
+	private final static Logger log = Logger.getLogger(InboundShipmentDetailService.class);
+	@Autowired
+	private ISyncAmazonOrderDao syncAmazonOrderDao;
+
+	public void downloadInboundShipmentDetail() {
+		Map<String, String> param = Maps.newConcurrentMap();
+		CollectionUtil.each(this.syncAmazonOrderDao.getAmazonAccounts(), new IAction<AmazonAccountModel>() {
+			public void excute(AmazonAccountModel account) {
+				CollectionUtil.each(inboundShipmentDetailDAO.getShipmentIds(account.getPlatform()),
+						new IAction<Map<String, String>>() {
+							@Override
+							public void excute(Map<String, String> shipModel) {
+								
+								try {
+									param.put("ShipmentId", shipModel.get("SHIPMENTID"));
+									AmazonRequestConfig config = new AmazonRequestConfig(account,
+											"ListInboundShipmentItems", "2010-10-01");
+									config.setUrl(account.getUrl() + "/FulfillmentInboundShipment");
+									config.setQueryParameters(param);
+									String resp = AmazonHttpUtil.amazonPOST(config);
+									List<Map<String, Object>> result = parseAmazonFBAInventoryResponseXml(account, resp);
+									handleData(result);
+									Thread.sleep(3000);
+								} catch (Exception e) {
+									log.error(" handle error,ShipmentId:"+shipModel.get("SHIPMENTID")+",error msg:"+e.getMessage());
+								}
+							}
+						});
+			}
+		});
+	}
+	
+	private void handleData(List<Map<String, Object>> datas) {
+		CollectionUtil.each(datas, new IAction<Map<String, Object>>() {
+			@Override
+			public void excute(Map<String, Object> obj) {
+				Map<String, Object> map = inboundShipmentDetailDAO.getShipIdSku(obj.get("ShipmentId").toString(),
+						obj.get("SellerSKU").toString());
+				if (null == map) {
+					inboundShipmentDetailDAO.add(obj);
+				} else {
+					inboundShipmentDetailDAO.update(obj);
+				}
+			}
+		});
+	}
+
+	public List<Map<String, Object>> parseAmazonFBAInventoryResponseXml(AmazonAccountModel account, String response) {
+		List<Map<String, Object>> result = Lists.newArrayList();
+		try {
+			ParseXMLModel2 parser = new ParseXMLModel2(response,
+					"http://mws.amazonaws.com/FulfillmentInboundShipment/2010-10-01/") {
+				@Override
+				public List<Map<String, Object>> getResult() {
+					XMLNode[] columns = { XMLNode.getInstance("ShipmentId"), XMLNode.getInstance("SellerSKU"),
+							XMLNode.getInstance("QuantityShipped"), XMLNode.getInstance("QuantityInCase"),
+							XMLNode.getInstance("QuantityReceived"), XMLNode.getInstance("FulfillmentNetworkSKU") };
+					List<Map<String, Object>> list = new ArrayList<>();
+					List<Element> elements = this.getElementChild("member");
+					CollectionUtil.each(elements, new IAction<Element>() {
+						@Override
+						public void excute(Element element) {
+							element = formateElement(element);
+							Map<String, Object> map = parseRecord(element, columns);
+							list.add(map);
+						}
+					});
+					return list;
+				}
+			};
+			result = parser.getResult();
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("解析Amazon请求返回的Xml数据失败", e);
+		}
+		return result;
+	}
+
+}

+ 193 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/InboundShipmentService.java

@@ -0,0 +1,193 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.dom4j.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.it.ocs.amazon.dao.IInboundShipmentDAO;
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.amazon.utils.AmazonHttpUtil;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.support.IFunction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.common.util.TimeConvertUtil;
+import com.it.ocs.synchronou.dao.ISyncAmazonOrderDao;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+import com.it.ocs.synchronou.model.ParseXMLModel2;
+import com.it.ocs.synchronou.model.XMLNode;
+
+@Service
+public class InboundShipmentService {
+	// https://www.cnblogs.com/wangzhongqiu/p/6402940.html
+	@Autowired
+	private IInboundShipmentDAO inboundShipmentDAO;
+	private final static Logger log = Logger.getLogger(InboundShipmentService.class);
+	@Autowired
+	private ISyncAmazonOrderDao syncAmazonOrderDao;
+	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	private static String[] SHIPMENT_STATUS_LIST = new String[] { "WORKING", "SHIPPED", "IN_TRANSIT", "DELIVERED",
+			"CHECKED_IN", "RECEIVING", "CLOSED", "CANCELLED", "DELETED", "ERROR" };
+
+	private Map<String, String> getDefaultParam() {
+		Map<String, String> queryMap = Maps.newConcurrentMap();
+		for (int i = 0; i < SHIPMENT_STATUS_LIST.length; i++) {
+			queryMap.put("ShipmentStatusList.member." + (i + 1), SHIPMENT_STATUS_LIST[i]);
+		}
+		return queryMap;
+	}
+
+	private Map<String, String> getRequestTimeParam(boolean isIncrement) {
+		Map<String, String> queryMap = getDefaultParam();
+		Map<String, Object> lastModel = inboundShipmentDAO.getLastUpdate();
+		if (!isIncrement) {
+			return getDefaultParam();
+		}
+		Date lastDate = (Date) lastModel.get("UPDATED_AT");
+		try {
+			String beforeTime = TimeConvertUtil.timeConvert(sdf.format(lastDate), "Asia/Shanghai", "UTC");
+			String endTime = TimeConvertUtil.timeConvert(sdf.format(new Date()), "Asia/Shanghai", "UTC");
+			queryMap.put("LastUpdatedAfter", timeConvertUTCFormat(beforeTime));
+			queryMap.put("LastUpdatedBefore", timeConvertUTCFormat(endTime));
+		} catch (ParseException e) {
+			log.error("time format error,lastDate:" + lastDate);
+			e.printStackTrace();
+		}
+		return queryMap;
+	}
+
+	private String timeConvertUTCFormat(String time) {
+		if (Strings.isNullOrEmpty(time))
+			return time;
+		return time.replace(" ", "T") + "+00:00";
+	}
+
+	public void downloadInboundShipment() {
+		CollectionUtil.each(this.syncAmazonOrderDao.getAmazonAccounts(), new IAction<AmazonAccountModel>() {
+			public void excute(AmazonAccountModel account) {
+				AmazonRequestConfig config = new AmazonRequestConfig(account, "ListInboundShipments", "2010-10-01");
+				config.setUrl(account.getUrl() + "/FulfillmentInboundShipment");
+				config.setQueryParameters(getRequestTimeParam(false));
+				String resp = AmazonHttpUtil.amazonPOST(config);
+				Map<String, Object> result = parseAmazonFBAInventoryResponseXml(account, resp);
+				handleNextToken(account, result);
+			}
+		});
+	}
+
+	@SuppressWarnings("unchecked")
+	private void handleData(Map<String, Object> requestResult) {
+		if (requestResult.containsKey("data")) {
+			List<Map<String, Object>> datas = (List<Map<String, Object>>) requestResult.get("data");
+			List<Map<String, Object>> insertDatas = screenNeedHandleData(datas);
+			CollectionUtil.each(datas, new IAction<Map<String, Object>>() {
+				@Override
+				public void excute(Map<String, Object> data) {
+					inboundShipmentDAO.update(data);
+				}
+			});
+			if (!CollectionUtil.isNullOrEmpty(insertDatas)) {
+				inboundShipmentDAO.batchAdd(insertDatas);
+			}
+		}
+	}
+
+	private List<Map<String, Object>> screenNeedHandleData(List<Map<String, Object>> datas) {
+		List<String> shipmentIds = new ArrayList<>();
+		CollectionUtil.each(datas, new IAction<Map<String, Object>>() {
+			@Override
+			public void excute(Map<String, Object> data) {
+				if (data.containsKey("ShipmentId") && null != data.get("ShipmentId")) {
+					shipmentIds.add(data.get("ShipmentId").toString());
+				}
+			}
+		});
+		if (!CollectionUtil.isNullOrEmpty(shipmentIds)) {
+			List<Map<String, Object>> list = inboundShipmentDAO.getByShipmentIds(shipmentIds);
+			return CollectionUtil.searchList(datas, new IFunction<Map<String, Object>, Boolean>() {
+				@Override
+				public Boolean excute(Map<String, Object> data) {
+					if (!data.containsKey("ShipmentId"))
+						throw new RuntimeException("api data has problem,shipmentId is null,data:" + data.toString());
+
+					return null == CollectionUtil.search(list, new IFunction<Map<String, Object>, Boolean>() {
+						@Override
+						public Boolean excute(Map<String, Object> dbdata) {
+							return data.get("ShipmentId").toString().equals(dbdata.get("SHIPMENTID").toString());
+						}
+					});
+				}
+			});
+		}
+		return null;
+	}
+
+	private void handleNextToken(AmazonAccountModel account, Map<String, Object> result) {
+		// ---对结果进行处理---
+		handleData(result);
+		try {
+			Thread.sleep(3000);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		if (result.containsKey("NextToken")) {
+			AmazonRequestConfig config = new AmazonRequestConfig(account, "ListInboundShipmentsByNextToken",
+					"2010-10-01");
+			config.setUrl(account.getUrl() + "/FulfillmentInboundShipment");
+			Map<String, String> paramMap = getDefaultParam();
+			paramMap.put("NextToken", result.get("NextToken").toString());
+			config.setQueryParameters(paramMap);
+			String resp = AmazonHttpUtil.amazonPOST(config);
+			result = parseAmazonFBAInventoryResponseXml(account, resp);
+			handleNextToken(account, result);
+		}
+	}
+
+	public Map<String, Object> parseAmazonFBAInventoryResponseXml(AmazonAccountModel account, String response) {
+		Map<String, Object> map = null;
+		try {
+			ParseXMLModel2 parser = new ParseXMLModel2(response,
+					"http://mws.amazonaws.com/FulfillmentInboundShipment/2010-10-01/") {
+				@Override
+				public List<Map<String, Object>> getResult() {
+					XMLNode[] columns = { XMLNode.getInstance("DestinationFulfillmentCenterId"),
+							XMLNode.getInstance("LabelPrepType"), XMLNode.getInstance("City"),
+							XMLNode.getInstance("CountryCode"), XMLNode.getInstance("PostalCode"),
+							XMLNode.getInstance("Name"), XMLNode.getInstance("AddressLine1"),
+							XMLNode.getInstance("AddressLine2"), XMLNode.getInstance("StateOrProvinceCode"),
+							XMLNode.getInstance("ShipmentId"), XMLNode.getInstance("AreCasesRequired"),
+							XMLNode.getInstance("ShipmentName"), XMLNode.getInstance("ShipmentStatus") };
+
+					List<Map<String, Object>> list = new ArrayList<>();
+					List<Element> elements = this.getElementChild("member");
+					for (Element element : elements) {
+						element = this.formateElement(element);
+						Map<String, Object> map = parseRecord(element, columns);
+						map.put("platForm", account.getPlatform());
+						list.add(map);
+					}
+					return list;
+				}
+			};
+			map = Maps.newConcurrentMap();
+			map.put("data", parser.getResult());
+			String nextToken = parser.getNextToken();
+			if (!Strings.isNullOrEmpty(nextToken)) {
+				map.put("NextToken", parser.getNextToken());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("解析Amazon请求返回的Xml数据失败", e);
+		}
+		return map;
+	}
+}

+ 47 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/MyCount.java

@@ -0,0 +1,47 @@
+package com.it.ocs.amazon.service.impl;
+
+public class MyCount {
+
+	public static void main(String[] args) {
+		
+		System.out.println(getMyBoal(2, 18));
+		System.out.println(getMyBoal(2, 18) * 5 + getMyBoal(1, 18));
+	}
+	
+
+	private static double getResultPrice(double startPrice, int count) {
+		double result = 0.00;
+		int i = 1;
+		int j = 1;
+		for (; i <= count; i++) {
+			if (i % 10 == 1) {
+				j = 1;
+			}
+			result += startPrice + (j - 1) * 300;
+			j++;
+		}
+		return result;
+	}
+
+	/**
+	 * 抓鬼收入
+	 * 
+	 * @param hour
+	 * @return
+	 */
+	private static double getMyBoal(int hour, int qty) {
+		double result = 0.0;
+		for (int i = 1; i <= hour; i++) {
+			double cardPrice = 12357.00;
+			int cardCount = 6;
+			if (i == 1) {
+				cardCount = 7;
+			}
+
+			double boal = getResultPrice(6900, qty) * 5;
+			result += boal - cardCount * cardPrice * 5 - qty * 10000;
+		}
+
+		return result;
+	}
+}

+ 49 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/RemovalParserService.java

@@ -0,0 +1,49 @@
+package com.it.ocs.amazon.service.impl;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.dao.IAmazonReportBaseDAO;
+import com.it.ocs.amazon.dao.IRemovalShipmentDAO;
+import com.it.ocs.amazon.service.IAmazonReportParserService;
+
+@Service
+public class RemovalParserService extends AmazonReportParserBaseService implements IAmazonReportParserService {
+	public final String _GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_ = "_GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_";
+	@Autowired
+	private IRemovalShipmentDAO removalShipmentDAO;
+
+	@Override
+	public void parserReportData() {
+		super.parserDate();
+	}
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_;
+	}
+
+	@Override
+	protected IAmazonReportBaseDAO getDao() {
+		return removalShipmentDAO;
+	}
+
+	@Override
+	protected void saveDate(Map<String, Object> saveData) {
+		if (!saveData.isEmpty()) {
+			if (saveData.containsKey("REQUEST_DATE")) {
+				String shipDate = saveData.get("REQUEST_DATE").toString();
+				saveData.put("REQUEST_DATE", shipDate.replace("T", " ").substring(0, 19));
+			}
+			if (saveData.containsKey("SHIPMENT_DATE")) {
+				String shipDate = saveData.get("SHIPMENT_DATE").toString();
+				saveData.put("SHIPMENT_DATE", shipDate.replace("T", " ").substring(0, 19));
+			}
+			removalShipmentDAO.save(saveData);
+		}
+
+	}
+
+}

+ 21 - 0
project/ocs/src/main/java/com/it/ocs/amazon/service/impl/RemovalRequestService.java

@@ -0,0 +1,21 @@
+package com.it.ocs.amazon.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.amazon.service.IAmazonRequestReportService;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+@Service
+public class RemovalRequestService extends AmazonRequestBaseService implements IAmazonRequestReportService {
+	public final String _GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_ = "_GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_";
+
+	@Override
+	protected String getReportType() {
+		return _GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA_;
+	}
+
+	@Override
+	public void genRequests() {
+		super.doRequests();
+	}
+
+}

+ 106 - 0
project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonHttpUtil.java

@@ -0,0 +1,106 @@
+package com.it.ocs.amazon.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.protocol.HTTP;
+import org.apache.log4j.Logger;
+
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+
+public class AmazonHttpUtil {
+	private final static Logger log = Logger.getLogger(AmazonHttpUtil.class);
+	
+	public static String amazonPOST(AmazonRequestConfig amazonRequest){
+		String url = amazonRequest.getUrl();
+		try {
+			Map<String, String> parameters = amazonRequest.getBaseParameters();
+			HttpPost request = new HttpPost(url);
+			List<NameValuePair> parameterList = new ArrayList<NameValuePair>();
+    		for (Entry<String, String> entry : parameters.entrySet()) {
+    			String key = entry.getKey() == null ? "" : entry.getKey();
+    			String value = entry.getValue() == null ? "" : entry.getValue();
+    			parameterList.add(new BasicNameValuePair(key, value));
+    		}
+    		request.setEntity(new UrlEncodedFormEntity(parameterList, HTTP.UTF_8));
+    		request.addHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"));
+			request.addHeader("X-Amazon-User-Agent", "ocs/1.0 (Language=zh_CN)");
+			
+	        BasicHttpParams httpParams = new BasicHttpParams();
+	        httpParams.setParameter(CoreProtocolPNames.USER_AGENT, "ocs/1.0 (Language=zh_CN)");
+	        HttpConnectionParams.setConnectionTimeout(httpParams, 50000);
+	        HttpConnectionParams.setSoTimeout(httpParams, 50000);
+	        HttpConnectionParams.setStaleCheckingEnabled(httpParams, true);
+	        HttpConnectionParams.setTcpNoDelay(httpParams, true);
+
+			HttpClient httpClient = new DefaultHttpClient(httpParams);
+			HttpResponse response = httpClient.execute(request);
+			String responseBodyString = getResponsBodyAsString(response.getEntity().getContent());
+			StatusLine statusLine = response.getStatusLine();
+			int status = statusLine.getStatusCode();
+			if(status == HttpStatus.SC_OK && responseBodyString != null){
+				return responseBodyString;
+			}else{
+				log.info("amazon获取数据失败,地址:"+url);
+				log.info(responseBodyString);
+			}
+		} catch (Exception e) {
+			log.error("amazon请求失败,地址:"+url,e);
+			throw new RuntimeException();
+		}
+		return null;
+	}
+	
+	private static String getResponsBodyAsString(InputStream input) throws IOException {
+		String responsBodyString = null;
+		try {
+			Reader reader = new InputStreamReader(input, "UTF-8");
+			StringBuilder b = new StringBuilder();
+			char[] c = new char[1024];
+			int len;
+			while (0 < (len = reader.read(c))) {
+				b.append(c, 0, len);
+			}
+			responsBodyString = b.toString();
+		} finally {
+			input.close();
+		}
+		return responsBodyString;
+	}
+	
+	public static void main(String[] args) {
+		AmazonAccountModel account = new AmazonAccountModel();
+		account.setPlatform("US");
+		account.setSellerId("AAF37WJS3P6BT");
+		account.setSecretKey("HlO24NtOL4BW4jiHI+xtug61gaNZweOLadWhhPlA");
+		account.setAccessKey("AKIAJKN2XEOEH4DE4NEQ");
+		account.setUrl("https://mws.amazonservices.com/FulfillmentOutboundShipment/2010-10-01");//https://mws.amazonservices.com/FulfillmentOutboundShipment/2010-10-01
+		account.setSiteId("ATVPDKIKX0DER");
+		AmazonRequestConfig config = new AmazonRequestConfig(account, "ListAllFulfillmentOrders", "2010-10-01");
+		Map<String,String> queryParam = new HashMap<>();
+		queryParam.put("QueryStartDateTime", "2017-09-30T16:00:00Z");
+		config.setQueryParameters(queryParam);
+		System.out.println(AmazonHttpUtil.amazonPOST(config));
+	}
+}

+ 175 - 0
project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonReportTest.java

@@ -0,0 +1,175 @@
+package com.it.ocs.amazon.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.it.ocs.amazon.model.AmazonRequestConfig;
+import com.it.ocs.amazon.service.AmazonReportService;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+
+public class AmazonReportTest {
+
+	private static AmazonAccountModel createDeAccount() {
+		AmazonAccountModel account = new AmazonAccountModel();
+		account.setPlatform("DE");
+		account.setSellerId("AV7KSH7XB8RNM");
+		account.setSecretKey("oreVInCN3zs+gEdjUmxuVXRIAre+EQf6aLQh6OFS");
+		account.setAccessKey("AKIAIQJPPHYX7ZMKPTNQ");
+		account.setUrl("https://mws.amazonservices.de");// https://mws.amazonservices.com/FulfillmentOutboundShipment/2010-10-01
+		account.setSiteId("A1RKKUPIHCS9HS,A1F83G8C2ARO7P,A1PA6795UKMFR9,A13V1IB3VIYZZH,APJ6JRA9NG5V4");
+		return account;
+	}
+	
+	private static AmazonAccountModel createUSAccount() {
+		return createAccount("US", "AAF37WJS3P6BT", "HlO24NtOL4BW4jiHI+xtug61gaNZweOLadWhhPlA", "AKIAJKN2XEOEH4DE4NEQ", "https://mws.amazonservices.com", "ATVPDKIKX0DER");
+	}
+	
+	private static AmazonAccountModel createAccount(String platform, String sellerId, String secretKey, String accessKey, String url, String siteId) {
+		AmazonAccountModel account = new AmazonAccountModel();
+		account.setPlatform(platform);
+		account.setSellerId(sellerId);
+		account.setSecretKey(secretKey);
+		account.setAccessKey(accessKey);
+		account.setUrl(url);
+		account.setSiteId(siteId);
+		return account;
+	}
+
+	public static List<String> amazonPOST(AmazonAccountModel account, String reportType) {
+		List<String> result = new ArrayList<String>();
+		AmazonRequestConfig config = new AmazonRequestConfig(account, "RequestReport", "2009-01-01");
+		Map<String, String> queryParam = new HashMap<>();
+		queryParam.put("ReportType", reportType);
+		//queryParam.put("StartDate", "2018-03-30T00:00:00Z");
+		//String[] siteIds = account.getSiteId().split(",");
+		/*CollectionUtil.each(siteIds, new IAction<String>() {
+			public void excute(String siteId) {
+				queryParam.put("MarketplaceIdList.Id.1", siteId);	
+				config.setQueryParameters(queryParam);
+				result.add(AmazonHttpUtil.amazonPOST(config));
+			}
+		});*/
+		config.setQueryParameters(queryParam);
+		String resp = AmazonHttpUtil.amazonPOST(config);
+		System.out.println(resp);
+		return result;
+	}
+	
+	public static void main(String[] args) {
+		//initAccounts();
+		AmazonAccountModel account = createDeAccount();
+		amazonPOST(account, "_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_");
+		amazonPOST(account, "_GET_RESERVED_INVENTORY_DATA_");
+	}
+
+	static ApplicationContext context = null;
+	
+	private static void initSpring() {
+		context = new ClassPathXmlApplicationContext("classpath:spring.xml");
+	}
+	
+	static List<AmazonAccountModel> accounts = new ArrayList<AmazonAccountModel>();
+	
+	private static void initAccounts() {
+		accounts.add(createAccount("US", "AAF37WJS3P6BT", "HlO24NtOL4BW4jiHI+xtug61gaNZweOLadWhhPlA", "AKIAJKN2XEOEH4DE4NEQ", "https://mws.amazonservices.com", "ATVPDKIKX0DER"));
+		accounts.add(createAccount("JP", "AL6SHBZ4JONBI", "YCFXlCQ+0PRE5bs1a/b7DHAN/6w0TN3AiprhuKZ7", "AKIAJOUKOHWJYVLMRURA", "https://mws.amazonservices.jp", "A1VC38T7YXB528"));
+		accounts.add(createAccount("CA", "A3W1ARFCWJR0HL", "0pPBG0UOWhgro7pWc6BjDMvYam1pMJJQqDt0PFU0", "AKIAJAQWT7A5XPYZ3ANA", "https://mws.amazonservices.ca", "A2EUQ1WTGCTBG2"));
+		accounts.add(createAccount("DE", "AV7KSH7XB8RNM", "oreVInCN3zs+gEdjUmxuVXRIAre+EQf6aLQh6OFS", "AKIAIQJPPHYX7ZMKPTNQ", "https://mws.amazonservices.de", "A1RKKUPIHCS9HS,A1F83G8C2ARO7P,A1PA6795UKMFR9,A13V1IB3VIYZZH,APJ6JRA9NG5V4"));
+	}
+	
+	static final String[] types = new String[] { "_GET_AFN_INVENTORY_DATA_", "_GET_FBA_FULFILLMENT_CURRENT_INVENTORY_DATA_",
+			"_GET_FBA_FULFILLMENT_MONTHLY_INVENTORY_DATA_", "_GET_FBA_FULFILLMENT_INVENTORY_RECEIPTS_DATA_",
+			"_GET_FBA_FULFILLMENT_INVENTORY_SUMMARY_DATA_", "_GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA_",
+			"_GET_FBA_FULFILLMENT_INVENTORY_HEALTH_DATA_", "_GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA_",
+			"_GET_FBA_MYI_ALL_INVENTORY_DATA_" };
+
+	/*
+	public static void main(String[] args) {
+		initSpring();
+		AmazonAccountModel account = createDeAccount();
+		AmazonReportService ars = (AmazonReportService) context.getBean("amazonReportService");
+		CollectionUtil.each(types, new IAction<String>() {
+			public void excute(String type) {
+				String response = amazonPOST(account, type);
+				System.out.println(">>> before parse: " + response);
+				Map<String, Object> data = ars.parseAmazonFBAInventoryResponseXml(response);
+				System.out.println(">>> after parse: " + data);
+				if (null != data) {
+					//ars.saveRequests((List<Map<String,Object>>) data.get("data"),  account);
+				}
+				//ars.getReportRequestListByAccount(account);
+				//ars.downloadReportByAccount(account);
+			}
+		});
+	}
+	*/
+	
+	/*public static void main(String[] args) {
+		initSpring();
+		initAccounts();
+		String step = "1";
+		AmazonReportService ars = (AmazonReportService) context.getBean("amazonReportService");
+		if("1".equals(step)) {
+			ars.genFBAInventoryRequests();
+		} else if("2".equals(step)) {
+			CollectionUtil.each(accounts , new IAction<AmazonAccountModel>() {
+				@Override
+				public void excute(AmazonAccountModel account) {
+					ars.getReportRequestListByAccount(account);
+				}
+			});
+		} else if("3".equals(step)) {
+			CollectionUtil.each(accounts , new IAction<AmazonAccountModel>() {
+				@Override
+				public void excute(AmazonAccountModel account) {
+					ars.downloadReportByAccount(account);
+				}
+			});
+		}
+	}*/
+	
+	/*
+	@SuppressWarnings("unchecked")
+	public static void main(String[] args) {
+		initSpring();
+		initAccounts();
+		String step = "3";
+		AmazonReportService ars = (AmazonReportService) context.getBean("amazonReportService");
+		CollectionUtil.each(new AmazonAccountModel[] { createUSAccount() } , new IAction<AmazonAccountModel>() {
+			public void excute(AmazonAccountModel account) {
+				CollectionUtil.each(new String[] { 
+						"_GET_RESERVED_INVENTORY_DATA_" }, new IAction<String>() {
+					public void excute(String type) {
+						if("1".equals(step)) {
+							CollectionUtil.each(amazonPOST(account, type), new IAction<String>() {
+								public void excute(String response) {
+									System.out.println(">>> before parse: " + response);
+									Map<String, Object> data = ars.parseAmazonFBAInventoryResponseXml(response);
+									System.out.println(">>> after parse: " + data);
+									if (null != data) {
+										ars.saveRequests((List<Map<String,Object>>) data.get("data"),  account);
+									}
+								}
+							});
+						} else if("2".equals(step)) {
+							ars.getReportRequestListByAccount(account);
+							System.out.println(">>> get report");
+						} else if("3".equals(step)) {
+							ars.downloadReportByAccount(account);
+							System.out.println(">>> download report");
+						}
+					}
+				});
+			}
+		});
+		System.out.println("End");
+	}
+	*/
+}

+ 665 - 0
project/ocs/src/main/java/com/it/ocs/amazon/utils/AmazonUtils.java

@@ -0,0 +1,665 @@
+package com.it.ocs.amazon.utils;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+import org.w3c.dom.Node;
+
+import com.it.ocs.amazon.model.AmazonRequestMode;
+import com.it.ocs.synchronou.model.AmazonAccountModel;
+
+public class AmazonUtils{
+	
+    private static final Logger log = Logger.getLogger(AmazonUtils.class);
+
+    /** Match an asterisk character. */
+    private static final Pattern asteriskPtn = Pattern.compile("*", Pattern.LITERAL);
+
+    /** Match one back-slash. */
+    private static final Pattern BackSlashPtn = Pattern.compile("\\", Pattern.LITERAL);
+
+    /** A cached simple date format for generating time-stamps. */
+    private static final AtomicReference<DateFormat> dateFormatPool = new AtomicReference<DateFormat>();
+
+    /** Match one equal character. */
+    private static final Pattern EqualPtn = Pattern.compile("=", Pattern.LITERAL);
+
+    /** Escaped back slash character. */
+    private static final String EscBackSlash = "\\\\";
+
+    /** Escaped equal character. */
+    private static final String EscEqual = "\\=";
+
+    /** Escaped forward slash character. */
+    private static final String EscForwardSlash = "\\/";
+
+    /** Escaped left parenthesis character. */
+    private static final String EscLParen = "\\(";
+
+    /** Escaped right parenthesis character. */
+    private static final String EscRParen = "\\)";
+
+    /** Escaped semicolon character. */
+    private static final String EscSemicolon = "\\;";
+
+    /** Match one forward-slash. */
+    private static final Pattern ForwardSlashPtn = Pattern.compile("/", Pattern.LITERAL);
+
+    /** Match one right parenthesis character. */
+    private static final Pattern LParenPtn = Pattern.compile("(", Pattern.LITERAL);
+
+    /** Match leading and/or trailing white spaces. */
+    private static final Pattern OuterWhiteSpacesPtn = Pattern.compile("\\A\\s+|\\s+\\z");
+
+    /** Match "%2F". */
+    private static final Pattern pct2FPtn = Pattern.compile("%2F", Pattern.LITERAL);
+
+    /** Match "%7E". */
+    private static final Pattern pct7EPtn = Pattern.compile("%7E", Pattern.LITERAL);
+
+    /** Match a + character. */
+    private static final Pattern plusPtn = Pattern.compile("+", Pattern.LITERAL);
+
+    /** Match one right parenthesis character. */
+    private static final Pattern RParenPtn = Pattern.compile(")", Pattern.LITERAL);
+
+    /** Match one semicolon character. */
+    private static final Pattern SemicolonPtn = Pattern.compile(";", Pattern.LITERAL);
+
+    /** Match one or more white spaces. */
+    private static final Pattern WhiteSpacesPtn = Pattern.compile("\\s+");
+
+    /** Default character encoding. */
+    public static final String DEFAULT_ENCODING = "UTF-8";
+
+    /** For creating xml dates. */
+    private static final ThreadLocal<DatatypeFactory> threadDTF = new ThreadLocal<DatatypeFactory>();
+
+    /** For creating xml documents. */
+    private static final ThreadLocal<DocumentBuilderFactory> threadDBF = new ThreadLocal<DocumentBuilderFactory>();
+
+    /** Thread local transformer factory. */
+    private static final ThreadLocal<TransformerFactory> threadTF = new ThreadLocal<TransformerFactory>();
+
+    /** Map from enum classes to hash maps of names. */
+    private static final ConcurrentHashMap<Object, HashMap<String, Object>> enumMaps = 
+                new ConcurrentHashMap<Object, HashMap<String, Object>>();
+
+    /**
+     * Calculate String to Sign for SignatureVersion 0
+     * 
+     * @param parameters
+     *            request parameters
+     * @return String to Sign
+     */
+    private static String calculateStringToSignV0(Map<String, String> parameters) {
+        StringBuilder data = new StringBuilder();
+        data.append(parameters.get("Action")).append(parameters.get("Timestamp"));
+        return data.toString();
+    }
+
+    /**
+     * Calculate String to Sign for SignatureVersion 1
+     * 
+     * @param parameters
+     *            request parameters
+     * @return String to Sign
+     */
+    private static String calculateStringToSignV1(Map<String, String> parameters) {
+        StringBuilder data = new StringBuilder();
+        Map<String, String> sorted = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+        sorted.putAll(parameters);
+        Iterator<Entry<String, String>> pairs = sorted.entrySet().iterator();
+        while (pairs.hasNext()) {
+            Map.Entry<String, String> pair = pairs.next();
+            data.append(pair.getKey());
+            data.append(pair.getValue());
+        }
+        return data.toString();
+    }
+
+    /**
+     * Calculate String to Sign for SignatureVersion 2
+     * 
+     * @param serviceUri
+     * 
+     * @param parameters
+     *            request parameters
+     * @return String to Sign
+     */
+    static String calculateStringToSignV2(URI serviceUri, Map<String, String> parameters) {
+        StringBuilder data = new StringBuilder();
+        data.append("POST");
+        data.append("\n");
+        data.append(serviceUri.getHost().toLowerCase());
+        if (!usesStandardPort(serviceUri)) {
+            data.append(":");
+            data.append(serviceUri.getPort());
+        }
+        data.append("\n");
+        String uri = serviceUri.getPath();
+        data.append(AmazonUtils.urlEncode(uri, true));
+        data.append("\n");
+        Map<String, String> sorted = new TreeMap<String, String>();
+        sorted.putAll(parameters);
+        Iterator<Map.Entry<String, String>> pairs = sorted.entrySet().iterator();
+        while (pairs.hasNext()) {
+            Map.Entry<String, String> pair = pairs.next();
+            String key = pair.getKey();
+            data.append(AmazonUtils.urlEncode(key, false));
+            data.append("=");
+            String value = pair.getValue();
+            data.append(AmazonUtils.urlEncode(value, false));
+            if (pairs.hasNext()) {
+                data.append("&");
+            }
+        }
+        return data.toString();
+    }
+
+    /**
+     * Clean white space. Remove leading and trailing, and replace internal runs
+     * with a single space character.
+     * 
+     * @param s
+     * 
+     * @return The clean string.
+     */
+    private static String cleanWS(String s) {
+        s = replaceAll(s, OuterWhiteSpacesPtn, "");
+        s = replaceAll(s, WhiteSpacesPtn, " ");
+        return s;
+    }
+
+    /**
+     * Replace a pattern in a string.
+     * <p>
+     * Do not do recursive replacement. Return the original string if no changes
+     * are required.
+     * 
+     * @param s
+     *            The string to search.
+     * 
+     * @param p
+     *            The pattern to search for.
+     * 
+     * @param r
+     *            The string to replace occurrences with.
+     * 
+     * @return The new string.
+     */
+    static String replaceAll(String s, Pattern p, String r) {
+        int n = s == null ? 0 : s.length();
+        if (n == 0) {
+            return s;
+        }
+        Matcher m = p.matcher(s);
+        if (!m.find()) {
+            return s;
+        }
+        StringBuilder buf = new StringBuilder(n + 12);
+        int k = 0;
+        do {
+            buf.append(s, k, m.start());
+            buf.append(r);
+            k = m.end();
+        } while (m.find());
+        if (k < n) {
+            buf.append(s, k, n);
+        }
+        return buf.toString();
+    }
+
+    /**
+     * Computes RFC 2104-compliant HMAC signature.
+     * 
+     * @param data
+     *            The data to sign.
+     * @param key
+     *            The key to use for signing.
+     * 
+     * @param algorithm
+     *            The signing algorithm.
+     * 
+     * @return The signature.
+     */
+    static String sign(String data, String key, String algorithm) {
+        try {
+            Mac mac = Mac.getInstance(algorithm);
+            mac.init(new SecretKeySpec(key.getBytes(DEFAULT_ENCODING), algorithm));
+            byte[] signature = Base64.encodeBase64(mac.doFinal(data.getBytes(DEFAULT_ENCODING)));
+            String encoded = new String(signature, DEFAULT_ENCODING);
+            //log.debug("\nSign:"+data+"\nKey:"+key+"\nAlgorithm:"+algorithm+"\nSignature:"+encoded);
+            return encoded;
+        } catch (Exception e) {
+            throw AmazonUtils.wrap(e);
+        }
+    }
+
+    /**
+     * URL encode a value.
+     * 
+     * @param value
+     * 
+     * @param path
+     *            true if is a path and '/' should not be encoded.
+     * 
+     * @return The encoded string.
+     */
+    protected static String urlEncode(String value, boolean path) {
+        try {
+            value = URLEncoder.encode(value, DEFAULT_ENCODING);
+        } catch (Exception e) {
+            throw wrap(e);
+        }
+        value = replaceAll(value, plusPtn, "%20");
+        value = replaceAll(value, asteriskPtn, "%2A");
+        value = replaceAll(value, pct7EPtn, "~");
+        if (path) {
+            value = replaceAll(value, pct2FPtn, "/");
+        }
+        return value;
+    }
+
+    /**
+     * Get a thread local DocumentBuilderFactory.
+     * <p>
+     * DocumentBuilderFactory is NOT thread safe. This method uses a thread
+     * local to create one per calling thread.
+     * 
+     * @return The instance for this thread.
+     */
+    static DocumentBuilderFactory getDBF() {
+        DocumentBuilderFactory dbf = threadDBF.get();
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+            threadDBF.set(dbf);
+        }
+        return dbf;
+    }
+
+    /**
+     * Gets an enum instance from the enum class and name.
+     * <p>
+     * Caches hashmaps of enum names. If enum has an Other entry it will be
+     * returned instead of null when no match is found.
+     * 
+     * @param cls
+     * @param name
+     * 
+     * @return The found instance.
+     */
+    @SuppressWarnings("unchecked")
+    static <T> T getEnumValue(Class<T> cls, String name) {
+        HashMap<String, Object> enumMap = enumMaps.get(cls);
+        if (enumMap == null) {
+            T[] consts = cls.getEnumConstants();
+            enumMap = new HashMap<String, Object>(consts.length);
+            for (T e : consts) {
+                enumMap.put(((Enum<?>) e).toString(), e);
+            }
+            enumMaps.put(cls, enumMap);
+        }
+        T v = (T) enumMap.get(name);
+        if (v == null) {
+            v = (T) enumMap.get("Other");
+        }
+        return v;
+    }
+
+    /**
+     * Get a ISO 8601 formatted timestamp of now.
+     * 
+     * @return The time stamp.
+     */
+    public static String getFormattedTimestamp() {
+        DateFormat df = dateFormatPool.getAndSet(null);
+        if (df == null) {
+            df = createISODateFormat();
+        }
+        String timestamp = df.format(new Date());
+        dateFormatPool.set(df);
+        return timestamp;
+    }
+
+    /**
+     * Parse an ISO 8601 formatted timestamp
+     * 
+     * @return the parsed date
+     */
+    static Date parseTimestamp(String timestamp) throws ParseException {
+        DateFormat df = dateFormatPool.getAndSet(null);
+        if (df == null) {
+            df = createISODateFormat();
+        }
+        Date date = df.parse(timestamp);
+        dateFormatPool.set(df);
+        return date;
+    }
+
+    /**
+     * @return a new ISO 8601 date formatter
+     */
+    static DateFormat createISODateFormat() {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+        df.setTimeZone(TimeZone.getTimeZone("UTC"));
+        return df;
+    }
+
+    /**
+     * Create a new instance of a class, wrap exceptions.
+     * 
+     * @param cls
+     * 
+     * @return The new instance.
+     */
+    static <T> T newInstance(Class<T> cls) {
+        try {
+            return cls.newInstance();
+        } catch (Exception e) {
+            throw wrap(e);
+        }
+    }
+
+    /**
+     * Computes RFC 2104-compliant HMAC signature for request parameters
+     * Implements AWS Signature, as per following spec:
+     * 
+     * If Signature Version is 0, it signs concatenated Action and Timestamp
+     * 
+     * If Signature Version is 1, it performs the following:
+     * 
+     * Sorts all parameters (including SignatureVersion and excluding Signature,
+     * the value of which is being created), ignoring case.
+     * 
+     * Iterate over the sorted list and append the parameter name (in original
+     * case) and then its value. It will not URL-encode the parameter values
+     * before constructing this string. There are no separators.
+     * 
+     * If Signature Version is 2, string to sign is based on following:
+     * 
+     * 1. The HTTP Request Method followed by an ASCII newline (%0A) 2. The HTTP
+     * Host header in the form of lowercase host, followed by an ASCII newline.
+     * 3. The URL encoded HTTP absolute path component of the URI (up to but not
+     * including the query string parameters); if this is empty use a forward
+     * '/'. This parameter is followed by an ASCII newline. 4. The concatenation
+     * of all query string components (names and values) as UTF-8 characters
+     * which are URL encoded as per RFC 3986 (hex characters MUST be uppercase),
+     * sorted using lexicographic byte ordering. Parameter names are separated
+     * from their values by the '=' character (ASCII character 61), even if the
+     * value is empty. Pairs of parameter and values are separated by the '&'
+     * character (ASCII code 38).
+     * 
+     * @param serviceUri
+     *            Including host, port, api name, and api version
+     * @param parameters
+     * @param signatureVersion
+     * @param signatureMethod
+     * @param awsSecretKey
+     * 
+     * @return The base64 encoding of the signature.
+     */
+    public static String signParameters(URI serviceUri, String signatureVersion, String signatureMethod,
+            Map<String, String> parameters, String aswSecretKey) {
+        parameters.put("SignatureVersion", signatureVersion);
+        String algorithm = "HmacSHA1";
+        String stringToSign = null;
+        if ("0".equals(signatureVersion)) {
+            stringToSign = calculateStringToSignV0(parameters);
+        } else if ("1".equals(signatureVersion)) {
+            stringToSign = calculateStringToSignV1(parameters);
+        } else if ("2".equals(signatureVersion)) {
+            algorithm = signatureMethod;
+            parameters.put("SignatureMethod", algorithm);
+            stringToSign = calculateStringToSignV2(serviceUri, parameters);
+        } else {
+            throw new IllegalArgumentException("Invalid Signature Version specified");
+        }
+        return sign(stringToSign, aswSecretKey, algorithm);
+    }
+
+    /**
+     * Get xml string for contents of node.
+     * 
+     * @param node
+     * 
+     * @return The node as xml.
+     */
+    static String toXmlString(Node node) {
+        try {
+            Transformer transformer = getTF().newTransformer();
+            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+            transformer.setOutputProperty(OutputKeys.INDENT, "no");
+            StringWriter sw = new StringWriter();
+            StreamResult result = new StreamResult(sw);
+            DOMSource source = new DOMSource(node);
+            transformer.transform(source, result);
+            return sw.toString();
+        } catch (Exception e) {
+            throw wrap(e);
+        }
+    }
+
+    /**
+     * Determine if a uri uses https.
+     * 
+     * @param uri
+     * 
+     * @return true if uses https.
+     */
+    public static boolean usesHttps(URI uri) {
+        return uri.getScheme().equals("https");
+    }
+
+    /**
+     * Determine if a url uses the standard port.
+     * <p>
+     * Port 80 for http, 443 for https.
+     * 
+     * @param uri
+     * 
+     * @return true if standard port is used.
+     */
+    static boolean usesStandardPort(URI uri) {
+        int portNumber = uri.getPort();
+        if (portNumber == -1) {
+            return true;
+        }
+        String schema = uri.getScheme();
+        int standardPort = schema.equals("https") ? 443 : 80;
+        return portNumber == standardPort;
+    }
+
+    /**
+     * Close a Closeable if it is not null.
+     * 
+     * @param a
+     *            The Closeable or null.
+     */
+    public static void close(Closeable a) {
+        try {
+            if (a != null) {
+                a.close();
+            }
+        } catch (Exception e) {
+            throw wrap(e);
+        }
+    }
+
+    /**
+     * Escape application name before using to form user agent string.
+     * <p>
+     * Clean up white space and then escape back slash and forward slash
+     * characters.
+     * 
+     * @param s
+     * 
+     * @return The escaped app name.
+     */
+    public static String escapeAppName(String s) {
+        s = cleanWS(s);
+        s = replaceAll(s, BackSlashPtn, EscBackSlash);
+        s = replaceAll(s, ForwardSlashPtn, EscForwardSlash);
+        return s;
+    }
+
+    /**
+     * Escape an application version string.
+     * 
+     * @param s
+     * 
+     * @return The escaped app version.
+     */
+    public static String escapeAppVersion(String s) {
+        s = cleanWS(s);
+        s = replaceAll(s, BackSlashPtn, EscBackSlash);
+        s = replaceAll(s, LParenPtn, EscLParen);
+        return s;
+    }
+
+    /**
+     * Standardize and escape an attribute name.
+     * <p>
+     * Clean white space. Escape back-slashes and equals-sign with a back-slash.
+     * 
+     * @param s
+     *            The attribute name to standardize and escape.
+     * 
+     * @return The standardized and escaped attribute name.
+     */
+    public static String escapeAttributeName(String s) {
+        s = cleanWS(s);
+        s = replaceAll(s, BackSlashPtn, EscBackSlash);
+        s = replaceAll(s, EqualPtn, EscEqual);
+        return s;
+    }
+
+    /**
+     * Standardize and escape an attribute value.
+     * <p>
+     * Clean white space. Escape back-slashes, semi-colons, and right
+     * parenthesis with a back-slash.
+     * 
+     * @param s
+     *            The attribute value to standardize and escape.
+     * 
+     * @return The standardized and escaped attribute value.
+     */
+    public static String escapeAttributeValue(String s) {
+        s = cleanWS(s);
+        s = replaceAll(s, BackSlashPtn, EscBackSlash);
+        s = replaceAll(s, SemicolonPtn, EscSemicolon);
+        s = replaceAll(s, RParenPtn, EscRParen);
+        return s;
+    }
+
+    /**
+     * Get a thread local DatatypeFactory.
+     * <p>
+     * DatatypeFactory is NOT required to be thread safe. This method uses a
+     * thread local to create one per calling thread.
+     * 
+     * @return A thread local DatatypeFactory.
+     */
+    public static DatatypeFactory getDTF() {
+        DatatypeFactory dtf = threadDTF.get();
+        if (dtf == null) {
+            try {
+                dtf = DatatypeFactory.newInstance();
+            } catch (Exception e) {
+                throw wrap(e);
+            }
+            threadDTF.set(dtf);
+        }
+        return dtf;
+    }
+
+    /**
+     * Get a thread local transformer factory.
+     * 
+     * @return The factory.
+     */
+    public static TransformerFactory getTF() {
+        TransformerFactory tf = threadTF.get();
+        if (tf == null) {
+            tf = TransformerFactory.newInstance();
+            threadTF.set(tf);
+        }
+        return tf;
+    }
+
+    /**
+     * Wrap Checked exceptions in runtime exception.
+     * 
+     * @param e
+     * 
+     * @return e, wrapped in a runtime exception if necessary.
+     */
+    public static RuntimeException wrap(Throwable e) {
+        if (e instanceof RuntimeException) {
+            return (RuntimeException) e;
+        }
+        return new RuntimeException(e);
+    }
+	
+    public static AmazonRequestMode getRequestModel(AmazonAccountModel account){
+		AmazonRequestMode requestMode = new AmazonRequestMode();
+		requestMode.setServiceURL(account.getUrl());
+		requestMode.setAccessKey(account.getAccessKey());//"AKIAIQJPPHYX7ZMKPTNQ"
+		requestMode.setSecretKey(account.getSecretKey());//"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"
+		requestMode.setSellerId(account.getSellerId());//AV7KSH7XB8RNM
+        requestMode.setMarketplaceId(account.getMarketplaceId());
+		return requestMode;
+	}
+    
+    public static String computeContentMD5Header(InputStream inputStream) {
+        // Consume the stream to compute the MD5 as a side effect.
+        DigestInputStream s;
+        try {
+            s = new DigestInputStream(inputStream,MessageDigest.getInstance("MD5"));
+            // drain the buffer, as the digest is computed as a side-effect
+            byte[] buffer = new byte[8192];
+            while(s.read(buffer) > 0);
+            return new String(org.apache.commons.codec.binary.Base64.encodeBase64(s.getMessageDigest().digest()),"UTF-8");
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 138 - 0
project/ocs/src/main/java/com/it/ocs/amazon/utils/FindTimeLine.java

@@ -0,0 +1,138 @@
+package com.it.ocs.amazon.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.it.ocs.amazon.model.ReportRequestListModel;
+
+public class FindTimeLine {
+	private List<ReportRequestListModel> data;
+	private String startDate;
+	private String endDate;
+	private List<ReportRequestListModel> startList;
+	private List<ReportRequestListModel> returnData;
+	
+	public FindTimeLine(List<ReportRequestListModel> data,String startDate,String endDate){
+		this.data = data;
+		this.startDate = startDate;
+		this.endDate = endDate;
+	}
+	
+	public List<ReportRequestListModel> getReturn(){
+		returnData = new ArrayList<>();
+		ReportRequestListModel re = this.getDataTree();
+		if(null != re){
+			ReportRequestListModel mid = re;
+			returnData.add(re);
+			System.out.println(mid.getStartDate()+"--"+mid.getEndDate());
+			if(re.hasChild()){
+				do{
+					mid = mid.getChildren().get(0);
+					returnData.add(mid);
+					System.out.println(mid.getStartDate()+"--"+mid.getEndDate());
+				}while(null != mid&&mid.hasChild());
+			}
+			
+		}
+		for(ReportRequestListModel result : returnData){
+			if(result.getIsGetData()== 0){
+				return null;
+			}
+		}
+		return returnData;
+	}
+	
+	public ReportRequestListModel getDataTree(){
+		startList = new ArrayList<>();
+		for(ReportRequestListModel model : data){
+			if(startDate.equals(model.getStartDate())){
+				if(endDate.equals(model.getEndDate())){
+					return model;
+				}else{
+					List<ReportRequestListModel> mid = getChildren(model.getEndDate());
+					if(null != mid && mid.size()> 0){
+						model.setChildren(getChildren(model.getEndDate()));
+						startList.add(model);
+					}
+				}
+				
+			}
+		}
+		return startList.get(0);
+	}
+
+	private List<ReportRequestListModel> getChildren(String start) {
+		List<ReportRequestListModel> children = new ArrayList<>();
+		for(ReportRequestListModel model : data){
+			if(model.getStartDate().equals(start)){
+				List<ReportRequestListModel> mid = getChildren(model.getEndDate());
+				if(null == mid){
+					continue;
+				}else if(mid.size() == 0){
+					if(model.getEndDate().equals(endDate)){
+						model.setChildren(mid);
+						children.add(model);
+						return children;
+					}else{
+						return null;
+					}
+				}else{
+					model.setChildren(mid.subList(0, 1));
+					children.add(model);
+				}
+			}
+		}
+		return children;
+	}
+	
+	public static void main(String[] args) {
+		List<ReportRequestListModel> data1 = new ArrayList<>();
+		ReportRequestListModel r1 = new ReportRequestListModel();
+		r1.setStartDate("12:00");
+		r1.setEndDate("13:00");
+		data1.add(r1);
+		ReportRequestListModel r2 = new ReportRequestListModel();
+		r2.setStartDate("12:00");
+		r2.setEndDate("15:00");
+		data1.add(r2);
+		ReportRequestListModel r3 = new ReportRequestListModel();
+		r3.setStartDate("13:00");
+		r3.setEndDate("15:00");
+		data1.add(r3);
+		data1.add(r3);
+		ReportRequestListModel r4 = new ReportRequestListModel();
+		r4.setStartDate("13:00");
+		r4.setEndDate("14:00");
+		data1.add(r4);
+		ReportRequestListModel r5 = new ReportRequestListModel();
+		r5.setStartDate("14:00");
+		r5.setEndDate("15:00");
+		data1.add(r5);
+		ReportRequestListModel r6 = new ReportRequestListModel();
+		r6.setStartDate("14:00");
+		r6.setEndDate("17:00");
+		data1.add(r6);
+		ReportRequestListModel r7 = new ReportRequestListModel();
+		r7.setStartDate("15:00");
+		r7.setEndDate("16:00");
+		data1.add(r7);
+		ReportRequestListModel r8 = new ReportRequestListModel();
+		r8.setStartDate("12:00");
+		r8.setEndDate("17:00");
+		data1.add(r8);
+		FindTimeLine line = new FindTimeLine(data1, "12:00", "16:00");
+		ReportRequestListModel re = line.getDataTree();
+		if(null != re){
+			ReportRequestListModel mid = re;
+			System.out.println(mid.getStartDate()+"--"+mid.getEndDate());
+			if(re.hasChild()){
+				do{
+					mid = mid.getChildren().get(0);
+					System.out.println(mid.getStartDate()+"--"+mid.getEndDate());
+				}while(null != mid&&mid.hasChild());
+			}
+			
+		}
+		System.out.println("end");
+	}
+}

+ 226 - 0
project/ocs/src/main/java/com/it/ocs/amazon/utils/SiteDateParseUtils.java

@@ -0,0 +1,226 @@
+package com.it.ocs.amazon.utils;
+
+public class SiteDateParseUtils {
+	
+	/**
+	 * 意大利
+	 * @param value 11/nov/2017 23.06.29 GMT+00.00
+	 * @return
+	 */
+	public static String it(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String hour = "";
+		String minute = "";
+		String second = "";
+		String str[] = value.split(" ");
+		String ymd[] = str[0].split("/");
+		String hms[] = str[1].split("\\.");
+		day = addZero(ymd[0]);
+		month = formateMonth(ymd[1]);
+		year = ymd[2];
+		hour = addZero(hms[0]);
+		minute = addZero(hms[1]);
+		second = addZero(hms[2]);
+		return year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
+	}
+	
+	/**
+	 * 美国
+	 * @param value Nov 13, 2017 12:00:08 AM PST
+	 * @return
+	 */
+	public static String us(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		day = addZero(str[1].replace(",", ""));
+		month = formateMonth(str[0]);
+		year = str[2];
+
+		return year+"-"+month+"-"+day+" "+str[3];
+	}
+	
+	/**
+	 * 德国
+	 * @param value 11.11.2017 23:00:37 GMT+00:00
+	 * @return
+	 */
+	public static String de(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		String dmy[] = str[0].split("\\.");
+		day = addZero(dmy[0]);
+		month = formateMonth(dmy[1]);
+		year = dmy[2];
+
+		return year+"-"+month+"-"+day+" "+str[1];
+	}
+	
+	/**
+	 * 加拿大
+	 * @param value 2017-11-10 12:25:54 AM PST
+	 * @return
+	 */
+	public static String ca(String value){
+		String str[] = value.split(" ");
+		return str[0]+" "+str[1];
+	}
+	
+	/**
+	 * 英国
+	 * @param value 12 Nov 2017 00:01:31 GMT+00:00
+	 * @return
+	 */
+	public static String uk(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		day = addZero(str[0]);
+		month = formateMonth(str[1]);
+		year = str[2];
+
+		return year+"-"+month+"-"+day+" "+str[3];
+	}
+	
+	/**
+	 * 法国
+	 * @param value 11 nov. 2017 23:13:26 UTC+00:00
+	 * @return
+	 */
+	public static String fr(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		day = addZero(str[0]);
+		month = formateMonth(str[1]);
+		year = str[2];
+
+		return year+"-"+month+"-"+day+" "+str[3];
+	}
+	
+	/**
+	 * 西班牙
+	 * @param value 12/11/2017 13:35:53 GMT+00:00
+	 * @return
+	 */
+	public static String es(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		String dmy[] = str[0].split("/");
+		day = addZero(dmy[0]);
+		month = formateMonth(dmy[1]);
+		year = dmy[2];
+
+		return year+"-"+month+"-"+day+" "+str[1];
+	}
+	
+	/**
+	 * 日本
+	 * @param value 2017/11/11 00:09:37JST
+	 * @return
+	 */
+	public static String jp(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String str[] = value.split(" ");
+		String dmy[] = str[0].split("/");
+		day = addZero(dmy[2]);
+		month = formateMonth(dmy[1]);
+		year = dmy[0];
+
+		return year+"-"+month+"-"+day+" "+str[1].replace("JST", "");
+	}
+	
+	/**
+	 * 澳大利亚
+	 * @param value 02/03/2018 5:20:26 PM GMT+09:00
+	 * @return
+	 */
+	public static String au(String value){
+		String year = "";
+		String month = "";
+		String day = "";
+		String hour = "";
+		String minute = "";
+		String second = "";
+		String str[] = value.split(" ");
+		String ymd[] = str[0].split("/");
+		String hms[] = str[1].split(":");
+		day = addZero(ymd[0]);
+		month = formateMonth(ymd[1]);
+		year = ymd[2];
+		hour = addZero(hms[0]);
+		minute = addZero(hms[1]);
+		second = addZero(hms[2]);
+		return year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
+	}
+	
+	
+	public static String addZero(String s){
+		if(s.length() == 1){
+			return "0"+s;
+		}
+		return s;
+	}
+	public static String formateMonth(String m){
+		//Jan
+		if(m.toUpperCase().indexOf("JAN")> -1){
+			return "01";
+		}
+		if(m.toUpperCase().indexOf("FEB")> -1){
+			return "02";
+		}
+		if(m.toUpperCase().indexOf("MAR")> -1){
+			return "03";
+		}
+		if(m.toUpperCase().indexOf("APR")> -1||m.toUpperCase().indexOf("AVR")> -1){
+			return "04";
+		}
+		if(m.toUpperCase().indexOf("MAY")> -1||m.toUpperCase().indexOf("MAG")> -1||m.toUpperCase().indexOf("MAI")> -1){
+			return "05";
+		}
+		if(m.toUpperCase().indexOf("JUN")> -1||m.toUpperCase().indexOf("JUIN")> -1||m.toUpperCase().indexOf("GIU")> -1){
+			return "06";
+		}
+		if(m.toUpperCase().indexOf("JUL")> -1||m.toUpperCase().indexOf("LUG")> -1||m.toUpperCase().indexOf("JUIL")> -1){
+			return "07";
+		}
+		if(m.toUpperCase().indexOf("AUG")> -1||m.toUpperCase().indexOf("AGO")> -1||m.toUpperCase().indexOf("AOUT")> -1||m.indexOf("août")> -1){
+			return "08";
+		}
+		if(m.toUpperCase().indexOf("SEP")> -1||m.toUpperCase().indexOf("SET")> -1||m.toUpperCase().indexOf("SEPT")> -1){
+			return "09";
+		}
+		if(m.toUpperCase().indexOf("OCT")> -1||m.toUpperCase().indexOf("OTT")> -1){
+			return "10";
+		}
+		if(m.toUpperCase().indexOf("NOV")> -1){
+			return "11";
+		}
+		if(m.toUpperCase().indexOf("DEC")> -1||m.toUpperCase().indexOf("DIC")> -1){
+			return "12";
+		}
+		return m;
+	}
+	public static void main(String[] args) {
+		System.out.println(it("11/nov/2017 23.06.29 GMT+00.00"));
+		System.out.println(us("Nov 13, 2017 12:00:08 AM PDT"));
+		System.out.println(de("11.11.2017 23:00:37 GMT+00:00"));
+		System.out.println(ca("2017-11-10 12:25:54 AM PST"));
+		System.out.println(uk("12 Nov 2017 00:01:31 GMT+00:00"));
+		System.out.println(fr("11 nov. 2017 23:13:26 UTC+00:00"));
+		System.out.println(es("12/11/2017 13:35:53 GMT+00:00"));
+		System.out.println(jp("2017/11/11 00:09:37JST"));
+		System.out.println(au("02/03/2018 5:20:26 PM GMT+09:00"));
+	}
+}

+ 157 - 0
project/ocs/src/main/java/com/it/ocs/api/constant/WarehouseConstant.java

@@ -0,0 +1,157 @@
+package com.it.ocs.api.constant;
+
+/**
+ * 
+* @ClassName: WarehouseConstant 
+* @Description: 仓库常量类
+* @author wgc 
+* @date 2018年4月8日 上午11:25:44 
+*
+ */
+public class WarehouseConstant {
+	/**
+	 * 检查并获取用户的基本信息
+	 */
+	public final static String CHECKANDGETUSERINFO = "CheckAndGetUserInfo";
+	
+	/**
+	 * 保存出库订单
+	 */
+	public final static String SAVESHIPPINGORDER = "SaveShippingOrder";
+	
+	/**
+	 * 查询WMS出库订单状态和异常
+	 */
+	public final static String GETSHIPPINGORDERLISTBYQUERY = "GetShippingOrderListByQuery";
+	
+	/**
+	 * 保存入库订单
+	 */
+	public final static String SAVERECEIPT = "SaveReceipt";
+	
+	/**
+	 * 查询库存
+	 */
+	public final static String GETINVENTORYLISTBYQUERY = "GetInventoryListByQuery";
+	
+	
+	/**
+	 * 问题:以下关于 DEOWNERCODE、DESTORECODE、DEWMSAPPKEY、DEWMSAPPSECRET的值,测试环境与生产环境是不同的。
+	 * 		 放入到java代码常量会导致每次开发与提交都需要修改这些常量,这是不合适的。本质上讲这些就不是常量。
+	 * 修改:测试环境与生产环境是不同的常量值,已经移到basic.properties文件中,通过判断相应环境,从属性文件中取到相应环境的值
+	 */
+	
+	/**
+	 * 德国仓货主代码(业务主体)
+	 */
+	//public final static String DEOWNERCODE = "LE"; // dev
+	//public final static String DEOWNERCODE = "GB"; //produce
+	
+	/**
+	 * 德国仓仓库代码 LE.wh2
+	 */
+	//public final static String DESTORECODE = "LE.wh2";
+	
+	/**
+	 * 德国WMS仓库LE.wh2接口的用户名
+	 */
+	//public final static String DEWMSAPPKEY = "leadmin"; // dev
+	//public final static String DEWMSAPPKEY = "wmsadmin"; // produce
+	
+	/**
+	 * 德国WMS仓库LE.wh2接口的密码
+	 */
+	//public final static String DEWMSAPPSECRET = "666666"; //dev 
+	//public final static String DEWMSAPPSECRET = "Le.*123456"; //produce
+	
+
+	/**
+	 * 德国仓VC出库订单类型:销售出库:HME_VC_SHIPMENT
+
+	 */
+	public final static String DE_OUT_HME_VC_SHIPMENT="HME_VC_SHIPMENT";
+	
+	/**
+	 * 德国仓出库订单类型:销售出库:HME_INV_SHIPMENT
+
+	 */
+	public final static String DE_OUT_HME_INV_SHIPMENT="HME_INV_SHIPMENT";
+	
+	/**
+	 * 德国仓出库订单类型:补发出库:Reissue_Normal
+	 */
+	public final static String DE_OUT_REISSUE_NORMAL="Reissue_Normal";
+	
+	/**
+	 * 德国仓出库订单类型:换货出库:Transfer_Out
+	 */
+	public final static String DE_OUT_TRANSFER_OUT="Transfer_Out";
+	
+	/**
+	 * 德国仓出库订单类型:补发矫正出库:Reissue_Correct
+	 */
+	public final static String DE_OUT_REISSUE_CORRECT="HME_INV_SHIPMENT";
+	
+	/**
+	 * 物流承运商 DHL
+	 */
+	public final static String CARRIER_ID_DHL = "DHL";
+	
+	/**
+	 * 德国出入库单是否推送wms:0-未推送
+	 */
+	public final static String IS_SEND_WMS_NO = "0";
+	
+	/**
+	 * 德国出入库单是否推送wms:1-已推送
+	 */
+	public final static String IS_SEND_WMS_YES = "1";
+	
+	/**
+	 * 德国出入库单是否推送wms:2-已反馈
+	 */
+	public final static String IS_SEND_WMS_FEEDBACK = "2";
+	
+	/**
+	 * 德国出入库单是否推送wms:3-推送失败
+	 */
+	public final static String IS_SEND_WMS_FAILED = "3";
+	
+	public final static String IS_SEND_WMS_CANCELLED = "4";
+	
+	/**
+	 * 正常单
+	 */
+	public final static String IS_ABNORMAL_0 = "0";
+	
+	/**
+	 * 病单
+	 */
+	public final static String IS_ABNORMAL_1 ="1";
+	
+	/**
+	 * 德国仓入库单类型 退货入库
+	 */
+	public final static String DE_IN_ORDER_TYPE_RETURNGOODS = "1";
+	
+	/**
+	 * 德国仓入库单认领类型: 与WMS认领单无关
+	 */
+	public final static String DEIN_OMS_NONCLAIM = "oms_nonclaim";
+	
+	/**
+	 * 德国仓入库单认领类型: 已绑定WMS认领单
+	 */
+	public final static String DEIN_OMS_BINDCLAIM = "oms_bindclaim";
+	
+	/**
+	 * 德国仓入库单认领类型: WMS退货待认领单
+	 */
+	public final static String DEIN_WMS_UNCLAIMED = "wms_unclaimed";
+	
+	/**
+	 * 德国仓入库单认领类型: WMS退货已认领单
+	 */
+	public final static String DEIN_WMS_CLAIMED = "wms_claimed";
+	
+}

+ 133 - 0
project/ocs/src/main/java/com/it/ocs/api/controller/DeInOrderController.java

@@ -0,0 +1,133 @@
+package com.it.ocs.api.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.api.ex.Oms2WmsException;
+import com.it.ocs.api.service.IDeInOrderService;
+import com.it.ocs.api.service.IDeOperLogService;
+import com.it.ocs.api.service.IDeWarehouseService;
+import com.it.ocs.api.utils.SupportTimestampCustomDateEditor;
+import com.it.ocs.api.vo.AbnormalReasonVO;
+import com.it.ocs.api.vo.InOrderVO;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.ResponseResult;
+
+@Controller
+@RequestMapping("/wms/deinorder")
+public class DeInOrderController {
+	
+	private static final Logger logger = Logger.getLogger(DeInOrderController.class);
+	
+	@Autowired
+	private IDeInOrderService deInOrderService;
+
+	@Autowired
+	private IDeWarehouseService deWarehouseService;
+	
+	@Autowired
+	private IDeOperLogService deOperLogService;
+	
+	@InitBinder  
+	public void initBinder(WebDataBinder binder) {  
+	    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
+	    dateFormat.setLenient(false);  
+	    binder.registerCustomEditor(Date.class, new SupportTimestampCustomDateEditor(dateFormat));  
+	}
+	
+	@RequestMapping("/index")
+	public String index() {
+		return "admin/wms/deinorder";
+	}
+	
+	@RequestMapping(value="/list")
+	@ResponseBody 
+	public ResponseResult<InOrderVO> list(com.it.ocs.common.RequestParam param) {
+		return this.deInOrderService.queryByPage(param);
+	}
+
+	@RequestMapping(value="/send")
+	@ResponseBody 
+	public OperationResult send(@RequestParam("id") Long id, @RequestParam("orderId") String orderId, @RequestParam("orderOcsId") Long orderOcsId) {
+		logger.debug(">>> send >>> id=" + id + "; orderId=" + orderId + "; orderOcsId=" + orderOcsId);
+		try {
+			return this.deInOrderService.resend(id, orderId, orderOcsId);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			this.deOperLogService.recordOperFailedLog("send-in-order", id, e.getMessage());
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deOperLogService.recordOperFailedLog("send-in-order", id, e.getMessage());
+			return new OperationResult(1, "入库单推送失败,请联系管理员!", null, null);
+		}
+	}
+
+	@RequestMapping(value="/cancel")
+	@ResponseBody 
+	public OperationResult cancel(@RequestParam("id") Long id, @RequestParam("orderId") String orderId, @RequestParam("orderOcsId") Long orderOcsId) {
+		logger.debug(">>> cancel >>> id=" + id + "; orderId=" + orderId + "; orderOcsId=" + orderOcsId);
+		try {
+			return this.deInOrderService.cancel(id, orderId, orderOcsId);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			this.deWarehouseService.recordOperFailedLog("cancel-in-order", id, e.getMessage());
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deWarehouseService.recordOperFailedLog("cancel-in-order", id, e.getMessage());
+			return new OperationResult(1, "入库单取消失败,请稍后再试!", null, null);
+		}
+	}
+	
+	@RequestMapping(value="/abnormalReasonList")
+	@ResponseBody
+	public ResponseResult<AbnormalReasonVO> abnormalReasonList(com.it.ocs.common.RequestParam param) {
+		return deWarehouseService.findAbnormalReasons(param);
+	}
+
+	@RequestMapping(value="/claimList")
+	@ResponseBody
+	public ResponseResult<InOrderVO> claimList(com.it.ocs.common.RequestParam param) {
+		return this.deInOrderService.queryWmsClaimOrderByPage(param);
+	}
+
+	@RequestMapping(value="/claimOwnerList")
+	@ResponseBody
+	public ResponseResult<InOrderVO> claimOwnerList(com.it.ocs.common.RequestParam param) {
+		return this.deInOrderService.queryWmsClaimOwnerOrderByPage(param);
+	}
+
+	@RequestMapping(value="/main")
+	@ResponseBody
+	public ResponseResult<InOrderVO> main(@RequestParam("id") Long id) {
+		return this.deInOrderService.queryMainById(id);
+	}
+
+	@RequestMapping(value="/claim")
+	@ResponseBody
+	public OperationResult claim(@RequestParam("claim") Long claim, @RequestParam("owner") Long owner) {
+		logger.debug(">>> claim >>> claim=" + claim + "; owner=" + owner);
+		try {
+			return this.deInOrderService.claiming(claim, owner);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			this.deWarehouseService.recordOperFailedLog("claim-in-order", claim, e.getMessage());
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deWarehouseService.recordOperFailedLog("claim-in-order", claim, e.getMessage());
+			return new OperationResult(1, "认领操作失败,请稍后再试!", null, null);
+		}
+	}
+	
+}

+ 42 - 0
project/ocs/src/main/java/com/it/ocs/api/controller/DeOperLogController.java

@@ -0,0 +1,42 @@
+package com.it.ocs.api.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.api.service.IDeOperLogService;
+import com.it.ocs.api.utils.SupportTimestampCustomDateEditor;
+import com.it.ocs.api.vo.OperateLogVO;
+import com.it.ocs.common.ResponseResult;
+
+@Controller
+@RequestMapping("/wms/operlog")
+public class DeOperLogController {
+
+	@Autowired
+	private IDeOperLogService deOperLogService;
+
+	@InitBinder  
+	public void initBinder(WebDataBinder binder) {  
+	    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
+	    dateFormat.setLenient(false);  
+	    binder.registerCustomEditor(Date.class, new SupportTimestampCustomDateEditor(dateFormat));  
+	}
+	
+	@RequestMapping("/index")
+	public String index() {
+		return "admin/wms/operlog";
+	}
+	
+	@RequestMapping(value="/list")
+	@ResponseBody 
+	public ResponseResult<OperateLogVO> list(com.it.ocs.common.RequestParam param) {
+		return deOperLogService.queryByPage(param);
+	}
+}

+ 135 - 0
project/ocs/src/main/java/com/it/ocs/api/controller/DeOutOrderController.java

@@ -0,0 +1,135 @@
+package com.it.ocs.api.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.api.constant.WarehouseConstant;
+import com.it.ocs.api.ex.Oms2WmsException;
+import com.it.ocs.api.ex.SkuInventoryException;
+import com.it.ocs.api.model.DeAbnormalReasonModel;
+import com.it.ocs.api.service.IDeWarehouseService;
+import com.it.ocs.api.utils.AbnormalReasonUtils;
+import com.it.ocs.api.utils.SupportTimestampCustomDateEditor;
+import com.it.ocs.api.vo.AbnormalReasonVO;
+import com.it.ocs.api.vo.OutOrderChangeVO;
+import com.it.ocs.api.vo.OutOrderVO;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.ResponseResult;
+import com.it.ocs.common.util.StringUtil;
+
+@Controller
+@RequestMapping("/wms/deoutorder")
+public class DeOutOrderController {
+	
+	private static final Logger logger = Logger.getLogger(DeOutOrderController.class);
+	
+	@Autowired
+	private IDeWarehouseService deWarehouseService;
+	
+	@InitBinder  
+	public void initBinder(WebDataBinder binder) {  
+	    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
+	    dateFormat.setLenient(false);  
+	    binder.registerCustomEditor(Date.class, new SupportTimestampCustomDateEditor(dateFormat));  
+	}
+	
+	@RequestMapping("/index")
+	public String index() {
+		return "admin/wms/deoutorder";
+	}
+	
+	@RequestMapping(value="/list")
+	@ResponseBody 
+	public ResponseResult<OutOrderVO> list(com.it.ocs.common.RequestParam param) {
+		return deWarehouseService.findDeOutOrders(param);
+	}
+
+	@RequestMapping(value="/saveChanges")
+	@ResponseBody 
+	public OperationResult saveChanges(OutOrderChangeVO vo) {
+		logger.debug(StringUtil.instanceDetail(vo));
+		try {
+			return this.deWarehouseService.changeBeforeSendWms(vo);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			this.deWarehouseService.recordOperFailedLog("change-out-order", vo == null ? null : vo.getId(), e.getMessage() + ": " + StringUtil.instanceDetail(vo));
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deWarehouseService.recordOperFailedLog("change-out-order", vo == null ? null : vo.getId(), e.getMessage() + ": " + StringUtil.instanceDetail(vo));
+			return new OperationResult(1, "修改失败,请稍后再试", null, null);
+		}
+	}
+	
+	@RequestMapping(value="/send")
+	@ResponseBody 
+	public OperationResult send(@RequestParam("id") Long id, @RequestParam("orderId") String orderId, @RequestParam("orderOcsId") Long orderOcsId) {
+		logger.debug(">>> send >>> id=" + id + "; orderId=" + orderId + "; orderOcsId=" + orderOcsId);
+		try {
+			return this.deWarehouseService.sendOutOrder(id, orderId, orderOcsId);
+		} catch(SkuInventoryException e) {
+			this.deWarehouseService.recordOperFailedLog("send-out-order", id, e.getMessage());
+			try {
+				DeAbnormalReasonModel reason = AbnormalReasonUtils.newOut(id, AbnormalReasonUtils.ACTION_SOM_CSI, e.getMessage());
+				this.deWarehouseService.afterOperateDeOutOrder(id, WarehouseConstant.IS_SEND_WMS_FAILED, WarehouseConstant.IS_ABNORMAL_1, reason);
+			} catch (Exception e1) {
+				this.deWarehouseService.recordOperFailedLog("after-send-out-order", id, e.getMessage());
+				logger.error(">>> send >>> " + e.getMessage(), e);
+			}
+			return new OperationResult(2, e.getMessage(), null, null);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			try {
+				DeAbnormalReasonModel reason = AbnormalReasonUtils.newOut(id, AbnormalReasonUtils.ACTION_SOT_OIE, e.getMessage());
+				this.deWarehouseService.afterOperateDeOutOrder(id, WarehouseConstant.IS_SEND_WMS_FAILED, WarehouseConstant.IS_ABNORMAL_1, reason);
+			} catch (Exception e1) {
+				this.deWarehouseService.recordOperFailedLog("after-send-out-order", id, e.getMessage());
+				logger.error(">>> send >>> " + e.getMessage(), e);
+			}
+			this.deWarehouseService.recordOperFailedLog("send-out-order", id, e.getMessage());
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deWarehouseService.recordOperFailedLog("send-out-order", id, e.getMessage());
+			return new OperationResult(1, "推送失败,请稍后再试", null, null);
+		}
+	}
+
+	@RequestMapping(value="/cancel")
+	@ResponseBody 
+	public OperationResult cancel(@RequestParam("id") Long id, @RequestParam("orderId") String orderId, @RequestParam("orderOcsId") Long orderOcsId) {
+		logger.debug(">>> cancel >>> id=" + id + "; orderId=" + orderId + "; orderOcsId=" + orderOcsId);
+		try {
+			return this.deWarehouseService.cancelOutOrder(id, orderId, orderOcsId);
+		} catch(Oms2WmsException e) {
+			logger.error(e.getMessage());
+			this.deWarehouseService.recordOperFailedLog("cancel-out-order", id, e.getMessage());
+			return new OperationResult(1, e.getMessage(), null, null);
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			this.deWarehouseService.recordOperFailedLog("cancel-out-order", id, e.getMessage());
+			return new OperationResult(1, "出库单取消失败,请稍后再试", null, null);
+		}
+	}
+	
+	@RequestMapping(value="/abnormalReasonList")
+	@ResponseBody
+	public ResponseResult<AbnormalReasonVO> abnormalReasonList(com.it.ocs.common.RequestParam param) {
+		return deWarehouseService.findAbnormalReasons(param);
+	}
+
+	@RequestMapping(value="/syncWmsDisease")
+	@ResponseBody
+	public OperationResult syncWmsDisease() {
+		return deWarehouseService.syncWmsDiseaseOutOrders();
+	}
+}

+ 114 - 0
project/ocs/src/main/java/com/it/ocs/api/controller/DeWarehouseController.java

@@ -0,0 +1,114 @@
+package com.it.ocs.api.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.it.ocs.api.ex.Oms2WmsException;
+import com.it.ocs.api.service.IDeWarehouseService;
+import com.it.ocs.api.utils.CommonUtils;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.synchronou.util.JsonConvertUtil;
+
+/**
+* @ClassName: DeWarehouseController 
+* @Description: 德国仓控制器
+* @author wgc 
+* @date 2018年4月9日 下午3:57:36 
+*
+ */
+
+@RestController
+@RequestMapping("/WMS/DE/")
+public class DeWarehouseController {
+	private static final Logger logger = Logger.getLogger(DeWarehouseController.class);
+	@Autowired
+	private IDeWarehouseService deWarehouseService;
+	
+	@Autowired
+	private CommonUtils commonUtils;
+	
+	/**
+	* @Title: outWarehouseFeedback 
+	* @Description: 出库反馈接口
+	* @param @param dataBytes
+	* @param @param request
+	* @param @param response
+	* @param @return    设定文件 
+	* @return Map<String,Object>    返回类型 
+	* @throws
+	 */
+	@SuppressWarnings("unchecked")
+	@RequestMapping(value="outWmsFeedback",method = RequestMethod.POST)
+	public Map<String,Object> outWmsFeedback(@RequestBody Map<String,Object> map,HttpServletRequest request, HttpServletResponse response) throws Exception {
+		logger.info(">>> outWmsFeedback >>> request data=" + JsonConvertUtil.getJsonString(map));
+		
+		Map<String,Object> resultMap = new HashMap<String,Object>();
+		Map<String,Object> validateResultMap = new HashMap<String,Object>();
+		
+		validateResultMap = commonUtils.validateRequestToken((String)map.get("token"));
+		if(!validateResultMap.get("resultFlag").equals("true")){
+			return validateResultMap;
+	    }
+		
+		Map<String, Object> data = null;
+		try {
+			data = (Map<String, Object>) map.get("data");
+			resultMap = deWarehouseService.receiveOutOrderFeedback(data);
+			logger.info("WMS出库反馈的数据是:"+JsonConvertUtil.getJsonString(data));
+		} catch (Exception e) {
+			logger.error("出库反馈失败,请稍后再试或者联系系统管理员查看!"+ e.getMessage(), e);
+			resultMap.put("resultFlag", "false");
+			resultMap.put("error", "出库反馈失败,请稍后再试或者联系系统管理员查看!");
+			resultMap.put("resultCode", "1000");
+			this.deWarehouseService.recordOperFailedLog("receive-out-order-feedback", null, e.getMessage() + ": parameter data=" + JsonConvertUtil.getJsonString(data));
+		}
+		
+		return resultMap;
+	}
+	
+	/**
+	* @Title: outWarehouseFeedback 
+	* @Description: 入库反馈接口
+	* @param @param dataBytes
+	* @param @param request
+	* @param @param response
+	* @param @return    设定文件 
+	* @return Map<String,Object>    返回类型 
+	* @throws
+	 */
+	@SuppressWarnings("unchecked")
+	@RequestMapping(value="inWmsFeedback",method = RequestMethod.POST)
+	public Map<String,Object> inWmsFeedback(@RequestBody Map<String,Object> map,HttpServletRequest request, HttpServletResponse response) {
+		Map<String, Object> result = commonUtils.validateRequestToken((String) map.get("token"));
+		if(!"true".equals(result.get("resultFlag"))) {
+			return result;
+	    }
+		
+		Map<String, Object> data = null;
+		try {
+			OperationResult or = deWarehouseService.receiveInOrderFeedback(data = (Map<String, Object>) map.get("data"));
+			String bv = String.valueOf(0 == or.getErrorCode());
+			result.put("resultFlag", bv);
+			result.put(0 == or.getErrorCode() ? "success" : "error", bv);
+			result.put("resultCode", or.getDescription());
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			result.put("resultFlag", "false");
+			result.put("error", e instanceof Oms2WmsException ? e.getMessage() :  "入库反馈失败,请稍后再试或者联系系统管理员查看!");
+			result.put("resultCode", e instanceof Oms2WmsException ? ((Oms2WmsException) e).getCode() : "1100");
+			String description = "request=" + JsonConvertUtil.getJsonString(data) + "; response=" + JsonConvertUtil.getJsonString(result);
+			this.deWarehouseService.recordOperFailedLog("receive-in-order-feedback", null, description);
+		}
+		return result;
+	}
+}

+ 196 - 0
project/ocs/src/main/java/com/it/ocs/api/controller/TestController.java

@@ -0,0 +1,196 @@
+package com.it.ocs.api.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.it.ocs.api.service.DeWmsTaskService;
+import com.it.ocs.api.utils.SpringPropertyUtil;
+import com.it.ocs.synchronou.util.JsonConvertUtil;
+
+/**
+* @ClassName: TestController 
+* @Description: 测试控制器
+* @author wgc 
+* @date 2018年4月8日 上午10:43:17 
+*
+ */
+@RequestMapping("/apiTest/")
+@Controller
+public class TestController {
+	
+	@Autowired
+	private DeWmsTaskService deWmsTaskservice;
+	
+	@RequestMapping("getPropeties")
+	@ResponseBody
+	public void getPropeties() {
+		this.throwExceptionIfProduce();
+		System.out.println("测试获取配置文件" + SpringPropertyUtil.getValue(SpringPropertyUtil.NAME_WMS_URL));
+	}
+	
+	/**
+	* @Title: selectOutWmsOrders 
+	* @Description: 测试获取出库单
+	* @param @return    设定文件 
+	* @return String    返回类型 
+	* @throws
+	 */
+	@RequestMapping("selectOutWmsOrders")
+	@ResponseBody
+	public String selectOutWmsOrders() {
+		this.throwExceptionIfProduce();
+		deWmsTaskservice.selectOutWmsOrders();
+		return "true";
+	}
+	
+	/**
+	 * @Title: selectInWmsOrders 
+	 * @Description: 测试获取出库单
+	 * @param @return    设定文件 
+	 * @return String    返回类型 
+	 * @throws
+	 */
+	@RequestMapping("selectInWmsOrders")
+	@ResponseBody
+	public String selectInWmsOrders() {
+		this.throwExceptionIfProduce();
+		deWmsTaskservice.selectInWmsOrders();
+		return "true";
+	}
+	
+	/**
+	 * 推送德国仓Ebay出库单到WMS系统
+	 */
+	@RequestMapping("sendDeEbayOutOrderToWms")
+	@ResponseBody
+	public String sendDeEbayOutOrderToWms() {
+		this.throwExceptionIfProduce();
+		deWmsTaskservice.sendDeEbayOutOrderToWms();
+		return "true";
+	}
+
+	/**
+	 * 推送德国仓官网(LE)出库单到WMS系统
+	 */
+	@RequestMapping("sendDeLightOutOrderToWms")
+	@ResponseBody
+	public String sendDeLightOutOrderToWms() {
+		this.throwExceptionIfProduce();
+		deWmsTaskservice.sendDeLightOutOrderToWms();
+		return "true";
+	}
+	
+	/**
+	 * 
+	 * @Title: sendInWmsOrders 
+	 * @Description: 向WMS推送德国入库单
+	 * @param @return    设定文件 
+	 * @return String    返回类型 
+	 * @throws
+	 */
+	@RequestMapping("sendInWmsOrders")
+	@ResponseBody
+	public String sendInWmsOrders() {
+		this.throwExceptionIfProduce();
+		deWmsTaskservice.sendDeInWmsOrder();
+		return "true";
+	}
+	
+	public void throwExceptionIfProduce() {
+		if(SpringPropertyUtil.isProduceEnv()) throw new RuntimeException("生产环境禁止发起该请求");
+	}
+	
+	public static void setJsonParam(){
+		Map<String,Object> mainMap = new HashMap<String,Object>();
+		mainMap.put("orderId", "a012345678");
+		mainMap.put("warehouseId", "w012345678");
+		mainMap.put("trackingNumber", "a012345678");
+		mainMap.put("shipDate", "2018-04-10 10:10:35");
+		mainMap.put("shipBy", "张三");
+		mainMap.put("storeCode", "a012345678");
+		
+		List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
+		Map<String,Object> detailMap1 = new HashMap<String,Object>();
+		detailMap1.put("sku", "apple001");
+		detailMap1.put("itemNumber", "21001");
+		detailMap1.put("itemQty", "2");
+		
+		Map<String,Object> detailMap2 = new HashMap<String,Object>();
+		detailMap2.put("sku", "apple002");
+		detailMap2.put("itemNumber", "21002");
+		detailMap2.put("itemQty", "3");
+		
+		listMap.add(detailMap1);
+		listMap.add(detailMap2);
+		
+		mainMap.put("skuDetail", listMap);
+		Map<String,Object> lastMap = new HashMap<String,Object>();
+		lastMap.put("token", "iSD3t3GzOmRWqaRr");
+		lastMap.put("data", mainMap);
+		System.out.println(JsonConvertUtil.getJsonString(lastMap));
+	}
+	
+	public static void setJsonParam2(){
+		//入库反馈 货主代码:LE 仓库代码:LE.wh2
+		
+		Map<String,Object> mainMap = new HashMap<String,Object>();
+		mainMap.put("ownerCode", "LE");//固定值
+		mainMap.put("storeCode", "LE.wh2");//德国仓固定值
+		mainMap.put("storeInOrder", "w000001");//WMS流水号
+		mainMap.put("storeInorderId", "c000001");//OMS订单号
+		mainMap.put("orderType", "1");//入库类型(1退货入库)
+		mainMap.put("source", "官网");//官网,亚马逊
+		mainMap.put("createDate", "2018-4-10 10:10:48");//制单日期是商品入库的日期还是OMS创建入库单的日期
+		mainMap.put("createBy", "张三");
+		mainMap.put("orderId", "d000001");//原始订单号
+		mainMap.put("trackingNumber", "Sf000001");
+		mainMap.put("newTrackingNumber", "fs00001");
+		mainMap.put("remark", "sssss");
+		
+		
+		List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
+		Map<String,Object> detailMap1 = new HashMap<String,Object>();
+		detailMap1.put("sku", "apple001");
+		detailMap1.put("qty", "3");
+		detailMap1.put("packageCode", "u001");
+		detailMap1.put("unit", "个");
+		detailMap1.put("skuProperty", "不良品");//这个有多少种值,用中文表示?
+		detailMap1.put("returnReason", "产品不符");//这个有多少种值,用中文表示?
+		detailMap1.put("itemNumber", "2567565");
+		detailMap1.put("customerName", "小明");
+		detailMap1.put("mobile", "13723417601");
+		detailMap1.put("address", "广东省深圳市宝安广兴源");
+		detailMap1.put("picUrl", "http://baidu.com/pic");
+		detailMap1.put("badReason", "中途损坏");
+		
+		Map<String,Object> detailMap2 = new HashMap<String,Object>();
+		detailMap2.put("sku", "apple002");
+		detailMap2.put("qty", "3");
+		detailMap2.put("packageCode", "u001");
+		detailMap2.put("unit", "个");
+		detailMap2.put("skuProperty", "不良品");//这个有多少种值,用中文表示?
+		detailMap2.put("returnReason", "产品不符");//这个有多少种值,用中文表示?
+		detailMap2.put("itemNumber", "2567565");
+		detailMap2.put("customerName", "小明");
+		detailMap2.put("mobile", "13723417601");
+		detailMap2.put("address", "广东省深圳市宝安广兴源");
+		detailMap2.put("picUrl", "http://baidu.com/pic");
+		detailMap2.put("badReason", "中途损坏");
+		
+		listMap.add(detailMap1);
+		listMap.add(detailMap2);
+		
+		mainMap.put("skuDetail", listMap);
+		Map<String,Object> lastMap = new HashMap<String,Object>();
+		lastMap.put("token", "iSD3t3GzOmRWqaRr");
+		lastMap.put("data", mainMap);
+		System.out.println(JsonConvertUtil.getJsonString(lastMap));
+	}
+}

+ 86 - 0
project/ocs/src/main/java/com/it/ocs/api/dao/IDeInOrderDao.java

@@ -0,0 +1,86 @@
+package com.it.ocs.api.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.it.ocs.api.model.DeInWmsOrderMainModel;
+import com.it.ocs.api.vo.InOrderVO;
+
+/**
+ * 德国仓入库单Dao接口
+ * @author zhouyancheng
+ *
+ */
+public interface IDeInOrderDao {
+
+	/**
+	 * 查询数据条数
+	 * @param param 过滤条件
+	 * @return
+	 */
+	int countInOrder(@Param("param") Map<String, Object> param);
+
+	/**
+	 * 分页查询入库单数据
+	 * @param param 过滤条件
+	 * @param startRow 分页开始
+	 * @param endRow 分页结束
+	 * @return
+	 */
+	List<InOrderVO> queryInOrderByPage(@Param("param") Map<String, Object> param, @Param("start") int startRow, @Param("end") int endRow);
+
+	/**
+	 * 查找入库单数据(返回一条记录)
+	 * @param param 过滤条件
+	 * @return
+	 */
+	DeInWmsOrderMainModel queryInOrderOne(@Param("param") Map<String, Object> param);
+
+	/**
+	 * 更新入库单主表数据
+	 * @param main 待更新的数据
+	 */
+	void updateMain(@Param("param") Map<String, Object> main);
+
+	/**
+	 * 获取入库单
+	 * @param 
+	 * param {@link java.util.Map}: <code>key</code>={@link java.lang.String}; <code>value</code>={@link java.lang.Object}
+	 * <p>
+	 * 必须包含<code>key</code>="<code>id</code>", <code>value</code>={@link java.lang.Long}(出库单主键Id);</br>
+	 * 必须包含<code>key</code>="<code>orderId</code>", <code>value</code>={@link java.lang.String}(出库单oderId);</br>
+	 * </p>
+	 * @return {@link java.util.Map}(key={@link java.lang.String}; value={@link java.lang.Object})
+	 */
+	Map<String, Object> getDeInOrder(@Param("param") Map<String, Object> param);
+
+	List<Map<String, Object>> getDeInOrderExportData(@Param("param") Map<String, Object> param);
+
+	/**
+	 * 获取OMS入库单
+	 * @param rma
+	 * @return
+	 */
+	DeInWmsOrderMainModel getOmsInOrder(@Param("rma") String rma);
+
+	/**
+	 * 获取WMS退货认领单
+	 * @param rma
+	 * @param warehouseId
+	 * @return
+	 */
+	DeInWmsOrderMainModel getWmsClaimOrder(@Param("rma") String rma, @Param("warehouseId") String warehouseId);
+
+	int countWmsClaimOrder(@Param("param") Map<String, Object> param);
+
+	List<InOrderVO> queryWmsClaimOrderByPage(@Param("param") Map<String, Object> param, @Param("start") int startRow, @Param("end") int endRow);
+
+	/**
+	 * 查找入库单数据(返回一条记录)
+	 * @param param 过滤条件
+	 * @return
+	 */
+	DeInWmsOrderMainModel queryClaimOrderOne(@Param("param") Map<String, Object> param);
+}

+ 380 - 0
project/ocs/src/main/java/com/it/ocs/api/dao/IDeWarehouseDao.java

@@ -0,0 +1,380 @@
+package com.it.ocs.api.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.it.ocs.api.model.DeAbnormalReasonModel;
+import com.it.ocs.api.model.DeInWmsOrderDetailModel;
+import com.it.ocs.api.model.DeInWmsOrderMainModel;
+import com.it.ocs.api.model.DeOutWmsOrderDetailModel;
+import com.it.ocs.api.model.DeOutWmsOrderMainModel;
+import com.it.ocs.api.model.DeWmsOperateLogModel;
+import com.it.ocs.api.vo.AbnormalReasonVO;
+import com.it.ocs.api.vo.OperateLogVO;
+import com.it.ocs.api.vo.OutOrderVO;
+
+/**
+* @ClassName: IDeWarehouseDao 
+* @Description: 对接德国仓库DAO层接口
+* @author wgc 
+* @date 2018年4月9日 上午10:15:55 
+*
+ */
+public interface IDeWarehouseDao {
+	
+	/**
+	* @Title: getDENoShipOrderInfo 
+	* @Description: 获取德国仓ebay平台待发货订单
+	* @param @return    设定文件 
+	* @return List<Map<String, Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String, Object>> getDENoShipOrderInfoFromEbay();
+	
+	/**
+	* @Title: getDeNoshipOrderInfoFromLight 
+	* @Description: 获取德国仓官网平台待发货订单
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getDeNoshipOrderInfoFromLight();
+
+	/**
+	 * 获取Amazon平台订单数据
+	 * @return
+	 */
+	public List<Map<String, Object>> getDeNoshipOrderInfoFromAmazon();
+
+	/**
+	 * 获取VC订单数据
+	 * @return
+	 */
+	public List<Map<String, Object>> getDeNoshipOrderInfoFromVC();
+	
+	/**
+	* @Title: getDeInWmsOrderInfo 
+	* @Description: 获取德国仓入库单
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getDeInWmsOrderInfos();
+	
+	/**
+	* @Title: insertDeOutWmsOrderMain
+	* @Description: 保存出库单主表
+	* @param @param deOutWmsOrderMainModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchInsertDeOutWmsOrderMain(List<DeOutWmsOrderMainModel> deOutWmsOrderMainModels);
+	
+	/**
+	* @Title: batchInsertDeInWmsOrderMain 
+	* @Description: 保存入库单主表
+	* @param @param deInWmsOrderMainModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchInsertDeInWmsOrderMain(List<DeInWmsOrderMainModel> deInWmsOrderMainModels);
+	
+	/**
+	* @Title: batchUpdateDeOutWmsOrderMain 
+	* @Description: 批量更新出库单主表
+	* @param @param deOutWmsOrderMainModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchUpdateDeOutWmsOrderMain(List<DeOutWmsOrderMainModel> deOutWmsOrderMainModels);
+	
+	/**
+	* @Title: updateDeOutWmsOrderMainByMap 
+	* @Description: 通过map更新出库实体
+	* @param @param map    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void updateDeOutWmsOrderMainByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: updateDeInWmsOrderMainByMap 
+	* @Description: 通过map更新入库实体
+	* @param @param map    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void updateDeInWmsOrderMainByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: batchUpdateDeInWmsOrderMain 
+	* @Description: 批量更新入库单主表
+	* @param @param deInWmsOrderMainModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchUpdateDeInWmsOrderMain(List<DeInWmsOrderMainModel> deInWmsOrderMainModels);
+	
+	/**
+	* @Title: getOutWmsOrderMailByOrderId 
+	* @Description: 查询出库订单主表
+	* @param @param map
+	* @param @return    设定文件 
+	* @return DeOutWmsOrderMainModel    返回类型 
+	* @throws
+	 */
+	public DeOutWmsOrderMainModel getOutWmsOrderMailByMap(Map<String, Object> map);
+	
+	/**
+	* @Title: getOutWmsOrderDetailByMap 
+	* @Description: 获取德国仓库出库单详情
+	* @param @param map
+	* @param @return    设定文件 
+	* @return List<DeOutWmsOrderDetailModel>    返回类型 
+	* @throws
+	 */
+	public List<DeOutWmsOrderDetailModel> getOutWmsOrderDetailByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: getInWmsOrderDetailByMap 
+	* @Description: 获取德国仓库入库单详情
+	* @param @param map
+	* @param @return    设定文件 
+	* @return List<DeInWmsOrderDetailModel>    返回类型 
+	* @throws
+	 */
+	public List<DeInWmsOrderDetailModel> getInWmsOrderDetailByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: getOutWmsOrderMailByOrderId 
+	* @Description: 查询入库订单主表
+	* @param @param map
+	* @param @return    设定文件 
+	* @return DeOutWmsOrderMainModel    返回类型 
+	* @throws
+	 */
+	public DeInWmsOrderMainModel getInWmsOrderMailByMap(Map<String, Object> map);
+	
+	/**
+	* @Title: batchInsertDeOutWmsOrderDetail
+	* @Description: 保存出库单详情表
+	* @param @param deOutWmsOrderDetailModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchInsertDeOutWmsOrderDetail(List<DeOutWmsOrderDetailModel> deOutWmsOrderDetailModels);
+	
+	/**
+	* @Title: batchInsertDeInWmsOrderDetail 
+	* @Description: 保存入库单详情表
+	* @param @param deInWmsOrderDetailModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchInsertDeInWmsOrderDetail(List<DeInWmsOrderDetailModel> deInWmsOrderDetailModels);
+	
+	/**
+	* @Title: batchUpdateDeOutWmsOrderDetail 
+	* @Description: 批量更新出库单详情表
+	* @param @param deOutWmsOrderDetailModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchUpdateDeOutWmsOrderDetail(List<DeOutWmsOrderDetailModel> deOutWmsOrderDetailModels);
+	
+	/**
+	* @Title: batchUpdateDeInWmsOrderDetail 
+	* @Description: 批量更新入库单详情表
+	* @param @param deInWmsOrderDetailModels    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void batchUpdateDeInWmsOrderDetail(List<DeInWmsOrderDetailModel> deInWmsOrderDetailModels);
+	
+	/**
+	* @Title: getOutWmsOrderSequences 
+	* @Description: 获取德国出库单主表序列
+	* @param @return    设定文件 
+	* @return long    返回类型 
+	* @throws
+	 */
+	public long getOutWmsOrderSequences();
+	
+	/**
+	 * @Title: getOutWmsOrderSequences 
+	 * @Description: 获取德国入库单主表序列
+	 * @param @return    设定文件 
+	 * @return long    返回类型 
+	 * @throws
+	 */
+	public long getInWmsOrderSequences();
+	
+	/**
+	* @Title: getSkusByPSku 
+	* @Description: 查找sku映射关系
+	* @param @param map
+	* @param @return    设定文件 
+	* @return Map<String,Object>    返回类型 
+	* @throws
+	 */
+	public Map<String,Object> getSkusByPSku(Map<String,Object> map);
+	
+	/**
+	 * 获取待推送到wms的出库单
+	 * @param platform 订单来源于哪个平台:1-官网;2-ebay;3-亚马逊;4-沃尔玛; 5-VC
+	 * @return {@link java.util.List},该集合元素为{@link java.util.Map}(key={@link java.lang.String}; value={@link java.lang.Object})
+	 */
+	public List<Map<String,Object>> getSendDeOutWmsOrders(@Param("platform") int platform);
+	
+	/**
+	* @Title: getSendDeInWmsOrders 
+	* @Description: 获取待推送到wms的入库单
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getSendDeInWmsOrders();
+	
+	/**
+	* @Title: getSkuInfoFromItemEbay 
+	* @Description: 获取ebay内件sky价格和数量信息
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getSkuInfoFromItemEbay(Map<String,Object> map);
+	
+	public List<Map<String, Object>> getSkuInfoFromItemAmazon(Map<String,Object> map);
+	
+	/**
+	* @Title: getSkuInfoFromItemLight 
+	* @Description: 获取ebay内件sky价格和数量信息
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getSkuInfoFromItemLight(Map<String,Object> map);
+	
+	/**
+	* @Title: getCalCurrencyCodeList 
+	* @Description: 获取汇率
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getCalCurrencyCodeList();
+	
+	/**
+	* @Title: getLightOrderInfosByMap 
+	* @Description: TODO(这里用一句话描述这个方法的作用) 
+	* @param @param map
+	* @param @return    设定文件 
+	* @return Map<String,Object>    返回类型 
+	* @throws
+	 */
+	public Map<String,Object> getLightOrderInfosByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: getEbayOrderInfosByMap 
+	* @Description: 
+	* @param @param map
+	* @param @return    设定文件 
+	* @return Map<String,Object>    返回类型 
+	* @throws
+	 */
+	public Map<String,Object> getEbayOrderInfosByMap(Map<String,Object> map);
+	
+	/**
+	* @Title: getWmsSkuBySku 
+	* @Description: 根据sku去查找仓库的sku
+	* @param @param map
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getWmsSkuBySku(@Param("sku") String sku);
+	
+	/**
+	* @Title: getSkuByWmsSku 
+	* @Description: 根据wms的sku去找到oms的sku
+	* @param @param itemNumber
+	* @param @return    设定文件 
+	* @return List<Map<String,Object>>    返回类型 
+	* @throws
+	 */
+	public List<Map<String,Object>> getSkuByWmsSku(@Param("itemNumber") String itemNumber);
+
+	/**
+	 * 跟新出库单上传跟踪号字段状态值
+	 * @param 
+	 * map {@link java.util.Map}: <code>key</code>={@link java.lang.String}; <code>value</code>={@link java.lang.Object}</br>
+	 * <p>
+	 * 必须包含: <code>key</code>="<code>id</code>" && <code>value</code>={@link java.lang.Long} (出库单主键ID)</br>
+	 * 必须包含: <code>key</code>="<code>stutus</code>" && <code>value</code>={@link java.lang.Integer} (跟踪号上传状态: 0-未上传; 1-已上传; 2-上传失败)
+	 * </p>	
+	 * @return void
+	 */
+	public void updateOutUploadStatus(Map<String, Object> map);
+
+	/**
+	 * 查询没有上传跟踪号的出库单
+	 */
+	public List<DeOutWmsOrderMainModel> queryNoUploadTrackingNumberOuts(@Param("platform") String platform);
+
+	/**
+	 * 添加异常原因
+	 * @param reason
+	 */
+	public void addAbnormalReason(@Param("reason") DeAbnormalReasonModel reason);
+
+	public int countDeOutOrder(@Param("param") Map<String, Object> param);
+
+	public List<OutOrderVO> findDeOutOrders(@Param("param") Map<String, Object> param, @Param("start") int startRow, @Param("end") int endRow);
+	
+	public List<Map<String, Object>> getDeOutOrderExportData(@Param("param") Map<String, Object> param);
+
+	/**
+	 * 在成功推送至WMS仓库之前,对出库单进行修改
+	 * @param out 已经进行编辑的出库单信息
+	 * @return void
+	 */
+	public void changeBeforeSendWms(@Param("out") DeOutWmsOrderMainModel out);
+
+	/**
+	 * 使用出库单id、orderId、orderOcsId进行联合查询,获取出库单
+	 * @param 
+	 * param {@link java.util.Map}: <code>key</code>={@link java.lang.String}; <code>value</code>={@link java.lang.Object}
+	 * <p>
+	 * 必须包含<code>key</code>="<code>id</code>", <code>value</code>={@link java.lang.Long}(出库单主键Id);</br>
+	 * 必须包含<code>key</code>="<code>orderId</code>", <code>value</code>={@link java.lang.String}(出库单oderId);</br>
+	 * 必须包含<code>key</code>="<code>orderOcsId</code>", <code>value</code>={@link java.lang.Long}(出库单orderOcsId)</br>
+	 * </p>
+	 * @return {@link java.util.Map}(key={@link java.lang.String}; value={@link java.lang.Object})
+	 */
+	public Map<String,Object> getDeOutOrder(@Param("param") Map<String, Object> param);
+
+	public int countAbnormalReason(@Param("param") Map<String, Object> param);
+
+	public List<AbnormalReasonVO> findAbnormalReasons(@Param("param") Map<String, Object> param, @Param("start") int startRow, @Param("end") int endRow);
+
+	public void addOperLog(@Param("log") DeWmsOperateLogModel log);
+	
+	public int countOperLog(@Param("param") Map<String, Object> param);
+
+	public List<OperateLogVO> queryOperLogs(@Param("param") Map<String, Object> param, @Param("start") int startRow, @Param("end") int endRow);
+
+	public Map<String, Object> getProduct(@Param("sku") String sku, @Param("qty") int qty);
+	
+	public List<Map<String, Object>> queryAbnormalReasons(@Param("param") Map<String, Object> param);
+
+	public DeOutWmsOrderMainModel getOut(@Param("orderOcsId") Long orderOcsId, @Param("orderId") String orderId);
+
+	/**
+	 * 上传VC订单的跟踪号
+	 * @param param
+	 */
+	public void uploadVcTranNumber(@Param("param") Map<String, Object> param);
+
+}

+ 33 - 0
project/ocs/src/main/java/com/it/ocs/api/dao/IWmsProviderTokenDao.java

@@ -0,0 +1,33 @@
+package com.it.ocs.api.dao;
+
+import java.util.Map;
+
+import com.it.ocs.api.model.WmsProviderToken;
+
+/**
+* @ClassName: IWmsProviderTokenDao 
+* @Description: 仓储供应商dao
+* @author wgc 
+* @date 2018年4月23日 上午11:17:32 
+*
+ */
+public interface IWmsProviderTokenDao {
+	/**
+	* @Title: getProviderToken 
+	* @Description: 通过map获取供应商token信息 
+	* @param @param map
+	* @param @return    设定文件 
+	* @return WmsProviderToken    返回类型 
+	* @throws
+	 */
+	public WmsProviderToken getProviderToken(Map<String,Object> map);
+	
+	/**
+	* @Title: updateProviderTokenByMap 
+	* @Description: 通过map获取供应商token信息 
+	* @param @param map    设定文件 
+	* @return void    返回类型 
+	* @throws
+	 */
+	public void updateProviderTokenByMap(Map<String,Object> map);
+}

+ 37 - 0
project/ocs/src/main/java/com/it/ocs/api/ex/Oms2WmsException.java

@@ -0,0 +1,37 @@
+package com.it.ocs.api.ex;
+
+public class Oms2WmsException extends Exception {
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1764755729566673746L;
+	
+	private String code = "-1";
+	
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+	
+	public Oms2WmsException(String message) {
+		super(message);
+	}
+	
+	public Oms2WmsException(String message, Throwable e) {
+		super(message, e);
+	}
+
+	public Oms2WmsException(String message, String code) {
+		this(message);
+		this.code = code;
+	}
+
+	public Oms2WmsException(String message, Throwable e, String code) {
+		this(message, e);
+		this.code = code;
+	}
+}

+ 45 - 0
project/ocs/src/main/java/com/it/ocs/api/ex/SkuInventoryException.java

@@ -0,0 +1,45 @@
+package com.it.ocs.api.ex;
+
+public class SkuInventoryException extends Oms2WmsException {
+
+	/**
+	 * 异常类型标记常量:接口API调用异常
+	 */
+	public static final String API_CALLFAILED = "callfailed";
+	
+	/**
+	 * 异常类型标记常量:SKU库存不足
+	 */
+	public static final String INVENTORY_SHORTAGE = "shortage";
+	
+	/**
+	 * 异常类型标记常量:SKU库存获取失败
+	 */
+	public static final String INVENTORY_GETFAILED = "getfailed";
+	
+	/**
+	 * 异常类型标记常量:接口API返回中取不到有效信息
+	 */
+	public static final String API_RETINVALID = "retinvalid";
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8122486881404922901L;
+
+	public SkuInventoryException(String message) {
+		super(message);
+	}
+
+	public SkuInventoryException(String message, String code) {
+		super(message, code);
+	}
+
+	public SkuInventoryException(String message, Throwable e) {
+		super(message, e);
+	}
+
+	public SkuInventoryException(String message, Throwable e, String code) {
+		super(message, e, code);
+	}
+}

+ 79 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeAbnormalReasonModel.java

@@ -0,0 +1,79 @@
+package com.it.ocs.api.model;
+
+import java.util.Date;
+
+public class DeAbnormalReasonModel {
+	private Long id;
+	private Long parentId;
+	private String parentType;
+	private String action;
+	private String reason;
+	private String enabledFlag;
+	private Date createdAt;
+	private Date updatedAt;
+	
+	public DeAbnormalReasonModel() {
+	}
+	
+	public DeAbnormalReasonModel(Long id, Long parentId, String parentType, String action, String reason) {
+		this.id = id;
+		this.parentId = parentId;
+		this.parentType = parentType;
+		this.action = action;
+		this.reason = reason;
+		this.enabledFlag = "1";
+		this.createdAt = new Date();
+		this.updatedAt = new Date();
+	}
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Long getParentId() {
+		return parentId;
+	}
+	public void setParentId(Long parentId) {
+		this.parentId = parentId;
+	}
+	public String getParentType() {
+		return parentType;
+	}
+	public void setParentType(String parentType) {
+		this.parentType = parentType;
+	}
+	public String getAction() {
+		return action;
+	}
+	public void setAction(String action) {
+		this.action = action;
+	}
+	public String getReason() {
+		return reason;
+	}
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+	public String getEnabledFlag() {
+		return enabledFlag;
+	}
+	public void setEnabledFlag(String enabledFlag) {
+		this.enabledFlag = enabledFlag;
+	}
+	public Date getCreatedAt() {
+		return createdAt;
+	}
+	public void setCreatedAt(Date createdAt) {
+		this.createdAt = createdAt;
+	}
+	public Date getUpdatedAt() {
+		return updatedAt;
+	}
+	public void setUpdatedAt(Date updatedAt) {
+		this.updatedAt = updatedAt;
+	}
+	
+	
+}

+ 215 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeInWmsOrderDetailModel.java

@@ -0,0 +1,215 @@
+package com.it.ocs.api.model;
+
+/**
+* @ClassName: DeInWmsOrderDetailModel 
+* @Description: 德国仓库入库单实体-明细表
+* @author wgc 
+* @date 2018年4月10日 上午11:00:47 
+*
+ */
+public class DeInWmsOrderDetailModel {
+	
+	/**
+	 * 主键ID
+	 */
+	private long id;
+	
+	/**
+	 * 入库单主表ID
+	 */
+	private long parentId;
+	
+	/**
+	 * 入库SKU
+	 */
+	private String sku;
+	
+	/**
+	 * SKU数量
+	 */
+	private String qty;
+	
+	/**
+	 * 包装代码(如果没有,WMS默认包装)
+	 */
+	private String packageCode;
+	
+	/**
+	 * 单位(如果没有,WMS默认产品最小单位)
+	 */
+	private String unit;
+	
+	/**
+	 * 货品属性
+	 */
+	private String skuProperty;
+	
+	/**
+	 * 退货原因
+	 */
+	private String returnReason;
+	
+	/**
+	 * 入库单行号
+	 */
+	private String itemNumber;
+	
+	/**
+	 * 退货客户名称
+	 */
+	private String customerName;
+	
+	/**
+	 * 客户联系电话
+	 */
+	private String mobile;
+	
+	/**
+	 * 地址
+	 */
+	private String address;
+	
+	/**
+	 * 产品图片快照
+	 */
+	private String picUrl;
+	
+	/**
+	 * 不良原因
+	 */
+	private String badReason;
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public long getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(long parentId) {
+		this.parentId = parentId;
+	}
+
+	public String getSku() {
+		return sku;
+	}
+
+	public void setSku(String sku) {
+		this.sku = sku;
+	}
+
+	public String getQty() {
+		return qty;
+	}
+
+	public void setQty(String qty) {
+		this.qty = qty;
+	}
+
+	public String getPackageCode() {
+		return packageCode;
+	}
+
+	public void setPackageCode(String packageCode) {
+		this.packageCode = packageCode;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	public String getSkuProperty() {
+		return skuProperty;
+	}
+
+	public void setSkuProperty(String skuProperty) {
+		this.skuProperty = skuProperty;
+	}
+
+	public String getReturnReason() {
+		return returnReason;
+	}
+
+	public void setReturnReason(String returnReason) {
+		this.returnReason = returnReason;
+	}
+
+	public String getItemNumber() {
+		return itemNumber;
+	}
+
+	public void setItemNumber(String itemNumber) {
+		this.itemNumber = itemNumber;
+	}
+
+	public String getCustomerName() {
+		return customerName;
+	}
+
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+
+	public String getMobile() {
+		return mobile;
+	}
+
+	public void setMobile(String mobile) {
+		this.mobile = mobile;
+	}
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getPicUrl() {
+		return picUrl;
+	}
+
+	public void setPicUrl(String picUrl) {
+		this.picUrl = picUrl;
+	}
+
+	public String getBadReason() {
+		return badReason;
+	}
+
+	public void setBadReason(String badReason) {
+		this.badReason = badReason;
+	}
+
+	
+	private String item;
+
+	public String getItem() {
+		return item;
+	}
+
+	public void setItem(String item) {
+		this.item = item;
+	}
+	
+	private String actualQty;
+
+	public String getActualQty() {
+		return actualQty;
+	}
+
+	public void setActualQty(String actualQty) {
+		this.actualQty = actualQty;
+	}
+	
+}

+ 280 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeInWmsOrderMainModel.java

@@ -0,0 +1,280 @@
+package com.it.ocs.api.model;
+
+import java.util.Date;
+
+/**
+* @ClassName: DeInWmsOrderMainModel 
+* @Description: 德国仓库出库单实体-主表
+* @author wgc 
+* @date 2018年4月10日 上午11:01:18 
+*
+ */
+public class DeInWmsOrderMainModel {
+	/**
+	 * 货主代码(业务主体)
+	 */
+	private String ownerCode;
+	
+	/**
+	 * 仓库代码(库存组织)
+	 */
+	private String storeCode;
+	
+	/**
+	 * WMS入库单号
+	 */
+	private String warehouseId;
+	
+	/**
+	 * OMS入库单号
+	 */
+	private long id;
+	
+	/**
+	 * 入库类型(退货入库等)
+	 */
+	private String orderType;
+	
+	/**
+	 * 订单来源(官网、eBay、亚马逊等)
+	 */
+	private String platform;
+	
+	/**
+	 * 账号(例如ebay的德国账号)
+	 */
+	private String account;
+	
+	/**
+	 * 制单日期(创建日期)
+	 */
+	private Date createDate;
+	
+	/**
+	 * 操作人
+	 */
+	private String createBy;
+	
+	private Date updateDate;
+	
+	public Date getUpdateDate() {
+		return updateDate;
+	}
+
+	public void setUpdateDate(Date updateDate) {
+		this.updateDate = updateDate;
+	}
+
+	/**
+	 * 原始销售单号
+	 */
+	private String orderId;
+	
+	/**
+	 * 原始运单号
+	 */
+	private String trackingNumber;
+	
+	/**
+	 * 新运单号
+	 */
+	private String newTrackingNumber;
+	
+	/**
+	 * 备注
+	 */
+	private String remark;
+	
+	/**
+	 * 退货申请唯一标志(来源退货表)
+	 */
+	private String rma;
+	
+	/**
+	 * 待认领(0为非任领单 1待认领 2已认领)
+	 */
+	private String waitClaim;
+	
+	/**
+	 * 是否已推送WMS(0未推送 1已推送 2已反馈)
+	 */
+	private String isSendWms;
+	
+	/**
+	 * 退货退款表的主键ID
+	 */
+	private Long returnOrderId;
+
+	/**
+	 * 推送时间
+	 */
+	private Date sendDate;
+	
+	/**
+	 * 反馈时间
+	 */
+	private Date feedbackDate;
+	
+	private Long claimId;
+	
+	public Long getClaimId() {
+		return claimId;
+	}
+
+	public void setClaimId(Long claimId) {
+		this.claimId = claimId;
+	}
+
+	public Date getSendDate() {
+		return sendDate;
+	}
+
+	public void setSendDate(Date sendDate) {
+		this.sendDate = sendDate;
+	}
+
+	public Date getFeedbackDate() {
+		return feedbackDate;
+	}
+
+	public void setFeedbackDate(Date feedbackDate) {
+		this.feedbackDate = feedbackDate;
+	}
+
+	public String getOwnerCode() {
+		return ownerCode;
+	}
+
+	public void setOwnerCode(String ownerCode) {
+		this.ownerCode = ownerCode;
+	}
+
+	public String getStoreCode() {
+		return storeCode;
+	}
+
+	public void setStoreCode(String storeCode) {
+		this.storeCode = storeCode;
+	}
+
+	public String getWarehouseId() {
+		return warehouseId;
+	}
+
+	public void setWarehouseId(String warehouseId) {
+		this.warehouseId = warehouseId;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getOrderType() {
+		return orderType;
+	}
+
+	public void setOrderType(String orderType) {
+		this.orderType = orderType;
+	}
+
+	public String getPlatform() {
+		return platform;
+	}
+
+	public void setPlatform(String platform) {
+		this.platform = platform;
+	}
+
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(Date createDate) {
+		this.createDate = createDate;
+	}
+
+	public String getCreateBy() {
+		return createBy;
+	}
+
+	public void setCreateBy(String createBy) {
+		this.createBy = createBy;
+	}
+
+	public String getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(String orderId) {
+		this.orderId = orderId;
+	}
+
+	public String getTrackingNumber() {
+		return trackingNumber;
+	}
+
+	public void setTrackingNumber(String trackingNumber) {
+		this.trackingNumber = trackingNumber;
+	}
+
+	public String getNewTrackingNumber() {
+		return newTrackingNumber;
+	}
+
+	public void setNewTrackingNumber(String newTrackingNumber) {
+		this.newTrackingNumber = newTrackingNumber;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getRma() {
+		return rma;
+	}
+
+	public void setRma(String rma) {
+		this.rma = rma;
+	}
+
+	public String getWaitClaim() {
+		return waitClaim;
+	}
+
+	public void setWaitClaim(String waitClaim) {
+		this.waitClaim = waitClaim;
+	}
+
+	public String getIsSendWms() {
+		return isSendWms;
+	}
+
+	public void setIsSendWms(String isSendWms) {
+		this.isSendWms = isSendWms;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public Long getReturnOrderId() {
+		return returnOrderId;
+	}
+
+	public void setReturnOrderId(Long returnOrderId) {
+		this.returnOrderId = returnOrderId;
+	}
+	
+}

+ 116 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeOutOrderExportModel.java

@@ -0,0 +1,116 @@
+package com.it.ocs.api.model;
+
+import java.util.Date;
+
+import com.it.ocs.excel.annotation.ExcelLink;
+
+public class DeOutOrderExportModel {
+
+	@ExcelLink(title = "ID", index = 1)
+	private long id;
+
+	@ExcelLink(title = "来源", index = 2)
+	private String platform;
+
+	@ExcelLink(title = "Order Ocs Id", index = 3)
+	private long order_ocs_id;
+
+	@ExcelLink(title = "出库单类型", index = 4)
+	private String order_out_type;
+	
+	@ExcelLink(title = "跟踪号状态", index = 5)
+	private String is_upload;
+	
+	@ExcelLink(title = "Order Id", index = 6)
+	private String order_id;
+	
+	@ExcelLink(title = "warehouseId", index = 7)
+	private String warehouse_id;
+	
+	@ExcelLink(title = "跟踪号", index = 8)
+	private String tracking_number;
+	
+	@ExcelLink(title = "发货时间", index = 9)
+	private Date ship_date;
+	
+	@ExcelLink(title = "发货人", index = 10)
+	private String ship_by;
+	
+	@ExcelLink(title = "发货仓库代码", index = 11)
+	private String store_code;
+	
+	@ExcelLink(title = "订单创建日期", index = 12)
+	private Date ocs_order_create_date;
+	
+	@ExcelLink(title = "物流承运商", index = 13)
+	private String carrier_id;
+	
+	@ExcelLink(title = "客户名称", index = 14)
+	private String customer_name;
+	
+	@ExcelLink(title = "客户国家", index = 15)
+	private String customer_country;
+	
+	@ExcelLink(title = "客户省份", index = 16)
+	private String customer_province;
+	
+	@ExcelLink(title = "客户城市", index = 17)
+	private String customer_city;
+	
+	@ExcelLink(title = "客户地址1", index = 18)
+	private String customer_address;
+
+	@ExcelLink(title = "客户地址2", index = 19)
+	private String customer_address_2;
+	
+	@ExcelLink(title = "客户邮编", index = 20)
+	private String customer_zip;
+	
+	@ExcelLink(title = "客户Email", index = 21)
+	private String customer_email;
+	
+	@ExcelLink(title = "客户电话", index = 22)
+	private String customer_phone;
+	
+	@ExcelLink(title = "出库单状态", index = 23)
+	private String is_send_wms;
+	
+	@ExcelLink(title = "是否异常", index = 24)
+	private String is_abnormal;
+	
+	@ExcelLink(title = "推送WMS日期", index = 25)
+	private Date send_date;
+	
+	@ExcelLink(title = "WMS反馈日期", index = 26)
+	private Date feedback_date;
+
+	@ExcelLink(title = "创建日期", index = 27)
+	private Date created_date;
+	
+	@ExcelLink(title = "更新日期", index = 28)
+	private Date update_date;
+
+	@ExcelLink(title = "明细ID", index = 29)
+	private long detail_id;
+
+	@ExcelLink(title = "SKU", index = 30)
+	private String sku;
+
+	@ExcelLink(title = "Item Number", index = 31)
+	private String item_number;
+
+	@ExcelLink(title = "SKU数量", index = 32)
+	private String item_qty;
+
+	@ExcelLink(title = "货品属性", index = 33)
+	private String sku_property;
+
+	@ExcelLink(title = "版本", index = 34)
+	private String item;
+
+	@ExcelLink(title = "实际SKU数量", index = 35)
+	private String actual_qty;
+
+	@ExcelLink(title = "SKU售价", index = 36)
+	private String price;
+}

+ 120 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeOutWmsOrderDetailModel.java

@@ -0,0 +1,120 @@
+package com.it.ocs.api.model;
+
+/**
+* @ClassName: DeOutWmsOrderDetailModel 
+* @Description: 德国仓库出库单实体-明细表
+* @author wgc 
+* @date 2018年4月9日 下午4:26:51 
+*
+ */
+public class DeOutWmsOrderDetailModel {
+	
+	/**
+	 * 主键
+	 */
+	private long id;
+	
+	/**
+	 * 出库单主表id
+	 */
+	private long parentId;
+	
+	/**
+	 * SKU VARCHAR2(256)
+	 */
+	private String sku;
+	
+	/**
+	 * SKU行号 明细ID VARCHAR2(256)
+	 */
+	private String itemNumber;
+	
+	/**
+	 * SKU数量
+	 */
+	private String itemQty;
+	
+	/**
+	 * sku属性
+	 */
+	private String skuProperty;
+	
+	private Double price;
+	
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public long getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(long parentId) {
+		this.parentId = parentId;
+	}
+
+	public String getSkuProperty() {
+		return skuProperty;
+	}
+
+	public void setSkuProperty(String skuProperty) {
+		this.skuProperty = skuProperty;
+	}
+
+	public String getSku() {
+		return sku;
+	}
+
+	public void setSku(String sku) {
+		this.sku = sku;
+	}
+
+	public String getItemNumber() {
+		return itemNumber;
+	}
+
+	public void setItemNumber(String itemNumber) {
+		this.itemNumber = itemNumber;
+	}
+
+	public String getItemQty() {
+		return itemQty;
+	}
+
+	public void setItemQty(String itemQty) {
+		this.itemQty = itemQty;
+	}
+	
+	private String item;
+
+	public String getItem() {
+		return item;
+	}
+
+	public void setItem(String item) {
+		this.item = item;
+	}
+	
+	private String actualQty;
+
+	public String getActualQty() {
+		return actualQty;
+	}
+
+	public void setActualQty(String actualQty) {
+		this.actualQty = actualQty;
+	}
+	
+}

+ 348 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeOutWmsOrderMainModel.java

@@ -0,0 +1,348 @@
+package com.it.ocs.api.model;
+
+import java.util.Date;
+
+/**
+* @ClassName: DeOutWmsOrderMainModel 
+* @Description: 德国仓库出库单实体-主表
+* @author wgc 
+* @date 2018年4月9日 下午4:26:51 
+*
+ */
+public class DeOutWmsOrderMainModel {
+	
+	/**
+	 * 主键ID
+	 */
+	private long id;
+	
+	/**
+	 * 订单平台来源(light,ebay,walmart等)
+	 */
+	private String platform;
+	
+	/**
+	 * OCS系统订单ID
+	 */
+	private long orderOcsId;
+	
+	/**
+	 * 出库订单类型(销售出库、补发出库、换货出库、补发矫正出库等)
+	 */
+	private String orderOutType;
+	
+	/**
+	 * 是否已上传跟踪号(0:否 1:是)
+	 */
+	private String isUpload;
+	
+	/**
+	 * 订单号 VARCHAR2(256)
+	 */
+	private String orderId;
+	
+	/**
+	 * WMS订单号 VARCHAR2(256)
+	 */
+	private String warehouseId;
+	
+	/**
+	 * 跟踪号 VARCHAR2(256)
+	 */
+	private String trackingNumber;
+	
+	/**
+	 * 发货时间
+	 */
+	private Date shipDate;
+	
+	/**
+	 * 操作人
+	 */
+	private String shipBy;
+	
+	/**
+	 * 发货仓库代码
+	 */
+	private String storeCode;
+	
+	/**
+	 * ocs订单创建日期
+	 */
+	private Date ocsOrderCreateDate;
+	
+	/**
+	 * 物流承运商代码(DHL等等)
+	 */
+	private String carrierId;
+	
+	/**
+	 * 客户名称
+	 */
+	private String customerName;
+	
+	/**
+	 * 客户国家
+	 */
+	private String customerCountry;
+	
+	/**
+	 * 客户省份
+	 */
+	private String customerProvince;
+	
+	/**
+	 * 客户城市
+	 */
+	private String customerCity;
+	
+	/**
+	 * 客户地址
+	 */
+	private String customerAddress;
+	
+	/**
+	 * 客户邮编
+	 */
+	private String customerZip;
+	
+	/**
+	 * 客户email
+	 */
+	private String customerEmail;
+	
+	/**
+	 * 客户电话
+	 */
+	private String customerPhone;
+	
+	/**
+	 * 是否已推送WMS(0未推送 1已推送 2已反馈)
+	 */
+	private String isSendWms;
+	
+	/**
+	 * 是否异常(0非异常 1库存不足)
+	 */
+	private String isAbnormal;
+	
+	/**
+	 * 推送时间
+	 */
+	private Date sendDate;
+	
+	/**
+	 * 反馈时间
+	 */
+	private Date feedbackDate;
+	
+	public Date getSendDate() {
+		return sendDate;
+	}
+
+	public void setSendDate(Date sendDate) {
+		this.sendDate = sendDate;
+	}
+
+	public Date getFeedbackDate() {
+		return feedbackDate;
+	}
+
+	public void setFeedbackDate(Date feedbackDate) {
+		this.feedbackDate = feedbackDate;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getPlatform() {
+		return platform;
+	}
+
+	public void setPlatform(String platform) {
+		this.platform = platform;
+	}
+
+	public long getOrderOcsId() {
+		return orderOcsId;
+	}
+
+	public void setOrderOcsId(long orderOcsId) {
+		this.orderOcsId = orderOcsId;
+	}
+
+	public String getOrderOutType() {
+		return orderOutType;
+	}
+
+	public void setOrderOutType(String orderOutType) {
+		this.orderOutType = orderOutType;
+	}
+	
+	public String getIsUpload() {
+		return isUpload;
+	}
+
+	public void setIsUpload(String isUpload) {
+		this.isUpload = isUpload;
+	}
+
+	public String getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(String orderId) {
+		this.orderId = orderId;
+	}
+
+	public String getWarehouseId() {
+		return warehouseId;
+	}
+
+	public void setWarehouseId(String warehouseId) {
+		this.warehouseId = warehouseId;
+	}
+
+	public String getTrackingNumber() {
+		return trackingNumber;
+	}
+
+	public void setTrackingNumber(String trackingNumber) {
+		this.trackingNumber = trackingNumber;
+	}
+
+	public Date getShipDate() {
+		return shipDate;
+	}
+
+	public void setShipDate(Date shipDate) {
+		this.shipDate = shipDate;
+	}
+
+	public String getShipBy() {
+		return shipBy;
+	}
+
+	public void setShipBy(String shipBy) {
+		this.shipBy = shipBy;
+	}
+
+	public String getStoreCode() {
+		return storeCode;
+	}
+
+	public void setStoreCode(String storeCode) {
+		this.storeCode = storeCode;
+	}
+
+	public Date getOcsOrderCreateDate() {
+		return ocsOrderCreateDate;
+	}
+
+	public void setOcsOrderCreateDate(Date ocsOrderCreateDate) {
+		this.ocsOrderCreateDate = ocsOrderCreateDate;
+	}
+
+	public String getCarrierId() {
+		return carrierId;
+	}
+
+	public void setCarrierId(String carrierId) {
+		this.carrierId = carrierId;
+	}
+
+	public String getCustomerName() {
+		return customerName;
+	}
+
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+
+	public String getCustomerCountry() {
+		return customerCountry;
+	}
+
+	public void setCustomerCountry(String customerCountry) {
+		this.customerCountry = customerCountry;
+	}
+
+	public String getCustomerProvince() {
+		return customerProvince;
+	}
+
+	public void setCustomerProvince(String customerProvince) {
+		this.customerProvince = customerProvince;
+	}
+
+	public String getCustomerCity() {
+		return customerCity;
+	}
+
+	public void setCustomerCity(String customerCity) {
+		this.customerCity = customerCity;
+	}
+
+	public String getCustomerAddress() {
+		return customerAddress;
+	}
+
+	public void setCustomerAddress(String customerAddress) {
+		this.customerAddress = customerAddress;
+	}
+
+	public String getCustomerZip() {
+		return customerZip;
+	}
+
+	public void setCustomerZip(String customerZip) {
+		this.customerZip = customerZip;
+	}
+
+	public String getCustomerEmail() {
+		return customerEmail;
+	}
+
+	public void setCustomerEmail(String customerEmail) {
+		this.customerEmail = customerEmail;
+	}
+
+	public String getCustomerPhone() {
+		return customerPhone;
+	}
+
+	public void setCustomerPhone(String customerPhone) {
+		this.customerPhone = customerPhone;
+	}
+
+	public String getIsSendWms() {
+		return isSendWms;
+	}
+
+	public void setIsSendWms(String isSendWms) {
+		this.isSendWms = isSendWms;
+	}
+
+	public String getIsAbnormal() {
+		return isAbnormal;
+	}
+
+	public void setIsAbnormal(String isAbnormal) {
+		this.isAbnormal = isAbnormal;
+	}
+	
+	private String customerAddress2;
+	public String getCustomerAddress2() {
+		return customerAddress2;
+	}
+
+	public void setCustomerAddress2(String customerAddress2) {
+		this.customerAddress2 = customerAddress2;
+	}
+	
+}

+ 90 - 0
project/ocs/src/main/java/com/it/ocs/api/model/DeWmsOperateLogModel.java

@@ -0,0 +1,90 @@
+package com.it.ocs.api.model;
+
+import java.util.Date;
+
+public class DeWmsOperateLogModel {
+	private Long id;
+	private String target;
+	private Long objectId;
+	private Long operator;
+	private String result;
+	private String description;
+	private String enabledFlag;
+	private Date createdAt;
+	private Date updatedAt;
+	
+	public DeWmsOperateLogModel() {
+		this.enabledFlag = "1";
+		this.createdAt = new Date();
+		this.updatedAt = new Date();
+	}
+	
+	public DeWmsOperateLogModel(String target, Long objectId, Long operator, String result, String description) {
+		this();
+		this.target = target;
+		this.objectId = objectId;
+		this.operator = operator;
+		this.result = result;
+		this.description = description;
+	}
+	
+	public DeWmsOperateLogModel(Long id, String target, Long objectId, Long operator, String result, String description) {
+		this(target, objectId, operator, result, description);
+		this.id = id;
+	}
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public String getTarget() {
+		return target;
+	}
+	public void setTarget(String target) {
+		this.target = target;
+	}
+	public Long getObjectId() {
+		return objectId;
+	}
+	public void setObjectId(Long objectId) {
+		this.objectId = objectId;
+	}
+	public Long getOperator() {
+		return operator;
+	}
+	public void setOperator(Long operator) {
+		this.operator = operator;
+	}
+	public String getResult() {
+		return result;
+	}
+	public void setResult(String result) {
+		this.result = result;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getEnabledFlag() {
+		return enabledFlag;
+	}
+	public void setEnabledFlag(String enabledFlag) {
+		this.enabledFlag = enabledFlag;
+	}
+	public Date getCreatedAt() {
+		return createdAt;
+	}
+	public void setCreatedAt(Date createdAt) {
+		this.createdAt = createdAt;
+	}
+	public Date getUpdatedAt() {
+		return updatedAt;
+	}
+	public void setUpdatedAt(Date updatedAt) {
+		this.updatedAt = updatedAt;
+	}
+}

+ 64 - 0
project/ocs/src/main/java/com/it/ocs/api/model/WmsProviderToken.java

@@ -0,0 +1,64 @@
+package com.it.ocs.api.model;
+
+/**
+* @ClassName: WmsProviderToken 
+* @Description: WMS供应商token
+* @author wgc 
+* @date 2018年4月23日 上午11:07:30 
+*
+ */
+public class WmsProviderToken {
+	
+	/**
+	 * 供应商名称
+	 */
+	private String providerName;
+	
+	/**
+	 * 供应商key
+	 */
+	private String appKey;
+	
+	/**
+	 * 供应商secret
+	 */
+	private String appSecret;
+	
+	/**
+	 * 供应商token
+	 */
+	private String token;
+
+	public String getProviderName() {
+		return providerName;
+	}
+
+	public void setProviderName(String providerName) {
+		this.providerName = providerName;
+	}
+
+	public String getAppKey() {
+		return appKey;
+	}
+
+	public void setAppKey(String appKey) {
+		this.appKey = appKey;
+	}
+
+	public String getAppSecret() {
+		return appSecret;
+	}
+
+	public void setAppSecret(String appSecret) {
+		this.appSecret = appSecret;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+	
+}

+ 295 - 0
project/ocs/src/main/java/com/it/ocs/api/service/DeWmsTaskService.java

@@ -0,0 +1,295 @@
+package com.it.ocs.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.api.constant.WarehouseConstant;
+import com.it.ocs.api.dao.IDeWarehouseDao;
+import com.it.ocs.api.dao.IWmsProviderTokenDao;
+import com.it.ocs.api.ex.Oms2WmsException;
+import com.it.ocs.api.ex.SkuInventoryException;
+import com.it.ocs.api.model.DeAbnormalReasonModel;
+import com.it.ocs.api.utils.AbnormalReasonUtils;
+import com.it.ocs.api.utils.CommonUtils;
+import com.it.ocs.common.support.IAction;
+import com.it.ocs.common.util.CollectionUtil;
+import com.it.ocs.synchronou.util.JsonConvertUtil;
+
+/**
+ * @ClassName: DeWmsTaskService
+ * @Description: 德国仓出入库定时任务
+ * @author wgc
+ * @date 2018年4月11日 下午5:53:51
+ *
+ */
+@Service("deWmsTaskService")
+public class DeWmsTaskService {
+
+	private static final Logger logger = Logger.getLogger(DeWmsTaskService.class);
+
+	@Autowired
+	private IDeWarehouseDao deWarehouseDao;
+	
+	@Autowired
+	private IDeWarehouseService deWarehouseService;
+
+	@Autowired
+	private IWmsProviderTokenDao wmsProviderTokenDao;
+	
+	@Autowired
+	private CommonUtils commonUtils;
+
+	/**
+	 * Spring Schedule: 获取订单,生成待推送WMS平台的出库单
+	 */
+	public void selectOutWmsOrders() {
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromLight(), "1");  //获取官网平台订单数据
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDENoShipOrderInfoFromEbay(), "2");   //获取ebay平台订单数据
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromAmazon(), "3"); //获取Amazon平台订单数据
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromVC(), "5"); //获取VC订单数据
+	}
+
+	/**
+	 * Spring Schedule: 获取官网订单,生成待推送WMS平台的出库单
+	 */
+	public void selectLightOutWmsOrders() {
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromLight(), "1"); //获取官网平台
+	}
+
+	/**
+	 * Spring Schedule: 获取ebay订单,生成待推送WMS平台的出库单
+	 */
+	public void selectEbayOutWmsOrders() {
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDENoShipOrderInfoFromEbay(), "2"); //获取ebay平台
+	}
+
+	/**
+	 * Spring Schedule: 获取亚马逊订单,生成待推送WMS平台的出库单
+	 */
+	public void selectAmazonOutWmsOrders() {
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromAmazon(), "3");
+	}
+
+	/**
+	 * Spring Schedule: 获取VC订单,生成待推送WMS平台的出库单
+	 */
+	public void selectVcOutWmsOrders() {
+		this.saveDeOutWmsOrders(this.deWarehouseDao.getDeNoshipOrderInfoFromVC(), "5");
+	}
+	
+	/**
+	 * 保存待推送出库单
+	 * @param orders 订单数据集(来源于订单表)
+	 * @param platform 平台:1-官网;2-ebay;3-亚马逊;4-沃尔玛;5-VC
+	 */
+	private void saveDeOutWmsOrders(List<Map<String, Object>> orders, String platform) {
+		CollectionUtil.each(orders, new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> data) {	
+				try {
+					deWarehouseService.saveDeOutOrders(platform, data);
+				} catch(Oms2WmsException e) {
+					if(!"exists".equals(e.getCode())) {
+						//已经存在的异常不记录日志(定时任务取数,会经常出现已经存的现象,记录日志毫无意义且会导致日志数据爆炸)
+						logger.warn(">>> Out-Order >>> " + e.getMessage() + ": " + JsonConvertUtil.getJsonString(data));
+						deWarehouseService.recordOperFailedLog("save-out-order", null, e.getMessage() + ": " + JsonConvertUtil.getJsonString(data));
+					}
+				} catch (Exception e) {
+					logger.error(">>> Out-Order Error >>> platform=" + platform + "; message=" + e.getMessage() + ": " + JsonConvertUtil.getJsonString(data), e);
+					deWarehouseService.recordOperFailedLog("save-out-order", null, e.getMessage() + ": " + JsonConvertUtil.getJsonString(data));
+				}
+			}
+		});
+	}
+
+	/**
+	 * Spring Schedule: 获取退货退款单,生成待推送WMS平台的入库单
+	 */
+	public void selectInWmsOrders() {
+		CollectionUtil.each(this.deWarehouseDao.getDeInWmsOrderInfos(), new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> data) {
+				try {
+					deWarehouseService.saveDeInOrders(data);
+				} catch (Exception e) {
+					String message = "request=" + JsonConvertUtil.getJsonString(data) + "; response=" + e.getMessage();
+					boolean isRecordLog = true;
+					if(e instanceof Oms2WmsException) {
+						//已经存在的异常不记录日志(定时任务取数,会经常出现已经存的现象,记录日志毫无意义且会导致日志数据爆炸)
+						isRecordLog = !"exists".equals(((Oms2WmsException) e).getCode());
+						if(isRecordLog) {
+							logger.error(">>> In-Order Error >>> " + message);
+						}
+					} else {
+						logger.error(">>> In-Order Error >>> " + message, e);
+					}
+					if(isRecordLog) {
+						deWarehouseService.recordOperFailedLog("save-in-order", null, message);	
+					}
+				}
+			}
+		});
+	}
+
+	/**
+	 * Spring Schedule: 推送德国仓官网(LE)出库单到WMS系统
+	 * @return void
+	 */
+	public void sendDeLightOutOrderToWms() {
+		this.sendDeOutToWms(this.deWarehouseDao.getSendDeOutWmsOrders(1));
+	}
+
+	/**
+	 * Spring Schedule: 推送德国仓Ebay出库单到WMS系统
+	 * @return void
+	 */
+	public void sendDeEbayOutOrderToWms() {
+		this.sendDeOutToWms(this.deWarehouseDao.getSendDeOutWmsOrders(2));
+	}
+	
+	/**
+	 * Spring Schedule: 推送德国仓Amazon出库单到WMS系统
+	 * @return void
+	 */
+	public void sendDeAmazonOutOrderToWms() {
+		this.sendDeOutToWms(this.deWarehouseDao.getSendDeOutWmsOrders(3));
+	}
+	
+	/**
+	 * Spring Schedule: 推送VC出库单到WMS系统
+	 * @return void
+	 */
+	public void sendDeVcOutOrderToWms() {
+		this.sendDeOutToWms(this.deWarehouseDao.getSendDeOutWmsOrders(5));
+	}
+
+	private String wmsToken() {
+		String tempToken = commonUtils.getDeWmsToken();
+		Map<String,Object> identity = CommonUtils.newIdentity();
+		identity.put("token", tempToken);
+		wmsProviderTokenDao.updateProviderTokenByMap(identity);
+		return tempToken;
+	}
+	
+	/**
+	 * 推送德国仓出库单到WMS系统
+	 * @param outs 待推送的出库单集合
+	 * @return void
+	 */
+	private void sendDeOutToWms(List<Map<String, Object>> outs) {
+		//String token = wmsProviderTokenDao.getProviderToken(CommonUtils.newIdentity()).getToken();
+		String token = wmsToken();
+		CollectionUtil.each(outs, new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> data) {
+				Long id = null;
+				try {
+					id = Long.parseLong(String.valueOf(data.get("ID")));
+					deWarehouseService.sendDeOutOrders(data, token);
+				} catch(SkuInventoryException e) {
+					try {
+						DeAbnormalReasonModel reason = AbnormalReasonUtils.newOut(id, AbnormalReasonUtils.ACTION_SOT_CSI, e.getMessage());
+						deWarehouseService.afterOperateDeOutOrder(id, WarehouseConstant.IS_SEND_WMS_FAILED, WarehouseConstant.IS_ABNORMAL_1, reason);
+					} catch (Exception e1) {
+						logger.error(">>> Out-Order Error >>> changeDeOutOrderStatus >>> " + e.getMessage(), e);
+						deWarehouseService.recordOperFailedLog("after-send-out-order", id, e1.getMessage() + ":" + JsonConvertUtil.getJsonString(data));
+					}
+					logger.error(">>> Out-Order Error >>> " + e.getMessage() + ": " + JsonConvertUtil.getJsonString(data));
+					deWarehouseService.recordOperFailedLog("send-out-order", id, e.getMessage() + ":" + JsonConvertUtil.getJsonString(data));
+				} catch (Exception e) {
+					logger.error(">>> Out-Order Error >>> " + e.getMessage() + ": " + JsonConvertUtil.getJsonString(data), e);
+					deWarehouseService.recordOperFailedLog("send-out-order", id, e.getMessage() + ":" + JsonConvertUtil.getJsonString(data));
+				}
+			}
+		});
+	}
+
+	/**
+	 * Spring Schedule: 推送德国仓入库单到WMS系统
+	 * @return void
+	 */
+	public void sendDeInWmsOrder() {
+		//String token = this.wmsProviderTokenDao.getProviderToken(CommonUtils.newIdentity()).getToken();
+		String token = wmsToken();
+		//将未推送的非认领单的入库单推送至WMS平台
+		CollectionUtil.each(this.deWarehouseDao.getSendDeInWmsOrders(), new IAction<Map<String, Object>>() {
+			public void excute(Map<String, Object> data) {	
+				try {
+					deWarehouseService.sendDeInOrders(data, token);
+				} catch (Exception e) {
+					logger.error(">>> In-Order Error >>> " + e.getMessage() + ": request=" + JsonConvertUtil.getJsonString(data), e);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Spring Schedule: 扫描上传light(官网)订单跟踪号
+	 */
+	public void scanUploadLightTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(1, false);
+	}
+	
+	/**
+	 * Spring Schedule: 扫描上传ebay订单跟踪号
+	 */
+	public void scanUploadEbayTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(2, false);
+	}
+	
+	/**
+	 * Spring Schedule: 扫描上传amazon(亚马逊)订单跟踪号
+	 */
+	public void scanUploadAmazonTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(3, false);
+	}
+
+	/**
+	 * Spring Schedule: 扫描上传VC订单跟踪号
+	 */
+	public void scanUploadVcTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(5, false);
+	}
+
+	/**
+	 * Spring Schedule: 最后一次扫描上传light(官网)订单跟踪号
+	 */
+	public void lastScanUploadLightTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(1, true);
+	}
+	
+	/**
+	 * Spring Schedule: 最后一次扫描上传ebay订单跟踪号
+	 */
+	public void lastScanUploadEbayTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(2, true);
+	}
+	
+	/**
+	 * Spring Schedule: 最后一次扫描上传amazon(亚马逊)订单跟踪号
+	 */
+	public void lastScanUploadAmazonTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(3, true);
+	}
+
+	/**
+	 * Spring Schedule: 最后一次扫描上传VC订单跟踪号
+	 */
+	public void lastScanUploadVcTrackingNumber() {
+		this.deWarehouseService.scanOutsUploadTrackingNumber(5, true);
+	}
+	
+	/**
+	 * Spring Schedule: 同步WMS仓库系统的异常单(病单)
+	 */
+	public void syncWmsDiseaseOutOrders() {
+		this.deWarehouseService.syncWmsDiseaseOutOrders();
+	}
+	
+	/*public static void main(String[] args) {
+		org.springframework.context.ApplicationContext ac = new org.springframework.context.support.ClassPathXmlApplicationContext("classpath:spring.xml");
+		IDeWarehouseService s = (IDeWarehouseService) ac.getBean("deWarehouseServiceImpl");
+		s.test();
+	}*/
+}

+ 49 - 0
project/ocs/src/main/java/com/it/ocs/api/service/IDeInOrderService.java

@@ -0,0 +1,49 @@
+package com.it.ocs.api.service;
+
+import com.it.ocs.api.vo.InOrderVO;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+/**
+ * 德国入库单服务接口
+ * @author zhouyancheng
+ *
+ */
+public interface IDeInOrderService {
+
+	/**
+	 * 分页查询入库单数据
+	 * @param param 分页参数,包含相关过滤条件
+	 * @return 
+	 * {@link com.it.ocs.common.ResponseResult},
+	 * 其属性<code>rows</code>数据集为以{@link com.it.ocs.api.vo.InOrderVO}对象实例为元素的集合({@link java.util.List})。
+	 */
+	ResponseResult<InOrderVO> queryByPage(RequestParam param);
+
+	/**
+	 * 取消指定的入库单
+	 * @param id 入库单主键ID
+	 * @param orderId 原始订单ID
+	 * @param orderOcsId 原始订单主键ID
+	 * @return {@link com.it.ocs.common.OperationResult}
+	 */
+	OperationResult cancel(Long id, String orderId, Long orderOcsId) throws Exception;
+
+	/**
+	 * 重新推送入库单到WMS仓库
+	 * @param id
+	 * @param orderId
+	 * @param orderOcsId
+	 * @return
+	 */
+	OperationResult resend(Long id, String orderId, Long orderOcsId) throws Exception;
+
+	ResponseResult<InOrderVO> queryWmsClaimOrderByPage(com.it.ocs.common.RequestParam param);
+
+	ResponseResult<InOrderVO> queryWmsClaimOwnerOrderByPage(com.it.ocs.common.RequestParam param);
+
+	OperationResult claiming(Long claim, Long owner) throws Exception;
+
+	ResponseResult<InOrderVO> queryMainById(Long id);
+}

+ 40 - 0
project/ocs/src/main/java/com/it/ocs/api/service/IDeOperLogService.java

@@ -0,0 +1,40 @@
+package com.it.ocs.api.service;
+
+import com.it.ocs.api.vo.OperateLogVO;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+public interface IDeOperLogService {
+
+	/**
+	 * 查询操作日志
+	 * @param param 过滤参数(支持分页)
+	 * @return {@link com.it.ocs.common.ResponseResult}
+	 */
+	public ResponseResult<OperateLogVO> queryByPage(RequestParam param);
+	
+	/**
+	 * 记录操作失败的日志
+	 * @param target 操作方式
+	 * @param objectId 操作对象
+	 * @param description 操作详情
+	 */
+	public void recordOperFailedLog(String target, Long objectId, String description);
+
+	/**
+	 * 记录操作成功的日志
+	 * @param target 操作方式
+	 * @param objectId 操作对象
+	 * @param description 操作详情
+	 */
+	public void recordOperSuccessLog(String target, Long objectId, String description);
+	
+	/**
+	 * 记录操作日志
+	 * @param target 操作方式
+	 * @param objectId 操作对象
+	 * @param result 操作结果: success | failed
+	 * @param description 操作详情
+	 */
+	public void recordOperLog(String target, Long objectId, String result, String description);
+}

+ 175 - 0
project/ocs/src/main/java/com/it/ocs/api/service/IDeWarehouseService.java

@@ -0,0 +1,175 @@
+package com.it.ocs.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.it.ocs.api.ex.SkuInventoryException;
+import com.it.ocs.api.model.DeAbnormalReasonModel;
+import com.it.ocs.api.model.DeOutWmsOrderDetailModel;
+import com.it.ocs.api.model.DeOutWmsOrderMainModel;
+import com.it.ocs.api.vo.AbnormalReasonVO;
+import com.it.ocs.api.vo.OutOrderChangeVO;
+import com.it.ocs.api.vo.OutOrderVO;
+import com.it.ocs.common.OperationResult;
+import com.it.ocs.common.RequestParam;
+import com.it.ocs.common.ResponseResult;
+
+/**
+ * 
+* @ClassName: IDeWarehouseService 
+* @Description: 对接德国仓库服务层接口
+* @author wgc 
+* @date 2018年4月8日 上午11:37:13 
+*
+ */
+public interface IDeWarehouseService {
+	
+	/**
+	 * 接收德国仓(WMS)出库单反馈
+	 * @param data 出库单反馈数据
+	 * @return
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public Map<String, Object> receiveOutOrderFeedback(Map<String, Object> data) throws Exception;
+
+	/**
+	 * 接收德国仓(WMS)入库单反馈
+	 * @param data 入库单反馈数据
+	 * @return
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public OperationResult receiveInOrderFeedback(Map<String, Object> data) throws Exception;
+	
+	/**
+	 * 保存德国仓出库单
+	 * @param platform 订单来源(1-官网; 2-ebay)
+	 * @param data 待推送的出库订单数据
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public void saveDeOutOrders(String platform, Map<String, Object> data) throws Exception;
+	
+	/**
+	 * 保存德国入库单
+	 * @param data 待推送的入库订单数据
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public void saveDeInOrders(Map<String, Object> data) throws Exception;
+
+	/**
+	 * 向德国仓(WMS)推送出库订单
+	 * @param data 待推送的出库订单数据
+	 * @param token 用于调用WMS出库订单推送接口的身份认证加密字符串
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public boolean sendDeOutOrders(Map<String, Object> data, String token) throws Exception;
+	
+	/**
+	 * 向德国仓(WMS)推送入库单
+	 * @param data 待推送的入库订单数据
+	 * @param token 用于调用WMS出库订单推送接口的身份认证加密字符串
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public boolean sendDeInOrders(Map<String, Object> data, String token) throws Exception;
+
+	/**
+	 * 扫描出库单数据,得到未上传跟踪号的单,并上传跟踪号
+	 * @param platform 平台:1-官网;2-ebay;3-亚马逊;4-沃尔玛;5-VC
+	 * @param endUpload	是否结束上传:即使本次上传失败,以后也不上传了。
+	 */
+	public void scanOutsUploadTrackingNumber(int platform, boolean endUpload);
+	
+	/**
+	 * 对出库单进行操作之后需要进行的相关处理(包括更新状态、时间、异常标记等等)
+	 * @param id 出库单主键ID。必须的参数。
+	 * @param isSendWms 出库单状态值: 0-未推送; 1-已推送; 2-已反馈; 3-推送失败。如果不需要,该值为null。
+	 * @param isAbnormal 出库单是否异常的标记: 0-正常; 1-异常。如果不需要,该值为null。
+	 * @param reason 相关操作异常原因,如果不需要,该值为null。
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public void afterOperateDeOutOrder(Long id, String isSendWms, String isAbnormal, DeAbnormalReasonModel reason) throws Exception;
+
+	/**
+	 * 对入库单进行操作之后需要进行的相关处理(包括更新状态、时间、异常标记等等)
+	 * @param id 入库单主键ID。必须的参数。
+	 * @param isSendWms 入库单状态值: 0-未推送; 1-已推送; 2-已反馈; 3-推送失败。如果不需要,该值为null。
+	 * @param reason 相关操作异常原因,如果不需要,该值为null。
+	 * @throws Exception 事务涉及回滚需要向外抛出的异常
+	 */
+	public void afterOperateDeInOrder(Long id, String isSendWms, DeAbnormalReasonModel reason) throws Exception;
+	
+	/**
+	 * 查询出库单数据
+	 * @param param 过滤参数(支持分页)
+	 * @return {@link com.it.ocs.common.ResponseResult}
+	 */
+	public ResponseResult<OutOrderVO> findDeOutOrders(RequestParam param);
+
+	/**
+	 * 在成功推送至WMS仓库之前,对出库单进行修改
+	 * @param vo 已经进行编辑的出库单信息VO
+	 * @return {@link com.it.ocs.common.OperationResult}
+	 */
+	public OperationResult changeBeforeSendWms(OutOrderChangeVO vo) throws Exception;
+
+	/**
+	 * 推送一张出库单到WMS仓库
+	 * @param id 出库单主键ID
+	 * @param orderId 出库单order_id(原始订单业务id)
+	 * @param orderOcsId 出库单order_ocs_id(原始订单主键ID)
+	 * @return {@link com.it.ocs.common.OperationResult}
+	 */
+	public OperationResult sendOutOrder(Long id, String orderId, Long orderOcsId) throws Exception;
+
+	/**
+	 * 取消一张出库单(被取消的出库单即成为废单,无法再进行后续操作)
+	 * @param id 出库单主键ID
+	 * @param orderId 出库单order_id(原始订单业务id)
+	 * @param orderOcsId 出库单order_ocs_id(原始订单主键ID)
+	 * @return {@link com.it.ocs.common.OperationResult}
+	 */
+	public OperationResult cancelOutOrder(Long id, String orderId, Long orderOcsId) throws Exception;
+
+	/**
+	 * 查询异常单的异常原因
+	 * @param param 过滤参数(支持分页)
+	 * @return {@link com.it.ocs.common.ResponseResult}
+	 */
+	public ResponseResult<AbnormalReasonVO> findAbnormalReasons(RequestParam param);
+
+	/**
+	 * 同步WMS仓库系统的异常单(病单)
+	 */
+	public OperationResult syncWmsDiseaseOutOrders();
+	
+	public void throwExIfLackInventory(String sku, int minQty, String token) throws SkuInventoryException;
+	
+	/**
+	 * 记录针对出入库单操作失败的日志
+	 * @param target 操作的目标
+	 * @param objectId 操作的业务对象id(出库单或者入库单的主键ID)
+	 * @param description 操作详情描述
+	 */
+	public void recordOperFailedLog(String target, Long objectId, String description);
+
+	/**
+	 * 更新上传跟踪号状态
+	 * @param id 出库单主键ID
+	 * @param status 跟踪号要更新的状态值(0-未上传;1-已上传;2-上传失败;3-关闭上传)
+	 */
+	void updateOutUploadStatus(Long id, int status);
+
+	/**
+	 * 上传跟踪号(订单状态不用更新,依靠上传跟踪号之后,系统自动同步订单状态下来OMS即可)
+	 * @param id 出库单主键ID
+	 * @param platform 平台:1-官网;2-ebay;3-亚马逊;4-沃尔玛
+	 * @param orderOcsId 对应订单表主键id
+	 * @param orderId 对应订单表的order_id
+	 * @param trackingNumber 快递跟踪号
+	 */
+	boolean uploadTrackingNumber(DeOutWmsOrderMainModel main, List<DeOutWmsOrderDetailModel> details);
+	
+	/**
+	 * 用于测试
+	 */
+	void test();
+}

+ 43 - 0
project/ocs/src/main/java/com/it/ocs/api/service/impl/DeInOrderExportService.java

@@ -0,0 +1,43 @@
+package com.it.ocs.api.service.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.it.ocs.api.dao.IDeInOrderDao;
+import com.it.ocs.api.model.DeOutOrderExportModel;
+import com.it.ocs.excel.service.AExcelDynamicExport;
+
+
+@Service("deInOrder")
+public class DeInOrderExportService extends AExcelDynamicExport {
+
+	@Autowired
+	private IDeInOrderDao deInOrderDao;
+	
+	@Override
+	protected List<Map<String, Object>> getData(HttpServletRequest request) {
+		Map<String, Object> param = new HashMap<String, Object>();
+		for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
+			param.put(entry.getKey(), null == entry.getValue() || entry.getValue().length == 0 ? null : entry.getValue()[0]);
+		}
+		return this.deInOrderDao.getDeInOrderExportData(param);
+	}
+
+	@Override
+	protected void init(HttpServletRequest request) {
+		String filename = String.format("DEINORDER_%s.xlsx", new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
+		String paramIncludeFields = request.getParameter("includeFields");
+		String[] includeFields = StringUtils.isBlank(paramIncludeFields) ? null : paramIncludeFields.split(",");
+		super.initModel(DeOutOrderExportModel.class, filename, includeFields);
+	}
+}

+ 0 - 0
project/ocs/src/main/java/com/it/ocs/api/service/impl/DeInOrderServiceImpl.java


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio