优化
This commit is contained in:
+11
@@ -75,6 +75,17 @@ public class PlatformPriceBookController {
|
||||
return ApiResponse.success(service.publish(versionId, user.userId(), request));
|
||||
}
|
||||
|
||||
@PostMapping("/{versionId}/void")
|
||||
@PreAuthorize("hasAuthority('firstleg:fba-pricing:rate:edit')")
|
||||
@BusinessAudit(event = "FBA_PRICE_BOOK_VOID", resourceType = "PRICE_BOOK_VERSION", resourceId = "#versionId", description = "作废待确认船期价格表")
|
||||
public ApiResponse<PriceBookDtos.PriceBookVersionDetail> voidPending(
|
||||
@AuthenticationPrincipal com.baiyue.common.security.AuthenticatedUser user,
|
||||
@PathVariable long versionId,
|
||||
@Valid @RequestBody PriceBookDtos.PriceBookVoidRequest request) {
|
||||
FirstlegScopeGuard.platform(user);
|
||||
return ApiResponse.success(service.voidPending(versionId, user.userId(), request));
|
||||
}
|
||||
|
||||
@GetMapping("/{versionId}/source")
|
||||
@PreAuthorize("hasAuthority('firstleg:fba-pricing:rate:view')")
|
||||
public ResponseEntity<byte[]> source(
|
||||
|
||||
@@ -5,5 +5,6 @@ public enum PriceBookStatus {
|
||||
PENDING_CONFIRMATION,
|
||||
ACTIVE,
|
||||
SUPERSEDED,
|
||||
VOIDED,
|
||||
FAILED
|
||||
}
|
||||
|
||||
@@ -38,7 +38,16 @@ public final class PriceBookDtos {
|
||||
LocalDateTime createdAt,
|
||||
Long publishedBy,
|
||||
LocalDateTime publishedAt,
|
||||
LocalDateTime supersededAt
|
||||
LocalDateTime supersededAt,
|
||||
Long voidedBy,
|
||||
LocalDateTime voidedAt,
|
||||
String voidReason
|
||||
) {}
|
||||
|
||||
public record PriceBookVoidRequest(
|
||||
@NotBlank(message = "作废原因不能为空")
|
||||
@Size(max = 500, message = "作废原因不能超过500个字符")
|
||||
String reason
|
||||
) {}
|
||||
|
||||
public record PriceBookVersionDetail(
|
||||
|
||||
@@ -28,4 +28,7 @@ public class PriceBookVersionEntity extends BaseEntity {
|
||||
private Long publishedBy;
|
||||
private LocalDateTime publishedAt;
|
||||
private LocalDateTime supersededAt;
|
||||
private Long voidedBy;
|
||||
private LocalDateTime voidedAt;
|
||||
private String voidReason;
|
||||
}
|
||||
|
||||
@@ -156,4 +156,15 @@ public class PriceBookRepository {
|
||||
.set(CarrierFbaRateEntity::getUpdatedBy, operatorId)
|
||||
.set(CarrierFbaRateEntity::getUpdatedAt, at));
|
||||
}
|
||||
|
||||
public void voidPending(PriceBookVersionEntity value, LocalDateTime at, long operatorId, String reason) {
|
||||
value.setStatus("VOIDED"); value.setVoidedAt(at); value.setVoidedBy(operatorId); value.setVoidReason(reason);
|
||||
value.setUpdatedBy(operatorId); value.setUpdatedAt(at); updateVersion(value);
|
||||
rates.update(null, new LambdaUpdateWrapper<CarrierFbaRateEntity>()
|
||||
.eq(CarrierFbaRateEntity::getPriceBookVersionId, value.getId())
|
||||
.eq(CarrierFbaRateEntity::getStatus, "PENDING_CONFIRMATION")
|
||||
.set(CarrierFbaRateEntity::getStatus, "VOIDED")
|
||||
.set(CarrierFbaRateEntity::getUpdatedBy, operatorId)
|
||||
.set(CarrierFbaRateEntity::getUpdatedAt, at));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,6 +158,11 @@ public class PlatformPriceBookService {
|
||||
if (candidate.getTenantId() == PriceBookVersionEntity.PLATFORM_SCOPE) repository.lockPlatformVersions();
|
||||
else repository.lockVersions(candidate.getTenantId());
|
||||
PriceBookVersionEntity version = requirePendingConfirmation(versionId);
|
||||
List<PriceBookVersionEntity> activeVersions = version.getTenantId() == PriceBookVersionEntity.PLATFORM_SCOPE
|
||||
? repository.listActiveForUpdate() : repository.listActiveForUpdate(version.getTenantId());
|
||||
if (activeVersions.stream().anyMatch(active -> active.getVersionNo() >= version.getVersionNo())) {
|
||||
throw new BizException(ResultCode.CONFLICT, "该待确认版本早于当前生效版本,请作废后重新上传");
|
||||
}
|
||||
List<PriceBookDtos.ParsedChannel> channels = repository.listChannels(versionId).stream().map(this::channelDto).toList();
|
||||
List<PriceBookDtos.ParsedRate> rates = repository.listRates(versionId).stream().map(this::rateDto).toList();
|
||||
MappingResult mapped = applyMappings(rates, confirmation);
|
||||
@@ -174,14 +179,25 @@ public class PlatformPriceBookService {
|
||||
version.setChannelCount(channels.size());
|
||||
version.setRateCount(mapped.rates().size());
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
(version.getTenantId() == PriceBookVersionEntity.PLATFORM_SCOPE
|
||||
? repository.listActiveForUpdate() : repository.listActiveForUpdate(version.getTenantId())).stream()
|
||||
activeVersions.stream()
|
||||
.filter(active -> !Objects.equals(active.getId(), versionId))
|
||||
.forEach(active -> repository.supersede(active, now, operatorId));
|
||||
repository.activate(version, now, operatorId);
|
||||
return detail(versionId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public PriceBookDtos.PriceBookVersionDetail voidPending(long versionId, long operatorId,
|
||||
PriceBookDtos.PriceBookVoidRequest request) {
|
||||
PriceBookVersionEntity candidate = requireVersion(versionId);
|
||||
if (candidate.getTenantId() == PriceBookVersionEntity.PLATFORM_SCOPE) repository.lockPlatformVersions();
|
||||
else repository.lockVersions(candidate.getTenantId());
|
||||
PriceBookVersionEntity version = requirePendingConfirmation(versionId);
|
||||
String reason = request.reason().trim();
|
||||
repository.voidPending(version, LocalDateTime.now(), operatorId, reason);
|
||||
return detail(versionId);
|
||||
}
|
||||
|
||||
public ResponseEntity<byte[]> source(long versionId, long operatorId) {
|
||||
PriceBookVersionEntity version = requireVersion(versionId);
|
||||
if (version.getSourceFileId() == null) throw new BizException(ResultCode.NOT_FOUND, "价格表原文件不存在");
|
||||
@@ -562,7 +578,7 @@ public class PlatformPriceBookService {
|
||||
value.getSourceFileId(), value.getSourceSha256(), status,
|
||||
value.getChannelCount(), value.getRateCount(), value.getBlockingErrorCount(), value.getWarningCount(),
|
||||
value.getParseIssuesJson(), value.getCreatedBy(), value.getCreatedAt(), value.getPublishedBy(),
|
||||
value.getPublishedAt(), value.getSupersededAt());
|
||||
value.getPublishedAt(), value.getSupersededAt(), value.getVoidedBy(), value.getVoidedAt(), value.getVoidReason());
|
||||
}
|
||||
|
||||
private static void requireScope(long customerId) {
|
||||
|
||||
Reference in New Issue
Block a user