Browse Source

Merge remote-tracking branch 'origin/pre-production'

master
zhenghaoyu 3 months ago
parent
commit
f3c1aed229
  1. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationServiceImpl.java
  2. 36
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java
  3. 106
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionStockupServiceImpl.java
  4. 1
      blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java
  5. 2
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/PackageInfoEntity.java
  6. 6
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/LocalServerLoginAccountsInterceptor.java
  7. 4
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/DeliveryNoteMapper.java
  8. 11
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryNodeOrderMapper.xml
  9. 120
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java
  10. 151
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java
  11. 4
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/FactoryDataSuoFeiYaProperties.java
  12. 32
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/PushProperties.java
  13. 2
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java
  14. 14
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/FactoryDataService.java
  15. 22
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java
  16. 335
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryDataServiceImpl.java
  17. 2
      blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/FactoryAuthVO.java
  18. 2
      blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java
  19. 34
      blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportTimeMapper.xml
  20. 2
      blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportOpenTimeVO.java

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

@ -2078,7 +2078,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl<Distribu
//构建库存品
DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity();
disStockListDetailEntity.setNum(1);
disStockListDetailEntity.setSku(distributionStockListDTO.getSku());
disStockListDetailEntity.setSku(distributionStockListDTO.getCargoNumber());
disStockListDetailEntity.setStockListId(distributionStockListDTO.getId());
disStockListDetailEntity.setStockLockingStatus(InventoryLoadingStatusConstant.weizhuangche.getValue());
disStockListDetailEntity.setStockSignfoStatus(InventorySigningStatusConstant.weiqianshou.getValue());
@ -3513,7 +3513,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl<Distribu
//构建库存品
DisStockListDetailEntity disStockListDetailEntity = new DisStockListDetailEntity();
disStockListDetailEntity.setNum(1);
disStockListDetailEntity.setSku(i.getSku());
disStockListDetailEntity.setSku(i.getCargoNumber());
disStockListDetailEntity.setStockListId(i.getId());
disStockListDetailEntity.setStockLockingStatus(InventoryLoadingStatusConstant.weizhuangche.getValue());
disStockListDetailEntity.setStockSignfoStatus(InventorySigningStatusConstant.weiqianshou.getValue());

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

