修复单词蓝票可重复开票的问题

This commit is contained in:
BBIT-Kai
2026-05-25 09:30:00 +08:00
parent 01b63c4fe4
commit c2899ae64d
@@ -42,7 +42,7 @@ object OpenBlueInvoiceService {
request: OpenBlueInvoiceCreateRequest,
): OpenBlueInvoiceCreateResponse {
validateCreateRequest(request)
val createRequest = request.withGeneratedInvoiceReqSerialNo(principal.userId)
val createRequest = request.withPreparedInvoiceReqSerialNo()
PTBlueService.createBlueInvoice(
createRequest.toAskInvoiceRequest(principal),
@@ -119,7 +119,7 @@ object OpenBlueInvoiceService {
val reservedSerialNos = mutableSetOf<String>()
val createRequests = request.items.map {
it.withGeneratedInvoiceReqSerialNo(principal.userId, reservedSerialNos)
it.withPreparedInvoiceReqSerialNo(reservedSerialNos)
}
val now = OffsetDateTime.now()
@@ -356,16 +356,30 @@ object OpenBlueInvoiceService {
}
}
private suspend fun OpenBlueInvoiceCreateRequest.withGeneratedInvoiceReqSerialNo(
userId: Uuid,
private suspend fun OpenBlueInvoiceCreateRequest.withPreparedInvoiceReqSerialNo(
reservedSerialNos: MutableSet<String> = mutableSetOf(),
): OpenBlueInvoiceCreateRequest {
val providedInvoiceReqSerialNo = invoiceReqSerialNo?.trim()
if (!providedInvoiceReqSerialNo.isNullOrEmpty()) {
if (providedInvoiceReqSerialNo.length > 20) {
throw BizException(ErrorCode.BAD_REQUEST.code, "invoiceReqSerialNo 长度不能超过 20")
}
if (
providedInvoiceReqSerialNo in reservedSerialNos ||
findUsedInvoiceReqSerialNos(listOf(providedInvoiceReqSerialNo)).isNotEmpty()
) {
throw BizException(ErrorCode.BAD_REQUEST.code, "invoiceReqSerialNo 已存在,请勿重复开票")
}
reservedSerialNos.add(providedInvoiceReqSerialNo)
return copy(invoiceReqSerialNo = providedInvoiceReqSerialNo)
}
var invoiceReqSerialNo: String
do {
invoiceReqSerialNo = PTClient.ptDate()
} while (
invoiceReqSerialNo in reservedSerialNos ||
findUsedInvoiceReqSerialNos(userId, listOf(invoiceReqSerialNo)).isNotEmpty()
findUsedInvoiceReqSerialNos(listOf(invoiceReqSerialNo)).isNotEmpty()
)
reservedSerialNos.add(invoiceReqSerialNo)
return copy(invoiceReqSerialNo = invoiceReqSerialNo)
@@ -375,25 +389,19 @@ object OpenBlueInvoiceService {
invoiceReqSerialNo
?: throw BizException(ErrorCode.INTERNAL_SERVER_ERROR.code, "invoiceReqSerialNo 生成失败")
private suspend fun findUsedInvoiceReqSerialNos(userId: Uuid, invoiceReqSerialNos: List<String>): Set<String> {
private suspend fun findUsedInvoiceReqSerialNos(invoiceReqSerialNos: List<String>): Set<String> {
val serialNos = invoiceReqSerialNos.distinct()
if (serialNos.isEmpty()) {
return emptySet()
}
return dbQuery {
val historySerialNos = HistoryInvoiceBasicTable.selectAll()
.where {
(HistoryInvoiceBasicTable.userId eq userId) and
(HistoryInvoiceBasicTable.invoiceReqSerialNo inList serialNos)
}
.where { HistoryInvoiceBasicTable.invoiceReqSerialNo inList serialNos }
.map { it[HistoryInvoiceBasicTable.invoiceReqSerialNo] }
val batchSerialNos = (OpenInvoiceBatchItemTable innerJoin OpenInvoiceBatchTable)
val batchSerialNos = OpenInvoiceBatchItemTable
.selectAll()
.where {
(OpenInvoiceBatchTable.userId eq userId) and
(OpenInvoiceBatchItemTable.invoiceReqSerialNo inList serialNos)
}
.where { OpenInvoiceBatchItemTable.invoiceReqSerialNo inList serialNos }
.map { it[OpenInvoiceBatchItemTable.invoiceReqSerialNo] }
(historySerialNos + batchSerialNos).toSet()