修改登录的用户信息同步逻辑 , 修改取消差旅申请单缺失行程的问题

This commit is contained in:
lulz1 2024-04-24 12:43:56 +08:00
parent 74f2e31f85
commit bfa2e83a6d
14 changed files with 121 additions and 86 deletions

View File

@ -0,0 +1,15 @@
package com.chint.application.commands;
import com.chint.domain.aggregates.user.User;
import com.chint.infrastructure.echo_framework.command.Command;
import lombok.Data;
@Data
public class UserLoginCommand extends Command {
private User user;
public UserLoginCommand user(User user) {
this.user = user;
return this;
}
}

View File

@ -1,29 +1,19 @@
package com.chint.application.in;
import com.alibaba.fastjson.JSON;
import com.chint.application.commands.LYOrderRecordGenerateCommand;
import com.chint.application.dtos.AuthenticationSignDto;
import com.chint.application.dtos.CTripRecordMonthSaveDTO;
import com.chint.domain.aggregates.order.OrderDetail;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.factoriy.order_record.LyStatementOrder;
import com.chint.infrastructure.config.LogConfig.Dto.LogPageDto;
import com.chint.infrastructure.config.LogConfig.SystemLog;
import com.chint.infrastructure.constant.CommonMessageConstant;
import com.chint.infrastructure.echo_framework.command.Command;
import com.chint.application.commands.OrderRecordGenerateCommand;
import com.chint.domain.factoriy.order_record.LyStatementOrder;
import com.chint.infrastructure.echo_framework.command.Command;
import com.chint.infrastructure.repository.jdbc.JdbcRouteRepository;
import com.chint.infrastructure.util.BeanCopyUtils;
import com.chint.infrastructure.util.DateTimeUtil;
import com.chint.infrastructure.util.PageResult;
import com.chint.infrastructure.util.Result;
import com.chint.interfaces.rest.ctrip.order.CTripOrderRecordAutoSave;
import com.chint.interfaces.rest.ly.reconciliation.dto.PageInfo;
import com.google.gson.Gson;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
@ -32,15 +22,11 @@ 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 com.chint.application.commands.OrderRecordGenerateCommand;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import static com.chint.infrastructure.constant.CommonMessageConstant.SUCCESS;
@RestController
@RequestMapping("/public")
public class AutoWorkController {
@ -52,7 +38,6 @@ public class AutoWorkController {
@Autowired
private LyStatementOrder lyStatementOrder;
@Transactional
@ApiOperation("自动拉取昨天的流水号每天晚上8点执行")
@PostMapping("/cTrip/record/save")
@ -104,5 +89,4 @@ public class AutoWorkController {
PageResult<RouteOrder> routeOrderPageResult = PageResult.totalPageNum(res.getTotalElements(), res.toList());
return Result.Success(SUCCESS, routeOrderPageResult);
}
}

View File

@ -2,6 +2,7 @@ package com.chint.application.out;
import com.chint.application.commands.OrderCreateCommand;
import com.chint.application.commands.UserLoginCommand;
import com.chint.application.services.login.strategy.ANFeiShuLoginStrategy;
import com.chint.application.services.login.strategy.FeishuLoginStrategy;
import com.chint.application.services.login.strategy.PailaLoginStrategy;
@ -27,7 +28,6 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
@ -104,12 +104,10 @@ public class LoginController {
//发送创建行程订单命令
Command.of(OrderCreateCommand.class).of(currentUser).sendToQueue();
}
syncUserInfoToSupplier(currentUser);
loginEventBoarder(currentUser);
//清除职级信息
userLoginResult.getUser().setProfLevel(null);
userLoginResult.getUser().setManaLevel(null);
//登录成功之后对该用户的行程规划单进行缓存
cacheUserRouteOrder(currentUser.getEmployeeNo());
return Result.Success(CommonMessageConstant.SUCCESS, userLoginResult);
} else {
return Result.error(AuthMessageConstant.SIGN_ERROR);
@ -128,13 +126,11 @@ public class LoginController {
//异步执行更新用户信息到同程
User currentUser = userLoginResult.getUser();
syncUserInfoToSupplier(currentUser);
loginEventBoarder(currentUser);
//清除职级信息
userLoginResult.getUser().setProfLevel(null);
userLoginResult.getUser().setManaLevel(null);
//登录成功之后对该用户的行程规划单进行缓存
cacheUserRouteOrder(currentUser.getEmployeeNo());
return Result.Success(CommonMessageConstant.SUCCESS, userLoginResult);
}
@ -150,14 +146,12 @@ public class LoginController {
//异步执行更新用户信息到同程
User currentUser = userLoginResult.getUser();
syncUserInfoToSupplier(currentUser);
loginEventBoarder(currentUser);
//清除职级信息
userLoginResult.getUser().setProfLevel(null);
userLoginResult.getUser().setManaLevel(null);
//登录成功之后对该用户的行程规划单进行缓存
cacheUserRouteOrder(currentUser.getEmployeeNo());
return Result.Success(CommonMessageConstant.SUCCESS, userLoginResult);
}
@ -172,50 +166,19 @@ public class LoginController {
//异步执行更新用户信息到同程
User currentUser = userLoginResult.getUser();
syncUserInfoToSupplier(currentUser);
loginEventBoarder(currentUser);
//清除职级信息
userLoginResult.getUser().setProfLevel(null);
userLoginResult.getUser().setManaLevel(null);
//登录成功之后对该用户的行程规划单进行缓存
cacheUserRouteOrder(currentUser.getEmployeeNo());
return Result.Success(CommonMessageConstant.SUCCESS, userLoginResult);
}
private void syncUserInfoToSupplier(User user) {
// 给定的 LocalDateTime 实例示例中为2024年3月1日15:00
if (user.checkSyncTime()) {
asyncUser(user);
} else {
log.info("未超过一天,不执行同步。");
}
}
public void asyncUser(User user) {
// 如果超过一天执行同步代码
CompletableFuture.runAsync(() -> {
BaseContext.setCurrentUser(user);
lyUserRequest.saveCurrentUser();
BaseContext.removeCurrentUser();
});
//异步执行更新用户信息到携程
CompletableFuture.runAsync(() -> {
BaseContext.setCurrentUser(user);
cTripUserSaveRequest.saveUserToCTrip();
BaseContext.removeCurrentUser();
});
// 发送保存用户同步时间
private void loginEventBoarder(User user) {
Command.of(UserLoginCommand.class).user(user).sendToQueue();
user.setSyncTime(LocalDateTime.now());
userRepository.save(user);
}
private void cacheUserRouteOrder(String employeeNo) {
//登录成功之后对该用户的行程规划单进行缓存
CompletableFuture.runAsync(() -> {
log.info("开始缓存" + employeeNo + "用户的行程规划单");
routeCacheService.preloadUserRoutes(employeeNo);
});
}
}

View File

@ -47,6 +47,12 @@ public class User implements Serializable {
private String phoneNumber;
private String password;
private LocalDateTime syncTime;
@Transient
private String manaLevel;
@Transient
private String profLevel;
@Transient
private String qualityLevel;
@MappedCollection(idColumn = "user_id", keyColumn = "user_key")
private List<UserDepartmentInfo> userDepartmentInfoList;
@Transient
@ -60,12 +66,6 @@ public class User implements Serializable {
@Transient
private String workStatus;
@Transient
private String manaLevel;
@Transient
private String profLevel;
@Transient
private String qualityLevel;
@Transient
private UserLoginParam userLoginParam;

View File

@ -16,7 +16,6 @@ import com.chint.domain.service.LegDomainService;
import com.chint.domain.service.OrderDomainService;
import com.chint.domain.service.RouteRequestDomainService;
import com.chint.domain.service.order_sync.SyncAdapter;
import com.chint.domain.value_object.ApprovalSimpleData;
import com.chint.domain.value_object.ApproveRouteData;
import com.chint.domain.value_object.OrderLegData;
import com.chint.domain.value_object.SyncLegData;
@ -35,13 +34,13 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Optional;
import static com.chint.infrastructure.constant.BPMConstant.*;
import static com.chint.infrastructure.constant.CommonMessageConstant.LEG_CHANGE_MAX_ERROR;
import static com.chint.infrastructure.constant.CommonMessageConstant.NOT_FOUND;
import static com.chint.infrastructure.constant.DataMessageConstant.DATA_NOT_FOUND;
import static com.chint.infrastructure.constant.LegConstant.*;
import static com.chint.infrastructure.constant.OrderConstant.*;
@ -207,6 +206,9 @@ public class LegEventHandler implements LegEventService {
String orderNo = data.getSelfOrderNo();
RouteOrder routeOrder = routeRequestDomainService.getRouteOrder(orderNo);
//获取行程规划单创建者作为该订单
if (routeOrder == null) {
throw new OrderException(NOT_FOUND + "单号为" + orderNo);
}
String employeeNo = routeOrder.getUserId();
User byUserEmployeeNo = userRepository.findByUserEmployeeNo(employeeNo);
BaseContext.setCurrentUser(byUserEmployeeNo);
@ -307,8 +309,15 @@ public class LegEventHandler implements LegEventService {
List<RouteRequest> routeRequestList = routeOrder.getRouteRequestList();
if(routeRequestList != null && !routeRequestList.isEmpty()) {
routeRequestList.forEach(it->syncAdapter.of(it.getSupplier()).cancelRouteRequest(it));
if (routeRequestList != null && !routeRequestList.isEmpty()) {
routeRequestList.forEach(it -> {
List<Long> legIds = it.getRouteRequestLegList().stream().map(RouteRequestLeg::getLegId).toList();
it.reloadGenerateRequestLegs(routeOrder.getLegItems()
.stream()
.filter(leg -> legIds.contains(leg.getLegId()))
.toList());
syncAdapter.of(it.getSupplier()).cancelRouteRequest(it);
});
} else {
if (!list.isEmpty() && !syncAdapter.of(routeOrder.getSupplierName()).cancelSyncSupplierOrder(routeOrder)) {
throw new CommandException("订单取消失败");
@ -389,7 +398,7 @@ public class LegEventHandler implements LegEventService {
}
case ANYS_BPM -> {
JTH3ChangeDto jth3ChangeDto = new JTH3ChangeDto();
bpmRequest.change(jth3ChangeDto,AN_FSSC,userId,accountCompany);
bpmRequest.change(jth3ChangeDto, AN_FSSC, userId, accountCompany);
}
default -> throw new NotFoundException(DATA_NOT_FOUND);
}

View File

@ -1,17 +1,23 @@
package com.chint.infrastructure.cache;
import com.chint.application.commands.UserLoginCommand;
import com.chint.domain.aggregates.order.ApproveOrderNo;
import com.chint.domain.aggregates.order.RouteOrder;
import com.chint.domain.aggregates.user.User;
import com.chint.infrastructure.echo_framework.annotation.ListenTo;
import com.chint.infrastructure.repository.jdbc.JdbcRouteRepository;
import com.chint.infrastructure.util.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Service
public class RouteCacheService {
@Autowired
@ -21,7 +27,16 @@ public class RouteCacheService {
private JdbcRouteRepository jdbcRouteRepository;
@ListenTo(command = "UserLoginCommand", order = 9)
public void loginAndPreloadUserRoutes(UserLoginCommand command) {
Optional.ofNullable(command.getUser())
.flatMap(it -> Optional.ofNullable(it.getEmployeeNo()))
.ifPresent(it -> CompletableFuture.runAsync(() -> preloadUserRoutes(it)));
}
public List<RouteOrder> preloadUserRoutes(String employeeNo) {
log.info("开始缓存用户行程规划单");
List<RouteOrder> routeOrders = jdbcRouteRepository.findByUserIdOrApproveOrderNo_Creator(employeeNo, employeeNo);
for (RouteOrder routeOrder : routeOrders) {
routeCacheManage.cacheRouteOrder(routeOrder);

View File

@ -35,9 +35,9 @@ public class OrderDetailExportFactory {
orderDetailExport.setProjectCode(it.getProjectOrderNo());
orderDetailExport.setSupplierName(translateSupplierName(it.getTrvaleSysType()));
User byUserEmployeeNo = null;
if (it.getUserCode() != null) {
if (it.getUserCode() != null && !it.getUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getUserCode());
} else if (it.getBookingUserCode() != null) {
} else if (it.getBookingUserCode() != null && !it.getBookingUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getBookingUserCode());
}
if (byUserEmployeeNo != null) {
@ -74,7 +74,7 @@ public class OrderDetailExportFactory {
orderDetailExport.setProjectCode(it.getProjectOrderNo());
orderDetailExport.setSupplierName(translateSupplierName(it.getTrvaleSysType()));
User byUserEmployeeNo = null;
if (it.getBookingUserCode() != null) {
if (it.getBookingUserCode() != null && !it.getBookingUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getBookingUserCode());
}
if (byUserEmployeeNo != null) {
@ -111,9 +111,9 @@ public class OrderDetailExportFactory {
orderDetailExport.setProjectCode(it.getProjectOrderNo());
orderDetailExport.setSupplierName(translateSupplierName(it.getTrvaleSysType()));
User byUserEmployeeNo = null;
if (it.getUserCode() != null) {
if (it.getUserCode() != null && !it.getUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getUserCode());
} else if (it.getBookingUserCode() != null) {
} else if (it.getBookingUserCode() != null && !it.getBookingUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getBookingUserCode());
}
if (byUserEmployeeNo != null) {
@ -150,9 +150,9 @@ public class OrderDetailExportFactory {
orderDetailExport.setProjectCode(it.getProjectOrderNo());
orderDetailExport.setSupplierName(translateSupplierName(it.getTrvaleSysType()));
User byUserEmployeeNo = null;
if (it.getUserCode() != null) {
if (it.getUserCode() != null && !it.getUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getUserCode());
} else if (it.getBookingUserCode() != null) {
} else if (it.getBookingUserCode() != null && !it.getBookingUserCode().isEmpty()) {
byUserEmployeeNo = userRepository.findByUserEmployeeNo(it.getBookingUserCode());
}
if (byUserEmployeeNo != null) {
@ -191,6 +191,7 @@ public class OrderDetailExportFactory {
return "未知";
}
return switch (orderStatus) {
case "0" -> "已取消";
case "1" -> "预定成功";
case "2" -> "改签成功";
case "3" -> "退费成功";

View File

@ -9,7 +9,7 @@ public class SystemUtil {
case BELONG_SYS_TYPE_FSSC -> BELONG_SYS_CODE_FSSC;
case BELONG_SYS_TYPE_H3BPM -> BELONG_SYS_CODE_H3BPM;
case BELONG_SYS_TYPE_XNFSSC -> BELONG_SYS_CODE_XNFSSC;
case BELONG_SYS_TYPE_ANFSSC -> BELONG_SYS_CODE_XNFSSC;
case BELONG_SYS_TYPE_ANFSSC -> BELONG_SYS_CODE_ANFSSC;
default -> BELONG_SYS_TYPE_NOT;
};
}

View File

@ -1,8 +1,10 @@
package com.chint.interfaces.rest.ctrip;
import com.chint.application.commands.UserLoginCommand;
import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.UserNameRepository;
import com.chint.infrastructure.constant.CTripConstant;
import com.chint.infrastructure.echo_framework.annotation.ListenTo;
import com.chint.infrastructure.util.BaseContext;
import com.chint.interfaces.rest.base.PostRequest;
import com.chint.interfaces.rest.ctrip.dto.AuthenticationResponseList;
@ -10,15 +12,19 @@ import com.chint.interfaces.rest.ctrip.dto.user.AuthenticationEntity;
import com.chint.interfaces.rest.ctrip.dto.user.AuthenticationInfo;
import com.chint.interfaces.rest.ctrip.dto.user.AuthenticationListRequest;
import com.chint.interfaces.rest.user.UserHttpRequest;
import com.chint.interfaces.rest.user.UserSync;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Service
public class CTripUserSaveRequest {
public class CTripUserSaveRequest implements UserSync {
@Autowired
private PostRequest postRequest;
@ -103,4 +109,17 @@ public class CTripUserSaveRequest {
authenticationEntity.setSubAccountName(subAccountName);
return authenticationEntity;
}
@ListenTo(command = "UserLoginCommand",order = 1)
@Override
public User syncUserInfoToSupplier(UserLoginCommand command) {
User user = command.getUser();
// 如果超过一天执行同步代码
if (user.checkSyncTime()) {
CompletableFuture.runAsync(() -> saveUserToCTrip(user));
} else {
log.info("未超过一天,不执行携程同步");
}
return user;
}
}

View File

@ -1,23 +1,28 @@
package com.chint.interfaces.rest.ly;
import com.chint.application.commands.UserLoginCommand;
import com.chint.domain.aggregates.user.User;
import com.chint.domain.repository.UserNameRepository;
import com.chint.infrastructure.echo_framework.annotation.ListenTo;
import com.chint.infrastructure.util.BaseContext;
import com.chint.interfaces.rest.ly.dto.user.EmployeeEntity;
import com.chint.interfaces.rest.ly.dto.user.EmployeeRequest;
import com.chint.interfaces.rest.ly.dto.user.UserResponse;
import com.chint.interfaces.rest.user.UserHttpRequest;
import com.chint.interfaces.rest.user.UserSync;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
import static com.chint.infrastructure.constant.LYConstant.L_Y_USER_PATH;
@Slf4j
@Service
public class LYUserRequest {
public class LYUserRequest implements UserSync {
@Value("${ly.baseUrl}")
@ -95,4 +100,17 @@ public class LYUserRequest {
employeeEntity.setPositionLevelName(standardLevel);
return employeeEntity;
}
@ListenTo(command = "UserLoginCommand",order = 0)
@Override
public User syncUserInfoToSupplier(UserLoginCommand command) {
User user = command.getUser();
// 如果超过一天执行同步代码
if (user.checkSyncTime()) {
CompletableFuture.runAsync(() -> saveCurrentUser(user));
} else {
log.info("未超过一天,不执行同程同步");
}
return user;
}
}

View File

@ -202,7 +202,6 @@ public class PushUser {
if (list == null) {
return true;
}
return list.isEmpty();
}
}

View File

@ -0,0 +1,10 @@
package com.chint.interfaces.rest.user;
import com.chint.application.commands.UserLoginCommand;
import com.chint.domain.aggregates.user.User;
import java.lang.reflect.Modifier;
public interface UserSync {
User syncUserInfoToSupplier(UserLoginCommand command);
}

View File

@ -8,7 +8,7 @@ spring:
password: ${chint.datasource.password}
hikari:
minimum-idle: 20
maximum-pool-size: 50 # 连接池最大连接数
maximum-pool-size: 60 # 连接池最大连接数
idle-timeout: 300000 # 空闲连接超时时间(毫秒)
max-lifetime: 1800000 # 连接的最长生命周期(毫秒)
connection-timeout: 60000 # 连接超时时间(毫秒)

View File

@ -286,7 +286,7 @@ class RouteApplicationTests {
@Test
void loginSignProd() {
String sfno = "220607056";
String sfno = "240305077";
String syscode = "FSSC";
String billcode = "CLSQ240225000099";
String companycode = "正泰集团股份有限公司";
@ -1294,4 +1294,6 @@ class RouteApplicationTests {
}
System.out.println(rankName);
}
}