@ -1363,6 +1363,11 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
log.error(method + "参数异常,ReservationId为空");
return R.fail("请联系管理员");
}
BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse();
if (Objects.isNull(myCurrentWarehouse)){
return R.fail("请选择操作仓库");
}
String zeroPackageIds = distrilbutionloadingscanDTO.getZeroPackageIds();
Long reservationId = distrilbutionloadingscanDTO.getReservationId();
List<Long> list = Func.toLongList(zeroPackageIds);
@ -1421,18 +1426,25 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss");
if (Func.isEmpty(loadscanEntity)) {
String driverId = null;
String vehicId = null;
if ("1".equals(deliveryListEntity.getKind())) {
//自主配送
List<DistributionDeliverySelfVO> deliverySelfInfo = distributionDeliverySelfMapper.getDeliverySelfInfo(deliveryListEntity.getId());
if (!deliverySelfInfo.isEmpty()) {
driverPhone = deliverySelfInfo.stream().filter(f -> 2 == f.getIsMaster()).map(DistributionDeliverySelfVO::getDriverPhone).collect(Collectors.joining(","));
driverName = deliverySelfInfo.stream().filter(f -> 2 == f.getIsMaster()).map(DistributionDeliverySelfVO::getDriverName).collect(Collectors.joining(","));
vehicleNub = deliverySelfInfo.stream().filter(f -> 2 == f.getIsMaster()).map(DistributionDeliverySelfVO::getVehicleNub).collect(Collectors.joining(","));
List<Long> collect = deliverySelfInfo.stream().filter(f -> 2 == f.getIsMaster()).map(DistributionDeliverySelfVO::getId).collect(Collectors.toList());
loadingId = collect.get(0);
List<DistributionDeliverySelfVO> driverInfo = deliverySelfInfo.stream().filter(f -> 2 == f.getIsMaster()).collect(Collectors.toList());
if (driverInfo.size() == 1) {
DistributionDeliverySelfVO distributionDeliverySelfVO = driverInfo.get(0);
driverPhone = distributionDeliverySelfVO.getDriverPhone();
driverName = distributionDeliverySelfVO.getDriverName();
vehicleNub = distributionDeliverySelfVO.getVehicleNub();
loadingId = distributionDeliverySelfVO.getId();
driverId = distributionDeliverySelfVO.getDriverId();
vehicId = distributionDeliverySelfVO.getVehicleId();
}else {
return R.fail("查询司机配置错误");
}
}
} else if ("2".equals(deliveryListEntity.getKind())) {
//外协
DistributionDeliverySelfEntity deliverySelfEntity = this.getDriver(deliveryListEntity, user, false);
@ -1460,6 +1472,10 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
unLoadscanEntity.setPackageId(reservationZeroPackageEntity.getParcelListId());
unLoadscanEntity.setReservationId(reservationId);
unLoadscanEntity.setIsSignfor(1);
unLoadscanEntity.setDriverId(String.valueOf(driverId));
unLoadscanEntity.setVehicleId(String.valueOf(vehicId));
unLoadscanEntity.setWarehouseId(myCurrentWarehouse.getId());
unLoadscanEntity.setWarehouseName(myCurrentWarehouse.getName());
unLoadscanEntity.setDeliveryId(distrilbutionloadingscanDTO.getDeliveryId());
unLoadscanEntity.setScanUser(user.getNickName());
unLoadscanEntity.setIsAbnormalSigning(1);
@ -1667,6 +1683,10 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
if (Func.isNotEmpty(distributionDeliverySelfEntity.getDriverPhone())) {
unLoadscanEntity.setDriverPhone(distributionDeliverySelfEntity.getDriverPhone());
}
if ("".equals(deliveryListEntity.getKind())){
unLoadscanEntity.setDriverId(distributionDeliverySelfEntity.getDriverId());
unLoadscanEntity.setVehicleId(distributionDeliverySelfEntity.getVehicleId());
}
unLoadscanEntity.setScanStatus(LoadingStatusConstant.buluzhuangche.getValue());
unLoadscanEntity.setIsInsert(2);
unLoadscanEntity.setLoadingId(distributionDeliverySelfEntity.getId() + "");
@ -2987,7 +3007,7 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
warehouseUpdownTypeClient.downPackageOrDelTray(loadscanEntity.getOrderPackageCode(), myCurrentWarehouse.getId(), "签收下架解托");
}
//维护订单状态
String content = "包件在" + myCurrentWarehouse.getName() + "由" + loadscanEntity.getSigningUser() + "扫描签收,装车方式:扫描装车,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + distributionReservationEntity.getReservationCode();
String content = "包件在" + myCurrentWarehouse.getName() + "由" + AuthUtil.getNickName() + "扫描签收,装车方式:扫描装车,配送车次号:" + deliveryListEntity.getTrainNumber() + "预约任务号:" + distributionReservationEntity.getReservationCode();
JSONObject trunklinePackageTrackLog = handleLogJSONObject(myCurrentWarehouse, AuthUtil.getUser(), parcelListEntity.getOrderPackageCode(), content, WorkNodeEnums.DISTRIBUTION_SIGN_FOR.getCode(), deliveryListEntity.getId().toString(), parcelListEntity.getWarehouseEntryTimeEnd());
aaa.add(trunklinePackageTrackLog);
} else {

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

@ -33,32 +33,102 @@ import com.logpm.basicdata.entity.BasicdataClientEntity;
import com.logpm.basicdata.entity.BasicdataGoodsAllocationEntity;
import com.logpm.basicdata.entity.BasicdataTrayEntity;
import com.logpm.basicdata.entity.BasicdataWarehouseEntity;
import com.logpm.basicdata.feign.*;
import com.logpm.basicdata.feign.IBasicdataClientClient;
import com.logpm.basicdata.feign.IBasicdataCodeClient;
import com.logpm.basicdata.feign.IBasicdataGoodsAllocationClient;
import com.logpm.basicdata.feign.IBasicdataGoodsAreaClient;
import com.logpm.basicdata.feign.IBasicdataTrayClient;
import com.logpm.basicdata.feign.IBasicdataWarehouseClient;
import com.logpm.basicdata.vo.BasicdataGoodsAreaVO;
import com.logpm.distribution.bean.Resp;
import com.logpm.distribution.dto.app.StockConfigInfoVO;
import com.logpm.distribution.dto.app.StockConfigOrderPackageListVO;
import com.logpm.distribution.dto.app.StockupDTO;
import com.logpm.distribution.dto.app.StockupZeroDTO;
import com.logpm.distribution.entity.*;
import com.logpm.distribution.entity.DisStockListDetailEntity;
import com.logpm.distribution.entity.DisStockOrdercodeRecoEntity;
import com.logpm.distribution.entity.DistributionDeliveryDetailsEntity;
import com.logpm.distribution.entity.DistributionParcelDetailsEntity;
import com.logpm.distribution.entity.DistributionParcelListEntity;
import com.logpm.distribution.entity.DistributionReservationEntity;
import com.logpm.distribution.entity.DistributionReservationPackageEntity;
import com.logpm.distribution.entity.DistributionReservationStocklistEntity;
import com.logpm.distribution.entity.DistributionReservationZeroPackageEntity;
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.excel.DistributionCityExcel;
import com.logpm.distribution.excel.DistributionMarketExcel;
import com.logpm.distribution.excel.DistributionSelfExcel;
import com.logpm.distribution.excel.DistributionStockupPackageListDetailExcel;
import com.logpm.distribution.mapper.*;
import com.logpm.distribution.service.*;
import com.logpm.distribution.vo.*;
import com.logpm.distribution.vo.app.*;
import com.logpm.distribution.mapper.DistributionReservationMapper;
import com.logpm.distribution.mapper.DistributionStockListInfoMapper;
import com.logpm.distribution.mapper.DistributionStockListMapper;
import com.logpm.distribution.mapper.DistributionStockMapper;
import com.logpm.distribution.mapper.DistributionStockupMapper;
import com.logpm.distribution.mapper.DistrilbutionBillLadingMapper;
import com.logpm.distribution.service.IDisStockListDetailService;
import com.logpm.distribution.service.IDisStockOrdercodeRecoService;
import com.logpm.distribution.service.IDistributionAsyncService;
import com.logpm.distribution.service.IDistributionDeliveryDetailsService;
import com.logpm.distribution.service.IDistributionNodeWorkService;
import com.logpm.distribution.service.IDistributionParcelDetailsService;
import com.logpm.distribution.service.IDistributionParcelListService;
import com.logpm.distribution.service.IDistributionReservationPackageService;
import com.logpm.distribution.service.IDistributionReservationService;
import com.logpm.distribution.service.IDistributionReservationStocklistService;
import com.logpm.distribution.service.IDistributionReservationZeroPackageService;
import com.logpm.distribution.service.IDistributionStockArticleService;
import com.logpm.distribution.service.IDistributionStockListService;
import com.logpm.distribution.service.IDistributionStockService;
import com.logpm.distribution.service.IDistributionStockupInfoService;
import com.logpm.distribution.service.IDistributionStockupService;
import com.logpm.distribution.service.IDistrilbutionBillLadingService;
import com.logpm.distribution.service.IDistrilbutionBillPackageService;
import com.logpm.distribution.service.IDistrilbutionBillStockService;
import com.logpm.distribution.vo.DistributionParcelTrayVO;
import com.logpm.distribution.vo.DistributionStockAllocationVO;
import com.logpm.distribution.vo.DistributionStockPackageVO;
import com.logpm.distribution.vo.DistributionStockupInventoryDetailVO;
import com.logpm.distribution.vo.DistributionStockupListVO;
import com.logpm.distribution.vo.DistributionStockupOrderInfoVO;
import com.logpm.distribution.vo.DistributionStockupOrderListVO;
import com.logpm.distribution.vo.DistributionStockupSelfVO;
import com.logpm.distribution.vo.DistributionStockupStockListInfoVO;
import com.logpm.distribution.vo.DistributionStockupStockListVO;
import com.logpm.distribution.vo.DistributionStockupTrayVO;
import com.logpm.distribution.vo.DistributionStockupVO;
import com.logpm.distribution.vo.PackageStockupVO;
import com.logpm.distribution.vo.StockListInfoListVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpClientVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpInventoryConfiglVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpInventoryDetailVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpOrderDetailVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpPackageDetailVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpScanDetailVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpVO;
import com.logpm.distribution.vo.app.DistributionAppStockUpZeroOrderDetailVO;
import com.logpm.distribution.wrapper.DistributionStockupWrapper;
import com.logpm.trunkline.feign.ITrunklinePackageTrackLogClient;
import com.logpm.warehouse.entity.WarehouseGoodsAllocationEntity;
import com.logpm.warehouse.entity.WarehouseTaryAllocationEntity;
import com.logpm.warehouse.entity.WarehouseTrayGoodsEntity;
import com.logpm.warehouse.entity.WarehouseUpdownGoodsEntity;
import com.logpm.warehouse.feign.*;
import com.logpm.warehouse.feign.IWarehouseGoodsAllocationClient;
import com.logpm.warehouse.feign.IWarehouseTaryAllocationClient;
import com.logpm.warehouse.feign.IWarehouseTrayGoodsClient;
import com.logpm.warehouse.feign.IWarehouseUpdownGoodsClient;
import com.logpm.warehouse.feign.IWarehouseUpdownGoodsLogClient;
import com.logpm.warehouse.feign.IWarehouseUpdownStockUpAreaClient;
import com.logpm.warehouse.feign.IWarehouseUpdownTypeClient;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.common.constant.CodeDesEnum;
import org.springblade.common.constant.DictBizConstant;
@ -73,7 +143,11 @@ import org.springblade.common.constant.orderpackage.OrderPackageGroundingStatusC
import org.springblade.common.constant.orderpackage.OrderPackageStatusConstant;
import org.springblade.common.constant.orderpackage.OrderPackageStockupStatusConstant;
import org.springblade.common.constant.pda.PdaAudioLingoStatus;
import org.springblade.common.constant.reservation.*;
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.stockup.StockAssignStatusConstant;
import org.springblade.common.constant.stockup.StockupStatusConstant;
import org.springblade.common.constant.stockup.StockupTypeConstant;
@ -107,7 +181,19 @@ import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
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.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;

1
blade-service/logpm-factory-data/logpm-factory-data-base/src/main/java/com/logpm/factorydata/base/service/impl/MqServiceImpl.java

@ -121,6 +121,7 @@ public class MqServiceImpl implements MqService {
return messagePostProcessor;
}, correlationData);
} catch (Exception e) {
e.printStackTrace();
//出现异常,这里将异常转化为自定义异常MsgException,主要是为了触发重试机制
throw MsgException.builder()
.failMsgEntity(FailMsgEntity.builder()

2
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/entity/PackageInfoEntity.java

@ -23,6 +23,8 @@ public class PackageInfoEntity extends BaseEntity {
private String tenantCode;
@ApiModelProperty(name = "日志id")
private String logId;
@ApiModelProperty(name = "订单类型")
private String orderType;
@ApiModelProperty(name = "发货单id")
private String deliveryNoteId;
@ApiModelProperty(name = "标签号")

6
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/interceptor/LocalServerLoginAccountsInterceptor.java

@ -92,7 +92,7 @@ public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapt
}
// 验证签名
String auth = suoFeiYaProperties.getAuth();
String md5Hex = MD5.create().digestHex(authTime + auth).toUpperCase();
String md5Hex = MD5.create().digestHex(auth + authTime).toUpperCase();
log.info("##########preHandle: md5Hex={}", md5Hex);
if (!StrUtil.equals(md5Hex, sign)) {
log.info("##########preHandle: 签名不正确");
@ -134,8 +134,10 @@ public class LocalServerLoginAccountsInterceptor extends HandlerInterceptorAdapt
request = wrappedRequest;
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
return true;
}
}else{
returnJson(response, JSONObject.toJSONString(R.fail(1, "缺少参数 companyCode")));
return false;
}
return false;
} catch (Exception e) {

4
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/DeliveryNoteMapper.java

@ -6,6 +6,8 @@ import com.logpm.factorydata.suofeiya.vo.FactoryAuthVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 发货单 mapper
*
@ -16,4 +18,6 @@ import org.apache.ibatis.annotations.Param;
public interface DeliveryNoteMapper extends BaseMapper<DeliveryNoteEntity> {
FactoryAuthVO findFactoryAuth(@Param("companyCode") String companyCode);
List<FactoryAuthVO> findFactoryAuthByTenantCode(@Param("tenantId") String tenantId);
}

11
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mapper/FactoryNodeOrderMapper.xml

@ -11,6 +11,15 @@
authorization_header
from sfy_factory_auth
where
logistics_code = #{companyCode}
company_code = #{companyCode}
</select>
<select id="findFactoryAuthByTenantCode" resultType="com.logpm.factorydata.suofeiya.vo.FactoryAuthVO">
select
company_code,
app_key
from sfy_factory_auth
where
tenant_code = #{tenantId}
</select>
</mapper>

120
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/FactoryOrderListener.java

@ -1,39 +1,20 @@
package com.logpm.factorydata.suofeiya.mq;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
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.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.logpm.factorydata.enums.SaxStatusEnums;
import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity;
import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity;
import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity;
import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity;
import com.logpm.factorydata.suofeiya.service.DeliveryNoteService;
import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService;
import com.logpm.factorydata.suofeiya.service.OrderInfoService;
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.suofeiya.service.FactoryDataService;
import com.rabbitmq.client.Channel;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.factorydata.FactoryDataConstants;
import org.springblade.core.secure.utils.AuthUtil;
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.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
/**
* 监听索菲亚订单数据
@ -46,92 +27,25 @@ import java.util.List;
@AllArgsConstructor
public class FactoryOrderListener {
private final DeliveryNoteService deliveryNoteService;
private final OrderInfoService orderInfoService;
private final PackageInfoService packageInfoService;
private final FactoryOrderLogService logService;
private final FactoryDataService factoryDataService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.SFY_FACTORY_ORDER),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.FACTORY_ORDER, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.SFY_FACTORY_ORDER
))
// @Transactional(rollbackFor = Exception.class)
public void factoryOrder(String msg) {
), ackMode = "MANUAL")
public void factoryOrder(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
log.info("处理索菲亚订单:{}", msg);
if (StrUtil.isEmpty(msg)) {
log.error("消息内容为空");
return;
try {
factoryDataService.factoryOrder(msg);
} catch (Exception e) {
e.printStackTrace();
log.error("处理索菲亚订单失败: {}", e.getMessage());
}
FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class);
if (ObjectUtil.isEmpty(logEntity)) {
log.error("消息内容为空");
return;
}
// 去 minio 下载文件到本地,然后解析文件内容为实体对象
DeliveryNoteVO vo = null;
Long logId = logEntity.getId();
String logUrl = logEntity.getLogUrl();
if (StrUtil.isNotEmpty(logUrl)) {
List<String> res = new ArrayList<>();
FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res);
if (CollUtil.isNotEmpty(res)) {
String content = res.get(0);
if (StrUtil.isNotEmpty(content)) {
vo = JSONUtil.toBean(content, DeliveryNoteVO.class);
}
}
}
if (ObjectUtil.isNotNull(vo)) {
// 1 解析数据保存入库
// 车次号唯一
String logisticID = vo.getLogisticID();
List<DeliveryNoteEntity> list = deliveryNoteService.list(Wrappers.<DeliveryNoteEntity>lambdaQuery()
.eq(DeliveryNoteEntity::getLogisticID, logisticID));
if (CollUtil.isNotEmpty(list)) {
log.error("车次号{} 数据已经处理过了, logId: {}", logisticID, logId);
return;
}
// 处理额外的字段
if (CollUtil.isNotEmpty(vo.getOrderExtendFields())) {
vo.setOrderExtendField(JSONUtil.toJsonStr(vo.getOrderExtendFields()));
}
vo.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
vo.setTenantCode(AuthUtil.getTenantId());
deliveryNoteService.save(vo);
List<OrderInfoVO> orderInfos = vo.getOrderInfo();
if (CollUtil.isNotEmpty(orderInfos)) {
List<OrderInfoEntity> infoEntities = new ArrayList<>();
for (OrderInfoVO orderInfo : orderInfos) {
OrderInfoEntity orderInfoEntity = new OrderInfoEntity();
BeanUtil.copyProperties(orderInfo, orderInfoEntity);
orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
orderInfoEntity.setDeliveryNoteId(vo.getId().toString());
orderInfoEntity.setTenantCode(AuthUtil.getTenantId());
infoEntities.add(orderInfoEntity);
}
orderInfoService.saveBatch(infoEntities);
}
if (CollUtil.isNotEmpty(vo.getPackageInfo())) {
List<PackageInfoEntity> packageInfoEntities = new ArrayList<>();
for (PackageInfoVO packageInfo : vo.getPackageInfo()) {
PackageInfoEntity entity = new PackageInfoEntity();
BeanUtil.copyProperties(packageInfo, entity);
entity.setDeliveryNoteId(vo.getId().toString());
entity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
entity.setTenantCode(AuthUtil.getTenantId());
packageInfoEntities.add(entity);
}
packageInfoService.saveBatch(packageInfoEntities);
}
// 2 构建暂存单,发送 mq 消息
FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity();
logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode());
logEntity1.setId(logId);
logService.saveOrUpdate(logEntity1);
// 处理暂存单
deliveryNoteService.buildAdvance(vo);
try {
channel.basicAck(tag, false);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

151
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/mq/NodeDataPushListener.java

@ -1,34 +1,20 @@
package com.logpm.factorydata.suofeiya.mq;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
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.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.logpm.factorydata.feign.IFactoryDataClient;
import com.logpm.factorydata.suofeiya.enums.FactoryNodeEnums;
import com.logpm.factorydata.suofeiya.enums.NodeMappingEnums;
import com.logpm.factorydata.suofeiya.enums.NodeNeedEnums;
import com.logpm.factorydata.suofeiya.pros.OldProperties;
import com.logpm.factorydata.vo.PushData;
import com.logpm.factorydata.suofeiya.service.FactoryDataService;
import com.rabbitmq.client.Channel;
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.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
/**
* 监听业务系统推送给节点数据
@ -41,129 +27,26 @@ import java.util.List;
@AllArgsConstructor
public class NodeDataPushListener {
private final IFactoryDataClient factoryDataClient;
private final OldProperties oldProperties;
private final FactoryDataService factoryDataService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = FactoryDataConstants.Mq.Queues.SFY_NODE_DATA_PUSH, durable = "true"),
exchange = @Exchange(name = FactoryDataConstants.Mq.Exchanges.NODE_DATA_PUSH, type = ExchangeTypes.TOPIC),
key = FactoryDataConstants.Mq.RoutingKeys.SFY_NODE_DATA_PUSH
))
// @Transactional(rollbackFor = Exception.class)
public void nodeDataPush(String msg) {
), ackMode = "MANUAL")
public void nodeDataPush(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
log.info("接收到节点数据推送:{}", msg);
if (checkData(msg)) {
return;
try {
factoryDataService.nodeDataPush(msg);
} catch (Exception e) {
e.printStackTrace();
log.error("处理索菲亚订单失败: {}", e.getMessage());
}
JSONObject entries = JSONUtil.parseObj(msg);
// 节点
String node = entries.getStr("node");
String main = entries.getStr("main");
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums);
// 2 获取业务数据
List<PushData> content = entries.getBeanList("content", PushData.class);
if (!ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_DISTRIBUTION.getCode()) || !ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_BILLOFLADING.getCode())) {
// 推送入库出库数据
// 按订单号和运单号进行分组
if (CollUtil.isNotEmpty(content)) {
JSONObject jsons = new JSONObject();
List<JSONObject> packages = new ArrayList<>();
for (PushData pushData : content) {
String packageCode = pushData.getPackageCode();
// 新系统自动生成的包条码,不用回传
if (StrUtil.isNotEmpty(packageCode) && packageCode.startsWith("HT")) {
if (packageCode.length() == 22) {
continue;
}
}
JSONObject js = new JSONObject();
js.set("paNo", packageCode);
js.set("subinventoryCode", "");
js.set("locatorCode", "");
js.set("updateDate", DateUtil.now());
js.set("paStausNo", "正常");
js.set("logisticsStatus", factoryNode.getText());
packages.add(js);
}
jsons.set("packageInfo", new JSONArray(packages));
if (oldProperties.getEnable()) {
try {
log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons));
String post = HttpUtil.post(oldProperties.getPushNodeUrl(), JSONUtil.toJsonStr(jsons));
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
}
} else {
// 推送配送单计划
if (CollUtil.isNotEmpty(content)) {
JSONObject jsons = new JSONObject();
List<String> packages = new ArrayList<>();
for (PushData pushData : content) {
String packageCode = pushData.getPackageCode();
// 新系统自动生成的包条码,不用回传
if (StrUtil.isNotEmpty(packageCode) && packageCode.startsWith("HT")) {
if (packageCode.length() == 22) {
continue;
}
}
packages.add(pushData.getPackageCode());
}
if (StrUtil.isNotEmpty(main)) {
JSONObject jsonObject = JSONUtil.parseObj(main);
jsons.set("shipPlanNo", jsonObject.getStr("trainNumber"));
jsons.set("receiver", jsonObject.getStr("receiver"));
jsons.set("receiveAddr", jsonObject.getStr("receiveAddr"));
jsons.set("receiveTel", jsonObject.getStr("receiveTel"));
jsons.set("planDeliveryDate", jsonObject.getStr("planDeliveryDate"));
}
jsons.set("paNo", JSONUtil.toJsonStr(packages));
jsons.set("remark", "");
jsons.set("orderExtendFields", new JSONArray());
if (StrUtil.isNotEmpty(oldProperties.getPushNodePlanUrl())) {
try {
log.info("推送节点数据:{}", JSONUtil.toJsonStr(jsons));
String post = HttpUtil.post(oldProperties.getPushNodePlanUrl(), JSONUtil.toJsonStr(jsons));
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
}
try {
channel.basicAck(tag, false);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private boolean checkData(String msg) {
if (StrUtil.isEmpty(msg)) {
return true;
}
if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) {
return true;
}
JSONObject entries = JSONUtil.parseObj(msg);
String node = entries.getStr("node");
if (StrUtil.isEmpty(node)) {
return true;
}
// 不是志邦需要的节点数据直接不处理
if (!EnumUtil.contains(NodeNeedEnums.class, node)) {
return true;
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
if (ObjectUtil.isEmpty(workNodeEnums)) {
return true;
}
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
if (CollUtil.isEmpty(content)) {
return true;
}
return false;
}
}

4
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/FactoryDataSuoFeiYaProperties.java

@ -16,7 +16,11 @@ public class FactoryDataSuoFeiYaProperties {
* 颁布给工厂的认证码
*/
private String auth;
/** auth过期时间 */
private Long authTime;
/** 回传配置 */
private PushProperties push;
}

