From 671499e8585082fd2f2f69e4862222db47e9a869 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 14 Aug 2025 18:43:42 +0800 Subject: [PATCH] update qc & item & inventory --- .../fpsms/m18/service/M18MasterDataService.kt | 30 ++++++++++--------- .../master/entity/QcCategoryRepository.kt | 5 +++- .../entity/projections/QcCategoryCombo.kt | 11 +++++++ .../modules/master/service/ItemsService.kt | 10 +++++-- .../master/service/QcCategoryService.kt | 5 ++++ .../master/web/QcCategoryController.kt | 6 ++++ .../master/web/models/NewItemRequest.kt | 3 +- .../stock/entity/projection/InventoryInfo.kt | 8 ++--- 8 files changed, 55 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/projections/QcCategoryCombo.kt diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt index 72b96f2..58c2cbd 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt @@ -150,12 +150,12 @@ open class M18MasterDataService( // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL // else ItemType.PRODUCT, type = when (pro.udfProducttype) { - M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES - M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES - M18ItemType.FG.type -> ItemType.FG - M18ItemType.SFG.type -> ItemType.SFG - M18ItemType.ITEM.type -> ItemType.ITEM - else -> ItemType.MATERIAL + M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES.type + M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES.type + M18ItemType.FG.type -> ItemType.FG.type + M18ItemType.SFG.type -> ItemType.SFG.type + M18ItemType.ITEM.type -> ItemType.ITEM.type + else -> ItemType.MATERIAL.type }, id = existingItem?.id, description = pro.desc, @@ -164,7 +164,8 @@ open class M18MasterDataService( countryOfOrigin = null, maxQty = null, m18Id = id, - m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate) + m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate), + qcCategoryId = null ) val savedItem = itemsService.saveItem(saveItemRequest) @@ -244,12 +245,12 @@ open class M18MasterDataService( // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL // else ItemType.PRODUCT, type = when (pro.udfProducttype) { - M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES - M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES - M18ItemType.FG.type -> ItemType.FG - M18ItemType.SFG.type -> ItemType.SFG - M18ItemType.ITEM.type -> ItemType.ITEM - else -> ItemType.MATERIAL + M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES.type + M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES.type + M18ItemType.FG.type -> ItemType.FG.type + M18ItemType.SFG.type -> ItemType.SFG.type + M18ItemType.ITEM.type -> ItemType.ITEM.type + else -> ItemType.MATERIAL.type }, id = existingItem?.id, description = pro.desc, @@ -258,7 +259,8 @@ open class M18MasterDataService( countryOfOrigin = null, maxQty = null, m18Id = item.id, - m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate) + m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate), + qcCategoryId = null ) val savedItem = itemsService.saveItem(saveItemRequest) diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt index 7dcbd79..6fd7a66 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt @@ -1,9 +1,12 @@ package com.ffii.fpsms.modules.master.entity import com.ffii.core.support.AbstractRepository +import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo import org.springframework.stereotype.Repository @Repository interface QcCategoryRepository : AbstractRepository { - fun findAllByDeletedIsFalse(): List + fun findAllByDeletedIsFalse(): List; + + fun findQcCategoryComboByDeletedIsFalse(): List; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/projections/QcCategoryCombo.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/projections/QcCategoryCombo.kt new file mode 100644 index 0000000..4cf95e0 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/projections/QcCategoryCombo.kt @@ -0,0 +1,11 @@ +package com.ffii.fpsms.modules.master.entity.projections + +import org.springframework.beans.factory.annotation.Value + +interface QcCategoryCombo { + val id: Long; + @get:Value("#{target.id}") + val value: Long; + @get:Value("#{target.code}") + val label: String; +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt index f7adc56..9040e03 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt @@ -13,13 +13,14 @@ import java.io.IOException import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.time.temporal.TemporalAdjusters +import kotlin.jvm.optionals.getOrNull @Service open class ItemsService( private val jdbcDao: JdbcDao, private val itemsRepository: ItemsRepository, private val qcCheckRepository: QcCheckRepository, - private val qcItemsRepository: QcItemRepository, + private val qcItemsRepository: QcItemRepository, private val qcCategoryRepository: QcCategoryRepository, ): AbstractBaseEntityService(jdbcDao, itemsRepository) { // do mapping with projection open fun allItems(): List { @@ -170,7 +171,7 @@ open class ItemsService( @Throws(IOException::class) @Transactional open fun saveItem(request: NewItemRequest): MessageResponse { - val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type.type) + val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type) if (duplicatedItem != null && duplicatedItem.id != request.id) { return MessageResponse( id = request.id, @@ -196,6 +197,8 @@ open class ItemsService( ) } + val qcCategory = request.qcCategoryId?.let { qcCategoryRepository.findById(it).getOrNull() } + item.apply { code = request.code name = request.name @@ -204,7 +207,8 @@ open class ItemsService( shelfLife = request.shelfLife countryOfOrigin = request.countryOfOrigin maxQty = request.maxQty - this.type = request.type.type + this.type = request.type + this.qcCategory = qcCategory m18Id = request.m18Id ?: this.m18Id m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate } diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt index 90c294e..055d2c1 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.fpsms.modules.master.entity.QcCategory import com.ffii.fpsms.modules.master.entity.QcCategoryRepository +import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo import org.springframework.stereotype.Service @Service @@ -12,4 +13,8 @@ open class QcCategoryService( open fun allQcCategories(): List { return qcCategoryRepository.findAllByDeletedIsFalse() } + + open fun getQcCategoryCombo(): List { + return qcCategoryRepository.findQcCategoryComboByDeletedIsFalse(); + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt index 027f1dc..0eac19f 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.master.web import com.ffii.fpsms.modules.master.entity.QcCategory +import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo import com.ffii.fpsms.modules.master.service.QcCategoryService import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping @@ -15,4 +16,9 @@ class QcCategoryController( fun allQcCategories(): List { return qcCategoryService.allQcCategories() } + + @GetMapping("/combo") + fun getQcCategoryCombo(): List { + return qcCategoryService.getQcCategoryCombo(); + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt index f4eb336..2a92707 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt @@ -34,7 +34,7 @@ data class NewItemRequest( @field:NotBlank(message = "material name cannot be empty") val name: String, @field:NotNull(message = "typeId cannot be null") - val type: ItemType, + val type: String, val id: Long?, val description: String?, @@ -44,6 +44,7 @@ data class NewItemRequest( val maxQty: Double?, val m18Id: Long?, val m18LastModifyDate: LocalDateTime?, + val qcCategoryId: Long?, // val type: List?, // val uom: List?, // val weightUnit: List?, diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt index f7bd2d9..7af8bea 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt @@ -14,13 +14,13 @@ interface InventoryInfo{ @get:Value("#{target.item.type}") val itemType: String? // @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") - @get:Value("#{target.onHandQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") + @get:Value("#{target.onHandQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") val onHandQty: BigDecimal? - @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") + @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") val onHoldQty: BigDecimal? - @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") + @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") val unavailableQty: BigDecimal? - @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") + @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") val availableQty: BigDecimal? @get:Value("#{target.item.itemUoms.^[purchaseUnit == true && deleted == false]?.uom.code}") val uomCode: String?