Browse Source

Merge branch 'pre-production'

# Conflicts:
#	blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java
master
pref_mail@163.com 6 months ago
parent
commit
9a1097271f
  1. 9
      blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java
  2. 3
      blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java
  3. 6
      blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java
  4. 3
      blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelNumberClient.java
  5. 4
      blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java
  6. 1
      blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadZeroListVO.java
  7. 1
      blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadZeroVO.java
  8. 4
      blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java
  9. 2
      blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml
  10. 9
      blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java
  11. 2
      blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java
  12. 2
      blade-service/logpm-basic/src/main/java/com/logpm/basic/controller/BasicMaterialController.java
  13. 2
      blade-service/logpm-basic/src/main/java/com/logpm/basic/excel/BasicMaterialExcel.java
  14. 12
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/feign/DistributionParcelListClient.java
  15. 5
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/feign/DistributionParcelNumberClient.java
  16. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java
  17. 23
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml
  18. 2
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java
  19. 8
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml
  20. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml
  21. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java
  22. 3
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java
  23. 136
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAsyncServiceImpl.java
  24. 10
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java
  25. 29
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelNumberServiceImpl.java
  26. 32
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java
  27. 5
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockupServiceImpl.java
  28. 30
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java
  29. 9
      blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml
  30. 2
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryNodePushEntity.java
  31. 2
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/FactoryNodeEnums.java
  32. 2
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeMappingEnums.java
  33. 2
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeNeedEnums.java
  34. 207
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/job/AdvanceJob.java
  35. 168
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java
  36. 8
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java
  37. 7
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java
  38. 366
      blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java
  39. 5
      blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml
  40. 20
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java
  41. 9
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java
  42. 9
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java
  43. 8
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java
  44. 112
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/NodeDataPushListener.java
  45. 58
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/OldProperties.java
  46. 10
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java
  47. 11
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java
  48. 36
      blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/OrderStatusVO.java
  49. 2
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java
  50. 3
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java
  51. 8
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java
  52. 9
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml
  53. 9
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml
  54. 9
      blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml
  55. 14
      blade-service/logpm-factory-data/logpm-factory-data-oupai/Dockerfile
  56. 89
      blade-service/logpm-factory-data/logpm-factory-data-oupai/pom.xml
  57. 20
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/FactoryDataOuPaiApplication.java
  58. 50
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/AsyncAnnotationAspect.java
  59. 48
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/RabbitAnnotationAspect.java
  60. 161
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/CustomMessageConverter.java
  61. 85
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/ExecutorConfig.java
  62. 40
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/FactoryDataOloConfiguration.java
  63. 17
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/RabbitConfig.java
  64. 130
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/dto/OrderStatusDTO.java
  65. 50
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/FactoryNodeEnums.java
  66. 62
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeMappingEnums.java
  67. 34
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeNeedEnums.java
  68. 99
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/interceptor/LocalServerLoginAccountsInterceptor.java
  69. 60
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/launcher/FactoryDataBaseLauncherServiceImpl.java
  70. 129
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/mq/NodeDataPushListener.java
  71. 20
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/FactoryDataProperties.java
  72. 45
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/OupaiProperties.java
  73. 73
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-dev.yml
  74. 47
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-prod.yml
  75. 73
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-test.yml
  76. 19
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application.yml
  77. 40
      blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/logback.xml
  78. 14
      blade-service/logpm-factory-data/logpm-factory-data-pan/Dockerfile
  79. 89
      blade-service/logpm-factory-data/logpm-factory-data-pan/pom.xml
  80. 20
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/FactoryDataPanApplication.java
  81. 50
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/AsyncAnnotationAspect.java
  82. 48
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/RabbitAnnotationAspect.java
  83. 161
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/CustomMessageConverter.java
  84. 85
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/ExecutorConfig.java
  85. 40
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/FactoryDataOloConfiguration.java
  86. 17
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/RabbitConfig.java
  87. 130
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/dto/OrderStatusDTO.java
  88. 49
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/FactoryNodeEnums.java
  89. 63
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeMappingEnums.java
  90. 33
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeNeedEnums.java
  91. 99
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/interceptor/LocalServerLoginAccountsInterceptor.java
  92. 60
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/launcher/FactoryDataBaseLauncherServiceImpl.java
  93. 146
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/mq/NodeDataPushListener.java
  94. 20
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/FactoryDataProperties.java
  95. 45
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/PanProperties.java
  96. 73
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-dev.yml
  97. 47
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-prod.yml
  98. 73
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-test.yml
  99. 19
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application.yml
  100. 40
      blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/logback.xml
  101. Some files were not shown because too many files have changed in this diff Show More

9
blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java

@ -122,6 +122,10 @@ public interface ModuleNameConstant {
* 欧派工厂数据模块
*/
String LOGPM_FACTORY_DATA_OUPAI_NAME = "logpm-factory-data-oupai" + DEVAUTH;
/**
* 皮阿诺工厂数据模块
*/
String LOGPM_FACTORY_DATA_PAN_NAME = "logpm-factory-data-pan" + DEVAUTH;
/**
* 曼好家工厂数据模块
*/
@ -134,11 +138,6 @@ public interface ModuleNameConstant {
* 诗尼曼工厂数据模块
*/
String LOGPM_FACTORY_DATA_SNIMAY_NAME = "logpm-factory-data-snimay" + DEVAUTH;
/**
* 欧派工厂数据模块
*/
String LOGPM_FACTORY_DATA_OPPEIN_NAME = "logpm-factory-data-oppein" + DEVAUTH;
/**
* 商家模块
*/

3
blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java

@ -109,6 +109,9 @@ public class OldSystemDataPushConfig {
//仁寿欧派大家居
warehourseIds.add("127");
//生活家成都仓
warehourseIds.add("71");
}

6
blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java

@ -284,5 +284,11 @@ public interface IDistributionParcelListClient {
*/
@GetMapping(API_PREFIX + "/findOrderInfoByOrderPackageCode")
Map<String,Object> findOrderInfoByOrderPackageCode(@RequestParam("orderPackageCode") String orderPackageCode,@RequestParam("warehouseId") Long warehouseId);
@PostMapping(API_PREFIX + "/deleteListByParcelListIds")
void deleteListByParcelListIds(@RequestBody List<Long> deleteParcelListIds);
@GetMapping(API_PREFIX + "/findPackageGoodsListByWaybillNoAndWarehouseId")
List<JSONObject> findPackageGoodsListByWaybillNoAndWarehouseId(@RequestParam String waybillNo, @RequestParam Long warehouseId);
}

3
blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelNumberClient.java

@ -65,4 +65,7 @@ public interface IDistributionParcelNumberClient {
@GetMapping(API_PREFIX+"/addHandleQuantity")
void addHandleQuantity(@RequestParam Long packageId, @RequestParam int num);
@GetMapping(API_PREFIX+"/updateListByPracelListIds")
void updateListByPracelListIds(@RequestParam List<Long> updateNumberIds);
}

4
blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java

@ -35,5 +35,9 @@ public class PushData implements Serializable {
* 当前仓库名称
*/
private String warehouseName;
/**
* 目的仓
*/
private String destinationWarehouse;
}

1
blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadZeroListVO.java

@ -11,6 +11,7 @@ public class LoadZeroListVO implements Serializable {
private String waybillNo;//运单号
private String orderCode;//订单号
private String consignee;//收货单位
private Integer planNum;//计划装车件数
private Integer loadingNum;//已装车件数
private Integer unloadingNum;//已卸车件数

1
blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadZeroVO.java

@ -11,6 +11,7 @@ public class UnloadZeroVO implements Serializable {
private String waybillNo;//运单号
private String orderCode;//订单号
private String consignee;//收货单位
private Integer loadingNum;//装车数量
private Integer unloadNum;//卸车件数

4
blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java

@ -65,6 +65,10 @@ public interface IWarehouseWaybillDetailClient {
@PostMapping(API_PREFIX+"/addEntity")
void addEntity(@RequestBody WarehouseWayBillDetail warehouseWayBillDetail);
@PostMapping(API_PREFIX+"/addEntityReturnId")
Long addEntityReturnId(@RequestBody WarehouseWayBillDetail warehouseWayBillDetail);
@PostMapping(API_PREFIX+"/findByWaybillIds")
List<WarehouseWayBillDetail> findByWaybillIds(@RequestBody List<Long> waybillIds);
@PostMapping(API_PREFIX+"/deleteByWaybillNo")

2
blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml

@ -497,6 +497,8 @@
<if test="param.createTime != null "> and date_format(from_unixtime(lawo.create_time),'%Y-%m-%d') LIKE date_format(CONCAT('%', #{param.createTime}, '%'),'%Y-%m-%d')</if>
<if test="param.processNumber != null and param.processNumber != ''"> and lawo.process_number LIKE CONCAT('%', #{param.processNumber}, '%')</if>
</where>
GROUP BY
lawo.id
</select>
<select id="selectAllAftersalesWorkOrderList"

9
blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesAbnormalRecordServiceImpl.java

@ -175,10 +175,7 @@ public class AftersalesAbnormalRecordServiceImpl extends BaseServiceImpl<Aftersa
Long waybillId = null;
Integer dealType = abnormalRecordDTO.getDealType();
List<ZeroPackageDTO> zeroPackageDTOS = abnormalRecordDTO.getZeroPackageDTOS();
if(CollUtil.isEmpty(zeroPackageDTOS)){
log.warn("################dealAbnormal: 品类信息不存在");
return R.fail(405,"品类信息不存在");
}
Integer num = abnormalRecordEntity.getNum();
Long carsLoadScanId = abnormalRecordEntity.getAssociationId();
TrunklineCarsLoadScanEntity carsLoadScanEntity = trunklineCarsLoadScanClient.findEntityById(carsLoadScanId);
@ -203,6 +200,10 @@ public class AftersalesAbnormalRecordServiceImpl extends BaseServiceImpl<Aftersa
abnormalRecordEntity.setRemark("差异件数退回原仓");
}else if(dealType.equals(6)){
List<PackageData> packageDataList = new ArrayList<>();
if(CollUtil.isEmpty(zeroPackageDTOS)){
log.warn("################dealAbnormal: 品类信息不存在");
return R.fail(405,"品类信息不存在");
}
//入库本仓
Integer enterNum = abnormalRecordDTO.getNum();
//把scanZeroDetailEntityList转化成以packageId为key的map

2
blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/service/impl/AftersalesWorkOrderServiceImpl.java

@ -990,8 +990,6 @@ public class AftersalesWorkOrderServiceImpl extends BaseServiceImpl<AftersalesWo
} else if (ObjectUtils.isNull(workOrderStatus)) {
aftersalesWorkOrder.put("customerIdentification", "1");
}
}
private void updateWorkOrderForSales(Map<String, Object> aftersalesWorkOrder, Object workOrderStatus) {

2
blade-service/logpm-basic/src/main/java/com/logpm/basic/controller/BasicMaterialController.java

@ -243,7 +243,7 @@ public class BasicMaterialController extends BladeController {
basicMaterialExcel.setAltitude("640");
basicMaterialExcel.setVolume("1.489792");
basicMaterialExcel.setLogpmUnit("1");
basicMaterialExcel.setPackageNum("3");
basicMaterialExcel.setPackageNum(3);
basicMaterialExcel.setWeight("2.33");
list.add(basicMaterialExcel);
ExcelUtil.export(response, "物料基础信息数据模板" + DateUtil.time(), "物料基础信息数据模板表", list, BasicMaterialExcel.class);

2
blade-service/logpm-basic/src/main/java/com/logpm/basic/excel/BasicMaterialExcel.java

@ -176,6 +176,6 @@ public class BasicMaterialExcel implements Serializable {
@ColumnWidth(20)
@ExcelProperty("包装数量")
private String packageNum;
private Integer packageNum;
}

12
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/feign/DistributionParcelListClient.java

@ -585,4 +585,16 @@ public class DistributionParcelListClient implements IDistributionParcelListClie
public Map<String, Object> findOrderInfoByOrderPackageCode(String orderPackageCode, Long warehouseId) {
return distributionParcelListService.findOrderInfoByOrderPackageCode(orderPackageCode,warehouseId);
}
@Override
public void deleteListByParcelListIds(List<Long> deleteParcelListIds) {
distributionParcelListService.deleteListByParcelListIds(deleteParcelListIds);
distributionParcelNumberService.deleteListByParcelListIds(deleteParcelListIds);
}
@Override
public List<JSONObject> findPackageGoodsListByWaybillNoAndWarehouseId(String waybillNo, Long warehouseId) {
return distributionParcelListService.findPackageGoodsListByWaybillNoAndWarehouseId(waybillNo,warehouseId);
}
}

5
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/feign/DistributionParcelNumberClient.java

@ -82,4 +82,9 @@ public class DistributionParcelNumberClient implements IDistributionParcelNumber
distributionParcelNumberService.addZeroQuantity(packageId, num);
}
@Override
public void updateListByPracelListIds(List<Long> updateNumberIds) {
distributionParcelNumberService.updateListByPracelListIds(updateNumberIds);
}
}

4
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.java

@ -313,4 +313,8 @@ public interface DistributionParcelListMapper extends BaseMapper<DistributionPar
void clearWaybillInfoByParceListIds(@Param("parceListIds") List<Long> parceListIds);
Map<String, Object> findOrderInfoByOrderPackageCode(@Param("orderPackageCode") String orderPackageCode, @Param("warehouseId") Long warehouseId);
void deleteListByParcelListIds(@Param("parceListIds") List<Long> deleteParcelListIds);
List<JSONObject> findPackageGoodsListByWaybillNoAndWarehouseId(@Param("waybillNo") String waybillNo, @Param("warehouseId") Long warehouseId);
}

23
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelListMapper.xml

@ -1274,7 +1274,9 @@
AND ldpl.order_package_loading_status = 10
AND ldpl.conditions = 1
AND order_package_status IN (10,20)
and ldpl.stock_article_id = #{param.orderId} and ldpl.warehouse_id = #{warehouseId}
and ldpl.stock_article_id = #{param.orderId}
and ldpl.warehouse_id = #{warehouseId}
and ldpl.is_transfer = 0
<if test="param.waybillNumber != null and param.waybillNumber != ''">
and ldpl.waybill_number like concat('%',#{param.waybillNumber},'%')
</if>
@ -1962,4 +1964,23 @@
</update>
<delete id="deleteListByParcelListIds">
delete from logpm_distribution_parcel_list
where id in
<foreach collection="parceListIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
<select id="findPackageGoodsListByWaybillNoAndWarehouseId" resultType="com.alibaba.fastjson.JSONObject">
select ldpl.id packageId,
lwwd.product_id goodsId,
lwwd.product_name goodsName,
ldpl.quantity stockNum
from logpm_distribution_parcel_list ldpl
left join logpm_warehouse_waybill_detail lwwd on lwwd.id = ldpl.advance_id
where lwwd.waybill_no = #{waybillNo}
and ldpl.warehouse_id = #{warehouseId}
</select>
</mapper>

2
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java

@ -76,4 +76,6 @@ public interface DistributionParcelNumberMapper extends BaseMapper<DistributionP
Integer augmentSignForNum(@Param("packageId") Long id,@Param("stockArticleId") Long stockArticleId,@Param("quantity") Integer quantity);
void addZeroQuantity(@Param("packageId") Long packageId, @Param("num") int num);
void deleteListByParcelListIds(@Param("parceListIds") List<Long> deleteParcelListIds);
}

8
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml

@ -86,4 +86,12 @@
parcel_list_id = #{packageId}
</update>
<delete id="deleteListByParcelListIds">
delete from logpm_distribution_parcel_number
where parcel_list_id in
<foreach collection="parceListIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
</mapper>

4
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml

@ -1038,7 +1038,7 @@
ldbls.scan_user AS driverName,
ldbl.pick_up_plate AS carNumber,
ldbl.update_time AS deliveryTime,
ldbl.update_time AS signTime,
ldbls.create_time AS signTime,
ldbls.scan_user AS loadingUser,
ldbls.scan_user AS signUser,
ldbl.pickup_batch AS signOrderCode
@ -1061,7 +1061,7 @@
ldbls.scan_user AS driverName,
ldbl.pick_up_plate AS carNumber,
ldbl.update_time AS deliveryTime,
ldbl.update_time AS signTime,
ldbls.create_time AS signTime,
ldbls.scan_user AS loadingUser,
ldbls.scan_user AS signUser,
ldbl.pickup_batch AS signOrderCode

4
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java

@ -286,4 +286,8 @@ public interface IDistributionParcelListService extends BaseService<Distribution
Map<String, Object> findOrderInfoByOrderPackageCode(String orderPackageCode, Long warehouseId);
void updateEntityByOpenOrderByAdvanceIds(UpdateOrderDTO updateOrderDTO);
void deleteListByParcelListIds(List<Long> deleteParcelListIds);
List<JSONObject> findPackageGoodsListByWaybillNoAndWarehouseId(String waybillNo, Long warehouseId);
}

3
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java

@ -81,4 +81,7 @@ public interface IDistributionParcelNumberService extends BaseService<Distributi
void addZeroQuantity(Long packageId, int num);
void deleteListByParcelListIds(List<Long> deleteParcelListIds);
void updateListByPracelListIds(List<Long> updateNumberIds);
}

136
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAsyncServiceImpl.java

@ -22,10 +22,61 @@ import com.logpm.distribution.dto.PushInstallDTO;
import com.logpm.distribution.dto.app.DistrilbutionloadingscanDTO;
import com.logpm.distribution.dto.app.StockupDTO;
import com.logpm.distribution.dto.app.StockupZeroDTO;
import com.logpm.distribution.entity.*;
import com.logpm.distribution.mapper.*;
import com.logpm.distribution.service.*;
import com.logpm.distribution.vo.*;
import com.logpm.distribution.entity.DisStockListDetailEntity;
import com.logpm.distribution.entity.DistributionBillLadingScanEntity;
import com.logpm.distribution.entity.DistributionDeliveryDetailsEntity;
import com.logpm.distribution.entity.DistributionDeliveryListEntity;
import com.logpm.distribution.entity.DistributionLoadscanEntity;
import com.logpm.distribution.entity.DistributionLoadscaninvnEntity;
import com.logpm.distribution.entity.DistributionParcelListEntity;
import com.logpm.distribution.entity.DistributionParcelNumberEntity;
import com.logpm.distribution.entity.DistributionPrintEntity;
import com.logpm.distribution.entity.DistributionReservationEntity;
import com.logpm.distribution.entity.DistributionReservationPackageEntity;
import com.logpm.distribution.entity.DistributionReservationStockarticleEntity;
import com.logpm.distribution.entity.DistributionReservationStocklistEntity;
import com.logpm.distribution.entity.DistributionReservationZeroPackageEntity;
import com.logpm.distribution.entity.DistributionSignforEntity;
import com.logpm.distribution.entity.DistributionStockArticleEntity;
import com.logpm.distribution.entity.DistributionStockEntity;
import com.logpm.distribution.entity.DistributionStockListEntity;
import com.logpm.distribution.entity.DistributionStockupEntity;
import com.logpm.distribution.entity.DistributionStockupInfoEntity;
import com.logpm.distribution.entity.DistrilbutionBillLadingEntity;
import com.logpm.distribution.entity.DistrilbutionBillPackageEntity;
import com.logpm.distribution.entity.DistrilbutionBillStockEntity;
import com.logpm.distribution.mapper.DistributionBillLadingScanMapper;
import com.logpm.distribution.mapper.DistributionDeliveryDetailsMapper;
import com.logpm.distribution.mapper.DistributionDeliveryListMapper;
import com.logpm.distribution.mapper.DistributionLoadscanMapper;
import com.logpm.distribution.mapper.DistributionLoadscaninvnMapper;
import com.logpm.distribution.mapper.DistributionParcelListMapper;
import com.logpm.distribution.mapper.DistributionReservationMapper;
import com.logpm.distribution.mapper.DistributionReservationPackageMapper;
import com.logpm.distribution.mapper.DistributionReservationStockarticleMapper;
import com.logpm.distribution.mapper.DistributionReservationStocklistMapper;
import com.logpm.distribution.mapper.DistributionSignforMapper;
import com.logpm.distribution.mapper.DistributionStockListMapper;
import com.logpm.distribution.mapper.DistributionStockMapper;
import com.logpm.distribution.mapper.DistributionStockupInfoMapper;
import com.logpm.distribution.mapper.DistributionStockupMapper;
import com.logpm.distribution.mapper.DistrilbutionBillLadingMapper;
import com.logpm.distribution.service.IDisStockListDetailService;
import com.logpm.distribution.service.IDistributionAsyncService;
import com.logpm.distribution.service.IDistributionDeliveryDetailsService;
import com.logpm.distribution.service.IDistributionParcelNumberService;
import com.logpm.distribution.service.IDistributionPrintService;
import com.logpm.distribution.service.IDistributionReservationStockarticleService;
import com.logpm.distribution.service.IDistributionReservationStocklistService;
import com.logpm.distribution.service.IDistributionReservationZeroPackageService;
import com.logpm.distribution.service.IDistributionStockArticleService;
import com.logpm.distribution.service.IDistrilbutionBillPackageService;
import com.logpm.distribution.service.IDistrilbutionBillStockService;
import com.logpm.distribution.vo.DistributionParcelNumberVO;
import com.logpm.distribution.vo.DistributionSignPrintVO;
import com.logpm.distribution.vo.DistributionStockPackageVO;
import com.logpm.distribution.vo.DistributionStockupSelfVO;
import com.logpm.distribution.vo.DistrilbutionBillStockVO;
import com.logpm.factory.comfac.dto.OrderStatusDTO;
import com.logpm.factory.mt.dto.MtReceiveContentDTO;
import com.logpm.factory.mt.dto.MtReceiveDTO;
@ -63,7 +114,15 @@ import org.springblade.common.constant.orderpackage.OrderPackageLoadingStatusCon
import org.springblade.common.constant.orderpackage.OrderPackageReservationStatusConstant;
import org.springblade.common.constant.orderpackage.OrderPackageStatusConstant;
import org.springblade.common.constant.orderpackage.OrderPackageStockupStatusConstant;
import org.springblade.common.constant.reservation.*;
import org.springblade.common.constant.reservation.ReservationInventoryLoadingStatusConstant;
import org.springblade.common.constant.reservation.ReservationInventorySigningStatusConstant;
import org.springblade.common.constant.reservation.ReservationInventoryStatusConstant;
import org.springblade.common.constant.reservation.ReservationLoadingStatusConstant;
import org.springblade.common.constant.reservation.ReservationOrderStatusConstant;
import org.springblade.common.constant.reservation.ReservationPackageStatusConstant;
import org.springblade.common.constant.reservation.ReservationSigningStatusConstant;
import org.springblade.common.constant.reservation.ReservationStatusConstant;
import org.springblade.common.constant.reservation.ReservationStockupStatusConstant;
import org.springblade.common.constant.signing.SignforStatusConstant;
import org.springblade.common.constant.stockup.StockupStatusConstant;
import org.springblade.common.constant.stockup.StockupTypeConstant;
@ -78,7 +137,15 @@ import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@ -1459,7 +1526,7 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService {
@Transactional(rollbackFor = Exception.class)
@LogpmAsync("asyncExecutor")
public void sendReviewFactory(Long signingId, String warehouseName, Long warehouseId) {
String brands = "梦天,欧派,志邦,皮阿诺,我乐";//可追加
String brands = "梦天,欧派,志邦,皮阿诺,我乐,索菲亚";//可追加
log.info(">>>>>>>>>>> 签收推送 对象 {}", "signingId:=" + signingId + "warehouseName:=" + warehouseName + "warehouseId:=" + warehouseId);
//查询签收信息
DistributionSignforEntity distributionSignforEntity = distributionSignforMapper.selectById(signingId);
@ -1559,7 +1626,32 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService {
log.error("推送失败");
}
}
if (Func.isNotEmpty(brand.get("索菲亚"))) {
List<MtReceiveContentDTO> zb = brand.get("索菲亚");
List<Object> contents = new ArrayList<>();
if (CollUtil.isNotEmpty(zb)) {
for (MtReceiveContentDTO mtReceiveContentDTO : zb) {
PushData pushData = PushData.builder()
.packageCode(mtReceiveContentDTO.getUnitNo())
.orderCode(mtReceiveContentDTO.getOrderCode())
.warehouseName(warehouseName)
.waybillNumber(mtReceiveContentDTO.getWaybillNumber()).build();
contents.add(pushData);
}
}
try {
NodePushMsg msg = new NodePushMsg();
msg.setNode(WorkNodeEnums.CLERK_REVIEW);
msg.setBrand(BrandEnums.SFY);
msg.setOperator(distributionSignforEntity.getDeliveryDriverName());
msg.setOperatorTime(new Date());
msg.setContent(contents);
log.info("推送工厂数据:{}", JSONUtil.toJsonStr(msg));
factoryDataMessageSender.sendNodeDataByBrand(msg);
}catch (Exception e){
log.error("推送失败");
}
}
if (Func.isNotEmpty(brand.get("欧派"))) {
List<MtReceiveContentDTO> oupai = brand.get("欧派");
for (MtReceiveContentDTO mtReceiveContentDTO : oupai) {
@ -1607,9 +1699,31 @@ public class DistributionAsyncServiceImpl implements IDistributionAsyncService {
orderStatusDTO.setStatus("7");
orderStatusDTO.setOperationTime(DateUtil.now());
orderStatusDTO.setCurrentWarehouse(warehouseId.toString());
Map<String, Object> map = new HashMap<>();
map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO));
rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map);
// Map<String, Object> map = new HashMap<>();
// map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO));
// rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map);
JSONObject main = new JSONObject();
main.put("distributionContactId", mtReceiveContentDTO.getInvoiceOrderCode());
main.put("trainNumber", distributionSignforEntity.getTrainNumber());
main.put("waybillNumber", mtReceiveContentDTO.getWaybillNumber());
NodePushMsg nodePushMsg = NodePushMsg.builder()
.operator(AuthUtil.getNickName())
.operatorTime(new Date())
.warehouse(warehouseName)
// .startWarehouse(ObjectUtil.isNotEmpty(parcelListEntity) ? parcelListEntity.getSendWarehouseName():"")
// .endWarehouse(ObjectUtil.isNotEmpty(parcelListEntity) ? parcelListEntity.getAcceptWarehouseName():"")
// .address("在【" + warehouseName + "】入库")
.brand(BrandEnums.getByValue("皮阿诺"))
.main(JSONUtil.toJsonStr(main))
.node(WorkNodeEnums.CLERK_REVIEW)
.content(Collections.singletonList(PushData.builder()
.packageCode(mtReceiveContentDTO.getUnitNo())
.warehouseName(warehouseName)
.destinationWarehouse(mtReceiveContentDTO.getWarehouse())
.orderCode(mtReceiveContentDTO.getOrderCode())
.build()))
.build();
factoryDataMessageSender.sendNodeDataByBrand(nodePushMsg);
} catch (Exception e) {
log.error("入库推送失败", e);
}

10
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java

@ -1520,4 +1520,14 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl<Distribut
distributionStockArticleService.updateBatchById(stockArticleEntities);
}
}
@Override
public void deleteListByParcelListIds(List<Long> deleteParcelListIds) {
baseMapper.deleteListByParcelListIds(deleteParcelListIds);
}
@Override
public List<JSONObject> findPackageGoodsListByWaybillNoAndWarehouseId(String waybillNo, Long warehouseId) {
return baseMapper.findPackageGoodsListByWaybillNoAndWarehouseId(waybillNo,warehouseId);
}
}

