cxd 10 maanden geleden
bovenliggende
commit
cf1ad247dd
43 gewijzigde bestanden met toevoegingen van 1411 en 32 verwijderingen
  1. 23 0
      .idea/compiler.xml
  2. 11 0
      .idea/encodings.xml
  3. 25 0
      .idea/jarRepositories.xml
  4. 11 0
      .idea/misc.xml
  5. 124 0
      .idea/uiDesigner.xml
  6. 6 0
      .idea/vcs.xml
  7. 8 0
      pom.xml
  8. 43 0
      raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/Lock.java
  9. 0 23
      raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzAuthorize.java
  10. 54 0
      raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzOrder.java
  11. 25 0
      raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzOrderOriginal.java
  12. 41 0
      raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzPullOrderTask.java
  13. 17 0
      raycos_common/src/main/java/com/raycos/raycoscommon/json/HttpResultJson.java
  14. 1 1
      raycos_common/src/main/java/com/raycos/raycoscommon/json/TokenAmz.java
  15. 1 1
      raycos_common/src/main/java/com/raycos/raycoscommon/json/TokenRetAmzJson.java
  16. 6 0
      raycos_datacenter_api/pom.xml
  17. 5 1
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/RaycosDatacenterApiApplication.java
  18. 11 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderController.java
  19. 48 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderOriginalController.java
  20. 18 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderOriginalService.java
  21. 16 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderService.java
  22. 46 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderController.java
  23. 8 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderService.java
  24. 20 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderTaskService.java
  25. 39 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzOrderOriginalServiceImpl.java
  26. 38 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzOrderServiceImpl.java
  27. 108 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzPullOrderServiceImpl.java
  28. 53 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzPullOrderTaskServiceImpl.java
  29. 158 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/AmazonUtil.java
  30. 89 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/CommonUtil.java
  31. 13 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/Constant.java
  32. 2 2
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/authorize/impl/AmzTokenServiceImpl.java
  33. 10 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/common/databaselock/LockService.java
  34. 62 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/common/databaselock/impl/LockServiceImpl.java
  35. 34 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/RabbitMQConfig.java
  36. 32 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/attach/AmzPullOrderConsumer.java
  37. 37 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/attach/SendAmzPullOrderMsg.java
  38. 7 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzOrderMapper.java
  39. 7 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzOrderOriginalMapper.java
  40. 21 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzPullOrderTaskMapper.java
  41. 9 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/LockMapper.java
  42. 113 0
      raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/scheduledtasks/SearchOrderPullTask.java
  43. 11 4
      raycos_datacenter_api/src/main/resources/application.yml

+ 23 - 0
.idea/compiler.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="raycos_datacenter_api" />
+        <module name="raycos_web_api" />
+        <module name="raycoscommon" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="raycos_datacenter_api" options="-parameters" />
+      <module name="raycos_web_api" options="-parameters" />
+      <module name="raycoscommon" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 11 - 0
.idea/encodings.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
+    <file url="file://$PROJECT_DIR$/raycos_common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/raycos_datacenter_api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/raycos_web_api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>

+ 25 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="spring-milestones" />
+      <option name="name" value="Spring Milestones" />
+      <option name="url" value="https://repo.spring.io/milestone" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>

+ 11 - 0
.idea/misc.xml

@@ -0,0 +1,11 @@
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

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

+ 8 - 0
pom.xml

@@ -82,6 +82,14 @@
                 <version>2.0.52</version>
             </dependency>
 
+            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-amqp</artifactId>
+                <version>3.2.0</version>
+            </dependency>
+
+
         </dependencies>
 
     </dependencyManagement>

+ 43 - 0
raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/Lock.java

@@ -0,0 +1,43 @@
+package com.raycos.raycoscommon.Internal.datacenterapi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+
+/**
+ * 数据库锁
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("tb_lock")
+public class Lock {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 企业编号
+     */
+    private String lockKey;
+
+    /**
+     * 描述
+     */
+    @TableField("`describe`")
+    private String describe;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdAt;
+}

+ 0 - 23
raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzAuthorize.java

@@ -1,23 +0,0 @@
-package com.raycos.raycoscommon.Internal.datacenterapi;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @Author: xiaojiabin
- * @Date: 2024/9/2 14:28
- */
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class TbAmzAuthorize {
-
-    private  Long id;
-    private  String sellingPartnerId;
-    private  String mwsAuthToken;
-    private  String spapiOauthCode;
-
-
-}

+ 54 - 0
raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzOrder.java

@@ -0,0 +1,54 @@
+package com.raycos.raycoscommon.Internal.datacenterapi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TbAmzOrder {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    private Integer companyId;
+    private Integer storeId;
+    private String amazonOrderId;
+    private LocalDateTime purchaseDate;
+    private LocalDateTime lastUpdateDate;
+    private String orderStatus;
+    private String fulfillmentChannel;
+    private String salesChannel;
+    private String shipServiceLevel;
+    private String currencyCode;
+    private BigDecimal amount;
+    private Integer numberOfItemsShipped;
+    private Integer numberOfItemsUnshipped;
+    private String paymentMethod;
+    // 注意:这里使用String,实际使用时可能需要转换为JSON
+    private String paymentMethodDetails;
+    private Boolean isReplacementOrder;
+    private String marketplaceId;
+    private String shipmentServiceLevelCategory;
+    private String orderType;
+    private LocalDateTime earliestShipDate;
+    private LocalDateTime latestShipDate;
+    private LocalDateTime earliestDeliveryDate;
+    private LocalDateTime latestDeliveryDate;
+    private Boolean isBusinessOrder;
+    private Boolean isPrime;
+    private Boolean isAccessPointOrder;
+    private Boolean isGlobalExpressEnabled;
+    private Boolean isPremiumOrder;
+    private Boolean isSoldByAb;
+    private Boolean isIba;
+    private String easyShipShipmentStatus;
+    private String electronicInvoiceStatus;
+    private LocalDateTime createdAt;
+    private LocalDateTime updatedAt;
+}

+ 25 - 0
raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzOrderOriginal.java

@@ -0,0 +1,25 @@
+package com.raycos.raycoscommon.Internal.datacenterapi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TbAmzOrderOriginal {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Long companyId;
+    private Long storeId;
+    private String amazonOrderId;
+    private String jsonData;
+    private LocalDateTime createdAt;
+    private LocalDateTime updatedAt;
+}

+ 41 - 0
raycos_common/src/main/java/com/raycos/raycoscommon/Internal/datacenterapi/TbAmzPullOrderTask.java

@@ -0,0 +1,41 @@
+package com.raycos.raycoscommon.Internal.datacenterapi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 亚马逊店铺拉单任务表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TbAmzPullOrderTask {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 企业编号
+     */
+    private Integer companyId;
+
+    /**
+     * 店铺ID
+     */
+    private Integer storeId;
+
+    /**
+     * 最后操作时间
+     */
+    private Long lastOperationTime;
+
+    /**
+     * 任务重试次数
+     */
+    private Byte retryCount;
+}

+ 17 - 0
raycos_common/src/main/java/com/raycos/raycoscommon/json/HttpResultJson.java

@@ -0,0 +1,17 @@
+package com.raycos.raycoscommon.json;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HttpResultJson {
+
+    private String statusCode;
+    private String statusCodeValue;
+    private String headers;
+    private String body;
+}

+ 1 - 1
raycos_common/src/main/java/com/raycos/raycoscommon/amzjson/TokenAmz.java → raycos_common/src/main/java/com/raycos/raycoscommon/json/TokenAmz.java

@@ -1,4 +1,4 @@
-package com.raycos.raycoscommon.amzjson;
+package com.raycos.raycoscommon.json;
 
 import com.alibaba.fastjson2.annotation.JSONField;
 import lombok.AllArgsConstructor;

+ 1 - 1
raycos_common/src/main/java/com/raycos/raycoscommon/amzjson/TokenRetAmzJson.java → raycos_common/src/main/java/com/raycos/raycoscommon/json/TokenRetAmzJson.java

@@ -1,4 +1,4 @@
-package com.raycos.raycoscommon.amzjson;
+package com.raycos.raycoscommon.json;
 
 
 import com.alibaba.fastjson2.annotation.JSONField;

+ 6 - 0
raycos_datacenter_api/pom.xml

@@ -62,6 +62,12 @@
             <artifactId>fastjson2</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 5 - 1
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/RaycosDatacenterApiApplication.java

@@ -1,6 +1,7 @@
 package com.raycos.raycosdatacenterapi;
 
 import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -13,8 +14,11 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @SpringBootApplication
 @MapperScan("com/raycos/raycosdatacenterapi/mapper")
 
+
+// 启用MQ队列
+@EnableRabbit
 // 添加扫描范围
-@ComponentScan(basePackages = {"com.raycos.raycoscommon","com.raycos.raycosdatacenterapi"})
+@ComponentScan(basePackages = {"com.raycos.raycoscommon", "com.raycos.raycosdatacenterapi"})
 
 //扫描spring 定时任务
 @EnableScheduling

+ 11 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderController.java

@@ -0,0 +1,11 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/erp/amzorder")
+public class AmzOrderController {
+}

+ 48 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderOriginalController.java

@@ -0,0 +1,48 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+
+import com.raycos.raycoscommon.Internal.Result;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrderOriginal;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping("/erp/amzorderoriginal")
+public class AmzOrderOriginalController {
+
+    @Autowired
+    private AmzOrderOriginalService amzOrderOriginalService;
+
+    @PostMapping("/addOrderoRiginal")
+    public Result<String> addOrderoRiginal(@RequestBody TbAmzOrderOriginal taoo) {
+        Result<String> rt = new Result<>();
+        try {
+            amzOrderOriginalService.add(taoo);
+            rt.success();
+            rt.setMsg("新增订单成功!");
+        } catch (Exception e) {
+            rt.fail();
+            log.error("  /addOrderoRiginal 异常 ", e);
+        }
+        return rt;
+    }
+
+    @GetMapping("/selAllOrderoRiginal")
+    public Result<List<TbAmzOrderOriginal>> selAllOrderoRiginal() {
+        Result<List<TbAmzOrderOriginal>> rt = new Result<>();
+        try {
+            rt.success(amzOrderOriginalService.selAll(null));
+            rt.setMsg("订单原始数据查询成功!");
+        } catch (Exception e) {
+            rt.fail();
+            log.error(" /selAllOrderoRiginal  异常 ", e);
+        }
+        return rt;
+    }
+
+
+}

+ 18 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderOriginalService.java

@@ -0,0 +1,18 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrderOriginal;
+
+import java.util.List;
+
+public interface AmzOrderOriginalService {
+
+
+    void add(TbAmzOrderOriginal params) throws Exception;
+
+    void del(TbAmzOrderOriginal params) throws Exception;
+
+    void edit(TbAmzOrderOriginal params) throws Exception;
+
+    List<TbAmzOrderOriginal> selAll(TbAmzOrderOriginal params) throws Exception;
+}

