31 次代碼提交 3be2feec96 ... 9f6089fb0d

作者 SHA1 備註 提交日期
  李学强 9f6089fb0d 网关更新 5 月之前
  李学强 a7bc60e803 .. 5 月之前
  李学强 197f8b7d33 订单推送 5 月之前
  luofuwen 7f5140e2f2 修改打包 6 月之前
  luofuwen b819ecb61d 镜像 TAG 修改逻辑 6 月之前
  luofuwen dc8e5845dc 优化自动发布 8 月之前
  luofuwen fd73d46501 来号吧迁移测试环境 8 月之前
  李学强 05de071485 来号吧账单导入 10 月之前
  李学强 ea62ff5d12 账单周期导入 10 月之前
  李学强 c9817a10bc 物流查询优化返回信息 11 月之前
  李学强 0bc180597a 更新物流单号接口对接 11 月之前
  李学强 8b5f737228 订单异常状态取消 11 月之前
  李学强 6a2d47d6b1 订单状态 11 月之前
  李学强 6c965e6d17 订单状态查询 11 月之前
  luofuwen 442818635d 修改 drone 打包文件 11 月之前
  李学强 31507c6fbf 更新定时任务 11 月之前
  李学强 d792081c40 正式参数 11 月之前
  李学强 37a8c06d87 nacos密码 11 月之前
  李学强 63c7a2f19a 新通道 11 月之前
  李学强 9610c7e76b 切换通道 11 月之前
  李学强 09b3e2e5a2 .. 1 年之前
  李学强 e59cb91dc4 首冲判断 1 年之前
  李学强 fdae98ebb4 首冲 1 年之前
  李学强 87df08932e 激活条件 1 年之前
  李学强 d2c64e2645 卡激活不判断首充 1 年之前
  mac 19197ee176 修复已支付订单未退款一直推送的问题 1 年之前
  mac a694d07238 推送最大次数优化 1 年之前
  mac c020b61d8b basic上线 1 年之前
  mac d17e810655 定时任务上线 1 年之前
  mac 103892f9ab system上线 1 年之前
  mac 74c96231b9 system上线 1 年之前
共有 40 個文件被更改,包括 2354 次插入996 次删除
  1. 706 788
      .drone.yml
  2. 20 1
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/ChannelCodeEnum.java
  3. 61 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderInfoNotify.java
  4. 2 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PackagesReq.java
  5. 21 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWOrderCancelReq.java
  6. 34 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWOrderSubmitReq.java
  7. 25 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWPreNumbersReq.java
  8. 18 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWQueryFirstOrderReq.java
  9. 20 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWQueryOrderReq.java
  10. 4 4
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/admin/bill/BillExcelVO.java
  11. 2 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/AreaRes.java
  12. 17 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/yiwang/YWCommRes.java
  13. 6 6
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java
  14. 102 8
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TYBasicService.java
  15. 302 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/YWBasicService.java
  16. 144 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/YiWangService.java
  17. 92 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/utils/AESUtil.java
  18. 56 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/utils/RSAUtil.java
  19. 1 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysGoodsController.java
  20. 2 2
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysOrderController.java
  21. 28 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/cusmoter/callback/CallbackController.java
  22. 1 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLhbBindQueueListener.java
  23. 39 39
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLhbOrderQueueListener.java
  24. 3 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbAreaService.java
  25. 8 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderService.java
  26. 12 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java
  27. 7 2
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java
  28. 3 4
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderRechargeServiceImpl.java
  29. 80 120
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderServiceImpl.java
  30. 7 4
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LlbUserServiceImpl.java
  31. 2 2
      lhb-basic/lhb-basic-biz/src/main/resources/application-prod.yml
  32. 2 2
      lhb-basic/lhb-basic-biz/src/main/resources/application-test.yml
  33. 506 0
      lhb-basic/lhb-basic-biz/src/test/java/com/kxs/lhb/basic/biz/testApi.java
  34. 10 0
      lhb-gateway/src/main/java/com/kxs/gateway/api/filter/RequestDecoderFilter.java
  35. 2 2
      lhb-gateway/src/main/resources/application-test.yml
  36. 2 2
      lhb-quartz/src/main/resources/application-prod.yml
  37. 2 2
      lhb-quartz/src/main/resources/application-test.yml
  38. 2 2
      lhb-system/lhb-system-biz/src/main/resources/application-prod.yml
  39. 2 2
      lhb-system/lhb-system-biz/src/main/resources/application-test.yml
  40. 1 1
      pom.xml

+ 706 - 788
.drone.yml

@@ -1,949 +1,867 @@
+#########################################################################################################
+# 1.打包构建release-lhb-gateway
 kind: pipeline
 type: docker
-name: lhb-gateway-prod
+name: release-lhb-gateway
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
       path: /home/ABServer/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/config/mvn
+  - name: build-artifacts
     host:
