fix:修复因地理信息确实导致无法审批的问题

This commit is contained in:
lulz1 2024-07-04 19:47:25 +08:00
parent d97da29c2f
commit c166e430d5
7 changed files with 122 additions and 38 deletions

View File

@ -168,7 +168,9 @@ public class OrderQuery {
.skip((long) (pageNum - 1) * pageSize)
.limit(pageSize)
.map(routeOrder -> {
legDomainService.queryLocation(routeOrder.getLegItems());
if (legDomainService.checkLocation(routeOrder.getLegItems())) {
routeRepository.reloadRouteOrderInCache(routeOrder);
}
User user = userRepository.findByUserEmployeeNo(routeOrder.getUserId());
return getRouteOrderPageRes(routeOrder, user);
})
@ -179,7 +181,6 @@ public class OrderQuery {
orderDomainService.finishOrder(it);
}
});
return new PageResult<>(total, orders);
}
@ -535,7 +536,9 @@ public class OrderQuery {
if (routeOrder.getApprovalStatusCode() != APPROVAL_EVENT_PREPARE) {
legItems.forEach(leg -> legDomainService.legCheckOrder(leg));
}
legDomainService.queryLocation(legItems);
if (legDomainService.checkLocation(legItems)) {
routeRepository.reloadRouteOrderInCache(routeOrder);
}
List<LegRes> list = legItems.stream().map(LegRes::copyFrom).toList();
routeOrderRes.setLegResList(list);
}

View File