+ 16 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzOrderService.java

@@ -0,0 +1,16 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrder;
+
+import java.util.List;
+
+public interface AmzOrderService {
+
+    void add(TbAmzOrder params) throws Exception;
+
+    void del(TbAmzOrder params) throws Exception;
+
+    void edit(TbAmzOrder params) throws Exception;
+
+    List<TbAmzOrder> selAll(TbAmzOrder params) throws Exception;
+}

+ 46 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderController.java

@@ -0,0 +1,46 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+
+import com.raycos.raycoscommon.Internal.Result;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.config.attach.SendAmzPullOrderMsg;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 亚马逊拉单
+ */
+@RestController
+@Slf4j
+@RequestMapping("/erp/amzorder")
+public class AmzPullOrderController {
+
+
+    @Autowired
+    private AmzPullOrderService amzPullOrderService;
+
+
+    @Autowired
+    private SendAmzPullOrderMsg sendAmzPullOrderMsg;
+
+    @GetMapping("/getorder")
+    public Result<String> getorder() {
+        Result<String> rt = new Result<>();
+        try {
+            log.info(" 来了老铁   ");
+            TbAmzPullOrderTask task = new TbAmzPullOrderTask();
+            task.setCompanyId(100001);
+            sendAmzPullOrderMsg.sendMessage(task);
+            rt.success();
+        } catch (Exception e) {
+            rt.fail();
+            log.error("   异常 ", e);
+        }
+        return rt;
+    }
+
+
+}

+ 8 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderService.java

@@ -0,0 +1,8 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+
+public interface AmzPullOrderService {
+
+    void sendGetOrders (TbAmzPullOrderTask task )throws Exception;
+}

+ 20 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/AmzPullOrderTaskService.java

@@ -0,0 +1,20 @@
+package com.raycos.raycosdatacenterapi.amzorder;
+
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+
+import java.util.List;
+
+public interface AmzPullOrderTaskService {
+
+
+    void add( TbAmzPullOrderTask params) throws Exception;
+
+    void delById(TbAmzPullOrderTask params) throws Exception;
+
+    void editById(TbAmzPullOrderTask params) throws Exception;
+
+    List<TbAmzPullOrderTask> selAll(TbAmzPullOrderTask params) throws Exception;
+
+    List< TbAmzPullOrderTask > findPullTask ( TbAmzPullOrderTask params ) throws Exception;
+}

+ 39 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzOrderOriginalServiceImpl.java

@@ -0,0 +1,39 @@
+package com.raycos.raycosdatacenterapi.amzorder.impl;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrderOriginal;
+import com.raycos.raycosdatacenterapi.amzorder.AmzOrderOriginalService;
+import com.raycos.raycosdatacenterapi.mapper.AmzOrderOriginalMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@Slf4j
+public class AmzOrderOriginalServiceImpl implements AmzOrderOriginalService {
+
+    @Autowired
+    private AmzOrderOriginalMapper amzOrderOriginalMapper;
+
+    @Override
+    public void add(TbAmzOrderOriginal params) throws Exception {
+        amzOrderOriginalMapper.insert( params);
+
+    }
+
+    @Override
+    public void del(TbAmzOrderOriginal params) throws Exception {
+
+    }
+
+    @Override
+    public void edit(TbAmzOrderOriginal params) throws Exception {
+
+    }
+
+    @Override
+    public List<TbAmzOrderOriginal> selAll(TbAmzOrderOriginal params) throws Exception {
+        return amzOrderOriginalMapper.selectList(null);
+    }
+}

+ 38 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzOrderServiceImpl.java

@@ -0,0 +1,38 @@
+package com.raycos.raycosdatacenterapi.amzorder.impl;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrder;
+import com.raycos.raycosdatacenterapi.amzorder.AmzOrderService;
+import com.raycos.raycosdatacenterapi.mapper.AmzOrderMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+@Service
+@Slf4j
+public class AmzOrderServiceImpl implements AmzOrderService {
+
+    @Autowired
+    private AmzOrderMapper amzOrderMapper;
+
+    @Override
+    public void add(TbAmzOrder params) throws Exception {
+        amzOrderMapper.insert( params);
+
+    }
+
+    @Override
+    public void del(TbAmzOrder params) throws Exception {
+
+    }
+
+    @Override
+    public void edit(TbAmzOrder params) throws Exception {
+
+    }
+
+    @Override
+    public List<TbAmzOrder> selAll(TbAmzOrder params) throws Exception {
+        return amzOrderMapper.selectList(null);
+    }
+}

+ 108 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzPullOrderServiceImpl.java