29
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelNumberServiceImpl.java

@ -17,6 +17,7 @@
package com.logpm.distribution.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.distribution.dto.DistributionParcelNumberDTO;
@ -38,7 +39,10 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* 订单零担包件数量记录 服务实现类
@ -178,4 +182,29 @@ public class DistributionParcelNumberServiceImpl extends BaseServiceImpl<Distrib
baseMapper.addZeroQuantity(packageId,num);
}
@Override
public void deleteListByParcelListIds(List<Long> deleteParcelListIds) {
baseMapper.deleteListByParcelListIds(deleteParcelListIds);
}
@Override
public void updateListByPracelListIds(List<Long> updateNumberIds) {
List<DistributionParcelListEntity> distributionParcelListEntities = distributionParcelListService.listByIds(updateNumberIds);
//转化成以id为key的Map
Map<Long, DistributionParcelListEntity> parcelListMap = distributionParcelListEntities.stream().collect(Collectors.toMap(DistributionParcelListEntity::getId, parcelListEntity -> parcelListEntity));
QueryWrapper<DistributionParcelNumberEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.in("parcel_list_id", updateNumberIds);
List<DistributionParcelNumberEntity> distributionParcelNumberEntities = baseMapper.selectList(queryWrapper);
distributionParcelNumberEntities.forEach(p->{
Long parcelListId = p.getParcelListId();
DistributionParcelListEntity parcelList = parcelListMap.get(parcelListId);
if(!Objects.isNull(parcelList)){
p.setQuantity(parcelList.getQuantity());
p.setHandQuantity(parcelList.getQuantity());
}
});
updateBatchById(distributionParcelNumberEntities);
}
}

32
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java

@ -4839,17 +4839,22 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
Boolean driver = distributionDeliveryListService.judgeIsDriver(user);
String positioning = distributionSignfor.getPositioning();
GAddressVo add = GaoDeApiUtil.getAdd(positioning);
DistributionDeliveryListEntity deliveryListEntity = distributionDeliveryListService.getById(distributionSignforEntity.getDeliveryId());
DistributionReservationEntity reservationEntity = distributionReservationService.getById(distributionSignforEntity.getReservationId());
DistributionPositioningEntity distributionPositioning = createdDistributionPositioningEntity(deliveryListEntity, reservationEntity, AuthUtil.getUser(), driver, positioning);
if (Objects.isNull(distributionPositioning)) {
return Resp.scanFail("当前操作由司机完成", "当前操作由司机完成");
}
//进行打卡信息保存
distributionPositioningService.save(distributionPositioning);
NodeFanoutMsg<ConsigneeArriveVO> nodeFanoutMsg = buildConsigneeArriveVO(deliveryListEntity, reservationEntity, add, user);
iDistributionNodeWorkService.carArrived(nodeFanoutMsg, user);
return Resp.scanSuccess("打卡成功", "打卡成功");
if (!Objects.isNull(add)){
DistributionDeliveryListEntity deliveryListEntity = distributionDeliveryListService.getById(distributionSignforEntity.getDeliveryId());
DistributionReservationEntity reservationEntity = distributionReservationService.getById(distributionSignforEntity.getReservationId());
DistributionPositioningEntity distributionPositioning = createdDistributionPositioningEntity(deliveryListEntity, reservationEntity, AuthUtil.getUser(), driver, positioning);
if (Objects.isNull(distributionPositioning)) {
return Resp.scanFail("当前操作由司机完成", "当前操作由司机完成");
}
//进行打卡信息保存
distributionPositioningService.save(distributionPositioning);
NodeFanoutMsg<ConsigneeArriveVO> nodeFanoutMsg = buildConsigneeArriveVO(deliveryListEntity, reservationEntity, add, user);
iDistributionNodeWorkService.carArrived(nodeFanoutMsg, user);
return Resp.scanSuccess("打卡成功", "打卡成功");
}else{
return Resp.scanSuccess("打卡失败", "打卡失败,请重试");
}
}
private DistributionPositioningEntity createdDistributionPositioningEntity(DistributionDeliveryListEntity deliveryListEntity,
@ -7938,7 +7943,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
warehouseUpdownTypeClient.downPackageOrDelTray(distributionLoadscanEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "签收下架解托");
}
pushList.add(distributionLoadscanEntity);
packageLockIds.add(distributionLoadscanEntity.getPackageId());
packageLockIds.add(parcelListEntity.getId());
parcelListEntity.setOrderPackageLoadingStatus(OrderPackageLoadingStatusConstant.yizhuangche.getValue());
parcelListEntity.setOrderPackageStatus(OrderPackageStatusConstant.yiqianshou.getValue());
distributionParcelListService.updateById(parcelListEntity);
@ -9140,10 +9145,9 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
distributionLoadscanEntity.setSigningUserId(user.getUserId());
distributionLoadscanEntity.setSignforType(LoadScanSigningTypeStatusConstant.sijiqianshou.getValue());
distributionLoadscanEntity.setSignforState(LoadScanSigningStatusConstant.weiqianshou.getValue());
if (loadscanEntity.getLoadedNub().equals(loadscanEntity.getReceivedQuantity())) {
if (Objects.equals(loadscanEntity.getLoadedNub(),distributionLoadscanEntity.getReceivedQuantity())) {
distributionLoadscanEntity.setSignforState(LoadScanSigningStatusConstant.yiqianshou.getValue());
}
return distributionLoadscanEntity;
}

5
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockupServiceImpl.java

@ -59,6 +59,7 @@ import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springblade.common.constant.CodeDesEnum;
import org.springblade.common.constant.DictBizConstant;
import org.springblade.common.constant.Inventory.InventoryStockTypeStatusConstant;
import org.springblade.common.constant.RabbitConstant;
import org.springblade.common.constant.WorkNodeEnums;
import org.springblade.common.constant.common.IsOrNoConstant;
@ -2389,11 +2390,12 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl<Distribution
//绑定码
disStockListDetail.setStockPackageCode(stockupDTO.getPacketBarCode());
disStockListDetail.setStockStatus(OrderPackageStockupStatusConstant.yibeihu.getValue());
disStockListDetail.setStockType(InventoryStockTypeStatusConstant.caiji.getValue());
disStockListDetail.setId(list1.get(0).getId());
break;
case 2:
//生成的扫描的包条码
//查询有没有生成的数据
DisStockOrdercodeRecoEntity one1 = disStockOrdercodeRecoService.getOne(Wrappers.<DisStockOrdercodeRecoEntity>query().lambda()
.eq(DisStockOrdercodeRecoEntity::getCode, stockupDTO.getPacketBarCode())
@ -2404,6 +2406,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl<Distribution
disStockListDetail.setStockPackageCode(stockupDTO.getPacketBarCode());
disStockListDetail.setStockStatus(OrderPackageStockupStatusConstant.yibeihu.getValue());
disStockListDetail.setId(list1.get(0).getId());
disStockListDetail.setStockType(InventoryStockTypeStatusConstant.shengcheng.getValue());
//修改包件码状态
ordercodeRecoEntity.setCodeStatus("1");
ordercodeRecoEntity.setId(one1.getId());

30
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java

@ -3451,7 +3451,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
return Resp.scanFail("已完成!", "已完成!!");
}
//修改库存品签收
distributionAsyncService.getInventorySelfPickup(distrilbutionBillLadingInventoryAppVO.getStockArticleId());
// distributionAsyncService.getInventorySelfPickup(distrilbutionBillLadingInventoryAppVO.getStockArticleId());
}
BladeUser user = AuthUtil.getUser();
@ -3924,10 +3924,10 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
Integer integer = this.selectBillLadingPlanNum(Long.parseLong(s));
if (Func.isNotEmpty(ladingScanEntities)) {
int sum = ladingScanEntities.stream().filter(f -> "2".equals(f.getMaterialType())).mapToInt(DistributionBillLadingScanEntity::getQuantity).sum();
if (integer != sum) {
//存在资源释放操作
releaseBillLadingResource(Long.parseLong(s), myCurrentWarehouse, distrilbutionBillLadingEntity.getPickupBatch());
}
// if (integer != sum) {
// //存在资源释放操作
// releaseBillLadingResource(Long.parseLong(s), myCurrentWarehouse, distrilbutionBillLadingEntity.getPickupBatch());
// }
try {
if (sum > 0) {
parcelListIds.addAll(ladingScanEntities.stream().map(DistributionBillLadingScanEntity::getParcelListId).collect(Collectors.toSet()));
@ -4043,7 +4043,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
NodeFanoutMsg<PickUpByReCheckVO> nodeFanoutMsg = buildPickUpByReCheckVO(billLadingEntity, ladingScanEntities, myCurrentWarehouse);
iDistributionNodeWorkService.billofladingSignforCheck(nodeFanoutMsg, AuthUtil.getUser());
//推送该自提单的包件运单信息
}
// 回传工厂数据
// sendFactory(myCurrentWarehouse, parcelListIds);
@ -4051,6 +4051,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
return R.success("操作成功");
}
private void handleDExamineDistributionPlanLog(DistrilbutionBillLadingEntity billLadingEntity, BladeUser user, BasicdataWarehouseEntity myCurrentWarehouse,Integer num) {
String planContent = user.getNickName() + "在" + myCurrentWarehouse.getName()
+ "完成自提计划;自提计划编号:" + billLadingEntity.getPickupBatch()
@ -4117,12 +4118,13 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
}
} else {
recoveryReservationZeroPackageEntities.addAll(reservationZeroPackageEntities);
reservationZeroPackageEntities.stream().forEach(rz -> {
rz.setZeroPackageStatus(ReservationPackageStatusConstant.quxiao.getValue());
rz.setQuantity(0);
});
//进行整个品类释放
updateReservationZeroPackageEntities.addAll(reservationZeroPackageEntities);
for (DistributionReservationZeroPackageEntity reservationZeroPackageEntity : reservationZeroPackageEntities) {
DistributionReservationZeroPackageEntity cancelEntity = new DistributionReservationZeroPackageEntity();
cancelEntity.setId(reservationZeroPackageEntity.getId());
cancelEntity.setQuantity(0);
cancelEntity.setZeroPackageStatus(ReservationPackageStatusConstant.quxiao.getValue());
updateReservationZeroPackageEntities.add(cancelEntity);
}
}
} else {
return 0;
@ -4133,7 +4135,8 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
DistributionParcelNumberEntity distributionParcelNumberEntity = distributionParcelNumberService.getOne(Wrappers.<DistributionParcelNumberEntity>query().lambda()
.eq(DistributionParcelNumberEntity::getParcelListId, recoveryReservationZeroPackageEntity.getParcelListId())
);
distributionParcelNumberEntity.setDeliveryQuantity(distributionParcelNumberEntity.getDeliveryQuantity() - recoveryReservationZeroPackageEntity.getQuantity());
int i = distributionParcelNumberEntity.getDeliveryQuantity() - recoveryReservationZeroPackageEntity.getQuantity();
distributionParcelNumberEntity.setDeliveryQuantity(i);
distributionParcelNumberService.updateById(distributionParcelNumberEntity);
distributionParcelListService.maintenanceZerpPackageInfo(recoveryReservationZeroPackageEntity.getParcelListId());
}
@ -4659,6 +4662,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
billLadingScan.setBillLadingId(billLadingAppDTO.getBillLadingId());
billLadingScan.setMaterialType("3");
billLadingScan.setQuantity(i.getQuantity());
billLadingScan.setWarehouseId(myCurrentWarehouse.getId());
billLadingScanList.add(billLadingScan);
//维护零担品类的出库数量

