feat:添加高德消费明细回推功能

This commit is contained in:
lulz1 2024-05-09 17:01:41 +08:00
parent a20503afd9
commit 0f3f9618c6
22 changed files with 643 additions and 198 deletions

View File

@ -0,0 +1,24 @@
package com.chint.domain.aggregates.supplier;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.MappedCollection;
import org.springframework.data.relational.core.mapping.Table;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@Table("amap_policy")
public class AmapPolicy implements Serializable {
@Serial
private static final long serialVersionUID = 98723461917034612L;
@Id
private Long id;
private String amapPolicyCode;
private Integer ifDefault;
private Integer status;
@MappedCollection(idColumn = "amap_policy_id", keyColumn = "amap_policy_key")
private List<AmapPolicyOrg> amapPolicyOrgList;
}

View File

@ -0,0 +1,21 @@
package com.chint.domain.aggregates.supplier;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.io.Serial;
import java.io.Serializable;
@Data
@Table("amap_policy_org")
public class AmapPolicyOrg implements Serializable {
@Serial
private static final long serialVersionUID = 962936458352934612L;
@Id
private Long id;
private Long amapPolicyId;
private Long orgId;
private String orgCode;
}

View File

@ -2,20 +2,19 @@ package com.chint.domain.aggregates.supplier;
import lombok.Data; import lombok.Data;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.MappedCollection;
import org.springframework.data.relational.core.mapping.Table; import org.springframework.data.relational.core.mapping.Table;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@Data @Data
@Table("amap_route_relationship") @Table("amap_route_relationship")
public class AmapRouteRelationship implements Serializable { public class AmapRouteRelationship implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1908273612230514678L;
@Id @Id
private Long id; private Long id;
private String applyRecordId; private String applyRecordId;
private String outApplyRecordId; private String outApplyRecordId;
private String amapPolicyCode;
} }

View File

