Browse Source

first commit business-v1

ltt 1 năm trước cách đây
commit
767906d4c2
100 tập tin đã thay đổi với 8201 bổ sung0 xóa
  1. 3 0
      .idea/.gitignore
  2. 29 0
      .idea/compiler.xml
  3. 39 0
      .idea/encodings.xml
  4. 135 0
      .idea/inspectionProfiles/Project_Default.xml
  5. 25 0
      .idea/jarRepositories.xml
  6. 20 0
      .idea/misc.xml
  7. 65 0
      business-common/business-common-core/pom.xml
  8. 309 0
      business-common/business-common-core/src/main/java/com/sckw/core/model/constant/Global.java
  9. 45 0
      business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderCarStatusEnum.java
  10. 38 0
      business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderSourceEnum.java
  11. 45 0
      business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderUsualStatusEnum.java
  12. 149 0
      business-common/business-common-core/src/main/java/com/sckw/core/model/page/PageRes.java
  13. 262 0
      business-common/business-common-core/src/main/java/com/sckw/core/utils/BeanUtils.java
  14. 447 0
      business-common/business-common-core/src/main/java/com/sckw/core/utils/CollectionUtils.java
  15. 114 0
      business-common/business-common-core/src/main/java/com/sckw/core/utils/IdWorker.java
  16. 831 0
      business-common/business-common-core/src/main/java/com/sckw/core/utils/StringUtils.java
  17. 88 0
      business-common/business-common-core/src/main/java/com/sckw/core/web/response/HttpResult.java
  18. 45 0
      business-common/business-common-datasource/pom.xml
  19. 43 0
      business-common/business-common-redis/pom.xml
  20. 92 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/config/RedisLockUtil.java
  21. 64 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/config/RedissonConfig.java
  22. 50 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/config/serializer/FastJson2JsonRedisSerializer.java
  23. 52 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/configure/RedissonConfiguration.java
  24. 126 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java
  25. 10 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/constant/RedisLockKey.java
  26. 77 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/utils/GenerateOrderIdUtil.java
  27. 386 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/utils/RedissonUtils.java
  28. 139 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/utils/SnowflakeIdWorker.java
  29. 37 0
      business-common/business-common-redis/src/main/java/com/sckw/redis/utils/TestService.java
  30. 2 0
      business-common/business-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  31. 25 0
      business-common/pom.xml
  32. 132 0
      business-modules-web/business-transport-start/pom.xml
  33. 19 0
      business-modules-web/business-transport-start/src/main/java/com/sckw/transport/TransportStartApplication.java
  34. 57 0
      business-modules-web/business-transport-start/src/main/java/com/sckw/transport/plugin/Myplugin.java
  35. 74 0
      business-modules-web/business-transport-start/src/main/resources/application.yml
  36. 23 0
      business-modules-web/pom.xml
  37. 42 0
      business-modules/business-address/pom.xml
  38. 94 0
      business-modules/business-address/src/main/java/com/sckw/address/controller/AddressController.java
  39. 72 0
      business-modules/business-address/src/main/java/com/sckw/address/controller/AddressTypeController.java
  40. 91 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/KwBusinessAddress.java
  41. 56 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/KwBusinessAddressType.java
  42. 17 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressListParam.java
  43. 23 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressPageListParam.java
  44. 81 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressParam.java
  45. 27 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressTypeInsertParam.java
  46. 15 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessAddressListRes.java
  47. 15 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessAddressTypeListRes.java
  48. 79 0
      business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessPageListRes.java
  49. 23 0
      business-modules/business-address/src/main/java/com/sckw/address/mapper/KwBusinessAddressMapper.java
  50. 17 0
      business-modules/business-address/src/main/java/com/sckw/address/mapper/KwBusinessAddressTypeMapper.java
  51. 177 0
      business-modules/business-address/src/main/java/com/sckw/address/service/KwAddressService.java
  52. 112 0
      business-modules/business-address/src/main/java/com/sckw/address/service/KwBusinessAddressTypeService.java
  53. 46 0
      business-modules/business-address/src/main/resources/mapper/KwBusinessAddressMapper.xml
  54. 27 0
      business-modules/business-address/src/main/resources/mapper/KwBusinessAddressTypeMapper.xml
  55. 49 0
      business-modules/business-car-transport/pom.xml
  56. 85 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/controller/CarTransportController.java
  57. 70 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/controller/WayBillController.java
  58. 247 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarOrder.java
  59. 73 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarOrderDict.java
  60. 143 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarWaybillOrder.java
  61. 78 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarDictReq.java
  62. 36 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarDictRes.java
  63. 62 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportDefGoods.java
  64. 52 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportInventory.java
  65. 72 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportMore.java
  66. 178 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPath.java
  67. 66 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPathGoods.java
  68. 102 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPer.java
  69. 69 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportTrack.java
  70. 61 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrder.java
  71. 67 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatch.java
  72. 87 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatchAddress.java
  73. 66 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatchAssign.java
  74. 72 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillTransportPathGoods.java
  75. 222 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/AddLogisticsOrderParam.java
  76. 14 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/GoodsListDetailDto.java
  77. 18 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/GoodsListDto.java
  78. 16 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/InventoryNumDto.java
  79. 30 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarCompleteParam.java
  80. 26 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportDefGoodsReq.java
  81. 37 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportMoreReq.java
  82. 150 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportPathDto.java
  83. 69 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportPerParam.java
  84. 65 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarWaybillOrderDispatchAddressReq.java
  85. 36 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarWaybillOrderDispatchAssignReq.java
  86. 23 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCompletePathDto.java
  87. 46 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderSendCarParam.java
  88. 18 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/UpdateCompleteGoodsListDto.java
  89. 59 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/kwWaybillOrderReq.java
  90. 92 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/CarDetailRes.java
  91. 170 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderCarLandTransportPathRes.java
  92. 24 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderDetailPath.java
  93. 22 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderWaybillDetailRes.java
  94. 24 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/ListAndDetailDto.java
  95. 24 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/ListDetailRes.java
  96. 42 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/enums/LoadOrUnLoadHandlingEnum.java
  97. 25 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/enums/OrderCarDictTypeEnum.java
  98. 37 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/enums/WaybillOrderStatusEnum.java
  99. 47 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/enums/WaybillStatusEnums.java
  100. 19 0
      business-modules/business-car-transport/src/main/java/com/sckw/car/mapper/KwCarOrderMapper.java

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 29 - 0
.idea/compiler.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="business-usual-transport" />
+        <module name="business-transport-start" />
+        <module name="business-goods" />
+        <module name="business-common-datasource" />
+        <module name="business-common-core" />
+        <module name="business-address" />
+        <module name="business-company" />
+        <module name="business-car-transport" />
+        <module name="business-user" />
+        <module name="business-driver" />
+        <module name="business-path" />
+        <module name="business-truck" />
+        <module name="business-common-redis" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="business-common-utils" target="17" />
+      <module name="business-module-start" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+</project>

+ 39 - 0
.idea/encodings.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/business-common/business-common-core/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/business-common-core/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/business-common-datasource/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/business-common-datasource/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/business-common-redis/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/business-common-redis/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules-web/business-transport-start/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules-web/business-transport-start/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules-web/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules-web/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-address/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-address/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-car-transport/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-car-transport/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-company/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-company/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-driver/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-driver/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-goods/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-goods/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-path/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-path/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-truck/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-truck/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-user/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-user/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-usual-transport/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/business-usual-transport/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/business-modules/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

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

@@ -0,0 +1,135 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliDeprecation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliEqualsAvoidNull" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliMissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliWrapperTypeEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidCallStaticSimpleDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidCommentBehindStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidComplexCondition" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidConcurrentCompetitionRandom" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidDoubleOrFloatEqualCompare" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidManuallyCreateThread" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidMissUseOfMathRandom" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidNegationOperator" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidReturnInFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidStartWithDollarAndUnderLineNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidUseTimer" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaBigDecimalAvoidDoubleConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaBooleanPropertyShouldNotStartWithIs" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassCastExceptionWithSubListToArrayList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassCastExceptionWithToArray" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassMustHaveAuthor" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassNamingShouldBeCamel" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCollectionInitShouldAssignCapacity" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCommentsMustBeJavadocFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaConcurrentExceptionWithModifyOriginSubList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaConstantFieldShouldBeUpperCase" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCountDownShouldInFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaDontModifyInForeachCircle" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaEnumConstantsMustHaveComment" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaExceptionClassShouldEndWithException" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaIbatisMethodQueryForList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaLockShouldWithTryFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaLowerCamelCaseVariableNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaMethodReturnWrapperType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaMethodTooLong" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPackageNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoMustOverrideToString" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoMustUsePrimitiveField" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoNoDefaultValue" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaRemoveCommentedCode" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaServiceOrDaoClassShouldEndWithImpl" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSneakyThrowsWithoutExceptionType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaStringConcat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSwitchExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadLocalShouldRemove" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadPoolCreation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadShouldSetName" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUndefineMagicConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUnsupportedExceptionWithModifyAsList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUseQuietReferenceNotation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUseRightCaseForDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="date" />
+    </inspection_tool>
+    <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ADDITIONAL_TAGS" value="date,date:,author:,desc:" />
+    </inspection_tool>
+    <inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="MissingJavadoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="PACKAGE_SETTINGS">
+        <Options>
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+      <option name="MODULE_SETTINGS">
+        <Options>
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+      <option name="TOP_LEVEL_CLASS_SETTINGS">
+        <Options>
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+      <option name="INNER_CLASS_SETTINGS">
+        <Options>
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+      <option name="METHOD_SETTINGS">
+        <Options>
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+      <option name="FIELD_SETTINGS">
+        <Options>
+          <option name="ENABLED" value="false" />
+        </Options>
+      </option>
+    </inspection_tool>
+  </profile>
+</component>

+ 25 - 0
.idea/jarRepositories.xml

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

+ 20 - 0
.idea/misc.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/business-common/business-common-utils/pom.xml" />
+        <option value="$PROJECT_DIR$/business-transport-start/pom.xml" />
+      </set>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 65 - 0
business-common/business-common-core/pom.xml

@@ -0,0 +1,65 @@
+<?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">
+    <parent>
+        <artifactId>business-common</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-common-core</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.49</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>6.1.5</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.18</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.4.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <version>10.1.19</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>6.1.5</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 309 - 0
business-common/business-common-core/src/main/java/com/sckw/core/model/constant/Global.java

@@ -0,0 +1,309 @@
+package com.sckw.core.model.constant;
+
+/**
+ * All rights Reserved, Designed By www.51wph.com
+ *
+ * @version V1.0
+ * @ProjectName: wph-platform
+ * @Package com.wph.common.consts
+ * @Description:全局配置类/系统常用常量
+ * @author: zk
+ * @date: 2019-05-28 17:31
+ * @Copyright: 2019 www.51wph.com Inc. All rights reserved.
+ * 注意:本内容仅限于汇链科技有限公司内部传阅,禁止外泄以及用于其他的商业目的
+ */
+public class Global {
+
+    /**pc-background token有效期为2小时*/
+    public static final int PC_BACKGROUND_TOKEN_EXPIRE = 60 * 60 * 2;
+
+    /**app token有效期为30天*/
+    public static final int APP_TOKEN_EXPIRE = 30 * 24 * 60 * 60;
+
+    /**pc token有效期为2小时*/
+    public static final int PC_TOKEN_EXPIRE = 2 * 60 * 60;
+
+    /**通用有效期为2小时*/
+    public static final int COMMON_EXPIRE = 2 * 60 * 60;
+
+    /**API调用token有效时间*/
+    public static final int API_EXPIRE = 120 * 60;
+
+    /**保存全局属性值*/
+//    private static Map<String, String> map = Maps.newHashMap();
+
+    /**显示/隐藏*/
+    public static final int SHOW = 1;
+    public static final int HIDE = 0;
+    public static final int MINUS_ONE = -1;
+    /**正常/删除*/
+    public static final int DELETED = 1;
+    public static final int UN_DELETED = 0;
+    /**是/否*/
+    public static final int YES = 1;
+    public static final int NO = 0;
+    public static final String BE = "是";
+    public static final String NAY = "否";
+
+    /**对/错*/
+    public static final boolean TRUE = true;
+    public static final boolean FALSE = false;
+
+    /**字符*/
+    public static final String CODING_GBK = "GBK";
+    public static final String CODING_UTF8 = "UTF-8";
+
+    /**消息强弱提醒 强提醒:Y,否则:N*/
+    public static final String Y = "Y";
+    public static final String N = "N";
+
+    /**初始金额*/
+    public static final Double AMOUNT = 0.0;
+
+    /**初始数值*/
+    public static final int NUMERICAL_ZERO = 0;
+    public static final int NUMERICAL_ONE = 1;
+    public static final int NUMERICAL_TWO = 2;
+    public static final int NUMERICAL_THREE = 3;
+    public static final int NUMERICAL_FOUR = 4;
+    public static final int NUMERICAL_EIGHT = 8;
+    public static final int NUMERICAL_TWELVE = 12;
+    public static final int NUMERICAL_SIXTEEN = 16;
+
+    /**pid等于0的*/
+    public static final String PID = "0";
+
+    /**or*/
+    public static final String OR = "OR";
+
+    /**and*/
+    public static final String AND = "AND";
+
+    /**ok*/
+    public static final String OK = "OK";
+
+    /**忘记密码获取验证码*/
+    public static final String FORGET_SMS = "forget:";
+
+    /**忘记密码获取验证码*/
+    public static final String REPEAT_SUBMIT = "repeatSubmit:";
+
+    /**用户登录验证码*/
+    public static final String USER_LOGIN_CAPTCHA = "userLoginCaptcha:";
+
+    /**redis用户信息前缀*/
+    public static final String REDIS_USER_LOGIN_PREFIX = "userLoginInfo:";
+    public static final String REDIS_USER_PREFIX = "userInfo:";
+    public static final String REDIS_USER_TOKEN_PREFIX = "userToken:";
+
+    /**redis企业信息前缀*/
+    public static final String REDIS_ENTERPRISE_PREFIX = "enterpriseInfo:";
+
+    /**redis区域信息前缀*/
+    public static final String REDIS_AREA_PREFIX = "areaInfo:";
+
+    /**redis区域信息前缀*/
+    public static final String REDIS_GROUP_AREA_PREFIX = "areaInfo:group:";
+
+    /**redis用户菜单信息前缀*/
+    public static final String REDIS_SYS_MENU_PREFIX = "sysMenu:";
+
+    /**redis字典信息前缀*/
+    public static final String REDIS_SYS_DICT_TYPE_PREFIX = "dictInfo:type:";
+    public static final String REDIS_SYS_DICT_PREFIX = "dictInfo:dict:";
+    public static final String REDIS_SYS_DICT_GROUP_PREFIX = "dictInfo:group:";
+
+    /**redis用户车辆gps信息*/
+    public static final String REDIS_CACHE_GPS_CAR_PREFIX = "cacheGpsCar:";
+
+    /**redis运营活动奖品前缀*/
+    public static final String REDIS_ACTIVITY_PRIZE_PREFIX = "activityPrize:";
+
+    /**redis用户运营活动抽奖信息前缀*/
+    public static final String ACTIVITY_JOIN = "activityJoin:";
+
+    /**redis用户运营活动信息前缀*/
+    public static final String ACTIVITY = "activity:";
+
+    /**汇链用户专场编号*/
+    public static final String PHONE = "400-030-5677";
+
+    /**系统初始密码*/
+    public static final String PASSWORD = "123456";
+
+    /**逗号-英文*/
+    public static final String COMMA = ",";
+
+    /**逗号-中文*/
+    public static final String COMMA1 = ",";
+    /**
+     * 右斜杠
+     */
+    public static final String RIGHT_SLASH = "/";
+
+    /**点*/
+    public static final String DOT = ".";
+
+    /**冒号*/
+    public static final String COLON = ":";
+
+    /**下划线拼接*/
+    public static final char UNDERLINE = '_';
+
+    /**空字符串*/
+    public static final String EMPTY_STRING = "";
+
+    /**等号**/
+    public static final String EQUAL_SIGN = "=";
+
+    /**美元符号**/
+    public static final String DOLLAR = "$";
+
+    /**+符号**/
+    public static final String PLUS = "+";
+
+    /**-符号*/
+    public static final String MINUS_SIGN = "-";
+
+    /**#符号**/
+    public static final String POUND = "#";
+
+    /**下划线拼接*/
+    public static final String BRACKET = "()";
+    public static final String BRACKET_LEFT = "(";
+    public static final String BRACKET_RIGHT = ")";
+
+    /**大括号*/
+    public static final String BIG_BRACKETS = "{}";
+    public static final String BIG_BRACKETS_LEFT = "{";
+    public static final String BIG_BRACKETS_RIGHT = "}";
+
+    /**星号拼接*/
+    public static final String ASTERISK1 = "*";
+    public static final String ASTERISK2 = "**";
+
+    /**括号*/
+    public static final String BRACKETS = "[]";
+    public static final String BRACKETS_LEFT = "[";
+    public static final String BRACKETS_RIGHT = "]";
+
+    /**排序*/
+    public static final String ASC = "asc";
+    public static final String DESC = "desc";
+
+    /**请求成功值*/
+    public static final int SUCCEED = 200;
+
+    /**短信请求返回参数名*/
+    public static final String SUCCESS = "success";
+
+    /**pageNum当前页数/pageSize每页显示条数*/
+    public static final String PAGE_NUM = "pageNum";
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**可调用EncryUtil.generatorPriKey()方法生成*/
+    public static final String PRI_KEY = "127f0400ff8a8b7a20d91dfc60a39725";
+
+    /**APP*/
+    public static final String APP = "APP";
+
+    /**API*/
+    public static final String API = "API";
+
+    /**API初始版本号*/
+    public static final String API_VERSION = "1.0.0";
+
+    /**请求头token*/
+    public static final String ACCESS_TOKEN = "Access-Token";
+
+    /**客户终端类型*/
+    public static final String CLIENT_TYPE = "Client-Type";
+
+    /**系统类型*/
+    public static final String SYSTEM_TYPE = "System-Type";
+
+    /**请求代理*/
+    public static final String USER_AGENT = "user-agent";
+
+    /**请求格式*/
+    public static final String CONTENT_TYPE_AJ = "application/json";
+
+    /**请求方法*/
+    public static final String METHOD_POST = "POST";
+    public static final String METHOD_GET = "GET";
+
+    /**错误图片*/
+    public static final String WRONG_USER_HEAD = "data:,";
+
+    /**运输订单号前缀*/
+    public static final String TRAN_NUM_PREFIX = "LTO";
+
+    /**委托单单号前缀*/
+    public static final String ENTR_NUM_PREFIX = "LD";
+
+    /**车辆运单单号前缀*/
+    public static final String TASK_NUM_PREFIX = "LTL";
+
+    /**装货地点*/
+    public static final Integer ADDRESS_LOAD = 1;
+
+    /**卸货地点*/
+    public static final Integer ADDRESS_UNLOAD = 2;
+
+    /**时间周期-天/周/月/年*/
+    public static final String CYCLE_DAY = "天";
+    public static final String CYCLE_WEEK = "周";
+    public static final String CYCLE_MONTH = "月";
+    public static final String CYCLE_YEAR = "年";
+
+    /**重量单位*/
+    public static final String UNIT_TON = "吨";
+    public static final String UNIT_KG = "千克";
+
+    /**未读*/
+    public static final Integer UN_READ = 0;
+    /**管理员角色名*/
+    public static final String MANAGE_NAME = "系统管理员";
+
+    /**管理员机构名*/
+    public static final String MANAGE_DEPT_NAME = "系统管理员部门";
+
+    /**已读*/
+    public static final Integer READ = 1;
+
+
+    /**完整的用户登录信息key*/
+    public static String getFullUserLoginKey(Integer systemType, Long userId, String clientType) {
+        return REDIS_USER_LOGIN_PREFIX + systemType + COLON + userId + COLON + clientType;
+    }
+
+    /**完整的用户登录信息key*/
+    public static String getFullUserLoginKey(Integer systemType, Long userId) {
+        return REDIS_USER_LOGIN_PREFIX + systemType + COLON + userId;
+    }
+
+    /**完整的用户登录tokenkey*/
+    public static String getFullUserTokenKey(String clientType, Long userId) {
+        return REDIS_USER_TOKEN_PREFIX + clientType + COLON + userId;
+    }
+
+    /**完整的用户企业信息key*/
+    public static String getFullUserEntKey(Long entId) {
+        return REDIS_ENTERPRISE_PREFIX + entId;
+    }
+
+    /**完整的用户菜单信息key*/
+    public static String getFullUserMenuKey(Integer systemType, Long userId) {
+        return REDIS_SYS_MENU_PREFIX + systemType + COLON + userId;
+    }
+
+    /**完整的忘记密码获取验证码key*/
+    public static String getForgetKey(Integer systemType, String account) {
+        return FORGET_SMS + systemType + COLON + account;
+    }
+
+    /**完整的校验重复请求key*/
+    public static String getRepeatSubmitKey(Long userId, String url) {
+        return REPEAT_SUBMIT + userId + COLON + url;
+    }
+}

