Compare commits

..

2 Commits

Author SHA1 Message Date
lulz1 89ca5cb54f 添加行程规划功能接口 2024-02-19 20:17:22 +08:00
lulz1 32ba08c300 修改编译版本 2024-02-19 11:01:13 +08:00
57 changed files with 1623 additions and 87 deletions

View File

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

View File

@ -0,0 +1,17 @@
package com.chint.application.commands;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
import static com.chint.infrastructure.constant.Constant.APPROVAL_EVENT_SUCCESS;
@Data
public class OrderApprovalCommand extends Command {
private String actualNo;
private Integer type = APPROVAL_EVENT_SUCCESS;
public OrderApprovalCommand actualNo(String actualNo) {
this.setActualNo(actualNo);
return this;
}
}

View File

@ -0,0 +1,11 @@
package com.chint.application.dtos;
import com.chint.domain.value_object.LegData;
import lombok.Data;
@Data
public class AddLegData {
private Long routeId;
private LegData legData;
}

View File

@ -0,0 +1,10 @@
package com.chint.application.dtos;
import lombok.Data;
@Data
public class DeleteLegData {
private Long routeId;
private String legNo;
}

View File

@ -8,6 +8,6 @@ public class LocationParam extends BaseQuery {
private Long level;
private Long parentLocationId;
private String cityName;
private String firstLetter;
private String queryWord;
private Integer cityType;
}

View File

@ -0,0 +1,46 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class FlightScheduleDetail extends ScheduleDetail {
private String startHM;
private String endHM;
private String departureGeoId;
private String arrivalGeoId;
public static FlightScheduleDetailBuilder builder(){
return new FlightScheduleDetailBuilder();
}
// Constructor, getters and setters
public static class FlightScheduleDetailBuilder extends ScheduleDetailBuilder {
private FlightScheduleDetail flightScheduleDetail = new FlightScheduleDetail();
public FlightScheduleDetailBuilder startHM(String startHM) {
flightScheduleDetail.setStartHM(startHM);
return this;
}
public FlightScheduleDetailBuilder endHM(String endHM) {
flightScheduleDetail.setEndHM(endHM);
return this;
}
public FlightScheduleDetailBuilder departureGeoId(String departureGeoId) {
flightScheduleDetail.setDepartureGeoId(departureGeoId);
return this;
}
public FlightScheduleDetailBuilder arrivalGeoId(String arrivalGeoId) {
flightScheduleDetail.setArrivalGeoId(arrivalGeoId);
return this;
}
@Override
public FlightScheduleDetail build() {
return flightScheduleDetail;
}
}
}

View File

@ -0,0 +1,32 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class HotelScheduleDetail extends ScheduleDetail {
private String lastUpdateTime;
private Integer nightCount;
public static HotelScheduleDetailBuilder builder(){
return new HotelScheduleDetailBuilder();
}
// Constructor, getters and setters
public static class HotelScheduleDetailBuilder extends ScheduleDetailBuilder {
private HotelScheduleDetail hotelScheduleDetail = new HotelScheduleDetail();
public HotelScheduleDetailBuilder lastUpdateTime(String lastUpdateTime) {
hotelScheduleDetail.setLastUpdateTime(lastUpdateTime);
return this;
}
public HotelScheduleDetailBuilder nightCount(Integer nightCount) {
hotelScheduleDetail.setNightCount(nightCount);
return this;
}
@Override
public HotelScheduleDetail build() {
return hotelScheduleDetail;
}
}
}

View File

@ -0,0 +1,44 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class OtherScheduleDetail extends ScheduleDetail {
private String amountType;
private String amountTypeEnName;
private String amountTypeCnName;
private String lastUpdateTime;
// Constructor, getters and setters
public static OtherScheduleDetailBuilder builder(){
return new OtherScheduleDetailBuilder();
}
public static class OtherScheduleDetailBuilder extends ScheduleDetailBuilder {
private OtherScheduleDetail otherScheduleDetail = new OtherScheduleDetail();
public OtherScheduleDetailBuilder amountType(String amountType) {
otherScheduleDetail.setAmountType(amountType);
return this;
}
public OtherScheduleDetailBuilder amountTypeEnName(String amountTypeEnName) {
otherScheduleDetail.setAmountTypeEnName(amountTypeEnName);
return this;
}
public OtherScheduleDetailBuilder amountTypeCnName(String amountTypeCnName) {
otherScheduleDetail.setAmountTypeCnName(amountTypeCnName);
return this;
}
public OtherScheduleDetailBuilder lastUpdateTime(String lastUpdateTime) {
otherScheduleDetail.setLastUpdateTime(lastUpdateTime);
return this;
}
@Override
public OtherScheduleDetail build() {
return otherScheduleDetail;
}
}
}

View File

@ -0,0 +1,248 @@
package com.chint.application.dtos.trip;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class ScheduleDetail {
protected String serviceProvider;
protected String orderState;
protected String scheduleType;
protected String scheduleNum;
protected String startDate;
protected String endDate;
protected String startCityName;
protected String startCity;
protected String startCityEnName;
protected String endCityName;
protected String endCityEnName;
protected String endCity;
protected String orderId;
protected String parentOrderId;
protected String systemStatus;
protected String reserveCount;
protected String facilitatorCode;
protected String parentScheduleNum;
protected String extendedField;
protected String quoteGroupNum;
protected Integer isAddRecord;
protected String supplierOrderId;
protected String orderJson;
protected String amount;
protected List<ScheduleUserInfo> userInfoList; // Assuming UserInfo is another class you have defined
protected Integer extStatus;
protected Integer isHistoryRecord;
protected String currencyName;
protected String currency;
protected String currencyNameUS;
protected String createTime;
protected String startCountryCode;
protected String startCountryName;
protected String endCountryCode;
protected String endCountryName;
protected String realScheduleNum;
// Constructor, getters and setters
public static ScheduleDetailBuilder builder(){
return new ScheduleDetailBuilder();
}
public static class ScheduleDetailBuilder {
private ScheduleDetail scheduleDetail = new ScheduleDetail();
public ScheduleDetailBuilder serviceProvider(String serviceProvider) {
scheduleDetail.setServiceProvider(serviceProvider);
return this;
}
public ScheduleDetailBuilder orderState(String orderState) {
scheduleDetail.setOrderState(orderState);
return this;
}
public ScheduleDetailBuilder scheduleType(String scheduleType) {
scheduleDetail.setScheduleType(scheduleType);
return this;
}
public ScheduleDetailBuilder scheduleNum(String scheduleNum) {
scheduleDetail.setScheduleNum(scheduleNum);
return this;
}
public ScheduleDetailBuilder startDate(String startDate) {
scheduleDetail.setStartDate(startDate);
return this;
}
public ScheduleDetailBuilder endDate(String endDate) {
scheduleDetail.setEndDate(endDate);
return this;
}
public ScheduleDetailBuilder startCityName(String startCityName) {
scheduleDetail.setStartCityName(startCityName);
return this;
}
public ScheduleDetailBuilder startCity(String startCity) {
scheduleDetail.setStartCity(startCity);
return this;
}
public ScheduleDetailBuilder startCityEnName(String startCityEnName) {
scheduleDetail.setStartCityEnName(startCityEnName);
return this;
}
public ScheduleDetailBuilder endCityName(String endCityName) {
scheduleDetail.setEndCityName(endCityName);
return this;
}
public ScheduleDetailBuilder endCityEnName(String endCityEnName) {
scheduleDetail.setEndCityEnName(endCityEnName);
return this;
}
public ScheduleDetailBuilder endCity(String endCity) {
scheduleDetail.setEndCity(endCity);
return this;
}
public ScheduleDetailBuilder orderId(String orderId) {
scheduleDetail.setOrderId(orderId);
return this;
}
public ScheduleDetailBuilder parentOrderId(String parentOrderId) {
scheduleDetail.setParentOrderId(parentOrderId);
return this;
}
public ScheduleDetailBuilder systemStatus(String systemStatus) {
scheduleDetail.setSystemStatus(systemStatus);
return this;
}
public ScheduleDetailBuilder reserveCount(String reserveCount) {
scheduleDetail.setReserveCount(reserveCount);
return this;
}
public ScheduleDetailBuilder facilitatorCode(String facilitatorCode) {
scheduleDetail.setFacilitatorCode(facilitatorCode);
return this;
}
public ScheduleDetailBuilder parentScheduleNum(String parentScheduleNum) {
scheduleDetail.setParentScheduleNum(parentScheduleNum);
return this;
}
public ScheduleDetailBuilder extendedField(String extendedField) {
scheduleDetail.setExtendedField(extendedField);
return this;
}
public ScheduleDetailBuilder quoteGroupNum(String quoteGroupNum) {
scheduleDetail.setQuoteGroupNum(quoteGroupNum);
return this;
}
public ScheduleDetailBuilder isAddRecord(Integer isAddRecord) {
scheduleDetail.setIsAddRecord(isAddRecord);
return this;
}
public ScheduleDetailBuilder supplierOrderId(String supplierOrderId) {
scheduleDetail.setSupplierOrderId(supplierOrderId);
return this;
}
public ScheduleDetailBuilder orderJson(String orderJson) {
scheduleDetail.setOrderJson(orderJson);
return this;
}
public ScheduleDetailBuilder amount(String amount) {
scheduleDetail.setAmount(amount);
return this;
}
public ScheduleDetailBuilder userInfoList(List<ScheduleUserInfo> userInfoList) {
scheduleDetail.setUserInfoList(userInfoList);
return this;
}
public ScheduleDetailBuilder addUserInfo(ScheduleUserInfo.ScheduleUserInfoBuilder userInfoBuilder) {
if (scheduleDetail.getUserInfoList() == null) {
scheduleDetail.setUserInfoList(new ArrayList<>());
}
scheduleDetail.getUserInfoList().add(userInfoBuilder.build());
return this;
}
public ScheduleDetailBuilder extStatus(Integer extStatus) {
scheduleDetail.setExtStatus(extStatus);
return this;
}
public ScheduleDetailBuilder isHistoryRecord(Integer isHistoryRecord) {
scheduleDetail.setIsHistoryRecord(isHistoryRecord);
return this;
}
public ScheduleDetailBuilder currencyName(String currencyName) {
scheduleDetail.setCurrencyName(currencyName);
return this;
}
public ScheduleDetailBuilder currency(String currency) {
scheduleDetail.setCurrency(currency);
return this;
}
public ScheduleDetailBuilder currencyNameUS(String currencyNameUS) {
scheduleDetail.setCurrencyNameUS(currencyNameUS);
return this;
}
public ScheduleDetailBuilder createTime(String createTime) {
scheduleDetail.setCreateTime(createTime);
return this;
}
public ScheduleDetailBuilder startCountryCode(String startCountryCode) {
scheduleDetail.setStartCountryCode(startCountryCode);
return this;
}
public ScheduleDetailBuilder startCountryName(String startCountryName) {
scheduleDetail.setStartCountryName(startCountryName);
return this;
}
public ScheduleDetailBuilder endCountryCode(String endCountryCode) {
scheduleDetail.setEndCountryCode(endCountryCode);
return this;
}
public ScheduleDetailBuilder endCountryName(String endCountryName) {
scheduleDetail.setEndCountryName(endCountryName);
return this;
}
public ScheduleDetailBuilder realScheduleNum(String realScheduleNum) {
scheduleDetail.setRealScheduleNum(realScheduleNum);
return this;
}
public ScheduleDetail build() {
return scheduleDetail;
}
}
}

