| @@ -54,8 +54,11 @@ interface JobOrderRepository : AbstractRepository<JobOrder, Long> { | |||||
| json_arrayagg( | json_arrayagg( | ||||
| json_object( | json_object( | ||||
| 'id', jobm.id, | 'id', jobm.id, | ||||
| 'itemId', jobm.itemId, | |||||
| 'uomId', jobm.uomId, | |||||
| 'code', i.code, | 'code', i.code, | ||||
| 'name', i.name, | 'name', i.name, | ||||
| 'type', i.type, | |||||
| 'pickedLotNo', pln.pickedLotNo, | 'pickedLotNo', pln.pickedLotNo, | ||||
| 'reqQty', jobm.reqQty, | 'reqQty', jobm.reqQty, | ||||
| 'uom', uc.udfudesc, | 'uom', uc.udfudesc, | ||||
| @@ -93,8 +96,11 @@ interface JobOrderRepository : AbstractRepository<JobOrder, Long> { | |||||
| json_arrayagg( | json_arrayagg( | ||||
| json_object( | json_object( | ||||
| 'id', jobm.id, | 'id', jobm.id, | ||||
| 'itemId', jobm.itemId, | |||||
| 'uomId', jobm.uomId, | |||||
| 'code', i.code, | 'code', i.code, | ||||
| 'name', i.name, | 'name', i.name, | ||||
| 'type', i.type, | |||||
| 'lotNo', il.lotNo, | 'lotNo', il.lotNo, | ||||
| 'reqQty', jobm.reqQty, | 'reqQty', jobm.reqQty, | ||||
| 'uom', uc.udfudesc, | 'uom', uc.udfudesc, | ||||
| @@ -272,8 +278,11 @@ interface JobOrderRepository : AbstractRepository<JobOrder, Long> { | |||||
| json_arrayagg( | json_arrayagg( | ||||
| json_object( | json_object( | ||||
| 'id', jobm.id, | 'id', jobm.id, | ||||
| 'itemId', jobm.itemId, | |||||
| 'uomId', jobm.uomId, | |||||
| 'code', i.code, | 'code', i.code, | ||||
| 'name', i.name, | 'name', i.name, | ||||
| 'type', i.type, | |||||
| 'lotNo', il.lotNo, | 'lotNo', il.lotNo, | ||||
| 'reqQty', jobm.reqQty, | 'reqQty', jobm.reqQty, | ||||
| 'uom', uc.udfudesc, | 'uom', uc.udfudesc, | ||||
| @@ -312,8 +321,11 @@ interface JobOrderRepository : AbstractRepository<JobOrder, Long> { | |||||
| json_arrayagg( | json_arrayagg( | ||||
| json_object( | json_object( | ||||
| 'id', jobm.id, | 'id', jobm.id, | ||||
| 'itemId', jobm.itemId, | |||||
| 'uomId', jobm.uomId, | |||||
| 'code', i.code, | 'code', i.code, | ||||
| 'name', i.name, | 'name', i.name, | ||||
| 'type', i.type, | |||||
| 'lotNo', il.lotNo, | 'lotNo', il.lotNo, | ||||
| 'reqQty', jobm.reqQty, | 'reqQty', jobm.reqQty, | ||||
| 'uom', uc.udfudesc, | 'uom', uc.udfudesc, | ||||
| @@ -126,6 +126,8 @@ data class JobOrderDetail( | |||||
| data class JobOrderDetailPickLine( | data class JobOrderDetailPickLine( | ||||
| val id: Long?, | val id: Long?, | ||||
| val itemId: Long?, | |||||
| val uomId: Long?, | |||||
| val code: String?, | val code: String?, | ||||
| val name: String?, | val name: String?, | ||||
| val pickedLotNo: List<JobOrderDetailPickedLotNo>?, | val pickedLotNo: List<JobOrderDetailPickedLotNo>?, | ||||
| @@ -183,7 +183,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| bmi.code, | bmi.code, | ||||
| bmi.name, | bmi.name, | ||||
| bmi.`type`, | bmi.`type`, | ||||
| coalesce(i.onHandQty, 0) - coalesce(i.onHoldQty, 0) - coalesce(i.unavailableQty, 0) as availableQty, | |||||
| coalesce(i.onHandQty, 0) - coalesce(i.unavailableQty, 0) as availableQty, | |||||
| -- ceil(coalesce(bm.qty, 0) * pp.proportion) as demandQty | -- ceil(coalesce(bm.qty, 0) * pp.proportion) as demandQty | ||||
| coalesce(bm.qty, 0) * pp.proportion as demandQty, | coalesce(bm.qty, 0) * pp.proportion as demandQty, | ||||
| uc.udfudesc as uomName | uc.udfudesc as uomName | ||||
| @@ -195,7 +195,13 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| left join items bmi on bmi.id = bm.itemId | left join items bmi on bmi.id = bm.itemId | ||||
| left join item_uom iu on iu.itemId = bmi.id and iu.salesUnit = true | left join item_uom iu on iu.itemId = bmi.id and iu.salesUnit = true | ||||
| left join uom_conversion uc on uc.id = iu.uomId | left join uom_conversion uc on uc.id = iu.uomId | ||||
| left join item_uom iu_stock on iu_stock.itemId = bmi.id and iu_stock.stockUnit = 1 and ifnull(iu_stock.deleted, 0) = 0 | |||||
| left join inventory i on i.itemId = bmi.id | left join inventory i on i.itemId = bmi.id | ||||
| and ifnull(i.deleted, 0) = 0 | |||||
| and ( | |||||
| i.stockUomId = coalesce(nullif(bm.stockUnit, 0), iu_stock.uomId) | |||||
| or (i.stockUomId is null and i.uomId = coalesce(nullif(bm.stockUnit, 0), iu_stock.uomId)) | |||||
| ) | |||||
| where ps.id = :id and bmi.id is not null | where ps.id = :id and bmi.id is not null | ||||
| group by ps.id, psl.id, bm.id, i.id, pp.proportion, uc.udfudesc | group by ps.id, psl.id, bm.id, i.id, pp.proportion, uc.udfudesc | ||||
| ) r2 | ) r2 | ||||
| @@ -13,7 +13,8 @@ import org.slf4j.Logger | |||||
| import org.slf4j.LoggerFactory | import org.slf4j.LoggerFactory | ||||
| import com.ffii.fpsms.modules.master.entity.ItemsRepository | import com.ffii.fpsms.modules.master.entity.ItemsRepository | ||||
| import com.ffii.fpsms.modules.stock.entity.Inventory | import com.ffii.fpsms.modules.stock.entity.Inventory | ||||
| import com.ffii.fpsms.modules.stock.entity.InventoryRepository | |||||
| import com.ffii.fpsms.modules.stock.entity.InventoryLotLine | |||||
| import com.ffii.fpsms.modules.stock.service.InventoryBucketResolver | |||||
| @Service | @Service | ||||
| open class ItemUomService( | open class ItemUomService( | ||||
| @@ -22,7 +23,7 @@ open class ItemUomService( | |||||
| val itemUomRespository: ItemUomRespository, | val itemUomRespository: ItemUomRespository, | ||||
| val currencyService: CurrencyService, | val currencyService: CurrencyService, | ||||
| val itemsRepository: ItemsRepository, | val itemsRepository: ItemsRepository, | ||||
| private val inventoryRepository: InventoryRepository, | |||||
| private val inventoryBucketResolver: InventoryBucketResolver, | |||||
| ) { | ) { | ||||
| val logger = org.slf4j.LoggerFactory.getLogger(this::class.java) | val logger = org.slf4j.LoggerFactory.getLogger(this::class.java) | ||||
| @@ -84,16 +85,7 @@ open class ItemUomService( | |||||
| ), | ), | ||||
| ) | ) | ||||
| open fun findInventoryForItemBaseUom(itemId: Long): Inventory? { | open fun findInventoryForItemBaseUom(itemId: Long): Inventory? { | ||||
| val stockUnitUomId = findStockUnitByItemId(itemId)?.uom?.id | |||||
| if (stockUnitUomId != null) { | |||||
| inventoryRepository.findByItemIdAndStockUomIdAndDeletedIsFalse(itemId, stockUnitUomId)?.let { | |||||
| return it | |||||
| } | |||||
| inventoryRepository.findFirstByItemIdAndStockUomIdAndDeletedIsFalseOrderByIdAsc(itemId, stockUnitUomId) | |||||
| ?.let { return it } | |||||
| } | |||||
| // Last resort only while stockUomId is still null on old rows (pre data patch). | |||||
| return inventoryRepository.findFirstByItemIdAndDeletedIsFalseOrderByIdAsc(itemId) | |||||
| return inventoryBucketResolver.findInventoryBucket(itemId, null as InventoryLotLine?) | |||||
| } | } | ||||
| open fun findPickingUnitByItemId(itemId: Long): ItemUom? { | open fun findPickingUnitByItemId(itemId: Long): ItemUom? { | ||||
| @@ -109,6 +109,7 @@ data class jobOrderLineInfo( | |||||
| val stockUom: String?, | val stockUom: String?, | ||||
| val stockBaseUom: String?, | val stockBaseUom: String?, | ||||
| val stockUomId: Long?, | |||||
| val availableStatus: String?, | val availableStatus: String?, | ||||
| val bomProcessId: Long?, | val bomProcessId: Long?, | ||||
| @@ -915,6 +915,7 @@ open class ProductProcessService( | |||||
| reqBaseUom = baseUomName ?: "", | reqBaseUom = baseUomName ?: "", | ||||
| stockUom = stockUomName ?: "", | stockUom = stockUomName ?: "", | ||||
| stockBaseUom = baseUomName ?: "", | stockBaseUom = baseUomName ?: "", | ||||
| stockUomId = stockUomId, | |||||
| type = line.item?.type ?: "", | type = line.item?.type ?: "", | ||||
| availableStatus = availableStatus, | availableStatus = availableStatus, | ||||