9
blade-service/logpm-factory-data/logpm-factory-data-base/src/main/resources/application-dev.yml

@ -59,15 +59,6 @@ spring:
url: ${blade.datasource.factorydata-base.master.url}
username: ${blade.datasource.factorydata-base.master.username}
password: ${blade.datasource.factorydata-base.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-base.627683.url}
username: ${blade.datasource.factorydata-base.627683.username}
password: ${blade.datasource.factorydata-base.627683.password}
blade:
data-scope:
enabled: false

2
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/entity/FactoryNodePushEntity.java

@ -18,7 +18,7 @@ import org.springblade.core.mp.base.BaseEntity;
**/
@Builder
@Data
@TableName("jinpai_factory_node_push")
@TableName("jp_factory_node_push")
@ApiModel(value = "节点数据推送成功数据", description = "节点数据推送成功数据")
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor

2
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/FactoryNodeEnums.java

@ -21,7 +21,7 @@ public enum FactoryNodeEnums {
/**
* 包件入库
*/
UNLOAD_INCOMING_WAREHOUSE(105010,"包件入库", 1)
END_WAREHOUSE_UNLOADING(105010,"包件入库", 1)
;
private Integer code;

2
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeMappingEnums.java

@ -20,7 +20,7 @@ public enum NodeMappingEnums {
/**
* 包件入库
*/
UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1),
END_WAREHOUSE_UNLOADING(FactoryNodeEnums.END_WAREHOUSE_UNLOADING, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1),
;
/**

2
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/enums/NodeNeedEnums.java

@ -20,7 +20,7 @@ public enum NodeNeedEnums implements Serializable {
/**
* 包件入库
*/
UNLOAD_INCOMING_WAREHOUSE(105010,"包件入库")
END_WAREHOUSE_UNLOADING(105040, "末端仓卸车确认"),
;
private Integer code;

207
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/job/AdvanceJob.java

@ -1,42 +1,22 @@
package com.logpm.factorydata.jinpai.job;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.factorydata.base.feign.IFactoryDataBaseClient;
import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO;
import com.logpm.factorydata.enums.BrandEnums;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity;
import com.logpm.factorydata.jinpai.entity.OrderInfoEntity;
import com.logpm.factorydata.jinpai.entity.PackageInfoEntity;
import com.logpm.factorydata.jinpai.enums.BusSourceEnums;
import com.logpm.factorydata.jinpai.service.DeliveryNoteService;
import com.logpm.factorydata.jinpai.service.OrderInfoService;
import com.logpm.factorydata.jinpai.service.PackageInfoService;
import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO;
import com.logpm.factorydata.vo.SendMsg;
import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity;
import com.logpm.trunkline.entity.TrunklineAdvanceEntity;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.annotations.LogpmAsync;
import org.springblade.common.constant.HttpConstants;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.common.model.IDict;
import org.springblade.core.tool.api.R;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@ -57,9 +37,6 @@ public class AdvanceJob {
private final OrderInfoService orderInfoService;
private final PackageInfoService packageInfoService;
private final IFactoryDataBaseClient baseClient;
private final IFactoryDataClient factoryDataClient;
/**
* 定时扫描数据库保存所有齐套未推送的数据
*
@ -99,7 +76,7 @@ public class AdvanceJob {
}
}
// 组装数据,然后生成暂存单
buildAdvance(packageInfoEntityMap, deliveryNoteEntityMap, orderInfoEntityMap);
deliveryNoteService.buildAdvancePull(packageInfoEntityMap, deliveryNoteEntityMap, orderInfoEntityMap);
// 修改包件的发送状态 TODO 后面修改为暂存单消费完成之后回调更新状态
List<PackageInfoEntity> updatePackageList = new ArrayList<>();
for (PackageInfoEntity entity : list) {
@ -112,189 +89,7 @@ public class AdvanceJob {
packageInfoService.updateBatchById(updatePackageList);
}
}
return ReturnT.SUCCESS;
}
@LogpmAsync("asyncExecutor")
public void buildAdvance(Map<String, List<PackageInfoEntity>> packageMap, Map<String, DeliveryNoteEntity> deliveryMap,
Map<String, OrderInfoEntity> orderInfoMap) {
// 新起线程构建暂存单发送mq
// 获取非干线仓库映射表数据
Map<String, ThirdPlWarehouseMappingVO> thirdPlWarehouseMapping = new HashMap<>();
List<ThirdPlWarehouseMappingVO> warehouseMappingVOList = deliveryNoteService.getThirdPlWarehouseMappingVO();
if (CollUtil.isNotEmpty(warehouseMappingVOList)) {
warehouseMappingVOList.forEach(vo -> {
thirdPlWarehouseMapping.put(vo.getArriveOrgName(), vo);
});
}
Map<String, FactoryWarehouseBindVO> warehouseBindVOMap = new HashMap<>();
if (CollUtil.isNotEmpty(deliveryMap)) {
for (Map.Entry<String, DeliveryNoteEntity> entry : deliveryMap.entrySet()) {
DeliveryNoteEntity deliveryNoteEntity = entry.getValue();
if (ObjectUtil.isNotEmpty(deliveryNoteEntity)) {
// 获取工厂基地绑定的始发仓信息
String textByCode = IDict.getTextByCode(BusSourceEnums.class, deliveryNoteEntity.getBusSource());
R<FactoryWarehouseBindVO> warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), textByCode);
if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) {
FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData();
if (ObjectUtil.isNotNull(data)) {
warehouseBindVOMap.put(deliveryNoteEntity.getBusSource(), data);
}
}
}
}
}
// 组装暂存单数据
List<JSONObject> advances = new ArrayList<>();
for (Map.Entry<String, List<PackageInfoEntity>> stringListEntry : packageMap.entrySet()) {
String key = stringListEntry.getKey();
OrderInfoEntity orderInfo = orderInfoMap.get(key);
if (ObjectUtil.isEmpty(orderInfo)) {
log.error("订单明细信息不存在,dd单号:{}", key);
continue;
}
DeliveryNoteEntity order = deliveryMap.get(orderInfo.getOrderId());
if (ObjectUtil.isEmpty(order)) {
log.error("订单信息不存在,订单号:{}", orderInfo.getOrderId());
continue;
}
List<PackageInfoEntity> value = stringListEntry.getValue();
TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity();
// 承运商是汇通的数据 走干线,不是汇通的直接走仓配。
String carrierName = order.getCarrierName();
Long warehouseId = null;
String warehouseName = "";
String tenantId = "";
if (ObjectUtil.equal(carrierName, "广州市汇通运输有限公司")) {
if (ObjectUtil.isNotNull(warehouseBindVOMap.get(order.getBusSource()))) {
warehouseId = warehouseBindVOMap.get(order.getBusSource()).getWarehouseId();
warehouseName = warehouseBindVOMap.get(order.getBusSource()).getWarehouseName();
tenantId = warehouseBindVOMap.get(order.getBusSource()).getTenantId();
}
} else {
if (ObjectUtil.isNotNull(thirdPlWarehouseMapping.get(order.getArriveOrgName()))) {
if (ObjectUtil.isNotEmpty(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId())) {
warehouseId = Convert.toLong(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId());
}
warehouseName = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseName();
tenantId = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getTenantId();
}
}
advanceEntity.setTenantId(tenantId);
advanceEntity.setStatus(0);
advanceEntity.setIsDeleted(0);
advanceEntity.setHasPackage(CollUtil.isNotEmpty(value) ? 1 : 0);
advanceEntity.setOrderType(orderInfo.getYjOrderType());
advanceEntity.setBrand(BrandEnums.JP.getValue());
advanceEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceEntity.setArea("");
advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0);
advanceEntity.setPackName("");
advanceEntity.setPackCode("");
advanceEntity.setWarehouseId(warehouseId);
advanceEntity.setWarehouseName(warehouseName);
if (StrUtil.equals("sczp", order.getDistributionMode())) {
advanceEntity.setIsGcp(1);
} else {
advanceEntity.setIsGcp(0);
}
advanceEntity.setCarrierName(carrierName);
advanceEntity.setSystemType("线上");
advanceEntity.setMatingType("1");
advanceEntity.setSenderName(order.getConsignerName());
advanceEntity.setSenderPhone(order.getConsignerMobile());
advanceEntity.setSenderAddress(order.getConsignerAddr());
advanceEntity.setWaybillStatus("0");
advanceEntity.setWaybillNo("");
advanceEntity.setTrainNumber("");
advanceEntity.setFreezeStatus("0");
advanceEntity.setSenderFactory(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceEntity.setOrderCode(orderInfo.getOmsExtOrderNo());
advanceEntity.setDealerCode(orderInfo.getShopCode());
advanceEntity.setDealerName(orderInfo.getShopName());
advanceEntity.setStoreCode(orderInfo.getShopCode());
advanceEntity.setStoreName(orderInfo.getShopName());
advanceEntity.setServiceNum(orderInfo.getOmsExtYsId());
// 安装
advanceEntity.setCustomerName(orderInfo.getYjInstallLinker());
advanceEntity.setCustomerPhone(orderInfo.getYjInstallPhone());
advanceEntity.setCustomerAddress(orderInfo.getYjInstallAddr());
advanceEntity.setConsigneePerson(order.getReceiverContacts());
advanceEntity.setConsigneeMobile(order.getReceiverMobile());
advanceEntity.setConsigneeAddress(order.getReceiverMobile());
List<JSONObject> packageList = new ArrayList<>();
for (PackageInfoEntity orderPackageDTO : value) {
// 封装包件
TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity();
advanceDetailEntity.setWarehouseId(warehouseId);
advanceDetailEntity.setWarehouseName(warehouseName);
// 根据的一流单标识赋值
advanceEntity.setLegacyStatus("0");
advanceDetailEntity.setOrderCode(orderPackageDTO.getOmsExtOrderNo());
advanceDetailEntity.setBrand(BrandEnums.JP.getValue());
advanceDetailEntity.setSystemType("线上");
String boxType1 = orderPackageDTO.getBoxType1();
String boxType2 = orderPackageDTO.getBoxType2();
String boxType3 = orderPackageDTO.getBoxType3();
if (StrUtil.isNotEmpty(boxType1)) {
advanceDetailEntity.setFirstPackName(orderPackageDTO.getBoxType1());
}
if (StrUtil.isNotEmpty(boxType2)) {
advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType2());
} else {
advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType1());
}
if (StrUtil.isNotEmpty(boxType3)) {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType3());
} else {
if (StrUtil.isNotEmpty(boxType2)) {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType2());
} else {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType1());
}
}
advanceDetailEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceDetailEntity.setSiteCode("");
String planQty = orderPackageDTO.getGoodsNum();
advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0);
advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getExtBoxCode());
advanceDetailEntity.setTrainNumber("");
advanceDetailEntity.setServiceNum(orderInfo.getOmsExtYsId());
advanceDetailEntity.setWaybillNo("");
advanceDetailEntity.setPackageStatus("0");
advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getGoodsWeight()) ? new BigDecimal(orderPackageDTO.getGoodsWeight()) : BigDecimal.ZERO);
advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getGoodsVolume()) ? new BigDecimal(orderPackageDTO.getGoodsVolume()) : BigDecimal.ZERO);
// advanceDetailEntity.setChargeType(0);
advanceDetailEntity.setSupple("");
advanceDetailEntity.setManifest("");
advanceDetailEntity.setReturnNum("");
advanceDetailEntity.setSendDateStr(StrUtil.isNotBlank(order.getDepartTime()) ? order.getDepartTime() : DateUtil.formatLocalDateTime(LocalDateTime.now()));
advanceDetailEntity.setCarNumber(order.getCarNo());
advanceDetailEntity.setGoodsMan("");
advanceDetailEntity.setTenantId(tenantId);
advanceDetailEntity.setStatus(0);
advanceDetailEntity.setIsDeleted(0);
JSONObject entries = JSONUtil.parseObj(advanceDetailEntity);
packageList.add(entries);
}
// 转成json对象,然后将包件明细放到detail中
JSONObject entries = JSONUtil.parseObj(advanceEntity);
entries.set("details", JSONUtil.toJsonStr(packageList));
advances.add(entries);
}
// 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg.
if (CollUtil.isNotEmpty(advances)) {
for (JSONObject advance : advances) {
SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER)
.routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build();
factoryDataClient.sendMessage(sendMsg);
}
}
}
}

168
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java

@ -2,20 +2,15 @@ package com.logpm.factorydata.jinpai.mq;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.factorydata.base.feign.IFactoryDataBaseClient;
import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO;
import com.logpm.factorydata.enums.BrandEnums;
import com.logpm.factorydata.enums.SaxStatusEnums;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity;
@ -37,16 +32,10 @@ import com.logpm.factorydata.jinpai.vo.PackageCategoryVO;
import com.logpm.factorydata.jinpai.vo.PackageInfoVO;
import com.logpm.factorydata.jinpai.vo.PushOrderDetailVO;
import com.logpm.factorydata.jinpai.vo.PushOrderVO;
import com.logpm.factorydata.vo.SendMsg;
import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity;
import com.logpm.trunkline.entity.TrunklineAdvanceEntity;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.annotations.LogpmAsync;
import org.springblade.common.constant.HttpConstants;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
@ -55,7 +44,6 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -180,161 +168,7 @@ public class FactoryOrderListener {
logEntity1.setId(logId);
logService.saveOrUpdate(logEntity1);
// 处理暂存单
buildAdvance(vo);
}
}
@LogpmAsync("asyncExecutor")
public void buildAdvance(PushOrderVO vo) {
// 新起线程构建暂存单发送mq
Long startWarehouseId = null;
String startWarehouseName = null;
String tenantId = null;
// 获取工厂基地绑定的始发仓信息
List<PushOrderDetailVO> details = vo.getItems();
if (CollUtil.isEmpty(details)) {
return;
}
R<FactoryWarehouseBindVO> warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), vo.getOrgName());
if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) {
FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData();
if (ObjectUtil.isNotNull(data)) {
startWarehouseId = data.getWarehouseId();
startWarehouseName = data.getWarehouseName();
tenantId = data.getTenantId();
}
}
Map<String, List<PackageInfoVO>> advanceMap = new HashMap<>();
// 一个dd单号 一个暂存单
// 组装暂存单数据
List<JSONObject> advances = new ArrayList<>();
for (PushOrderDetailVO orderInfoVO : details) {
List<JSONObject> packageList = new ArrayList<>();
TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity();
List<String> boxCodes = orderInfoVO.getBoxCodes();
advanceEntity.setTenantId(tenantId);
advanceEntity.setStatus(0);
advanceEntity.setIsDeleted(0);
advanceEntity.setHasPackage(CollUtil.isNotEmpty(boxCodes) ? 1 : 0);
advanceEntity.setOrderType("");
advanceEntity.setBrand(BrandEnums.JP.getValue());
advanceEntity.setSiteName(vo.getOrgName());
advanceEntity.setArea("");
advanceEntity.setTotalNum(StrUtil.isNotEmpty(orderInfoVO.getGoodsNumber()) ? Convert.toInt(orderInfoVO.getGoodsNumber()) : 0);
advanceEntity.setPackName("");
advanceEntity.setPackCode("");
advanceEntity.setWarehouseId(startWarehouseId);
advanceEntity.setWarehouseName(startWarehouseName);
advanceEntity.setIsGcp(0);
advanceEntity.setCarrierName("");
advanceEntity.setSystemType("线上");
advanceEntity.setMatingType("1");
advanceEntity.setSenderName("");
advanceEntity.setSenderPhone("");
advanceEntity.setSenderAddress("");
advanceEntity.setWaybillStatus("0");
advanceEntity.setWaybillNo("");
advanceEntity.setTrainNumber(vo.getTransportNo());
advanceEntity.setFreezeStatus("0");
advanceEntity.setOrderCode(orderInfoVO.getCustomItemNo());
advanceEntity.setServiceNum(orderInfoVO.getCustomOrderNo());
advanceEntity.setSenderFactory(vo.getOrgName());
// 门店是商场
advanceEntity.setDealerCode(orderInfoVO.getShopCode());
advanceEntity.setDealerName(orderInfoVO.getShopName());
advanceEntity.setStoreCode(orderInfoVO.getShopCode());
advanceEntity.setStoreName(orderInfoVO.getShopName());
// 安装是客户
advanceEntity.setCustomerName(orderInfoVO.getInstallLinker());
advanceEntity.setCustomerPhone(orderInfoVO.getInstallPhone());
advanceEntity.setCustomerAddress(orderInfoVO.getInstallAddr());
// 收货人就是商场收货人
advanceEntity.setConsigneePerson(orderInfoVO.getRecvLinker());
advanceEntity.setConsigneeMobile(orderInfoVO.getRecvPhone());
advanceEntity.setConsigneeAddress(orderInfoVO.getRecvAddr());
// 根据遗留单标识赋值
advanceEntity.setLegacyStatus("0");
if (StrUtil.contains(orderInfoVO.getCustomItemNo(), "遗")) {
advanceEntity.setLegacyStatus("1");
}
// 封装包件品类信息
Map<String, PackageCategoryVO> categoryVOMap = new HashMap<>();
List<PackageCategoryVO> boxDetails = orderInfoVO.getBoxDetails();
if (CollUtil.isNotEmpty(boxDetails)) {
for (PackageCategoryVO packageCategoryVO : boxDetails) {
categoryVOMap.put(packageCategoryVO.getExtBoxCode(), packageCategoryVO);
}
}
for (String packageCode : boxCodes) {
// 封装包件
TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity();
advanceDetailEntity.setWarehouseId(startWarehouseId);
advanceDetailEntity.setWarehouseName(startWarehouseName);
advanceDetailEntity.setOrderCode(orderInfoVO.getCustomItemNo());
advanceDetailEntity.setBrand(BrandEnums.JP.getValue());
advanceDetailEntity.setSystemType("线上");
// 获取映射品类信息
PackageCategoryVO categoryVO = categoryVOMap.get(packageCode);
if (ObjectUtil.isNotEmpty(categoryVO)) {
// 一级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypea())) {
advanceDetailEntity.setFirstPackName(categoryVO.getTypea());
advanceDetailEntity.setMaterialName(categoryVO.getTypea());
}
// 二级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypeb())) {
advanceDetailEntity.setSecondPackName(categoryVO.getTypeb());
} else {
advanceDetailEntity.setSecondPackName(categoryVO.getTypea());
}
// 三级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypec())) {
advanceDetailEntity.setThirdPackName(categoryVO.getTypec());
} else {
if (StrUtil.isNotEmpty(categoryVO.getTypeb())) {
advanceDetailEntity.setThirdPackName(categoryVO.getTypeb());
} else {
advanceDetailEntity.setThirdPackName(categoryVO.getTypea());
}
}
}
advanceDetailEntity.setSiteName(vo.getOrgName());
advanceDetailEntity.setSiteCode("");
advanceDetailEntity.setQuantity(1);
advanceDetailEntity.setOrderPackageCode(packageCode);
advanceDetailEntity.setTrainNumber(vo.getTransportNo());
advanceDetailEntity.setServiceNum(orderInfoVO.getCustomOrderNo());
advanceDetailEntity.setWaybillNo("");
advanceDetailEntity.setPackageStatus("0");
// advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getWeight()) ? new BigDecimal(orderPackageDTO.getWeight()) : BigDecimal.ZERO);
// advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO);
// advanceDetailEntity.setChargeType(0);
advanceDetailEntity.setSupple("");
advanceDetailEntity.setManifest("");
advanceDetailEntity.setReturnNum("");
advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now()));
advanceDetailEntity.setCarNumber("");
advanceDetailEntity.setGoodsMan("");
advanceDetailEntity.setTenantId(tenantId);
advanceDetailEntity.setStatus(0);
advanceDetailEntity.setIsDeleted(0);
JSONObject entries = JSONUtil.parseObj(advanceDetailEntity);
packageList.add(entries);
}
// 转成json对象,然后将包件明细放到detail中
JSONObject entries = JSONUtil.parseObj(advanceEntity);
entries.set("details", JSONUtil.toJsonStr(packageList));
advances.add(entries);
}
// 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg.
if (CollUtil.isNotEmpty(advances)) {
for (JSONObject advance : advances) {
SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER)
.routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build();
factoryDataClient.sendMessage(sendMsg);
}
deliveryNoteService.buildAdvance(vo);
}
}

8
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java

@ -105,7 +105,7 @@ public class NodeDataPushListener {
log.info("未查到包件数据,不处理:{}", JSONUtil.toJsonStr(content));
return;
}
Map<Long, String> orderCodeMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getId, PushOrderDetailEntity::getCustomItemNo));
Map<String, String> orderCodeMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getOrderId, PushOrderDetailEntity::getCustomItemNo));
Map<String, PushOrderDetailEntity> detailEntityMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getCustomItemNo, v -> v));
List<String> orderIds = orderDetailEntities.stream().map(PushOrderDetailEntity::getOrderId).collect(Collectors.toList());
Map<String, PushOrderEntity> pushOrderEntityMap = new HashMap<>();
@ -113,7 +113,7 @@ public class NodeDataPushListener {
List<PushOrderEntity> pushOrderEntities = pushOrderService.listByIds(orderIds);
if (CollUtil.isNotEmpty(pushOrderEntities)) {
pushOrderEntities.forEach(pushOrderEntity -> {
pushOrderEntityMap.put(orderCodeMap.get(pushOrderEntity.getId()), pushOrderEntity);
pushOrderEntityMap.put(orderCodeMap.get(pushOrderEntity.getId().toString()), pushOrderEntity);
});
}
}
@ -191,7 +191,7 @@ public class NodeDataPushListener {
Map<String, FactoryNodePushEntity> pushEntityMap = new HashMap<>();
if (CollUtil.isNotEmpty(pushEntities)) {
pushEntityMap = pushEntities.stream().filter(pushEntity -> {
return pushEntity.getNode().equals(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode());
return pushEntity.getNode().equals(FactoryNodeEnums.END_WAREHOUSE_UNLOADING.getCode());
}).collect(Collectors.toMap(FactoryNodePushEntity::getPackageCode, v -> v));
}
for (PushData pushData : content) {
@ -217,7 +217,7 @@ public class NodeDataPushListener {
// 保存推送记录
factoryNodePushService.save(FactoryNodePushEntity.builder()
.orderCode(pushData.getOrderCode())
.node(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE.getCode().toString())
.node(FactoryNodeEnums.END_WAREHOUSE_UNLOADING.getCode().toString())
.content(JSONUtil.toJsonStr(js))
.resultContent(result)
.build());

7
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java

@ -1,6 +1,8 @@
package com.logpm.factorydata.jinpai.service;
import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity;
import com.logpm.factorydata.jinpai.entity.OrderInfoEntity;
import com.logpm.factorydata.jinpai.entity.PackageInfoEntity;
import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO;
import com.logpm.factorydata.jinpai.vo.OrderInfoVO;
import com.logpm.factorydata.jinpai.vo.PackageInfoVO;
@ -9,6 +11,7 @@ import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO;
import org.springblade.core.mp.base.BaseService;
import java.util.List;
import java.util.Map;
/**
* 索菲亚发货单 服务类
@ -27,4 +30,8 @@ public interface DeliveryNoteService extends BaseService<DeliveryNoteEntity> {
List<ThirdPlWarehouseMappingVO> getThirdPlWarehouseMappingVO();
String pushOrder(PushOrderVO vo);
void buildAdvance(PushOrderVO vo);
void buildAdvancePull(Map<String, List<PackageInfoEntity>> packageInfoEntityMap, Map<String, DeliveryNoteEntity> deliveryNoteEntityMap, Map<String, OrderInfoEntity> orderInfoEntityMap);
}

366
blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java

@ -1,33 +1,51 @@
package com.logpm.factorydata.jinpai.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.logpm.factorydata.base.feign.IFactoryDataBaseClient;
import com.logpm.factorydata.base.vo.FactoryWarehouseBindVO;
import com.logpm.factorydata.enums.BrandEnums;
import com.logpm.factorydata.enums.SaxStatusEnums;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.jinpai.entity.DeliveryNoteEntity;
import com.logpm.factorydata.jinpai.entity.FactoryOrderLogEntity;
import com.logpm.factorydata.jinpai.entity.OrderInfoEntity;
import com.logpm.factorydata.jinpai.entity.PackageInfoEntity;
import com.logpm.factorydata.jinpai.enums.BusSourceEnums;
import com.logpm.factorydata.jinpai.enums.DimensionEnums;
import com.logpm.factorydata.jinpai.mapper.DeliveryNoteMapper;
import com.logpm.factorydata.jinpai.service.DeliveryNoteService;
import com.logpm.factorydata.jinpai.service.FactoryOrderLogService;
import com.logpm.factorydata.jinpai.vo.DeliveryNoteVO;
import com.logpm.factorydata.jinpai.vo.OrderInfoVO;
import com.logpm.factorydata.jinpai.vo.PackageCategoryVO;
import com.logpm.factorydata.jinpai.vo.PackageInfoVO;
import com.logpm.factorydata.jinpai.vo.PushOrderDetailVO;
import com.logpm.factorydata.jinpai.vo.PushOrderVO;
import com.logpm.factorydata.jinpai.vo.ThirdPlWarehouseMappingVO;
import com.logpm.factorydata.vo.SendMsg;
import com.logpm.trunkline.entity.TrunklineAdvanceDetailEntity;
import com.logpm.trunkline.entity.TrunklineAdvanceEntity;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.io.IOUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.common.annotations.LogpmAsync;
import org.springblade.common.constant.HttpConstants;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.common.model.IDict;
import org.springblade.common.utils.FileLogsUtil;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springblade.resource.feign.IOssClient;
import org.springframework.cache.annotation.Cacheable;
@ -39,8 +57,13 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 发货单 业务实现类
@ -56,7 +79,8 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl<DeliveryNoteMapper,
private final IFactoryDataClient factoryDataClient;
private final FactoryOrderLogService factoryOrderLogService;
private final IOssClient ossClient;
private final BladeRedis bladeRedis;
private final IFactoryDataBaseClient baseClient;
@Override
public String order(List<DeliveryNoteVO> vo) {
@ -137,6 +161,342 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl<DeliveryNoteMapper,
return "成功";
}
@LogpmAsync("asyncExecutor")
@Override
public void buildAdvance(PushOrderVO vo) {
// 新起线程构建暂存单发送mq
Long startWarehouseId = null;
String startWarehouseName = null;
String tenantId = null;
// 获取工厂基地绑定的始发仓信息
List<PushOrderDetailVO> details = vo.getItems();
if (CollUtil.isEmpty(details)) {
return;
}
R<FactoryWarehouseBindVO> warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), vo.getOrgName());
if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) {
FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData();
if (ObjectUtil.isNotNull(data)) {
startWarehouseId = data.getWarehouseId();
startWarehouseName = data.getWarehouseName();
tenantId = data.getTenantId();
}
}
Map<String, List<PackageInfoVO>> advanceMap = new HashMap<>();
// 一个dd单号 一个暂存单
// 组装暂存单数据
List<JSONObject> advances = new ArrayList<>();
for (PushOrderDetailVO orderInfoVO : details) {
List<JSONObject> packageList = new ArrayList<>();
TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity();
List<String> boxCodes = orderInfoVO.getBoxCodes();
advanceEntity.setTenantId(tenantId);
advanceEntity.setStatus(0);
advanceEntity.setIsDeleted(0);
advanceEntity.setHasPackage(CollUtil.isNotEmpty(boxCodes) ? 1 : 0);
advanceEntity.setOrderType("");
advanceEntity.setBrand(BrandEnums.JP.getValue());
advanceEntity.setSiteName(vo.getOrgName());
advanceEntity.setArea("");
advanceEntity.setTotalNum(StrUtil.isNotEmpty(orderInfoVO.getGoodsNumber()) ? Convert.toInt(orderInfoVO.getGoodsNumber()) : 0);
advanceEntity.setPackName("");
advanceEntity.setPackCode("");
advanceEntity.setWarehouseId(startWarehouseId);
advanceEntity.setWarehouseName(startWarehouseName);
advanceEntity.setIsGcp(0);
advanceEntity.setCarrierName("");
advanceEntity.setSystemType("线上");
advanceEntity.setMatingType("1");
advanceEntity.setSenderName("");
advanceEntity.setSenderPhone("");
advanceEntity.setSenderAddress("");
advanceEntity.setWaybillStatus("0");
advanceEntity.setWaybillNo("");
advanceEntity.setTrainNumber(vo.getTransportNo());
advanceEntity.setFreezeStatus("0");
advanceEntity.setOrderCode(orderInfoVO.getCustomItemNo());
advanceEntity.setServiceNum(orderInfoVO.getCustomOrderNo());
advanceEntity.setSenderFactory(vo.getOrgName());
// 门店是商场
advanceEntity.setDealerCode(orderInfoVO.getShopCode());
advanceEntity.setDealerName(orderInfoVO.getShopName());
advanceEntity.setStoreCode(orderInfoVO.getShopCode());
advanceEntity.setStoreName(orderInfoVO.getShopName());
// 安装是客户
advanceEntity.setCustomerName(orderInfoVO.getInstallLinker());
advanceEntity.setCustomerPhone(orderInfoVO.getInstallPhone());
advanceEntity.setCustomerAddress(orderInfoVO.getInstallAddr());
// 收货人就是商场收货人
advanceEntity.setConsigneePerson(orderInfoVO.getRecvLinker());
advanceEntity.setConsigneeMobile(orderInfoVO.getRecvPhone());
advanceEntity.setConsigneeAddress(orderInfoVO.getRecvAddr());
// 根据遗留单标识赋值
advanceEntity.setLegacyStatus("0");
if (StrUtil.contains(orderInfoVO.getCustomItemNo(), "遗")) {
advanceEntity.setLegacyStatus("1");
}
// 封装包件品类信息
Map<String, PackageCategoryVO> categoryVOMap = new HashMap<>();
List<PackageCategoryVO> boxDetails = orderInfoVO.getBoxDetails();
if (CollUtil.isNotEmpty(boxDetails)) {
for (PackageCategoryVO packageCategoryVO : boxDetails) {
categoryVOMap.put(packageCategoryVO.getExtBoxCode(), packageCategoryVO);
}
}
for (String packageCode : boxCodes) {
// 封装包件
TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity();
advanceDetailEntity.setWarehouseId(startWarehouseId);
advanceDetailEntity.setWarehouseName(startWarehouseName);
advanceDetailEntity.setOrderCode(orderInfoVO.getCustomItemNo());
advanceDetailEntity.setBrand(BrandEnums.JP.getValue());
advanceDetailEntity.setSystemType("线上");
// 获取映射品类信息
PackageCategoryVO categoryVO = categoryVOMap.get(packageCode);
if (ObjectUtil.isNotEmpty(categoryVO)) {
// 一级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypea())) {
advanceDetailEntity.setFirstPackName(categoryVO.getTypea());
advanceDetailEntity.setMaterialName(categoryVO.getTypea());
}
// 二级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypeb())) {
advanceDetailEntity.setSecondPackName(categoryVO.getTypeb());
} else {
advanceDetailEntity.setSecondPackName(categoryVO.getTypea());
}
// 三级品类名称
if (StrUtil.isNotEmpty(categoryVO.getTypec())) {
advanceDetailEntity.setThirdPackName(categoryVO.getTypec());
} else {
if (StrUtil.isNotEmpty(categoryVO.getTypeb())) {
advanceDetailEntity.setThirdPackName(categoryVO.getTypeb());
} else {
advanceDetailEntity.setThirdPackName(categoryVO.getTypea());
}
}
}
advanceDetailEntity.setSiteName(vo.getOrgName());
advanceDetailEntity.setSiteCode("");
advanceDetailEntity.setQuantity(1);
advanceDetailEntity.setOrderPackageCode(packageCode);
advanceDetailEntity.setTrainNumber(vo.getTransportNo());
advanceDetailEntity.setServiceNum(orderInfoVO.getCustomOrderNo());
advanceDetailEntity.setWaybillNo("");
advanceDetailEntity.setPackageStatus("0");
// advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getWeight()) ? new BigDecimal(orderPackageDTO.getWeight()) : BigDecimal.ZERO);
// advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getVolume()) ? new BigDecimal(orderPackageDTO.getVolume()) : BigDecimal.ZERO);
// advanceDetailEntity.setChargeType(0);
advanceDetailEntity.setSupple("");
advanceDetailEntity.setManifest("");
advanceDetailEntity.setReturnNum("");
advanceDetailEntity.setSendDateStr(DateUtil.formatLocalDateTime(LocalDateTime.now()));
advanceDetailEntity.setCarNumber("");
advanceDetailEntity.setGoodsMan("");
advanceDetailEntity.setTenantId(tenantId);
advanceDetailEntity.setStatus(0);
advanceDetailEntity.setIsDeleted(0);
JSONObject entries = JSONUtil.parseObj(advanceDetailEntity);
packageList.add(entries);
}
// 转成json对象,然后将包件明细放到detail中
JSONObject entries = JSONUtil.parseObj(advanceEntity);
entries.set("details", JSONUtil.toJsonStr(packageList));
advances.add(entries);
}
// 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg.
if (CollUtil.isNotEmpty(advances)) {
for (JSONObject advance : advances) {
SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER)
.routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build();
factoryDataClient.sendMessage(sendMsg);
}
}
}
@LogpmAsync("asyncExecutor")
@Override
public void buildAdvancePull(Map<String, List<PackageInfoEntity>> packageMap, Map<String, DeliveryNoteEntity> deliveryMap, Map<String, OrderInfoEntity> orderInfoMap) {
// 新起线程构建暂存单发送mq
// 获取非干线仓库映射表数据
Map<String, ThirdPlWarehouseMappingVO> thirdPlWarehouseMapping = new HashMap<>();
List<ThirdPlWarehouseMappingVO> warehouseMappingVOList = this.getThirdPlWarehouseMappingVO();
if (CollUtil.isNotEmpty(warehouseMappingVOList)) {
warehouseMappingVOList.forEach(vo -> {
thirdPlWarehouseMapping.put(vo.getArriveOrgName(), vo);
});
}
Map<String, FactoryWarehouseBindVO> warehouseBindVOMap = new HashMap<>();
if (CollUtil.isNotEmpty(deliveryMap)) {
for (Map.Entry<String, DeliveryNoteEntity> entry : deliveryMap.entrySet()) {
DeliveryNoteEntity deliveryNoteEntity = entry.getValue();
if (ObjectUtil.isNotEmpty(deliveryNoteEntity)) {
// 获取工厂基地绑定的始发仓信息
String textByCode = IDict.getTextByCode(BusSourceEnums.class, deliveryNoteEntity.getBusSource());
R<FactoryWarehouseBindVO> warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.JP.getValue(), textByCode);
if (ObjectUtil.equal(HttpConstants.HTTP.HTTP_RESOURCE_CODE.SUCCESS_CODE, warehouseByBrandAndSiteName.getCode())) {
FactoryWarehouseBindVO data = warehouseByBrandAndSiteName.getData();
if (ObjectUtil.isNotNull(data)) {
warehouseBindVOMap.put(deliveryNoteEntity.getBusSource(), data);
}
}
}
}
}
// 组装暂存单数据
List<JSONObject> advances = new ArrayList<>();
for (Map.Entry<String, List<PackageInfoEntity>> stringListEntry : packageMap.entrySet()) {
String key = stringListEntry.getKey();
OrderInfoEntity orderInfo = orderInfoMap.get(key);
if (ObjectUtil.isEmpty(orderInfo)) {
log.error("订单明细信息不存在,dd单号:{}", key);
continue;
}
DeliveryNoteEntity order = deliveryMap.get(orderInfo.getOrderId());
if (ObjectUtil.isEmpty(order)) {
log.error("订单信息不存在,订单号:{}", orderInfo.getOrderId());
continue;
}
List<PackageInfoEntity> value = stringListEntry.getValue();
TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity();
// 承运商是汇通的数据 走干线,不是汇通的直接走仓配。
String carrierName = order.getCarrierName();
Long warehouseId = null;
String warehouseName = "";
String tenantId = "";
if (ObjectUtil.equal(carrierName, "广州市汇通运输有限公司")) {
if (ObjectUtil.isNotNull(warehouseBindVOMap.get(order.getBusSource()))) {
warehouseId = warehouseBindVOMap.get(order.getBusSource()).getWarehouseId();
warehouseName = warehouseBindVOMap.get(order.getBusSource()).getWarehouseName();
tenantId = warehouseBindVOMap.get(order.getBusSource()).getTenantId();
}
} else {
if (ObjectUtil.isNotNull(thirdPlWarehouseMapping.get(order.getArriveOrgName()))) {
if (ObjectUtil.isNotEmpty(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId())) {
warehouseId = Convert.toLong(thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseId());
}
warehouseName = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getWarehouseName();
tenantId = thirdPlWarehouseMapping.get(order.getArriveOrgName()).getTenantId();
}
}
advanceEntity.setTenantId(tenantId);
advanceEntity.setStatus(0);
advanceEntity.setIsDeleted(0);
advanceEntity.setHasPackage(CollUtil.isNotEmpty(value) ? 1 : 0);
advanceEntity.setOrderType(orderInfo.getYjOrderType());
advanceEntity.setBrand(BrandEnums.JP.getValue());
advanceEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceEntity.setArea("");
advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0);
advanceEntity.setPackName("");
advanceEntity.setPackCode("");
advanceEntity.setWarehouseId(warehouseId);
advanceEntity.setWarehouseName(warehouseName);
if (StrUtil.equals("sczp", order.getDistributionMode())) {
advanceEntity.setIsGcp(1);
} else {
advanceEntity.setIsGcp(0);
}
advanceEntity.setCarrierName(carrierName);
advanceEntity.setSystemType("线上");
advanceEntity.setMatingType("1");
advanceEntity.setSenderName(order.getConsignerName());
advanceEntity.setSenderPhone(order.getConsignerMobile());
advanceEntity.setSenderAddress(order.getConsignerAddr());
advanceEntity.setWaybillStatus("0");
advanceEntity.setWaybillNo("");
advanceEntity.setTrainNumber("");
advanceEntity.setFreezeStatus("0");
advanceEntity.setSenderFactory(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceEntity.setOrderCode(orderInfo.getOmsExtOrderNo());
advanceEntity.setDealerCode(orderInfo.getShopCode());
advanceEntity.setDealerName(orderInfo.getShopName());
advanceEntity.setStoreCode(orderInfo.getShopCode());
advanceEntity.setStoreName(orderInfo.getShopName());
advanceEntity.setServiceNum(orderInfo.getOmsExtYsId());
// 安装
advanceEntity.setCustomerName(orderInfo.getYjInstallLinker());
advanceEntity.setCustomerPhone(orderInfo.getYjInstallPhone());
advanceEntity.setCustomerAddress(orderInfo.getYjInstallAddr());
advanceEntity.setConsigneePerson(order.getReceiverContacts());
advanceEntity.setConsigneeMobile(order.getReceiverMobile());
advanceEntity.setConsigneeAddress(order.getReceiverMobile());
List<JSONObject> packageList = new ArrayList<>();
for (PackageInfoEntity orderPackageDTO : value) {
// 封装包件
TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity();
advanceDetailEntity.setWarehouseId(warehouseId);
advanceDetailEntity.setWarehouseName(warehouseName);
// 根据的一流单标识赋值
advanceEntity.setLegacyStatus("0");
advanceDetailEntity.setOrderCode(orderPackageDTO.getOmsExtOrderNo());
advanceDetailEntity.setBrand(BrandEnums.JP.getValue());
advanceDetailEntity.setSystemType("线上");
String boxType1 = orderPackageDTO.getBoxType1();
String boxType2 = orderPackageDTO.getBoxType2();
String boxType3 = orderPackageDTO.getBoxType3();
if (StrUtil.isNotEmpty(boxType1)) {
advanceDetailEntity.setFirstPackName(orderPackageDTO.getBoxType1());
}
if (StrUtil.isNotEmpty(boxType2)) {
advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType2());
} else {
advanceDetailEntity.setSecondPackName(orderPackageDTO.getBoxType1());
}
if (StrUtil.isNotEmpty(boxType3)) {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType3());
} else {
if (StrUtil.isNotEmpty(boxType2)) {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType2());
} else {
advanceDetailEntity.setThirdPackName(orderPackageDTO.getBoxType1());
}
}
advanceDetailEntity.setSiteName(IDict.getTextByCode(BusSourceEnums.class, order.getBusSource()));
advanceDetailEntity.setSiteCode("");
String planQty = orderPackageDTO.getGoodsNum();
advanceDetailEntity.setQuantity((StrUtil.isNotBlank(planQty) && NumberUtil.isNumber(planQty)) ? Convert.toInt(planQty) : 0);
advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getExtBoxCode());
advanceDetailEntity.setTrainNumber("");
advanceDetailEntity.setServiceNum(orderInfo.getOmsExtYsId());
advanceDetailEntity.setWaybillNo("");
advanceDetailEntity.setPackageStatus("0");
advanceDetailEntity.setWeight(StrUtil.isNotBlank(orderPackageDTO.getGoodsWeight()) ? new BigDecimal(orderPackageDTO.getGoodsWeight()) : BigDecimal.ZERO);
advanceDetailEntity.setVolume(StrUtil.isNotBlank(orderPackageDTO.getGoodsVolume()) ? new BigDecimal(orderPackageDTO.getGoodsVolume()) : BigDecimal.ZERO);
// advanceDetailEntity.setChargeType(0);
advanceDetailEntity.setSupple("");
advanceDetailEntity.setManifest("");
advanceDetailEntity.setReturnNum("");
advanceDetailEntity.setSendDateStr(StrUtil.isNotBlank(order.getDepartTime()) ? order.getDepartTime() : DateUtil.formatLocalDateTime(LocalDateTime.now()));
advanceDetailEntity.setCarNumber(order.getCarNo());
advanceDetailEntity.setGoodsMan("");
advanceDetailEntity.setTenantId(tenantId);
advanceDetailEntity.setStatus(0);
advanceDetailEntity.setIsDeleted(0);
JSONObject entries = JSONUtil.parseObj(advanceDetailEntity);
packageList.add(entries);
}
// 转成json对象,然后将包件明细放到detail中
JSONObject entries = JSONUtil.parseObj(advanceEntity);
entries.set("details", JSONUtil.toJsonStr(packageList));
advances.add(entries);
}
// 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg.
if (CollUtil.isNotEmpty(advances)) {
for (JSONObject advance : advances) {
SendMsg sendMsg = SendMsg.builder().exchange(FactoryDataConstants.Mq.Exchanges.ADVANCE_ORDER)
.routingKey(FactoryDataConstants.Mq.RoutingKeys.ADVANCE_ORDER).message(JSONUtil.toJsonStr(advance)).build();
factoryDataClient.sendMessage(sendMsg);
}
}
}
private String uploadFile(String body) {
//文本内容和保存为本地文件 并上传
String logPath = FileLogsUtil.saveFileLogs(body);

5
blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml

@ -44,6 +44,11 @@
<artifactId>logpm-trunkline-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-distribution-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data-base-api</artifactId>

20
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java

@ -4,20 +4,21 @@ import cn.hutool.json.JSONUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.logpm.factorydata.mwh.service.FactoryOrderLogService;
import com.logpm.factorydata.mwh.vo.DeliveryNoteVO;
import com.logpm.factorydata.mwh.vo.OrderStatusVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* 工厂订单 前端控制器
@ -50,4 +51,19 @@ public class OrderController {
return R.success(res);
}
@ResponseBody
@GetMapping("/status")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "查询运单状态", notes = "查询运单状态")
public R<List<OrderStatusVO>> status(@RequestParam("serviceNo") String serviceNo) {
List<OrderStatusVO> res = null;
try {
res = service.status(serviceNo);
} catch (Exception e) {
log.error("查询运单状态异常:{} ", e);
return R.success("服务器异常");
}
return R.data(res);
}
}

9
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java

@ -13,13 +13,10 @@ import org.springblade.common.model.IDict;
public enum FactoryNodeEnums implements IDict<Integer> {
/**
* 已交接
* 开单
*/
INITIAL_WAREHOUSE_ENTRY(20, "Deliveried"),
/**
* 收货完成
*/
END_WAREHOUSE_UNLOADING(170, "Received");
OPEN_ORDER(102010, "开单"),
;
FactoryNodeEnums(Integer code, String text) {
init(code, text);

9
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java

@ -14,13 +14,10 @@ import org.springblade.common.constant.WorkNodeEnums;
public enum NodeMappingEnums {
/**
* 已交接
* 开单
*/
INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.INITIAL_WAREHOUSE_ENTRY, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1),
/**
* 收货完成
*/
END_WAREHOUSE_UNLOADING(FactoryNodeEnums.END_WAREHOUSE_UNLOADING, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1);
INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.OPEN_ORDER, WorkNodeEnums.OPEN_ORDER, 1),
;
/**
* 系统作业节点

8
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java

@ -14,13 +14,9 @@ import java.io.Serializable;
public enum NodeNeedEnums implements Serializable {
/**
* 始发仓入库
* 开单
*/
INITIAL_WAREHOUSE_ENTRY(20, "始发仓入库"),
/**
* 末端仓卸车确认
*/
END_WAREHOUSE_UNLOADING(170, "末端仓卸车确认"),
OPEN_ORDER(102010, "开单"),
;
private Integer code;

112
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/NodeDataPushListener.java

@ -0,0 +1,112 @@
package com.logpm.factorydata.mwh.mq;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.mwh.enums.FactoryNodeEnums;
import com.logpm.factorydata.mwh.enums.NodeMappingEnums;
import com.logpm.factorydata.mwh.enums.NodeNeedEnums;
import com.logpm.factorydata.mwh.pros.OldProperties;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.WorkNodeEnums;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 监听业务系统推送给节点数据
*
* @author zhaoqiaobo
* @create 2024-03-18 0:02
*/
@Slf4j
@Component
@AllArgsConstructor
public class NodeDataPushListener {
private final IFactoryDataClient factoryDataClient;
private final OldProperties oldProperties;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.MWH_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.MWH_NODE_DATA_PUSH
))
@Transactional(rollbackFor = Exception.class)
public void nodeDataPush(String msg) {
log.info("接收到节点数据推送:{}", msg);
if (checkData(msg)) {
return;
}
JSONObject entries = JSONUtil.parseObj(msg);
// 节点
String node = entries.getStr("node");
JSONObject main = entries.getJSONObject("main");
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums);
// 2 获取业务数据
// List<PushData> content = entries.getBeanList("content", PushData.class);
String mwhOrderCode = main.getStr("mwhOrderCode");
String totalCount = main.getStr("totalCount");
String totalPrice = main.getStr("totalPrice");
String waybillNo = main.getStr("waybillNo");
JSONObject js = new JSONObject();
JSONObject detail = new JSONObject();
js.set("mhjOrderNo", mwhOrderCode);
detail.set("totalCount", totalCount);
detail.set("totalPrice", totalPrice);
detail.set("waybillNo", waybillNo);
js.set("waybillInfo", detail);
if (oldProperties.getEnable()) {
try {
log.info("推送节点数据:{}", JSONUtil.toJsonStr(js));
String post = HttpUtil.post(oldProperties.getOldSystemHost() + oldProperties.getOldOpenOrderUrl(), JSONUtil.toJsonStr(js));
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
}
private boolean checkData(String msg) {
if (StrUtil.isEmpty(msg)) {
return true;
}
if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) {
return true;
}
JSONObject entries = JSONUtil.parseObj(msg);
String node = entries.getStr("node");
if (StrUtil.isEmpty(node)) {
return true;
}
// 不是志邦需要的节点数据直接不处理
if (!EnumUtil.contains(NodeNeedEnums.class, node)) {
return true;
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
if (ObjectUtil.isEmpty(workNodeEnums)) {
return true;
}
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
if (CollUtil.isEmpty(content)) {
return true;
}
return false;
}
}

58
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/OldProperties.java

@ -0,0 +1,58 @@
package com.logpm.factorydata.mwh.pros;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 老系统配置
* @author zhaoqiaobo
* @Date 2024/5/29
**/
@Data
@Component
@ConfigurationProperties(prefix = "mwh")
public class OldProperties {
/**
* 金牌工厂推送节点数据url
*/
private String pushNodeUrl;
/**
* 是否推送工厂
*/
private Boolean enable = true;
/**
* 金牌工厂主机地址
*/
private String host;
/**
* 承运商编码
*/
private String carrierCode;
/**
* 补节点数据时的延时时间分钟
*/
private Integer delayedTime = 30;
/**
* 生成老系统暂存单
*/
private Boolean oldAdvance = false;
/**
* 生成新系统暂存单
*/
private Boolean newAdvance = false;
/**
* 老系统host
*/
private String oldSystemHost;
/**
* 老系统回传开单url
*/
private String oldOpenOrderUrl;
}

10
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java

@ -2,8 +2,11 @@ package com.logpm.factorydata.mwh.service;
import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity;
import com.logpm.factorydata.mwh.vo.DeliveryNoteVO;
import com.logpm.factorydata.mwh.vo.OrderStatusVO;
import org.springblade.core.mp.base.BaseService;
import java.util.List;
/**
* 工厂订单日志 服务类
*
@ -14,4 +17,11 @@ public interface FactoryOrderLogService extends BaseService<FactoryOrderLogEntit
String order(DeliveryNoteVO vo);
/**
* 根据服务号查询订单状态
* @param serviceNo
* @Return java.util.List<com.logpm.factorydata.mwh.vo.OrderStatusVO>
* @Author zqb 2024/8/19
**/
List<OrderStatusVO> status(String serviceNo);
}