View File

@ -0,0 +1,140 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class ScheduleDocument {
private String birthday;
private String chineseName;
private String country;
private String countryCode;
private String documentId;
private String documentNO;
private int documentType;
private String enCountry;
private String enIssueCountry;
private String givenName;
private String idExpire;
private String issueCountry;
private String issueCountryCode;
private String linkPhone;
private String outUserId;
private String sex; // 'M'表示男性
private String surName;
private String sysUserId;
private String tenantId;
private String userName;
public static ScheduleDocumentBuilder builder() {
return new ScheduleDocumentBuilder();
}
public static class ScheduleDocumentBuilder {
private ScheduleDocument scheduleDocument = new ScheduleDocument();
public ScheduleDocumentBuilder birthday(String birthday) {
scheduleDocument.setBirthday(birthday);
return this;
}
public ScheduleDocumentBuilder chineseName(String chineseName) {
scheduleDocument.setChineseName(chineseName);
return this;
}
public ScheduleDocumentBuilder country(String country) {
scheduleDocument.setCountry(country);
return this;
}
public ScheduleDocumentBuilder countryCode(String countryCode) {
scheduleDocument.setCountryCode(countryCode);
return this;
}
public ScheduleDocumentBuilder documentId(String documentId) {
scheduleDocument.setDocumentId(documentId);
return this;
}
public ScheduleDocumentBuilder documentNO(String documentNO) {
scheduleDocument.setDocumentNO(documentNO);
return this;
}
public ScheduleDocumentBuilder documentType(int documentType) {
scheduleDocument.setDocumentType(documentType);
return this;
}
public ScheduleDocumentBuilder enCountry(String enCountry) {
scheduleDocument.setEnCountry(enCountry);
return this;
}
public ScheduleDocumentBuilder enIssueCountry(String enIssueCountry) {
scheduleDocument.setEnIssueCountry(enIssueCountry);
return this;
}
public ScheduleDocumentBuilder givenName(String givenName) {
scheduleDocument.setGivenName(givenName);
return this;
}
public ScheduleDocumentBuilder idExpire(String idExpire) {
scheduleDocument.setIdExpire(idExpire);
return this;
}
public ScheduleDocumentBuilder issueCountry(String issueCountry) {
scheduleDocument.setIssueCountry(issueCountry);
return this;
}
public ScheduleDocumentBuilder issueCountryCode(String issueCountryCode) {
scheduleDocument.setIssueCountryCode(issueCountryCode);
return this;
}
public ScheduleDocumentBuilder linkPhone(String linkPhone) {
scheduleDocument.setLinkPhone(linkPhone);
return this;
}
public ScheduleDocumentBuilder outUserId(String outUserId) {
scheduleDocument.setOutUserId(outUserId);
return this;
}
public ScheduleDocumentBuilder sex(String sex) {
scheduleDocument.setSex(sex);
return this;
}
public ScheduleDocumentBuilder surName(String surName) {
scheduleDocument.setSurName(surName);
return this;
}
public ScheduleDocumentBuilder sysUserId(String sysUserId) {
scheduleDocument.setSysUserId(sysUserId);
return this;
}
public ScheduleDocumentBuilder tenantId(String tenantId) {
scheduleDocument.setTenantId(tenantId);
return this;
}
public ScheduleDocumentBuilder userName(String userName) {
scheduleDocument.setUserName(userName);
return this;
}
public ScheduleDocument build() {
return scheduleDocument;
}
}
}

View File

@ -0,0 +1,114 @@
package com.chint.application.dtos.trip;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class ScheduleUserInfo {
private String supplierId;
private String amount;
private String userId;
private String userName;
private String userMobile;
private String userNo;
private String sex; // 1表示男性
private String passengerType;
private String overproofInfo;
private String isReserve;
private List<ScheduleDocument> documentList;
private int reserveCount;
private String deptCode;
private String rankCode;
public static ScheduleUserInfoBuilder builder() {
return new ScheduleUserInfoBuilder();
}
public static class ScheduleUserInfoBuilder {
private final ScheduleUserInfo scheduleUserInfo = new ScheduleUserInfo();
public ScheduleUserInfoBuilder supplierId(String supplierId) {
scheduleUserInfo.setSupplierId(supplierId);
return this;
}
public ScheduleUserInfoBuilder amount(String amount) {
scheduleUserInfo.setAmount(amount);
return this;
}
public ScheduleUserInfoBuilder userId(String userId) {
scheduleUserInfo.setUserId(userId);
return this;
}
public ScheduleUserInfoBuilder userName(String userName) {
scheduleUserInfo.setUserName(userName);
return this;
}
public ScheduleUserInfoBuilder userMobile(String userMobile) {
scheduleUserInfo.setUserMobile(userMobile);
return this;
}
public ScheduleUserInfoBuilder userNo(String userNo) {
scheduleUserInfo.setUserNo(userNo);
return this;
}
public ScheduleUserInfoBuilder sex(String sex) {
scheduleUserInfo.setSex(sex);
return this;
}
public ScheduleUserInfoBuilder passengerType(String passengerType) {
scheduleUserInfo.setPassengerType(passengerType);
return this;
}
public ScheduleUserInfoBuilder overproofInfo(String overproofInfo) {
scheduleUserInfo.setOverproofInfo(overproofInfo);
return this;
}
public ScheduleUserInfoBuilder isReserve(String isReserve) {
scheduleUserInfo.setIsReserve(isReserve);
return this;
}
public ScheduleUserInfoBuilder reserveCount(int reserveCount) {
scheduleUserInfo.setReserveCount(reserveCount);
return this;
}
public ScheduleUserInfoBuilder deptCode(String deptCode) {
scheduleUserInfo.setDeptCode(deptCode);
return this;
}
public ScheduleUserInfoBuilder rankCode(String rankCode) {
scheduleUserInfo.setRankCode(rankCode);
return this;
}
public ScheduleUserInfoBuilder documentList(List<ScheduleDocument> documentList) {
scheduleUserInfo.setDocumentList(documentList);
return this;
}
public ScheduleUserInfoBuilder addDocument(ScheduleDocument.ScheduleDocumentBuilder documentBuilder) {
if (scheduleUserInfo.getDocumentList() == null) {
scheduleUserInfo.setDocumentList(new ArrayList<>());
}
scheduleUserInfo.getDocumentList().add(documentBuilder.build());
return this;
}
public ScheduleUserInfo build() {
return scheduleUserInfo;
}
}
}

