瀏覽代碼

初始化代码

mac 7 月之前
父節點
當前提交
cf9629148f
共有 100 個文件被更改,包括 6210 次插入83 次删除
  1. 949 0
      .drone.yml
  2. 111 0
      docker-compose.yml
  3. 8 1
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/SecurityConstants.java
  4. 0 4
      kxs-common/kxs-common-security/pom.xml
  5. 10 1
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/component/SkyResourceServerConfiguration.java
  6. 0 69
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/service/LlbMechUserServiceImpl.java
  7. 3 4
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/core/SkyDaoAuthenticationProvider.java
  8. 56 0
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationConverter.java
  9. 66 0
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationProvider.java
  10. 21 0
      kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationToken.java
  11. 56 0
      lhb-basic/lhb-basic-api/pom.xml
  12. 104 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitLlbBindQueueMQ.java
  13. 104 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitLlbOrderQueueMQ.java
  14. 24 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/BasicConstants.java
  15. 26 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/sysNotify/SysNotifyDTO.java
  16. 52 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/sysNotify/SysNotifyPageDTO.java
  17. 19 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/BasicReq.java
  18. 二進制
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/NumbersReq.java
  19. 22 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderCancelReq.java
  20. 21 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderChargeLevelReq.java
  21. 34 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderSubmitReq.java
  22. 18 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PackagesReq.java
  23. 26 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PreNumbersReq.java
  24. 20 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/QueryOrderReq.java
  25. 16 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/TyCommonReq.java
  26. 95 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbArea.java
  27. 132 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbBanner.java
  28. 117 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbCol.java
  29. 187 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoods.java
  30. 145 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsActivities.java
  31. 145 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsSku.java
  32. 130 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbInterfaceConfig.java
  33. 110 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbIsvEmploy.java
  34. 152 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbIsvInfo.java
  35. 131 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbNotify.java
  36. 278 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrder.java
  37. 152 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrderRecharge.java
  38. 89 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbRulemaking.java
  39. 96 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbSupplier.java
  40. 234 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/RsaUtil.java
  41. 75 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/SmsUtils.java
  42. 1 4
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/TotalDateUtil.java
  43. 21 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/AreaRes.java
  44. 22 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/NumbersRes.java
  45. 24 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/OrderChargeLevelRes.java
  46. 24 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/OrderFirstChargeRes.java
  47. 45 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/PackagesRes.java
  48. 25 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/QueryLogisticsRes.java
  49. 17 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/TyCommRes.java
  50. 203 0
      lhb-basic/lhb-basic-biz/pom.xml
  51. 29 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/LhbBasicApplication.java
  52. 二進制
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java
  53. 69 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyBasicService.java
  54. 86 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyCustomerService.java
  55. 91 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysBannerController.java
  56. 81 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysColController.java
  57. 112 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysIsvInfoController.java
  58. 76 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysNotifyController.java
  59. 78 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysRuleMakingController.java
  60. 84 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysSupplierController.java
  61. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbAreaMapper.java
  62. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbBannerMapper.java
  63. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbColMapper.java
  64. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsActivitiesMapper.java
  65. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsMapper.java
  66. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsSkuMapper.java
  67. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbInterfaceConfigMapper.java
  68. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbIsvEmployMapper.java
  69. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbIsvInfoMapper.java
  70. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbNotifyMapper.java
  71. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbOrderMapper.java
  72. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbOrderRechargeMapper.java
  73. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbRulemakingMapper.java
  74. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbSupplierMapper.java
  75. 108 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLlbBindQueueListener.java
  76. 156 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLlbOrderQueueListener.java
  77. 20 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/CommMarking.java
  78. 90 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/MarkingModel.java
  79. 33 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/BindNotify.java
  80. 18 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/IsvParams.java
  81. 48 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/OrderNotify.java
  82. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbAreaService.java
  83. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbBannerService.java
  84. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbColService.java
  85. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsActivitiesService.java
  86. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsService.java
  87. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsSkuService.java
  88. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbInterfaceConfigService.java
  89. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbIsvEmployService.java
  90. 17 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbIsvInfoService.java
  91. 24 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbNotifyService.java
  92. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderRechargeService.java
  93. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderService.java
  94. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbRulemakingService.java
  95. 16 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbSupplierService.java
  96. 26 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java
  97. 26 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbBannerServiceImpl.java
  98. 26 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbColServiceImpl.java
  99. 26 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsActivitiesServiceImpl.java
  100. 26 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java

+ 949 - 0
.drone.yml

@@ -0,0 +1,949 @@
+kind: pipeline
+type: docker
+name: lhb-gateway-prod
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-gateway
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - 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: 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: 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: 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: 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 ====部署成功=======
+
+trigger:
+  branch:
+    - release-gateway
+  event:
+    - push
+  #排除合并请求
+  exclude:
+    - ref: refs/pull/*
+
+---
+kind: pipeline
+type: docker
+name: lhb-quartz-prod
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-quartz
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - 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 ====部署成功=======
+
+trigger:
+  branch:
+    - release-quartz
+  event:
+    - push
+  #排除合并请求
+  exclude:
+    - ref: refs/pull/*
+
+---
+kind: pipeline
+type: docker
+name: lhb-system-prod
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-system
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - 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-mech-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-mech-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-mech-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-mech-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 ====部署成功=======
+
+trigger:
+  branch:
+    - release-system
+  event:
+    - push
+  #排除合并请求
+  exclude:
+    - ref: refs/pull/*
+
+---
+kind: pipeline
+type: docker
+name: lhb-mech-prod
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-mech
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - mvn clean package -Dmaven.test.skip=true -P prod
+      - cp /drone/src/lhb-mech/lhb-mech-biz/target/*.jar /drone/src/dist/ && cp -r /drone/src/lhb-mech/lhb-mech-biz/target/lib /drone/src/dist/ && cp -r /drone/src/lhb-mech/lhb-mech-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-mech # 容器内目录 绝对路径
+    settings:
+      host:
+        from_secret: lhb-system-mech-a-host
+      username:
+        from_secret: username
+      password:
+        from_secret: lhb-pwd
+      port: 22
+      command_timeout: 2m
+      target: /home/ABServer/deploy-ready/
+      source:
+        - echo ====开始拷贝=======
+        - /lhb-mech/*.jar
+        - /lhb-mech/lib
+        - /lhb-mech/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-mech-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-mech-biz&ip=172.27.251.56&port=8888&weight=0'
+        - sleep 25s
+        - cd /home/ABServer/
+        - rm -rf /home/ABServer/webroot/lhb-mech/*
+        - cp -r /home/ABServer/deploy-ready/lhb-mech /home/ABServer/webroot/
+        - docker restart lhb-mech
+        - rm -rf /home/ABServer/deploy-ready/lhb-mech/*
+        # - 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-mech # 容器内目录 绝对路径
+    settings:
+      host:
+        from_secret: lhb-system-mech-b-host
+      username:
+        from_secret: username
+      password:
+        from_secret: lhb-pwd
+      port: 22
+      command_timeout: 2m
+      target: /home/ABServer/deploy-ready/
+      source:
+        - echo ====开始拷贝=======
+        - /lhb-mech/*.jar
+        - /lhb-mech/lib
+        - /lhb-mech/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-mech-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-mech-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-mech-biz&ip=172.27.251.65&port=8888&weight=0'
+        - sleep 25s
+        - cd /home/ABServer/
+        - rm -rf /home/ABServer/webroot/lhb-mech/*
+        - cp -r /home/ABServer/deploy-ready/lhb-mech /home/ABServer/webroot/
+        - docker restart lhb-mech
+        - rm -rf /home/ABServer/deploy-ready/lhb-mech/*
+        - sleep 60s
+        - curl -X PUT 'http://mse-78d0edb13-nacos-ans.mse.aliyuncs.com:8848/nacos/v1/ns/instance?serviceName=lhb-mech-biz&ip=172.27.251.65&port=8888&weight=1'
+        # - docker restart nodeServer1
+        - echo ====部署成功=======
+
+trigger:
+  branch:
+    - release-mech
+  event:
+    - push
+  #排除合并请求
+  exclude:
+    - ref: refs/pull/*
+
+---
+kind: pipeline
+type: docker
+name: lhb-gateway-test
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-gateway
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - 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 ====部署成功=======
+
+trigger:
+  branch:
+    include:
+      - test-gateway
+  event:
+    include:
+      - pull_request
+      - push
+
+---
+kind: pipeline
+type: docker
+name: lhb-quartz-test
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-quartz
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/dist/*
+      - 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 ====部署成功=======
+
+trigger:
+  branch:
+    include:
+      - test-quartz
+  event:
+    include:
+      - pull_request
+      - push
+
+---
+kind: pipeline
+type: docker
+name: lhb-system-test
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-system
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/llb/dist/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/llb/dist/*
+      - mvn clean package -Dmaven.test.skip=true -P test
+      - cp /drone/src/lhb-system/lhb-system-biz/target/*.jar /drone/src/llb/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/lib /drone/src/llb/dist/ && cp -r /drone/src/lhb-system/lhb-system-biz/target/config /drone/src/llb/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 ====部署成功=======
+
+trigger:
+  branch:
+    include:
+      - test-system
+  event:
+    include:
+      - pull_request
+      - push
+
+---
+kind: pipeline
+type: docker
+name: lhb-mech-test
+
+volumes: # 声明数据卷
+  - name: mvn_repo # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/cache/mvn_repo
+  - name: mvn_config
+    host:
+      path: /home/ABServer/config/mvn/
+  - name: targetDir
+    host:
+      path: /lhb-mech
+
+clone:
+  disable: false # 启用代码拉取
+
+steps:
+  - 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/llb/dist/
+      - name: mvn_config
+        path: /usr/share/maven/conf/
+    commands: # 执行命令
+      - rm -rf /drone/src/llb/dist/*
+      - mvn clean package -Dmaven.test.skip=true -P test
+      - cp /drone/src/lhb-mech/lhb-mech-biz/target/*.jar /drone/src/llb/dist/ && cp -r /drone/src/lhb-mech/lhb-mech-biz/target/lib /drone/src/llb/dist/ && cp -r /drone/src/lhb-mech/lhb-mech-biz/target/config /drone/src/llb/dist/ # 复制文件
+    when:
+      status:
+        - success # 当前步骤成功时执行
+  - name: scp-project
+    image: appleboy/drone-scp
+    pull: if-not-exists
+    depends_on: [build-project] # 依赖的步骤
+    volumes: # 挂载数据卷
+      - name: targetDir # 数据卷名称
+        path: /lhb-mech # 容器内目录 绝对路径
+    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-mech/*.jar
+        - /lhb-mech/lib
+        - /lhb-mech/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-mech/*
+        - cp -r /home/ABServer/deploy-ready/lhb-mech /home/ABServer/webroot/
+        - docker stop lhb-mech && docker rm lhb-mech && docker-compose up -d lhb-mech
+        - rm -rf /home/ABServer/deploy-ready/lhb-mech/*
+        # - docker restart nodeServer1
+        - echo ====部署成功=======
+
+trigger:
+  branch:
+    include:
+      - test-mech
+  event:
+    include:
+      - pull_request
+      - push

+ 111 - 0
docker-compose.yml

@@ -0,0 +1,111 @@
+version: '3'
+services:
+
+  lhb-mysql:
+    build:
+      context: ./db
+    environment:
+      MYSQL_ROOT_HOST: "%"
+      MYSQL_ROOT_PASSWORD: root
+    restart: always
+    container_name: lhb-mysql
+    image: lhb-mysql
+    ports:
+      - 3306:3306
+    volumes:
+      - ./data/mysql/conf/my.cnf:/etc/my.cnf
+      - ./data/mysql/logs:/logs
+      - ./data/mysql/data:/var/lib/mysql
+    networks:
+      - kxs_cloud_network
+
+  lhb-register:
+    image: nacos/nacos-server:v2.2.3-slim #mac arm架构 单独版本 x86架构下去除-slim
+    container_name: lhb-register
+    environment:
+      # 容器名称使用hostname,否则使用ip,默认ip
+      - PREFER_HOST_MODE=hostname
+      # 单机模式
+      - MODE=standalone
+      # 数据源平台 支持mysql或不保存empty
+      - SPRING_DATASOURCE_PLATFORM=mysql
+      # mysql配置,容器名称
+      - MYSQL_SERVICE_HOST=lhb-mysql
+      - MYSQL_SERVICE_PORT=3306
+      - MYSQL_SERVICE_USER=root
+      - MYSQL_SERVICE_PASSWORD=root
+      - MYSQL_SERVICE_DB_NAME=kxs_config
+      - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+      # 开启鉴权
+      - NACOS_AUTH_ENABLE=true
+      - NACOS_AUTH_IDENTITY_KEY=2222
+      - NACOS_AUTH_IDENTITY_VALUE=2xxx
+      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
+    volumes:
+      - ./logs/nacos:/home/nacos/logs
+    ports:
+      - "8848:8848"
+      - "9848:9848"
+    restart: always
+    depends_on:
+      lhb-mysql:
+        condition: service_healthy
+    networks:
+      - kxs_cloud_network
+
+  lhb-redis:
+    image: redis:7.0.6
+    ports:
+      - 6379:6379
+    restart: always
+    container_name: lhb-redis
+    hostname: lhb-redis
+    networks:
+      - kxs_cloud_network
+
+
+  lhb-seata:
+    restart: always
+    container_name: lhb-seata
+    image: seataio/seata-server:1.8.0
+    depends_on:
+      - lhb-mysql
+    ports:
+      - "7091:7091"
+      - "8091:8091"
+    environment:
+      TZ: Asia/Shanghai
+      LANG: en_US.UTF-8
+      STORE_MODE: db
+      # 以SEATA_IP作为host注册seata server
+      SEATA_IP: lhb-seata
+      SEATA_PORT: 8091
+      JMX_OPTS: -Xmx256m -Xms256m
+    volumes:
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"        #设置系统时区
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"  #设置时区
+      - "./lhb-visual/lhb-seataServer/resources/application.yml:/seata-server/resources/application.yml"
+    networks:
+      - kxs_cloud_network
+
+  lhb-rabbitmq:
+    image: rabbitmq:3.12.8
+    container_name: lhb-rabbitmq
+    restart: always
+    volumes:
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"        #设置系统时区
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"  #设置时区
+    ports:
+      - 5672:5672
+      - 15672:15672
+    environment:
+      - RABBITMQ_DEFAULT_USER=admin
+      - RABBITMQ_DEFAULT_PASS=admin
+    networks:
+      - kxs_cloud_network
+
+
+
+networks:
+  kxs_cloud_network:
+    name: kxs_cloud_network

+ 8 - 1
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/SecurityConstants.java

@@ -15,7 +15,7 @@ public interface SecurityConstants {
 	/**
 	 * 前缀
 	 */
