@@ -1,15 +0,0 @@ | |||
package com.ffii.fpsms.modules.master.entity | |||
import com.fasterxml.jackson.annotation.JsonBackReference | |||
import com.ffii.core.entity.IdEntity | |||
import jakarta.persistence.* | |||
import jakarta.validation.constraints.NotNull | |||
@Entity | |||
@Table(name = "item_type") | |||
open class ItemType: IdEntity<Long>() { | |||
@NotNull | |||
@Column(name = "name") | |||
open var name: String? = null | |||
} |
@@ -1,10 +0,0 @@ | |||
package com.ffii.fpsms.modules.master.entity | |||
import com.ffii.core.support.AbstractRepository | |||
import org.springframework.stereotype.Repository | |||
import org.springframework.transaction.annotation.Transactional | |||
@Repository | |||
interface ItemTypeRepository : AbstractRepository<ItemType, Long> { | |||
} |
@@ -1,6 +1,7 @@ | |||
package com.ffii.fpsms.modules.master.entity | |||
import com.ffii.core.entity.BaseEntity | |||
import com.ffii.fpsms.modules.master.web.models.ItemType | |||
import jakarta.persistence.* | |||
import jakarta.validation.constraints.NotNull | |||
@@ -21,10 +22,9 @@ open class Items : BaseEntity<Long>() { | |||
@Column(name = "remarks") | |||
open var remarks: String? = null | |||
// (mappedBy = "items", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
@OneToOne | |||
@JoinColumn(name = "typeId", referencedColumnName = "id") | |||
open var type: ItemType? = null | |||
@NotNull | |||
@Column(name = "type") | |||
open var type: String? = null | |||
@Column(name = "shelfLife") | |||
open var shelfLife: Double? = null | |||
@@ -32,24 +32,6 @@ open class Items : BaseEntity<Long>() { | |||
@Column(name = "countryOfOrigin") | |||
open var countryOfOrigin: String? = null | |||
@Column(name = "minHumid") | |||
open var minHumid: Double? = null | |||
@Column(name = "maxHumid") | |||
open var maxHumid: Double? = null | |||
@Column(name = "minTemp") | |||
open var minTemp: Double? = null | |||
@Column(name = "maxTemp") | |||
open var maxTemp: Double? = null | |||
@Column(name = "sampleRate") | |||
open var sampleRate: Double? = null | |||
@Column(name = "passingRate") | |||
open var passingRate: Double? = null | |||
@Column(name = "netWeight") | |||
open var netWeight: Double? = null | |||
@Column(name = "maxQty") | |||
open var maxQty: Double? = null | |||
} |
@@ -1,11 +1,12 @@ | |||
package com.ffii.fpsms.modules.master.entity | |||
import com.ffii.core.support.AbstractRepository | |||
import com.ffii.fpsms.modules.master.web.models.ItemType | |||
import org.springframework.stereotype.Repository | |||
@Repository | |||
interface ItemsRepository : AbstractRepository<Items, Long> { | |||
fun findAllByDeletedFalse(): List<Items>; | |||
fun findByIdAndTypeIdAndDeletedFalse(id: Long, typeId: Long): Items; | |||
fun findByCodeAndTypeIdAndDeletedFalse(code: String, typeId: Long): Items?; | |||
fun findByIdAndDeletedFalse(id: Long): Items; | |||
fun findByCodeAndTypeAndDeletedFalse(code: String, type: ItemType): Items?; | |||
} |
@@ -1,17 +0,0 @@ | |||
package com.ffii.fpsms.modules.master.service | |||
import com.ffii.core.support.AbstractBaseEntityService | |||
import com.ffii.core.support.AbstractIdEntityService | |||
import com.ffii.core.support.JdbcDao | |||
import com.ffii.fpsms.modules.master.entity.* | |||
import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
import org.springframework.stereotype.Service | |||
import org.springframework.transaction.annotation.Transactional | |||
@Service | |||
open class ItemTypeService( | |||
private val jdbcDao: JdbcDao, | |||
private val itemTypeRepository: ItemTypeRepository | |||
): AbstractIdEntityService<ItemType, Long, ItemTypeRepository>(jdbcDao, itemTypeRepository) { | |||
} |
@@ -2,9 +2,8 @@ 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.ItemTypeRepository | |||
import com.ffii.fpsms.modules.master.entity.Items | |||
import com.ffii.fpsms.modules.master.entity.ItemsRepository | |||
import com.ffii.fpsms.modules.master.entity.* | |||
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.NewItemRequest | |||
import org.springframework.stereotype.Service | |||
@@ -16,7 +15,7 @@ import kotlin.jvm.optionals.getOrNull | |||
open class ItemsService( | |||
private val jdbcDao: JdbcDao, | |||
private val itemsRepository: ItemsRepository, | |||
private val itemTypeRepository: ItemTypeRepository, | |||
private val qcCheckRepository: QcCheckRepository, | |||
): AbstractBaseEntityService<Items, Long, ItemsRepository>(jdbcDao, itemsRepository) { | |||
// do mapping with projection | |||
open fun allItems(): List<Items> { | |||
@@ -24,27 +23,42 @@ open class ItemsService( | |||
val items = itemsRepository.findAll() | |||
return items | |||
} | |||
open fun getItem(id: Long): Items? { | |||
return itemsRepository.findById(id).getOrNull() | |||
// QcCheck included item | |||
open fun getItem(id: Long): ItemWithQcResponse { | |||
val list = listOf(1,2) | |||
val item = itemsRepository.findByIdAndDeletedFalse(id) | |||
val qcChecks = qcCheckRepository.findAllByItemIdAndDeletedFalse(id).map { qcCheck -> | |||
} | |||
val response = ItemWithQcResponse( | |||
item = item | |||
) | |||
// val test = ItemWithQC(list) | |||
// TODO: Return with QC items | |||
return response | |||
} | |||
// open fun getItem(id: Long): Items? { | |||
// // TODO: Return with QC items | |||
// return itemsRepository.findById(id).get() | |||
// } | |||
@Throws(IOException::class) | |||
@Transactional | |||
open fun saveItem(request: NewItemRequest): MessageResponse { | |||
val type = itemTypeRepository.findById(request.typeId).get() | |||
val duplicatedItem = itemsRepository.findByCodeAndTypeIdAndDeletedFalse(request.code, request.typeId) | |||
val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type) | |||
if (duplicatedItem != null && duplicatedItem.id != request.id) { | |||
return MessageResponse( | |||
id = request.id, | |||
code = request.code, | |||
name = request.name, | |||
type = type.name, | |||
type = request.type.toString(), | |||
message = "The item code has already existed", | |||
errorPosition = "code" | |||
) | |||
} | |||
val item = if (request.id != null && request.id > 0) itemsRepository.findByIdAndTypeIdAndDeletedFalse(request.id, request.typeId) | |||
val item = if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) | |||
else Items() | |||
println(request.netWeight) | |||
item.apply { | |||
code = request.code | |||
name = request.name | |||
@@ -52,13 +66,7 @@ open class ItemsService( | |||
remarks = request.remarks | |||
shelfLife = request.shelfLife | |||
countryOfOrigin = request.countryOfOrigin | |||
minHumid = request.minHumid | |||
maxHumid = request.maxHumid | |||
minTemp = request.minTemp | |||
maxTemp = request.maxTemp | |||
sampleRate = request.sampleRate | |||
passingRate = request.passingRate | |||
netWeight = request.netWeight | |||
maxQty = request.maxQty | |||
this.type = type | |||
} | |||
val savedItem = itemsRepository.saveAndFlush(item) | |||
@@ -66,7 +74,7 @@ open class ItemsService( | |||
id = savedItem.id, | |||
name = savedItem.name, | |||
code = savedItem.code, | |||
type = type.name, | |||
type = savedItem.type.toString(), | |||
message = "Item Save Success", | |||
errorPosition = null, | |||
) | |||
@@ -0,0 +1,15 @@ | |||
package com.ffii.fpsms.modules.master.web.models | |||
import com.ffii.fpsms.modules.master.entity.Items | |||
import com.ffii.fpsms.modules.master.entity.QcItem | |||
data class ItemQc( | |||
val id: Long, | |||
val description: String?, | |||
val lowerLimit: Double?, | |||
val upperLimit: Double?, | |||
) | |||
data class ItemWithQcResponse( | |||
val item: Items, | |||
val qcChecks: List<ItemQc> | |||
) |
@@ -3,26 +3,26 @@ package com.ffii.fpsms.modules.master.web.models | |||
import jakarta.validation.constraints.NotBlank | |||
import jakarta.validation.constraints.NotNull | |||
enum class ItemType(type: String) { | |||
MATERIAL("mat"), | |||
BY_PRODUCT("byp"), | |||
PRODUCT("product"), | |||
CONSUMABLE("consumables"), | |||
} | |||
data class NewItemRequest( | |||
@field:NotBlank(message = "material code cannot be empty") | |||
val code: String, | |||
@field:NotBlank(message = "material name cannot be empty") | |||
val name: String, | |||
@field:NotNull(message = "typeId cannot be null") | |||
val typeId: Long, | |||
val type: ItemType, | |||
val id: Long?, | |||
val description: String?, | |||
val remarks: String?, | |||
val shelfLife: Double?, | |||
val countryOfOrigin: String?, | |||
val minHumid: Double?, | |||
val maxHumid: Double?, | |||
val minTemp: Double?, | |||
val maxTemp: Double?, | |||
val sampleRate: Double?, | |||
val passingRate: Double?, | |||
val netWeight: Double?, | |||
val maxQty: Double?, | |||
// val type: List<NewTypeRequest>?, | |||
// val uom: List<NewUomRequest>?, | |||
// val weightUnit: List<NewWeightUnitRequest>?, | |||
@@ -19,8 +19,7 @@ CREATE TABLE items ( | |||
shelfLife INT(11) NULL, | |||
countryOfOrigin varchar(50) NULL, | |||
maxQty DECIMAL(16,2) NULL, | |||
CONSTRAINT pk_material PRIMARY KEY (id), | |||
CONSTRAINT fk_items FOREIGN KEY (`typeId`) REFERENCES `item_type` (`id`) | |||
CONSTRAINT pk_material PRIMARY KEY (id) | |||
); | |||
CREATE TABLE uom_conversion ( | |||
id INT NOT NULL AUTO_INCREMENT, | |||