11
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java

@ -1,7 +1,6 @@
package com.logpm.factorydata.mwh.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.logpm.factorydata.enums.SaxStatusEnums;
import com.logpm.factorydata.feign.IFactoryDataClient;
@ -9,6 +8,7 @@ import com.logpm.factorydata.mwh.entity.FactoryOrderLogEntity;
import com.logpm.factorydata.mwh.mapper.FactoryOrderLogMapper;
import com.logpm.factorydata.mwh.service.FactoryOrderLogService;
import com.logpm.factorydata.mwh.vo.DeliveryNoteVO;
import com.logpm.factorydata.mwh.vo.OrderStatusVO;
import com.logpm.factorydata.vo.SendMsg;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -18,7 +18,6 @@ import org.apache.commons.io.IOUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.common.utils.FileLogsUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.api.R;
@ -32,6 +31,8 @@ import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.Collections;
import java.util.List;
/**
* 工厂订单日志 业务实现类
@ -67,6 +68,12 @@ public class FactoryOrderLogServiceImpl extends BaseServiceImpl<FactoryOrderLogM
return "成功";
}
@Override
public List<OrderStatusVO> status(String serviceNo) {
return Collections.emptyList();
}
private String uploadFile(String body) {
//文本内容和保存为本地文件 并上传

36
blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/OrderStatusVO.java

@ -0,0 +1,36 @@
package com.logpm.factorydata.mwh.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 曼好家订单状态 实体类
*
* @author zhaoqiaobo
* @create 2024-04-26
*/
@Data
@ApiModel(value = "曼好家订单状态", description = "曼好家订单状态")
public class OrderStatusVO implements Serializable {
@ApiModelProperty(value = "状态")
@JsonProperty("STATUS")
private String status;
@ApiModelProperty(value = "时间")
@JsonProperty("TIME")
private String time;
@ApiModelProperty(value = "内容")
@JsonProperty("CONTENT")
private String content;
@ApiModelProperty(value = "订单号")
@JsonProperty("ORDER_NO")
private String orderNo;
@ApiModelProperty(value = "服务号")
@JsonProperty("DELIVERY_NO")
private String deliveryNo;
}