-	String PROJECT_PREFIX = "llb";
+	String PROJECT_PREFIX = "lhb";
 
 	/**
 	 * BEARER
@@ -52,6 +52,11 @@ public interface SecurityConstants {
 	 */
 	String MOBILE = "mobile";
 
+	/**
+	 * 微信登录
+	 */
+	String WECHAT = "wechat";
+
 	/**
 	 * 客户端
 	 */
@@ -117,6 +122,8 @@ public interface SecurityConstants {
 	 */
 	String SMS_PARAMETER_NAME = "mobile";
 
+	String WECHAT_PARAMETER_NAME = "wxCode";
+
 	/**
 	 * 授权码模式confirm
 	 */

+ 0 - 4
kxs-common/kxs-common-security/pom.xml

@@ -58,10 +58,6 @@
             <artifactId>kxs-common-log</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>com.kxs</groupId>
-            <artifactId>lhb-mech-api</artifactId>
-        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 10 - 1
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/component/SkyResourceServerConfiguration.java

@@ -12,6 +12,8 @@ import com.kxs.common.security.support.password.OAuth2ResourceOwnerPasswordAuthe
 import com.kxs.common.security.support.refresh.OAuth2ResourceOwnerRefreshAuthenticationConverter;
 import com.kxs.common.security.support.sms.OAuth2ResourceOwnerSmsAuthenticationConverter;
 import com.kxs.common.security.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider;
+import com.kxs.common.security.support.wechat.OAuth2ResourceOwnerWechatAuthenticationConverter;
+import com.kxs.common.security.support.wechat.OAuth2ResourceOwnerWechatAuthenticationProvider;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
@@ -124,7 +126,9 @@ public class SkyResourceServerConfiguration {
 		return new DelegatingAuthenticationConverter(Arrays.asList(
 				new OAuth2ResourceOwnerPasswordAuthenticationConverter(),
 				new OAuth2ResourceOwnerRefreshAuthenticationConverter(),
-				new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(),
+				new OAuth2ResourceOwnerSmsAuthenticationConverter(),
+				new OAuth2ResourceOwnerWechatAuthenticationConverter(),
+				new OAuth2RefreshTokenAuthenticationConverter(),
 				new OAuth2ClientCredentialsAuthenticationConverter(),
 				new OAuth2AuthorizationCodeAuthenticationConverter(),
 				new OAuth2AuthorizationCodeRequestAuthenticationConverter()));
@@ -148,12 +152,17 @@ public class SkyResourceServerConfiguration {
 		OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider(
 				authenticationManager, authorizationService, oAuth2TokenGenerator());
 
+		OAuth2ResourceOwnerWechatAuthenticationProvider resourceOwnerWechatAuthenticationProvider = new OAuth2ResourceOwnerWechatAuthenticationProvider(
+				authenticationManager, authorizationService, oAuth2TokenGenerator());
+
 		// 处理 UsernamePasswordAuthenticationToken
 		http.authenticationProvider(new SkyDaoAuthenticationProvider(active));
 		// 处理 OAuth2ResourceOwnerPasswordAuthenticationToken
 		http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider);
 		// 处理 OAuth2ResourceOwnerSmsAuthenticationToken
 		http.authenticationProvider(resourceOwnerSmsAuthenticationProvider);
+		// 处理 OAuth2ResourceOwnerWechatAuthenticationToken
+		http.authenticationProvider(resourceOwnerWechatAuthenticationProvider);
 	}
 
 }

+ 0 - 69
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/service/LlbMechUserServiceImpl.java

@@ -1,69 +0,0 @@
-package com.kxs.common.security.service;
-
-
-import com.kxs.common.core.constant.SecurityConstants;
-import com.kxs.common.core.constant.enums.ErrorTypeEnum;
-import com.kxs.common.core.constant.enums.UserStatusEnum;
-import com.kxs.common.core.util.R;
-import com.kxs.common.core.util.RetOps;
-import com.kxs.common.security.model.KxsSecurityUser;
-import com.kxs.llb.mech.api.feign.RemoteLlbUserService;
-import com.kxs.llb.mech.api.model.LlbUser;
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.core.authority.AuthorityUtils;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-
-import java.util.Objects;
-
-/**
- * 来量吧 商户端用户服务实现
- *
- * @author Lxq
- * @date 2023-12-06
- */
-@Slf4j
-@RequiredArgsConstructor
-public class LlbMechUserServiceImpl implements KxsUserDetailsService{
-
-    private final RemoteLlbUserService remoteLlbUserService;
-
-    @Override
-    @SneakyThrows
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-
-        R<LlbUser> result = remoteLlbUserService.loadUserByPhone(username, SecurityConstants.FROM_IN);
-        LlbUser custom = RetOps.of(result)
-                .getData()
-                .orElseThrow(() -> new UsernameNotFoundException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
-
-        if(Objects.equals(custom.getStatus(), UserStatusEnum.REMOVE.getCode())){
-            throw new UsernameNotFoundException(ErrorTypeEnum.ACCOUNT_DISABLED.getDescription());
-        }
-        // 构造security用户
-        return new KxsSecurityUser(custom.getId(), custom.getPhone(), SecurityConstants.BCRYPT + custom.getPassword(),  custom.getPhone(), custom.getSalt(),
-               true, true, true, !Objects.equals(custom.getLockFlag(), UserStatusEnum.LOCKED.getCode()), AuthorityUtils.NO_AUTHORITIES);
-
-    }
-
-    /**
-     * 是否支持此客户端校验
-     * @param clientId 目标客户端
-     * @param grantType  授权类型
-     * @return true/false
-     */
-    @Override
-    public boolean support(String clientId, String grantType) {
-        return "merchant".equals(clientId);
-    }
-
-    @Override
-    public int getOrder() {
-        return Integer.MIN_VALUE + 1;
-    }
-
-
-}

+ 3 - 4
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/core/SkyDaoAuthenticationProvider.java

@@ -79,13 +79,12 @@ public class SkyDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat
 	 * @throws AuthenticationException 身份验证异常
 	 */
 	@Override
-	@SuppressWarnings("deprecation")
-	protected void additionalAuthenticationChecks(UserDetails userDetails,
+    protected void additionalAuthenticationChecks(UserDetails userDetails,
 			UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
 
-		// app 模式不用校验密码
+		// app wechat 模式不用校验密码
 		String grantType = WebUtils.getRequest().get().getParameter(OAuth2ParameterNames.GRANT_TYPE);
-		if (StrUtil.equals(SecurityConstants.MOBILE, grantType)) {
+		if (StrUtil.equals(SecurityConstants.MOBILE, grantType) || StrUtil.equals(SecurityConstants.WECHAT, grantType)) {
 			return;
 		}
 

+ 56 - 0
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationConverter.java

@@ -0,0 +1,56 @@
+package com.kxs.common.security.support.wechat;
+
+import com.kxs.common.core.constant.SecurityConstants;
+import com.kxs.common.security.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter;
+import com.kxs.common.security.util.OAuth2EndpointUtils;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
+import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author 没秃顶的码农
+ * @date 2022-05-31
+ *
+ * 微信登录转换器
+ */
+public class OAuth2ResourceOwnerWechatAuthenticationConverter
+		extends OAuth2ResourceOwnerBaseAuthenticationConverter<OAuth2ResourceOwnerWechatAuthenticationToken> {
+
+	/**
+	 * 是否支持此convert
+	 * @param grantType 授权类型
+	 * @return
+	 */
+	@Override
+	public boolean support(String grantType) {
+		return SecurityConstants.WECHAT.equals(grantType);
+	}
+
+	@Override
+	public OAuth2ResourceOwnerWechatAuthenticationToken buildToken(Authentication clientPrincipal, Set requestedScopes,
+			Map additionalParameters) {
+		return new OAuth2ResourceOwnerWechatAuthenticationToken(new AuthorizationGrantType(SecurityConstants.WECHAT),
+				clientPrincipal, requestedScopes, additionalParameters);
+	}
+
+	/**
+	 * 校验扩展参数 密码模式密码必须不为空
+	 * @param parameters 参数列表
+	 */
+	@Override
+	public void checkParams(MultiValueMap<String, String> parameters) {
+//		MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
+		// PHONE (REQUIRED)
+		String phone = parameters.getFirst(SecurityConstants.WECHAT_PARAMETER_NAME);
+		if (!StringUtils.hasText(phone) || parameters.get(SecurityConstants.WECHAT_PARAMETER_NAME).size() != 1) {
+			OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, SecurityConstants.WECHAT_PARAMETER_NAME,
+					OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI);
+		}
+	}
+
+}

+ 66 - 0
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationProvider.java

@@ -0,0 +1,66 @@
+package com.kxs.common.security.support.wechat;
+
+import com.kxs.common.core.constant.SecurityConstants;
+import com.kxs.common.core.constant.enums.ErrorTypeEnum;
+import com.kxs.common.security.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
+import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
+import org.springframework.security.oauth2.core.OAuth2Token;
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
+import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
+
+import java.util.Map;
+
+/**
+ * @author 没秃顶的码农
+ * @date date
+ *
+ * 微信登录的核心处理
+ */
+public class OAuth2ResourceOwnerWechatAuthenticationProvider
+		extends OAuth2ResourceOwnerBaseAuthenticationProvider<OAuth2ResourceOwnerWechatAuthenticationToken> {
+
+	private static final Logger LOGGER = LogManager.getLogger(OAuth2ResourceOwnerWechatAuthenticationProvider.class);
+
+	/**
+	 * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the
+	 * provided parameters.
+	 * @param authenticationManager
+	 * @param authorizationService the authorization service
+	 * @param tokenGenerator the token generator
+	 * @since 0.2.3
+	 */
+	public OAuth2ResourceOwnerWechatAuthenticationProvider(AuthenticationManager authenticationManager,
+                                                           OAuth2AuthorizationService authorizationService,
+                                                           OAuth2TokenGenerator<? extends OAuth2Token> tokenGenerator) {
+		super(authenticationManager, authorizationService, tokenGenerator);
+	}
+
+	@Override
+	public boolean supports(Class<?> authentication) {
+		boolean supports = OAuth2ResourceOwnerWechatAuthenticationToken.class.isAssignableFrom(authentication);
+		LOGGER.debug("supports authentication=" + authentication + " returning " + supports);
+		return supports;
+	}
+
+	@Override
+	public void checkClient(RegisteredClient registeredClient) {
+		assert registeredClient != null;
+		if (!registeredClient.getAuthorizationGrantTypes()
+			.contains(new AuthorizationGrantType(SecurityConstants.WECHAT))) {
+			throw new OAuth2AuthenticationException(ErrorTypeEnum.UNAUTHORIZED_CLIENT.getDescription());
+		}
+	}
+
+	@Override
+	public UsernamePasswordAuthenticationToken buildToken(Map<String, Object> reqParameters) {
+		String code = (String) reqParameters.get(SecurityConstants.WECHAT_PARAMETER_NAME);
+		return new UsernamePasswordAuthenticationToken(code, null);
+	}
+
+}

+ 21 - 0
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/wechat/OAuth2ResourceOwnerWechatAuthenticationToken.java

@@ -0,0 +1,21 @@
+package com.kxs.common.security.support.wechat;
+
+import com.kxs.common.security.support.base.OAuth2ResourceOwnerBaseAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author 没秃顶的码农
+ * @description 微信登录token信息
+ */
+public class OAuth2ResourceOwnerWechatAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken {
+
+	public OAuth2ResourceOwnerWechatAuthenticationToken(AuthorizationGrantType authorizationGrantType,
+                                                        Authentication clientPrincipal, Set<String> scopes, Map<String, Object> additionalParameters) {
+		super(authorizationGrantType, clientPrincipal, scopes, additionalParameters);
+	}
+
+}

+ 56 - 0
lhb-basic/lhb-basic-api/pom.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.kxs</groupId>
+        <artifactId>lhb-basic</artifactId>
+        <version>1.1.0</version>
+    </parent>
+
+    <artifactId>lhb-basic-api</artifactId>
+
+    <properties>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <!--core 工具类-->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-core</artifactId>
+        </dependency>
+
+        <!--mybatis 依赖-->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-mybatis</artifactId>
+        </dependency>
+        <!-- LB 扩展 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+        <!--caffeine 替换LB 默认缓存实现-->
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-mq</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-http</artifactId>
+        </dependency>
+
+        <!-- excel 导入导出 https://github.com/sky-mesh/excel-spring-boot-starter -->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-excel</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 104 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitLlbBindQueueMQ.java

@@ -0,0 +1,104 @@
+package com.kxs.lhb.basic.api.amqp;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessageProperties;
+
+import java.util.UUID;
+
+/**
+ * mq 绑定 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RabbitLlbBindQueueMQ extends AbstractMQ {
+
+
+    /**
+     * 绑定队列
+     */
+    public static final String QUEUE_NAME = "QUEUE_LAIHAOBA_BIND_DIVISION";
+
+    /**
+     * 死队列名称
+     */
+    public static final String DEAD_QUEUE_NAME = "";
+
+    /**
+     * 内置msg 消息体定义
+     **/
+    private MsgEntity msgEntity;
+
+    /**
+     *  定义Msg消息载体
+     **/
+    @Data
+    public static class MsgEntity {
+
+        /**
+         * 通知主键ID
+         */
+        private String notifyId;
+
+
+    }
+
+    @Override
+    public String getQueueName() {
+
+        return QUEUE_NAME;
+    }
+
+    @Override
+    public String getDeadQueueName() {
+
+        return DEAD_QUEUE_NAME;
+    }
+
+    @Override
+    public MQSendTypeEnum getMqType() {
+
+        return MQSendTypeEnum.DELAY;
+    }
+
+    @Override
+    public Message toMessage() {
+        String message = JSONObject.toJSONString(msgEntity);
+        // 构建消息体
+        return MessageBuilder.withBody(message.getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
+                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
+                .setMessageId(UUID.randomUUID().toString())
+                .build();
+    }
+
+    /**
+     * 构造发送消息
+     */
+    public static RabbitLlbBindQueueMQ build(MsgEntity message){
+
+        return new RabbitLlbBindQueueMQ(message);
+    }
+
+    /**
+     * 解析MQ消息, 一般用于接收MQ消息时
+     */
+    public static MsgEntity parse(String msg){
+        return JSON.parseObject(msg, MsgEntity.class);
+    }
+
+}

+ 104 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitLlbOrderQueueMQ.java

@@ -0,0 +1,104 @@
+package com.kxs.lhb.basic.api.amqp;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessageProperties;
+
+import java.util.UUID;
+
+/**
+ * mq 订单普通队列 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RabbitLlbOrderQueueMQ extends AbstractMQ {
+
+
+    /**
+     * 订单交易队列
+     */
+    public static final String QUEUE_NAME = "QUEUE_LAIHAOBA_ORDER_DIVISION";
+
+    /**
+     * 死队列名称
+     */
+    public static final String DEAD_QUEUE_NAME = "";
+
+    /**
+     * 内置msg 消息体定义
+     **/
+    private MsgEntity msgEntity;
+
+    /**
+     *  定义Msg消息载体
+     **/
+    @Data
+    public static class MsgEntity {
+
+        /**
+         * 通知主键ID
+         */
+        private String notifyId;
+
+
+    }
+
+    @Override
+    public String getQueueName() {
+
+        return QUEUE_NAME;
+    }
+
+    @Override
+    public String getDeadQueueName() {
+
+        return DEAD_QUEUE_NAME;
+    }
+
+    @Override
+    public MQSendTypeEnum getMqType() {
+
+        return MQSendTypeEnum.DELAY;
+    }
+
+    @Override
+    public Message toMessage() {
+        String message = JSONObject.toJSONString(msgEntity);
+        // 构建消息体
+        return MessageBuilder.withBody(message.getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
+                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
+                .setMessageId(UUID.randomUUID().toString())
+                .build();
+    }
+
+    /**
+     * 构造发送消息
+     */
+    public static RabbitLlbOrderQueueMQ build(MsgEntity message){
+
+        return new RabbitLlbOrderQueueMQ(message);
+    }
+
+    /**
+     * 解析MQ消息, 一般用于接收MQ消息时
+     */
+    public static MsgEntity parse(String msg){
+        return JSON.parseObject(msg, MsgEntity.class);
+    }
+
+}

+ 24 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/BasicConstants.java

@@ -0,0 +1,24 @@
+
+package com.kxs.lhb.basic.api.constant;
+
+/**
+ * 公共常量
+ *
+ * @author 没秃顶的码农
+ * @date 2024/09/29
+ */
+public interface BasicConstants {
+
+    /**
+     * 最大回调通知次数
+     */
+    public static final Integer MAX_NOTIFY_TIMES = 5;
+
+    /**
+     * 延时等级对应的秒数
+     */
+    public static final Integer[] ROCKET_MQ_DELAY_LEVEL_SECOND = {5,300,1800,3600,7200,14400};
+
+
+
+}

+ 26 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/sysNotify/SysNotifyDTO.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.api.dto.sysNotify;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 推送管理-补推-dto
+ *
+ * @author 系统
+ * @date 2024-09-11 15:56:28
+ */
+@Data
+public class SysNotifyDTO {
+
+    /**
+     * id集合
+     */
+    @Schema(description = "id集合")
+    @NotEmpty
+    private List<Integer> ids;
+
+}

+ 52 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/sysNotify/SysNotifyPageDTO.java

@@ -0,0 +1,52 @@
+package com.kxs.lhb.basic.api.dto.sysNotify;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+
+/**
+ * 推送管理-补推-dto
+ *
+ * @author 系统
+ * @date 2024-09-11 15:56:28
+ */
+@Data
+public class SysNotifyPageDTO{
+
+
+    /**
+     * 状态 0未推送 1推送成功 -1推送失败
+     */
+    @Schema(description = "状态 0推送中 1推送成功 -1推送失败")
+    private Integer status;
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
+
+
+    /**
+     * 通知ID唯一
+     */
+    @Schema(description = "通知ID唯一")
+    private String notifyId;
+
+
+    /**
+     * 推送类型
+     */
+    @Schema(description = "推送类型")
+    private String className;
+
+    private String sn;
+
+    /**
+     * 创建时间区间 [开始时间,结束时间]
+     */
+    private LocalDateTime[] notifyTime;
+
+}

+ 19 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/BasicReq.java

@@ -0,0 +1,19 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Data;
+
+/**
+ * 广电售卡
+ * 公共参数
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class BasicReq<T> {
+
+    private String appId;
+    private String timestamp;
+    private String sign;
+    private T body;
+}

二進制
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/NumbersReq.java


+ 22 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderCancelReq.java

@@ -0,0 +1,22 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 取消订单API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class OrderCancelReq extends TyCommonReq {
+
+    private String orderId;
+    private String returnCause;
+    private String applyPerson;
+
+}

+ 21 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderChargeLevelReq.java

@@ -0,0 +1,21 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 查询分销充值返还档次API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class OrderChargeLevelReq extends TyCommonReq {
+
+    private String productId;
+    private String phone;
+
+}

+ 34 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/OrderSubmitReq.java

@@ -0,0 +1,34 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 提交订单API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class OrderSubmitReq extends TyCommonReq {
+
+    private String goodsId;
+    private String goodsSkuId;
+    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;
+
+
+}

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

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 套餐信息API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class PackagesReq extends TyCommonReq{
+
+    private String areaCode;
+
+}

+ 26 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PreNumbersReq.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 选号预占接口API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class PreNumbersReq extends TyCommonReq {
+
+    private String number;
+    private String idenNr;
+    /**
+     * 地区编码,市级
+     */
+    private String regionId;
+
+
+}

+ 20 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/QueryOrderReq.java

@@ -0,0 +1,20 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 查询物流API 查询订单状态API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class QueryOrderReq extends TyCommonReq {
+
+    private String orderId;
+
+}

+ 16 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/TyCommonReq.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.api.dto.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 公共参数
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class TyCommonReq {
+
+    private String requestId;
+}

+ 95 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbArea.java

@@ -0,0 +1,95 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 地区表(LhbArea)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbArea extends Model<LhbArea> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private String id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 省市县父级主键,如为省级此值为null
+     */
+    @Schema(description = "省市县父级主键,如为省级此值为null")
+    private String parentId;
+
+
+    /**
+     * 地区名称
+     */
+    @Schema(description = "地区名称")
+    private String areaName;
+
+
+    /**
+     * 地区编码
+     */
+    @Schema(description = "地区编码")
+    private String areaCode;
+
+
+
+
+}
+

+ 132 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbBanner.java

@@ -0,0 +1,132 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 首页广告管理表(LhbBanner)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbBanner extends Model<LhbBanner> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    @NotNull(message = "删除标记,0未删除,1已删除不能为空")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 标题
+     */
+    @Schema(description = "标题")
+    private String title;
+
+
+    /**
+     * 封面图地址
+     */
+    @Schema(description = "封面图地址")
+    private String picUrl;
+
+
+    /**
+     * 跳转链接
+     */
+    @Schema(description = "跳转链接")
+    private String url;
+
+
+    /**
+     * 分类ID
+     */
+    @Schema(description = "分类ID")
+    private String colId;
+
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+    /**
+     * 状态 0下架 1上架
+     */
+    @Schema(description = "状态 0下架 1上架")
+    private Integer status;
+
+
+    /**
+     * 内容
+     */
+    @Schema(description = "内容")
+    private String contents;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+
+
+}
+

+ 117 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbCol.java

@@ -0,0 +1,117 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 广告位分类表(LhbCol)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbCol extends Model<LhbCol> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private String delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 分类ID标识
+     */
+    @Schema(description = "分类ID标识")
+    private String colId;
+
+
+    /**
+     * 分类名称
+     */
+    @Schema(description = "分类名称")
+    private String colName;
+
+
+    /**
+     * 分类背景图片
+     */
+    @Schema(description = "分类背景图片")
+    private String colPic;
+
+
+    /**
+     * 分类详情
+     */
+    @Schema(description = "分类详情")
+    private String colDetail;
+
+
+    /**
+     * 外链
+     */
+    @Schema(description = "外链")
+    private String url;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+
+
+}
+

+ 187 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoods.java

@@ -0,0 +1,187 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 产品表(LhbGoods)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbGoods extends Model<LhbGoods> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 产品名称
+     */
+    @Schema(description = "产品名称")
+    private String goodsName;
+
+
+    /**
+     * 商品封面图
+     */
+    @Schema(description = "商品封面图")
+    private String picUrl;
+
+
+    /**
+     * 状态 0下架 1上架
+     */
+    @Schema(description = "状态 0下架 1上架")
+    private Integer status;
+
+
+    /**
+     * 月租价格
+     */
+    @Schema(description = "月租价格")
+    private BigDecimal price;
+
+
+    /**
+     * 简介
+     */
+    @Schema(description = "简介")
+    private String summary;
+
+
+    /**
+     * 外部产品ID
+     */
+    @Schema(description = "外部产品ID")
+    private String externalId;
+
+
+    /**
+     * 通道名称
+     */
+    @Schema(description = "通道名称")
+    private String ifCode;
+
+
+    /**
+     * 商品详情
+     */
+    @Schema(description = "商品详情")
+    private String content;
+
+
+    /**
+     * 服务费
+     */
+    @Schema(description = "服务费")
+    private BigDecimal serverFee;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+    /**
+     * 修改人
+     */
+    @Schema(description = "修改人")
+    private String updateBy;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+    /**
+     * 办理数量
+     */
+    @Schema(description = "办理数量")
+    private Integer makeCount;
+
+
+    /**
+     * 运营商, 1:电信,2:移动 3 :联通 4:广电
+     */
+    @Schema(description = "运营商, 1:电信,2:移动 3 :联通 4:广电")
+    private Integer operators;
+
+
+    /**
+     * 供应商ID
+     */
+    @Schema(description = "供应商ID")
+    private Integer supplierId;
+
+
+    /**
+     * 年龄区间 18-65
+     */
+    @Schema(description = "年龄区间 18-65")
+    private String ageSection;
+
+
+
+
+}
+

+ 145 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsActivities.java