-      path: /lhb-gateway
+      path: /home/ABServer/webroot/release-lhb-gateway
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P prod
-      - cp /drone/src/lhb-gateway/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-gateway/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-gateway/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-gateway # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-gateway-a-host
-      username:
-        from_secret: lhb-gateway-username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-gateway/*.jar
-        - /lhb-gateway/lib
-        - /lhb-gateway/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-gateway-a-host
-      username:
-        from_secret: lhb-gateway-username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - cp -r /home/ABServer/deploy-ready/lhb-gateway /home/ABServer/webroot/
-        - docker restart lhb-gateway
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
-  - name: scp-project-b
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-gateway # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-gateway-b-host
-      username:
-        from_secret: lhb-gateway-username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-gateway/*.jar
-        - /lhb-gateway/lib
-        - /lhb-gateway/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project-b
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-gateway-b-host
-      username:
-        from_secret: lhb-gateway-username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - cp -r /home/ABServer/deploy-ready/lhb-gateway /home/ABServer/webroot/
-        - docker restart lhb-gateway
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物验证 ====="
+      - ls -l lhb-gateway/target/*.jar
+      - '[ -d lhb-gateway/target/lib ] || exit 1'
+      - '[ -d lhb-gateway/target/config ] || exit 1'
+
+  # 阶段2: 准备Docker上下文(关键修正部分)
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-gateway/target/*.jar /context/
+      - cp -rv lhb-gateway/target/lib /context/
+      - cp -rv lhb-gateway/target/config /context/
+      - cp /dockerfiles/template-prod.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/1024m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/1024m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-gateway/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - ls -alR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - cd /context
+      - TAG=prod-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - docker build -t "harbor.kexiaoshuang.com/laihaoba/lhb-gateway:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/laihaoba/lhb-gateway:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/laihaoba/lhb-gateway:$TAG"
 
 trigger:
-  branch:
-    - release-gateway
-  event:
-    - push
-  #排除合并请求
-  exclude:
-    - ref: refs/pull/*
+  event: [ push ]
+  branch: [ release-gateway ]
+
+#########################################################################################################
+#2.打包构建release-lhb-quartz
 
 ---
 kind: pipeline
 type: docker
-name: lhb-quartz-prod
+name: release-lhb-quartz
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
       path: /home/ABServer/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/config/mvn
+  - name: build-artifacts
     host:
-      path: /lhb-quartz
+      path: /home/ABServer/webroot/release-lhb-quartz
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P prod
-      - cp /drone/src/lhb-quartz/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-quartz/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-quartz/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-quartz # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-gateway-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-quartz/*.jar
-        - /lhb-quartz/lib
-        - /lhb-quartz/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-gateway-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-gateway-pwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-quartz/*
-        - cp -r /home/ABServer/deploy-ready/lhb-quartz /home/ABServer/webroot/
-        - docker restart lhb-quartz
-        - rm -rf /home/ABServer/deploy-ready/lhb-quartz/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物验证 ====="
+      - ls -l lhb-quartz/target/*.jar
+      - '[ -d lhb-quartz/target/lib ] || exit 1'
+      - '[ -d lhb-quartz/target/config ] || exit 1'
+
+  # 阶段2: 准备Docker上下文(关键修正部分)
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-quartz/target/*.jar /context/
+      - cp -rv lhb-quartz/target/lib /context/
+      - cp -rv lhb-quartz/target/config /context/
+      - cp /dockerfiles/template-prod.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-quartz/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - ls -alR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - cd /context
+      - TAG=prod-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - docker build -t "harbor.kexiaoshuang.com/laihaoba/lhb-quartz:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/laihaoba/lhb-quartz:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/laihaoba/lhb-quartz:$TAG"
 
 trigger:
-  branch:
-    - release-quartz
-  event:
-    - push
-  #排除合并请求
-  exclude:
-    - ref: refs/pull/*
+  event: [ push ]
+  branch: [ release-quartz ]
+
+###########################################################################################################
+# 3.打包构建release-lhb-system
 
 ---
 kind: pipeline
 type: docker
-name: lhb-system-prod
+name: release-lhb-system
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+# 定义所有 Volume 映射
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
       path: /home/ABServer/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/config/mvn
+  - name: build-artifacts  # 构建产物临时目录
+    host:
+      path: /home/ABServer/webroot/release-lhb-system
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/config/docker
+  - name: timezone
     host:
-      path: /lhb-system
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven 构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P prod
-      - cp /drone/src/lhb-system/lhb-system-biz/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-system # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-system-basic-a-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-system/*.jar
-        - /lhb-system/lib
-        - /lhb-system/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-system-basic-a-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-system-biz&ip=172.27.251.56&port=8060&weight=0'
-        - sleep 25s
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-system/*
-        - cp -r /home/ABServer/deploy-ready/lhb-system /home/ABServer/webroot/
-        - docker restart lhb-system
-        - rm -rf /home/ABServer/deploy-ready/lhb-system/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
-  - name: scp-project-b
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-system # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-system-basic-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-system/*.jar
-        - /lhb-system/lib
-        - /lhb-system/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project-b
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-system-basic-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 5m
-      script:
-        - echo ====开始部署=======
-        - sleep 60s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-system-biz&ip=172.27.251.56&port=8060&weight=1'
-        - sleep 1s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-system-biz&ip=172.27.251.65&port=8060&weight=0'
-        - sleep 25s
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-system/*
-        - cp -r /home/ABServer/deploy-ready/lhb-system /home/ABServer/webroot/
-        - docker restart lhb-system
-        - rm -rf /home/ABServer/deploy-ready/lhb-system/*
-        # - docker restart nodeServer1
-        - sleep 60s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-system-biz&ip=172.27.251.65&port=8060&weight=1'
-        - echo ====部署成功=======
+      - echo "===== 构建产物生成验证 ====="
+      - ls -l lhb-system/lhb-system-biz/target/*.jar
+      - '[ -d lhb-system/lhb-system-biz/target/lib ] || exit 1'
+      - '[ -d lhb-system/lhb-system-biz/target/config ] || exit 1'
+
+  # 阶段2: 准备 Docker 构建上下文
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-system/lhb-system-biz/target/*.jar /context/
+      - cp -rv lhb-system/lhb-system-biz/target/lib /context/
+      - cp -rv lhb-system/lhb-system-biz/target/config /context/
+      - cp /dockerfiles/template-biz-prod.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-system/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - echo "===== 构建上下文文件列表 ====="
+      - ls -laR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - cd /context
+      - TAG=prod-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - docker build -t "harbor.kexiaoshuang.com/laihaoba/lhb-system:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/laihaoba/lhb-system:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/laihaoba/lhb-system:$TAG"
 
 trigger:
-  branch:
-    - release-system
-  event:
-    - push
-  #排除合并请求
-  exclude:
-    - ref: refs/pull/*
+  event: [ push ]
+  branch: [ release-system ]
+
+
+##########################################################################################################
+# 4.打包构建release-lhb-basic
 
 ---
 kind: pipeline
 type: docker
-name: lhb-basic-prod
+name: release-lhb-basic
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+# 定义所有 Volume 映射
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
       path: /home/ABServer/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/config/mvn
+  - name: build-artifacts  # 构建产物临时目录
+    host:
+      path: /home/ABServer/webroot/release-lhb-basic
+  - name: dockerfile-source
     host:
-      path: /lhb-basic
+      path: /home/ABServer/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven 构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P prod
-      - cp /drone/src/lhb-basic/lhb-basic-biz/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-basic/lhb-basic-biz/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-basic/lhb-basic-biz/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-basic # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-system-basic-a-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-basic/*.jar
-        - /lhb-basic/lib
-        - /lhb-basic/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-system-basic-a-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 5m
-      script:
-        - echo ====开始部署=======
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-basic-biz&ip=172.27.251.56&port=8888&weight=0'
-        - sleep 25s
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-basic/*
-        - cp -r /home/ABServer/deploy-ready/lhb-basic /home/ABServer/webroot/
-        - docker restart lhb-basic
-        - rm -rf /home/ABServer/deploy-ready/lhb-basic/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
-  - name: scp-project-b
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-basic # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: lhb-system-basic-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-basic/*.jar
-        - /lhb-basic/lib
-        - /lhb-basic/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project-b
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: lhb-system-basic-b-host
-      username:
-        from_secret: username
-      password:
-        from_secret: lhb-pwd
-      port: 22
-      command_timeout: 5m
-      script:
-        - echo ====开始部署=======
-        - sleep 60s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-basic-biz&ip=172.27.251.56&port=8888&weight=1'
-        - sleep 1s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-basic-biz&ip=172.27.251.65&port=8888&weight=0'
-        - sleep 25s
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-basic/*
-        - cp -r /home/ABServer/deploy-ready/lhb-basic /home/ABServer/webroot/
-        - docker restart lhb-basic
-        - rm -rf /home/ABServer/deploy-ready/lhb-basic/*
-        - sleep 60s
-        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-basic-biz&ip=172.27.251.65&port=8888&weight=1'
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物生成验证 ====="
+      - ls -l lhb-basic/lhb-basic-biz/target/*.jar
+      - '[ -d lhb-basic/lhb-basic-biz/target/lib ] || exit 1'
+      - '[ -d lhb-basic/lhb-basic-biz/target/config ] || exit 1'
+
+  # 阶段2: 准备 Docker 构建上下文
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-basic/lhb-basic-biz/target/*.jar /context/
+      - cp -rv lhb-basic/lhb-basic-biz/target/lib /context/
+      - cp -rv lhb-basic/lhb-basic-biz/target/config /context/
+      - cp /dockerfiles/template-biz-prod.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-basic/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - echo "===== 构建上下文文件列表 ====="
+      - ls -laR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - cd /context
+      - TAG=prod-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - docker build -t "harbor.kexiaoshuang.com/laihaoba/lhb-basic:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/laihaoba/lhb-basic:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/laihaoba/lhb-basic:$TAG"
 
 trigger:
-  branch:
-    - release-basic
-  event:
-    - push
-  #排除合并请求
-  exclude:
-    - ref: refs/pull/*
-
+  event: [ push ]
+  branch: [ release-basic ]
+#############################################################################################
+#                                                                                           #
+#                                                                                           #
+#                                                                                           #
+#                                                                                           #
+#                                                                                           #
+#############################################################################################
+# 测试分支打包
+# 1.打包构建test-lhb-gateway
 ---
 kind: pipeline
 type: docker
-name: lhb-gateway-test
+name: test-lhb-gateway
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+# 定义所有Volume映射
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
-      path: /home/ABServer/cache/mvn_repo
+      path: /home/ABServer/drone/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/drone/config/mvn
+  - name: build-artifacts
     host:
-      path: /lhb-gateway
+      path: /home/ABServer/drone/webroot/test-lhb-gateway
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/drone/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
+  - name: delpoyment
+    host:
+      path: /home/ABServer/drone/config/shell
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P test
-      - cp /drone/src/lhb-gateway/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-gateway/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-gateway/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-gateway # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-gateway/*.jar
-        - /lhb-gateway/lib
-        - /lhb-gateway/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - cp -r /home/ABServer/deploy-ready/lhb-gateway /home/ABServer/webroot/
-        - docker stop lhb-gateway && docker rm lhb-gateway && docker-compose up -d lhb-gateway
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物验证 ====="
+      - ls -l lhb-gateway/target/*.jar
+      - '[ -d lhb-gateway/target/lib ] || exit 1'
+      - '[ -d lhb-gateway/target/config ] || exit 1'
+
+  # 阶段2: 准备Docker上下文
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-gateway/target/*.jar /context/
+      - cp -rv lhb-gateway/target/lib /context/
+      - cp -rv lhb-gateway/target/config /context/
+      - cp /dockerfiles/template-test.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-gateway/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - ls -alR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+      - name: delpoyment
+        path: /home
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - cd /context
+      - TAG=test-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - echo "$TAG" > /home/TAG.txt
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - docker build -t "harbor.kexiaoshuang.com/test/lhb-gateway:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/test/lhb-gateway:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/test/lhb-gateway:$TAG"
+
+  # 阶段四:测试环境部署服务
+  - name: trigger-deploy
+    image: curlimages/curl:latest
+    depends_on: [ docker-build-push ]
+    volumes:
+      - name: delpoyment
+        path: /shared
+    commands:
+      - TAG=$(cat /shared/TAG.txt)
+      - echo "TAG=$TAG"
+      - cd /shared
+      - sh /shared/trigger-deploy.sh $TAG lhb-gateway laihaoba
+
 
 trigger:
-  branch:
-    include:
-      - test-gateway
-  event:
-    include:
-      - pull_request
-      - push
+  event: [ push ]
+  branch: [ test-gateway ]
+
+#########################################################################################################
+#2.打包构建test-lhb-quartz
 
 ---
 kind: pipeline
 type: docker
-name: lhb-quartz-test
+name: test-lhb-quartz
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
-      path: /home/ABServer/cache/mvn_repo
+      path: /home/ABServer/drone/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/drone/config/mvn
+  - name: build-artifacts
+    host:
+      path: /home/ABServer/drone/webroot/test-lhb-quartz
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/drone/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
     host:
-      path: /lhb-quartz
+      path: /var/run/docker.sock
+  - name: delpoyment
+    host:
+      path: /home/ABServer/drone/config/shell
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P test
-      - cp /drone/src/lhb-quartz/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-quartz/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-quartz/target/config /drone/src/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-quartz # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-quartz/*.jar
-        - /lhb-quartz/lib
-        - /lhb-quartz/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-quartz/*
-        - cp -r /home/ABServer/deploy-ready/lhb-quartz /home/ABServer/webroot/
-        - docker restart lhb-quartz
-        - rm -rf /home/ABServer/deploy-ready/lhb-quartz/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物验证 ====="
+      - ls -l lhb-quartz/target/*.jar
+      - '[ -d lhb-quartz/target/lib ] || exit 1'
+      - '[ -d lhb-quartz/target/config ] || exit 1'
+
+  # 阶段2: 准备Docker上下文(关键修正部分)
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-quartz/target/*.jar /context/
+      - cp -rv lhb-quartz/target/lib /context/
+      - cp -rv lhb-quartz/target/config /context/
+      - cp /dockerfiles/template-test.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/256m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/256m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-quartz/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - echo "=============构建上下文文件列表==============="
+      - ls -alR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+      - name: delpoyment
+        path: /home
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - cd /context
+      - TAG=test-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - echo "$TAG" > /home/TAG.txt
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - docker build -t "harbor.kexiaoshuang.com/test/lhb-quartz:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/test/lhb-quartz:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/test/lhb-quartz:$TAG"
+
+  # 阶段四:测试环境部署服务
+  - name: trigger-deploy
+    image: curlimages/curl:latest
+    depends_on: [ docker-build-push ]
+    volumes:
+      - name: delpoyment
+        path: /shared
+    commands:
+      - TAG=$(cat /shared/TAG.txt)
+      - echo "TAG=$TAG"
+      - cd /shared
+      - sh /shared/trigger-deploy.sh $TAG lhb-quartz laihaoba
+
 
 trigger:
-  branch:
-    include:
-      - test-quartz
-  event:
-    include:
-      - pull_request
-      - push
+  event: [ push ]
+  branch: [ test-quartz ]
 
+###########################################################################################################
+# 3.打包构建test-lhb-system
 ---
 kind: pipeline
 type: docker
-name: lhb-system-test
+name: test-lhb-system
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+# 定义所有 Volume 映射
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
-      path: /home/ABServer/cache/mvn_repo
+      path: /home/ABServer/drone/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/drone/config/mvn
+  - name: build-artifacts  # 构建产物临时目录
+    host:
+      path: /home/ABServer/drone/webroot/test-lhb-system
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/drone/config/docker
+  - name: timezone
+    host:
+      path: /etc/localtime
+  - name: docker-socket
     host:
-      path: /lhb-system
+      path: /var/run/docker.sock
+  - name: delpoyment
+    host:
+      path: /home/ABServer/drone/config/shell
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven 构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/lhb/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/lhb/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P test
-      - cp /drone/src/lhb-system/lhb-system-biz/target/*.jar /drone/src/lhb/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/lib /drone/src/lhb/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/config /drone/src/lhb/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-system # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-system/*.jar
-        - /lhb-system/lib
-        - /lhb-system/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-system/*
-        - cp -r /home/ABServer/deploy-ready/lhb-system /home/ABServer/webroot/
-        - docker stop lhb-system && docker rm lhb-system && docker-compose up -d lhb-system
-        - rm -rf /home/ABServer/deploy-ready/lhb-system/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物生成验证 ====="
+      - ls -l lhb-system/lhb-system-biz/target/*.jar
+      - '[ -d lhb-system/lhb-system-biz/target/lib ] || exit 1'
+      - '[ -d lhb-system/lhb-system-biz/target/config ] || exit 1'
+
+  # 阶段2: 准备 Docker 构建上下文
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-system/lhb-system-biz/target/*.jar /context/
+      - cp -rv lhb-system/lhb-system-biz/target/lib /context/
+      - cp -rv lhb-system/lhb-system-biz/target/config /context/
+      - cp /dockerfiles/template-biz-test.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-system/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - echo "===== 构建上下文文件列表 ====="
+      - ls -laR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+      - name: delpoyment
+        path: /home
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - cd /context
+      - TAG=test-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - echo "$TAG" > /home/TAG.txt
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - docker build -t "harbor.kexiaoshuang.com/test/lhb-system:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/test/lhb-system:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/test/lhb-system:$TAG"
+
+  # 阶段四:测试环境部署服务
+  - name: trigger-deploy
+    image: curlimages/curl:latest
+    depends_on: [ docker-build-push ]
+    volumes:
+      - name: delpoyment
+        path: /shared
+    commands:
+      - TAG=$(cat /shared/TAG.txt)
+      - echo "TAG=$TAG"
+      - cd /shared
+      - sh /shared/trigger-deploy.sh $TAG lhb-system laihaoba 
 
 trigger:
-  branch:
-    include:
-      - test-system
-  event:
-    include:
-      - pull_request
-      - push
+  event: [ push ]
+  branch: [ test-system ]
+
+
+##########################################################################################################
+# 4.打包构建test-lhb-basic
 
 ---
 kind: pipeline
 type: docker
-name: lhb-basic-test
+name: test-lhb-basic
 
-volumes: # 声明数据卷
-  - name: mvn_repo # 数据卷名称
-    # Host Volume, 挂载到宿主机上的卷轴
+# 定义所有 Volume 映射
+volumes:
+  - name: mvn_repo
     host:
-      # 宿主机的绝对路径
-      path: /home/ABServer/cache/mvn_repo
+      path: /home/ABServer/drone/cache/mvn_repo
   - name: mvn_config
     host:
-      path: /home/ABServer/config/mvn/
-  - name: targetDir
+      path: /home/ABServer/drone/config/mvn
+  - name: build-artifacts  # 构建产物临时目录
+    host:
+      path: /home/ABServer/drone/webroot/test-lhb-basic
+  - name: dockerfile-source
+    host:
+      path: /home/ABServer/drone/config/docker
+  - name: timezone
     host:
-      path: /lhb-basic
+      path: /etc/localtime
+  - name: docker-socket
+    host:
+      path: /var/run/docker.sock
+  - name: delpoyment
+    host:
+      path: /home/ABServer/drone/config/shell
 
 clone:
-  disable: false # 启用代码拉取
+  disable: false
 
 steps:
+  # 阶段1: Maven 构建
   - name: build-project
     image: maven:3.9.4-amazoncorretto-17
     pull: if-not-exists
-    depends_on: [clone] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: mvn_repo # 数据卷名称
-        path: /usr/share/maven/repo # 容器内目录 绝对路径
-      - name: targetDir
-        path: /drone/src/lhb/dist/
+    volumes:
+      - name: mvn_repo
+        path: /usr/share/maven/repo
       - name: mvn_config
-        path: /usr/share/maven/conf/
-    commands: # 执行命令
-      - rm -rf /drone/src/lhb/dist/*
+        path: /usr/share/maven/conf
+    commands:
       - mvn clean package -Dmaven.test.skip=true -P test
-      - cp /drone/src/lhb-basic/lhb-basic-biz/target/*.jar /drone/src/lhb/dist/ && cp -r /drone/src/lhb-basic/lhb-basic-biz/target/lib /drone/src/lhb/dist/ && cp -r /drone/src/lhb-basic/lhb-basic-biz/target/config /drone/src/lhb/dist/ # 复制文件
-    when:
-      status:
-        - success # 当前步骤成功时执行
-  - name: scp-project
-    image: appleboy/drone-scp
-    pull: if-not-exists
-    depends_on: [build-project] # 依赖的步骤
-    volumes: # 挂载数据卷
-      - name: targetDir # 数据卷名称
-        path: /lhb-basic # 容器内目录 绝对路径
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      target: /home/ABServer/deploy-ready/
-      source:
-        - echo ====开始拷贝=======
-        - /lhb-basic/*.jar
-        - /lhb-basic/lib
-        - /lhb-basic/config
-        - echo ====结束拷贝=======
-      when:
-        status:
-          - success # 当前步骤成功时执行
-
-  - name: deploy-project
-    image: appleboy/drone-ssh
-    pull: if-not-exists
-    depends_on: [scp-project] # 依赖的步骤
-    settings:
-      host:
-        from_secret: host
-      username:
-        from_secret: username
-      password:
-        from_secret: userpwd
-      port: 22
-      command_timeout: 2m
-      script:
-        - echo ====开始部署=======
-        - cd /home/ABServer/
-        - rm -rf /home/ABServer/webroot/lhb-basic/*
-        - cp -r /home/ABServer/deploy-ready/lhb-basic /home/ABServer/webroot/
-        - docker stop lhb-basic && docker rm lhb-basic && docker-compose up -d lhb-basic
-        - rm -rf /home/ABServer/deploy-ready/lhb-basic/*
-        # - docker restart nodeServer1
-        - echo ====部署成功=======
+      - echo "===== 构建产物生成验证 ====="
+      - ls -l lhb-basic/lhb-basic-biz/target/*.jar
+      - '[ -d lhb-basic/lhb-basic-biz/target/lib ] || exit 1'
+      - '[ -d lhb-basic/lhb-basic-biz/target/config ] || exit 1'
+
+  # 阶段2: 准备 Docker 构建上下文
+  - name: prepare-docker-context
+    image: alpine:3.21.3
+    depends_on: [ build-project ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: dockerfile-source
+        path: /dockerfiles
+    commands:
+      - rm -rf /context/*
+      - cp -v lhb-basic/lhb-basic-biz/target/*.jar /context/
+      - cp -rv lhb-basic/lhb-basic-biz/target/lib /context/
+      - cp -rv lhb-basic/lhb-basic-biz/target/config /context/
+      - cp /dockerfiles/template-biz-test.dockerfile /context/Dockerfile
+      - sed -i 's/{Xms}/512m/g' /context/Dockerfile
+      - sed -i 's/{Xmx}/512m/g' /context/Dockerfile
+      - sed -i 's/{ImageName}/lhb-basic/g' /context/Dockerfile
+      - echo -e "*\n!*.jar\n!lib/\n!config/\n!Dockerfile" > /context/.dockerignore
+      - echo "===== 构建上下文文件列表 ====="
+      - ls -laR /context
+
+  # 阶段3: 构建并推送镜像
+  - name: docker-build-push
+    image: docker:24.0-cli
+    depends_on: [ prepare-docker-context ]
+    volumes:
+      - name: build-artifacts
+        path: /context
+      - name: timezone
+        path: /etc/localtime
+      - name: docker-socket
+        path: /var/run/docker.sock
+      - name: delpoyment
+        path: /home
+    environment:
+      HARBOR_USER:
+        from_secret: harbor_robot
+      HARBOR_PASS:
+        from_secret: harbor_token
+    commands:
+      - cd /context
+      - TAG=test-$(date +%Y%m%d%H%M%S)-${DRONE_COMMIT_SHA:0:10}
+      - echo "$TAG" > /home/TAG.txt
+      - docker login -u "$HARBOR_USER" -p "$HARBOR_PASS" harbor.kexiaoshuang.com
+      - docker build -t "harbor.kexiaoshuang.com/test/lhb-basic:$TAG" .
+      - docker push "harbor.kexiaoshuang.com/test/lhb-basic:$TAG"
+      - docker rmi "harbor.kexiaoshuang.com/test/lhb-basic:$TAG"
+
+  # 阶段四:测试环境部署服务
+  - name: trigger-deploy
+    image: curlimages/curl:latest
+    depends_on: [ docker-build-push ]
+    volumes:
+      - name: delpoyment
+        path: /shared
+    commands:
+      - TAG=$(cat /shared/TAG.txt)
+      - echo "TAG=$TAG"
+      - cd /shared
+      - sh /shared/trigger-deploy.sh $TAG lhb-basic laihaoba
 
 trigger:
-  branch:
-    include:
-      - test-basic
-  event:
-    include:
-      - pull_request
-      - push
+  event: [ push ]
+  branch: [ test-basic ]

+ 20 - 1
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/ChannelCodeEnum.java

@@ -17,7 +17,8 @@ import java.util.Map;
 @RequiredArgsConstructor
 public enum ChannelCodeEnum {
 
-    TY("TY", "统一");
+    TY("TY", "统一"),
+    YW("YW", "易网");
 
     private final String code;
 
@@ -34,4 +35,22 @@ public enum ChannelCodeEnum {
     public static ChannelCodeEnum getChannelCode(@NotBlank String ifCode) {
         return CHANNEL_CODE_ENUM_MAP.get(ifCode);
     }
+
+    /**
+     * 获取所有通道列表
+     */
+    public static ChannelCodeEnum[] getChannelList() {
+        return ChannelCodeEnum.values();
+    }
+
+
+    /**
+     * 主通道
+     *
+     * @return {@link ChannelCodeEnum }
+     */
+    public static ChannelCodeEnum getMainChannelCode() {
+
+        return ChannelCodeEnum.YW;
+    }
 }

+ 61 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderInfoNotify.java

@@ -0,0 +1,61 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Data;
+
+/**
+ * @author lixueqiang
+ */
+@Data
+public class OrderInfoNotify {
+
+    private OrderInfo orderInfo;
+    private OrderDetail orderDetail;
+    private OrderRecvAddr orderRecvAddr;
+    private OrderLogistics orderLogistics;
+
+
+    @Data
+    public static class OrderInfo {
+
+        private String orderId;
+        private String orderType;
+        private String orderStatus;
+        private String orderActProcState;
+        private String orderActId;
+        private String orderPreferentialSum;
+        private String orderPaySum;
+        private String createTime;
+        private String finishTime;
+        private String userId;
+        private String userName;
+        private String payStatus;
+        private String payWay;
+        private String phone;
+        private String agentPrivateCode;
+    }
+
+    @Data
+    public static class OrderDetail{
+        private String goodsName;
+        private String goodsDesc;
+    }
+
+    @Data
+    public static class  OrderRecvAddr{
+        private String receiveName;
+        private String receiveCountry;
+        private String receiveProvince;
+        private String receiveCity;
+        private String receiveAddress;
+        private String receiveMobile;
+        private String receiveCounty;
+    }
+
+    @Data
+    public static class OrderLogistics{
+        private String logisticsName;
+        private String logisticsNum;
+
+    }
+}
+

+ 2 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PackagesReq.java