@ -429,14 +429,18 @@ public class Leg implements Serializable, EventManageable {
public String generateLegString() {
return DateTimeUtil.timeToStrCommon(startTime) + "|" +
String generateStr = DateTimeUtil.timeToStrCommon(startTime) + "|" +
DateTimeUtil.timeToStrCommon(endTime) + "|" +
originId + "|" + destinationId + "|" + estimateAmount;
if (this.legType.equals(LEG_TYPE_TAXI)) {
return generateStr + "|" + this.getLegExtensionField().getLocationIds();
}
return generateStr;
}
public Leg restoreFromLegString(String legString) {
String[] parts = legString.split("\\|");
if (parts.length == 5) {
if (parts.length >= 5) {
this.startTime = parts[0] != null && !"null".equals(parts[0]) ? DateTimeUtil.strToTime(parts[0]) : null;
this.endTime = parts[1] != null && !"null".equals(parts[1]) ? DateTimeUtil.strToTime(parts[1]) : null;
this.originId = parts[2] != null && !"null".equals(parts[2]) ? Long.parseLong(parts[2]) : null;
@ -445,6 +449,9 @@ public class Leg implements Serializable, EventManageable {
} else {
throw new IllegalArgumentException("Invalid legString format.");
}
if (parts.length >= 6 && parts[5] != null && !parts[5].isEmpty() && !"null".equals(parts[5])) {
this.getLegExtensionField().setLocationIds(parts[5]);
}
return this;
}

View File

@ -13,6 +13,8 @@ public interface RouteRepository {
RouteOrder queryById(Long orderId, boolean ifUpdateCache);
RouteOrder reloadRouteOrderInCache(RouteOrder routeOrder);
List<RouteOrder> queryByIdIn(List<Long> routeIds);
List<RouteOrder> queryAllInOneDayAndEffective(LocalDateTime start, LocalDateTime end);

View File

@ -156,37 +156,57 @@ public class LegDomainService {
return leg;
}
public List<Leg> queryLocation(List<Leg> list) {
list.forEach(leg -> {
LegExtensionField legExtensionField = leg.getLegExtensionField();
if (legExtensionField != null && legExtensionField.getLocationIds() != null) {
List<Long> locationIdsAsLong;
if (legExtensionField.getLocationIds().startsWith("[")) {
locationIdsAsLong = legExtensionField.getLocationIdsAsLongFromArray();
} else {
locationIdsAsLong = legExtensionField.getLocationIdsAsLong();
}
List<Location> locationList = legExtensionField.getLocationList();
if (locationList == null || locationList.size() != locationIdsAsLong.size() ||
checkIfSameLocationList(locationList, locationIdsAsLong)) {
List<Location> byNameList = locationRepository.findByNameList(locationIdsAsLong);
legExtensionField.setLocationList(byNameList);
}
}
if (leg.getOriginId() != null && (leg.getOriginLocation() == null ||
!Objects.equals(leg.getOriginLocation().getLocationId(), leg.getOriginId()))) {
leg.setOriginLocation(locationRepository.findByLocationId(leg.getOriginId()));
}
if (leg.getDestinationId() != null && (leg.getDestinationLocation() == null ||
!Objects.equals(leg.getDestinationLocation().getLocationId(), leg.getDestinationId()))) {
leg.setDestinationLocation(locationRepository.findByLocationId(leg.getDestinationId()));
}
});
list.forEach(this::updateLegLocation);
return list;
}
public boolean checkLocation(List<Leg> list) {
boolean flag = false;
for (Leg leg : list) {
boolean updated = updateLegLocation(leg);
if (updated) {
flag = true;
}
}
return flag;
}
private boolean updateLegLocation(Leg leg) {
boolean updated = false;
LegExtensionField legExtensionField = leg.getLegExtensionField();
if (legExtensionField != null && legExtensionField.getLocationIds() != null) {
List<Long> locationIdsAsLong = getLocationIdsAsLong(legExtensionField);
List<Location> locationList = legExtensionField.getLocationList();
if (locationList == null || locationList.size() != locationIdsAsLong.size() ||
checkIfSameLocationList(locationList, locationIdsAsLong)) {
List<Location> byNameList = locationRepository.findByNameList(locationIdsAsLong);
legExtensionField.setLocationList(byNameList);
updated = true;
}
}
if (leg.getOriginId() != null && (leg.getOriginLocation() == null ||
!Objects.equals(leg.getOriginLocation().getLocationId(), leg.getOriginId()))) {
leg.setOriginLocation(locationRepository.findByLocationId(leg.getOriginId()));
updated = true;
}
if (leg.getDestinationId() != null && (leg.getDestinationLocation() == null ||
!Objects.equals(leg.getDestinationLocation().getLocationId(), leg.getDestinationId()))) {
leg.setDestinationLocation(locationRepository.findByLocationId(leg.getDestinationId()));
updated = true;
}
return updated;
}
private List<Long> getLocationIdsAsLong(LegExtensionField legExtensionField) {
if (legExtensionField.getLocationIds().startsWith("[")) {
return legExtensionField.getLocationIdsAsLongFromArray();
} else {
return legExtensionField.getLocationIdsAsLong();
}
}
private boolean checkIfSameLocationList(List<Location> locationList, List<Long> locationIdsAsLong) {
List<Long> inIds = locationList.stream().map(Location::getLocationId).toList();
// 检查两个列表是否相互包含
@ -212,7 +232,6 @@ public class LegDomainService {
if (leg.getOriginId() != null && leg.getOriginLocation() == null) {
leg.setOriginLocation(locationRepository.findByLocationId(leg.getOriginId()));
}
if (leg.getDestinationId() != null && leg.getDestinationLocation() == null) {
leg.setDestinationLocation(locationRepository.findByLocationId(leg.getDestinationId()));
}
@ -245,10 +264,19 @@ public class LegDomainService {
.toList();
List<Leg> legs = new ArrayList<>();
for (Leg leg : legItems) {
if (!leg.getLegType().equals(LEG_TYPE_OTHER) && leg.legIsInternal()) {
leg.reloadStatus();
// 不再过滤LegApprovalStatus
legs.add(leg);
}
}
// 根据供应商名称查找供应商并进行处理
return supplierRepository.findBySupplierName(supplierName)
.map(supplier -> {
List<Leg> syncAbleLegItems = ifCanSync(filteredLegItems, routeOrder, supplier);
List<Leg> syncAbleLegItems = ifCanSync(legs, routeOrder, supplier);
syncAbleLegItems.forEach(Leg::reloadStatus);
return syncAbleLegItems;
})

View File

@ -1,6 +1,8 @@
package com.chint.domain.service;
import com.chint.application.dtos.LegApprovalParam;
import com.chint.domain.aggregates.approval.ApprovalData;
import com.chint.domain.aggregates.approval.ApprovalProcess;
import com.chint.domain.aggregates.approval.ApprovalResultData;
import com.chint.domain.aggregates.approval.ApprovalSubmit;
import com.chint.domain.aggregates.base.PermissionConfig;
@ -13,6 +15,7 @@ import com.chint.domain.repository.*;
import com.chint.domain.value_object.enums.RoutePermission;
import com.chint.infrastructure.util.StringCheck;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -46,6 +49,7 @@ public class RouteApprovalDomainService {
@Autowired
private ApprovalSubmit approvalSubmit;
public void legApprovalResponse() {
}
@ -64,18 +68,46 @@ public class RouteApprovalDomainService {
List<Leg> legItems = routeOrder.getLegItems();
legDomainService.queryLocation(legItems);
String approvalPlatformMark = getApprovalPlatformMark(routeOrder);
ApprovalSubmit.of(LEG_ADD_CHANGE_BATCH, approvalPlatformMark)
.approveData(routeOrder)
.record(it -> it.setApprovalReason(param.getApprovalReason()))
ApprovalProcess approvalProcess = ApprovalSubmit.of(LEG_ADD_CHANGE_BATCH, approvalPlatformMark)
.approveData(routeOrder);
checkApprovalData(approvalProcess.getApprovalData());
approvalProcess.record(it -> it.setApprovalReason(param.getApprovalReason()))
.submitToBpm();
routeRepository.save(routeOrder);
}
private void checkApprovalData(ApprovalData approvalData) {
List<Leg> allLegs = new ArrayList<>();
// 添加单个 leg 对象
if (approvalData.getLeg() != null) {
allLegs.add(approvalData.getLeg());
}
// 添加单个 oldLeg 对象
if (approvalData.getOldLeg() != null) {
allLegs.add(approvalData.getOldLeg());
}
// 添加 addLegList 中的 Leg 对象
if (approvalData.getAddLegList() != null) {
allLegs.addAll(approvalData.getAddLegList());
}
// 添加 changeLegList 中的 Leg 对象
if (approvalData.getChangeLegList() != null) {
for (Pair<Leg, Leg> pair : approvalData.getChangeLegList()) {
allLegs.add(pair.getFirst());
allLegs.add(pair.getSecond());
}
}
legDomainService.checkLocation(allLegs);
}
public List<RouteOrder> checkApprovalPermissions(List<RouteOrder> routeOrderList) {
// 提取所有 approveOrderNo sysCode
Set<String> accountCompanyCodes = routeOrderList.stream()
.map(routeOrder -> routeOrder.getApproveOrderNo().getAccountCompany())
.filter(it-> !StringCheck.isFirstCharacterChinese(it))
.filter(it -> !StringCheck.isFirstCharacterChinese(it))
.collect(Collectors.toSet());
Set<String> sysCodes = routeOrderList.stream()
@ -140,11 +172,13 @@ public class RouteApprovalDomainService {
}
return routeOrder;
}
private String findApprovalType(ApproveOrderNo approveOrderNo) {
return systemOrganizationRepository.findByOrgCodeContainingOrOrgNameContaining(approveOrderNo.getAccountCompany(), approveOrderNo.getAccountCompany())
.map(SystemOrganization::getApprovalType)
.orElseGet(() -> systemCodeRepository.findBySysCode(approveOrderNo.getSysCode()).getApprovalType());
}
private Set<RoutePermission> findRoutePermissions(String approvalType) {
return permissionConfigRepository.findByPermissionName(approvalType)
.map(permissionConfig -> permissionConfig.permissions().stream()

View File

@ -50,6 +50,11 @@ public class RouteCacheService {
return routeOrders;
}
public RouteOrder reloadRouteOrderInCache(RouteOrder routeOrder) {
routeCacheManage.invalidateRouteCache(routeOrder.getRouteId());
routeCacheManage.cacheRouteOrder(routeOrder);
return routeOrder;
}
public List<RouteOrder> getUserRoutes(String employeeNo) {
//获取当前用户所有的订单id

View File

@ -49,6 +49,11 @@ public class RouteRepositoryImpl implements RouteRepository {
return null;
}
@Override
public RouteOrder reloadRouteOrderInCache(RouteOrder routeOrder) {
return routeCacheService.reloadRouteOrderInCache(routeOrder);
}
@Override
public List<RouteOrder> queryByIdIn(List<Long> routeIds) {
List<RouteOrder> routeOrders = new java.util.ArrayList<>(routeCacheService.queryByIdIn(routeIds)