Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
7d9fe0b0e8
|
@ -0,0 +1,17 @@
|
|||
package com.chint.application.dtos;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LoginResponse {
|
||||
private String redirectUrl;
|
||||
private boolean success;
|
||||
|
||||
public static LoginResponse success(String redirectUrl){
|
||||
LoginResponse loginResponse = new LoginResponse();
|
||||
loginResponse.setSuccess(true);
|
||||
loginResponse.setRedirectUrl(redirectUrl);
|
||||
return loginResponse;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.chint.application.dtos;
|
||||
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UserDTO {
|
||||
private String accountId;
|
||||
private String mobile;
|
||||
private String userName;
|
||||
private String uid;
|
||||
private String email;
|
||||
|
||||
// 构造函数和其他方法(getter 和 setter)可以根据需要添加
|
||||
|
||||
// Getter 和 Setter 方法
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.chint.application.out;
|
||||
|
||||
import com.chint.application.dtos.LoginResponse;
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import com.chint.infrastructure.util.BaseContext;
|
||||
import com.chint.infrastructure.util.Result;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import static com.chint.infrastructure.constant.CommonMessageConstant.SUCCESS;
|
||||
import static com.chint.infrastructure.constant.FSSCConstant.FSSC_LOGIN_PATH;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/fssc")
|
||||
public class FSSCController {
|
||||
|
||||
@Value("${FSSC.baseUrl}")
|
||||
private String FSSCUrl;
|
||||
|
||||
@ApiOperation("单点登录到财务共享")
|
||||
@PostMapping("/login")
|
||||
public Result<LoginResponse> loginToFSSC() {
|
||||
User currentUser = BaseContext.getCurrentUser();
|
||||
return Result.Success(SUCCESS, LoginResponse.success(FSSCUrl +FSSC_LOGIN_PATH + currentUser.getEmployeeNo().toString()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -17,12 +17,10 @@ import com.chint.infrastructure.util.Result;
|
|||
import com.chint.interfaces.rest.ctrip.CTripUserSaveRequest;
|
||||
import com.chint.interfaces.rest.ly.LYUserRequest;
|
||||
import com.chint.interfaces.rest.user.UserHttpRequest;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
|
@ -45,6 +43,7 @@ public class LoginController {
|
|||
@Autowired
|
||||
private SystemDomainService systemDomainService;
|
||||
|
||||
@ApiOperation("财务共享登录")
|
||||
@Transactional
|
||||
@GetMapping("/login")
|
||||
public Result<UserLoginResult> login(@RequestParam("sfno") String sfno,
|
||||
|
@ -96,4 +95,32 @@ public class LoginController {
|
|||
}
|
||||
}
|
||||
|
||||
@ApiOperation("商旅平台单点")
|
||||
@Transactional
|
||||
@PostMapping("/login/sso")
|
||||
public Result<UserLoginResult> loginSSO(){
|
||||
UserLoginParam userLoginParam = new UserLoginParam();
|
||||
userLoginParam.setSfno("170717012");
|
||||
UserLoginResult userLoginResult = authenticateService
|
||||
.authenticateEmployeeNo(userLoginParam);
|
||||
|
||||
//异步执行更新用户信息到同程
|
||||
User currentUser = userLoginResult.getUser();
|
||||
CompletableFuture.runAsync(() -> {
|
||||
BaseContext.setCurrentUser(currentUser);
|
||||
lyUserRequest.saveCurrentUser();
|
||||
BaseContext.removeCurrentUser();
|
||||
});
|
||||
//异步执行更新用户信息到携程
|
||||
CompletableFuture.runAsync(() -> {
|
||||
BaseContext.setCurrentUser(currentUser);
|
||||
cTripUserSaveRequest.saveUserToCTrip();
|
||||
BaseContext.removeCurrentUser();
|
||||
});
|
||||
|
||||
//清除职级信息
|
||||
userLoginResult.getUser().setProfLevel(null);
|
||||
userLoginResult.getUser().setManaLevel(null);
|
||||
return Result.Success(CommonMessageConstant.SUCCESS, userLoginResult);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -225,8 +225,10 @@ public class OrderQuery {
|
|||
.findFirst().get();
|
||||
|
||||
scheduleDetailBuilder
|
||||
.startCity(originCity.getCityName())
|
||||
.startCityName(originCity.getCityName())
|
||||
.startCityEnName(originCity.getCityename())
|
||||
.endCityName(destinationCity.getCityName())
|
||||
.endCity(destinationCity.getCityName())
|
||||
.endCityEnName(destinationCity.getCityename());
|
||||
}
|
||||
|
|
|
@ -2,7 +2,9 @@ package com.chint.application.services;
|
|||
|
||||
import com.chint.application.dtos.SupplierLoginParam;
|
||||
import com.chint.domain.aggregates.order.RouteOrder;
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import com.chint.domain.repository.RouteRepository;
|
||||
import com.chint.infrastructure.util.BaseContext;
|
||||
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;
|
||||
|
@ -45,7 +47,12 @@ public class SupplierLoginService {
|
|||
}
|
||||
|
||||
private String getEmployeeNo(Long routeId) {
|
||||
if (routeId != null) {
|
||||
RouteOrder routeOrder = routeRepository.queryById(routeId);
|
||||
return routeOrder.getUserId().toString();
|
||||
} else {
|
||||
User currentUser = BaseContext.getCurrentUser();
|
||||
return currentUser.getEmployeeNo().toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package com.chint.application.services.login;
|
||||
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
public class LocalLoginStrategy implements LoginStrategy {
|
||||
|
||||
|
||||
@Override
|
||||
public Optional<String> getAccessToken(String code) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getUserInfo(String accessToken) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.chint.application.services.login;
|
||||
|
||||
public interface LoginService<T> {
|
||||
T login(String username, String password);
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package com.chint.application.services.login;
|
||||
|
||||
|
||||
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import com.chint.domain.exceptions.AuthException;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpRequestBase;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public interface LoginStrategy {
|
||||
Logger log = LoggerFactory.getLogger("UserService");
|
||||
|
||||
default User login(String code) {
|
||||
Optional<String> accessToken = getAccessToken(code);
|
||||
return getUserInfo(accessToken.orElseThrow(()-> new AuthException("Failed to obtain access token")));
|
||||
}
|
||||
|
||||
Optional<String> getAccessToken(String code);
|
||||
|
||||
User getUserInfo(String accessToken);
|
||||
|
||||
static Optional<String> getAccessTokenMethod(HttpRequestBase request, String tokenName) {
|
||||
String responseBody = null;
|
||||
HttpClient client = HttpClients.createDefault();
|
||||
try {
|
||||
HttpResponse response = client.execute(request);
|
||||
responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
String pattern = "\"" + tokenName + "\":\"([^\"]+)\"";
|
||||
if (responseBody == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
Matcher matcher = Pattern.compile(pattern).matcher(responseBody);
|
||||
if (matcher.find()) {
|
||||
return Optional.of(matcher.group(1));
|
||||
} else {
|
||||
log.info(tokenName + " not found.");
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
package com.chint.application.services.login.strategy;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.chint.application.dtos.UserDTO;
|
||||
import com.chint.application.services.login.LoginStrategy;
|
||||
import com.chint.domain.aggregates.user.User;
|
||||
import com.chint.domain.exceptions.AuthException;
|
||||
import com.chint.domain.factoriy.user.UserFactory;
|
||||
import com.chint.domain.repository.UserRepository;
|
||||
import com.chint.interfaces.rest.user.UserHttpRequest;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static com.chint.infrastructure.constant.CommonMessageConstant.NOT_FOUND;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class PailaLoginStrategy implements LoginStrategy {
|
||||
|
||||
@Value("${paila.base-url}")
|
||||
private String baseUrl;
|
||||
|
||||
@Value("${paila.client-id}")
|
||||
private String clientId;
|
||||
|
||||
@Value("${paila.client-secret}")
|
||||
private String clientSecret;
|
||||
|
||||
@Value("${paila.redirect-url}")
|
||||
private String redirectUri;
|
||||
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
|
||||
@Autowired
|
||||
private UserHttpRequest userHttpRequest;
|
||||
|
||||
@Autowired
|
||||
private UserFactory userFactory;
|
||||
|
||||
@Override
|
||||
public Optional<String> getAccessToken(String code) {
|
||||
|
||||
log.info("开始执行登录");
|
||||
List<NameValuePair> parameters = Arrays.asList(
|
||||
new BasicNameValuePair("client_id", clientId),
|
||||
new BasicNameValuePair("client_secret", clientSecret),
|
||||
new BasicNameValuePair("redirect_uri", redirectUri),
|
||||
new BasicNameValuePair("code", code)
|
||||
);
|
||||
|
||||
HttpGet getMethod = getRequest("/profile/oauth2/accessToken", parameters);
|
||||
return LoginStrategy.getAccessTokenMethod(getMethod, "access_token");
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getUserInfo(String accessToken) {
|
||||
|
||||
|
||||
List<NameValuePair> userInfoParams = Collections.singletonList(
|
||||
new BasicNameValuePair("access_token", accessToken)
|
||||
);
|
||||
|
||||
HttpGet getMethodUserInfo = getRequest("/profile/oauth2/profile", userInfoParams);
|
||||
|
||||
String userInfoResBody = null;
|
||||
HttpClient client = HttpClients.createDefault();
|
||||
try {
|
||||
HttpResponse userInfoRes = client.execute(getMethodUserInfo);
|
||||
userInfoResBody = EntityUtils.toString(userInfoRes.getEntity(), "UTF-8");
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
UserDTO userDTO = JSON.parseObject(userInfoResBody, UserDTO.class);
|
||||
User user;
|
||||
if (userDTO != null) {
|
||||
user = userRepository.findByUserEmployeeNo(Long.parseLong(userDTO.getUid()));
|
||||
if (user == null) {
|
||||
user = userFactory.create(userDTO.getUid());
|
||||
userHttpRequest.loadUserInfo(user);
|
||||
userRepository.save(user);
|
||||
}
|
||||
} else {
|
||||
throw new AuthException(NOT_FOUND);
|
||||
}
|
||||
return user;
|
||||
}
|
||||
|
||||
private HttpGet getRequest(String path, List<NameValuePair> parameters) {
|
||||
String userInfoUrl = null;
|
||||
try {
|
||||
userInfoUrl = new URIBuilder(baseUrl).setPath(path)
|
||||
.setParameters(parameters).build().toString();
|
||||
} catch (URISyntaxException e) {
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
HttpGet request = new HttpGet(userInfoUrl);
|
||||
request.setHeader("Content-Type", "application/json");
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -16,6 +16,7 @@ import java.util.List;
|
|||
import java.util.Optional;
|
||||
|
||||
import static com.chint.infrastructure.constant.OrderConstant.ORDER_DETAIL_STATUS_SUCCESS;
|
||||
import static com.chint.infrastructure.constant.OrderConstant.ORDER_EVENT_ETA;
|
||||
import static com.chint.infrastructure.constant.UtilConstant.KEEP_TWO_DECIMAL_ZERO;
|
||||
|
||||
@Component
|
||||
|
@ -94,10 +95,31 @@ public class CTripOrderExtensionFactoryImpl implements OrderExtensionFactory {
|
|||
String orderNo = hotelOrderInfoEntity.getOrderID();
|
||||
Optional<OrderDetail> byOrderNo = orderDetailRepository.findByOrderNo(orderNo);
|
||||
String journeyNo = hotelOrderInfoEntity.getJourneyNo();
|
||||
|
||||
RouteOrder routeOrder = routeRepository.findByOrderNo(journeyNo).reloadStatus();
|
||||
|
||||
ApproveOrderNo approveOrderNo = routeOrder.getApproveOrderNo();
|
||||
HotelOrderDetail hotelOrderDetail = new HotelOrderDetail();
|
||||
|
||||
HotelOrderDetail hotelOrderDetail;
|
||||
if (byOrderNo.isPresent()) {
|
||||
if (byOrderNo.get().getHotelOrderDetail() == null) {
|
||||
hotelOrderDetail = new HotelOrderDetail();
|
||||
} else {
|
||||
hotelOrderDetail = byOrderNo.get().getHotelOrderDetail();
|
||||
}
|
||||
} else {
|
||||
hotelOrderDetail = new HotelOrderDetail();
|
||||
}
|
||||
|
||||
if (byOrderNo.isPresent() && byOrderNo.get()
|
||||
.getLastEvent()
|
||||
.getEventType()
|
||||
.equals(ORDER_EVENT_ETA)) {
|
||||
hotelOrderDetail.setOverStandard("true");
|
||||
} else {
|
||||
hotelOrderDetail.setOverStandard("false");
|
||||
}
|
||||
|
||||
hotelOrderDetail.setOrderNo(orderNo); //订单号
|
||||
hotelOrderDetail.setOverStandard(null); //是否超标
|
||||
hotelOrderDetail.setOrderStatus(ORDER_DETAIL_STATUS_SUCCESS);
|
||||
|
@ -126,8 +148,8 @@ public class CTripOrderExtensionFactoryImpl implements OrderExtensionFactory {
|
|||
hotelOrderDetail.setStarRate(hotelOrderInfoEntity.getStar());
|
||||
hotelOrderDetail.setCheckInDate(hotelOrderInfoEntity.getStartTime()); //入住日期
|
||||
hotelOrderDetail.setDepartureDate(hotelOrderInfoEntity.getEndTime()); //离店日期 "2022-09-10"
|
||||
hotelOrderDetail.setNightCount(hotelOrderInfoEntity.getQuantity()); //退订夜间数
|
||||
hotelOrderDetail.setRoomCount(hotelOrderInfoEntity.getQuantity()); //退订夜间数
|
||||
hotelOrderDetail.setNightCount(hotelOrderInfoEntity.getRoomDays()); //退订夜间数
|
||||
hotelOrderDetail.setRoomCount(hotelOrderInfoEntity.getRoomQuantity()); //退订夜间数
|
||||
hotelOrderDetail.setRoomTypeName(hotelOrderInfoEntity.getRoomName()); //房型
|
||||
hotelOrderDetail.setPaymentType("1"); //付款方式 0:公司统付1:个人付 2:混付
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@ public class LYOrderExtensionFactoryImpl implements OrderExtensionFactory {
|
|||
|
||||
@Override
|
||||
public TrainOrderDetail createTrainOrderDetail(Object trainOrderDetailData) {
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ public class AuthenticateServiceImpl implements AuthenticateService {
|
|||
User user = userRepository.findByUserEmployeeNo(Long.parseLong(userLoginParam.getSfno()));
|
||||
if (user != null) {
|
||||
// 部分数据需要通过查询外部的http来获取
|
||||
BaseContext.setCurrentUser(user);
|
||||
user.setCompanyCode(userLoginParam.getCompanyCode());
|
||||
user.setUserLoginParam(userLoginParam);
|
||||
httpRequest.loadUserInfo(user);
|
||||
|
|
|
@ -21,6 +21,16 @@ public class UserLoginParam {
|
|||
|
||||
private String timespan;
|
||||
|
||||
private String code;
|
||||
|
||||
public UserLoginParam(String sfno, String syscode, String billcode, String companyCode, String timespan) {
|
||||
this.sfno = sfno;
|
||||
this.syscode = syscode;
|
||||
this.billcode = billcode;
|
||||
this.companyCode = companyCode;
|
||||
this.timespan = timespan;
|
||||
}
|
||||
|
||||
public static UserLoginParam of(String json) {
|
||||
Gson gson = new Gson();
|
||||
return gson.fromJson(json, UserLoginParam.class);
|
||||
|
|
|
@ -9,4 +9,5 @@ public class FSSCConstant {
|
|||
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";//申请单类型
|
||||
public static final String FSSC_LOGIN_PATH = "/ecs-console/api/rest/loginWeaver?loginName=";//申请单类型
|
||||
}
|
||||
|
|
|
@ -66,7 +66,8 @@ public class HotelOrderInfoEntity {
|
|||
private String HotelConfirmNo; // 酒店确认号
|
||||
private String JourneyNo; // 旅程编号
|
||||
private String CostCenter; // 成本中心
|
||||
private String Quantity; //夜间数量
|
||||
private String RoomQuantity; //夜间数量
|
||||
private String RoomDays; //夜间数量
|
||||
private String Servicefee;
|
||||
// 后续字段含义类似,可根据实际情况添加注释
|
||||
private List<ClientInfo> ClientInfo; // 客户信息列表
|
||||
|
|
|
@ -50,5 +50,16 @@ cTrip:
|
|||
appSecurity: fI3}FZX+zUdxPa2W!R6I2gYO
|
||||
requestSecret: zhengtai2024_nEbmKfOo
|
||||
|
||||
FSSC:
|
||||
baseUrl: http://10.10.14.178:8080
|
||||
|
||||
paila:
|
||||
client-id: 0053df85723db94491e8
|
||||
client-secret: 7368bcec4c0f004c40585f6ed1087d887897
|
||||
redirect-url: https://gxdev03.chint.com/businesstravel/
|
||||
base-url: http://signin-test.chint.com
|
||||
token-name: token
|
||||
|
||||
|
||||
bpm:
|
||||
H3BPMUrl: http://10.207.0.245:8012
|
|
@ -20,3 +20,12 @@ cTrip:
|
|||
appSecurity: fI3}FZX+zUdxPa2W!R6I2gYO
|
||||
requestSecret: zhengtai2024_nEbmKfOo
|
||||
|
||||
FSSC:
|
||||
baseUrl: http://10.10.14.178:8080
|
||||
|
||||
paila:
|
||||
client-id: 0053df85723db94491e8
|
||||
client-secret: 7368bcec4c0f004c40585f6ed1087d887897
|
||||
redirect-url: https://gxdev03.chint.com/businesstravel/
|
||||
base-url: http://signin-test.chint.com
|
||||
token-name: token
|
||||
|
|
|
@ -39,5 +39,15 @@ cTrip:
|
|||
appSecurity: fI3}FZX+zUdxPa2W!R6I2gYO
|
||||
requestSecret: zhengtai2024_nEbmKfOo
|
||||
|
||||
FSSC:
|
||||
baseUrl: http://10.10.14.178:8080
|
||||
|
||||
paila:
|
||||
client-id: 0053df85723db94491e8
|
||||
client-secret: 7368bcec4c0f004c40585f6ed1087d887897
|
||||
redirect-url: https://gxdev03.chint.com/businesstravel/
|
||||
base-url: http://signin-test.chint.com
|
||||
token-name: token
|
||||
|
||||
bpm:
|
||||
H3BPMUrl: http://10.207.0.245:8012
|
|
@ -48,9 +48,9 @@ class RouteApplicationTests {
|
|||
LocalDateTime parse = LocalDateTime.parse("2024-04-15 23:59:00", dateTimeFormatter);
|
||||
System.out.println(parse);
|
||||
}
|
||||
// @Test
|
||||
@Test
|
||||
void loginSign() {
|
||||
String sfno = "230615020";
|
||||
String sfno = "170717012";
|
||||
String syscode = "FSSC";
|
||||
String billcode = "CLSQ240225000099";
|
||||
String companycode = "正泰集团股份有限公司";
|
||||
|
|
Loading…
Reference in New Issue