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

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, request: OpenBlueInvoiceCreateRequest,
): OpenBlueInvoiceCreateResponse { ): OpenBlueInvoiceCreateResponse {
validateCreateRequest(request) validateCreateRequest(request)
val createRequest = request.withGeneratedInvoiceReqSerialNo(principal.userId) val createRequest = request.withPreparedInvoiceReqSerialNo()
PTBlueService.createBlueInvoice( PTBlueService.createBlueInvoice(
createRequest.toAskInvoiceRequest(principal), createRequest.toAskInvoiceRequest(principal),
@@ -119,7 +119,7 @@ object OpenBlueInvoiceService {
val reservedSerialNos = mutableSetOf<String>() val reservedSerialNos = mutableSetOf<String>()
val createRequests = request.items.map { val createRequests = request.items.map {
it.withGeneratedInvoiceReqSerialNo(principal.userId, reservedSerialNos) it.withPreparedInvoiceReqSerialNo(reservedSerialNos)
} }
val now = OffsetDateTime.now() val now = OffsetDateTime.now()
@@ -356,16 +356,30 @@ object OpenBlueInvoiceService {
} }
} }
private suspend fun OpenBlueInvoiceCreateRequest.withGeneratedInvoiceReqSerialNo( private suspend fun OpenBlueInvoiceCreateRequest.withPreparedInvoiceReqSerialNo(
userId: Uuid,
reservedSerialNos: MutableSet<String> = mutableSetOf(), reservedSerialNos: MutableSet<String> = mutableSetOf(),
): OpenBlueInvoiceCreateRequest { ): 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 var invoiceReqSerialNo: String
do { do {
invoiceReqSerialNo = PTClient.ptDate() invoiceReqSerialNo = PTClient.ptDate()
} while ( } while (
invoiceReqSerialNo in reservedSerialNos || invoiceReqSerialNo in reservedSerialNos ||
findUsedInvoiceReqSerialNos(userId, listOf(invoiceReqSerialNo)).isNotEmpty() findUsedInvoiceReqSerialNos(listOf(invoiceReqSerialNo)).isNotEmpty()
) )
reservedSerialNos.add(invoiceReqSerialNo) reservedSerialNos.add(invoiceReqSerialNo)
return copy(invoiceReqSerialNo = invoiceReqSerialNo) return copy(invoiceReqSerialNo = invoiceReqSerialNo)
@@ -375,25 +389,19 @@ object OpenBlueInvoiceService {
invoiceReqSerialNo invoiceReqSerialNo
?: throw BizException(ErrorCode.INTERNAL_SERVER_ERROR.code, "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() val serialNos = invoiceReqSerialNos.distinct()
if (serialNos.isEmpty()) { if (serialNos.isEmpty()) {
return emptySet() return emptySet()
} }
return dbQuery { return dbQuery {
val historySerialNos = HistoryInvoiceBasicTable.selectAll() val historySerialNos = HistoryInvoiceBasicTable.selectAll()
.where { .where { HistoryInvoiceBasicTable.invoiceReqSerialNo inList serialNos }
(HistoryInvoiceBasicTable.userId eq userId) and
(HistoryInvoiceBasicTable.invoiceReqSerialNo inList serialNos)
}
.map { it[HistoryInvoiceBasicTable.invoiceReqSerialNo] } .map { it[HistoryInvoiceBasicTable.invoiceReqSerialNo] }
val batchSerialNos = (OpenInvoiceBatchItemTable innerJoin OpenInvoiceBatchTable) val batchSerialNos = OpenInvoiceBatchItemTable
.selectAll() .selectAll()
.where { .where { OpenInvoiceBatchItemTable.invoiceReqSerialNo inList serialNos }
(OpenInvoiceBatchTable.userId eq userId) and
(OpenInvoiceBatchItemTable.invoiceReqSerialNo inList serialNos)
}
.map { it[OpenInvoiceBatchItemTable.invoiceReqSerialNo] } .map { it[OpenInvoiceBatchItemTable.invoiceReqSerialNo] }
(historySerialNos + batchSerialNos).toSet() (historySerialNos + batchSerialNos).toSet()