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:
lulz1 2024-02-17 22:22:46 +08:00
commit ec68c44112
70 changed files with 1781 additions and 268 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,6 +4,7 @@ package com.chint.application.out;
import com.chint.application.services.SupplierLoginService;
import com.chint.infrastructure.util.Result;
import com.chint.interfaces.rest.ctrip.dto.login.H5Response;
import com.chint.interfaces.rest.ctrip.dto.login.PCResponse;
import com.chint.interfaces.rest.ly.dto.login.LYRedirectUrlResponse;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -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());
}
}

View File

@ -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();
}
}

View File

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

View File

@ -52,10 +52,13 @@ public class Leg {
private Integer legStatus;
@Transient
private String legStatusName;
@Transient
private OrderDetail orderDetail; //这个属性不做持久化保存 根据下单事件进行获取
@MappedCollection(idColumn = "leg_id", keyColumn = "leg_key")
private List<LegEvent> eventList;
public Leg(Long legId) {
this.legId = legId;
}
@ -84,8 +87,17 @@ public class Leg {
this.legStatus = latestEvent.getEventType();
// If the latest event is an order event, update the amount
if (latestEvent.getEventType().equals(LEG_EVENT_ORDERED)) {
this.amount = latestEvent.getOrderDetail().getAmount();
if (latestEvent.getEventType() >= LEG_EVENT_ORDERED) {
//获取最新的下单事件
LegEvent latestOrderEvent = this.eventList
.stream()
.filter(legEvent -> legEvent.getEventType().equals(LEG_EVENT_ORDERED))
.max(Comparator.comparingLong(LegEvent::getLegEventId))
.orElse(null);
Optional.ofNullable(latestOrderEvent.getOrderDetail()).ifPresent(detail -> {
this.amount = detail.getPrice();
this.orderDetail = detail;
});
}
}
@ -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.");
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,7 +4,9 @@ import com.chint.application.commands.*;
import com.chint.domain.aggregates.order.*;
import com.chint.domain.exceptions.CommandException;
import com.chint.domain.factoriy.leg_event.LegEventFactory;
import com.chint.domain.factoriy.order_detail.OrderDetailFactory;
import com.chint.domain.repository.LegRepository;
import com.chint.domain.repository.OrderDetailRepository;
import com.chint.domain.repository.RouteRepository;
import com.chint.domain.service.order_sync.SyncAdapter;
import com.chint.domain.value_object.ApproveLegData;
@ -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);
}
}

View File

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

View File

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

View File

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

View File

@ -0,0 +1,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;
}
}

View File

@ -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()
);
}
}

View File

@ -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);
}

View File

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

View File

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

View File

@ -0,0 +1,23 @@
package com.chint.domain.service.supplier;
import com.chint.application.commands.RouteAddOrderCommand;
import com.chint.domain.value_object.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());
}
}

View File

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

View File

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

View File

@ -0,0 +1,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;
}
}

View File

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

View File

@ -141,7 +141,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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,6 +29,4 @@ public class ItineraryEntity {
private List<DomCharterCarOrderInfoEntity> DomCharterCarOrderInfoList; // 包车租车订单信息列表
// 国际火车票订单信息列表
private List<IntlTrainOrderInfoEntity> IntlTrainOrderInfoList; // 国际火车票订单信息列表
// Getters and Setters...
}

View File

@ -4,7 +4,7 @@ import lombok.Data;
// 订单基本信息类
@Data
class BasicInfo {
public class BasicInfo {
private long orderId; // 订单ID
private double estimateAmount; // 预估金额
private double orderAmount; // 订单金额

View File

@ -4,7 +4,7 @@ import lombok.Data;
// 订单产品信息类
@Data
class OrderProduct {
public class OrderProduct {
private String vendorOrderId; // 供应商订单ID
private int bookingType; // 预订类型
private String useTime; // 使用时间

View File

@ -4,7 +4,7 @@ import lombok.Data;
// 支付信息类
@Data
class PaymentInfo {
public class PaymentInfo {
private double amount; // 金额
private String billNo; // 账单号
private String paidTime; // 支付时间

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -6,7 +6,7 @@ import lombok.Data;
import java.util.List;
@Data
class PassengerInfo {
public class PassengerInfo {
private PassengerBasic passengerBasic;
private List<SequenceInfo> sequenceInfo;

View File

@ -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();

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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");

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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; // 预订时间
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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;
}
}

View File

@ -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
}
}
}

View File

@ -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
}
}

View File

@ -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) {

View File

@ -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

View File

@ -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"

View File

@ -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);

View File

@ -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";