初始化代码

This commit is contained in:
Superdandan 2024-02-16 23:03:21 +08:00
parent aea8ca7f0c
commit fb5c0d1e60
125 changed files with 2935 additions and 453 deletions

View File

@ -1,17 +1,15 @@
package com.chint.application.commands;
import com.chint.domain.value_object.ApproveLegData;
import com.chint.domain.value_object.FinishLegData;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_APPROVAL;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_FINISH;
@Data
public class LegFinishedCommand extends Command {
private Integer LegEventType = LEG_EVENT_FINISH;
private Long LegId;
private final Integer legEventType = LEG_EVENT_FINISH;
private Long legId;
private FinishLegData data;
public LegFinishedCommand legId(Long LegId) {

View File

@ -1,27 +1,24 @@
package com.chint.application.commands;
import com.chint.domain.value_object.ApproveLegData;
import com.chint.domain.value_object.FinishLegData;
import com.chint.domain.value_object.OrderLegData;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_APPROVAL;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_ORDERED;
@Data
public class LegOrderedCommand extends Command {
private Integer LegEventType = LEG_EVENT_ORDERED;
private Long LegId;
private OrderLegData data;
private Long orderDetailId;
public LegOrderedCommand legId(Long LegId) {
this.setLegId(LegId);
return this;
}
public LegOrderedCommand data(OrderLegData data) {
this.data = data;
public LegOrderedCommand orderDetailId(Long orderDetailId) {
this.setOrderDetailId(orderDetailId);
return this;
}
}

View File

@ -1,9 +1,25 @@
package com.chint.application.commands;
import com.chint.domain.value_object.ApproveLegData;
import com.chint.domain.value_object.RejectLegData;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_NOT_ORDERED;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_REJECT;
@Data
public class LegRejectCommand extends Command {
private Integer LegEventType = LEG_EVENT_NOT_ORDERED;
private final Integer legEventType = LEG_EVENT_REJECT;
private Long routeId;
private RejectLegData data;
public LegRejectCommand routeId(Long routeId) {
this.setRouteId(routeId);
return this;
}
public LegRejectCommand data(RejectLegData data) {
this.data = data;
return this;
}
}

View File

@ -0,0 +1,17 @@
package com.chint.application.commands;
import com.chint.domain.value_object.OrderLegData;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_ORDERED;
@Data
public class RouteAddOrderCommand extends Command {
private Integer LegEventType = LEG_EVENT_ORDERED;
private OrderLegData data;
public RouteAddOrderCommand data(OrderLegData data) {
this.data = data;
return this;
}
}

View File

@ -51,4 +51,20 @@ public class OrderController {
return Result.Success(SUCCESS);
}
@Transactional
@ApiOperation("修改规划节点关联的订单")
@PostMapping("/leg/update")
public Result<String> updateLegOrder(@RequestBody UpdateLegData updateLegData) {
orderApplicationService.orderedToLeg(updateLegData);
return Result.Success(SUCCESS);
}
@Transactional
@ApiOperation("审批拒绝行程规划单")
@PostMapping("/reject")
public Result<String> rejectOrder(@RequestBody RejectLegData rejectLegData) {
orderApplicationService.reject(rejectLegData);
return Result.Success(SUCCESS);
}
}

View File

@ -4,6 +4,7 @@ package com.chint.application.out;
import com.chint.application.services.SupplierLoginService;
import com.chint.infrastructure.util.Result;
import com.chint.interfaces.rest.ctrip.dto.login.H5Response;
import com.chint.interfaces.rest.ctrip.dto.login.PCResponse;
import com.chint.interfaces.rest.ly.dto.login.LYRedirectUrlResponse;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -20,7 +21,7 @@ public class SupplierLoginController {
@Autowired
private SupplierLoginService supplierLoginService;
@ApiOperation("单点登录同程")
@ApiOperation("单点登录同程-移动")
@PostMapping("/ly/login")
public Result<LYRedirectUrlResponse> lyLogin() {
//登录
@ -28,10 +29,24 @@ public class SupplierLoginController {
return Result.Success(SUCCESS, data);
}
@ApiOperation("单点登录携程")
@ApiOperation("单点登录同程-PC")
@PostMapping("/ly/login/pc")
public Result<LYRedirectUrlResponse> lyLoginPC() {
//登录
LYRedirectUrlResponse data = supplierLoginService.lyLoginPC();
return Result.Success(SUCCESS, data);
}
@ApiOperation("单点登录携程-移动")
@PostMapping("/CTrip/login")
public Result<H5Response> cTripLogin() {
return Result.Success(SUCCESS, supplierLoginService.cTripLogin());
}
@ApiOperation("单点登录携程-PC")
@PostMapping("/CTrip/login/pc")
public Result<PCResponse> cTripLoginPC() {
return Result.Success(SUCCESS, supplierLoginService.cTripLoginPC());
}
}

View File

@ -1,9 +1,9 @@
package com.chint.application.services;
import com.chint.application.commands.*;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.exceptions.NotFoundException;
import com.chint.domain.exceptions.OrderException;
import com.chint.domain.factoriy.leg.LegFactory;
import com.chint.domain.factoriy.order.OrderFactory;
import com.chint.domain.repository.RouteRepository;
@ -16,7 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
import static com.chint.infrastructure.constant.Constant.NOT_FOUND;
import static com.chint.infrastructure.constant.Constant.*;
@Service
public class OrderApplicationService {
@ -37,18 +37,18 @@ public class OrderApplicationService {
public RouteOrder saveOrder(OrderSaveData orderSaveData) {
RouteOrder order;
if (orderSaveData.getRouteId() != null) {
order = Optional.ofNullable(routeRepository.queryById(orderSaveData.getRouteId()))
.orElseThrow(() -> new NotFoundException(NOT_FOUND));
order = Optional.ofNullable(routeRepository.queryById(orderSaveData.getRouteId())).orElseThrow(() -> new NotFoundException(NOT_FOUND));
order.reloadStatus(orderSaveData, legFactory);
if (!order.getOrderStatus().equals(ORDER_STATUS_PREPARE)) {
throw new OrderException(DATA_INVALID);
}
} else {
// order = orderFactory.createOrder(orderSaveData);
throw new NotFoundException(NOT_FOUND);
}
RouteOrder routeOrder = orderDomainService.saveOrder(order);
//这里保存订单之后需要为每个新添加的leg执行规划中事件
routeOrder.getLegItems().forEach(leg ->
Command.of(LegPrepareCommand.class).legId(leg.getLegId()).sendToQueue()
);
routeOrder.getLegItems().forEach(leg -> Command.of(LegPrepareCommand.class).legId(leg.getLegId()).sendToQueue());
return routeOrder;
}
@ -63,8 +63,16 @@ public class OrderApplicationService {
}
@Transactional
public void ordered(Long legId, OrderLegData data){
Command.of(LegOrderedCommand.class).legId(legId).data(data).sendToQueue();
public void ordered(OrderLegData data) {
Command.of(RouteAddOrderCommand.class).data(data).sendToQueue();
}
@Transactional
public void orderedToLeg(UpdateLegData updateLegData) {
Command.of(LegOrderedCommand.class)
.legId(updateLegData.getLegId())
.orderDetailId(updateLegData.getOrderDetailId())
.sendToQueue();
}
@Transactional
@ -76,4 +84,9 @@ public class OrderApplicationService {
public void finished(Long legId, FinishLegData data) {
Command.of(LegFinishedCommand.class).legId(legId).data(data).sendToQueue();
}
@Transactional
public void reject(RejectLegData data) {
Command.of(LegRejectCommand.class).data(data).sendToQueue();
}
}

View File

@ -2,10 +2,12 @@ package com.chint.application.services;
import com.chint.interfaces.rest.ctrip.CTripLoginRequest;
import com.chint.interfaces.rest.ctrip.dto.login.H5Response;
import com.chint.interfaces.rest.ctrip.dto.login.PCResponse;
import com.chint.interfaces.rest.ly.LYLoginRequest;
import com.chint.interfaces.rest.ly.dto.login.LYRedirectUrlResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.yaml.snakeyaml.extensions.compactnotation.PackageCompactConstructor;
import static com.chint.infrastructure.constant.Constant.L_Y_ENTRANCE_HOME;
@ -15,7 +17,6 @@ public class SupplierLoginService {
@Autowired
private LYLoginRequest lyLoginRequest;
@Autowired
private CTripLoginRequest cTripLoginRequest;
@ -26,7 +27,14 @@ public class SupplierLoginService {
return lyLoginRequest.login(L_Y_ENTRANCE_HOME);
}
public LYRedirectUrlResponse lyLoginPC() {
return lyLoginRequest.loginPC(L_Y_ENTRANCE_HOME);
}
public H5Response cTripLogin() {
return cTripLoginRequest.hSingleLogin();
}
public PCResponse cTripLoginPC() {
return cTripLoginRequest.authLogin();
}
}

View File

@ -52,10 +52,13 @@ public class Leg {
private Integer legStatus;
@Transient
private String legStatusName;
@Transient
private OrderDetail orderDetail; //这个属性不做持久化保存 根据下单事件进行获取
@MappedCollection(idColumn = "leg_id", keyColumn = "leg_key")
private List<LegEvent> eventList;
public Leg(Long legId) {
this.legId = legId;
}
@ -84,8 +87,17 @@ public class Leg {
this.legStatus = latestEvent.getEventType();
// If the latest event is an order event, update the amount
if (latestEvent.getEventType().equals(LEG_EVENT_ORDERED)) {
this.amount = latestEvent.getOrderDetail().getAmount();
if (latestEvent.getEventType() >= LEG_EVENT_ORDERED) {
//获取最新的下单事件
LegEvent latestOrderEvent = this.eventList
.stream()
.filter(legEvent -> legEvent.getEventType().equals(LEG_EVENT_ORDERED))
.max(Comparator.comparingLong(LegEvent::getLegEventId))
.orElse(null);
Optional.ofNullable(latestOrderEvent.getOrderDetail()).ifPresent(detail -> {
this.amount = detail.getPrice();
this.orderDetail = detail;
});
}
}
@ -157,12 +169,12 @@ public class Leg {
return this;
}
// 如果列表不为空确保新事件的类型是按顺序的
// 如果列表不为空确保新事件的类型是按顺序的或者与最后一个事件类型相同
if (!eventList.isEmpty()) {
LegEvent lastEvent = eventList.get(eventList.size() - 1);
int lastEventType = lastEvent.getEventType();
if (newEventType != lastEventType + 1) {
throw new LegEventException("Events must be added in sequence.");
if (newEventType != lastEventType && newEventType != lastEventType + 1) {
throw new LegEventException("New event must be the same as the last event type or the next in sequence.");
}
}

View File

@ -4,7 +4,7 @@ import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Embedded;
import org.springframework.data.relational.core.mapping.MappedCollection;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@ -25,7 +25,7 @@ public class LegEvent {
private LocalDateTime happenTime;
@Embedded.Nullable
@MappedCollection(idColumn = "order_id")
private OrderDetail orderDetail;
public String translateLegEvent(int event) {
@ -40,4 +40,14 @@ public class LegEvent {
default -> "未知事件";
};
}
public LegEvent reloadStatus() {
this.setEventName(translateLegEvent(this.eventType));
return this;
}
public LegEvent orderDetail(OrderDetail orderDetail) {
this.setOrderDetail(orderDetail);
return this;
}
}

View File

@ -1,11 +1,41 @@
package com.chint.domain.aggregates.order;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Data
@Table("order_detail")
public class OrderDetail {
@Id
private Long orderId; // 使用 order_id 作为主键
private String orderNo;
private String supplierName;
private String productName; // 产品名称
private Integer productType; // 商品类型
private Integer quantity; // 数量
private String price; // 价格
private Long destinationId;
private Long originId;
private LocalDateTime startTime;
private LocalDateTime endTime;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// 根据需要添加构造函数gettersetter等
private String amount;
public static OrderDetail of(String orderNo, String supplierName) {
OrderDetail orderDetail = new OrderDetail();
orderDetail.setOrderNo(orderNo);
orderDetail.setSupplierName(supplierName);
orderDetail.setCreateTime(LocalDateTime.now());
orderDetail.setUpdateTime(LocalDateTime.now());
return orderDetail;
}
public OrderDetail productType(Integer productType) {
this.setProductType(productType);
return this;
}
}

View File

@ -54,7 +54,10 @@ public class RouteOrder extends BaseEntity {
private String supplierName;
@MappedCollection(idColumn = "route_id", keyColumn = "route_order_key")
public List<Leg> legItems;
private List<Leg> legItems;
@MappedCollection(idColumn = "route_id", keyColumn = "route_order_key")
private List<OrderDetail> orderDetails;
// public void addItemAtPosition(Leg newItem) {
@ -91,6 +94,11 @@ public class RouteOrder extends BaseEntity {
return this;
}
public RouteOrder addOrderDetail(OrderDetail orderDetail) {
this.orderDetails.add(orderDetail);
return this;
}
public RouteOrder reloadStatus() {
this.getLegItems().forEach(Leg::reloadStatus);
this.estimateAmount = this.getLegItems()
@ -166,6 +174,8 @@ public class RouteOrder extends BaseEntity {
this.orderStatus = 2;
} else if (allItemsInStatus(1)) {
this.orderStatus = 1;
} else if (allItemsInStatus(-1)) {
this.orderStatus = -1;
} else {
this.orderStatus = 0; // 或其他适当的默认状态
}

View File

@ -0,0 +1,7 @@
package com.chint.domain.exceptions;
public class OrderException extends BaseException{
public OrderException(String msg) {
super(msg);
}
}

View File

@ -3,12 +3,15 @@ package com.chint.domain.factoriy.leg_event;
import com.chint.domain.aggregates.order.LegEvent;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class LegEventFactoryImpl implements LegEventFactory{
@Override
public LegEvent creatLegEvent(Integer eventType) {
LegEvent legEvent = new LegEvent();
legEvent.setEventType(eventType);
legEvent.setHappenTime(LocalDateTime.now());
return legEvent;
}
}

View File

@ -0,0 +1,8 @@
package com.chint.domain.factoriy.order_detail;
import com.chint.domain.aggregates.order.OrderDetail;
import com.chint.domain.value_object.OrderLegData;
public interface OrderDetailFactory {
OrderDetail create(OrderLegData orderLegData);
}

View File

@ -0,0 +1,13 @@
package com.chint.domain.factoriy.order_detail;
import com.chint.domain.aggregates.order.OrderDetail;
import com.chint.domain.value_object.OrderLegData;
import org.springframework.stereotype.Component;
@Component
public class OrderDetailFactoryImpl implements OrderDetailFactory {
@Override
public OrderDetail create(OrderLegData orderLegData) {
return OrderDetail.of(orderLegData.getOrderNo(), orderLegData.getSupplierName());
}
}

View File

@ -0,0 +1,7 @@
package com.chint.domain.repository;
import com.chint.domain.aggregates.order.OrderDetail;
public interface OrderDetailRepository {
OrderDetail findById(Long orderDetailId);
}

View File

@ -9,6 +9,8 @@ public interface RouteRepository {
RouteOrder findByFakeOrderNo(String fakeOrderNo);
RouteOrder findByActualOrderNo(String actualOrderNo);
RouteOrder save(RouteOrder routeOrder);
PageResult<RouteOrder> pageQuery(OrderQueryData orderQueryData);

View File

@ -4,7 +4,9 @@ import com.chint.application.commands.*;
import com.chint.domain.aggregates.order.*;
import com.chint.domain.exceptions.CommandException;
import com.chint.domain.factoriy.leg_event.LegEventFactory;
import com.chint.domain.factoriy.order_detail.OrderDetailFactory;
import com.chint.domain.repository.LegRepository;
import com.chint.domain.repository.OrderDetailRepository;
import com.chint.domain.repository.RouteRepository;
import com.chint.domain.service.order_sync.SyncAdapter;
import com.chint.domain.value_object.ApproveLegData;
@ -33,6 +35,12 @@ public class LegEventHandler implements LegEventService{
@Autowired
private LegEventFactory legEventFactory;
@Autowired
private OrderDetailFactory orderDetailFactory;
@Autowired
private OrderDetailRepository orderDetailRepository;
@Transactional
@Override
public void prepareLeg(LegPrepareCommand command) {
@ -43,6 +51,7 @@ public class LegEventHandler implements LegEventService{
legRepository.save(leg);
}
}
@Transactional
@Override
public void approveLeg(LegApprovalCommand command) {
@ -65,6 +74,7 @@ public class LegEventHandler implements LegEventService{
throw new CommandException("订单未初始化");
}
}
@Transactional
@Override
public void syncLeg(LegSyncCommand command) {
@ -86,19 +96,49 @@ public class LegEventHandler implements LegEventService{
throw new CommandException("订单未提交审批");
}
}
@Transactional
@Override
public void routeAddOrder(RouteAddOrderCommand command) {
OrderLegData data = command.getData();
//首先查询到 行程规划订单 为形成规划订单添加 外部订单信息
OrderDetail orderDetail = orderDetailFactory.create(data).productType(data.getProductType());
String actualOrderNo = data.getActualOrderNo();
RouteOrder routeOrder = routeRepository.findByActualOrderNo(actualOrderNo);
routeOrder.addOrderDetail(orderDetail);
//结合外部订单信息筛选最合适的leg节点 触发下单事件
routeOrder.getLegItems()
.stream()
.filter(leg -> leg.getLegType().equals(orderDetail.getProductType())
&& leg.getDestinationId().equals(orderDetail.getDestinationId())
&& leg.getOriginId().equals(orderDetail.getOriginId())
&& leg.getStartTime().isBefore(orderDetail.getStartTime())
&& leg.getEndTime().isAfter(orderDetail.getEndTime()))
.findFirst()
.ifPresent(leg -> {
LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
legEvent.setOrderDetail(orderDetail);
leg.addEvent(legEvent);
});
routeRepository.save(routeOrder);
}
@Transactional
@Override
public void orderLeg(LegOrderedCommand command) {
OrderLegData data = command.getData();
//如果筛选事件可能会是错误需要用户手动添加并修改事件 因此会进行额外出发修改下单事件
Leg leg = legRepository.findByLegId(Leg.of(command.getLegId()));
LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
OrderDetail orderDetail = new OrderDetail();
orderDetail.setAmount(data.getOrderNo());
orderDetail.setAmount(data.getAmount());
legEvent.setOrderDetail(orderDetail);
//因为orderDetail已经进行持久化保存 只需要从数据库进行查询
OrderDetail orderDetail = orderDetailRepository.findById(command.getOrderDetailId());
LegEvent legEvent = legEventFactory
.creatLegEvent(command.getLegEventType())
.orderDetail(orderDetail);
leg.addEvent(legEvent);
legRepository.save(leg);
}
@Transactional
@Override
public void payForLeg(LegPayedCommand command) {
@ -106,12 +146,11 @@ public class LegEventHandler implements LegEventService{
Leg leg = legRepository.findByLegId(Leg.of(command.getLegId()));
LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
OrderDetail orderDetail = new OrderDetail();
orderDetail.setAmount(data.getOrderNo());
orderDetail.setAmount(data.getAmount());
legEvent.setOrderDetail(orderDetail);
leg.addEvent(legEvent);
legRepository.save(leg);
}
@Transactional
@Override
public void finishLeg(LegFinishedCommand command) {
@ -120,9 +159,13 @@ public class LegEventHandler implements LegEventService{
leg.addEvent(legEvent);
legRepository.save(leg);
}
@Transactional
@Override
public void rejectLeg(LegRejectCommand command) {
RouteOrder routeOrder = routeRepository.findByActualOrderNo(command.getData().getActualOrderNo());
LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
routeOrder.getLegItems().forEach(leg -> leg.addEvent(legEvent));
routeRepository.save(routeOrder);
}
}

View File

@ -2,19 +2,25 @@ package com.chint.domain.service.leg_event;
import com.chint.application.commands.*;
import com.chint.domain.value_object.*;
import com.chint.infrastructure.echo_framework.command.Command;
public interface LegEventService {
void prepareLeg(LegPrepareCommand command);
//审批事件要从bpm或其他平台接收到一个真实订单
void approveLeg(LegApprovalCommand command);
void syncLeg(LegSyncCommand command);
//下单事件
void orderLeg(LegOrderedCommand command);
void routeAddOrder(RouteAddOrderCommand command);
//付款
void payForLeg(LegPayedCommand command);
//结束
void finishLeg(LegFinishedCommand command);
void rejectLeg(LegRejectCommand command);
}

View File

@ -57,6 +57,12 @@ public class LegEventServiceImpl implements LegEventService {
legEventHandler.orderLeg(command);
}
@ListenTo(command = "RouteAddOrderCommand", order = 0)
@Override
public void routeAddOrder(RouteAddOrderCommand command) {
legEventHandler.routeAddOrder(command);
}
@Override
@ListenTo(command = "LegPayedCommand", order = 0)
public void payForLeg(LegPayedCommand command) {
@ -73,9 +79,6 @@ public class LegEventServiceImpl implements LegEventService {
@Override
@ListenTo(command = "LegRejectCommand", order = 0)
public void rejectLeg(LegRejectCommand command) {
// Leg leg = legRepository.findByLegId(Leg.of(command.getLegId()));
// LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
// leg.addEvent(legEvent);
// legRepository.save(leg);
legEventHandler.rejectLeg(command);
}
}

View File

@ -1,6 +1,7 @@
package com.chint.domain.service.order_sync;
import com.chint.domain.aggregates.order.ApproveOrderNo;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.CityRepository;
@ -9,16 +10,22 @@ import com.chint.domain.service.OrderDomainService;
import com.chint.infrastructure.util.BaseContext;
import com.chint.interfaces.rest.ctrip.CTripApprovalRequest;
import com.chint.interfaces.rest.ctrip.dto.approval.ApprovalRequest;
import com.chint.interfaces.rest.ctrip.dto.approval.ApprovalResult;
import com.chint.interfaces.rest.ctrip.dto.approval.PassengerDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.air.FlightEndorsementDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.hotel.HotelEndorsementDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.quick.CarQuickEndorsementDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.quick.RankInfo;
import com.chint.interfaces.rest.ctrip.dto.approval.train.TrainEndorsementDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.chint.infrastructure.constant.Constant.LEG_TYPE_HOTEL;
import static com.chint.infrastructure.constant.Constant.*;
@Component
public class CTripOrderSyncAdapter implements SupplierOrderSync {
@ -29,10 +36,6 @@ public class CTripOrderSyncAdapter implements SupplierOrderSync {
@Autowired
private CTripApprovalRequest approvalRequest;
@Autowired
private LocationRepository locationRepository;
@Autowired
private OrderDomainService orderDomainService;
@ -42,27 +45,85 @@ public class CTripOrderSyncAdapter implements SupplierOrderSync {
User currentUser = BaseContext.getCurrentUser();
ApproveOrderNo approveOrderNo = order.getApproveOrderNo();
RankInfo rankInfo = RankInfo.of(currentUser.getRankCode());
List<String> cityCode = new ArrayList<>();
Map<Integer, List<Leg>> collect = orderDomainService.queryLocation(order.getLegItems())
.stream().collect(Collectors.groupingBy(Leg::getLegType));
ApprovalRequest approvalRequestParam = ApprovalRequest
.buildApproval(approveOrderNo.getActualOrderNo(), String.valueOf(currentUser.getEmployeeNo()), rankInfo);
collect.forEach((k, v) -> {
switch (k) {
case LEG_TYPE_TRAIN -> approvalRequestParam.withTrain(generateTrainList(v));
case LEG_TYPE_HOTEL -> approvalRequestParam.withHotel(generateHotelList(v));
case LEG_TYPE_AIRPLANE -> approvalRequestParam.withAir(generateFilghtList(v));
case LEG_TYPE_TAXI -> approvalRequestParam.withQuickCar(generateCarList(v));
}
});
ApprovalResult approval = approvalRequest.approval(approvalRequestParam);
return approval.getSetApprovalResult().getStatus().getSuccess();
}
private List<HotelEndorsementDetail> generateHotelList(List<Leg> legs) {
List<HotelEndorsementDetail> hotelList = new ArrayList<>();
orderDomainService.queryLocation(order.getLegItems())
.forEach(
leg -> {
cityCode.add(
cityRepository.findByCityName(leg.getOriginLocation().getLocationName()).getCity()
);
if (leg.getLegType().equals(LEG_TYPE_HOTEL)) {
legs.forEach(leg -> {
hotelList.add(
HotelEndorsementDetail.of(cityCode.stream().distinct().toList())
.passenger(PassengerDetail.of(String.valueOf(currentUser.getEmployeeNo())))
HotelEndorsementDetail.of(List.of(
cityRepository.findByCityName(leg.getOriginLocation().getLocationName()).getCity()
))
.passenger(PassengerDetail.of(String.valueOf(BaseContext.getCurrentUser().getEmployeeNo())))
.starTime(leg.getStartTime())
.endTime(leg.getEndTime())
);
});
return hotelList;
}
}
private List<FlightEndorsementDetail> generateFilghtList(List<Leg> legs) {
List<FlightEndorsementDetail> filghtList = new ArrayList<>();
legs.forEach(leg -> {
filghtList.add(
FlightEndorsementDetail.of(List.of(
cityRepository.findByCityName(leg.getOriginLocation().getLocationName()).getCity()
), List.of(
cityRepository.findByCityName(leg.getDestinationLocation().getLocationName()).getCity()
))
.passenger(PassengerDetail.of(String.valueOf(BaseContext.getCurrentUser().getEmployeeNo())))
.starTime(leg.getStartTime())
.endTime(leg.getEndTime())
);
ApprovalRequest approvalRequestParam = ApprovalRequest.buildApproval(String.valueOf(currentUser.getEmployeeNo()), approveOrderNo.getActualOrderNo(), rankInfo)
.withHotel(hotelList);
approvalRequest.approval(approvalRequestParam);
return false;
});
return filghtList;
}
private List<TrainEndorsementDetail> generateTrainList(List<Leg> legs) {
List<TrainEndorsementDetail> trainList = new ArrayList<>();
legs.forEach(leg -> {
trainList.add(
TrainEndorsementDetail.of(List.of(
cityRepository.findByCityName(leg.getOriginLocation().getLocationName()).getCity()
), List.of(
cityRepository.findByCityName(leg.getDestinationLocation().getLocationName()).getCity()
)).passenger(PassengerDetail.of(String.valueOf(BaseContext.getCurrentUser().getEmployeeNo())))
.starTime(leg.getStartTime())
.endTime(leg.getEndTime())
);
});
return trainList;
}
private List<CarQuickEndorsementDetail> generateCarList(List<Leg> legs) {
List<CarQuickEndorsementDetail> carList = new ArrayList<>();
legs.forEach(leg -> {
carList.add(
CarQuickEndorsementDetail.of(List.of(
cityRepository.findByCityName(leg.getOriginLocation().getLocationName()).getCity()
)).passenger(PassengerDetail.of(String.valueOf(BaseContext.getCurrentUser().getEmployeeNo())))
.starTime(leg.getStartTime())
.endTime(leg.getEndTime())
);
});
return carList;
}
}

View File

@ -5,7 +5,6 @@ import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.LocationRepository;
import com.chint.domain.service.OrderDomainService;
import com.chint.infrastructure.constant.Constant;
import com.chint.infrastructure.util.BaseContext;
import com.chint.interfaces.rest.ly.LYPostRequest;
import com.chint.interfaces.rest.ly.dto.applyordersync.*;
@ -18,21 +17,21 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import static com.chint.infrastructure.constant.Constant.L_Y_BASE_URL;
import static com.chint.infrastructure.constant.Constant.L_Y_ORDER_PATH;
@Component
public class LYOrderSyncAdapter implements SupplierOrderSync {
@Autowired
private LYPostRequest postRequest;
@Autowired
private LocationRepository locationRepository;
@Autowired
private OrderDomainService orderDomainService;
@Override
public boolean syncSupplierOrder(RouteOrder order) {
String supplierOrderSyncUrl = Constant.L_Y_BASE_URL + Constant.L_Y_ORDER_PATH;//请求地址
String supplierOrderSyncUrl = L_Y_BASE_URL + L_Y_ORDER_PATH;//请求地址
//1.设置订单参数
SupplierOrderParam param = new SupplierOrderParam();//参数
param.setOutEmployeeIdType(0);//外部员工ID类型默认为0
@ -52,9 +51,9 @@ public class LYOrderSyncAdapter implements SupplierOrderSync {
param.setTravelDescription("同程订单");//描述信息
param.setBookableProducts("1,3,5");//1:国内机票,2:国际机票,3:国内酒店,4:海外酒店,5:火车票,6:用车
//2.同程的行程节点集合
ArrayList<AOSItem> aosItems = getAosItems(order);
List<AOSItem> aosItems = getAosItems(order);
//3.差旅人信息
ArrayList<AOSPerson> aosPeople = new ArrayList<>();
List<AOSPerson> aosPeople = new ArrayList<>();
AOSPerson aosPerson = new AOSPerson();
aosPerson.setName(user.getName());//用户名
aosPerson.setRelation(0);//0:内部员工1:配偶2:子女3:父母4:面试候选人5:实习生6:外部宾客
@ -62,7 +61,7 @@ public class LYOrderSyncAdapter implements SupplierOrderSync {
aosPerson.setOutEmployeeId(String.valueOf(user.getEmployeeNo()));//SF号(长工号)
aosPeople.add(aosPerson);
//4.前置差旅政策
ArrayList<AOSPreTravelPolicy> aosPreTravelPolicies = new ArrayList<>();
List<AOSPreTravelPolicy> aosPreTravelPolicies = new ArrayList<>();
AOSPreTravelPolicy aosPreTravelPolicy = new AOSPreTravelPolicy();
aosPreTravelPolicy.setPolicyCode("");//一般指客户经理提供的差旅政策标题
aosPreTravelPolicy.setProductTypeId(0);//产品ID 1国内机票2国际机票3国内酒店4海外酒店5火车票6用车
@ -82,8 +81,8 @@ public class LYOrderSyncAdapter implements SupplierOrderSync {
}
//同程Leg集合解析
private ArrayList<AOSItem> getAosItems(RouteOrder order) {
ArrayList<AOSItem> aosItems = new ArrayList<>();
private List<AOSItem> getAosItems(RouteOrder order) {
List<AOSItem> aosItems = new ArrayList<>();
AOSItem aosItem = new AOSItem();
LocalDateTime startDate = LocalDateTime.MAX;
LocalDateTime endDate = LocalDateTime.MIN;
@ -107,7 +106,6 @@ public class LYOrderSyncAdapter implements SupplierOrderSync {
String arriveCity = leg.getDestinationLocation().getLocationName();//到达城市名
departCityStr.append(departCity).append(",");
arriveCityStr.append(arriveCity).append(",");
}
// 移除最后一个逗号
if (!departCityStr.isEmpty()) {

View File

@ -0,0 +1,75 @@
package com.chint.domain.service.supplier;
import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SupplierCallbackData;
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.CarOrderInfoEntity;
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.stereotype.Component;
import java.util.List;
import static com.chint.infrastructure.constant.Constant.*;
@Component
public class CTripOrderDataAdapter implements OrderDataAdapter {
@Override
public OrderLegData adapt(SupplierCallbackData supplierData) {
//这里的查询结果的订单查询 需要根据订单单号来进行查询的结果因此只会返回一个订单信息和对应的行程规划单
SearchOrderResponse searchOrderResponse = (SearchOrderResponse) supplierData.getData();
if (!searchOrderResponse.getItineraryList().isEmpty()) {
ItineraryEntity itineraryEntity = searchOrderResponse.getItineraryList().get(0);
OrderLegData.Builder builder = OrderLegData.builder()
.actualOrderNo(itineraryEntity.getJourneyNO())
.supplierName(SUPPLIER_C_TRIP);
}
return null;
}
private OrderLegData.Builder findSingleElementList(ItineraryEntity itineraryEntity,
OrderLegData.Builder builder) {
List<HotelOrderInfoEntity> hotelOrderInfoList = itineraryEntity.getHotelOrderInfoList();
if (hotelOrderInfoList != null && hotelOrderInfoList.size() == 1) {
HotelOrderInfoEntity hotelOrderInfoEntity = hotelOrderInfoList.get(0);
return builder.productType(LEG_TYPE_HOTEL)
.orderNo(hotelOrderInfoEntity.getOrderId())
.price(hotelOrderInfoEntity.getAmount());
}
// 处理航班订单
List<FlightOrderInfoEntity> flightOrderInfoList = itineraryEntity.getFlightOrderInfoList();
if (flightOrderInfoList != null && flightOrderInfoList.size() == 1) {
FlightOrderInfoEntity flightOrderInfo = flightOrderInfoList.get(0);
return builder.productType(LEG_TYPE_AIRPLANE)
.orderNo(flightOrderInfo.getBasicInfo().getOrderID())
.price(flightOrderInfo.getFlightOrderFeeDetailList().get(0).getPayCurrency());
}
// 处理火车票订单
List<TrainOrderInfoEntity> trainOrderInfoList = itineraryEntity.getTrainOrderInfoList();
if (trainOrderInfoList != null && trainOrderInfoList.size() == 1) {
TrainOrderInfoEntity trainOrderInfo = trainOrderInfoList.get(0);
return builder.productType(LEG_TYPE_TRAIN)
.orderNo(trainOrderInfo.getBasicInfo().getOrderID())
.price(String.valueOf(trainOrderInfo.getOrderPaymentList().get(0).getFeeAmount()));
}
// 处理租车订单
List<CarOrderInfoEntity> carOrderInfoList = itineraryEntity.getCarOrderInfoList();
if (carOrderInfoList != null && carOrderInfoList.size() == 1) {
CarOrderInfoEntity carOrderInfo = carOrderInfoList.get(0);
return builder.productType(LEG_TYPE_TAXI)
.orderNo(String.valueOf(carOrderInfo.getBasicInfo().getOrderId()))
.price(String.valueOf(carOrderInfo.getPaymentInfoList().get(0).getAmount()));
}
// 如果没有找到任何只含一个元素的列表返回null
return null;
}
}

View File

@ -0,0 +1,13 @@
package com.chint.domain.service.supplier;
import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SupplierCallbackData;
import org.springframework.stereotype.Component;
@Component
public class LYOrderDataAdapter implements OrderDataAdapter{
@Override
public OrderLegData adapt(SupplierCallbackData supplierData) {
return null;
}
}

View File

@ -0,0 +1,8 @@
package com.chint.domain.service.supplier;
import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SupplierCallbackData;
public interface OrderDataAdapter {
OrderLegData adapt(SupplierCallbackData supplierData);
}

View File

@ -0,0 +1,26 @@
package com.chint.domain.service.supplier;
import com.chint.domain.exceptions.NotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static com.chint.infrastructure.constant.Constant.*;
@Component
public class OrderDataAdapterSelector {
@Autowired
private CTripOrderDataAdapter cTripOrderDataAdapter;
@Autowired
private LYOrderDataAdapter lyOrderDataAdapter;
public OrderDataAdapter of(String supplierName) {
// 当找不到匹配的适配器时抛出一个异常
return switch (supplierName) {
case SUPPLIER_C_TRIP -> cTripOrderDataAdapter;
case SUPPLIER_L_Y -> lyOrderDataAdapter;
default -> throw new NotFoundException(NOT_FOUND);
};
}
}

View File

@ -0,0 +1,7 @@
package com.chint.domain.service.supplier;
import com.chint.domain.value_object.SupplierCallbackData;
public interface SupplierService {
void handleSupplierCallback(SupplierCallbackData callbackData);
}

View File

@ -0,0 +1,23 @@
package com.chint.domain.service.supplier;
import com.chint.application.commands.RouteAddOrderCommand;
import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SupplierCallbackData;
import com.chint.infrastructure.echo_framework.command.Command;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SupplierServiceImpl implements SupplierService {
@Autowired
private OrderDataAdapterSelector orderDataAdapterSelector;
@Override
public void handleSupplierCallback(SupplierCallbackData callbackData) {
OrderLegData data = orderDataAdapterSelector
.of(callbackData.getSupplierName())
.adapt(callbackData);
Command.of(RouteAddOrderCommand.class).data(data).sendToQueue();
}
}

View File

@ -1,9 +1,69 @@
package com.chint.domain.value_object;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class OrderLegData {
private String actualOrderNo;
private String orderNo;
private String amount;
private String supplierName;
private Integer productType;
private String price;
private OrderLegData(Builder builder) {
this.actualOrderNo = builder.actualOrderNo;
this.orderNo = builder.orderNo;
this.supplierName = builder.supplierName;
this.productType = builder.productType;
this.price = builder.price;
}
public static Builder builder() {
return new Builder();
}
// Builder class
public static class Builder {
private String actualOrderNo;
private String orderNo;
private String supplierName;
private Integer productType;
private String price;
public Builder() {
}
public Builder actualOrderNo(String actualOrderNo) {
this.actualOrderNo = actualOrderNo;
return this;
}
public Builder orderNo(String orderNo) {
this.orderNo = orderNo;
return this;
}
public Builder supplierName(String supplierName) {
this.supplierName = supplierName;
return this;
}
public Builder productType(Integer productType) {
this.productType = productType;
return this;
}
public Builder price(String price) {
this.price = price;
return this;
}
public OrderLegData build() {
return new OrderLegData(this);
}
}
}

View File

@ -0,0 +1,10 @@
package com.chint.domain.value_object;
import lombok.Data;
@Data
public class RejectLegData {
// private Long routeId;
// private String fakeOrderNo;
private String actualOrderNo;
}

View File

@ -0,0 +1,21 @@
package com.chint.domain.value_object;
import lombok.Data;
@Data
public class SupplierCallbackData {
private String supplierName;
private String employeeNo;
private Object data;
public static SupplierCallbackData of(String supplierName) {
SupplierCallbackData supplierCallbackData = new SupplierCallbackData();
supplierCallbackData.setSupplierName(supplierName);
return supplierCallbackData;
}
public SupplierCallbackData data(Object data) {
this.data = data;
return this;
}
}

View File

@ -0,0 +1,9 @@
package com.chint.domain.value_object;
import lombok.Data;
@Data
public class UpdateLegData {
private Long LegId;
private Long orderDetailId;
}

View File

@ -141,7 +141,8 @@ public class Constant {
public static final String C_TRIP_CORP_ID = "zhengtai2024";
public static final String C_TRIP_APP_KEY = "obk_zhengtai2024"; // 测试appkey
public static final String C_TRIP_APP_SECURITY = "fI3}FZX+zUdxPa2W!R6I2gYO"; // 测试app秘钥
public static final String C_TRIP_H5_LOGIN = "/corpservice/authorize/getticket"; // 测试app秘钥
public static final String C_TRIP_LOGIN_TICKET = "/corpservice/authorize/getticket"; // H5单点登录的ticket获取
public static final String C_TRIP_ORDER_SEARCH_PATH = "/switchapi/Order/SearchOrder"; // 测试app秘钥
public static final String USER_SAVE_PATH = "/corpservice/CorpCustService/SaveCorpCustInfoList";
public static final String HOTEL_CITY_PATH = "/corpopenapi/HotelCity/GetCountryCityExtend";
public static final String HOTEL_COUNTRY_PATH = "/corpopenapi/HotelCity/GetCountry";
@ -155,7 +156,6 @@ public class Constant {
public static final String C_TRIP_APPROVAL_PATH = "/switchapi/approval.svc/rest/setapproval";
public static final String C_TRIP_ESTIMATE_PATH = "/bookingrelatedservice/bookingrelatedopenapi";
public static final String C_TRIP_TOKEN_PATH = "/dataservice/token/getAccessToken";
public static final String C_TRIP_ORDER_SEARCH_PATH = "/switchapi/Order/SearchOrder";
public static final String C_TRIP_AUTH_LOGIN = "/corpservice/authorize/login";
@ -163,11 +163,18 @@ public class Constant {
//同程
public static final String L_Y_BASE_URL = "https://api.qa.dttrip.cn";
public static final String L_Y_TOKEN_PATH = "/openapi/api/OAuth/v2/GetAccessToken";
public static final String L_Y_ORDER_PATH = "/openapi/api/TravelApplyOrder/ApplyOrderSync";
public static final String L_Y_USER_PATH = "/openapi/api/Employee/SyncEmployeeInfo";
public static final String L_Y_LOGIN_PATH = "/openapi/api/Employee/SSO";
public static final String L_Y_BASE_URL = "https://api.qa.dttrip.cn/openapi";
public static final String L_Y_TOKEN_PATH = "/api/OAuth/v2/GetAccessToken";
public static final String L_Y_ORDER_PATH = "/api/TravelApplyOrder/ApplyOrderSync";
public static final String L_Y_USER_PATH = "/api/Employee/SyncEmployeeInfo";
public static final String L_Y_LOGIN_PATH = "/api/Employee/SSO";
public static final String L_Y_FLIGHT_LIST_PATH = "/api/DomesticFlight/GetFlightOrderList";
public static final String L_Y_FLIGHT_DETAIL_PATH = "/api/DomesticFlight/GetFlightOrderDetail";
public static final String L_Y_TRAIN_LIST_PATH = "/api/Train/GetTrainOrderList";
public static final String L_Y_TRAIN_DETAIL_PATH = "/api/Train/GetTrainOrderDetail";
public static final String L_Y_HOTEL_LIST_PATH = "/api/Hotel/GetHotelOrderList";
public static final String L_Y_HOTEL_DETAIL_PATH = "/api/Hotel/GetHotelOrderDetail";
public static final String L_Y_APP_ID = "zhengtai";
public static final String L_Y_ACCOUNT = "4f9cb1080b564dd0a94aa95f7a19c8b5"; // 测试appkey
public static final String L_Y_PASSWORD = "1fD3SutgzfS48qznYQiq"; // 测试app秘钥
public static final String L_Y_SECRET = "WOHzCMvHd823iHgH"; // 测试app秘钥
@ -183,13 +190,10 @@ public class Constant {
public static final Integer L_Y_TRAVEL_TYPE_ALL = 0; // 全部(因公因私)
public static final Integer L_Y_TRAVEL_TYPE_PERSON = 1; // (因公)
public static final Integer L_Y_TRAVEL_TYPE_NO_PERSON = 2; // (因私)
public static final String L_Y_TRAIN_MAX_PRICE = "/openapi/api/Train/TrainHighPirceSearchByCityName";//火车票价格查询
public static final String L_Y_FLY_PRICE = "/openapi/api/DomesticFlight/CheckFlightOrderBookableStatus";//飞机表估算价格
public static final String L_Y_HOTEL_List = "/openapi/api/Hotel/GetHotelCityList"; //酒店城市列表
public static final String L_Y_HOTEL_MIN_PRICE = "/openapi/api/Hotel/GetHotelMinPrice";//酒店估算价格
public static final String L_Y_TRAIN_MAX_PRICE = "/api/Train/TrainHighPirceSearchByCityName";//火车票价格查询
public static final String L_Y_FLY_PRICE = "/api/DomesticFlight/CheckFlightOrderBookableStatus";//飞机表估算价格
public static final String L_Y_HOTEL_List = "/api/Hotel/GetHotelCityList"; //酒店城市列表
public static final String L_Y_HOTEL_MIN_PRICE = "/api/Hotel/GetHotelMinPrice";//酒店估算价格
// status
public static final int STATUS_DISABLED = 0;

View File

@ -4,6 +4,7 @@ package com.chint.infrastructure.handler;
import com.chint.domain.exceptions.CommandException;
import com.chint.domain.exceptions.LegEventException;
import com.chint.domain.exceptions.NotFoundException;
import com.chint.domain.exceptions.OrderException;
import com.chint.infrastructure.util.Result;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
@ -29,4 +30,9 @@ public class GlobalExceptionHandler {
public Result<String> handleCommandException(HttpServletRequest request, CommandException e) {
return Result.error(e.getMessage());
}
@ExceptionHandler(OrderException.class)
public Result<String> handleOrderException(HttpServletRequest request, OrderException e) {
return Result.error(e.getMessage());
}
}

View File

@ -0,0 +1,21 @@
package com.chint.infrastructure.repository;
import com.chint.domain.aggregates.order.OrderDetail;
import com.chint.domain.exceptions.NotFoundException;
import com.chint.domain.repository.OrderDetailRepository;
import com.chint.infrastructure.repository.jdbc.JdbcOrderDetailRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import static com.chint.infrastructure.constant.Constant.NOT_FOUND;
@Repository
public class OrderDetailRepositoryImpl implements OrderDetailRepository {
@Autowired
private JdbcOrderDetailRepository orderDetailRepository;
@Override
public OrderDetail findById(Long orderDetailId) {
return orderDetailRepository.findById(orderDetailId).orElseThrow(() -> new NotFoundException(NOT_FOUND));
}
}

View File

@ -32,6 +32,11 @@ public class RouteRepositoryImpl implements RouteRepository {
return jdbcRouteRepository.findByApproveOrderNo_FakeOrderNo(fakeOrderNo);
}
@Override
public RouteOrder findByActualOrderNo(String actualOrderNo) {
return jdbcRouteRepository.findByApproveOrderNo_ActualOrderNo(actualOrderNo);
}
@Override
public RouteOrder save(RouteOrder routeOrder) {
return jdbcRouteRepository.save(routeOrder);

View File

@ -0,0 +1,9 @@
package com.chint.infrastructure.repository.jdbc;
import com.chint.domain.aggregates.order.OrderDetail;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface JdbcOrderDetailRepository extends CrudRepository<OrderDetail, Long> {
}

View File

@ -14,4 +14,6 @@ public interface JdbcRouteRepository extends CrudRepository<RouteOrder, Long> {
RouteOrder findByApproveOrderNo_FakeOrderNo(String approveOrderNo_fakeOrderNo);
RouteOrder findByApproveOrderNo_ActualOrderNo(String approveOrderNo_actualOrderNo);
}

View File

@ -2,6 +2,7 @@ package com.chint.interfaces.rest.ctrip;
import com.chint.interfaces.rest.base.PostRequest;
import com.chint.interfaces.rest.ctrip.dto.approval.ApprovalRequest;
import com.chint.interfaces.rest.ctrip.dto.approval.ApprovalRequestOut;
import com.chint.interfaces.rest.ctrip.dto.approval.ApprovalResult;
import com.chint.interfaces.rest.ctrip.dto.Authentication;
import org.springframework.beans.factory.annotation.Autowired;
@ -21,9 +22,11 @@ public class CTripApprovalRequest {
private PostRequest postRequest;
public ApprovalResult approval(ApprovalRequest approvalRequest) {
ApprovalRequestOut approvalRequestOut = new ApprovalRequestOut();
approvalRequestOut.setRequest(approvalRequest);
String ticket = ticketRequest.loadTicket();
approvalRequest.setStatus(0);
approvalRequest.setStatus(1);
approvalRequest.setAuth(Authentication.of(C_TRIP_APP_KEY, ticket));
return postRequest.post(approvalUrl, approvalRequest, ApprovalResult.class);
return postRequest.post(approvalUrl, approvalRequestOut, ApprovalResult.class);
}
}

View File

@ -49,7 +49,7 @@ public class CTripLoginRequest {
//H5单点登录
private String singleLoginUrl = C_TRIP_BASE_URL + C_TRIP_SINGLE_LOGIN;
private String singleTokenUrl = C_TRIP_BASE_URL + C_TRIP_H5_LOGIN;
private String singleTokenUrl = C_TRIP_BASE_URL + C_TRIP_LOGIN_TICKET;
private String IDPEntityID = C_TRIP_ENTITY_ID;
private String corpId = C_TRIP_CORP_ID;
@ -59,16 +59,19 @@ public class CTripLoginRequest {
}
public HttpResponse authLogin(CTripAuthLoginParam authLoginParam) {
String ticket = ticketRequest.loadTicket();
String token = tokenRequest.getToken();
authLoginParam.setTicket(ticket);
public PCResponse authLogin() {
User currentUser = BaseContext.getCurrentUser();
String employeeId = String.valueOf(
currentUser.getEmployeeNo()
);
CTripAuthLoginParam authLoginParam = CTripAuthLoginParam.of(String.valueOf(
employeeId
));
authLoginParam.setForCorp(0);
String ticket = loadLoginToken();
String appKey = C_TRIP_APP_KEY;
String uid = StringUtils.isNotBlank(authLoginParam.getUID()) ? authLoginParam.getUID() : "";
String employeeId = StringUtils.isNotBlank(authLoginParam.getEmployeeID()) ? authLoginParam.getEmployeeID() : "";
String email = StringUtils.isNotBlank(authLoginParam.getEmail()) ? authLoginParam.getEmail() : "";
String ta = StringUtils.isNotBlank(authLoginParam.getTA()) ? authLoginParam.getTA() : "";
Integer forCorp = authLoginParam.getForCorp() == null ? authLoginParam.getForCorp() : 0;
@ -96,23 +99,25 @@ public class CTripLoginRequest {
Digest.md5(appKey + uid + employeeId + email + ta + forCopStr + cost1 + cost2 + cost3 + mdAppSecurity);
authLoginParam.setSignature(finallySign);
// Result post = postRequest.post(authLoginUrl, authLoginParam, Result.class);
// HttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(authLoginUrl);
List entitys = new ArrayList<>();
entitys.add(new BasicNameValuePair("AppKey", appKey));
entitys.add(new BasicNameValuePair("Token", token));
entitys.add(new BasicNameValuePair("Ticket", ticket));
entitys.add(new BasicNameValuePair("EmployeeID", employeeId));
entitys.add(new BasicNameValuePair("Signature", finallySign));
entitys.add(new BasicNameValuePair("ForCorp", "0"));
entitys.add(new BasicNameValuePair("ForCorp", String.valueOf(authLoginParam.getForCorp())));
try {
httpPost.setEntity(new UrlEncodedFormEntity(entitys));
HttpClient client = new DefaultHttpClient();
try {
return client.execute(httpPost);
HttpResponse execute = client.execute(httpPost);
String body = EntityUtils.toString(execute.getEntity(), "UTF-8");
String url = getPCUrlFromHtml(body);
PCResponse pcResponse = new PCResponse();
pcResponse.setRedirectUrl(url);
pcResponse.setSuccess(true);
return pcResponse;
} catch (IOException e) {
throw new RuntimeException(e);
}
@ -121,12 +126,16 @@ public class CTripLoginRequest {
}
}
private String loadLoginToken() {
H5LoginToken h5TokenResponse = postRequest.post(singleTokenUrl, H5TicketModel.build(), H5LoginToken.class);
return h5TokenResponse.getToken();
}
public H5Response hSingleLogin() {
CTripHSingleLoginParam hSingleLoginParam = new CTripHSingleLoginParam();
User currentUser = BaseContext.getCurrentUser();
H5LoginToken h5TokenResponse = postRequest.post(singleTokenUrl, H5TicketModel.build(), H5LoginToken.class);
String token = h5TokenResponse.getToken();
String token = loadLoginToken();
String accessUserId = C_TRIP_APP_KEY;
String employeeId = String.valueOf(currentUser.getEmployeeNo());
String corpPayType = StringUtils.isNotBlank(hSingleLoginParam.getCorpPayType()) ?
@ -242,4 +251,35 @@ public class CTripLoginRequest {
throw new NotFoundException(NOT_FOUND);
}
}
private static String getPCUrlFromHtml(String htmlContent) {
// 正则表达式匹配 action URL
Pattern actionPattern = Pattern.compile("action=\"(.*?)\"");
Matcher actionMatcher = actionPattern.matcher(htmlContent);
String actionUrl = "";
if (actionMatcher.find()) {
actionUrl = actionMatcher.group(1); // 获取 action URL
}
// 正则表达式匹配所有隐藏的 input 元素
Pattern inputPattern = Pattern.compile("<input type=\"hidden\" name=\"(.*?)\" value=\"(.*?)\" />");
Matcher inputMatcher = inputPattern.matcher(htmlContent);
StringBuilder urlBuilder = new StringBuilder(actionUrl);
boolean isFirstParam = true;
while (inputMatcher.find()) {
if (isFirstParam) {
urlBuilder.append("?"); // 第一个参数前添加 ?
isFirstParam = false;
} else {
urlBuilder.append("&"); // 后续参数前添加 &
}
urlBuilder.append(inputMatcher.group(1)) // 添加参数名
.append("=")
.append(inputMatcher.group(2)); // 添加参数值
}
return urlBuilder.toString();
}
}

View File

@ -0,0 +1,33 @@
package com.chint.interfaces.rest.ctrip;
import com.chint.interfaces.rest.base.PostRequest;
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderRequest;
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import static com.chint.infrastructure.constant.Constant.*;
@Service
public class CTripOrderSearchRequest {
private String searchUrl = C_TRIP_BASE_URL + C_TRIP_ORDER_SEARCH_PATH;
@Autowired
private PostRequest postRequest;
@Autowired
private CTripTicketRequest ticketRequest;
public SearchOrderResponse searchOrder(String journeyNo) {
String ticket = ticketRequest.loadTicket();
SearchOrderRequest request = SearchOrderRequest
.builder()
.authInfo()
.details(C_TRIP_APP_KEY, ticket)
.done()
.language(LANGUAGE_CN)
.journeyNo(journeyNo)
.done();
return postRequest.post(searchUrl, request, SearchOrderResponse.class);
}
}

View File

@ -6,8 +6,8 @@ import lombok.Data;
@Data
@AllArgsConstructor
public class Authentication {
private String appKey;
private String ticket;
private String AppKey;
private String Ticket;
// Getters and setters...
public static Authentication of(String appKey, String ticket) {

View File

@ -18,108 +18,109 @@ import java.util.List;
public class ApprovalRequest {
// 审批单号 - 必填
// OA审批通过时生成同步审批单编号用于标识审批单
private String approvalNumber;
private String ApprovalNumber;
// 状态 - 必填
// 0为审批中1为审批通过2为审批拒绝
private int status;
// 1
private int Status;
// 携程卡号 - 非必填
// N表示非必填多个携程卡号以逗号隔开长度不能超过500个字符且不重复
private String ctripCardNO;
private String CtripCardNO;
// 员工编号 - 非必填
// N表示非必填多个员工编号以逗号隔开长度不能超过500个字符且不重复
private String employeeID;
private String EmployeeID;
// 机票背书信息详情列表 - 必填
// Y表示必填项用于记录一条审批单中的一条或多条航班信息详细信息格式见3.3.2节的JSON数据交互格式详细说明
private List<FlightEndorsementDetail> flightEndorsementDetails;
private List<FlightEndorsementDetail> FlightEndorsementDetails;
// 酒店背书信息详情列表 - 必填
// Y表示必填项
private List<HotelEndorsementDetail> hotelEndorsementDetails;
private List<HotelEndorsementDetail> HotelEndorsementDetails;
// 火车背书信息详情列表 - 必填
// Y表示必填项
private List<TrainEndorsementDetail> trainEndorsementDetails;
private List<TrainEndorsementDetail> TrainEndorsementDetails;
// 租车背书信息详情列表 - 必填
// Y表示必填项
private List<CarQuickEndorsementDetail> carQuickEndorsementDetails;
private List<CarQuickEndorsementDetail> CarQuickEndorsementDetails;
// 接送车背书信息详情列表 - 必填
// Y表示必填项
private List<CarPickUpEndorsementDetail> carPickUpEndorsementDetails;
private List<CarPickUpEndorsementDetail> CarPickUpEndorsementDetails;
// 包车背书信息详情列表 - 必填
// Y表示必填项
private List<CarCharterEndorsementDetail> carCharterEndorsementDetails;
private List<CarCharterEndorsementDetail> CarCharterEndorsementDetails;
// 巴士背书信息详情列表 - 必填
// Y表示必填项
private List<BusEndorsementDetail> busEndorsementDetails;
private List<BusEndorsementDetail> BusEndorsementDetails;
// 出差计划背书信息详情列表 - 必填
// Y表示必填项
private List<TravelPlanEndorsementDetail> travelPlanEndorsementDetails;
private List<TravelPlanEndorsementDetail> TravelPlanEndorsementDetails;
// 有效期 - 非必填
// 有效期格式为日期时间起始时间从2017-01-01开始
private String expiredTime;
private String ExpiredTime;
// 认证信息 - 非必填
// 携程分配给客户公司具体见下表描述
private Authentication auth;
private Authentication Auth;
// 成本中心等扩展字段列表非必填如无该需求则不需要传
// Y表示必填项
private List<ExtendField> extendFieldList;
// Y表示必填项R
private List<ExtendField> ExtendFieldList;
// 备注 - 必填
// Y表示必填项
private String remark;
private String Remark;
// 职级信息 - 非必填
// 职级信息仅限于职级信息的前20
private RankInfo rankInfo;
private RankInfo RankInfo;
public ApprovalRequest(String approvalNumber, String employeeID, RankInfo rankInfo) {
this.approvalNumber = approvalNumber;
this.employeeID = employeeID;
this.rankInfo = rankInfo;
this.ApprovalNumber = approvalNumber;
this.EmployeeID = employeeID;
this.RankInfo = rankInfo;
}
public static ApprovalRequest buildApproval(String employeeID, String approvalNumber, RankInfo rankInfo) {
return new ApprovalRequest(employeeID, approvalNumber, rankInfo);
public static ApprovalRequest buildApproval(String approvalNumber, String employeeID, RankInfo rankInfo) {
return new ApprovalRequest(approvalNumber,employeeID, rankInfo);
}
public ApprovalRequest withAir(List<FlightEndorsementDetail> flightEndorsementDetails) {
this.flightEndorsementDetails = flightEndorsementDetails;
this.FlightEndorsementDetails = flightEndorsementDetails;
return this;
}
public ApprovalRequest withTrain(List<HotelEndorsementDetail> hotelEndorsementDetails) {
this.hotelEndorsementDetails = hotelEndorsementDetails;
public ApprovalRequest withTrain(List<TrainEndorsementDetail> trainEndorsementDetails) {
this.TrainEndorsementDetails = trainEndorsementDetails;
return this;
}
public ApprovalRequest withBus(List<BusEndorsementDetail> busEndorsementDetails) {
this.busEndorsementDetails = busEndorsementDetails;
this.BusEndorsementDetails = busEndorsementDetails;
return this;
}
public ApprovalRequest withPickCar(List<CarPickUpEndorsementDetail> carPickUpEndorsementDetails) {
this.carPickUpEndorsementDetails = carPickUpEndorsementDetails;
this.CarPickUpEndorsementDetails = carPickUpEndorsementDetails;
return this;
}
public ApprovalRequest withQuickCar(List<CarQuickEndorsementDetail> carQuickEndorsementDetails) {
this.carQuickEndorsementDetails = carQuickEndorsementDetails;
this.CarQuickEndorsementDetails = carQuickEndorsementDetails;
return this;
}
public ApprovalRequest withHotel(List<HotelEndorsementDetail> hotelEndorsementDetails) {
this.hotelEndorsementDetails = hotelEndorsementDetails;
this.HotelEndorsementDetails = hotelEndorsementDetails;
return this;
}
}

View File

@ -0,0 +1,8 @@
package com.chint.interfaces.rest.ctrip.dto.approval;
import lombok.Data;
@Data
public class ApprovalRequestOut {
private ApprovalRequest request;
}

View File

@ -0,0 +1,8 @@
package com.chint.interfaces.rest.ctrip.dto.approval;
import lombok.Data;
@Data
public class ApprovalResponse {
private ResponseStatus Status;
}

View File

@ -5,6 +5,8 @@ import lombok.Data;
@Data
public class ApprovalResult {
private ResponseStatus Status;
private ApprovalResponse SetApprovalResult;
}

View File

@ -1,100 +1,131 @@
package com.chint.interfaces.rest.ctrip.dto.approval.air;
import com.chint.infrastructure.util.DateTimeUtil;
import com.chint.interfaces.rest.ctrip.dto.approval.CurrencyType;
import com.chint.interfaces.rest.ctrip.dto.approval.PassengerDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.hotel.HotelEndorsementDetail;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
public class FlightEndorsementDetail {
// 订票类型列表 - 1张, 2张, 3张, 超过3张
private List<String> bookingTypeList;
private List<String> BookingTypeList;
// 订单ID列表 - 最多20个
private List<String> orderIDList;
private List<String> OrderIDList;
// 航空公司名称 - 不可为空字符串
private String airline;
private String Airline;
// 货币类型 - 默认CNY
private CurrencyType currency;
private CurrencyType Currency;
// 航班类型 - 单程(1) or 往返(2)
private FlightWayType flightWay;
private FlightWayType FlightWay;
// 起飞日期开始时间 - 格式: yyyy-MM-dd
private String departDateBegin;
private String DepartDateBegin;
// 起飞日期结束时间 - 格式: yyyy-MM-dd
private String departDateEnd;
private String DepartDateEnd;
// 返回日期开始时间 - 格式: yyyy-MM-dd
private String returnDateBegin;
private String ReturnDateBegin;
// 返回日期结束时间 - 格式: yyyy-MM-dd
private String returnDateEnd;
private String ReturnDateEnd;
// 起飞时间开始时间 - 格式: HH:mm
private String takeOffBeginTime;
private String TakeOffBeginTime;
// 起飞时间结束时间 - 格式: HH:mm
private String takeOffEndTime;
private String TakeOffEndTime;
// 到达时间开始时间 - 格式: HH:mm
private String arrivalBeginTime;
private String ArrivalBeginTime;
// 到达时间结束时间 - 格式: HH:mm
private String arrivalEndTime;
private String ArrivalEndTime;
// 折扣率 - 0.1到1.0, 0代表无折扣
private float discount;
private float Discount;
// 出发国家ID列表 - 最多1000个
private List<String> departCountryIds;
private List<String> DepartCountryIds;
// 出发国家代码列表 - 最多1000个
private List<String> departCountryCodes;
private List<String> DepartCountryCodes;
// 出发城市代码列表 - 最多1000个
private List<String> departCityCodes;
private List<String> DepartCityCodes;
// 到达国家ID列表 - 最多1000个
private List<String> arrivalCountryIds;
private List<String> ArrivalCountryIds;
// 到达城市代码列表 - 最多1000个
private List<String> arrivalCityCodes;
private List<String> ArrivalCityCodes;
// 出发城市ID列表 - 最多1000个
private List<String> departCityIds;
private List<String> DepartCityIds;
// 到达城市ID列表 - 最多1000个
private List<String> arrivalCityIds;
private List<String> ArrivalCityIds;
// 乘客列表 - 无数量限制
private List<PassengerDetail> passengerList;
private List<PassengerDetail> PassengerList;
// 价格 - 可为负数, 默认为0
private float price;
private float Price;
// 产品类型 - 1代表经济舱, 2代表商务舱
private ProductTypeEnum productType;
private ProductTypeEnum ProductType;
// 座位等级 - 经济舱(3), 商务舱(2), 头等舱(1)
private SeatClassType seatClass;
private SeatClassType SeatClass;
// 跳过的字段位 - 用于标记不包含的字段
private long skipFields;
private long SkipFields;
// 旅客数量 - 无限制
private int travelerCount;
private int TravelerCount;
// 总旅客数量 - 用于统计
private int totalTravelerCount;
private int TotalTravelerCount;
// 预验证字段位 - 用于标记需要预验证的字段
private long preVerifyFields;
private long PreVerifyFields;
// Getters and setters...
public static FlightEndorsementDetail of(List<String> DepartCityIds , List<String> ArrivalCityIds) {
FlightEndorsementDetail flightEndorsementDetail = new FlightEndorsementDetail();
flightEndorsementDetail.setDepartCountryIds(DepartCityIds);
flightEndorsementDetail.setArrivalCityIds(ArrivalCityIds);
return flightEndorsementDetail;
}
public FlightEndorsementDetail passenger(PassengerDetail passengerDetail) {
if (this.PassengerList == null) {
this.PassengerList = new ArrayList<>();
}
this.PassengerList.add(passengerDetail);
return this;
}
public FlightEndorsementDetail starTime(LocalDateTime startTime) {
this.DepartDateBegin = DateTimeUtil.timeToStr(startTime);
this.ReturnDateBegin = DateTimeUtil.timeToStr(startTime);
return this;
}
public FlightEndorsementDetail endTime(LocalDateTime endTime) {
this.DepartDateEnd = DateTimeUtil.timeToStr(endTime);
this.ReturnDateEnd = DateTimeUtil.timeToStr(endTime);
return this;
}
}

View File

@ -14,64 +14,64 @@ import java.util.List;
public class HotelEndorsementDetail {
// 产品类型
private HotelProductTypeEnum productType;
private HotelProductTypeEnum ProductType;
// 入住开始日期 - 格式: yyyy-MM-dd
private String checkInDateBegin;
private String CheckInDateBegin;
// 入住结束日期 - 格式: yyyy-MM-dd
private String checkInDateEnd;
private String CheckInDateEnd;
// 离店开始日期 - 格式: yyyy-MM-dd
private String checkOutDateBegin;
private String CheckOutDateBegin;
// 离店结束日期 - 格式: yyyy-MM-dd
private String checkOutDateEnd;
private String CheckOutDateEnd;
// 乘客列表
private List<PassengerDetail> passengerList;
private List<PassengerDetail> PassengerList;
// 入住国家ID列表
private List<String> checkInCountryIds;
private List<String> CheckInCountryIds;
// 入住国家代码列表
private List<String> checkInCountryCodes;
private List<String> CheckInCountryCodes;
// 入住城市代码列表
private List<String> checkInCityCodes;
private List<String> CheckInCityCodes;
// 最高价格
private String maxPrice;
private String MaxPrice;
// 最低价格
private String minPrice;
private String MinPrice;
// 货币类型 - 默认CNY
private CurrencyType currency;
private CurrencyType Currency;
// 最大星级
private String maxStarRating;
private String MaxStarRating;
// 最小星级
private String minStarRating;
private String MinStarRating;
// 平均价格
private String averagePrice;
private String AveragePrice;
// 房间数量
private int roomCount;
private int RoomCount;
// 跳过的字段位 - 用于标记不包含的字段
private long skipFields;
private long SkipFields;
// 总房晚数
private int totalRoomNightCount;
private int TotalRoomNightCount;
// 房晚价格
private String roomNightPrice;
private String RoomNightPrice;
// 预验证字段位 - 用于标记需要预验证的字段
private long preVerifyFields;
private long PreVerifyFields;
// Getters and setters...
@ -82,22 +82,22 @@ public class HotelEndorsementDetail {
}
public HotelEndorsementDetail passenger(PassengerDetail passengerDetail) {
if (this.passengerList == null) {
this.passengerList = new ArrayList<>();
if (this.PassengerList == null) {
this.PassengerList = new ArrayList<>();
}
this.passengerList.add(passengerDetail);
this.PassengerList.add(passengerDetail);
return this;
}
public HotelEndorsementDetail starTime(LocalDateTime startTime) {
this.checkInDateBegin = DateTimeUtil.timeToStr(startTime);
this.checkOutDateBegin = DateTimeUtil.timeToStr(startTime);
this.CheckInDateBegin = DateTimeUtil.timeToStr(startTime);
this.CheckOutDateBegin = DateTimeUtil.timeToStr(startTime);
return this;
}
public HotelEndorsementDetail endTime(LocalDateTime endTime) {
this.checkInDateEnd = DateTimeUtil.timeToStr(endTime);
this.checkOutDateEnd = DateTimeUtil.timeToStr(endTime);
this.CheckInDateEnd = DateTimeUtil.timeToStr(endTime);
this.CheckOutDateEnd = DateTimeUtil.timeToStr(endTime);
return this;
}
}

View File

@ -1,42 +1,70 @@
package com.chint.interfaces.rest.ctrip.dto.approval.quick;
import com.chint.infrastructure.util.DateTimeUtil;
import com.chint.interfaces.rest.ctrip.dto.approval.CurrencyType;
import com.chint.interfaces.rest.ctrip.dto.approval.PassengerDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.train.TrainEndorsementDetail;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
public class CarQuickEndorsementDetail {
// 产品类型
private int productType;
private int ProductType;
// 乘客列表, 最多100名
private List<PassengerDetail> passengerList;
private List<PassengerDetail> PassengerList;
// 城市代码
private String cities;
private String Cities;
// 公司地址列表
private List<CompanyAddressDetail> companyAddressList;
private List<CompanyAddressDetail> CompanyAddressList;
// 到达地址列表
private List<CompanyAddressDetail> arrivalAddressList;
private List<CompanyAddressDetail> ArrivalAddressList;
// 开始使用日期
private String beginUseDate;
private String BeginUseDate;
// 结束使用日期
private String endUseDate;
private String EndUseDate;
// 使用时间列表
private List<UseTimeDetail> useTimeList;
private List<UseTimeDetail> UseTimeList;
// 货币类型, 默认CNY
private CurrencyType currency;
private CurrencyType Currency;
// 价格默认为0
private float price;
private float Price;
// 车辆组
private String vehicleGroup;
private String VehicleGroup;
// 有效性金额
private int effectivenessAmount;
private int EffectivenessAmount;
// 跳过的字段位
private long skipFields;
private long SkipFields;
// 到达城市代码
private String arrivalCities;
private String ArrivalCities;
// Getters and setters...
public static CarQuickEndorsementDetail of(List<String> cities) {
CarQuickEndorsementDetail carQuickEndorsementDetail = new CarQuickEndorsementDetail();
carQuickEndorsementDetail.setArrivalCities(String.join(",",cities));
return carQuickEndorsementDetail;
}
public CarQuickEndorsementDetail passenger(PassengerDetail passengerDetail) {
if (this.PassengerList == null) {
this.PassengerList = new ArrayList<>();
}
this.PassengerList.add(passengerDetail);
return this;
}
public CarQuickEndorsementDetail starTime(LocalDateTime startTime) {
this.BeginUseDate = DateTimeUtil.timeToStr(startTime);
return this;
}
public CarQuickEndorsementDetail endTime(LocalDateTime endTime) {
this.EndUseDate = DateTimeUtil.timeToStr(endTime);
return this;
}
}

View File

@ -1,69 +1,103 @@
package com.chint.interfaces.rest.ctrip.dto.approval.train;
import com.chint.infrastructure.util.DateTimeUtil;
import com.chint.interfaces.rest.ctrip.dto.approval.CurrencyType;
import com.chint.interfaces.rest.ctrip.dto.approval.PassengerDetail;
import com.chint.interfaces.rest.ctrip.dto.approval.air.FlightEndorsementDetail;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
// TrainEndorsementDetail class definition
@Data
public class TrainEndorsementDetail {
// 火车产品类型
private TrainProductTypeEnum productType;
private TrainProductTypeEnum ProductType;
// 订票类型列表 - 1张, 2张, 3张, 超过3张
private List<String> bookingTypeList;
private List<String> BookingTypeList;
// 订单ID列表
private List<String> orderIDList;
private List<String> OrderIDList;
// 行程类型 - 单程(1) or 往返(2)
private TripTypeEnum tripType;
private TripTypeEnum TripType;
// 出发日期开始 - 格式: yyyy-MM-dd
private String departDateBegin;
private String DepartDateBegin;
// 出发日期结束 - 格式: yyyy-MM-dd
private String departDateEnd;
private String DepartDateEnd;
// 返回日期开始 - 格式: yyyy-MM-dd
private String returnDateBegin;
private String ReturnDateBegin;
// 返回日期结束 - 格式: yyyy-MM-dd
private String returnDateEnd;
private String ReturnDateEnd;
// 乘客列表 - 无限制
private List<PassengerDetail> passengerList;
private List<PassengerDetail> PassengerList;
// 到达城市代码列表 - 最多1000个
private List<String> arrivalCityCodes;
private List<String> ArrivalCityCodes;
// 出发城市代码列表 - 最多1000个
private List<String> departCityCodes;
private List<String> DepartCityCodes;
// 价格 - 可为负数, 默认为0
private String price;
private String Price;
// 货币类型 - 默认CNY
private CurrencyType currency;
private CurrencyType Currency;
// 座位类型
private List<SeatTypeEnum> seatType;
private List<SeatTypeEnum> SeatType;
// 跳过的字段位 - 用于标记不包含的字段
private long skipFields;
private long SkipFields;
// 旅客数量 - 默认为0
private int travelerCount;
private int TravelerCount;
// 预验证字段位 - 用于标记需要预验证的字段
private long preVerifyFields;
private long PreVerifyFields;
// 列车车次列表 - 如G, D, C, Z, T, K等
private List<String> trainVehicleTypeList;
private List<String> TrainVehicleTypeList;
// 总旅客数量 - 用于统计
private int totalTravelerCount;
private int TotalTravelerCount;
// Getters and setters...
public static TrainEndorsementDetail of(List<String> DepartCityCodes , List<String> ArrivalCityCodes) {
TrainEndorsementDetail trainEndorsementDetail = new TrainEndorsementDetail();
trainEndorsementDetail.setDepartCityCodes(DepartCityCodes);
trainEndorsementDetail.setArrivalCityCodes(ArrivalCityCodes);
return trainEndorsementDetail;
}
public TrainEndorsementDetail passenger(PassengerDetail passengerDetail) {
if (this.PassengerList == null) {
this.PassengerList = new ArrayList<>();
}
this.PassengerList.add(passengerDetail);
return this;
}
public TrainEndorsementDetail starTime(LocalDateTime startTime) {
this.DepartDateBegin = DateTimeUtil.timeToStr(startTime);
this.ReturnDateBegin = DateTimeUtil.timeToStr(startTime);
return this;
}
public TrainEndorsementDetail endTime(LocalDateTime endTime) {
this.DepartDateEnd = DateTimeUtil.timeToStr(endTime);
this.ReturnDateEnd = DateTimeUtil.timeToStr(endTime);
return this;
}
}

View File

@ -32,5 +32,10 @@ public class CTripAuthLoginParam {
private String OrderId;
private Boolean OnlyInitPage;
public static CTripAuthLoginParam of(String employeeID) {
CTripAuthLoginParam cTripAuthLoginParam = new CTripAuthLoginParam();
cTripAuthLoginParam.setEmployeeID(employeeID);
return cTripAuthLoginParam;
}
}

View File

@ -0,0 +1,10 @@
package com.chint.interfaces.rest.ctrip.dto.login;
import lombok.Data;
@Data
public class PCResponse {
private String redirectUrl;
private boolean success;
}

View File

@ -1,8 +1,11 @@
package com.chint.interfaces.rest.ctrip.dto.put;
import lombok.Data;
import java.util.List;
@Data
public class TrainTicketChangeNotification {
private String businessId;
private String businessType;
@ -19,110 +22,4 @@ public class TrainTicketChangeNotification {
private List<PassengerInfoEntity> passengerInfoList;
private String uId;
// Getter and Setter methods for all fields
public String getBusinessId() {
return businessId;
}
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
public String getBusinessType() {
return businessType;
}
public void setBusinessType(String businessType) {
this.businessType = businessType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getContentEn() {
return contentEn;
}
public void setContentEn(String contentEn) {
this.contentEn = contentEn;
}
public String getCorpId() {
return corpId;
}
public void setCorpId(String corpId) {
this.corpId = corpId;
}
public String getMessageCategory() {
return messageCategory;
}
public void setMessageCategory(String messageCategory) {
this.messageCategory = messageCategory;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getPreEmployeeID() {
return preEmployeeID;
}
public void setPreEmployeeID(String preEmployeeID) {
this.preEmployeeID = preEmployeeID;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitleEn() {
return titleEn;
}
public void setTitleEn(String titleEn) {
this.titleEn = titleEn;
}
public String getTitleImageUrl() {
return titleImageUrl;
}
public void setTitleImageUrl(String titleImageUrl) {
this.titleImageUrl = titleImageUrl;
}
public String getuId() {
return uId;
}
public void setuId(String uId) {
this.uId = uId;
}
}

View File

@ -1,4 +0,0 @@
package com.chint.interfaces.rest.ctrip.dto.search;
public class CarOrderInfoEntity {
}

View File

@ -1,4 +0,0 @@
package com.chint.interfaces.rest.ctrip.dto.search;
public class FlightOrderInfoEntity {
}

View File

@ -1,7 +0,0 @@
package com.chint.interfaces.rest.ctrip.dto.search;
import lombok.Data;
@Data
public class HotelOrderInfoEntity {
}

View File

@ -1,5 +1,9 @@
package com.chint.interfaces.rest.ctrip.dto.search;
import com.chint.interfaces.rest.ctrip.dto.search.car.CarOrderInfoEntity;
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 lombok.Data;
import java.util.List;
@ -8,23 +12,21 @@ import java.util.List;
public class ItineraryEntity {
// 行程单号
private String journeyNO; // 行程单号
private String JourneyNO; // 行程单号
// 酒店订单信息列表
private List<HotelOrderInfoEntity> hotelOrderInfoList; // 酒店订单信息列表
private List<HotelOrderInfoEntity> HotelOrderInfoList; // 酒店订单信息列表
// 航班订单信息列表
private List<FlightOrderInfoEntity> flightOrderInfoList; // 航班订单信息列表
private List<FlightOrderInfoEntity> FlightOrderInfoList; // 航班订单信息列表
// 火车票订单信息列表
private List<TrainOrderInfoEntity> trainOrderInfoList; // 火车票订单信息列表
private List<TrainOrderInfoEntity> TrainOrderInfoList; // 火车票订单信息列表
// 租车订单信息列表
private List<CarOrderInfoEntity> carOrderInfoList; // 租车订单信息列表
private List<CarOrderInfoEntity> CarOrderInfoList; // 租车订单信息列表
// 快捷租车订单信息列表
private List<CarQuickOrderInfoEntity> carQuickOrderInfoList; // 快捷租车订单信息列表
private List<CarQuickOrderInfoEntity> CarQuickOrderInfoList; // 快捷租车订单信息列表
// 接送机租车订单信息列表
private List<DomPickUpCarOrderInfoEntity> domPickUpCarOrderInfoList; // 接送机租车订单信息列表
private List<DomPickUpCarOrderInfoEntity> DomPickUpCarOrderInfoList; // 接送机租车订单信息列表
// 包车租车订单信息列表
private List<DomCharterCarOrderInfoEntity> domCharterCarOrderInfoList; // 包车租车订单信息列表
private List<DomCharterCarOrderInfoEntity> DomCharterCarOrderInfoList; // 包车租车订单信息列表
// 国际火车票订单信息列表
private List<IntlTrainOrderInfoEntity> intlTrainOrderInfoList; // 国际火车票订单信息列表
// Getters and Setters...
private List<IntlTrainOrderInfoEntity> IntlTrainOrderInfoList; // 国际火车票订单信息列表
}

View File

@ -34,5 +34,9 @@ public class SearchOrderRequest {
private String htlSearchTypeExtend; // 酒店查询类型扩展
private String carSearchTypeExtend; // 租车查询类型扩展
public static SearchRequestBuilder builder() {
return new SearchRequestBuilder();
}
// Getters and Setters...
}

View File

@ -9,9 +9,9 @@ import java.util.List;
public class SearchOrderResponse {
// 响应状态
private ResponseStatus status; // 响应状态
private ResponseStatus Status; // 响应状态
// 行程单列表
private List<ItineraryEntity> itineraryList; // 行程单列表
private List<ItineraryEntity> ItineraryList; // 行程单列表
// Getters and Setters...
}

View File

@ -0,0 +1,46 @@
package com.chint.interfaces.rest.ctrip.dto.search;
import com.chint.interfaces.rest.ctrip.dto.Authentication;
public class SearchRequestBuilder {
private SearchOrderRequest request = new SearchOrderRequest();
public SearchRequestBuilder language(String language){
request.setLanguage(language);
return this;
}
public SearchRequestBuilder journeyNo(String journeyNo){
request.setJourneyNo(journeyNo);
return this;
}
public SearchOrderRequest done() {
return request;
}
public AuthInfoBuilder authInfo() {
return new AuthInfoBuilder(this, request);
}
public static class AuthInfoBuilder {
private final SearchRequestBuilder parentBuilder;
private final SearchOrderRequest request;
public AuthInfoBuilder(SearchRequestBuilder parentBuilder, SearchOrderRequest request) {
this.parentBuilder = parentBuilder;
this.request = request;
}
public AuthInfoBuilder details(String appKey, String accessToken) {
Authentication authInfo = new Authentication(appKey, accessToken); // Construct AuthInfo with parameters
request.setAuth(authInfo);
return this;
}
public SearchRequestBuilder done() {
return parentBuilder;
}
}
}

View File

@ -1,4 +0,0 @@
package com.chint.interfaces.rest.ctrip.dto.search;
public class TrainOrderInfoEntity {
}

View File

@ -0,0 +1,19 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单基本信息类
@Data
public class BasicInfo {
private long orderId; // 订单ID
private double estimateAmount; // 预估金额
private double orderAmount; // 订单金额
private double dealAmount; // 成交金额
private String orderStatus; // 订单状态
private String authorizeStatus; // 授权状态
private String paymentStatus; // 支付状态
private String paymentType; // 支付类型
private String feeType; // 费用类型
private String UID; // 用户ID
// Other fields and getters/setters
}

View File

@ -0,0 +1,21 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
import java.util.List;
@Data
public class CarOrderInfoEntity {
private BasicInfo basicInfo; // 基本信息
private OrderProduct orderProduct; // 订单产品
private List<OrderFee> orderFeeList; // 订单费用列表
private OrderInsurance orderInsurance; // 订单保险信息
private OrderInvoice orderInvoice; // 订单发票信息
private PassengerInfo passengerInfo; // 乘客信息
private List<PaymentInfo> paymentInfoList; // 支付信息列表
private List<PaymentSettlement> paymentSettlementList; // 支付结算列表
private List<ChoosedVehicle> choosedVehicleList; // 选择的车辆列表
private OrderConfigInfo orderConfigInfo; // 订单配置信息
private List<PaymentSupply> paymentSupplyList; // 支付供应列表
private OrderPaymentInfo orderPaymentInfo; // 订单支付信息
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 选择的车辆信息类
@Data
class ChoosedVehicle {
private double estimateAmount; // 预估金额
private int vehicleId; // 车辆ID
private String vehicleName; // 车辆名称
// Other fields and getters/setters
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 出发地址信息类
@Data
class DepartAddress {
private String address; // 地址
private String addressDetail; // 地址详情
private String cityId; // 城市ID
// Other fields and getters/setters
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单配置信息类
@Data
class OrderConfigInfo {
private String sceneName; // 场景名称
private String standardName; // 标准名称
private String carTravelSendType; // 汽车出行发送类型
private String currency; // 货币类型
// Other fields and getters/setters
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单费用信息类
@Data
class OrderFee {
private String costScene; // 费用场景
private String feeTypeCode; // 费用类型编码
private String feeName; // 费用名称
private double amount; // 金额
private String orderFeeId; // 订单费用ID
// Other fields and getters/setters
}

View File

@ -0,0 +1,11 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单保险信息类
@Data
class OrderInsurance {
private String productCode; // 产品编码
private String companyId; // 公司ID
// Other fields and getters/setters
}

View File

@ -0,0 +1,11 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单发票信息类
@Data
class OrderInvoice {
private String invoiceId; // 发票ID
private String customerTaxNumber; // 客户税号
// Other fields and getters/setters
}

View File

@ -0,0 +1,7 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
@Data
public class OrderPaymentInfo {
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 订单产品信息类
@Data
public class OrderProduct {
private String vendorOrderId; // 供应商订单ID
private int bookingType; // 预订类型
private String useTime; // 使用时间
private DepartAddress departAddress; // 出发地址信息
private PassengerPosition passengerPosition; // 乘客位置信息
// Other fields and getters/setters
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 乘客信息类
@Data
class PassengerInfo {
private String corpUserId; // 公司用户ID
private String employeeId; // 员工ID
private String intlCode; // 国际代码
private String passengerId; // 乘客ID
// Other fields and getters/setters
}

View File

@ -0,0 +1,11 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 乘客位置信息类
@Data
class PassengerPosition {
private String latitude; // 纬度
private String longitude; // 经度
// Other fields and getters/setters
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 支付信息类
@Data
public class PaymentInfo {
private double amount; // 金额
private String billNo; // 账单号
private String paidTime; // 支付时间
private String paymentCategory; // 支付类别
// Other fields and getters/setters
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 支付结算信息类
@Data
class PaymentSettlement {
private double amount; // 金额
private String feeTypeCode; // 费用类型编码
private String feeTypeName; // 费用类型名称
// Other fields and getters/setters
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.car;
import lombok.Data;
// 支付供应信息类
@Data
class PaymentSupply {
private String paymentSupplyId; // 支付供应ID
private long orderID; // 订单ID
private double serviceAmount; // 服务金额
// Other fields and getters/setters
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
public class BasicInfo {
private String orderID;
private String tripID;
private String orderStatus;
private String orderStatusCode;
private String UID;
// Other fields and getters/setters
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
class DeliveryInfo {
private String deliveryInfo;
private String contactPhone;
private String contactMobile;
private String contactName;
// Other fields and getters/setters
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
public class FlightInfo {
private String sequence;
private String flight;
private String airLineCode;
private String airLineName;
// Other fields and getters/setters
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
public class FlightOrderFeeDetail {
private String transactionType;
private String payType;
private int transactionAmount;
private String payCurrency;
// Other fields and getters/setters
}

View File

@ -0,0 +1,15 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
import java.util.List;
@Data
public class FlightOrderInfoEntity {
private BasicInfo basicInfo;
private DeliveryInfo deliveryInfo;
private List<FlightInfo> flightInfo;
private List<PassengerInfo> passengerInfo;
private List<FlightOrderFeeDetail> flightOrderFeeDetailList;
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
class PassengerBasic {
private String corpEid;
private String passengerName;
private String passengerNamePY;
private String nationalityCode;
private String cardTypeName;
// Other fields and getters/setters
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
import java.util.List;
@Data
public class PassengerInfo {
private PassengerBasic passengerBasic;
private List<SequenceInfo> sequenceInfo;
// Getters and setters
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
import java.util.List;
@Data
class SequenceInfo {
private int sequence;
private List<TicketInfo> ticketInfo;
// Getters and setters
}

View File

@ -0,0 +1,13 @@
package com.chint.interfaces.rest.ctrip.dto.search.flight;
import lombok.Data;
@Data
class TicketInfo {
private String airLineCode;
private String ticketNo;
private String ticketNoSignCode;
private String status;
// Other fields and getters/setters
}

View File

@ -0,0 +1,29 @@
package com.chint.interfaces.rest.ctrip.dto.search.hotel;
import lombok.Data;
@Data
public class ClientInfo {
private int RoomIndex; // 房间索引
private String ClientName; // 客户名
private String EmployeeID; // 员工ID
private String CostCenter1; // 成本中心1
private String CostCenter2; // 成本中心2
private String CostCenter3; // 成本中心3
private String CostCenter4; // 成本中心4
private String CostCenter5; // 成本中心5
private String CostCenter6; // 成本中心6
private String Dept1; // 部门1
private String Dept2; // 部门2
private String Dept3; // 部门3
private String Dept4; // 部门4
// Dept5至Dept10可以根据实际需要添加
private String CheckinTime; // 入住时间
private String CheckoutTime; // 离店时间
private String ActualDepartureTime; // 实际离开时间
private double ShareOrderAmount; // 分摊订单金额
// ClientPreApprovalNo字段的具体类型根据需要确定如果是一个复杂结构可能需要定义一个新的类
private double Price; // 价格
private String Star; // 星级
private double ActualUpperAmount; // 实际上限金额
}

View File

@ -0,0 +1,71 @@
package com.chint.interfaces.rest.ctrip.dto.search.hotel;
import lombok.Data;
import java.util.List;
@Data
public class HotelOrderInfoEntity {
private String OrderId; // 订单ID
private String TripId; // 旅行ID
private String Uid; // 用户ID
private String PreEmployeeId; // 预订员工ID
private String PreEmployeeName; // 预订员工姓名
private String Currency; // 货币类型
private String Amount; // 订单总金额
private String AmountRMB; // 订单金额人民币
private String CustomPayAmount; // 自定义支付金额
private String SettlementAmount; // 结算金额
private String PostAmount; // 邮寄金额
private String PayType; // 支付类型
private String CustomPayCurrency; // 自定义支付货币
private String CustomPayExchange; // 自定义支付汇率
private String SettlementCurrency; // 结算货币
private String SettlementExchange; // 结算汇率
private String IsMixPayment; // 是否混合支付
private String SettlementACCNTAmt; // 结算账户金额
private String SettlementPersonAmt; // 结算个人金额
private String AddedFees; // 额外费用
private String FrontendServiceFee; // 前端服务费
private String HotelType; // 酒店类型
private String HotelName; // 酒店名称
private String HotelEnName; // 酒店英文名称
private String StarLicence; // 星级许可
private String Star; // 星级
private String CustomerEval; // 客户评价
private String Telephone; // 电话号码
private String Address; // 地址
private String StartTime; // 入住开始时间
private String EndTime; // 入住结束时间
private String ProvinceEname; // 省份英文名
private String CityID; // 城市ID
private String CityName; // 城市名称
private String CityEnName; // 城市英文名称
private String RoomName; // 房间名称
private String IsDomestic; // 是否国内
private String RoomType; // 房间类型
private String MealType; // 餐食类型
private String MasterHotelID; // 主酒店ID
private String DistrictID; // 区域ID
private String DistrictName; // 区域名称
private String OrderStatus; // 订单状态
private String OrderDetailStatus; // 订单详细状态
private String OrderDetailStatusName; // 订单详细状态名称
private String OrderDate; // 订单日期
private String LastCancelTime; // 最后取消时间
private String CancelTime; // 取消时间
private String CancelReasonCode; // 取消原因代码
private String CancelReasonDesc; // 取消原因描述
private String FundAccount; // 资金账户
private String SubAccount; // 子账户
private String BalanceType; // 余额类型
private String CorpPayType; // 公司支付类型
private String ContactEmail; // 联系人邮箱
private String ContactName; // 联系人姓名
private String ContactTel; // 联系人电话
private String HotelConfirmNo; // 酒店确认号
private String JourneyNo; // 旅程编号
private String CostCenter; // 成本中心
// 后续字段含义类似可根据实际情况添加注释
private List<ClientInfo> ClientInfo; // 客户信息列表
}

View File

@ -0,0 +1,17 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// AccountPaymentInfo内部类定义
@Data
public class AccountPaymentInfo {
private long DealID;
private int AccountID;
private int SubAccountID;
private String OrderID;
private double Amount;
private String Category;
private String DataChange_CreateTime;
private String TrainRelatedNo;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,25 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// AfterTakeTicket内部类定义
@Data
public class AfterTakeTicket {
private long AfterTakeTicketId;
private String CompanyId;
private String CompanyName;
private String ContactName;
private String ContactPhone;
private String CountryCode;
private String Address;
private String DeliverTime;
private String NoticeCtripTime;
private String CtripTakeTicketTime;
private String CtripDeliverTime;
private String TakeType;
private String TakeTicketStatus;
private String FailReason;
private String ExpressCompany;
private String ExpressNo;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
@Data
public class FundAccountDealInfo {
private double Amount;
private String Category;
private long DealID;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// OrderPayment内部类定义
@Data
public class OrderPayment {
private String PaymentType;
private String FeeCode;
private double FeeAmount;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,24 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// PassengerInfo内部类定义
@Data
public class PassengerInfo {
private long PassengerID;
private String PassengerName;
private String IdentityTypeName;
private String IdentityNo;
private String Birthday;
private String TicketTypeName;
private int InsuranceProductID;
private int PurchaseNumber;
private int TicketPresentNum;
private String CostCenter1;
private String CostCenter2;
private String CostCenter3;
private String CostCenter4;
private String EmployeeID;
private String CorpUserID;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,14 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// PaymentInfo内部类定义
@Data
public class PaymentInfo {
private double Amount;
private double ExchangeRate;
private String Currency;
private String DealType;
private String PayWayID;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,12 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
import java.util.List;
// SettlementInfo内部类定义
@Data
public class SettlementInfo {
private List<FundAccountDealInfo> FundAccountDealInfos;
private List<SettlementInfoDetail> SettlementInfos;
}

View File

@ -0,0 +1,23 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
@Data
public class SettlementInfoDetail {
private long OrderTicketID;
private long PassengerID;
private String PassengerName;
private double TicketPrice;
private double InsuranceFee;
private double ServiceFee;
private double RefundTicketFee;
private double DeliverFee;
private double PaperTicketFee;
private double ChangeServiceFee;
private double GrabServiceFee;
private long DealID;
private String TicketInfoID;
private double AfterTakeTicketFee;
private double PurchaseFee;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,21 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// TicketInfo内部类定义
@Data
public class TicketInfo {
private long TicketInfoID;
private String TrainName;
private String DepartureCityName;
private String DepartureDateTime;
private String ArrivalCityName;
private String ArrivalDateTime;
private String FirstSeatTypeName;
private double TicketPrice;
private String ElectronicOrderNo;
private double ServiceFee;
private String TicketEntrance;
private String DealID;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,44 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
@Data
public class TrainBasicInfo {
private String OrderID;
private String TripID;
private String EmployeeID;
private double OrderAmount;
private double DealAmount;
private int TotalQuantity;
private String Remark;
private boolean NeedInvoice;
private boolean IsIncludeInsuranceInvoice;
private int OrderTicketType;
private String OrderTicketTypeDesc;
private String OrderStatus;
private String OrderType;
private String OrderTypeDesc;
private double ServiceFee;
private String ContactName;
private String ContactMobile;
private String ContactEmail;
private String UID;
private String UserName;
private String RefundTicketStatus;
private String PaymentType;
private String DataChange_CreateTime;
private double DeliverFee;
private double PaperTicketFee;
private String AccountName;
private String ConfirmPerson;
private String AuditResult;
private String AuditResultDesc;
private String OrderStatusName;
private double ChangeServiceFee;
private String ServerFrom;
private String CorporationId;
private boolean NeedBigInvoice;
private String CountryCode;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,24 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
// CorpOrderInfo内部类定义
@Data
public class TrainCorpOrderInfo {
private String CorporationID;
private int AccountID;
private int SubAccountID;
private String CorpPayType;
private String CostCenter1;
private String CostCenter2;
private String CostCenter3;
private String CostCenter4;
private String JourneyReason;
private String Project;
private String JouneryID;
private String JourneyID;
private String CorporationName;
private String RcCodeID;
private String RcCodeName;
// 可以根据需要继续添加更多的字段
}

View File

@ -0,0 +1,15 @@
package com.chint.interfaces.rest.ctrip.dto.search.train;
import lombok.Data;
@Data
public class TrainDeliveryInfo {
private String ShipAddress;
private String ShipAddressDetail;
private String ShipZipCode;
private String ShipReceiverMobile;
private String ShipReceiverName;
private String ShipReceiverTel;
private String CountryCode;
// 可以根据需要继续添加更多的字段
}

Some files were not shown because too many files have changed in this diff Show More