2
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java

@ -94,7 +94,7 @@ public class NodeDataPushListener {
js.set("snList", snArray);
jsons.add(js);
}
if (StrUtil.isNotEmpty(oldProperties.getPushNodeUrl())) {
if (oldProperties.getEnable()) {
try {
if (CollUtil.isNotEmpty(jsons)) {
log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons));

3
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java

@ -16,4 +16,7 @@ public class OldProperties {
*/
private String pushNodeUrl;
/** 是否推送工厂 */
private Boolean enable = true;
}

8
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java

@ -188,9 +188,9 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl<DeliveryNoteMapper,
advanceDetailEntity.setSystemType("线上");
advanceDetailEntity.setFirstPackName(orderPackageDTO.getMaterialCategory());
// 获取映射志邦映射品类信息
//二级品类名称
// 二级品类名称
advanceDetailEntity.setSecondPackName(orderPackageDTO.getMaterialCategory());
//三级品类名称
// 三级品类名称
advanceDetailEntity.setThirdPackName(orderPackageDTO.getMaterialCategory());
advanceDetailEntity.setMaterialName(orderPackageDTO.getMaterialCategory());
@ -270,12 +270,12 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl<DeliveryNoteMapper,
}
private String uploadFile(String body) {
//文本内容和保存为本地文件 并上传
// 文本内容和保存为本地文件 并上传
String logPath = FileLogsUtil.saveFileLogs(body);
log.info(">>> 文件路径 {}", logPath);
MultipartFile multi = getMultipartFile(logPath);
//上传到服务器
// 上传到服务器
R r = ossClient.fileUpload(multi, "olo-order-logs");
if (r.isSuccess()) {
BladeFile data = (BladeFile) r.getData();

9
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml

@ -59,15 +59,6 @@ spring:
url: ${blade.datasource.factorydata-olo.master.url}
username: ${blade.datasource.factorydata-olo.master.username}
password: ${blade.datasource.factorydata-olo.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-olo.627683.url}
username: ${blade.datasource.factorydata-olo.627683.username}
password: ${blade.datasource.factorydata-olo.627683.password}
blade:
data-scope:
enabled: false

9
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml

@ -33,15 +33,6 @@ spring:
url: ${blade.datasource.factorydata-olo.master.url}
username: ${blade.datasource.factorydata-olo.master.username}
password: ${blade.datasource.factorydata-olo.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-olo.627683.url}
username: ${blade.datasource.factorydata-olo.627683.username}
password: ${blade.datasource.factorydata-olo.627683.password}
blade:
data-scope:
enabled: false

9
blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml

@ -59,15 +59,6 @@ spring:
url: ${blade.datasource.factorydata-olo.master.url}
username: ${blade.datasource.factorydata-olo.master.username}
password: ${blade.datasource.factorydata-olo.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-olo.627683.url}
username: ${blade.datasource.factorydata-olo.627683.username}
password: ${blade.datasource.factorydata-olo.627683.password}
blade:
data-scope:
enabled: false

14
blade-service/logpm-factory-data/logpm-factory-data-oupai/Dockerfile

@ -0,0 +1,14 @@
FROM 192.168.2.110:7777/hwy/hwy_base:v1.0
MAINTAINER h5u@163.com
RUN mkdir -p /logpm/logpm-factory-data-oupai
WORKDIR /logpm/logpm-factory-data-oupai
EXPOSE 18970
ADD ./target/logpm-factory-data-oupai.jar ./app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"]
CMD ["--spring.profiles.active=test"]

89
blade-service/logpm-factory-data/logpm-factory-data-oupai/pom.xml

@ -0,0 +1,89 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data</artifactId>
<version>3.2.0.RELEASE</version>
</parent>
<artifactId>logpm-factory-data-oupai</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-auto</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-swagger</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-trunkline-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data-base-api</artifactId>
<version>${bladex.project.version}</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-oss</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-resource-api</artifactId>
<version>3.2.0.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<username>${docker.username}</username>
<password>${docker.password}</password>
<repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

20
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/FactoryDataOuPaiApplication.java

@ -0,0 +1,20 @@
package com.logpm.factorydata;
import org.springblade.common.constant.ModuleNameConstant;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
/**
* 欧派工厂数据启动类
*
* @author zhaoqiaobo
* @create 2024-4-26
*/
@BladeCloudApplication
public class FactoryDataOuPaiApplication {
public static void main(String[] args) {
BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_OUPAI_NAME, FactoryDataOuPaiApplication.class, args);
}
}

50
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/AsyncAnnotationAspect.java

@ -0,0 +1,50 @@
package com.logpm.factorydata.oupai.aspect;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springblade.common.annotations.LogpmAsync;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@Aspect
@Component
@Slf4j
@Order(-1)
public class AsyncAnnotationAspect {
/**
* 定义一个切点匹配所有带有@LogpmAsync("asyncExecutor")注解的方法
* 注意实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理直接这样配置可能会导致预期之外的行为
*/
//@Around("@annotation(org.springblade.common.annotations.LogpmAsync)")
public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class);
String annotationValue = myAsync.value();
log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue);
log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 ");
// 在方法执行前的操作
String tenantId = AuthUtil.getTenantId();
log.info(">> tenandId {} ",tenantId);
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后的操作
DynamicDataSourceContextHolder.poll();
return result;
}
}