@@ -0,0 +1,145 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 套餐活动表(LhbGoodsActivities)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbGoodsActivities extends Model<LhbGoodsActivities> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+    /**
+     * 修改人
+     */
+    @Schema(description = "修改人")
+    private String updateBy;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+    /**
+     * 优惠方式(1.打折 2.直降)
+     */
+    @Schema(description = "优惠方式(1.打折 2.直降)")
+    private Integer models;
+
+
+    /**
+     * 活动编码
+     */
+    @Schema(description = "活动编码")
+    private String activityCode;
+
+
+    /**
+     * 活动描述
+     */
+    @Schema(description = "活动描述")
+    private String activityDesc;
+
+
+    /**
+     * 活动名称
+     */
+    @Schema(description = "活动名称")
+    private String activityName;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 套餐ID
+     */
+    @Schema(description = "套餐ID")
+    private Integer skuId;
+
+
+    /**
+     * 折扣值
+     */
+    @Schema(description = "折扣值")
+    private Integer discount;
+
+
+    /**
+     * 直降金额值
+     */
+    @Schema(description = "直降金额值")
+    private BigDecimal downAmt;
+
+
+
+
+}
+

+ 145 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsSku.java

@@ -0,0 +1,145 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 套餐表(LhbGoodsSku)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbGoodsSku extends Model<LhbGoodsSku> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+    /**
+     * 修改人
+     */
+    @Schema(description = "修改人")
+    private String updateBy;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+    /**
+     * 套餐详情
+     */
+    @Schema(description = "套餐详情")
+    private String details;
+
+
+    /**
+     * 外部套餐ID
+     */
+    @Schema(description = "外部套餐ID")
+    private String externalSkuId;
+
+
+    /**
+     * 简介
+     */
+    @Schema(description = "简介")
+    private String summary;
+
+
+    /**
+     * 月租价格 单位分
+     */
+    @Schema(description = "月租价格 单位分")
+    private BigDecimal monthFee;
+
+
+    /**
+     * 套餐名称
+     */
+    @Schema(description = "套餐名称")
+    private String packageName;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 产品ID
+     */
+    @Schema(description = "产品ID")
+    private Integer goodsId;
+
+
+    /**
+     * 产品ID 用于分销充值返还档次查询
+     */
+    @Schema(description = "产品ID 用于分销充值返还档次查询")
+    private String productId;
+
+
+
+
+}
+

+ 130 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbInterfaceConfig.java

@@ -0,0 +1,130 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 通道参数配置表(LhbInterfaceConfig)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbInterfaceConfig extends Model<LhbInterfaceConfig> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 添加人
+     */
+    @Schema(description = "添加人")
+    private String createBy;
+
+
+    /**
+     * 修改人
+     */
+    @Schema(description = "修改人")
+    private String updateBy;
+
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+    /**
+     * 参数json格式
+     */
+    @Schema(description = "参数json格式")
+    private String params;
+
+
+    /**
+     * 状态: 0-停用 1-启用
+     */
+    @Schema(description = "状态: 0-停用 1-启用")
+    private Integer status;
+
+
+    /**
+     * 名称
+     */
+    @Schema(description = "名称")
+    private String name;
+
+
+    /**
+     * 平台标识
+     */
+    @Schema(description = "平台标识")
+    private String ifCode;
+
+
+    /**
+     * 通道类型
+     */
+    @Schema(description = "通道类型")
+    private Integer paramType;
+
+
+
+
+}
+

+ 110 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbIsvEmploy.java

@@ -0,0 +1,110 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 服务商工号人员(LhbIsvEmploy)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbIsvEmploy extends Model<LhbIsvEmploy> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 状态 1正常 0停用
+     */
+    @Schema(description = "状态 1正常 0停用")
+    private Integer status;
+
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
+
+
+    /**
+     * 工号
+     */
+    @Schema(description = "工号")
+    private String employNum;
+
+
+    /**
+     * 工号名称
+     */
+    @Schema(description = "工号名称")
+    private String employName;
+
+
+    /**
+     * 手机号码
+     */
+    @Schema(description = "手机号码")
+    private String employMobile;
+
+
+
+
+}
+

+ 152 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbIsvInfo.java

@@ -0,0 +1,152 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 服务商(LhbIsvInfo)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbIsvInfo extends Model<LhbIsvInfo> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 状态 1正常 0停用
+     */
+    @Schema(description = "状态 1正常 0停用")
+    private Integer status;
+
+
+    /**
+     * 名称
+     */
+    @Schema(description = "名称")
+    private String isvName;
+
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
+
+
+    /**
+     * 联系人姓名
+     */
+    @Schema(description = "联系人姓名")
+    private String contactName;
+
+
+    /**
+     * 联系人手机号
+     */
+    @Schema(description = "联系人手机号")
+    private String contactTel;
+
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+    /**
+     * 绑定推送地址
+     */
+    @Schema(description = "绑定推送地址")
+    private String bindUrl;
+
+
+    /**
+     * 订单推送地址
+     */
+    @Schema(description = "订单推送地址")
+    private String orderUrl;
+
+
+    /**
+     * 公钥
+     */
+    @Schema(description = "公钥")
+    private String publicKey;
+
+
+    /**
+     * 私钥
+     */
+    @Schema(description = "私钥")
+    private String privateKey;
+
+
+
+
+}
+

+ 131 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbNotify.java

@@ -0,0 +1,131 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 通知记录表(LhbNotify)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbNotify extends Model<LhbNotify> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 状态 0推送中 1推送成功 -1推送失败
+     */
+    @Schema(description = "状态 0推送中 1推送成功 -1推送失败")
+    private Integer status;
+
+
+    /**
+     * 通知时间
+     */
+    @Schema(description = "通知时间")
+    private LocalDateTime notifyTime;
+
+
+    /**
+     * 通知数据
+     */
+    @Schema(description = "通知数据")
+    private String params;
+
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
+
+
+    /**
+     * 通知次数
+     */
+    @Schema(description = "通知次数")
+    private Integer notifyCount;
+
+
+    /**
+     * 通知ID唯一
+     */
+    @Schema(description = "通知ID唯一")
+    private String notifyId;
+
+
+    /**
+     * 推送类型
+     */
+    @Schema(description = "推送类型")
+    private String className;
+
+
+    /**
+     * 返回数据
+     */
+    @Schema(description = "返回数据")
+    private String response;
+
+
+
+
+}
+

+ 278 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrder.java

@@ -0,0 +1,278 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 订单表(LhbOrder)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbOrder extends Model<LhbOrder> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 状态 -1已取消 0待支付 1已支付 2已退款
+     */
+    @Schema(description = "状态 -1已取消 0待支付 1已支付 2已退款")
+    private Integer status;
+
+
+    /**
+     * 用户ID
+     */
+    @Schema(description = "用户ID")
+    private Integer userId;
+
+
+    /**
+     * 订单号
+     */
+    @Schema(description = "订单号")
+    private String orderSn;
+
+
+    /**
+     * 套餐ID
+     */
+    @Schema(description = "套餐ID")
+    private Integer productId;
+
+
+    /**
+     * 服务费 单位分
+     */
+    @Schema(description = "服务费 单位分")
+    private BigDecimal cashFee;
+
+
+    /**
+     * 支付时间
+     */
+    @Schema(description = "支付时间")
+    private LocalDateTime payTime;
+
+
+    /**
+     * 办理手机号码
+     */
+    @Schema(description = "办理手机号码")
+    private String makeMobile;
+
+
+    /**
+     * 支付方式 0微信
+     */
+    @Schema(description = "支付方式 0微信")
+    private Integer payType;
+
+
+    /**
+     * 三方订单号
+     */
+    @Schema(description = "三方订单号")
+    private String outOrderSn;
+
+
+    /**
+     * 套餐名称
+     */
+    @Schema(description = "套餐名称")
+    private String productName;
+
+
+    /**
+     * 是否首次充值 0-否 1-是
+     */
+    @Schema(description = "是否首次充值 0-否 1-是")
+    private Integer isFirstRecharge;
+
+
+    /**
+     * 三方订单状态 见文档
+     */
+    @Schema(description = "三方订单状态 见文档")
+    private Integer outStatus;
+
+
+    /**
+     * 支付订单号
+     */
+    @Schema(description = "支付订单号")
+    private String payTradeNo;
+
+
+    /**
+     * 退款订单号
+     */
+    @Schema(description = "退款订单号")
+    private String refundTradeNo;
+
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+    /**
+     * 退款金额 单位分
+     */
+    @Schema(description = "退款金额 单位分")
+    private BigDecimal refundPrice;
+
+
+    /**
+     * 操作人
+     */
+    @Schema(description = "操作人")
+    private String createBy;
+
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
+
+
+    /**
+     * 操作人
+     */
+    @Schema(description = "操作人")
+    private String updateBy;
+
+
+    /**
+     * 通道名称
+     */
+    @Schema(description = "通道名称")
+    private String ifCode;
+
+
+    /**
+     * 客户姓名
+     */
+    @Schema(description = "客户姓名")
+    private String custName;
+
+
+    /**
+     * 身份证号
+     */
+    @Schema(description = "身份证号")
+    private String idCard;
+
+
+    /**
+     * 收货人手机号码
+     */
+    @Schema(description = "收货人手机号码")
+    private String contMobile;
+
+
+    /**
+     * 地市编码
+     */
+    @Schema(description = "地市编码")
+    private String regionId;
+
+
+    /**
+     * 收货省市县编码,用英文逗号分割
+     */
+    @Schema(description = "收货省市县编码,用英文逗号分割")
+    private String area;
+
+
+    /**
+     * 收货人详细地址 精确到门牌号
+     */
+    @Schema(description = "收货人详细地址 精确到门牌号")
+    private String address;
+
+
+    /**
+     * 工号
+     */
+    @Schema(description = "工号")
+    private String employNum;
+
+
+    /**
+     * 运营商, 1:电信,2:移动 3 :联通 4:广电
+     */
+    @Schema(description = "运营商, 1:电信,2:移动 3 :联通 4:广电")
+    private Integer operators;
+
+
+    /**
+     * 是否激活 1激活
+     */
+    @Schema(description = "是否激活 1激活")
+    private Integer isAct;
+
+
+
+
+}
+

+ 152 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrderRecharge.java

@@ -0,0 +1,152 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 订单号码充值记录(LhbOrderRecharge)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbOrderRecharge extends Model<LhbOrderRecharge> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+    /**
+     * 修改人
+     */
+    @Schema(description = "修改人")
+    private String updateBy;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+    /**
+     * 充值金额 单位分
+     */
+    @Schema(description = "充值金额 单位分")
+    private BigDecimal rechargeFee;
+
+
+    /**
+     * 支付金额 分
+     */
+    @Schema(description = "支付金额 分")
+    private BigDecimal payFee;
+
+
+    /**
+     * 产品ID
+     */
+    @Schema(description = "产品ID")
+    private Integer goodsId;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 套餐ID
+     */
+    @Schema(description = "套餐ID")
+    private Integer skuId;
+
+
+    /**
+     * 套餐名称
+     */
+    @Schema(description = "套餐名称")
+    private String skuName;
+
+
+    /**
+     * 活动编码
+     */
+    @Schema(description = "活动编码")
+    private String activityCode;
+
+
+    /**
+     * 能否充值标志0该档次不能充值1可以充值
+     */
+    @Schema(description = "能否充值标志0该档次不能充值1可以充值")
+    private Integer canRecharge;
+
+
+    /**
+     * 通道号
+     */
+    @Schema(description = "通道号")
+    private String ifCode;
+
+
+
+
+}
+

+ 89 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbRulemaking.java

@@ -0,0 +1,89 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 协议规则表(LhbRulemaking)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbRulemaking extends Model<LhbRulemaking> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 内容
+     */
+    @Schema(description = "内容")
+    private String contents;
+
+
+    /**
+     * 标题
+     */
+    @Schema(description = "标题")
+    private String title;
+
+
+
+
+}
+

+ 96 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbSupplier.java

@@ -0,0 +1,96 @@
+package com.kxs.lhb.basic.api.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 供应商(LhbSupplier)表实体类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LhbSupplier extends Model<LhbSupplier> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private Integer delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 状态 1正常 0停用
+     */
+    @Schema(description = "状态 1正常 0停用")
+    private Integer status;
+
+
+    /**
+     * 供应商名称
+     */
+    @Schema(description = "供应商名称")
+    private String supName;
+
+
+    /**
+     * 运营商, 1:电信,2:移动 3 :联通 4:聚合卡
+     */
+    @Schema(description = "运营商, 1:电信,2:移动 3 :联通 4:聚合卡")
+    private Integer operators;
+
+
+
+
+}
+

+ 234 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/RsaUtil.java

