| @@ -0,0 +1,71 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonInclude | |||
| import com.fasterxml.jackson.annotation.JsonManagedReference | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "material") | |||
| open class Material : BaseEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "code") | |||
| open var code: String? = null | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| @Column(name = "description") | |||
| open var description: String? = null | |||
| @Column(name = "remarks") | |||
| open var remarks: String? = null | |||
| @NotNull | |||
| @Column(name = "isConsumables") | |||
| open var isConsumables: Boolean? = null | |||
| @OneToMany(mappedBy = "material", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("material-weight-unit") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val weightUnit: Set<ProductMaterialWeightUnit> = HashSet() | |||
| @OneToMany(mappedBy = "material", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("material-uom") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val uom: Set<ProductMaterialWeightUnit> = HashSet() | |||
| @OneToMany(mappedBy = "material", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("material-uom") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val type: Set<ProductMaterialType> = HashSet() | |||
| @Column(name = "shelfLife") | |||
| open var shelfLife: Number? = null | |||
| @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 | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface MaterialRepository : AbstractRepository<Material, Long> { | |||
| // fun findAllByDeletedFalse(): List<Material>; | |||
| } | |||
| @@ -0,0 +1,71 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonInclude | |||
| import com.fasterxml.jackson.annotation.JsonManagedReference | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "product") | |||
| open class Product : BaseEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "code") | |||
| open var code: String? = null | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| @Column(name = "description") | |||
| open var description: String? = null | |||
| @Column(name = "remarks") | |||
| open var remarks: String? = null | |||
| @NotNull | |||
| @Column(name = "isConsumables") | |||
| open var isConsumables: Boolean? = null | |||
| @OneToMany(mappedBy = "product", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("product-weight-unit") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val weightUnit: Set<ProductMaterialWeightUnit> = HashSet() | |||
| @OneToMany(mappedBy = "product", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("product-uom") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val uom: Set<ProductMaterialWeightUnit> = HashSet() | |||
| @OneToMany(mappedBy = "product", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| @JsonManagedReference("product-uom") | |||
| @JsonInclude(JsonInclude.Include.NON_NULL) | |||
| private val type: Set<ProductMaterialType> = HashSet() | |||
| @Column(name = "shelfLife") | |||
| open var shelfLife: Number? = null | |||
| @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 | |||
| } | |||
| @@ -0,0 +1,27 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonBackReference | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "product_material_type") | |||
| open class ProductMaterialType { | |||
| @ManyToOne | |||
| @JoinColumn(name = "productId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var product: Product? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "materialId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var material: Material? = null | |||
| @Id | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| } | |||
| @@ -0,0 +1,26 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonBackReference | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "product_material_uom") | |||
| open class ProductMaterialUom { | |||
| @ManyToOne | |||
| @JoinColumn(name = "productId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var product: Product? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "materialId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var material: Material? = null | |||
| @Id | |||
| @NotNull | |||
| @Column(name = "uom") | |||
| open var uom: String? = null | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonBackReference | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "product_material_weightUnit") | |||
| open class ProductMaterialWeightUnit { | |||
| @ManyToOne | |||
| @JoinColumn(name = "productId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var product: Product? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "materialId") | |||
| @JsonBackReference | |||
| @NotNull | |||
| open var material: Material? = null | |||
| @Id | |||
| @NotNull | |||
| @Column(name = "weightUnit") | |||
| open var weightUnit: String? = null | |||
| @NotNull | |||
| @Column(name = "conversion") | |||
| open var conversion: Double? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| interface ProductRepository: AbstractRepository<Product, Long> { | |||
| fun findAllByDeletedFalse(): List<Product>; | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| 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.Material | |||
| import com.ffii.fpsms.modules.master.entity.MaterialRepository | |||
| import org.springframework.stereotype.Service | |||
| @Service | |||
| open class MaterialService( | |||
| private val jdbcDao: JdbcDao, | |||
| private val materialRepository: MaterialRepository, | |||
| ): AbstractBaseEntityService<Material, Long, MaterialRepository>(jdbcDao, materialRepository) { | |||
| // do mapping with projection | |||
| open fun getMaterials(): List<Material> { | |||
| // TODO: Replace by actual logic | |||
| val materials = materialRepository.findAll() | |||
| return materials | |||
| } | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| 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.Material | |||
| import com.ffii.fpsms.modules.master.entity.MaterialRepository | |||
| import com.ffii.fpsms.modules.master.entity.Product | |||
| import com.ffii.fpsms.modules.master.entity.ProductRepository | |||
| class ProductService( | |||
| private val jdbcDao: JdbcDao, | |||
| private val productRepository: ProductRepository | |||
| ): AbstractBaseEntityService<Product, Long, ProductRepository>(jdbcDao, productRepository) { | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| package com.ffii.fpsms.modules.master.web | |||
| import com.ffii.fpsms.modules.master.entity.Material | |||
| import com.ffii.fpsms.modules.master.service.MaterialService | |||
| import org.springframework.web.bind.annotation.GetMapping | |||
| import org.springframework.web.bind.annotation.RequestMapping | |||
| import org.springframework.web.bind.annotation.RestController | |||
| @RestController | |||
| @RequestMapping("/materials") | |||
| class MaterialController( | |||
| private val materialService: MaterialService | |||
| ) { | |||
| @GetMapping | |||
| fun allMaterial(): List<Material> { | |||
| return materialService.getMaterials() | |||
| } | |||
| } | |||
| @@ -0,0 +1,77 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset derek:material and product | |||
| CREATE TABLE material ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| version INT NOT NULL DEFAULT '0', | |||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| createdBy VARCHAR(30) NULL, | |||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| modifiedBy VARCHAR(30) NULL, | |||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||
| `code` VARCHAR(50) NOT NULL, | |||
| `name` VARCHAR(50) NOT NULL, | |||
| description VARCHAR(100) NULL, | |||
| remarks varchar(500) NULL, | |||
| isConsumables TINYINT(1) NOT NULL default 0, | |||
| shelfLife INT(11) NULL, | |||
| countryOfOrigin varchar(50) NULL, | |||
| minHumid DECIMAL(16,2) NULL, | |||
| maxHumid DECIMAL(16,2) NULL, | |||
| minTemp DECIMAL(16,2) NULL, | |||
| maxTemp DECIMAL(16,2) NULL, | |||
| sampleRate DECIMAL(16,2) NULL, | |||
| passingRate DECIMAL(16,2) NULL, | |||
| netWeight DECIMAL(16,2) NULL, | |||
| CONSTRAINT pk_material PRIMARY KEY (id) | |||
| ); | |||
| CREATE TABLE product ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| version INT NOT NULL DEFAULT '0', | |||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| createdBy VARCHAR(30) NULL, | |||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| modifiedBy VARCHAR(30) NULL, | |||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||
| `code` VARCHAR(50) NOT NULL, | |||
| `name` VARCHAR(50) NOT NULL, | |||
| description VARCHAR(100) NULL, | |||
| remarks varchar(500) NULL, | |||
| isConsumables TINYINT(1) NOT NULL default 0, | |||
| shelfLife INT(11) NULL, | |||
| countryOfOrigin varchar(50) NULL, | |||
| minHumid DECIMAL(16,2) NULL, | |||
| maxHumid DECIMAL(16,2) NULL, | |||
| minTemp DECIMAL(16,2) NULL, | |||
| maxTemp DECIMAL(16,2) NULL, | |||
| sampleRate DECIMAL(16,2) NULL, | |||
| passingRate DECIMAL(16,2) NULL, | |||
| netWeight DECIMAL(16,2) NULL, | |||
| CONSTRAINT pk_product PRIMARY KEY (id) | |||
| ); | |||
| CREATE TABLE product_material_weightUnit ( | |||
| productId INT NULL, | |||
| materialId INT NULL, | |||
| weightUnit VARCHAR(30) NOT NULL, | |||
| conversion DECIMAL(16,2) NOT NULL DEFAULT 1 | |||
| ); | |||
| CREATE TABLE product_material_uom ( | |||
| productId INT NULL, | |||
| materialId INT NULL, | |||
| uom VARCHAR(30) NOT NULL | |||
| ); | |||
| CREATE TABLE product_material_type ( | |||
| productId INT NULL, | |||
| materialId INT NULL, | |||
| name VARCHAR(30) NOT NULL | |||
| ); | |||
| ALTER TABLE product_material_weightUnit ADD CONSTRAINT FK_PRODUCT_ON_WEIGHTUNIT FOREIGN KEY (productId) REFERENCES product (id); | |||
| ALTER TABLE product_material_weightUnit ADD CONSTRAINT FK_MATERIAL_ON_WEIGHTUNIT FOREIGN KEY (materialId) REFERENCES material (id); | |||
| ALTER TABLE product_material_uom ADD CONSTRAINT FK_PRODUCT_ON_UOM FOREIGN KEY (productId) REFERENCES product (id); | |||
| ALTER TABLE product_material_uom ADD CONSTRAINT FK_MATERIAL_ON_UOM FOREIGN KEY (materialId) REFERENCES material (id); | |||
| ALTER TABLE product_material_type ADD CONSTRAINT FK_PRODUCT_ON_TYPE FOREIGN KEY (productId) REFERENCES product (id); | |||
| ALTER TABLE product_material_type ADD CONSTRAINT FK_MATERIAL_ON_TYPE FOREIGN KEY (materialId) REFERENCES material (id); | |||