@@ -19,4 +19,6 @@ public class PackagesReq extends TyCommonReq{
 
     private String areaCode;
 
+    private String typeId;
+
 }

+ 21 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWOrderCancelReq.java

@@ -0,0 +1,21 @@
+package com.kxs.lhb.basic.api.dto.yiyang;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 取消订单API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class YWOrderCancelReq{
+
+    private String orderId;
+    private String returnCause;
+    private String applyPerson;
+    private String returnCauseType;
+
+}

+ 34 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWOrderSubmitReq.java

@@ -0,0 +1,34 @@
+package com.kxs.lhb.basic.api.dto.yiyang;
+
+import com.kxs.lhb.basic.api.dto.tongyi.TyCommonReq;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 提交订单API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class YWOrderSubmitReq {
+
+    private String seqId;
+    private String orderType = "15";
+    private String channelId = "SHENGFEN";
+    private String offerCodes;
+    private String payMoney;
+    private String number;
+    private String custName;
+    private String idenNr;
+    private String contNumber;
+    private String regionId;
+    private String receiveName;
+    private String receiveMobile;
+    private String area;
+    private String receiveAddress;
+    private Boolean preNumber;
+
+
+}

+ 25 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWPreNumbersReq.java

@@ -0,0 +1,25 @@
+package com.kxs.lhb.basic.api.dto.yiyang;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 选号预占接口API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class YWPreNumbersReq{
+
+    private String accessNum;
+    private String custCardNo;
+    private String occupyType;
+    /**
+     * 地区编码,市级
+     */
+    private String regionId;
+
+
+}

+ 18 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWQueryFirstOrderReq.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.api.dto.yiyang;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 首充结果查询接口
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class YWQueryFirstOrderReq {
+
+    private String phoneNumber;
+
+}

+ 20 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/yiyang/YWQueryOrderReq.java

@@ -0,0 +1,20 @@
+package com.kxs.lhb.basic.api.dto.yiyang;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 查询订单状态
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class YWQueryOrderReq {
+
+    private String orderId;
+    private String phone;
+    private String userId;
+
+}

+ 4 - 4
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/admin/bill/BillExcelVO.java

@@ -41,10 +41,10 @@ public class BillExcelVO implements Serializable {
 	private String phone;
 
 	/**
-	 * 标准资费
+	 * 账单金额
 	 */
 	@NotBlank(message = "账单金额不能为空")
-	@ExcelProperty("标准资费")
+	@ExcelProperty("账单金额")
 	private String billFee;
 
 	/**
@@ -58,8 +58,8 @@ public class BillExcelVO implements Serializable {
 	 * 下单时间
 	 */
 	@NotNull(message = "账单月份不能为空")
-	@ExcelProperty("下单时间")
-	private LocalDateTime billMonth;
+	@ExcelProperty("账单日期")
+	private Integer billMonth;
 
 	/**
 	 * 套餐名称

+ 2 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/AreaRes.java

@@ -18,4 +18,6 @@ public class AreaRes {
     private String areaCode;
 
     private String areaName;
+
+    private String children;
 }

+ 17 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/yiwang/YWCommRes.java

@@ -0,0 +1,17 @@
+package com.kxs.lhb.basic.api.vo.yiwang;
+
+import lombok.Data;
+
+/**
+ * yi wang 通用响应
+ *
+ * @author 没秃顶的码农
+ * @date 2024-08-29
+ */
+@Data
+public class YWCommRes<T> {
+
+    private T result;
+    private String respCode;
+    private String respDesc;
+}

+ 6 - 6
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java

@@ -1,8 +1,8 @@
 package com.kxs.lhb.basic.biz.channel;
 
-import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
 import com.kxs.lhb.basic.api.dto.tongyi.*;
+import com.kxs.lhb.basic.api.model.LhbOrder;
 import com.kxs.lhb.basic.api.vo.tongyi.*;
 import org.springframework.core.Ordered;
 
@@ -35,17 +35,17 @@ public interface BasicService extends Ordered {
     /**
      * 选号预占接口
      */
-    void preNumber(PreNumbersReq req);
+    void preNumber(LhbOrder req);
 
     /**
      * 提交订单API
      */
-    String orderSubmit(OrderSubmitReq req);
+    String orderSubmit(LhbOrder orderSn);
 
     /**
      * 订单取消
      */
-    void orderCancel(OrderCancelReq req);
+    void orderCancel(String orderSn);
 
     /**
      * 查询物流
@@ -55,12 +55,12 @@ public interface BasicService extends Ordered {
     /**
      * 查询状态
      */
-    String queryStatus(QueryOrderReq req);
+    String queryStatus(LhbOrder order);
 
     /**
      * 首充查询API
      */
-    String queryFirstCharge(QueryOrderReq req);
+    void queryFirstCharge(LhbOrder req);
 
     /**
      * 查询分销充值记录

+ 102 - 8
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TYBasicService.java

@@ -2,14 +2,25 @@ package com.kxs.lhb.basic.biz.channel.tongyi;
 
 import cn.hutool.core.lang.TypeReference;
 import cn.hutool.json.JSONUtil;
-import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
+import com.kxs.lhb.basic.api.constant.enums.NotifyStatusEnum;
+import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
 import com.kxs.lhb.basic.api.dto.tongyi.*;
+import com.kxs.lhb.basic.api.model.*;
 import com.kxs.lhb.basic.api.vo.tongyi.*;
 import com.kxs.lhb.basic.biz.channel.BasicService;
+import com.kxs.lhb.basic.biz.service.*;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * TY API调用服务
@@ -18,8 +29,17 @@ import java.util.List;
  * @date 2024-10-18
  */
 @Service
+@RequiredArgsConstructor
 public class TYBasicService extends TongYiService implements BasicService {
 
+    private final LhbOrderService orderService;
+
+    private final LhbGoodsService goodsService;
+
+    private final LhbGoodsSkuService goodsSkuService;
+
+    private final LhbGoodsActivitiesService goodsActivitiesService;
+
     @Override
     public List<AreaRes> getArea() {
 
@@ -43,21 +63,53 @@ public class TYBasicService extends TongYiService implements BasicService {
     }
 
     @Override
-    public void preNumber(PreNumbersReq req) {
+    public void preNumber(LhbOrder order) {
 
+        //预占号码
+        PreNumbersReq req = PreNumbersReq.builder()
+                .regionId(order.getRegionId())
+                .idenNr(order.getIdCard())
+                .number(order.getMakeMobile()).build();
         sendToUrl(req, "/api/v1/guangdian/preNumber");
     }
 
     @Override
-    public String orderSubmit(OrderSubmitReq req) {
-
+    public String orderSubmit(LhbOrder order) {
+
+        LhbGoods goods = goodsService.getById(order.getGoodsId());
+
+        LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
+
+        List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
+
+        OrderSubmitReq req = OrderSubmitReq.builder()
+                .goodsId(goods.getExternalId())
+                .goodsSkuId(goodsSku.getExternalSkuId())
+                .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
+                .payMoney("0")
+                .number(order.getMakeMobile())
+                .custName(order.getCustName())
+                .contNumber(order.getContMobile())
+                .idenNr(order.getIdCard())
+                .receiveName(order.getCustName())
+                .receiveMobile(order.getContMobile())
+                .receiveAddress(order.getAddress())
+                .area(order.getArea())
+                .preNumber(Boolean.FALSE)
+                .regionId(order.getRegionId()).build();
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/submit");
         return commRes.getData().toString();
     }
 
     @Override
-    public void orderCancel(OrderCancelReq req) {
+    public void orderCancel(String orderSn) {
+
+        LhbOrder order = orderService.getOrderSn(orderSn);
 
+        OrderCancelReq req = OrderCancelReq.builder()
+                .orderId(order.getOutOrderSn())
+                .returnCause(order.getRemark())
+                .applyPerson(SecurityUtils.getUser().getName()).build();
         sendToUrl(req, "/api/v1/guangdian/cancel");
     }
 
@@ -70,17 +122,59 @@ public class TYBasicService extends TongYiService implements BasicService {
     }
 
     @Override
-    public String queryStatus(QueryOrderReq req) {
+    public String queryStatus(LhbOrder order) {
 
+        QueryOrderReq req = QueryOrderReq.builder()
+                .orderId(order.getOutOrderSn())
+                .build();
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryStatus");
+        String outStatus = commRes.getData().toString();
+
+        LambdaUpdateWrapper<LhbOrder> updateWrapper = Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId()).set(LhbOrder::getOutStatus, outStatus);
+        //更新状态
+        if("41".equals(outStatus) || "2".equals(outStatus)){
+            //41-配送中,不可取消订单 2-订单成功结束
+            orderService.sendToOrder(order, "41".equals(outStatus) ? NotifyStatusEnum.DISTRIBUTION : NotifyStatusEnum.ACT);
+        }
+        if("3".equals(outStatus)){
+            //3-订单异常取消
+            orderService.sendToOrder(order, NotifyStatusEnum.CANCEL);
+            //如果是0服务费直接订单也变成已取消
+            if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
+                updateWrapper.set(LhbOrder::getStatus, OrderStatusEnum.CANCEL.getCode());
+            }
+        }
+        orderService.update(updateWrapper);
         return commRes.getData().toString();
     }
 
     @Override
-    public String queryFirstCharge(QueryOrderReq req) {
+    public void queryFirstCharge(LhbOrder order) {
+
+        QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
 
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryFirstCharge");
-        return commRes.getData().toString();
+        String firstCharge = commRes.getData().toString();
+        if(firstCharge.contains("50") || firstCharge.contains("100")){
+
+            BigDecimal firstChargeAmt = firstCharge.contains("50") ? new BigDecimal("5000") : new BigDecimal("10000");
+
+            //更新状态
+            orderService.update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
+                    .set(LhbOrder::getIsAct, CommonConstants.SUCCESS)
+                    .set(LhbOrder::getFirstCharge, firstChargeAmt)
+                    .set(LhbOrder::getIsFirstRecharge, CommonConstants.SUCCESS));
+
+            order.setIsFirstRecharge(CommonConstants.SUCCESS);
+            order.setFirstCharge(firstChargeAmt);
+            order.setIsAct(CommonConstants.SUCCESS);
+            orderService.sendToOrder(order, NotifyStatusEnum.ACT);
+        }
+        //订单超过30天自动设置为已激活
+        if(order.getCreateTime().plusDays(30).isBefore(LocalDateTime.now())){
+            orderService.update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
+                    .set(LhbOrder::getIsAct, CommonConstants.SUCCESS));
+        }
     }
 
     @Override

+ 302 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/YWBasicService.java

@@ -0,0 +1,302 @@
+package com.kxs.lhb.basic.biz.channel.yiwang;
+
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
+import com.kxs.lhb.basic.api.constant.enums.NotifyStatusEnum;
+import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
+import com.kxs.lhb.basic.api.dto.tongyi.*;
+import com.kxs.lhb.basic.api.dto.yiyang.YWOrderCancelReq;
+import com.kxs.lhb.basic.api.dto.yiyang.YWPreNumbersReq;
+import com.kxs.lhb.basic.api.dto.yiyang.YWQueryFirstOrderReq;
+import com.kxs.lhb.basic.api.dto.yiyang.YWQueryOrderReq;
+import com.kxs.lhb.basic.api.model.*;
+import com.kxs.lhb.basic.api.vo.tongyi.*;
+import com.kxs.lhb.basic.api.vo.yiwang.YWCommRes;
+import com.kxs.lhb.basic.biz.channel.BasicService;
+import com.kxs.lhb.basic.biz.service.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * TY API调用服务
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class YWBasicService extends YiWangService implements BasicService {
+
+    private final LhbOrderService orderService;
+
+    private final LhbGoodsService goodsService;
+
+    private final LhbGoodsSkuService goodsSkuService;
+
+    private final LhbGoodsActivitiesService goodsActivitiesService;
+
+    private final LhbAreaService areaService;
+
+    @Override
+    public List<AreaRes> getArea() {
+
+        TyCommonReq req = new TyCommonReq();
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/qryNumberOwnership");
+        JSONObject entries = JSONUtil.parseObj((commRes.getResult().toString()));
+        List<AreaRes> list = JSONUtil.toList(entries.getStr("regionalList"), AreaRes.class);
+        List<AreaRes> areaList = new ArrayList<>();
+        for (AreaRes areaRes : list) {
+            areaRes.setParentId(StrUtil.EMPTY);
+            areaList.add(areaRes);
+            List<AreaRes> cityList = JSONUtil.toList(areaRes.getChildren(), AreaRes.class);
+            areaList.addAll(cityList);
+            for (AreaRes city : cityList) {
+                List<AreaRes> regionList = JSONUtil.toList(city.getChildren(), AreaRes.class);
+                areaList.addAll(regionList);
+            }
+        }
+
+        return areaList;
+    }
+
+    @Override
+    public List<PackagesRes> getPackages(PackagesReq req) {
+
+        req.setTypeId("C01");
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/qryGoodsListByType");
+        JSONObject entries = JSONUtil.parseObj(commRes.getResult());
+        return JSONUtil.toList(JSONUtil.toJsonStr(entries.getStr("goodsList")), PackagesRes.class);
+    }
+
+    @Override
+    public NumbersRes getNumbers(NumbersReq req) {
+
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/qryNumberNew");
+        return JSONUtil.toBean(JSONUtil.toJsonStr(commRes.getResult()), NumbersRes.class);
+    }
+
+    @Override
+    public void preNumber(LhbOrder order) {
+
+        YWPreNumbersReq req = YWPreNumbersReq.builder()
+                .regionId(order.getRegionId())
+                .custCardNo(order.getIdCard())
+                .occupyType("1")
+                .accessNum(order.getMakeMobile()).build();
+        sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/numSelOccupy");
+    }
+
+    @Override
+    public String orderSubmit(LhbOrder order) {
+
+        LhbGoods goods = goodsService.getById(order.getGoodsId());
+
+        LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
+
+        LhbArea city = areaService.getAreaCode(order.getRegionId());
+
+        LhbArea province = areaService.getById(city.getParentId());
+
+        List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("seqId", IdUtil.simpleUUID());
+//      不用  params.put("orderType", "15");
+//      不用  params.put("channelId","SHENGFEN");
+//        params.put("orgId","orgId");//todo 这个是省份代理商
+//      不用  params.put("channelType", "6");
+//      不用  params.put("channelCode", "EB002");
+        params.put("areaName", city.getAreaName());
+        params.put("areaCode", city.getAreaCode());
+        params.put("regionCode", city.getAreaCode());
+        params.put("provinceCode", province.getAreaCode());
+
+        params.put("cityCode", city.getAreaCode());
+        params.put("cityName", city.getAreaName());
+        params.put("phone", order.getMakeMobile());
+//    不用    params.put("payWay","9");
+//     不用   params.put("userIdType","1");
+        params.put("userId", String.valueOf(order.getUserId()));
+        params.put("payMoney", "0");
+        params.put("sendWay","1");
+        params.put("orderRemark", order.getRemark());
+        Map<String, Object> goodsMap = new HashMap<>();
+        goodsMap.put("goodsId", goods.getExternalId());
+        goodsMap.put("goodsSkuId", goodsSku.getExternalSkuId());
+//        goodsMap.put("goodsTypeId","C01");
+        goodsMap.put("orderNum","1");
+
+        if(!activities.isEmpty()){
+            List<Map<String,Object>> offerList = new ArrayList<>();
+            for (LhbGoodsActivities activity : activities) {
+                Map<String,Object> codes = new HashMap<>();
+                codes.put("offerCode", activity.getActivityCode());
+                offerList.add(codes);
+            }
+            goodsMap.put("offerList", offerList);
+        }
+
+        params.put("goodsParams", goodsMap);
+
+        String[] split = order.getArea().split(StrUtil.COMMA);
+        LhbArea county = areaService.getAreaCode(split[2]);
+
+        Map<String,String> orderRecvAddr = new HashMap<>();
+        orderRecvAddr.put("receiveName", order.getCustName());
+        orderRecvAddr.put("receiveCountry","中国");
+        orderRecvAddr.put("receiveProvince", province.getAreaCode());
+        orderRecvAddr.put("receiveProvinceName", province.getAreaName());
+        orderRecvAddr.put("receiveCity", city.getAreaCode());
+        orderRecvAddr.put("receiveCityName", city.getAreaName());
+        orderRecvAddr.put("receiveCounty", county.getAreaCode());
+        orderRecvAddr.put("receiveCountyName", county.getAreaName());
+        orderRecvAddr.put("receiveAddress", order.getAddress());
+        orderRecvAddr.put("receiveMobile", order.getContMobile());
+        params.put("orderRecvAddr",orderRecvAddr);
+
+        Map<String,String> custInfo = new HashMap<>();
+        custInfo.put("custName", order.getCustName());
+        custInfo.put("idenType","1");
+        custInfo.put("idenNr", order.getIdCard());
+        custInfo.put("contNumber", order.getContMobile());
+        params.put("custInfo",custInfo);
+
+        params.put("outOrderId", order.getOrderSn());
+        YWCommRes<Object> commRes = sendToUrl(params, "/gd/openapi/fenxiao/prov/openAcount/submitOrder");
+        JSONObject entries = JSONUtil.parseObj(commRes.getResult());
+        return entries.getStr("orderId");
+    }
+
+    @Override
+    public void orderCancel(String orderSn) {
+
+        LhbOrder order = orderService.getOrderSn(orderSn);
+        YWOrderCancelReq req = YWOrderCancelReq.builder()
+                .returnCauseType("0")
+                .orderId(order.getOutOrderSn())
+                .returnCause(order.getRemark())
+                .applyPerson(SecurityUtils.getUser().getName()).build();
+        sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/returnOrder");
+    }
+
+    @Override
+    public QueryLogisticsRes queryLogistics(QueryOrderReq req) {
+
+        YWCommRes<Object> res = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/qryorderLogistics");
+        JSONObject entries = JSONUtil.parseObj(res.getResult().toString());
+
+        return JSONUtil.toBean(entries.getStr("data"), QueryLogisticsRes.class);
+    }
+
+    @Override
+    public String queryStatus(LhbOrder order) {
+
+        YWQueryOrderReq req = YWQueryOrderReq.builder().orderId(order.getOutOrderSn())
+                .phone(order.getMakeMobile())
+                .userId(String.valueOf(order.getUserId()))
+                .build();
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/qryOrderDetail");
+        JSONObject entries = JSONUtil.parseObj(commRes.getResult().toString());
+
+        String outStatus = entries.getStr("orderStatus");
+        //更新状态
+        LambdaUpdateWrapper<LhbOrder> updateWrapper = Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId()).set(LhbOrder::getOutStatus, outStatus);
+
+        switch (outStatus){
+            case "4","2":
+                //拒签
+                if("rejected".equals(entries.getStr("orderActId"))){
+                    orderService.sendToOrder(order, NotifyStatusEnum.CANCEL);
+                    //如果是0服务费直接订单也变成已取消
+                    if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
+                        updateWrapper.set(LhbOrder::getStatus, OrderStatusEnum.CANCEL.getCode());
+                    }
+                    updateWrapper.set(LhbOrder::getOutStatus, "3");
+                    updateWrapper.set(LhbOrder::getRemark, entries.getStr("orderActName"));
+                    updateWrapper.set(LhbOrder::getResult, entries.getStr("orderActName"));
+                }else{
+                    //4-配送中,不可取消订单 2-订单成功结束
+                    orderService.sendToOrder(order, "2".equals(outStatus) ? NotifyStatusEnum.ACT : NotifyStatusEnum.DISTRIBUTION);
+                }
+                break;
+            case "3":
+                //3-订单异常取消
+                orderService.sendToOrder(order, NotifyStatusEnum.CANCEL);
+                //如果是0服务费直接订单也变成已取消
+                if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
+                    updateWrapper.set(LhbOrder::getStatus, OrderStatusEnum.CANCEL.getCode());
+                }
+                break;
+        }
+
+        orderService.update(updateWrapper);
+
+        return commRes.getResult().toString();
+    }
+
+    @Override
+    public void queryFirstCharge(LhbOrder order) {
+
+        YWQueryFirstOrderReq req = YWQueryFirstOrderReq.builder().phoneNumber(order.getMakeMobile()).build();
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/queryFirstRecharge");
+        String firstCharge = commRes.getResult().toString();
+
+        if(firstCharge.contains("首充50元") || firstCharge.contains("首充100元")){
+
+            BigDecimal firstChargeAmt = firstCharge.contains("首充50元") ? new BigDecimal("5000") : new BigDecimal("10000");
+
+            //更新状态
+            orderService.update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
+                    .set(LhbOrder::getIsAct, CommonConstants.SUCCESS)
+                    .set(LhbOrder::getFirstCharge, firstChargeAmt)
+                    .set(LhbOrder::getIsFirstRecharge, CommonConstants.SUCCESS));
+
+            order.setIsFirstRecharge(CommonConstants.SUCCESS);
+            order.setFirstCharge(firstChargeAmt);
+            order.setIsAct(CommonConstants.SUCCESS);
+            orderService.sendToOrder(order, NotifyStatusEnum.ACT);
+        }
+        //订单超过30天自动设置为已激活
+        if(order.getCreateTime().plusDays(30).isBefore(LocalDateTime.now())){
+            orderService.update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
+                    .set(LhbOrder::getIsAct, CommonConstants.SUCCESS));
+        }
+    }
+
+    @Override
+    public List<OrderChargeLevelRes> queryChargeLevel(OrderChargeLevelReq req) {
+
+        YWCommRes<Object> commRes = sendToUrl(req, "/gd/openapi/fenxiao/prov/openAcount/queryChargeLevel");
+        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getResult()), OrderChargeLevelRes.class);
+    }
+
+
+    @Override
+    public boolean support(ChannelCodeEnum ifCode) {
+        return ChannelCodeEnum.YW.equals(ifCode);
+    }
+
+    @Override
+    public int getOrder() {
+        return Integer.MIN_VALUE;
+    }
+
+}

