From 904baa65a9dab3feaac53a26647faae3f4f3e10e Mon Sep 17 00:00:00 2001 From: "PC-20260115JRSN\\Administrator" Date: Sat, 24 Jan 2026 01:41:13 +0800 Subject: [PATCH] added deleted for void DO, calculate the stock Unit uom by m18 uom in do line; there are some duplicated data in item_uom --- .../m18/service/M18DeliveryOrderService.kt | 14 +++++++++----- .../deliveryOrder/entity/DeliveryOrderLine.kt | 7 +++++++ .../service/DeliveryOrderLineService.kt | 4 ++++ .../service/DeliveryOrderService.kt | 1 + .../web/models/SaveDeliveryOrderLineRequest.kt | 2 ++ .../models/SaveDeliveryOrderLineResponse.kt | 2 ++ .../web/models/SaveDeliveryOrderResponse.kt | 2 +- .../master/entity/ItemUomRespository.kt | 2 +- .../modules/master/service/ItemUomService.kt | 18 +++++++++++++++++- .../service/ProductProcessService.kt | 6 +++--- .../changelog/changes/20260123_fai/01_m18.sql | 7 +++++++ 11 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/db/changelog/changes/20260123_fai/01_m18.sql diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt index 74a5518..0ab7a8a 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt @@ -17,10 +17,12 @@ import com.ffii.fpsms.modules.deliveryOrder.web.models.SaveDeliveryOrderRequest import com.ffii.fpsms.modules.master.service.ItemUomService import com.ffii.fpsms.modules.master.service.ItemsService import com.ffii.fpsms.modules.master.service.ShopService +import com.ffii.fpsms.modules.master.web.models.ConvertUomByItemRequest import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderType import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Service +import java.sql.SQLException import java.time.LocalDateTime import java.time.format.DateTimeFormatter import kotlin.reflect.full.memberProperties @@ -232,7 +234,7 @@ open class M18DeliveryOrderService( m18DataLogId = saveM18DeliveryOrderLog.id, handlerId = null, m18BeId = mainpo.beId, - deleted = mainpo.udfIsVoid == "false" + deleted = (mainpo.udfIsVoid == "true") ?: false ) val saveDeliveryOrderResponse = @@ -323,13 +325,15 @@ open class M18DeliveryOrderService( // Save to delivery_order_line table // logger.info("${doLineRefType}: Saving delivery order line...") - val itemUom = itemId?.let { itemUomService.findStockUnitByItemId(it) } + val itemUom = itemUomService.findByM18Id(line.unitId) val saveDeliveryOrderLineRequest = SaveDeliveryOrderLineRequest( id = existingDeliveryOrderLine?.id, itemId = itemId, - uomId = itemUom?.uom?.id, + uomIdM18 = itemUom?.uom?.id, + uomId= itemUomService.findStockUnitByItemId(itemId?: 0)?.uom?.id, deliveryOrderId = deliveryOrderId, - qty = line.qty, + qtyM18 = line.qty, + qty = itemUomService.convertQtyToStockQty(itemId?:0, itemUom?.uom?.id?: 0, line.qty), up = line.up, price = line.amt, // m18CurrencyId = mainpo.curId, @@ -356,7 +360,7 @@ open class M18DeliveryOrderService( successDetailList.add(line.id) // logger.info("${doLineRefType}: Delivery order ID: ${deliveryOrderId} | M18 ID: ${deliveryOrder.id}") logger.info("${doLineRefType}: Saved delivery order line. ID: ${saveDeliveryOrderLineResponse.id} | M18 Line ID: ${line.id} | Delivery order ID: ${deliveryOrderId} | M18 ID: ${deliveryOrder.id}") - } catch (e: Exception) { + } catch (e: SQLException) { failDetailList.add(line.id) failItemDetailList.add(line.proId) // logger.error("${doLineRefType}: Saving Failure!") diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderLine.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderLine.kt index a7ed9b0..8dce42a 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderLine.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderLine.kt @@ -31,6 +31,9 @@ open class DeliveryOrderLine: BaseEntity() { @Column(name = "qty", precision = 14, scale = 2) open var qty: BigDecimal? = null + @Column(name = "qtyM18", precision = 14, scale = 2) + open var qtyM18: BigDecimal? = null + @Column(name = "up", precision = 14, scale = 2) open var up: BigDecimal? = null @@ -38,6 +41,10 @@ open class DeliveryOrderLine: BaseEntity() { @JoinColumn(name = "uomId") open var uom: UomConversion? = null + @ManyToOne + @JoinColumn(name = "uomIdM18") + open var uomM18: UomConversion? = null + @Column(name = "price", precision = 14, scale = 2) open var price: BigDecimal? = null diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderLineService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderLineService.kt index 5490be5..aa6167e 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderLineService.kt @@ -37,15 +37,18 @@ open class DeliveryOrderLineService( val status = request.status?.let { status -> DeliveryOrderLineStatus.entries.find { it.value == status } } val m18DataLog = request.m18DataLogId?.let { m18DataLogRepository.findById(it).getOrNull() } val uom = request.uomId?.let { uomConversionService.find(it).getOrNull() } + val uomM18 = request.uomIdM18?.let { uomConversionService.find(it).getOrNull() } deliveryOrderLine.apply { this.item = item itemNo = item?.code this.deliveryOrder = deliveryOrder qty = request.qty + qtyM18 = request.qtyM18 up = request.up price = request.price this.uom = uom + this.uomM18 = uomM18 this.status = status this.m18DataLog = m18DataLog ?: this.m18DataLog m18Discount = request.m18Discount @@ -57,6 +60,7 @@ open class DeliveryOrderLineService( id = it.id, itemNo = it.itemNo, qty = it.qty, + qtyM18 = it.qtyM18, price = it.price, status = it.status?.value ) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt index f0805b0..70bf171 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt @@ -502,6 +502,7 @@ open class DeliveryOrderService( this.m18DataLog = m18DataLog this.handler = handler m18BeId = request.m18BeId + this.deleted = request.deleted } val savedDeliveryOrder = deliveryOrderRepository.saveAndFlush(deliveryOrder).let { diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineRequest.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineRequest.kt index 6f05c13..caaf896 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineRequest.kt @@ -6,8 +6,10 @@ data class SaveDeliveryOrderLineRequest( val id: Long?, val itemId: Long?, val uomId: Long?, + val uomIdM18: Long?, val deliveryOrderId: Long?, val qty: BigDecimal?, + val qtyM18: BigDecimal?, val up: BigDecimal?, val price: BigDecimal?, val status: String?, diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineResponse.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineResponse.kt index 3008f66..c9daf48 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineResponse.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderLineResponse.kt @@ -1,11 +1,13 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models +import com.ffii.fpsms.modules.master.entity.ItemUom import java.math.BigDecimal data class SaveDeliveryOrderLineResponse( val id: Long?, val itemNo: String?, val qty: BigDecimal?, + val qtyM18: BigDecimal?, val price: BigDecimal?, val status: String?, ) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderResponse.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderResponse.kt index 92581fc..8bf3825 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderResponse.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/SaveDeliveryOrderResponse.kt @@ -4,7 +4,7 @@ import java.time.LocalDateTime data class SaveDeliveryOrderResponse( val id: Long?, - val deleted: Boolean?, + //val deleted: Boolean?=false, val code: String?, val supplierCode: String?, val shopCode: String?, diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt index bbe2126..452c58d 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemUomRespository.kt @@ -25,5 +25,5 @@ interface ItemUomRespository : AbstractRepository { fun findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemM18Id: Long): ItemUom? fun findBaseUnitByItemIdAndStockUnitIsTrueAndDeletedIsFalse(itemId: Long): ItemUom? - fun findByItemIdAndUomIdAndDeletedIsFalse(itemId: Long, uomId: Long): ItemUom? + fun findFirstByItemIdAndUomIdAndDeletedIsFalse(itemId: Long, uomId: Long): ItemUom? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt index 7ef120b..77b5a00 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt @@ -40,6 +40,10 @@ open class ItemUomService( return itemUomRespository.findByItemIdAndStockUnitIsTrueAndDeletedIsFalse(itemId) } + open fun findFirstByItemIdAndUomId(itemId: Long, uomId: Long): ItemUom? { + return itemUomRespository.findFirstByItemIdAndUomIdAndDeletedIsFalse(itemId, uomId) + } + open fun findPurchaseUnitByM18ItemId(m18ItemId: Long): ItemUom? { return itemUomRespository.findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(m18ItemId) } @@ -74,6 +78,18 @@ open class ItemUomService( return stockQty; } + open fun convertQtyToStockQty(itemId: Long, uomId: Long, sourceQty: BigDecimal): BigDecimal { + val itemUom = findFirstByItemIdAndUomId(itemId, uomId) + + val stockUnit = findStockUnitByItemId(itemId) ?: return BigDecimal.ZERO; + val one = BigDecimal.ONE; + + val baseQty = sourceQty.multiply(itemUom?.ratioN ?: one).divide(itemUom?.ratioD ?: one, 2, RoundingMode.UP) + val stockQty = baseQty.multiply(stockUnit.ratioD ?: one).divide(stockUnit.ratioN ?: one, 2, RoundingMode.UP) + + return stockQty; + } + // See if need to update the response open fun saveItemUom(request: ItemUomRequest): ItemUom { val itemUom = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: ItemUom() @@ -157,7 +173,7 @@ open class ItemUomService( } } // Find source ItemUom by itemId and uomId - val sourceItemUom = itemUomRespository.findByItemIdAndUomIdAndDeletedIsFalse(request.itemId, request.uomId) + val sourceItemUom = itemUomRespository.findFirstByItemIdAndUomIdAndDeletedIsFalse(request.itemId, request.uomId) ?: throw IllegalArgumentException("Source ItemUom not found for itemId=${request.itemId}, uomId=${request.uomId}") // Find target ItemUom by itemId and targetUnit diff --git a/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt b/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt index 19eb134..52824e7 100644 --- a/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt +++ b/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt @@ -700,7 +700,7 @@ val sufficientStockQty = bomMaterials val baseReqQtyResult = if (reqUomId > 0) { try { // First check if ItemUom exists for this item and UomConversion - val sourceItemUom = itemUomRepository.findByItemIdAndUomIdAndDeletedIsFalse(itemId, reqUomId) + val sourceItemUom = itemUomRepository.findFirstByItemIdAndUomIdAndDeletedIsFalse(itemId, reqUomId) val targetItemUom = itemUomService.findBaseUnitByItemId(itemId) println("Converting reqQty: ${line.reqQty} from UOM id=$reqUomId to baseUnit") @@ -752,7 +752,7 @@ val sufficientStockQty = bomMaterials val baseStockQtyResult = if (stockUomId != null && stockUomId > 0) { try { // Get source and target ItemUom to show ratioN/ratioD - val sourceItemUom = itemUomRepository.findByItemIdAndUomIdAndDeletedIsFalse(itemId, stockUomId) + val sourceItemUom = itemUomRepository.findFirstByItemIdAndUomIdAndDeletedIsFalse(itemId, stockUomId) val targetItemUom = itemUomService.findBaseUnitByItemId(itemId) println("Converting stockQty: $stockQtyValue from UOM id=$stockUomId to baseUnit") @@ -825,7 +825,7 @@ val sufficientStockQty = bomMaterials if (baseReqQtyForStock != null) { // Now convert from baseUnit to stockUomId val sourceItemUom = itemUomService.findBaseUnitByItemId(itemId) - val targetItemUom = itemUomRepository.findByItemIdAndUomIdAndDeletedIsFalse(itemId, stockUomId) + val targetItemUom = itemUomRepository.findFirstByItemIdAndUomIdAndDeletedIsFalse(itemId, stockUomId) if (sourceItemUom != null && targetItemUom != null) { val sourceRatioN = sourceItemUom.ratioN ?: BigDecimal.ONE diff --git a/src/main/resources/db/changelog/changes/20260123_fai/01_m18.sql b/src/main/resources/db/changelog/changes/20260123_fai/01_m18.sql new file mode 100644 index 0000000..40e27fc --- /dev/null +++ b/src/main/resources/db/changelog/changes/20260123_fai/01_m18.sql @@ -0,0 +1,7 @@ +--liquibase formatted sql +--changeset author:vin m18 + +ALTER TABLE `fpsmsdb`.`delivery_order_line` + ADD COLUMN `qtyM18` DECIMAL(14,2) NULL AFTER `qty`, +ADD COLUMN `delivery_order_linecol` VARCHAR(45) NULL AFTER `qtyM18`, +ADD COLUMN `uomIdM18` INT NULL AFTER `uomId`; \ No newline at end of file