32
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/pros/PushProperties.java

@ -0,0 +1,32 @@
package com.logpm.factorydata.suofeiya.pros;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
* 老系统配置
* @author zhaoqiaobo
* @Date 2024/5/29
**/
@Data
@Component
public class PushProperties {
/**
* 回传索菲亚推送地址
*/
private String pushHost;
/**
* 寄存仓库存管理接口 paStatusUrl
*/
private String paStatusUrl;
/**
* 配送单计划接口 shipPlanUrl
*/
private String shipPlanUrl;
/** 是否回传推送工厂 */
private Boolean pushEnable = true;
}

2
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/DeliveryNoteService.java

@ -18,4 +18,6 @@ public interface DeliveryNoteService extends BaseService<DeliveryNoteEntity> {
void buildAdvance(DeliveryNoteVO vo);
FactoryAuthVO findFactoryAuth(String companyCode);
FactoryAuthVO findFactoryAuthByTenantCode(String tenantId);
}

14
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/FactoryDataService.java

@ -0,0 +1,14 @@
package com.logpm.factorydata.suofeiya.service;
/**
* 索菲亚工厂数据处理 服务类
*
* @Author zqb
* @Date 2024/4/26
**/
public interface FactoryDataService {
void factoryOrder(String msg);
void nodeDataPush(String msg);
}

