| @@ -8,5 +8,5 @@ import org.springframework.stereotype.Repository | |||||
| interface ItemsRepository : AbstractRepository<Items, Long> { | interface ItemsRepository : AbstractRepository<Items, Long> { | ||||
| fun findAllByDeletedFalse(): List<Items>; | fun findAllByDeletedFalse(): List<Items>; | ||||
| fun findByIdAndDeletedFalse(id: Long): Items; | fun findByIdAndDeletedFalse(id: Long): Items; | ||||
| fun findByCodeAndTypeAndDeletedFalse(code: String, type: ItemType): Items?; | |||||
| fun findByCodeAndTypeAndDeletedFalse(code: String, type: String): Items?; | |||||
| } | } | ||||
| @@ -0,0 +1,36 @@ | |||||
| package com.ffii.fpsms.modules.master.entity | |||||
| import com.ffii.core.entity.BaseEntity | |||||
| import jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| @Entity | |||||
| @Table(name = "qc_check") | |||||
| open class QcCheck: BaseEntity<Long>() { | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "qcItemId") | |||||
| open var qcItem: QcItem? = null | |||||
| @NotNull | |||||
| @Column(name = "isRange") | |||||
| open var isRange: Boolean? = null | |||||
| @Column(name = "description") | |||||
| open var description: String? = null | |||||
| @NotNull | |||||
| @Column(name = "systemInput") | |||||
| open var systemInput: Boolean? = null | |||||
| @Column(name = "lowerLimit") | |||||
| open var lowerLimit: Double? = null | |||||
| @Column(name = "upperLimit") | |||||
| open var upperLimit: Double? = null | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "itemId") | |||||
| open var item: Items? = null | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| package com.ffii.fpsms.modules.master.entity | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| import org.springframework.stereotype.Repository | |||||
| @Repository | |||||
| interface QcCheckRepository: AbstractRepository<QcCheck, Long> { | |||||
| fun findAllByDeletedIsFalse(): List<QcCheck> | |||||
| fun findAllByItemIdAndDeletedFalse(itemId: Long): List<QcCheck> | |||||
| } | |||||
| @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.master.service | |||||
| import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
| import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
| import com.ffii.fpsms.modules.master.entity.* | import com.ffii.fpsms.modules.master.entity.* | ||||
| import com.ffii.fpsms.modules.master.web.models.ItemQc | |||||
| import com.ffii.fpsms.modules.master.web.models.ItemWithQcResponse | import com.ffii.fpsms.modules.master.web.models.ItemWithQcResponse | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| import com.ffii.fpsms.modules.master.web.models.NewItemRequest | import com.ffii.fpsms.modules.master.web.models.NewItemRequest | ||||
| @@ -16,6 +17,7 @@ open class ItemsService( | |||||
| private val jdbcDao: JdbcDao, | private val jdbcDao: JdbcDao, | ||||
| private val itemsRepository: ItemsRepository, | private val itemsRepository: ItemsRepository, | ||||
| private val qcCheckRepository: QcCheckRepository, | private val qcCheckRepository: QcCheckRepository, | ||||
| private val qcItemsRepository: QcItemRepository, | |||||
| ): AbstractBaseEntityService<Items, Long, ItemsRepository>(jdbcDao, itemsRepository) { | ): AbstractBaseEntityService<Items, Long, ItemsRepository>(jdbcDao, itemsRepository) { | ||||
| // do mapping with projection | // do mapping with projection | ||||
| open fun allItems(): List<Items> { | open fun allItems(): List<Items> { | ||||
| @@ -28,14 +30,27 @@ open class ItemsService( | |||||
| open fun getItem(id: Long): ItemWithQcResponse { | open fun getItem(id: Long): ItemWithQcResponse { | ||||
| val list = listOf(1,2) | val list = listOf(1,2) | ||||
| val item = itemsRepository.findByIdAndDeletedFalse(id) | val item = itemsRepository.findByIdAndDeletedFalse(id) | ||||
| val qcChecks = qcCheckRepository.findAllByItemIdAndDeletedFalse(id).map { qcCheck -> | |||||
| val qcItems = qcItemsRepository.findAllByDeletedIsFalse() | |||||
| val qcCheckMap = qcCheckRepository.findAllByItemIdAndDeletedFalse(id).associateBy { it.id } | |||||
| val qc = qcItems.map { | |||||
| val check = qcCheckMap[it.id] // Find the corresponding qcCheck | |||||
| println(check?.description) | |||||
| println(check?.lowerLimit) | |||||
| ItemQc( | |||||
| id = it.id!!, | |||||
| name = it.name!!, | |||||
| code = it.code!!, | |||||
| description = it.description!!, | |||||
| instruction = check?.description, | |||||
| lowerLimit = check?.lowerLimit, | |||||
| upperLimit = check?.upperLimit, | |||||
| isActive = check != null | |||||
| ) // Create combined item | |||||
| } | } | ||||
| val response = ItemWithQcResponse( | val response = ItemWithQcResponse( | ||||
| item = item | |||||
| item = item, | |||||
| qcChecks = qc | |||||
| ) | ) | ||||
| // val test = ItemWithQC(list) | |||||
| // TODO: Return with QC items | // TODO: Return with QC items | ||||
| return response | return response | ||||
| } | } | ||||
| @@ -46,7 +61,7 @@ open class ItemsService( | |||||
| @Throws(IOException::class) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| open fun saveItem(request: NewItemRequest): MessageResponse { | open fun saveItem(request: NewItemRequest): MessageResponse { | ||||
| val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type) | |||||
| val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type.name) | |||||
| if (duplicatedItem != null && duplicatedItem.id != request.id) { | if (duplicatedItem != null && duplicatedItem.id != request.id) { | ||||
| return MessageResponse( | return MessageResponse( | ||||
| id = request.id, | id = request.id, | ||||
| @@ -67,7 +82,7 @@ open class ItemsService( | |||||
| shelfLife = request.shelfLife | shelfLife = request.shelfLife | ||||
| countryOfOrigin = request.countryOfOrigin | countryOfOrigin = request.countryOfOrigin | ||||
| maxQty = request.maxQty | maxQty = request.maxQty | ||||
| this.type = type | |||||
| this.type = request.type.name | |||||
| } | } | ||||
| val savedItem = itemsRepository.saveAndFlush(item) | val savedItem = itemsRepository.saveAndFlush(item) | ||||
| return MessageResponse( | return MessageResponse( | ||||
| @@ -0,0 +1,59 @@ | |||||
| package com.ffii.fpsms.modules.master.service | |||||
| import com.ffii.core.support.AbstractBaseEntityService | |||||
| import com.ffii.core.support.JdbcDao | |||||
| import com.ffii.fpsms.modules.master.entity.* | |||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||||
| import com.ffii.fpsms.modules.master.web.models.NewItemRequest | |||||
| import com.ffii.fpsms.modules.master.web.models.NewQcCheckRequest | |||||
| import org.springframework.stereotype.Service | |||||
| import org.springframework.transaction.annotation.Transactional | |||||
| import java.io.IOException | |||||
| @Service | |||||
| open class QcCheckService( | |||||
| private val jdbcDao: JdbcDao, | |||||
| private val itemsRepository: ItemsRepository, | |||||
| private val qcCheckRepository: QcCheckRepository, | |||||
| private val qcItemRepository: QcItemRepository, | |||||
| ): AbstractBaseEntityService<QcCheck, Long, QcCheckRepository>(jdbcDao, qcCheckRepository) { | |||||
| @Throws(IOException::class) | |||||
| @Transactional | |||||
| open fun saveQcChecks(request: List<NewQcCheckRequest>): MessageResponse { | |||||
| if (request.isEmpty()) { | |||||
| return MessageResponse( | |||||
| id = null, | |||||
| name = null, | |||||
| code = null, | |||||
| type = null, | |||||
| message = "empty list", | |||||
| errorPosition = null, | |||||
| ) | |||||
| } | |||||
| val qcChecks = qcCheckRepository.findAllByItemIdAndDeletedFalse(request[0].itemId) | |||||
| val qcChecksList = request.map { req -> | |||||
| val qc = qcChecks.find { it.qcItem!!.id == req.qcItemId } ?: QcCheck() | |||||
| val _qcItem = qcItemRepository.findById(req.qcItemId).orElseThrow() | |||||
| qc.apply { | |||||
| this.qcItem = _qcItem | |||||
| isRange = (req.lowerLimit !== null && req.upperLimit !== null && req.lowerLimit != req.upperLimit) | |||||
| description = req.instruction | |||||
| systemInput = false | |||||
| lowerLimit = req.lowerLimit | |||||
| upperLimit = req.upperLimit | |||||
| this.item = itemsRepository.findById(req.itemId).orElseThrow() | |||||
| } | |||||
| } | |||||
| val savedQcChecks = qcCheckRepository.saveAllAndFlush(qcChecksList) | |||||
| return MessageResponse( | |||||
| id = 1, | |||||
| name = "total saved: ${savedQcChecks.size}", | |||||
| code = null, | |||||
| type = null, | |||||
| message = "Qc Check Save Success", | |||||
| errorPosition = null, | |||||
| ) | |||||
| } | |||||
| } | |||||
| @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.master.web | |||||
| import com.ffii.core.exception.NotFoundException | import com.ffii.core.exception.NotFoundException | ||||
| import com.ffii.fpsms.modules.master.entity.Items | import com.ffii.fpsms.modules.master.entity.Items | ||||
| import com.ffii.fpsms.modules.master.service.ItemsService | import com.ffii.fpsms.modules.master.service.ItemsService | ||||
| import com.ffii.fpsms.modules.master.web.models.ItemWithQcResponse | |||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| import com.ffii.fpsms.modules.master.web.models.NewItemRequest | import com.ffii.fpsms.modules.master.web.models.NewItemRequest | ||||
| import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
| @@ -18,11 +19,13 @@ class ItemsController( | |||||
| return itemsService.allItems() | return itemsService.allItems() | ||||
| } | } | ||||
| @GetMapping("/details/{id}") | @GetMapping("/details/{id}") | ||||
| fun getItems(@PathVariable id: Long): Items { | |||||
| return itemsService.getItem(id) ?: throw NotFoundException() | |||||
| fun getItems(@PathVariable id: Long): ItemWithQcResponse { | |||||
| return itemsService.getItem(id) | |||||
| } | } | ||||
| @PostMapping("/new") | @PostMapping("/new") | ||||
| fun saveItem(@Valid @RequestBody newItem: NewItemRequest): MessageResponse { | fun saveItem(@Valid @RequestBody newItem: NewItemRequest): MessageResponse { | ||||
| println("`````TESTING`````") | |||||
| return itemsService.saveItem(newItem) | return itemsService.saveItem(newItem) | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,22 @@ | |||||
| package com.ffii.fpsms.modules.master.web | |||||
| import com.ffii.fpsms.modules.master.service.QcCheckService | |||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||||
| import com.ffii.fpsms.modules.master.web.models.NewItemRequest | |||||
| import com.ffii.fpsms.modules.master.web.models.NewQcCheckRequest | |||||
| import jakarta.validation.Valid | |||||
| import org.springframework.web.bind.annotation.PostMapping | |||||
| import org.springframework.web.bind.annotation.RequestBody | |||||
| import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RestController | |||||
| @RestController | |||||
| @RequestMapping("/qcCheck") | |||||
| class QcCheckController( | |||||
| private val qcCheckService: QcCheckService | |||||
| ) { | |||||
| @PostMapping("/new") | |||||
| fun saveItem(@Valid @RequestBody newQcs: List<NewQcCheckRequest>): MessageResponse { | |||||
| return qcCheckService.saveQcChecks(newQcs) | |||||
| } | |||||
| } | |||||
| @@ -5,9 +5,13 @@ import com.ffii.fpsms.modules.master.entity.QcItem | |||||
| data class ItemQc( | data class ItemQc( | ||||
| val id: Long, | val id: Long, | ||||
| val name: String, | |||||
| val code: String, | |||||
| val description: String?, | val description: String?, | ||||
| val instruction: String?, | |||||
| val lowerLimit: Double?, | val lowerLimit: Double?, | ||||
| val upperLimit: Double?, | val upperLimit: Double?, | ||||
| val isActive: Boolean?, | |||||
| ) | ) | ||||
| data class ItemWithQcResponse( | data class ItemWithQcResponse( | ||||
| val item: Items, | val item: Items, | ||||
| @@ -0,0 +1,9 @@ | |||||
| package com.ffii.fpsms.modules.master.web.models | |||||
| data class NewQcCheckRequest( | |||||
| val qcItemId: Long, | |||||
| val instruction: String?, | |||||
| val lowerLimit: Double?, | |||||
| val upperLimit: Double?, | |||||
| val itemId: Long, | |||||
| ) | |||||