48
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/RabbitAnnotationAspect.java

@ -0,0 +1,48 @@
package com.logpm.factorydata.oupai.aspect;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class RabbitAnnotationAspect {
/**
* 该方法为一个切面用于对标记了@RabbitListener注解的方法进行增强主要增加了日志记录和数据源上下文处理的功能
*
* @param joinPoint 切面的连接点表示当前被拦截的方法
* @return 返回被拦截方法的执行结果
* @throws Throwable 如果执行过程中发生异常则抛出
*/
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)")
public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable {
// 在方法执行前,获取当前租户ID并设置到数据源上下文中
String tenantId = AuthUtil.getTenantId();
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后,从数据源上下文中移除租户ID
DynamicDataSourceContextHolder.poll();
return result;
}
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)")
public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable {
// 在方法执行前,获取当前租户ID并设置到数据源上下文中
String tenantId = AuthUtil.getTenantId();
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后,从数据源上下文中移除租户ID
DynamicDataSourceContextHolder.poll();
return result;
}
}

161
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/CustomMessageConverter.java

@ -0,0 +1,161 @@
package com.logpm.factorydata.oupai.config;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter;
import org.springframework.amqp.support.converter.MessageConversionException;
import org.springframework.amqp.utils.SerializationUtils;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.http.HttpHeaders;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
/**
* @author zhaoqiaobo
* @create 2024-05-08
*/
@Component
public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware {
private volatile String defaultCharset = "UTF-8";
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
private String codebaseUrl;
@Deprecated
public void setCodebaseUrl(String codebaseUrl) {
this.codebaseUrl = codebaseUrl;
}
@Override
public Object fromMessage(Message message) throws MessageConversionException {
Object content = null;
MessageProperties properties = message.getMessageProperties();
if (properties != null) {
String contentType = properties.getContentType();
if (contentType != null && contentType.startsWith("text")) {
String encoding = properties.getContentEncoding();
if (encoding == null) {
encoding = "UTF-8";
}
try {
content = new String(message.getBody(), encoding);
} catch (UnsupportedEncodingException var8) {
throw new MessageConversionException("failed to convert text-based Message content", var8);
}
} else if (contentType != null && contentType.equals("application/x-java-serialized-object")) {
try {
content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl));
} catch (IllegalArgumentException | IllegalStateException | IOException var7) {
throw new MessageConversionException("failed to convert serialized Message content", var7);
}
}
}
Map<String, Object> headers = properties.getHeaders();
HttpHeaders httpHeaders = new HttpHeaders();
for (Map.Entry<String, Object> entry : headers.entrySet()) {
if (StrUtil.equals("Blade-Auth", entry.getKey())
|| StrUtil.equals("Authorization", entry.getKey())
|| StrUtil.equals("blade-auth", entry.getKey())
|| StrUtil.equals("authorization", entry.getKey())) {
List value = (List) entry.getValue();
for (Object o : value) {
httpHeaders.add(entry.getKey(), String.valueOf(o));
}
}
}
ThreadLocalUtil.put("bladeContext", httpHeaders);
Object bladeUser = headers.get("bladeUser");
MockHttpServletRequest request = new MockHttpServletRequest();
BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class);
request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
if (content == null) {
content = message.getBody();
}
return content;
}
@Override
protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException {
byte[] bytes = null;
if (object instanceof byte[]) {
bytes = (byte[]) object;
messageProperties.setContentType("application/octet-stream");
} else if (object instanceof String) {
try {
bytes = ((String) object).getBytes(this.defaultCharset);
} catch (UnsupportedEncodingException var6) {
throw new MessageConversionException("failed to convert to Message content", var6);
}
messageProperties.setContentType("text/plain");
messageProperties.setContentEncoding(this.defaultCharset);
} else if (object instanceof Serializable) {
try {
bytes = SerializationUtils.serialize(object);
} catch (IllegalArgumentException var5) {
throw new MessageConversionException("failed to convert to serialized Message content", var5);
}
messageProperties.setContentType("application/x-java-serialized-object");
}
HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext");
if (headers != null && !headers.isEmpty()) {
headers.forEach((key, values) -> {
values.forEach((value) -> {
messageProperties.setHeader(key, new String[]{value});
});
});
}
BladeUser user = AuthUtil.getUser();
BladeUser bladeUser = new BladeUser();
bladeUser.setTenantId(user.getTenantId());
bladeUser.setUserId(user.getUserId());
bladeUser.setAccount(user.getAccount());
bladeUser.setRoleId(user.getRoleId());
messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser));
if (bytes != null) {
messageProperties.setContentLength((long) bytes.length);
return new Message(bytes, messageProperties);
} else {
throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName());
}
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = beanClassLoader;
}
protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException {
return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) {
@Override
protected Class<?> resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
Class<?> clazz = super.resolveClass(classDesc);
CustomMessageConverter.this.checkAllowedList(clazz);
return clazz;
}
};
}
}

85
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/ExecutorConfig.java

@ -0,0 +1,85 @@
package com.logpm.factorydata.oupai.config;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@Slf4j
@EnableAsync
public class ExecutorConfig {
@Bean
public Executor asyncExecutor() {
log.info("start async executor");
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
// 配置核心线程数
threadPoolTaskExecutor.setCorePoolSize(10);
// 配置最大线程数
threadPoolTaskExecutor.setMaxPoolSize(20);
// 配置队列大小
threadPoolTaskExecutor.setQueueCapacity(50);
// 配置线程池中线程的名称前缀
threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_");
// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务:
// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行;
// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常;
// DiscardPolicy:丢弃当前将要加入队列的任务;
// DiscardOldestPolicy:丢弃任务队列中最旧的任务;
threadPoolTaskExecutor.setRejectedExecutionHandler(
new ThreadPoolExecutor.CallerRunsPolicy()
);
threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
static class ContextCopyingDecorator implements TaskDecorator {
@Nonnull
@Override
public Runnable decorate(@Nonnull Runnable runnable) {
RequestAttributes context = RequestContextHolder.currentRequestAttributes();
String tenantId = AuthUtil.getTenantId();
Map<String, Object> all = ThreadLocalUtil.getAll();
Map<String, String> mdcMap = MDC.getCopyOfContextMap();
return () -> {
try {
all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key)));
if (mdcMap != null && !mdcMap.isEmpty()) {
MDC.setContextMap(mdcMap);
}
RequestContextHolder.setRequestAttributes(context);
// 未当前的异步线程绑定租户ID 和切换数据源
log.info(">>>> 异步线程创建,绑定租户数据源 {}",tenantId);
DynamicDataSourceContextHolder.push(tenantId);
runnable.run();
} finally {
RequestContextHolder.resetRequestAttributes();
all.clear();
if (mdcMap != null) {
mdcMap.clear();
}
ThreadLocalUtil.clear();
MDC.clear();
DynamicDataSourceContextHolder.poll();
}
};
}
}
}

40
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/FactoryDataOloConfiguration.java

@ -0,0 +1,40 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.oupai.config;
import com.logpm.factorydata.oupai.pros.FactoryDataProperties;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置feignmybatis包名properties
*
* @author chaos
*/
@Configuration(proxyBeanMethods = false)
@ComponentScan({"org.springblade", "com.logpm"})
@EnableFeignClients({"org.springblade", "com.logpm"})
@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"})
@EnableConfigurationProperties(FactoryDataProperties.class)
public class FactoryDataOloConfiguration {
}

17
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/RabbitConfig.java

@ -0,0 +1,17 @@
package com.logpm.factorydata.oupai.config;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory, CustomMessageConverter converter) {
RabbitTemplate template = new RabbitTemplate(factory);
template.setMessageConverter(converter);
return template;
}
}

130
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/dto/OrderStatusDTO.java

@ -0,0 +1,130 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.oupai.dto;
import lombok.Data;
import org.springblade.core.tool.utils.StringUtil;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* OrderStatus
*
* @author zhy
* @since 2023-06-12
*/
@Data
public class OrderStatusDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotEmpty(message = "派车单号不能为空")
private String dispatchNumber;//派车单号
@NotEmpty(message = "客户订单号不能为空")
private String orderNo;//客户订单号
@NotEmpty(message = "工厂ID不能为空")
private String plantId;//工厂ID
@NotEmpty(message = "物流单号不能为空")
private String logiBillNo;//物流单号
@NotEmpty(message = "包件码不能为空")
private String unitNo;//包件码
@NotEmpty(message = "操作时间不能为空")
private String operationTime;//操作时间
@NotEmpty(message = "当前仓库不能为空")
private String currentWarehouse;//当前仓库
@NotEmpty(message = "目的仓库不能为空")
private String destinationWarehouse;//目的仓库
@NotEmpty(message = "当前仓库不能为空")
//当前仓库名称
private String currentWarehouseName;
@NotEmpty(message = "目的仓库不能为空")
//目的仓库名称
private String destinationWarehouseName;
@NotEmpty(message = "状态不能为空")
private String status;//状态
@NotEmpty(message = "送货任务ID不能为空")
private String distributionContactId;
@NotEmpty(message = "托盘id")
private Integer trayId;
@NotEmpty(message = "托盘编码")
private String trayNo;
@NotEmpty(message = "操作人名称")
private String username;
@NotEmpty(message = "品牌")
private String brandName;
@NotEmpty(message = "来源 汇通 桃源 世平")
private String sourceName;
/**
* 验证参数是否都存在
* @return
*/
public boolean verifyData(){
if(StringUtil.isBlank(dispatchNumber)){
return false;
}
if(StringUtil.isBlank(orderNo)){
return false;
}
if(StringUtil.isBlank(plantId)){
return false;
}
if(StringUtil.isBlank(logiBillNo)){
return false;
}
if(StringUtil.isBlank(unitNo)){
return false;
}
if(StringUtil.isBlank(operationTime)){
return false;
}
if(StringUtil.isBlank(currentWarehouse)){
return false;
}
if(StringUtil.isBlank(destinationWarehouse)){
return false;
}
if(StringUtil.isBlank(status)){
return false;
}
if(StringUtil.isBlank(distributionContactId)){
return false;
}
return true;
}
}

50
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/FactoryNodeEnums.java

@ -0,0 +1,50 @@
package com.logpm.factorydata.oupai.enums;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
/**
* 工厂节点枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum FactoryNodeEnums {
/**
* 始发仓入库
*/
INITIAL_WAREHOUSE_ENTRY(101020, "1", 1),
/** 卸车入库 */
UNLOAD_INCOMING_WAREHOUSE(105040, "4", 1),
;
private Integer code;
private String text;
private Integer mustPush;
FactoryNodeEnums(Integer code, String text, Integer mustPush) {
this.code = code;
this.text = text;
this.mustPush = mustPush;
}
/**
* 获取所有必推节点的编码
*
* @return
*/
public static List<Integer> getMustPushCode() {
List<Integer> list = new ArrayList<>();
for (FactoryNodeEnums value : FactoryNodeEnums.values()) {
if (value.getMustPush() == 1) {
list.add(value.getCode());
}
}
return list;
}
}

62
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeMappingEnums.java

@ -0,0 +1,62 @@
package com.logpm.factorydata.oupai.enums;
import cn.hutool.core.util.ObjectUtil;
import lombok.Getter;
import org.springblade.common.constant.WorkNodeEnums;
/**
* 系统和工厂节点映射枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum NodeMappingEnums {
/**
* 始发仓入库
*/
INITIAL_WAREHOUSE_ENTRY(FactoryNodeEnums.INITIAL_WAREHOUSE_ENTRY, WorkNodeEnums.INITIAL_WAREHOUSE_ENTRY, 1),
/**
* 卸车入库
*/
UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1);
/**
* 系统作业节点
*/
private WorkNodeEnums workNodeEnums;
/**
* 工厂作业节点
*/
private FactoryNodeEnums factoryNodeEnums;
/**
* 状态码
* 存在我们系统同一个作业节点对应工厂多个节点的情况通过状态码区分
*/
private Integer status;
NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) {
this.workNodeEnums = workNodeEnums;
this.factoryNodeEnums = factoryNodeEnums;
this.status = status;
}
public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) {
return getFactoryByNodeAndStatus(workNodeEnums, 1);
}
public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) {
NodeMappingEnums[] values = values();
for (NodeMappingEnums value : values) {
WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums();
Integer status1 = value.getStatus();
FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums();
if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) {
return factoryNodeEnums;
}
}
return null;
}
}

34
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeNeedEnums.java

@ -0,0 +1,34 @@
package com.logpm.factorydata.oupai.enums;
import lombok.Getter;
import java.io.Serializable;
/**
* 作业节点枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum NodeNeedEnums implements Serializable {
/**
* 始发仓入库
*/
INITIAL_WAREHOUSE_ENTRY(101020, "始发仓入库"),
/**
* 卸车入库
*/
UNLOAD_INCOMING_WAREHOUSE(105040, "卸车入库"),
;
private Integer code;
private String value;
NodeNeedEnums(Integer code, String value) {
this.code = code;
this.value = value;
}
}

99
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/interceptor/LocalServerLoginAccountsInterceptor.java

@ -0,0 +1,99 @@
package com.logpm.factorydata.oupai.interceptor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springblade.common.cache.CacheNames;
import org.springblade.common.component.MockLoginService;
import org.springblade.common.exception.CustomerException;
import org.springblade.common.wrapper.CustomHttpServletRequestWrapper;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.redis.lock.LockType;
import org.springblade.core.redis.lock.RedisLockClient;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Log4j2
@AllArgsConstructor
public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter {
private final BladeRedis bladeRedis;
private final Environment environment;
private final RedisLockClient redisLockClient;
private final MockLoginService mockLoginService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException {
try {
CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request);
String account ="shujutongbu";
String tenantId ="627683";
String key =CacheNames.LOCAL_SERVER_USER+tenantId+":"+account;
String lockKey =key+":lock";
JSONObject data =bladeRedis.get(key);
if(Objects.isNull(data)){
boolean flag = redisLockClient.tryLock(lockKey, LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS);
if(flag){
data =bladeRedis.get(key);
if(Objects.isNull(data)){
data = mockLoginService.mockToken(tenantId,account);
bladeRedis.setEx(key,data,2591990L);
redisLockClient.unLock(lockKey, LockType.FAIR);
}
}
}
// 修改或添加header
// 发送登录请求
log.info("##########preHandle: request={}", request);
wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token"));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") );
httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0");
ThreadLocalUtil.put("bladeContext", httpHeaders);
// 用包装后的request替换原始request
request = wrappedRequest;
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
return true;
} catch (Exception e) {
returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员")));
return false;
}
}
private void returnJson(HttpServletResponse response, String json) {
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
try {
writer = response.getWriter();
writer.print(json);
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
if (writer != null) {
writer.close();
}
}
}
}

60
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/launcher/FactoryDataBaseLauncherServiceImpl.java

@ -0,0 +1,60 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.oupai.launcher;
import org.springblade.core.auto.service.AutoService;
import org.springblade.core.launch.constant.NacosConstant;
import org.springblade.core.launch.service.LauncherService;
import org.springblade.core.launch.utils.PropsUtil;
import org.springframework.boot.builder.SpringApplicationBuilder;
import java.util.Properties;
/**
* 启动参数拓展
*
* @author Chill
*/
@AutoService(LauncherService.class)
public class FactoryDataBaseLauncherServiceImpl implements LauncherService {
@Override
public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
Properties props = System.getProperties();
// 开启多数据源
PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true");
// 指定注册配置信息
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile));
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP);
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH);
// 指定注册IP
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1");
// 指定注册端口
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200");
// 自定义命名空间
// PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE);
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE);
// 自定义分组
// PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP);
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP);
}
@Override
public int getOrder() {
return 20;
}
}

129
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/mq/NodeDataPushListener.java

