diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt index ed3c6f1..3f1f87f 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt @@ -2,6 +2,8 @@ package com.ffii.fpsms.modules.jobOrder.entity import com.fasterxml.jackson.annotation.JsonBackReference import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatusConverter import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.master.entity.UomConversion import com.ffii.fpsms.modules.stock.entity.InventoryLotLine @@ -35,10 +37,11 @@ open class JobOrderBomMaterial : BaseEntity() { @JoinColumn(name = "uomId", nullable = false) open var uom: UomConversion? = null - @Size(max = 255) +// @Size(max = 255) @NotNull @Column(name = "status", nullable = false) - open var status: String? = null + @Convert(converter = JobOrderBomMaterialStatusConverter::class) + open var status: JobOrderBomMaterialStatus? = null @ManyToOne @JoinColumn(name = "stockOutLineId") diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt index 8395771..13fe3e3 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository @Repository interface JobOrderBomMaterialRepository : AbstractRepository { fun findByJobOrderIdAndItemId(jobOrderId: Long, itemId: Long): JobOrderBomMaterial?; + + fun findAllByJobOrderId(jobOrderId: Long): List; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt new file mode 100644 index 0000000..b776778 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt @@ -0,0 +1,6 @@ +package com.ffii.fpsms.modules.jobOrder.enums + +enum class JobOrderBomMaterialStatus(val value: String) { + PENDING("pending"), + COMPLETED("completed") +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt new file mode 100644 index 0000000..e293951 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt @@ -0,0 +1,18 @@ +package com.ffii.fpsms.modules.jobOrder.enums + +import jakarta.persistence.AttributeConverter +import jakarta.persistence.Converter + +// Job Order Bom Material Status +@Converter(autoApply = true) +class JobOrderBomMaterialStatusConverter : AttributeConverter { + override fun convertToDatabaseColumn(status: JobOrderBomMaterialStatus?): String? { + return status?.value + } + + override fun convertToEntityAttribute(value: String?): JobOrderBomMaterialStatus? { + return value?.let { v -> + JobOrderBomMaterialStatus.entries.find { it.value == v } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt index 178a2f3..b9c79fc 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.jobOrder.service import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterial import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterialRepository import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderBomMaterialRequest import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.entity.UomConversionRepository @@ -45,13 +46,14 @@ open class JobOrderBomMaterialService( val jo = req.joId?.let { jobOrderRepository.findById(it).getOrNull() } val item = req.itemId?.let { itemsRepository.findById(it).getOrNull() } val uom = req.uomId?.let { uomConversionRepository.findById(it).getOrNull() } + val status = JobOrderBomMaterialStatus.entries.find { it.value === req.status } JobOrderBomMaterial().apply { jobOrder = jo this.item = item reqQty = req.reqQty this.uom = uom - status = req.status + this.status = status } } @@ -70,4 +72,29 @@ open class JobOrderBomMaterialService( fun createJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { return createJobOrderBomMaterials(createJobOrderBomMaterialRequests(joId)) } + + // After Picked Job Order Bom Material + fun completeJobOrderBomMaterials(joId: Long): MessageResponse { + val jobms = jobOrderBomMaterialRepository.findAllByJobOrderId(joId) + val updatedJobms = jobms.map { + it.apply { + status = JobOrderBomMaterialStatus.COMPLETED + } + } + + jobOrderBomMaterialRepository.saveAll(updatedJobms) + + return MessageResponse( + id = null, + name = null, + code = null, + type = null, + message = "Success", + errorPosition = null + ) + } + + fun completeJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { + return completeJobOrderBomMaterials(joId) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt index b707515..b56b489 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt @@ -10,7 +10,7 @@ import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderDetailPickLine import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderInfo import com.ffii.fpsms.modules.jobOrder.enums.JobOrderStatus import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderRequest -import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderReleaseRequest +import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderCommonActionRequest import com.ffii.fpsms.modules.jobOrder.web.model.SearchJobOrderInfoRequest import com.ffii.fpsms.modules.master.entity.ProductionScheduleLineRepository import com.ffii.fpsms.modules.master.service.BomService @@ -158,7 +158,7 @@ open class JobOrderService( } @Transactional(rollbackFor = [Exception::class]) - open fun releaseJobOrder(request: JobOrderReleaseRequest): MessageResponse { + open fun releaseJobOrder(request: JobOrderCommonActionRequest): MessageResponse { val jo = request.id.let { jobOrderRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() jo.apply { status = JobOrderStatus.PENDING @@ -255,6 +255,26 @@ open class JobOrderService( } + return MessageResponse( + id = jo.id, + code = jo.code, + name = jo.bom?.name, + type = null, + message = null, + errorPosition = null, + entity = mapOf("status" to jo.status?.value) + ) + } + + + @Transactional(rollbackFor = [Exception::class]) + open fun startJobOrder(request: JobOrderCommonActionRequest): MessageResponse { + val jo = request.id.let { jobOrderRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() + jo.apply { + status = JobOrderStatus.PROCESSING + } + jobOrderRepository.save(jo) + return MessageResponse( id = jo.id, code = jo.code, diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt index ae085b7..1483543 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt @@ -7,7 +7,7 @@ import com.ffii.fpsms.modules.jobOrder.service.JobOrderBomMaterialService import com.ffii.fpsms.modules.jobOrder.service.JobOrderProcessService import com.ffii.fpsms.modules.jobOrder.service.JobOrderService import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderRequest -import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderReleaseRequest +import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderCommonActionRequest import com.ffii.fpsms.modules.jobOrder.web.model.SearchJobOrderInfoRequest import com.ffii.fpsms.modules.master.web.models.MessageResponse import jakarta.validation.Valid @@ -46,10 +46,21 @@ class JobOrderController( } @PostMapping("/release") - fun releaseJobOrder(@Valid @RequestBody request: JobOrderReleaseRequest): MessageResponse { + fun releaseJobOrder(@Valid @RequestBody request: JobOrderCommonActionRequest): MessageResponse { return jobOrderService.releaseJobOrder(request) } + @PostMapping("/start") + fun startJobOrder(@Valid @RequestBody request: JobOrderCommonActionRequest): MessageResponse { + val jo = jobOrderService.startJobOrder(request) + if (jo.id == null) { + throw NoSuchElementException() + } + jobOrderBomMaterialService.completeJobOrderBomMaterialsByJoId(jo.id) + + return jo + } + @PostMapping("/manualCreate") fun manualCreateJobOrder(@Valid @RequestBody request: CreateJobOrderRequest): MessageResponse { val jo = jobOrderService.createJobOrder(request) diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt index c9b05f2..175beb6 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt @@ -1,5 +1,6 @@ package com.ffii.fpsms.modules.jobOrder.web.model +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus import java.math.BigDecimal import java.time.LocalDateTime @@ -19,7 +20,7 @@ data class CreateJobOrderBomMaterialRequest ( val itemId: Long?, val reqQty: BigDecimal?, val uomId: Long?, - val status: String = "pending", + val status: String = JobOrderBomMaterialStatus.PENDING.value, ) data class CreateJobOrderProcessRequest ( diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt index d8e3bcc..217d306 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt @@ -1,5 +1,5 @@ package com.ffii.fpsms.modules.jobOrder.web.model -data class JobOrderReleaseRequest( +data class JobOrderCommonActionRequest( val id: Long, -) +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt index f40f1d7..7571f8f 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt @@ -83,8 +83,8 @@ open class StockInLineService( val pol = if (request.purchaseOrderLineId != null) request.purchaseOrderLineId?.let { polRepository.findById(it).orElseThrow() } else null - val stl = if (request.stockTakeId != null) - request.stockTakeId?.let { stockTakeLineRepository.findById(it).getOrNull() } + val stl = if (request.stockTakeLineId != null) + request.stockTakeLineId?.let { stockTakeLineRepository.findById(it).getOrNull() } else null var stockIn = if (request.stockInId != null) request.stockInId?.let { stockInRepository.findByIdAndDeletedFalse(it) }