View File

@ -0,0 +1,58 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class TrainScheduleDetail extends ScheduleDetail {
private String startStationCode;
private String endStationCode;
private String startStationName;
private String endStationName;
private String startStationEnName;
private String endStationEnName;
public static TrainScheduleDetailBuilder builder(){
return new TrainScheduleDetailBuilder();
}
// Constructor, getters and setters
public static class TrainScheduleDetailBuilder extends ScheduleDetailBuilder {
private TrainScheduleDetail trainScheduleDetail = new TrainScheduleDetail();
public TrainScheduleDetailBuilder startStationCode(String startStationCode) {
trainScheduleDetail.setStartStationCode(startStationCode);
return this;
}
public TrainScheduleDetailBuilder endStationCode(String endStationCode) {
trainScheduleDetail.setEndStationCode(endStationCode);
return this;
}
public TrainScheduleDetailBuilder startStationName(String startStationName) {
trainScheduleDetail.setStartStationName(startStationName);
return this;
}
public TrainScheduleDetailBuilder endStationName(String endStationName) {
trainScheduleDetail.setEndStationName(endStationName);
return this;
}
public TrainScheduleDetailBuilder startStationEnName(String startStationEnName) {
trainScheduleDetail.setStartStationEnName(startStationEnName);
return this;
}
public TrainScheduleDetailBuilder endStationEnName(String endStationEnName) {
trainScheduleDetail.setEndStationEnName(endStationEnName);
return this;
}
@Override
public TrainScheduleDetail build() {
return trainScheduleDetail;
}
}
}

View File

@ -0,0 +1,14 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class TripCallback {
private String method; // Method of the callback, e.g., "trip.callback"
private TripCallbackData data; // Main data containing trip details
// Getters and setters...
public static TripCallbackBuilder builder() {
return new TripCallbackBuilder();
}
}

View File

@ -0,0 +1,208 @@
package com.chint.application.dtos.trip;
import java.util.ArrayList;
import java.util.List;
public class TripCallbackBuilder {
private TripCallback tripCallback = new TripCallback();
public TripCallbackBuilder method(String method) {
tripCallback.setMethod(method);
return this;
}
public TripCallbackDataBuilder data() {
return new TripCallbackDataBuilder(this, tripCallback);
}
public TripCallback build() {
return tripCallback;
}
public static class TripCallbackDataBuilder {
private TripCallbackBuilder parentBuilder;
private TripCallbackData data = new TripCallbackData();
public TripCallbackDataBuilder(TripCallbackBuilder parentBuilder, TripCallback tripCallback) {
this.parentBuilder = parentBuilder;
tripCallback.setData(data);
}
public TripCallbackDataBuilder changeCar(String changeCar) {
data.setChangeCar(changeCar);
return this;
}
// 添加更多的TripCallbackData字段的链式设置方法
public TripCallbackDataBuilder startDate(String startDate) {
data.setStartDate(startDate);
return this;
}
public TripCallbackDataBuilder endDate(String endDate) {
data.setEndDate(endDate);
return this;
}
public TripCallbackDataBuilder receiptsNum(String receiptsNum) {
data.setReceiptsNum(receiptsNum);
return this;
}
public TripCallbackDataBuilder businessTripReason(String businessTripReason) {
data.setBusinessTripReason(businessTripReason);
return this;
}
public TripCallbackDataBuilder receiptsStatus(String receiptsStatus) {
data.setReceiptsStatus(receiptsStatus);
return this;
}
public TripCallbackDataBuilder createUserId(String CreateUserId) {
data.setCreateUserId(CreateUserId);
return this;
}
public TripCallbackDataBuilder createUserName(String createUserName) {
data.setCreateUserName(createUserName);
return this;
}
public TripCallbackDataBuilder createUserMobile(String createUserMobile) {
data.setCreateUserMobile(createUserMobile);
return this;
}
public TripCallbackDataBuilder compName(String compName) {
data.setCompName(compName);
return this;
}
public TripCallbackDataBuilder compId(String compId) {
data.setCompId(compId);
return this;
}
public TripCallbackDataBuilder createTime(String createTime) {
data.setCreateTime(createTime);
return this;
}
public TripCallbackDataBuilder type(String type) {
data.setType(type);
return this;
}
public TripCallbackDataBuilder ScheduleDetail(List<ScheduleDetail> scheduleDetails) {
data.setScheduleDetailList(scheduleDetails);
return this;
}
public TripCallbackCityBuilder cityList() {
return new TripCallbackCityBuilder(this, data);
}
public TripCallbackBuilder done() {
return parentBuilder;
}
public UserInfoBuilder userInfo() {
return new UserInfoBuilder(this, data);
}
}
public static class TripCallbackCityBuilder {
private TripCallbackDataBuilder parentBuilder;
private TripCallbackCity city = new TripCallbackCity();
private List<TripCallbackCity> cityList;
public TripCallbackCityBuilder(TripCallbackDataBuilder parentBuilder, TripCallbackData data) {
this.parentBuilder = parentBuilder;
if (data.getCityList() == null) {
cityList = new ArrayList<>();
data.setCityList(cityList);
} else {
cityList = data.getCityList();
}
}
public TripCallbackCityBuilder geoId(String geoId) {
city.setGeoId(geoId);
return this;
}
// 添加更多的TripCallbackCity字段的链式设置方法
public TripCallbackCityBuilder cityEnName(String cityEnName) {
city.setCityEnName(cityEnName);
return this;
}
public TripCallbackCityBuilder cityName(String cityName) {
city.setCityName(cityName);
return this;
}
public TripCallbackCityBuilder addCity() {
cityList.add(city);
city = new TripCallbackCity(); // 为下一个City准备新的实例
return this;
}
public TripCallbackDataBuilder done() {
// 最后添加的City也需要被添加到列表中
if (!cityList.contains(city)) {
cityList.add(city);
}
return parentBuilder;
}
}
// 为TripCallbackUserInfoTripCallbackScheduleDetail和TripCallbackDocument也实现类似的Builder类
public static class UserInfoBuilder {
private final TripCallbackDataBuilder parentBuilder;
private final TripCallbackData data;
private final TripCallbackUserInfo userInfo = new TripCallbackUserInfo();
public UserInfoBuilder(TripCallbackDataBuilder parentBuilder, TripCallbackData data) {
this.parentBuilder = parentBuilder;
this.data = data;
if (data.getUserInfoList() == null) {
data.setUserInfoList(new ArrayList<>());
}
}
public UserInfoBuilder userId(String userId) {
userInfo.setUserId(userId);
return this;
}
// ...其他UserInfo字段的设置方法...
public UserInfoBuilder userName(String userName) {
userInfo.setUserName(userName);
return this;
}
public UserInfoBuilder addUserInfo() {
data.getUserInfoList().add(userInfo);
return this;
}
public TripCallbackDataBuilder done() {
// 确保最后一个userInfo也被添加
if (!data.getUserInfoList().contains(userInfo)) {
data.getUserInfoList().add(userInfo);
}
return parentBuilder;
}
}
// DocumentList的建造者
}

View File

@ -0,0 +1,13 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class TripCallbackCity {
private String geoId; // Geographical ID of the city
private String cityEnName; // English name of the city
private String cityName; // Local name of the city
// Getters and setters...
}

View File