+ 45 - 0
business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderCarStatusEnum.java

@@ -0,0 +1,45 @@
+package com.sckw.core.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Getter
+public enum OrderCarStatusEnum {
+    HAVE_BEEN_SAVED(1, "已保存"),
+    UNDER_REVIEW(3, "审核中"),
+    WAIT_TRANSPORT(5, "待运输"),
+    IN_TRANSIT(7, "运输中"),
+    FINISHED(9, "已完成"),
+    RECONCILED(11, "待对账"),
+    WAIT_SETTLED(13, "待结算"),
+    FINISH_SETTLED(15, "已结算"),
+    CANCELLED(17, "已取消"),
+    RETURNED(19, "已退回")
+            ;
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        OrderCarStatusEnum[] enums = OrderCarStatusEnum.values();
+        for (OrderCarStatusEnum instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<OrderCarStatusEnum> getSortList() {
+        OrderCarStatusEnum[] enums = OrderCarStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderCarStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 38 - 0
business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderSourceEnum.java

@@ -0,0 +1,38 @@
+package com.sckw.core.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Getter
+public enum OrderSourceEnum {
+    SELF_BUILD_NORMAL_LAND_ORDER(1, "物流自建-普货-陆运"),
+    SELF_BUILD_CAR_LAND_ORDER(2, "物流自建-轿运-陆运"),
+    PRODUCTION_TRANSPORTATION(3, "生产运输"),
+    LOGISTICS_CONSIGN(4, "物流托运");
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        OrderSourceEnum[] enums = OrderSourceEnum.values();
+        for (OrderSourceEnum instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<OrderSourceEnum> getSortList() {
+        OrderSourceEnum[] enums = OrderSourceEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderSourceEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 45 - 0
business-common/business-common-core/src/main/java/com/sckw/core/model/enums/OrderUsualStatusEnum.java

@@ -0,0 +1,45 @@
+package com.sckw.core.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Getter
+public enum OrderUsualStatusEnum {
+    HAVE_BEEN_SAVED(1, "已保存"),
+    UNDER_REVIEW(3, "审核中"),
+    WAIT_TRANSPORT(5, "待运输"),
+    IN_TRANSIT(7, "运输中"),
+    FINISHED(9, "已完成"),
+    RECONCILED(11, "待对账"),
+    WAIT_SETTLED(13, "待结算"),
+    FINISH_SETTLED(15, "已结算"),
+    CANCELLED(17, "已取消"),
+    RETURNED(19, "已退回")
+            ;
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        OrderUsualStatusEnum[] enums = OrderUsualStatusEnum.values();
+        for (OrderUsualStatusEnum instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<OrderUsualStatusEnum> getSortList() {
+        OrderUsualStatusEnum[] enums = OrderUsualStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderUsualStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 149 - 0
business-common/business-common-core/src/main/java/com/sckw/core/model/page/PageRes.java

@@ -0,0 +1,149 @@
+package com.sckw.core.model.page;
+
+import com.github.pagehelper.PageInfo;
+import com.sckw.core.utils.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 分页结果泛型类
+ *
+ * @author xucaiqin
+ * @date 2023-07-12 08:42:26
+ */
+public class PageRes<T> {
+
+    /**
+     * 当前页数
+     */
+    protected int page;
+    /**
+     * 每页显示条数
+     */
+    protected int pageSize;
+    /**
+     * 总条数
+     */
+    protected long size;
+    /**
+     * 总页数
+     */
+    protected int pages;
+    /**
+     * 数据
+     */
+    protected List<T> list;
+
+    public PageRes() {
+        this.list = new ArrayList<>();
+    }
+
+    public PageRes(int page, int pageSize, long size, int pages, List<T> list) {
+        this.page = page;
+        this.pageSize = pageSize;
+        this.size = size;
+        this.pages = pages;
+        this.list = list;
+    }
+
+    public PageRes(PageInfo<T> pageInfo) {
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.size = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = CollectionUtils.isEmpty(pageInfo.getList()) ? new ArrayList<>() : pageInfo.getList();
+    }
+
+    public PageRes(PageInfo<T> pageInfo, List<T> list) {
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.size = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = list;
+    }
+
+    public PageRes(List<T> list) {
+        PageInfo<T> pageInfo = new PageInfo<>(list);
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.size = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = pageInfo.getList();
+    }
+
+    /**
+     * 构建返回数据
+     *
+     * @param pagInfo pageHelper的分页对象
+     * @param list    实际返回的数据集
+     * @return
+     */
+    public static <T> PageRes<T> build(PageInfo<?> pagInfo, List<T> list) {
+        PageRes<T> tPageRes = new PageRes<>();
+        tPageRes.setPage(pagInfo.getPageNum());
+        tPageRes.setPageSize(pagInfo.getPageSize());
+        tPageRes.setSize(pagInfo.getTotal());
+        tPageRes.setPages(pagInfo.getPages());
+        tPageRes.setList(list);
+        return tPageRes;
+    }
+
+    /**
+     * 手动对list进行分页数据处理
+     *
+     * @param page     当前页
+     * @param pageSize 每页大小
+     * @param list     总数据
+     * @return
+     */
+    public static <T> PageRes<T> handPage(int page, int pageSize, List<T> list) {
+        PageRes<T> tPageRes = new PageRes<>();
+        tPageRes.setPage(page);
+        tPageRes.setPageSize(pageSize);
+        tPageRes.setSize(list.size());
+        tPageRes.setPages(list.size() / pageSize + 1);
+        tPageRes.setList(list.stream().skip((long) (page - 1) * pageSize).limit(pageSize).toList());
+        return tPageRes;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    public void setPages(int pages) {
+        this.pages = pages;
+    }
+
+    public void setList(List<T> list) {
+        this.list = list;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public long getSize() {
+        return size;
+    }
+
+    public int getPages() {
+        return pages;
+    }
+
+    public List<T> getList() {
+        return list;
+    }
+}

+ 262 - 0
business-common/business-common-core/src/main/java/com/sckw/core/utils/BeanUtils.java

@@ -0,0 +1,262 @@
+package com.sckw.core.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.sckw.core.model.constant.Global;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zk
+ * @version V1.0
+ * @Title: SupplyMapper
+ * @Package com.wph.modules.supply.mapper
+ * @Description: ()
+ * @date 2019/5/15 001510:37
+ */
+public class BeanUtils extends BeanUtil {
+
+    /**
+     * 下划线拼接
+     */
+    public static final char UNDERLINE = '_';
+
+    public static boolean checkFieldValueNull(Object bean) {
+        boolean result = true;
+        if (bean == null) {
+            return true;
+        }
+        Class<?> cls = bean.getClass();
+        Method[] methods = cls.getDeclaredMethods();
+        Field[] fields = cls.getDeclaredFields();
+        for (Field field : fields) {
+            try {
+                String fieldGetName = parGetName(field.getName());
+                if (!checkGetMet(methods, fieldGetName)) {
+                    continue;
+                }
+                Method fieldGetMet = cls.getMethod(fieldGetName, new Class[]{});
+                Object fieldVal = fieldGetMet.invoke(bean, new Object[]{});
+                if (fieldVal != null) {
+                    if ("".equals(fieldVal)) {
+                        result = true;
+                    } else {
+                        result = false;
+                    }
+                }
+            } catch (Exception e) {
+                continue;
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * 拼接某属性的 get方法
+     *
+     * @param fieldName
+     * @return String
+     */
+    public static String parGetName(String fieldName) {
+        if (null == fieldName || "".equals(fieldName)) {
+            return null;
+        }
+        int startIndex = 0;
+        if (fieldName.charAt(0) == UNDERLINE) {
+            startIndex = 1;
+        }
+        return "get"
+                + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
+                + fieldName.substring(startIndex + 1);
+    }
+
+    /**
+     * 判断是否存在某属性的 get方法
+     *
+     * @param methods
+     * @param fieldGetMet
+     * @return boolean
+     */
+    public static boolean checkGetMet(Method[] methods, String fieldGetMet) {
+        for (Method met : methods) {
+            if (fieldGetMet.equals(met.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     *
+     * @Title: isProperty
+     * @Description: 判断对象是否存在某属性
+     * @param bean 对象
+     * @param propertyName 属性
+     * @return
+     * @return: boolean 有则反之true 反之false
+     *
+    public static boolean isProperty(Object bean, String propertyName){
+    if (bean == null) {
+    return false;
+    }
+    Class<?> cls = bean.getClass();
+    PropertyDescriptor[] propertys = org.springframework.beans.BeanUtils.getPropertyDescriptors(cls);
+    for (PropertyDescriptor property : propertys){
+    String fieldName = property.getName();
+    if(fieldName != null && propertyName != null && fieldName.equals(propertyName)){
+    return true;
+    }
+    }
+    return false;
+    }*/
+
+
+    /**
+     * @param object
+     * @return boolean
+     * @description 判断当前对象是否为空
+     * @author jiangwei
+     * @date 2020/9/18 14:40
+     **/
+    public static boolean objCheckIsNull(Object object) {
+        return objCheckIsNull(object, null, null);
+    }
+
+    /**
+     * @param object           入参对象
+     * @param excludeNameList  要剔除的属性名称,没有就传空集合或者null
+     * @param excludeValueList 要剔除的数值,没有就传空集合或者null
+     * @return boolean
+     * @description 判断当前对象是否为空(包括所有属性为空)
+     * 可选则在判断规则中剔除某一字段,或者某一值
+     * @author jiangwei
+     * @date 2020/5/22 10:14
+     **/
+    public static boolean objCheckIsNull(Object object, List<String> excludeNameList, List<Object> excludeValueList) {
+
+        if (object == null) {
+            return true;
+        }
+        // 得到类对象
+        Class clazz = object.getClass();
+        // 得到所有属性
+        Field[] fields = clazz.getDeclaredFields();
+        //判断入参
+        boolean excludeNameListFlag = false;
+        if (excludeNameList != null && excludeNameList.size() > 0) {
+            excludeNameListFlag = true;
+        }
+        boolean excludeValueListFlag = false;
+        if (excludeValueList != null && excludeValueList.size() > 0) {
+            excludeValueListFlag = true;
+        }
+        //定义返回结果,默认为true
+        boolean flag = true;
+        for (Field field : fields) {
+            field.setAccessible(true);
+            Object fieldValue = null;
+            String fieldName = null;
+            try {
+                //得到属性值
+                fieldValue = field.get(object);
+                //得到属性类型
+                Type fieldType = field.getGenericType();
+                //得到属性名
+                fieldName = field.getName();
+                //剔除指定属性名的属性值
+                if (excludeNameListFlag) {
+                    for (String s : excludeNameList) {
+                        if (fieldName.equals(s)) {
+                            fieldValue = null;
+                        }
+                    }
+                }
+                //剔除指定属性值
+                if (excludeValueListFlag) {
+                    for (Object obj : excludeValueList) {
+                        if (fieldValue == obj) {
+                            fieldValue = null;
+                        }
+                    }
+                }
+            } catch (IllegalArgumentException | IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            //只要有一个属性值不为null 就返回false 表示对象不为null 忽略序列化
+            if (fieldValue != null && !"serialVersionUID".equals(fieldName)) {
+                flag = false;
+                break;
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * @param bean         对象
+     * @param propertyName 属性
+     * @return
+     * @Title: isProperty
+     * @Description: 判断对象是否存在某属性
+     * @return: boolean 有则反之true 反之false
+     */
+    public static boolean isProperty(Object bean, String propertyName) {
+        if (bean == null) {
+            return false;
+        }
+        Class<?> cls = bean.getClass();
+        PropertyDescriptor[] propertys = org.springframework.beans.BeanUtils.getPropertyDescriptors(cls);
+        for (PropertyDescriptor property : propertys) {
+            String fieldName = property.getName();
+            if (fieldName != null && propertyName != null && fieldName.equals(propertyName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param source 源对象
+     * @param target 目标对象
+     * @desc source 属性值赋值给target
+     * @author zk
+     * @date 2023/7/18
+     **/
+    public static void copyPropertiesValue(Object source, Object target) {
+        // 获取实体类的所有属性,返回Field数组
+        Field[] field = target.getClass().getDeclaredFields();
+        // 遍历所有属性
+        for (int j = 0; j < field.length; j++) {
+            // 获取属性的名字
+            String fieldName = field[j].getName();
+            // 通过属性名称获取对象属性值
+            Object value = BeanUtils.getProperty(source, fieldName);
+            if (value != null) {
+                // 为对象属性赋值
+                BeanUtils.setProperty(target, fieldName, value);
+            }
+        }
+    }
+
+    public static Map<String, Object> convertToMap(Object yourObject) {
+        Map<String, Object> map = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        try {
+            Field[] fields = yourObject.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                field.setAccessible(true);
+                String fieldName = field.getName();
+                Object fieldValue = field.get(yourObject);
+                map.put(fieldName, fieldValue);
+            }
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+        return map;
+    }
+
+}

+ 447 - 0
business-common/business-common-core/src/main/java/com/sckw/core/utils/CollectionUtils.java

@@ -0,0 +1,447 @@
+package com.sckw.core.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.sckw.core.model.constant.Global;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.*;
+
+/**
+ * @author zkGlobal
+ * @description 集合框架处理类
+ * @date 2020/06/06 09:03:53
+ */
+public class CollectionUtils extends CollectionUtil {
+    private static final int DEFAULT_INITIAL_CAPACITY = 16;
+
+    public CollectionUtils() {
+    }
+
+    /**
+     * @Description 创建HashMap
+     * @Author dengyinghui
+     * @Date 2019/5/12
+     * @return
+     */
+    public static synchronized Map<String, Object> createHashMap(){
+	  return new HashMap<>(DEFAULT_INITIAL_CAPACITY);
+    }
+
+    /**
+     * @Description 从Map中获取String值
+     * @param map map集合
+     * @param key key值
+     * @Author dengyinghui
+     * @Date 2019/5/14
+     * @return
+     */
+    public static String getString(Map<String, Object> map, String key){
+	  if(map == null){
+		return null;
+	  }
+	  return StringUtils.valueOf(map.get(key));
+    }
+
+    /**
+     * @Description 从Map中获取Integer值
+     * @param map map集合
+     * @param key key值
+     * @Author dengyinghui
+     * @Date 2019/5/14
+     * @return
+     */
+    public static Integer getInteger(Map<String, Object> map, String key){
+	  if(map == null){
+		return null;
+	  }
+	  return (Integer)map.get(key);
+    }
+
+    /**
+     * @Description 从Map中获取Date值
+     * @param map map集合
+     * @param key key值
+     * @Author dengyinghui
+     * @Date 2019/5/14
+     * @return
+     */
+    public static Date getDate(Map<String, Object> map, String key){
+	  if(map == null){
+		return null;
+	  }
+	  return (Date)map.get(key);
+    }
+
+    /**
+     * @Description JSONObject转MAP<String,String>
+     * @param object JSONObject对象
+     * @Author bernie
+     * @Date 2019/08/02
+     * @return HashMap<String, String> map结果
+     */
+    public static HashMap<String, String> toHashMap(JSONObject object)
+    {
+	  HashMap<String, String> data = new HashMap<>(16);
+	  Set<String> keys =  object.keySet();
+	  Iterator it = keys.iterator();
+	  // 遍历jsonObject数据,添加到Map对象
+	  while (it.hasNext())
+	  {
+		String key = String.valueOf(it.next());
+		String value = (String) object.get(key);
+		data.put(key, value);
+	  }
+	  return data;
+    }
+
+    public static boolean isEmpty(Collection<?> list) {
+	  return list == null || list.size() == 0;
+    }
+
+    public static Set<String> valueOfSet(String str) {
+	  return valueOfSet(str, ",");
+    }
+
+    public static Set<String> valueOfSet(String str, String split) {
+	  Set<String> set = new HashSet();
+	  str = StringUtils.trimNull(str);
+	  if (!StringUtils.isEmpty(str)) {
+		String[] strs = str.split(split);
+		if (!StringUtils.isEmpty(strs)) {
+		    String[] var7 = strs;
+		    int var6 = strs.length;
+
+		    for(int var5 = 0; var5 < var6; ++var5) {
+			  String string = var7[var5];
+			  string = StringUtils.trimNull(string);
+			  if (!StringUtils.isEmpty(string)) {
+				set.add(string);
+			  }
+		    }
+		}
+	  }
+
+	  return set;
+    }
+
+    public static List<String> valueOfList(String str) {
+	  return valueOfList(str, ",");
+    }
+
+    public static List<String> valueOfList(String str, String split) {
+	  List<String> list = new ArrayList();
+	  str = StringUtils.trimNull(str);
+	  if (!StringUtils.isEmpty(str)) {
+		String[] strs = str.split(split);
+		if (!StringUtils.isEmpty(strs)) {
+		    String[] var7 = strs;
+		    int var6 = strs.length;
+
+		    for(int var5 = 0; var5 < var6; ++var5) {
+			  String string = var7[var5];
+			  string = StringUtils.trimNull(string);
+			  if (!StringUtils.isEmpty(string)) {
+				list.add(string);
+			  }
+		    }
+		}
+	  }
+
+	  return list;
+    }
+
+    /**
+     * 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map
+     * <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
+     * @param list
+     * @param oneMapKey
+     * @return
+     */
+    public static Map<String, Object> change(List<Map<String, Object>> list, String oneMapKey) {
+	  Map<String, Object> resultMap = CollectionUtils.createHashMap();
+	  Set<Object> setTmp = new HashSet<Object>();
+	  for (Map<String, Object> tmp : list) {
+		setTmp.add(tmp.get(oneMapKey));
+	  }
+	  Iterator<Object> it = setTmp.iterator();
+	  while (it.hasNext()) {
+		String oneSetTmpStr = (String) it.next();
+		List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();
+		for (Map<String, Object> tmp : list) {
+		    String oneMapValueStr = (String) tmp.get(oneMapKey);
+		    if (oneMapValueStr.equals(oneSetTmpStr)) {
+			  oneSetTmpList.add(tmp);
+		    }
+		}
+		resultMap.put(oneSetTmpStr, oneSetTmpList);
+	  }
+	  return resultMap;
+    }
+
+    /**
+     * 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map
+     * <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
+     * @param list
+     * @param oneMapKey
+     * @return
+     */
+    public static List<Map<String, Object>> change2(List<Map<String, Object>> list, String oneMapKey,
+								    List<Map<String, Object>> outList) {
+	  // 1.将某个key的值存在set中
+	  Set<Object> setTmp = new HashSet<Object>();
+	  for (Map<String, Object> tmp : list) {
+		setTmp.add(tmp.get(oneMapKey));
+	  }
+	  // 2.遍历set
+	  Iterator<Object> it = setTmp.iterator();
+	  while (it.hasNext()) {
+		String oneMapValueStr = "";
+		String oneSetTmpStr = (String) it.next();
+		Map<String, Object> oneSetTmpMap = CollectionUtils.createHashMap();
+		List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();
+
+		for (Map<String, Object> tmp : list) {
+		    oneMapValueStr = (String) tmp.get(oneMapKey);
+		    if (oneSetTmpStr.equals(oneMapValueStr)) {
+			  oneSetTmpMap.put("key", oneSetTmpStr);
+			  oneSetTmpList.add(tmp);
+		    }
+		}
+		oneSetTmpMap.put("children", oneSetTmpList);
+		outList.add(oneSetTmpMap);
+	  }
+	  return outList;
+    }
+
+	/**
+	 * 开始分页
+	 * @param list
+	 * @param page 页码
+	 * @param pageSize 每页多少条数据
+	 * @return
+	 */
+	public static List startPage(List list, Integer page,
+								 Integer pageSize) {
+		if (list == null) {
+			return null;
+		}
+		if (list.size() == 0) {
+			return null;
+		}
+		// 记录总数
+		Integer count = list.size();
+		int fromIndex = Math.min((page - 1) * pageSize,count);
+		int toIndex = Math.min(fromIndex + pageSize,count);
+
+		List pageList = list.subList(fromIndex, toIndex);
+		return pageList;
+	}
+
+	/**
+	 * Map 按值排序
+	 * @param params
+	 * @return
+	 */
+	public static Set<Map.Entry<String, Integer>> valueSort(Map<String, Integer> params){
+		Set<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>(
+				new Comparator<Map.Entry<String, Integer>>() {
+					@Override
+					public int compare(Map.Entry<String, Integer> o1,
+									   Map.Entry<String, Integer> o2) {
+						Integer d1 = o1.getValue();
+						Integer d2 = o2.getValue();
+						int r = d2.compareTo(d1);
+
+						if (r != 0) {
+							return r;
+						} else {
+							return o2.getKey().compareTo(o1.getKey());
+						}
+					}
+				});
+		treeSet.addAll(params.entrySet());
+		return treeSet;
+	}
+
+	/**
+	 * 获取list中对象key值为value的对象
+	 * @param list 数据集
+	 * @param key key
+	 * @param value 匹配值
+	 * @return
+	 */
+	public List<Map<String, Object>> listByKeyValue(List<Map<String, Object>> list, String key, String value) {
+		if (CollectionUtils.isEmpty(list)) {
+			return null;
+		}
+		List<Map<String, Object>> outList = new ArrayList();
+		for (Map<String, Object> map:list) {
+			Object str = map.get(key);
+			if (StringUtils.isNotBlank(str) && StringUtils.objectStr(str).equals(value)) {
+				outList.add(map);
+			}
+		}
+
+		return outList;
+	}
+
+	/**
+	 * 校验list中对象key值是否存在与value不一致的情况
+	 * @param list 数据集
+	 * @param key key
+	 * @param value 匹配值
+	 * @return
+	 */
+	public static boolean listByKeyValueV1(List<Map<String, Object>> list, String key, String value) {
+		if (CollectionUtils.isEmpty(list)) {
+			return false;
+		}
+		for (Map<String, Object> map:list) {
+			Object str = map.get(key);
+			if (StringUtils.isNotBlank(str) && !StringUtils.objectStr(str).equals(value)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+
+    public static void main(String[] args) {
+	  Map<String, Object> map1 = CollectionUtils.createHashMap();
+	  Map<String, Object> map2 = CollectionUtils.createHashMap();
+	  Map<String, Object> map3 = CollectionUtils.createHashMap();
+	  Map<String, Object> map4 = CollectionUtils.createHashMap();
+	  Map<String, Object> map5 = CollectionUtils.createHashMap();
+
+	  List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
+	  map1.put("id", "111");
+	  map1.put("name", "tom");
+	  map1.put("sex", "male");
+
+	  map2.put("id", "222");
+	  map2.put("name", "jack");
+	  map2.put("sex", "male");
+
+	  map3.put("id", "333");
+	  map3.put("name", "lucy");
+	  map3.put("sex", "female");
+
+	  map4.put("id", "444");
+	  map4.put("name", "lucy");
+	  map4.put("sex", "female");
+
+	  inList.add(map1);
+	  inList.add(map2);
+	  inList.add(map3);
+	  inList.add(map4);
+	  System.out.println("原始inList:" + inList);
+
+
+	  map5.put("一类(爆炸品)", map4);
+	  map5.put("二类(压缩,液化气体)", null);
+	  map5.put("三类(易燃液体)", null);
+	  map5.put("四类(易燃固体,自燃物品和遇湿易燃)", map3);
+	  map5.put("五类(氧化剂,有机过氧化物)", null);
+	  map5.put("六类(毒害品,感染类物品)", null);
+	  map5.put("七类(放射性物质)", null);
+	  map5.put("八类(腐蚀品)", null);
+	  map5.put("九类(危险废弃物)", map2);
+	  map5.put("普货", null);
+	  map5.put("其他", map2);
+
+	  Map<String, Object> resultMap = CollectionUtils.createHashMap();
+	  // resultMap = change(list, "sex");
+	  resultMap = change(inList, "name");
+	  System.out.println("按照map中的某个值重新封装后的resultMap:" + JSONObject.toJSONString(resultMap));
+
+	  List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
+	  System.out.println("retList==1==:" + outList);
+	  outList = change2(inList, "name", outList);
+	  System.out.println("retList==2==:" + JSONObject.toJSONString(outList));
+
+	  List list = toList("165159551228710912,165181777487335424,165181777487335425,165181777487335426", false);
+	  System.out.println(list);
+
+    }
+
+    /**
+     * @desc: object转list
+     * @author: yzc
+     * @date: 2023-06-26 15:27
+     * @Param obj:
+     * @Param clazz:
+     * @return: java.util.List<T>
+     */
+    public static <T> List<T> objectCastList(Object obj, Class<T> clazz) {
+        List<T> result = new ArrayList<>();
+        if (obj instanceof List<?>) {
+			for (Object o : (List<?>) obj) {
+				result.add(clazz.cast(o));
+			}
+		}
+		return result;
+    }
+
+	/**
+	 * 对象转Map
+	 * @param object
+	 * @return
+	 * @throws IllegalAccessException
+	 */
+	public static Map beanToMap(Object object) throws Exception {
+		Map<String, Object> map = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+		Field[] fields = object.getClass().getDeclaredFields();
+		for (Field field : fields) {
+			field.setAccessible(true);
+			map.put(field.getName(), field.get(object));
+		}
+		return map;
+	}
+
+	/**
+	 * map转对象
+	 * @param map
+	 * @param beanClass
+	 * @param <T>
+	 * @return
+	 * @throws Exception
+	 */
+	public static <T> T mapToBean(Map map, Class<T> beanClass) throws Exception {
+		T object = beanClass.getDeclaredConstructor().newInstance();
+		Field[] fields = object.getClass().getDeclaredFields();
+		for (Field field : fields) {
+			int mod = field.getModifiers();
+			if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
+				continue;
+			}
+			field.setAccessible(true);
+			if (map.containsKey(field.getName())) {
+				field.set(object, map.get(field.getName()));
+			}
+		}
+		return object;
+	}
+
+	/**
+	 * @param str 数组转换值
+	 * @param bool true 原顺序、false 倒序
+	 * @desc 字符串转换集合
+	 * @author zk
+	 * @date 2023/8/7
+	 **/
+	public static List toList(String str, boolean bool) {
+		if (StringUtils.isNotBlank(str)) {
+			List idArray = Arrays.asList(str.split(Global.COMMA));
+			if (!bool) {
+				Collections.reverse(idArray);
+			}
+			return idArray;
+		} else {
+			return new ArrayList();
+		}
+	}
+
+}

+ 114 - 0
business-common/business-common-core/src/main/java/com/sckw/core/utils/IdWorker.java

@@ -0,0 +1,114 @@
+package com.sckw.core.utils;
+
+/**
+ * 雪花算法生成ID
+ */
+public class IdWorker {
+    /** 开始时间截 (建议用服务第一次上线的时间,到毫秒级的时间戳) */
+    private final long twepoch = 1651070159429L;
+
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 10L;
+
+    /** 支持的最大机器id,结果是1023 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 时间截向左移22位(10+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
+     * <<为左移,每左移动1位,则扩大1倍
+     * */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~1024) */
+    private long workerId;
+
+    /** 毫秒内序列(0~4095) */
+    private static long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private static long lastTimestamp = -1L;
+
+    //==============================Constructors=====================================
+    /**
+     * 构造函数
+     * @param workerId 工作ID (0~1023)
+     */
+    public IdWorker(long workerId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0", maxWorkerId));
+        }
+        this.workerId = workerId;
+    }
+
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            //如果毫秒相同,则从0递增生成序列号
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+        //移位并通过或运算拼到一起组成64位的ID
+        long result = ((timestamp - twepoch) << timestampLeftShift)
+                | (workerId << workerIdShift)
+                | sequence;
+        return result;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间,从1970-01-01 08:00:00算起
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+    public static void main(String[] args) {
+        for (int i  = 0; i < 100; i++) {
+            System.out.println(new IdWorker(1).nextId());
+        }
+    }
+}

+ 831 - 0
business-common/business-common-core/src/main/java/com/sckw/core/utils/StringUtils.java

@@ -0,0 +1,831 @@
+package com.sckw.core.utils;
+
+import com.sckw.core.model.constant.Global;
+
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @Description 自测公共处理类
+ * @Author zk
+ * @Date 2019/5/13 0013
+ */
+public class StringUtils {
+
+    /**
+     * 空字符串
+     */
+    private static final String NULLSTR = "";
+    /**
+     * 下划线
+     */
+    private static final char SEPARATOR_CHAR = '_';
+    /**
+     * 下划线
+     */
+    private static final String SEPARATOR_STRING = "_";
+    /**
+     * 加密字符
+     */
+    public static final String HASH_ALGORITHM = "SHA-1";
+    /**
+     * ${xxx}
+     **/
+    public static final Pattern pattern = Pattern.compile("(\\$\\{)([\\w]+)(\\})");
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param str 源字符串
+     * @return
+     * @author dengyinghui
+     * @date 2018/11/12
+     */
+    public static boolean validatorEmpty(String str) {
+        if (str != null && !"".equals(str)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 判空操作(空)
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isBlank(Object str) {
+        String value = objectStr(str);
+        return value == null || "".equals(value) || "null".equals(value);
+    }
+
+    /**
+     * 判空操作(空)
+     *
+     * @param value
+     * @return
+     */
+    public static boolean isBlank(String value) {
+        return value == null || "".equals(value) || "null".equals(value);
+    }
+
+    /**
+     * 判空操作(非空)
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isNotBlank(Object str) {
+        String value = objectStr(str);
+        return value != null && !"".equals(value) && !"null".equals(value);
+    }
+
+    /**
+     * 判空操作(非空)
+     *
+     * @param value
+     * @return
+     */
+    public static boolean isNotBlank(String value) {
+        return value != null && !"".equals(value) && !"null".equals(value);
+    }
+
+    /**
+     * 获取uuid
+     *
+     * @return
+     */
+    public static String uuid() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+    /**
+     * 获取参数不为空值
+     *
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue) {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll) {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll) {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     *
+     * @param objects 要判断的对象数组
+     *                * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects) {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     *
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects) {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map) {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map) {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     *
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str) {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     *
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str) {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     *
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object) {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     *
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object) {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     *
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object) {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str) {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str   字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start) {
+        if (str == null) {
+            return NULLSTR;
+        }
+
+        if (start < 0) {
+            start = str.length() + start;
+        }
+
+        if (start < 0) {
+            start = 0;
+        }
+        if (start > str.length()) {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str   字符串
+     * @param start 开始
+     * @param end   结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end) {
+        if (str == null) {
+            return NULLSTR;
+        }
+
+        if (end < 0) {
+            end = str.length() + end;
+        }
+        if (start < 0) {
+            start = str.length() + start;
+        }
+
+        if (end > str.length()) {
+            end = str.length();
+        }
+
+        if (start > end) {
+            return NULLSTR;
+        }
+
+        if (start < 0) {
+            start = 0;
+        }
+        if (end < 0) {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     *
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+
+    public static String format(String template, Object... params)
+    {
+    if (isEmpty(params) || isEmpty(template))
+    {
+    return template;
+    }
+    return StrFormatter.format(template, params);
+    }*/
+
+    /**
+     * 下划线转驼峰命名
+     */
+    public static String toUnderScoreCase(String s) {
+        if (s == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+
+            boolean nextUpperCase = true;
+
+            if (i < (s.length() - 1)) {
+                nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
+            }
+
+            if ((i > 0) && Character.isUpperCase(c)) {
+                if (!upperCase || !nextUpperCase) {
+                    sb.append(SEPARATOR_CHAR);
+                }
+                upperCase = true;
+            } else {
+                upperCase = false;
+            }
+
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     *
+     * @param str  验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs) {
+        if (str != null && strs != null) {
+            for (String s : strs) {
+                if (str.equalsIgnoreCase(trim(s))) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 截取字符串从index到最后
+     *
+     * @param str
+     * @param index
+     * @return
+     */
+    public static String subStrFromIndexToEnd(String str, Integer index) {
+        if (StringUtils.isBlank(str) || str.length() <= index) {
+            return str;
+        }
+        return str.substring(str.length() - index);
+    }
+
+    /**
+     * 字符串转数组
+     *
+     * @param params 字符串
+     * @param regex  截取字符
+     * @return
+     */
+    public static String[] splitStr(String params, String regex) {
+        regex = StringUtils.isNotBlank(regex) ? regex : ",";
+        return StringUtils.isNotBlank(params) ? params.split(regex) : new String[]{};
+    }
+
+    /**
+     * 字符串分割转list
+     *
+     * @param str 字符串
+     * @param cls 转换类型class
+     * @return
+     */
+    public static <T> List<T> splitStrToList(String str, Class<T> cls) {
+        return splitStrToList(str, ",", cls);
+    }
+
+    /**
+     * 字符串分割转list
+     *
+     * @param str   字符串
+     * @param regex 截取字符
+     * @param cls   转换类型class
+     * @return
+     */
+    public static <T> List<T> splitStrToList(String str, String regex, Class<T> cls) {
+        regex = StringUtils.isNotBlank(regex) ? regex : ",";
+        if (StringUtils.isBlank(str)) {
+            return Collections.emptyList();
+        }
+        List<T> result;
+        if (cls == String.class) {
+            result = Arrays.stream(str.split(regex))
+                    .map(strValue -> (T) strValue)
+                    .collect(Collectors.toList());
+        } else {
+            result = Arrays.stream(str.split(regex))
+                    .map(strValue -> {
+                        try {
+                            return cls.getConstructor(String.class).newInstance(strValue);
+                        } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+                                 NoSuchMethodException e) {
+                            throw new RuntimeException("字符串转集合异常!");
+                        }
+                    }).collect(Collectors.toList());
+        }
+        return result;
+    }
+
+    /**
+     * Object对象转字符串
+     *
+     * @param obj
+     * @return
+     */
+    public static String objectStr(Object obj) {
+        if (obj != null) {
+            return obj.toString();
+        }
+        return null;
+    }
+
+    public static String trimNull(Object str) {
+        if (str == null) {
+            return "";
+        } else {
+            return str instanceof String ? ((String) str).trim() : str.toString();
+        }
+    }
+
+    /**
+     * 解析出url请求的路径,包括页面
+     *
+     * @param strURL url地址
+     * @return url路径
+     */
+    public static String urlPage(String strURL) {
+        String strPage = null;
+        String[] arrSplit = null;
+        strURL = strURL.trim().toLowerCase();
+        arrSplit = strURL.split("[?]");
+        if (strURL.length() > 0) {
+            if (arrSplit.length > 1) {
+                if (arrSplit[0] != null) {
+                    strPage = arrSplit[0];
+                }
+            }
+        }
+        return strPage;
+    }
+
+    /**
+     * 去掉url中的路径,留下请求参数部分
+     *
+     * @param strURL url地址
+     * @return url请求参数部分
+     */
+    private static String truncateUrlPage(String strURL) {
+        String strAllParam = null;
+        String[] arrSplit = null;
+        strURL = strURL.trim().toLowerCase();
+        arrSplit = strURL.split("[?]");
+        if (strURL.length() > 1) {
+            if (arrSplit.length > 1) {
+                if (arrSplit[1] != null) {
+                    strAllParam = arrSplit[1];
+                }
+            }
+        }
+        return strAllParam;
+    }
+
+    /**
+     * 解析出url参数中的键值对
+     * 如 "index.jsp?Action=del&id=123",解析出Action:del,id:123存入map中
+     *
+     * @param url url地址
+     * @return url请求参数部分
+     */
+    public static Map<String, String> urlRequest(String url) {
+        Map<String, String> mapRequest = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        String[] arrSplit = null;
+        String strUrlParam = truncateUrlPage(url);
+        if (strUrlParam == null) {
+            return mapRequest;
+        }
+        //每个键值为一组 www.2cto.com
+        arrSplit = strUrlParam.split("[&]");
+        for (String strSplit : arrSplit) {
+            String[] arrSplitEqual = null;
+            arrSplitEqual = strSplit.split("[=]");
+            //解析出键值
+            if (arrSplitEqual.length > 1) {
+                //正确解析
+                mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]);
+            } else {
+                if (arrSplitEqual[0] != "") {
+                    //只有参数没有值,不加入
+                    mapRequest.put(arrSplitEqual[0], "");
+                }
+            }
+        }
+        return mapRequest;
+    }
+
+    /**
+     * 解析出url参数中的键值对
+     * 如 "Action=del&id=123",解析出Action:del,id:123存入map中
+     *
+     * @param strUrlParam url地址
+     * @return url请求参数部分
+     */
+    public static Map<String, String> urlParams(String strUrlParam) {
+        Map<String, String> mapRequest = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        String[] arrSplit = null;
+        if (strUrlParam == null) {
+            return mapRequest;
+        }
+        //每个键值为一组 www.2cto.com
+        arrSplit = strUrlParam.split("[&]");
+        for (String strSplit : arrSplit) {
+            String[] arrSplitEqual = null;
+            arrSplitEqual = strSplit.split("[=]");
+            //解析出键值
+            if (arrSplitEqual.length > 1) {
+                //正确解析
+                mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]);
+            } else {
+                if (arrSplitEqual[0] != "") {
+                    //只有参数没有值,不加入
+                    mapRequest.put(arrSplitEqual[0], "");
+                }
+            }
+        }
+        return mapRequest;
+    }
+
+    /**
+     * 替换掉HTML标签方法
+     */
+    public static String replaceHtml(String html) {
+        if (isBlank(html)) {
+            return "";
+        }
+        String regEx = "<.+?>";
+        Pattern p = Pattern.compile(regEx);
+        Matcher m = p.matcher(html);
+        String s = m.replaceAll("");
+        return s;
+    }
+
+    /**
+     * 替换为手机识别的HTML,去掉样式及属性,保留回车。
+     *
+     * @param html
+     * @return
+     */
+    public static String replaceMobileHtml(String html) {
+        if (html == null) {
+            return "";
+        }
+        return html.replaceAll("<([a-z]+?)\\s+?.*?>", "<$1>");
+    }
+
+    /**
+     * 转换为Double类型
+     */
+    public static Double toDouble(Object val) {
+        if (val == null) {
+            return 0D;
+        }
+        try {
+            return Double.valueOf(trim(val.toString()));
+        } catch (Exception e) {
+            return 0D;
+        }
+    }
+
+    /**
+     * 转换为Float类型
+     */
+    public static Float toFloat(Object val) {
+        return toDouble(val).floatValue();
+    }
+
+    /**
+     * 转换为Long类型
+     */
+    public static Long toLong(Object val) {
+        return toDouble(val).longValue();
+    }
+
+    /**
+     * 转换为Integer类型
+     */
+    public static Integer toInteger(Object val) {
+        return toLong(val).intValue();
+    }
+
+    /**
+     * Object转String
+     *
+     * @param val 源字符串
+     * @return
+     * @author dengyinghui
+     * @date 2018/2/27
+     */
+    public static String valueOf(Object val) {
+        if (val == null) {
+            return "";
+        } else {
+            return String.valueOf(val);
+        }
+    }
+
+    private static String toHex(byte[] bytes) {
+        final char[] hexDigits = "0123456789ABCDEF".toCharArray();
+        StringBuilder ret = new StringBuilder(bytes.length * 2);
+        for (int i = 0; i < bytes.length; i++) {
+            ret.append(hexDigits[(bytes[i] >> 4) & 0x0f]);
+            ret.append(hexDigits[bytes[i] & 0x0f]);
+        }
+        return ret.toString();
+    }
+
+    /**
+     * 替换字符串${xxxx}
+     *
+     * @param content     账号创建成功,欢迎使用危品汇!登录账号:${account},默认密码:${pwd}!
+     * @param regex       需要替换的字符(account)
+     * @param replacement 替换值(173xxxxxxxx)
+     * @return
+     */
+    public static String replace(String content, String regex, String replacement) {
+        if (content == null || regex == null || replacement == null) {
+            return null;
+        }
+        Matcher matcher = pattern.matcher(content);
+        StringBuffer strBuf = new StringBuffer();
+        while (matcher.find()) {
+            String group = matcher.group().replace("${", "").replace("}", "");
+            if (group.equals(regex)) {
+                matcher.appendReplacement(strBuf, replacement);
+                return matcher.appendTail(strBuf).toString();
+            }
+        }
+        return matcher.appendTail(strBuf).toString();
+    }
+
+    /**
+     * 替换字符串${xxxx}
+     *
+     * @param content 账号创建成功,欢迎使用危品汇!登录账号:${account},默认密码:${pwd}!
+     * @param params  {"account":"xxxxx", "pwd":"xxxx"}
+     * @return
+     */
+    public static String replace1(String content, Map<String, Object> params) {
+        if (content == null || params == null) {
+            return null;
+        }
+
+        Matcher matcher = pattern.matcher(content);
+        StringBuffer strBuf = new StringBuffer();
+        while (matcher.find()) {
+            String group = matcher.group().replace("${", "").replace("}", "");
+            if (params.get(group) != null) {
+                String replacement = StringUtils.objectStr(params.get(group));
+                matcher.appendReplacement(strBuf, replacement);
+            }
+        }
+        matcher.appendTail(strBuf);
+        return strBuf.toString();
+    }
+
+    public static String capitalize(final String str) {
+        int strLen;
+        if (str == null || (strLen = str.length()) == 0) {
+            return str;
+        }
+
+        final int firstCodepoint = str.codePointAt(0);
+        final int newCodePoint = Character.toTitleCase(firstCodepoint);
+        if (firstCodepoint == newCodePoint) {
+            // already capitalized
+            return str;
+        }
+        // cannot be longer than the char array
+        final int [] newCodePoints = new int[strLen];
+        int outOffset = 0;
+        // copy the first codepoint
+        newCodePoints[outOffset++] = newCodePoint;
+        for (int inOffset = Character.charCount(firstCodepoint); inOffset < strLen; ) {
+            final int codepoint = str.codePointAt(inOffset);
+            // copy the remaining ones
+            newCodePoints[outOffset++] = codepoint;
+            inOffset += Character.charCount(codepoint);
+        }
+        return new String(newCodePoints, 0, outOffset);
+    }
+
+
+    /**
+     * 字符串格式化长度不足补0
+     */
+    public static String addZeroForNum(String str, int strLength) {
+        int strLen = str.length();
+        if (strLen < strLength) {
+            StringBuffer sb = new StringBuffer(str);
+            while (strLen < strLength) {
+                // 左补0
+                sb.insert(0, "0");
+                strLen = sb.length();
+            }
+            str = sb.toString();
+        }
+        return str;
+    }
+
+    /**
+     * 值替换
+     *
+     * @param prefix
+     * @param args
+     * @return
+     */
+    public static String format(String prefix, Object... args) {
+        return String.format(prefix, args);
+    }
+
+    /**
+     * @desc: 替换文本变量,变量格式为:${}
+     * @author: yzc
+     * @date: 2023-09-01 9:03
+     * @Param text: 文本
+     * @Param varNames:  变量名map
+     * @return: java.util.List<java.lang.String>  替换后的文本
+     */
+    public static String replaceTextVar(String text, Map<String, Object> varNames) {
+        if (StringUtils.isBlank(text) || CollectionUtils.isEmpty(varNames)) {
+            return text;
+        }
+        String str = "\\$\\{([^}]+)\\}";
+        Pattern pattern = Pattern.compile(str);
+        Matcher matcher = pattern.matcher(text);
+        StringBuilder result = new StringBuilder();
+        while (matcher.find()) {
+            String varName = matcher.group(1);
+            Object varValue = varNames.get(varName);
+            if (Objects.nonNull(varValue)) {
+                matcher.appendReplacement(result, varValue.toString());
+            }
+        }
+        matcher.appendTail(result);
+        return result.toString();
+    }
+
+    /**
+     * @desc: 设置两位小数
+     * @author: yzc
+     * @date: 2023-09-26 10:11
+     * @Param d:
+     * @return: java.lang.BigDecimal
+     */
+    private BigDecimal setScale(Double d) {
+        if (Objects.isNull(d) || BigDecimal.ZERO.compareTo(BigDecimal.valueOf(d)) == 0) {
+            return new BigDecimal("0.00");
+        }
+        return BigDecimal.valueOf(d).setScale(2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * @desc: 设置两位小数
+     * @author: yzc
+     * @date: 2023-09-26 10:11
+     * @Param d:
+     * @return: java.lang.BigDecimal
+     */
+    private BigDecimal setScale(BigDecimal d) {
+        if (Objects.isNull(d) || BigDecimal.ZERO.compareTo(d) == 0) {
+            return new BigDecimal("0.00");
+        }
+        return d.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public static void main(String[] args) {
+        Map<String, Object> param = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        param.put("account", "17358629955");
+        param.put("pwd", "123456");
+        String template = "账号创建成功,欢迎使用危品汇!登录账号:${account},默认密码:${pwd}!";
+        for (String key : param.keySet()) {
+            template = StringUtils.replace(template, key, StringUtils.objectStr(param.get(key)));
+        }
+        System.out.println(template);
+
+        Map<String, Object> m = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        m.put("account", "han");
+        m.put("pwd", "zhong");
+        System.out.println(replace1(template, m));
+    }
+}

+ 88 - 0
business-common/business-common-core/src/main/java/com/sckw/core/web/response/HttpResult.java

@@ -0,0 +1,88 @@
+package com.sckw.core.web.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @desc:
+ * @author: lt
+ * @date: 2024/3/23 13:47
+ */
+@Data
+public class HttpResult implements Serializable {
+
+    private int code =200;
+    private String msg = "success";
+    private Object data;
+
+    public static HttpResult error() {
+        return error(500, "error");
+    }
+
+    public static HttpResult error(String msg) {
+        return error(500, msg);
+    }
+
+    public static HttpResult error(int code, String msg) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult error(String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(500);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult error(int code, String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+
+    public static HttpResult ok() {
+        return new HttpResult();
+    }
+
+    public static HttpResult ok(String msg) {
+        HttpResult r = new HttpResult();
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult ok(Object data) {
+        HttpResult r = new HttpResult();
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult ok(int code, String msg) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult ok(String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult ok(int code,String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+}

+ 45 - 0
business-common/business-common-datasource/pom.xml

@@ -0,0 +1,45 @@
+<?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">
+    <parent>
+        <artifactId>business-common</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-common-datasource</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <version>8.0.32</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-annotation</artifactId>
+            <version>3.5.5</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.6.1</version>
+        </dependency>
+    </dependencies>
+</project>

+ 43 - 0
business-common/business-common-redis/pom.xml

@@ -0,0 +1,43 @@
+<?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">
+    <parent>
+        <artifactId>business-common</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-common-redis</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.40</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.21.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-json</artifactId>
+            <version>3.0.7</version>
+        </dependency>
+    </dependencies>
+</project>

+ 92 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/config/RedisLockUtil.java

@@ -0,0 +1,92 @@
+package com.sckw.redis.config;
+
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-04-07 17:20:34
+ */
+@Component
+@Slf4j
+public class RedisLockUtil {
+    @Resource
+    private RedissonClient redissonClient;
+
+    /**
+     * 获取锁
+     *
+     * @param lockKey 锁的key
+     */
+    public RLock getLock(String lockKey) {
+        return redissonClient.getLock(lockKey);
+    }
+
+    /**
+     * 加锁
+     * 默认加锁时间30秒
+     *
+     * @param lockKey 锁的key
+     * @return
+     */
+    public boolean tryLock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        return lock.tryLock();
+    }
+
+    /**
+     * 加锁
+     * 默认加锁时间30秒
+     *
+     * @param lockKey  持有的锁key
+     * @param waitTime 加锁等待时间
+     * @return
+     */
+    public boolean tryLock(String lockKey, int waitTime) {
+        return tryLock(lockKey, waitTime, -1);
+    }
+
+    /**
+     * 加锁
+     *
+     * @param lockKey   锁的key
+     * @param waitTime  加锁等待时间
+     * @param leaseTime 锁自动释放时间
+     */
+    public boolean tryLock(String lockKey, int waitTime, int leaseTime) {
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            log.info("tryLock lockKey:{} waitTime:{} leaseTime:{}", lockKey, waitTime, leaseTime);
+            return false;
+        }
+    }
+
+
+    /**
+     * 解锁
+     *
+     * @param lockKey 锁的key
+     */
+    public void unlock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * 解锁
+     *
+     * @param lock 锁对象
+     */
+    public void unlock(RLock lock) {
+        lock.unlock();
+    }
+}

+ 64 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/config/RedissonConfig.java

@@ -0,0 +1,64 @@
+package com.sckw.redis.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.sckw.redis.utils.RedissonUtils;
+import org.redisson.api.RedissonClient;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * @Author xucaiqin
+ * @date 2023-06-01 14:50:29
+ */
+@AutoConfiguration
+public class RedissonConfig {
+
+    /**
+     * jackson序列化方式的redisTemplate
+     *
+     * @param redisConnectionFactory
+     * @return
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+        // 设置值(value)的序列化采用jackson
+        redisTemplate.setValueSerializer(serializer());
+        redisTemplate.setHashValueSerializer(serializer());
+
+        // 设置键(key)的序列化采用StringRedisSerializer。
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+
+    @Bean
+    public RedissonUtils redissonUtils(RedissonClient redissonClient) {
+        return new RedissonUtils(redissonClient);
+    }
+
+    private Jackson2JsonRedisSerializer<Object> serializer() {
+        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 解决jackson2无法序列化LocalDateTime问题
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(new JavaTimeModule());
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        return new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
+    }
+}

+ 50 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/config/serializer/FastJson2JsonRedisSerializer.java

@@ -0,0 +1,50 @@
+package com.sckw.redis.config.serializer;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONReader;
+import com.alibaba.fastjson2.JSONWriter;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * fastJson序列化
+ * @author xcq
+ * @date 2022年06月14日 15:21
+ */
+public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
+    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
+
+
+    private final Class<T> clazz;
+
+    public FastJson2JsonRedisSerializer(Class<T> clazz) {
+        super();
+        this.clazz = clazz;
+    }
+
+    /**
+     * 序列化
+     */
+    @Override
+    public byte[] serialize(T t) throws SerializationException {
+        if (null == t) {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    /**
+     * 反序列化
+     */
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException {
+        if (null == bytes || bytes.length == 0) {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+        return (T) JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
+    }
+}

+ 52 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/configure/RedissonConfiguration.java

@@ -0,0 +1,52 @@
+package com.sckw.redis.configure;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.codec.JsonJacksonCodec;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author xxx
+ * @DATE 2022/3/27 11:13
+ */
+@Configuration
+public class RedissonConfiguration {
+
+    @Value("${spring.data.redis.host}")
+    private String address;
+
+    @Value("${spring.data.redis.port}")
+    private String port;
+
+    @Value("${spring.data.redis.password}")
+    private String password;
+
+    @Value("${spring.data.redis.database}")
+    private String database;
+
+    @Value("${spring.data.redis.timeout}")
+    private String timeout;
+
+    @Bean
+    public RedissonClient redisson() {
+        Config config = new Config();
+        config.setCodec(new JsonJacksonCodec());
+        config.useSingleServer()
+                .setAddress(address())
+                .setPassword(password)
+                .setDatabase(Integer.parseInt(database))
+                .setConnectTimeout(Integer.parseInt(timeout));
+        return Redisson.create(config);
+    }
+
+    /**
+     * 生成address
+     * @return
+     */
+    private String address() {
+        return "redis://" + address + ":" + port;
+    }
+}

+ 126 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -0,0 +1,126 @@
+package com.sckw.redis.constant;
+
+/**
+ * @desc: redis常量
+ * @author: yzc
+ * @date: 2023-06-09 11:27
+ */
+public class RedisConstant {
+
+    /**
+     * 短信验证码值key
+     */
+    public static final String MESSAGE_SMS_VERIFY_CODE_VALUE_KEY = "message:sms:verifyCode:value:%s:%s";
+    /**
+     * 短信验证码请求key
+     */
+    public static final String MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY = "message:sms:verifyCode:request:%s:%s";
+
+    /**
+     * 短信验证码请求时间
+     */
+    public static final Long SMS_VERIFY_CODE_REQUEST_TIME = 60L;
+    /**
+     * 短信验证码锁key
+     */
+    public static final String MESSAGE_SMS_VERIFY_CODE_LOCK_KEY = "message:sms:verifyCode:lock:%s:%s";
+    /**
+     * 短信验证码有效时间(秒)5分钟
+     */
+    public static final Long SMS_VERIFY_CODE_VALID_TIME = 300L;
+
+    /**
+     * message消费请求key
+     */
+    public static final String MESSAGE_CONSUMER_REQUEST_KEY = "message:msg:consumer:request:%s";
+
+    /**
+     * 商品更新库存锁key
+     */
+    public static final String GOODS_UPDATE_AMOUNT_KEY = "product:goods:update:amount:%s";
+    /**
+     * 更新贸易订单委托量、已履约量锁key
+     */
+    public static final String TORDER_UPDATE_AMOUNT_KEY = "order:trade:update:amount:%s";
+    /**
+     * 更新贸易订单地址下的委托量锁key
+     */
+    public static final String TORDER_ADDRESS_UPDATE_ENTRUST_AMOUNT = "order:trade:address:update:entrustAmount:%s";
+    /**
+     * 更新贸易订单地址下的实际交付量锁key
+     */
+    public static final String TORDER_ADDRESS_UPDATE_ACTUAL_AMOUNT = "order:trade:address:update:actualAmount:%s";
+    /**
+     * 合同签约完成更新贸易订单状态锁key
+     */
+    public static final String TORDER_CONTRACT_UPDATE_KEY = "order:trade:contract:update:%s";
+
+    /**
+     * 合同签约完成更新物流订单状态锁key
+     */
+    public static final String LOGISTICS_ORDER_CONTRACT_UPDATE_KEY = "order:trade:logistics:update:%s";
+    /**
+     * 生成贸易订单号锁key
+     */
+    public static final String TORDER_NO_GENERATE_KEY = "order:trade:no:generate:%s";
+
+    /**
+     * 生成物流订单号锁key
+     */
+    public static final String LOGISTICS_NO_GENERATE_KEY = "order:logistics:no:generate:%s";
+
+    /**
+     * 物流订单接单操作
+     */
+    public static final String LOGISTICS_ORDER_TAKING_KEY = "order:logistics:order:taking:%s";
+
+    /**
+     * 物流运单号生成key
+     */
+    public static final String WAYBILL_NO_GENERATE_KEY = "order:waybill:no:generate:%s";
+
+    /**
+     * 贸易订单生成物流托运锁key
+     */
+    public static final String TRADE_TO_LOGISTICS_NO_GENERATE_KEY = "order:trade:logistics:no:generate:%s";
+
+
+    /**
+     * 完结物流订单key
+     */
+    public static final String LOGISTICS_ORDER_FINISH_KEY = "order:logistics:no:finish:%s";
+
+    /**
+     * 取消物流订单key
+     */
+    public static final String LOGISTICS_ORDER_CANCEL_KEY = "order:logistics:no:cancel:%s";
+
+    /**
+     * 物流订单分包锁key
+     */
+    public static final String LOGISTICS_ORDER_SUBCONTRACT_KEY = "order:logistics:no:subcontract:%s";
+
+
+    /**
+     * 消费请求有效时间(秒)
+     */
+    public static final Long CONSUMER_REQUEST_VALID_TIME = 180L;
+    /**
+     * 结算单锁
+     */
+    public static final String SETTLEMENT_KEY = "sckw:kst:%s";
+    /**
+     * 企业关联钱包
+     */
+    public static final String WALLET_ENT = "wallet:ent";
+    /**
+     * 钱包关联企业
+     */
+    public static final String WALLET_UID = "wallet:uid";
+    /**
+     * 电子钱包时间记录
+     * uid:filter:channel->time
+     */
+    public static final String WALLET_TIME = "%s:%s:%s";
+
+}

+ 10 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/constant/RedisLockKey.java

@@ -0,0 +1,10 @@
+package com.sckw.redis.constant;
+
+/**
+ * @author xucaiqin
+ * @date 2023-09-06 16:52:57
+ */
+public interface RedisLockKey {
+    String TRANSFER = "transfer:";
+    String REFUND = "refund:";
+}

+ 77 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/utils/GenerateOrderIdUtil.java

@@ -0,0 +1,77 @@
+package com.sckw.redis.utils;
+
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.support.atomic.RedisAtomicLong;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 生成订单流水号18  * 精确到秒级,后面加随机数(redis获取)
+ * <p>
+ * 通过增加随机性,修正因宿主机时钟回拨导致生成重复值的bug
+ * key改为按日期,最后的拼接用取模的方式防止数据越界,②解决concat带来的bug。
+ *
+ * @author wangzaizhou
+ **/
+@Component
+@Slf4j
+public class GenerateOrderIdUtil {
+    //private static Logger logger = LoggerFactory.getLogger(SequenceService.class);
+
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    //用作存放redis中的key
+    private static String ORDER_KEY = "order_key";
+
+    //生成特定的业务编号,prefix为特定的业务代码
+    public String getOrderNo(String prefix){
+        return getSeqNo(ORDER_KEY, prefix);
+    }
+
+    //SequenceService类中公用部分,传入制定的key和prefix
+    private String getSeqNo(String key, String prefix)
+    {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        //设置过期时间,这里设置为当天的23:59:59
+        Date expireDate = calendar.getTime();
+        //返回当前redis中的key的最大值
+        Long seq = generate(redisTemplate, key, expireDate);
+        //获取当天的日期,格式为yyyyMMdd
+        String date = new SimpleDateFormat("yyyyMMdd").format(expireDate);
+        //生成八为的序列号,如果seq不够八位,seq前面补0,
+        //如果seq位数超过了八位,那么无需补0直接返回当前的seq
+        String sequence = String.format("%08d", Integer.parseInt(seq.toString()));
+        if (prefix == null)
+        {
+            prefix = "";
+        }
+        //拼接业务编号
+        String seqNo = prefix + date + sequence;
+        //logger.info("KEY:{}, 序列号生成:{}, 过期时间:{}", key, seqNo, String.format("%tF %tT ", expireDate, expireDate));
+        return seqNo;
+    }
+
+    /**
+     * @param key
+     * @param expireTime <i>过期时间</i>
+     * @return
+     */
+    public static long generate(RedisTemplate<?,?> redisTemplate,String key,Date expireTime) {
+        //RedisAtomicLong为原子类,根据传入的key和redis链接工厂创建原子类
+        RedisAtomicLong counter = new RedisAtomicLong(key,redisTemplate.getConnectionFactory());
+        //设置过期时间
+        counter.expireAt(expireTime);
+        //返回redis中key的值,内部实现下面详细说明
+        return counter.incrementAndGet();
+    }
+}

+ 386 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/utils/RedissonUtils.java

@@ -0,0 +1,386 @@
+package com.sckw.redis.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.Redisson;
+import org.redisson.api.*;
+import org.redisson.client.codec.StringCodec;
+import org.redisson.config.Config;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+public class RedissonUtils {
+
+    private final RedissonClient redissonClient;
+
+    private static RedissonUtils redissonUtils;
+
+    public RedissonUtils(RedissonClient redissonClient) {
+        redissonUtils = this;
+        this.redissonClient = redissonClient;
+    }
+
+    /**
+     * 默认缓存时间
+     */
+    private static final Long DEFAULT_EXPIRED = 5 * 60L;
+
+    /**
+     * 添加缓存
+     *
+     * @param key   key
+     * @param value value
+     */
+    public static void add(String key, String value) {
+        //根据key获取bucket桶对象
+        RBucket<Object> bucket = redissonUtils.redissonClient.getBucket(key);
+        //判读是否存在,并打印日志信息
+        if (!bucket.isExists()) {
+            //log.info("");
+        } else {
+            //log.info("update data");
+        }
+        //添加缓存,若已存在,则替换,设置缓存超时时间
+        bucket.set(value, 60, TimeUnit.MINUTES);
+    }
+
+
+    /**
+     * 删除缓存信息
+     *
+     * @param key key
+     */
+    public static void delete(String key) {
+        //根据key获取bucket桶对象
+        RBucket<Object> bucket = redissonUtils.redissonClient.getBucket(key);
+        //判读是否存在,并打印日志信息
+        if (!bucket.isExists()) {
+            //log.info("error");
+        }
+        bucket.delete();
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param key 用*模糊匹配
+     */
+    public static void deleteBactch(String key) {
+        Iterator<String> iterator = redissonUtils.redissonClient.getKeys().getKeysByPattern(key).iterator();
+        while (iterator.hasNext()) {
+            String word = iterator.next();
+            RBucket<Object> bucket = redissonUtils.redissonClient.getBucket(word);
+            bucket.delete();
+        }
+    }
+
+    /**
+     * 判断缓存是否存在
+     *
+     * @param key
+     * @return
+     */
+    public static boolean exists(String key) {
+        return redissonUtils.redissonClient.getBucket(key).isExists();
+    }
+
+
+    /**
+     * 读取缓存
+     *
+     * @param key 缓存key
+     * @param <T>
+     * @return 缓存返回值
+     */
+    public static <T> T get(String key) {
+        RBucket<T> bucket = redissonUtils.redissonClient.getBucket(key);
+        return bucket.get();
+    }
+
+    /**
+     * 以string的方式读取缓存
+     *
+     * @param key 缓存key
+     * @return 缓存返回值
+     */
+    public static String getString(String key) {
+        RBucket<String> bucket = redissonUtils.redissonClient.getBucket(key, StringCodec.INSTANCE);
+        return bucket.get();
+    }
+
+    /**
+     * 设置缓存(注:redisson会自动选择序列化反序列化方式)
+     *
+     * @param key   缓存key
+     * @param value 缓存值
+     * @param <T>
+     */
+    public static <T> void put(String key, T value) {
+        log.debug("添加缓存【{}】 【{}】开始", key, value);
+        RBucket<T> bucket = redissonUtils.redissonClient.getBucket(key);
+        bucket.set(value, DEFAULT_EXPIRED, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 以string的方式设置缓存
+     *
+     * @param key
+     * @param value
+     */
+    public static void putString(String key, String value, long expired) {
+        log.debug("添加缓存【{}】 【{}】开始", key, value);
+        RBucket<String> bucket = redissonUtils.redissonClient.getBucket(key, StringCodec.INSTANCE);
+        bucket.set(value, expired <= 0 ? DEFAULT_EXPIRED : expired, TimeUnit.SECONDS);
+
+    }
+    /**
+     * 以string的方式设置缓存
+     *
+     * @param key
+     * @param value
+     */
+    public static void putString(String key, String value, long expired, TimeUnit timeUnit) {
+        log.debug("添加缓存【{}】 【{}】开始", key, value);
+        RBucket<String> bucket = redissonUtils.redissonClient.getBucket(key, StringCodec.INSTANCE);
+        bucket.set(value, expired <= 0 ? DEFAULT_EXPIRED : expired, timeUnit);
+    }
+
+    /**
+     * 如果不存在则写入缓存(string方式,不带有redisson的格式信息)
+     *
+     * @param key     缓存key
+     * @param value   缓存值
+     * @param expired 缓存过期时间
+     */
+    public boolean putStringIfAbsent(String key, String value, long expired) {
+        log.debug("如果不存在则写入缓存【{}】 【{}】 【{}】开始", key, value, expired);
+        RBucket<String> bucket = redissonUtils.redissonClient.getBucket(key, StringCodec.INSTANCE);
+        return bucket.setIfAbsent(value, expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));
+    }
+
+    /**
+     * 如果不存在则写入缓存(string方式,不带有redisson的格式信息)(不带过期时间,永久保存)
+     *
+     * @param key   缓存key
+     * @param value 缓存值
+     */
+    public boolean putStringIfAbsent(String key, String value) {
+        log.debug("如果不存在则写入永久缓存【{}】 【{}】开始", key, value);
+        RBucket<String> bucket = redissonUtils.redissonClient.getBucket(key, StringCodec.INSTANCE);
+        return bucket.setIfAbsent(value);
+    }
+
+    /**
+     * 设置缓存
+     *
+     * @param key     缓存key
+     * @param value   缓存值
+     * @param expired 缓存过期时间
+     * @param <T>     类型
+     */
+    public static <T> void put(String key, T value, long expired) {
+        log.debug("如果不存在则写入缓存【{}】 【{}】 【{}】开始", key, value, expired);
+        RBucket<T> bucket = redissonUtils.redissonClient.getBucket(key);
+        bucket.set(value, expired <= 0 ? DEFAULT_EXPIRED : expired, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 移除缓存
+     *
+     * @param key
+     */
+    public static void remove(String key) {
+        log.debug("移除缓存【{}】开始", key);
+        redissonUtils.redissonClient.getBucket(key).delete();
+    }
+
+    /**
+     * 暴露redisson的RList对象
+     *
+     * @param key
+     * @param <T>
+     * @return
+     */
+    public static <T> RList<T> getRedisList(String key) {
+        return redissonUtils.redissonClient.getList(key);
+    }
+
+    /**
+     * 暴露redisson的RMapCache对象
+     *
+     * @param key
+     * @param <K>
+     * @param <V>
+     * @return
+     */
+    public static <K, V> RMapCache<K, V> getRedisMap(String key) {
+        return redissonUtils.redissonClient.getMapCache(key);
+    }
+
+    /**
+     * 暴露redisson的RSET对象
+     *
+     * @param key
+     * @param <T>
+     * @return
+     */
+    public static <T> RSet<T> getRedisSet(String key) {
+        return redissonUtils.redissonClient.getSet(key);
+    }
+
+    public static <T> boolean putSet(String key, T value) {
+        RSet<Object> set = redissonUtils.redissonClient.getSet(key);
+        return set.add(value);
+    }
+
+    public static <T> boolean putSet(String key, List<T> list) {
+        RSet<Object> set = redissonUtils.redissonClient.getSet(key);
+        return set.addAll(list);
+    }
+
+    /**
+     * 携带过期时间
+     * @param key
+     * @param list
+     * @param expired
+     * @return
+     * @param <T>
+     */
+    public static <T> boolean putSetSeconds(String key, List<T> list,long expired) {
+        log.debug("如果不存在则写入缓存【{}】 【{}】 【{}】开始", key, list, expired);
+        RSet<Object> set = redissonUtils.redissonClient.getSet(key);
+        set.expire(expired,TimeUnit.SECONDS);
+        return set.addAll(list);
+    }
+
+    /**
+     * 携带过期时间
+     * @param key
+     * @param list
+     * @param expired
+     * @return
+     * @param <T>
+     */
+    public static <T> boolean putSetHours(String key, List<T> list,long expired) {
+        log.debug("如果不存在则写入缓存【{}】 【{}】 【{}】开始", key, list, expired);
+        RSet<Object> set = redissonUtils.redissonClient.getSet(key);
+        set.expire(Duration.ofHours(expired));
+        return set.addAll(list);
+    }
+
+    public static <T> boolean contains(String key, T value) {
+        RSet<Object> set = redissonUtils.redissonClient.getSet(key);
+        return set.isEmpty() ? Boolean.FALSE : set.contains(value);
+    }
+
+    public static RSet<Object> getSet(String key) {
+        return redissonUtils.redissonClient.getSet(key);
+    }
+
+
+    /**
+     * 暴露redisson的RScoredSortedSet对象
+     *
+     * @param key
+     * @param <T>
+     * @return
+     */
+    public static <T> RScoredSortedSet<T> getRedisScoredSortedSet(String key) {
+        return redissonUtils.redissonClient.getScoredSortedSet(key);
+    }
+
+    /**
+     * 尝试加锁,最多等待waitTime秒,上锁以后leaseTime秒自动解锁
+     *
+     * @param lockKey
+     * @param waitTime
+     * @param leaseTime
+     * @return
+     */
+    public static boolean tryLock(String lockKey, long waitTime, long leaseTime) {
+        RLock lock = redissonUtils.redissonClient.getLock(lockKey);
+        try {
+            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            log.info("tryLock lockKey:{} waitTime:{} leaseTime:{}", lockKey, waitTime, leaseTime);
+            return false;
+        }
+    }
+
+    /**
+     * @desc: 释放锁
+     * @author: yzc
+     * @date: 2023-07-13 15:16
+     * @Param lockKey:
+     * @return: void
+     */
+    public static void unlock(String lockKey) {
+        RLock lock = redissonUtils.redissonClient.getLock(lockKey);
+        if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * 原子增加
+     *
+     * @param name
+     * @param expired
+     * @return
+     */
+    public static Long getAtomicLong(String name, Long expired) {
+        RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
+        long number = atomicLong.incrementAndGet();
+        atomicLong.expire(expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));
+        return number;
+    }
+
+    /**
+     * 原子减少
+     *
+     * @param name
+     * @param expired
+     * @return
+     */
+    public static Long decrementAndGet(String name, Long expired) {
+        RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
+        long number = atomicLong.decrementAndGet();
+        atomicLong.expire(expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));
+        return number;
+    }
+
+    /**
+     * 原子set
+     *
+     * @param name
+     * @param value
+     * @param expired
+     */
+    public static void setAtomicLong(String name, Long value, Long expired) {
+        RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
+        atomicLong.set(value);
+        atomicLong.expire(expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));
+    }
+
+
+    public static void main(String[] args) {
+        List<String> set = new ArrayList<>();
+        set.add("asdsad");
+        set.add("132146");
+        set.add("jgfdt345");
+        Config config = new Config();
+        config.useSingleServer().setAddress("redis://" + "127.0.0.1" + ":" + "6379").setDatabase(1);
+        String key = "test:123";
+        RedissonClient redissonClient = Redisson.create(config);
+        RSet<Object> set1 = redissonClient.getSet(key);
+        set1.addAll(set);
+
+        RSet<Object> rSet = redissonClient.getSet(key);
+        System.out.println(rSet.contains("jgfdt345"));
+    }
+
+}

+ 139 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/utils/SnowflakeIdWorker.java

@@ -0,0 +1,139 @@
+package com.sckw.redis.utils;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+public class SnowflakeIdWorker {
+
+    //开始时间截 (2015-01-01)
+    private final long START_TIME_STAMP = 1420041600000L;
+
+    /**
+     * 每一部分占用的位数
+     */
+    //序列号占用的位数
+    private final long SEQUENCE_BIT = 12L;
+    //机器标识占用的位数
+    private final long MACHINE_BIT = 5L;
+    //数据中心占用的位数
+    private final long DATACENTER_BIT = 5L;
+
+
+    /**
+     * 每一部分的最大值
+     */
+    //最大数据中心数量,结果是31
+    private final long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
+
+    //最大机器数量,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
+    private final long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
+
+    //最大序列,这里为4095 (0b111111111111=0xfff=4095)
+    private final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
+
+
+    /**
+     * 每一部分向左的位移
+     */
+    //机器ID向左移12位
+    private final long MACHINE_ID_LEFT = SEQUENCE_BIT;
+
+    //数据中心id向左移17位(12+5)
+    private final long DATACENTER_ID_LEFT = SEQUENCE_BIT + MACHINE_BIT;
+
+    //时间截向左移22位(5+5+12)
+    private final long TIME_STAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT;
+
+
+    //数据中心ID(0~31)
+    private long datacenterId;
+
+    //机器ID(0~31)
+    private long machineId;
+
+    //序列号 { 毫秒内序列(0~4095)}
+    private long sequence = 0L;
+
+    //上一次时间戳
+    private long lastTimestamp = -1L;
+
+
+    /**
+     * 构造函数
+     *
+     * @param machineId    工作ID (0~31)
+     * @param datacenterId 数据中心ID (0~31)
+     */
+    public SnowflakeIdWorker(long machineId, long datacenterId) {
+        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", MAX_MACHINE_NUM));
+        }
+        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", MAX_DATACENTER_NUM));
+        }
+        this.machineId = machineId;
+        this.datacenterId = datacenterId;
+    }
+
+
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     *
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+
+        long currentTimeStamp = getCurrentTimeStamp();
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (currentTimeStamp < lastTimestamp) {
+            throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - currentTimeStamp));
+        }
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (currentTimeStamp == lastTimestamp) {
+            //相同毫秒内,序列号自增
+            sequence = (sequence + 1) & MAX_SEQUENCE;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                currentTimeStamp = getNewTimeStamp(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+        //上次生成ID的时间截
+        lastTimestamp = currentTimeStamp;
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((currentTimeStamp - START_TIME_STAMP) << TIME_STAMP_LEFT) //时间戳部分
+                | (datacenterId << DATACENTER_ID_LEFT) //数据中心部分
+                | (machineId << MACHINE_ID_LEFT) //机器标识部分
+                | sequence;  //序列号部分
+    }
+
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     */
+    protected long getCurrentTimeStamp() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * 获得新的时间戳
+     *
+     * @param lastTimestamp 上次生成ID的时间截
+     */
+    protected long getNewTimeStamp(long lastTimestamp) {
+        long timestamp = getCurrentTimeStamp();
+        while (timestamp <= lastTimestamp) {
+            timestamp = getCurrentTimeStamp();
+        }
+        return timestamp;
+    }
+
+}
+
+

+ 37 - 0
business-common/business-common-redis/src/main/java/com/sckw/redis/utils/TestService.java

@@ -0,0 +1,37 @@
+package com.sckw.redis.utils;
+
+import org.redisson.Redisson;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+
+public class TestService {
+
+    public void test(){
+        Config config = new Config();
+        config.useSingleServer()
+                // use "rediss://" for SSL connection
+                .setAddress("redis://39.104.183.141:6379").setPassword("123456");
+
+        // or read config from file
+        // config = Config.fromYAML(new File("config-file.yaml"));
+
+        // 2. Create Redisson instance, support Sync and Async API
+        RedissonClient redisson = Redisson.create(config);
+
+        RBucket<Object> mytest = redisson.getBucket("mytest");
+        mytest.set("value");
+        System.out.println(mytest.get());
+        mytest.set("value2");
+        System.out.println(mytest.get());
+        boolean b = mytest.compareAndSet("value2", "value3");
+        System.out.println(mytest.get());
+        boolean b1 = mytest.compareAndSet("value2", "value4");
+        System.out.println(mytest.get());
+    }
+
+    public static void main(String[] args) {
+        TestService testService = new TestService();
+        testService.test();
+    }
+}

+ 2 - 0
business-common/business-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1,2 @@
+com.sckw.redis.config.RedissonConfig
+com.sckw.redis.config.RedisLockUtil

+ 25 - 0
business-common/pom.xml

@@ -0,0 +1,25 @@
+<?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">
+    <parent>
+        <artifactId>businessCheck</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-common</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>business-common-datasource</module>
+        <module>business-common-redis</module>
+        <module>business-common-core</module>
+    </modules>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+</project>

+ 132 - 0
business-modules-web/business-transport-start/pom.xml

@@ -0,0 +1,132 @@
+<?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">
+    <parent>
+        <artifactId>business-modules-web</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-transport-start</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.version>1.0.0</project.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>6.1.5</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>2.0</version>
+            <!--<scope>compile</scope>-->
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+            <version>3.2.4</version>
+        </dependency>
+
+        <!--hutool工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.5.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-address</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-goods</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-truck</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-driver</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-car-transport</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-path</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-company</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-user</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-usual-transport</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-datasource</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <mainClass>com.sckw.transport.TransportStartApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 19 - 0
business-modules-web/business-transport-start/src/main/java/com/sckw/transport/TransportStartApplication.java

@@ -0,0 +1,19 @@
+package com.sckw.transport;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @date 2024/5/11 0011
+ */
+@ComponentScan({"com.sckw.*"})
+@MapperScan({"com.sckw.*"})
+@SpringBootApplication
+public class TransportStartApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TransportStartApplication.class, args);
+    }
+}

+ 57 - 0
business-modules-web/business-transport-start/src/main/java/com/sckw/transport/plugin/Myplugin.java

@@ -0,0 +1,57 @@
+package com.sckw.transport.plugin;
+
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.*;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.Properties;
+
+/**
+ * @desc: 自动填充
+ * @author: Lt
+ * @date: 2024-05-15
+ */
+@Intercepts(
+        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
+)
+@Component
+public class Myplugin implements Interceptor {
+    //获取到拦截的对象,底层也是通过代理来实现的,实际上是拿到一个目标的代理对象
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target,this);
+    }
+
+    //获取配置文件中设置的阈值等参数
+    @Override
+    public void setProperties(Properties properties) {
+
+    }
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0];
+        //获取操作类型,crud
+        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+        //获取参数
+        Object parameter = invocation.getArgs()[1];
+        Field[]fields = parameter.getClass().getDeclaredFields();
+
+
+        for(Field field: fields){
+            //注入对应的属性值
+            if ("createBy".equals(field.getName())&&SqlCommandType.INSERT.equals(sqlCommandType)){
+                field.setAccessible(true);
+                field.set(parameter,"admin");
+            }
+            if ("updateBy".equals(field.getName())&&SqlCommandType.UPDATE.equals(sqlCommandType)){
+                field.setAccessible(true);
+                field.set(parameter,"admin");
+            }
+        }
+
+        return invocation.proceed();
+    }
+}

+ 74 - 0
business-modules-web/business-transport-start/src/main/resources/application.yml

@@ -0,0 +1,74 @@
+server:
+  port: 10086
+  application:
+    name: test
+
+spring:
+  datasource:
+    dynamic:
+      primary: master
+      strict: false
+      datasource:
+        master:
+          url: jdbc:mysql://10.10.10.221:3306/business_order?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_order
+          password: business_order
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        truck:
+          url: jdbc:mysql://10.10.10.221:3306/business_truck?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_truck
+          password: business_truck
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        address:
+          url: jdbc:mysql://10.10.10.221:3306/business_address?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_address
+          password: business_address
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        driver:
+          url: jdbc:mysql://10.10.10.221:3306/business_driver?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_driver
+          password: business_driver
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        path:
+          url: jdbc:mysql://10.10.10.221:3306/business_path?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_path
+          password: business_path
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        goods:
+          url: jdbc:mysql://10.10.10.221:3306/business_goods?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_goods
+          password: business_goods
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        company:
+          url: jdbc:mysql://10.10.10.221:3306/business_company?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_company
+          password: business_company
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        user:
+          url: jdbc:mysql://10.10.10.221:3306/business_user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
+          username: business_user
+          password: business_user
+          driver-class-name: com.mysql.cj.jdbc.Driver
+  data:
+    redis:
+      host: 10.10.10.221
+      password: test
+      port: 6379
+      database: 30
+      timeout: 10000
+#
+#mybatis-plus:
+#  mapper-locations: classpath*:/mapper/*.xml    #扫描xml文件
+#  #实体扫描,多个package用逗号或者分号分隔
+#  typeAliasesPackage: com.sckw.*.entity
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+#
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*.xml
+  typeAliasesPackage: com.sckw.*.entity
+  configuration:
+    map-underscore-to-camel-case: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+

+ 23 - 0
business-modules-web/pom.xml

@@ -0,0 +1,23 @@
+<?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">
+    <parent>
+        <artifactId>businessCheck</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-modules-web</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>business-transport-start</module>
+    </modules>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+</project>

+ 42 - 0
business-modules/business-address/pom.xml

@@ -0,0 +1,42 @@
+<?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">
+    <parent>
+        <artifactId>business-modules</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-address</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-core</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-datasource</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+    </dependencies>
+</project>

+ 94 - 0
business-modules/business-address/src/main/java/com/sckw/address/controller/AddressController.java

@@ -0,0 +1,94 @@
+package com.sckw.address.controller;
+
+import com.sckw.address.entity.vo.req.KwBusinessAddressListParam;
+import com.sckw.address.entity.vo.req.KwBusinessAddressPageListParam;
+import com.sckw.address.entity.vo.req.KwBusinessAddressParam;
+import com.sckw.address.entity.vo.res.KwBusinessAddressListRes;
+import com.sckw.address.service.KwAddressService;
+import com.sckw.core.model.page.PageRes;
+import com.sckw.core.web.response.HttpResult;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @desc: 地址服务
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Validated
+@RestController
+@RequestMapping(value = "/address")
+public class AddressController {
+
+    @Autowired
+    KwAddressService kwAddressService;
+
+    /**
+    * @Description: 地址新增
+    * @Author: Lt
+    * @Date: 2024/4/11 15:54
+    */
+    @PostMapping(value = "/save")
+    public HttpResult addressCreate(@RequestBody @Valid KwBusinessAddressParam kwBusinessAddressParam)
+    {
+        return kwAddressService.addressCreate(kwBusinessAddressParam);
+    }
+
+    /**
+     * @Description: 地址编辑
+     * @Author: Lt
+     * @Date: 2024/4/11 15:54
+     */
+    @PostMapping(value = "/update")
+    public HttpResult addressUpdate(@RequestBody @Valid KwBusinessAddressParam kwBusinessAddressParam)
+    {
+        return kwAddressService.addressUpdate(kwBusinessAddressParam);
+    }
+
+    /**
+    * @Description: 地址删除
+    * @Author: Lt
+    * @Date: 2024/4/11 16:43
+    */
+    @PostMapping(value = "/delete")
+    public HttpResult delete(@RequestParam("id") String id){
+
+        return kwAddressService.addressDelete(id);
+    }
+
+    /**
+    * @Description: 地址查询
+    * @Author: Lt
+    * @Date: 2024/4/11 16:43
+    */
+    @GetMapping("/find")
+    public HttpResult find(@RequestParam("id") String id){
+        return kwAddressService.addressFind(id);
+    }
+
+    /**
+    * @Description: 地址分页查询
+    * @Author: Lt
+    * @Date: 2024/4/11 16:51
+    */
+    @PostMapping(value = "/selectPageList")
+    public HttpResult pageList(@RequestBody @Valid KwBusinessAddressPageListParam kwBusinessAddressListParam)
+    {
+        return kwAddressService.addressPageList(kwBusinessAddressListParam);
+    }
+
+    /**
+     * @Description: 地址查询
+     * @Author: Lt
+     * @Date: 2024/4/11 16:51
+     */
+    @PostMapping(value = "/select")
+    public HttpResult list(@RequestBody(required = false) KwBusinessAddressListParam kwBusinessAddressListParam)
+    {
+        PageRes<KwBusinessAddressListRes> list = kwAddressService.selectList(kwBusinessAddressListParam);
+        return HttpResult.ok(list);
+    }
+
+}

+ 72 - 0
business-modules/business-address/src/main/java/com/sckw/address/controller/AddressTypeController.java

@@ -0,0 +1,72 @@
+package com.sckw.address.controller;
+
+import com.sckw.address.entity.vo.req.KwBusinessAddressTypeInsertParam;
+import com.sckw.address.service.KwBusinessAddressTypeService;
+import com.sckw.core.web.response.HttpResult;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @desc: 地址类型
+ * @author: Lt
+ * @date: 2024-04-12
+ */
+@Validated
+@RestController
+@RequestMapping(value = "/addressType")
+public class AddressTypeController {
+
+    @Autowired
+    KwBusinessAddressTypeService kwBusinessAddressTypeService;
+
+    /**
+    * @Description: 地址类型新增
+    * @Author: Lt
+    * @Date: 2024/4/12 8:58
+    */
+    @PostMapping(value = "/addressTypeInsert")
+    public HttpResult addressTypeInsert(@RequestBody @Valid KwBusinessAddressTypeInsertParam kwBusinessAddressTypeInsertParam)
+    {
+        return kwBusinessAddressTypeService.addressTypeInsert(kwBusinessAddressTypeInsertParam);
+    }
+
+    /**
+     * @Description: 地址类型编辑
+     * @Author: Lt
+     * @Date: 2024/4/12 8:58
+     */
+    @PostMapping(value = "/addressTypeUpdate")
+    public HttpResult addressTypeUpdate(@RequestBody @Valid KwBusinessAddressTypeInsertParam kwBusinessAddressTypeInsertParam)
+    {
+        return kwBusinessAddressTypeService.addressTypeUpdate(kwBusinessAddressTypeInsertParam);
+    }
+
+    /**
+     * @Description: 地址类型删除
+     * @Author: Lt
+     * @Date: 2024/4/12 8:58
+     */
+    @PostMapping(value = "/delete")
+    public HttpResult addressTypeDelete(@RequestParam(value = "id", required = false) String id)
+    {
+        return kwBusinessAddressTypeService.addressTypeDelete(id);
+    }
+
+    /**
+     * @Description: 地址List
+     * @Author: Lt
+     * @Date: 2024/4/11 16:51
+     */
+    @PostMapping(value = "/list")
+    public HttpResult list(@RequestParam(value = "name", required = false) String name)
+    {
+        return HttpResult.ok(kwBusinessAddressTypeService.selectList(name));
+    }
+
+
+
+
+
+}

+ 91 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/KwBusinessAddress.java

@@ -0,0 +1,91 @@
+package com.sckw.address.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Data
+public class KwBusinessAddress implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 地址名称
+     */
+    private String name;
+
+    /**
+     * 所属区域
+     */
+    private String ownRegion;
+
+    /**
+     * 所属区域名称
+     */
+    private String cityName;
+
+    /**
+     * 所在地区
+     */
+    private Integer cityCode;
+
+    /**
+     * 地址详情
+     */
+    private String detail;
+
+    /**
+     * 地址类型
+     */
+    private Long type;
+
+    /**
+     * lat
+     */
+    private String lat;
+
+    /**
+     * lng
+     */
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 56 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/KwBusinessAddressType.java

@@ -0,0 +1,56 @@
+package com.sckw.address.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc: kw_business_address_type
+ * @author: Lt
+ * @date: 2024-04-12
+ */
+@Data
+public class KwBusinessAddressType implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 类型状态  0=正常
+     */
+    private Integer status;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 17 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressListParam.java

@@ -0,0 +1,17 @@
+package com.sckw.address.entity.vo.req;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-06
+ */
+@Data
+public class KwBusinessAddressListParam {
+    private Integer page;
+
+    private Integer pageSize;
+
+    private String name;
+}

+ 23 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressPageListParam.java

@@ -0,0 +1,23 @@
+package com.sckw.address.entity.vo.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Data
+public class KwBusinessAddressPageListParam {
+
+    @NotNull(message = "分页必填")
+    private Integer page;
+
+    @NotNull(message = "分页数必填")
+    private Integer pageSize;
+
+    private Long type;
+
+    private String name;
+}

+ 81 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressParam.java

@@ -0,0 +1,81 @@
+package com.sckw.address.entity.vo.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Data
+public class KwBusinessAddressParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 地址名称
+     */
+    private String name;
+
+    /**
+     * 所属区域
+     */
+    private String ownRegion;
+
+    /**
+     * 地址详情
+     */
+    private String detail;
+
+    /**
+     * 地址类型
+     */
+    private Long type;
+
+    /**
+     * lat
+     */
+    private String lat;
+
+    /**
+     * lng
+     */
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 27 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/req/KwBusinessAddressTypeInsertParam.java

@@ -0,0 +1,27 @@
+package com.sckw.address.entity.vo.req;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-12
+ */
+@Data
+public class KwBusinessAddressTypeInsertParam {
+
+    /**
+     * 地址id
+     */
+    private Long id;
+
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 类型状态  0=正常
+     */
+    private Integer status;
+}

+ 15 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessAddressListRes.java

@@ -0,0 +1,15 @@
+package com.sckw.address.entity.vo.res;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Data
+public class KwBusinessAddressListRes {
+
+    private String id;
+    private String name;
+}

+ 15 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessAddressTypeListRes.java

@@ -0,0 +1,15 @@
+package com.sckw.address.entity.vo.res;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-12
+ */
+@Data
+public class KwBusinessAddressTypeListRes {
+    private Long id;
+
+    private String name;
+}

+ 79 - 0
business-modules/business-address/src/main/java/com/sckw/address/entity/vo/res/KwBusinessPageListRes.java

@@ -0,0 +1,79 @@
+package com.sckw.address.entity.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Data
+public class KwBusinessPageListRes {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 地址名称
+     */
+    private String name;
+
+    /**
+     * 所属区域
+     */
+    private String ownRegion;
+
+    /**
+     * 地址详情
+     */
+    private String detail;
+
+    /**
+     * 地址类型
+     */
+    private Long type;
+    private String typeStr;
+
+    /**
+     * lat
+     */
+    private String lat;
+
+    /**
+     * lng
+     */
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+}
+

+ 23 - 0
business-modules/business-address/src/main/java/com/sckw/address/mapper/KwBusinessAddressMapper.java

@@ -0,0 +1,23 @@
+package com.sckw.address.mapper;
+
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.address.entity.KwBusinessAddress;
+import com.sckw.address.entity.vo.req.KwBusinessAddressListParam;
+import com.sckw.address.entity.vo.req.KwBusinessAddressPageListParam;
+import com.sckw.address.entity.vo.res.KwBusinessAddressListRes;
+import com.sckw.address.entity.vo.res.KwBusinessPageListRes;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+@DS("address")
+public interface KwBusinessAddressMapper extends BaseMapper<KwBusinessAddress> {
+
+    List<KwBusinessPageListRes> selectPageList(@Param("selectPageParam") KwBusinessAddressPageListParam kwBusinessAddressListParam);
+
+    List<KwBusinessAddressListRes> list(@Param("param") KwBusinessAddressListParam param);
+}

+ 17 - 0
business-modules/business-address/src/main/java/com/sckw/address/mapper/KwBusinessAddressTypeMapper.java

@@ -0,0 +1,17 @@
+package com.sckw.address.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.address.entity.KwBusinessAddressType;
+import com.sckw.address.entity.vo.res.KwBusinessAddressTypeListRes;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+@DS("address")
+public interface KwBusinessAddressTypeMapper extends BaseMapper<KwBusinessAddressType> {
+
+    List<KwBusinessAddressTypeListRes> list(@Param("name") String name);
+}

+ 177 - 0
business-modules/business-address/src/main/java/com/sckw/address/service/KwAddressService.java

@@ -0,0 +1,177 @@
+package com.sckw.address.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.sckw.address.entity.KwBusinessAddress;
+import com.sckw.address.entity.vo.req.KwBusinessAddressListParam;
+import com.sckw.address.entity.vo.req.KwBusinessAddressPageListParam;
+import com.sckw.address.entity.vo.req.KwBusinessAddressParam;
+import com.sckw.address.entity.vo.res.KwBusinessAddressListRes;
+import com.sckw.address.entity.vo.res.KwBusinessAddressTypeListRes;
+import com.sckw.address.entity.vo.res.KwBusinessPageListRes;
+import com.sckw.address.mapper.KwBusinessAddressMapper;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.page.PageRes;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.web.response.HttpResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-11
+ */
+@Service
+public class KwAddressService {
+
+    @Autowired
+    KwBusinessAddressMapper kwBusinessAddressMapper;
+
+    @Autowired
+    KwBusinessAddressTypeService kwBusinessAddressTypeService;
+
+    /**
+    * @Description: 订单新增
+    * @Author: Lt
+    * @Date: 2024/4/11 16:02
+    */
+    public HttpResult addressCreate(KwBusinessAddressParam kwBusinessAddressParam)
+    {
+        KwBusinessAddress kwBusinessAddress = BeanUtils.copyProperties(kwBusinessAddressParam, KwBusinessAddress.class);
+        KwBusinessAddress name = kwBusinessAddressMapper.
+                selectOne(new QueryWrapper<KwBusinessAddress>().eq("name", kwBusinessAddress.getName()));
+        if(ObjectUtils.isNotEmpty(name)){
+            return HttpResult.error("名称重复");
+        }
+        kwBusinessAddressMapper.insert(kwBusinessAddress);
+        return HttpResult.ok("保存成功");
+    }
+
+    /**
+    * @Description: 地址编辑
+    * @Author: Lt
+    * @Date: 2024/4/11 16:08
+    */
+    public HttpResult addressUpdate(KwBusinessAddressParam kwBusinessAddressParam)
+    {
+
+        if(kwBusinessAddressParam.getId() == null) {
+            return HttpResult.error("缺少参数:ID");
+        }
+
+        KwBusinessAddress kwBusinessAddressTypeExists = kwBusinessAddressMapper.selectOne(
+                new LambdaQueryWrapper<KwBusinessAddress>()
+                        .eq(KwBusinessAddress::getName, kwBusinessAddressParam.getName())
+                        .ne(KwBusinessAddress::getId, kwBusinessAddressParam.getId())
+                        .eq(KwBusinessAddress::getDelFlag, Global.NUMERICAL_ZERO));
+        if (ObjectUtils.isNotNull(kwBusinessAddressTypeExists)) {
+            return HttpResult.error("地址名称已存在");
+        }
+
+
+        KwBusinessAddress oldKwBusinessAddress = kwBusinessAddressMapper.selectOne(new QueryWrapper<KwBusinessAddress>()
+                .eq("id",kwBusinessAddressParam.getId()));
+        
+        if(oldKwBusinessAddress!=null){
+            KwBusinessAddress kwBusinessAddress = BeanUtils.copyProperties(kwBusinessAddressParam, KwBusinessAddress.class);
+            kwBusinessAddressMapper.updateById(kwBusinessAddress);
+            return HttpResult.ok("编辑成功");
+        }
+        return HttpResult.error("编辑失败");
+    }
+
+    /**
+    * @Description: 地址删除
+    * @Author: Lt
+    * @Date: 2024/4/11 16:35
+    */
+    public HttpResult addressDelete(String id)
+    {
+        KwBusinessAddress kwBusinessAddress = kwBusinessAddressMapper.selectOne(new QueryWrapper<KwBusinessAddress>().eq("id",id).eq("del_flag",Global.NUMERICAL_ZERO));
+        if(kwBusinessAddress!=null){
+            kwBusinessAddress.setId(Long.valueOf(id));
+            kwBusinessAddress.setDelFlag(Global.NUMERICAL_ONE);
+            kwBusinessAddressMapper.updateById(kwBusinessAddress);
+            return HttpResult.ok("删除成功");
+        }else{
+            return HttpResult.error("没有找到该对象");
+        }
+    }
+
+    /**
+    * @Description: 地址Find查询
+    * @Author: Lt
+    * @Date: 2024/4/11 0011 16:39
+    */
+    public HttpResult addressFind(String id)
+    {
+        LambdaQueryWrapper<KwBusinessAddress> addressLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        addressLambdaQueryWrapper.eq(KwBusinessAddress::getId, id).eq(KwBusinessAddress::getDelFlag,Global.NUMERICAL_ZERO);
+        KwBusinessAddress kwBusinessAddress = kwBusinessAddressMapper.selectOne(addressLambdaQueryWrapper);
+        if(kwBusinessAddress!=null){
+            return HttpResult.ok(kwBusinessAddress);
+        }else{
+            return HttpResult.error("没有找到该对象");
+        }
+
+    }
+
+    /**
+    * @Description: 地址分页查询
+    * @Author: Lt
+    * @Date: 2024/4/11 16:46
+    */
+    public HttpResult addressPageList(KwBusinessAddressPageListParam kwBusinessAddressListParam)
+    {
+        PageHelper.startPage(kwBusinessAddressListParam.getPage(), kwBusinessAddressListParam.getPageSize());
+        List<KwBusinessPageListRes> kwBusinessPageListRes = kwBusinessAddressMapper.selectPageList(kwBusinessAddressListParam);
+        HashMap<Long, String> objectObjectHashMap = new HashMap<>();
+        if(CollectionUtils.isNotEmpty(kwBusinessPageListRes)) {
+            List<KwBusinessAddressTypeListRes> kwBusinessAddressTypeListRes = kwBusinessAddressTypeService.selectList(null);
+            kwBusinessAddressTypeListRes.forEach(l -> {
+                objectObjectHashMap.put(l.getId(), l.getName());
+            });
+        }
+
+        kwBusinessPageListRes.forEach(e -> {
+            String typeStr = objectObjectHashMap.get(e.getType());
+            if (typeStr != null) {
+                e.setTypeStr(typeStr);
+            }
+        });
+        return HttpResult.ok(new PageRes<>(new PageInfo<>(kwBusinessPageListRes)));
+    }
+
+    /**
+    * @Description: 地址查询
+    * @Author: Lt
+    * @Date: 2024/4/11 0011 17:09
+    */
+    public PageRes<KwBusinessAddressListRes> selectList(KwBusinessAddressListParam param)
+    {
+
+        List<KwBusinessAddressListRes> resultList;
+
+        // 判断是否需要分页
+        if (param.getPage() != null && param.getPageSize() != null) {
+            // 分页查询
+            PageHelper.startPage(param.getPage(), param.getPageSize());
+            resultList = kwBusinessAddressMapper.list(param);
+            return new PageRes<>(new PageInfo<>(resultList)); // 注意这里应该返回resultList而不是kwBusinessGoods
+        } else {
+            // 不分页查询
+            resultList = kwBusinessAddressMapper.list(param);
+            // 直接返回结果列表,不包装PageInfo,除非你有其他非分页的PageRes构造方式
+            return new PageRes<>(resultList); // 假设PageRes有合适的构造方法处理非分页情况
+        }
+    }
+
+
+}

+ 112 - 0
business-modules/business-address/src/main/java/com/sckw/address/service/KwBusinessAddressTypeService.java

@@ -0,0 +1,112 @@
+package com.sckw.address.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.sckw.address.entity.KwBusinessAddressType;
+import com.sckw.address.entity.vo.req.KwBusinessAddressTypeInsertParam;
+import com.sckw.address.entity.vo.res.KwBusinessAddressTypeListRes;
+import com.sckw.address.mapper.KwBusinessAddressTypeMapper;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.web.response.HttpResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-12
+ */
+@Service
+public class KwBusinessAddressTypeService {
+    @Autowired
+    KwBusinessAddressTypeMapper kwBusinessAddressTypeMapper;
+
+    /**
+    * @Description: 地址类型新增
+    * @Author: Lt
+    * @Date: 2024/4/12 9:09
+    */
+    public HttpResult addressTypeInsert(KwBusinessAddressTypeInsertParam kwBusinessAddressTypeInsertParam)
+    {
+
+        LambdaQueryWrapper<KwBusinessAddressType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwBusinessAddressType::getName, kwBusinessAddressTypeInsertParam.getName())
+                .eq(KwBusinessAddressType::getDelFlag, Global.NUMERICAL_ZERO);
+        KwBusinessAddressType addressTypeExists = kwBusinessAddressTypeMapper.selectOne(queryWrapper);
+        if (ObjectUtils.isNotNull(addressTypeExists)) {
+            return HttpResult.error("名称已存在");
+        }
+        KwBusinessAddressType kwBusinessAddressType = BeanUtils.copyProperties(kwBusinessAddressTypeInsertParam, KwBusinessAddressType.class);
+        int insert = kwBusinessAddressTypeMapper.insert(kwBusinessAddressType);
+        if (insert > 0) {
+            return HttpResult.ok("地址添加成功");
+        }
+        return HttpResult.error("地址添加失败");
+    }
+
+
+    /**
+     * @Description: 地址类型编辑
+     * @Author: Lt
+     * @Date: 2024/4/11 16:08
+     */
+    public HttpResult addressTypeUpdate(KwBusinessAddressTypeInsertParam kwBusinessAddressTypeInsertParam)
+    {
+
+        if(kwBusinessAddressTypeInsertParam.getId() == null) {
+            return HttpResult.error("缺少参数:ID");
+        }
+
+        KwBusinessAddressType kwBusinessAddressTypeExists = kwBusinessAddressTypeMapper.selectOne(
+                new LambdaQueryWrapper<KwBusinessAddressType>()
+                        .eq(KwBusinessAddressType::getName, kwBusinessAddressTypeInsertParam.getName())
+                        .ne(KwBusinessAddressType::getId, kwBusinessAddressTypeInsertParam.getId())
+                        .eq(KwBusinessAddressType::getDelFlag, Global.NUMERICAL_ZERO));
+        if (ObjectUtils.isNotNull(kwBusinessAddressTypeExists)) {
+            return HttpResult.error("地址类型名称已存在");
+        }
+
+        KwBusinessAddressType oldKwBusinessAddress = kwBusinessAddressTypeMapper.selectOne(new QueryWrapper<KwBusinessAddressType>()
+                .eq("id",kwBusinessAddressTypeInsertParam.getId()));
+
+        if(oldKwBusinessAddress!=null){
+            KwBusinessAddressType kwBusinessAddressType = BeanUtils.copyProperties(kwBusinessAddressTypeInsertParam, KwBusinessAddressType.class);
+            kwBusinessAddressTypeMapper.updateById(kwBusinessAddressType);
+            return HttpResult.ok("编辑成功");
+        }
+        return HttpResult.error("编辑失败");
+    }
+
+    /**
+     * @Description: 地址查询
+     * @Author: Lt
+     * @Date: 2024/4/11 0011 17:09
+     */
+    public List<KwBusinessAddressTypeListRes> selectList(String name)
+    {
+        return kwBusinessAddressTypeMapper.list(name);
+    }
+    
+    /**
+    * @Description: 地址删除
+    * @Author: Lt
+    * @Date: 2024/4/12 0012 9:23
+    */
+    public HttpResult addressTypeDelete(String id)
+    {
+        KwBusinessAddressType kwBusinessAddress = kwBusinessAddressTypeMapper.selectOne(new QueryWrapper<KwBusinessAddressType>().eq("id",id).eq("del_flag",Global.NUMERICAL_ZERO));
+        if(kwBusinessAddress!=null){
+            kwBusinessAddress.setId(Long.valueOf(id));
+            kwBusinessAddress.setDelFlag(Global.NUMERICAL_ONE);
+            kwBusinessAddressTypeMapper.updateById(kwBusinessAddress);
+            return HttpResult.ok("删除成功");
+        }else{
+            return HttpResult.error("没有找到该对象");
+        }
+    }
+
+
+}

+ 46 - 0
business-modules/business-address/src/main/resources/mapper/KwBusinessAddressMapper.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.address.mapper.KwBusinessAddressMapper">
+
+    <sql id="Base_Column_List">
+                id,
+                `name`,
+                own_region,
+                detail,
+                type,
+                city_name,
+                city_code,
+                lat,
+                lng,
+                fence,
+                `status`,
+                create_by,
+                update_by,
+                create_time,
+                update_time,
+                del_flag
+    </sql>
+
+    <select id="selectPageList" resultType="com.sckw.address.entity.vo.res.KwBusinessPageListRes">
+        select <include refid="Base_Column_List" /> from kw_business_address
+        <where>
+            del_flag = 0
+            <if test="selectPageParam.type != null">
+              and type = #{selectPageParam.type,jdbcType=INTEGER}
+            </if>
+            <if test="selectPageParam.name != null and selectPageParam.name != ''">
+                AND `name` LIKE concat('%' , #{selectPageParam.name} , '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="list" resultType="com.sckw.address.entity.vo.res.KwBusinessAddressListRes">
+        select id,name from kw_business_address
+        <where>
+            del_flag = 0
+            <if test="param.name != null and param.name != ''">
+                AND `name` LIKE concat('%' , #{param.name} , '%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 27 - 0
business-modules/business-address/src/main/resources/mapper/KwBusinessAddressTypeMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.address.mapper.KwBusinessAddressTypeMapper">
+
+    <select id="selectPageList" resultType="com.sckw.address.entity.vo.res.KwBusinessPageListRes">
+        select * from kw_business_address_type
+        <where>
+            del_flag = 0
+            <if test="selectPageParam.type != null">
+              and type = #{selectPageParam.type,jdbcType=INTEGER}
+            </if>
+            <if test="selectPageParam.name != null and selectPageParam.name != ''">
+                AND `name` LIKE concat('%' , #{selectPageParam.name} , '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="list" resultType="com.sckw.address.entity.vo.res.KwBusinessAddressTypeListRes">
+        select id,name from kw_business_address_type
+        <where>
+            del_flag = 0
+            <if test="name != null and name != ''">
+                AND `name` LIKE concat('%' , #{name} , '%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 49 - 0
business-modules/business-car-transport/pom.xml

@@ -0,0 +1,49 @@
+<?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">
+    <parent>
+        <artifactId>business-modules</artifactId>
+        <groupId>com.sckw</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>business-car-transport</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-core</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-datasource</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>business-common-redis</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 85 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/controller/CarTransportController.java

@@ -0,0 +1,85 @@
+package com.sckw.car.controller;
+
+import com.sckw.car.entity.req.AddLogisticsOrderParam;
+import com.sckw.car.service.CarTransportListService;
+import com.sckw.car.service.CarTransportService;
+import com.sckw.core.web.response.HttpResult;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @desc: 轿运控制器
+ * @author: Lt
+ * @date: 2024-04-15
+ */
+@Validated
+@RestController
+@RequestMapping("/car")
+public class CarTransportController {
+
+    @Autowired
+    CarTransportService carTransportService;
+
+    @Autowired
+    CarTransportListService carTransportListService;
+
+    
+    /**
+    * @Description: 轿运添加
+    * @Author: Lt
+    * @Date: 2024/4/17 11:12
+    */
+    @PostMapping("/addOrder")
+    public HttpResult carTransportAdd(@RequestBody AddLogisticsOrderParam addLogisticsOrderParam)
+    {
+        return HttpResult.ok(carTransportService.carTransportAdd(addLogisticsOrderParam));
+    }
+
+    /**
+    * @Description: 获取清单列表-轿运新增-货物明细-列表筛选
+    * @Author: Lt
+    * @Date: 2024/4/18 9:34
+    */
+    @GetMapping("/listDetail")
+    public HttpResult listDetails(@RequestParam(value = "name", required = false) String name)
+    {
+        return HttpResult.ok(carTransportListService.listDetail(name));
+    }
+
+    /**
+    * @Description: 轿运-详情
+    * @Author: Lt
+    * @Date: 2024/5/8 20:03
+    */
+    @GetMapping("/detail")
+    public HttpResult detail(@RequestParam("orderId") String orderId)
+    {
+        return HttpResult.ok(carTransportListService.detail(orderId));
+    }
+
+    /**
+     * @Description: 轿运-完结
+     * @Author: Lt
+     * @Date: 2024/5/8 20:03
+     */
+    @GetMapping("/completeDetail")
+    public HttpResult completeDetail(@RequestParam("orderId") String orderId)
+    {
+        return HttpResult.ok(carTransportListService.completeDetail(orderId));
+    }
+
+
+    /**
+    * @Description:
+    * @Author: Lt
+    * @Date: 2024/5/12 0012 17:49
+    */
+    @GetMapping("/getStatusCountListInSingleQuery")
+    public HttpResult getStatusCountListInSingleQuery()
+    {
+        return HttpResult.ok(carTransportListService.getStatusCountListInSingleQuery());
+    }
+
+}

+ 70 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/controller/WayBillController.java

@@ -0,0 +1,70 @@
+package com.sckw.car.controller;
+
+import com.sckw.car.entity.req.KwOrderCarCompleteParam;
+import com.sckw.car.entity.req.KwOrderSendCarParam;
+import com.sckw.car.service.KwWayBillService;
+import com.sckw.core.web.response.HttpResult;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @desc: 派车运单控制器
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Validated
+@RestController
+@RequestMapping("/car/waybill")
+public class WayBillController {
+
+    @Autowired
+    KwWayBillService kwWayBillService;
+
+    /**
+    * @Description: 轿运-派车
+    * @Author: Lt
+    * @Date: 2024/4/18 15:17
+    */
+    @PostMapping("/sendCar")
+    public HttpResult sendCar(@RequestBody @Valid KwOrderSendCarParam kwOrderSendCarParam)
+    {
+        return kwWayBillService.sendCarInsert(kwOrderSendCarParam);
+    }
+
+    /**
+    * @Description: 轿运-派车草稿
+    * @Author: Lt
+    * @Date: 2024/4/18 15:17
+    */
+    @PostMapping("/sendCarDraft")
+    public HttpResult sendCarDraft(@RequestBody @Valid KwOrderSendCarParam kwOrderSendCarParam)
+    {
+        return kwWayBillService.sendCarDraft(kwOrderSendCarParam);
+    }
+
+    /**
+    * @Description: 完结订单-订单详情
+    * @Author: Lt
+    * @Date: 2024/4/22 10:29
+    */
+    @GetMapping("/waybillDetail")
+    public HttpResult waybillDetail(@RequestParam(value = "orderId", required = false) String orderId)
+    {
+        return HttpResult.ok(kwWayBillService.waybillDetail(orderId));
+    }
+
+    /**
+     * @Description: 轿运-完结订单
+     * @Author: Lt
+     * @Date: 2024/4/18 15:17
+     */
+    @PostMapping("/completeOrder")
+    public HttpResult completeOrder(@RequestBody @Valid KwOrderCarCompleteParam kwOrderCarCompleteParam)
+    {
+        return kwWayBillService.completeOrder(kwOrderCarCompleteParam);
+    }
+
+
+}

+ 247 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarOrder.java

@@ -0,0 +1,247 @@
+package com.sckw.car.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @desc: 普通货物-陆运
+ * @author: lt
+ * @date: 2024/3/28 9:48
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+@TableName(value = "kw_order")
+public class KwCarOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    private Integer owSystem;
+
+    /*
+    订单来源
+     */
+    private Integer orderSource;
+
+    /**
+     * 物流订单号
+     */
+    private String orderNo;
+
+    /**
+     * 装卸类型
+     */
+    private Integer typeHandling;
+
+    /**
+     * 货物id
+     */
+    private String goodsId;
+
+    /**
+     * 货物名称
+     */
+    private String goodsName;
+
+    /**
+     * 货物类型
+     */
+    private Integer goodsType;
+
+    /**
+     * 货物单位
+     */
+    private String goodsUnit;
+
+    /**
+     * 托运企业id
+     */
+    private String tyCompanyId;
+
+    /**
+     * 托运企业
+     */
+    private String tyCompany;
+
+    /**
+     * 托运联系方式
+     */
+    private String tyPhone;
+
+    /**
+     * 承运企业id
+     */
+    private String cyCompanyId;
+
+    /**
+     * 承运企业
+     */
+    private String cyCompany;
+
+    /**
+     * 承运企业联系方式
+     */
+    private String cyPhone;
+
+    private String fhCompanyId;
+    private String fhCompany;
+    private String fhPhone;
+
+    private String shCompanyId;
+    private String shCompany;
+    private String shPhone;
+
+    /**
+     * 前置订单号
+     */
+    private String pid;
+
+    private String pids;
+
+    private BigDecimal amount;
+
+    private BigDecimal entrustAmount;
+
+    /*
+    分包量(给下游承运商分包的量)
+     */
+    private BigDecimal subcontractAmount;
+
+    /*
+    累计装货量
+     */
+    private BigDecimal totalLoadAmount;
+
+    /*
+    累计卸货量
+     */
+    private BigDecimal totalUnloadAmount;
+
+    private BigDecimal loadAmount;
+
+    private BigDecimal unloadAmount;
+
+    /*
+    忽略剩余量
+     */
+    private BigDecimal ignoreAmount;
+
+    /*
+    单位(吨,方,箱,件)
+     */
+    private String unit;
+    /**
+     * 剩余代运量
+     */
+    private Double remainNum;
+
+    private Double remainAllocation;
+
+    /*
+    结算周期结算周期(周结、月结、季结)
+     */
+    private Long settlementCycle;
+
+    /*
+    运价
+     */
+    private BigDecimal price;
+
+    /*
+    运价方式(元/吨、元/车)
+     */
+    private Long priceType;
+
+    /*
+    计费方式
+     */
+    private String billingMode;
+
+    /*
+    合理损耗单位
+     */
+    private BigDecimal loss;
+
+    /*
+    商品价值(扣亏货值)((实装-实卸)-合理损耗)如果为负数,则为零
+     */
+    private BigDecimal goodsPrice;
+
+    /**
+     * 付款方式(预付款、线下支付、第三方支付)
+     */
+    private Long payment;
+
+    /**
+     * 发票税率(%)
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 计划开始日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime startTime;
+
+    /**
+     * 计划结束日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime endTime;
+
+    /*
+    备注
+     */
+    private String remark;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /*
+    租户id
+     */
+    private String tenantId;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 73 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarOrderDict.java

@@ -0,0 +1,73 @@
+package com.sckw.car.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @desc:
+ * @author: lt
+ * @date: 2024/4/3 17:37
+ */
+@Data
+@TableName("kw_order_dict")
+public class KwCarOrderDict implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 字典名称
+     */
+    private Integer dictSort;
+
+    /**
+     * dict_label
+     */
+    private String dictLabel;
+
+    /**
+     * dict_value
+     */
+    private String dictValue;
+
+    /**
+     * 所属组
+     */
+    private String dictGroup;
+
+    /**
+     * 备注
+     */
+    private String dictRemark;
+
+    /**
+     * status
+     */
+    private Integer status;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+
+
+}

+ 143 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwCarWaybillOrder.java

@@ -0,0 +1,143 @@
+package com.sckw.car.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: lt
+ * @date: 2024/4/9 15:15
+ */
+@Getter
+@Setter
+@TableName("kw_waybill_order")
+public class KwCarWaybillOrder implements Serializable {
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 企业id
+     */
+    private String entId;
+
+    /*
+    物流订单id
+     */
+    private String orderId;
+
+    /**
+     * 编号
+     */
+    private String tOrderNo;
+
+    /**
+     * 派车类型(1:趟次:2:循环)
+     */
+    private Integer type;
+
+    /**
+     * 车辆档案ID
+     */
+    private String truckId;
+
+    /**
+     * 车牌号
+     */
+    private String truckNo;
+
+    /**
+     * 计划开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 计划结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 司机id
+     */
+    private String driverId;
+
+    /**
+     * 司机姓名
+     */
+    private String driverName;
+
+    /**
+     * 司机手机号
+     */
+    private String driverPhone;
+
+    /**
+     * 司机身份证号码
+     */
+    private String driverIdcard;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态(1待接单、2待出车、3已出车、4到达装货点、5已装货、6到达卸货点、7已卸货、8审核通过、9拒接单、10拒出车、11已撤销、12审核不通过)
+     */
+    private Integer status;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 卸货重量
+     */
+    private BigDecimal unloadAmount;
+
+    /**
+     * 装货重量
+     */
+    private BigDecimal loadAmount;
+
+    /**
+     * 亏吨重量
+     */
+    private BigDecimal deficitAmount;
+
+    /* 运单来源 1陆运 2轿运 */
+    private Integer tType;
+
+    private Integer unit;
+
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    private Integer delFlag;
+}

+ 78 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarDictReq.java

@@ -0,0 +1,78 @@
+package com.sckw.car.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @desc:
+ * @author: lt
+ * @date: 2024/4/3 17:37
+ */
+@Data
+public class KwOrderCarDictReq implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 字典名称
+     */
+    private Integer dictSort;
+
+    /**
+     * dict_label
+     */
+    @NotBlank(message = "字典label必填")
+    private String dictLabel;
+
+    /**
+     * dict_value
+     */
+    @NotBlank(message = "字典value必填")
+    private String dictValue;
+
+    /**
+     * 所属组
+     */
+    @NotBlank(message = "字典所属组必填")
+    private String dictGroup;
+
+    /**
+     * 备注
+     */
+    private String dictRemark;
+
+    /**
+     * status
+     */
+    private Integer status;
+
+    /**
+     * create_time
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+
+
+}

+ 36 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarDictRes.java

@@ -0,0 +1,36 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @desc:
+ * @author: lt
+ * @date: 2024/4/3 17:37
+ */
+@Data
+public class KwOrderCarDictRes implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 字典名称
+     */
+    private String group;
+
+    /**
+     * dict_label
+     */
+    private String label;
+
+    /**
+     * dict_value
+     */
+    private String value;
+
+
+
+
+}

+ 62 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportDefGoods.java

@@ -0,0 +1,62 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class KwOrderCarLandTransportDefGoods implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * order_id
+     */
+    private Long orderId;
+
+    /**
+     * 合理损耗
+     */
+    private String rationalLoss;
+
+    /**
+     * 扣款单价
+     */
+    private Double dedPrice;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 52 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportInventory.java

@@ -0,0 +1,52 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @desc: 清单目录Bean
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportInventory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * 清单名称
+     */
+    private String name;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 72 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportMore.java

@@ -0,0 +1,72 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc: 更多信息
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportMore implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * order_id
+     */
+    private String orderId;
+
+    /**
+     * 车辆类型
+     */
+    private Integer truckType;
+
+    /**
+     * 车辆类型名称
+     */
+    private String truckTypeStr;
+
+    /**
+     * 预估运费
+     */
+    private Double estimateFreight;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 178 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPath.java

@@ -0,0 +1,178 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @desc: 轿运路径信息
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportPath implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 物流订单id
+     */
+    private String orderId;
+
+    /**
+     * 地址id
+     */
+    private String pathId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /*
+     起始地-id
+    */
+    private String loadAddressId;
+
+    /**
+     * 起始地-地址名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /*
+     起始地-id
+    */
+    private String unloadAddressId;
+
+    /**
+     * 目的地-地址名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输数量(托运填写量)
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 结算货物数量(完结填写量)
+     */
+    private BigDecimal settlementAmount;
+
+    /*
+    计费方式
+     */
+    private String billMode;
+
+    /*
+    计量单位
+     */
+    private Integer unit;
+
+    /*
+    清单id
+     */
+    private String goodsId;
+
+    /**
+     * 状态:0正常/1锁定
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 删除标识(0正常/1删除)
+     */
+    private Integer delFlag;
+}

+ 66 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPathGoods.java

@@ -0,0 +1,66 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class KwOrderCarLandTransportPathGoods implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * car_path_id
+     */
+    private String carPathId;
+
+    /**
+     * goods_id
+     */
+    private String goodsId;
+
+    /**
+     * goods_name
+     */
+    private String goodsName;
+
+    /**
+     * goods_num
+     */
+    private String goodsNum;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 102 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportPer.java

@@ -0,0 +1,102 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class KwOrderCarLandTransportPer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * order_id
+     */
+    private Long orderId;
+
+    /**
+     * 履约计划开始时间
+     */
+    private Date perStartTime;
+
+    /**
+     * 履约计划结束时间
+     */
+    private Date perEndTime;
+
+    /**
+     * 结算周期
+     */
+    private String billingCycle;
+
+    /**
+     * 支付方式
+     */
+    private String payMethod;
+
+    /**
+     * pay_company_id
+     */
+    private Long payCompanyId;
+
+    /**
+     * 付款单位
+     */
+    private String payCompany;
+
+    /**
+     * gathering_company_id
+     */
+    private Long gatheringCompanyId;
+
+    /**
+     * 收款单位
+     */
+    private String gatheringCompany;
+
+    /**
+     * 运输单价
+     */
+    private Double price;
+
+    /**
+     * 计费方式
+     */
+    private Integer billingMode;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 69 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarLandTransportTrack.java

@@ -0,0 +1,69 @@
+package com.sckw.car.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @desc: 订单状态跟踪信息记录
+ * @author: lt
+ * @date: 2024/4/7 16:47
+ */
+@Data
+@TableName("kw_order_usual_land_transport_track")
+public class KwOrderCarLandTransportTrack implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 物流订单id
+     */
+    private Long orderId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /*
+    操作内容
+     */
+    private String actionNote;
+
+    /**
+     * status
+     */
+    private Integer status;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    private Integer delFlag;
+}

+ 61 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrder.java

@@ -0,0 +1,61 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @description 轿运-派车运单表
+ * @author lt
+ * @date 2024-04-18
+ */
+@Data
+public class KwOrderCarWaybillOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * order_id
+     */
+    private String orderId;
+
+    /**
+     * 运单编号
+     */
+    private String taskNo;
+
+    /**
+     * 运单状态
+     */
+    private Integer status;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 67 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatch.java

@@ -0,0 +1,67 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @desc: 轿运-派车任务表
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Data
+public class KwOrderCarWaybillOrderDispatch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /*
+    运单id
+     */
+    private String waybillId;
+
+    /**
+     * 任务编号
+     */
+    private String dispatchNo;
+
+    /**
+     * 车牌号
+     */
+    private String truckNo;
+
+    /**
+     * 驾驶员姓名
+     */
+    private String driverName;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 87 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatchAddress.java

@@ -0,0 +1,87 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc: 轿运-派车任务地址信息
+ * @author: Lt
+ * @date: 2024-04-28
+ */
+@Data
+public class KwOrderCarWaybillOrderDispatchAddress implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    private String orderId;
+
+    /**
+     * 运单id
+     */
+    private String waybillId;
+
+    /**
+     * 路径名称
+     */
+    private String name;
+
+    /**
+     * 地址id
+     */
+    private Long addressId;
+
+    /**
+     * 计量单位 1台 2件
+     */
+    private Integer unit;
+
+    /**
+     * 装卸数量
+     */
+    private Integer entrustAmount;
+
+    /**
+     * 装卸货类型
+     */
+    private Integer addressType;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+
+}

+ 66 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillOrderDispatchAssign.java

@@ -0,0 +1,66 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @description 轿运-派车任务-任务分配
+ * @author lt
+ * @date 2024-04-18
+ */
+@Data
+public class KwOrderCarWaybillOrderDispatchAssign implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * 运单id
+     */
+    private String waybillId;
+
+    /**
+     * 清单详情表id
+     */
+    private String inventoryDetailId;
+
+    /**
+     * 清单表id
+     */
+    private String inventoryId;
+
+    /**
+     * 清单个体编号
+     */
+    private String inventoryOrderNo;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * update_time
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 72 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/KwOrderCarWaybillTransportPathGoods.java

@@ -0,0 +1,72 @@
+package com.sckw.car.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-11
+ */
+@Data
+public class KwOrderCarWaybillTransportPathGoods implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * car_path_id
+     */
+    private Long waybillId;
+
+    /**
+     * order_id
+     */
+    private String orderId;
+
+    /**
+     * goods_id
+     */
+    private String goodsId;
+
+    /**
+     * goods_name
+     */
+    private String goodsName;
+
+    /**
+     * goods_num
+     */
+    private String goodsNum;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+    /**
+     * update_by
+     */
+    private String updateBy;
+
+    /**
+     * create_time
+     */
+    private Date createTime;
+
+    /**
+     * update_time
+     */
+    private Date updateTime;
+
+    /**
+     * del_flag
+     */
+    private Integer delFlag;
+}

+ 222 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/AddLogisticsOrderParam.java

@@ -0,0 +1,222 @@
+package com.sckw.car.entity.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AddLogisticsOrderParam implements Serializable {
+
+    /*
+   托运企业id
+    */
+    @NotNull(message = "托运企业id不能是空")
+    private String tyCompanyId;
+
+    /**
+     * 托运企业
+     */
+    @NotBlank(message = "托运企业不能是空")
+    private String tyCompany;
+
+    /**
+     * 托运联系方式
+     */
+    private String tyPhone;
+
+    @NotNull(message = "发货企业id不能是空")
+    private String fhCompanyId;
+
+    /**
+     * 发货企业
+     */
+    @NotBlank(message = "发货企业不能是空")
+    private String fhCompany;
+
+    /**
+     * fh_phone
+     */
+    private String fhPhone;
+
+    /*
+    承运物流公司id
+     */
+    @NotNull(message = "承运企业id不能是空")
+    private String cyCompanyId;
+
+    /**
+     * 承运物流有限公司
+     */
+    @NotBlank(message = "承运物流公司不能是空")
+    private String cyCompany;
+
+    /**
+     * 承运联系方式
+     */
+    private String cyPhone;
+
+    /*
+    收货企业id
+     */
+    @NotNull(message = "收货企业id不能是空")
+    private String shCompanyId;
+
+    /**
+     * 收货企业
+     */
+    private String shCompany;
+
+    /**
+     * 收货联系方式
+     */
+    private String shPhone;
+
+
+    /**
+     * goodsId
+     */
+//    @NotNull(message = "goodsId不能为空")
+//    private Long goodsId;
+
+    /**
+     * skuId
+     */
+//    @NotNull(message = "goodsId不能为空")
+//    private Long skuId;
+
+    /**
+     * 货物名称
+     */
+    //@NotNull(message = "货物名称不能为空")
+    //private String goodsName;
+
+    /**
+     * 货物类型
+     */
+    //@NotBlank(message = "货物类型不能为空")
+    //private String goodsType;
+
+    /**
+     * 计费方式
+     */
+    //@NotNull(message = "计费方式不能为空")
+    //private String billingMode;
+
+    /**
+     * 计费方式类型
+     */
+    //@NotNull(message = "计费方式类型不能为空")
+    //private String billingModeType;
+
+    /**
+     * 运价
+     */
+//    @NotNull(message = "运价不能为空")
+//    @Digits(integer = 10, fraction = 2, message = "装货量格式错误")
+//    @DecimalMin(value = "0.00", message = "运价最小为{value}")
+//    private BigDecimal price;
+
+    /**
+     * 运价方式
+     */
+    //private Long priceType;
+
+    /**
+     * 税率
+     */
+//    @NotNull(message = "税率不能为空")
+//    @Digits(integer = 10,fraction = 2,message = "税率格式错误")
+//    @DecimalMin(value = "0.00",message = "税率最小为{value}")
+    private BigDecimal taxRate;
+
+    /**
+     * 税率单位
+     */
+    private String taxRateUnit;
+
+    /**
+     * 总量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 总量单位
+     */
+    private String amountUnit;
+
+    /**
+     * 合理损耗
+     */
+    private BigDecimal loss;
+
+    /**
+     * 合理损耗单位
+     */
+    private String lossUnit;
+
+    /*
+    订单状态
+     */
+    private Integer status;
+
+    /**
+     * 商品价值(扣亏货值)
+     */
+    private BigDecimal goodsPrice;
+    /**
+     * 商品价值(扣亏货值)单位
+     */
+    private String goodsPriceUnit;
+
+    /**
+     * 计划卸货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime endTime;
+
+    /**
+     * 计划发货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime startTime;
+
+    /**
+     * 结算周期(周结、月结、季结)
+     */
+    private Long settlementCycle;
+
+    /**
+     * 支付方式
+     */
+//    @Max(value = 4, message = "支付方式必须小于等于{value}")
+    private Long payment;
+
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 线路分配
+     */
+    @JsonProperty("pathList")
+    private List<KwOrderCarLandTransportPathDto> pathList;
+
+
+    private KwOrderCarLandTransportMoreReq more;
+
+    private KwOrderCarLandTransportPerParam transportPer;
+    private KwOrderCarLandTransportDefGoodsReq defGoods;
+}

+ 14 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/GoodsListDetailDto.java

@@ -0,0 +1,14 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class GoodsListDetailDto {
+
+    private String goodsNum;
+}

+ 18 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/GoodsListDto.java

@@ -0,0 +1,18 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class GoodsListDto {
+
+    private String goodsId;
+    private String goodsName;
+    private List<GoodsListDetailDto> children;
+}

+ 16 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/InventoryNumDto.java

@@ -0,0 +1,16 @@
+package com.sckw.car.entity.req;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-11
+ */
+@Getter
+@Setter
+public class InventoryNumDto {
+
+    private String goodsNum;
+}

+ 30 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarCompleteParam.java

@@ -0,0 +1,30 @@
+package com.sckw.car.entity.req;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-22
+ */
+@Data
+public class KwOrderCarCompleteParam {
+
+    /* 订单id */
+    private Long orderId;
+
+    /* 备注 */
+    private String remark;
+
+    /* 路径信息 */
+    @NotEmpty(message = "路径必选")
+    @Size(min = 1, message = "路径任务至少有一个")
+    @Valid
+    private List<KwOrderCompletePathDto> path;
+
+}

+ 26 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportDefGoodsReq.java

@@ -0,0 +1,26 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class KwOrderCarLandTransportDefGoodsReq implements Serializable {
+
+
+    /**
+     * 合理损耗
+     */
+    private String rationalLoss;
+
+    /**
+     * 扣款单价
+     */
+    private Double dedPrice;
+
+}

+ 37 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportMoreReq.java

@@ -0,0 +1,37 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @desc: 更多信息
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportMoreReq implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 车辆类型
+     */
+    private Integer truckType;
+
+    /**
+     * 车辆类型名称
+     */
+    private String truckTypeStr;
+
+    /**
+     * 预估运费
+     */
+    private Double estimateFreight;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 150 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportPathDto.java

@@ -0,0 +1,150 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @desc: 轿运路径信息
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportPathDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 线路id
+     */
+    private String pathId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /*
+     起始地-id
+    */
+    private String loadAddressId;
+
+    /**
+     * 起始地-地址名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /*
+     起始地-id
+    */
+    private String unloadAddressId;
+
+    /**
+     * 目的地-地址名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输数量(托运填写量)
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 结算货物数量(完结填写量)
+     */
+    private BigDecimal settlementAmount;
+
+    /*
+    计费方式 货物数*里程价
+     */
+    private String billingMode;
+
+    /*
+    计量单位
+     */
+    private Integer unit;
+
+    /**
+     * 状态:0正常/1锁定
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    private GoodsListDto goodsList;
+
+}

+ 69 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarLandTransportPerParam.java

@@ -0,0 +1,69 @@
+package com.sckw.car.entity.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class KwOrderCarLandTransportPerParam implements Serializable {
+
+    /**
+     * 履约计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date perStartTime;
+
+    /**
+     * 履约计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date perEndTime;
+
+    /**
+     * 结算周期
+     */
+    private String billingCycle;
+
+    /**
+     * 支付方式
+     */
+    private String payMethod;
+
+    /**
+     * pay_company_id
+     */
+    private String payCompanyId;
+
+    /**
+     * 付款单位
+     */
+    private String payCompany;
+
+    /**
+     * gathering_company_id
+     */
+    private Long gatheringCompanyId;
+
+    /**
+     * 收款单位
+     */
+    private String gatheringCompany;
+
+    /**
+     * 运输单价
+     */
+    private Double price;
+
+    /**
+     * 计费方式
+     */
+    private Integer billingMode;
+
+}

+ 65 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarWaybillOrderDispatchAddressReq.java

@@ -0,0 +1,65 @@
+package com.sckw.car.entity.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @desc: 轿运-派车任务地址信息
+ * @author: Lt
+ * @date: 2024-04-28
+ */
+@Data
+public class KwOrderCarWaybillOrderDispatchAddressReq implements Serializable {
+
+    /**
+     * 订单id
+     */
+    @NotNull(message = "缺少参数: orderId")
+    private Long orderId;
+
+    /**
+     * 运单id
+     */
+    @NotNull(message = "缺少参数: waybillId")
+    private Long waybillId;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 路径名称
+     */
+    private String name;
+
+    /**
+     * 地址id
+     */
+    private Long addressId;
+
+    /**
+     * 计量单位 1台 2件
+     */
+    private Integer unit;
+
+    /**
+     * 装卸数量
+     */
+    private Integer entrustAmount;
+
+    /**
+     * 装卸货类型
+     */
+    private Integer addressType;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * create_by
+     */
+    private String createBy;
+
+}

+ 36 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCarWaybillOrderDispatchAssignReq.java

@@ -0,0 +1,36 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Data
+public class KwOrderCarWaybillOrderDispatchAssignReq {
+
+    /*
+    清单详情表id
+     */
+    private String goodsId;
+
+
+    /*
+    清单表id
+     */
+    private String goodsName;
+
+
+    /*
+    清单表个体编号
+     */
+    private List<InventoryNumDto> children;
+
+
+
+
+
+}

+ 23 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderCompletePathDto.java

@@ -0,0 +1,23 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-22
+ */
+@Data
+public class KwOrderCompletePathDto {
+
+    private Long id;
+
+    /* 路径名称 */
+    private String name;
+
+    /* 结算量 */
+    private BigDecimal settleAmount;
+
+}

+ 46 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/KwOrderSendCarParam.java

@@ -0,0 +1,46 @@
+package com.sckw.car.entity.req;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc: 派车请求实体类
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Data
+public class KwOrderSendCarParam {
+
+    /*
+    订单id
+     */
+    @NotNull(message = "订单id不能为空")
+    private String orderId;
+
+    /** 派车状态
+     *
+     */
+    private Integer status;
+
+    /*
+      创建人
+     */
+    private String createBy;
+
+
+    /*
+    派车任务
+     */
+    @NotEmpty(message = "派车任务必选")
+    @Size(min = 1, message = "派车任务至少有一个")
+    @Valid
+    List<kwWaybillOrderReq> dispatch;
+
+
+
+}

+ 18 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/UpdateCompleteGoodsListDto.java

@@ -0,0 +1,18 @@
+package com.sckw.car.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class UpdateCompleteGoodsListDto {
+
+    private String goodsId;
+    private String goodsName;
+    private List<GoodsListDetailDto> children;
+}

+ 59 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/req/kwWaybillOrderReq.java

@@ -0,0 +1,59 @@
+package com.sckw.car.entity.req;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @desc: 派车任务请求类
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Data
+@Accessors(chain = true)
+public class kwWaybillOrderReq {
+
+    /* 车辆id */
+    private String truckId;
+
+    /*
+      车牌号
+     */
+    @NotBlank(message = "车牌号不能为空")
+    private String truckNo;
+
+    /* 司机id */
+
+    /*
+      司机姓名
+     */
+    private String driverId;
+    @NotBlank(message = "司机姓名不能是空")
+    private String driverName;
+    private String driverPhone;
+    private String driverIdcard;
+
+    /* 运单来源 */
+    private Integer tType;
+
+    /* 运单备注 */
+    private String remark;
+
+    /*
+     派车人分配任务
+     */
+    //@NotEmpty(message = "请选择任务清单")
+    @Size(min = 1, message = "任务清单至少需要一个元素")
+    @Valid
+    List<KwOrderCarWaybillOrderDispatchAssignReq> goodsList;
+
+    /*
+     派车地址
+    */
+    List<KwOrderCarWaybillOrderDispatchAddressReq> pathAddress;
+
+}

+ 92 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/CarDetailRes.java

@@ -0,0 +1,92 @@
+package com.sckw.car.entity.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-05-08
+ */
+@Data
+public class CarDetailRes {
+    //======================header=========================
+    private String id;
+    private Integer orderSource;      //订单来源
+    private String orderNo;           //订单编号
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime; //创建时间
+    private String createBy;          //创建人
+    private Integer status;           //订单状态
+    private String statusStr;         //订单中文
+    private String qzOrder;           //前置订单号
+    private Integer typeHandling;     //装卸类型
+    private String typeHandlingStr;     //装卸类型中文
+    private String tenantId;     //租户id
+
+    //=====================企业信息=========================
+    private String tyCompanyId;       //托运企业id
+    private String tyCompany;         //托运企业
+    private String tyPhone;           //托运企业联系方式
+
+    private String cyCompanyId;       //承运企业id
+    private String cyCompany;         //承运企业
+    private String cyPhone;           //承运企业联系方式
+
+    private String fhCompanyId;       //发货企业id
+    private String fhCompany;         //发货企业
+    private String fhPhone;           //发货企业联系方式
+
+    private String shCompanyId;       //收货企业id
+    private String shCompany;         //收货企业
+    private String shPhone;           //收货企业联系方式
+
+    //=====================货物信息========================
+    private String goodsId;   //货物id
+    private String goodsName; //货物名称
+    private Integer goodsType; //货物类型
+    private String goodsTypeStr; //货物类型
+    private Integer goodsUnit; //计量单位
+    private String goodsUnitStr; //计量单位
+    private Double goodsNum;  //货物数量
+    private Double goodsVolume;  //货物体积
+    private Double goodsWeight;  //货物重量
+
+    //=====================更多信息========================
+    private Integer truckType;  //车辆类型
+    private String  truckTypeStr;  //车辆类型
+    private BigDecimal  estimateFreight;  //预估运费
+
+    //=====================路径信息========================
+    private List<KwOrderCarLandTransportPathRes> pathList; //路径信息
+
+    //=====================履约信息========================
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime perStartTime;   //履约开始时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private LocalDateTime perEndTime;     //履约结束时间
+    private String settlementCycle;          //结算周期
+    private String settlementCycleStr;          //结算周期
+    private String payment;             //支付方式
+    private String paymentStr;             //支付方式
+    private String payCompany;            //付款企业
+    private Integer billingMode;            //计费方式
+    private String billingModeStr;            //计费方式Str
+    private BigDecimal price;            //计费方式Str
+    private String gatheringCompany;    //收款单位
+    private String remark;
+
+    //履约记录
+    private BigDecimal remainNum;         //剩余待运量
+    private BigDecimal remainAllocation;  //剩余待分配量
+    private BigDecimal totalLoadAmount;   //累计装货量
+    private BigDecimal totalUnLoadAmount; //累计卸货量
+
+    //====================扣亏货==========================
+    private String rationalLoss;          //合理损耗
+    private BigDecimal dedPrice;          //扣款单价
+}

+ 170 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderCarLandTransportPathRes.java

@@ -0,0 +1,170 @@
+package com.sckw.car.entity.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @desc: 轿运路径信息
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class KwOrderCarLandTransportPathRes implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 物流订单id
+     */
+    private String orderId;
+
+    /**
+     * 地址id
+     */
+    private String pathId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /*
+     起始地-id
+    */
+    private String loadId;
+
+    /**
+     * 起始地-地址名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /*
+     起始地-id
+    */
+    private String unLoadId;
+
+    /**
+     * 目的地-地址名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输数量(托运填写量)
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 结算货物数量(完结填写量)
+     */
+    private BigDecimal settlementAmount;
+
+    /*
+    计费方式
+     */
+    private String billMode;
+
+    /*
+    计量单位
+     */
+    private Integer unit;
+    private String unitStr;
+
+    /*
+    清单id
+     */
+    //private String goodsId;
+
+    /**
+     * 状态:0正常/1锁定
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date createTime;
+
+    private Map<String, Object> goodsListMap;
+
+}

+ 24 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderDetailPath.java

@@ -0,0 +1,24 @@
+package com.sckw.car.entity.res;
+
+import lombok.Data;
+
+/**
+ * @desc: 完结订单-运单详情
+ * @author: Lt
+ * @date: 2024-04-22
+ */
+@Data
+public class KwOrderDetailPath {
+
+    /* 路径表id */
+    private String id;
+
+    /* 路径名称 */
+    private String name;
+
+    /* 订单ID */
+    private Long orderId;
+
+    /* 列表ID */
+    private Long goodsId;
+}

+ 22 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/KwOrderWaybillDetailRes.java

@@ -0,0 +1,22 @@
+package com.sckw.car.entity.res;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc: 完结订单-运单详情
+ * @author: Lt
+ * @date: 2024-04-22
+ */
+@Data
+public class KwOrderWaybillDetailRes {
+
+    private Long id;
+
+    private String cyCompany;
+
+    private String tyCompany;
+
+    private List<KwOrderDetailPath> pathList;
+}

+ 24 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/ListAndDetailDto.java

@@ -0,0 +1,24 @@
+package com.sckw.car.entity.res;
+
+import lombok.Data;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-18
+ */
+@Data
+public class ListAndDetailDto {
+
+    private String id;
+
+    private String name;
+
+    /*
+    编号
+     */
+    private String listOrderNum;
+
+
+
+}

+ 24 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/entity/res/ListDetailRes.java

@@ -0,0 +1,24 @@
+package com.sckw.car.entity.res;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-17
+ */
+@Data
+public class ListDetailRes{
+
+    /*
+    主键id
+     */
+    private String id;
+
+    private String name;
+
+
+    private List<ListAndDetailDto> list;
+}

+ 42 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/enums/LoadOrUnLoadHandlingEnum.java

@@ -0,0 +1,42 @@
+package com.sckw.car.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @desc: 装卸类型
+ * @author: lt
+ * @date: 2024/4/3 0003 10:12
+ */
+@AllArgsConstructor
+@Getter
+public enum LoadOrUnLoadHandlingEnum {
+
+    SINGLE(1, "单装卸"),
+    MORE(2, "多装卸");
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        LoadOrUnLoadHandlingEnum[] enums = LoadOrUnLoadHandlingEnum.values();
+        for (LoadOrUnLoadHandlingEnum instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<LoadOrUnLoadHandlingEnum> getSortList() {
+        LoadOrUnLoadHandlingEnum[] enums = LoadOrUnLoadHandlingEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(LoadOrUnLoadHandlingEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 25 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/enums/OrderCarDictTypeEnum.java

@@ -0,0 +1,25 @@
+package com.sckw.car.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum OrderCarDictTypeEnum {
+
+    ORDER_SOURCE("order_source", "订单来源"),
+    GOODS_TYPE("goods_type", "商品类型"),
+    GOODS_UNIT("goods_unit", "货物单位"),
+    ORDER_STATUS("order_status", "订单状态"),
+    TYPE_HANDLING("type_handling", "装卸货类型"),
+    PAY_METHOD("pay_method", "支付方式"),
+    SETTLEMENT_CYCLE("settlement_cycle", "结算周期"),
+    BILLING_MODE("billing_mode", "计费方式"),
+    ADDRESS_TYPE("address_type", "地址类型"),
+    TRUCK_TYPE("truck_type", "车辆类型"),
+
+    ;
+
+    private final String type;
+    private final String name;
+}

+ 37 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/enums/WaybillOrderStatusEnum.java

@@ -0,0 +1,37 @@
+package com.sckw.car.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Getter
+public enum WaybillOrderStatusEnum {
+    ONE(1, "草稿"),
+    TWO(2, "提交")
+    ;
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        WaybillOrderStatusEnum[] enums = WaybillOrderStatusEnum.values();
+        for (WaybillOrderStatusEnum instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<WaybillOrderStatusEnum> getSortList() {
+        WaybillOrderStatusEnum[] enums = WaybillOrderStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(WaybillOrderStatusEnum::getCode)).collect(Collectors.toList());
+    }
+}

+ 47 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/enums/WaybillStatusEnums.java

@@ -0,0 +1,47 @@
+package com.sckw.car.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @desc:
+ * @author: Lt
+ * @date: 2024-04-29
+ */
+@AllArgsConstructor
+@Getter
+public enum WaybillStatusEnums {
+    ONE(1, "待接单"),
+    TWO(2, "待出车"),
+    THREE(3, "运输中"),
+    FOUR(4, "待核验"),
+    FIVE(5, "已完成"),
+    SIX(6, "拒接单"),
+    SEVEN(7, "已驳回")
+    ;
+
+    private final Integer code;
+    private final String msg;
+
+
+    public static String getNameByCode(Integer code) {
+        WaybillStatusEnums[] enums = WaybillStatusEnums.values();
+        for (WaybillStatusEnums instance : enums) {
+            if (Objects.equals(instance.getCode(), code)) {
+                return instance.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<WaybillStatusEnums> getSortList() {
+        WaybillStatusEnums[] enums = WaybillStatusEnums.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(WaybillStatusEnums::getCode)).collect(Collectors.toList());
+    }
+}

+ 19 - 0
business-modules/business-car-transport/src/main/java/com/sckw/car/mapper/KwCarOrderMapper.java

@@ -0,0 +1,19 @@
+package com.sckw.car.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.car.entity.KwCarOrder;
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface KwCarOrderMapper extends BaseMapper<KwCarOrder> {
+
+    List<Map<String, Object>> countByStatus();
+
+    @MapKey("waybillCount")
+    int finishWaybillCount(String orderId);
+
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác