diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java b/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java index d60420fe5..ff9f81986 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/ModuleNameConstant.java +++ b/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; - /** * 商家模块 */ diff --git a/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java b/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java index ecb9b0952..8946effc8 100644 --- a/blade-biz-common/src/main/java/org/springblade/common/constant/OldSystemDataPushConfig.java +++ b/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"); + } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java index ec786854c..45a49b63a 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelListClient.java +++ b/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 findOrderInfoByOrderPackageCode(@RequestParam("orderPackageCode") String orderPackageCode,@RequestParam("warehouseId") Long warehouseId); + + @PostMapping(API_PREFIX + "/deleteListByParcelListIds") + void deleteListByParcelListIds(@RequestBody List deleteParcelListIds); + + @GetMapping(API_PREFIX + "/findPackageGoodsListByWaybillNoAndWarehouseId") + List findPackageGoodsListByWaybillNoAndWarehouseId(@RequestParam String waybillNo, @RequestParam Long warehouseId); } diff --git a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelNumberClient.java b/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelNumberClient.java index 9994502eb..859d29bab 100644 --- a/blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/feign/IDistributionParcelNumberClient.java +++ b/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 updateNumberIds); } diff --git a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java b/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java index 688462d48..3f4908190 100644 --- a/blade-service-api/logpm-factory-data-api/src/main/java/com/logpm/factorydata/vo/PushData.java +++ b/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; } diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadZeroListVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadZeroListVO.java index d521f7abf..ab272d854 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/LoadZeroListVO.java +++ b/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;//已卸车件数 diff --git a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadZeroVO.java b/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadZeroVO.java index 4201b5804..27cfa5223 100644 --- a/blade-service-api/logpm-trunkline-api/src/main/java/com/logpm/trunkline/vo/UnloadZeroVO.java +++ b/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;//卸车件数 diff --git a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java b/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java index f498609d0..4737ee5fa 100644 --- a/blade-service-api/logpm-warehouse-api/src/main/java/com/logpm/warehouse/feign/IWarehouseWaybillDetailClient.java +++ b/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 findByWaybillIds(@RequestBody List waybillIds); @PostMapping(API_PREFIX+"/deleteByWaybillNo") diff --git a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml index 3e3bde05d..2a94fd6c1 100644 --- a/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml +++ b/blade-service/logpm-aftersales/src/main/java/com/logpm/aftersales/mapper/AftersalesWorkOrderMapper.xml @@ -497,6 +497,8 @@ and date_format(from_unixtime(lawo.create_time),'%Y-%m-%d') LIKE date_format(CONCAT('%', #{param.createTime}, '%'),'%Y-%m-%d') and lawo.process_number LIKE CONCAT('%', #{param.processNumber}, '%') + GROUP BY + lawo.id + 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} + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java index 13a37a426..763753a5f 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.java @@ -76,4 +76,6 @@ public interface DistributionParcelNumberMapper extends BaseMapper deleteParcelListIds); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml index 913d53953..c65c3a54b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionParcelNumberMapper.xml @@ -86,4 +86,12 @@ parcel_list_id = #{packageId} + + delete from logpm_distribution_parcel_number + where parcel_list_id in + + #{item} + + + diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml index 27458a544..77e08cdfb 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml +++ b/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 diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java index 929d55168..86dce2e31 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelListService.java @@ -286,4 +286,8 @@ public interface IDistributionParcelListService extends BaseService findOrderInfoByOrderPackageCode(String orderPackageCode, Long warehouseId); void updateEntityByOpenOrderByAdvanceIds(UpdateOrderDTO updateOrderDTO); + + void deleteListByParcelListIds(List deleteParcelListIds); + + List findPackageGoodsListByWaybillNoAndWarehouseId(String waybillNo, Long warehouseId); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java index 76284d1b8..a740206b5 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionParcelNumberService.java @@ -81,4 +81,7 @@ public interface IDistributionParcelNumberService extends BaseService deleteParcelListIds); + + void updateListByPracelListIds(List updateNumberIds); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAsyncServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAsyncServiceImpl.java index 6743763d3..16c56cb10 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionAsyncServiceImpl.java +++ b/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 zb = brand.get("索菲亚"); + List 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 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 map = new HashMap<>(); - map.put("messageData", JSONUtil.toJsonStr(orderStatusDTO)); - rabbitTemplate.convertAndSend(RabbitConstant.HWY_ORDER_STATUS_EXCHANGE, RabbitConstant.HWY_ORDER_STATUS_ROUTING, map); + // Map 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); } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java index a28c97c8a..824974eac 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelListServiceImpl.java @@ -1520,4 +1520,14 @@ public class DistributionParcelListServiceImpl extends BaseServiceImpl deleteParcelListIds) { + baseMapper.deleteListByParcelListIds(deleteParcelListIds); + } + + @Override + public List findPackageGoodsListByWaybillNoAndWarehouseId(String waybillNo, Long warehouseId) { + return baseMapper.findPackageGoodsListByWaybillNoAndWarehouseId(waybillNo,warehouseId); + } } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelNumberServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelNumberServiceImpl.java index f4565d1f5..2aab33a01 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionParcelNumberServiceImpl.java +++ b/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 deleteParcelListIds) { + baseMapper.deleteListByParcelListIds(deleteParcelListIds); + } + + @Override + public void updateListByPracelListIds(List updateNumberIds) { + List distributionParcelListEntities = distributionParcelListService.listByIds(updateNumberIds); + //转化成以id为key的Map + Map parcelListMap = distributionParcelListEntities.stream().collect(Collectors.toMap(DistributionParcelListEntity::getId, parcelListEntity -> parcelListEntity)); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("parcel_list_id", updateNumberIds); + List 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); + } + } diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java index 430bce15f..01f2d9a44 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java @@ -4839,17 +4839,22 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl 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 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 BaseServiceImplquery().lambda() .eq(DisStockOrdercodeRecoEntity::getCode, stockupDTO.getPacketBarCode()) @@ -2404,6 +2406,7 @@ public class DistributionStockupServiceImpl extends BaseServiceImpl "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 nodeFanoutMsg = buildPickUpByReCheckVO(billLadingEntity, ladingScanEntities, myCurrentWarehouse); iDistributionNodeWorkService.billofladingSignforCheck(nodeFanoutMsg, AuthUtil.getUser()); - + //推送该自提单的包件运单信息 } // 回传工厂数据 // sendFactory(myCurrentWarehouse, parcelListIds); @@ -4051,6 +4051,7 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl { - 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 BaseServiceImplquery().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 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> packageMap, Map deliveryMap, - Map orderInfoMap) { - // 新起线程构建暂存单发送mq - // 获取非干线仓库映射表数据 - Map thirdPlWarehouseMapping = new HashMap<>(); - List warehouseMappingVOList = deliveryNoteService.getThirdPlWarehouseMappingVO(); - if (CollUtil.isNotEmpty(warehouseMappingVOList)) { - warehouseMappingVOList.forEach(vo -> { - thirdPlWarehouseMapping.put(vo.getArriveOrgName(), vo); - }); - } - Map warehouseBindVOMap = new HashMap<>(); - if (CollUtil.isNotEmpty(deliveryMap)) { - for (Map.Entry entry : deliveryMap.entrySet()) { - DeliveryNoteEntity deliveryNoteEntity = entry.getValue(); - if (ObjectUtil.isNotEmpty(deliveryNoteEntity)) { - // 获取工厂基地绑定的始发仓信息 - String textByCode = IDict.getTextByCode(BusSourceEnums.class, deliveryNoteEntity.getBusSource()); - R 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 advances = new ArrayList<>(); - for (Map.Entry> 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 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 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); - } - } - } - } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java index 068267977..cfd8921b0 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/FactoryOrderListener.java +++ b/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 details = vo.getItems(); - if (CollUtil.isEmpty(details)) { - return; - } - R 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> advanceMap = new HashMap<>(); - // 一个dd单号 一个暂存单 - // 组装暂存单数据 - List advances = new ArrayList<>(); - for (PushOrderDetailVO orderInfoVO : details) { - List packageList = new ArrayList<>(); - TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); - List 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 categoryVOMap = new HashMap<>(); - List 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); } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java index ca84679ae..e9126a67b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/mq/NodeDataPushListener.java +++ b/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 orderCodeMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getId, PushOrderDetailEntity::getCustomItemNo)); + Map orderCodeMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getOrderId, PushOrderDetailEntity::getCustomItemNo)); Map detailEntityMap = orderDetailEntities.stream().collect(Collectors.toMap(PushOrderDetailEntity::getCustomItemNo, v -> v)); List orderIds = orderDetailEntities.stream().map(PushOrderDetailEntity::getOrderId).collect(Collectors.toList()); Map pushOrderEntityMap = new HashMap<>(); @@ -113,7 +113,7 @@ public class NodeDataPushListener { List 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 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()); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java index 95f14a8dc..5aa41fb2b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/DeliveryNoteService.java +++ b/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 { List getThirdPlWarehouseMappingVO(); String pushOrder(PushOrderVO vo); + + void buildAdvance(PushOrderVO vo); + + void buildAdvancePull(Map> packageInfoEntityMap, Map deliveryNoteEntityMap, Map orderInfoEntityMap); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java index 4f37587ae..fdb536331 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-jinpai/src/main/java/com/logpm/factorydata/jinpai/service/impl/DeliveryNoteServiceImpl.java +++ b/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 vo) { @@ -137,6 +161,342 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl details = vo.getItems(); + if (CollUtil.isEmpty(details)) { + return; + } + R 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> advanceMap = new HashMap<>(); + // 一个dd单号 一个暂存单 + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (PushOrderDetailVO orderInfoVO : details) { + List packageList = new ArrayList<>(); + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + List 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 categoryVOMap = new HashMap<>(); + List 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> packageMap, Map deliveryMap, Map orderInfoMap) { +// 新起线程构建暂存单发送mq + // 获取非干线仓库映射表数据 + Map thirdPlWarehouseMapping = new HashMap<>(); + List warehouseMappingVOList = this.getThirdPlWarehouseMappingVO(); + if (CollUtil.isNotEmpty(warehouseMappingVOList)) { + warehouseMappingVOList.forEach(vo -> { + thirdPlWarehouseMapping.put(vo.getArriveOrgName(), vo); + }); + } + Map warehouseBindVOMap = new HashMap<>(); + if (CollUtil.isNotEmpty(deliveryMap)) { + for (Map.Entry entry : deliveryMap.entrySet()) { + DeliveryNoteEntity deliveryNoteEntity = entry.getValue(); + if (ObjectUtil.isNotEmpty(deliveryNoteEntity)) { + // 获取工厂基地绑定的始发仓信息 + String textByCode = IDict.getTextByCode(BusSourceEnums.class, deliveryNoteEntity.getBusSource()); + R 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 advances = new ArrayList<>(); + for (Map.Entry> 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 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 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); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml index 0fb69a30d..baa0dc8f8 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml +++ b/blade-service/logpm-factory-data/logpm-factory-data-mwh/pom.xml @@ -44,6 +44,11 @@ logpm-trunkline-api 3.2.0.RELEASE + + org.springblade + logpm-distribution-api + 3.2.0.RELEASE + org.springblade logpm-factory-data-base-api diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java index c2a82e8de..42f732f6b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/controller/OrderController.java +++ b/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> status(@RequestParam("serviceNo") String serviceNo) { + List res = null; + try { + res = service.status(serviceNo); + } catch (Exception e) { + log.error("查询运单状态异常:{} ", e); + return R.success("服务器异常"); + } + return R.data(res); + } + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java index dcd273926..9632dc8bd 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/FactoryNodeEnums.java +++ b/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 { /** - * 已交接 + * 开单 */ - INITIAL_WAREHOUSE_ENTRY(20, "Deliveried"), - /** - * 收货完成 - */ - END_WAREHOUSE_UNLOADING(170, "Received"); + OPEN_ORDER(102010, "开单"), + ; FactoryNodeEnums(Integer code, String text) { init(code, text); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java index 88c6eadff..076f3cfc8 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeMappingEnums.java +++ b/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), + ; /** * 系统作业节点 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java index 5f05d68b8..a5fb5b914 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/enums/NodeNeedEnums.java +++ b/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; diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/mq/NodeDataPushListener.java new file mode 100644 index 000000000..712843c4c --- /dev/null +++ b/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 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 content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/OldProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/pros/OldProperties.java new file mode 100644 index 000000000..ccec06241 --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java index 655d7d549..9e7d7a720 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/FactoryOrderLogService.java +++ b/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 + * @Author zqb 2024/8/19 + **/ + List status(String serviceNo); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java index 34db5d664..70f83a396 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/service/impl/FactoryOrderLogServiceImpl.java +++ b/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 status(String serviceNo) { + + return Collections.emptyList(); + } + private String uploadFile(String body) { //文本内容和保存为本地文件 并上传 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/OrderStatusVO.java b/blade-service/logpm-factory-data/logpm-factory-data-mwh/src/main/java/com/logpm/factorydata/mwh/vo/OrderStatusVO.java new file mode 100644 index 000000000..a759d560b --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java index 07c83687a..d316174b4 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/mq/NodeDataPushListener.java +++ b/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)); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java index 9d414cf8b..eb61e5085 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/pros/OldProperties.java +++ b/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; + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java index 379d31593..d65acccff 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/java/com/logpm/factorydata/olo/service/impl/DeliveryNoteServiceImpl.java +++ b/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>> 文件路径 {}", logPath); MultipartFile multi = getMultipartFile(logPath); - //上传到服务器 + // 上传到服务器 R r = ossClient.fileUpload(multi, "olo-order-logs"); if (r.isSuccess()) { BladeFile data = (BladeFile) r.getData(); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml index 29ec1605a..e00a2c7f1 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-dev.yml +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml index a4c6e1961..cac9b5912 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-prod.yml +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml index 6885a349e..0a64eb463 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-olo/src/main/resources/application-test.yml +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-oupai/Dockerfile new file mode 100644 index 000000000..6827f9207 --- /dev/null +++ b/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"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/pom.xml new file mode 100644 index 000000000..4a548d980 --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-oupai/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + + org.springblade + logpm-factory-data + 3.2.0.RELEASE + + logpm-factory-data-oupai + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/FactoryDataOuPaiApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/FactoryDataOuPaiApplication.java new file mode 100644 index 000000000..a6812225c --- /dev/null +++ b/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); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..1cc4c45fa --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..09c0aa73b --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/CustomMessageConverter.java new file mode 100644 index 000000000..31ad719fa --- /dev/null +++ b/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 headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry 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; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/ExecutorConfig.java new file mode 100644 index 000000000..f84ccc5cf --- /dev/null +++ b/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 all = ThreadLocalUtil.getAll(); + Map 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(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/FactoryDataOloConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/FactoryDataOloConfiguration.java new file mode 100644 index 000000000..811bc3843 --- /dev/null +++ b/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; + +/** + * 配置feign、mybatis包名、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 { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/config/RabbitConfig.java new file mode 100644 index 000000000..6d15377f2 --- /dev/null +++ b/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; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/dto/OrderStatusDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/dto/OrderStatusDTO.java new file mode 100644 index 000000000..6c85413c4 --- /dev/null +++ b/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; + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..b238bbb6d --- /dev/null +++ b/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 getMustPushCode() { + List list = new ArrayList<>(); + for (FactoryNodeEnums value : FactoryNodeEnums.values()) { + if (value.getMustPush() == 1) { + list.add(value.getCode()); + } + } + return list; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeMappingEnums.java new file mode 100644 index 000000000..82ae4c8d9 --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/enums/NodeNeedEnums.java new file mode 100644 index 000000000..b15440137 --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..1e4984d62 --- /dev/null +++ b/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(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..325abc7f4 --- /dev/null +++ b/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; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/mq/NodeDataPushListener.java new file mode 100644 index 000000000..a7b7fc29d --- /dev/null +++ b/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 content = entries.getBeanList("content", PushData.class); + // 数据按订单分组 + // 3 拿到所有必推节点的code + List 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 content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/FactoryDataProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/FactoryDataProperties.java new file mode 100644 index 000000000..292295402 --- /dev/null +++ b/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; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/OupaiProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/java/com/logpm/factorydata/oupai/pros/OupaiProperties.java new file mode 100644 index 000000000..fc4ecedbf --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-dev.yml new file mode 100644 index 000000000..db2cd8903 --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-prod.yml new file mode 100644 index 000000000..2fdd546fc --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application-test.yml new file mode 100644 index 000000000..937b12513 --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/application.yml new file mode 100644 index 000000000..ca8dc27d5 --- /dev/null +++ b/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 + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-oupai/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/Dockerfile b/blade-service/logpm-factory-data/logpm-factory-data-pan/Dockerfile new file mode 100644 index 000000000..b96f3957b --- /dev/null +++ b/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"] diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/pom.xml b/blade-service/logpm-factory-data/logpm-factory-data-pan/pom.xml new file mode 100644 index 000000000..35f8c8b3c --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-pan/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + + org.springblade + logpm-factory-data + 3.2.0.RELEASE + + logpm-factory-data-pan + + + 8 + 8 + + + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-auto + provided + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springblade + logpm-factory-data-api + 3.2.0.RELEASE + + + org.springblade + blade-starter-swagger + + + org.springblade + logpm-trunkline-api + 3.2.0.RELEASE + + + org.springblade + logpm-factory-data-base-api + ${bladex.project.version} + + + org.springblade + blade-starter-oss + + + io.minio + minio + + + org.springblade + blade-resource-api + 3.2.0.RELEASE + compile + + + + + + + + com.spotify + dockerfile-maven-plugin + + ${docker.username} + ${docker.password} + ${docker.registry.url}/${docker.namespace}/${project.artifactId} + ${project.version} + true + + target/${project.build.finalName}.jar + + false + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/FactoryDataPanApplication.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/FactoryDataPanApplication.java new file mode 100644 index 000000000..e18c67412 --- /dev/null +++ b/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); + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/AsyncAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/AsyncAnnotationAspect.java new file mode 100644 index 000000000..21329473a --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/RabbitAnnotationAspect.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/aspect/RabbitAnnotationAspect.java new file mode 100644 index 000000000..399ea2c72 --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/CustomMessageConverter.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/CustomMessageConverter.java new file mode 100644 index 000000000..31a0b2731 --- /dev/null +++ b/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 headers = properties.getHeaders(); + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry 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; + } + }; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/ExecutorConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/ExecutorConfig.java new file mode 100644 index 000000000..3d27bf157 --- /dev/null +++ b/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 all = ThreadLocalUtil.getAll(); + Map 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(); + } + }; + } + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/FactoryDataOloConfiguration.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/FactoryDataOloConfiguration.java new file mode 100644 index 000000000..1d160e91b --- /dev/null +++ b/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; + +/** + * 配置feign、mybatis包名、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 { + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/RabbitConfig.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/config/RabbitConfig.java new file mode 100644 index 000000000..796610ab0 --- /dev/null +++ b/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; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/dto/OrderStatusDTO.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/dto/OrderStatusDTO.java new file mode 100644 index 000000000..edfacb8b8 --- /dev/null +++ b/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; + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/FactoryNodeEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/FactoryNodeEnums.java new file mode 100644 index 000000000..eb00e40dc --- /dev/null +++ b/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 getMustPushCode() { + List list = new ArrayList<>(); + for (FactoryNodeEnums value : FactoryNodeEnums.values()) { + if (value.getMustPush() == 1) { + list.add(value.getCode()); + } + } + return list; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeMappingEnums.java new file mode 100644 index 000000000..116f9a982 --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeNeedEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/enums/NodeNeedEnums.java new file mode 100644 index 000000000..2bec090b5 --- /dev/null +++ b/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; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/interceptor/LocalServerLoginAccountsInterceptor.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/interceptor/LocalServerLoginAccountsInterceptor.java new file mode 100644 index 000000000..819d5bb26 --- /dev/null +++ b/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(); + } + } + } + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/launcher/FactoryDataBaseLauncherServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/launcher/FactoryDataBaseLauncherServiceImpl.java new file mode 100644 index 000000000..34332b080 --- /dev/null +++ b/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; + } +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/mq/NodeDataPushListener.java new file mode 100644 index 000000000..548c49aa0 --- /dev/null +++ b/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 content = entries.getBeanList("content", PushData.class); + // 数据按订单分组 + // 3 拿到所有必推节点的code + List 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 content = entries.getBeanList("content", JSONObject.class); + if (CollUtil.isEmpty(content)) { + return true; + } + return false; + } + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/FactoryDataProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/FactoryDataProperties.java new file mode 100644 index 000000000..8f604468f --- /dev/null +++ b/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; + + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/PanProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/java/com/logpm/factorydata/pan/pros/PanProperties.java new file mode 100644 index 000000000..930136583 --- /dev/null +++ b/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; + +} diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-dev.yml b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-dev.yml new file mode 100644 index 000000000..381a9cf0f --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-prod.yml b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-prod.yml new file mode 100644 index 000000000..6933b2b19 --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-test.yml b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application-test.yml new file mode 100644 index 000000000..862f999d3 --- /dev/null +++ b/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 diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application.yml b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/application.yml new file mode 100644 index 000000000..ca8dc27d5 --- /dev/null +++ b/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 + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/logback.xml b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/logback.xml new file mode 100644 index 000000000..7170050de --- /dev/null +++ b/blade-service/logpm-factory-data/logpm-factory-data-pan/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + logback + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java index bdfc2ddb6..09a76a4b5 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java @@ -7,14 +7,9 @@ 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.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.suofeiya.entity.DeliveryNoteEntity; import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity; import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity; @@ -26,16 +21,9 @@ import com.logpm.factorydata.suofeiya.service.PackageInfoService; import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; import com.logpm.factorydata.suofeiya.vo.OrderInfoVO; import com.logpm.factorydata.suofeiya.vo.PackageInfoVO; -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; @@ -44,11 +32,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 监听索菲亚订单数据 @@ -66,10 +51,6 @@ public class FactoryOrderListener { private final PackageInfoService packageInfoService; private final FactoryOrderLogService logService; - private final BladeRedis bladeRedis; - private final IFactoryDataBaseClient baseClient; - private final IFactoryDataClient factoryDataClient; - @RabbitListener(bindings = @QueueBinding( value = @Queue(name = FactoryDataConstants.Mq.Queues.SFY_FACTORY_ORDER), exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC), @@ -146,155 +127,7 @@ public class FactoryOrderListener { logEntity1.setId(logId); logService.saveOrUpdate(logEntity1); // 处理暂存单 - buildAdvance(vo); - } - } - - @LogpmAsync("asyncExecutor") - public void buildAdvance(DeliveryNoteVO vo) { - // 新起线程构建暂存单发送mq - Long startWarehouseId = null; - String startWarehouseName = null; - String tenantId = null; - // 获取工厂基地绑定的始发仓信息 - List details = vo.getOrderInfo(); - if (CollUtil.isEmpty(details)) { - return; - } - R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.SFY.getValue(), BrandEnums.SFY.getValue()); - 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> advanceMap = new HashMap<>(); - List packageInfos = vo.getPackageInfo(); - // 一个车次号 + 一个订单 一个暂存单 - if (CollUtil.isNotEmpty(packageInfos)) { - for (PackageInfoVO packageInfo : packageInfos) { - String advanceKey = packageInfo.getOrderNo(); - if (advanceMap.containsKey(advanceKey)) { - advanceMap.get(advanceKey).add(packageInfo); - } else { - ArrayList packageInfoVOS = new ArrayList<>(); - packageInfoVOS.add(packageInfo); - advanceMap.put(advanceKey, packageInfoVOS); - } - } - } - - // 组装暂存单数据 - List advances = new ArrayList<>(); - for (OrderInfoVO orderInfoVO : details) { - List packageList = new ArrayList<>(); - if (CollUtil.isEmpty(advanceMap)) { - return; - } - List packageInfoVOS = advanceMap.get(orderInfoVO.getOrderNo()); - if (ObjectUtil.isEmpty(packageInfoVOS)) { - continue; - } - - TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); - advanceEntity.setTenantId(tenantId); - advanceEntity.setStatus(0); - advanceEntity.setIsDeleted(0); - advanceEntity.setHasPackage(CollUtil.isNotEmpty(packageInfoVOS) ? 1 : 0); - advanceEntity.setOrderType(vo.getOrderType()); - advanceEntity.setBrand(BrandEnums.SFY.getValue()); - advanceEntity.setSiteName(""); - advanceEntity.setArea(""); - advanceEntity.setTotalNum(CollUtil.isNotEmpty(packageInfoVOS) ? packageInfoVOS.size() : 0); - advanceEntity.setPackName(""); - advanceEntity.setPackCode(""); - advanceEntity.setWarehouseId(startWarehouseId); - advanceEntity.setWarehouseName(startWarehouseName); - - advanceEntity.setIsGcp(0); - advanceEntity.setCarrierName(vo.getCarrierNo()); - advanceEntity.setSystemType("线上"); - advanceEntity.setMatingType("1"); - advanceEntity.setSenderName(vo.getSendAddr()); - advanceEntity.setSenderPhone(""); - advanceEntity.setSenderAddress(vo.getSendAddr()); - advanceEntity.setWaybillStatus("0"); - advanceEntity.setWaybillNo(""); - advanceEntity.setTrainNumber(vo.getLogisticID()); - advanceEntity.setFreezeStatus("0"); - advanceEntity.setOrderCode(orderInfoVO.getOrderNo()); - advanceEntity.setServiceNum(orderInfoVO.getMainOrderNo()); - advanceEntity.setSenderFactory(vo.getSendAddr()); - - - for (PackageInfoVO orderPackageDTO : packageInfoVOS) { - advanceEntity.setDealerCode(orderPackageDTO.getDealerNo()); - advanceEntity.setDealerName(orderPackageDTO.getDealerName()); - advanceEntity.setStoreCode(orderPackageDTO.getDealerNo()); - advanceEntity.setStoreName(orderPackageDTO.getDealerName()); - advanceEntity.setCustomerName(orderInfoVO.getReceiver()); - advanceEntity.setCustomerPhone(orderInfoVO.getReceiveTel()); - advanceEntity.setCustomerAddress(orderInfoVO.getReceiveAddr()); - // 封装包件 - TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); - advanceDetailEntity.setWarehouseId(startWarehouseId); - advanceDetailEntity.setWarehouseName(startWarehouseName); -// advanceDetailEntity.setIncomingWarehouseId(0L); -// advanceDetailEntity.setIncomingWarehouseName(""); - // 根据遗留单标识赋值 - advanceEntity.setLegacyStatus("0"); - if (StrUtil.contains(orderInfoVO.getOrderNo(), "遗")) { - advanceEntity.setLegacyStatus("1"); - } - advanceDetailEntity.setOrderCode(orderPackageDTO.getOrderNo()); - advanceDetailEntity.setBrand(BrandEnums.SFY.getValue()); - advanceDetailEntity.setSystemType("线上"); - // 一级品类名称 - advanceDetailEntity.setFirstPackName(orderPackageDTO.getPlDepart()); - advanceDetailEntity.setFirstPackCode(""); - // 获取映射品类信息 - // 二级品类名称 - advanceDetailEntity.setSecondPackName(orderPackageDTO.getPlDepart()); - // 三级品类名称 - advanceDetailEntity.setThirdPackName(orderPackageDTO.getPlDepart()); - advanceDetailEntity.setMaterialName(orderPackageDTO.getPlDepart()); - advanceDetailEntity.setSiteName(""); - advanceDetailEntity.setSiteCode(""); - advanceDetailEntity.setQuantity(1); - advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getPaNo()); - advanceDetailEntity.setTrainNumber(vo.getLogisticID()); - advanceDetailEntity.setServiceNum(orderInfoVO.getMainOrderNo()); - 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(vo.getGpsLeaveWhTime()); - advanceDetailEntity.setCarNumber(vo.getTruckNo()); - 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); } } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java index 54fe161d0..212e4a2ae 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java @@ -63,7 +63,7 @@ public class NodeDataPushListener { FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums); // 2 获取业务数据 List content = entries.getBeanList("content", PushData.class); - if (!ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_DISTRIBUTION.getCode()) || !ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_BILLOFLADING.getCode()) ) { + if (!ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_DISTRIBUTION.getCode()) || !ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_BILLOFLADING.getCode())) { // 推送入库出库数据 // 按订单号和运单号进行分组 if (CollUtil.isNotEmpty(content)) { @@ -80,7 +80,7 @@ public class NodeDataPushListener { packages.add(js); } jsons.set("packageInfo", JSONUtil.toJsonStr(packages)); - if (StrUtil.isNotEmpty(oldProperties.getPushNodeUrl())) { + if (oldProperties.getEnable()) { try { log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons)); String post = HttpUtil.post(oldProperties.getPushNodeUrl(), JSONUtil.toJsonStr(jsons)); @@ -99,7 +99,7 @@ public class NodeDataPushListener { for (PushData pushData : content) { packages.add(pushData.getPackageCode()); } - if(StrUtil.isNotEmpty(main)){ + if (StrUtil.isNotEmpty(main)) { JSONObject jsonObject = JSONUtil.parseObj(main); jsons.set("shipPlanNo", jsonObject.getStr("trainNumber")); jsons.set("receiver", jsonObject.getStr("receiver")); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java index e46761742..f178a32f4 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/OldProperties.java @@ -22,4 +22,7 @@ public class OldProperties { */ private String pushNodePlanUrl; + /** 是否推送工厂 */ + private Boolean enable = true; + } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java index f3862dc5c..eb5d66f8b 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java @@ -2,7 +2,6 @@ package com.logpm.factorydata.suofeiya.service; import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity; import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; -import com.logpm.factorydata.suofeiya.vo.ParamVO; import org.springblade.core.mp.base.BaseService; /** @@ -14,4 +13,6 @@ import org.springblade.core.mp.base.BaseService; public interface DeliveryNoteService extends BaseService { String order(DeliveryNoteVO vo); + + void buildAdvance(DeliveryNoteVO vo); } diff --git a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java index 62ad27075..35a557918 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java @@ -1,8 +1,14 @@ package com.logpm.factorydata.suofeiya.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; +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.suofeiya.entity.DeliveryNoteEntity; @@ -11,14 +17,19 @@ import com.logpm.factorydata.suofeiya.mapper.DeliveryNoteMapper; import com.logpm.factorydata.suofeiya.service.DeliveryNoteService; import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService; import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO; -import com.logpm.factorydata.suofeiya.vo.ParamVO; +import com.logpm.factorydata.suofeiya.vo.OrderInfoVO; +import com.logpm.factorydata.suofeiya.vo.PackageInfoVO; 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.utils.FileLogsUtil; import org.springblade.core.mp.base.BaseServiceImpl; @@ -33,7 +44,12 @@ 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.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 发货单 业务实现类 @@ -49,6 +65,7 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl details = vo.getOrderInfo(); + if (CollUtil.isEmpty(details)) { + return; + } + R warehouseByBrandAndSiteName = baseClient.getWarehouseByBrandAndSiteName(BrandEnums.SFY.getValue(), BrandEnums.SFY.getValue()); + 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> advanceMap = new HashMap<>(); + List packageInfos = vo.getPackageInfo(); + // 一个车次号 + 一个订单 一个暂存单 + if (CollUtil.isNotEmpty(packageInfos)) { + for (PackageInfoVO packageInfo : packageInfos) { + String advanceKey = packageInfo.getOrderNo(); + if (advanceMap.containsKey(advanceKey)) { + advanceMap.get(advanceKey).add(packageInfo); + } else { + ArrayList packageInfoVOS = new ArrayList<>(); + packageInfoVOS.add(packageInfo); + advanceMap.put(advanceKey, packageInfoVOS); + } + } + } + + // 组装暂存单数据 + List advances = new ArrayList<>(); + for (OrderInfoVO orderInfoVO : details) { + List packageList = new ArrayList<>(); + if (CollUtil.isEmpty(advanceMap)) { + return; + } + List packageInfoVOS = advanceMap.get(orderInfoVO.getOrderNo()); + if (ObjectUtil.isEmpty(packageInfoVOS)) { + continue; + } + + TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); + advanceEntity.setTenantId(tenantId); + advanceEntity.setStatus(0); + advanceEntity.setIsDeleted(0); + advanceEntity.setHasPackage(CollUtil.isNotEmpty(packageInfoVOS) ? 1 : 0); + advanceEntity.setOrderType(vo.getOrderType()); + advanceEntity.setBrand(BrandEnums.SFY.getValue()); + advanceEntity.setSiteName(""); + advanceEntity.setArea(""); + advanceEntity.setTotalNum(CollUtil.isNotEmpty(packageInfoVOS) ? packageInfoVOS.size() : 0); + advanceEntity.setPackName(""); + advanceEntity.setPackCode(""); + advanceEntity.setWarehouseId(startWarehouseId); + advanceEntity.setWarehouseName(startWarehouseName); + + advanceEntity.setIsGcp(0); + advanceEntity.setCarrierName(vo.getCarrierNo()); + advanceEntity.setSystemType("线上"); + advanceEntity.setMatingType("1"); + advanceEntity.setSenderName(vo.getSendAddr()); + advanceEntity.setSenderPhone(""); + advanceEntity.setSenderAddress(vo.getSendAddr()); + advanceEntity.setWaybillStatus("0"); + advanceEntity.setWaybillNo(""); + advanceEntity.setTrainNumber(vo.getLogisticID()); + advanceEntity.setFreezeStatus("0"); + advanceEntity.setOrderCode(orderInfoVO.getOrderNo()); + advanceEntity.setServiceNum(orderInfoVO.getMainOrderNo()); + advanceEntity.setSenderFactory(vo.getSendAddr()); + + + for (PackageInfoVO orderPackageDTO : packageInfoVOS) { + advanceEntity.setDealerCode(orderPackageDTO.getDealerNo()); + advanceEntity.setDealerName(orderPackageDTO.getDealerName()); + advanceEntity.setStoreCode(orderPackageDTO.getDealerNo()); + advanceEntity.setStoreName(orderPackageDTO.getDealerName()); + advanceEntity.setCustomerName(orderInfoVO.getReceiver()); + advanceEntity.setCustomerPhone(orderInfoVO.getReceiveTel()); + advanceEntity.setCustomerAddress(orderInfoVO.getReceiveAddr()); + // 封装包件 + TrunklineAdvanceDetailEntity advanceDetailEntity = new TrunklineAdvanceDetailEntity(); + advanceDetailEntity.setWarehouseId(startWarehouseId); + advanceDetailEntity.setWarehouseName(startWarehouseName); +// advanceDetailEntity.setIncomingWarehouseId(0L); +// advanceDetailEntity.setIncomingWarehouseName(""); + // 根据遗留单标识赋值 + advanceEntity.setLegacyStatus("0"); + if (StrUtil.contains(orderInfoVO.getOrderNo(), "遗")) { + advanceEntity.setLegacyStatus("1"); + } + advanceDetailEntity.setOrderCode(orderPackageDTO.getOrderNo()); + advanceDetailEntity.setBrand(BrandEnums.SFY.getValue()); + advanceDetailEntity.setSystemType("线上"); + // 一级品类名称 + advanceDetailEntity.setFirstPackName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setFirstPackCode(""); + // 获取映射品类信息 + // 二级品类名称 + advanceDetailEntity.setSecondPackName(orderPackageDTO.getPlDepart()); + // 三级品类名称 + advanceDetailEntity.setThirdPackName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setMaterialName(orderPackageDTO.getPlDepart()); + advanceDetailEntity.setSiteName(""); + advanceDetailEntity.setSiteCode(""); + advanceDetailEntity.setQuantity(1); + advanceDetailEntity.setOrderPackageCode(orderPackageDTO.getPaNo()); + advanceDetailEntity.setTrainNumber(vo.getLogisticID()); + advanceDetailEntity.setServiceNum(orderInfoVO.getMainOrderNo()); + 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(vo.getGpsLeaveWhTime()); + advanceDetailEntity.setCarNumber(vo.getTruckNo()); + 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); log.info(">>> 文件路径 {}", logPath); diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java index 8a8993e6b..7c65f85b7 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/enums/ZbomNodeMappingEnums.java @@ -28,10 +28,17 @@ public enum ZbomNodeMappingEnums { */ INTRANSIT(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.TRANSFER_WAREHOUSE_DEPART, 1), /** - * 送货抵达 -- 末端仓卸货确认 + * 在途 -- 末端仓卸货确认 配送 */ - DELIVERY_ARRIVAL(ZbomNodeEnums.DELIVERY_ARRIVAL, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), - // DELIVERY_ARRIVAL(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), + INTRANSIT_(ZbomNodeEnums.INTRANSIT, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 1), + /** + * 送货抵达 -- 末端仓卸货确认 自提 + */ + DELIVERY_ARRIVAL(ZbomNodeEnums.DELIVERY_ARRIVAL, WorkNodeEnums.END_WAREHOUSE_UNLOADING, 2), + /** + * 送货抵达 -- 配送到达 配送 + */ + DELIVERY_ARRIVAL_CAR_ARRIVED(ZbomNodeEnums.DELIVERY_ARRIVAL, WorkNodeEnums.DISTRIBUTION_CAR_ARRIVED, 1), /** * 在途 -- 三方中转发车 */ diff --git a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java index 21c659e6b..e2303cf9c 100644 --- a/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java +++ b/blade-service/logpm-factory-data/logpm-factory-data-zbom/src/main/java/com/logpm/factorydata/zbom/service/impl/ReceiptServiceImpl.java @@ -124,11 +124,12 @@ public class ReceiptServiceImpl extends BaseServiceImpl value = stringListEntry.getValue(); TrunklineAdvanceEntity advanceEntity = new TrunklineAdvanceEntity(); advanceEntity.setTenantId(tenantId); + advanceEntity.setBrand(BrandEnums.ZB.getValue()); advanceEntity.setStatus(0); advanceEntity.setIsDeleted(0); advanceEntity.setHasPackage(CollUtil.isNotEmpty(zbReceiptDTO.getDetails()) ? 1 : 0); advanceEntity.setOrderType(zbReceiptDTO.getOrderType()); - advanceEntity.setBrand(zbReceiptDTO.getSenderName()); + // advanceEntity.setBrand(zbReceiptDTO.getSenderName()); advanceEntity.setSiteName(""); advanceEntity.setArea(""); advanceEntity.setTotalNum(CollUtil.isNotEmpty(value) ? value.size() : 0); @@ -171,7 +172,8 @@ public class ReceiptServiceImpl extends BaseServiceImpllogpm-factory-data-olo logpm-factory-data-jinpai logpm-factory-data-linsy + logpm-factory-data-oupai logpm-factory-data-mwh logpm-factory-data-mengtian + logpm-factory-data-pan diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java index 1237dd616..485a04a2e 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/controller/FactoryCommonController.java @@ -2,9 +2,14 @@ package com.logpm.factory.comfac.controller; import com.alibaba.fastjson.JSONObject; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import com.logpm.factory.comfac.dto.*; +import com.logpm.factory.comfac.dto.MessageDTO; +import com.logpm.factory.comfac.dto.OrderInfoDTO; +import com.logpm.factory.comfac.dto.OrderStatusDTO; +import com.logpm.factory.comfac.dto.ReceiveInfoDTO; +import com.logpm.factory.comfac.dto.UnloadCarDTO; import com.logpm.factory.comfac.service.IFactoryCommonService; import com.logpm.factory.comfac.service.IOrderStatusLogService; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.entity.OrderStatusLog; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -19,7 +24,11 @@ import org.springblade.core.tool.utils.StringUtil; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +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.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import java.util.Date; import java.util.HashMap; @@ -34,6 +43,7 @@ public class FactoryCommonController { private final RabbitTemplate rabbitTemplate; private final IOrderStatusLogService orderStatusLogService; + private final SendDataProperties sendDataProperties; private final IFactoryCommonService factoryCommonService; @ResponseBody @@ -44,7 +54,7 @@ public class FactoryCommonController { log.info("############sendOrders: 请求参数{}", orderInfoDTO); try { - //先保存原始请求数据 + // 先保存原始请求数据 OrderStatusLog orderStatusLog = new OrderStatusLog(); orderStatusLog.setArgs(JSONObject.toJSONString(orderInfoDTO)); orderStatusLog.setStatus(1); @@ -57,7 +67,7 @@ public class FactoryCommonController { map.put("messageData", orderInfoDTO); map.put("createTime", System.currentTimeMillis()); map.put("flagType", "OrderStatusLog"); - //将消息携带绑定键值 + // 将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.OPEN_ORDER_EXCHANGE, RabbitConstant.OPEN_ORDER_ROUTING, map, new CorrelationData(String.valueOf(orderStatusLog.getId()))); // R r = factoryDataService.handleData(orderInfoDTO); @@ -80,7 +90,7 @@ public class FactoryCommonController { log.info("############sendOrderStatus: 请求参数{}", orderStatusDTO); try { - //先保存原始请求数据 + // 先保存原始请求数据 OrderStatusLog orderStatusLog = new OrderStatusLog(); orderStatusLog.setArgs(JSONObject.toJSONString(orderStatusDTO)); orderStatusLog.setStatus(1); @@ -94,14 +104,15 @@ public class FactoryCommonController { map.put("messageData", orderStatusDTO); map.put("createTime", System.currentTimeMillis()); map.put("flagType", "OrderStatusLog"); - //将消息携带绑定键值 + // 将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.ORDER_STATUS_EXCHANGE, RabbitConstant.ORDER_STATUS_ROUTING, map); map.put("type", "DealWith"); - rabbitTemplate.convertAndSend(RabbitConstant.DEAL_WITH_EXCHANGE, RabbitConstant.DEAL_WITH_ROUTING, map,message->{ - message.getMessageProperties().setHeader("x-delay",2000); - return message; - }); - + if (StringUtil.equals(sendDataProperties.getSend(), "old")) { + rabbitTemplate.convertAndSend(RabbitConstant.DEAL_WITH_EXCHANGE, RabbitConstant.DEAL_WITH_ROUTING, map, message -> { + message.getMessageProperties().setHeader("x-delay", 2000); + return message; + }); + } // R r = factoryDataService.handleStatusData(orderStatusDTO); return R.success("调用成功"); @@ -121,11 +132,11 @@ public class FactoryCommonController { @ApiOperation(value = "签收信息推送", notes = "传入receiveInfoDTO") public R sendReceiveInfo(@RequestBody ReceiveInfoDTO receiveInfoDTO) { log.info("############sendReceiveInfo: 请求参数{}", receiveInfoDTO); - //处理数据 + // 处理数据 // R r = factoryCommonService.sendReceiveInfo(receiveInfoDTO); try { - //先保存原始请求数据 + // 先保存原始请求数据 OrderStatusLog orderStatusLog = new OrderStatusLog(); orderStatusLog.setArgs(JSONObject.toJSONString(receiveInfoDTO)); orderStatusLog.setStatus(1); @@ -138,7 +149,7 @@ public class FactoryCommonController { map.put("messageData", receiveInfoDTO); map.put("createTime", System.currentTimeMillis()); map.put("flagType", "OrderStatusLog"); - //将消息携带绑定键值 + // 将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.RECEIVE_INFO_EXCHANGE, RabbitConstant.RECEIVE_INFO_ROUTING, map); return R.success("调用成功"); @@ -159,7 +170,7 @@ public class FactoryCommonController { @ApiOperation(value = "卸车完成推送", notes = "传入receiveInfoDTO") public R sendUnloadCarComInfo(@RequestBody UnloadCarDTO receiveInfoDTO) { log.info("############sendUnloadCarComInfo: 请求参数{}", receiveInfoDTO); - //处理数据 + // 处理数据 try { if (StringUtil.isBlank(receiveInfoDTO.getCompleteDate())) { @@ -167,7 +178,7 @@ public class FactoryCommonController { receiveInfoDTO.setCompleteDate(data); } - //先保存原始请求数据 + // 先保存原始请求数据 OrderStatusLog orderStatusLog = new OrderStatusLog(); orderStatusLog.setArgs(JSONObject.toJSONString(receiveInfoDTO)); orderStatusLog.setStatus(1); @@ -181,7 +192,7 @@ public class FactoryCommonController { map.put("createTime", System.currentTimeMillis()); map.put("flagType", "OrderStatusLog"); - //将消息携带绑定键值 + // 将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.UNLOAD_CAR_COM_INFO_EXCHANGE, RabbitConstant.UNLOAD_CAR_COM_INFO_ROUTING, map); return R.success("调用成功"); @@ -200,10 +211,10 @@ public class FactoryCommonController { @ApiOperationSupport(order = 1) @ApiOperation(value = "处理对应仓库的上架打托数据", notes = "传入waybillDTO") public R handleDataAllocationTray(@Validated @RequestBody MessageDTO messageDTO) { - log.info("############handleDataAllocationTray: 请求参数{}",messageDTO); - try{ + log.info("############handleDataAllocationTray: 请求参数{}", messageDTO); + try { - //先保存原始请求数据 + // 先保存原始请求数据 OrderStatusLog orderStatusLog = new OrderStatusLog(); orderStatusLog.setArgs(JSONObject.toJSONString(messageDTO)); orderStatusLog.setStatus(1); @@ -216,16 +227,16 @@ public class FactoryCommonController { map.put("messageData", messageDTO); map.put("createTime", System.currentTimeMillis()); map.put("flagType", "OrderStatusLog"); - //将消息携带绑定键值 + // 将消息携带绑定键值 rabbitTemplate.convertAndSend(RabbitConstant.SYNC_OLD_DATA_EXCHANGE, RabbitConstant.SYNC_OLD_DATA_ROUTING, map); return R.success("调用成功"); - }catch (CustomerException e){ - log.error(e.message,e); - return R.fail(e.code,e.message); - }catch (Exception e){ - log.error("############sendOrders: 系统异常",e); - return R.fail(500,"############sendOrders: 系统异常"); + } catch (CustomerException e) { + log.error(e.message, e); + return R.fail(e.code, e.message); + } catch (Exception e) { + log.error("############sendOrders: 系统异常", e); + return R.fail(500, "############sendOrders: 系统异常"); } } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java index 6a755131a..6e73f361a 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/dto/OrderStatusDTO.java @@ -32,15 +32,18 @@ import java.io.Serializable; public class OrderStatusDTO implements Serializable { private static final long serialVersionUID = 1L; + // 车次号 @NotEmpty(message = "派车单号不能为空") private String dispatchNumber;//派车单号 @NotEmpty(message = "客户订单号不能为空") private String orderNo;//客户订单号 + // 工厂推送过来的id @NotEmpty(message = "工厂ID不能为空") private String plantId;//工厂ID + // 运单号 @NotEmpty(message = "物流单号不能为空") private String logiBillNo;//物流单号 @@ -50,13 +53,14 @@ public class OrderStatusDTO implements Serializable { @NotEmpty(message = "操作时间不能为空") private String operationTime;//操作时间 + // 当前仓id @NotEmpty(message = "当前仓库不能为空") private String currentWarehouse;//当前仓库 + // 目的仓id @NotEmpty(message = "目的仓库不能为空") private String destinationWarehouse;//目的仓库 - @NotEmpty(message = "当前仓库不能为空") //当前仓库名称 private String currentWarehouseName; @@ -65,10 +69,11 @@ public class OrderStatusDTO implements Serializable { //目的仓库名称 private String destinationWarehouseName; - + // 123456789这种状态 @NotEmpty(message = "状态不能为空") private String status;//状态 + // 签收才会回传送货单id @NotEmpty(message = "送货任务ID不能为空") private String distributionContactId; diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java index d72bf193e..9096661c3 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/comfac/service/impl/AsyncDataServiceImpl.java @@ -3,7 +3,6 @@ package com.logpm.factory.comfac.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; @@ -441,7 +440,8 @@ public class AsyncDataServiceImpl implements IAsyncDataService { advanceDetailEntity.setMaterialName(StringUtil.isBlank(panPackageInfo.getFirstPackName()) ? "" : panPackageInfo.getFirstPackName()); advanceDetailEntity.setSiteName(PanFactoryEnum.getMes(panPackageInfo.getPlantId())); advanceDetailEntity.setSiteCode(""); - advanceDetailEntity.setQuantity(Objects.isNull(panPackageInfo.getProductNum()) ? 1 : panPackageInfo.getProductNum()); + // advanceDetailEntity.setQuantity(Objects.isNull(panPackageInfo.getProductNum()) ? 1 : panPackageInfo.getProductNum()); + advanceDetailEntity.setQuantity(1); advanceDetailEntity.setOrderPackageCode(StringUtil.isBlank(panPackageInfo.getUnitNo()) ? "" : panPackageInfo.getUnitNo()); advanceDetailEntity.setTrainNumber(StringUtil.isBlank(panFactoryOrder.getLoadingList()) ? "" : panFactoryOrder.getLoadingList()); advanceDetailEntity.setServiceNum(StringUtil.isBlank(panFactoryOrder.getServiceNum()) ? "" : panFactoryOrder.getServiceNum()); @@ -478,7 +478,7 @@ public class AsyncDataServiceImpl implements IAsyncDataService { detailProductEntity.setUnitNo(panPackageInfo.getUnitNo()); detailProductEntity.setProductCode(StringUtil.isBlank(panPackageList.getProsBarcode()) ? "" : panPackageList.getProsBarcode()); detailProductEntity.setProductName(StringUtil.isBlank(panPackageList.getBoardName()) ? "" : panPackageList.getBoardName()); - detailProductEntity.setQuantity(Objects.isNull(panPackageList.getQuantity()) ? 0 : panPackageList.getQuantity()); + detailProductEntity.setQuantity(Objects.isNull(panPackageList.getQuantity()) ? 1 : panPackageList.getQuantity()); detailProductEntity.setStatus(0); detailProductEntity.setIsDeleted(0); itemJsons.add(JSONUtil.parseObj(detailProductEntity)); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java index 368599d49..55d23ef84 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java @@ -431,7 +431,7 @@ public class FactoryXxlJob { .eq(StaorderPackagesEntity::getIdentification, "2") .eq(StaorderPackagesEntity::getOrderId, k) ); - //查询基地名称 + // 查询基地名称 StationlinenumEntity stationlinenumEntity = stationlinenumService.selectNameByNumber(v.getTcWlb006()); String siteName = Objects.isNull(stationlinenumEntity) ? null : stationlinenumEntity.getLogisticsLineName(); Long startWarehouseId = null; @@ -452,7 +452,7 @@ public class FactoryXxlJob { advanceEntity.setIsDeleted(0); advanceEntity.setHasPackage(CollUtil.isNotEmpty(staorderPackagesList) ? 1 : 0); advanceEntity.setOrderType(""); - advanceEntity.setBrand(BrandEnums.SFY.getValue()); + advanceEntity.setBrand(BrandEnums.SNM.getValue()); advanceEntity.setSiteName(siteName); advanceEntity.setArea(""); advanceEntity.setTotalNum(CollUtil.isNotEmpty(staorderPackagesList) ? staorderPackagesList.size() : 0); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java index 0cfe68e2b..30762013a 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/oupai/service/impl/OuPaiFactoryServiceImpl.java @@ -9,14 +9,23 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.logpm.distribution.entity.DistributionParcelListEntity; import com.logpm.distribution.feign.IDistributionParcelListClient; -import com.logpm.factory.comfac.constant.FactoryConstant; import com.logpm.factory.comfac.dto.OrderStatusDTO; import com.logpm.factory.comfac.service.IAsyncDataService; -import com.logpm.factory.oupai.entity.*; +import com.logpm.factory.oupai.entity.FactoryOrderEntity; +import com.logpm.factory.oupai.entity.FactoryPackageDetailEntity; +import com.logpm.factory.oupai.entity.FactoryPackageEntity; +import com.logpm.factory.oupai.entity.OpOrderStatusLogEntity; +import com.logpm.factory.oupai.entity.OpPackagePushLogEntity; +import com.logpm.factory.oupai.entity.ReceivingOrderEntity; import com.logpm.factory.oupai.mapper.ReceivingOrderMapper; -import com.logpm.factory.oupai.service.*; +import com.logpm.factory.oupai.service.IFactoryOrderService; +import com.logpm.factory.oupai.service.IFactoryPackageDetailService; +import com.logpm.factory.oupai.service.IFactoryPackageService; +import com.logpm.factory.oupai.service.IOpOrderStatusLogService; +import com.logpm.factory.oupai.service.IOpPackagePushLogService; +import com.logpm.factory.oupai.service.IOuPaiFactoryService; +import com.logpm.factory.oupai.service.OpPushFailedPackageRecordService; import com.logpm.factory.props.OuPaiProperties; import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.snm.bean.Resp; @@ -42,7 +51,6 @@ import org.springblade.system.cache.DictCache; import org.springblade.system.entity.Dict; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -52,7 +60,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; @Slf4j @Service @@ -886,20 +898,20 @@ public class OuPaiFactoryServiceImpl implements IOuPaiFactoryService { private OpOrderStatusLogEntity sendRequestData(String url, Integer event) { // log.info("#################sendRequestData: 请求地址 url={}", url); - String token = buildToken(); -// log.info(">>> Authorization token {}",token); - HttpResponse httpResponse = HttpRequest.get(url).header("Authorization", token).execute(); - - String result = httpResponse.body(); - OpOrderStatusLogEntity orderStatusLog = new OpOrderStatusLogEntity(); + if(ouPaiProperties.getSendFactory()){ + String token = buildToken(); +// log.info(">>> Authorization token {}",token); + HttpResponse httpResponse = HttpRequest.get(url).header("Authorization", token).execute(); + String result = httpResponse.body(); + orderStatusLog.setResponseBody(result); + orderStatusLog.setResponseUrl(uploadFile(result)); + } orderStatusLog.setArgs(url); orderStatusLog.setStatus(1); orderStatusLog.setType(event); orderStatusLog.setDataStatus(0); orderStatusLog.setBrand("欧派"); - orderStatusLog.setResponseBody(result); - orderStatusLog.setResponseUrl(uploadFile(result)); opOrderStatusLogService.save(orderStatusLog); return orderStatusLog; @@ -914,11 +926,12 @@ public class OuPaiFactoryServiceImpl implements IOuPaiFactoryService { opPackagePushLogEntity.setRefId(refId); opPackagePushLogEntity.setPushOupaiNode(data.getString("Operate")); - - String token = buildToken(); - HttpResponse httpResponse = HttpRequest.post(url).header("Authorization", token).body(data.toJSONString()).execute(); - String result = httpResponse.body(); - opPackagePushLogEntity.setResp(result); + if(ouPaiProperties.getSendFactory()){ + String token = buildToken(); + HttpResponse httpResponse = HttpRequest.post(url).header("Authorization", token).body(data.toJSONString()).execute(); + String result = httpResponse.body(); + opPackagePushLogEntity.setResp(result); + } opPackagePushLogService.save(opPackagePushLogEntity); return opPackagePushLogEntity; diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java index 3017d753c..100a0f797 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/pan/service/impl/PanFactoryDataServiceImpl.java @@ -1,6 +1,8 @@ package com.logpm.factory.pan.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.shaded.com.google.gson.Gson; @@ -245,6 +247,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { //通过包件码查询是否是要推送的订单 String unitNo = orderStatusDTO.getUnitNo();//包件码 String currentWarehouse = orderStatusDTO.getCurrentWarehouse(); + String currentWarehouseName = orderStatusDTO.getCurrentWarehouseName(); QueryWrapper packageInfoQueryWrapper = new QueryWrapper<>(); packageInfoQueryWrapper.eq("unit_no", unitNo); PanPackageInfo one = panPackageInfoService.getOne(packageInfoQueryWrapper); @@ -257,13 +260,19 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { // Map supplyData = advanceDetailClient.getSupplyData(unitNo); //根据仓库ID查询仓库名字 - currentWarehouse = warehouseClient.selectNameById(Integer.parseInt(currentWarehouse)); + if(StrUtil.isEmpty(currentWarehouseName)){ + if(Convert.toLong(currentWarehouse) < Integer.MAX_VALUE){ + currentWarehouseName = warehouseClient.selectNameById(Integer.parseInt(currentWarehouse)); + } + } orderStatusDTO.setPlantId(plantId); - orderStatusDTO.setCurrentWarehouse(currentWarehouse); + orderStatusDTO.setCurrentWarehouse(currentWarehouseName); orderStatusDTO.setDestinationWarehouse(orderStatusDTO.getDestinationWarehouseName()); orderStatusDTO.setLogiBillNo(orderStatusDTO.getLogiBillNo()); - + if(StrUtil.isEmpty(orderStatusDTO.getDistributionContactId())){ + orderStatusDTO.setDistributionContactId("0"); + } //修改状态映射 orderStatusDTO.setStatus(statusName(orderStatusDTO.getStatus())); @@ -340,6 +349,7 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { //通过包件码查询是否是要推送的订单 String unitNo = orderStatusDTO.getUnitNo();//包件码 String currentWarehouse = orderStatusDTO.getCurrentWarehouse(); + String currentWarehouseName = orderStatusDTO.getCurrentWarehouseName(); QueryWrapper packageInfoQueryWrapper = new QueryWrapper<>(); packageInfoQueryWrapper.eq("unit_no", unitNo); PanPackageInfo one = panPackageInfoService.getOne(packageInfoQueryWrapper); @@ -351,13 +361,17 @@ public class PanFactoryDataServiceImpl implements IPanFactoryDataService { String plantId = one.getPlantId(); //根据仓库ID查询仓库名字 - currentWarehouse = warehouseClient.selectNameById(Integer.parseInt(currentWarehouse)); - if (ObjectUtil.isEmpty(currentWarehouse)) { + if(StrUtil.isEmpty(currentWarehouseName)){ + if(Convert.toLong(currentWarehouse) < Integer.MAX_VALUE){ + currentWarehouseName = warehouseClient.selectNameById(Integer.parseInt(currentWarehouse)); + } + } + if (ObjectUtil.isEmpty(currentWarehouseName)) { log.info("#############handleStatusData: 数据不齐全 orderStatusDTO={}", orderStatusDTO); return Resp.fail(405, "数据不齐全"); } orderStatusDTO.setPlantId(plantId); - orderStatusDTO.setCurrentWarehouse(currentWarehouse); + orderStatusDTO.setCurrentWarehouse(currentWarehouseName); orderStatusDTO.setDestinationWarehouse(waybillEntityByOrderPackageCode.getDestinationWarehouseName()); orderStatusDTO.setLogiBillNo(waybillEntityByOrderPackageCode.getWaybillNo()); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/OuPaiProperties.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/OuPaiProperties.java index e2051e938..bb8a4e418 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/OuPaiProperties.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/OuPaiProperties.java @@ -17,6 +17,7 @@ public class OuPaiProperties { private String password; private String uri; + private Boolean sendFactory = true; /** * 基地和老系统仓库的映射 diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/ZbFactoryProperties.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/ZbFactoryProperties.java index 592c68136..56f16be31 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/ZbFactoryProperties.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/props/ZbFactoryProperties.java @@ -13,5 +13,6 @@ public class ZbFactoryProperties { private String customerid; private String secretkey; private String url; + private String sendSystem = ""; } diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java index 7c394149b..2773b5f82 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/HwyOrderStatusHandler.java @@ -68,14 +68,14 @@ public class HwyOrderStatusHandler { R r = null; switch (type) { - case FactoryConstant.PIANO: - r = panFactoryDataService.hwyHandleStatusData(orderStatusDTO); - if (r.getCode() == 400 || r.getCode() == 200) { - log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.PIANO, orderSelfNum); - } else { - throw new CustomerException(r.getCode(), r.getMsg()); - } - break; + // case FactoryConstant.PIANO: + // r = panFactoryDataService.hwyHandleStatusData(orderStatusDTO); + // if (r.getCode() == 400 || r.getCode() == 200) { + // log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.PIANO, orderSelfNum); + // } else { + // throw new CustomerException(r.getCode(), r.getMsg()); + // } + // break; case FactoryConstant.MENGT: if(mtFactoryProperties.getSendEnable()){ r = mtFactoryDataService.handleStatusData(orderStatusDTO); @@ -86,14 +86,14 @@ public class HwyOrderStatusHandler { } } break; - case FactoryConstant.OUPAI: - r = ouPaiFactoryService.handleStatusData(orderStatusDTO); - if (r.getCode() == 400 || r.getCode() == 200) { - log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.OUPAI, orderSelfNum); - } else { - throw new CustomerException(r.getCode(), r.getMsg()); - } - break; + // case FactoryConstant.OUPAI: + // r = ouPaiFactoryService.handleStatusData(orderStatusDTO); + // if (r.getCode() == 400 || r.getCode() == 200) { + // log.info("TAG {} ##################hwyOrderStatusHandler: 该条数据不用处理 orderNo={}", FactoryConstant.OUPAI, orderSelfNum); + // } else { + // throw new CustomerException(r.getCode(), r.getMsg()); + // } + // break; default: log.info("##################hwyOrderStatusHandler: 新系统推送未知品牌 type={}", type); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/OrderStatusHandler.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/OrderStatusHandler.java index 50742269d..613668ce7 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/OrderStatusHandler.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/receiver/OrderStatusHandler.java @@ -1,5 +1,6 @@ package com.logpm.factory.receiver; +import cn.hutool.core.util.StrUtil; import com.logpm.basicdata.feign.IBasicdataTrayClient; import com.logpm.basicdata.feign.IBasicdataWarehouseClient; import com.logpm.factory.comfac.constant.FactoryConstant; @@ -8,6 +9,7 @@ import com.logpm.factory.mt.service.IMtFactoryDataService; import com.logpm.factory.oupai.service.IOuPaiFactoryService; import com.logpm.factory.pan.service.IPanFactoryDataService; import com.logpm.factory.props.MtFactoryProperties; +import com.logpm.factory.props.SendDataProperties; import com.logpm.factory.zb.service.IZbFactoryDataService; import com.logpm.oldproject.entity.AdvanceEntity; import com.logpm.oldproject.feign.IAdvanceClient; @@ -30,6 +32,7 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Map; @@ -80,6 +83,8 @@ public class OrderStatusHandler { private IWarehouseTrayGoodsClient warehouseTrayGoodsClient; @Autowired private IWarehouseUpdownGoodsClient warehouseUpdownGoodsClient; + @Resource + private SendDataProperties sendDataProperties; @RabbitHandler @@ -96,7 +101,7 @@ public class OrderStatusHandler { String type = orderStatusDTO.getBrandName();//品牌 - if (type == null) { + if (type == null && StrUtil.equals(sendDataProperties.getSend(), "old")) { AdvanceEntity advanceEntity = advanceClient.getQueryDataOne(orderSelfNum); if (Objects.isNull(advanceEntity)) { log.info("##################orderStatusHandler: 未找到对应订单 orderNo={}", orderSelfNum); diff --git a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java index ff332bdd9..caf4785d7 100644 --- a/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java +++ b/blade-service/logpm-factory/src/main/java/com/logpm/factory/zb/controller/ZbFactoryDataController.java @@ -3,6 +3,7 @@ package com.logpm.factory.zb.controller; import com.alibaba.fastjson.JSONObject; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.logpm.factory.comfac.service.IAsyncDataService; +import com.logpm.factory.props.ZbFactoryProperties; import com.logpm.factory.zb.bean.ZbResp; import com.logpm.factory.zb.dto.ZBReceiptDTO; import com.logpm.factory.zb.entity.ZbFactoryLogEntity; @@ -55,6 +56,7 @@ public class ZbFactoryDataController { private final IAsyncDataService syncDataService; private final IZbFactoryLogService zbFactoryLogService; + private final ZbFactoryProperties zbFactoryProperties; private final IOssClient ossClient; @@ -119,11 +121,15 @@ public class ZbFactoryDataController { //开启异步线程处理数据 if (!Objects.isNull(orderId)) { - syncDataService.handlerZbDataToHt(orderId); + if(zbFactoryProperties.getSendSystem().contains("old")){ + syncDataService.handlerZbDataToHt(orderId); + } } // 推送数据到新系统 try { - zbFactoryDataService.saveDataNew(zbReceiptDTO); + if(zbFactoryProperties.getSendSystem().contains("new")){ + zbFactoryDataService.saveDataNew(zbReceiptDTO); + } } catch (Exception e) { log.error("志邦数据传新系统失败"); } diff --git a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java index 6a2ecffbf..81d7e4794 100644 --- a/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java +++ b/blade-service/logpm-patch/src/main/java/com/logpm/patch/jobhandle/SyncOrderInfoToPlatform.java @@ -914,5 +914,44 @@ public class SyncOrderInfoToPlatform { return ReturnT.SUCCESS; } + @XxlJob("syncWaybillOrderInfo") + public ReturnT syncWaybillOrderInfo(String param) { + log.info("############syncWaybillOrderInfo: 同步运单下订单信息 开始"); + List waybillJSONs = warehouseMappingDataService.findSyncWaybillOrderInfo(); + + if(StringUtil.isBlank(param)){ + log.warn("###########syncWaybillOrderInfo: 仓库id为空"); + throw new CustomerException(405,"仓库id为空"); + } + + Long warehouseId = Long.parseLong(param); + + BasicdataWarehouseEntity warehouseEntity = basicdataWarehouseClient.getEntityWarehouseId(warehouseId); + if(Objects.isNull(warehouseEntity)){ + log.warn("###########syncWaybillOrderInfo: 仓库信息为空"); + throw new CustomerException(405,"仓库信息为空"); + } + + Integer oldId = warehouseEntity.getOldId(); + + + waybillJSONs.forEach(waybillJSON -> { + + Integer id = waybillJSON.getInt("id"); + String waybillNo = waybillJSON.getStr("waybillNo"); + + List orderCodes = new ArrayList<>(); + orderCodes.add(waybillNo); + + syncOrderInfoService.handleData(orderCodes,oldId,warehouseId,null,null); + + warehouseMappingDataService.updateSyncWaybillOrderRecordById(id,1); + }); + + log.info("############syncWaybillOrderInfo: 同步运单信息 完成"); + + return ReturnT.SUCCESS; + } + } diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml index 7b80290d1..cb0824de1 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadMapper.xml @@ -502,16 +502,16 @@ and ltcl.arrive_time <= #{param.arriveTimeEnd} - and ltcl.arrive_time >= #{param.carrierTimeStart} + and ltcl.carrier_time >= #{param.carrierTimeStart} - and ltcl.arrive_time <= #{param.carrierTimeEnd} + and ltcl.carrier_time <= #{param.carrierTimeEnd} - and ltcl.arrive_time >= #{param.signTimeStart} + and ltcl.sign_time >= #{param.signTimeStart} - and ltcl.arrive_time <= #{param.signTimeEnd} + and ltcl.sign_time <= #{param.signTimeEnd} group by ltcl.id order by ltcl.create_time desc diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java index 1c837c4a4..8038cf6a7 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsLoadScanMapper.java @@ -187,4 +187,6 @@ public interface TrunklineCarsLoadScanMapper extends BaseMapper select ltcls.waybill_no waybillNo, ltcls.order_code orderCode, + lww.consignee consignee, IFNULL(sum(ltcls.num),0) loadingNum, IFNULL(sum(ltcls.unload_num),0) unloadNum from logpm_trunkline_cars_load_scan ltcls + left join logpm_warehouse_waybill lww on lww.waybill_no = ltcls.waybill_no where ltcls.load_id = #{loadId} and ltcls.final_node_id = #{warehouseId} and ltcls.type = '2' group by ltcls.waybill_no, - ltcls.order_code + ltcls.order_code, + lww.consignee + + diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml index 0e8a7f3e2..516d74160 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/mapper/TrunklineCarsOrderMapper.xml @@ -52,16 +52,19 @@ select ltco.waybill_no waybillNo, ltco.order_code orderCode, ltco.plan_num planNum, + lww.consignee consignee, IFNULL(sum(ltcls.num),0) loadingNum, IFNULL(sum(ltcls.unload_num),0) unloadingNum from logpm_trunkline_cars_order ltco left join logpm_trunkline_cars_load_scan ltcls on ltcls.waybill_no = ltco.waybill_no and ltco.order_code = ltcls.order_code and ltco.load_id = ltcls.load_id + left join logpm_warehouse_waybill lww on ltcls.waybill_no = lww.waybill_no where ltco.load_id = #{loadId} and ltco.node_id = #{nodeId} and ltco.type = 2 group by ltco.waybill_no, ltco.order_code, - ltco.plan_num + ltco.plan_num, + lww.consignee