@ -0,0 +1,27 @@
package com.chint.application.dtos.trip;
import lombok.Data;
import java.util.List;
@Data
public class TripCallbackData {
private String changeCar; // Indicates if a car change is requested
private String startDate; // Start date of the trip
private String endDate; // End date of the trip
private String receiptsNum; // Receipts number
private String businessTripReason; // Reason for the business trip
private String receiptsStatus; // Status of the receipts
private String CreateUserId; // User ID of the creator
private String createUserName; // Name of the creator
private String createUserMobile; // Mobile number of the creator
private String compName; // Company name
private String compId; // Company ID
private String createTime; // Creation time of the trip
private String type; // Type of document, e.g., "0" for application
// Additional fields...
private List<TripCallbackCity> cityList; // List of cities involved in the trip
private List<TripCallbackUserInfo> userInfoList; // List of user information
private List<ScheduleDetail> scheduleDetailList; // List of schedule details
}

View File

@ -0,0 +1,15 @@
package com.chint.application.dtos.trip;
import lombok.Data;
@Data
public class TripCallbackDocument {
private String docType; // Type of the document, e.g., visa, ticket
private String docId; // Unique identifier for the document
private String docName; // Name of the document
private String issueDate; // Issue date of the document
private String expiryDate; // Expiry date of the document
private String issuingAuthority; // Authority that issued the document
// Getters and setters...
}

View File

@ -0,0 +1,12 @@
package com.chint.application.dtos.trip;
import lombok.Data;
import java.util.List;
@Data
public class TripCallbackUserInfo {
private String userId; // Unique identifier for the user
private String userName; // Name of the user
// Getters and setters...
}

View File

@ -1,5 +1,7 @@
package com.chint.application.in;
import com.chint.application.dtos.AddLegData;
import com.chint.application.dtos.DeleteLegData;
import com.chint.application.queryies.OrderQuery;
import com.chint.application.services.OrderApplicationService;
import com.chint.domain.aggregates.order.RouteOrder;
@ -60,10 +62,36 @@ public class OrderController {
}
@Transactional
@ApiOperation("审批拒绝行程规划单")
@PostMapping("/reject")
public Result<String> rejectOrder(@RequestBody RejectLegData rejectLegData) {
orderApplicationService.reject(rejectLegData);
@ApiOperation("添加行程节点")
@PostMapping("/leg/add")
public Result<String> addLeg(@RequestBody AddLegData addLegData) {
orderApplicationService.addLegToOrder(addLegData);
return Result.Success(SUCCESS);
}
@Transactional
@ApiOperation("删除行程节点")
@PostMapping("/leg/delete")
public Result<String> deleteLeg(@RequestBody DeleteLegData deleteLegData) {
orderApplicationService.deleteLegToOrder(deleteLegData);
return Result.Success(SUCCESS);
}
@Transactional
@ApiOperation("审批拒绝行程规划单")
@PostMapping("/reject")
public Result<String> rejectOrder(@RequestBody ApprovalLegData approvalLegData) {
orderApplicationService.reject(approvalLegData);
return Result.Success(SUCCESS);
}
@Transactional
@ApiOperation("审批通过行程规划单")
@PostMapping("/success")
public Result<String> approvalOrder(@RequestBody ApprovalLegData approvalLegData) {
orderApplicationService.reject(approvalLegData);
return Result.Success(SUCCESS);
}
}

View File

@ -6,6 +6,7 @@ import com.chint.domain.repository.LocationRepository;
import com.chint.domain.service.LocationDomainService;
import com.chint.infrastructure.util.PageResult;
import com.chint.infrastructure.util.Result;
import com.chint.infrastructure.util.StringCheck;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@ -33,9 +34,17 @@ public class LocationController {
return Result.Success(SUCCESS, locationRepository.pageQuery(locationParam));
}
@ApiOperation("根据首字母查询地理信息")
@PostMapping("/query/firstLetter")
@ApiOperation("根据查询词查询地理信息")
@PostMapping("/query/word")
public Result<List<Location>> queryByFirstLetter(@RequestBody LocationParam locationParam) {
return Result.Success(SUCCESS, locationDomainService.queryByFirstLetter(locationParam));
String queryWord = locationParam.getQueryWord();
List<Location> locations = null;
if (StringCheck.isFirstCharacterAlphabetic(queryWord)) {
locations = locationDomainService.queryByFirstLetter(locationParam);
}
if(StringCheck.isFirstCharacterChinese(queryWord)){
locations = locationDomainService.queryByCityName(locationParam);
}
return Result.Success(SUCCESS, locations);
}
}

View File

@ -1,6 +1,7 @@
package com.chint.application.out;
import com.chint.application.dtos.trip.TripCallback;
import com.chint.application.queryies.OrderQuery;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.value_object.FlightPriceData;
@ -58,4 +59,10 @@ public class OrderOutController {
return Result.Success(SUCCESS, orderQuery.queryFlightPrice(priceQueryData));
}
@ApiOperation("根据Id查询行程规划单-元年数据")
@PostMapping("/query/tripCallback")
public Result<TripCallback> queryTripCallbackData(@RequestBody OrderQueryData queryData) {
return Result.Success(SUCCESS, orderQuery.queryTripCallbackData(queryData));
}
}

View File

