Merge remote-tracking branch 'gitea/dev' into dev
# Conflicts: # src/main/java/com/chint/application/out/SupplierLoginController.java # src/main/java/com/chint/application/services/OrderApplicationService.java # src/main/java/com/chint/infrastructure/constant/Constant.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/ItineraryEntity.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/car/BasicInfo.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/car/OrderProduct.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/car/PaymentInfo.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/flight/BasicInfo.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/flight/FlightInfo.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/flight/FlightOrderFeeDetail.java # src/main/java/com/chint/interfaces/rest/ctrip/dto/search/flight/PassengerInfo.java # src/test/java/com/chint/CTripTest.java # src/test/java/com/chint/RouteApplicationTests.java
This commit is contained in:
commit
ec68c44112
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -29,7 +30,7 @@ public class SupplierLoginController {
|
|||
}
|
||||
|
||||
@ApiOperation("单点登录同程-PC")
|
||||
@PostMapping("/ly/login")
|
||||
@PostMapping("/ly/login/pc")
|
||||
public Result<LYRedirectUrlResponse> lyLoginPC() {
|
||||
//登录
|
||||
LYRedirectUrlResponse data = supplierLoginService.lyLoginPC();
|
||||
|
@ -42,4 +43,10 @@ public class SupplierLoginController {
|
|||
return Result.Success(SUCCESS, supplierLoginService.cTripLogin());
|
||||
}
|
||||
|
||||
@ApiOperation("单点登录携程-PC")
|
||||
@PostMapping("/CTrip/login/pc")
|
||||
public Result<PCResponse> cTripLoginPC() {
|
||||
return Result.Success(SUCCESS, supplierLoginService.cTripLoginPC());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
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;
|
||||
|
@ -11,7 +10,6 @@ import com.chint.domain.repository.RouteRepository;
|
|||
import com.chint.domain.service.OrderDomainService;
|
||||
import com.chint.domain.value_object.*;
|
||||
import com.chint.infrastructure.echo_framework.command.Command;
|
||||
import com.chint.interfaces.rest.ly.dto.carorderdatapushback.Order;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
@ -39,10 +37,9 @@ 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)){
|
||||
if (!order.getOrderStatus().equals(ORDER_STATUS_PREPARE)) {
|
||||
throw new OrderException(DATA_INVALID);
|
||||
}
|
||||
} else {
|
||||
|
@ -51,9 +48,7 @@ public class OrderApplicationService {
|
|||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -68,17 +63,30 @@ 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 payed(Long legId, PayLegData data){
|
||||
public void orderedToLeg(UpdateLegData updateLegData) {
|
||||
Command.of(LegOrderedCommand.class)
|
||||
.legId(updateLegData.getLegId())
|
||||
.orderDetailId(updateLegData.getOrderDetailId())
|
||||
.sendToQueue();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void payed(Long legId, PayLegData data) {
|
||||
Command.of(LegPayedCommand.class).legId(legId).data(data).sendToQueue();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void finished(Long legId, FinishLegData data){
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -33,4 +34,7 @@ public class SupplierLoginService {
|
|||
public H5Response cTripLogin() {
|
||||
return cTripLoginRequest.hSingleLogin();
|
||||
}
|
||||
public PCResponse cTripLoginPC() {
|
||||
return cTripLoginRequest.authLogin();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,17 +164,17 @@ public class Leg {
|
|||
}
|
||||
|
||||
// 事件类型为负数,代表是可以任何时机都可进行的事件
|
||||
if(event.getEventType() < 0) {
|
||||
if (event.getEventType() < 0) {
|
||||
eventList.add(event);
|
||||
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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
// 根据需要添加构造函数、getter、setter等
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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; // 或其他适当的默认状态
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package com.chint.domain.repository;
|
||||
|
||||
import com.chint.domain.aggregates.order.OrderDetail;
|
||||
|
||||
public interface OrderDetailRepository {
|
||||
OrderDetail findById(Long orderDetailId);
|
||||
}
|
|
@ -9,6 +9,8 @@ public interface RouteRepository {
|
|||
|
||||
RouteOrder findByFakeOrderNo(String fakeOrderNo);
|
||||
|
||||
RouteOrder findByActualOrderNo(String actualOrderNo);
|
||||
|
||||
RouteOrder save(RouteOrder routeOrder);
|
||||
|
||||
PageResult<RouteOrder> pageQuery(OrderQueryData orderQueryData);
|
||||
|
|
|
@ -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;
|
||||
|
@ -19,7 +21,7 @@ import static com.chint.infrastructure.constant.Constant.ORDER_STATUS_APPROVAL;
|
|||
import static com.chint.infrastructure.constant.Constant.ORDER_STATUS_PREPARE;
|
||||
|
||||
@Service
|
||||
public class LegEventHandler implements LegEventService{
|
||||
public class LegEventHandler implements LegEventService {
|
||||
|
||||
@Autowired
|
||||
private SyncAdapter syncAdapter;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
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 java.util.Optional;
|
||||
|
||||
import static com.chint.infrastructure.constant.Constant.*;
|
||||
|
||||
|
||||
@Component
|
||||
public class CTripOrderDataAdapter implements OrderDataAdapter {
|
||||
@Override
|
||||
public Optional<OrderLegData> adapt(SupplierCallbackData supplierData) {
|
||||
//这里的查询结果的订单查询 ,需要根据订单单号来进行查询的结果,因此只会返回一个订单信息和对应的行程规划单
|
||||
SearchOrderResponse searchOrderResponse = (SearchOrderResponse) supplierData.getData();
|
||||
List<ItineraryEntity> itineraryList = searchOrderResponse.getItineraryList();
|
||||
if (!itineraryList.isEmpty()) {
|
||||
ItineraryEntity itineraryEntity = itineraryList.get(0);
|
||||
|
||||
OrderLegData.Builder builder = OrderLegData.builder()
|
||||
.actualOrderNo(itineraryEntity.getJourneyNO())
|
||||
.supplierName(SUPPLIER_C_TRIP);
|
||||
|
||||
OrderLegData.Builder elementList = findSingleElementList(itineraryEntity, builder);
|
||||
if (elementList == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(elementList.build());
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
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.ly.dto.search.response.filght.FlightOrderDetail;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.train.TrainDetailResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static com.chint.infrastructure.constant.Constant.LEG_TYPE_TRAIN;
|
||||
import static com.chint.infrastructure.constant.Constant.SUPPLIER_L_Y;
|
||||
|
||||
@Component
|
||||
public class LYOrderDataAdapter implements OrderDataAdapter {
|
||||
@Override
|
||||
public Optional<OrderLegData> adapt(SupplierCallbackData supplierData) {
|
||||
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
private Optional<OrderLegData> trainDataProcess(TrainDetailResponse trainDetailResponse) {
|
||||
TrainDetailResponse.TrainDetailData data = trainDetailResponse.getData();
|
||||
return Optional.of(
|
||||
OrderLegData.builder()
|
||||
.productType(LEG_TYPE_TRAIN)
|
||||
.orderNo(data.getOrderNo())
|
||||
.price(String.valueOf( data.getTotalAmount()))
|
||||
.actualOrderNo(data.getOutOrderNo())
|
||||
.supplierName(SUPPLIER_L_Y)
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private Optional<OrderLegData> FlightDataProcess(FlightOrderDetail flightOrderDetail) {
|
||||
FlightOrderDetail.Data data = flightOrderDetail.getData();
|
||||
return Optional.of(
|
||||
OrderLegData.builder()
|
||||
.productType(LEG_TYPE_TRAIN)
|
||||
// .orderNo(data.get())
|
||||
// .price(String.valueOf( data.getTotalAmount()))
|
||||
// .actualOrderNo(data.getOutOrderNo())
|
||||
.supplierName(SUPPLIER_L_Y)
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package com.chint.domain.service.supplier;
|
||||
|
||||
import com.chint.domain.value_object.OrderLegData;
|
||||
import com.chint.domain.value_object.SupplierCallbackData;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public interface OrderDataAdapter {
|
||||
Optional<OrderLegData> adapt(SupplierCallbackData supplierData);
|
||||
}
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package com.chint.domain.service.supplier;
|
||||
|
||||
import com.chint.domain.value_object.SupplierCallbackData;
|
||||
|
||||
public interface SupplierService {
|
||||
void handleSupplierCallback(SupplierCallbackData callbackData);
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package com.chint.domain.service.supplier;
|
||||
|
||||
import com.chint.application.commands.RouteAddOrderCommand;
|
||||
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) {
|
||||
orderDataAdapterSelector
|
||||
.of(callbackData.getSupplierName())
|
||||
.adapt(callbackData)
|
||||
.ifPresent(data ->
|
||||
Command.of(RouteAddOrderCommand.class).data(data).sendToQueue());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package com.chint.domain.value_object;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SupplierCallbackData {
|
||||
private String supplierName;
|
||||
private String employeeNo;
|
||||
private Integer productType; //用于区分同程搜索数据
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.chint.domain.value_object;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UpdateLegData {
|
||||
private Long LegId;
|
||||
private Long orderDetailId;
|
||||
}
|
|
@ -141,7 +141,7 @@ 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";
|
||||
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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> {
|
||||
}
|
|
@ -14,4 +14,6 @@ public interface JdbcRouteRepository extends CrudRepository<RouteOrder, Long> {
|
|||
|
||||
RouteOrder findByApproveOrderNo_FakeOrderNo(String approveOrderNo_fakeOrderNo);
|
||||
|
||||
RouteOrder findByApproveOrderNo_ActualOrderNo(String approveOrderNo_actualOrderNo);
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -29,6 +29,4 @@ public class ItineraryEntity {
|
|||
private List<DomCharterCarOrderInfoEntity> DomCharterCarOrderInfoList; // 包车租车订单信息列表
|
||||
// 国际火车票订单信息列表
|
||||
private List<IntlTrainOrderInfoEntity> IntlTrainOrderInfoList; // 国际火车票订单信息列表
|
||||
|
||||
// Getters and Setters...
|
||||
}
|
|
@ -4,7 +4,7 @@ import lombok.Data;
|
|||
|
||||
// 订单基本信息类
|
||||
@Data
|
||||
class BasicInfo {
|
||||
public class BasicInfo {
|
||||
private long orderId; // 订单ID
|
||||
private double estimateAmount; // 预估金额
|
||||
private double orderAmount; // 订单金额
|
||||
|
|
|
@ -4,7 +4,7 @@ import lombok.Data;
|
|||
|
||||
// 订单产品信息类
|
||||
@Data
|
||||
class OrderProduct {
|
||||
public class OrderProduct {
|
||||
private String vendorOrderId; // 供应商订单ID
|
||||
private int bookingType; // 预订类型
|
||||
private String useTime; // 使用时间
|
||||
|
|
|
@ -4,7 +4,7 @@ import lombok.Data;
|
|||
|
||||
// 支付信息类
|
||||
@Data
|
||||
class PaymentInfo {
|
||||
public class PaymentInfo {
|
||||
private double amount; // 金额
|
||||
private String billNo; // 账单号
|
||||
private String paidTime; // 支付时间
|
||||
|
|
|
@ -4,7 +4,7 @@ package com.chint.interfaces.rest.ctrip.dto.search.flight;
|
|||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
class BasicInfo {
|
||||
public class BasicInfo {
|
||||
private String orderID;
|
||||
private String tripID;
|
||||
private String orderStatus;
|
||||
|
|
|
@ -4,7 +4,7 @@ package com.chint.interfaces.rest.ctrip.dto.search.flight;
|
|||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
class FlightInfo {
|
||||
public class FlightInfo {
|
||||
private String sequence;
|
||||
private String flight;
|
||||
private String airLineCode;
|
||||
|
|
|
@ -3,7 +3,7 @@ package com.chint.interfaces.rest.ctrip.dto.search.flight;
|
|||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
class FlightOrderFeeDetail {
|
||||
public class FlightOrderFeeDetail {
|
||||
private String transactionType;
|
||||
private String payType;
|
||||
private int transactionAmount;
|
||||
|
|
|
@ -6,7 +6,7 @@ import lombok.Data;
|
|||
import java.util.List;
|
||||
|
||||
@Data
|
||||
class PassengerInfo {
|
||||
public class PassengerInfo {
|
||||
private PassengerBasic passengerBasic;
|
||||
private List<SequenceInfo> sequenceInfo;
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ public class LYLoginRequest {
|
|||
@Autowired
|
||||
private LYPostRequest postRequest;
|
||||
|
||||
private String loginUrl = L_Y_BASE_URL + L_Y_LOGIN_PATH;
|
||||
private final String loginUrl = L_Y_BASE_URL + L_Y_LOGIN_PATH;
|
||||
|
||||
public LYRedirectUrlResponse login(Integer entrance) {
|
||||
User currentUser = BaseContext.getCurrentUser();
|
||||
|
|
|
@ -19,7 +19,7 @@ public class LYPostRequest {
|
|||
@Autowired
|
||||
private LYTokenRequest lyTokenRequest;
|
||||
|
||||
private String mySecret = L_Y_SECRET;
|
||||
private final String mySecret = L_Y_SECRET;
|
||||
|
||||
public <T> T post(String url, LYBaseRequest jsonRequest, Class<T> responseType) {
|
||||
String token = lyTokenRequest.loadToken();
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
package com.chint.interfaces.rest.ly;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.search.request.LyOrderDetailRequest;
|
||||
import com.chint.interfaces.rest.ly.dto.search.request.LySearchRequest;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.filght.FlightListResponse;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.filght.FlightOrderDetail;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.hotel.HotelDetailResponse;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.hotel.HotelListResponse;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.train.TrainDetailResponse;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.train.TrainListResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import static com.chint.infrastructure.constant.Constant.*;
|
||||
|
||||
@Component
|
||||
public class LYSearchRequest {
|
||||
|
||||
private final String flightListUrl = L_Y_BASE_URL + L_Y_FLIGHT_LIST_PATH;
|
||||
private final String flightDetailUrl = L_Y_BASE_URL + L_Y_FLIGHT_DETAIL_PATH;
|
||||
private final String trainListUrl = L_Y_BASE_URL + L_Y_TRAIN_LIST_PATH;
|
||||
private final String trainDetailUrl = L_Y_BASE_URL + L_Y_TRAIN_DETAIL_PATH;
|
||||
private final String hotelListUrl = L_Y_BASE_URL + L_Y_HOTEL_LIST_PATH;
|
||||
private final String hotelDetailUrl = L_Y_BASE_URL + L_Y_HOTEL_DETAIL_PATH;
|
||||
|
||||
@Autowired
|
||||
private LYPostRequest postRequest;
|
||||
|
||||
public FlightListResponse getFlightOrderListByOrderId(String travelApplyNo) {
|
||||
LySearchRequest lySearchRequest = LySearchRequest.of(travelApplyNo);
|
||||
return postRequest.post(flightListUrl, lySearchRequest, FlightListResponse.class);
|
||||
}
|
||||
|
||||
public FlightOrderDetail getFlightOrderDetail(String orderNo) {
|
||||
LyOrderDetailRequest lyOrderDetailRequest = LyOrderDetailRequest.of(orderNo);
|
||||
return postRequest.post(flightDetailUrl, lyOrderDetailRequest, FlightOrderDetail.class);
|
||||
}
|
||||
|
||||
public TrainListResponse getTrainOrderListByOrderId(String travelApplyNo) {
|
||||
LySearchRequest lySearchRequest = LySearchRequest.of(travelApplyNo);
|
||||
return postRequest.post(trainListUrl, lySearchRequest, TrainListResponse.class);
|
||||
}
|
||||
|
||||
public TrainDetailResponse getTrainOrderDetail(String orderNo) {
|
||||
LyOrderDetailRequest lyOrderDetailRequest = LyOrderDetailRequest.of(orderNo);
|
||||
return postRequest.post(trainDetailUrl, lyOrderDetailRequest, TrainDetailResponse.class);
|
||||
}
|
||||
|
||||
public HotelListResponse getHotelOrderListByOrderId(String travelApplyNo) {
|
||||
LySearchRequest lySearchRequest = LySearchRequest.of(travelApplyNo);
|
||||
return postRequest.post(hotelListUrl, lySearchRequest, HotelListResponse.class);
|
||||
}
|
||||
|
||||
public HotelDetailResponse getHotelOrderDetail(String orderNo) {
|
||||
LyOrderDetailRequest lyOrderDetailRequest = LyOrderDetailRequest.of(orderNo);
|
||||
return postRequest.post(hotelDetailUrl, lyOrderDetailRequest, HotelDetailResponse.class);
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@ import static com.chint.infrastructure.constant.Constant.*;
|
|||
@Component
|
||||
public class LYTokenRequest {
|
||||
|
||||
private String tokenUrl = L_Y_BASE_URL + L_Y_TOKEN_PATH;
|
||||
private final String tokenUrl = L_Y_BASE_URL + L_Y_TOKEN_PATH;
|
||||
|
||||
@Autowired
|
||||
private PostRequest postRequest;
|
||||
|
|
|
@ -26,7 +26,7 @@ public class LYUserRequest {
|
|||
@Autowired
|
||||
private UserHttpRequest userHttpRequest;
|
||||
|
||||
private String userUrl = L_Y_BASE_URL + L_Y_USER_PATH;
|
||||
private final String userUrl = L_Y_BASE_URL + L_Y_USER_PATH;
|
||||
|
||||
public boolean saveCurrentUser() {
|
||||
System.out.println("saveCurrentUser");
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
package com.chint.interfaces.rest.ly.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LYBaseResponse {
|
||||
private boolean success;
|
||||
private String errorCode;
|
||||
private String errorMessage;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package com.chint.interfaces.rest.ly.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LYSearchPageInfo {
|
||||
private Integer pageIndex;
|
||||
private Integer pageSize;
|
||||
private Integer pageCount;
|
||||
private Integer dataCount;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.request;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseRequest;
|
||||
import lombok.Data;
|
||||
|
||||
import static com.chint.infrastructure.constant.Constant.L_Y_APP_ID;
|
||||
|
||||
@Data
|
||||
public class LyOrderDetailRequest extends LYBaseRequest {
|
||||
private LyOrderDetailRequestParam param;
|
||||
|
||||
public static LyOrderDetailRequest of(String orderNo) {
|
||||
LyOrderDetailRequestParam lyOrderDetailRequestParam = new LyOrderDetailRequestParam();
|
||||
LyOrderDetailRequest lyOrderDetailRequest = new LyOrderDetailRequest();
|
||||
lyOrderDetailRequestParam.setOrderNo(orderNo);
|
||||
lyOrderDetailRequestParam.setOutEnterpriseId(L_Y_APP_ID);
|
||||
lyOrderDetailRequest.setParam(lyOrderDetailRequestParam);
|
||||
return lyOrderDetailRequest;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LyOrderDetailRequestParam {
|
||||
private String orderNo;
|
||||
private String outOrderNo;
|
||||
private String orderSerialNo;
|
||||
private String businessTravelOrderNo;
|
||||
private String outEnterpriseId;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.request;
|
||||
|
||||
import com.chint.infrastructure.util.BaseContext;
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseRequest;
|
||||
import lombok.Data;
|
||||
|
||||
import static com.chint.infrastructure.constant.Constant.L_Y_APP_ID;
|
||||
|
||||
@Data
|
||||
public class LySearchRequest extends LYBaseRequest {
|
||||
private Integer errorType;
|
||||
private LySearchRequestParam param;
|
||||
|
||||
public static LySearchRequest of(String travelApplyNo) {
|
||||
LySearchRequestParam lySearchRequestParam = new LySearchRequestParam();
|
||||
lySearchRequestParam.setOutEmployeeId(String.valueOf(
|
||||
BaseContext.getCurrentUser().getEmployeeNo()
|
||||
));
|
||||
lySearchRequestParam.setPageIndex(1);
|
||||
lySearchRequestParam.setPageSize(9999);
|
||||
lySearchRequestParam.setOutEnterpriseId(L_Y_APP_ID);
|
||||
lySearchRequestParam.setTravelApplyNo(travelApplyNo);
|
||||
LySearchRequest lySearchRequest = new LySearchRequest();
|
||||
lySearchRequest.setParam(lySearchRequestParam);
|
||||
return lySearchRequest;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LySearchRequestParam {
|
||||
private String outEnterpriseId;
|
||||
private String outEmployeeId;
|
||||
private String bookStartTime;
|
||||
private String bookEndTime;
|
||||
private String travelApplyNo;
|
||||
private Integer pageIndex;
|
||||
private Integer pageSize;
|
||||
private Integer queryTravelType;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.filght;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseResponse;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class FlightListResponse extends LYBaseResponse {
|
||||
private List<FlightOrder> data;
|
||||
@Data
|
||||
private static class FlightOrder {
|
||||
private String orderSerialNo; // 机票订单号
|
||||
private String originalOrderNo; // 原订单号(祖先单)
|
||||
private String parentOrderSerialNo; // 父订单号
|
||||
private Integer orderType; // 订单类型 0.国际 1.国内
|
||||
private String travelApplyNo; // 外部出差申请单号
|
||||
private Integer travelType; // 差旅类型 1.因公 2.因私
|
||||
private Integer payType; // 支付方式 1.公司授信 2.个人支付 3.组合支付
|
||||
private String outEmployeeId; // 外部员工ID
|
||||
private Double totalPrice; // 订单总价
|
||||
private Integer orderStatus; // 订单状态
|
||||
private String orderStatusText; // 订单状态文案
|
||||
private Boolean isChangeOrder; // 是否改签单
|
||||
private Boolean isRefundOrder; // 是否退票单
|
||||
private String bookDate; // 预订时间
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,281 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.filght;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseResponse;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class FlightOrderDetail extends LYBaseResponse {
|
||||
private Data data;
|
||||
|
||||
// Getters and Setters
|
||||
@lombok.Data
|
||||
public static class Data {
|
||||
private OrderDetails orderDetails;
|
||||
private List<FlightSegment> flightSegmentList;
|
||||
private List<Passenger> passengerList;
|
||||
private TravelData travelData;
|
||||
private List<PriceVar> priceVar;
|
||||
private List<Approval> approvalList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class OrderDetails {
|
||||
private String orderSerialNo;
|
||||
private String originalOrderNo;
|
||||
private String parentOrderSerialNo;
|
||||
private String outEmployeeId;
|
||||
private String employeeCode;
|
||||
private String relationId;
|
||||
private int orderStatus;
|
||||
private String orderStatusText;
|
||||
private String ticketOutLimitTime;
|
||||
private int isNeedTransfer;
|
||||
private int payStatus;
|
||||
private List<Contact> contact;
|
||||
private double totalPrice;
|
||||
private double servicePrice;
|
||||
private double afterSettlementServicePrice;
|
||||
private String pnr;
|
||||
private String fullPnrNo;
|
||||
private String memberId;
|
||||
private String reason;
|
||||
private int travelType;
|
||||
private String travelOrderNo;
|
||||
private int orderType;
|
||||
private int voyageType;
|
||||
private String ticketTime;
|
||||
private int payType;
|
||||
private String bookDate;
|
||||
private String payTime;
|
||||
private boolean isChangeOrder;
|
||||
private boolean isRefundOrder;
|
||||
private String outEnterpriseId;
|
||||
private FlightOrderRefundInfo flightOrderRefundInfo;
|
||||
private String changeReason;
|
||||
private String changeNote;
|
||||
private double adjustTotalDiffPrice;
|
||||
private List<LowestPrice> lowestPriceList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Contact {
|
||||
private String contactName;
|
||||
private String contactPhone;
|
||||
private String contactEmail;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class FlightOrderRefundInfo {
|
||||
private int refundType;
|
||||
private String refundTicketTime;
|
||||
private String refundDate;
|
||||
private double refundPrice;
|
||||
private double refundFee;
|
||||
private double refundServiceFee;
|
||||
private double afterSettlementRefundServicePrice;
|
||||
private String refundReason;
|
||||
private String refundNote;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class LowestPrice {
|
||||
private int type;
|
||||
private double ticketPrice;
|
||||
private String flightNo;
|
||||
private String cabinCode;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class FlightSegment {
|
||||
private String flightNo;
|
||||
private String carrier;
|
||||
private String airline;
|
||||
private String airlineLogoUrl;
|
||||
private String departCity;
|
||||
private String departAirport;
|
||||
private String departAirportCode;
|
||||
private String departTerminal;
|
||||
private String departTimeFull;
|
||||
private String departTime;
|
||||
private String arriveTimeFull;
|
||||
private String arriveTime;
|
||||
private String arriveCity;
|
||||
private String arriveAirport;
|
||||
private String arriveAirportCode;
|
||||
private String arriveTerminal;
|
||||
private int days;
|
||||
private String flightModel;
|
||||
private String meal;
|
||||
private int stopCount;
|
||||
private List<Stop> stopList;
|
||||
private int isCheckIn;
|
||||
private int isFollowChange;
|
||||
private int isOld;
|
||||
private int codeShare;
|
||||
private String shareNum;
|
||||
private String shareAirlineName;
|
||||
private String shareAirlineLogoUrl;
|
||||
private String seatCode;
|
||||
private String seatName;
|
||||
private String seatDiscount;
|
||||
private Rule rule;
|
||||
private String segmentId;
|
||||
private String cabinClassCode;
|
||||
private int segmentIndex;
|
||||
private int mileAge;
|
||||
private String departCountryCode;
|
||||
private String arriveCountryCode;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Stop {
|
||||
private String airportCode;
|
||||
private String time;
|
||||
private String airport;
|
||||
private String airportCityName;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Rule {
|
||||
private String modifyStipulate;
|
||||
private String tips;
|
||||
private List<RulePoint> rulePointList;
|
||||
private String seatCode;
|
||||
private String seatName;
|
||||
private double seatPrice;
|
||||
private String baggage;
|
||||
private int changeRule;
|
||||
private int refundRule;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class RulePoint {
|
||||
private int time;
|
||||
private String content;
|
||||
private double refundFeePercent;
|
||||
private double refundFee;
|
||||
private double modifyFeePercent;
|
||||
private double modifyFee;
|
||||
private String modifyStipulate;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Passenger {
|
||||
private String outEmployeeId;
|
||||
private String employeeCode;
|
||||
private String passengerId;
|
||||
private String parentPassengerId;
|
||||
private int passengerStatus;
|
||||
private String ticketNo;
|
||||
private double salesPrice;
|
||||
private double parPrice;
|
||||
private double fuelTax;
|
||||
private double airportTax;
|
||||
private double insurancePrice;
|
||||
private String passengerName;
|
||||
private String contractPhone;
|
||||
private int passengerType;
|
||||
private int identityType;
|
||||
private String identityNo;
|
||||
private String birthday;
|
||||
private int gender;
|
||||
private String reason;
|
||||
private double changePrice;
|
||||
private double changeFee;
|
||||
private double changeServiceFee;
|
||||
private double afterSettlementChangeServicePrice;
|
||||
private boolean canChange;
|
||||
private boolean canRefund;
|
||||
private String changeOrderSerialNo;
|
||||
private String refundOrderSerialNo;
|
||||
private double serviceFee;
|
||||
private double afterSettlementServiceFee;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class TravelData {
|
||||
private String oaNo;
|
||||
private String travelApplyNo;
|
||||
private String travelRemark;
|
||||
private List<SubmitItem> submitItemList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class SubmitItem {
|
||||
private String itemCode;
|
||||
private String itemTitle;
|
||||
private String itemTitleEn;
|
||||
private String itemContent;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class PriceVar {
|
||||
private String priceVarNo;
|
||||
private double totalPriceVar;
|
||||
private int payType;
|
||||
private int priceVarType;
|
||||
private String diffReson;
|
||||
private String priceVarTime;
|
||||
private List<AdjustPassenger> adjustPassengerList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class AdjustPassenger {
|
||||
private String outEmployeeId;
|
||||
private String passengerId;
|
||||
private String ticketNo;
|
||||
private String passengerName;
|
||||
private double salesPriceVar;
|
||||
private double parPriceVar;
|
||||
private double fuelTaxVar;
|
||||
private double airportTaxVar;
|
||||
private double changePriceVar;
|
||||
private double changeFeeVar;
|
||||
private double changeServiceFeeVar;
|
||||
private double afterChangeServiceFeeVar;
|
||||
private double serviceFeeVar;
|
||||
private double afterServiceFeeVar;
|
||||
private double refundServiceFeeVar;
|
||||
private double afterRefundServiceFeeVar;
|
||||
private double refundFeeVar;
|
||||
private double refundPriceVar;
|
||||
private double airportTaxDiffVar;
|
||||
private double fuelTaxDiffVar;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Approval {
|
||||
private int orderType;
|
||||
private List<Approver> approverList;
|
||||
private List<String> approveOrderNoList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Approver {
|
||||
private String outEmployeeId;
|
||||
private String approverName;
|
||||
private int level;
|
||||
private String approvalResult;
|
||||
private String approvalTime;
|
||||
private String approvalRemark;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
}
|
|
@ -0,0 +1,239 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.hotel;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.hotelorderdatapushbach.ContactPerson;
|
||||
import com.chint.interfaces.rest.ly.dto.hotelorderdatapushbach.RefundInfo;
|
||||
import com.chint.interfaces.rest.ly.dto.hotelorderdatapushbach.Resident;
|
||||
import com.chint.interfaces.rest.ly.dto.search.response.filght.FlightOrderDetail;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class HotelDetailResponse {
|
||||
private Data data;
|
||||
|
||||
// Getters and Setters
|
||||
|
||||
@lombok.Data
|
||||
public static class Data {
|
||||
private OrderInfo orderInfo;
|
||||
private HotelInfo hotelInfo;
|
||||
private List<DayPrice> dayPrices;
|
||||
private List<ContactPerson> contactPersons;
|
||||
private List<Resident> residentList;
|
||||
private List<Room> roomList;
|
||||
private List<RefundInfo> refundInfoList;
|
||||
private FlightOrderDetail.TravelData travelData;
|
||||
private List<OrderGiftInfo> orderGiftInfoList;
|
||||
private List<PriceVarInfo> priceVarInfoList;
|
||||
private List<Approval> approvalList;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class OrderInfo {
|
||||
private String orderSerialNo;
|
||||
private String travelOrderNo;
|
||||
private String businessTravelOrderNo;
|
||||
private int protocolType;
|
||||
private double totalStandardPrice;
|
||||
private double saveTotalPrice;
|
||||
private int orderStatus;
|
||||
private String orderStatusDesc;
|
||||
private int payStatus;
|
||||
private boolean isSelf;
|
||||
private String createTime;
|
||||
private double totalPrice;
|
||||
private double totalCost;
|
||||
private double roomTotalPrice;
|
||||
private double servicePrice;
|
||||
private double afterSettlementServicePrice;
|
||||
private String contactName;
|
||||
private String contactPhone;
|
||||
private String contactEmail;
|
||||
private String refundRule;
|
||||
private String refundIntro;
|
||||
private String servicePhone;
|
||||
private boolean canRefund;
|
||||
private boolean canChange;
|
||||
private double payPrice;
|
||||
private double personalPrice;
|
||||
private double companyPrice;
|
||||
private String supplierOrderCreateTime;
|
||||
private String employeeName;
|
||||
private String enterpriseName;
|
||||
private String outEmployeeId;
|
||||
private String employeeCode;
|
||||
private int orderType;
|
||||
private int cancelType;
|
||||
private String cancelTime;
|
||||
private String originalCheckInDate;
|
||||
private String originalCheckOutDate;
|
||||
private String confirmNos;
|
||||
private String hotelConfirmNos;
|
||||
private int refundReason;
|
||||
private int travelType;
|
||||
private long departmentId;
|
||||
private String departmentName;
|
||||
private String cancelReasons;
|
||||
private boolean isGuarantee;
|
||||
private int guaranteeMode;
|
||||
private int guaranteePriceType;
|
||||
private double guaranteePrice;
|
||||
private CreditCardInfo creditCardInfo;
|
||||
private boolean isGuaranteeRate;
|
||||
private String travelApplyNo;
|
||||
private String outTravelApplyNo;
|
||||
private String outEnterpriseId;
|
||||
private int payType;
|
||||
private int paymentType;
|
||||
private int customerInvoiceCode;
|
||||
private String customerInvoiceDesc;
|
||||
private double adjustTotalDiffPrice;
|
||||
private int halfDayRoom;
|
||||
private double businessAmount;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class CreditCardInfo {
|
||||
private String cardNumber;
|
||||
private String cardType;
|
||||
private String holderName;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
|
||||
// Definitions for other nested classes (HotelInfo, DayPrice, etc.) follow the same structure
|
||||
@lombok.Data
|
||||
public static class HotelInfo {
|
||||
private String orderSerialNo;
|
||||
private String hotelId;
|
||||
private String hotelName;
|
||||
private String hotelAddress;
|
||||
private long cityId;
|
||||
private String cityName;
|
||||
private String checkInDate;
|
||||
private String checkOutDate;
|
||||
private String hotelTel;
|
||||
private int checkInTime;
|
||||
private String roomName;
|
||||
private String bedType;
|
||||
private String breakfast;
|
||||
private int roomNum;
|
||||
private int nightNum;
|
||||
private double lon;
|
||||
private double lat;
|
||||
private String bedRemark;
|
||||
private String earliestToHotel;
|
||||
private String latestToHotel;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
|
||||
// Define other nested classes (DayPrice, ContactPerson, Resident, Room, RefundInfo, etc.) in a similar manner
|
||||
@lombok.Data
|
||||
public static class DayPrice {
|
||||
private String date;
|
||||
private String dateStr;
|
||||
private double price;
|
||||
private String breakfast;
|
||||
private int roomAmount;
|
||||
private double marketPrice;
|
||||
private double saveprice;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Room {
|
||||
private String productOrderSerialNo;
|
||||
private List<Long> passengerIdList; // Assuming IDs are numeric
|
||||
private List<String> passengerNameList;
|
||||
private String checkInDate;
|
||||
private String checkOutDate;
|
||||
private String confirmNo;
|
||||
private int orderStatus;
|
||||
private String orderStatusDesc;
|
||||
private double salesPrice;
|
||||
private double marketPrice;
|
||||
private double savePrice;
|
||||
private double standardPrice;
|
||||
private String dayStandardPrice; // Assuming this is a string representation of the price
|
||||
private double costPrice;
|
||||
private double servicePrice;
|
||||
private double afterSettlementServicePrice;
|
||||
private String previousProductOrderSerialNo;
|
||||
private CheckRoomInfo checkRoomInfo; // Assuming this is a nested object with its own structure
|
||||
private double companyPrice;
|
||||
private double personalPrice;
|
||||
private String refundReason;
|
||||
private String changeReason;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class CheckRoomInfo {
|
||||
private int hotelCheckInStatus;
|
||||
private String checkInDate;
|
||||
private String checkOutDate;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class OrderGiftInfo {
|
||||
private String giftTitle;
|
||||
private String giftContent;
|
||||
private int giftSource; // Assuming this is an integer representing the source
|
||||
private int giftProvider; // Assuming this is an integer representing the provider
|
||||
private String giftDateDesc; // Assuming this is a string description of the date
|
||||
private int giftStatus; // Assuming this is an integer representing the status
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class PriceVarInfo {
|
||||
private String priceVarNo;
|
||||
private double totalPriceVar;
|
||||
private int paymentTypeVar;
|
||||
private double companyPriceVar;
|
||||
private double personalPriceVar;
|
||||
private int priceVarType; // Assuming this is an integer representing the type of price variation
|
||||
private String priceVarTime;
|
||||
private List<AdjustRoom> adjustRoomList; // Assuming this is a list of AdjustRoom objects, each with its own structure
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class AdjustRoom {
|
||||
private String productOrderSerialNo;
|
||||
private double roomTotalPriceVar;
|
||||
private double salesPriceVar;
|
||||
private double costPriceVar;
|
||||
private double servicePriceVar;
|
||||
private double afterServicePriceAdjustmentValue;
|
||||
private double refundFeeVar;
|
||||
private double changeFeeVar;
|
||||
private double refundAmountVar;
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
@lombok.Data
|
||||
public static class Approval {
|
||||
private int orderType; // Assuming this is an integer representing the type of order
|
||||
private List<Approver> approverList; // Assuming this is a list of Approver objects, each with its own structure
|
||||
private List<String> approveOrderNoList; // Assuming this is a list of strings representing order numbers
|
||||
|
||||
// Getters and Setters
|
||||
}
|
||||
|
||||
@lombok.Data
|
||||
public static class Approver {
|
||||
private String outEmployeeId;
|
||||
private String approverName;
|
||||
private int level; // Assuming this is an integer representing the approval level
|
||||
private String approvalResult; // Assuming this is a string representing the result of the approval
|
||||
private String approvalTime;
|
||||
private String approvalRemark; // Assuming this is a string representing any remarks
|
||||
// Getters and Setters
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.hotel;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseResponse;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class HotelListResponse extends LYBaseResponse {
|
||||
private List<HotelOrder> orderList;
|
||||
|
||||
@Data
|
||||
private static class HotelOrder{
|
||||
private String orderSerialNo;
|
||||
private int orderType;
|
||||
private String roomName;
|
||||
private int nightAmount;
|
||||
private int roomAmount;
|
||||
private List<String> travelers;
|
||||
private double servicePrice;
|
||||
private String checkOutDate;
|
||||
private String checkInDate;
|
||||
private double payPrice;
|
||||
private double totalPrice;
|
||||
private int orderStatus;
|
||||
private String orderStatusDesc;
|
||||
private long enterpriseId; // Assuming enterpriseId can be a large number
|
||||
private long employeeId; // Assuming employeeId can be a large number
|
||||
private String travelOrderNo;
|
||||
private String hotelName;
|
||||
private int paymentType;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,237 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.train;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class TrainDetailResponse {
|
||||
private TrainDetailData data;
|
||||
|
||||
@Data
|
||||
public static class TrainDetailData {
|
||||
private String outEmployeeId;
|
||||
private String employeeCode;
|
||||
private String orderNo;
|
||||
private String parentOrderSerialNo;
|
||||
private int isChangedOrder;
|
||||
private String outOrderNo;
|
||||
private List<String> relatedOrderList;
|
||||
private String trainNo;
|
||||
private String orderStatus;
|
||||
private String orderStatusName;
|
||||
private int isNeedTransfer;
|
||||
private String fromStation;
|
||||
private String toStation;
|
||||
private String fromStationCode;
|
||||
private String toStationCode;
|
||||
private String departCity;
|
||||
private String arriveCity;
|
||||
private String planBeginDate;
|
||||
private String planEndDate;
|
||||
private String trainClass;
|
||||
private String ticketNo;
|
||||
private String occupySeatTime;
|
||||
private String outTicketTime;
|
||||
private String refundTime;
|
||||
private int ticketModel;
|
||||
private int createOrderPattern;
|
||||
private String accountNo;
|
||||
private String ticketGate;
|
||||
private int acceptNoSeat;
|
||||
private List<Item> items;
|
||||
private ContactInfo contactInfo;
|
||||
private GarbInfo garbInfo;
|
||||
private double totalAmount;
|
||||
private TravelData travelData;
|
||||
private int bookingMethod;
|
||||
private int paymentType;
|
||||
private double personalPrice;
|
||||
private double companyPrice;
|
||||
private List<PriceVar> priceVarList;
|
||||
private List<Approval> approvalList;
|
||||
private int bookType;
|
||||
private int trainIndex;
|
||||
private String relationOrderNo;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
@Data
|
||||
public static class Item {
|
||||
private long itemId;
|
||||
private String employeeCode;
|
||||
private long parentItemId;
|
||||
private String outEmployeeId;
|
||||
private String ticketStatus;
|
||||
private String passengerName;
|
||||
private String certificateTypeCode;
|
||||
private String certificateCode;
|
||||
private String passengerSex;
|
||||
private String passengerBirthDay;
|
||||
private String passengerPhone;
|
||||
private String passengerClass;
|
||||
private String passengerTicketNo;
|
||||
private String seatClass;
|
||||
private String seatNo;
|
||||
private double ticketPrice;
|
||||
private double serviceCharge;
|
||||
private double afterServiceCharge;
|
||||
private double refundAmount;
|
||||
private double refundCharge;
|
||||
private double refundFee;
|
||||
private double changePrice;
|
||||
private double changeFee;
|
||||
private double changeRefundFee;
|
||||
private double changeRebookFee;
|
||||
private double refundAmountPer;
|
||||
private double refundAmountCor;
|
||||
private double personalPrice;
|
||||
private double companyPrice;
|
||||
private ChangeInfo changeInfo;
|
||||
private String refundReason;
|
||||
private double refunedAmount;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ChangeInfo {
|
||||
private String changeReason;
|
||||
private String orderNo;
|
||||
private String outOrderNo;
|
||||
private String orderStatus;
|
||||
private String fromStation;
|
||||
private String toStation;
|
||||
private String fromStationCode;
|
||||
private String toStationCode;
|
||||
private String planBeginDate;
|
||||
private String planEndDate;
|
||||
private String trainClass;
|
||||
private String trainNo;
|
||||
private String ticketNo;
|
||||
private String occupySeatTime;
|
||||
private String outTicketTime;
|
||||
private String ticketGate;
|
||||
private String changeType;
|
||||
private ChangeItem changeItem;
|
||||
private int bookingMethod;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ChangeItem {
|
||||
private long itemId;
|
||||
private String ticketStatus;
|
||||
private String passengerTicketNo;
|
||||
private String seatClass;
|
||||
private String seatNo;
|
||||
private double ticketPrice;
|
||||
private double serviceCharge;
|
||||
private double afterServiceCharge;
|
||||
private double changeFee;
|
||||
private double changeRefundFee;
|
||||
private double changeRebookFee;
|
||||
private double refundAmount;
|
||||
private double refundCharge;
|
||||
private double afterRefundCharge;
|
||||
private double refundFee;
|
||||
private double changePrice;
|
||||
private double refundAmountPer;
|
||||
private double refundAmountCor;
|
||||
private double personalPrice;
|
||||
private double companyPrice;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ContactInfo {
|
||||
private String personName;
|
||||
private String personMobile;
|
||||
private String personTelephone;
|
||||
private String personEmail;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
@Data
|
||||
public static class GarbInfo {
|
||||
private String trainNo;
|
||||
private String trainClass;
|
||||
private String seatClassCode;
|
||||
private String closeTime; // Assuming this is a string, but consider using Date if it represents a specific time
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
@Data
|
||||
public static class TravelData {
|
||||
private String oaNo;
|
||||
private String travelApplyNo;
|
||||
private String travelRemark;
|
||||
private List<SubmitItem> submitItemList;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
@Data
|
||||
public static class SubmitItem {
|
||||
private String itemCode;
|
||||
private String itemTitle;
|
||||
private String itemTitleEn;
|
||||
private String itemContent;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
}
|
||||
@Data
|
||||
public static class PriceVar {
|
||||
private String priceVarNo;
|
||||
private double totalPriceVar;
|
||||
private int paymentTypeVar;
|
||||
private double companyPriceVar;
|
||||
private double personalPriceVar;
|
||||
private int priceVarType;
|
||||
private String priceVarTime;
|
||||
private List<PassengerPriceVar> passengers;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
@Data
|
||||
public static class PassengerPriceVar {
|
||||
private long itemId;
|
||||
private String outEmployeeId;
|
||||
private String passengerName;
|
||||
private String pTicketNo;
|
||||
private double serviceChargeVar;
|
||||
private double changePriceDiffVar;
|
||||
private double changeServicePriceVar;
|
||||
private double afterChangeServicePriceVar;
|
||||
private double priceVar;
|
||||
private double servicePriceVar;
|
||||
private double afterServicePriceVar;
|
||||
private double refundPriceVar;
|
||||
private double refundFeeVar;
|
||||
private double refundServicePriceVar;
|
||||
private double afterRefundServicePriceVar;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
}
|
||||
@Data
|
||||
public static class Approval {
|
||||
private int orderType;
|
||||
private List<Approver> approverList;
|
||||
private List<String> approveOrderNoList;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
|
||||
@Data
|
||||
public static class Approver {
|
||||
private String outEmployeeId;
|
||||
private String approverName;
|
||||
private int level;
|
||||
private String approvalResult;
|
||||
private String approvalTime;
|
||||
private String approvalRemark;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package com.chint.interfaces.rest.ly.dto.search.response.train;
|
||||
|
||||
import com.chint.interfaces.rest.ly.dto.LYBaseResponse;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class TrainListResponse extends LYBaseResponse {
|
||||
private List<TrainOrder> trainOrderList;
|
||||
|
||||
@Data
|
||||
private class TrainOrder {
|
||||
private String orderSerialNo;
|
||||
private String originalOrderNo;
|
||||
private String parentOrderSerialNo;
|
||||
private String travelApplyNo;
|
||||
private int travelType;
|
||||
private int payType;
|
||||
private String outEmployeeId;
|
||||
private double totalPrice;
|
||||
private String orderStatus;
|
||||
private String orderStatusText;
|
||||
private boolean isChangeOrder;
|
||||
private boolean hasRefund;
|
||||
private String bookDate;
|
||||
private int bookType;
|
||||
private int trainIndex;
|
||||
private String relationOrderNo;
|
||||
|
||||
// Constructors, Getters, and Setters
|
||||
}
|
||||
}
|
|
@ -2,9 +2,9 @@ package com.chint.interfaces.rest.user;
|
|||
|
||||
|
||||
|
||||
import com.chint.dc.api.DataCenterResult;
|
||||
import com.chint.dc.api.dto.DataCenterOption;
|
||||
import com.chint.dc.api.service.DataCenterService;
|
||||
//import com.chint.dc.api.DataCenterResult;
|
||||
//import com.chint.dc.api.dto.DataCenterOption;
|
||||
//import com.chint.dc.api.service.DataCenterService;
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import com.chint.interfaces.rest.base.PostRequest;
|
||||
import com.chint.interfaces.rest.user.dto.*;
|
||||
|
@ -67,31 +67,31 @@ public class UserHttpRequestImpl implements UserHttpRequest {
|
|||
}
|
||||
|
||||
private List<UserDataDTO> loadSFInfo(User user) {
|
||||
Gson gson = new Gson();
|
||||
AccessKeyDTO akSkLoad = akSkLoad();
|
||||
DataCenterOption option = new DataCenterOption();
|
||||
option.setSk(akSkLoad.sk);
|
||||
option.setAk(akSkLoad.ak);
|
||||
option.setUrl(OPENAI_BASE_URL);
|
||||
DataCenterService dataCenterService = new DataCenterService(option);
|
||||
LinkedHashMap map = new LinkedHashMap<String, Object>();
|
||||
map.put("LoginUsername", user.getEmployeeNo().toString());
|
||||
map.put("start", 0);
|
||||
map.put("pageSize", 1);
|
||||
DataCenterResult result = dataCenterService.post(USER_DATA_PATH, map);
|
||||
Type type = new TypeToken<List<UserDataDTO>>() {
|
||||
}.getType();
|
||||
if (result.getData() != null) {
|
||||
List<UserDataDTO> fromJson = gson.fromJson(result.getData().toString(), type);
|
||||
UserDataDTO userDataDTO = fromJson.get(0);
|
||||
user.setCompanyCode(userDataDTO.getCompany());
|
||||
user.setWorkStatus(userDataDTO.getStatus());
|
||||
user.setGender(userDataDTO.getGender());
|
||||
return fromJson;
|
||||
} else {
|
||||
throw new RuntimeException("用户数据不存在");
|
||||
}
|
||||
// return null;
|
||||
// Gson gson = new Gson();
|
||||
// AccessKeyDTO akSkLoad = akSkLoad();
|
||||
// DataCenterOption option = new DataCenterOption();
|
||||
// option.setSk(akSkLoad.sk);
|
||||
// option.setAk(akSkLoad.ak);
|
||||
// option.setUrl(OPENAI_BASE_URL);
|
||||
// DataCenterService dataCenterService = new DataCenterService(option);
|
||||
// LinkedHashMap map = new LinkedHashMap<String, Object>();
|
||||
// map.put("LoginUsername", user.getEmployeeNo().toString());
|
||||
// map.put("start", 0);
|
||||
// map.put("pageSize", 1);
|
||||
// DataCenterResult result = dataCenterService.post(USER_DATA_PATH, map);
|
||||
// Type type = new TypeToken<List<UserDataDTO>>() {
|
||||
// }.getType();
|
||||
// if (result.getData() != null) {
|
||||
// List<UserDataDTO> fromJson = gson.fromJson(result.getData().toString(), type);
|
||||
// UserDataDTO userDataDTO = fromJson.get(0);
|
||||
// user.setCompanyCode(userDataDTO.getCompany());
|
||||
// user.setWorkStatus(userDataDTO.getStatus());
|
||||
// user.setGender(userDataDTO.getGender());
|
||||
// return fromJson;
|
||||
// } else {
|
||||
// throw new RuntimeException("用户数据不存在");
|
||||
// }
|
||||
return null;
|
||||
}
|
||||
|
||||
private TravelRankDTO loadTravelRank(TravelRankParam travelRankParam) {
|
||||
|
|
|
@ -10,3 +10,7 @@ chint:
|
|||
database: itinerary_booking
|
||||
username: echo
|
||||
password: R3nd0mP@ssw0rd!
|
||||
logging:
|
||||
level:
|
||||
org.springframework.jdbc.core.JdbcTemplate: DEBUG
|
||||
org.springframework.jdbc.core.StatementCreatorUtils: TRACE
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
version: "3"
|
||||
|
||||
networks:
|
||||
gitea:
|
||||
external: false
|
||||
|
||||
services:
|
||||
server:
|
||||
image: gitea/gitea:1.21.4
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=mysql
|
||||
- GITEA__database__HOST=rm-cn-jeo3lfy9q0006gso.rwlb.rds.aliyuncs.com:3306
|
||||
- GITEA__database__NAME=gitea
|
||||
- GITEA__database__USER=gitea
|
||||
- GITEA__database__PASSWD=gitea
|
||||
restart: always
|
||||
volumes:
|
||||
- /app/gitea/data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- "3000:3000"
|
||||
- "222:22"
|
|
@ -10,17 +10,13 @@ import com.chint.interfaces.rest.ctrip.dto.estimate.request.RouteInfo;
|
|||
import com.chint.interfaces.rest.ctrip.dto.estimate.response.BookingRelatedApiResponse;
|
||||
import com.chint.interfaces.rest.ctrip.dto.location.CTripCity;
|
||||
import com.chint.interfaces.rest.ctrip.dto.location.CTripCountry;
|
||||
import com.chint.interfaces.rest.ctrip.dto.login.CTripAuthLoginParam;
|
||||
import com.chint.interfaces.rest.ctrip.dto.login.CTripLoginParam;
|
||||
import com.chint.interfaces.rest.ctrip.dto.login.PCResponse;
|
||||
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderResponse;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
@ -87,25 +83,9 @@ public class CTripTest {
|
|||
|
||||
@Test
|
||||
void authLogin() {
|
||||
// BaseContext.setCurrentUser(user);
|
||||
// CTripLoginParam cTripLoginParam = new CTripLoginParam();
|
||||
// cTripLoginParam.setEmployeeID(String.valueOf(user.getEmployeeNo()));
|
||||
|
||||
CTripAuthLoginParam param = new CTripAuthLoginParam();
|
||||
param.setEmployeeID("230615020");
|
||||
param.setForCorp(0);
|
||||
HttpResponse response = loginRequest.authLogin(param);
|
||||
|
||||
HttpEntity entity = response.getEntity();
|
||||
String result = null;
|
||||
try {
|
||||
result = EntityUtils.toString(entity, "UTF-8");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
|
||||
BaseContext.setCurrentUser(user);
|
||||
PCResponse response = loginRequest.authLogin();
|
||||
System.out.println(response.getRedirectUrl());
|
||||
}
|
||||
|
||||
|
||||
|
@ -136,8 +116,9 @@ public class CTripTest {
|
|||
BookingRelatedApiResponse estimate = estimateRequest.estimate(bookingRelatedApiRequest);
|
||||
System.out.println(estimate);
|
||||
}
|
||||
|
||||
@Test
|
||||
void search(){
|
||||
void search() {
|
||||
BaseContext.setCurrentUser(user);
|
||||
SearchOrderResponse response = orderSearchRequest.searchOrder("actual12345622");
|
||||
System.out.println(response);
|
||||
|
|
|
@ -27,7 +27,7 @@ class RouteApplicationTests {
|
|||
void loginSign(){
|
||||
String sfno = "230615020";
|
||||
String syscode = "abc";
|
||||
String billcode = "12321466";
|
||||
String billcode = "12321412323";
|
||||
String sec = "Superdandan";
|
||||
String timespan = "12312312312312";
|
||||
|
||||
|
|
Loading…
Reference in New Issue