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