@ -0,0 +1,129 @@
package com.logpm.factorydata.oupai.mq;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.oupai.dto.OrderStatusDTO;
import com.logpm.factorydata.oupai.enums.FactoryNodeEnums;
import com.logpm.factorydata.oupai.enums.NodeMappingEnums;
import com.logpm.factorydata.oupai.enums.NodeNeedEnums;
import com.logpm.factorydata.oupai.pros.OupaiProperties;
import com.logpm.factorydata.vo.PushData;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.WorkNodeEnums;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 监听业务系统推送给志邦的节点数据
*
* @author zhaoqiaobo
* @create 2024-03-18 0:02
*/
@Slf4j
@Component
@AllArgsConstructor
public class NodeDataPushListener {
private final IFactoryDataClient factoryDataClient;
private final OupaiProperties oupaiProperties;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.OPPEIN_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH_DELAYED, type = ExchangeTypes.TOPIC
, delayed = FactoryDataConstants.Mq.DELAYED),
key = FactoryDataConstants.Mq.RoutingKeys.OPPEIN_NODE_DATA_PUSH
))
public void nodeDataPushDelayed(String msg) {
// 直接调用nodeDataPush方法处理接收到的消息
nodeDataPush(msg);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.OPPEIN_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.OPPEIN_NODE_DATA_PUSH
))
@Transactional(rollbackFor = Exception.class)
public void nodeDataPush(String msg) {
// {"brand":"ZBOM","node":"TRANSFER_WAREHOUSE_DEPART","operator":"","operatorTime":"","content":[{"packageCode":"1423090693445"}]}
log.info("接收到节点数据推送:{}", msg);
// 1 校验数据
if (checkData(msg)) {
return;
}
JSONObject entries = JSONUtil.parseObj(msg);
// 节点
String node = entries.getStr("node");
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
FactoryNodeEnums factoryNodeEnums = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums);
// 2 获取业务数据
List<PushData> content = entries.getBeanList("content", PushData.class);
// 数据按订单分组
// 3 拿到所有必推节点的code
List<Integer> mustPushCode = FactoryNodeEnums.getMustPushCode();
if (CollUtil.isNotEmpty(content)) {
for (PushData pushData : content) {
OrderStatusDTO orderStatusDTO = new OrderStatusDTO();
orderStatusDTO.setUnitNo(pushData.getPackageCode()); //包条
orderStatusDTO.setUsername(entries.getStr("operator")); //操作人名称
orderStatusDTO.setStatus(factoryNodeEnums.getText());
orderStatusDTO.setBrandName("欧派");
orderStatusDTO.setOperationTime(entries.getStr("operatorTime")); //时间
// 发送消息
log.info("推送工厂:{}", orderStatusDTO);
String url = oupaiProperties.getHost() + oupaiProperties.getPushNodeUrl();
try {
if (oupaiProperties.getEnable()) {
String result = HttpUtil.post(url, JSONUtil.toJsonStr(orderStatusDTO));
log.info("推送工厂结果:{}", result);
}
} catch (Exception e) {
log.error("推送工厂失败:{}", e);
}
}
}
}
private boolean checkData(String msg) {
if (StrUtil.isEmpty(msg)) {
return true;
}
if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) {
return true;
}
JSONObject entries = JSONUtil.parseObj(msg);
String node = entries.getStr("node");
if (StrUtil.isEmpty(node)) {
return true;
}
// 不是志邦需要的节点数据直接不处理
if (!EnumUtil.contains(NodeNeedEnums.class, node)) {
return true;
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
if (ObjectUtil.isEmpty(workNodeEnums)) {
return true;
}
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
if (CollUtil.isEmpty(content)) {
return true;
}
return false;
}
}

20
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/FactoryDataProperties.java

@ -0,0 +1,20 @@
package com.logpm.factorydata.oupai.pros;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* FactoryProperties
*
* @author pref
*/
@Data
@ConfigurationProperties(prefix = "logpm")
public class FactoryDataProperties {
/**
* 名称
*/
private String name;
}

45
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/OupaiProperties.java

@ -0,0 +1,45 @@
package com.logpm.factorydata.oupai.pros;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* FactoryProperties
*
* @author pref
*/
@Data
@ConfigurationProperties(prefix = "oupai")
@Component
public class OupaiProperties {
/**
* factory厂推送节点数据url
*/
private String pushNodeUrl;
/**
* 是否推送工厂
*/
private Boolean enable = true;
/**
* factory工厂主机地址
*/
private String host;
/**
* 承运商编码
*/
private String carrierCode;
/**
* 补节点数据时的延时时间分钟
*/
private Integer delayedTime = 30;
/** 生成老系统暂存单 */
private Boolean oldAdvance = false;
/** 生成新系统暂存单 */
private Boolean newAdvance = false;
}

73
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-dev.yml

@ -0,0 +1,73 @@
#服务器端口
server:
port: 18970
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#rabbitmq配置
rabbitmq:
host: 192.168.2.46
port: 5672
username: admin
password: admin
#虚拟host 可以不设置,使用server默认host
virtual-host: /
#确认消息已发送到队列(Queue)
publisher-returns: true
publisher-confirm-type: correlated
# 手动提交消息
listener:
simple:
acknowledge-mode: auto
default-requeue-rejected: false
retry:
enabled: true # 开启消费者失败重试
initial-interval: 1000 # 初识的失败等待时长为1秒
multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
max-attempts: 3 # 最大重试次数
stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false
direct:
acknowledge-mode: manual
template:
mandatory: true
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.master.url}
username: ${blade.datasource.factorydata-oupai.master.username}
password: ${blade.datasource.factorydata-oupai.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.627683.url}
username: ${blade.datasource.factorydata-oupai.627683.username}
password: ${blade.datasource.factorydata-oupai.627683.password}
blade:
data-scope:
enabled: false

47
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-prod.yml

@ -0,0 +1,47 @@
#服务器端口
server:
port: 18970
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.master.url}
username: ${blade.datasource.factorydata-oupai.master.username}
password: ${blade.datasource.factorydata-oupai.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.627683.url}
username: ${blade.datasource.factorydata-oupai.627683.username}
password: ${blade.datasource.factorydata-oupai.627683.password}
blade:
data-scope:
enabled: false

73
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-test.yml

@ -0,0 +1,73 @@
#服务器端口
server:
port: 18970
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#rabbitmq配置
rabbitmq:
host: 192.168.2.110
port: 5672
username: admin
password: Slwk@123654
#虚拟host 可以不设置,使用server默认host
virtual-host: /
#确认消息已发送到队列(Queue)
publisher-returns: true
publisher-confirm-type: correlated
# 手动提交消息
listener:
simple:
acknowledge-mode: auto
default-requeue-rejected: false
retry:
enabled: true # 开启消费者失败重试
initial-interval: 1000 # 初识的失败等待时长为1秒
multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
max-attempts: 3 # 最大重试次数
stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false
direct:
acknowledge-mode: manual
template:
mandatory: true
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.master.url}
username: ${blade.datasource.factorydata-oupai.master.username}
password: ${blade.datasource.factorydata-oupai.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-oupai.627683.url}
username: ${blade.datasource.factorydata-oupai.627683.username}
password: ${blade.datasource.factorydata-oupai.627683.password}
blade:
data-scope:
enabled: false

19
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application.yml

@ -0,0 +1,19 @@
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.logpm.**.entity
#swagger扫描路径配置
swagger:
base-packages:
- org.springblade
- com.logpm
logging:
config: classpath:logback.xml
spring:
main:
allow-circular-references: true

40
blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/logback.xml

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="./data/logpm-basic/logs/logs.log"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>

14
blade-service/logpm-factory-data/logpm-factory-data-pan/Dockerfile

@ -0,0 +1,14 @@
FROM 192.168.2.110:7777/hwy/hwy_base:v1.0
MAINTAINER h5u@163.com
RUN mkdir -p /logpm/logpm-factory-data-pan
WORKDIR /logpm/logpm-factory-data-pan
EXPOSE 18990
ADD ./target/logpm-factory-data-pan.jar ./app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Xms128m","-Xmx512m", "app.jar"]
CMD ["--spring.profiles.active=test"]

89
blade-service/logpm-factory-data/logpm-factory-data-pan/pom.xml

@ -0,0 +1,89 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data</artifactId>
<version>3.2.0.RELEASE</version>
</parent>
<artifactId>logpm-factory-data-pan</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-auto</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-swagger</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-trunkline-api</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>logpm-factory-data-base-api</artifactId>
<version>${bladex.project.version}</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-oss</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-resource-api</artifactId>
<version>3.2.0.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<username>${docker.username}</username>
<password>${docker.password}</password>
<repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

20
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/FactoryDataPanApplication.java

@ -0,0 +1,20 @@
package com.logpm.factorydata;
import org.springblade.common.constant.ModuleNameConstant;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
/**
* 皮阿诺工厂数据启动类
*
* @author zhaoqiaobo
* @create 2024-4-26
*/
@BladeCloudApplication
public class FactoryDataPanApplication {
public static void main(String[] args) {
BladeApplication.run(ModuleNameConstant.LOGPM_FACTORY_DATA_PAN_NAME, FactoryDataPanApplication.class, args);
}
}

50
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/AsyncAnnotationAspect.java

@ -0,0 +1,50 @@
package com.logpm.factorydata.pan.aspect;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springblade.common.annotations.LogpmAsync;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@Aspect
@Component
@Slf4j
@Order(-1)
public class AsyncAnnotationAspect {
/**
* 定义一个切点匹配所有带有@LogpmAsync("asyncExecutor")注解的方法
* 注意实际上Spring Framework自带对@LogpmAsync("asyncExecutor")的处理直接这样配置可能会导致预期之外的行为
*/
//@Around("@annotation(org.springblade.common.annotations.LogpmAsync)")
public Object logAroundAsyncMethods(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
LogpmAsync myAsync = method.getAnnotation(LogpmAsync.class);
String annotationValue = myAsync.value();
log.info(">>>>>>>>>>>>>>>>>> annotationValue={}",annotationValue);
log.info("@LogpmAsync注解的值为asyncExecutor,进行数据源切换 ");
// 在方法执行前的操作
String tenantId = AuthUtil.getTenantId();
log.info(">> tenandId {} ",tenantId);
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后的操作
DynamicDataSourceContextHolder.poll();
return result;
}
}

48
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/RabbitAnnotationAspect.java

@ -0,0 +1,48 @@
package com.logpm.factorydata.pan.aspect;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class RabbitAnnotationAspect {
/**
* 该方法为一个切面用于对标记了@RabbitListener注解的方法进行增强主要增加了日志记录和数据源上下文处理的功能
*
* @param joinPoint 切面的连接点表示当前被拦截的方法
* @return 返回被拦截方法的执行结果
* @throws Throwable 如果执行过程中发生异常则抛出
*/
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)")
public Object rabbitMethods(ProceedingJoinPoint joinPoint) throws Throwable {
// 在方法执行前,获取当前租户ID并设置到数据源上下文中
String tenantId = AuthUtil.getTenantId();
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后,从数据源上下文中移除租户ID
DynamicDataSourceContextHolder.poll();
return result;
}
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)")
public Object rabbitHandlerMethods(ProceedingJoinPoint joinPoint) throws Throwable {
// 在方法执行前,获取当前租户ID并设置到数据源上下文中
String tenantId = AuthUtil.getTenantId();
DynamicDataSourceContextHolder.push(tenantId);
// 执行原方法
Object result = joinPoint.proceed();
// 在方法执行后,从数据源上下文中移除租户ID
DynamicDataSourceContextHolder.poll();
return result;
}
}

161
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/CustomMessageConverter.java

@ -0,0 +1,161 @@
package com.logpm.factorydata.pan.config;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.support.converter.AllowedListDeserializingMessageConverter;
import org.springframework.amqp.support.converter.MessageConversionException;
import org.springframework.amqp.utils.SerializationUtils;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.http.HttpHeaders;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
/**
* @author zhaoqiaobo
* @create 2024-05-08
*/
@Component
public class CustomMessageConverter extends AllowedListDeserializingMessageConverter implements BeanClassLoaderAware {
private volatile String defaultCharset = "UTF-8";
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
private String codebaseUrl;
@Deprecated
public void setCodebaseUrl(String codebaseUrl) {
this.codebaseUrl = codebaseUrl;
}
@Override
public Object fromMessage(Message message) throws MessageConversionException {
Object content = null;
MessageProperties properties = message.getMessageProperties();
if (properties != null) {
String contentType = properties.getContentType();
if (contentType != null && contentType.startsWith("text")) {
String encoding = properties.getContentEncoding();
if (encoding == null) {
encoding = "UTF-8";
}
try {
content = new String(message.getBody(), encoding);
} catch (UnsupportedEncodingException var8) {
throw new MessageConversionException("failed to convert text-based Message content", var8);
}
} else if (contentType != null && contentType.equals("application/x-java-serialized-object")) {
try {
content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl));
} catch (IllegalArgumentException | IllegalStateException | IOException var7) {
throw new MessageConversionException("failed to convert serialized Message content", var7);
}
}
}
Map<String, Object> headers = properties.getHeaders();
HttpHeaders httpHeaders = new HttpHeaders();
for (Map.Entry<String, Object> entry : headers.entrySet()) {
if (StrUtil.equals("Blade-Auth", entry.getKey())
|| StrUtil.equals("Authorization", entry.getKey())
|| StrUtil.equals("blade-auth", entry.getKey())
|| StrUtil.equals("authorization", entry.getKey())) {
List value = (List) entry.getValue();
for (Object o : value) {
httpHeaders.add(entry.getKey(), String.valueOf(o));
}
}
}
ThreadLocalUtil.put("bladeContext", httpHeaders);
Object bladeUser = headers.get("bladeUser");
MockHttpServletRequest request = new MockHttpServletRequest();
BladeUser bladeUser1 = JSONUtil.toBean(bladeUser.toString(), BladeUser.class);
request.setAttribute("_BLADE_USER_REQUEST_ATTR_", bladeUser1);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
if (content == null) {
content = message.getBody();
}
return content;
}
@Override
protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException {
byte[] bytes = null;
if (object instanceof byte[]) {
bytes = (byte[]) object;
messageProperties.setContentType("application/octet-stream");
} else if (object instanceof String) {
try {
bytes = ((String) object).getBytes(this.defaultCharset);
} catch (UnsupportedEncodingException var6) {
throw new MessageConversionException("failed to convert to Message content", var6);
}
messageProperties.setContentType("text/plain");
messageProperties.setContentEncoding(this.defaultCharset);
} else if (object instanceof Serializable) {
try {
bytes = SerializationUtils.serialize(object);
} catch (IllegalArgumentException var5) {
throw new MessageConversionException("failed to convert to serialized Message content", var5);
}
messageProperties.setContentType("application/x-java-serialized-object");
}
HttpHeaders headers = (HttpHeaders) ThreadLocalUtil.get("bladeContext");
if (headers != null && !headers.isEmpty()) {
headers.forEach((key, values) -> {
values.forEach((value) -> {
messageProperties.setHeader(key, new String[]{value});
});
});
}
BladeUser user = AuthUtil.getUser();
BladeUser bladeUser = new BladeUser();
bladeUser.setTenantId(user.getTenantId());
bladeUser.setUserId(user.getUserId());
bladeUser.setAccount(user.getAccount());
bladeUser.setRoleId(user.getRoleId());
messageProperties.setHeader("bladeUser", JSONUtil.toJsonStr(bladeUser));
if (bytes != null) {
messageProperties.setContentLength((long) bytes.length);
return new Message(bytes, messageProperties);
} else {
throw new IllegalArgumentException(this.getClass().getSimpleName() + " only supports String, byte[] and Serializable payloads, received: " + object.getClass().getName());
}
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = beanClassLoader;
}
protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException {
return new CodebaseAwareObjectInputStream(is, this.beanClassLoader, codebaseUrl) {
@Override
protected Class<?> resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
Class<?> clazz = super.resolveClass(classDesc);
CustomMessageConverter.this.checkAllowedList(clazz);
return clazz;
}
};
}
}

85
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/ExecutorConfig.java

@ -0,0 +1,85 @@
package com.logpm.factorydata.pan.config;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@Slf4j
@EnableAsync
public class ExecutorConfig {
@Bean
public Executor asyncExecutor() {
log.info("start async executor");
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
// 配置核心线程数
threadPoolTaskExecutor.setCorePoolSize(10);
// 配置最大线程数
threadPoolTaskExecutor.setMaxPoolSize(20);
// 配置队列大小
threadPoolTaskExecutor.setQueueCapacity(50);
// 配置线程池中线程的名称前缀
threadPoolTaskExecutor.setThreadNamePrefix("ASYNC_THREAD_");
// HelloWorldServiceImpl rejection-policy: 当pool已经达到max size时,如何处理新任务:
// CallerRunsPolicy: 不在新线程中执行任务,而是由调用者所在的线程来执行;
// AbortPolicy: 拒绝执行新任务,并抛出RejectedExecutionException异常;
// DiscardPolicy:丢弃当前将要加入队列的任务;
// DiscardOldestPolicy:丢弃任务队列中最旧的任务;
threadPoolTaskExecutor.setRejectedExecutionHandler(
new ThreadPoolExecutor.CallerRunsPolicy()
);
threadPoolTaskExecutor.setTaskDecorator(new ContextCopyingDecorator());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
static class ContextCopyingDecorator implements TaskDecorator {
@Nonnull
@Override
public Runnable decorate(@Nonnull Runnable runnable) {
RequestAttributes context = RequestContextHolder.currentRequestAttributes();
String tenantId = AuthUtil.getTenantId();
Map<String, Object> all = ThreadLocalUtil.getAll();
Map<String, String> mdcMap = MDC.getCopyOfContextMap();
return () -> {
try {
all.keySet().forEach(key -> ThreadLocalUtil.put(key, all.get(key)));
if (mdcMap != null && !mdcMap.isEmpty()) {
MDC.setContextMap(mdcMap);
}
RequestContextHolder.setRequestAttributes(context);
// 未当前的异步线程绑定租户ID 和切换数据源
log.info(">>>> 异步线程创建,绑定租户数据源 {}",tenantId);
DynamicDataSourceContextHolder.push(tenantId);
runnable.run();
} finally {
RequestContextHolder.resetRequestAttributes();
all.clear();
if (mdcMap != null) {
mdcMap.clear();
}
ThreadLocalUtil.clear();
MDC.clear();
DynamicDataSourceContextHolder.poll();
}
};
}
}
}

40
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/FactoryDataOloConfiguration.java

@ -0,0 +1,40 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.pan.config;
import com.logpm.factorydata.pan.pros.FactoryDataProperties;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置feignmybatis包名properties
*
* @author chaos
*/
@Configuration(proxyBeanMethods = false)
@ComponentScan({"org.springblade", "com.logpm"})
@EnableFeignClients({"org.springblade", "com.logpm"})
@MapperScan({"org.springblade.**.mapper.**", "com.logpm.**.mapper.**"})
@EnableConfigurationProperties(FactoryDataProperties.class)
public class FactoryDataOloConfiguration {
}

17
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/RabbitConfig.java

@ -0,0 +1,17 @@
package com.logpm.factorydata.pan.config;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory, CustomMessageConverter converter) {
RabbitTemplate template = new RabbitTemplate(factory);
template.setMessageConverter(converter);
return template;
}
}

130
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/dto/OrderStatusDTO.java