22
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/DeliveryNoteServiceImpl.java

@ -261,7 +261,27 @@ public class DeliveryNoteServiceImpl extends BaseServiceImpl<DeliveryNoteMapper,
} else {
FactoryAuthVO factoryAuth = baseMapper.findFactoryAuth(companyCode);
bladeRedis.setEx(key, JSONUtil.toJsonStr(factoryAuth), Duration.ofDays(1));
return baseMapper.findFactoryAuth(companyCode);
return factoryAuth;
}
}
return null;
}
@Override
public FactoryAuthVO findFactoryAuthByTenantCode(String tenantId) {
// redis 缓存数据 缓存时间 1天
if (StrUtil.isNotBlank(tenantId)) {
String key = StrUtil.format("factory-data:suofeiya:tenant-code:", tenantId);
String json = bladeRedis.get(key);
if (StrUtil.isNotBlank(json)) {
return JSONUtil.toBean(json, FactoryAuthVO.class);
} else {
List<FactoryAuthVO> vos = baseMapper.findFactoryAuthByTenantCode(tenantId);
if (CollUtil.isNotEmpty(vos)) {
FactoryAuthVO factoryAuth = vos.get(0);
bladeRedis.setEx(key, JSONUtil.toJsonStr(factoryAuth), Duration.ofDays(1));
return factoryAuth;
}
}
}
return null;

335
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/service/impl/FactoryDataServiceImpl.java

@ -0,0 +1,335 @@
package com.logpm.factorydata.suofeiya.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.HttpUtil;
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.enums.SaxStatusEnums;
import com.logpm.factorydata.suofeiya.entity.DeliveryNoteEntity;
import com.logpm.factorydata.suofeiya.entity.FactoryOrderLogEntity;
import com.logpm.factorydata.suofeiya.entity.OrderInfoEntity;
import com.logpm.factorydata.suofeiya.entity.PackageInfoEntity;
import com.logpm.factorydata.suofeiya.enums.FactoryNodeEnums;
import com.logpm.factorydata.suofeiya.enums.NodeMappingEnums;
import com.logpm.factorydata.suofeiya.enums.NodeNeedEnums;
import com.logpm.factorydata.suofeiya.pros.FactoryDataSuoFeiYaProperties;
import com.logpm.factorydata.suofeiya.pros.OldProperties;
import com.logpm.factorydata.suofeiya.service.DeliveryNoteService;
import com.logpm.factorydata.suofeiya.service.FactoryDataService;
import com.logpm.factorydata.suofeiya.service.FactoryOrderLogService;
import com.logpm.factorydata.suofeiya.service.OrderInfoService;
import com.logpm.factorydata.suofeiya.service.PackageInfoService;
import com.logpm.factorydata.suofeiya.vo.DeliveryNoteVO;
import com.logpm.factorydata.suofeiya.vo.FactoryAuthVO;
import com.logpm.factorydata.suofeiya.vo.OrderInfoVO;
import com.logpm.factorydata.suofeiya.vo.PackageInfoVO;
import com.logpm.factorydata.vo.PushData;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.WorkNodeEnums;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 索菲亚工厂数据处理 业务实现类
*
* @Author zqb
* @Date 2024/4/26
**/
@Slf4j
@Service
@AllArgsConstructor
public class FactoryDataServiceImpl implements FactoryDataService {
private final DeliveryNoteService deliveryNoteService;
private final OrderInfoService orderInfoService;
private final PackageInfoService packageInfoService;
private final FactoryOrderLogService logService;
private final OldProperties oldProperties;
private final FactoryDataSuoFeiYaProperties dataSuoFeiYaProperties;
@Override
@Transactional(rollbackFor = Exception.class)
public void factoryOrder(String msg) {
if (StrUtil.isEmpty(msg)) {
log.error("消息内容为空");
return;
}
FactoryOrderLogEntity logEntity = JSONUtil.toBean(msg, FactoryOrderLogEntity.class);
if (ObjectUtil.isEmpty(logEntity)) {
log.error("消息内容为空");
return;
}
// 去 minio 下载文件到本地,然后解析文件内容为实体对象
DeliveryNoteVO vo = null;
Long logId = logEntity.getId();
String logUrl = logEntity.getLogUrl();
if (StrUtil.isNotEmpty(logUrl)) {
List<String> res = new ArrayList<>();
FileUtil.readLines(URLUtil.url(logUrl), CharsetUtil.CHARSET_UTF_8, res);
if (CollUtil.isNotEmpty(res)) {
String content = res.get(0);
if (StrUtil.isNotEmpty(content)) {
vo = JSONUtil.toBean(content, DeliveryNoteVO.class);
}
}
}
if (ObjectUtil.isNotNull(vo)) {
// 1 解析数据保存入库
// 车次号唯一
String logisticID = vo.getLogisticID();
List<DeliveryNoteEntity> list = deliveryNoteService.list(Wrappers.<DeliveryNoteEntity>lambdaQuery()
.eq(DeliveryNoteEntity::getLogisticID, logisticID));
if (CollUtil.isNotEmpty(list)) {
log.error("车次号{} 数据已经处理过了, logId: {}", logisticID, logId);
return;
}
// 处理额外的字段
if (CollUtil.isNotEmpty(vo.getOrderExtendFields())) {
vo.setOrderExtendField(JSONUtil.toJsonStr(vo.getOrderExtendFields()));
}
vo.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
vo.setTenantCode(AuthUtil.getTenantId());
deliveryNoteService.save(vo);
List<OrderInfoVO> orderInfos = vo.getOrderInfo();
if (CollUtil.isNotEmpty(orderInfos)) {
List<OrderInfoEntity> infoEntities = new ArrayList<>();
for (OrderInfoVO orderInfo : orderInfos) {
OrderInfoEntity orderInfoEntity = new OrderInfoEntity();
BeanUtil.copyProperties(orderInfo, orderInfoEntity);
orderInfoEntity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
orderInfoEntity.setDeliveryNoteId(vo.getId().toString());
orderInfoEntity.setTenantCode(AuthUtil.getTenantId());
infoEntities.add(orderInfoEntity);
}
orderInfoService.saveBatch(infoEntities);
}
if (CollUtil.isNotEmpty(vo.getPackageInfo())) {
List<PackageInfoEntity> packageInfoEntities = new ArrayList<>();
for (PackageInfoVO packageInfo : vo.getPackageInfo()) {
PackageInfoEntity entity = new PackageInfoEntity();
BeanUtil.copyProperties(packageInfo, entity);
entity.setDeliveryNoteId(vo.getId().toString());
entity.setLogId(ObjectUtil.isNotEmpty(logId) ? logId.toString() : null);
entity.setTenantCode(AuthUtil.getTenantId());
packageInfoEntities.add(entity);
}
packageInfoService.saveBatch(packageInfoEntities);
}
// 2 构建暂存单,发送 mq 消息
FactoryOrderLogEntity logEntity1 = new FactoryOrderLogEntity();
logEntity1.setSaxStatus(SaxStatusEnums.SUCCESS.getCode());
logEntity1.setId(logId);
logService.saveOrUpdate(logEntity1);
// 处理暂存单
deliveryNoteService.buildAdvance(vo);
}
}
@Override
public void nodeDataPush(String msg) {
if (checkData(msg)) {
return;
}
JSONObject entries = JSONUtil.parseObj(msg);
// 节点
String node = entries.getStr("node");
String main = entries.getStr("main");
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
FactoryNodeEnums factoryNode = NodeMappingEnums.getFactoryByNodeAndStatus(workNodeEnums);
// 2 获取业务数据
List<PushData> content = entries.getBeanList("content", PushData.class);
Map<String, Set<String>> packageCodeMap = new HashMap<>();
if (CollUtil.isNotEmpty(content)) {
List<String> packageCodes = content.stream().map(PushData::getPackageCode).collect(Collectors.toList());
if (CollUtil.isNotEmpty(packageCodes)) {
List<PackageInfoEntity> list = packageInfoService.list(Wrappers.<PackageInfoEntity>lambdaQuery()
.select(PackageInfoEntity::getPaNo, PackageInfoEntity::getOrderType)
.in(PackageInfoEntity::getPaNo, packageCodes)
.eq(PackageInfoEntity::getTenantCode, AuthUtil.getTenantId())
);
if (CollUtil.isNotEmpty(list)) {
for (PackageInfoEntity packageInfoEntity : list) {
if (packageCodeMap.containsKey(packageInfoEntity.getOrderType())) {
packageCodeMap.get(packageInfoEntity.getOrderType()).add(packageInfoEntity.getPaNo());
} else {
Set<String> objects = new HashSet<>();
objects.add(packageInfoEntity.getPaNo());
packageCodeMap.put(packageInfoEntity.getOrderType(), objects);
}
}
}
}
}
FactoryAuthVO authVO = deliveryNoteService.findFactoryAuthByTenantCode(AuthUtil.getTenantId());
if (ObjectUtil.isEmpty(authVO)) {
return;
}
String companyCode = authVO.getCompanyCode();
String appKey = authVO.getAppKey();
// 获取毫秒值
Long time = DateUtil.current();
if (!ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_DISTRIBUTION.getCode()) || !ObjectUtil.equal(workNodeEnums.getCode(), NodeNeedEnums.PLAN_BILLOFLADING.getCode())) {
// 推送入库出库数据
// 按订单号和运单号进行分组
if (CollUtil.isNotEmpty(content)) {
for (Map.Entry<String, Set<String>> entry : packageCodeMap.entrySet()) {
String key = entry.getKey();
Set<String> value = entry.getValue();
JSONObject jsons = new JSONObject();
List<JSONObject> packages = new ArrayList<>();
for (PushData pushData : content) {
String packageCode = pushData.getPackageCode();
// 新系统自动生成的包条码,不用回传
if (StrUtil.isNotEmpty(packageCode) && packageCode.startsWith("HT")) {
if (packageCode.length() == 22) {
continue;
}
}
if (value.contains(packageCode)) {
JSONObject js = new JSONObject();
js.set("paNo", packageCode);
js.set("subinventoryCode", "");
js.set("locatorCode", "");
js.set("updateDate", DateUtil.now());
js.set("paStausNo", "正常");
js.set("logisticsStatus", factoryNode.getText());
packages.add(js);
}
}
jsons.set("packageInfo", new JSONArray(packages));
jsons.set("orderType", key);
String jsonStr = JSONUtil.toJsonStr(jsons);
if (oldProperties.getEnable()) {
try {
log.info("推送节点数据:{}", jsonStr);
String post = HttpUtil.post(oldProperties.getPushNodeUrl(), jsonStr);
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
if (dataSuoFeiYaProperties.getPush().getPushEnable()) {
String paStatusUrl = dataSuoFeiYaProperties.getPush().getPaStatusUrl();
sendFactory(companyCode, jsonStr, time, appKey, paStatusUrl);
}
}
}
} else {
// 推送配送单计划
if (CollUtil.isNotEmpty(content)) {
for (Map.Entry<String, Set<String>> entry : packageCodeMap.entrySet()) {
String key = entry.getKey();
Set<String> value = entry.getValue();
JSONObject jsons = new JSONObject();
List<String> packages = new ArrayList<>();
for (PushData pushData : content) {
String packageCode = pushData.getPackageCode();
// 新系统自动生成的包条码,不用回传
if (StrUtil.isNotEmpty(packageCode) && packageCode.startsWith("HT")) {
if (packageCode.length() == 22) {
continue;
}
}
if (value.contains(packageCode)) {
packages.add(pushData.getPackageCode());
}
}
if (StrUtil.isNotEmpty(main)) {
JSONObject jsonObject = JSONUtil.parseObj(main);
jsons.set("shipPlanNo", jsonObject.getStr("trainNumber"));
jsons.set("receiver", jsonObject.getStr("receiver"));
jsons.set("receiveAddr", jsonObject.getStr("receiveAddr"));
jsons.set("receiveTel", jsonObject.getStr("receiveTel"));
jsons.set("planDeliveryDate", jsonObject.getStr("planDeliveryDate"));
}
jsons.set("paNo", JSONUtil.toJsonStr(packages));
jsons.set("remark", "");
jsons.set("orderExtendFields", new JSONArray());
jsons.set("orderType", key);
String jsonStr = JSONUtil.toJsonStr(jsons);
if (oldProperties.getEnable()) {
try {
log.info("推送节点数据:{}", jsonStr);
String post = HttpUtil.post(oldProperties.getPushNodePlanUrl(), jsonStr);
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
if (dataSuoFeiYaProperties.getPush().getPushEnable()) {
String paStatusUrl = dataSuoFeiYaProperties.getPush().getShipPlanUrl();
sendFactory(companyCode, jsonStr, time, appKey, paStatusUrl);
}
}
}
}
}
private void sendFactory(String companyCode, String jsonStr, Long time, String appKey, String paStatusUrl) {
try {
Map<String, Object> param = new HashMap<>();
param.put("companyCode", companyCode);
param.put("params", jsonStr);
param.put("timestamp", time);
// 加密
String digest = MD5.create().digestHex(jsonStr + appKey + time);
param.put("digest", digest);
log.info("推送节点数据:{}", JSONUtil.toJsonStr(param));
String post = HttpUtil.post(dataSuoFeiYaProperties.getPush().getPushHost() + paStatusUrl, param);
log.info("推送结果:{}", post);
} catch (Exception e) {
e.printStackTrace();
log.error("推送节点数据错误:{}", e);
}
}
private boolean checkData(String msg) {
if (StrUtil.isEmpty(msg)) {
return true;
}
if (!msg.contains("brand") || !msg.contains("content") || !msg.contains("node")) {
return true;
}
JSONObject entries = JSONUtil.parseObj(msg);
String node = entries.getStr("node");
if (StrUtil.isEmpty(node)) {
return true;
}
// 不是志邦需要的节点数据直接不处理
if (!EnumUtil.contains(NodeNeedEnums.class, node)) {
return true;
}
WorkNodeEnums workNodeEnums = EnumUtil.fromString(WorkNodeEnums.class, node);
if (ObjectUtil.isEmpty(workNodeEnums)) {
return true;
}
List<JSONObject> content = entries.getBeanList("content", JSONObject.class);
if (CollUtil.isEmpty(content)) {
return true;
}
return false;
}
}

2
blade-service/logpm-factory-data/logpm-factory-data-suofeiya/src/main/java/com/logpm/factorydata/suofeiya/vo/FactoryAuthVO.java

@ -16,6 +16,8 @@ public class FactoryAuthVO {
private String logisticsCode;
@ApiModelProperty(name = "秘钥")
private String appKey;
@ApiModelProperty(name = "物流公司")
private String companyCode;
@ApiModelProperty(name = "租户")
private String tenantCode;
@ApiModelProperty(name = "登录账号")

2
blade-service/logpm-factory/src/main/java/com/logpm/factory/jobhandler/FactoryXxlJob.java

@ -552,6 +552,7 @@ public class FactoryXxlJob {
packageList.add(entries);
}
// 转成json对象,然后将包件明细放到detail中
advanceEntity.setTotalNum(CollUtil.isNotEmpty(packageList) ? packageList.size() : 0);
cn.hutool.json.JSONObject entries = JSONUtil.parseObj(advanceEntity);
entries.set("details", JSONUtil.toJsonStr(packageList));
advances.add(entries);
@ -561,7 +562,6 @@ public class FactoryXxlJob {
staorderPackagesService.updateById(it);
});
}
advanceEntity.setTotalNum(CollUtil.isNotEmpty(orderPackageSet) ? orderPackageSet.size() : 0);
});
// 将组装好的暂存单发送到 MQ ,由暂存单服务统一消费SendMsg.

34
blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportTimeMapper.xml

@ -8,18 +8,19 @@
lta.warehouse_name warehouseName,
lta.brand brand,
count(lta.id) totalNum,
count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) needOpenNum,
sum(if(lta.waybill_status='1',1,0)) hasOpenNum,
sum(if(lta.waybill_status = '0',1,0)) noOpenNum,
IFNULL(round(sum(if(lta.waybill_status = '0',1,0))/count(lta.id)*100,2),'0.00') noOpenRate,
sum(if(lta.waybill_status = '0',1,0))-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) noOpenNum,
IFNULL(round((sum(if(lta.waybill_status = '0',1,0))-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))/(count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))*100,2),'0.00') noOpenRate,
sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) noOpenHasFreezeNum,
IFNULL(round(sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0))/count(lta.id)*100,2),'0.00') noOpenHasFreezeRate,
IFNULL(round(sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'0.00') noOpenHasFreezeRate,
sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenNoChaoNum,
IFNULL(round(sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/count(lta.id)*100,2),'0.00') noOpenNoChaoRate,
sum(if(lta.waybill_status='0'and now() &gt; DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenChaoNum,
IFNULL(round(sum(if(lta.waybill_status='0'and now() &gt; DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/count(lta.id)*100,2),'0.00') noOpenChaoRate,
IFNULL(round(sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'0.00') noOpenNoChaoRate,
sum(if(lta.waybill_status='0'and now() > DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenChaoNum,
IFNULL(round(sum(if(lta.waybill_status='0'and now() > DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'0.00') noOpenChaoRate,
sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) onTimeNum,
sum(IF( lta.waybill_status='1' and lww.create_time &gt; DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) overTimeNum,
IFNULL(round(sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 ))/sum(if(lta.waybill_status='1',1,0))*100,2),'0.00') onTimeRate,
sum(IF( lta.waybill_status='1' and lww.create_time > DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) overTimeNum,
IFNULL(round(sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 ))/(count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))*100,2),'0.00') onTimeRate,
IFNULL(round(sum(TIMESTAMPDIFF(SECOND, lta.create_time, lww.create_time))/sum(if(lta.waybill_status='1',1,0))/3600,1),'0.0') avgTime
from logpm_trunkline_advance lta
left join logpm_warehouse_warehouse waw on waw.id = lta.warehouse_id
@ -62,18 +63,19 @@
lta.warehouse_name warehouseName,
lta.brand brand,
count(lta.id) totalNum,
count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) needOpenNum,
sum(if(lta.waybill_status='1',1,0)) hasOpenNum,
sum(if(lta.waybill_status = '0',1,0)) noOpenNum,
IFNULL(concat(round(sum(if(lta.waybill_status = '0',1,0))/count(lta.id)*100,2),'%'),'0.00%') noOpenRate,
sum(if(lta.waybill_status = '0',1,0))-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) noOpenNum,
IFNULL(concat(round((sum(if(lta.waybill_status = '0',1,0))-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))/(count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))*100,2),'%'),'0.00%') noOpenRate,
sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)) noOpenHasFreezeNum,
IFNULL(concat(round(sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0))/count(lta.id)*100,2),'%'),'0.00%') noOpenHasFreezeRate,
IFNULL(concat(round(sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'%'),'0.00%') noOpenHasFreezeRate,
sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenNoChaoNum,
IFNULL(concat(round(sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/count(lta.id)*100,2),'%'),'0.00%') noOpenNoChaoRate,
sum(if(lta.waybill_status='0'and now() &gt; DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenChaoNum,
IFNULL(concat(round(sum(if(lta.waybill_status='0'and now() &gt; DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/count(lta.id)*100,2),'%'),'0.00%') noOpenChaoRate,
IFNULL(concat(round(sum(if(lta.waybill_status='0'and now() &lt;= DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'%'),'0.00%') noOpenNoChaoRate,
sum(if(lta.waybill_status='0'and now() > DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0)) noOpenChaoNum,
IFNULL(concat(round(sum(if(lta.waybill_status='0'and now() > DATE_ADD( lta.create_time, INTERVAL 48 HOUR ),1,0))/sum(if(lta.waybill_status = '0',1,0))*100,2),'%'),'0.00%') noOpenChaoRate,
sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) onTimeNum,
sum(IF( lta.waybill_status='1' and lww.create_time &gt; DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) overTimeNum,
IFNULL(concat(round(sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 ))/sum(if(lta.waybill_status='1',1,0))*100,2),'%'),'0.00%') onTimeRate,
sum(IF( lta.waybill_status='1' and lww.create_time > DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 )) overTimeNum,
IFNULL(concat(round(sum(IF( lta.waybill_status='1' and lww.create_time &lt;= DATE_ADD( lta.create_time, INTERVAL #{param.hoursTime} HOUR ), 1, 0 ))/(count(lta.id)-sum(if(lta.waybill_status='0' and lta.freeze_status = '1',1,0)))*100,2),'%'),'0.00%') onTimeRate,
IFNULL(round(sum(TIMESTAMPDIFF(SECOND, lta.create_time, lww.create_time))/sum(if(lta.waybill_status='1',1,0))/3600,1),'0.0') avgTime
from logpm_trunkline_advance lta
left join logpm_warehouse_warehouse waw on waw.id = lta.warehouse_id

2
blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportOpenTimeVO.java

@ -19,6 +19,8 @@ public class ReportOpenTimeVO implements Serializable {
private String brand;
@ExcelProperty(value = "总单数")
private Integer totalNum;
@ExcelProperty(value = "应开单数")
private Integer needOpenNum;
@ExcelProperty(value = "已开单数")
private Integer hasOpenNum;
@ExcelProperty(value = "未开单数")

Loading…
Cancel
Save