@@ -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, | |||||
) |