@ -0,0 +1,130 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.pan.dto;
import lombok.Data;
import org.springblade.core.tool.utils.StringUtil;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* OrderStatus
*
* @author zhy
* @since 2023-06-12
*/
@Data
public class OrderStatusDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotEmpty(message = "派车单号不能为空")
private String dispatchNumber;//派车单号
@NotEmpty(message = "客户订单号不能为空")
private String orderNo;//客户订单号
@NotEmpty(message = "工厂ID不能为空")
private String plantId;//工厂ID
@NotEmpty(message = "物流单号不能为空")
private String logiBillNo;//物流单号
@NotEmpty(message = "包件码不能为空")
private String unitNo;//包件码
@NotEmpty(message = "操作时间不能为空")
private String operationTime;//操作时间
@NotEmpty(message = "当前仓库不能为空")
private String currentWarehouse;//当前仓库
@NotEmpty(message = "目的仓库不能为空")
private String destinationWarehouse;//目的仓库
@NotEmpty(message = "当前仓库不能为空")
//当前仓库名称
private String currentWarehouseName;
@NotEmpty(message = "目的仓库不能为空")
//目的仓库名称
private String destinationWarehouseName;
@NotEmpty(message = "状态不能为空")
private String status;//状态
@NotEmpty(message = "送货任务ID不能为空")
private String distributionContactId;
@NotEmpty(message = "托盘id")
private Integer trayId;
@NotEmpty(message = "托盘编码")
private String trayNo;
@NotEmpty(message = "操作人名称")
private String username;
@NotEmpty(message = "品牌")
private String brandName;
@NotEmpty(message = "来源 汇通 桃源 世平")
private String sourceName;
/**
* 验证参数是否都存在
* @return
*/
public boolean verifyData(){
if(StringUtil.isBlank(dispatchNumber)){
return false;
}
if(StringUtil.isBlank(orderNo)){
return false;
}
if(StringUtil.isBlank(plantId)){
return false;
}
if(StringUtil.isBlank(logiBillNo)){
return false;
}
if(StringUtil.isBlank(unitNo)){
return false;
}
if(StringUtil.isBlank(operationTime)){
return false;
}
if(StringUtil.isBlank(currentWarehouse)){
return false;
}
if(StringUtil.isBlank(destinationWarehouse)){
return false;
}
if(StringUtil.isBlank(status)){
return false;
}
if(StringUtil.isBlank(distributionContactId)){
return false;
}
return true;
}
}

49
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/FactoryNodeEnums.java

@ -0,0 +1,49 @@
package com.logpm.factorydata.pan.enums;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
/**
* 工厂节点枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum FactoryNodeEnums {
/** 卸车入库 */
UNLOAD_INCOMING_WAREHOUSE(105040, "4", 1),
/** 干线装车 */
INITIAL_WAREHOUSE_LOADING(105040, "3", 1),
CLERK_REVIEW(303010, "7", 1),
;
private Integer code;
private String text;
private Integer mustPush;
FactoryNodeEnums(Integer code, String text, Integer mustPush) {
this.code = code;
this.text = text;
this.mustPush = mustPush;
}
/**
* 获取所有必推节点的编码
*
* @return
*/
public static List<Integer> getMustPushCode() {
List<Integer> list = new ArrayList<>();
for (FactoryNodeEnums value : FactoryNodeEnums.values()) {
if (value.getMustPush() == 1) {
list.add(value.getCode());
}
}
return list;
}
}

63
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeMappingEnums.java

@ -0,0 +1,63 @@
package com.logpm.factorydata.pan.enums;
import cn.hutool.core.util.ObjectUtil;
import lombok.Getter;
import org.springblade.common.constant.WorkNodeEnums;
/**
* 系统和工厂节点映射枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum NodeMappingEnums {
/**
* 卸车入库
*/
UNLOAD_INCOMING_WAREHOUSE(FactoryNodeEnums.UNLOAD_INCOMING_WAREHOUSE, WorkNodeEnums.UNLOAD_INCOMING_WAREHOUSE, 1),
CLERK_REVIEW(FactoryNodeEnums.CLERK_REVIEW, WorkNodeEnums.CLERK_REVIEW, 1),
/** 干线装车 */
INITIAL_WAREHOUSE_LOADING(FactoryNodeEnums.INITIAL_WAREHOUSE_LOADING, WorkNodeEnums.INITIAL_WAREHOUSE_LOADING, 1)
;
/**
* 系统作业节点
*/
private WorkNodeEnums workNodeEnums;
/**
* 工厂作业节点
*/
private FactoryNodeEnums factoryNodeEnums;
/**
* 状态码
* 存在我们系统同一个作业节点对应工厂多个节点的情况通过状态码区分
*/
private Integer status;
NodeMappingEnums(FactoryNodeEnums factoryNodeEnums, WorkNodeEnums workNodeEnums, Integer status) {
this.workNodeEnums = workNodeEnums;
this.factoryNodeEnums = factoryNodeEnums;
this.status = status;
}
public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums) {
return getFactoryByNodeAndStatus(workNodeEnums, 1);
}
public static FactoryNodeEnums getFactoryByNodeAndStatus(WorkNodeEnums workNodeEnums, Integer status) {
NodeMappingEnums[] values = values();
for (NodeMappingEnums value : values) {
WorkNodeEnums workNodeEnums1 = value.getWorkNodeEnums();
Integer status1 = value.getStatus();
FactoryNodeEnums factoryNodeEnums = value.getFactoryNodeEnums();
if (ObjectUtil.equal(workNodeEnums1, workNodeEnums) && ObjectUtil.equal(status1, status)) {
return factoryNodeEnums;
}
}
return null;
}
}

33
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeNeedEnums.java

@ -0,0 +1,33 @@
package com.logpm.factorydata.pan.enums;
import lombok.Getter;
import java.io.Serializable;
/**
* 作业节点枚举
*
* @author zhaoqiaobo
* @create 2024-03-20 15:19
*/
@Getter
public enum NodeNeedEnums implements Serializable {
/**
* 卸车入库
*/
UNLOAD_INCOMING_WAREHOUSE(105040, "卸车入库"),
/** 干线装车 */
INITIAL_WAREHOUSE_LOADING(103020, "装车"),
CLERK_REVIEW(303010, "文员复核"),
;
private Integer code;
private String value;
NodeNeedEnums(Integer code, String value) {
this.code = code;
this.value = value;
}
}

99
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/interceptor/LocalServerLoginAccountsInterceptor.java

@ -0,0 +1,99 @@
package com.logpm.factorydata.pan.interceptor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springblade.common.cache.CacheNames;
import org.springblade.common.component.MockLoginService;
import org.springblade.common.exception.CustomerException;
import org.springblade.common.wrapper.CustomHttpServletRequestWrapper;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.redis.lock.LockType;
import org.springblade.core.redis.lock.RedisLockClient;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.ThreadLocalUtil;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Log4j2
@AllArgsConstructor
public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapter {
private final BladeRedis bladeRedis;
private final Environment environment;
private final RedisLockClient redisLockClient;
private final MockLoginService mockLoginService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws CustomerException {
try {
CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(request);
String account ="shujutongbu";
String tenantId ="627683";
String key =CacheNames.LOCAL_SERVER_USER+tenantId+":"+account;
String lockKey =key+":lock";
JSONObject data =bladeRedis.get(key);
if(Objects.isNull(data)){
boolean flag = redisLockClient.tryLock(lockKey, LockType.FAIR, 5000, 10000, TimeUnit.MILLISECONDS);
if(flag){
data =bladeRedis.get(key);
if(Objects.isNull(data)){
data = mockLoginService.mockToken(tenantId,account);
bladeRedis.setEx(key,data,2591990L);
redisLockClient.unLock(lockKey, LockType.FAIR);
}
}
}
// 修改或添加header
// 发送登录请求
log.info("##########preHandle: request={}", request);
wrappedRequest.addHeader("Blade-Auth", "bearer "+data.getString("access_token"));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Blade-Auth","bearer "+data.get("access_token") );
httpHeaders.add( "Authorization", "Basic bG9jYWw6bG9jYWxfc2VjcmV0");
ThreadLocalUtil.put("bladeContext", httpHeaders);
// 用包装后的request替换原始request
request = wrappedRequest;
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
return true;
} catch (Exception e) {
returnJson(response, JSONObject.toJSONString(R.fail(500, "服务异常,请联系管理员")));
return false;
}
}
private void returnJson(HttpServletResponse response, String json) {
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
try {
writer = response.getWriter();
writer.print(json);
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
if (writer != null) {
writer.close();
}
}
}
}

60
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/launcher/FactoryDataBaseLauncherServiceImpl.java

@ -0,0 +1,60 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.factorydata.pan.launcher;
import org.springblade.core.auto.service.AutoService;
import org.springblade.core.launch.constant.NacosConstant;
import org.springblade.core.launch.service.LauncherService;
import org.springblade.core.launch.utils.PropsUtil;
import org.springframework.boot.builder.SpringApplicationBuilder;
import java.util.Properties;
/**
* 启动参数拓展
*
* @author Chill
*/
@AutoService(LauncherService.class)
public class FactoryDataBaseLauncherServiceImpl implements LauncherService {
@Override
public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
Properties props = System.getProperties();
// 开启多数据源
PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true");
// 指定注册配置信息
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].data-id", NacosConstant.dataId(appName, profile));
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].group", NacosConstant.NACOS_CONFIG_GROUP);
PropsUtil.setProperty(props, "spring.cloud.nacos.config.extension-configs[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH);
// 指定注册IP
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1");
// 指定注册端口
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.port", "8200");
// 自定义命名空间
// PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE);
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE);
// 自定义分组
// PropsUtil.setProperty(props, "spring.cloud.nacos.config.group", NacosConstant.NACOS_CONFIG_GROUP);
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.group", NacosConstant.NACOS_CONFIG_GROUP);
}
@Override
public int getOrder() {
return 20;
}
}

146
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/mq/NodeDataPushListener.java

@ -0,0 +1,146 @@
package com.logpm.factorydata.pan.mq;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.pan.dto.OrderStatusDTO;
import com.logpm.factorydata.pan.enums.FactoryNodeEnums;
import com.logpm.factorydata.pan.enums.NodeMappingEnums;
import com.logpm.factorydata.pan.enums.NodeNeedEnums;
import com.logpm.factorydata.pan.pros.PanProperties;
import com.logpm.factorydata.vo.PushData;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.WorkNodeEnums;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 监听业务系统推送给志邦的节点数据
*
* @author zhaoqiaobo
* @create 2024-03-18 0:02
*/
@Slf4j
@Component
@AllArgsConstructor
public class NodeDataPushListener {
private final IFactoryDataClient factoryDataClient;
private final PanProperties panProperties;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.PIANO_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH_DELAYED, type = ExchangeTypes.TOPIC
, delayed = FactoryDataConstants.Mq.DELAYED),
key = FactoryDataConstants.Mq.RoutingKeys.PIANO_NODE_DATA_PUSH
))
public void nodeDataPushDelayed(String msg) {
// 直接调用nodeDataPush方法处理接收到的消息
nodeDataPush(msg);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.PIANO_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.PIANO_NODE_DATA_PUSH
))
@Transactional(rollbackFor = Exception.class)
public void nodeDataPush(String msg) {
// {"brand":"PAN","node":"INITIAL_WAREHOUSE_LOADING","operator":"admin","operatorTime":"2024-10-18 15:02:20","address":"在【广州仓】出库","main":"{\"waybillNumber\":\"GZ20241000001\",\"trainNumber\":\"GZGX20241000001\"}","content":[{"packageCode":"PXB240929000976","orderCode":"2090032408030LQZI04","warehouseName":"广州仓","destinationWarehouse":"龙泉仓"}]}
log.info("接收到节点数据推送:{}", msg);
// 1 校验数据
if (checkData(msg)) {
return;
}
JSONObject entries = JSONUtil.parseObj(msg);
// 节点
String node = entries.getStr("node");
String main = entries.getStr("main");
JSONObject mainJson = new JSONObject();
if(StrUtil.isNotEmpty(main)){
mainJson = JSONUtil.parseObj(main);
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
FactoryNodeEnums factoryNodeEnums = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums);
// 2 获取业务数据
List<PushData> content = entries.getBeanList("content", PushData.class);
// 数据按订单分组
// 3 拿到所有必推节点的code
List<Integer> mustPushCode = FactoryNodeEnums.getMustPushCode();
if (CollUtil.isNotEmpty(content)) {
for (PushData pushData : content) {
OrderStatusDTO orderStatusDTO = new OrderStatusDTO();
// 通过包件id 查询包件
orderStatusDTO.setUnitNo(pushData.getPackageCode());
orderStatusDTO.setOrderNo(pushData.getOrderCode());
orderStatusDTO.setStatus(factoryNodeEnums.getText());
orderStatusDTO.setOperationTime(entries.getStr("operatorTime"));
orderStatusDTO.setCurrentWarehouseName(pushData.getWarehouseName());
orderStatusDTO.setUsername(entries.getStr("operator"));
orderStatusDTO.setBrandName("皮阿诺");
// dispatchNumber 车次号
orderStatusDTO.setDispatchNumber(mainJson.getStr("trainNumber"));
// 配送单号
orderStatusDTO.setDistributionContactId(mainJson.getStr("distributionContactId"));
// logiBillNo 运单号
orderStatusDTO.setLogiBillNo(mainJson.getStr("waybillNumber"));
// destinationWarehouseName 目的仓
orderStatusDTO.setDestinationWarehouseName(pushData.getDestinationWarehouse());
// 发送消息
log.info("推送工厂:{}", orderStatusDTO);
String url = panProperties.getHost() + panProperties.getPushNodeUrl();
try {
if (panProperties.getEnable()) {
String result = HttpUtil.post(url, JSONUtil.toJsonStr(orderStatusDTO));
log.info("推送工厂结果:{}", result);
}
} catch (Exception e) {
log.error("推送工厂失败:{}", e);
}
}
}
}
private boolean checkData(String msg) {
if (StrUtil.isEmpty(msg)) {
return true;
}
if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) {
return true;
}
JSONObject entries = JSONUtil.parseObj(msg);
String node = entries.getStr("node");
if (StrUtil.isEmpty(node)) {
return true;
}
// 不是志邦需要的节点数据直接不处理
if (!EnumUtil.contains(NodeNeedEnums.class, node)) {
return true;
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
if (ObjectUtil.isEmpty(workNodeEnums)) {
return true;
}
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
if (CollUtil.isEmpty(content)) {
return true;
}
return false;
}
}

20
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/FactoryDataProperties.java

@ -0,0 +1,20 @@
package com.logpm.factorydata.pan.pros;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* FactoryProperties
*
* @author pref
*/
@Data
@ConfigurationProperties(prefix = "logpm")
public class FactoryDataProperties {
/**
* 名称
*/
private String name;
}

45
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/PanProperties.java

@ -0,0 +1,45 @@
package com.logpm.factorydata.pan.pros;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* FactoryProperties
*
* @author pref
*/
@Data
@ConfigurationProperties(prefix = "pan")
@Component
public class PanProperties {
/**
* factory厂推送节点数据url
*/
private String pushNodeUrl;
/**
* 是否推送工厂
*/
private Boolean enable = true;
/**
* factory工厂主机地址
*/
private String host;
/**
* 承运商编码
*/
private String carrierCode;
/**
* 补节点数据时的延时时间分钟
*/
private Integer delayedTime = 30;
/** 生成老系统暂存单 */
private Boolean oldAdvance = false;
/** 生成新系统暂存单 */
private Boolean newAdvance = false;
}

73
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-dev.yml

@ -0,0 +1,73 @@
#服务器端口
server:
port: 18990
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#rabbitmq配置
rabbitmq:
host: 192.168.2.46
port: 5672
username: admin
password: admin
#虚拟host 可以不设置,使用server默认host
virtual-host: /
#确认消息已发送到队列(Queue)
publisher-returns: true
publisher-confirm-type: correlated
# 手动提交消息
listener:
simple:
acknowledge-mode: auto
default-requeue-rejected: false
retry:
enabled: true # 开启消费者失败重试
initial-interval: 1000 # 初识的失败等待时长为1秒
multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
max-attempts: 3 # 最大重试次数
stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false
direct:
acknowledge-mode: manual
template:
mandatory: true
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.master.url}
username: ${blade.datasource.factorydata-pan.master.username}
password: ${blade.datasource.factorydata-pan.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.627683.url}
username: ${blade.datasource.factorydata-pan.627683.username}
password: ${blade.datasource.factorydata-pan.627683.password}
blade:
data-scope:
enabled: false

47
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-prod.yml

@ -0,0 +1,47 @@
#服务器端口
server:
port: 18990
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.master.url}
username: ${blade.datasource.factorydata-pan.master.username}
password: ${blade.datasource.factorydata-pan.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.627683.url}
username: ${blade.datasource.factorydata-pan.627683.username}
password: ${blade.datasource.factorydata-pan.627683.password}
blade:
data-scope:
enabled: false

73
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-test.yml

@ -0,0 +1,73 @@
#服务器端口
server:
port: 18990
#数据源配置
#spring:
# datasource:
# url: ${blade.datasource.dev.url}
# username: ${blade.datasource.dev.username}
# password: ${blade.datasource.dev.password}
spring:
#rabbitmq配置
rabbitmq:
host: 192.168.2.110
port: 5672
username: admin
password: Slwk@123654
#虚拟host 可以不设置,使用server默认host
virtual-host: /
#确认消息已发送到队列(Queue)
publisher-returns: true
publisher-confirm-type: correlated
# 手动提交消息
listener:
simple:
acknowledge-mode: auto
default-requeue-rejected: false
retry:
enabled: true # 开启消费者失败重试
initial-interval: 1000 # 初识的失败等待时长为1秒
multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
max-attempts: 3 # 最大重试次数
stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false
direct:
acknowledge-mode: manual
template:
mandatory: true
#排除DruidDataSourceAutoConfigure
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
#通用校验配置
validation-query: select 1
#启用sql日志拦截器
proxy-filters:
- sqlLogInterceptor
#设置默认的数据源或者数据源组,默认值即为master
primary: master
datasource:
master:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.master.url}
username: ${blade.datasource.factorydata-pan.master.username}
password: ${blade.datasource.factorydata-pan.master.password}
627683:
druid:
#独立校验配置
validation-query: select 1
#oracle校验
#validation-query: select 1 from dual
url: ${blade.datasource.factorydata-pan.627683.url}
username: ${blade.datasource.factorydata-pan.627683.username}
password: ${blade.datasource.factorydata-pan.627683.password}
blade:
data-scope:
enabled: false

19
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application.yml

@ -0,0 +1,19 @@
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:com/logpm/**/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.logpm.**.entity
#swagger扫描路径配置
swagger:
base-packages:
- org.springblade
- com.logpm
logging:
config: classpath:logback.xml
spring:
main:
allow-circular-references: true

40
blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/logback.xml

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="./data/logpm-basic/logs/logs.log"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save