@@ -0,0 +1,234 @@
+package com.kxs.lhb.basic.api.util;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import java.io.*;
+import java.math.BigInteger;
+import java.security.*;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Enumeration;
+
+/**
+ * RSA 实用程序
+ *
+ * @author Lxq
+ * @date 2024-09-02
+ */
+public class RsaUtil {
+
+    public static final String ALGORITHM = "RSA";
+    private static final String SIGNATURE = "SHA256withRSA";
+    public static final String CERT_TYPE = "X.509";
+    public static final String KEY_TYPE = "PKCS12";
+
+
+    /**
+     * RSA算法规定:待加密的字节数不能超过密钥的长度值除以8再减去11。
+     * 而加密后得到密文的字节数,正好是密钥的长度值除以 8。
+     */
+    private static final int RESERVE_BYTES = 11;
+    private static final int BIT = 8;
+
+
+
+    public static PublicKey publicKey(String cert) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getDecoder().decode(cert));
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        return keyFactory.generatePublic(spec);
+    }
+
+    public static PublicKey publicKey(File cer) throws FileNotFoundException, CertificateException {
+        CertificateFactory certificateFactory = CertificateFactory.getInstance(CERT_TYPE);
+        FileInputStream fileInputStream = new FileInputStream(cer);
+        X509Certificate x509Certificate = (X509Certificate) certificateFactory.generateCertificate(fileInputStream);
+        return x509Certificate.getPublicKey();
+    }
+
+    public static PrivateKey privateKey(File pfx, String password) throws KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, IOException {
+        char[] p = password.toCharArray();
+        KeyStore keyStore = keyStore(pfx, password);
+        Enumeration<String> enumeration = keyStore.aliases();
+        String alias = null;
+        if (enumeration != null && enumeration.hasMoreElements()) {
+            alias = enumeration.nextElement();
+        }
+        return (PrivateKey) keyStore.getKey(alias, p);
+    }
+
+    public static PrivateKey privateKey(String cert) throws InvalidKeySpecException, NoSuchAlgorithmException {
+        byte[] keyBytes = Base64.getDecoder().decode(cert);
+        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        return keyFactory.generatePrivate(spec);
+    }
+
+    private static KeyStore keyStore(File pfx, String password) throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException {
+        FileInputStream fileInputStream = new FileInputStream(pfx);
+        char[] p = password.toCharArray();
+        KeyStore keyStore = KeyStore.getInstance(KEY_TYPE);
+        keyStore.load(fileInputStream, p);
+        return keyStore;
+    }
+
+    private static KeyStore keyStore(InputStream inputStream, String password) throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException {
+        char[] p = password.toCharArray();
+        KeyStore keyStore = KeyStore.getInstance(KEY_TYPE);
+        keyStore.load(inputStream, p);
+        return keyStore;
+    }
+
+    public static String encrypt(String cert, String plains) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {
+        RSAPublicKey publicKey = (RSAPublicKey) publicKey(cert);
+        BigInteger modulus = publicKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT) - RESERVE_BYTES;
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        byte[] bytes = cipher(cipher, block, plains.getBytes());
+        return Base64.getEncoder().encodeToString(bytes);
+    }
+
+    public static String encrypt(File cer, String plains) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, CertificateException, FileNotFoundException {
+        RSAPublicKey publicKey = (RSAPublicKey) publicKey(cer);
+        BigInteger modulus = publicKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT) - RESERVE_BYTES;
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        byte[] bytes = cipher(cipher, block, plains.getBytes());
+        return Base64.getEncoder().encodeToString(bytes);
+    }
+
+    public static String encrypt(PublicKey publicKey, String plains) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+        RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
+        BigInteger modulus = rsaPublicKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT) - RESERVE_BYTES;
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
+        byte[] bytes = cipher(cipher, block, plains.getBytes());
+        return Base64.getEncoder().encodeToString(bytes);
+    }
+
+    public static String decrypt(File pfx, String password, String ciphers) throws UnrecoverableKeyException, CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+        RSAPrivateKey privateKey = (RSAPrivateKey) privateKey(pfx, password);
+        BigInteger modulus = privateKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT);
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        byte[] bytes = cipher(cipher, block, Base64.getDecoder().decode(ciphers));
+        return new String(bytes);
+    }
+
+
+    public static String decrypt(PrivateKey privateKey, String ciphers) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
+        BigInteger modulus = rsaPrivateKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT);
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
+        byte[] bytes = cipher(cipher, block, Base64.getDecoder().decode(ciphers));
+        return new String(bytes);
+    }
+
+    public static String decrypt(String cert, String ciphers) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {
+        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)privateKey(cert);
+        BigInteger modulus = rsaPrivateKey.getModulus();
+        int bitLength = modulus.bitLength();
+        int block = (bitLength / BIT);
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
+        byte[] bytes = cipher(cipher, block, Base64.getDecoder().decode(ciphers));
+        return new String(bytes);
+    }
+
+    public static String sign(File pfx, String password, String data) throws UnrecoverableKeyException, CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException, InvalidKeyException, SignatureException {
+        PrivateKey privateKey = privateKey(pfx, password);
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initSign(privateKey);
+        signature.update(data.getBytes());
+        return new String(Base64.getEncoder().encode(signature.sign()));
+    }
+
+    public static String sign(String cert, String data) throws InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        PrivateKey privateKey = privateKey(cert);
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initSign(privateKey);
+        signature.update(data.getBytes());
+        return new String(Base64.getEncoder().encode(signature.sign()));
+    }
+
+    public static String sign(PrivateKey privateKey, String data) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initSign(rsaPrivateKey);
+        signature.update(data.getBytes());
+        return new String(Base64.getEncoder().encode(signature.sign()));
+    }
+
+    public static boolean verify(String cert, String data, String sign) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, InvalidKeySpecException {
+        PublicKey publicKey = publicKey(cert);
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initVerify(publicKey);
+        signature.update(data.getBytes());
+        return signature.verify(Base64.getDecoder().decode(sign.getBytes()));
+    }
+
+    public static boolean verify(File cer, String data, String sign) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, FileNotFoundException {
+        PublicKey publicKey = publicKey(cer);
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initVerify(publicKey);
+        signature.update(data.getBytes());
+        return signature.verify(Base64.getDecoder().decode(sign.getBytes()));
+    }
+
+    public static boolean verify(PublicKey publicKey, String data, String sign) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
+        Signature signature = Signature.getInstance(SIGNATURE);
+        signature.initVerify(rsaPublicKey);
+        signature.update(data.getBytes());
+        return signature.verify(Base64.getDecoder().decode(sign.getBytes()));
+    }
+
+    /**
+     * 分段加密解密
+     *
+     * @param cipher 加密器
+     * @param input  原始数据
+     * @return 分段加密或解密后的结果
+     * @throws BadPaddingException       e
+     * @throws IllegalBlockSizeException e
+     */
+    private static byte[] cipher(Cipher cipher, int block, byte[] input) throws BadPaddingException, IllegalBlockSizeException {
+        int length = input.length;
+        int offset = 0;
+        byte[] bytes = new byte[0];
+        byte[] cache;
+        while (length - offset > 0) {
+            if (length - offset > block) {
+                cache = cipher.doFinal(input, offset, block);
+                offset += block;
+            } else {
+                cache = cipher.doFinal(input, offset, length - offset);
+                offset = length;
+            }
+            bytes = Arrays.copyOf(bytes, bytes.length + cache.length);
+            System.arraycopy(cache, 0, bytes, bytes.length - cache.length, cache.length);
+        }
+        return bytes;
+    }
+
+}

+ 75 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/SmsUtils.java

@@ -0,0 +1,75 @@
+package com.kxs.lhb.basic.api.util;
+
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import io.micrometer.common.util.StringUtils;
+
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 短信程序
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-24
+ */
+public class SmsUtils {
+
+    public static void sendCode(String mobile, String code){
+
+        Map<String, String> queries = new HashMap<>();
+        queries.put("mobile", mobile);
+        queries.put("param", "**code**:" +code+",**minute**:5");
+
+        //smsSignId(短信前缀)和templateId(短信模板),可登录国阳云控制台自助申请。参考文档:http://help.guoyangyun.com/Problem/Qm.html
+
+        queries.put("smsSignId", "1729167ede4441fabef28c909f03c075");
+        queries.put("templateId", "908e94ccf08b4476ba6c876d13f084ad");
+
+
+
+        String path = "https://gyytz.market.alicloudapi.com/sms/smsSend";
+        String url = SmsUtils.buildUrl(path, queries);
+
+        HttpRequest.post(url)
+                .header(Header.AUTHORIZATION, "APPCODE 8e5704921ca3422f80f0deb935a7ddc6")
+                .execute().body();
+
+    }
+    /**
+     * 构建url
+     *
+     * @param url    url
+     * @param queries 查询
+     * @return {@link String}
+     */
+    public static String buildUrl(String url, Map<String, String> queries) {
+        StringBuilder sbUrl = new StringBuilder();
+        sbUrl.append(url);
+        if (null != queries) {
+            StringBuilder sbQuery = new StringBuilder();
+            for (Map.Entry<String, String> query : queries.entrySet()) {
+                if (!sbQuery.isEmpty()) {
+                    sbQuery.append("&");
+                }
+                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+                    sbQuery.append(query.getValue());
+                }
+                if (!StringUtils.isBlank(query.getKey())) {
+                    sbQuery.append(query.getKey());
+                    if (!StringUtils.isBlank(query.getValue())) {
+                        sbQuery.append("=");
+                        sbQuery.append(URLEncoder.encode(query.getValue(), StandardCharsets.UTF_8));
+                    }
+                }
+            }
+            if (!sbQuery.isEmpty()) {
+                sbUrl.append("?").append(sbQuery);
+            }
+        }
+
+        return sbUrl.toString();
+    }
+}

+ 1 - 4
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/util/TotalDateUtil.java → lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/util/TotalDateUtil.java

@@ -1,13 +1,10 @@
-package com.kxs.common.core.util;
+package com.kxs.lhb.basic.api.util;
 
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import com.google.common.collect.Lists;
 
 import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 

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

@@ -0,0 +1,21 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Data;
+
+/**
+ * 省市县码表API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class AreaRes {
+
+    private String id;
+
+    private String parentId;
+
+    private String areaCode;
+
+    private String areaName;
+}

+ 22 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/NumbersRes.java

@@ -0,0 +1,22 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Data;
+
+/**
+ * 选号列表RES
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class NumbersRes {
+
+
+    private String id;
+
+    private String parentId;
+
+    private String areaCode;
+
+    private String areaName;
+}

+ 24 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/OrderChargeLevelRes.java

@@ -0,0 +1,24 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 查询分销充值返还档次API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class OrderChargeLevelRes{
+
+    private String rechargeFee;
+    private String payFee;
+    private String goodsSkuName;
+    private String canRecharge;
+    private String offerCode;
+    private String goodsId;
+    private String goodsSkuId;
+
+}

+ 24 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/OrderFirstChargeRes.java

@@ -0,0 +1,24 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 首充查询API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+@Builder
+public class OrderFirstChargeRes{
+
+    private String number;
+    private String idenNr;
+    /**
+     * 地区编码,市级
+     */
+    private String regionId;
+
+
+}

+ 45 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/PackagesRes.java

@@ -0,0 +1,45 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 套餐信息API
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class PackagesRes {
+
+    private String id;
+
+    private String goodsName;
+    private String goodsLabel;
+    private List<GoodsChild> goodsChildList;
+
+    @Data
+    public static class GoodsChild{
+
+        private String id;
+        private String childName;
+        private String productId;
+        private String childInfo;
+        private String childFee;
+        private String minFee;
+        private String goodsId;
+        private List<Activities> activities;
+    }
+
+    @Data
+    public static class Activities{
+
+        private String offerCode;
+        private String offerName;
+        private String offerDesc;
+        private String offerModes;
+        private String offerDiscount;
+        private String straightDownAmount;
+    }
+}

+ 25 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/QueryLogisticsRes.java

@@ -0,0 +1,25 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 查询物流RES
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Data
+public class QueryLogisticsRes {
+
+    private String expressNo;
+
+    private List<Logistics> infoList;
+
+    @Data
+    public static class Logistics {
+        private String content;
+        private String operationTime;
+    }
+}

+ 17 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/TyCommRes.java

@@ -0,0 +1,17 @@
+package com.kxs.lhb.basic.api.vo.tongyi;
+
+import lombok.Data;
+
+/**
+ * tong yi 通用响应
+ *
+ * @author 没秃顶的码农
+ * @date 2024-08-29
+ */
+@Data
+public class TyCommRes<T> {
+
+    private T data;
+    private int code;
+    private String msg;
+}

+ 203 - 0
lhb-basic/lhb-basic-biz/pom.xml

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.kxs</groupId>
+        <artifactId>lhb-basic</artifactId>
+        <version>1.1.0</version>
+    </parent>
+
+    <groupId>com.kxs.lhb</groupId>
+    <artifactId>lhb-basic-biz</artifactId>
+
+    <properties>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <!--注册中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!--配置中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <!--undertow容器-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>lhb-basic-api</artifactId>
+        </dependency>
+        <!--日志处理-->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-pay</artifactId>
+        </dependency>
+        <!--安全模块-->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-security</artifactId>
+        </dependency>
+        <!-- orm 模块-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+        <!--多数据源-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
+        </dependency>
+        <!--接口文档-->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-crypto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-oss</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-idempotent</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>wx-java-mp-spring-boot-starter</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <excludes>
+                    <exclude>**/*.p12</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>false</filtering>
+                <includes>
+                    <include>**/*.p12</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <!--该插件的作用是打包spring-boot的jar包-->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <!--不排除的话,systemScope的依赖包会自动被此插件打包进xxx.jar\BOOT-INF\lib,和外部依赖产生冲突 -->
+                    <includeSystemScope>false</includeSystemScope>
+                    <skip>false</skip>
+                    <!--分离Jar包-->
+                    <layout>ZIP</layout>
+                    <includes>
+                        <include>
+                            <groupId>nothing</groupId>
+                            <artifactId>nothing</artifactId>
+                        </include>
+                    </includes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- 该插件的作用是复制依赖的jar包到指定的文件夹里 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- 该插件的作用是复制指定的文件 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <!-- 复制配置文件 -->
+                    <execution>
+                        <id>copy-resources</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <filtering>true</filtering>
+                                    <excludes>
+                                        <exclude>**/*.p12</exclude>
+                                    </excludes>
+                                </resource>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <filtering>false</filtering>
+                                    <includes>
+                                        <include>**/*.p12</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                            <outputDirectory>${project.build.directory}/config</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 29 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/LhbBasicApplication.java

@@ -0,0 +1,29 @@
+package com.kxs.lhb.basic.biz;
+
+import com.kxs.common.security.annotation.EnableAuthResourceServer;
+import com.kxs.common.security.annotation.EnableLoginResourceServer;
+import com.kxs.common.swagger.annotation.EnableKxsDoc;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * @author 没秃顶的码农
+ * @date 2022年06月21日
+ * <p>
+ * 商户端
+ */
+@SpringBootApplication
+@EnableLoginResourceServer
+@EnableAuthResourceServer
+@EnableKxsDoc(value = "basic")
+@EnableAsync
+@EnableRetry
+public class LhbBasicApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(LhbBasicApplication.class, args);
+	}
+
+}

二進制
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java


+ 69 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyBasicService.java

@@ -0,0 +1,69 @@
+package com.kxs.lhb.basic.biz.channel.tongyi;
+
+
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.http.HttpRequest;
+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.OrderCancelReq;
+import com.kxs.lhb.basic.api.dto.tongyi.TyCommonReq;
+import com.kxs.lhb.basic.api.vo.tongyi.TyCommRes;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * tong yi 基础服务
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+@Slf4j
+public abstract class TyBasicService{
+
+    private static final String APP_KEY = "6sojqlem7zf5jq33s0i90bln2a0nx106";
+    private static final String APP_SECRET = "ascqhimf4v0qyfg7bnqep1e6elg5343g";
+    private static final String APPID = "1847154180683214850";
+
+
+    private static final  String GATEWAY = "https://api.aiotzy.com/api";
+
+    protected <T> TyCommRes<T> sendToUrl(TyCommonReq param, String url){
+
+        param.setRequestId(IdUtil.simpleUUID());
+
+        BasicReq req = buildSign(param);
+
+        log.info("发送请求到tong yi平台,请求参数:{}, 请求URL:{}", JSONUtil.toJsonStr(req), url);
+        String response = HttpRequest.post(GATEWAY + url)
+                .body(JSONUtil.toJsonStr(req))
+                .timeout(100000)
+                .execute().body();
+
+        log.info("tong yi地址{}, Response:\n{}", url, response);
+
+        if (response == null || !JSONUtil.isTypeJSON(response)) {
+            log.error("响应报文非有效格式{}", response);
+            throw new GlobalCustomerException("响应报文非有效格式" + response);
+        }
+
+        TyCommRes<T> res = JSONUtil.toBean(response, new TypeReference<>() {}, true);
+        if(res.getCode() != 200){
+            throw new GlobalCustomerException("tong yi返回错误信息" + res.getMsg());
+        }
+
+        return res;
+    }
+
+    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;
+    }
+}

+ 86 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyCustomerService.java

@@ -0,0 +1,86 @@
+package com.kxs.lhb.basic.biz.channel.tongyi;
+
+import cn.hutool.json.JSONUtil;
+import com.kxs.lhb.basic.api.dto.tongyi.*;
+import com.kxs.lhb.basic.api.vo.tongyi.*;
+import com.kxs.lhb.basic.biz.channel.BasicService;
+
+import java.util.List;
+
+/**
+ * TY API调用服务
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-18
+ */
+public class TyCustomerService extends TyBasicService implements BasicService {
+
+    @Override
+    public List<AreaRes> getArea() {
+
+        TyCommonReq req = new TyCommonReq();
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/area");
+        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getData()), AreaRes.class);
+    }
+
+    @Override
+    public List<PackagesRes> getPackages(PackagesReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/packages");
+        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getData()), PackagesRes.class);
+    }
+
+    @Override
+    public List<NumbersRes> getNumbers(NumbersReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/numbers");
+        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getData()), NumbersRes.class);
+    }
+
+    @Override
+    public void preNumber(PreNumbersReq req) {
+
+        sendToUrl(req, "/api/v1/guangdian/preNumber");
+    }
+
+    @Override
+    public String orderSubmit(OrderSubmitReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/submit");
+        return commRes.getData().toString();
+    }
+
+    @Override
+    public void orderCancel(OrderCancelReq req) {
+
+        sendToUrl(req, "/api/v1/guangdian/cancel");
+    }
+
+    @Override
+    public QueryLogisticsRes queryLogistics(QueryOrderReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryLogistics");
+        return JSONUtil.toBean(JSONUtil.toJsonStr(commRes.getData()), QueryLogisticsRes.class);
+    }
+
+    @Override
+    public Integer queryStatus(QueryOrderReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryStatus");
+        return (Integer) commRes.getData();
+    }
+
+    @Override
+    public String queryFirstCharge(QueryOrderReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryFirstCharge");
+        return commRes.getData().toString();
+    }
+
+    @Override
+    public List<OrderChargeLevelRes> queryChargeLevel(OrderChargeLevelReq req) {
+
+        TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryChargeLevel");
+        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getData()), OrderChargeLevelRes.class);
+    }
+}

+ 91 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysBannerController.java

@@ -0,0 +1,91 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.common.log.annotation.SysLog;
+import com.kxs.lhb.basic.api.model.LhbBanner;
+import com.kxs.lhb.basic.biz.service.LhbBannerService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 广告管理(SysBanner)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:15
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysBanner")
+@Tag(description = "sysBanner", name = "SysBanner")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysBannerController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbBannerService lhbBannerService;
+
+
+
+    /**
+     * 列表
+     * @param page 分页对象
+     * @return 列表
+     */
+    @GetMapping("/page")
+    public R page(@ParameterObject Page<LhbBanner> page, @ParameterObject LhbBanner param) {
+
+        return R.ok(lhbBannerService.page(page, Wrappers.query(param)));
+    }
+
+
+    /**
+     * 删除
+     * Integer id 主键ID
+     * @return 删除
+     */
+    @SysLog("首页广告管理表删除")
+    @DeleteMapping("/removeById/{id}")
+    @PreAuthorize("@pms.hasPermission('lhb_banner_removeById')")
+    public R removeById(@PathVariable Integer id) {
+
+        return R.ok(lhbBannerService.removeById(id));
+    }
+
+
+    /**
+     * 新增/修改
+     * @return 新增/修改
+     */
+    @SysLog("首页广告管理表新增")
+    @PostMapping("/addOrUpdate")
+    @PreAuthorize("@pms.hasPermission('lhb_banner_addOrUpdate')")
+    public R addOrUpdate(@RequestBody LhbBanner param) {
+
+        return R.ok(lhbBannerService.saveOrUpdate(param));
+    }
+
+
+    /**
+     * 详情
+     * @return 详情
+     */
+    @GetMapping("/detail")
+    public R detail(@RequestParam("id") Integer id) {
+
+        return R.ok(lhbBannerService.getById(id));
+    }
+
+
+
+
+
+}
+

+ 81 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysColController.java

@@ -0,0 +1,81 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.common.log.annotation.SysLog;
+import com.kxs.lhb.basic.api.model.LhbCol;
+import com.kxs.lhb.basic.biz.service.LhbColService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 广告管理(SysCol)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:15
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysCol")
+@Tag(description = "sysCol", name = "SysCol")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysColController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbColService lhbColService;
+
+
+
+    /**
+     * 广告管理-分类列表
+     *
+     * @param page 分页对象
+     * @return 广告管理-分类列表
+     */
+    @GetMapping("/page")
+    public R page(@ParameterObject Page<LhbCol> page, @ParameterObject LhbCol param) {
+
+        return R.ok(lhbColService.page(page, Wrappers.query(param)));
+    }
+
+
+    /**
+     * 广告管理-分类新增/修改
+     *
+     * @return 广告管理-分类新增/修改
+     */
+    @SysLog("广告管理-分类新增/修改")
+    @PostMapping("/addOrUpdate")
+    @PreAuthorize("@pms.hasPermission('lhb_col_addOrUpdate')")
+    public R addOrUpdate(@RequestBody LhbCol kxsCol) {
+
+        return R.ok(lhbColService.saveOrUpdate(kxsCol));
+    }
+
+
+    /**
+     * 广告管理-分类删除
+     *
+     * @return 广告管理-分类删除
+     */
+    @SysLog("广告管理-分类删除")
+    @DeleteMapping("/removeById/{id}")
+    @PreAuthorize("@pms.hasPermission('lhb_col_delete')")
+    public R removeById(@PathVariable("id") Integer id) {
+
+        return R.ok(lhbColService.removeById(id));
+    }
+
+
+
+
+}
+

+ 112 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysIsvInfoController.java

@@ -0,0 +1,112 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.common.log.annotation.SysLog;
+import com.kxs.lhb.basic.api.model.LhbIsvInfo;
+import com.kxs.lhb.basic.biz.service.LhbIsvInfoService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 服务商(SysIsvInfo)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:15
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysIsvInfo")
+@Tag(description = "sysIsvInfo", name = "SysIsvInfo")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysIsvInfoController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbIsvInfoService lhbIsvInfoService;
+
+
+
+    /**
+     * 列表
+     *
+     * @param page 分页对象
+     * @return 列表
+     */
+    @GetMapping("/page")
+    public R page(@ParameterObject Page<LhbIsvInfo> page, @ParameterObject LhbIsvInfo param) {
+
+        return R.ok(lhbIsvInfoService.page(page, Wrappers.query(param)));
+    }
+
+
+    /**
+     * 详情
+     *
+     * param 实体参数
+     * @return 详情
+     */
+    @GetMapping("/detail")
+    public R detail(@RequestParam("id") Integer id) {
+
+        return R.ok(lhbIsvInfoService.getById(id));
+    }
+
+
+    /**
+     * 添加
+     *
+     * @RequestBody param 实体参数
+     * @return 添加
+     */
+    @SysLog("服务商新增")
+    @PostMapping("/add")
+    @PreAuthorize("@pms.hasPermission('sys_isv_add')")
+    public R add(@Valid @RequestBody LhbIsvInfo param) {
+
+        return R.ok(lhbIsvInfoService.save(param));
+    }
+
+
+    /**
+     * 修改
+     *
+     * @RequestBody param 实体参数
+     * @return 修改
+     */
+    @SysLog("服务商修改")
+    @PutMapping("/update")
+    @PreAuthorize("@pms.hasPermission('sys_isv_edit')")
+    public R update(@RequestBody LhbIsvInfo param) {
+
+        return R.ok(lhbIsvInfoService.updateById(param));
+    }
+
+
+    /**
+     * 删除
+     *
+     * Integer id 主键ID
+     * @return 删除
+     */
+    @SysLog("服务商删除")
+    @DeleteMapping("/removeById/{id}")
+    @PreAuthorize("@pms.hasPermission('sys_isv_delete')")
+    public R removeById(@PathVariable Integer id) {
+        return R.ok(lhbIsvInfoService.removeById(id));
+    }
+
+
+
+
+
+}
+

+ 76 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysNotifyController.java

@@ -0,0 +1,76 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kxs.common.core.util.R;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.security.annotation.Inner;
+import com.kxs.common.log.annotation.SysLog;
+import com.kxs.lhb.basic.api.dto.sysNotify.SysNotifyDTO;
+import com.kxs.lhb.basic.api.dto.sysNotify.SysNotifyPageDTO;
+import jakarta.validation.Valid;
+import org.springdoc.core.annotations.ParameterObject;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+import org.apache.ibatis.annotations.Param;
+import com.kxs.lhb.basic.biz.service.LhbNotifyService;
+
+import org.springframework.web.bind.annotation.*;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 服务商(SysNotify)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 17:10:09
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysNotify")
+@Tag(description = "sysNotify", name = "SysNotify")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysNotifyController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbNotifyService lhbNotifyService;
+
+
+
+    /**
+     * 推送管理-推送列表
+     *
+     * @param page 分页对象
+     * @return 推送管理-推送列表
+     */
+    @GetMapping("/page")
+    public R page(@ParameterObject Page<LhbNotify> page, @ParameterObject SysNotifyPageDTO param) {
+        return R.ok(lhbNotifyService.notifyPage(page, param));
+    }
+
+
+    /**
+     * 推送管理-补推
+     *
+     * @return 推送管理-补推
+     */
+    @SysLog("通知记录表新增")
+    @PostMapping("/notify")
+    @PreAuthorize("@pms.hasPermission('lhb_notify_notify')")
+    public R notify(@Valid @RequestBody SysNotifyDTO param) {
+
+        return R.ok(lhbNotifyService.notifyBatchData(param));
+    }
+
+
+
+
+
+}
+

+ 78 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysRuleMakingController.java

@@ -0,0 +1,78 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.lhb.basic.api.model.LhbRulemaking;
+import com.kxs.lhb.basic.biz.service.LhbRulemakingService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 协议规则表(SysRuleMaking)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:15
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysRuleMaking")
+@Tag(description = "sysRuleMaking", name = "SysRuleMaking")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysRuleMakingController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbRulemakingService lhbRulemakingService;
+
+
+
+
+    /**
+     * 协议管理-列表
+     *
+     * @param page 分页对象
+     * @return 协议管理-列表
+     */
+    @GetMapping("/page")
+    public R ruleMakingPage(Page<LhbRulemaking> page, LhbRulemaking param) {
+
+        return R.ok(lhbRulemakingService.page(page,Wrappers.query(param)));
+    }
+
+
+    /**
+     * 协议管理-新增或修改
+     *
+     * @return 协议管理-新增或修改
+     */
+    @PostMapping("/addOrUpdate")
+    @PreAuthorize("@pms.hasPermission('lhb_rulemaking_addOrUpdate')")
+    public R addOrUpdate(@RequestBody LhbRulemaking param) {
+        return R.ok(lhbRulemakingService.saveOrUpdate(param));
+    }
+
+
+    /**
+     * 协议管理-删除
+     *
+     * @return 协议管理-删除
+     */
+    @DeleteMapping("/removeById/{id}")
+    @PreAuthorize("@pms.hasPermission('lhb_rulemaking_removeById')")
+    public R removeById(@PathVariable("id") Integer id) {
+        return R.ok(lhbRulemakingService.removeById(id));
+    }
+
+
+
+
+
+
+}
+

+ 84 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysSupplierController.java