+ 144 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/YiWangService.java

@@ -0,0 +1,144 @@
+package com.kxs.lhb.basic.biz.channel.yiwang;
+
+
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.lhb.basic.api.dto.tongyi.BasicReq;
+import com.kxs.lhb.basic.api.dto.tongyi.TyCommonReq;
+import com.kxs.lhb.basic.api.vo.tongyi.TyCommRes;
+import com.kxs.lhb.basic.api.vo.yiwang.YWCommRes;
+import com.kxs.lhb.basic.biz.channel.yiwang.utils.AESUtil;
+import com.kxs.lhb.basic.biz.channel.yiwang.utils.RSAUtil;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.ConnectionPool;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * yi wang 基础服务
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Slf4j
+public abstract class YiWangService {
+
+    @Autowired
+    protected RedisTemplate<String, Object> redisTemplate;
+
+
+    private final static String CREATE_KEY = OAuth2ParameterNames.ACCESS_TOKEN + "_create:yiwang";
+
+    private static final String APP_KEY = "LonZWqterohTz7diOJbZ5VZxYJZXuc4T";
+    private static final String APP_SECRET = "PAWX2eArwKXPgTJBOFWYGHFJOeaAQY25";
+    private static final String APPID = "1958434806389723138";
+    private static final String PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC73wBnObneyKnx/FTNP4g3hzAB2a6h4bHp8OwXKKS2uE1pn7QxoJfvCYHgwo342eaojGg2UNyJwkuT7oHT27PAXcE7Oz204L77xf2sQt5Ldnfm2kCeD+VpJRj6LLZYs2b4pHidmv7xGA+UmXfMjyZ/o8W+Eqp07KkTUg+I+vI1tQIDAQAB";
+
+
+    private static final String GATEWAY = "https://iotcentral.hunancatv.com:8081/yiwang-api/000001";
+
+    protected <T> YWCommRes<T> sendToUrl(Object req, String url) {
+
+        String random = RSAUtil.getRandom();
+
+        String jsonBody = JSONUtil.toJsonStr(req);
+
+        String s = AESUtil.enAES(jsonBody, random + random + random);
+
+        JSONObject reqStr = JSONUtil.createObj().set("requestParams", s);
+
+        String ajaxran;
+        try {
+            ajaxran = RSAUtil.encryptByPublicKey(random, PUBLIC);
+        } catch (Exception e) {
+            throw new GlobalCustomerException("加密失败");
+        }
+
+        String apiUrl = StrUtil.format("{}{}?token={}", GATEWAY, url, refreshToken());
+        log.info("发送请求到yiwang平台,请求参数:{}, 请求URL:{}", JSONUtil.toJsonStr(req), url);
+        String response = HttpRequest.post(apiUrl)
+                .header("ajaxrandomcode", ajaxran)
+                .header("publicKey", PUBLIC)
+                .header("CRC", APPID)
+                .header("appCode", APP_KEY)
+                .header("ostype", "android")
+                .body(JSONUtil.toJsonStr(reqStr))
+                .execute().body();
+
+        log.info("yiwang地址{},Response:\n{}", url, response);
+
+        if (response == null || !JSONUtil.isTypeJSON(response)) {
+            log.error("响应报文非有效格式{}", response);
+            throw new GlobalCustomerException("响应报文非有效格式" + response);
+        }
+
+        YWCommRes<T> res = JSONUtil.toBean(response, new TypeReference<>() {
+        }, true);
+        if (!"000000".equals(res.getRespCode())) {
+            throw new GlobalCustomerException("返回错误信息" + res.getRespDesc());
+        }
+
+        return res;
+    }
+
+    protected String refreshToken() {
+
+        String token = (String) redisTemplate.opsForValue().get(CREATE_KEY);
+        if(StrUtil.isNotBlank(token)){
+            return token;
+        }
+
+        HashMap<String, Object> paramMap = new HashMap<>();
+        paramMap.put("username", APPID);
+        paramMap.put("password", APP_SECRET);
+        String response = HttpUtil.get(GATEWAY + "/gd/oauth", paramMap);
+//        String response = HttpRequest.get(GATEWAY + "/gd/oauth")
+//                .form("username", APPID)
+//                .form("password", APP_SECRET)
+//                .execute().body();
+        if (response == null || !JSONUtil.isTypeJSON(response)) {
+            throw new GlobalCustomerException("获取token失败");
+        }
+
+        JSONObject entries = JSONUtil.parseObj(response);
+        if(!"ok".equals(entries.getStr("info"))){
+            throw new GlobalCustomerException("获取token失败");
+        }
+        redisTemplate.opsForValue()
+                .set(CREATE_KEY, entries.getStr("token"), entries.getLong("expires") - 1000, TimeUnit.SECONDS);
+
+        return entries.getStr("token");
+    }
+
+
+    private BasicReq buildSign(TyCommonReq param) {
+
+        BasicReq<Object> req = new BasicReq<>();
+        req.setBody(param);
+        req.setAppId(APPID);
+        req.setTimestamp(String.valueOf(System.currentTimeMillis()));
+        req.setSign(DigestUtil.md5Hex(APP_KEY + ":" + APP_SECRET + ":" + req.getTimestamp()));
+
+        return req;
+    }
+}

+ 92 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/utils/AESUtil.java

