|
|
@@ -6,16 +6,40 @@ import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository |
|
|
|
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 |
|
|
|
import com.ffii.fpsms.modules.master.service.ItemUomService |
|
|
|
import com.ffii.fpsms.modules.master.web.models.MessageResponse |
|
|
|
import org.springframework.stereotype.Service |
|
|
|
import java.math.BigDecimal |
|
|
|
import java.math.RoundingMode |
|
|
|
import kotlin.jvm.optionals.getOrNull |
|
|
|
|
|
|
|
@Service |
|
|
|
open class JobOrderBomMaterialService( |
|
|
|
val jobOrderBomMaterialRepository: JobOrderBomMaterialRepository, private val jobOrderRepository: JobOrderRepository, |
|
|
|
val jobOrderBomMaterialRepository: JobOrderBomMaterialRepository, |
|
|
|
private val jobOrderRepository: JobOrderRepository, |
|
|
|
private val itemsRepository: ItemsRepository, |
|
|
|
val itemUomService: ItemUomService, |
|
|
|
private val uomConversionRepository: UomConversionRepository |
|
|
|
) { |
|
|
|
open fun createJobOrderBomMaterialRequests(joId: Long): List<CreateJobOrderBomMaterialRequest> { |
|
|
|
val zero = BigDecimal.ZERO |
|
|
|
val jo = jobOrderRepository.findById(joId).getOrNull() ?: throw NoSuchElementException() |
|
|
|
val proportion = (jo.reqQty ?: zero).divide(jo.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP) |
|
|
|
|
|
|
|
val jobmRequests = jo.bom?.bomMaterials?.map { bm -> |
|
|
|
val salesUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) } |
|
|
|
|
|
|
|
CreateJobOrderBomMaterialRequest( |
|
|
|
joId = joId, |
|
|
|
itemId = bm.item?.id, |
|
|
|
reqQty = bm.qty?.times(proportion) ?: zero, |
|
|
|
uomId = salesUnit?.uom?.id |
|
|
|
) |
|
|
|
} ?: listOf() |
|
|
|
|
|
|
|
return jobmRequests |
|
|
|
} |
|
|
|
|
|
|
|
fun createJobOrderBomMaterials(request: List<CreateJobOrderBomMaterialRequest>): MessageResponse { |
|
|
|
val joBomMaterials = request.map { req -> |
|
|
|
val jo = req.joId?.let { jobOrderRepository.findById(it).getOrNull() } |
|
|
@@ -42,4 +66,8 @@ open class JobOrderBomMaterialService( |
|
|
|
errorPosition = null |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
fun createJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { |
|
|
|
return createJobOrderBomMaterials(createJobOrderBomMaterialRequests(joId)) |
|
|
|
} |
|
|
|
} |