From 01e1815d75acb65b013471c18646aefa9190fb66 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Mon, 23 Mar 2026 11:04:09 +0800 Subject: [PATCH] udpate stock take round --- .../fpsms/modules/stock/entity/StockTake.kt | 4 ++ .../stock/entity/StockTakeRepository.kt | 4 +- .../stock/service/StockTakeRecordService.kt | 46 ++++++++++--------- .../modules/stock/service/StockTakeService.kt | 25 ++++++---- .../stock/web/model/SaveStockTakeRequest.kt | 1 + .../20260323_01_Enson/01_alter_stock_take.sql | 5 ++ 6 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt index a3f3d94..9f8e17e 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt @@ -42,4 +42,8 @@ open class StockTake: BaseEntity() { @Size(max = 255) @Column(name = "stockTakeSection", length = 255) open var stockTakeSection: String? = null + + /** 同一輪盤點(多 section 多筆 stock_take)共用此 id,通常等於該輪第一筆 stock_take 的主鍵 */ + @Column(name = "stockTakeRoundId") + open var stockTakeRoundId: Long? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt index 4ce0b1c..18199d8 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt @@ -7,7 +7,9 @@ import java.io.Serializable @Repository interface StockTakeRepository : AbstractRepository { - fun findByIdAndDeletedIsFalse(id: Serializable): StockTake; + fun findByIdAndDeletedIsFalse(id: Serializable): StockTake + + fun findAllByStockTakeRoundIdAndDeletedIsFalse(stockTakeRoundId: Long): List @Query(""" select st.code from StockTake st where st.code like :prefix% order by st.code desc limit 1 diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt index c094954..9ab9a6a 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt @@ -64,6 +64,27 @@ class StockTakeRecordService( ) { private val logger: Logger = LoggerFactory.getLogger(StockTakeRecordService::class.java) + /** + * 同一輪多 section 的 stock_take:優先用 [StockTake.stockTakeRoundId];舊資料為 null 時退回以 planStart 相同辨識一輪。 + */ + private fun resolveRoundStockTakeIds(baseStockTake: StockTake): Set { + val roundKey = baseStockTake.stockTakeRoundId + if (roundKey != null) { + return stockTakeRepository.findAllByStockTakeRoundIdAndDeletedIsFalse(roundKey) + .mapNotNull { it.id } + .toSet() + } + val planStart = baseStockTake.planStart + return if (planStart != null) { + stockTakeRepository.findAll() + .filter { !it.deleted && it.planStart == planStart } + .mapNotNull { it.id } + .toSet() + } else { + listOfNotNull(baseStockTake.id).toSet() + } + } + open fun AllPickedStockTakeList(): List { // 1. 获取所有不同的 stockTakeSection(从 warehouse 表) val allWarehouses = warehouseRepository.findAllByDeletedIsFalse() @@ -220,21 +241,11 @@ class StockTakeRecordService( val inventoryLotLines = inventoryLotLineRepository.findAllByWarehouseIdInAndDeletedIsFalse(warehouseIds) println("Found ${inventoryLotLines.size} inventory lot lines for ALL sections") - // 3. 如果传了 stockTakeId,就把「同一轮」的所有 stockTake 找出来: - // 以该 stockTake 的 planStart 作为一轮的标识,取 planStart 相同的所有记录 + // 3. 如果传了 stockTakeId,就把「同一轮」的所有 stockTake 找出来(stockTakeRoundId,舊資料則 planStart) val roundStockTakeIds: Set = if (stockTakeId != null) { val baseStockTake = stockTakeRepository.findByIdAndDeletedIsFalse(stockTakeId) ?: throw IllegalArgumentException("Stock take not found: $stockTakeId") - val planStart = baseStockTake.planStart - - val roundStockTakes = if (planStart != null) { - stockTakeRepository.findAll() - .filter { !it.deleted && it.planStart == planStart } - } else { - listOf(baseStockTake) - } - - roundStockTakes.mapNotNull { it.id }.toSet() + resolveRoundStockTakeIds(baseStockTake) } else { emptySet() } @@ -1242,16 +1253,7 @@ open fun batchSaveApproverStockTakeRecordsAll( val stockTake = stockTakeRepository.findByIdAndDeletedIsFalse(request.stockTakeId) ?: throw IllegalArgumentException("Stock take not found: ${request.stockTakeId}") - // 以该 stockTake 的 planStart 作为一轮的标识,找到这一轮下所有的 stockTake(各个 section) - val planStart = stockTake.planStart - val roundStockTakeIds: Set = if (planStart != null) { - stockTakeRepository.findAll() - .filter { !it.deleted && it.planStart == planStart } - .mapNotNull { it.id } - .toSet() - } else { - listOfNotNull(stockTake.id).toSet() - } + val roundStockTakeIds: Set = resolveRoundStockTakeIds(stockTake) val stockTakeRecords = stockTakeRecordRepository.findAll() .filter { diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt index 6c28f70..922c851 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt @@ -60,8 +60,9 @@ class StockTakeService( status?.let { stockTake.status = it } request.remarks?.let { stockTake.remarks = it } request.stockTakeSection?.let { stockTake.stockTakeSection = it } // 添加此行 - - return stockTakeRepository.save(stockTake); + request.stockTakeRoundId?.let { stockTake.stockTakeRoundId = it } + + return stockTakeRepository.save(stockTake) } // ---------------------------------------------- Import Excel ---------------------------------------------- // @@ -290,25 +291,31 @@ class StockTakeService( } */ // 移除 null section 处理逻辑,因为 warehouse 表中没有 null 的 stockTakeSection + val batchPlanStart = LocalDateTime.now() + val batchPlanEnd = batchPlanStart.plusDays(1) + var roundId: Long? = null distinctSections.forEach { section -> try { - val now = LocalDateTime.now() val code = assignStockTakeNo() - val saveStockTakeReq = SaveStockTakeRequest( code = code, - planStart = now, - planEnd = now.plusDays(1), + planStart = batchPlanStart, + planEnd = batchPlanEnd, actualStart = null, actualEnd = null, status = StockTakeStatus.PENDING.value, remarks = null, - stockTakeSection = section + stockTakeSection = section, + stockTakeRoundId = roundId ) - val savedStockTake = saveStockTake(saveStockTakeReq) + if (roundId == null) { + roundId = savedStockTake.id + savedStockTake.stockTakeRoundId = roundId + stockTakeRepository.save(savedStockTake) + } result[section] = "Created: ${savedStockTake.code}" - logger.info("Created stock take for section $section: ${savedStockTake.code}") + logger.info("Created stock take for section $section: ${savedStockTake.code}, roundId=$roundId") } catch (e: Exception) { result[section] = "Error: ${e.message}" logger.error("Error creating stock take for section $section: ${e.message}") diff --git a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt index a58e928..6dc133d 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt @@ -12,4 +12,5 @@ data class SaveStockTakeRequest( var status: String?, val remarks: String?, val stockTakeSection: String?=null, + val stockTakeRoundId: Long? = null, ) diff --git a/src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql b/src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql new file mode 100644 index 0000000..99c1c16 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql @@ -0,0 +1,5 @@ +-- liquibase formatted sql +-- changeset Enson:alter_stock_take_stock_take_round_id + +ALTER TABLE `fpsmsdb`.`stock_take` +ADD COLUMN `stockTakeRoundId` INT NULL AFTER `stockTakeSection`; \ No newline at end of file