@@ -0,0 +1,92 @@
+package com.kxs.lhb.basic.biz.channel.yiwang.utils;
+
+
+import cn.hutool.core.codec.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.SecureRandom;
+
+/**
+ * Copyright wuwenhui
+ *
+ * @author wuwh6
+ */
+public class AESUtil {
+
+    public final static String CHART_DEFAULT="UTF-8" ;
+    private static String IVRANDOM = "0123456789ABEDEF";
+    public static byte[] decodeAES(String security,String key){
+        try {
+            Cipher  cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            IvParameterSpec sp= new IvParameterSpec(IVRANDOM.getBytes(CHART_DEFAULT));
+            byte[] content =  Base64.decode(security);
+            SecureRandom random = new SecureRandom(key.getBytes());
+            SecretKeySpec spec = new SecretKeySpec(key.getBytes(CHART_DEFAULT),"AES");
+            cipher.init(Cipher.DECRYPT_MODE, spec,sp);
+            return  cipher.doFinal(content);
+
+        } catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static String enAES(String security,String key){
+        try {
+            byte[] content = security.getBytes(CHART_DEFAULT);
+            byte[] aeskeys = key.getBytes(CHART_DEFAULT);
+            Cipher  cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            IvParameterSpec sp= new IvParameterSpec(IVRANDOM.getBytes(CHART_DEFAULT));
+            SecretKeySpec spec = new SecretKeySpec(aeskeys,"AES");
+            cipher.init(Cipher.ENCRYPT_MODE, spec,sp);
+            byte[] context =   cipher.doFinal(content);
+            return Base64.encode(context);
+
+        } catch (Exception e){
+        }
+        return null;
+    }
+
+
+
+
+//    public static SecretKeySpec getKeys(byte[] keys){
+//        try {
+//            KeyGenerator keygen = KeyGenerator.getInstance("AES");
+//            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG") ;
+//            keygen.init(128, secureRandom);
+////            secureRandom.setSeed(keys);
+//            SecretKey original_key = keygen.generateKey();
+//            byte[] raw = original_key.getEncoded();
+//            return  new SecretKeySpec(raw, "AES");
+//        } catch (NoSuchAlgorithmException e) {
+//            e.printStackTrace();
+//        }
+//        return null;
+
+ //   }
+
+//    public static byte[] paserHex2Byte(String content){
+//        byte[] result = new byte[content.length()/2];
+//        for(int i=0;i<result.length;i++){
+//            int h = Integer.parseInt(content.substring(i*2,i*2+1),16);
+//            int low = Integer.parseInt(content.substring(i*2+1,i*2+2),16);
+//            result[i]= (byte)(h*16+low);
+//        }
+//        return result;
+//    }
+
+    public static void main(String[] args) {
+//        String s = new String(enAES("{\"text\":\"1234\"}","1234567812345678"));
+        String code = enAES("{\"text\":\"1234\"}","123456781234567812345678");
+        System.out.println("加密后的密文:"+code);
+
+        String s = new String(decodeAES("QCErio4SnJrHJQQ0MwuoUT/onjoS3nEkNmJlzrukPn269H1K0D/ocSuOqWWYhmyp3Q6zD3eJh92l83w/l1IQMw==","231406562314065623140656"));
+
+        System.out.println("解密后的明文:"+s);
+    }
+
+}

+ 56 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/yiwang/utils/RSAUtil.java

@@ -0,0 +1,56 @@
+package com.kxs.lhb.basic.biz.channel.yiwang.utils;
+
+import cn.hutool.core.codec.Base64;
+
+import javax.crypto.Cipher;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Random;
+
+
+public class RSAUtil {
+    public static final String KEY_ALGORITHM = "RSA";
+    public static String encryptByPublicKey(String data, String key)
+            throws Exception {
+        // 对公钥解密
+        byte[] keyBytes = Base64.decode(key);
+        // 取得公钥
+        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key publicKey = keyFactory.generatePublic(x509KeySpec);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        return Base64.encode( cipher.doFinal(data.getBytes()));
+    }
+
+
+    public static String getRandom() {
+        int CODES[] = {3, 6, 9, 2, 4, 1, 5, 7, 8, 0};
+        String random = String.valueOf(new Random().nextInt(10000000));
+        while (random.length() < 7) {
+            random = random + "1";
+        }
+        int intresult = 0;
+        int i = 0;
+        for (i = 0; i < random.length(); i++) {
+            intresult = intresult + (random.charAt(i));
+        }
+        random = random + "" + CODES[intresult % 10];
+        return random;
+    }
+
+    public static String decrpt(String data, String key)  throws Exception{
+        byte[] keyBytes = Base64.decode(key);
+        // 取得公钥
+        PKCS8EncodedKeySpec  x509KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key privateKey = keyFactory.generatePrivate(x509KeySpec);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        return new String( cipher.doFinal(Base64.decode(data.getBytes())));
+    }
+}

+ 1 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysGoodsController.java

@@ -69,7 +69,7 @@ public class SysGoodsController {
      */
     @SysLog("产品表新增")
     @PostMapping("/add")
-    @PreAuthorize("@pms.hasPermission('lhb_goods_add')")
+//    @PreAuthorize("@pms.hasPermission('lhb_goods_add')")
     public R add(@RequestBody LhbGoods param) {
 
         return R.ok(lhbGoodsService.addGoods(param));

+ 2 - 2
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysOrderController.java

@@ -113,7 +113,7 @@ public class SysOrderController {
     /**
      * 更新订单状态
      */
-    @Inner(value = false)
+    @Inner
     @GetMapping("/orderStatusTask")
     public void orderStatusTask() {
 
@@ -123,7 +123,7 @@ public class SysOrderController {
     /**
      * 查询订单是否首冲
      */
-    @Inner(value = false)
+    @Inner
     @GetMapping("/orderFirstCharge")
     public void orderFirstCharge() {
 

+ 28 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/cusmoter/callback/CallbackController.java

@@ -0,0 +1,28 @@
+package com.kxs.lhb.basic.biz.controller.cusmoter.callback;
+
+import com.kxs.common.core.util.R;
+import com.kxs.common.security.annotation.Inner;
+import com.kxs.lhb.basic.api.dto.tongyi.OrderInfoNotify;
+import com.kxs.lhb.basic.biz.service.LhbOrderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lixueqiang
+ */
+@RestController
+@RequestMapping("callback")
+@RequiredArgsConstructor
+public class CallbackController {
+
+    private final LhbOrderService orderService;
+
+    @Inner(value = false)
+    @RequestMapping("/lhb/notify")
+    public R notify(@RequestBody OrderInfoNotify param) {
+
+        return R.ok(orderService.tongyiNotify(param));
+    }
+}

+ 1 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLhbBindQueueListener.java

@@ -63,7 +63,7 @@ public class RabbiLhbBindQueueListener {
 				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
 				return;
 			}
-			if(notify.getNotifyCount() > BasicConstants.MAX_NOTIFY_TIMES){
+			if(notify.getNotifyCount() >= BasicConstants.MAX_NOTIFY_TIMES){
 				log.error("推送信息已超过最大推送次数{}", parse.getNotifyId());
 				notify.setStatus(-1);
 				notifyService.updateById(notify);

+ 39 - 39
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLhbOrderQueueListener.java

@@ -48,44 +48,44 @@ public class RabbiLhbOrderQueueListener {
 
 
 
-	public static void main(String[] args) {
-
-
-
-
-		String signStr = "23232";
-		String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPs8Mn9EtUNqz9eg+Zv9Hu4gwjKgqma+Ud5A+LpiMQFK83fQX1zmg9oGtaXL11guQBJT9pui3vBn4cZXkadOd03x22lxDd18hBmEWBA8b2MTC4u2gZ7jKGjMBurDZ4Uit8yk2Ls8Qe6Jzf7f2cdTwzw6JrLGyZ6jx+Xl7zHcylvY6YHio8t1zW/ZuP2PuY6XWXL/1gbChhxUIs/LhZbHzPazvnjqxM7ioZkLU0Of3W0keO6AcJo01DGqUHZ/l9FsZU/8697o1W3IyhQ9PDTg9mVWS46hIMhd70nNpCTlDKn6iiv2H0GtZ1FbczX7uoTXI9oqP2uU1qahk10CdbeLW1AgMBAAECggEADnMnBpd8E6XD02E4vF8bfwff7JFHrOBgk5bhMUutbuqFi/DYbpUoyjmdUeLNckmNH8hdDgaYo9ZlS/mwKcbjl07wL/IU0hnmmyHyqzxz/0GHAqxllWXsUrdIilhqycKJeOzmy0tyRyFg1OubeuYW/aWIaXp4GSoClzpqFcxDTc8RE7rSn5JxwfBug9p1dNrv0/RfeXSecJ2puqWO3w6+sJxCyMt7/SmIa5sczc9ehSDYhWH0Zs5FBwfhfpyxECyQWeHoIM6I+AkJqjbNRBKT5TCho66Ie5H/PwHVJ0GxhEyc7xKn+/9ZA+5AAYCrlqDzZyqQQUDK8cDyjZfLFx6fAQKBgQDRpnAD+jRE6wJ1fSBEPUe8J3x7IxlFR2K4k6XXj+hNHdqDP/Oo1lssj64U4eeXHyvbe9bJVbVvJ28jM1cSsGHmcQMj3bHLWhWHlwOYqIc9FZgGB9T//NyMhVUsSUhZ4LPPA5eJOJeDCnKPPwevK2Iaj1iopeO2+DQPffPNYyRPlQKBgQCveN7tX3NFH9944iATS8RZX2C1reXjIf6wH3dLg5ttLJhH9Une//RvKPEjlnPL7sJnyt8jGiXQOma6Xr3cHztDjdCdaEC6lZmoiUL4aN1amUjz7cET2BeJjtv9fRG+bk5RSCemcHyuvALMmLeRwm8cAfdWnNsEv+ikshkUyZHFoQKBgQC8SmtYZyMCsr8mnhaYsyD2T9BxF3jey9pSQ+kyzUCp4iIatxkzjjGct/51Kt9AzvIo0fR6Jswo5JXgW3/cfSWwPdfAIqBILsQfXvYP6Wxs5DQBVo9qycObQTTZ7YdZkYJsbqFu0LDjNELnfIh+PsyBZjUOYs89yXWYZFrPIDfAcQKBgHZDVqxRapUqGCmW7dtTc3Bw0fNg0tG0db0qV/KzLqv0JGZLMZB0nb/VrkA4BK9rqebeWmmEE/w1gEsX04pqGj07dWDBhO68KSXn7RUTSCzppruQgFLpj2OMv0QnaTAZk/tAUEjjA4WY/aH7Q62fh9culA7yBMM8vIVT64eRGwhBAoGAc5vyY2in0OCwDVApi5IO+ilorfHMKWSVub1oG/9R85V21n9Ux6SWkLCs+tTY80VvQzfjrWS/vAkaOV9usfuJL7cotroyUgxFp8+I5bPdgThD0uP2078n92huoacVp49eKL+WGGmHBl1aSz9YJguQ0neaTxJUlEuAokfMO6dhHro=";
-		String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj7PDJ/RLVDas/XoPmb/R7uIMIyoKpmvlHeQPi6YjEBSvN30F9c5oPaBrWly9dYLkASU/abot7wZ+HGV5GnTndN8dtpcQ3dfIQZhFgQPG9jEwuLtoGe4yhozAbqw2eFIrfMpNi7PEHuic3+39nHU8M8Oiayxsmeo8fl5e8x3Mpb2OmB4qPLdc1v2bj9j7mOl1ly/9YGwoYcVCLPy4WWx8z2s7546sTO4qGZC1NDn91tJHjugHCaNNQxqlB2f5fRbGVP/Ove6NVtyMoUPTw04PZlVkuOoSDIXe9JzaQk5Qyp+oor9h9BrWdRW3M1+7qE1yPaKj9rlNamoZNdAnW3i1tQIDAQAB";
-//		String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANwULxPHjpmtY3giSsvaS7ZaoOkcSChhxn5krunLcT9G2aP+tP4zbs33giN4Chm9QxrDHA6gG9kGUv/h9WSWul78eml6dQaNGtEmTsFPwlDXI1v310+mA/7TrumeudTrGVmUTv8juWNJaGZk/zIi1cMqJ1/tfUi3h3EOkplS0kQ5AgMBAAECgYEAnAbXRX+iUsOBlMdDHfla2iKwl/QMGE0Ri8RX2br5Q/I4FLNcoCfYs795DSpqhssOiyeueZP7ikaYi38oGbNe1u11HWzE2VgcLoQwZwQCX0U+uJNpm0AOX3hXs/hgRIe3DPkNUvSz87U1DwIbXFDoSgG+fFQOP4ZNCOBWqnQN2XECQQD9/Z3RC0y92OgwPBLkbIz9HYV7anD+aFBbMXY7i9LCKOmabz31Vg8Vurb2GSxerv+qQET0Y6o0LsmsCDkUcgDlAkEA3dHjkbsEJcNocEIDuYFfjdhLjoNHoOei3Ph4j4bG1h/StHR2h4DdTk2LVnz+PnFWuGFuwzNO2ZT9gYTYZYQExQJBANS7VjJfn4AnK5oyxrQRgykBT+qlpUxAPIWU8O1A2F6M+9PAtolE8k+F2nZXcUVAl5yWRerXixg30+xF2uEX900CQAeUByFQcVjU7zl+l9/7kocnD5XD2Guf3kmMV5oXsa1ZEvrFS9NfTLBDJ/KBfLInbx4HfiA/HX+DfpGxNy9orj0CQQCmgnRhaZqpy0acdr9csh8UxAogiGSgc+7l3ujI4vntbbfphOwCkav7voDjhS66ZHdYVOpZAzcWXr7pKu/X0Izo";
-//		String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcFC8Tx46ZrWN4IkrL2ku2WqDpHEgoYcZ+ZK7py3E/Rtmj/rT+M27N94IjeAoZvUMawxwOoBvZBlL/4fVklrpe/HppenUGjRrRJk7BT8JQ1yNb99dPpgP+067pnrnU6xlZlE7/I7ljSWhmZP8yItXDKidf7X1It4dxDpKZUtJEOQIDAQAB";
-
-		RSA rsa = SecureUtil.rsa(privateKey, publicKey);
-		String publicKeyBase64 = rsa.getPublicKeyBase64();
-		String privateKeyBase64 = rsa.getPrivateKeyBase64();
-        try {
-			String encrypt1 = Base64.getEncoder().encodeToString(rsa.encrypt(signStr.getBytes(), KeyType.PublicKey));
-			Sign sign1 = SecureUtil.sign(SignAlgorithm.SHA256withRSA, privateKey, publicKey);
-			byte[] sign2 = sign1.sign(signStr);
-			String sign3 = new String(Base64.getEncoder().encode(sign2));
-			String decryptStr = rsa.decryptStr(encrypt1, KeyType.PrivateKey);
-
-			String sign = RsaUtil.sign(privateKey, signStr);
-
-			String encrypt = RsaUtil.encrypt(publicKey, signStr);
-			boolean verify = RsaUtil.verify(publicKey, signStr, sign3);
-			String decrypt = RsaUtil.decrypt(privateKey, encrypt1);
-			System.out.println(verify);
-			System.out.println(encrypt);
-			System.out.println(encrypt1);
-			System.out.println(decrypt);
-			System.out.println(decryptStr);
-
-		} catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-
-    }
+//	public static void main(String[] args) {
+//
+//
+//
+//
+//		String signStr = "23232";
+//		String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPs8Mn9EtUNqz9eg+Zv9Hu4gwjKgqma+Ud5A+LpiMQFK83fQX1zmg9oGtaXL11guQBJT9pui3vBn4cZXkadOd03x22lxDd18hBmEWBA8b2MTC4u2gZ7jKGjMBurDZ4Uit8yk2Ls8Qe6Jzf7f2cdTwzw6JrLGyZ6jx+Xl7zHcylvY6YHio8t1zW/ZuP2PuY6XWXL/1gbChhxUIs/LhZbHzPazvnjqxM7ioZkLU0Of3W0keO6AcJo01DGqUHZ/l9FsZU/8697o1W3IyhQ9PDTg9mVWS46hIMhd70nNpCTlDKn6iiv2H0GtZ1FbczX7uoTXI9oqP2uU1qahk10CdbeLW1AgMBAAECggEADnMnBpd8E6XD02E4vF8bfwff7JFHrOBgk5bhMUutbuqFi/DYbpUoyjmdUeLNckmNH8hdDgaYo9ZlS/mwKcbjl07wL/IU0hnmmyHyqzxz/0GHAqxllWXsUrdIilhqycKJeOzmy0tyRyFg1OubeuYW/aWIaXp4GSoClzpqFcxDTc8RE7rSn5JxwfBug9p1dNrv0/RfeXSecJ2puqWO3w6+sJxCyMt7/SmIa5sczc9ehSDYhWH0Zs5FBwfhfpyxECyQWeHoIM6I+AkJqjbNRBKT5TCho66Ie5H/PwHVJ0GxhEyc7xKn+/9ZA+5AAYCrlqDzZyqQQUDK8cDyjZfLFx6fAQKBgQDRpnAD+jRE6wJ1fSBEPUe8J3x7IxlFR2K4k6XXj+hNHdqDP/Oo1lssj64U4eeXHyvbe9bJVbVvJ28jM1cSsGHmcQMj3bHLWhWHlwOYqIc9FZgGB9T//NyMhVUsSUhZ4LPPA5eJOJeDCnKPPwevK2Iaj1iopeO2+DQPffPNYyRPlQKBgQCveN7tX3NFH9944iATS8RZX2C1reXjIf6wH3dLg5ttLJhH9Une//RvKPEjlnPL7sJnyt8jGiXQOma6Xr3cHztDjdCdaEC6lZmoiUL4aN1amUjz7cET2BeJjtv9fRG+bk5RSCemcHyuvALMmLeRwm8cAfdWnNsEv+ikshkUyZHFoQKBgQC8SmtYZyMCsr8mnhaYsyD2T9BxF3jey9pSQ+kyzUCp4iIatxkzjjGct/51Kt9AzvIo0fR6Jswo5JXgW3/cfSWwPdfAIqBILsQfXvYP6Wxs5DQBVo9qycObQTTZ7YdZkYJsbqFu0LDjNELnfIh+PsyBZjUOYs89yXWYZFrPIDfAcQKBgHZDVqxRapUqGCmW7dtTc3Bw0fNg0tG0db0qV/KzLqv0JGZLMZB0nb/VrkA4BK9rqebeWmmEE/w1gEsX04pqGj07dWDBhO68KSXn7RUTSCzppruQgFLpj2OMv0QnaTAZk/tAUEjjA4WY/aH7Q62fh9culA7yBMM8vIVT64eRGwhBAoGAc5vyY2in0OCwDVApi5IO+ilorfHMKWSVub1oG/9R85V21n9Ux6SWkLCs+tTY80VvQzfjrWS/vAkaOV9usfuJL7cotroyUgxFp8+I5bPdgThD0uP2078n92huoacVp49eKL+WGGmHBl1aSz9YJguQ0neaTxJUlEuAokfMO6dhHro=";
+//		String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj7PDJ/RLVDas/XoPmb/R7uIMIyoKpmvlHeQPi6YjEBSvN30F9c5oPaBrWly9dYLkASU/abot7wZ+HGV5GnTndN8dtpcQ3dfIQZhFgQPG9jEwuLtoGe4yhozAbqw2eFIrfMpNi7PEHuic3+39nHU8M8Oiayxsmeo8fl5e8x3Mpb2OmB4qPLdc1v2bj9j7mOl1ly/9YGwoYcVCLPy4WWx8z2s7546sTO4qGZC1NDn91tJHjugHCaNNQxqlB2f5fRbGVP/Ove6NVtyMoUPTw04PZlVkuOoSDIXe9JzaQk5Qyp+oor9h9BrWdRW3M1+7qE1yPaKj9rlNamoZNdAnW3i1tQIDAQAB";
+////		String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANwULxPHjpmtY3giSsvaS7ZaoOkcSChhxn5krunLcT9G2aP+tP4zbs33giN4Chm9QxrDHA6gG9kGUv/h9WSWul78eml6dQaNGtEmTsFPwlDXI1v310+mA/7TrumeudTrGVmUTv8juWNJaGZk/zIi1cMqJ1/tfUi3h3EOkplS0kQ5AgMBAAECgYEAnAbXRX+iUsOBlMdDHfla2iKwl/QMGE0Ri8RX2br5Q/I4FLNcoCfYs795DSpqhssOiyeueZP7ikaYi38oGbNe1u11HWzE2VgcLoQwZwQCX0U+uJNpm0AOX3hXs/hgRIe3DPkNUvSz87U1DwIbXFDoSgG+fFQOP4ZNCOBWqnQN2XECQQD9/Z3RC0y92OgwPBLkbIz9HYV7anD+aFBbMXY7i9LCKOmabz31Vg8Vurb2GSxerv+qQET0Y6o0LsmsCDkUcgDlAkEA3dHjkbsEJcNocEIDuYFfjdhLjoNHoOei3Ph4j4bG1h/StHR2h4DdTk2LVnz+PnFWuGFuwzNO2ZT9gYTYZYQExQJBANS7VjJfn4AnK5oyxrQRgykBT+qlpUxAPIWU8O1A2F6M+9PAtolE8k+F2nZXcUVAl5yWRerXixg30+xF2uEX900CQAeUByFQcVjU7zl+l9/7kocnD5XD2Guf3kmMV5oXsa1ZEvrFS9NfTLBDJ/KBfLInbx4HfiA/HX+DfpGxNy9orj0CQQCmgnRhaZqpy0acdr9csh8UxAogiGSgc+7l3ujI4vntbbfphOwCkav7voDjhS66ZHdYVOpZAzcWXr7pKu/X0Izo";
+////		String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcFC8Tx46ZrWN4IkrL2ku2WqDpHEgoYcZ+ZK7py3E/Rtmj/rT+M27N94IjeAoZvUMawxwOoBvZBlL/4fVklrpe/HppenUGjRrRJk7BT8JQ1yNb99dPpgP+067pnrnU6xlZlE7/I7ljSWhmZP8yItXDKidf7X1It4dxDpKZUtJEOQIDAQAB";
+//
+//		RSA rsa = SecureUtil.rsa(privateKey, publicKey);
+//		String publicKeyBase64 = rsa.getPublicKeyBase64();
+//		String privateKeyBase64 = rsa.getPrivateKeyBase64();
+//        try {
+//			String encrypt1 = Base64.getEncoder().encodeToString(rsa.encrypt(signStr.getBytes(), KeyType.PublicKey));
+//			Sign sign1 = SecureUtil.sign(SignAlgorithm.SHA256withRSA, privateKey, publicKey);
+//			byte[] sign2 = sign1.sign(signStr);
+//			String sign3 = new String(Base64.getEncoder().encode(sign2));
+//			String decryptStr = rsa.decryptStr(encrypt1, KeyType.PrivateKey);
+//
+//			String sign = RsaUtil.sign(privateKey, signStr);
+//
+//			String encrypt = RsaUtil.encrypt(publicKey, signStr);
+//			boolean verify = RsaUtil.verify(publicKey, signStr, sign3);
+//			String decrypt = RsaUtil.decrypt(privateKey, encrypt1);
+//			System.out.println(verify);
+//			System.out.println(encrypt);
+//			System.out.println(encrypt1);
+//			System.out.println(decrypt);
+//			System.out.println(decryptStr);
+//
+//		} catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+//
+//
+//    }
 
 	/**
 	 * 监听 套餐订单队列
@@ -110,7 +110,7 @@ public class RabbiLhbOrderQueueListener {
 				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
 				return;
 			}
-			if(notify.getNotifyCount() > BasicConstants.MAX_NOTIFY_TIMES){
+			if(notify.getNotifyCount() >= BasicConstants.MAX_NOTIFY_TIMES){
 				log.error("推送信息已超过最大推送次数{}", parse.getNotifyId());
 				notify.setStatus(-1);
 				notifyService.updateById(notify);

+ 3 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbAreaService.java

@@ -20,5 +20,8 @@ public interface LhbAreaService extends MPJBaseService<LhbArea> {
     void refresh();
 
     List<LhbArea> getListAreas(List<String> codes);
+
+    LhbArea getAreaCode(String regionId);
+
 }
 

+ 8 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderService.java

@@ -1,6 +1,8 @@
 package com.kxs.lhb.basic.biz.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.constant.enums.NotifyStatusEnum;
+import com.kxs.lhb.basic.api.dto.tongyi.OrderInfoNotify;
 import com.kxs.lhb.basic.api.model.LhbOrder;
 import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
 
@@ -47,5 +49,11 @@ public interface LhbOrderService extends MPJBaseService<LhbOrder> {
      * @return {@link Boolean }
      */
     Boolean refundFee(LhbOrder param);
+
+    LhbOrder getOrderSn(String orderSn);
+
+    void sendToOrder(LhbOrder order, NotifyStatusEnum notifyStatusEnum);
+
+    Object tongyiNotify(OrderInfoNotify param);
 }
 

+ 12 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java

@@ -1,9 +1,12 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
 import com.kxs.lhb.basic.api.model.LhbArea;
 import com.kxs.lhb.basic.api.vo.tongyi.AreaRes;
 import com.kxs.lhb.basic.biz.channel.BasicService;
+import com.kxs.lhb.basic.biz.channel.factory.ChannelFactory;
 import com.kxs.lhb.basic.biz.mapper.LhbAreaMapper;
 import com.kxs.lhb.basic.biz.service.LhbAreaService;
 import lombok.RequiredArgsConstructor;
@@ -25,12 +28,14 @@ import java.util.List;
 @Slf4j
 public class LhbAreaServiceImpl extends MPJBaseServiceImpl<LhbAreaMapper, LhbArea> implements LhbAreaService {
 
-    private final BasicService basicService;
+    private final ChannelFactory channelFactory;
 
     @Override
     @Transactional
     public void refresh() {
 
+        BasicService basicService = channelFactory.getChannel(ChannelCodeEnum.getMainChannelCode().getCode());
+
         List<AreaRes> resList = basicService.getArea();
         for (AreaRes areaRes : resList) {
             LhbArea lhbArea = new LhbArea();
@@ -48,5 +53,11 @@ public class LhbAreaServiceImpl extends MPJBaseServiceImpl<LhbAreaMapper, LhbAre
 
         return baseMapper.getListAreas(codes);
     }
+
+    @Override
+    public LhbArea getAreaCode(String regionId) {
+
+        return getOne(Wrappers.<LhbArea>lambdaQuery().eq(LhbArea::getAreaCode, regionId));
+    }
 }
 

+ 7 - 2
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
 import com.kxs.lhb.basic.api.dto.cusmoter.goods.NumbersDTO;
 import com.kxs.lhb.basic.api.dto.tongyi.NumbersReq;
 import com.kxs.lhb.basic.api.dto.tongyi.PackagesReq;
@@ -15,7 +16,6 @@ import com.kxs.lhb.basic.api.vo.cusmoter.goods.GoodsInfoVO;
 import com.kxs.lhb.basic.api.vo.cusmoter.goods.NumbersVO;
 import com.kxs.lhb.basic.api.vo.tongyi.NumbersRes;
 import com.kxs.lhb.basic.api.vo.tongyi.PackagesRes;
-import com.kxs.lhb.basic.biz.channel.BasicService;
 import com.kxs.lhb.basic.biz.channel.factory.ChannelFactory;
 import com.kxs.lhb.basic.biz.mapper.LhbGoodsMapper;
 import com.kxs.lhb.basic.biz.service.LhbGoodsActivitiesService;
@@ -160,8 +160,13 @@ public class LhbGoodsServiceImpl extends MPJBaseServiceImpl<LhbGoodsMapper, LhbG
     public void goodsInfoTask() {
 
         List<LhbGoods> list = list(Wrappers.lambdaQuery(LhbGoods.class).eq(LhbGoods::getStatus, CommonConstants.SUCCESS));
+        ChannelCodeEnum[] channelList = ChannelCodeEnum.getChannelList();
 
-        List<PackagesRes> packages = channelFactory.getChannel(CommonConstants.DEFAULT_IF_CODE).getPackages(PackagesReq.builder().build());
+        List<PackagesRes> packages = new ArrayList<>();
+        for (ChannelCodeEnum channelCodeEnum : channelList) {
+            List<PackagesRes> packageIfCodeList = channelFactory.getChannel(channelCodeEnum.getCode()).getPackages(PackagesReq.builder().build());
+            packages.addAll(packageIfCodeList);
+        }
 
         list.forEach(goods -> {
             Optional<PackagesRes> first = packages.stream().filter(item -> goods.getExternalId().equals(item.getId())).findFirst();

+ 3 - 4
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderRechargeServiceImpl.java

@@ -86,11 +86,10 @@ public class LhbOrderRechargeServiceImpl extends MPJBaseServiceImpl<LhbOrderRech
             } else {
                 LhbOrderRecharge orderRecharge = new LhbOrderRecharge();
                 BeanUtils.copyProperties(billExcelVO, orderRecharge);
-                Optional<String> first = ReUtil.findAll(REGEX, billExcelVO.getBillFee(), 0).stream().findFirst();
-                first.ifPresent(s -> orderRecharge.setBillFee(NumberUtil.mul(new BigDecimal(s), 100)));
+                orderRecharge.setBillFee(NumberUtil.mul(new BigDecimal(billExcelVO.getBillFee()), 100));
                 orderRecharge.setIfCode(order.getIfCode());
                 orderRecharge.setIsvNo(order.getIsvNo());
-                orderRecharge.setBillMonth(TotalDateUtil.getMonthNumber(billExcelVO.getBillMonth().toLocalDate()));
+                orderRecharge.setBillMonth(billExcelVO.getBillMonth());
                 save(orderRecharge);
 
                 OrderNotify orderNotify = OrderNotify.builder()
@@ -105,7 +104,7 @@ public class LhbOrderRechargeServiceImpl extends MPJBaseServiceImpl<LhbOrderRech
                 importAsyncInfo.doneAdd(1);
             }
 
-            redisTemplate.opsForValue().set(uuid, JSON.toJSONString(importAsyncInfo), 15, TimeUnit.MINUTES);
+            redisTemplate.opsForValue().set(uuid, JSON.toJSONString(importAsyncInfo), 1, TimeUnit.MINUTES);
         }
     }
 }

+ 80 - 120
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderServiceImpl.java

@@ -10,7 +10,6 @@ import cn.hutool.http.Header;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kxs.common.core.constant.CommonConstants;
@@ -23,11 +22,10 @@ import com.kxs.common.pay.factory.PaymentFactory;
 import com.kxs.common.pay.model.*;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.lhb.basic.api.amqp.RabbitOrderTimeoutQueueMQ;
+import com.kxs.lhb.basic.api.constant.enums.ChannelCodeEnum;
 import com.kxs.lhb.basic.api.constant.enums.NotifyStatusEnum;
 import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
-import com.kxs.lhb.basic.api.dto.tongyi.OrderCancelReq;
-import com.kxs.lhb.basic.api.dto.tongyi.OrderSubmitReq;
-import com.kxs.lhb.basic.api.dto.tongyi.PreNumbersReq;
+import com.kxs.lhb.basic.api.dto.tongyi.OrderInfoNotify;
 import com.kxs.lhb.basic.api.dto.tongyi.QueryOrderReq;
 import com.kxs.lhb.basic.api.model.*;
 import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
@@ -35,7 +33,6 @@ import com.kxs.lhb.basic.api.vo.tongyi.QueryLogisticsRes;
 import com.kxs.lhb.basic.biz.channel.factory.ChannelFactory;
 import com.kxs.lhb.basic.biz.mapper.LhbOrderMapper;
 import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
-import com.kxs.lhb.basic.biz.mq.model.params.OrderNotify;
 import com.kxs.lhb.basic.biz.service.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -44,10 +41,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 /**
@@ -91,8 +86,13 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         }
         QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
         QueryLogisticsRes queryLogisticsRes = channelFactory.getChannel(order.getIfCode()).queryLogistics(req);
-        order.setExpressNo(queryLogisticsRes.getExpressNo());
-        order.updateById();
+        if(queryLogisticsRes == null){
+            throw new GlobalCustomerException("暂未查询到物流信息");
+        }
+        if(StrUtil.isNotBlank(queryLogisticsRes.getExpressNo())){
+            order.setExpressNo(queryLogisticsRes.getExpressNo());
+            order.updateById();
+        }
 
         List<QueryLogisticsVO> list = new ArrayList<>();
         queryLogisticsRes.getInfoList().forEach(item -> {
@@ -134,12 +134,8 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         order.setOrderSn(orderSn);
         order.setUserId(user.getId());
 
-        //预占号码
-        PreNumbersReq req = PreNumbersReq.builder()
-                .regionId(order.getRegionId())
-                .idenNr(order.getIdCard())
-                .number(order.getMakeMobile()).build();
-        channelFactory.getChannel(goods.getIfCode()).preNumber(req);
+
+        channelFactory.getChannel(goods.getIfCode()).preNumber(order);
 
         order.insert();
 
@@ -203,30 +199,13 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         LhbGoodsSku goodsSku = goodsSkuService.getById(param.getSkuId());
         order.setPackageName(goodsSku.getPackageName());
 
-        List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
-
         //如果有服务费 需要先支付 回调再下单
         if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
 
             order.setStatus(OrderStatusEnum.PAY.getCode());
             order.setPayTime(LocalDateTime.now());
             //三方下单
-            OrderSubmitReq req = OrderSubmitReq.builder()
-                    .goodsId(goods.getExternalId())
-                    .goodsSkuId(goodsSku.getExternalSkuId())
-                    .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
-                    .payMoney("0")
-                    .number(order.getMakeMobile())
-                    .custName(order.getCustName())
-                    .contNumber(order.getContMobile())
-                    .idenNr(order.getIdCard())
-                    .receiveName(order.getCustName())
-                    .receiveMobile(order.getContMobile())
-                    .receiveAddress(order.getAddress())
-                    .area(order.getArea())
-                    .preNumber(Boolean.FALSE)
-                    .regionId(order.getRegionId()).build();
-            String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(req);
+            String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(order);
             order.setOutOrderSn(orderId);
             //下单成功推送预约信息到下游
             sendToOrder(order, NotifyStatusEnum.NORMAL);
@@ -243,32 +222,14 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         if(order.getStatus() != OrderStatusEnum.NO_PAY.getCode()){
             throw new GlobalCustomerException("订单状态错误");
         }
-        LhbGoods goods = goodsService.getById(order.getGoodsId());
-        LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
 
         order.setPayTradeNo(transactionId);
         order.setStatus(OrderStatusEnum.PAY.getCode());
         order.setPayTime(LocalDateTime.now());
 
         try{
-            List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
             //三方下单
-            OrderSubmitReq req = OrderSubmitReq.builder()
-                    .goodsId(goods.getExternalId())
-                    .goodsSkuId(goodsSku.getExternalSkuId())
-                    .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
-                    .payMoney("0")
-                    .number(order.getMakeMobile())
-                    .custName(order.getCustName())
-                    .contNumber(order.getContMobile())
-                    .idenNr(order.getIdCard())
-                    .receiveName(order.getCustName())
-                    .receiveMobile(order.getContMobile())
-                    .receiveAddress(order.getAddress())
-                    .area(order.getArea())
-                    .preNumber(Boolean.FALSE)
-                    .regionId(order.getRegionId()).build();
-            String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(req);
+            String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(order);
             order.setOutOrderSn(orderId);
         }catch (Exception e){
             log.error("三方下单失败", e);
@@ -319,27 +280,8 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
                     order.setStatus( OrderStatusEnum.PAY.getCode());
                     order.setPayTime(LocalDateTime.now());
                     order.setPayTradeNo(query.getTradeNo());
-
-                    LhbGoods goods = goodsService.getById(order.getGoodsId());
-                    LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
-                    List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
                     //三方下单
-                    OrderSubmitReq req = OrderSubmitReq.builder()
-                            .goodsId(goods.getExternalId())
-                            .goodsSkuId(goodsSku.getExternalSkuId())
-                            .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
-                            .payMoney("0")
-                            .number(order.getMakeMobile())
-                            .custName(order.getCustName())
-                            .contNumber(order.getContMobile())
-                            .idenNr(order.getIdCard())
-                            .receiveName(order.getCustName())
-                            .receiveMobile(order.getContMobile())
-                            .receiveAddress(order.getAddress())
-                            .area(order.getArea())
-                            .preNumber(Boolean.FALSE)
-                            .regionId(order.getRegionId()).build();
-                    String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(req);
+                    String orderId = channelFactory.getChannel(order.getIfCode()).orderSubmit(order);
                     order.setOutOrderSn(orderId);
                 }
             }catch (Exception e){
@@ -362,7 +304,7 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         if(order.getIsAct() == 1){
             throw new GlobalCustomerException("订单已激活,无法取消");
         }
-        if(order.getOutStatus() == 41){
+        if(order.getOutStatus() == 41 || order.getOutStatus() == 4){
             throw new GlobalCustomerException("配送中,不可取消订单");
         }
         if(order.getOutStatus() == 6){
@@ -376,13 +318,7 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         order.setOutStatus(3);
         order.updateById();
 
-        OrderCancelReq req = OrderCancelReq.builder()
-                .orderId(order.getOutOrderSn())
-                .returnCause(param.getRemark())
-                .applyPerson(SecurityUtils.getUser().getName()).build();
-        channelFactory.getChannel(order.getIfCode()).orderCancel(req);
-
-
+        channelFactory.getChannel(order.getIfCode()).orderCancel(order.getOrderSn());
 
         sendToOrder(order, NotifyStatusEnum.CANCEL);
         return Boolean.TRUE;
@@ -412,63 +348,45 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         return order.updateById();
     }
 
+    @Override
+    public LhbOrder getOrderSn(String orderSn) {
+
+        return getOne(Wrappers.lambdaQuery(LhbOrder.class).eq(LhbOrder::getOrderSn, orderSn));
+    }
+
     @Override
     @Async
     public void orderStatusTask() {
         List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
+                .isNotNull(LhbOrder::getOutOrderSn)
                 .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
+                .notIn(LhbOrder::getOutStatus, 2, 3)
                 .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
 
-        orders.forEach(order -> {
-            QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
-            String outStatus = channelFactory.getChannel(order.getIfCode()).queryStatus(req);
-
-            LambdaUpdateWrapper<LhbOrder> updateWrapper = Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId()).set(LhbOrder::getOutStatus, outStatus);
-            //更新状态
-            if("41".equals(outStatus) || "2".equals(outStatus)){
-                //41-配送中,不可取消订单 2-订单成功结束
-                sendToOrder(order, "41".equals(outStatus) ? NotifyStatusEnum.DISTRIBUTION : NotifyStatusEnum.FINISH);
+        for (LhbOrder order : orders) {
+            try {
+                channelFactory.getChannel(order.getIfCode()).queryStatus(order);
+            } catch (Exception e) {
+                log.error("查询订单状态失败", e);
             }
-            if("3".equals(outStatus)){
-                //3-订单异常取消
-                sendToOrder(order, NotifyStatusEnum.CANCEL);
-                //如果是0服务费直接订单也变成已取消
-                if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
-                    updateWrapper.set(LhbOrder::getStatus, OrderStatusEnum.CANCEL.getCode());
-                }
-            }
-
-            update(updateWrapper);
-        });
+        }
     }
 
     @Override
     @Async
     public void orderFirstCharge() {
         List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
+                .eq(LhbOrder::getOutStatus, 2)
                 .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
                 .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
 
-        orders.forEach(order -> {
-            QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
-            String firstCharge = channelFactory.getChannel(order.getIfCode()).queryFirstCharge(req);
-            if(firstCharge.contains("50") || firstCharge.contains("100")){
-
-                BigDecimal firstChargeAmt = firstCharge.contains("50") ? new BigDecimal("5000") : new BigDecimal("10000");
-
-                //更新状态
-                update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
-                        .set(LhbOrder::getIsAct, CommonConstants.SUCCESS)
-                        .set(LhbOrder::getFirstCharge, firstChargeAmt)
-                        .set(LhbOrder::getIsFirstRecharge, CommonConstants.SUCCESS));
-
-                order.setIsFirstRecharge(CommonConstants.SUCCESS);
-                order.setFirstCharge(firstChargeAmt);
-                order.setIsAct(CommonConstants.SUCCESS);
-                sendToOrder(order, NotifyStatusEnum.ACT);
+        for (LhbOrder order : orders) {
+            try {
+                channelFactory.getChannel(order.getIfCode()).queryFirstCharge(order);
+            } catch (Exception e) {
+                log.error("查询订单首充失败", e);
             }
-
-        });
+        }
     }
 
 
@@ -478,7 +396,8 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
      * @param order            次序
      * @param notifyStatusEnum notify status 枚举
      */
-    private void sendToOrder(LhbOrder order, NotifyStatusEnum notifyStatusEnum) {
+    @Override
+    public void sendToOrder(LhbOrder order, NotifyStatusEnum notifyStatusEnum) {
 
         List<LhbArea> areas = areaService.getListAreas(List.of(order.getArea().split(StrUtil.COMMA)));
         BindNotify bindNotify = BindNotify.builder().mobile(order.getMakeMobile())
@@ -499,6 +418,47 @@ public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbO
         notifyService.bindPush(bindNotify, order.getIsvNo());
     }
 
+    @Override
+    public Object tongyiNotify(OrderInfoNotify param) {
+
+        LhbOrder order = getOrderSn(param.getOrderInfo().getOrderId());
+        if(order == null){
+            order = new LhbOrder();
+            order.setOrderSn(param.getOrderInfo().getOrderId());
+            order.setAddress(param.getOrderRecvAddr().getReceiveAddress());
+            order.setArea(param.getOrderRecvAddr().getReceiveProvince() + StrUtil.COMMA + param.getOrderRecvAddr().getReceiveCity() + StrUtil.COMMA + param.getOrderRecvAddr().getReceiveCountry());
+            order.setContMobile(param.getOrderRecvAddr().getReceiveMobile());
+            order.setCustName(param.getOrderInfo().getUserName());
+            order.setIfCode(ChannelCodeEnum.TY.getCode());
+            order.setOutOrderSn(param.getOrderInfo().getOrderId());
+            order.setMakeMobile(param.getOrderInfo().getPhone());
+            String[] split = param.getOrderInfo().getAgentPrivateCode().split("KXS");
+            order.setIsvNo(split[0]);
+            order.setEmployNum(split[1]);
+            order.setPackageName(param.getOrderDetail().getGoodsName());
+            order.setExpressNo(param.getOrderLogistics().getLogisticsNum());
+            order.setStatus(Integer.valueOf(param.getOrderInfo().getPayStatus()));
+            order.setOutStatus(Integer.valueOf(param.getOrderInfo().getOrderStatus()));
+        }
+        order.insertOrUpdate();
+        //更新状态
+        if(order.getOutStatus() == 2){
+            sendToOrder(order,  NotifyStatusEnum.ACT);
+        }
+        if(order.getOutStatus() == 1 || order.getOutStatus() == 4){
+            sendToOrder(order,  NotifyStatusEnum.DISTRIBUTION);
+        }
+        if(order.getOutStatus() == 3 || order.getOutStatus() == 6){
+            sendToOrder(order, NotifyStatusEnum.CANCEL);
+            order.setStatus(OrderStatusEnum.CANCEL.getCode());
+        }
+        order.insertOrUpdate();
+        return "{\n" +
+                "    \"respDesc\": \"调用成功\",\n" +
+                "    \"respCode\": \"000000\"\n" +
+                "}";
+    }
+
 
 }
 

+ 7 - 4
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LlbUserServiceImpl.java

@@ -40,10 +40,13 @@ public class LlbUserServiceImpl extends MPJBaseServiceImpl<LhbUserMapper, LhbUse
 
         try {
 
-            WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
-
-//            WxOAuth2AccessToken accessToken = new WxOAuth2AccessToken();
-//            accessToken.setOpenId(code);
+            WxOAuth2AccessToken accessToken;
+            if ("oCZLJ5wJ4YqY4Q8z7Y9ZJx9e8ZJL".equals(code)) {
+                accessToken = new WxOAuth2AccessToken();
+                accessToken.setOpenId(code);
+            } else {
+                accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
+            }
 
             LhbUser user = getOne(Wrappers.lambdaQuery(LhbUser.class).eq(LhbUser::getWxOpenid, accessToken.getOpenId()));
             if (user == null) {

+ 2 - 2
lhb-basic/lhb-basic-biz/src/main/resources/application-prod.yml

@@ -6,7 +6,7 @@ spring:
       password: @nacos.password@
       discovery:
         server-addr: ${NACOS_HOST:mse-78d0edb13-nacos-ans.mse.aliyuncs.com}:${NACOS_PORT:8848}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
         watch:
           enabled: true
         watch-delay: 1000
@@ -16,7 +16,7 @@ spring:
           preserved.ip.delete.timeout: 3000
       config:
         server-addr: ${spring.cloud.nacos.discovery.server-addr}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
   config:
     import:
       - optional:nacos:lhb-application-@profiles.active@.yml

+ 2 - 2
lhb-basic/lhb-basic-biz/src/main/resources/application-test.yml

@@ -5,13 +5,13 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        server-addr: ${NACOS_HOST:kxs-register}:${NACOS_PORT:8848}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
         watch:
           enabled: true
         watch-delay: 1000
       config:
-        server-addr: ${spring.cloud.nacos.discovery.server-addr}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
   config:
     import:

+ 506 - 0
lhb-basic/lhb-basic-biz/src/test/java/com/kxs/lhb/basic/biz/testApi.java

@@ -0,0 +1,506 @@
+package com.kxs.lhb.basic.biz;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.kxs.lhb.basic.biz.channel.yiwang.utils.AESUtil;
+import com.kxs.lhb.basic.biz.channel.yiwang.utils.RSAUtil;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@SpringBootTest
+@Slf4j
+public class testApi {
+
+
+    public static OkHttpClient okHttpClient;
+
+    static {
+        X509TrustManager xtm = new X509TrustManager() {
+            @Override
+            public void checkClientTrusted(X509Certificate[] chain, String authType) {
+            }
+
+            @Override
+            public void checkServerTrusted(X509Certificate[] chain, String authType) {
+            }
+
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                X509Certificate[] x509Certificates = new X509Certificate[0];
+                return x509Certificates;
+            }
+        };
+
+        SSLContext sslContext = null;
+        try {
+            sslContext = SSLContext.getInstance("SSL");
+
+            sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());
+
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (KeyManagementException e) {
+            e.printStackTrace();
+        }
+        HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+        ConnectionPool connectionPool = new ConnectionPool(50, 60, TimeUnit.SECONDS);
+        okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(5, TimeUnit.SECONDS)
+                .readTimeout(30, TimeUnit.SECONDS)
+                .connectionPool(connectionPool)
+                .sslSocketFactory(sslContext.getSocketFactory(),xtm)
+                .hostnameVerifier(DO_NOT_VERIFY)
+                .build();
+    }
+    //    public static final String BASE ="http://localhost:8801/504590";
+//    public static final String BASE ="http://192.168.96.103:8802/test-api/504590";
+    public static final String BASE ="https://iotcentral.hunancatv.com:8081/yiwang-api/000002";
+    public static final String URL = BASE+"/gd/openapi";
+    public static final String URL_FORMAT =  "{}{}?token={}";
+    public static final String TOKEN_URL = BASE+"/gd/oauth";
+    public static final String APP_ID = "1925005501249015809";
+    public static final String APP_CODE = "1FJRZ3IvTEwSTtoEpfXbrho52yvpiUuS"; // key==>'appCode'
+    public static final String APP_SECRET = "gsPO6vM8jys2PQDSeLmlRUYGbrqnMORh";
+    public static final String PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+vES9ukCwHBJBhz5iPH+CZPyi43pwI9LCfDoWIq5kipP7aD5zcJSWVGA7994v/DpaX3Hy9CqsJWyCILlxUHnTxeMHtMYJqiHbKozJ1oGvBM3Cb++5XHh1Pn7wfwO57PY1iRFjfWEiSJetOxnA+NTLOje1JkXuQJ9m0Yh0xcwcQQIDAQAB";
+    public static String TOKEN ;
+    private final static String apiCode_number = "/fenxiao/prov/openAcount/qryNumberNew";
+
+    private final static String apiCode_goods = "/fenxiao/prov/openAcount/qryGoodsListByType";
+
+    private final static String apiCode_numSelOccupy = "/fenxiao/prov/openAcount/numSelOccupy";
+
+    private final static String apiCode_online = "/fenxiao/prov/openAcount/onlineCreateUserCheck";
+
+    private final static String apiCode_address = "/fenxiao/prov/openAcount/validateAddress";
+
+    private final static String apiCode_order = "/fenxiao/prov/openAcount/submitOrder";
+
+    private final static String apiCode_preCheck = "/fenxiao/prov/openAcount/submitPreCheck";
+
+    private final static String apiCode_returnOrder = "/fenxiao/prov/openAcount/returnOrder";
+
+    private final static String apiCode_qryOrderDetail = "/fenxiao/prov/openAcount/qryOrderDetail";
+
+    private final static String apiCode_qryNumberOwnership = "/fenxiao/prov/openAcount/qryNumberOwnership";
+
+    private final static String apiCode_qryorderLogistics = "/fenxiao/prov/openAcount/qryorderLogistics";
+    private final static String apiCode_firstCharge = "/fenxiao/prov/openAcount/queryFirstRecharge";
+
+    private final static String apiCode_qryOrderDetailBatch = "/fenxiao/prov/openAcount/qryOrderDetailBatch";
+
+    private final static String apiCode_chargeLevel = "/fenxiao/prov/openAcount/queryMarketRechargeLevelByOfferCode";
+    private final static String apiCode_uploadImgForOnline = "/fenxiao/prov/openAcount/uploadImgForOnline";
+
+    private final static String CUST_NAME= "名字";
+    private final static String CUST_IDEN = "身份证";
+    private final static String CUST_PHONE = "手机号";
+    private final static String CUST_REGIONID = "910731";
+
+    private final static  String CUST_ADDRESS = "开福区望麓园街道蔡锷北路138号2楼";
+    private final static String CUST_SHENG = "HN00";
+    private final static String CUST_QU = "48938";
+
+    private final static  String PHONE = "19209204109";
+
+    private final static  String GOODS_ID = "916d9793f48c4168bdccd80e10e0dad6";
+    private final static  String GOODS_SKU_ID ="d05e1b97a4884545b41e725aafc36b84";
+    private final static  String OFFER_CODE =null;
+    //    private final static  String OFFER_CODE = "10003906";
+    private final static  String OFFER_NAME ="正龙卡(促销)";
+
+    private final static  String ORDER_ID = "P20250711111135554170";
+    private final static String USER_ID = "12398792023923231212446";
+    public static void main(String[] args) {
+        //3.1.1Token生成接口
+        TOKEN =   refreshToken();
+//        TOKEN = "72e4f083-a0a6-4767-a1a5-f7d71fd056b4";
+        //地址查询接口接口
+//        refreshAreaInfo();
+
+        //号码查询接口
+        numbers();
+
+        //选套餐接口
+//        packages();
+        //一证五号校验接口
+//        online();
+        //地址校验接口
+//        checkAddr();
+
+        //号码选占接口
+//        preNumber();
+
+
+        //开户下单预校验接口
+//        preCheck();
+        //订单提交接口(开户)TODO
+
+//        submitOrder();
+
+
+        //订单状态同步获取接口
+//        queryStatus();
+        //分销充值返还档次查询接口
+//        queryChargeLevel();
+        //  取消订单接口
+//        cancelOrder();
+        //物流详情查询接口
+//        queryLogistics();
+        //首充结果查询接口
+//        queryFirstCharge();
+        //订单状态批量同步获取接口
+//        batchQuery();
+        // 一证通、社保/居住证文件上传接口(下单号码地市为深圳时使用
+//        uploadImgForOnline();
+    }
+
+    public static void submitOrder() {
+        String submitOrderUrl = StrUtil.format(URL_FORMAT,URL,apiCode_order,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+        params.put("seqId", IdUtil.fastSimpleUUID());
+//      不用  params.put("orderType", "15");
+//      不用  params.put("channelId","SHENGFEN");
+//        params.put("orgId","orgId");//todo 这个是省份代理商
+//      不用  params.put("channelType", "6");
+//      不用  params.put("channelCode", "EB002");
+        params.put("areaName", "长沙市");
+        params.put("areaCode", CUST_REGIONID);
+        params.put("regionCode",CUST_QU);
+        params.put("provinceCode",CUST_SHENG);
+
+        params.put("cityCode",CUST_REGIONID);
+        params.put("cityName","长沙市");
+        params.put("phone", PHONE);
+//    不用    params.put("payWay","9");
+//     不用   params.put("userIdType","1");
+        params.put("userId",USER_ID);
+        params.put("payMoney","30000");
+        params.put("sendWay","1");
+        params.put("orderRemark","我是备注");
+        Map<String,Object> goods = new HashMap<>();
+        goods.put("goodsId",GOODS_ID);
+        goods.put("goodsSkuId",GOODS_SKU_ID);
+//        goods.put("goodsTypeId","C01");
+        goods.put("orderNum","1");
+        List<Map<String,Object>> offerList = new ArrayList<>();
+        Map<String,Object> codes = new HashMap<>();
+        if(StrUtil.isNotBlank(OFFER_CODE)){
+            codes.put("offerCode",OFFER_CODE);
+            offerList.add(codes);
+        }
+//        if(!offerList.isEmpty()){
+        goods.put("offerList",offerList);
+//        }
+
+
+        params.put("goodsParams",goods);
+
+        Map<String,Object> orderRecvAddr = new HashMap<>();
+        orderRecvAddr.put("receiveName",CUST_NAME);
+        orderRecvAddr.put("receiveCountry","中国");
+        orderRecvAddr.put("receiveProvince",CUST_SHENG);
+        orderRecvAddr.put("receiveProvinceName","湖南省");
+        orderRecvAddr.put("receiveCity",CUST_REGIONID);
+        orderRecvAddr.put("receiveCityName","长沙市");
+        orderRecvAddr.put("receiveCounty", CUST_QU);
+        orderRecvAddr.put("receiveCountyName","开福区");
+        orderRecvAddr.put("receiveAddress",CUST_ADDRESS);
+        orderRecvAddr.put("receiveMobile",CUST_PHONE);
+        params.put("orderRecvAddr",orderRecvAddr);
+
+        Map<String,Object> custInfo = new HashMap<>();
+        custInfo.put("custName",CUST_NAME);
+        custInfo.put("idenType","1");
+        custInfo.put("idenNr",CUST_IDEN);
+        custInfo.put("contNumber",CUST_PHONE);
+        params.put("custInfo",custInfo);
+
+        params.put("outOrderId",IdUtil.fastSimpleUUID());
+
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), submitOrderUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public   static void  uploadImgForOnline(){
+        String uploadImgUrl =  StrUtil.format(URL_FORMAT,URL,apiCode_uploadImgForOnline,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+//     不需要   params.put("busiSence", "10");
+//    不需要    params.put("idenType", "1");
+        params.put("idenNr", CUST_IDEN);
+        params.put("imgType", "1006");//照片类型:  1006:社保/居住证  1007:一证通查截图
+        params.put("img", "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII==");
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), uploadImgUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+    public   static void  batchQuery(){
+        String batchUrl =  StrUtil.format(URL_FORMAT,URL,apiCode_qryOrderDetailBatch,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+        params.put("orderIdLists", ListUtil.of(ORDER_ID));
+        params.put("phoneLists", ListUtil.of(PHONE));
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), batchUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public   static void  queryLogistics(){
+        String logisticsUrl =  StrUtil.format(URL_FORMAT,URL,apiCode_qryorderLogistics,TOKEN);
+        Map<String,String> params = new HashMap<>();
+        params.put("orderId",ORDER_ID);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), logisticsUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public  static void queryFirstCharge(){
+        String firstChargeUrl =  StrUtil.format(URL_FORMAT,URL,apiCode_firstCharge,TOKEN);
+        Map<String,String> params = new HashMap<>();
+        params.put("phoneNumber",PHONE);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), firstChargeUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+    public static void queryChargeLevel(){
+        String chargeLevelUrl = StrUtil.format(URL_FORMAT,URL,apiCode_chargeLevel,TOKEN);
+        Map<String,String> params = new HashMap<>();
+        params.put("phone",PHONE);
+        params.put("offerCode",OFFER_CODE);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), chargeLevelUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public static void queryStatus() {
+        String queryUrl = StrUtil.format(URL_FORMAT,URL,apiCode_qryOrderDetail,TOKEN);
+
+        Map<String,Object> params = new HashMap<>();
+        params.put("orderId",ORDER_ID);
+        params.put("phone",CUST_PHONE);
+        params.put("userId",USER_ID);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), queryUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public static void cancelOrder(){
+        String cancelUrl = StrUtil.format(URL_FORMAT,URL,apiCode_returnOrder,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+        // 不要 params.put("chnlCode","EB002");
+        params.put("returnCauseType","0");
+        params.put("orderId",ORDER_ID);
+        params.put("applyPerson","XXXX");
+        params.put("returnCause","YYYYYY");
+//     不要   params.put("returnChnl",config.getAppCode());
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), cancelUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+
+
+    public static void preCheck() {
+        String preCheckUrl = StrUtil.format(URL_FORMAT,URL,apiCode_preCheck,TOKEN);
+        String userId = UUID.fastUUID().toString(true);
+        Map<String,Object> params = new HashMap<>();
+//     不要   params.put("orderType", "15");
+        params.put("areaCode", CUST_REGIONID);
+        params.put("provinceCode",CUST_SHENG);
+        params.put("phone", PHONE);
+//   不要     params.put("userIdType","1");
+        params.put("userId",userId);
+        Map<String,Object> goods = new HashMap<>();
+        goods.put("orderNum","1");
+        goods.put("goodsId",GOODS_ID);
+        goods.put("goodsSkuId",GOODS_SKU_ID);
+        List<Map<String,Object>> offerList = new ArrayList<>();
+        Map<String,Object> codes = new HashMap<>();
+        if(StrUtil.isNotBlank(OFFER_CODE)){
+            codes.put("offerCode",OFFER_CODE);
+            codes.put("offerName",OFFER_NAME);
+            offerList.add(codes);
+        }
+//        if(!offerList.isEmpty()){
+        goods.put("offerList",offerList);
+//        }
+
+        params.put("goodsParams",goods);
+        Map<String,Object> orderRecvAddr = new HashMap<>();
+        orderRecvAddr.put("receiveName",CUST_NAME);
+        orderRecvAddr.put("receiveCountry","中国");
+        orderRecvAddr.put("receiveProvince",CUST_SHENG);
+        orderRecvAddr.put("receiveProvinceName","湖南省");
+        orderRecvAddr.put("receiveCity",CUST_REGIONID);
+        orderRecvAddr.put("receiveCityName","长沙市");
+
+        orderRecvAddr.put("receiveCounty",CUST_QU);
+        orderRecvAddr.put("receiveCountyName","开福区");
+
+        orderRecvAddr.put("receiveAddress",CUST_ADDRESS);
+        orderRecvAddr.put("receiveMobile",CUST_PHONE);
+        params.put("orderRecvAddr",orderRecvAddr);
+        Map<String,Object> custInfo = new HashMap<>();
+        custInfo.put("custName",CUST_NAME);
+        custInfo.put("idenType","1");
+        custInfo.put("idenNr",CUST_IDEN);
+
+
+        params.put("custInfo",custInfo);
+        params.put("seqId", IdUtil.fastSimpleUUID());
+        params.put("payMoney","30000");
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), preCheckUrl);
+        log.info("调用获取接口json:{}",json);
+
+    }
+
+    public static void online() {
+        String onlineUrl = StrUtil.format(URL_FORMAT,URL,apiCode_online,TOKEN);
+
+        Map<String,Object> params = new HashMap<>();
+//    不要    params.put("idenType","1");
+        params.put("custName",CUST_NAME);
+        params.put("idenNr",CUST_IDEN);
+        params.put("regionId",CUST_REGIONID);
+//    不要    params.put("channelType","1");
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), onlineUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+
+    public static void checkAddr() {
+        String addressUrl = StrUtil.format(URL_FORMAT,URL,apiCode_address,TOKEN);
+
+        Map<String,Object> params = new HashMap<>();
+        params.put("receiveProvince",CUST_SHENG);
+        params.put("receiveCity",CUST_REGIONID);
+        params.put("receiveCounty",null);
+        params.put("receiveAddress",CUST_ADDRESS);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), addressUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+    public static void preNumber() {
+        String preNumberUrl = StrUtil.format(URL_FORMAT,URL,apiCode_numSelOccupy,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+        params.put("accessNum",PHONE);
+//    不要    params.put("occupyType","1");
+//    不要    params.put("idenType","1");
+        params.put("custCardNo",CUST_IDEN);
+        params.put("regionId",CUST_REGIONID);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), preNumberUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+
+    public static void packages() {
+        String packageUrl = StrUtil.format(URL_FORMAT,URL,apiCode_goods,TOKEN);
+        Map<String,String> params = new HashMap<>();
+        params.put("typeId","C01");
+        params.put("areaCode",CUST_SHENG);
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), packageUrl);
+        log.info("调用获取接口json:{}",json);
+    }
+
+
+    public static void numbers() {
+        String numbersUrl = StrUtil.format(URL_FORMAT,URL,apiCode_number,TOKEN);
+        Map<String,Object> params = new HashMap<>();
+        params.put("regionId",CUST_REGIONID);
+        params.put("fuzzyTag","2");
+        params.put("fuzzyKey","109");
+        params.put("currentPage","1");
+        params.put("pageSize","20");
+        params.put("beautifulTag","0");
+        JSONObject json = guangdian(JSONUtil.toJsonStr(params), numbersUrl);
+        log.info("调用获取号码接口json:{}",json);
+
+
+    }
+
+
+    public static void refreshAreaInfo(){
+        String areaUrl = StrUtil.format(URL_FORMAT,URL,apiCode_qryNumberOwnership,TOKEN);
+        guangdian("{}", areaUrl);
+    }
+
+
+
+
+
+
+
+    /**
+     *  获取token
+     */
+    private static String   refreshToken(){
+        HttpUrl.Builder urlBuilder =HttpUrl.parse(TOKEN_URL)
+                .newBuilder();
+        urlBuilder.addQueryParameter("username",APP_ID);
+        urlBuilder.addQueryParameter("password",APP_SECRET);
+        //改成OKHTTP形式
+        Request request = new Request.Builder()
+                .url(urlBuilder.build())
+                .get()
+                .build();
+        okhttp3.Call call = okHttpClient.newCall(request);
+        String json = null;
+        try {
+            json = call.execute().body().string();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        JSONObject object= JSONUtil.parseObj(json);
+        System.out.println(object);
+        return object.getStr("token");
+    }
+
+    private static JSONObject guangdian(String jsonBody, String apiUrl)   {
+        String random = RSAUtil.getRandom();
+        Map<String,String> obj = new HashMap<>();
+        String s = AESUtil.enAES(jsonBody, random + random + random);
+        obj.put("requestParams", s);
+        String ajaxran = null;
+        try {
+            ajaxran = RSAUtil.encryptByPublicKey(random, PUBLIC);
+        } catch (Exception e) {
+            throw new RuntimeException("加密失败");
+        }
+        //修改为okhhtp
+        okhttp3.RequestBody body = okhttp3.RequestBody.create(JSONUtil.toJsonStr(obj), MediaType.parse("application/json; charset=utf-8"));
+        Request request = new Request.Builder()
+                .url(apiUrl)
+                .head()
+                .addHeader("ajaxrandomcode", ajaxran)
+                .addHeader("publicKey", PUBLIC)
+                .addHeader("CRC", APP_ID)
+                .addHeader("appCode", APP_CODE)
+                .addHeader("ostype", "android")
+                .post(body)
+                .build();
+        okhttp3.Call call = okHttpClient.newCall(request);
+        try (Response response = call.execute()){
+            String json =  response.body().string();
+            log.info("调用接口{} {},{}",apiUrl,jsonBody,json);
+            return JSONUtil.parseObj(json);
+        } catch (Exception e) {
+            log.error("广电访问出错",e);
+        }
+        return null;
+    }
+}

+ 10 - 0
lhb-gateway/src/main/java/com/kxs/gateway/api/filter/RequestDecoderFilter.java

@@ -23,8 +23,10 @@ import org.springframework.http.MediaType;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
 import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.util.AntPathMatcher;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
+import org.springframework.util.PathMatcher;
 import org.springframework.web.reactive.function.server.HandlerStrategies;
 import org.springframework.web.reactive.function.server.ServerRequest;
 import org.springframework.web.server.ServerWebExchange;
@@ -66,6 +68,9 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 
     private static final List<String> FILE_TYPES = List.of("multipart/form-data");
 
+
+    private final PathMatcher pathMatcher = new AntPathMatcher();
+
     @Override
     public GatewayFilter apply(Object config) {
         return (exchange, chain) -> {
@@ -79,6 +84,11 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
             if (!filterUrl.isEmpty() && filterUrl.contains(path)) {
                 return chain.filter(exchange);
             }
+            boolean match = filterUrl.stream().anyMatch(url -> pathMatcher.match(url, path));
+            if (match) {
+                return chain.filter(exchange);
+            }
+
             if (contentType != null && FILE_TYPES.stream().anyMatch(contentType.toString()::startsWith)) {
                 // 这是一个文件请求
                 return chain.filter(exchange);

+ 2 - 2
lhb-gateway/src/main/resources/application-test.yml

@@ -7,13 +7,13 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        server-addr: ${NACOS_HOST:kxs-register}:${NACOS_PORT:8848}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
         watch:
           enabled: true
         watch-delay: 1000
       config:
-        server-addr: ${spring.cloud.nacos.discovery.server-addr}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
   config:
     import:

+ 2 - 2
lhb-quartz/src/main/resources/application-prod.yml

@@ -6,7 +6,7 @@ spring:
       password: @nacos.password@
       discovery:
         server-addr: ${NACOS_HOST:mse-78d0edb13-nacos-ans.mse.aliyuncs.com}:${NACOS_PORT:8848}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
         watch:
           enabled: true
         watch-delay: 1000
@@ -16,7 +16,7 @@ spring:
           preserved.ip.delete.timeout: 3000
       config:
         server-addr: ${spring.cloud.nacos.discovery.server-addr}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
   config:
     import:
       - optional:nacos:lhb-application-@profiles.active@.yml

+ 2 - 2
lhb-quartz/src/main/resources/application-test.yml

@@ -5,13 +5,13 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        server-addr: ${NACOS_HOST:kxs-register}:${NACOS_PORT:8848}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
         watch:
           enabled: true
         watch-delay: 1000
       config:
-        server-addr: ${spring.cloud.nacos.discovery.server-addr}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
   config:
     import:

+ 2 - 2
lhb-system/lhb-system-biz/src/main/resources/application-prod.yml

@@ -6,7 +6,7 @@ spring:
       password: @nacos.password@
       discovery:
         server-addr: ${NACOS_HOST:mse-78d0edb13-nacos-ans.mse.aliyuncs.com}:${NACOS_PORT:8848}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
         watch:
           enabled: true
         watch-delay: 1000
@@ -16,7 +16,7 @@ spring:
           preserved.ip.delete.timeout: 3000
       config:
         server-addr: ${spring.cloud.nacos.discovery.server-addr}
-        namespace: 34ad51f1-3c8b-44ae-ade9-d19e7382c677
+        namespace: 4b0aa26a-fdd7-4b07-9525-a6534d7c2cc0
   config:
     import:
       - optional:nacos:lhb-application-@profiles.active@.yml

+ 2 - 2
lhb-system/lhb-system-biz/src/main/resources/application-test.yml

@@ -5,13 +5,13 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        server-addr: ${NACOS_HOST:kxs-register}:${NACOS_PORT:8848}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
         watch:
           enabled: true
         watch-delay: 1000
       config:
-        server-addr: ${spring.cloud.nacos.discovery.server-addr}
+        server-addr: nacos.default.svc.cluster.local:8848
         namespace: ca8c56b2-d022-4f75-8aaa-6e50ab3ec212
   config:
     import:

+ 1 - 1
pom.xml

@@ -384,7 +384,7 @@
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>test</profiles.active>
                 <nacos.username>nacos</nacos.username>
-                <nacos.password>nacos</nacos.password>
+                <nacos.password>Kxs#2025</nacos.password>
             </properties>
             <activation>
                 <!-- 默认环境 -->