| @@ -2,6 +2,8 @@ package com.ffii.fpsms.modules.jobOrder.entity | |||||
| import com.fasterxml.jackson.annotation.JsonBackReference | import com.fasterxml.jackson.annotation.JsonBackReference | ||||
| import com.ffii.core.entity.BaseEntity | 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.Items | ||||
| import com.ffii.fpsms.modules.master.entity.UomConversion | import com.ffii.fpsms.modules.master.entity.UomConversion | ||||
| import com.ffii.fpsms.modules.stock.entity.InventoryLotLine | import com.ffii.fpsms.modules.stock.entity.InventoryLotLine | ||||
| @@ -35,10 +37,11 @@ open class JobOrderBomMaterial : BaseEntity<Long>() { | |||||
| @JoinColumn(name = "uomId", nullable = false) | @JoinColumn(name = "uomId", nullable = false) | ||||
| open var uom: UomConversion? = null | open var uom: UomConversion? = null | ||||
| @Size(max = 255) | |||||
| // @Size(max = 255) | |||||
| @NotNull | @NotNull | ||||
| @Column(name = "status", nullable = false) | @Column(name = "status", nullable = false) | ||||
| open var status: String? = null | |||||
| @Convert(converter = JobOrderBomMaterialStatusConverter::class) | |||||
| open var status: JobOrderBomMaterialStatus? = null | |||||
| @ManyToOne | @ManyToOne | ||||
| @JoinColumn(name = "stockOutLineId") | @JoinColumn(name = "stockOutLineId") | ||||
| @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository | |||||
| @Repository | @Repository | ||||
| interface JobOrderBomMaterialRepository : AbstractRepository<JobOrderBomMaterial, Long> { | interface JobOrderBomMaterialRepository : AbstractRepository<JobOrderBomMaterial, Long> { | ||||
| fun findByJobOrderIdAndItemId(jobOrderId: Long, itemId: Long): JobOrderBomMaterial?; | fun findByJobOrderIdAndItemId(jobOrderId: Long, itemId: Long): JobOrderBomMaterial?; | ||||
| fun findAllByJobOrderId(jobOrderId: Long): List<JobOrderBomMaterial>; | |||||
| } | } | ||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.fpsms.modules.jobOrder.enums | |||||
| enum class JobOrderBomMaterialStatus(val value: String) { | |||||
| PENDING("pending"), | |||||
| COMPLETED("completed") | |||||
| } | |||||
| @@ -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<JobOrderBomMaterialStatus, String> { | |||||
| 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 } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -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.JobOrderBomMaterial | ||||
| import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterialRepository | import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterialRepository | ||||
| import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository | 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.jobOrder.web.model.CreateJobOrderBomMaterialRequest | ||||
| import com.ffii.fpsms.modules.master.entity.ItemsRepository | import com.ffii.fpsms.modules.master.entity.ItemsRepository | ||||
| import com.ffii.fpsms.modules.master.entity.UomConversionRepository | 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 jo = req.joId?.let { jobOrderRepository.findById(it).getOrNull() } | ||||
| val item = req.itemId?.let { itemsRepository.findById(it).getOrNull() } | val item = req.itemId?.let { itemsRepository.findById(it).getOrNull() } | ||||
| val uom = req.uomId?.let { uomConversionRepository.findById(it).getOrNull() } | val uom = req.uomId?.let { uomConversionRepository.findById(it).getOrNull() } | ||||
| val status = JobOrderBomMaterialStatus.entries.find { it.value === req.status } | |||||
| JobOrderBomMaterial().apply { | JobOrderBomMaterial().apply { | ||||
| jobOrder = jo | jobOrder = jo | ||||
| this.item = item | this.item = item | ||||
| reqQty = req.reqQty | reqQty = req.reqQty | ||||
| this.uom = uom | this.uom = uom | ||||
| status = req.status | |||||
| this.status = status | |||||
| } | } | ||||
| } | } | ||||
| @@ -70,4 +72,29 @@ open class JobOrderBomMaterialService( | |||||
| fun createJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { | fun createJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { | ||||
| return createJobOrderBomMaterials(createJobOrderBomMaterialRequests(joId)) | 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) | |||||
| } | |||||
| } | } | ||||
| @@ -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.entity.projections.JobOrderInfo | ||||
| import com.ffii.fpsms.modules.jobOrder.enums.JobOrderStatus | 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.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.jobOrder.web.model.SearchJobOrderInfoRequest | ||||
| import com.ffii.fpsms.modules.master.entity.ProductionScheduleLineRepository | import com.ffii.fpsms.modules.master.entity.ProductionScheduleLineRepository | ||||
| import com.ffii.fpsms.modules.master.service.BomService | import com.ffii.fpsms.modules.master.service.BomService | ||||
| @@ -158,7 +158,7 @@ open class JobOrderService( | |||||
| } | } | ||||
| @Transactional(rollbackFor = [Exception::class]) | @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() | val jo = request.id.let { jobOrderRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() | ||||
| jo.apply { | jo.apply { | ||||
| status = JobOrderStatus.PENDING | 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( | return MessageResponse( | ||||
| id = jo.id, | id = jo.id, | ||||
| code = jo.code, | code = jo.code, | ||||
| @@ -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.JobOrderProcessService | ||||
| import com.ffii.fpsms.modules.jobOrder.service.JobOrderService | 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.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.jobOrder.web.model.SearchJobOrderInfoRequest | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
| @@ -46,10 +46,21 @@ class JobOrderController( | |||||
| } | } | ||||
| @PostMapping("/release") | @PostMapping("/release") | ||||
| fun releaseJobOrder(@Valid @RequestBody request: JobOrderReleaseRequest): MessageResponse { | |||||
| fun releaseJobOrder(@Valid @RequestBody request: JobOrderCommonActionRequest): MessageResponse { | |||||
| return jobOrderService.releaseJobOrder(request) | 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") | @PostMapping("/manualCreate") | ||||
| fun manualCreateJobOrder(@Valid @RequestBody request: CreateJobOrderRequest): MessageResponse { | fun manualCreateJobOrder(@Valid @RequestBody request: CreateJobOrderRequest): MessageResponse { | ||||
| val jo = jobOrderService.createJobOrder(request) | val jo = jobOrderService.createJobOrder(request) | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.ffii.fpsms.modules.jobOrder.web.model | package com.ffii.fpsms.modules.jobOrder.web.model | ||||
| import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus | |||||
| import java.math.BigDecimal | import java.math.BigDecimal | ||||
| import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
| @@ -19,7 +20,7 @@ data class CreateJobOrderBomMaterialRequest ( | |||||
| val itemId: Long?, | val itemId: Long?, | ||||
| val reqQty: BigDecimal?, | val reqQty: BigDecimal?, | ||||
| val uomId: Long?, | val uomId: Long?, | ||||
| val status: String = "pending", | |||||
| val status: String = JobOrderBomMaterialStatus.PENDING.value, | |||||
| ) | ) | ||||
| data class CreateJobOrderProcessRequest ( | data class CreateJobOrderProcessRequest ( | ||||
| @@ -1,5 +1,5 @@ | |||||
| package com.ffii.fpsms.modules.jobOrder.web.model | package com.ffii.fpsms.modules.jobOrder.web.model | ||||
| data class JobOrderReleaseRequest( | |||||
| data class JobOrderCommonActionRequest( | |||||
| val id: Long, | val id: Long, | ||||
| ) | |||||
| ) | |||||
| @@ -83,8 +83,8 @@ open class StockInLineService( | |||||
| val pol = if (request.purchaseOrderLineId != null) | val pol = if (request.purchaseOrderLineId != null) | ||||
| request.purchaseOrderLineId?.let { polRepository.findById(it).orElseThrow() } | request.purchaseOrderLineId?.let { polRepository.findById(it).orElseThrow() } | ||||
| else null | 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 | else null | ||||
| var stockIn = if (request.stockInId != null) request.stockInId?.let { stockInRepository.findByIdAndDeletedFalse(it) } | var stockIn = if (request.stockInId != null) request.stockInId?.let { stockInRepository.findByIdAndDeletedFalse(it) } | ||||