From 31e0bf23aee252c9f4d06b29f062a470487097ad Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 22 May 2025 19:08:36 +0800 Subject: [PATCH] [master] update item, uom, currency, shop. add bom, equipment, process --- .../ffii/fpsms/modules/master/entity/Bom.kt | 52 +++++++++++++++ .../modules/master/entity/BomMaterial.kt | 54 +++++++++++++++ .../master/entity/BomMaterialRepository.kt | 12 ++++ .../fpsms/modules/master/entity/BomProcess.kt | 28 ++++++++ .../master/entity/BomProcessMaterial.kt | 19 ++++++ .../entity/BomProcessMaterialRepository.kt | 8 +++ .../master/entity/BomProcessRepository.kt | 8 +++ .../modules/master/entity/BomRepository.kt | 12 ++++ .../fpsms/modules/master/entity/Equipment.kt | 29 +++++++++ .../master/entity/EquipmentRepository.kt | 8 +++ .../modules/master/entity/EquipmentType.kt | 27 ++++++++ .../master/entity/EquipmentTypeRepository.kt | 8 +++ .../fpsms/modules/master/entity/ItemUom.kt | 3 + .../master/entity/ItemUomRespository.kt | 3 + .../ffii/fpsms/modules/master/entity/Items.kt | 2 + .../modules/master/entity/ItemsRepository.kt | 41 +++++++++++- .../fpsms/modules/master/entity/Process.kt | 32 +++++++++ .../modules/master/entity/ProcessEquipment.kt | 19 ++++++ .../entity/ProcessEquipmentRepository.kt | 8 +++ .../master/entity/ProcessRepository.kt | 8 +++ .../modules/master/entity/ShopRepository.kt | 10 +-- .../master/entity/UomConversionRepository.kt | 2 +- .../master/service/BomMaterialService.kt | 65 +++++++++++++++++++ .../modules/master/service/BomService.kt | 64 ++++++++++++++++++ .../modules/master/service/CurrencyService.kt | 4 +- .../modules/master/service/ItemUomService.kt | 21 +++++- .../modules/master/service/ItemsService.kt | 34 +++++++++- .../modules/master/service/ShopService.kt | 25 +++++-- .../master/service/UomConversionService.kt | 4 ++ .../web/models/SaveBomMaterialRequest.kt | 21 ++++++ .../web/models/SaveBomMaterialResponse.kt | 13 ++++ .../master/web/models/SaveBomRequest.kt | 23 +++++++ .../master/web/models/SaveBomResponse.kt | 14 ++++ .../master/web/models/SaveCurrencyRequest.kt | 12 ++++ 34 files changed, 674 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterialRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomProcess.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterial.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterialRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentType.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentTypeRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/Process.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipment.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipmentRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProcessRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/BomMaterialService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialRequest.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialResponse.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomRequest.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomResponse.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveCurrencyRequest.kt diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt new file mode 100644 index 0000000..cd54e17 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt @@ -0,0 +1,52 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.math.BigDecimal +import java.time.Instant +import java.time.LocalDateTime + +@Table(name = "bom") +@Entity +open class Bom : BaseEntity() { + @ManyToOne + @JoinColumn(name = "itemId") + open var item: Items? = null + + @Size(max = 30) + @NotNull + @Column(name = "code", nullable = false, length = 30) + open var code: String? = null + + @Size(max = 30) + @NotNull + @Column(name = "name", nullable = false, length = 30) + open var name: String? = null + + @Size(max = 100) + @NotNull + @Column(name = "description", nullable = false, length = 100) + open var description: String? = null + + @Column(name = "outputQty", precision = 14, scale = 2) + open var outputQty: BigDecimal? = null + + @Size(max = 50) + @Column(name = "outputQtyUom", length = 50) + open var outputQtyUom: String? = null + + @Column(name = "yield", precision = 14, scale = 2) + open var yield: BigDecimal? = null + + @ManyToOne + @JoinColumn(name = "uomId") + open var uom: UomConversion? = null + + @Column(name = "m18Id") + open var m18Id: Long? = null + + @Column(name = "m18LastModifyDate") + open var m18LastModifyDate: LocalDateTime? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt new file mode 100644 index 0000000..3b8f14a --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt @@ -0,0 +1,54 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.math.BigDecimal +import java.time.Instant +import java.time.LocalDateTime + +@Table(name = "bom_material") +@Entity +open class BomMaterial : BaseEntity() { + @ManyToOne + @JoinColumn(name = "itemId") + open var item: Items? = null + + @Size(max = 50) + @Column(name = "itemName", length = 50) + open var itemName: String? = null + + @NotNull + @Column(name = "isConsumable", nullable = false) + open var isConsumable: Boolean? = false + + @NotNull + @Column(name = "qty", nullable = false, precision = 14, scale = 2) + open var qty: BigDecimal? = null + + @ManyToOne + @JoinColumn(name = "uomId") + open var uom: UomConversion? = null + + @Size(max = 50) + @Column(name = "uomName", length = 50) + open var uomName: String? = null + + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "bomId", nullable = false) + open var bom: Bom? = null + + @NotNull + @Column(name = "m18Id", nullable = false) + open var m18Id: Long? = null + + @NotNull + @Column(name = "m18LastModifyDate", nullable = false) + open var m18LastModifyDate: LocalDateTime? = null + + @Size(max = 1000) + @Column(name = "remarks", length = 1000) + open var remarks: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterialRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterialRepository.kt new file mode 100644 index 0000000..15bffcc --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterialRepository.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import java.io.Serializable + +@Repository +interface BomMaterialRepository : AbstractRepository { + fun findByIdAndDeletedIsFalse(id: Serializable): BomMaterial? + + fun findByM18IdAndDeletedIsFalse(m18Id: Long): BomMaterial? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcess.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcess.kt new file mode 100644 index 0000000..ef67d9f --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcess.kt @@ -0,0 +1,28 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull + +@Table(name = "bom_process") +@Entity +open class BomProcess : BaseEntity() { + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "processId", nullable = false) + open var process: Process? = null + + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "uomId", nullable = false) + open var uom: UomConversion? = null + + @NotNull + @Column(name = "seqNo", nullable = false) + open var seqNo: Long? = null + + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "bomId", nullable = false) + open var bom: Bom? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterial.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterial.kt new file mode 100644 index 0000000..b6f1d40 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterial.kt @@ -0,0 +1,19 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull + +@Table(name = "bom_process_material") +@Entity +open class BomProcessMaterial : BaseEntity() { + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "bomProcessId", nullable = false) + open var bomProcess: BomProcess? = null + + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "bomMaterialId", nullable = false) + open var bomMaterial: BomMaterial? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterialRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterialRepository.kt new file mode 100644 index 0000000..3fbf890 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessMaterialRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface BomProcessMaterialRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessRepository.kt new file mode 100644 index 0000000..2511afd --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomProcessRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface BomProcessRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt new file mode 100644 index 0000000..ec0103c --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import java.io.Serializable + +@Repository +interface BomRepository : AbstractRepository { + fun findByIdAndDeletedIsFalse(id: Serializable): Bom? + + fun findByM18IdAndDeletedIsFalse(m18Id: Long): Bom? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt new file mode 100644 index 0000000..a4dedae --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt @@ -0,0 +1,29 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size + +@Table(name = "equipment") +@Entity +open class Equipment : BaseEntity() { + @Size(max = 30) + @NotNull + @Column(name = "code", nullable = false, length = 30) + open var code: String? = null + + @Size(max = 30) + @NotNull + @Column(name = "name", nullable = false, length = 30) + open var name: String? = null + + @Size(max = 500) + @NotNull + @Column(name = "description", nullable = false, length = 500) + open var description: String? = null + + @ManyToOne + @JoinColumn(name = "equipmentTypeId") + open var equipmentType: EquipmentType? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentRepository.kt new file mode 100644 index 0000000..be87864 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface EquipmentRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentType.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentType.kt new file mode 100644 index 0000000..d7b4c2b --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentType.kt @@ -0,0 +1,27 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.Table +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size + +@Table(name = "equipment_type") +@Entity +open class EquipmentType : BaseEntity() { + @Size(max = 30) + @NotNull + @Column(name = "code", nullable = false, length = 30) + open var code: String? = null + + @Size(max = 30) + @NotNull + @Column(name = "name", nullable = false, length = 30) + open var name: String? = null + + @Size(max = 500) + @NotNull + @Column(name = "description", nullable = false, length = 500) + open var description: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentTypeRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentTypeRepository.kt new file mode 100644 index 0000000..7dbd64c --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentTypeRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface EquipmentTypeRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUom.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUom.kt index ef3ae99..dd2a744 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUom.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUom.kt @@ -1,5 +1,6 @@ package com.ffii.fpsms.modules.master.entity +import com.fasterxml.jackson.annotation.JsonBackReference import com.ffii.core.entity.BaseEntity import jakarta.persistence.* import jakarta.validation.constraints.NotNull @@ -12,11 +13,13 @@ open class ItemUom : BaseEntity() { @NotNull @ManyToOne @JoinColumn(name = "uomId", nullable = false) + @JsonBackReference open var uom: UomConversion? = null @NotNull @ManyToOne @JoinColumn(name = "itemId", nullable = false) + @JsonBackReference open var item: Items? = null @NotNull diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt index e3848c5..6b3c99b 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.master.entity import com.ffii.core.support.AbstractRepository +import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository import java.io.Serializable @@ -15,4 +16,6 @@ interface ItemUomRespository : AbstractRepository { fun deleteAllByIdIn(id: List) fun findByItemIdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemId: Serializable): ItemUom? + + fun findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemM18Id: Long): ItemUom? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt index 33891fb..083cb8e 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt @@ -1,5 +1,6 @@ package com.ffii.fpsms.modules.master.entity +import com.fasterxml.jackson.annotation.JsonManagedReference import com.ffii.core.entity.BaseEntity import jakarta.persistence.* import jakarta.validation.constraints.NotNull @@ -41,6 +42,7 @@ open class Items : BaseEntity() { @Column(name = "m18LastModifyDate") open var m18LastModifyDate: LocalDateTime? = null + @JsonManagedReference @OneToMany(mappedBy = "item", cascade = [CascadeType.ALL], orphanRemoval = true) open var itemUoms: MutableSet = mutableSetOf() } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt index 633ff16..163ea52 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt @@ -2,15 +2,54 @@ 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.data.jpa.repository.Query import org.springframework.stereotype.Repository +import java.io.Serializable @Repository interface ItemsRepository : AbstractRepository { fun findAllByDeletedFalse(): List; - fun findByIdAndDeletedFalse(id: Long): Items; + fun findByIdAndDeletedFalse(id: Long): Items?; fun findByCodeAndTypeAndDeletedFalse(code: String, type: String): Items?; fun findByM18IdAndDeletedIsFalse(m18Id: Long): Items?; + + @Query( + """ + select i from Items i + join i.itemUoms iu + join iu.uom u + where i.name = :name and u.m18Id = :m18UomId and i.deleted = false + order by i.id + limit 1 + """ + ) + fun findByNameExactlyAndUomM18Id(name: String, m18UomId: Long): Items?; + + @Query( + """ + select i from Items i + join i.itemUoms iu + join iu.uom u + where i.name like %:name% and u.m18Id = :m18UomId and i.deleted = false + order by i.id + limit 1 + """ + ) + fun findByNameLikeAndUomM18Id(name: String, m18UomId: Long): Items?; + + @Query( + nativeQuery = true, + value = + """ + select i.* from items i + where :m18BomCode like concat('%',i.code,'%') + and i.deleted = false + order by i.id + limit 1 + """ + ) + fun findByM18BomCode(m18BomCode: String): Items?; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Process.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Process.kt new file mode 100644 index 0000000..4aed4af --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Process.kt @@ -0,0 +1,32 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.Table +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size + +@Table(name = "process") +@Entity +open class Process : BaseEntity() { + @Size(max = 30) + @NotNull + @Column(name = "code", nullable = false, length = 30) + open var code: String? = null + + @Size(max = 30) + @NotNull + @Column(name = "name", nullable = false, length = 30) + open var name: String? = null + + @Size(max = 1000) + @NotNull + @Column(name = "description", nullable = true, length = 1000) + open var description: String? = null + + @Size(max = 1000) + @NotNull + @Column(name = "remarks", nullable = true, length = 1000) + open var remarks: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipment.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipment.kt new file mode 100644 index 0000000..55f55c0 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipment.kt @@ -0,0 +1,19 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull + +@Table(name = "process_equipment") +@Entity +open class ProcessEquipment : BaseEntity() { + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "equipmentId", nullable = false) + open var equipment: Equipment? = null + + @NotNull + @ManyToOne(optional = false) + @JoinColumn(name = "processId", nullable = false) + open var process: Process? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipmentRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipmentRepository.kt new file mode 100644 index 0000000..586df5e --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessEquipmentRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface ProcessEquipmentRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessRepository.kt new file mode 100644 index 0000000..682df1d --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProcessRepository.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface ProcessRepository: AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt index 8cffaef..da21491 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt @@ -12,15 +12,15 @@ interface ShopRepository : AbstractRepository { fun findByIdAndDeletedIsFalse(id: Long): Shop? - fun findByM18IdAndDeletedIsFalse(m18Id: Long): Shop? + fun findByM18IdAndTypeAndDeletedIsFalse(m18Id: Long, type: ShopType): Shop? @Query( nativeQuery = true, - value = "select s.id from Shop s where s.code regexp ?1 and s.type = ?2 and s.deleted = false") - fun findIdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp: String, type: String): List? + value = "select s.m18Id from shop s where s.code regexp ?1 and s.type = ?2 and s.deleted = false") + fun findM18IdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp: String, type: String): List? @Query( nativeQuery = true, - value = "select s.id from Shop s where s.code not regexp ?1 and s.type = ?2 and s.deleted = false") - fun findIdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeNotRegexp: String, type: String): List? + value = "select s.m18Id from Shop s where s.code not regexp ?1 and s.type = ?2 and s.deleted = false") + fun findM18IdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeNotRegexp: String, type: String): List? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt index e12317d..aa6ff9c 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt @@ -7,7 +7,7 @@ import java.time.LocalDateTime @Repository interface UomConversionRepository : AbstractRepository { //fun importFromM18(): ArrayList; - fun findByIdAndDeletedFalse(id: Long): UomConversion; + fun findByIdAndDeletedFalse(id: Long): UomConversion?; fun findByM18IdAndDeletedFalse(m18Id: Long): UomConversion?; diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/BomMaterialService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/BomMaterialService.kt new file mode 100644 index 0000000..548e0e8 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/BomMaterialService.kt @@ -0,0 +1,65 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.fpsms.modules.master.entity.* +import com.ffii.fpsms.modules.master.web.models.SaveBomMaterialRequest +import com.ffii.fpsms.modules.master.web.models.SaveBomMaterialResponse +import org.springframework.stereotype.Service + +@Service +open class BomMaterialService( + val bomMaterialRepository: BomMaterialRepository, + val itemsService: ItemsService, + val uomConversionService: UomConversionService, + val bomService: BomService, +) { + open fun findById(id: Long): BomMaterial? { + return bomMaterialRepository.findByIdAndDeletedIsFalse(id); + } + + open fun findByM18Id(m18Id: Long): BomMaterial? { + return bomMaterialRepository.findByM18IdAndDeletedIsFalse(m18Id); + } + + open fun saveBomMaterial(request: SaveBomMaterialRequest): SaveBomMaterialResponse { + val bomMaterial = request.m18Id?.let { findByM18Id(it) } + ?: request.id?.let { findById(it) } + ?: BomMaterial(); + + val item = request.m18ItemId?.let { itemsService.findByM18Id(it) } + ?: request.itemId?.let { itemsService.findById(it) } + + val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } + ?: request.uomId?.let { uomConversionService.findById(it) } + + val bom = request.m18BomId?.let { bomService.findById(it) } + ?: request.bomId?.let { bomService.findById(it) } + ?: Bom() + + bomMaterial.apply { + this.item = item + itemName = request.itemName + isConsumable = request.isConsumable + qty = request.qty + this.uom = uom + uomName = request.uomName + this.bom = bom + m18Id = request.m18Id ?: m18Id + m18LastModifyDate = request.m18LastModifyDate ?: m18LastModifyDate + remarks = request.remarks + } + + val response = bomMaterialRepository.saveAndFlush(bomMaterial).let { + SaveBomMaterialResponse( + id = it.id, + itemName = it.itemName, + isConsumable = it.isConsumable, + qty = it.qty, + uomName = it.uomName, + bomCode = it.bom?.code, + remarks = it.remarks + ) + } + + return response + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt new file mode 100644 index 0000000..3b4f8bf --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt @@ -0,0 +1,64 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.fpsms.modules.master.entity.Bom +import com.ffii.fpsms.modules.master.entity.BomRepository +import com.ffii.fpsms.modules.master.web.models.SaveBomRequest +import com.ffii.fpsms.modules.master.web.models.SaveBomResponse +import org.springframework.stereotype.Service +import kotlin.jvm.optionals.getOrNull + +@Service +open class BomService( + val bomRepository: BomRepository, + val itemsService: ItemsService, + val uomConversionService: UomConversionService +) { + + open fun findById(id: Long): Bom? { + return bomRepository.findByIdAndDeletedIsFalse(id) + } + + open fun findByM18Id(m18Id: Long): Bom? { + return bomRepository.findByM18IdAndDeletedIsFalse(m18Id) + } + + open fun saveBom(request: SaveBomRequest): SaveBomResponse { + + val item = request.code.let { itemsService.findByM18BomCode(it) } ?: request.itemId?.let { itemsService.findById(it) } + + val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } + ?: request.uomId?.let { uomConversionService.findById(it) } + + val bom = request.m18Id?.let { findByM18Id(it) } + ?: request.id?.let { findById(it) } + ?: Bom() + + bom.apply { + this.item = item + code = request.code + name = request.name + description = request.description + outputQty = request.outputQty + outputQtyUom = request.outputQtyUom + yield = request.yield + this.uom = uom + m18Id = request.m18Id ?: m18Id + m18LastModifyDate = request.m18LastModifyDate ?: m18LastModifyDate + } + + val response = bomRepository.saveAndFlush(bom).let { + SaveBomResponse( + id = it.id, + code = it.code, + name = it.name, + description = it.description, + outputQty = it.outputQty, + outputQtyUom = it.outputQtyUom, + yield = it.yield, + uomName = uom?.udfudesc, + ) + } + + return response + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/CurrencyService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/CurrencyService.kt index 69d6c91..84360b3 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/CurrencyService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/CurrencyService.kt @@ -2,7 +2,7 @@ package com.ffii.fpsms.modules.master.service import com.ffii.fpsms.modules.master.entity.Currency import com.ffii.fpsms.modules.master.entity.CurrencyRepository -import com.ffii.fpsms.modules.master.web.models.CurrencyRequest +import com.ffii.fpsms.modules.master.web.models.SaveCurrencyRequest import org.springframework.stereotype.Service @Service @@ -17,7 +17,7 @@ open class CurrencyService( return currencyRepository.findByM18IdAndDeletedIsFalse(m18Id); } - open fun saveCurrency(request: CurrencyRequest): Currency { + open fun saveCurrency(request: SaveCurrencyRequest): Currency { val currency = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: Currency() currency.apply { diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt index 9562cb8..a90708c 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt @@ -4,6 +4,8 @@ import com.ffii.fpsms.modules.master.entity.ItemUom import com.ffii.fpsms.modules.master.entity.ItemUomRespository import com.ffii.fpsms.modules.master.web.models.ItemUomRequest import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import java.io.IOException import kotlin.jvm.optionals.getOrNull @Service @@ -25,9 +27,21 @@ open class ItemUomService( return itemUomRespository.findByM18IdAndDeletedIsFalse(m18Id); } + open fun findPurchaseUnitByItemId(itemId: Long): ItemUom? { + return itemUomRespository.findByItemIdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemId) + } + + open fun findPurchaseUnitByM18ItemId(m18ItemId: Long): ItemUom? { + return itemUomRespository.findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(m18ItemId) + } + // See if need to update the response open fun saveItemUom(request: ItemUomRequest): ItemUom { val itemUom = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: ItemUom() + if (request.m18LastModifyDate == itemUom.m18LastModifyDate) { + return itemUom + } + val item = request.itemId?.let { itemsService.find(it).getOrNull() } val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } ?: request.uomId?.let { uomConversionService.find(it).getOrNull() } val currency = request.currencyId?.let { currencyService.findById(it) } @@ -51,7 +65,12 @@ open class ItemUomService( return savedItemUom } + @Throws(IOException::class) + @Transactional open fun deleteItemUoms(deleteIds: List) { - itemUomRespository.deleteAllByIdIn(deleteIds) +// println(deleteIds) + if (deleteIds.isNotEmpty()) { + itemUomRespository.deleteAllByIdIn(deleteIds) + } } } \ 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 351bbb3..3232e1a 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 @@ -48,15 +48,34 @@ open class ItemsService( return jdbcDao.queryForList(sql.toString(), args); } + open fun findById(id: Long): Items? { + return itemsRepository.findByIdAndDeletedFalse(id); + } open fun findByM18Id(m18Id: Long): Items? { return itemsRepository.findByM18IdAndDeletedIsFalse(m18Id) } + open fun findByNameLikeAndM18UomId(name: String, m18UomId: Long): Items? { + return itemsRepository.findByNameLikeAndUomM18Id(name, m18UomId); + } + + open fun findByNameExactlyAndM18UomId(name: String, m18UomId: Long): Items? { + return itemsRepository.findByNameExactlyAndUomM18Id(name, m18UomId); + } + + open fun findByNameAndM18UomId(name: String, m18UomId: Long): Items? { + return findByNameExactlyAndM18UomId(name, m18UomId) ?: findByNameLikeAndM18UomId(name, m18UomId); + } + + open fun findByM18BomCode(m18BomCode: String): Items? { + return itemsRepository.findByM18BomCode(m18BomCode); + } + // QcCheck included item open fun getItem(id: Long): ItemWithQcResponse { val list = listOf(1,2) - val item = itemsRepository.findByIdAndDeletedFalse(id) + val item = itemsRepository.findByIdAndDeletedFalse(id) ?: Items() val qcItems = qcItemsRepository.findAllByDeletedIsFalse() val qcCheckMap = qcCheckRepository.findAllByItemIdAndDeletedFalse(id).associateBy { it.id } val qc = qcItems.map { @@ -100,8 +119,19 @@ open class ItemsService( ) } val item = if (request.m18Id != null) findByM18Id(request.m18Id) ?: Items() - else if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) + else if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) ?: Items() else Items() + if (item.m18LastModifyDate == request.m18LastModifyDate) { + return MessageResponse( + id = item.id, + code = item.code, + name = item.name, + type = item.type.toString(), + message = "M18 Item does not have any updates", + errorPosition = "m18LastModifyDate" + ) + } + item.apply { code = request.code name = request.name diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt index dad4c85..1a2b13a 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt @@ -21,26 +21,37 @@ open class ShopService( return shopRepository.findByIdAndDeletedIsFalse(id) } - open fun findByM18Id(m18Id: Long): Shop? { - return shopRepository.findByM18IdAndDeletedIsFalse(m18Id) + open fun findVendorByM18Id(m18Id: Long): Shop? { + return shopRepository.findByM18IdAndTypeAndDeletedIsFalse(m18Id, ShopType.SUPPLIER) } - open fun findVendorIdsByCodeRegexp(code: List): List? { + open fun findM18VendorIdsByCodeRegexp(code: List): List? { val codeRegexp = code.joinToString("|") - return shopRepository.findIdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) + return shopRepository.findM18IdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) } - open fun findVendorIdsByCodeNotRegexp(code: List): List? { + open fun findM18VendorIdsByCodeNotRegexp(code: List): List? { val codeRegexp = code.joinToString("|") - return shopRepository.findIdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) + return shopRepository.findM18IdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) } open fun saveShop(request: SaveShopRequest): SaveShopResponse { val shop = if (request.m18Id != null) { - findByM18Id(request.m18Id) ?: Shop() + findVendorByM18Id(request.m18Id) ?: Shop() } else { request.id?.let { shopRepository.findById(it).getOrDefault(Shop()) } ?: Shop() } + + if (shop.m18LastModifyDate == request.m18LastModifyDate) { + return shop.let { + SaveShopResponse( + id = it.id, + code = it.code, + name = it.name, + ) + } + } + val type = request.type?.let { type -> ShopType.entries.find { it.value == type } } shop.apply { diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt index 26c3635..9febe1b 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt @@ -196,6 +196,10 @@ open class UomConversionService( } } + open fun findById(id: Long): UomConversion? { + return uomConversionRepository.findByIdAndDeletedFalse(id) + } + open fun findByM18Id(m18Id: Long) : UomConversion? { return uomConversionRepository.findByM18IdAndDeletedFalse(m18Id) } diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialRequest.kt new file mode 100644 index 0000000..c7d482e --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialRequest.kt @@ -0,0 +1,21 @@ +package com.ffii.fpsms.modules.master.web.models + +import java.math.BigDecimal +import java.time.LocalDateTime + +data class SaveBomMaterialRequest( + val id: Long? = null, + val itemId: Long? = null, + val m18ItemId: Long? = null, + val itemName: String?, + val isConsumable: Boolean = false, + val qty: BigDecimal?, + val uomId: Long? = null, + val m18UomId: Long? = null, + val uomName: String? = null, + val bomId: Long? = null, + val m18BomId: Long? = null, + val m18Id: Long? = null, + val m18LastModifyDate: LocalDateTime? = null, + val remarks: String? = null +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialResponse.kt new file mode 100644 index 0000000..455ae88 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomMaterialResponse.kt @@ -0,0 +1,13 @@ +package com.ffii.fpsms.modules.master.web.models + +import java.math.BigDecimal + +data class SaveBomMaterialResponse ( + val id: Long?, + val itemName: String?, + val isConsumable: Boolean?, + val qty: BigDecimal?, + val uomName: String?, + val bomCode: String?, + val remarks: String?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomRequest.kt new file mode 100644 index 0000000..0a98517 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomRequest.kt @@ -0,0 +1,23 @@ +package com.ffii.fpsms.modules.master.web.models + +import jakarta.validation.constraints.NotBlank +import java.math.BigDecimal +import java.time.LocalDateTime + +data class SaveBomRequest ( + val id: Long? = null, + @field:NotBlank(message = "bom code cannot be empty") + val code: String, + @field:NotBlank(message = "bom name cannot be empty") + val name: String, + @field:NotBlank(message = "bom description cannot be empty") + val description: String, + val itemId: Long? = null, + val outputQty: BigDecimal? = null, + val outputQtyUom: String? = null, + val yield: BigDecimal? = null, + val uomId: Long? = null, + val m18UomId: Long? = null, + val m18Id: Long? = null, + val m18LastModifyDate: LocalDateTime? = null +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomResponse.kt new file mode 100644 index 0000000..3397fbe --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveBomResponse.kt @@ -0,0 +1,14 @@ +package com.ffii.fpsms.modules.master.web.models + +import java.math.BigDecimal + +data class SaveBomResponse ( + val id: Long?, + val code: String?, + val name: String?, + val description: String?, + val outputQty: BigDecimal? = null, + val outputQtyUom: String? = null, + val yield: BigDecimal? = null, + val uomName: String? = null, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveCurrencyRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveCurrencyRequest.kt new file mode 100644 index 0000000..0229c7f --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveCurrencyRequest.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.master.web.models + +import java.time.LocalDateTime + +data class SaveCurrencyRequest ( + val id: Long?, + val code: String?, + val name: String?, + val description: String?, + val m18Id: Long?, + val m18LastModifyDate: LocalDateTime?, +) \ No newline at end of file