|
|
@@ -15,15 +15,19 @@ import com.github.pagehelper.PageInfo;
|
|
|
import com.sckw.contract.api.RemoteContractService;
|
|
|
import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
|
|
|
import com.sckw.contract.api.model.vo.GoodsInfoDto;
|
|
|
+import com.sckw.contract.api.model.vo.LogisticsEntDtoVO;
|
|
|
import com.sckw.contract.api.model.vo.TradeContractResDto;
|
|
|
import com.sckw.contract.api.model.vo.TradeContractUnitDto;
|
|
|
import com.sckw.core.common.enums.enums.DictEnum;
|
|
|
import com.sckw.core.common.enums.enums.DictTypeEnum;
|
|
|
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
|
|
|
import com.sckw.core.exception.BusinessException;
|
|
|
+import com.sckw.core.exception.BusinessPlatfromException;
|
|
|
import com.sckw.core.exception.CustomPromptException;
|
|
|
import com.sckw.core.model.constant.Global;
|
|
|
import com.sckw.core.model.constant.NumberConstant;
|
|
|
import com.sckw.core.model.enums.*;
|
|
|
+import com.sckw.core.model.enums.DispatchWayEnums;
|
|
|
import com.sckw.core.model.page.PageHelperUtil;
|
|
|
import com.sckw.core.model.page.PageResult;
|
|
|
import com.sckw.core.model.vo.TableBottom;
|
|
|
@@ -33,6 +37,10 @@ import com.sckw.core.utils.*;
|
|
|
import com.sckw.core.web.constant.HttpStatus;
|
|
|
import com.sckw.core.web.context.LoginUserHolder;
|
|
|
import com.sckw.core.web.response.HttpResult;
|
|
|
+import com.sckw.fleet.api.RemoteFleetService;
|
|
|
+import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
+import com.sckw.fleet.api.model.vo.TmsTruckAxleNumVO;
|
|
|
+import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
|
|
|
import com.sckw.manage.api.RemoteManageService;
|
|
|
import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
|
|
|
import com.sckw.mongo.model.SckwTradeOrder;
|
|
|
@@ -65,6 +73,7 @@ import com.sckw.stream.model.SckwBusSum;
|
|
|
import com.sckw.stream.model.SckwMessage;
|
|
|
import com.sckw.stream.model.UserInfo;
|
|
|
import com.sckw.system.api.RemoteSystemService;
|
|
|
+import com.sckw.system.api.model.dto.req.ActualDisPatchDto;
|
|
|
import com.sckw.system.api.RemoteUserService;
|
|
|
import com.sckw.system.api.model.dto.res.*;
|
|
|
import com.sckw.transport.api.dubbo.TransportRemoteService;
|
|
|
@@ -121,6 +130,9 @@ public class KwoTradeOrderService {
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
private TransportRemoteService transportRemoteService;
|
|
|
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
+ protected RemoteFleetService remoteFleetService;
|
|
|
+
|
|
|
private final KwoTradeOrderMapper kwoTradeOrderMapper;
|
|
|
private final StreamBridge streamBridge;
|
|
|
private final KwoTradeOrderAddressService kwoTradeOrderAddressService;
|
|
|
@@ -786,15 +798,26 @@ public class KwoTradeOrderService {
|
|
|
List<KwoTradeOrderTransport> list = kwoTradeOrderTransportService.queryList(id);
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(list.stream().map(KwoTradeOrderTransport::getContractId).collect(Collectors.toList()));
|
|
|
-
|
|
|
+ //贸易合同派单方式
|
|
|
+ Integer dispatchWay = (detail.getContractInfo() == null || detail.getContractInfo().getDispatchWay() == null) ? 0 : detail.getContractInfo().getDispatchWay();
|
|
|
List<ContractInfo> collect = list.stream().map(d -> {
|
|
|
ContractInfo contractInfo = new ContractInfo();
|
|
|
contractInfo.setContractId(d.getContractId());
|
|
|
contractInfo.setContractNo(d.getContractNo());
|
|
|
Optional.ofNullable(contractMap.get(d.getContractId())).ifPresent(c -> {
|
|
|
- contractInfo.setContractName(c.getContactName());
|
|
|
- contractInfo.setContractSigningWay(c.getSigningWayName());
|
|
|
- contractInfo.setContractStatus(c.getStatusName());
|
|
|
+ // 新增:若贸易合同为自动派单,则需要过滤自动派单的物流合同
|
|
|
+ if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), dispatchWay)) {
|
|
|
+ // 仅当合同自身也是自动派单类型时,才赋值字段
|
|
|
+ if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), c.getDispatchWay())) {
|
|
|
+ contractInfo.setContractName(c.getContactName());
|
|
|
+ contractInfo.setContractSigningWay(c.getSigningWayName());
|
|
|
+ contractInfo.setContractStatus(c.getStatusName());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ contractInfo.setContractName(c.getContactName());
|
|
|
+ contractInfo.setContractSigningWay(c.getSigningWayName());
|
|
|
+ contractInfo.setContractStatus(c.getStatusName());
|
|
|
+ }
|
|
|
});
|
|
|
return contractInfo;
|
|
|
}).collect(Collectors.toList());
|
|
|
@@ -2098,6 +2121,22 @@ public class KwoTradeOrderService {
|
|
|
if (Objects.isNull(tradeContractResDto)) {
|
|
|
throw new BusinessException("贸易合同不存在");
|
|
|
}
|
|
|
+
|
|
|
+ List<LogisticsEntDtoVO> contractLogisticsList = new ArrayList<>();
|
|
|
+ //自动派单校验: 判断当前有无包含该商品的有效自动派车物流合同
|
|
|
+ if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), tradeContractResDto.getDispatchWay())) {
|
|
|
+ KwoTradeOrderUnit tradeOrderUnit = unitMap.get(String.valueOf(Global.NUMERICAL_TWO));
|
|
|
+ //查询满足自动派单的物流合同
|
|
|
+ contractLogisticsList = remoteContractService.queryValidAutoContractLogOrder(tradeOrderUnit.getEntId(), byOrderId.getId());
|
|
|
+ if (CollectionUtils.isEmpty(contractLogisticsList)) {
|
|
|
+ throw new BusinessException("未找到该商品有效的自动派车物流合同,请先签订自动派车物流合同");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<LogisticsEntDto> logisticsContractId = tradeOrderAuditParam.getLogisticsContractList();
|
|
|
+ if (Objects.equals(tradeContractResDto.getConsignment(), 2) && CollUtil.isEmpty(logisticsContractId)) {
|
|
|
+ throw new BusinessException("卖方托运时,物流合同不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
List<LogisticsEntDto> logisticsContractId = tradeOrderAuditParam.getLogisticsContractList();
|
|
|
if (Objects.equals(tradeContractResDto.getConsignment(), 2) && CollUtil.isEmpty(logisticsContractId)) {
|
|
|
throw new BusinessException("卖方托运时,物流合同不能为空");
|
|
|
@@ -2149,8 +2188,9 @@ public class KwoTradeOrderService {
|
|
|
}
|
|
|
//下游新增物流订单
|
|
|
AddLogisticOrderParam addLogisticOrderParam = new AddLogisticOrderParam();
|
|
|
- if (Objects.equals(tradeContractResDto.getConsignment(), 2)) {
|
|
|
- List<LogisticInfo> collect = logisticsContractId.stream().map(d -> {
|
|
|
+ if (DispatchWayEnums.AUTO_DISPATCH.getCode().equals(kwoTradeOrder.getDispatching())) {
|
|
|
+ // 自动派车物流合同
|
|
|
+ List<LogisticInfo> collect = contractLogisticsList.stream().map(d -> {
|
|
|
LogisticInfo logisticInfo = new LogisticInfo();
|
|
|
logisticInfo.setContractId(d.getContractId());
|
|
|
logisticInfo.setContractNo(d.getContractNo());
|
|
|
@@ -2174,20 +2214,23 @@ public class KwoTradeOrderService {
|
|
|
return logisticInfo;
|
|
|
}).collect(Collectors.toList());
|
|
|
addLogisticOrderParam.setLogisticInfo(collect);
|
|
|
- } else {
|
|
|
- List<KwoTradeOrderTransport> list = kwoTradeOrderTransportService.queryList(kwoTradeOrder.getId());
|
|
|
- if (CollUtil.isNotEmpty(list)) {
|
|
|
- //Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(list.stream().map(KwoTradeOrderTransport::getContractId).collect(Collectors.toList()));
|
|
|
- List<LogisticInfo> collect = list.stream().map(d -> {
|
|
|
+ addLogisticOrderParam.setDispatchWay(DispatchWayEnums.AUTO_DISPATCH.getCode());
|
|
|
+
|
|
|
+ //实际派车数
|
|
|
+ Integer actualDisPatch = getActualDisPatch(kwoTradeOrder, addressList);
|
|
|
+ addLogisticOrderParam.setActualDisPatch(actualDisPatch);
|
|
|
+
|
|
|
+ } else if (Objects.equals(tradeContractResDto.getConsignment(), 2)) {
|
|
|
+ List<LogisticInfo> collect = logisticsContractId.stream().map(d -> {
|
|
|
LogisticInfo logisticInfo = new LogisticInfo();
|
|
|
logisticInfo.setContractId(d.getContractId());
|
|
|
logisticInfo.setContractNo(d.getContractNo());
|
|
|
logisticInfo.setContractName("");
|
|
|
logisticInfo.setAcceptCompanyId(d.getEntId());
|
|
|
- logisticInfo.setAcceptContactPhone(d.getPhone());
|
|
|
+ logisticInfo.setAcceptContactPhone("");
|
|
|
logisticInfo.setAcceptContacts(d.getContacts());
|
|
|
logisticInfo.setAcceptContactsId(d.getContactsId());
|
|
|
- logisticInfo.setAcceptCompany(d.getFirmName());
|
|
|
+ logisticInfo.setAcceptCompany("");
|
|
|
logisticInfo.setPrice(d.getTransportPrice());
|
|
|
logisticInfo.setPriceType(0L);
|
|
|
logisticInfo.setAmount(new BigDecimal("0"));
|
|
|
@@ -2202,9 +2245,37 @@ public class KwoTradeOrderService {
|
|
|
return logisticInfo;
|
|
|
}).collect(Collectors.toList());
|
|
|
addLogisticOrderParam.setLogisticInfo(collect);
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ List<KwoTradeOrderTransport> list = kwoTradeOrderTransportService.queryList(kwoTradeOrder.getId());
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
+ //Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(list.stream().map(KwoTradeOrderTransport::getContractId).collect(Collectors.toList()));
|
|
|
+ List<LogisticInfo> collect = list.stream().map(d -> {
|
|
|
+ LogisticInfo logisticInfo = new LogisticInfo();
|
|
|
+ logisticInfo.setContractId(d.getContractId());
|
|
|
+ logisticInfo.setContractNo(d.getContractNo());
|
|
|
+ logisticInfo.setContractName("");
|
|
|
+ logisticInfo.setAcceptCompanyId(d.getEntId());
|
|
|
+ logisticInfo.setAcceptContactPhone(d.getPhone());
|
|
|
+ logisticInfo.setAcceptContacts(d.getContacts());
|
|
|
+ logisticInfo.setAcceptContactsId(d.getContactsId());
|
|
|
+ logisticInfo.setAcceptCompany(d.getFirmName());
|
|
|
+ logisticInfo.setPrice(d.getTransportPrice());
|
|
|
+ logisticInfo.setPriceType(0L);
|
|
|
+ logisticInfo.setAmount(new BigDecimal("0"));
|
|
|
+ logisticInfo.setAmountUnit("");
|
|
|
+ logisticInfo.setLoss(new BigDecimal("0"));
|
|
|
+ logisticInfo.setPayment(0L);
|
|
|
+ logisticInfo.setSigningWay(0);
|
|
|
+ logisticInfo.setLossUnit("");
|
|
|
+ logisticInfo.setRemark("");
|
|
|
+ logisticInfo.setType(0);
|
|
|
+
|
|
|
+ return logisticInfo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ addLogisticOrderParam.setLogisticInfo(collect);
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
addLogisticOrderParam.setTradeOrderId(kwoTradeOrder.getId());
|
|
|
addLogisticOrderParam.setTradeOrderNo(kwoTradeOrder.getTOrderNo());
|
|
|
addLogisticOrderParam.setBillingMode(String.valueOf(kwoTradeOrder.getChargeType()));
|
|
|
@@ -2280,11 +2351,100 @@ public class KwoTradeOrderService {
|
|
|
}
|
|
|
addLogisticOrderParam.setEntId(LoginUserHolder.getEntId());
|
|
|
addLogisticOrderParam.setUserId(LoginUserHolder.getUserId());
|
|
|
+ addLogisticOrderParam.setDispatchWay(DispatchWayEnums.MANUAL_DISPATCH.getCode());
|
|
|
log.info("创建物流订单:{}", JSONObject.toJSONString(addLogisticOrderParam));
|
|
|
transportRemoteService.addLogisticOrder(addLogisticOrderParam);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 实际派车数
|
|
|
+ * @param tradeOrder
|
|
|
+ * @param addressList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Integer getActualDisPatch(KwoTradeOrder tradeOrder, List<KwoTradeOrderAddress> addressList) {
|
|
|
+ TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(tradeOrder.getEntId());
|
|
|
+ if (truckDispatchVO == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
|
|
|
+ }
|
|
|
+ ActualDisPatchDto dto = new ActualDisPatchDto();
|
|
|
+ dto.setTradeOrderId(tradeOrder.getId());
|
|
|
+ dto.setEntId(tradeOrder.getEntId());
|
|
|
+ dto.setStartTime(tradeOrder.getStartTime());
|
|
|
+ dto.setEndTime(tradeOrder.getEndTime());
|
|
|
+ dto.setAmount(tradeOrder.getAmount());
|
|
|
+ //司机行为规则
|
|
|
+ dto.setVehicleAvgLoad(truckDispatchVO.getVehicleAvgLoad());
|
|
|
+ dto.setBufferCoefficient(truckDispatchVO.getBufferCoefficient());
|
|
|
+ dto.setVehicleWorkHours(truckDispatchVO.getVehicleWorkHours());
|
|
|
+ dto.setVehicleLoadingHours(truckDispatchVO.getVehicleLoadingHours());
|
|
|
+ dto.setVehicleUnloadingHours(truckDispatchVO.getVehicleUnloadingHours());
|
|
|
+ dto.setVehicleAvgSpeed(truckDispatchVO.getVehicleAvgSpeed());
|
|
|
+
|
|
|
+ //查询贸易订单装卸货地址
|
|
|
+ Map<Integer, KwoTradeOrderAddress> addressMap = addressList.stream().collect(Collectors.toMap(
|
|
|
+ address -> StringUtils.isBlank(address.getAddressType()) ? 0 : Integer.valueOf(address.getAddressType()), Function.identity(), (x, y) -> x));
|
|
|
+ KwoTradeOrderAddress shipmentAddress = addressMap.getOrDefault(AddressTypeEnum.SHIPMENT.getCode(), new KwoTradeOrderAddress());
|
|
|
+ KwoTradeOrderAddress takeAddress = addressMap.getOrDefault(AddressTypeEnum.TAKE.getCode(), new KwoTradeOrderAddress());
|
|
|
+ dto.setLon1(shipmentAddress.getLng());
|
|
|
+ dto.setLat1(shipmentAddress.getLat());
|
|
|
+ dto.setLon2(takeAddress.getLng());
|
|
|
+ dto.setLat2(takeAddress.getLat());
|
|
|
+
|
|
|
+ //查询实际派车数
|
|
|
+ Integer actualDisPatch = remoteSystemService.getActualDisPatch(dto);
|
|
|
+ if (actualDisPatch == null || actualDisPatch <= 0) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "实际派车数量需大于0!");
|
|
|
+ }
|
|
|
+ return actualDisPatch;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 物流企业可派车
|
|
|
+ * @param byOrderId
|
|
|
+ * @param contractLogisticsList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Integer getEntAvailableVehicle(KwoTradeOrderGoods byOrderId, List<LogisticsEntDtoVO> contractLogisticsList) {
|
|
|
+ List<Long> contractIds = contractLogisticsList.stream().map(LogisticsEntDtoVO::getContractId).collect(Collectors.toList());
|
|
|
+ //物流企业总运力
|
|
|
+ int sumAvailableVehicle = contractIds.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(contractId -> getSignEntAvailableVehicle(byOrderId.getGoodsId(), contractId))
|
|
|
+ .mapToInt(num -> num == null ? 0 : num)
|
|
|
+ .sum();
|
|
|
+ return sumAvailableVehicle;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单个物流企业满足轴数可派车
|
|
|
+ * @param goodId
|
|
|
+ * @param contractId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Integer getSignEntAvailableVehicle(Long goodId, Long contractId) {
|
|
|
+ //查询商品轴数
|
|
|
+ KwpGoods goodsById = goodsInfoService.getGoodsById(goodId);
|
|
|
+ if (goodsById == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "物流运单装货地址有误!");
|
|
|
+ }
|
|
|
+ //商品轴数
|
|
|
+ TmsTruckAxleNumVO carAxisInfo = remoteFleetService.getCarAxisInfo(Optional.ofNullable(goodsById.getCarAxis()).map(Integer::valueOf).orElse(null));
|
|
|
+ //物流合同企业id
|
|
|
+ TradeContractUnitDto unitDto = remoteContractService.queryEntByContractId(contractId);
|
|
|
+
|
|
|
+ //当前物流企业总运力
|
|
|
+ List<RTruckVo> truckVoList = remoteFleetService.findTruckByEntIds(unitDto.getEntId());
|
|
|
+ return Math.toIntExact(truckVoList.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(truck -> Objects.equals(truck.getCarAxis(), String.valueOf(carAxisInfo.getId())))
|
|
|
+ .count());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 手动完结订单
|
|
|
*
|