@@ -0,0 +1,84 @@
+package com.kxs.lhb.basic.biz.controller.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.common.log.annotation.SysLog;
+import com.kxs.lhb.basic.api.model.LhbSupplier;
+import com.kxs.lhb.basic.biz.service.LhbSupplierService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 供应商(SysSupplier)控制层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:15
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("sysSupplier")
+@Tag(description = "sysSupplier", name = "SysSupplier")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysSupplierController {
+
+    /**
+     * 服务对象
+     */
+    private final LhbSupplierService lhbSupplierService;
+
+
+
+    /**
+     * 列表
+     *
+     * @param page 分页对象
+     * @return 列表
+     */
+    @GetMapping("/page")
+    public R page(@ParameterObject Page<LhbSupplier> page, @ParameterObject LhbSupplier param) {
+
+        return R.ok(lhbSupplierService.page(page, Wrappers.query(param)));
+    }
+
+
+    /**
+     * 添加
+     *
+     * @RequestBody param 实体参数
+     * @return 添加
+     */
+    @SysLog("新增供应商")
+    @PostMapping("/addOrUpdate")
+    @PreAuthorize("@pms.hasPermission('lhb_supplier_addOrUpdate')")
+    public R addOrUpdate(@Valid @RequestBody LhbSupplier param) {
+
+        return R.ok(lhbSupplierService.saveOrUpdate(param));
+    }
+
+
+
+    /**
+     * 删除
+     * Integer id 主键ID
+     * @return 删除
+     */
+    @SysLog("删除供应商")
+    @DeleteMapping("/removeById/{id}")
+    @PreAuthorize("@pms.hasPermission('lhb_supplier_removeById')")
+    public R removeById(@PathVariable Integer id) {
+
+        return R.ok(lhbSupplierService.removeById(id));
+    }
+
+
+
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbAreaMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbArea;
+
+
+/**
+ * 地区表(LhbArea)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Mapper
+public interface LhbAreaMapper extends MPJBaseMapper<LhbArea> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbBannerMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbBanner;
+
+
+/**
+ * 首页广告管理表(LhbBanner)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Mapper
+public interface LhbBannerMapper extends MPJBaseMapper<LhbBanner> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbColMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbCol;
+
+
+/**
+ * 广告位分类表(LhbCol)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Mapper
+public interface LhbColMapper extends MPJBaseMapper<LhbCol> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsActivitiesMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbGoodsActivities;
+
+
+/**
+ * 套餐活动表(LhbGoodsActivities)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@Mapper
+public interface LhbGoodsActivitiesMapper extends MPJBaseMapper<LhbGoodsActivities> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbGoods;
+
+
+/**
+ * 产品表(LhbGoods)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Mapper
+public interface LhbGoodsMapper extends MPJBaseMapper<LhbGoods> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbGoodsSkuMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbGoodsSku;
+
+
+/**
+ * 套餐表(LhbGoodsSku)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@Mapper
+public interface LhbGoodsSkuMapper extends MPJBaseMapper<LhbGoodsSku> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbInterfaceConfigMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbInterfaceConfig;
+
+
+/**
+ * 通道参数配置表(LhbInterfaceConfig)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+@Mapper
+public interface LhbInterfaceConfigMapper extends MPJBaseMapper<LhbInterfaceConfig> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbIsvEmployMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbIsvEmploy;
+
+
+/**
+ * 服务商工号人员(LhbIsvEmploy)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Mapper
+public interface LhbIsvEmployMapper extends MPJBaseMapper<LhbIsvEmploy> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbIsvInfoMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbIsvInfo;
+
+
+/**
+ * 服务商(LhbIsvInfo)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+@Mapper
+public interface LhbIsvInfoMapper extends MPJBaseMapper<LhbIsvInfo> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbNotifyMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+
+
+/**
+ * 通知记录表(LhbNotify)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Mapper
+public interface LhbNotifyMapper extends MPJBaseMapper<LhbNotify> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbOrderMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbOrder;
+
+
+/**
+ * 订单表(LhbOrder)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Mapper
+public interface LhbOrderMapper extends MPJBaseMapper<LhbOrder> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbOrderRechargeMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+
+
+/**
+ * 订单号码充值记录(LhbOrderRecharge)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@Mapper
+public interface LhbOrderRechargeMapper extends MPJBaseMapper<LhbOrderRecharge> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbRulemakingMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbRulemaking;
+
+
+/**
+ * 协议规则表(LhbRulemaking)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Mapper
+public interface LhbRulemakingMapper extends MPJBaseMapper<LhbRulemaking> {
+
+}
+

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbSupplierMapper.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.kxs.lhb.basic.api.model.LhbSupplier;
+
+
+/**
+ * 供应商(LhbSupplier)表数据库访问层
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@Mapper
+public interface LhbSupplierMapper extends MPJBaseMapper<LhbSupplier> {
+
+}
+

+ 108 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLlbBindQueueListener.java

@@ -0,0 +1,108 @@
+package com.kxs.lhb.basic.biz.mq;
+
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.mq.handlers.IMQSender;
+import com.kxs.lhb.basic.api.amqp.RabbitLlbBindQueueMQ;
+import com.kxs.lhb.basic.api.constant.BasicConstants;
+import com.kxs.lhb.basic.api.model.LhbIsvInfo;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+import com.kxs.lhb.basic.biz.mq.model.MarkingModel;
+import com.kxs.lhb.basic.biz.service.LhbIsvInfoService;
+import com.kxs.lhb.basic.biz.service.LhbNotifyService;
+import com.kxs.lhb.system.api.util.ParamResolver;
+import com.rabbitmq.client.Channel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+/**
+ * rabbit 队列侦听器 绑定推送到第三方队列
+ *
+ * @author mac
+ * @date 2024-09-07
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class RabbiLlbBindQueueListener {
+
+	private final IMQSender mqSender;
+
+	private final LhbIsvInfoService isvInfoService;
+	private final LhbNotifyService notifyService;
+
+	/**
+	 * 监听 绑定队列
+	 *
+	 * @param message 消息
+	 */
+	@RabbitListener(queues = RabbitLlbBindQueueMQ.QUEUE_NAME, ackMode = "MANUAL")
+	@RabbitHandler
+	public void onMessage(String msg, Message message, Channel channel){
+        try {
+			RabbitLlbBindQueueMQ.MsgEntity parse = RabbitLlbBindQueueMQ.parse(msg);
+
+			String serverPrivateKey = ParamResolver.getStr("LOCAL_PRIVATE_KEY");
+
+			LhbNotify notify = notifyService.getByNoteId(parse.getNotifyId());
+			if(notify == null){
+				log.error("推送信息不存在{}", parse.getNotifyId());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			if(Objects.equals(notify.getStatus(), CommonConstants.SUCCESS)){
+				log.error("推送信息已推送成功{}", parse.getNotifyId());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			if(notify.getNotifyCount() > BasicConstants.MAX_NOTIFY_TIMES){
+				log.error("推送信息已超过最大推送次数{}", parse.getNotifyId());
+				notify.setStatus(-1);
+				notifyService.updateById(notify);
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			LhbIsvInfo isvInfo = isvInfoService.getByIsvNo(notify.getIsvNo());
+			if(isvInfo == null){
+				log.error("代理商{}信息不存在", notify.getIsvNo());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+
+			//推送
+			boolean result = MarkingModel.builder()
+					.content(notify)
+					.encrypt(isvInfo.getPublicKey())
+					.sign(serverPrivateKey)
+					.execute(isvInfo.getBindUrl());
+			if (result) {
+				log.info("绑定{}推送成功", parse.getNotifyId());
+				notify.setStatus(CommonConstants.SUCCESS);
+				notify.setNotifyTime(LocalDateTime.now());
+			} else {
+				notify.setNotifyCount(notify.getNotifyCount() + 1);
+				log.error("绑定{}推送失败开始重试第{}次", parse.getNotifyId(), notify.getNotifyCount());
+				//时间递增
+				mqSender.send(RabbitLlbBindQueueMQ.build(parse), BasicConstants.ROCKET_MQ_DELAY_LEVEL_SECOND[notify.getNotifyCount()]);
+			}
+			notifyService.updateById(notify);
+			channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
+        } catch (Exception e) {
+			log.error("绑定消费失败{}", msg, e );
+			try {
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+			} catch (IOException ex) {
+				log.error("绑定消费失败" + ex.getMessage(), ex);
+			}
+        }
+    }
+
+
+}

+ 156 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbiLlbOrderQueueListener.java

@@ -0,0 +1,156 @@
+package com.kxs.lhb.basic.biz.mq;
+
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.crypto.asymmetric.Sign;
+import cn.hutool.crypto.asymmetric.SignAlgorithm;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.mq.handlers.IMQSender;
+import com.kxs.lhb.basic.api.amqp.RabbitLlbOrderQueueMQ;
+import com.kxs.lhb.basic.api.constant.BasicConstants;
+import com.kxs.lhb.basic.api.model.LhbIsvInfo;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+import com.kxs.lhb.basic.api.util.RsaUtil;
+import com.kxs.lhb.basic.biz.mq.model.MarkingModel;
+import com.kxs.lhb.basic.biz.service.LhbIsvInfoService;
+import com.kxs.lhb.basic.biz.service.LhbNotifyService;
+import com.kxs.lhb.system.api.util.ParamResolver;
+import com.rabbitmq.client.Channel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Base64;
+import java.util.Objects;
+
+/**
+ * rabbit 队列侦听器 订单推送到第三方队列
+ *
+ * @author mac
+ * @date 2024-09-07
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class RabbiLlbOrderQueueListener {
+
+	private final IMQSender mqSender;
+
+	private final LhbIsvInfoService isvInfoService;
+	private final LhbNotifyService notifyService;
+
+
+
+	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);
+        }
+
+
+    }
+
+	/**
+	 * 监听 套餐订单队列
+	 *
+	 * @param message 消息
+	 */
+	@RabbitListener(queues = RabbitLlbOrderQueueMQ.QUEUE_NAME, ackMode = "MANUAL")
+	@RabbitHandler
+	public void onMessage(String msg, Message message, Channel channel){
+        try {
+			RabbitLlbOrderQueueMQ.MsgEntity parse = RabbitLlbOrderQueueMQ.parse(msg);
+			String serverPrivateKey = ParamResolver.getStr("LOCAL_PRIVATE_KEY");
+
+			LhbNotify notify = notifyService.getByNoteId(parse.getNotifyId());
+			if(notify == null){
+				log.error("推送信息不存在{}", parse.getNotifyId());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			if(Objects.equals(notify.getStatus(), CommonConstants.SUCCESS)){
+				log.error("推送信息已推送成功{}", parse.getNotifyId());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			if(notify.getNotifyCount() > BasicConstants.MAX_NOTIFY_TIMES){
+				log.error("推送信息已超过最大推送次数{}", parse.getNotifyId());
+				notify.setStatus(-1);
+				notifyService.updateById(notify);
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+			LhbIsvInfo isvInfo = isvInfoService.getByIsvNo(notify.getIsvNo());
+			if(isvInfo == null){
+				log.error("代理商{}信息不存在", notify.getIsvNo());
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+				return;
+			}
+
+			//推送订单
+			boolean result = MarkingModel.builder()
+					.content(notify)
+					.sign(serverPrivateKey)
+					.encrypt(isvInfo.getPublicKey())
+					.execute(isvInfo.getOrderUrl());
+			if (result) {
+				log.info("交易订单{}推送成功", parse.getNotifyId());
+				notify.setStatus(CommonConstants.SUCCESS);
+				notify.setNotifyTime(LocalDateTime.now());
+			} else {
+				notify.setStatus(-1);
+				notify.setNotifyCount(notify.getNotifyCount() + 1);
+				log.error("交易订单{}推送失败开始重试第{}次", parse.getNotifyId(), notify.getNotifyCount());
+				//时间递增
+				mqSender.send(RabbitLlbOrderQueueMQ.build(parse), BasicConstants.ROCKET_MQ_DELAY_LEVEL_SECOND[notify.getNotifyCount()]);
+			}
+			notifyService.updateById(notify);
+			channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
+        } catch (Exception e) {
+			log.error("订单交易订单消费失败{}", msg, e );
+			try {
+				channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+			} catch (IOException ex) {
+				log.error("订单交易订单消费失败" + ex.getMessage(), ex);
+			}
+        }
+    }
+
+
+}

+ 20 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/CommMarking.java

@@ -0,0 +1,20 @@
+package com.kxs.lhb.basic.biz.mq.model;
+
+import lombok.Data;
+
+/**
+ * 营销端推送公共模块
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-02
+ */
+@Data
+public class CommMarking {
+
+    private String sign;
+    private String content;
+    private String timestamp;
+    private String noticeId;
+    private String isvNo;
+
+}

+ 90 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/MarkingModel.java

@@ -0,0 +1,90 @@
+package com.kxs.lhb.basic.biz.mq.model;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+import com.kxs.lhb.basic.api.util.RsaUtil;
+import lombok.Data;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 营销端统一请求
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-02
+ */
+@Slf4j
+@Data
+public class MarkingModel {
+
+
+
+    public static MarkingModelBuilder builder() {
+        return new MarkingModelBuilder();
+    }
+
+    /**
+     * 标记模型生成器
+     *
+     * @author 没秃顶的码农
+     * @date 2024-09-02
+     */
+    public static class MarkingModelBuilder {
+
+        private CommMarking markingModel;
+
+        public MarkingModelBuilder content(LhbNotify notify) {
+
+            this.markingModel = new CommMarking();
+            this.markingModel.setContent(JSONUtil.toJsonStr(notify.getParams()));
+            this.markingModel.setNoticeId(notify.getNotifyId());
+            this.markingModel.setTimestamp(String.valueOf(System.currentTimeMillis()));
+            this.markingModel.setIsvNo(notify.getIsvNo());
+
+            return this;
+        }
+
+        @SneakyThrows
+        public MarkingModelBuilder sign(String privateKey) {
+            String signStr = "timestamp=" + markingModel.getTimestamp()
+                    + "&noticeId=" + markingModel.getNoticeId()
+                    +  "&isvNo=" + markingModel.getIsvNo()
+                    +  "&content=" + markingModel.getContent();
+            this.markingModel.setSign(RsaUtil.sign(privateKey, signStr));
+
+            return this;
+        }
+
+        @SneakyThrows
+        public MarkingModelBuilder encrypt(String publicKey) {
+
+            this.markingModel.setContent(RsaUtil.encrypt(publicKey, markingModel.getContent()));
+
+            return this;
+        }
+
+        public boolean execute(String url) {
+
+            log.info("Marking Request: {}", markingModel);
+            String response = HttpRequest.post(url)
+                    .body(JSONUtil.toJsonStr(markingModel))
+                    .execute().body();
+            if (StrUtil.isEmpty(response) || !JSONUtil.isTypeJSON(response)) {
+                log.info("代理:{},响应异常: {}", this.markingModel.getIsvNo(), response);
+                return Boolean.FALSE;
+            }
+            log.info("Marking Response: {}", response);
+
+            JSONObject jsonObject = JSONUtil.parseObj(response);
+            String code = jsonObject.get("code", String.class);
+            String status = jsonObject.get("msg", String.class);
+
+            return StrUtil.equals(code, "200") && StrUtil.equals(status, "ok");
+
+        }
+
+    }
+}

+ 33 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/BindNotify.java

@@ -0,0 +1,33 @@
+package com.kxs.lhb.basic.biz.mq.model.params;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 绑定通知
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-02
+ */
+@Data
+@Builder
+public class BindNotify {
+
+
+    private String sn;
+
+    private String mchNo;
+
+    private String bindTime;
+
+    /**
+     * 设备类型 UFI=0 MIFI=1 CPE=2 能量塔=3
+     */
+    private Integer snType;
+
+    /**
+     * 通知类型 1绑定 0解绑
+     */
+    private Integer notifyType;
+
+}

+ 18 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/IsvParams.java

@@ -0,0 +1,18 @@
+package com.kxs.lhb.basic.biz.mq.model.params;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.core.exception.GlobalCustomerException;
+
+public abstract class IsvParams {
+
+    public static IsvParams factory(String paramsStr, String className){
+
+        try {
+            return (IsvParams)JSONObject.parseObject(paramsStr, Class.forName(IsvParams.class.getPackage().getName() +"."+ StrUtil.upperFirst(className)));
+        } catch (ClassNotFoundException e) {
+            throw new GlobalCustomerException("未找到对应的参数类"+ className);
+        }
+    }
+
+}

+ 48 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/OrderNotify.java

@@ -0,0 +1,48 @@
+package com.kxs.lhb.basic.biz.mq.model.params;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 订单通知
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class OrderNotify extends IsvParams{
+
+    private String orderSn;
+
+    private String sn;
+
+    private String mchNo;
+
+    /**
+     * 设备类型 UFI=0 MIFI=1 CPE=2 能量塔=3
+     */
+    private Integer snType;
+
+    private String tradeAmt;
+
+    /**
+     * 交易时间
+     */
+    private String tradeTime;
+
+    private Integer duration;
+
+
+    /**
+     * 套餐单位 0:按天 1:按月
+     */
+    private Integer unit;
+
+    private Integer isFirstRecharge;
+
+    private Integer cashFlag;
+
+}

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

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbArea;
+
+
+/**
+ * 地区表(LhbArea)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+public interface LhbAreaService extends MPJBaseService<LhbArea> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbBannerService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbBanner;
+
+
+/**
+ * 首页广告管理表(LhbBanner)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+public interface LhbBannerService extends MPJBaseService<LhbBanner> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbColService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbCol;
+
+
+/**
+ * 广告位分类表(LhbCol)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+public interface LhbColService extends MPJBaseService<LhbCol> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsActivitiesService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbGoodsActivities;
+
+
+/**
+ * 套餐活动表(LhbGoodsActivities)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+public interface LhbGoodsActivitiesService extends MPJBaseService<LhbGoodsActivities> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbGoods;
+
+
+/**
+ * 产品表(LhbGoods)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+public interface LhbGoodsService extends MPJBaseService<LhbGoods> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsSkuService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbGoodsSku;
+
+
+/**
+ * 套餐表(LhbGoodsSku)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+public interface LhbGoodsSkuService extends MPJBaseService<LhbGoodsSku> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbInterfaceConfigService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbInterfaceConfig;
+
+
+/**
+ * 通道参数配置表(LhbInterfaceConfig)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+public interface LhbInterfaceConfigService extends MPJBaseService<LhbInterfaceConfig> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbIsvEmployService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbIsvEmploy;
+
+
+/**
+ * 服务商工号人员(LhbIsvEmploy)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+public interface LhbIsvEmployService extends MPJBaseService<LhbIsvEmploy> {
+
+}
+

+ 17 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbIsvInfoService.java

@@ -0,0 +1,17 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbIsvInfo;
+
+
+/**
+ * 服务商(LhbIsvInfo)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:11
+ */
+public interface LhbIsvInfoService extends MPJBaseService<LhbIsvInfo> {
+
+    LhbIsvInfo getByIsvNo(String isvNo);
+}
+

+ 24 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbNotifyService.java

@@ -0,0 +1,24 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.dto.sysNotify.SysNotifyDTO;
+import com.kxs.lhb.basic.api.dto.sysNotify.SysNotifyPageDTO;
+import com.kxs.lhb.basic.api.model.LhbNotify;
+
+
+/**
+ * 通知记录表(LhbNotify)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+public interface LhbNotifyService extends MPJBaseService<LhbNotify> {
+
+    LhbNotify getByNoteId(String notifyId);
+
+    Page<LhbNotify> notifyPage(Page<LhbNotify> page, SysNotifyPageDTO param);
+
+    Boolean notifyBatchData(SysNotifyDTO param);
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderRechargeService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+
+
+/**
+ * 订单号码充值记录(LhbOrderRecharge)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+public interface LhbOrderRechargeService extends MPJBaseService<LhbOrderRecharge> {
+
+}
+

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

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbOrder;
+
+
+/**
+ * 订单表(LhbOrder)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+public interface LhbOrderService extends MPJBaseService<LhbOrder> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbRulemakingService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbRulemaking;
+
+
+/**
+ * 协议规则表(LhbRulemaking)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+public interface LhbRulemakingService extends MPJBaseService<LhbRulemaking> {
+
+}
+

+ 16 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbSupplierService.java

@@ -0,0 +1,16 @@
+package com.kxs.lhb.basic.biz.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.model.LhbSupplier;
+
+
+/**
+ * 供应商(LhbSupplier)表服务接口
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+public interface LhbSupplierService extends MPJBaseService<LhbSupplier> {
+
+}
+

+ 26 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.biz.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.biz.mapper.LhbAreaMapper;
+import com.kxs.lhb.basic.biz.service.LhbAreaService;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import com.kxs.lhb.basic.api.model.LhbArea;
+
+
+/**
+ * 地区表(LhbArea)表服务实现类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Service("lhbAreaService")
+@RequiredArgsConstructor
+@Slf4j
+public class LhbAreaServiceImpl extends MPJBaseServiceImpl<LhbAreaMapper, LhbArea> implements LhbAreaService {
+
+}
+

+ 26 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbBannerServiceImpl.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.biz.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.biz.mapper.LhbBannerMapper;
+import com.kxs.lhb.basic.biz.service.LhbBannerService;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import com.kxs.lhb.basic.api.model.LhbBanner;
+
+
+/**
+ * 首页广告管理表(LhbBanner)表服务实现类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Service("lhbBannerService")
+@RequiredArgsConstructor
+@Slf4j
+public class LhbBannerServiceImpl extends MPJBaseServiceImpl<LhbBannerMapper, LhbBanner> implements LhbBannerService {
+
+}
+

+ 26 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbColServiceImpl.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.biz.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.biz.mapper.LhbColMapper;
+import com.kxs.lhb.basic.biz.service.LhbColService;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import com.kxs.lhb.basic.api.model.LhbCol;
+
+
+/**
+ * 广告位分类表(LhbCol)表服务实现类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:12
+ */
+@Service("lhbColService")
+@RequiredArgsConstructor
+@Slf4j
+public class LhbColServiceImpl extends MPJBaseServiceImpl<LhbColMapper, LhbCol> implements LhbColService {
+
+}
+

+ 26 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsActivitiesServiceImpl.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.biz.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.biz.mapper.LhbGoodsActivitiesMapper;
+import com.kxs.lhb.basic.biz.service.LhbGoodsActivitiesService;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import com.kxs.lhb.basic.api.model.LhbGoodsActivities;
+
+
+/**
+ * 套餐活动表(LhbGoodsActivities)表服务实现类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:14
+ */
+@Service("lhbGoodsActivitiesService")
+@RequiredArgsConstructor
+@Slf4j
+public class LhbGoodsActivitiesServiceImpl extends MPJBaseServiceImpl<LhbGoodsActivitiesMapper, LhbGoodsActivities> implements LhbGoodsActivitiesService {
+
+}
+

+ 26 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java

@@ -0,0 +1,26 @@
+package com.kxs.lhb.basic.biz.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.biz.mapper.LhbGoodsMapper;
+import com.kxs.lhb.basic.biz.service.LhbGoodsService;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import com.kxs.lhb.basic.api.model.LhbGoods;
+
+
+/**
+ * 产品表(LhbGoods)表服务实现类
+ *
+ * @author 系统
+ * @since 2024-10-18 16:10:13
+ */
+@Service("lhbGoodsService")
+@RequiredArgsConstructor
+@Slf4j
+public class LhbGoodsServiceImpl extends MPJBaseServiceImpl<LhbGoodsMapper, LhbGoods> implements LhbGoodsService {
+
+}
+

部分文件因文件數量過多而無法顯示