| @@ -3,6 +3,8 @@ package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import com.ffii.fpsms.modules.stock.entity.projection.CurrentInventoryItemInfo | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryLotLineInfo | |||
| import org.springframework.data.domain.Page | |||
| import org.springframework.data.domain.Pageable | |||
| import org.springframework.data.jpa.repository.Query | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| @@ -11,6 +13,9 @@ import java.io.Serializable | |||
| interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long> { | |||
| fun findInventoryLotLineInfoByInventoryLotItemIdIn(ids: List<Serializable>): List<InventoryLotLineInfo> | |||
| @Query("select ill from InventoryLotLine ill where :id is null or ill.inventoryLot.item.id = :id") | |||
| fun findInventoryLotLineInfoByItemId(id: Long?, pageable: Pageable): Page<InventoryLotLineInfo> | |||
| @Query(""" | |||
| select | |||
| i.id as id, | |||
| @@ -3,6 +3,8 @@ package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import com.ffii.fpsms.modules.master.entity.Items | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo | |||
| import org.springframework.data.domain.Page | |||
| import org.springframework.data.domain.Pageable | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| import java.util.Optional | |||
| @@ -11,6 +13,8 @@ import java.util.Optional | |||
| interface InventoryRepository: AbstractRepository<Inventory, Long> { | |||
| fun findInventoryInfoByDeletedIsFalse(): List<InventoryInfo> | |||
| fun findInventoryInfoByItemCodeContainsAndItemNameContainsAndItemTypeContainsAndDeletedIsFalse(code: String, name: String, type: String, pageable: Pageable): Page<InventoryInfo> | |||
| fun findInventoryInfoByItemIdInAndDeletedIsFalse(itemIds: List<Serializable>): List<InventoryInfo> | |||
| fun findInventoryInfoByItemInAndDeletedIsFalse(items: List<Items>): List<InventoryInfo> | |||
| @@ -26,8 +26,12 @@ interface InventoryInfo{ | |||
| val uomCode: String? | |||
| @get:Value("#{target.item.itemUoms.^[purchaseUnit == true && deleted == false]?.uom.udfudesc}") | |||
| val uomUdfudesc: String? | |||
| // @get:Value("#{target.qty * target.uom.gramPerSmallestUnit}") | |||
| // @get:Value("#{target.qty * target.uom.gramPerSmallestUnit}") | |||
| // val germPerSmallestUnit: BigDecimal? | |||
| @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty)}") | |||
| val qtyPerSmallestUnit: BigDecimal? | |||
| @get:Value("#{target.item.itemUoms.^[baseUnit == true && deleted == false]?.uom.udfudesc}") | |||
| val baseUom: String? | |||
| // @get:Value("#{target.qty * (target.uom.unit4 != '' ? target.uom.unit4Qty " + | |||
| // ": target.uom.unit3 != '' ? target.uom.unit3Qty " + | |||
| // ": target.uom.unit2 != '' ? target.uom.unit2Qty " + | |||
| @@ -8,6 +8,7 @@ interface InventoryLotLineItemInfo { | |||
| val id: Long | |||
| val code: String | |||
| val name: String | |||
| val type: String | |||
| } | |||
| interface InventoryLotLineWarehouseInfo { | |||
| @@ -20,13 +21,23 @@ interface InventoryLotLineWarehouseInfo { | |||
| interface InventoryLotLineInfo { | |||
| val id: Long? | |||
| @get:Value("#{target.inventoryLot.lotNo}") | |||
| val lotNo: String? | |||
| @get:Value("#{target.inventoryLot.item}") | |||
| val item: InventoryLotLineItemInfo? | |||
| val warehouse: InventoryLotLineWarehouseInfo? | |||
| @get:Value("#{((target.inQty ?: 0) - (target.outQty ?: 0) - (target.holdQty ?: 0)) / (target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||
| var availableQty: BigDecimal? | |||
| @get:Value("#{(target.inQty ?: 0)/ (target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||
| var inQty: BigDecimal? | |||
| @get:Value("#{(target.outQty ?: 0)/ (target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||
| var outQty: BigDecimal? | |||
| @get:Value("#{(target.holdQty ?: 0)/ (target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.inventoryLot.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||
| var holdQty: BigDecimal? | |||
| @get:Value("#{(target.inQty ?: 0) - (target.outQty ?: 0) - (target.holdQty ?: 0)}") | |||
| val qtyPerSmallestUnit: BigDecimal? | |||
| @get:Value("#{target.inventoryLot.item.itemUoms.^[baseUnit == true && deleted == false]?.uom.udfudesc}") | |||
| val baseUom: String? | |||
| @get:Value("#{target.status.value}") | |||
| val status: String? | |||
| @@ -1,5 +1,6 @@ | |||
| package com.ffii.fpsms.modules.stock.service | |||
| import com.ffii.core.response.RecordsRes | |||
| import com.ffii.fpsms.modules.master.entity.ItemUomRespository | |||
| import com.ffii.fpsms.modules.master.entity.WarehouseRepository | |||
| import com.ffii.fpsms.modules.stock.entity.InventoryLotLine | |||
| @@ -8,9 +9,9 @@ import com.ffii.fpsms.modules.stock.entity.InventoryLotRepository | |||
| import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryLotLineInfo | |||
| import com.ffii.fpsms.modules.stock.web.model.SaveInventoryLotLineRequest | |||
| import com.ffii.fpsms.modules.stock.web.model.SearchInventoryLotLineInfoRequest | |||
| import org.springframework.data.domain.PageRequest | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Propagation | |||
| import org.springframework.transaction.annotation.Transactional | |||
| import java.math.BigDecimal | |||
| import java.util.Optional | |||
| import kotlin.jvm.optionals.getOrNull | |||
| @@ -30,6 +31,16 @@ open class InventoryLotLineService( | |||
| return inventoryLotLineRepository.findInventoryLotLineInfoByInventoryLotItemIdIn(itemIds) | |||
| } | |||
| open fun allInventoryLotLinesByPage(request: SearchInventoryLotLineInfoRequest): RecordsRes<InventoryLotLineInfo> { | |||
| val pageable = PageRequest.of(request.pageNum ?: 0, request.pageSize ?: 10); | |||
| val response = inventoryLotLineRepository.findInventoryLotLineInfoByItemId(request.itemId, pageable) | |||
| val records = response.content | |||
| val total = response.totalElements | |||
| return RecordsRes<InventoryLotLineInfo>(records, total.toInt()); | |||
| } | |||
| open fun saveInventoryLotLine(request: SaveInventoryLotLineRequest): InventoryLotLine { | |||
| val inventoryLotLine = | |||
| request.id?.let { inventoryLotLineRepository.findById(it).getOrNull() } ?: InventoryLotLine() | |||
| @@ -1,24 +1,19 @@ | |||
| package com.ffii.fpsms.modules.stock.service | |||
| import com.ffii.core.response.RecordsRes | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.fpsms.modules.common.CodeGenerator | |||
| import com.ffii.fpsms.modules.master.entity.Items | |||
| 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.service.UomConversionService | |||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
| import com.ffii.fpsms.modules.stock.entity.Inventory | |||
| import com.ffii.fpsms.modules.stock.entity.InventoryRepository | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo | |||
| import com.ffii.fpsms.modules.stock.web.model.SaveInventoryRequest | |||
| import com.ffii.fpsms.modules.stock.web.model.SearchInventoryRequest | |||
| import org.springframework.data.domain.PageRequest | |||
| import org.springframework.stereotype.Service | |||
| import java.io.IOException | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDate | |||
| import java.time.format.DateTimeFormatter | |||
| import kotlin.jvm.optionals.getOrNull | |||
| @Service | |||
| open class InventoryService( | |||
| @@ -39,6 +34,22 @@ open class InventoryService( | |||
| return inventoryRepository.findInventoryInfoByDeletedIsFalse(); | |||
| } | |||
| open fun allInventoriesByPage(request: SearchInventoryRequest): RecordsRes<InventoryInfo>{ | |||
| val pageable = PageRequest.of(request.pageNum ?: 0, request.pageSize ?: 10) | |||
| val response = inventoryRepository.findInventoryInfoByItemCodeContainsAndItemNameContainsAndItemTypeContainsAndDeletedIsFalse( | |||
| code = request.code, | |||
| name = request.name, | |||
| type = request.type, | |||
| pageable = pageable | |||
| ) | |||
| val records = response.content | |||
| val total = response.totalElements | |||
| return RecordsRes<InventoryInfo>(records, total.toInt()); | |||
| } | |||
| open fun allInventoriesByItems(items: List<Items>): List<InventoryInfo>{ | |||
| return inventoryRepository.findInventoryInfoByItemInAndDeletedIsFalse(items); | |||
| } | |||
| @@ -1,8 +1,11 @@ | |||
| package com.ffii.fpsms.modules.stock.web | |||
| import com.ffii.core.response.RecordsRes | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo | |||
| import com.ffii.fpsms.modules.stock.service.InventoryService | |||
| import com.ffii.fpsms.modules.stock.web.model.SearchInventoryRequest | |||
| import org.springframework.web.bind.annotation.GetMapping | |||
| import org.springframework.web.bind.annotation.ModelAttribute | |||
| import org.springframework.web.bind.annotation.RequestMapping | |||
| import org.springframework.web.bind.annotation.RestController | |||
| @@ -15,4 +18,9 @@ class InventoryController( | |||
| fun allInventories(): List<InventoryInfo> { | |||
| return inventoryService.allInventories() | |||
| } | |||
| @GetMapping("/getRecordByPage") | |||
| fun allInventoriesByPage(@ModelAttribute request: SearchInventoryRequest): RecordsRes<InventoryInfo> { | |||
| return inventoryService.allInventoriesByPage(request); | |||
| } | |||
| } | |||
| @@ -1,23 +1,22 @@ | |||
| package com.ffii.fpsms.modules.stock.web | |||
| import com.ffii.core.response.RecordsRes | |||
| import com.ffii.fpsms.modules.pickOrder.web.models.ConsoPickOrderRequest | |||
| import com.ffii.fpsms.modules.stock.entity.InventoryLotLineRepository | |||
| import com.ffii.fpsms.modules.stock.entity.StockInLineRepository | |||
| import com.ffii.fpsms.modules.stock.entity.projection.InventoryLotLineInfo | |||
| import com.ffii.fpsms.modules.stock.service.InventoryLotLineService | |||
| import com.ffii.fpsms.modules.stock.web.model.LotLineInfo | |||
| import com.ffii.fpsms.modules.stock.web.model.SearchInventoryLotLineInfoRequest | |||
| import jakarta.validation.Valid | |||
| import org.springframework.web.bind.annotation.GetMapping | |||
| import org.springframework.web.bind.annotation.PathVariable | |||
| import org.springframework.web.bind.annotation.PostMapping | |||
| import org.springframework.web.bind.annotation.RequestBody | |||
| import org.springframework.web.bind.annotation.RequestMapping | |||
| import org.springframework.web.bind.annotation.RequestParam | |||
| import org.springframework.web.bind.annotation.RestController | |||
| import org.springframework.web.bind.annotation.* | |||
| import java.math.BigDecimal | |||
| @RequestMapping("/inventoryLotLine") | |||
| @RestController | |||
| class InventoryLotLineController ( | |||
| private val inventoryLotLineRepository: InventoryLotLineRepository, | |||
| private val inventoryLotLineService: InventoryLotLineService, | |||
| private val stockInLineRepository: StockInLineRepository, | |||
| ){ | |||
| @@ -30,6 +29,12 @@ class InventoryLotLineController ( | |||
| return inventoryLotLineRepository.findCurrentInventoryByItems(request.ids) | |||
| } | |||
| @GetMapping("/getRecordByPage") | |||
| fun allInventoryLotLinesByPage(@ModelAttribute request: SearchInventoryLotLineInfoRequest): RecordsRes<InventoryLotLineInfo> { | |||
| println(request.itemId) | |||
| return inventoryLotLineService.allInventoryLotLinesByPage(request); | |||
| } | |||
| @GetMapping("/lot-detail/{stockInLineId}") | |||
| fun getLotDetail(@Valid @PathVariable stockInLineId: Long): LotLineInfo { | |||
| val stockInLine = stockInLineRepository.findById(stockInLineId).orElseThrow() | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.fpsms.modules.stock.web.model | |||
| data class SearchInventoryLotLineInfoRequest( | |||
| val itemId: Long? = null, | |||
| val pageSize: Int?, | |||
| val pageNum: Int? | |||
| ) | |||
| @@ -0,0 +1,9 @@ | |||
| package com.ffii.fpsms.modules.stock.web.model | |||
| data class SearchInventoryRequest( | |||
| val code: String, | |||
| val name: String, | |||
| val type: String, | |||
| val pageNum: Int?, | |||
| val pageSize: Int? | |||
| ) | |||