@ -1,17 +1,31 @@
package com.chint.application.queryies;
import com.chint.application.dtos.trip.*;
import com.chint.application.queryies.estimate.EstimatePrice;
import com.chint.domain.aggregates.location.CityEntity;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.aggregates.order.Location;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.CityRepository;
import com.chint.domain.repository.RouteRepository;
import com.chint.domain.service.OrderDomainService;
import com.chint.domain.value_object.FlightPriceData;
import com.chint.domain.value_object.OrderQueryData;
import com.chint.domain.value_object.PriceQueryData;
import com.chint.domain.value_object.TrainPriceData;
import com.chint.infrastructure.util.BaseContext;
import com.chint.infrastructure.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static com.chint.infrastructure.constant.Constant.*;
@Service
public class OrderQuery {
@ -21,6 +35,9 @@ public class OrderQuery {
@Autowired
private OrderDomainService orderDomainService;
@Autowired
private CityRepository cityRepository;
@Autowired
private EstimatePrice estimatePrice;
@ -53,4 +70,117 @@ public class OrderQuery {
public FlightPriceData queryFlightPrice(PriceQueryData priceQueryData) {
return estimatePrice.queryFlightPrice(priceQueryData);
}
public TripCallback queryTripCallbackData(OrderQueryData queryData) {
User currentUser = BaseContext.getCurrentUser();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter simpleFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
RouteOrder routeOrder = routeRepository.queryById(queryData.getRouteId()).reloadStatus();
List<Location> locationList = new ArrayList<>();
List<Leg> legItems = routeOrder.getLegItems();
legItems.forEach(leg -> {
if (!locationList.contains(leg.getOriginLocation())) {
locationList.add(leg.getOriginLocation());
}
if (!locationList.contains(leg.getDestinationLocation())) {
locationList.add(leg.getDestinationLocation());
}
});
TripCallbackBuilder.TripCallbackDataBuilder callbackDataBuilder = TripCallback.builder()
.method(TRIP_CALLBACK_METHOD_NAME)
.data()
.startDate(routeOrder.getStartTime())
.endDate(routeOrder.getEndTime())
.receiptsNum(routeOrder.getApproveOrderNo().getFakeOrderNo())
.receiptsStatus(TRIP_CALLBACK_RECEIPT_STATUS)
.createUserId(String.valueOf(currentUser.getEmployeeNo()))
.createUserName(currentUser.getName())
.createUserMobile(currentUser.getPhoneNumber())
.createTime(formatter.format(routeOrder.getCreateTime()))
.type(TRIP_CALLBACK_TYPE_APPROVE);
List<CityEntity> cityEntities = new ArrayList<>();
for (Location location : locationList) {
CityEntity city = cityRepository.findByCityName(location.getLocationName());
cityEntities.add(city);
callbackDataBuilder.cityList()
.cityName(city.getCityName())
.cityEnName(city.getCityename())
.done();
}
List<ScheduleDetail> scheduleDetails = legItems.stream()
.map(leg -> {
leg.reloadStatus();
CityEntity originCity = cityEntities.stream().filter(cityEntity -> cityEntity
.getCityName()
.equals(leg.getOriginLocation().getLocationName()))
.findFirst().get();
CityEntity destinationCity = cityEntities.stream().filter(cityEntity -> cityEntity
.getCityName()
.equals(leg.getDestinationLocation().getLocationName()))
.findFirst().get();
ScheduleDetail.ScheduleDetailBuilder scheduleDetailBuilder = ScheduleDetail.builder();
if (leg.getCurrencyType() != null) {
scheduleDetailBuilder
.currencyName(leg.getCurrencyType().getDescription())
.currency(leg.getCurrencyType().getCode())
.currencyNameUS(leg.getCurrencyType().getAbbreviation());
}
return scheduleDetailBuilder
.scheduleType(translateLegType(leg.getLegType()))
.scheduleNum(leg.getLegNo())
.startDate(simpleFormatter.format(leg.getStartTime()))
.endDate(simpleFormatter.format(leg.getEndTime()))
.startCityName(originCity.getCityName())
.startCityEnName(originCity.getCityename())
.endCity(destinationCity.getCityName())
.endCityEnName(destinationCity.getCityename())
.systemStatus(TRIP_CALLBACK_RECEIPT_STATUS)
.parentScheduleNum(leg.getLegNo())
.amount(leg.getAmount())
.reserveCount("1")
.quoteGroupNum("0")
.extStatus(0)
.isHistoryRecord(0)
.createTime(formatter.format(leg.getCreateTime()))
.realScheduleNum(leg.getLegNo())
.userInfoList(List.of(
ScheduleUserInfo.builder()
.userId(String.valueOf(currentUser.getEmployeeNo()))
.userName(currentUser.getName())
.userMobile(currentUser.getPhoneNumber())
.userNo(String.valueOf(currentUser.getEmployeeNo()))
.sex(currentUser.getGender())
.passengerType("1")
.isReserve("0")
.addDocument(ScheduleDocument.builder()
.linkPhone(currentUser.getPhoneNumber())
.chineseName(currentUser.getName())
.userName(currentUser.getName()))
.build()
))
.build();
}).collect(Collectors.toList());
return callbackDataBuilder.ScheduleDetail(scheduleDetails).done().build();
}
private String translateLegType(Integer legType) {
return switch (legType) {
case LEG_TYPE_TRAIN -> TRIP_CALLBACK_TRAIN_TYPE;
case LEG_TYPE_AIRPLANE -> TRIP_CALLBACK_FLIGHT_TYPE;
case LEG_TYPE_HOTEL -> TRIP_CALLBACK_HOTEL_TYPE;
case LEG_TYPE_TAXI -> TRIP_CALLBACK_OTHER_TYPE;
case LEG_TYPE_OTHER -> TRIP_CALLBACK_OTHER_TYPE;
default -> TRIP_CALLBACK_OTHER_TYPE;
};
}
}

View File

@ -1,6 +1,9 @@
package com.chint.application.services;
import com.chint.application.commands.*;
import com.chint.application.dtos.AddLegData;
import com.chint.application.dtos.DeleteLegData;
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;
@ -52,6 +55,26 @@ public class OrderApplicationService {
return routeOrder;
}
@Transactional
public RouteOrder addLegToOrder(AddLegData addLegData) {
RouteOrder order = Optional.ofNullable(routeRepository.queryById(addLegData.getRouteId()))
.orElseThrow(() -> new NotFoundException(NOT_FOUND));
Leg leg = legFactory.createLeg(addLegData.getLegData());
order.reloadStatus();
order.addLeg(leg);
RouteOrder routeOrder = orderDomainService.saveOrder(order);
Command.of(LegPrepareCommand.class).legId(leg.getLegId()).sendToQueue();
return routeOrder;
}
@Transactional
public RouteOrder deleteLegToOrder(DeleteLegData deleteLegData) {
RouteOrder order = Optional.ofNullable(routeRepository.queryById(deleteLegData.getRouteId()))
.orElseThrow(() -> new NotFoundException(NOT_FOUND));
order.deleteLeg(deleteLegData.getLegNo());
return orderDomainService.saveOrder(order);
}
@Transactional
public void approve(ApproveLegData approveLegData) {
Command.of(LegApprovalCommand.class).data(approveLegData).sendToQueue();
@ -86,7 +109,12 @@ public class OrderApplicationService {
}
@Transactional
public void reject(RejectLegData data) {
public void reject(ApprovalLegData data) {
Command.of(LegRejectCommand.class).data(data).sendToQueue();
}
@Transactional
public void approval(ApprovalLegData data) {
Command.of(OrderApprovalCommand.class).actualNo(data.getActualOrderNo()).sendToQueue();
}
}

View File

@ -0,0 +1,38 @@
package com.chint.domain.aggregates.order;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.relational.core.mapping.Column;
import java.time.LocalDateTime;
import static com.chint.infrastructure.constant.Constant.*;
@Data
public class ApprovalEvent {
@Id
private Long approveEventId;
@Column("route_id")
private Long routeId;
private Integer eventType;
@Transient
private String eventName;
private LocalDateTime happenTime;
public String translateApprovalEvent(int event) {
return switch (event) {
case APPROVAL_EVENT_PREPARE -> APPROVAL_EVENT_PREPARE_NAME;
case APPROVAL_EVENT_SUCCESS -> APPROVAL_EVENT_SUCCESS_NAME;
case APPROVAL_EVENT_FAIL -> APPROVAL_EVENT_FAIL_NAME;
default -> "未知事件";
};
}
public ApprovalEvent reloadStatus() {
this.setEventName(translateApprovalEvent(this.eventType));
return this;
}
}

View File

@ -4,6 +4,7 @@ package com.chint.domain.aggregates.order;
import com.chint.domain.exceptions.LegEventException;
import com.chint.domain.service.amount_estimate.EstimateAdapter;
import com.chint.domain.value_object.LegData;
import com.chint.domain.value_object.enums.CurrencyType;
import com.chint.infrastructure.util.BigDecimalCalculator;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -14,6 +15,7 @@ import org.springframework.data.relational.core.mapping.MappedCollection;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import static com.chint.infrastructure.constant.Constant.*;
@ -27,6 +29,8 @@ public class Leg {
@Id
private Long legId;
private String legNo;
private Integer legType;
private LocalDateTime startTime;
@ -35,6 +39,8 @@ public class Leg {
private String estimateAmount;
private LocalDateTime createTime;
@Column("origin_id")
private Long originId;
@Transient
@ -54,6 +60,8 @@ public class Leg {
@Transient
private String legStatusName;
@Transient
private CurrencyType currencyType;
@Transient
private List<OrderDetail> orderDetails; //这个属性不做持久化保存 根据下单事件进行获取
@MappedCollection(idColumn = "leg_id", keyColumn = "leg_key")
@ -101,6 +109,7 @@ public class Leg {
.reduce(BigDecimalCalculator::add)
.orElse(KEEP_TWO_DECIMAL_ZERO);
this.orderDetails = detail;
this.currencyType = detail.get(0).getCurrencyType();
});
}
}
@ -116,10 +125,11 @@ public class Leg {
public Leg reloadStatus(LegData legData) {
this.reloadStatus();
if (Objects.equals(legData.getLegId(), this.getLegId()) && this.legStatus.equals(LEG_STATUS_PREPARE)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
this.setOriginId(legData.getOriginId());
this.setDestinationId(legData.getDestinationId());
this.setStartTime(legData.getStartTime());
this.setEndTime(legData.getEndTime());
this.setStartTime(LocalDateTime.parse(legData.getStartTime(), formatter));
this.setEndTime(LocalDateTime.parse(legData.getEndTime(), formatter));
this.setLegType(legData.getLegType());
}
return this;

View File

@ -1,5 +1,6 @@
package com.chint.domain.aggregates.order;
import com.chint.domain.value_object.enums.CurrencyType;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
@ -9,6 +10,7 @@ import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Currency;
import java.util.List;
import static com.chint.infrastructure.constant.Constant.LEG_EVENT_ORDERED;
@ -25,6 +27,7 @@ public class OrderDetail {
private Integer productType; // 商品类型
private Integer quantity; // 数量
private String price; // 价格
private CurrencyType currencyType; //货币类型
private Long destinationId;
private Long originId;
private LocalDateTime startTime;

View File

@ -16,8 +16,8 @@ import static com.chint.infrastructure.constant.Constant.LEG_EVENT_REJECT_NAME;
public class OrderEvent {
@Id
private Long orderEventId;
@Column("leg_id")
private Long legId;
@Column("route_id")
private Long routeId;
private Integer eventType;
@Transient

View File

@ -17,6 +17,8 @@ import org.springframework.data.relational.core.mapping.MappedCollection;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
@ -49,7 +51,13 @@ public class RouteOrder extends BaseEntity {
@Transient
private Integer orderStatus;
@Transient
private String approvalStatus;
@Transient
private String orderStatusName;
@Transient
private String startTime;
@Transient
private String endTime;
private String supplierName;
@ -59,6 +67,8 @@ public class RouteOrder extends BaseEntity {
@MappedCollection(idColumn = "route_id", keyColumn = "route_order_key")
private List<OrderDetail> orderDetails;
@MappedCollection(idColumn = "route_id", keyColumn = "route_order_key")
private List<ApprovalEvent> approveEvents;
// public void addItemAtPosition(Leg newItem) {
// Integer position = newItem.getSequence();
@ -94,11 +104,47 @@ public class RouteOrder extends BaseEntity {
return this;
}
public RouteOrder addLeg(Leg leg) {
this.legItems.add(leg);
return this;
}
public RouteOrder deleteLeg(String legNo) {
if (this.legItems == null || this.legItems.isEmpty()) {
return this;
}
this.getLegItems()
.removeIf(leg -> legNo.equals(leg.getLegNo()));
return this;
}
public RouteOrder addOrderDetail(OrderDetail orderDetail) {
if(this.orderDetails == null){
this.orderDetails = new ArrayList<>();
}
this.orderDetails.add(orderDetail);
return this;
}
public RouteOrder addApprovalEvent(ApprovalEvent approvalEvent) {
if(this.approveEvents == null){
this.approveEvents = new ArrayList<>();
}
this.approveEvents.add(approvalEvent);
return this;
}
private RouteOrder reloadApprovalStatus(){
if (this.approveEvents != null && !this.approveEvents.isEmpty()) {
this.approveEvents.stream()
.max(Comparator.comparingLong(ApprovalEvent::getApproveEventId))
.ifPresent(event -> this.setApprovalStatus(event.reloadStatus().getEventName()));
} else {
this.setApprovalStatus(APPROVAL_EVENT_PREPARE_NAME);
}
return this;
}
public RouteOrder reloadStatus() {
this.getLegItems().forEach(Leg::reloadStatus);
this.estimateAmount = this.getLegItems()
@ -115,6 +161,7 @@ public class RouteOrder extends BaseEntity {
.orElse(KEEP_TWO_DECIMAL_ZERO);
this.updateStatus();
this.orderStatusName = translateOrderStatus(this.orderStatus);
reloadTime();
return this;
}
@ -205,4 +252,18 @@ public class RouteOrder extends BaseEntity {
default -> "未知状态";
};
}
private RouteOrder reloadTime() {
if (this.getLegItems() != null && !this.getLegItems().isEmpty()) {
List<LocalDateTime> times = new ArrayList<>();
this.getLegItems().forEach(leg -> {
times.add(leg.getStartTime());
times.add(leg.getEndTime());
});
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
this.endTime = dateTimeFormatter.format(times.stream().max(LocalDateTime::compareTo).get());
this.startTime = dateTimeFormatter.format(times.stream().min(LocalDateTime::compareTo).get());
}
return this;
}
}

View File

@ -7,4 +7,5 @@ import java.util.List;
public interface LegFactory {
List<Leg> createLegBatch(List<LegData> legData);
Leg createLeg(LegData legData);
}

View File

@ -3,9 +3,12 @@ package com.chint.domain.factoriy.leg;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.factoriy.location.LocationFactory;
import com.chint.domain.value_object.LegData;
import com.chint.infrastructure.util.OrderNo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@ -19,17 +22,27 @@ public class RouteLegFactory implements LegFactory {
@Override
public List<Leg> createLegBatch(List<LegData> legData) {
return legData.stream().sorted(Comparator.comparing(LegData::getStartTime))
.map(data -> {
.map(RouteLegFactory::getLeg).collect(Collectors.toList());
}
@Override
public Leg createLeg(LegData data) {
return getLeg(data);
}
private static Leg getLeg(LegData data) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Leg leg = new Leg();
leg.setLegNo(OrderNo.generateLegNo());
leg.setLegType(data.legType);
leg.setStartTime(data.getStartTime());
leg.setEndTime(data.getEndTime());
leg.setStartTime(LocalDateTime.parse(data.getStartTime(), formatter));
leg.setEndTime(LocalDateTime.parse(data.getEndTime(), formatter));
leg.setOriginId(data.getOriginId());
leg.setDestinationId(data.getDestinationId());
leg.setCreateTime(LocalDateTime.now());
if (data.getLegId() != null) {
leg.setLegId(data.getLegId());
}
return leg;
}).collect(Collectors.toList());
}
}

View File

@ -1,11 +1,14 @@
package com.chint.domain.factoriy.order;
import com.chint.application.commands.OrderCreateCommand;
import com.chint.domain.aggregates.order.ApprovalEvent;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.value_object.OrderSaveData;
public interface OrderFactory {
RouteOrder createOrder(OrderSaveData orderData);
RouteOrder createOrder(OrderCreateCommand command);
RouteOrder createRoute(OrderSaveData orderData);
RouteOrder createRoute(OrderCreateCommand command);
ApprovalEvent createApprovalEvent(Integer eventType);
}

View File

@ -1,6 +1,7 @@
package com.chint.domain.factoriy.order;
import com.chint.application.commands.OrderCreateCommand;
import com.chint.domain.aggregates.order.ApprovalEvent;
import com.chint.domain.aggregates.order.ApproveOrderNo;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.aggregates.order.RouteOrder;
@ -24,7 +25,7 @@ public class RouteOrderFactory implements OrderFactory {
private RouteLegFactory routeLegFactory;
@Override
public RouteOrder createOrder(OrderSaveData orderData) {
public RouteOrder createRoute(OrderSaveData orderData) {
User currentUser = BaseContext.getCurrentUser();
List<LegData> legDataList = orderData.getLegDataList();
List<Leg> leglist = routeLegFactory.createLegBatch(legDataList);
@ -42,7 +43,7 @@ public class RouteOrderFactory implements OrderFactory {
}
@Override
public RouteOrder createOrder(OrderCreateCommand command) {
public RouteOrder createRoute(OrderCreateCommand command) {
UserLoginParam loginParam = command.getLoginParam();
RouteOrder routeOrder = new RouteOrder();
routeOrder.setRouteOrderNo(OrderNo.generate());
@ -54,4 +55,12 @@ public class RouteOrderFactory implements OrderFactory {
routeOrder.setBookingTime(LocalDateTime.now());
return routeOrder;
}
@Override
public ApprovalEvent createApprovalEvent(Integer eventType) {
ApprovalEvent approvalEvent = new ApprovalEvent();
approvalEvent.setEventType(eventType);
approvalEvent.setHappenTime(LocalDateTime.now());
return approvalEvent;
}
}

View File

@ -17,4 +17,6 @@ public interface LocationRepository {
void saveAll(List<Location> locations);
List<Location> findByFirstLetter(LocationParam locationParam);
List<Location> findByName(LocationParam locationParam);
}

View File

@ -19,18 +19,28 @@ public class LocationDomainService {
public List<Location> queryByFirstLetter(LocationParam locationParam) {
List<Location> byFirstPinYin = locationRepository.findByFirstLetter(locationParam);
Integer cityType = locationParam.getCityType();
return switch (cityType) {
case CITY_TYPE_DOMESTIC -> byFirstPinYin
.stream()
.filter(location -> location.getLocationPath().startsWith(CITY_TYPE_DOMESTIC_PATH)).toList();
case CITY_TYPE_FOREIGN -> byFirstPinYin
.stream()
.filter(location -> !location.getLocationPath().startsWith(CITY_TYPE_DOMESTIC_PATH)).toList();
default -> throw new NotFoundException(NOT_FOUND);
};
return getLocationsByType(locationParam, byFirstPinYin);
}
public List<Location> queryByCityName(LocationParam locationParam) {
List<Location> queryByCityName = locationRepository.findByName(locationParam);
return getLocationsByType(locationParam, queryByCityName);
}
private List<Location> getLocationsByType(LocationParam locationParam, List<Location> queryByCityName) {
Integer cityType = locationParam.getCityType();
return switch (cityType) {
case CITY_TYPE_DOMESTIC -> queryByCityName
.stream()
.filter(location -> location.getLocationPath().startsWith(CITY_TYPE_DOMESTIC_PATH)
&& location.getLevel().equals(3)).toList();
case CITY_TYPE_FOREIGN -> queryByCityName
.stream()
.filter(location -> !location.getLocationPath().startsWith(CITY_TYPE_DOMESTIC_PATH)
&& location.getLevel().equals(3)).toList();
default -> throw new NotFoundException(NOT_FOUND);
};
}
}

View File

@ -1,6 +1,8 @@
package com.chint.domain.service;
import com.chint.application.commands.OrderApprovalCommand;
import com.chint.application.commands.OrderCreateCommand;
import com.chint.domain.aggregates.order.ApprovalEvent;
import com.chint.domain.aggregates.order.Leg;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.aggregates.user.User;
@ -17,6 +19,8 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
import static com.chint.infrastructure.constant.Constant.APPROVAL_EVENT_PREPARE;
@Service
public class OrderDomainService {
@Autowired
@ -49,9 +53,21 @@ public class OrderDomainService {
User byUserEmployeeNo = userRepository.findByUserEmployeeNo(Long.valueOf(loginParam.getSfno()));
return Optional.ofNullable(routeRepository.findByFakeOrderNo(loginParam.getBillcode())).orElseGet(() -> {
BaseContext.setCurrentUser(byUserEmployeeNo);
RouteOrder order = routeOrderFactory.createOrder(command);
RouteOrder order = routeOrderFactory.createRoute(command);
ApprovalEvent approvalEvent = routeOrderFactory.createApprovalEvent(APPROVAL_EVENT_PREPARE);
order.addApprovalEvent(approvalEvent);
this.saveOrder(order);
return order;
});
}
@ListenTo(command = "OrderApprovalCommand", order = 0)
public void approvalOrder(OrderApprovalCommand command) {
Optional.ofNullable(routeRepository.findByActualOrderNo(command.getActualNo()))
.ifPresent(route -> {
ApprovalEvent approvalEvent = routeOrderFactory.createApprovalEvent(command.getType());
route.addApprovalEvent(approvalEvent);
this.saveOrder(route);
});
}
}

View File

@ -11,6 +11,7 @@ import com.chint.infrastructure.util.Json;
import com.chint.infrastructure.util.Token;
import com.chint.interfaces.rest.user.UserHttpRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@ -29,6 +30,9 @@ public class AuthenticateServiceImpl implements AuthenticateService {
@Autowired
private Json json;
@Value("${chint.url}")
public String SYSTEM_HOME_URL;//国内
@Autowired
public AuthenticateServiceImpl(UserRepository userRepository, UserHttpRequest httpRequest) {
this.userRepository = userRepository;
@ -54,8 +58,8 @@ public class AuthenticateServiceImpl implements AuthenticateService {
claims.put(USER_LOGIN_PARAM, json.gson().toJson(userLoginParam));
String jwt = JWTUtil.createJWT(claims);
return UserLoginResult.buildWithUser(user).loadToken(Token.of(jwt)).redirectUrl(SYSTEM_HOME_URL +
"?token=" + Digest.aes(jwt));
return UserLoginResult.buildWithUser(user).loadToken(Token.of(jwt));
} else {
User newUser = userFactory.create(userLoginParam.getSfno());
//如果数据库不存在该用户需要通过sf信息进行查询并保存到数据库

View File

@ -167,6 +167,7 @@ public class LegEventHandler implements LegEventService {
RouteOrder routeOrder = routeRepository.findByActualOrderNo(command.getData().getActualOrderNo());
LegEvent legEvent = legEventFactory.creatLegEvent(command.getLegEventType());
routeOrder.getLegItems().forEach(leg -> leg.addEvent(legEvent));
//为每一个行程节点添加审批拒绝时间 routeOrder 也添加审批拒绝时间
routeRepository.save(routeOrder);
}
}

View File

@ -3,7 +3,7 @@ package com.chint.domain.value_object;
import lombok.Data;
@Data
public class RejectLegData {
public class ApprovalLegData {
// private Long routeId;
// private String fakeOrderNo;
private String actualOrderNo;

View File

@ -1,5 +1,6 @@
package com.chint.domain.value_object;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@ -11,9 +12,10 @@ public class LegData {
public final Integer legType;
public final LocalDateTime startTime;
public final LocalDateTime endTime;
public final String startTime;
public final String endTime;
public final Long originId;

View File

@ -9,9 +9,10 @@ public class SupplierCallbackData {
private Integer productType; //用于区分同程搜索数据
private Object data;
public static SupplierCallbackData of(String supplierName) {
public static SupplierCallbackData of(String supplierName, String employeeNo) {
SupplierCallbackData supplierCallbackData = new SupplierCallbackData();
supplierCallbackData.setSupplierName(supplierName);
supplierCallbackData.setEmployeeNo(employeeNo);
return supplierCallbackData;
}

View File

@ -8,7 +8,7 @@ import lombok.Data;
public class UserLoginResult {
private User user;
private Token token;
private String redirectUrl;
// private String redirectUrl;
public UserLoginResult(User user) {
this.user = user;
@ -40,8 +40,8 @@ public class UserLoginResult {
return this;
}
public UserLoginResult redirectUrl(String url) {
this.redirectUrl = url;
return this;
}
// public UserLoginResult redirectUrl(String url) {
// this.redirectUrl = url;
// return this;
// }
}

View File

@ -0,0 +1,50 @@
package com.chint.domain.value_object.enums;
import lombok.Data;
public enum CurrencyType {
RENMINBI("CNY", "RMB", "人民币"),
US_DOLLAR("USD", "USD", "美元"),
EURO("EUR", "EUR", "欧元"),
JAPANESE_YEN("JPY", "JPY", "日元"),
BRITISH_POUND("GBP", "GBP", "英镑"),
AUSTRALIAN_DOLLAR("AUD", "AUD", "澳大利亚元"),
CANADIAN_DOLLAR("CAD", "CAD", "加拿大元"),
SWISS_FRANC("CHF", "CHF", "瑞士法郎"),
SWEDISH_KRONA("SEK", "SEK", "瑞典克朗"),
NEW_ZEALAND_DOLLAR("NZD", "NZD", "新西兰元");
private final String code;
private final String abbreviation;
private final String description;
CurrencyType(String code, String abbreviation, String description) {
this.code = code;
this.abbreviation = abbreviation;
this.description = description;
}
public String getCode() {
return code;
}
public String getAbbreviation() {
return abbreviation;
}
public String getDescription() {
return description;
}
public static CurrencyType getByCode(String code) {
for (CurrencyType currency : CurrencyType.values()) {
if (currency.getCode().equalsIgnoreCase(code)) {
return currency;
}
}
return null;
}
}

View File

@ -1,5 +1,7 @@
package com.chint.infrastructure.constant;
import org.springframework.beans.factory.annotation.Value;
public class Constant {
// 通用消息
// 通用消息
@ -111,6 +113,15 @@ public class Constant {
public static final int ORDER_EVENT_CANCEL = -1;
public static final String ORDER_EVENT_CANCEL_NAME = "取消";
//审批事件
public static final int APPROVAL_EVENT_PREPARE = 0;
public static final String APPROVAL_EVENT_PREPARE_NAME = "未审批";
public static final int APPROVAL_EVENT_SUCCESS = 1;
public static final String APPROVAL_EVENT_SUCCESS_NAME = "已通过";
public static final int APPROVAL_EVENT_FAIL = -1;
public static final String APPROVAL_EVENT_FAIL_NAME = "已驳回";
// 金额
public static final String KEEP_TWO_DECIMAL_ZERO = "0.00";
@ -168,10 +179,9 @@ public class Constant {
public static final String C_TRIP_APPROVAL_PATH = "/switchapi/approval.svc/rest/setapproval";
public static final String C_TRIP_ESTIMATE_PATH = "/bookingrelatedservice/bookingrelatedopenapi";
public static final String C_TRIP_TOKEN_PATH = "/dataservice/token/getAccessToken";
public static final String C_TRIP_AUTH_LOGIN = "/corpservice/authorize/login";
public static final String C_TRIP_SINGLE_LOGIN = "/m/SingleSignOn/H5SignInfo";
public static final String C_TRIP_REQUEST_SECRET = "zhengtai2024_nEbmKfOo";
//同程
@ -215,7 +225,17 @@ public class Constant {
public static final String CITY_TYPE_DOMESTIC_PATH = "3106_1_";//国内
public static final int CITY_TYPE_FOREIGN = 1;//国外
//system
public static final String SYSTEM_HOME_URL = "www.baidu.com";//国内
public static final String AES_SECRET = "chint";//国内
//元年数据回传
public static final String TRIP_CALLBACK_METHOD_NAME = "trip.callback";//方法名称
public static final String TRIP_CALLBACK_RECEIPT_STATUS = "WAIT_COMMIT";//申请单状态
public static final String TRIP_CALLBACK_TYPE_APPROVE = "o";//申请单类型
public static final String TRIP_CALLBACK_FLIGHT_TYPE = "Flight";//申请单类型
public static final String TRIP_CALLBACK_HOTEL_TYPE = "Hotel";//申请单类型
public static final String TRIP_CALLBACK_TRAIN_TYPE = "Train";//申请单类型
public static final String TRIP_CALLBACK_OTHER_TYPE = "Other";//申请单类型
}

View File

@ -58,6 +58,11 @@ public class LocationRepositoryImpl implements LocationRepository {
@Override
public List<Location> findByFirstLetter(LocationParam locationParam) {
return jdbcLocationRepository.findByFirstPinYin(locationParam.getFirstLetter());
return jdbcLocationRepository.findByFirstPinYin(locationParam.getQueryWord());
}
@Override
public List<Location> findByName(LocationParam locationParam) {
return jdbcLocationRepository.findByLocationNameContaining(locationParam.getQueryWord());
}
}

View File

@ -45,7 +45,7 @@ public class RouteRepositoryImpl implements RouteRepository {
@Override
public PageResult<RouteOrder> pageQuery(OrderQueryData orderQueryData) {
PageRequest sort = PageRequest
.of(orderQueryData.getPageNum(), orderQueryData.getPageSize(), Sort.by("sort"));
.of(orderQueryData.getPageNum() - 1, orderQueryData.getPageSize(), Sort.by("sort"));
User currentUser = BaseContext.getCurrentUser();
Page<RouteOrder> byUserId = jdbcRouteRepository.findByCreateUser(currentUser.getUserId().toString(), sort);
List<RouteOrder> orders = byUserId.toList();

View File

@ -19,5 +19,8 @@ public interface JdbcLocationRepository extends CrudRepository<Location, Long> {
Page<Location> findAllByLevel(Long level, Pageable pageable);
List<Location> findByFirstPinYin(String firstPinYin);
List<Location> findByLocationNameContaining(String locationName);
}

View File

@ -14,6 +14,18 @@ public class OrderNo {
// 生成随机序列部分
int randomPart = new Random().nextInt(9000) + 1000; // 生成1000到9999之间的随机数
// 拼接最终的订单号
return datePart + randomPart;
return "R" + datePart + randomPart;
}
public static String generateLegNo() {
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 格式化日期和时间部分
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMddHHmmss");
String datePart = now.format(formatter);
// 生成随机序列部分
int randomPart = new Random().nextInt(9000) + 1000; // 生成1000到9999之间的随机数
// 拼接最终的订单号
return "L" + datePart + randomPart;
}
}

View File

@ -0,0 +1,26 @@
package com.chint.infrastructure.util;
public class StringCheck {
public static boolean isFirstCharacterChinese(String str) {
if (str == null || str.isEmpty()) {
return false;
}
char firstChar = str.charAt(0);
return Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|| Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| Character.UnicodeBlock.of(firstChar) == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS;
}
public static boolean isFirstCharacterAlphabetic(String str) {
if (str == null || str.isEmpty()) {
return false;
}
char firstChar = str.charAt(0);
return Character.isLetter(firstChar);
}
}

View File

@ -6,6 +6,7 @@ import java.io.Serializable;
@Data
public class Token implements Serializable {
private String token;
private Token(String token) {

View File

@ -31,9 +31,9 @@ public class JwtTokenAdminInterceptor implements HandlerInterceptor {
}
try {
String str = Digest.aesBack(token);
JWTUtil.verifyJWT(SECRET, str);
var parseJWT = JWTUtil.parseJWT(SECRET, str);
// String str = Digest.aesBack(token);
JWTUtil.verifyJWT(SECRET, token);
var parseJWT = JWTUtil.parseJWT(SECRET, token);
var withJwt = User.withJwt(parseJWT);
BaseContext.setCurrentUser(withJwt);
return true; // If verification succeeds, continue processing the request

View File

@ -31,7 +31,7 @@ public class CTripOrderSearchRequest {
return postRequest.post(searchUrl, request, SearchOrderResponse.class);
}
public SearchOrderResponse SearchOrderResponseByOrderId(String orderId){
public SearchOrderResponse searchOrderResponseByOrderId(String orderId){
String ticket = ticketRequest.loadTicket();
SearchOrderRequest request = SearchOrderRequest
.builder()

View File

@ -1,27 +1,40 @@
package com.chint.interfaces.rest.ctrip.in;
import com.chint.domain.service.supplier.SupplierService;
import com.chint.domain.value_object.SupplierCallbackData;
import com.chint.interfaces.rest.ctrip.CTripOrderSearchRequest;
import com.chint.interfaces.rest.ctrip.dto.put.CTripNoteResponse;
import com.chint.interfaces.rest.ctrip.dto.put.CTripNotification;
import com.chint.interfaces.rest.ctrip.dto.search.SearchOrderResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.chint.infrastructure.constant.Constant.SUPPLIER_C_TRIP;
@RestController
@RequestMapping("/public/CTrip")
public class CTripNoteController {
@Autowired
private SupplierService supplierService;
@Autowired
private CTripOrderSearchRequest cTripOrderSearchRequest;
@PostMapping("/event")
public CTripNoteResponse noteEvent(@RequestBody CTripNotification cTripNotification) {
if (cTripNotification.getContent() != null) {
//成功触发消息需要查询对于的订单信息
//如果订单不存在需要保存到数据库以及对应的行程规划单下
//如果订单以及存在那么只需要给对应的订单加入对应的事件
if (cTripNotification.getContent() != null && cTripNotification.getPreEmployeeID() != null) {
//成功触发消息需要查询对于的订单信息調用订单查询的服务来查询该订单详情
SupplierCallbackData supplierCallbackData =
SupplierCallbackData.of(SUPPLIER_C_TRIP, cTripNotification.getPreEmployeeID());
SearchOrderResponse response = cTripOrderSearchRequest
.searchOrderResponseByOrderId(cTripNotification.getBusinessId());
supplierCallbackData.data(response);
supplierService.handleSupplierCallback(supplierCallbackData);
return new CTripNoteResponse("0", "成功收到消息");
}
return new CTripNoteResponse("1", "未收到消息");

View File

@ -4,13 +4,16 @@ server:
chint:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
host: rm-cn-jeo3lfy9q0006gso.rwlb.rds.aliyuncs.com
host: 10.10.24.44
# host: 10.9.56.48
port: 3306
port: 6603
database: itinerary_booking
username: echo
password: R3nd0mP@ssw0rd!
username: tripbook
password: W@Xgf25d&lRk*L0X#
url: https://gxdev03.chint.com/businesstravel/
logging:
level:
org.springframework.jdbc.core.JdbcTemplate: DEBUG
org.springframework.jdbc.core.StatementCreatorUtils: TRACE

View File

@ -9,4 +9,5 @@ chint:
database: itinerary_booking
username: root
password: 123456
url: https://gxdev03.chint.com/businesstravel/

View File

@ -0,0 +1,18 @@
server:
port: 8081
chint:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
host: rm-cn-jeo3lfy9q0006gso.rwlb.rds.aliyuncs.com
# host: 10.9.56.48
port: 3306
database: itinerary_booking
username: echo
password: R3nd0mP@ssw0rd!
url: https://gxdev03.chint.com/businesstravel/
logging:
level:
org.springframework.jdbc.core.JdbcTemplate: DEBUG
org.springframework.jdbc.core.StatementCreatorUtils: TRACE

View File

@ -1,6 +1,6 @@
spring:
profiles:
active: dev
active: test
datasource:
driver-class-name: ${chint.datasource.driver-class-name}
url: jdbc:mysql://${chint.datasource.host}:${chint.datasource.port}/${chint.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true

View File

@ -31,11 +31,11 @@ class RouteApplicationTests {
@Test
void loginSign() {
String sfno = "220322120";
String sfno = "230615020";
String syscode = "abc";
String billcode = "12345622";
String billcode = "KK12321412323";
String sec = "Superdandan";
String timespan = "12312312312312";
String timespan = "12312321412312";
String s = Digest.md5(sfno + syscode + billcode + sec + timespan);
System.out.println(s);
}