feat:修复细节问题
This commit is contained in:
parent
9ef85d82e7
commit
d45e270c00
|
@ -134,7 +134,7 @@ public class OrderApplicationService {
|
|||
.reloadStatus();
|
||||
|
||||
Leg oldLeg = leg.deepClone();
|
||||
|
||||
oldLeg.setRouteId(null);
|
||||
// 对 leg 进行更新
|
||||
leg.update(legData);
|
||||
|
||||
|
@ -149,7 +149,7 @@ public class OrderApplicationService {
|
|||
//这里加入一个待审批事件, 变更加入旧行程数据, 用于回滚还原
|
||||
leg.addEvent(LegApprovalEvent.prepare(oldLeg));
|
||||
}
|
||||
if (!routeOrder.getOrderStatus().equals(ORDER_STATUS_PREPARE) && !approveOrderNo.getSysCode().equals("ANFSSC")){
|
||||
if (!routeOrder.getOrderStatus().equals(ORDER_STATUS_PREPARE) && !approveOrderNo.getSysCode().equals("ANFSSC")) {
|
||||
sendLegChangeCommand(oldLeg, leg,
|
||||
routeOrder,
|
||||
addLegData.getLegData().getChangeReason(),
|
||||
|
|
|
@ -19,6 +19,11 @@ public class ApprovalLegAdd extends ApprovalProcess {
|
|||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder, OrderDetail orderDetail) {
|
||||
return null;
|
||||
|
|
|
@ -10,6 +10,7 @@ import org.springframework.data.util.Pair;
|
|||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.chint.domain.aggregates.approval.ApprovalType.LEG_ADD_CHANGE_BATCH;
|
||||
|
@ -23,27 +24,79 @@ public class ApprovalLegAddAndChangeBatch extends ApprovalProcess {
|
|||
this.approvalType = LEG_ADD_CHANGE_BATCH;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
ApprovalData approvalData = new ApprovalData();
|
||||
Map<Boolean, List<Leg>> partitionedLegs = partitionLegsByExtension(
|
||||
routeOrder.getLegItems(),
|
||||
LEG_APPROVAL_STATUS_SUBMIT,
|
||||
approvalRecord.getApprovalRecordNo()
|
||||
);
|
||||
List<Leg> changeLegs = partitionedLegs.get(true);
|
||||
List<Leg> addLegs = partitionedLegs.get(false);
|
||||
List<Pair<Leg, Leg>> pairList = createLegPairs(changeLegs);
|
||||
approvalData.setRouteOrder(routeOrder);
|
||||
approvalData.setAddLegList(addLegs);
|
||||
approvalData.setChangeLegList(pairList);
|
||||
return approvalData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder) {
|
||||
Map<Boolean, List<Leg>> legMap = routeOrder.getLegItems()
|
||||
.stream()
|
||||
.filter(it -> it.getLegApprovalStatus().equals(LEG_APPROVAL_STATUS_PREPARE))
|
||||
.collect(Collectors.partitioningBy(it -> it.getLastEvent().getExtension() == null
|
||||
|| it.getLastEvent().getExtension().isEmpty()));
|
||||
.collect(Collectors.partitioningBy(this::isExtensionNullOrEmpty));
|
||||
ApprovalData approvalData = new ApprovalData();
|
||||
approvalData.setRouteOrder(routeOrder);
|
||||
approvalData.setAddLegList(legMap.get(true));
|
||||
List<Pair<Leg, Leg>> pairList = legMap.get(false).stream()
|
||||
.map(leg -> {
|
||||
String extension = leg.getLastEvent().getExtension();
|
||||
Leg oldLeg = leg.deepClone().restoreFromLegString(extension);
|
||||
return Pair.of(leg, oldLeg);
|
||||
}).toList();
|
||||
List<Pair<Leg, Leg>> pairList = createLegPairs(legMap.get(false));
|
||||
approvalData.setChangeLegList(pairList);
|
||||
this.approvalData = approvalData;
|
||||
return this;
|
||||
}
|
||||
|
||||
private Map<Boolean, List<Leg>> partitionLegsByExtension(List<Leg> legs, Integer approvalStatus, String approvalRecordNo) {
|
||||
return legs.stream()
|
||||
.peek(Leg::reloadStatus)
|
||||
.filter(leg -> isLegApprovedAndMatchesRecord(leg, approvalStatus, approvalRecordNo))
|
||||
.collect(Collectors.partitioningBy(this::isExtensionNotNullOrEmpty));
|
||||
}
|
||||
|
||||
private boolean isLegApprovedAndMatchesRecord(Leg leg, Integer approvalStatus, String approvalRecordNo) {
|
||||
return leg.getLegApprovalStatus().equals(approvalStatus) &&
|
||||
leg.getLastApprovalSubmitEvent().isPresent() &&
|
||||
leg.getLastApprovalSubmitEvent().get().getExtension().equals(approvalRecordNo) &&
|
||||
leg.getLastApprovalPrepareEvent().isPresent();
|
||||
}
|
||||
|
||||
private boolean isExtensionNotNullOrEmpty(Leg leg) {
|
||||
Optional<LegApprovalEvent> lastApprovalPrepareEvent = leg.getLastApprovalPrepareEvent();
|
||||
if(lastApprovalPrepareEvent.isEmpty()){
|
||||
return false;
|
||||
}
|
||||
String extension = lastApprovalPrepareEvent.get().getExtension();
|
||||
return extension != null && !extension.isEmpty();
|
||||
}
|
||||
|
||||
private boolean isExtensionNullOrEmpty(Leg leg) {
|
||||
String extension = leg.getLastEvent().getExtension();
|
||||
return extension == null || extension.isEmpty();
|
||||
}
|
||||
|
||||
private List<Pair<Leg, Leg>> createLegPairs(List<Leg> legs) {
|
||||
return legs.stream()
|
||||
.filter(leg -> leg.getLastApprovalPrepareEvent().isPresent())
|
||||
.map(leg -> {
|
||||
String extension = leg.getLastApprovalPrepareEvent().get().getExtension();
|
||||
Leg oldLeg = leg.deepClone().restoreFromLegString(extension);
|
||||
return Pair.of(leg, oldLeg);
|
||||
})
|
||||
.toList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean approve() {
|
||||
|
@ -78,7 +131,7 @@ public class ApprovalLegAddAndChangeBatch extends ApprovalProcess {
|
|||
return false;
|
||||
}
|
||||
BaseEvent lastEvent = leg.getLastEvent();
|
||||
if(lastEvent == null){
|
||||
if (lastEvent == null) {
|
||||
return false;
|
||||
}
|
||||
return lastEvent.getEventType().equals(LEG_APPROVAL_STATUS_SUBMIT) &&
|
||||
|
|
|
@ -14,6 +14,11 @@ public class ApprovalLegChange extends ApprovalProcess{
|
|||
this.approvalType = LEG_CHANGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder) {
|
||||
return this;
|
||||
|
|
|
@ -13,6 +13,11 @@ public class ApprovalOrderChange extends ApprovalProcess{
|
|||
this.approvalType = LEG_CHANGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder) {
|
||||
return this;
|
||||
|
|
|
@ -28,6 +28,11 @@ public class ApprovalOrderExpense extends ApprovalProcess{
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess doSubmitToBpm() {
|
||||
bpmPlatform.submitOrderExpenseApproval(approvalData);
|
||||
|
|
|
@ -13,6 +13,11 @@ public class ApprovalOrderRefund extends ApprovalProcess {
|
|||
this.approvalType = ORDER_REFUND;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder) {
|
||||
return this;
|
||||
|
|
|
@ -34,6 +34,19 @@ public abstract class ApprovalProcess {
|
|||
return this;
|
||||
}
|
||||
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder, ApprovalRecord approvalRecord) {
|
||||
validateApprovalStatus(approvalRecord);
|
||||
this.approvalData = recoverApproveData(routeOrder, approvalRecord);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void validateApprovalStatus(ApprovalRecord approvalRecord) {
|
||||
if (!approvalRecord.getApprovalStatus().equals(ApprovalRecord.prepareApprovalStatus())) {
|
||||
throw new CommandException("该审批单已经审批完毕,无法再次发起审批。");
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract ApprovalData recoverApproveData(RouteOrder routeOrder, ApprovalRecord approvalRecord);
|
||||
|
||||
public ApprovalProcess approveData(RouteOrder routeOrder, OrderDetail orderDetail) {
|
||||
ApprovalData approvalData = new ApprovalData();
|
||||
|
|
|
@ -455,4 +455,21 @@ public class Leg implements Serializable, EventManageable {
|
|||
.filter(legEvent -> legEvent.getEventType().equals(LEG_EVENT_CHANGE))
|
||||
.max(Comparator.comparing(LegEvent::getHappenTime));
|
||||
}
|
||||
|
||||
public Optional<LegApprovalEvent> getLastApprovalSubmitEvent() {
|
||||
return getLastApprovalEventByType(LEG_APPROVAL_STATUS_SUBMIT);
|
||||
}
|
||||
|
||||
public Optional<LegApprovalEvent> getLastApprovalPrepareEvent() {
|
||||
return getLastApprovalEventByType(LEG_APPROVAL_STATUS_PREPARE);
|
||||
}
|
||||
|
||||
private Optional<LegApprovalEvent> getLastApprovalEventByType(Integer eventType) {
|
||||
if (this.legApprovalEventList == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return this.legApprovalEventList.stream()
|
||||
.filter(legEvent -> legEvent.getEventType().equals(eventType))
|
||||
.max(Comparator.comparing(LegApprovalEvent::getHappenTime));
|
||||
}
|
||||
}
|
|
@ -8,10 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@Repository
|
||||
|
@ -34,7 +31,10 @@ public class PermissionConfigRepositoryImpl implements PermissionConfigRepositor
|
|||
@Override
|
||||
public List<PermissionConfig> findByPermissionNameIn(Set<String> approvalTypes) {
|
||||
List<PermissionConfig> permissionConfigs = cachePermissionConfigRepository
|
||||
.cachePermissionConfigBatch(approvalTypes);
|
||||
.cachePermissionConfigBatch(approvalTypes)
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.toList();
|
||||
List<String> cachedNames = permissionConfigs.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(PermissionConfig::getPermissionName)
|
||||
|
@ -45,7 +45,10 @@ public class PermissionConfigRepositoryImpl implements PermissionConfigRepositor
|
|||
.toList();
|
||||
if (!missingNames.isEmpty()) {
|
||||
List<PermissionConfig> fetchedPermissionConfigs = jdbcPermissionConfigRepository
|
||||
.findByPermissionNameIn(missingNames);
|
||||
.findByPermissionNameIn(missingNames)
|
||||
.stream()
|
||||
.filter(Objects::nonNull).toList();
|
||||
permissionConfigs = new ArrayList<>(permissionConfigs);
|
||||
permissionConfigs.addAll(fetchedPermissionConfigs);
|
||||
CompletableFuture.runAsync(() -> fetchedPermissionConfigs.forEach(this::updateCache));
|
||||
}
|
||||
|
|
|
@ -6,21 +6,33 @@ import org.springframework.cache.annotation.Cacheable;
|
|||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Repository
|
||||
public class CachePermissionConfigRepository {
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate<String, PermissionConfig> redisTemplate;
|
||||
private RedisTemplate<String, Object> redisTemplate;
|
||||
|
||||
public List<PermissionConfig> cachePermissionConfigBatch(Set<String> permissionNameList) {
|
||||
List<String> keys = permissionNameList.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(name -> "PermissionConfig::" + name).toList();
|
||||
return redisTemplate.opsForValue().multiGet(keys);
|
||||
List<Object> rawConfigs = redisTemplate.opsForValue().multiGet(keys);
|
||||
if (rawConfigs == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<PermissionConfig> permissionConfigs = rawConfigs.stream()
|
||||
.filter(config -> config instanceof PermissionConfig)
|
||||
.map(config -> (PermissionConfig) config)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return Objects.requireNonNull(permissionConfigs);
|
||||
}
|
||||
|
||||
@Cacheable(value = "PermissionConfig", key = "#permissionConfig.permissionName")
|
||||
|
|
|
@ -11,7 +11,11 @@ public class DelayDispatch {
|
|||
if (attempt >= 5) {
|
||||
return;
|
||||
}
|
||||
boolean success = requestSupplier != null && requestSupplier.get() != null && requestSupplier.get(); // 使用Supplier<Boolean>获取请求成功与否的状态
|
||||
boolean success = false;
|
||||
if (requestSupplier != null) {
|
||||
Boolean result = requestSupplier.get();
|
||||
success = result != null && result;
|
||||
}
|
||||
if (!success) {
|
||||
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||
scheduler.schedule(() -> {
|
||||
|
@ -23,4 +27,4 @@ public class DelayDispatch {
|
|||
}, 5, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue