From ae716e906c03bb3179b0813a756640c341df1a90 Mon Sep 17 00:00:00 2001 From: kelvinsuen Date: Tue, 26 Aug 2025 17:01:53 +0800 Subject: [PATCH] update escalation --- .../modules/stock/entity/EscalationLogInfo.kt | 2 + .../stock/entity/EscalationLogRepository.kt | 2 + .../fpsms/modules/stock/entity/StockInLine.kt | 5 ++ .../entity/projection/StockInLineInfo.kt | 3 + .../modules/stock/enums/EscalationLogEnum.kt | 1 + .../stock/service/EscalationLogService.kt | 2 +- .../stock/service/StockInLineService.kt | 62 ++++++++++++++++--- .../web/model/SaveEscalationLogRequest.kt | 10 +-- .../stock/web/model/SaveStockInRequest.kt | 2 + 9 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogInfo.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogInfo.kt index c11da8d..3a28e09 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogInfo.kt @@ -68,4 +68,6 @@ interface EscalationLogInfo { val qcTotalCount: Int?; val qcFailCount: Int?; val reason: String?; + @get:Value("#{target.status?.value}") + val status: String?; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogRepository.kt index e3d2b00..775bda8 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/EscalationLogRepository.kt @@ -11,5 +11,7 @@ interface EscalationLogRepository: AbstractRepository { fun findAllInfoByDeletedFalseAndStockInLineIdIn(stockInLineIds: List): List + fun findAllByDeletedFalseAndStockInLineIdIn(stockInLineIds: List): List + fun findAllInfoByDeletedFalseAndHandlerIdIs(handlerId: Serializable): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt index 2dc2712..566ec9f 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.stock.entity import com.fasterxml.jackson.annotation.JsonBackReference +import com.fasterxml.jackson.annotation.JsonManagedReference import com.ffii.core.entity.BaseEntity import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder @@ -97,4 +98,8 @@ open class StockInLine : BaseEntity() { @Column(name = "remarks") open var remarks: String? = null + @JsonManagedReference + @OneToMany(mappedBy = "stockInLine", cascade = [CascadeType.ALL], orphanRemoval = true) + open var escalationLog: MutableList? = mutableListOf() + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt index 8bb625a..478ce55 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.stock.entity.projection import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.entity.UomConversion +import com.ffii.fpsms.modules.stock.enums.EscalationLogStatus import org.springframework.beans.factory.annotation.Value import java.math.BigDecimal import java.time.LocalDate @@ -45,4 +46,6 @@ interface StockInLineInfo { val itemType: String val dnNo: String val dnDate: LocalDateTime? + @get:Value("#{target.escalationLog.^[status.value == 'pending']?.handler?.id}") + val handlerId: Long? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/enums/EscalationLogEnum.kt b/src/main/java/com/ffii/fpsms/modules/stock/enums/EscalationLogEnum.kt index 65aa291..417d4d5 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/enums/EscalationLogEnum.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/enums/EscalationLogEnum.kt @@ -4,4 +4,5 @@ enum class EscalationLogStatus(val value: String) { PENDING("pending"), ACCEPTED("accepted"), REJECTED("rejected"), + ESCALATED("escalated"), } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/EscalationLogService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/EscalationLogService.kt index de86a1a..adef54e 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/EscalationLogService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/EscalationLogService.kt @@ -16,7 +16,7 @@ open class EscalationLogService( private val jdbcDao: JdbcDao, private val escalationLogRepository: EscalationLogRepository, private val userService: UserService, - private val stockInLineService: StockInLineService, +// private val stockInLineService: StockInLineService, private val stockOutLineService: StockOutLineService, private val stockInLineRepository: StockInLineRepository, private val stockOutLIneRepository: StockOutLIneRepository, diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt index f1705d9..96b0801 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt @@ -13,10 +13,6 @@ import com.ffii.fpsms.modules.qc.entity.QcResult import com.ffii.fpsms.modules.qc.entity.QcResultRepository import com.ffii.fpsms.modules.stock.entity.* import com.ffii.fpsms.modules.stock.sql.StockSql.SQL.INVENTORY_COUNT -import com.ffii.fpsms.modules.stock.web.model.ExportQrCodeRequest -import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest -import com.ffii.fpsms.modules.stock.web.model.SaveStockInRequest -import com.ffii.fpsms.modules.stock.web.model.StockInLineStatus import net.sf.jasperreports.engine.JasperCompileManager import org.springframework.core.io.ClassPathResource import org.springframework.stereotype.Service @@ -33,11 +29,14 @@ import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus import com.ffii.fpsms.modules.stock.entity.projection.StockInLineInfo +import com.ffii.fpsms.modules.stock.enums.EscalationLogStatus +import com.ffii.fpsms.modules.stock.web.model.* import java.io.FileNotFoundException import java.time.format.DateTimeFormatter import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.encodeToString +import kotlin.math.max @Serializable data class QrContent(val itemId: Long, val stockInLineId: Long) @@ -49,6 +48,8 @@ open class StockInLineService( private val polRepository: PurchaseOrderLineRepository, private val qcItemsRepository: QcItemRepository, private val qcResultRepository: QcResultRepository, + private val escalationLogService: EscalationLogService, + private val escalationLogRepository: EscalationLogRepository, private val stockInService: StockInService, private val stockInRepository: StockInRepository, private val stockInLineRepository: StockInLineRepository, @@ -135,6 +136,7 @@ open class StockInLineService( val savedInventoryLot = inventoryLotRepository.saveAndFlush(inventoryLot) return savedInventoryLot } + @Throws(IOException::class) @Transactional fun saveInventoryLotLineWhenStockIn(request: SaveStockInLineRequest, stockInLine: StockInLine): InventoryLotLine { @@ -181,6 +183,42 @@ open class StockInLineService( return null } + @Throws(IOException::class) + @Transactional + fun saveEscalationLogWhenStockIn(request: SaveStockInLineRequest, stockInLine: StockInLine): EscalationLog? { + if (request.escalationLog != null) { + val escReq = request.escalationLog; + + var qcTotal = 0; + var qcFailed = 0; + if (request.qcResult!!.isEmpty()) { + val escLogList = stockInLine.id?.let { escalationLogRepository.findAllByDeletedFalseAndStockInLineIdIn(listOf(it)); } + val latestLog = escLogList?.maxBy { it.id!! }; + latestLog?.apply { status = EscalationLogStatus.ESCALATED } + escalationLogService.save(latestLog); + + val qcRes = qcResultRepository.findQcResultInfoByStockInLineIdAndDeletedFalse(stockInLine.id!!); + qcTotal = qcRes.size; + qcFailed = qcRes.count{ !it.qcPassed}; + } else { + qcTotal = request.qcResult?.size ?: 5; + qcFailed = request.qcResult?.count { !it.qcPassed } ?: 0; + } + + escReq?.apply { + this.stockInLineId = stockInLine.id; + this.qcTotalCount = qcTotal; + this.qcFailCount = qcFailed; + } + if (escReq != null) { + val res = escalationLogService.saveEscalationLog(escReq) + return res.id?.let { escalationLogRepository.findById(it).orElseThrow() }; + }; +// return qcResultRepository.saveAllAndFlush(qcResultEntries) + } + return null + } + @Throws(IOException::class) @Transactional fun updatePurchaseOrderStatus(request: SaveStockInLineRequest) { @@ -287,7 +325,7 @@ open class StockInLineService( this.status = StockInLineStatus.COMPLETE.status this.inventoryLotLine = savedInventoryLotLine } - } else if (request.status == StockInLineStatus.PENDING.status) { + } else if (request.status == StockInLineStatus.PENDING.status || request.status == StockInLineStatus.ESCALATED.status) { // QC if (request.qcAccept == true) { // Accepted @@ -384,9 +422,17 @@ open class StockInLineService( // ) // } } else if (request.qcAccept == false) { - // Rejected - stockInLine.apply { - this.status = StockInLineStatus.REJECT.status + if (request.escalationLog != null) { + // Escalated + stockInLine.apply { + this.status = StockInLineStatus.ESCALATED.status + } + saveEscalationLogWhenStockIn(request, stockInLine); + } else { + // Rejected + stockInLine.apply { + this.status = StockInLineStatus.REJECT.status + } } } saveQcResultWhenStockIn(request, stockInLine) diff --git a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveEscalationLogRequest.kt b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveEscalationLogRequest.kt index 9b00c57..4ac1cd5 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveEscalationLogRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveEscalationLogRequest.kt @@ -9,12 +9,12 @@ data class SaveEscalationLogRequest( @field:NotNull(message = "Person In Charge cannot be empty") val handlerId: Long, val type: String?, - val stockInLineId: Long?, - val stockOutLineId: Long?, + var stockInLineId: Long?, + var stockOutLineId: Long?, val recordDate: LocalDateTime?, @field:NotBlank(message = "Status cannot be empty") - val status: String, + var status: String, val reason: String?, - val qcTotalCount: Int?, - val qcFailCount: Int?, + var qcTotalCount: Int?, + var qcFailCount: Int?, ) diff --git a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockInRequest.kt b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockInRequest.kt index 86c6881..64e6ceb 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockInRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/web/model/SaveStockInRequest.kt @@ -13,6 +13,7 @@ enum class StockInStatus(val status: String) { enum class StockInLineStatus(val status: String) { PENDING("pending"), QC("qc"), + ESCALATED("escalated"), FirstDetermine("determine1"), SecondDetermine("determine2"), ThirdDetermine("determine3"), @@ -53,6 +54,7 @@ data class SaveStockInLineRequest( var productionDate: LocalDate?, var qcAccept: Boolean?, var qcResult: List?, + var escalationLog: SaveEscalationLogRequest?, var warehouseId: Long?, var rejectQty: BigDecimal? )