修复单词蓝票可重复开票的问题
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user