Bläddra i källkod

udpate stock take round

master
CANCERYS\kw093 13 timmar sedan
förälder
incheckning
01e1815d75
6 ändrade filer med 53 tillägg och 32 borttagningar
  1. +4
    -0
      src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt
  2. +3
    -1
      src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt
  3. +24
    -22
      src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt
  4. +16
    -9
      src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt
  5. +1
    -0
      src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt
  6. +5
    -0
      src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql

+ 4
- 0
src/main/java/com/ffii/fpsms/modules/stock/entity/StockTake.kt Visa fil

@@ -42,4 +42,8 @@ open class StockTake: BaseEntity<Long>() {
@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
}

+ 3
- 1
src/main/java/com/ffii/fpsms/modules/stock/entity/StockTakeRepository.kt Visa fil

@@ -7,7 +7,9 @@ import java.io.Serializable

@Repository
interface StockTakeRepository : AbstractRepository<StockTake, Long> {
fun findByIdAndDeletedIsFalse(id: Serializable): StockTake;
fun findByIdAndDeletedIsFalse(id: Serializable): StockTake

fun findAllByStockTakeRoundIdAndDeletedIsFalse(stockTakeRoundId: Long): List<StockTake>

@Query("""
select st.code from StockTake st where st.code like :prefix% order by st.code desc limit 1


+ 24
- 22
src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeRecordService.kt Visa fil

@@ -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<Long> {
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<AllPickedStockTakeListReponse> {
// 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<Long> = 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<Long> = if (planStart != null) {
stockTakeRepository.findAll()
.filter { !it.deleted && it.planStart == planStart }
.mapNotNull { it.id }
.toSet()
} else {
listOfNotNull(stockTake.id).toSet()
}
val roundStockTakeIds: Set<Long> = resolveRoundStockTakeIds(stockTake)

val stockTakeRecords = stockTakeRecordRepository.findAll()
.filter {


+ 16
- 9
src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt Visa fil

@@ -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}")


+ 1
- 0
src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockTakeRequest.kt Visa fil

@@ -12,4 +12,5 @@ data class SaveStockTakeRequest(
var status: String?,
val remarks: String?,
val stockTakeSection: String?=null,
val stockTakeRoundId: Long? = null,
)

+ 5
- 0
src/main/resources/db/changelog/changes/20260323_01_Enson/01_alter_stock_take.sql Visa fil

@@ -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`;

Laddar…
Avbryt
Spara