@ -1,30 +1,30 @@
package com.chint.domain.factoriy.order_detail; package com.chint.domain.factoriy.order_detail;
import cn.hutool.core.bean.BeanUtil;
import com.chint.domain.aggregates.order.*; import com.chint.domain.aggregates.order.*;
import com.chint.domain.exceptions.NotFoundException; import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.OrderDetailRepository; import com.chint.domain.repository.OrderDetailRepository;
import com.chint.domain.repository.RouteRepository; import com.chint.domain.repository.RouteRepository;
import com.chint.interfaces.rest.amap.dto.detail.OrderDetailResponse; import com.chint.domain.repository.UserRepository;
import com.chint.interfaces.rest.amap.request.OrderDetailRequest; import com.chint.domain.service.RouteRequestDomainService;
import com.chint.interfaces.rest.ctrip.dto.search.car.Address; import com.chint.interfaces.rest.amap.dto.detail.AmapOrderDetailResponse;
import com.chint.interfaces.rest.ctrip.dto.search.car.CarQuickOrderInfoEntity; import com.chint.interfaces.rest.amap.request.AmapOrderDetailRequest;
import com.chint.interfaces.rest.ctrip.dto.search.car.OrderFee;
import com.chint.interfaces.rest.ctrip.dto.search.car.Vehicle;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import static com.chint.infrastructure.constant.BelongSystemConstant.TRAVAL_SYS_TYPE_AMAP;
import static com.chint.infrastructure.constant.FSSCConstant.FSSC_CAR_STATUS_SUCCESS;
import static com.chint.infrastructure.constant.BelongSystemConstant.TRAVAL_SYS_TYPE_CTRIP; import static com.chint.interfaces.rest.amap.util.AmapStatusUtil.mapFSSCOrderStatus;
import static com.chint.infrastructure.constant.CommonMessageConstant.NOT_FOUND;
import static com.chint.infrastructure.constant.FSSCConstant.*;
@Component @Component
public class AmapOrderExtensionFactoryImpl implements OrderExtensionFactory{ public class AmapOrderExtensionFactoryImpl implements OrderExtensionFactory {
@Autowired @Autowired
private OrderDetailRequest orderDetailRequest; private AmapOrderDetailRequest orderDetailRequest;
@Autowired
private RouteRequestDomainService routeRequestDomainService;
@Autowired @Autowired
private OrderDetailRepository orderDetailRepository; private OrderDetailRepository orderDetailRepository;
@ -32,68 +32,60 @@ public class AmapOrderExtensionFactoryImpl implements OrderExtensionFactory{
@Autowired @Autowired
private RouteRepository routeRepository; private RouteRepository routeRepository;
@Autowired
private UserRepository userRepository;
@Autowired @Autowired
private OrderDetailFactory orderDetailFactory; private OrderDetailFactory orderDetailFactory;
@Override @Override
public CarOrderDetail createCarOrderDetail(Object carOrderDetailData) { public CarOrderDetail createCarOrderDetail(Object carOrderDetailData) {
OrderDetailResponse.Data data = (OrderDetailResponse.Data) carOrderDetailData; AmapOrderDetailResponse response = (AmapOrderDetailResponse) carOrderDetailData;
AmapOrderDetailResponse.Data data = response.getData();
//订单详情查询 //订单详情查询
OrderDetailResponse response=orderDetailRequest.queryOrderDetail(data.getAmapOrderId()); if (!response.getCode().equals(1)) {
if (!response.getCode().equals(1)){
return null; return null;
} }
String orderNo=response.getData().getAmapOrderId(); String orderNo = data.getAmapOrderId();
OrderDetail orderDetail = orderDetailRepository.findByOrderNo(orderNo)
.orElseThrow(() -> new NotFoundException(NOT_FOUND));
RouteOrder routeOrder = routeRepository.queryById(orderDetail.getRouteId());
CarOrderDetail carOrderDetail = orderDetailFactory.buildCarWithRouteOrderAndOrderDetail(routeOrder, orderDetail);
RouteOrder routeOrder = routeRequestDomainService.getRouteOrder(data.getRequestRouterNo());
CarOrderDetail carOrderDetail = BeanUtil.copyProperties(orderDetailFactory.buildWithRouteOrder(routeOrder), CarOrderDetail.class);
carOrderDetail.setOrderNo(orderNo);
carOrderDetail.setDetailId(orderNo);
User user = userRepository.findByUserEmployeeNo(routeOrder.getUserId());
carOrderDetail.setBookingUserCode(user.getEmployeeNo());
carOrderDetail.setBookingName(user.getName());
carOrderDetail.setBookingUserPhone(data.getMobile());
//这里要更新用车的状态 //这里要更新用车的状态
OrderEvent lastEvent = orderDetail.getLastEvent(); carOrderDetail.setOrderStatus(mapFSSCOrderStatus(data.getShowStatus()));
if (lastEvent != null) {
carOrderDetail.setOrderStatus(lastEvent.mapToCarOrderDetailStatus());
} else {
carOrderDetail.setOrderStatus(FSSC_CAR_STATUS_SUCCESS);
}
//根据状态2来判断该订单已经被取消,和总退款费用判断是否退款
if (data.getShowStatus() == 2) {
carOrderDetail.setOrderStatus(FSSC_ORDER_STATUS_CANCEL);
Integer totalRefundamount=data.getTotalEnterpriseRefundAmount()+data.getTotalPersonRefundAmount();
if (totalRefundamount>0) {
carOrderDetail.setOrderStatus(FSSC_CAR_STATUS_REFUND);
}
}
carOrderDetail.setTrvaleSysType(TRAVAL_SYS_TYPE_AMAP);
carOrderDetail.setTrvaleSysType(TRAVAL_SYS_TYPE_CTRIP); return updateCarOrderDetailData(carOrderDetail, carOrderDetailData);
if(carOrderDetail.getOrderNo() == null || carOrderDetail.getDetailId() == null){
carOrderDetail.setOrderNo(orderNo);
carOrderDetail.setDetailId(orderNo);
}
return carOrderDetail;
} }
@Override @Override
public CarOrderDetail updateCarOrderDetailData(CarOrderDetail carOrderDetail, Object carOrderDetailData) { public CarOrderDetail updateCarOrderDetailData(CarOrderDetail carOrderDetail, Object carOrderDetailData) {
OrderDetailResponse.Data data = (OrderDetailResponse.Data) carOrderDetailData; AmapOrderDetailResponse response = (AmapOrderDetailResponse) carOrderDetailData;
if (data!=null){ AmapOrderDetailResponse.Data data = response.getData();
if (data != null) {
carOrderDetail.setUserName(data.getPassengerName()); carOrderDetail.setUserName(data.getPassengerName());
carOrderDetail.setUserCode(data.getUserId()); carOrderDetail.setUserCode(data.getUserId());
carOrderDetail.setPhone(data.getPassengerPhone()); carOrderDetail.setPhone(data.getPassengerPhone());
carOrderDetail.setBOOK_ORG_STRUCT_1(data.getDepartmentName()); carOrderDetail.setBOOK_ORG_STRUCT_1(data.getDepartmentName());
carOrderDetail.setCreateTime(data.getRequestTime()); carOrderDetail.setCreateTime(data.getRequestTime());
carOrderDetail.setOrderAmount(String.valueOf(data.getEnterpriseAmount()+data.getPersonAmount())); carOrderDetail.setOrderAmount(String.valueOf(data.getEnterpriseAmount() + data.getPersonAmount()));
carOrderDetail.setCompanyPaymentAmount(String.valueOf(data.getEnterpriseAmount())); carOrderDetail.setCompanyPaymentAmount(String.valueOf(data.getEnterpriseAmount()));
carOrderDetail.setPersonalPaymentAmount(String.valueOf(data.getPersonAmount())); carOrderDetail.setPersonalPaymentAmount(String.valueOf(data.getPersonAmount()));
if (data.getPersonAmount()==0&&data.getEnterpriseAmount()>0) { if (data.getPersonAmount() == 0 && data.getEnterpriseAmount() > 0) {
carOrderDetail.setPaymentType("0"); carOrderDetail.setPaymentType("0");
} else if(data.getPersonAmount()>0&&data.getEnterpriseAmount()==0){ } else if (data.getPersonAmount() > 0 && data.getEnterpriseAmount() == 0) {
carOrderDetail.setPaymentType("1"); carOrderDetail.setPaymentType("1");
}else { } else {
carOrderDetail.setPaymentType("2"); carOrderDetail.setPaymentType("2");
} }

View File

@ -26,11 +26,13 @@ public class OrderDetailFactoryImpl implements OrderDetailFactory {
public OrderDetail create(OrderLegData orderLegData) { public OrderDetail create(OrderLegData orderLegData) {
OrderDetail orderDetail = OrderDetail.of(orderLegData.getOutOrderNo(), orderLegData.getSupplierName()); OrderDetail orderDetail = OrderDetail.of(orderLegData.getOutOrderNo(), orderLegData.getSupplierName());
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
if (orderLegData.getStartTime() != null) { String startTime = orderLegData.getStartTime();
orderDetail.setStartTime(LocalDateTime.parse(orderLegData.getStartTime(), dateTimeFormatter)); if (startTime != null && !startTime.isEmpty()) {
orderDetail.setStartTime(LocalDateTime.parse(startTime, dateTimeFormatter));
} }
if (orderLegData.getEndTime() != null) { String endTime = orderLegData.getEndTime();
orderDetail.setEndTime(LocalDateTime.parse(orderLegData.getEndTime(), dateTimeFormatter)); if (endTime != null && !endTime.isEmpty()) {
orderDetail.setEndTime(LocalDateTime.parse(endTime, dateTimeFormatter));
} }
orderDetail.setOrderDate(LocalDateTime.parse(orderLegData.getOrderTime(), dateTimeFormatter)); orderDetail.setOrderDate(LocalDateTime.parse(orderLegData.getOrderTime(), dateTimeFormatter));
// orderDetail.setCurrencyType(CurrencyType.getByCode(orderLegData.getCurrencyCode())); // orderDetail.setCurrencyType(CurrencyType.getByCode(orderLegData.getCurrencyCode()));

View File

@ -1,11 +1,14 @@
package com.chint.domain.factoriy.order_detail; package com.chint.domain.factoriy.order_detail;
import com.chint.domain.exceptions.NotFoundException; import com.chint.domain.exceptions.NotFoundException;
import com.chint.domain.factoriy.order_record.AmapOrderRecordExtensionFactory;
import com.chint.infrastructure.constant.CommonMessageConstant; import com.chint.infrastructure.constant.CommonMessageConstant;
import com.chint.infrastructure.constant.SupplierNameConstant; import com.chint.infrastructure.constant.SupplierNameConstant;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import static com.chint.infrastructure.constant.SupplierNameConstant.*;
@Component @Component
public class OrderExtensionCreator { public class OrderExtensionCreator {
@ -14,10 +17,14 @@ public class OrderExtensionCreator {
@Autowired @Autowired
private CTripOrderExtensionFactoryImpl cTripOrderExtensionFactory; private CTripOrderExtensionFactoryImpl cTripOrderExtensionFactory;
@Autowired
private AmapOrderExtensionFactoryImpl amapOrderExtensionFactory;
public OrderExtensionFactory of(String supplierName) { public OrderExtensionFactory of(String supplierName) {
return switch (supplierName) { return switch (supplierName) {
case SupplierNameConstant.SUPPLIER_C_TRIP -> cTripOrderExtensionFactory; case SUPPLIER_C_TRIP -> cTripOrderExtensionFactory;
case SupplierNameConstant.SUPPLIER_L_Y -> lyOrderExtensionFactory; case SUPPLIER_L_Y -> lyOrderExtensionFactory;
case SUPPLIER_AMAP -> amapOrderExtensionFactory;
default -> throw new NotFoundException(CommonMessageConstant.NOT_FOUND); default -> throw new NotFoundException(CommonMessageConstant.NOT_FOUND);
}; };
} }

View File

@ -9,7 +9,11 @@ import com.chint.domain.aggregates.order.order_record.ly_order_record.*;
import com.chint.domain.aggregates.user.User; import com.chint.domain.aggregates.user.User;
import com.chint.domain.aggregates.user.UserDepartmentInfo; import com.chint.domain.aggregates.user.UserDepartmentInfo;
import com.chint.domain.repository.RouteRepository; import com.chint.domain.repository.RouteRepository;
import com.chint.infrastructure.repository.jdbc.*; import com.chint.domain.service.RouteRequestDomainService;
import com.chint.infrastructure.repository.jdbc.JdbcOrderDetailRepository;
import com.chint.infrastructure.repository.jdbc.JdbcOrderTravelRepository;
import com.chint.infrastructure.repository.jdbc.JdbcRouteRepository;
import com.chint.infrastructure.repository.jdbc.JdbcUserRepository;
import com.chint.infrastructure.util.BeanCopyUtils; import com.chint.infrastructure.util.BeanCopyUtils;
import com.chint.interfaces.rest.data_center.user.UserHttpRequest; import com.chint.interfaces.rest.data_center.user.UserHttpRequest;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -51,6 +55,9 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
@Autowired @Autowired
private JdbcOrderTravelRepository orderTravelRepository; private JdbcOrderTravelRepository orderTravelRepository;
@Autowired
private RouteRequestDomainService routeRequestDomainService;
@Autowired @Autowired
private CTripOrderRecordExtensionFactory cTripOrderRecordExtensionFactory; private CTripOrderRecordExtensionFactory cTripOrderRecordExtensionFactory;
@ -105,7 +112,7 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
String orderSerialNo = lyOrderFlightRecord.getOrderSerialNo();//订单号 String orderSerialNo = lyOrderFlightRecord.getOrderSerialNo();//订单号
AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>(); AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>();
AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>(); AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>();
OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set); OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set, lyOrderFlightRecord.getOutApplayOrderNo());
BeanUtils.copyProperties(orderRecordBasic, orderFlightRecord); BeanUtils.copyProperties(orderRecordBasic, orderFlightRecord);
OrderDetail orderDetail = orderDetailRef.get();//获取订单明细 OrderDetail orderDetail = orderDetailRef.get();//获取订单明细
RouteOrder routeOrder = routeOrderRef.get();//获取财务共享订单 RouteOrder routeOrder = routeOrderRef.get();//获取财务共享订单
@ -222,7 +229,7 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
String orderSerialNo = lyOrderHotelRecord.getOrderSerialNo();//订单号 String orderSerialNo = lyOrderHotelRecord.getOrderSerialNo();//订单号
AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>(); AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>();
AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>(); AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>();
OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set); OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set, lyOrderHotelRecord.getOutApplayOrderNo());
BeanUtils.copyProperties(orderRecordBasic, orderHotelRecord); BeanUtils.copyProperties(orderRecordBasic, orderHotelRecord);
OrderDetail orderDetail = orderDetailRef.get();//订单明细 OrderDetail orderDetail = orderDetailRef.get();//订单明细
RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据 RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据
@ -330,7 +337,7 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
String orderSerialNo = lyOrderTrainRecord.getOrderSerialNo();//订单号 String orderSerialNo = lyOrderTrainRecord.getOrderSerialNo();//订单号
AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>(); AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>();
AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>(); AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>();
OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set); OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set, lyOrderTrainRecord.getOutApplayOrderNo());
BeanUtils.copyProperties(orderRecordBasic, orderTrainRecord); BeanUtils.copyProperties(orderRecordBasic, orderTrainRecord);
OrderDetail orderDetail = orderDetailRef.get();//订单明细 OrderDetail orderDetail = orderDetailRef.get();//订单明细
RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据 RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据
@ -450,7 +457,7 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
String orderSerialNo = lyOrderCarRecord.getOrderSerialNo();//订单号 String orderSerialNo = lyOrderCarRecord.getOrderSerialNo();//订单号
AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>(); AtomicReference<OrderDetail> orderDetailRef = new AtomicReference<>();
AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>(); AtomicReference<RouteOrder> routeOrderRef = new AtomicReference<>();
OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set); OrderRecordBasic orderRecordBasic = getOrderRecordBasic(orderSerialNo, orderDetailRef::set, routeOrderRef::set, lyOrderCarRecord.getOutApplayOrderNo());
BeanUtils.copyProperties(orderRecordBasic, orderCarRecord); BeanUtils.copyProperties(orderRecordBasic, orderCarRecord);
OrderDetail orderDetail = orderDetailRef.get();//订单明细 OrderDetail orderDetail = orderDetailRef.get();//订单明细
RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据 RouteOrder routeOrder = routeOrderRef.get();//财务共享订单数据
@ -548,20 +555,24 @@ public class LyOrderRecordExtensionFactory implements OrderRecordExtensionFactor
} }
//获取公共对象 //获取公共对象
public OrderRecordBasic getOrderRecordBasic(String orderSerialNo, Consumer<OrderDetail> consumerOrderDetail, Consumer<RouteOrder> consumerRouteOrder) { public OrderRecordBasic getOrderRecordBasic(String orderSerialNo, Consumer<OrderDetail> consumerOrderDetail, Consumer<RouteOrder> consumerRouteOrder, String routeOrderNo) {
OrderDetail orderDetail = jdbcOrderDetailRepository.findByOrderNo(orderSerialNo); RouteOrder routeOrder = routeRequestDomainService.getRouteOrder(routeOrderNo);
consumerOrderDetail.accept(orderDetail == null ? new OrderDetail() : orderDetail);//设置订单明细数据
if (Objects.isNull(orderDetail)) {
consumerRouteOrder.accept(new RouteOrder());
return new OrderRecordBasic();
}
Long routeId = orderDetail.getRouteId();
RouteOrder routeOrder = routeRepository.queryById(routeId);
consumerRouteOrder.accept(routeOrder == null ? new RouteOrder() : routeOrder); consumerRouteOrder.accept(routeOrder == null ? new RouteOrder() : routeOrder);
if (Objects.isNull(routeOrder)) { if (Objects.isNull(routeOrder)) {
return new OrderRecordBasic(); return new OrderRecordBasic();
} else {
OrderDetail orderDetail = routeOrder
.getOrderDetails()
.stream()
.filter(it -> it.getOrderNo().equals(orderSerialNo))
.findFirst()
.orElse(null);
consumerOrderDetail.accept(orderDetail == null ? new OrderDetail() : orderDetail);//设置订单明细数据
if (Objects.isNull(orderDetail)) {
consumerRouteOrder.accept(new RouteOrder());
return new OrderRecordBasic();
}
} }
// return orderRecordFactory.buildWithRouteOrder(routeOrder);
return new OrderRecordBasic(); return new OrderRecordBasic();
} }

View File

@ -0,0 +1,9 @@
package com.chint.domain.repository;
import com.chint.domain.aggregates.supplier.AmapPolicy;
import java.util.Optional;
public interface AmapPolicyRepository {
Optional<AmapPolicy> findByDefault();
}

View File

@ -4,6 +4,7 @@ import com.chint.domain.aggregates.order.*;
import com.chint.domain.aggregates.supplier.AmapRouteRelationship; import com.chint.domain.aggregates.supplier.AmapRouteRelationship;
import com.chint.domain.aggregates.user.User; import com.chint.domain.aggregates.user.User;
import com.chint.domain.exceptions.CommandException; import com.chint.domain.exceptions.CommandException;
import com.chint.domain.repository.AmapPolicyRepository;
import com.chint.domain.repository.AmapRouteRelationshipRepository; import com.chint.domain.repository.AmapRouteRelationshipRepository;
import com.chint.domain.repository.UserRepository; import com.chint.domain.repository.UserRepository;
import com.chint.domain.service.LegDomainService; import com.chint.domain.service.LegDomainService;
@ -45,6 +46,9 @@ public class AmapOrderSyncAdapter implements SupplierOrderSync {
@Autowired @Autowired
private LegDomainService legDomainService; private LegDomainService legDomainService;
@Autowired
private AmapPolicyRepository amapPolicyRepository;
private Gson gson = new Gson(); private Gson gson = new Gson();
@Override @Override
@ -71,6 +75,7 @@ public class AmapOrderSyncAdapter implements SupplierOrderSync {
AmapRouteRelationship amapRouteRelationship = new AmapRouteRelationship(); AmapRouteRelationship amapRouteRelationship = new AmapRouteRelationship();
amapRouteRelationship.setApplyRecordId(response.getData()); amapRouteRelationship.setApplyRecordId(response.getData());
amapRouteRelationship.setOutApplyRecordId(routeRequest.getRouteRequestNo()); amapRouteRelationship.setOutApplyRecordId(routeRequest.getRouteRequestNo());
amapRouteRelationship.setAmapPolicyCode(travelApplicationDto.getRegulationId());
amapRouteRelationshipRepository.save(amapRouteRelationship); amapRouteRelationshipRepository.save(amapRouteRelationship);
} }
@ -130,11 +135,15 @@ public class AmapOrderSyncAdapter implements SupplierOrderSync {
areaCodes.add(amapLocationRequest.getACodeByLocationName(location.getLocationName())); areaCodes.add(amapLocationRequest.getACodeByLocationName(location.getLocationName()));
} }
processContent.setValidCityList(areaCodes); processContent.setValidCityList(areaCodes);
processContent.setAmountLimited(1); // processContent.setAmountLimited(1);
processContent.setAllowCrossCity(1); // processContent.setAllowCrossCity(1);
dto.setProcessContent(gson.toJson(processContent)); dto.setProcessContent(gson.toJson(processContent));
dto.setStatus("1"); dto.setStatus("1");
amapPolicyRepository.findByDefault()
.ifPresent(policy -> dto.setRegulationId(policy.getAmapPolicyCode()));
return dto; return dto;
} }
@ -157,7 +166,7 @@ public class AmapOrderSyncAdapter implements SupplierOrderSync {
travelApplicationDto.setApplyRecordId(amapRouteRelationship.getApplyRecordId()); travelApplicationDto.setApplyRecordId(amapRouteRelationship.getApplyRecordId());
TravelApplicationDtoResponse response = travelApplicationRequest.modify(travelApplicationDto); TravelApplicationDtoResponse response = travelApplicationRequest.modify(travelApplicationDto);
Integer code = response.getCode(); Integer code = response.getCode();
if(code.equals(1)){ if (code.equals(1)) {
amapRouteRelationshipRepository.removeByOutApplyRecordId(outApplyRecordId); amapRouteRelationshipRepository.removeByOutApplyRecordId(outApplyRecordId);
} }
return code.equals(1); return code.equals(1);

View File

@ -1,133 +1,78 @@
package com.chint.domain.service.supplier; package com.chint.domain.service.supplier;
import com.chint.domain.aggregates.order.Location;
import com.chint.domain.exceptions.NotFoundException; import com.chint.domain.exceptions.NotFoundException;
import com.chint.domain.repository.LocationRepository; import com.chint.domain.repository.LocationRepository;
import com.chint.domain.value_object.OrderLegData; import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SupplierCallbackData; import com.chint.domain.value_object.SupplierCallbackData;
import com.chint.domain.value_object.enums.CurrencyType; import com.chint.domain.value_object.enums.CurrencyType;
import com.chint.infrastructure.constant.CommonMessageConstant; import com.chint.infrastructure.constant.CommonMessageConstant;
import com.chint.infrastructure.constant.LegConstant;
import com.chint.infrastructure.constant.OrderConstant; import com.chint.infrastructure.constant.OrderConstant;
import com.chint.infrastructure.constant.SupplierNameConstant; import com.chint.interfaces.rest.amap.dto.detail.AmapOrderDetailResponse;
import com.chint.interfaces.rest.amap.dto.detail.OrderDetailResponse; import com.chint.interfaces.rest.amap.request.AmapOrderDetailRequest;
import com.chint.interfaces.rest.amap.request.OrderDetailRequest; import com.google.gson.Gson;
import com.chint.interfaces.rest.ctrip.dto.search.ItineraryEntity;
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderResponse;
import com.chint.interfaces.rest.ctrip.dto.search.car.CarBasicInfo;
import com.chint.interfaces.rest.ctrip.dto.search.car.CarQuickOrderInfoEntity;
import com.chint.interfaces.rest.ctrip.dto.search.car.OrderProduct;
import com.chint.interfaces.rest.ctrip.dto.search.flight.FlightInfo;
import com.chint.interfaces.rest.ctrip.dto.search.flight.FlightOrderInfoEntity;
import com.chint.interfaces.rest.ctrip.dto.search.hotel.HotelOrderInfoEntity;
import com.chint.interfaces.rest.ctrip.dto.search.train.TrainOrderInfoEntity;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import static com.chint.infrastructure.constant.LegConstant.LEG_TYPE_TAXI; import static com.chint.infrastructure.constant.LegConstant.LEG_TYPE_TAXI;
import static com.chint.infrastructure.constant.SupplierNameConstant.SUPPLIER_AMAP;
import static com.chint.infrastructure.constant.SupplierNameConstant.SUPPLIER_L_Y; import static com.chint.infrastructure.constant.SupplierNameConstant.SUPPLIER_L_Y;
/** /**
* 高德订单处理 * 高德订单处理
*
* @Authornxj * @Authornxj
* @Date2024/4/30 14:01 * @Date2024/4/30 14:01
*/ */
@Component @Component
public class AmapOrderDataAdapter implements OrderDataAdapter{ public class AmapOrderDataAdapter implements OrderDataAdapter {
@Autowired @Autowired
private LocationRepository locationRepository; private LocationRepository locationRepository;
@Autowired @Autowired
private OrderDetailRequest orderDetailRequest; private AmapOrderDetailRequest orderDetailRequest;
@Override @Override
public Optional<OrderLegData> adapt(SupplierCallbackData supplierData) { public Optional<OrderLegData> adapt(SupplierCallbackData supplierData) {
OrderDetailResponse data=(OrderDetailResponse) supplierData.getData(); AmapOrderDetailResponse amapOrderDetailResponse = (AmapOrderDetailResponse) supplierData.getData();
OrderDetailResponse response=orderDetailRequest.queryOrderDetail(data.getData().getAmapOrderId()); AmapOrderDetailResponse.Data data = amapOrderDetailResponse.getData();
if (!response.getCode().equals(1)){ if (data == null) {
return Optional.empty(); return Optional.empty();
}else {
OrderDetailResponse.Data result=response.getData();
return Optional.of(
OrderLegData.builder()
.productType(LEG_TYPE_TAXI)
.outOrderNo(result.getAmapOrderId())
.price(String.valueOf(result.getEnterpriseAmount()+response.getData().getPersonAmount()))
.supplierName(supplierData.getSupplierName())
.currencyCode(CurrencyType.RENMINBI.getCode())
//没有返回差旅申请单号
.selfOrderNo(response.getData().getApplyRecord().getOutApplyRecordId())
.orderStatus(supplierData.getSelfOrderStatus())
.carOrderDetailData(response)
.orderTime(result.getRequestTime())
.startTime(result.getGetOnTime())
.endTime(result.getGetOffTime())
.orderStatus(supplierData.getSelfOrderStatus())
.originOrderStatus(supplierData.getOutOrderStatus())
.destinationName(result.getEndName())
.supplierName(SUPPLIER_L_Y)
.build()
);
} }
String applyRecord = data.getApplyRecord();
Gson gson = new Gson();
AmapOrderDetailResponse.ApplyRecord record = gson.fromJson(applyRecord, AmapOrderDetailResponse.ApplyRecord.class);
String price;
if (data.getEnterpriseAmount() == null && data.getPersonAmount() == null) {
price = "0";
} else {
Integer enterpriseAmount = data.getEnterpriseAmount();
Integer personAmount = data.getPersonAmount();
price = String.valueOf((enterpriseAmount == null ? 0 : enterpriseAmount) + (personAmount == null ? 0 : personAmount));
}
return Optional.of(
OrderLegData.builder()
.productType(LEG_TYPE_TAXI)
.outOrderNo(data.getAmapOrderId())
.price(price)
.supplierName(supplierData.getSupplierName())
.currencyCode(CurrencyType.RENMINBI.getCode())
.selfOrderNo(record.getOutApplyRecordId())
.orderStatus(supplierData.getSelfOrderStatus())
.carOrderDetailData(amapOrderDetailResponse)
.orderTime(data.getRequestTime())
.startTime(data.getGetOnTime())
.endTime(data.getGetOffTime())
.orderStatus(supplierData.getSelfOrderStatus())
.originOrderStatus(supplierData.getOutOrderStatus())
.destinationName(data.getEndName())
.supplierName(SUPPLIER_AMAP)
.build());
} }
private OrderLegData.Builder findSingleElementList(ItineraryEntity itineraryEntity,
OrderLegData.Builder builder) {
// 处理租车订单
List<CarQuickOrderInfoEntity> carOrderInfoList = itineraryEntity.getCarQuickOrderInfoList();
if (carOrderInfoList != null && carOrderInfoList.size() == 1) {
CarQuickOrderInfoEntity carOrderInfo = carOrderInfoList.get(0);
OrderProduct orderProduct = carOrderInfo.getOrderProduct();
CarBasicInfo carBasicInfo = carOrderInfo.getBasicInfo();
Long departCityId = Long.valueOf(orderProduct.getDepartAddress().getCityId());
Location departCityName = locationRepository.findByCityIdAndLevelThree(departCityId);
if(departCityName == null){
departCityName = locationRepository.findByCityIdAndLevelFour(departCityId);
}
Long arriveCityId = Long.valueOf(orderProduct.getArriveAddress().getCityId());
Location arriveCityName = locationRepository.findByCityIdAndLevelThree(arriveCityId);
if(arriveCityName == null){
arriveCityName = locationRepository.findByCityIdAndLevelFour(arriveCityId);
}
return builder.productType(LegConstant.LEG_TYPE_TAXI)
.carOrderDetailData(carOrderInfo)
.currencyCode(CurrencyType.RENMINBI.getCode())
.orderTime(carBasicInfo.getCreateTime())
.startTime(orderProduct.getServiceBeginTime())
.endTime(orderProduct.getServiceEndTime())
.originId(departCityName.getLocationId())
.destinationId(arriveCityName.getLocationId())
.price(String.valueOf(carBasicInfo.getOrderAmount()))
.selfOrderNo(carBasicInfo.getJouneryID())
.outOrderNo(String.valueOf(carBasicInfo.getOrderId()))
.orderStatus(translateCarOrderStatus(carBasicInfo.getOrderStatus()))
.originOrderStatus(carBasicInfo.getOrderStatus());
}
// 如果没有找到任何只含一个元素的列表返回null
return null;
}
private Location getLocationId(String cityName, Long cityId) {
Location byName = locationRepository.findByCityIdAndLevelThree(cityId);
if (byName == null) {
List<Location> listByCityName = locationRepository.findListByCityName(cityName);
if (listByCityName != null && !listByCityName.isEmpty()) {
byName = listByCityName.get(0);
}
}
return byName;
}
private Integer translateCarOrderStatus(String carOrderStatus) { private Integer translateCarOrderStatus(String carOrderStatus) {
return switch (carOrderStatus) { return switch (carOrderStatus) {

View File

@ -39,4 +39,14 @@ public class SupplierCallbackData {
this.extension = extension; this.extension = extension;
return this; return this;
} }
public SupplierCallbackData outOrderStatus(String outOrderStatus) {
this.outOrderStatus = outOrderStatus;
return this;
}
public SupplierCallbackData selfOrderStatus(Integer selfOrderStatus) {
this.selfOrderStatus = selfOrderStatus;
return this;
}
} }

View File

@ -3,6 +3,7 @@ package com.chint.infrastructure.constant;
public class BelongSystemConstant { public class BelongSystemConstant {
public static final String TRAVAL_SYS_TYPE_CTRIP = "XC"; public static final String TRAVAL_SYS_TYPE_CTRIP = "XC";
public static final String TRAVAL_SYS_TYPE_LY = "TC"; public static final String TRAVAL_SYS_TYPE_LY = "TC";
public static final String TRAVAL_SYS_TYPE_AMAP = "GD";
public static final String BELONG_SYS_CODE_FSSC = "FSSC"; public static final String BELONG_SYS_CODE_FSSC = "FSSC";
public static final String BELONG_SYS_CODE_H3BPM = "H3BPM"; public static final String BELONG_SYS_CODE_H3BPM = "H3BPM";
public static final String BELONG_SYS_CODE_XNFSSC = "XNFSSC"; public static final String BELONG_SYS_CODE_XNFSSC = "XNFSSC";

View File

@ -0,0 +1,20 @@
package com.chint.infrastructure.repository;
import com.chint.domain.aggregates.supplier.AmapPolicy;
import com.chint.domain.repository.AmapPolicyRepository;
import com.chint.infrastructure.repository.jdbc.JdbcAmapPolicyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public class AmapPolicyRepositoryImpl implements AmapPolicyRepository {
@Autowired
private JdbcAmapPolicyRepository jdbcAmapPolicyRepository;
@Override
public Optional<AmapPolicy> findByDefault() {
return jdbcAmapPolicyRepository.findByIfDefault(1);
}
}

View File

@ -0,0 +1,12 @@
package com.chint.infrastructure.repository.jdbc;
import com.chint.domain.aggregates.supplier.AmapPolicy;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface JdbcAmapPolicyRepository extends CrudRepository<AmapPolicy, Long> {
Optional<AmapPolicy> findByIfDefault(Integer ifDefault);
}

View File

@ -1,14 +1,11 @@
package com.chint.interfaces.rest.amap.dto.detail; package com.chint.interfaces.rest.amap.dto.detail;
import com.chint.interfaces.rest.amap.BaseResponse; import com.chint.interfaces.rest.amap.BaseResponse;
import com.google.gson.Gson;
import lombok.Data; import lombok.Data;
import java.util.Date;
import java.util.List;
@Data @Data
public class OrderDetailResponse extends BaseResponse { public class AmapOrderDetailResponse extends BaseResponse {
private Data data; private Data data;
@ -35,7 +32,7 @@ public class OrderDetailResponse extends BaseResponse {
private String licensePlate;//车牌号 private String licensePlate;//车牌号
private String carType;//车辆型号 private String carType;//车辆型号
private String carColor;//车辆颜色 private String carColor;//车辆颜色
private Integer rideType;//运力类型1经济2品质专车3六座商务4豪华5出租车6优享11优惠推荐13企业同行14企业拼车15代驾 private String rideType;//运力类型1经济2品质专车3六座商务4豪华5出租车6优享11优惠推荐13企业同行14企业拼车15代驾
private String rideTypeName;//运力显示文案 private String rideTypeName;//运力显示文案
private Boolean isFixedPrice;//是否为特价车车型 private Boolean isFixedPrice;//是否为特价车车型
private String cpName;//CP名称例如滴滴首汽约车等 private String cpName;//CP名称例如滴滴首汽约车等
@ -47,19 +44,19 @@ public class OrderDetailResponse extends BaseResponse {
private String totalFee;//总费用 private String totalFee;//总费用
private String originalFeeDetail;//费用明细取消费起步费里程费时长费停车费过桥费附加费加价红包信息费其他费用等等 private String originalFeeDetail;//费用明细取消费起步费里程费时长费停车费过桥费附加费加价红包信息费其他费用等等
private String feeDetail;//费用明细时长费里程费附加费附加费用明细其他费用其他费用明细 private String feeDetail;//费用明细时长费里程费附加费附加费用明细其他费用其他费用明细
private int showStatus;//0-派单中1-完成待支付2-取消待支付3-关闭4-订单完成5-待出发6-待上车7-行程中订单当前状态 private Integer showStatus;//0-派单中1-完成待支付2-取消待支付3-关闭4-订单完成5-待出发6-待上车7-行程中订单当前状态
private String enterpriseCpStatus;//详见订单子状态映射表 private String enterpriseCpStatus;//详见订单子状态映射表
private int orderServiceType;//业务类型 1-实时单2-预约单3-接机 4-送机6-市内拼车8-代驾 private Integer orderServiceType;//业务类型 1-实时单2-预约单3-接机 4-送机6-市内拼车8-代驾
private int orderEnterance;//发单入口0实时 1预约 2接机 3送机 4接站 5送站 8代驾 10代叫实时 11代叫预约 12代叫接机 13代叫送机 14代叫接站 15代叫送站 private String orderEnterance;//发单入口0实时 1预约 2接机 3送机 4接站 5送站 8代驾 10代叫实时 11代叫预约 12代叫接机 13代叫送机 14代叫接站 15代叫送站
private String flightNo;//航班号 private String flightNo;//航班号
private Date flightDate;//接送机-航班出发日期接机必填 private String flightDate;//接送机-航班出发日期接机必填
private Date actualDepartTime;//接机场景行程的真实出发时间航班延误提前到达情况下更新 private String actualDepartTime;//接机场景行程的真实出发时间航班延误提前到达情况下更新
private String depAirCode;//出发机场三字码 private String depAirCode;//出发机场三字码
private String arrAirCode;//到达机场三字码 private String arrAirCode;//到达机场三字码
private Integer pickUpDelayTime;//航班到达后延迟N毫秒后用车 private String pickUpDelayTime;//航班到达后延迟N毫秒后用车
private String remark;//1.企业获取token时传递的备注信息remark数据2.使用制度用车时内容是员工填写的用车备注3.如果为多备注制度默认返回为JSON结构 如果不需要JSON结构可以在ES后台企业功能配置设置为精简模式 private String remark;//1.企业获取token时传递的备注信息remark数据2.使用制度用车时内容是员工填写的用车备注3.如果为多备注制度默认返回为JSON结构 如果不需要JSON结构可以在ES后台企业功能配置设置为精简模式
private List<RiskTag> riskTags;//风险标记数据 private Object riskTags;//风险标记数据
private List<RefundItem> refundItems;//所有退款数据 private Object refundItems;//所有退款数据
private Integer totalEnterpriseRefundAmount;//企业退款总金额 private Integer totalEnterpriseRefundAmount;//企业退款总金额
private Integer totalPersonRefundAmount;//个人退款总金额 private Integer totalPersonRefundAmount;//个人退款总金额
private Integer enterpriseAmount;//企业支付金额 private Integer enterpriseAmount;//企业支付金额
@ -70,7 +67,7 @@ public class OrderDetailResponse extends BaseResponse {
private String passengerPhone;//代叫单 乘车人手机号 private String passengerPhone;//代叫单 乘车人手机号
private String passengerName;//代叫单 乘车人姓名 private String passengerName;//代叫单 乘车人姓名
private String privateTag;//1 因私订单 0非因私订单 private String privateTag;//1 因私订单 0非因私订单
private ApplyRecord applyRecord;//申请单详情 private String applyRecord;//申请单详情
private String extInfo;//员工扩展属性 JSON长度:1000字符,该信息为创建员工时提交的extInfo值 private String extInfo;//员工扩展属性 JSON长度:1000字符,该信息为创建员工时提交的extInfo值
private String tokenExtInfo;//该信息为提交token时userInfo里的extInfo值 private String tokenExtInfo;//该信息为提交token时userInfo里的extInfo值
private String showPayChannel;//支付方式个人支付(3)企业支付(1)混合支付(2) private String showPayChannel;//支付方式个人支付(3)企业支付(1)混合支付(2)
@ -95,6 +92,13 @@ public class OrderDetailResponse extends BaseResponse {
private Integer personalPayStatus;//审批驳回后的个付状态(1-待支付2-支付成功3-超期未支付) private Integer personalPayStatus;//审批驳回后的个付状态(1-待支付2-支付成功3-超期未支付)
private String reasonForPersonPay;//需要个人支付的原因 private String reasonForPersonPay;//需要个人支付的原因
private String financeCostcenterCode;//成本中心编码 private String financeCostcenterCode;//成本中心编码
public String getRequestRouterNo() {
Gson gson = new Gson();
String record = this.getApplyRecord();
ApplyRecord applyRecord1 = gson.fromJson(record, ApplyRecord.class);
return applyRecord1.getOutApplyRecordId();
}
} }
@lombok.Data @lombok.Data
@ -129,4 +133,6 @@ public class OrderDetailResponse extends BaseResponse {
private String title;//名称 private String title;//名称
private String value;//费用 private String value;//费用
} }
} }

View File

@ -0,0 +1,196 @@
package com.chint.interfaces.rest.amap.dto.note;
import lombok.Data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
public class AmapNoteParam {
private Integer eid; // 企业ID
private String sign; // 签名
private String timestamp; // 请求发生时的时间戳单位ms
private String amapOrderId; // 高德订单号
private String userId; // 企业用户ID
private String mobile; // 企业用户手机号
private String departmentId; // 企业用户部门ID
private String departmentName; // 企业用户部门名称
private String requestTime; // 约车时间2018-12-12 20:00:00
private String departTime; // 出行时间2018-12-12 20:00:00
private String getOnTime; // 实际的上车时间司机开始行程时间
private String getOffTime; // 实际的下车时间司机结束行程时间
private String startName; // 起点名称
private String startAdcode; // 起点城市编码(地级市)
private String startLng; // 起点经度39.984948
private String startLat; // 起点纬度116.467588
private String startCity; // 起点城市
private String endName; // 终点名称
private String endAdcode; // 终点城市编码(地级市)
private String endLng; // 终点经度40.040786
private String endLat; // 终点纬度116.475628
private String endCity; // 终点城市
private String driverPhone; // 司机电话
private String driverName; // 司机姓名
private String licensePlate; // 车牌号
private String rideType; // 运力类型( 1经济2品质专车3六座商务4豪华5出租车6优享11优惠推荐13企业同行14企业拼车)
private String rideTypeName; // 运力显示文案
private String cpName; // CP名称例如滴滴首汽约车等
private String estimatePrice; // 预估价
private String estimateMileage; // 预估里程
private String estimateTime; // 预估时间
private String duration; // 总时长
private String mileage; // 总里程
private String totalFee; // 总费用
private String originalFeeDetail; // 费用明细取消费起步费里程费时长费停车费过桥费附加费加价红包信息费其他费用预约服务费高速服务费企业服务费等等
private String feeDetail; // 费用明细时长费,里程费,附加费,附加费用明细,其他费用,其他费用明细
private Integer showStatus; // 0-派单中(下单平台改派追加运力)1-完成待支付2-取消待支付3-关闭无司机应答司机取消乘客取消服务商取消平台关单4-订单完成(支付完成)5-待出发司机接单6-待上车司机到达起点7-行程中开始计费
private String enterpriseCpStatus; // 详见订单子状态映射表
private Integer orderServiceType; // 业务类型 1-实时单2-预约单3-接机 4-送机6-市内拼车8-代驾
private String statusUpdateTime; // 订单状态更新时间2018-12-12 20:00:00
private String remark; // 企业获取token时传递的备注信息 使用制度用车时内容是员工填写的用车备注 如果为多备注制度默认返回为JSON结构 如果不需要JSON结构可以在ES后台企业功能配置设置为精简模式
private String carType; // 司机车型
private String carColor; // 车辆颜色
private List<RiskTagStr> riskTags; // 所有风险标记数据
private List<RefundItemStr> refundItems; // 所有退款数据
private Integer totalEnterpriseRefundAmount; // 企业退款总金额()
private Integer totalPersonRefundAmount; // 个人退款总金额()
private Integer enterpriseAmount; // 企业支付金额()
private String enterpriseCarPool; // 是否企业拼车 0 - 1 -
private Integer personAmount; // 个人支付金额()
private Short subGdServiceId; // 服务子类型, 默认null, null或0为普通单, 1代叫单
private String privacyNumber; // 叫车人 隐私号叫车人与司机绑定的隐私号
private String passengerPrivacyNumber; // 代叫单 乘车人隐私号乘车人与司机绑定的隐私号
private String passengerPhone; // 代叫单 乘车人手机号
private String passengerName; // 代叫单 乘车人姓名
private String privateTag; // 1 因私订单 0非因私订单
private String applyRecord; // 申请单详情
private String showPayChannel; // 个人支付(3)企业支付(1)混合支付(2)
private String sceneType; // 因公出行场景(只有使用了ES制度的才有) 0-个人用车1-加班2-定点通勤3-外勤用车4-出差5-接送机
private String extInfo; // 员工扩展属性 JSON长度:1000字符
private String attachInfo; // 员工扩展信息由附加信息接口传入
private String startBillLocationName; // 实际上车地点
private String startBillTime; // 实际上车时间
private String endBillLocationName; // 实际下车地点
private String endBillTime; // 实际下车时间
private String realStartLat; // 实际上车纬度
private String realStartLng; // 实际上车经度
private String realEndLat; // 实际下车纬度
private String realEndLng; // 实际下车经度
private String driverAcceptTime; // 司机接单时间
private String payTime; // 订单支付时间
private String initOrderServiceType; // 传入的orderServiceType
private String regulationContent; // 下单时刻的制度内容
private String regulationId; // 打车时使用的制度id
private String regulationName; // 打车时使用的制度名称
private String sensitiveOrderReason; // 敏感订单员工确认原因的原因选项和填写的备注
private String flightNo; // 航班号 (接送机返回)
private Date flightDate; // 接送机-航班出发日期 (接送机返回)
private Date actualDepartTime; // 接机场景行程的真实出发时间航班延误提前到达情况下更新 (接送机返回)
private String depAirCode; // 出发机场三字码 (接送机返回)
private String arrAirCode; // 到达机场三字码 (接送机返回)
private Integer pickUpDelayTime; // 航班到达后延迟N毫秒后用车 (接送机返回)
private Integer personalPayStatus; // 个付状态(1-待支付2-支付成功3-超期未支付)
private String reasonForPersonPay; // 需要个人支付的原因
@Data
public static class RiskTagStr {
private String riskTagJson;
}
@Data
public static class RiskTag {
private Integer riskCode;
private String riskDesp;
}
@Data
public static class RefundItemStr {
private String refundItemJson;
}
@Data
public static class RefundItem {
private Integer enterpriseRefundAmount;
private Integer personRefundAmount;
private String refundTime;
}
@Data
public static class ApplyRecord {
private String outApplyRecordId;
private String enterpriseCustomFields;
}
@Data
public static class Regulation {
private String regulationName;
}
public static AmapNoteParam convert(Map<String, String> params) {
AmapNoteParam param = new AmapNoteParam();
param.setEid(getInteger(params, "eid"));
param.setSign(params.get("sign"));
param.setTimestamp(params.get("timestamp"));
param.setAmapOrderId(params.get("amapOrderId"));
param.setUserId(params.get("userId"));
param.setMobile(params.get("mobile"));
param.setDepartmentId(params.get("departmentId"));
param.setDepartmentName(params.get("departmentName"));
param.setRequestTime(params.get("requestTime"));
param.setDepartTime(params.get("departTime"));
param.setGetOnTime(params.get("getOnTime"));
param.setGetOffTime(params.get("getOffTime"));
param.setStartName(params.get("startName"));
param.setStartAdcode(params.get("startAdcode"));
param.setStartLng(params.get("startLng"));
param.setStartLat(params.get("startLat"));
param.setStartCity(params.get("startCity"));
param.setEndName(params.get("endName"));
param.setEndAdcode(params.get("endAdcode"));
param.setEndLng(params.get("endLng"));
param.setEndLat(params.get("endLat"));
param.setEndCity(params.get("endCity"));
param.setDriverPhone(params.get("driverPhone"));
param.setDriverName(params.get("driverName"));
param.setLicensePlate(params.get("licensePlate"));
param.setRideType(params.get("rideType"));
param.setRideTypeName(params.get("rideTypeName"));
param.setCpName(params.get("cpName"));
param.setEstimatePrice(params.get("estimatePrice"));
param.setEstimateMileage(params.get("estimateMileage"));
param.setEstimateTime(params.get("estimateTime"));
param.setDuration(params.get("duration"));
param.setMileage(params.get("mileage"));
param.setTotalFee(params.get("totalFee"));
param.setOriginalFeeDetail(params.get("originalFeeDetail"));
param.setFeeDetail(params.get("feeDetail"));
param.setShowStatus(getInteger(params, "showStatus"));
param.setEnterpriseCpStatus(params.get("enterpriseCpStatus"));
param.setOrderServiceType(getInteger(params, "orderServiceType"));
param.setStatusUpdateTime(params.get("statusUpdateTime"));
param.setRemark(params.get("remark"));
param.setCarType(params.get("carType"));
param.setCarColor(params.get("carColor"));
// 处理日期和列表等复杂类型
return param;
}
private static Integer getInteger(Map<String, String> params, String key) {
if (params.containsKey(key) && params.get(key) != null && !params.get(key).isEmpty()) {
return Integer.parseInt(params.get(key));
}
return null;
}
private static Date parseDate(String dateString) throws ParseException {
if (dateString != null && !dateString.isEmpty()) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(dateString);
}
return null;
}
}

View File

@ -0,0 +1,29 @@
package com.chint.interfaces.rest.amap.dto.note;
import lombok.Data;
@Data
public class AmapNoteResponse {
private boolean result;
private String message;
private String timestamp;
private int code;
public static AmapNoteResponse success(String message) {
AmapNoteResponse amapNoteResponse = new AmapNoteResponse();
amapNoteResponse.setResult(true);
amapNoteResponse.setMessage(message);
amapNoteResponse.setCode(1);
amapNoteResponse.setTimestamp(String.valueOf(System.currentTimeMillis()));
return amapNoteResponse;
}
public static AmapNoteResponse error(String message) {
AmapNoteResponse amapNoteResponse = new AmapNoteResponse();
amapNoteResponse.setResult(false);
amapNoteResponse.setMessage(message);
amapNoteResponse.setCode(0);
amapNoteResponse.setTimestamp(String.valueOf(System.currentTimeMillis()));
return amapNoteResponse;
}
}

View File

@ -53,9 +53,9 @@ public class TravelApplicationDto extends BaseRequestParam {
//企业自定义字段企业自行定义数据结构进行解析长度限制1024 //企业自定义字段企业自行定义数据结构进行解析长度限制1024
private String enterpriseCustomFields; private String enterpriseCustomFields;
//申请单总限额()不传表示不限 //申请单总限额()不传表示不限
private String totalQuotaAmount; // private String totalQuotaAmount;
//是否占用个人月度限额 0 1 默认为0 //是否占用个人月度限额 0 1 默认为0
private String usePersonalAmount; // private String usePersonalAmount;
/** /**
* 支持的叫车业务类型 * 支持的叫车业务类型
*(1 实时单2 预约单3 接送机5 接送站6 代叫车 *(1 实时单2 预约单3 接送机5 接送站6 代叫车

View File

@ -0,0 +1,91 @@
package com.chint.interfaces.rest.amap.in;
import com.chint.application.commands.OrderStatusChangeCommand;
import com.chint.domain.aggregates.order.OrderDetail;
import com.chint.domain.service.supplier.SupplierService;
import com.chint.domain.value_object.SupplierCallbackData;
import com.chint.infrastructure.echo_framework.command.Command;
import com.chint.interfaces.rest.amap.dto.detail.AmapOrderDetailResponse;
import com.chint.interfaces.rest.amap.dto.note.AmapNoteParam;
import com.chint.interfaces.rest.amap.dto.note.AmapNoteResponse;
import com.chint.interfaces.rest.amap.request.AmapOrderDetailRequest;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriUtils;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import static com.chint.infrastructure.constant.LegConstant.LEG_TYPE_TAXI;
import static com.chint.infrastructure.constant.SupplierNameConstant.SUPPLIER_AMAP;
import static com.chint.interfaces.rest.amap.util.AmapStatusUtil.checkCarStatus;
import static com.chint.interfaces.rest.amap.util.AmapStatusUtil.mapCarStatus;
@Slf4j
@RestController
@RequestMapping("/public/amap")
public class AmapNoteController {
private Gson gson = new Gson();
@Autowired
private AmapOrderDetailRequest amapOrderDetailRequest;
@Autowired
private SupplierService supplierService;
@PostMapping("/status")
public AmapNoteResponse statusEvent(@RequestBody String in) {
// 拆分成键值对
String[] pairs = in.split("&");
Map<String, String> params = new HashMap<>();
// 解码每个参数值并存储在Map中
for (String pair : pairs) {
int idx = pair.indexOf("=");
String key = idx > 0 ? pair.substring(0, idx) : pair;
String value = idx > 0 && pair.length() > idx + 1 ? pair.substring(idx + 1) : null;
// 解码参数值
if (value != null) {
value = UriUtils.decode(value, StandardCharsets.UTF_8);
}
params.put(key, value);
}
AmapNoteParam amapNoteParam = AmapNoteParam.convert(params);
String json = gson.toJson(amapNoteParam);
log.info(json);
AmapOrderDetailResponse response = amapOrderDetailRequest.queryOrderDetail(amapNoteParam.getAmapOrderId());
AmapOrderDetailResponse.Data data = response.getData();
if (checkCarStatus(data.getShowStatus())) {
Integer eventType = mapCarStatus(data.getShowStatus());
SupplierCallbackData supplierCallbackData = SupplierCallbackData.of(SUPPLIER_AMAP)
.data(response)
.productType(LEG_TYPE_TAXI)
.outOrderStatus(String.valueOf(data.getShowStatus()))
.selfOrderStatus(eventType);
OrderDetail orderDetail = supplierService.handleSupplierCallback(supplierCallbackData);
Command.of(OrderStatusChangeCommand.class)
.orderDetail(orderDetail)
.orderNo(data.getAmapOrderId())
.outStatus(String.valueOf(data.getShowStatus()))
.eventType(eventType)
.sendToQueue();
return AmapNoteResponse.success("接收成功");
} else {
return AmapNoteResponse.success("未产生实际费用,不保存订单明细");
}
}
}

View File

@ -1,6 +1,6 @@
package com.chint.interfaces.rest.amap.request; package com.chint.interfaces.rest.amap.request;
import com.chint.interfaces.rest.amap.dto.detail.OrderDetailResponse; import com.chint.interfaces.rest.amap.dto.detail.AmapOrderDetailResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -11,7 +11,7 @@ import java.util.Map;
import static com.chint.infrastructure.constant.AmapConstant.ORDER_DETAIL_URL; import static com.chint.infrastructure.constant.AmapConstant.ORDER_DETAIL_URL;
@Component @Component
public class OrderDetailRequest { public class AmapOrderDetailRequest {
@Value("${amap.baseUrl}") @Value("${amap.baseUrl}")
private String baseUrl; private String baseUrl;
@ -23,9 +23,9 @@ public class OrderDetailRequest {
* @param amapOrderId 高德订单号 * @param amapOrderId 高德订单号
* @return * @return
*/ */
public OrderDetailResponse queryOrderDetail(String amapOrderId) { public AmapOrderDetailResponse queryOrderDetail(String amapOrderId) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("amapOrderId", amapOrderId); map.put("amapOrderId", amapOrderId);
return amapRequest.get(baseUrl + ORDER_DETAIL_URL, map, OrderDetailResponse.class); return amapRequest.get(baseUrl + ORDER_DETAIL_URL, map, AmapOrderDetailResponse.class);
} }
} }

View File

@ -0,0 +1,62 @@
package com.chint.interfaces.rest.amap.util;
import static com.chint.infrastructure.constant.FSSCConstant.FSSC_CAR_STATUS_REFUND;
import static com.chint.infrastructure.constant.FSSCConstant.FSSC_CAR_STATUS_SUCCESS;
import static com.chint.infrastructure.constant.OrderConstant.*;
public class AmapStatusUtil {
public static boolean checkCarStatus(Integer showStatus) {
return showStatus != null &&
showStatus != 0 && //派单中(下单平台改派追加运力)
showStatus != 1 && //完成待支付
showStatus != 2 && //取消待支付
showStatus != 3 && //关闭无司机应答司机取消乘客取消服务商取消平台关单
showStatus != 5 && //待出发司机接单)
showStatus != 6 && //待上车司机到达起点
showStatus != 7; //行程中开始计费
}
public static Integer mapCarStatus(Integer showStatus) {
return switch (showStatus) {
case 0 -> ORDER_EVENT_ORDERED; //派单中(下单平台改派追加运力)
case 1 ->
//完成待支付
ORDER_EVENT_ORDERED;
case 2 ->
//取消待支付
ORDER_EVENT_ORDERED;
case 3 ->
//关闭无司机应答司机取消乘客取消服务商取消平台关单
ORDER_EVENT_REFUND;
case 4 ->
// 成功
ORDER_EVENT_ORDERED;
case 5 ->
//待出发司机接单)
ORDER_EVENT_ORDERED;
case 6 ->
//待上车司机到达起点
ORDER_EVENT_ORDERED;
case 7 ->
//行程中开始计费
ORDER_EVENT_ORDERED;
default ->
// 处理未知或未映射的状态
-99;
};
}
public static String mapFSSCOrderStatus(Integer showStatus) {
Integer eventType = mapCarStatus(showStatus);
return switch (eventType) {
case ORDER_EVENT_ORDERED -> FSSC_CAR_STATUS_SUCCESS; //派单中(下单平台改派追加运力)
case ORDER_EVENT_PAYED -> FSSC_CAR_STATUS_SUCCESS; //派单中(下单平台改派追加运力)
case ORDER_EVENT_FINISH -> FSSC_CAR_STATUS_SUCCESS;
case ORDER_EVENT_REFUND -> FSSC_CAR_STATUS_REFUND;
default ->
// 处理未知或未映射的状态
"99";
};
}
}

View File

@ -9,17 +9,16 @@ import com.chint.interfaces.rest.amap.AmapLoginRequest;
import com.chint.interfaces.rest.amap.AmapUserRequest; import com.chint.interfaces.rest.amap.AmapUserRequest;
import com.chint.interfaces.rest.amap.BaseResponse; import com.chint.interfaces.rest.amap.BaseResponse;
import com.chint.interfaces.rest.amap.dto.UserQueryResponse; import com.chint.interfaces.rest.amap.dto.UserQueryResponse;
import com.chint.interfaces.rest.amap.dto.detail.OrderDetailResponse; import com.chint.interfaces.rest.amap.dto.detail.AmapOrderDetailResponse;
import com.chint.interfaces.rest.amap.dto.location.LocationResponse; import com.chint.interfaces.rest.amap.dto.location.LocationResponse;
import com.chint.interfaces.rest.amap.dto.settlement.FinishedOrderResponse; import com.chint.interfaces.rest.amap.dto.settlement.FinishedOrderResponse;
import com.chint.interfaces.rest.amap.dto.token.TokenResponse; import com.chint.interfaces.rest.amap.dto.token.TokenResponse;
import com.chint.interfaces.rest.amap.request.OrderDetailRequest; import com.chint.interfaces.rest.amap.request.AmapOrderDetailRequest;
import com.chint.interfaces.rest.amap.request.SettleBillRequest; import com.chint.interfaces.rest.amap.request.SettleBillRequest;
import com.chint.interfaces.rest.amap.request.TakeCarRequest; import com.chint.interfaces.rest.amap.request.TakeCarRequest;
import com.chint.interfaces.rest.amap.request.TokenRequest; import com.chint.interfaces.rest.amap.request.TokenRequest;
import com.chint.interfaces.rest.base.dto.H5LoginResponse; import com.chint.interfaces.rest.base.dto.H5LoginResponse;
import com.chint.interfaces.rest.ctrip.CTripOrderSearchRequest; import com.chint.interfaces.rest.ctrip.CTripOrderSearchRequest;
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderResponse;
import com.google.gson.Gson; import com.google.gson.Gson;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -42,7 +41,7 @@ public class AmapTest {
private AmapLocationRequest amapLocationRequest; private AmapLocationRequest amapLocationRequest;
@Autowired @Autowired
private OrderDetailRequest orderDetailRequest; private AmapOrderDetailRequest orderDetailRequest;
private Gson gson = new Gson(); private Gson gson = new Gson();
@ -56,7 +55,7 @@ public class AmapTest {
@Test @Test
public void search() { public void search() {
Gson gson = new Gson(); Gson gson = new Gson();
OrderDetailResponse orderDetailResponse = orderDetailRequest.queryOrderDetail("40920084001340019626730137"); AmapOrderDetailResponse orderDetailResponse = orderDetailRequest.queryOrderDetail("40920084001340019626730137");
System.out.println(gson.toJson(orderDetailResponse)); System.out.println(gson.toJson(orderDetailResponse));
} }
@ -75,7 +74,7 @@ public class AmapTest {
BaseContext.setCurrentUser(user); BaseContext.setCurrentUser(user);
SupplierCallbackData supplierCallbackData = SupplierCallbackData supplierCallbackData =
SupplierCallbackData.of(SUPPLIER_AMAP); SupplierCallbackData.of(SUPPLIER_AMAP);
OrderDetailResponse response = orderDetailRequest.queryOrderDetail("40920084001340019626730137"); AmapOrderDetailResponse response = orderDetailRequest.queryOrderDetail("40920084001340019626730137");
supplierCallbackData.data(response); supplierCallbackData.data(response);
supplierCallbackData.setSelfOrderStatus(1); supplierCallbackData.setSelfOrderStatus(1);
supplierService.handleSupplierCallback(supplierCallbackData); supplierService.handleSupplierCallback(supplierCallbackData);
@ -86,7 +85,7 @@ public class AmapTest {
*/ */
@Test @Test
public void queryorderDetail() { public void queryorderDetail() {
OrderDetailResponse orderDetailResponse = orderDetailRequest.queryOrderDetail("40920084001340019626730137"); AmapOrderDetailResponse orderDetailResponse = orderDetailRequest.queryOrderDetail("40920084001340019626730137");
System.out.println("orderDetailResponse = " + orderDetailResponse); System.out.println("orderDetailResponse = " + orderDetailResponse);
} }