|
|
@@ -0,0 +1,1024 @@
|
|
|
+package com.sl.ms.web.enterprise.service.impl;
|
|
|
+
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.itheima.auth.sdk.dto.UserDTO;
|
|
|
+import com.sl.ms.base.api.common.AreaFeign;
|
|
|
+import com.sl.ms.base.domain.base.AreaDto;
|
|
|
+import com.sl.ms.base.domain.base.UserResponseDTO;
|
|
|
+import com.sl.ms.oms.api.CargoFeign;
|
|
|
+import com.sl.ms.oms.api.EnterpriseOrderFeign;
|
|
|
+import com.sl.ms.oms.api.OrderFeign;
|
|
|
+import com.sl.ms.oms.dto.CargoSaveDTO;
|
|
|
+import com.sl.ms.oms.dto.EnterpriseOrderDTO;
|
|
|
+import com.sl.ms.oms.dto.MailingSaveMultipleDTO;
|
|
|
+import com.sl.ms.oms.dto.OrderDTO;
|
|
|
+import com.sl.ms.oms.enums.*;
|
|
|
+import com.sl.ms.trade.api.AgencyTradingFeign;
|
|
|
+import com.sl.ms.trade.enums.ReturnFeeTypeEnum;
|
|
|
+import com.sl.ms.transport.api.OrganFeign;
|
|
|
+import com.sl.ms.user.api.AddressBookFeign;
|
|
|
+import com.sl.ms.user.api.EnterpriseFeign;
|
|
|
+import com.sl.ms.user.domain.dto.AddressBookDTO;
|
|
|
+import com.sl.ms.user.domain.dto.EnterpriseWithSecretDTO;
|
|
|
+import com.sl.ms.web.enterprise.config.SZColdChainConstant;
|
|
|
+import com.sl.ms.web.enterprise.enums.PrintCodeEnum;
|
|
|
+import com.sl.ms.web.enterprise.enums.PrintModeEnum;
|
|
|
+import com.sl.ms.web.enterprise.service.OrderService;
|
|
|
+import com.sl.ms.web.enterprise.utils.PrintApiUtils;
|
|
|
+import com.sl.ms.web.enterprise.utils.TransportOrderStatusUtils;
|
|
|
+import com.sl.ms.web.enterprise.vo.request.*;
|
|
|
+import com.sl.ms.web.enterprise.vo.response.*;
|
|
|
+import com.sl.ms.work.api.PickupDispatchTaskFeign;
|
|
|
+import com.sl.ms.work.api.RetentionScanRecordFeign;
|
|
|
+import com.sl.ms.work.api.TransportOrderFeign;
|
|
|
+import com.sl.ms.work.domain.dto.PickupDispatchTaskDTO;
|
|
|
+import com.sl.ms.work.domain.dto.SubTransportOrderDTO;
|
|
|
+import com.sl.ms.work.domain.dto.TransportOrderDTO;
|
|
|
+import com.sl.ms.work.domain.dto.request.TransportOrderQueryDTO;
|
|
|
+import com.sl.ms.work.domain.enums.ReceiptOrderTypeEnum;
|
|
|
+import com.sl.ms.work.domain.enums.pickupDispatchtask.PickupDispatchTaskCancelReason;
|
|
|
+import com.sl.ms.work.domain.enums.pickupDispatchtask.PickupDispatchTaskStatus;
|
|
|
+import com.sl.ms.work.domain.enums.pickupDispatchtask.PickupDispatchTaskType;
|
|
|
+import com.sl.ms.work.domain.enums.transportorder.TransportOrderStatus;
|
|
|
+import com.sl.transport.common.exception.SLException;
|
|
|
+import com.sl.transport.common.exception.SLWebException;
|
|
|
+import com.sl.transport.common.util.AuthTemplateThreadLocal;
|
|
|
+import com.sl.transport.common.util.ObjectUtil;
|
|
|
+import com.sl.transport.common.util.PageResponse;
|
|
|
+import com.sl.transport.common.util.UserThreadLocal;
|
|
|
+import com.sl.transport.domain.OrganDTO;
|
|
|
+import com.sl.transport.info.api.TransportInfoFeign;
|
|
|
+import com.sl.transport.info.domain.TransportInfoDTO;
|
|
|
+import com.sl.transport.info.domain.TransportInfoDetailDTO;
|
|
|
+import io.seata.spring.annotation.GlobalTransactional;
|
|
|
+import io.swagger.annotations.Api;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
|
+import org.apache.commons.lang3.tuple.ImmutablePair;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.lang.reflect.Array;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author sll
|
|
|
+ * @description: TODO
|
|
|
+ * @date 2025/9/2 22:02
|
|
|
+ * @className OrderServoceImpl
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class OrderServiceImpl implements OrderService {
|
|
|
+ @Resource
|
|
|
+ OrderFeign orderFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ AddressBookFeign addressBookFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ AreaFeign areaFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ TransportInfoFeign transportInfoFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ EnterpriseOrderFeign enterpriseOrderFeign;
|
|
|
+
|
|
|
+ final BigDecimal VOLUME_FACTOR = BigDecimal.valueOf(1000000L);
|
|
|
+ @Autowired
|
|
|
+ private OrganFeign organFeign;
|
|
|
+ @Autowired
|
|
|
+ private TransportOrderFeign transportOrderFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ AgencyTradingFeign agencyTradingFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ PickupDispatchTaskFeign pickupDispatchTaskFeign;
|
|
|
+ private EnterpriseFeign enterpriseFeign;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ PrintApiUtils printApiUtils;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ CargoFeign cargoFeign;
|
|
|
+ @Autowired
|
|
|
+ private RetentionScanRecordFeign retentionScanRecordFeign;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @GlobalTransactional
|
|
|
+ public ApiResponse<OrderResponse> createOrder(OrderRequest orderRequest) {
|
|
|
+ log.info("【开放第三方接口-createOrder-参数】" + JSONObject.toJSONString(orderRequest));
|
|
|
+ // 校验数据
|
|
|
+ // todo: 校验数据
|
|
|
+
|
|
|
+ // 组装参数
|
|
|
+ // 将地址进行保存,组装寄件地址、派件地址
|
|
|
+ HashSet<String> areaNames = new HashSet<>();
|
|
|
+ areaNames.add(orderRequest.getSenderProvince());
|
|
|
+ areaNames.add(orderRequest.getReceiverProvince());
|
|
|
+ areaNames.add(orderRequest.getSenderCity());
|
|
|
+ areaNames.add(orderRequest.getReceiverCity());
|
|
|
+ areaNames.add(orderRequest.getSenderCounty());
|
|
|
+ areaNames.add(orderRequest.getReceiverCounty());
|
|
|
+
|
|
|
+ List<AreaDto> areaDtoList = areaFeign.findByNamesV2(areaNames);
|
|
|
+ Map<String, AreaDto> map = new HashMap<>();
|
|
|
+ areaDtoList.stream().forEach(areaDto -> {
|
|
|
+ map.put(areaDto.getName(), areaDto);
|
|
|
+ });
|
|
|
+ AreaDto senderProvince = map.get(orderRequest.getSenderProvince());
|
|
|
+ AreaDto receiverProvince = map.get(orderRequest.getReceiverProvince());
|
|
|
+ AreaDto senderCity = map.get(orderRequest.getSenderCity());
|
|
|
+ AreaDto receiverCity = map.get(orderRequest.getReceiverCity());
|
|
|
+ AreaDto senderCounty = map.get(orderRequest.getSenderCounty());
|
|
|
+ AreaDto receiverCounty = map.get(orderRequest.getReceiverCounty());
|
|
|
+
|
|
|
+ if (ObjectUtils.anyNull(senderProvince, receiverProvince, senderCity, receiverCity, senderCounty, receiverCounty)) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_PARAM_FORMAT_ERROR, "地址解析错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增地址簿
|
|
|
+ AddressBookDTO senderAddress = saveSenderAddress(orderRequest, senderProvince.getId(), senderCity.getId(), senderCounty.getId());
|
|
|
+ // 新增地址簿
|
|
|
+ AddressBookDTO receiverAddress = saveReceiverAddress(orderRequest, receiverProvince.getId(), receiverCity.getId(), receiverCounty.getId());
|
|
|
+
|
|
|
+ MailingSaveMultipleDTO mailingSaveMultipleDTO = new MailingSaveMultipleDTO();
|
|
|
+ mailingSaveMultipleDTO.setSendAddress(senderAddress.getId());
|
|
|
+ mailingSaveMultipleDTO.setReceiptAddress(receiverAddress.getId());
|
|
|
+ mailingSaveMultipleDTO.setPickupType(orderRequest.getPickupType());
|
|
|
+ mailingSaveMultipleDTO.setDispatchType(orderRequest.getDispatchType());
|
|
|
+ mailingSaveMultipleDTO.setLogisticsType(orderRequest.getLogisticsType());
|
|
|
+ mailingSaveMultipleDTO.setPayMethod(orderRequest.getPayMethod());
|
|
|
+ mailingSaveMultipleDTO.setPickUpTime(LocalDateTime.now().plusHours(2));
|
|
|
+ // 通过寄件网点编码 确认寄件网点,如果为空就匹配寄件网点
|
|
|
+ if (ObjectUtil.isNotEmpty(orderRequest.getSenderAgencyNumber())) {
|
|
|
+ List<OrganDTO> organDTOS = organFeign.findByOrganNumber(orderRequest.getSenderAgencyNumber());
|
|
|
+ if(ObjectUtil.isEmpty(organDTOS)){
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_PARAM_FORMAT_ERROR, "寄件网点不存在!");
|
|
|
+ }
|
|
|
+ mailingSaveMultipleDTO.setSendAgencyId(organDTOS.get(0).getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<CargoSaveDTO> cargoSaveDTOList = new ArrayList<CargoSaveDTO>();
|
|
|
+ CargoSaveDTO cargoSaveDTO = new CargoSaveDTO();
|
|
|
+ cargoSaveDTO.setCargoBarcode(orderRequest.getCargoBarcode());
|
|
|
+ cargoSaveDTO.setName(orderRequest.getGoodsName());
|
|
|
+ cargoSaveDTO.setQuantity(orderRequest.getQuantity());
|
|
|
+ cargoSaveDTO.setVolume(orderRequest.getTotalVolume().multiply(VOLUME_FACTOR));
|
|
|
+ cargoSaveDTO.setWeight(orderRequest.getTotalWeight());
|
|
|
+ cargoSaveDTO.setTemperatureRegion(orderRequest.getTemperatureRegion());
|
|
|
+ cargoSaveDTO.setGoodsTypeId(1842957154249089025L);
|
|
|
+ cargoSaveDTOList.add(cargoSaveDTO);
|
|
|
+ mailingSaveMultipleDTO.setCargos(cargoSaveDTOList);
|
|
|
+
|
|
|
+ mailingSaveMultipleDTO.setOrderChannel(OrderChannelEnum.ENTERPRISE_OPEN_API.getCode());
|
|
|
+ mailingSaveMultipleDTO.setMark(orderRequest.getMark());
|
|
|
+ mailingSaveMultipleDTO.setChargeFee(orderRequest.getChargeFee());
|
|
|
+ mailingSaveMultipleDTO.setIsInsure(orderRequest.getIsInsure());
|
|
|
+ mailingSaveMultipleDTO.setDeclareValue(orderRequest.getDeclareValue());
|
|
|
+ mailingSaveMultipleDTO.setReceiptType(orderRequest.getReceiptType());
|
|
|
+ mailingSaveMultipleDTO.setEnterpriseId(orderRequest.getEnterpriseId()); // 企业客户id
|
|
|
+ mailingSaveMultipleDTO.setPartnerOrderCode(orderRequest.getPartnerOrderCode()); // 第三方订单编码
|
|
|
+ mailingSaveMultipleDTO.setTotalVolume(orderRequest.getTotalVolume().multiply(VOLUME_FACTOR));
|
|
|
+ mailingSaveMultipleDTO.setTotalWeight(orderRequest.getTotalWeight());
|
|
|
+ // 数据提交
|
|
|
+ OrderDTO orderDTO;
|
|
|
+ try {
|
|
|
+ orderDTO = orderFeign.mailingSaveMultiple(mailingSaveMultipleDTO);
|
|
|
+ } catch (SLException e) {
|
|
|
+ log.error("【mailingSaveMultiple报错】", e);
|
|
|
+ e.printStackTrace();
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_SERVICE_INNER_ERROR, "服务器错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ OrderResponse orderResponse = orderDTO2OrderResponse(orderDTO, orderRequest);
|
|
|
+
|
|
|
+ EnterpriseOrderDTO enterpriseOrderDTO = new EnterpriseOrderDTO();
|
|
|
+ enterpriseOrderDTO.setOrderId(orderDTO.getId());
|
|
|
+ enterpriseOrderDTO.setEnterpriseId(orderRequest.getEnterpriseId());
|
|
|
+ enterpriseOrderDTO.setTransportOrderId(orderDTO.getTransportOrderId());
|
|
|
+ enterpriseOrderDTO.setPartnerOrderCode(orderRequest.getPartnerOrderCode());
|
|
|
+ enterpriseOrderDTO.setCustomerCode(orderRequest.getCustomerCode());
|
|
|
+ enterpriseOrderFeign.addNew(enterpriseOrderDTO);
|
|
|
+
|
|
|
+ return ApiResponse.success(orderResponse);
|
|
|
+ }
|
|
|
+ private AddressBookDTO saveSenderAddress(OrderRequest orderRequest, Long provinceId, Long cityId, Long countyId) {
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ AddressBookDTO addressBookDTO = AddressBookDTO.builder()
|
|
|
+ .name(orderRequest.getSenderName())
|
|
|
+ .phoneNumber(orderRequest.getSenderPhone())
|
|
|
+ .provinceId(provinceId)
|
|
|
+ .cityId(cityId)
|
|
|
+ .countyId(countyId)
|
|
|
+ .address(orderRequest.getSenderAddress())
|
|
|
+ .isDefault(1) // 默认,这里没有设置客户
|
|
|
+ .updated(now)
|
|
|
+ .isShow(1)
|
|
|
+ .type(1) // 寄件
|
|
|
+ .build();
|
|
|
+
|
|
|
+ addressBookDTO.setCreated(now);
|
|
|
+ AddressBookDTO savedDto = addressBookFeign.save(addressBookDTO);
|
|
|
+ return savedDto;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private AddressBookDTO saveReceiverAddress(OrderRequest orderRequest, Long provinceId, Long cityId, Long countyId) {
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ AddressBookDTO addressBookDTO = AddressBookDTO.builder()
|
|
|
+ .name(orderRequest.getReceiverName())
|
|
|
+ .phoneNumber(orderRequest.getReceiverPhone())
|
|
|
+ .provinceId(provinceId)
|
|
|
+ .cityId(cityId)
|
|
|
+ .countyId(countyId)
|
|
|
+ .address(orderRequest.getReceiverAddress())
|
|
|
+ .isDefault(1) // 默认,这里没有设置客户
|
|
|
+ .updated(now)
|
|
|
+ .isShow(1)
|
|
|
+ .type(2) // 收件
|
|
|
+ .build();
|
|
|
+
|
|
|
+ addressBookDTO.setCreated(now);
|
|
|
+ AddressBookDTO savedDto = addressBookFeign.save(addressBookDTO);
|
|
|
+ return savedDto;
|
|
|
+
|
|
|
+ }
|
|
|
+ private OrderResponse orderDTO2OrderResponse(OrderDTO orderDTO, OrderRequest orderRequest) {
|
|
|
+ OrderResponse orderResponse = BeanUtil.toBean(orderDTO, OrderResponse.class);
|
|
|
+ List<OrganDTO> organDTOS = organFeign.findAll("");
|
|
|
+ Map<Long, OrganDTO> organDTOMap = new HashMap<>(organDTOS.size());
|
|
|
+ for (OrganDTO organDTO : organDTOS) {
|
|
|
+ organDTOMap.put(organDTO.getId(), organDTO);
|
|
|
+ }
|
|
|
+
|
|
|
+ OrganDTO senderAgency = organDTOMap.get(orderDTO.getSendAgencyId());
|
|
|
+ OrganDTO receiverAgency = organDTOMap.get(orderDTO.getReceiveAgencyId());
|
|
|
+ OrganDTO senderParentAgency = organDTOMap.get(senderAgency.getParentId());
|
|
|
+ OrganDTO receiverParentAgency = organDTOMap.get(receiverAgency.getParentId());
|
|
|
+
|
|
|
+ orderResponse.setPayMethod(orderDTO.getPaymentMethod());
|
|
|
+ orderResponse.setPartnerOrderCode(orderRequest.getPartnerOrderCode());
|
|
|
+ orderResponse.setReceiverParentAgencyName(receiverParentAgency.getName());
|
|
|
+ orderResponse.setSenderParentAgencyName(senderParentAgency.getName());
|
|
|
+ orderResponse.setSenderAgencyName(senderAgency.getName());
|
|
|
+ orderResponse.setReceiverAgencyName(receiverAgency.getName());
|
|
|
+ orderResponse.setGoodsName(orderRequest.getGoodsName());
|
|
|
+ orderResponse.setCargoBarcode(orderRequest.getCargoBarcode());
|
|
|
+ orderResponse.setQuantity(orderRequest.getQuantity());
|
|
|
+ orderResponse.setTemperatureRegion(orderRequest.getTemperatureRegion());
|
|
|
+ orderResponse.setTotalVolume(orderRequest.getTotalVolume());
|
|
|
+ orderResponse.setTotalWeight(orderRequest.getTotalWeight());
|
|
|
+ orderResponse.setComputedWeight(orderDTO.getComputeWeight());
|
|
|
+ orderResponse.setSenderProvince(orderRequest.getSenderProvince());
|
|
|
+ orderResponse.setSenderCity(orderRequest.getSenderCity());
|
|
|
+ orderResponse.setSenderCounty(orderRequest.getSenderCounty());
|
|
|
+ orderResponse.setReceiverProvince(orderRequest.getReceiverProvince());
|
|
|
+ orderResponse.setReceiverCity(orderRequest.getReceiverCity());
|
|
|
+ orderResponse.setReceiverCounty(orderRequest.getReceiverCounty());
|
|
|
+ orderResponse.setSenderAgencyId(senderAgency.getId());
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getReceiptType()) ) {
|
|
|
+ orderResponse.setReceiptOrderId("HD" + orderDTO.getTransportOrderId());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderResponse.SubTransportOrder> subTransportOrderList = new ArrayList<>();
|
|
|
+ for (Integer i = 1; i <= orderRequest.getQuantity(); i++) {
|
|
|
+ String subTransportOrderId = generateSubOrderNumber(orderDTO.getTransportOrderId(), i, orderRequest.getQuantity());
|
|
|
+ OrderResponse.SubTransportOrder subTransportOrder = new OrderResponse.SubTransportOrder();
|
|
|
+ subTransportOrder.setSubIndex(i);
|
|
|
+ subTransportOrder.setSubTransportOrderId(subTransportOrderId);
|
|
|
+ subTransportOrderList.add(subTransportOrder);
|
|
|
+ }
|
|
|
+ orderResponse.setSubTransportOrderList(subTransportOrderList);
|
|
|
+ return orderResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String generateSubOrderNumber(String mainOrderNumber, int itemIndex, int totalItems) {
|
|
|
+ // 检查输入是否合理
|
|
|
+// if (mainOrderNumber == null || mainOrderNumber.isEmpty() || itemIndex < 1 || itemIndex > 999 || totalItems < 1 || totalItems > 999) {
|
|
|
+// throw new IllegalArgumentException("Invalid input: mainOrderNumber must be a non-empty string, and itemIndex and totalItems must be between 1 and 999.");
|
|
|
+// }
|
|
|
+
|
|
|
+ // 确保 itemIndex 和 totalItems 为四位数格式
|
|
|
+ String paddedItemIndex = String.format("%04d", itemIndex);
|
|
|
+ String paddedTotalItems = String.format("%04d", totalItems);
|
|
|
+
|
|
|
+ // 构建子单号
|
|
|
+ return mainOrderNumber + paddedTotalItems + paddedItemIndex;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ApiResponse<TransportInfoResponse> queryTransportInfo(TransportInfoRequest transportInfoRequest) {
|
|
|
+ EnterpriseOrderDTO enterpriseOrderDTO;
|
|
|
+ if (ObjectUtil.isNotEmpty(transportInfoRequest.getTransportOrderId())) {
|
|
|
+ enterpriseOrderDTO = enterpriseOrderFeign.getByTransportOrderId(transportInfoRequest.getTransportOrderId(), transportInfoRequest.getEnterpriseId());
|
|
|
+ } else {
|
|
|
+ enterpriseOrderDTO = enterpriseOrderFeign.getByPartnerOrderCode(transportInfoRequest.getPartnerOrderCode(), transportInfoRequest.getEnterpriseId());
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNull(enterpriseOrderDTO)) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_NOT_FOUND, "未查到该运单");
|
|
|
+ }
|
|
|
+ TransportOrderDTO transportOrderDTO = transportOrderFeign.findById(enterpriseOrderDTO.getTransportOrderId());
|
|
|
+ if (ObjectUtil.isEmpty(transportOrderDTO)) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_NOT_FOUND, "未查到该运单");
|
|
|
+ }
|
|
|
+
|
|
|
+ TransportInfoDTO transportInfoDTO;
|
|
|
+ try {
|
|
|
+ transportInfoDTO = transportInfoFeign.queryByTransportOrderId(transportInfoRequest.getTransportOrderId());
|
|
|
+ } catch (SLException e) {
|
|
|
+ TransportInfoResponse transportInfoResponse = new TransportInfoResponse();
|
|
|
+ transportInfoResponse.setTransportOrderId(transportOrderDTO.getId());
|
|
|
+ transportInfoResponse.setStatus(transportOrderDTO.getStatus().getCode());
|
|
|
+ transportInfoResponse.setDetails(new ArrayList<>());
|
|
|
+ return ApiResponse.success(transportInfoResponse);
|
|
|
+ }
|
|
|
+
|
|
|
+ TransportInfoResponse transportInfoResponse = new TransportInfoResponse();
|
|
|
+ transportInfoResponse.setTransportOrderId(transportOrderDTO.getId());
|
|
|
+ transportInfoResponse.setStatus(transportOrderDTO.getStatus().getCode());
|
|
|
+ transportInfoResponse.setStatusText(transportOrderDTO.getStatus().getValue());
|
|
|
+
|
|
|
+ List<TransportInfoDetailDTO> infoDetailDTOS = transportInfoDTO.getInfoList();
|
|
|
+ List<TransportInfoResponse.TransportDetail> details = infoDetailDTOS.stream().map(dto -> {
|
|
|
+ TransportInfoResponse.TransportDetail detail = new TransportInfoResponse.TransportDetail();
|
|
|
+ detail.setContext(dto.getInfo());
|
|
|
+ detail.setLocation(dto.getStatus());
|
|
|
+ LocalDateTime localDateTime = LocalDateTimeUtil.of(dto.getCreated());
|
|
|
+ String formattedTime = LocalDateTimeUtil.format(localDateTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
+ detail.setTime(formattedTime);
|
|
|
+ return detail;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ transportInfoResponse.setDetails(details);
|
|
|
+
|
|
|
+ return ApiResponse.success(transportInfoResponse);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据面单类型,调用面单接口获取到图片地址
|
|
|
+ * @param printRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ApiResponse<PrintResponse> getPrintInfo(PrintRequest printRequest, EnterpriseWithSecretDTO enterprise) {
|
|
|
+ String transportOrderId = printRequest.getTransportOrderId();
|
|
|
+ // 根据运单号获取数据详情,组装打印数据
|
|
|
+ EnterpriseOrderDTO enterpriseOrderDTO = enterpriseOrderFeign.getByTransportOrderId(printRequest.getTransportOrderId(), printRequest.getEnterpriseId());
|
|
|
+ if (ObjectUtil.isNull(enterpriseOrderDTO)) {
|
|
|
+ throw new SLException("未查到该运单");
|
|
|
+ }
|
|
|
+ PrintApiRequest printApiRequest = new PrintApiRequest();
|
|
|
+ Integer type = printRequest.getType();
|
|
|
+ printApiRequest.setCode(type2Code(type));
|
|
|
+ printApiRequest.setMode(PrintModeEnum.REVIEW_PDF.getCode());
|
|
|
+ printApiRequest.setPrintAgencyName(enterprise.getEnterpriseName()); // 企业名称
|
|
|
+ List<String> ids = new ArrayList<>();
|
|
|
+ switch (type) {
|
|
|
+ case 1:
|
|
|
+ ids.add(printRequest.getTransportOrderId());
|
|
|
+ createPrintData(printApiRequest, ids, null, null, null, null, null);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ Integer subIndex = printRequest.getSubIndex();
|
|
|
+ createPrintData(printApiRequest, null, ids, null, null, null, null);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ ids.add("HD" + printRequest.getTransportOrderId());
|
|
|
+ createPrintData(printApiRequest, null, null, ids, null, null, null);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ ids.add("HD" + printRequest.getTransportOrderId());
|
|
|
+ createPrintData(printApiRequest, null, null, null, ids, null, null);
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ ids.add(printRequest.getTransportOrderId());
|
|
|
+ createPrintData(printApiRequest, null, null, null, null, ids, null);
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ ids.add(printRequest.getTransportOrderId());
|
|
|
+ createPrintData(printApiRequest, null, null, null, null, null, ids);
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ PrintApiResponse printApiResponse;
|
|
|
+ try {
|
|
|
+ printApiResponse = printApiUtils.sendPrintRequest(printApiRequest);
|
|
|
+ } catch (SLException e) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_BUSINESS_ERROR, e.getMsg());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否返回成功
|
|
|
+ PrintResponse printResponse = new PrintResponse();
|
|
|
+ printResponse.setPrintUrl(String.join(",", printApiResponse.getUrlList()));
|
|
|
+ printResponse.setTransportOrderId(printRequest.getTransportOrderId());
|
|
|
+ printResponse.setType(printRequest.getType().toString());
|
|
|
+ return ApiResponse.success(printResponse) ;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ApiResponse<PrintResponse> getMultPrintInfo(MultPrintRequest printRequest, EnterpriseWithSecretDTO enterprise) {
|
|
|
+// String transportOrderId = printRequest.getTransportOrderId();
|
|
|
+// // 根据运单号获取数据详情,组装打印数据
|
|
|
+// EnterpriseOrderDTO enterpriseOrderDTO = enterpriseOrderFeign.getByTransportOrderId(printRequest.getTransportOrderId(), printRequest.getEnterpriseId());
|
|
|
+// if (ObjectUtil.isNull(enterpriseOrderDTO)) {
|
|
|
+// throw new SLException("未查到该运单");
|
|
|
+// }
|
|
|
+// TransportOrderDTO transportOrderDTO = transportOrderFeign.findById(enterpriseOrderDTO.getTransportOrderId());
|
|
|
+ // 组装数据
|
|
|
+ String transportOrderIds = printRequest.getTransportOrderIds();
|
|
|
+ String subTransportOrderIds = printRequest.getSubTransportOrderIds();
|
|
|
+ String senderReceiptOrderIds = printRequest.getSenderReceiptOrderIds();
|
|
|
+ String receiverReceiptOrderIds = printRequest.getReceiverReceiptOrderIds();
|
|
|
+ String podSignedOrderIds = printRequest.getPodSignedOrderIds();
|
|
|
+ String retentionCopyOrderIds = printRequest.getRetentionCopyOrderIds();
|
|
|
+
|
|
|
+ List<String> transportOrderIdList = ObjectUtil.isNotEmpty(transportOrderIds) ? Arrays.asList(transportOrderIds.split(",")) : null;
|
|
|
+ List<String> subTransportOrderIdList = ObjectUtil.isNotEmpty(subTransportOrderIds) ? Arrays.asList(subTransportOrderIds.split(",")) : null;
|
|
|
+ List<String> senderReceiptOrderIdList = ObjectUtil.isNotEmpty(senderReceiptOrderIds) ? Arrays.asList(senderReceiptOrderIds.split(",")) : null;
|
|
|
+ List<String> receiverReceiptOrderIdList = ObjectUtil.isNotEmpty(receiverReceiptOrderIds) ? Arrays.asList(receiverReceiptOrderIds.split(",")) : null;
|
|
|
+ List<String> podSignedOrderIdList = ObjectUtil.isNotEmpty(podSignedOrderIds) ? Arrays.asList(podSignedOrderIds.split(",")) : null;
|
|
|
+ List<String> retentionCopyOrderIdList = ObjectUtil.isNotEmpty(retentionCopyOrderIds) ? Arrays.asList(retentionCopyOrderIds.split(",")) : null;
|
|
|
+
|
|
|
+ PrintApiRequest printApiRequest = new PrintApiRequest();
|
|
|
+ printApiRequest.setCode(getCodeByList(transportOrderIdList,
|
|
|
+ subTransportOrderIdList,
|
|
|
+ senderReceiptOrderIdList,
|
|
|
+ receiverReceiptOrderIdList,
|
|
|
+ podSignedOrderIdList,
|
|
|
+ retentionCopyOrderIdList));
|
|
|
+ printApiRequest.setMode(PrintModeEnum.REVIEW_PDF.getCode());
|
|
|
+ printApiRequest.setPrintAgencyName(enterprise.getEnterpriseName()); // 企业名称
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ createPrintData(printApiRequest, transportOrderIdList,
|
|
|
+ subTransportOrderIdList,
|
|
|
+ senderReceiptOrderIdList,
|
|
|
+ receiverReceiptOrderIdList,
|
|
|
+ podSignedOrderIdList,
|
|
|
+ retentionCopyOrderIdList);
|
|
|
+
|
|
|
+ PrintApiResponse printApiResponse;
|
|
|
+ try {
|
|
|
+ printApiResponse = printApiUtils.sendPrintRequest(printApiRequest);
|
|
|
+ } catch (SLException e) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_BUSINESS_ERROR, e.getMsg());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否返回成功
|
|
|
+ PrintResponse printResponse = new PrintResponse();
|
|
|
+ printResponse.setPrintUrl(String.join(",", printApiResponse.getUrlList()));
|
|
|
+ printResponse.setTransportOrderId("");
|
|
|
+ printResponse.setType("");
|
|
|
+ return ApiResponse.success(printResponse) ;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Long getCodeByList(List<String> transportOrderIds,
|
|
|
+ List<String> subTransportOrderIds,
|
|
|
+ List<String> senderReceiptOrderIds,
|
|
|
+ List<String> receiverReceiptOrderIds,
|
|
|
+ List<String> podSignedOrderIds,
|
|
|
+ List<String> retentionCopyOrderIds) {
|
|
|
+ Long code = 0L;
|
|
|
+ if (ObjectUtil.isNotEmpty(transportOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_MASTER.getCode();
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(subTransportOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_HOUSE_WAYBILL.getCode();
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(senderReceiptOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_SENDER_RECEIPT.getCode();
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(receiverReceiptOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_SENDER_RECEIPT.getCode();
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(podSignedOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_POD_SIGNED.getCode();
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(retentionCopyOrderIds)) {
|
|
|
+ code = code | PrintCodeEnum.PRINT_RETENTION_COPY.getCode();
|
|
|
+ }
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void createPrintData(PrintApiRequest printApiRequest, List<String> transportOrderIds,
|
|
|
+ List<String> subTransportOrderIds,
|
|
|
+ List<String> senderReceiptOrderIds,
|
|
|
+ List<String> receiverReceiptOrderIds,
|
|
|
+ List<String> podSignedOrderIds,
|
|
|
+ List<String> retentionCopyOrderIds) {
|
|
|
+ // 1. 获取需要查询的运单号,查询运单详情
|
|
|
+ Set<String> transportOrderIdSet = new HashSet<>();
|
|
|
+ if (ObjectUtil.isNotNull(transportOrderIdSet) && !transportOrderIdSet.isEmpty()) {
|
|
|
+ transportOrderIdSet.addAll(transportOrderIds);
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(subTransportOrderIds) && !subTransportOrderIds.isEmpty()) {
|
|
|
+ subTransportOrderIds.forEach(subTransportOrderId -> {
|
|
|
+ if (ObjectUtil.isNotEmpty(subTransportOrderId) && subTransportOrderId.length() == 20) {
|
|
|
+ transportOrderIdSet.add(subTransportOrderId.substring(0, 12));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(senderReceiptOrderIds) && !subTransportOrderIds.isEmpty()) {
|
|
|
+ senderReceiptOrderIds.forEach(senderReceiptOrderId -> {
|
|
|
+ if (ObjectUtil.isNotEmpty(senderReceiptOrderId) && senderReceiptOrderId.length() == 14) {
|
|
|
+ transportOrderIdSet.add(senderReceiptOrderId.replace("HD", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(receiverReceiptOrderIds) && !receiverReceiptOrderIds.isEmpty()) {
|
|
|
+ receiverReceiptOrderIds.forEach(receiverReceiptOrderId -> {
|
|
|
+ if (ObjectUtil.isNotEmpty(receiverReceiptOrderId) && receiverReceiptOrderId.length() == 14) {
|
|
|
+ transportOrderIdSet.add(receiverReceiptOrderId.replace("HD", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(podSignedOrderIds) && !podSignedOrderIds.isEmpty()) {
|
|
|
+ podSignedOrderIds.forEach(podSignedOrderId -> {
|
|
|
+ if (ObjectUtil.isNotEmpty(podSignedOrderId) && podSignedOrderId.length() == 12) {
|
|
|
+ transportOrderIdSet.add(podSignedOrderId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(retentionCopyOrderIds) && !retentionCopyOrderIds.isEmpty()) {
|
|
|
+ retentionCopyOrderIds.forEach(retentionCopyOrderId -> {
|
|
|
+ if (ObjectUtil.isNotEmpty(retentionCopyOrderId) && retentionCopyOrderId.length() == 12) {
|
|
|
+ transportOrderIdSet.add(retentionCopyOrderId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ TransportOrderQueryDTO transportOrderDTO = new TransportOrderQueryDTO();
|
|
|
+ transportOrderDTO.setRelatedAgencyIds(null);
|
|
|
+ transportOrderDTO.setSearchAgencyId(null);
|
|
|
+ transportOrderDTO.setPage(1);
|
|
|
+ transportOrderDTO.setPageSize(1000);
|
|
|
+ transportOrderDTO.setTransportOrderIds(new ArrayList<>(transportOrderIdSet));
|
|
|
+ PageResponse<TransportOrderDTO> dtoPageResponse = transportOrderFeign.findByPageWithSubTransportOrderList(transportOrderDTO);
|
|
|
+
|
|
|
+ List<BaseWaybill> baseWaybills = batchParseTransportOrderDTO2Vo(dtoPageResponse.getItems());
|
|
|
+
|
|
|
+ // 2. 拼接数据
|
|
|
+ Map<String, BaseWaybill> baseWaybillMap = new HashMap<>(baseWaybills.size());
|
|
|
+ baseWaybills.forEach(bw -> {
|
|
|
+ baseWaybillMap.put(bw.getTransportOrderId(), bw);
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ // 3. 根据 各项数据 创建参数,赋值
|
|
|
+ if (ObjectUtil.isNotEmpty(transportOrderIds)) {
|
|
|
+ List<BaseWaybill> masterWaybills = new ArrayList<>(transportOrderIds.size());
|
|
|
+ for (String transportOrderId : transportOrderIds) {
|
|
|
+ masterWaybills.add(baseWaybillMap.get(transportOrderId));
|
|
|
+ }
|
|
|
+ printApiRequest.setMasterWaybillList(masterWaybills);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(subTransportOrderIds)) {
|
|
|
+ List<BaseWaybill> houseWaybillList = new ArrayList<>(subTransportOrderIds.size());
|
|
|
+ for (String subTransportOrderId : subTransportOrderIds) {
|
|
|
+ String transportOrderId = subTransportOrderId.substring(0, 12);
|
|
|
+ BaseWaybill baseWaybill = baseWaybillMap.get(transportOrderId);
|
|
|
+ // todo: 子单
|
|
|
+ HouseWaybill houseWaybill = BeanUtil.toBean(baseWaybill, HouseWaybill.class);
|
|
|
+ houseWaybill.setSubTransportOrderId(subTransportOrderId);
|
|
|
+ SubTransportOrderVo subTransportOrderVo = baseWaybill.getSubTransportOrderMap().get(subTransportOrderId);
|
|
|
+ houseWaybill.setSubIndex(subTransportOrderVo.getIndex());
|
|
|
+ houseWaybill.setTemperatureRegion(subTransportOrderVo.getTemperatureRegionText());
|
|
|
+ houseWaybillList.add(houseWaybill);
|
|
|
+ }
|
|
|
+ printApiRequest.setHouseWaybillList(houseWaybillList);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(senderReceiptOrderIds)) {
|
|
|
+ List<BaseWaybill> senderReceiptList = new ArrayList<>(senderReceiptOrderIds.size());
|
|
|
+ for (String senderReceiptOrderId : senderReceiptOrderIds) {
|
|
|
+ String transportOrderId = senderReceiptOrderId.replace("HD", "");
|
|
|
+ BaseWaybill baseWaybill = baseWaybillMap.get(transportOrderId);
|
|
|
+ senderReceiptList.add(baseWaybill);
|
|
|
+ }
|
|
|
+ printApiRequest.setSenderReceiptList(senderReceiptList);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(receiverReceiptOrderIds)) {
|
|
|
+ List<BaseWaybill> receiverReceiptList = new ArrayList<>(receiverReceiptOrderIds.size());
|
|
|
+ for (String receiverReceiptOrderId : receiverReceiptOrderIds) {
|
|
|
+ String transportOrderId = receiverReceiptOrderId.replace("HD", "");
|
|
|
+ BaseWaybill baseWaybill = baseWaybillMap.get(transportOrderId);
|
|
|
+ receiverReceiptList.add(baseWaybill);
|
|
|
+ }
|
|
|
+ printApiRequest.setReceiverReceiptList(receiverReceiptList);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(podSignedOrderIds)) {
|
|
|
+ List<BaseWaybill> podSignedList = new ArrayList<>(podSignedOrderIds.size());
|
|
|
+ for (String podSignedOrderId : podSignedOrderIds) {
|
|
|
+ String transportOrderId = podSignedOrderId;
|
|
|
+ BaseWaybill baseWaybill = baseWaybillMap.get(transportOrderId);
|
|
|
+ podSignedList.add(baseWaybill);
|
|
|
+ }
|
|
|
+ printApiRequest.setPodSignedList(podSignedList);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(retentionCopyOrderIds)) {
|
|
|
+ List<BaseWaybill> retentionCopyList = new ArrayList<>(retentionCopyOrderIds.size());
|
|
|
+ for (String retentionCopyOrderId : retentionCopyOrderIds) {
|
|
|
+ String transportOrderId = retentionCopyOrderId;
|
|
|
+ BaseWaybill baseWaybill = baseWaybillMap.get(transportOrderId);
|
|
|
+ retentionCopyList.add(baseWaybill);
|
|
|
+ }
|
|
|
+ printApiRequest.setRetentionCopyList(retentionCopyList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<BaseWaybill> batchParseTransportOrderDTO2Vo(List<TransportOrderDTO> dtoList, Boolean... needReceiverLocation) {
|
|
|
+ if (CollUtil.isEmpty(dtoList)) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ // 机构
|
|
|
+ Map<Long, OrganDTO> agencySimpleVOMap = organFeign.findAll("").stream()
|
|
|
+ .collect(Collectors.toMap(OrganDTO::getId, v -> v));
|
|
|
+
|
|
|
+ List<Long> orderIds = dtoList.parallelStream().map(TransportOrderDTO::getOrderId).distinct().collect(Collectors.toList());
|
|
|
+ // 货物
|
|
|
+ Map<Long, List<OrderCargoVO>> orderCargoDTOMap = new HashMap<>();
|
|
|
+ Map<Long, OrderCargoVO> orderCargoVOOrderIdMap = new HashMap<>();
|
|
|
+ // 订单
|
|
|
+ Map<Long, OrderDTO> orderMap = new HashMap<>();
|
|
|
+
|
|
|
+ Set<Long> areaIdSet = new HashSet<>();
|
|
|
+ if (ObjectUtil.isNotNull(orderIds) && orderIds.size() > 0) {
|
|
|
+ cargoFeign.listV2(orderIds).stream().forEach(cargoDTO -> {
|
|
|
+ OrderCargoVO orderCargoVO = BeanUtil.toBean(cargoDTO, OrderCargoVO.class);
|
|
|
+ Long keyOrderId = cargoDTO.getOrderId();
|
|
|
+ if (orderCargoDTOMap.containsKey(keyOrderId)) {
|
|
|
+ orderCargoDTOMap.get(keyOrderId).add(orderCargoVO);
|
|
|
+ } else {
|
|
|
+ List<OrderCargoVO> orderCargoDTOList = new ArrayList<>();
|
|
|
+ orderCargoDTOList.add(orderCargoVO);
|
|
|
+ orderCargoDTOMap.put(keyOrderId, orderCargoDTOList);
|
|
|
+ }
|
|
|
+ orderCargoVOOrderIdMap.put(orderCargoVO.getId(), orderCargoVO);
|
|
|
+ });
|
|
|
+
|
|
|
+// List<OrderDTO> orderDTOS = orderFeign.findByIds(orderIds.stream().map(id -> id.toString()).collect(Collectors.toList()));
|
|
|
+ List<OrderDTO> orderDTOS = orderFeign.findByIdList(orderIds);
|
|
|
+ // 生成 memberNameMap
|
|
|
+
|
|
|
+ orderDTOS.stream().forEach(dto -> {
|
|
|
+ if (dto.getId() != null) {
|
|
|
+ orderMap.put(dto.getId(), dto);
|
|
|
+ areaIdSet.add(dto.getReceiverProvinceId());
|
|
|
+ areaIdSet.add(dto.getReceiverCityId());
|
|
|
+ areaIdSet.add(dto.getReceiverCountyId());
|
|
|
+ areaIdSet.add(dto.getSenderProvinceId());
|
|
|
+ areaIdSet.add(dto.getSenderCityId());
|
|
|
+ areaIdSet.add(dto.getSenderCountyId());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ List<AreaDto> areaDtoList = areaFeign.findBatch(new ArrayList<>(areaIdSet));
|
|
|
+ areaDtoList.stream().forEach(areaDto -> {areaDto.setName(areaDto.getOriginalName());});
|
|
|
+ Map<Long, AreaDto> areaMap = areaDtoList.stream().collect(Collectors.toMap(AreaDto::getId, vo -> vo));
|
|
|
+
|
|
|
+
|
|
|
+ Map<Long, List<OrderCargoVO>> finalOrderCargoVOMap = orderCargoDTOMap;
|
|
|
+ Map<Long, OrderDTO> finalOrderMap = orderMap;
|
|
|
+
|
|
|
+ // 派件任务
|
|
|
+ Map<Long, PickupDispatchTaskDTO> dispatchTaskMap = new HashMap<>();
|
|
|
+
|
|
|
+ List<PickupDispatchTaskDTO> pickupDispatchTaskDTOList = pickupDispatchTaskFeign.findByOrderIds(orderIds);
|
|
|
+ List<Long> userIdList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<Long> finalUserIdList = userIdList;
|
|
|
+ pickupDispatchTaskDTOList.stream().forEach(dto -> {
|
|
|
+ if (dto.getTaskType().equals(PickupDispatchTaskType.DISPATCH) &&
|
|
|
+ (dto.getStatus().equals(PickupDispatchTaskStatus.COMPLETED) ||
|
|
|
+ dto.getStatus().equals(PickupDispatchTaskStatus.NEW))) {
|
|
|
+ if (dto.getOrderId() != null) {
|
|
|
+ if (ObjectUtil.isNotEmpty(dto.getCourierId())) {
|
|
|
+ finalUserIdList.add(dto.getCourierId());
|
|
|
+ }
|
|
|
+ dispatchTaskMap.put(dto.getOrderId(), dto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ List<BaseWaybill> resultVOs = dtoList.stream().map(dto -> {
|
|
|
+ BaseWaybill vo = BeanUtil.toBean(dto, BaseWaybill.class);
|
|
|
+ if (true) {
|
|
|
+ if (ObjectUtil.isEmpty(dto.getOrderId())) {
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isEmpty(dto.getCurrentAgencyId())) {
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ OrderDTO orderDTO = finalOrderMap.get(dto.getOrderId());
|
|
|
+ if (ObjectUtil.isNotNull(orderDTO)) {
|
|
|
+ vo.setMark(orderDTO.getMark());
|
|
|
+ LocalDateTime localDateTime = LocalDateTimeUtil.of(dto.getCreated());
|
|
|
+ String formattedTime = LocalDateTimeUtil.format(localDateTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
+ vo.setCreateTime(formattedTime);
|
|
|
+ vo.setSenderName(orderDTO.getSenderName());
|
|
|
+ vo.setSenderPhone(orderDTO.getSenderPhone());
|
|
|
+ vo.setSenderAddress(orderDTO.getSenderAddress());
|
|
|
+ vo.setReceiverName(orderDTO.getReceiverName());
|
|
|
+ vo.setReceiverPhone(orderDTO.getReceiverPhone());
|
|
|
+ vo.setReceiverAddress(orderDTO.getReceiverAddress());
|
|
|
+ vo.setPaymentMethod(OrderPaymentMethod.lookup(orderDTO.getPaymentMethod()).getValue() );
|
|
|
+ vo.setTemperatureRegion(OrderTemperatureRegionType.lookup(orderDTO.getTemperatureRegion()));
|
|
|
+ vo.setDispatchType(OrderDeliveryMethod.getValueByCode(orderDTO.getDispatchType()));
|
|
|
+ vo.setLogisticsType(OrderLogisticsTypeEnum.lookup(orderDTO.getLogisticsType()).getValue());
|
|
|
+ vo.setStorageType(OrderStorageType.getValueByCode(orderDTO.getStorageType()));
|
|
|
+ if (orderDTO.getIsInsure().equals(OrderIsInsureEnum.VALUE_DECLARED.getCode())) {
|
|
|
+ vo.setDeclareValue(orderDTO.getDeclareValue().doubleValue());
|
|
|
+ }
|
|
|
+ if (orderDTO.getPaymentMethod().equals(OrderPaymentMethod.END_PAY.getCode())) {
|
|
|
+ vo.setChargeFee(orderDTO.getChargeFee().doubleValue());
|
|
|
+ vo.setChargeFeePrint(orderDTO.getChargeFee().toString() + "元");
|
|
|
+ } else {
|
|
|
+ vo.setChargeFee(new Double(0));
|
|
|
+ vo.setChargeFeePrint("**");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getSenderProvinceId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getSenderProvinceId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setSenderProvince(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setSenderProvince("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getSenderCityId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getSenderCityId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setSenderCity(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setSenderCity("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getSenderCountyId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getSenderCountyId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setSenderCounty(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setSenderCounty("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getReceiverProvinceId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getReceiverProvinceId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setReceiverProvince(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setReceiverProvince("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getReceiverCityId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getReceiverCityId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setReceiverCity(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setReceiverCity("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getReceiverCountyId())) {
|
|
|
+ AreaDto result = areaMap.get(orderDTO.getReceiverCountyId());
|
|
|
+ if (ObjectUtil.isNotNull(result)) {
|
|
|
+ vo.setReceiverCounty(result.getName());
|
|
|
+ }else {
|
|
|
+ vo.setReceiverCounty("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(orderDTO.getReceiptType())) {
|
|
|
+ vo.setReceiptType(ReceiptOrderTypeEnum.getValueByCode(orderDTO.getReceiptType()) );
|
|
|
+ vo.setReceiptOrderId("HD" + vo.getTransportOrderId());
|
|
|
+ } else {
|
|
|
+ vo.setReceiptType("");
|
|
|
+ vo.setReceiptOrderId("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderCargoVO> orderCargoVOs = finalOrderCargoVOMap.get(dto.getOrderId());
|
|
|
+ if (ObjectUtil.isNotEmpty(orderCargoVOs)) {
|
|
|
+ vo.setComputeWeight(ObjectUtil.isNotEmpty(orderCargoVOs.get(0).getComputeWeight()) ? orderCargoVOs.get(0).getComputeWeight().doubleValue() : orderCargoVOs.get(0).getTotalWeight().doubleValue());
|
|
|
+ vo.setTotalVolume(ObjectUtil.isNotEmpty(orderCargoVOs.get(0).getTotalVolume()) ? orderCargoVOs.get(0).getTotalVolume().doubleValue()
|
|
|
+ : orderCargoVOs.get(0).getVolume().doubleValue());
|
|
|
+ Integer quantity = 0;
|
|
|
+ List<String> cargoName = new ArrayList<>();
|
|
|
+ Integer[] quantitys = new Integer[]{0, 0, 0};
|
|
|
+ for (OrderCargoVO orderCargoVO : orderCargoVOs) {
|
|
|
+ cargoName.add(orderCargoVO.getName());
|
|
|
+ if (orderCargoVO.getTemperatureRegion().equals(OrderTemperatureRegionType.Frozen.getCode())) {
|
|
|
+ quantitys[0] += quantitys[0] + orderCargoVO.getQuantity();
|
|
|
+ quantity += orderCargoVO.getQuantity();
|
|
|
+ }else if (orderCargoVO.getTemperatureRegion().equals(OrderTemperatureRegionType.Chilled.getCode())) {
|
|
|
+ quantitys[1] += quantitys[1] + orderCargoVO.getQuantity();
|
|
|
+ quantity += orderCargoVO.getQuantity();
|
|
|
+ }else if (orderCargoVO.getTemperatureRegion().equals(OrderTemperatureRegionType.Room.getCode())) {
|
|
|
+ quantitys[2] += quantitys[2] + orderCargoVO.getQuantity();
|
|
|
+ quantity += orderCargoVO.getQuantity();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setQuantity(quantity);
|
|
|
+ vo.setQuantityPrint(quantity + "("+ quantitys[0] + "," + quantitys[1] + "," + quantitys[2] + ")");
|
|
|
+ vo.setCargoName(String.join(",", cargoName));
|
|
|
+ } else {
|
|
|
+ vo.setComputeWeight(new Double(1));
|
|
|
+ vo.setComputeWeight(new Double(0.01));
|
|
|
+ vo.setQuantity(0);
|
|
|
+ vo.setQuantityPrint(0 + "("+ 0 + "," + 0 + "," + 0 + ")");
|
|
|
+ vo.setCargoName("");
|
|
|
+ }
|
|
|
+
|
|
|
+ OrganDTO startAgent = agencySimpleVOMap.get(dto.getStartAgencyId());
|
|
|
+ if (!ObjectUtil.isEmpty(startAgent)) {
|
|
|
+ vo.setSenderAgencyName(startAgent.getName());
|
|
|
+ OrganDTO startAgencyParent = agencySimpleVOMap.get(startAgent.getParentId());
|
|
|
+ if (!ObjectUtil.isEmpty(startAgencyParent)) {
|
|
|
+ vo.setStartParentAgencyName(startAgencyParent.getName());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ vo.setSenderAgencyName("");
|
|
|
+ vo.setStartParentAgencyName("");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ OrganDTO endAgent = agencySimpleVOMap.get(dto.getEndAgencyId());
|
|
|
+ if (!ObjectUtil.isEmpty(endAgent)) {
|
|
|
+ vo.setReceiverAgencyName(endAgent.getName());
|
|
|
+ OrganDTO endAgencyParent = agencySimpleVOMap.get(endAgent.getParentId());
|
|
|
+ if (!ObjectUtil.isEmpty(endAgencyParent)) {
|
|
|
+ vo.setEndParentAgencyName(endAgencyParent.getName());
|
|
|
+ } else {
|
|
|
+ vo.setEndParentAgencyName("");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ vo.setReceiverAgencyName("");
|
|
|
+ vo.setEndParentAgencyName("");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<SubTransportOrderDTO> subTransportOrderDTOList = dto.getSubTransportOrderDTOList();
|
|
|
+ List<SubTransportOrderVo> subTransportOrderVoList = subTransportOrderDTO2VO(subTransportOrderDTOList, orderCargoVOOrderIdMap);
|
|
|
+ Map<String, SubTransportOrderVo> subTransportOrderVoMap = new LinkedHashMap<>();
|
|
|
+ subTransportOrderVoList.stream().forEach(item -> {
|
|
|
+ subTransportOrderVoMap.put(item.getSubTransportOrderId(), item);
|
|
|
+ });
|
|
|
+
|
|
|
+ vo.setSubTransportOrderMap(subTransportOrderVoMap);
|
|
|
+ vo.setTransportOrderId(dto.getId());
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ return resultVOs;
|
|
|
+ }
|
|
|
+ private List<SubTransportOrderVo> subTransportOrderDTO2VO(List<SubTransportOrderDTO> subTransportOrderDTOList, Map<Long, OrderCargoVO> orderCargoVOOrderIdMap) {
|
|
|
+ if (cn.hutool.core.util.ObjectUtil.isNotEmpty(subTransportOrderDTOList)) {
|
|
|
+ return subTransportOrderDTOList.stream().map(subDto -> {
|
|
|
+ OrderCargoVO orderCargoVO = orderCargoVOOrderIdMap.get(subDto.getOrderCargoId());
|
|
|
+ if (cn.hutool.core.util.ObjectUtil.isNotNull(orderCargoVO)) {
|
|
|
+ SubTransportOrderVo subTransportOrderVo = new SubTransportOrderVo();
|
|
|
+ subTransportOrderVo.setIndex(subDto.getSubIndex());
|
|
|
+ subTransportOrderVo.setGoodsName(orderCargoVO.getName());
|
|
|
+ subTransportOrderVo.setCargoBarcode(orderCargoVO.getCargoBarcode());
|
|
|
+ subTransportOrderVo.setTemperatureRegion(orderCargoVO.getTemperatureRegion());
|
|
|
+ subTransportOrderVo.setTemperatureRegionText(OrderTemperatureRegionType.lookup(orderCargoVO.getTemperatureRegion()));
|
|
|
+ subTransportOrderVo.setSubTransportOrderId(subDto.getId());
|
|
|
+ return subTransportOrderVo;
|
|
|
+ }
|
|
|
+ return new SubTransportOrderVo();
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ private Long type2Code(Integer type) {
|
|
|
+ switch (type) {
|
|
|
+ case 1:
|
|
|
+ return PrintCodeEnum.PRINT_MASTER.getCode();
|
|
|
+ case 2:
|
|
|
+ return PrintCodeEnum.PRINT_HOUSE_WAYBILL.getCode();
|
|
|
+ case 3:
|
|
|
+ return PrintCodeEnum.PRINT_SENDER_RECEIPT.getCode();
|
|
|
+ case 4:
|
|
|
+ return PrintCodeEnum.PRINT_RECEVIER_RECEIPT.getCode();
|
|
|
+ case 5:
|
|
|
+ return PrintCodeEnum.PRINT_POD_SIGNED.getCode();
|
|
|
+ case 6:
|
|
|
+ return PrintCodeEnum.PRINT_RETENTION_COPY.getCode();
|
|
|
+
|
|
|
+ }
|
|
|
+ throw new SLException("面单类型type无效");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @GlobalTransactional
|
|
|
+ public ApiResponse<Boolean> cancelOrder(CancelRequest cancelRequest) {
|
|
|
+ EnterpriseOrderDTO enterpriseOrderDTO = enterpriseOrderFeign.getByTransportOrderId(cancelRequest.getTransportOrderId(), cancelRequest.getEnterpriseId());
|
|
|
+ if (ObjectUtil.isNull(enterpriseOrderDTO)) {
|
|
|
+ return ApiResponse.error( SZColdChainConstant.CODE_ENTERPRISE_ORDER_NOT_FOUND, "未查到该运单,删除失败");
|
|
|
+ }
|
|
|
+ Long orderId = enterpriseOrderDTO.getOrderId();
|
|
|
+ log.info("删单:" + orderId);
|
|
|
+ // 1. 判断订单状态,是否还在寄件网点,是否还未运出
|
|
|
+ OrderDTO orderDTO = orderFeign.findById(orderId);
|
|
|
+
|
|
|
+ Long sendAgencyId = orderDTO.getSendAgencyId();
|
|
|
+ Long currentAgencyId = orderDTO.getCurrentAgencyId();
|
|
|
+
|
|
|
+ Boolean canDeleteAfterTransport = false;
|
|
|
+
|
|
|
+ if (orderDTO.getStatus().equals(OrderStatus.CLOSE.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.RECEIVED.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.REJECTION.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.DEL.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.CANCELLED.getCode())) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_STATUS_CANNOT_DELETE, "订单当前状态无法进行删单操作");
|
|
|
+ }
|
|
|
+ // 普通账户,不可以删除已经运输中、派送中的、不在当前网点的单
|
|
|
+ if (!canDeleteAfterTransport
|
|
|
+ && (orderDTO.getStatus().equals(OrderStatus.IN_TRANSIT.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.DISPATCHING.getCode())
|
|
|
+ || !orderDTO.getCurrentAgencyId().equals(orderDTO.getSendAgencyId()))){
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_STATUS_CANNOT_DELETE, "订单当前状态无法进行删单操作");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 还在寄件网点,并且不是已关闭、派送中、已签收、用户拒收、已删除、运输中、已取消的状态,其他都可以删除
|
|
|
+ // 2. 删单
|
|
|
+ OrderDTO orderDTO1 = new OrderDTO();
|
|
|
+ orderDTO1.setId(orderId);
|
|
|
+ orderDTO1.setStatus(OrderStatus.CANCELLED.getCode());
|
|
|
+ orderDTO1.setUpdated(LocalDateTime.now());
|
|
|
+ log.info("删单,修改订单状态");
|
|
|
+ TransportOrderDTO transportOrderDTO = transportOrderFeign.findByOrderId(orderDTO.getId());
|
|
|
+ if (ObjectUtil.isNotNull(transportOrderDTO)) {
|
|
|
+ if (!canDeleteAfterTransport && !(transportOrderDTO.getCurrentAgencyId().equals(sendAgencyId))) {
|
|
|
+ return ApiResponse.error(SZColdChainConstant.CODE_ENTERPRISE_ORDER_STATUS_CANNOT_DELETE, "订单已从寄件网点寄出,无法删单,请联系平台");
|
|
|
+ }
|
|
|
+ transportOrderFeign.updateStatus(transportOrderDTO.getId(), TransportOrderStatus.DEL);
|
|
|
+
|
|
|
+ log.info("删单,修改运单状态");
|
|
|
+ }
|
|
|
+ orderFeign.updateById(orderId, orderDTO1);
|
|
|
+
|
|
|
+
|
|
|
+ // 3.1. 如果是已支付的,需要进行退费,在客户费用明细中进行标明,已删单
|
|
|
+
|
|
|
+ // 3.2. 如果已结算,需要回退费用
|
|
|
+ if (orderDTO.getSettleStatus().equals(OrderSettleStatus.SETTLED.getStatus())) {
|
|
|
+ agencyTradingFeign.returnFee(transportOrderDTO.getId(), ReturnFeeTypeEnum.DELETE_ORDER.getCode());
|
|
|
+ log.info("删单,回退费用");
|
|
|
+ }
|
|
|
+ // 3.3. 如果有取件任务,取消
|
|
|
+ if (orderDTO.getStatus().equals(OrderStatus.PENDING.getCode())) {
|
|
|
+ List<PickupDispatchTaskDTO> taskDTOList = pickupDispatchTaskFeign.findByOrderId(orderId, PickupDispatchTaskType.PICKUP);
|
|
|
+ taskDTOList.forEach(item -> {
|
|
|
+ PickupDispatchTaskDTO taskDTO = new PickupDispatchTaskDTO();
|
|
|
+ taskDTO.setId(item.getId());
|
|
|
+ taskDTO.setStatus(PickupDispatchTaskStatus.CANCELLED);//取消状态
|
|
|
+ taskDTO.setCancelReason(PickupDispatchTaskCancelReason.CANCEL_BY_USER);//取消原因
|
|
|
+ taskDTO.setCancelReasonDescription("管理员删单");//取消原因具体描述
|
|
|
+ pickupDispatchTaskFeign.updateStatus(taskDTO);
|
|
|
+
|
|
|
+ log.info("删单,取消取件任务");
|
|
|
+ });
|
|
|
+ } else if (orderDTO.getStatus().equals(OrderStatus.TO_BE_DISPATCHED.getCode())
|
|
|
+ || orderDTO.getStatus().equals(OrderStatus.DISPATCHING.getCode())) {
|
|
|
+ List<PickupDispatchTaskDTO> taskDTOList = pickupDispatchTaskFeign.findByOrderId(orderId, PickupDispatchTaskType.DISPATCH);
|
|
|
+ taskDTOList.forEach(item -> {
|
|
|
+ PickupDispatchTaskDTO taskDTO = new PickupDispatchTaskDTO();
|
|
|
+ taskDTO.setId(item.getId());
|
|
|
+ taskDTO.setStatus(PickupDispatchTaskStatus.CANCELLED);//取消状态
|
|
|
+ taskDTO.setCancelReason(PickupDispatchTaskCancelReason.CANCEL_BY_USER);//取消原因
|
|
|
+ taskDTO.setCancelReasonDescription("管理员删单");//取消原因具体描述
|
|
|
+ pickupDispatchTaskFeign.updateStatus(taskDTO);
|
|
|
+ log.info("删单,取消取件任务");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } catch (SLException e) {
|
|
|
+ log.error("【cancelOrder】" + JSON.toJSONString(cancelRequest) + "," + e);
|
|
|
+ return ApiResponse.error( SZColdChainConstant.CODE_ENTERPRISE_ORDER_BUSINESS_ERROR, e.getMsg());
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return ApiResponse.error( SZColdChainConstant.CODE_ENTERPRISE_ORDER_STATUS_CANNOT_DELETE, "服务器错误");
|
|
|
+ }
|
|
|
+ return ApiResponse.success( true);
|
|
|
+ }
|
|
|
+}
|