@@ -0,0 +1,108 @@
+package com.raycos.raycosdatacenterapi.amzorder.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.amzorder.AmzPullOrderService;
+import com.raycos.raycosdatacenterapi.amzorder.util.AmazonUtil;
+import com.raycos.raycosdatacenterapi.amzorder.util.CommonUtil;
+import com.raycos.raycosdatacenterapi.authorize.AmzTokenService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+
+/**
+ * 亚马逊拉单服务
+ */
+@Service
+@Slf4j
+public class AmzPullOrderServiceImpl implements AmzPullOrderService {
+
+
+    @Autowired
+    private AmzTokenService amzTokenService;
+
+    @Resource(name = "ExternalNetwork")
+    private static RestTemplate enRrestTemplate;
+
+
+    /**
+     * 拉取亚马逊订单
+     *
+     * @throws Exception
+     */
+    @Override
+    public void sendGetOrders(TbAmzPullOrderTask task) throws Exception {
+
+        // 根据 企业编号 与站点 查询 amz接口令牌
+
+
+
+    }
+
+
+    private static final String accessToken = "Atza|IwEBIPmiS7q9d3TZFgfAbYxjTbWVEdtuYoRKgR1DTeywc1BY6EsA6ROmvoqqlwvx_08JWZLHgg5mSXMLuRVPu9vgDqhzTuVc4JH2qcRWf-wegd2JpJY5NslLho6IG5ftGSwwbiuKgrGA_AI1tnW9BkHbZZhdQbDlW4sqoKfVrT_E9iEyZYfCsOZtoLpScMWbaBi2jaHjRv27tuS2jzpeDF-NzOOAETzPD7PKWKNfLp__eq1QabglUJ6ax5sBMYPsdZm30CViI6yZXZrfkV0zctkDJ4TPy7K58ARU5okQhQu6v9WN8oRZQOfx6ziPHoLlD5u9kUAAGL4GRojFEeXi6rdX4mLUeEI8cQlXGyspsP1Uv8xbnA";
+    private static final String marketplaceId = "ATVPDKIKX0DER";
+
+    private static final String HOST = "sandbox.sellingpartnerapi-na.amazon.com";
+    private static final String region = "us-east-1";
+
+    private static final String apiMethod = "/orders/v0/orders?";
+
+
+//    Date date = new Date();
+//    String reqDateTime = CommonUtil.getTimeFormat(date, "yyyyMMdd'T'HHmmss'Z'", true);
+
+    public static void getorder1() throws Exception {
+
+        String queryString = "CreatedAfter=TEST_CASE_200&MarketplaceIds=" + marketplaceId + "&MaxResultsPerPage=2";
+        enRrestTemplate = new RestTemplate();
+        String url = "https://" + HOST + apiMethod + queryString;
+        // 设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setAll(AmazonUtil.calculateAwsSignatureAndReturnHeaders(
+                apiMethod,
+                "GET",
+                HOST,
+                "",
+                queryString,
+                region,
+                accessToken
+        ));
+        // 创建请求实体
+        HttpEntity<String> entity = new HttpEntity<>(headers);
+
+        // 发送请求
+        ResponseEntity<String> resp = enRrestTemplate.exchange(
+                url,
+                HttpMethod.GET,
+                entity,
+                String.class
+        );
+        log.info("   orders 接口返回 " + JSONObject.toJSONString(resp));
+
+    }
+
+
+    public static void main(String[] args) {
+        Date date = new Date();
+        String reqDateTime = CommonUtil.getTimeFormat(date, "yyyyMMdd'T'HHmmss'Z'", true);
+        System.out.println(reqDateTime);
+        try {
+            AmzPullOrderServiceImpl.getorder1();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+}

+ 53 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/impl/AmzPullOrderTaskServiceImpl.java

@@ -0,0 +1,53 @@
+package com.raycos.raycosdatacenterapi.amzorder.impl;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.amzorder.AmzPullOrderTaskService;
+import com.raycos.raycosdatacenterapi.mapper.AmzPullOrderTaskMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Slf4j
+@Service
+public class AmzPullOrderTaskServiceImpl implements AmzPullOrderTaskService {
+
+    @Autowired
+    private AmzPullOrderTaskMapper amzPullOrderTaskMapper;
+
+    @Override
+    public void add(TbAmzPullOrderTask params) throws Exception {
+        amzPullOrderTaskMapper.insert(params);
+    }
+
+    @Override
+    public void delById(TbAmzPullOrderTask params) throws Exception {
+        amzPullOrderTaskMapper.deleteById(params.getId());
+    }
+
+    @Override
+    public void editById(TbAmzPullOrderTask params) throws Exception {
+        amzPullOrderTaskMapper.updateById(params);
+    }
+
+    @Override
+    public List<TbAmzPullOrderTask> selAll(TbAmzPullOrderTask params) throws Exception {
+        return amzPullOrderTaskMapper.selectList(null);
+    }
+
+    /**
+     * 查询需要拉去订单的店铺信息
+     *
+     * @param params
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<TbAmzPullOrderTask> findPullTask(TbAmzPullOrderTask params) throws Exception {
+        return amzPullOrderTaskMapper.findPullTask( params.getLastOperationTime() , params.getRetryCount() );
+    }
+
+
+}

+ 158 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/AmazonUtil.java

@@ -0,0 +1,158 @@
+package com.raycos.raycosdatacenterapi.amzorder.util;
+
+
+import com.alibaba.nacos.common.utils.StringUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+
+public class AmazonUtil {
+
+    /**
+     * 计算加密密钥及返回Header头
+     *
+     * @param methodName
+     * @param requestMethod 请求方式,例如: GET POST
+     * @param host          请求主机地址, 例如: sellingpartnerapi-na.amazon.com, 根据区域不同地址不同
+     * @param payload       传参,当为GET请求 参数留空, POST请求 拼为: abc=x1&efg=x2, 或json 格式 {"abc":"x1","efg":"x2"}
+     * @param queryString   当为GET请求,有传参则填写在这里,例如: abc=x1&efg=x2
+     * @param region        区域,例如:us-east-1
+     * @param accessToken   用户授权店铺后,短令牌token信息
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws NoSuchAlgorithmException
+     * @throws IllegalStateException
+     * @throws InvalidKeyException
+     */
+    public static Map<String, String> calculateAwsSignatureAndReturnHeaders(String methodName,
+                                                                            String requestMethod,
+                                                                            String host,
+                                                                            String payload,
+                                                                            String queryString,
+                                                                            String region,
+                                                                            String accessToken) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, IllegalStateException {
+
+        Date date = new Date();
+        String reqDate = CommonUtil.getTimeFormat(date, "yyyyMMdd", true);
+        String reqDateTime = CommonUtil.getTimeFormat(date, "yyyyMMdd'T'HHmmss'Z'", true);
+
+        Map<String, String> canonicalHeaders = canonicalHeaders(host, accessToken, reqDateTime);
+
+        List<String> canonicalHeaderList = new ArrayList<>();
+        for (Map.Entry<String, String> entry : canonicalHeaders.entrySet()) {
+            canonicalHeaderList.add(entry.getKey() + ":" + entry.getValue());
+        }
+
+        String canonicalHeaderstr = StringUtils.join(canonicalHeaderList, "\n");
+
+        String credentialScope = credentialScopeStr(region, Constant.SERVICE, reqDate);
+        String canonicalRequestHash = canonicalRequestHashStr(requestMethod, methodName, payload, queryString,
+                canonicalHeaderstr);
+        String stringToSign = createStrToSignStr(credentialScope, canonicalRequestHash, reqDateTime);
+        byte[] kSigning = calculateKsigning(Constant.IAMUSERSECRET, region, Constant.SERVICE, reqDate);
+        byte[] sign = CommonUtil.hmacSha256(stringToSign, kSigning);
+
+        String credential = "Credential=" + Constant.IAMUSERKEY + "/" + credentialScope;
+        String signedHeaders = "SignedHeaders=" + Constant.SIGNEDHEADER;
+        String signature = "Signature=" + CommonUtil.byte2hex(sign);
+        String[] authorizationHeader = {credential, signedHeaders, signature};
+        String authorization = Constant.ALGORITHM + " " + StringUtils.join(Arrays.asList(authorizationHeader), ", ");
+        canonicalHeaders.put("authorization", authorization);
+
+        return canonicalHeaders;
+    }
+
+    /**
+     * 计算 kSigning
+     *
+     * @param iamUserSecret
+     * @param region        区域 us-east-1
+     * @param service       服务 例如:execute-api
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws IllegalStateException
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     */
+    private static byte[] calculateKsigning(String iamUserSecret, String region, String service, String reqDate) throws InvalidKeyException, NoSuchAlgorithmException, IllegalStateException, UnsupportedEncodingException {
+        String kSecret = "AWS4" + iamUserSecret;
+        byte[] kDate = CommonUtil.hmacSha256(reqDate, kSecret.getBytes());
+        byte[] kRegion = CommonUtil.hmacSha256(region, kDate);
+        byte[] kService = CommonUtil.hmacSha256(service, kRegion);
+        byte[] kSigning = CommonUtil.hmacSha256(Constant.TERMINATIONSTRING, kService);
+        return kSigning;
+    }
+
+
+    /**
+     * 获取请求头
+     *
+     * @param host        请求主机地址, 例如: sellingpartnerapi-na.amazon.com, 根据区域不同地址不同
+     * @param accessToken 用户授权店铺后,短令牌token信息
+     * @param reqDateTime 请求时间,格式,例如: "yyyyMMdd'T'HHmmss'Z'"
+     * @return
+     */
+    private static Map<String, String> canonicalHeaders(String host, String accessToken, String reqDateTime) {
+        Map<String, String> map = new TreeMap<String, String>();
+        map.put("content-type", Constant.CONTENT_TYPE);
+        map.put("host", host);
+        map.put("user-agent", Constant.USER_AGENT);
+        map.put("x-amz-access-token", accessToken);
+        map.put("x-amz-date", reqDateTime);
+        return map;
+    }
+
+    /**
+     * 计算请求Hash
+     *
+     * @param requestMethod        请求方式, 例如:GET, POST
+     * @param canonicalURI         请求URI 地址,例如:/orders/v0/orders
+     * @param canonicalPayload     提交参数, 当为GET请求 参数留空, POST请求 拼为: abc=x1&efg=x2, 或json 格式 {"abc":"x1","efg":"x2"}
+     * @param canonicalQueryString 提交参数,当为GET请求,有传参则填写在这里,例如: abc=x1&efg=x2
+     * @param canonicalHeaderStr
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws NoSuchAlgorithmException
+     */
+    private static String canonicalRequestHashStr(String requestMethod, String canonicalURI, String canonicalPayload,
+                                                  String canonicalQueryString, String canonicalHeaderStr) throws NoSuchAlgorithmException, UnsupportedEncodingException {
+        String[] canonicalRequest = {requestMethod, canonicalURI, canonicalQueryString, canonicalHeaderStr + "\n",
+                Constant.SIGNEDHEADER, CommonUtil.sha256(canonicalPayload)};
+        String canonicalRequeststr = StringUtils.join(Arrays.asList(canonicalRequest), "\n");
+        return CommonUtil.sha256(canonicalRequeststr);
+    }
+
+
+    /**
+     * 计算Scope
+     *
+     * @param region  区域 us-east-1
+     * @param service 服务 例如:execute-api
+     * @param reqDate
+     * @return
+     */
+    private static String credentialScopeStr(String region, String service, String reqDate) {
+        String[] credentialScope = {reqDate, region, service, Constant.TERMINATIONSTRING};
+        return StringUtils.join(Arrays.asList(credentialScope), "/");
+    }
+
+    /**
+     * 计算 stringtoSing
+     *
+     * @param credentialScopeStr            前一个方法计算出来的字符串
+     * @param requestHashedCanonicalRequest
+     * @param reqDateTime                   请求时间,格式,例如: "yyyyMMdd'T'HHmmss'Z'"
+     * @return
+     */
+    private static String createStrToSignStr(String credentialScopeStr, String requestHashedCanonicalRequest,
+                                             String reqDateTime) {
+        String[] stringToSign = {Constant.ALGORITHM, reqDateTime, credentialScopeStr, requestHashedCanonicalRequest};
+        String stringToSignStr = StringUtils.join(Arrays.asList(stringToSign), "\n");
+        return stringToSignStr;
+    }
+
+
+}

+ 89 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/CommonUtil.java

@@ -0,0 +1,89 @@
+package com.raycos.raycosdatacenterapi.amzorder.util;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class CommonUtil {
+	
+	public static String getTimeFormat(Date d,String pattern,boolean utc) {
+		SimpleDateFormat f = new SimpleDateFormat(pattern);
+		if(utc) {
+			f.setTimeZone(TimeZone.getTimeZone("UTC"));
+		}
+		return f.format(d);
+	}
+	
+	public static String getTimeFormat(Date d,String pattern) {
+		return getTimeFormat(d, pattern,false);
+	}
+	
+	public static String getTimeFormat(String pattern) {
+		return getTimeFormat(new Date(), pattern,false);
+	}
+	
+	/**
+	 * hmac256加密
+	 * 
+	 * @param data
+	 * @param key
+	 * @return
+	 * @throws NoSuchAlgorithmException 
+	 * @throws InvalidKeyException 
+	 * @throws UnsupportedEncodingException 
+	 * @throws IllegalStateException 
+	 * @throws Exception
+	 */
+	public static byte[] hmacSha256(String data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException {
+	    String algorithm = "HmacSHA256";
+	    Mac sha256_HMAC = Mac.getInstance(algorithm);
+	    sha256_HMAC.init(new SecretKeySpec(key, algorithm));
+	    return sha256_HMAC.doFinal(data.getBytes("UTF-8"));
+	}
+	
+	/**
+	 * sha256加密
+	 * 
+	 * @param str 要加密的字符串
+	 * @return
+	 * @throws NoSuchAlgorithmException 
+	 * @throws UnsupportedEncodingException 
+	 */
+	public static String sha256(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
+		
+		MessageDigest md = MessageDigest.getInstance("SHA-256");
+		md.update(str.getBytes("UTF-8"));
+		return byte2hex(md.digest());
+	}
+	
+	/**
+	 * 字节byte转16进制
+	 * 
+	 * @param digest 要转换的字节
+	 * @return
+	 */
+	public static String byte2hex(byte[] bytes) {
+		StringBuffer sb = new StringBuffer();
+		String temp = null;
+		for (int i = 0; i < bytes.length; i++) {
+			temp = Integer.toHexString(bytes[i] & 0xFF);
+			if (temp.length() == 1) {
+				sb.append("0");
+			}
+			sb.append(temp);
+		}
+		return sb.toString();
+	}
+
+	public static void main(String[] args) {
+		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
+		f.setTimeZone(TimeZone.getTimeZone("UTC"));
+		System.out.println(f.format(new Date()));
+	}
+}

+ 13 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/amzorder/util/Constant.java

@@ -0,0 +1,13 @@
+package com.raycos.raycosdatacenterapi.amzorder.util;
+
+public class Constant {
+    public static final String IAMUSERKEY = "AKIAQEIP3EPRYQUHPOEC";
+    public static final String IAMUSERSECRET = "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";
+    public static String TERMINATIONSTRING = "aws4_request";
+    public static String ALGORITHM = "AWS4-HMAC-SHA256";
+    public static String SERVICE = "execute-api";
+    public static String SIGNEDHEADER = "content-type;host;user-agent;x-amz-access-token;x-amz-date";
+    public static String CONTENT_TYPE = "application/json;charset=utf-8";
+    public static String USER_AGENT = "Swagger-Codegen/1.0.0/java";
+
+}

+ 2 - 2
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/authorize/impl/AmzTokenServiceImpl.java

@@ -4,8 +4,8 @@ import com.alibaba.fastjson2.JSONObject;
 import com.raycos.raycoscommon.Internal.Result;
 import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzToken;
 import com.raycos.raycoscommon.Internal.datacenterapi.vo.GetAmzTokenByLwaCodeVo;
-import com.raycos.raycoscommon.amzjson.TokenAmz;
-import com.raycos.raycoscommon.amzjson.TokenRetAmzJson;
+import com.raycos.raycoscommon.json.TokenAmz;
+import com.raycos.raycoscommon.json.TokenRetAmzJson;
 import com.raycos.raycosdatacenterapi.authorize.AmzTokenService;
 import com.raycos.raycosdatacenterapi.mapper.TbAmzTokenMapper;
 import lombok.extern.slf4j.Slf4j;

+ 10 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/common/databaselock/LockService.java

@@ -0,0 +1,10 @@
+package com.raycos.raycosdatacenterapi.common.databaselock;
+
+import com.raycos.raycoscommon.Internal.datacenterapi.Lock;
+
+public interface LockService {
+
+    boolean lock(Lock lock);
+
+    boolean unlock(Lock lock);
+}

+ 62 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/common/databaselock/impl/LockServiceImpl.java

@@ -0,0 +1,62 @@
+package com.raycos.raycosdatacenterapi.common.databaselock.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.raycos.raycoscommon.Internal.datacenterapi.Lock;
+import com.raycos.raycosdatacenterapi.common.databaselock.LockService;
+import com.raycos.raycosdatacenterapi.mapper.LockMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+
+@Slf4j
+@Service
+public class LockServiceImpl implements LockService {
+
+
+    @Autowired
+    private LockMapper lockMapper;
+
+
+    @Override
+    public boolean lock(Lock lock) {
+        try {
+            lockMapper.insert(lock);
+        } catch (Exception e) {
+            log.error(" LockService 加锁异常 lock信息=> " + JSONObject.toJSONString(lock), e);
+            return false;
+        }
+        return true;
+    }
+
+
+    public void lockInterruptibly() throws InterruptedException {
+
+    }
+
+
+    public boolean tryLock() {
+        return false;
+    }
+
+
+    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
+        return false;
+    }
+
+    @Override
+    public boolean unlock(Lock lock) {
+        try {
+            lockMapper.deleteById(lock);
+        } catch (Exception e) {
+            log.error(" LockService 解锁异常  lock信息=> " + JSONObject.toJSONString(lock), e);
+            return false;
+        }
+        return true;
+
+    }
+
+
+}

+ 34 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/RabbitMQConfig.java

@@ -0,0 +1,34 @@
+package com.raycos.raycosdatacenterapi.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * 创建一个 RabbitMQ 配置类来定义队列、交换机和绑定关系:
+ */
+@Configuration
+public class RabbitMQConfig {
+    public static final String AMZ_PULL_ORDER_QUEUE = "AMZ_PULL_ORDER_QUEUE";
+    public static final String AMZ_PULL_ORDER_TOPICEXCHANGE = "AMZ_PULL_ORDER_TOPICEXCHANGE";
+    public static final String AMZ_PULL_ORDER_ROUTINGKEY = "AMZ_PULL_ORDER_ROUTINGKEY";
+
+    @Bean
+    public Queue myQueue() {
+        return new Queue(AMZ_PULL_ORDER_QUEUE, false);
+    }
+
+    @Bean
+    public TopicExchange exchange() {
+        return new TopicExchange(AMZ_PULL_ORDER_TOPICEXCHANGE);
+    }
+
+    @Bean
+    public Binding binding(Queue queue, TopicExchange exchange) {
+        return BindingBuilder.bind(queue).to(exchange).with(AMZ_PULL_ORDER_ROUTINGKEY);
+    }
+}

+ 32 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/attach/AmzPullOrderConsumer.java

@@ -0,0 +1,32 @@
+package com.raycos.raycosdatacenterapi.config.attach;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.amzorder.AmzPullOrderService;
+import com.raycos.raycosdatacenterapi.config.RabbitMQConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+@Slf4j
+@Component
+public class AmzPullOrderConsumer {
+
+    @Autowired
+    private AmzPullOrderService amzPullOrderService;
+
+    @RabbitListener(queues = RabbitMQConfig.AMZ_PULL_ORDER_QUEUE)
+    public void receiveMessage(String message) {
+        log.info(" 来了老弟  Received message: " + message);
+        try {
+            TbAmzPullOrderTask task = JSONObject.parseObject(message, TbAmzPullOrderTask.class);
+            amzPullOrderService.sendGetOrders( task );
+
+        } catch (Exception e) {
+             log.error( "亚马逊拉单消费 异常 " , e);
+        }
+
+    }
+}

+ 37 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/config/attach/SendAmzPullOrderMsg.java

@@ -0,0 +1,37 @@
+package com.raycos.raycosdatacenterapi.config.attach;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.config.RabbitMQConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.AmqpException;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 发送亚马逊拉单  MQ任务信息
+ */
+@Service
+@Slf4j
+public class SendAmzPullOrderMsg {
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    /**
+     * 消息发送
+     * 消息发送失败
+     *
+     * @param task
+     */
+    public void sendMessage(TbAmzPullOrderTask task) {
+        String message = JSONObject.toJSONString(task);
+        try {
+            rabbitTemplate.convertAndSend(RabbitMQConfig.AMZ_PULL_ORDER_TOPICEXCHANGE, RabbitMQConfig.AMZ_PULL_ORDER_ROUTINGKEY, message);
+        } catch (AmqpException e) {
+            log.info("亚马逊拉单任务发送MQ信息失败=>  " + message);
+        }
+
+    }
+}

+ 7 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzOrderMapper.java

@@ -0,0 +1,7 @@
+package com.raycos.raycosdatacenterapi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrder;
+
+public interface AmzOrderMapper extends BaseMapper<TbAmzOrder> {
+}

+ 7 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzOrderOriginalMapper.java

@@ -0,0 +1,7 @@
+package com.raycos.raycosdatacenterapi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzOrderOriginal;
+
+public interface AmzOrderOriginalMapper extends BaseMapper<TbAmzOrderOriginal> {
+}

+ 21 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/AmzPullOrderTaskMapper.java

@@ -0,0 +1,21 @@
+package com.raycos.raycosdatacenterapi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface AmzPullOrderTaskMapper extends BaseMapper<TbAmzPullOrderTask> {
+
+
+    @Select("   select  id,company_id,store_id,last_operation_time,retry_count  \n" +
+            "   from  tb_amz_pull_order_task                                    \n" +
+            "   where   last_operation_time < #{lastOperationTime} and          \n" +
+            "   retry_count = #{retryCount}  ")
+    List<TbAmzPullOrderTask> findPullTask(@Param("lastOperationTime") Long lastOperationTime,
+                                          @Param("retryCount") Byte retryCount);
+
+
+}

+ 9 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/mapper/LockMapper.java

@@ -0,0 +1,9 @@
+package com.raycos.raycosdatacenterapi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.raycos.raycoscommon.Internal.datacenterapi.Lock;
+
+public interface LockMapper extends BaseMapper<Lock> {
+
+
+}

+ 113 - 0
raycos_datacenter_api/src/main/java/com/raycos/raycosdatacenterapi/scheduledtasks/SearchOrderPullTask.java

@@ -0,0 +1,113 @@
+package com.raycos.raycosdatacenterapi.scheduledtasks;
+
+
+import com.raycos.raycoscommon.Internal.datacenterapi.Lock;
+import com.raycos.raycoscommon.Internal.datacenterapi.TbAmzPullOrderTask;
+import com.raycos.raycosdatacenterapi.amzorder.AmzPullOrderTaskService;
+import com.raycos.raycosdatacenterapi.common.databaselock.LockService;
+import com.raycos.raycosdatacenterapi.config.attach.SendAmzPullOrderMsg;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.Instant;
+import java.util.List;
+
+@Component
+@Slf4j
+public class SearchOrderPullTask {
+
+
+    @Autowired
+    private SendAmzPullOrderMsg sendAmzPullOrderMsg;
+    @Autowired
+    private LockService lockService;
+    @Autowired
+    private AmzPullOrderTaskService amzPullOrderTaskService;
+
+    /**
+     * 数据库锁key后缀
+     */
+    private final String LOCKKEYSUFFIX = "PULL_TASK";
+    /**
+     * 数据库锁 描述
+     */
+    private final String LOCKDESCRIBE = "亚马逊拉取订单任务_发送拉单任务到MQ中";
+
+
+    /**
+     * 运行中标识
+     */
+    private boolean RUNFLAG = false;
+
+    // 1 分钟拉去一次
+    @Scheduled(fixedRate = 60 * 1000)
+    public void runTask() {
+        try {
+            if (!RUNFLAG) {
+                sendOrderPullTask();
+            }
+
+        } catch (Exception e) {
+            log.error("   异常", e);
+        }
+
+    }
+
+
+    /**
+     * 发送拉单任务到 MQ 队列中
+     *
+     * @throws Exception
+     */
+    public void sendOrderPullTask() throws Exception {
+
+        // 查询 最后操作时间 小于当前时间 并且 重试次数 为零的 任务
+        // 获取当前时间戳
+        long second = Instant.now().getEpochSecond();
+        TbAmzPullOrderTask task = new TbAmzPullOrderTask();
+        task.setRetryCount((byte) 0);
+        task.setLastOperationTime(second);
+        List<TbAmzPullOrderTask> list = amzPullOrderTaskService.findPullTask(task);
+
+        for (TbAmzPullOrderTask apo : list) {
+
+            // 加锁 防止消息重复投递 lockKey =  companyId + storeId + "PULL_TASK"
+            String lockKey = apo.getCompanyId() + apo.getStoreId() + LOCKKEYSUFFIX;
+            Lock lock = new Lock();
+            lock.setLockKey(lockKey);
+            lock.setDescribe(LOCKDESCRIBE);
+
+            if (!lockService.lock(lock)) {
+                // 加锁失败证明 任务已经添加到拉单队列中了
+                continue;
+            }
+
+            // 更行当前任务的重试次数为1
+            this.updateRetryTimes(apo);
+
+            // 发送 MQ
+            sendAmzPullOrderMsg.sendMessage(apo);
+
+        }
+
+
+    }
+
+    /**
+     * 更新 亚马逊拉取订单任务  执行次数为1
+     *
+     * @param apo
+     * @throws Exception
+     */
+    private void updateRetryTimes(TbAmzPullOrderTask apo) throws Exception {
+
+        TbAmzPullOrderTask apot = new TbAmzPullOrderTask();
+        apot.setId(apo.getId());
+        apot.setRetryCount((byte) 1);
+        amzPullOrderTaskService.editById(apot);
+    }
+
+
+}

+ 11 - 4
raycos_datacenter_api/src/main/resources/application.yml

@@ -10,8 +10,8 @@ spring:
         username: 'nacos'
         password: 'nacos'
         server-addr: 127.0.0.1:8848
-#        namespace: public # 可选,‌命名空间ID,‌用于多环境隔离
-#        group: DEFAULT_GROUP # 可选,‌默认分组
+    #        namespace: public # 可选,‌命名空间ID,‌用于多环境隔离
+    #        group: DEFAULT_GROUP # 可选,‌默认分组
     loadbalancer:
       nacos:
         enabled: true
@@ -25,9 +25,9 @@ spring:
   profiles:
     active: dev
 
-#  数据库连接池
+  #  数据库连接池
 
-# 数据源类型设置为Druid
+  # 数据源类型设置为Druid
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     url: jdbc:mysql://120.46.190.49:3306/raycos_erp
@@ -64,3 +64,10 @@ spring:
           slow-sql-millis: 1000
 
 
+  rabbitmq:
+    host: 127.0.0.1
+    port: 5672
+    username: guest
+    password: guest
+    virtual-host: /
+