From 6c63f3ac5bad3b4c6d90f5d69e5f42e8bb72786a Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Tue, 16 Sep 2025 10:31:06 +0800 Subject: [PATCH] update --- .../fpsms/modules/pickOrder/entity/Router.kt | 39 +++ .../pickOrder/entity/RouterRepository.kt | 25 ++ .../fpsms/modules/pickOrder/entity/Truck.kt | 37 +++ .../pickOrder/entity/TruckRepository.kt | 22 ++ .../pickOrder/service/PickOrderService.kt | 238 +++++++++++++++++- .../pickOrder/web/PickOrderController.kt | 9 +- .../05_create_group_enson.sql | 45 ++++ 7 files changed, 411 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Router.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Truck.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/pickOrder/entity/TruckRepository.kt create mode 100644 src/main/resources/db/changelog/changes/20250902_02_enson/05_create_group_enson.sql diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Router.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Router.kt new file mode 100644 index 0000000..fa6fb36 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Router.kt @@ -0,0 +1,39 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.math.BigDecimal + +@Entity +@Table(name = "router") +open class Router : BaseEntity() { + + @Column(name = "`index`", nullable = false) + open var index: Int? = null + + @Size(max = 50) + @Column(name = "route") + open var route: String? = null + + @Size(max = 50) + @Column(name = "area") + open var area: String? = null + + @Column(name = "item_code") + open var itemCode: Int? = null + + @Size(max = 255) + @Column(name = "item_name") + open var itemName: String? = null + + @Column(name = "uomId") + open var uomId: Int? = null + + @Column(name = "NoofCarton") + open var noofCarton: Int? = null + + @Column(name = "inventoryLotId") + open var inventoryLotId: Int? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt new file mode 100644 index 0000000..ada52ba --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt @@ -0,0 +1,25 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param +import org.springframework.stereotype.Repository + +@Repository +interface RouterRepository : AbstractRepository { + + @Query("SELECT r FROM Router r WHERE r.inventoryLotId = :inventoryLotId AND r.deleted = false") + fun findByInventoryLotIdAndDeletedFalse(@Param("inventoryLotId") inventoryLotId: Int): List + + @Query("SELECT r FROM Router r WHERE r.inventoryLotId = :inventoryLotId AND r.deleted = false ORDER BY r.id ASC") + fun findFirstByInventoryLotIdAndDeletedFalse(@Param("inventoryLotId") inventoryLotId: Int): Router? + + @Query("SELECT r FROM Router r WHERE r.itemCode = :itemCode AND r.deleted = false") + fun findByItemCodeAndDeletedFalse(@Param("itemCode") itemCode: Int): List + + @Query("SELECT r FROM Router r WHERE r.`index` = :index AND r.deleted = false") + fun findByIndexAndDeletedFalse(@Param("index") index: Int): List + + @Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false") + fun findByRouteAndDeletedFalse(@Param("route") route: String): List +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Truck.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Truck.kt new file mode 100644 index 0000000..58a48a5 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Truck.kt @@ -0,0 +1,37 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.master.entity.Shop +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.math.BigDecimal +import java.time.LocalTime + +@Entity +@Table(name = "truck") +open class Truck : BaseEntity() { + + @Size(max = 50) + @NotNull + @Column(name = "truckNo", nullable = false, unique = true) + open var truckNo: String? = null + + @Size(max = 100) + @Column(name = "truckName") + open var truckName: String? = null + + @Column(name = "DepartureTime") + open var departureTime: LocalTime? = null + + @ManyToOne + @JoinColumn(name = "shopId") + open var shop: Shop? = null + + @Column(name = "capacity", precision = 10, scale = 2) + open var capacity: BigDecimal? = null + + @Size(max = 20) + @Column(name = "status") + open var status: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/TruckRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/TruckRepository.kt new file mode 100644 index 0000000..92aaa4e --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/TruckRepository.kt @@ -0,0 +1,22 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param +import org.springframework.stereotype.Repository + +@Repository +interface TruckRepository : AbstractRepository { + + @Query("SELECT t FROM Truck t WHERE t.shop.id = :shopId AND t.deleted = false") + fun findByShopIdAndDeletedFalse(@Param("shopId") shopId: Long): List + + @Query("SELECT t FROM Truck t WHERE t.shop.id = :shopId AND t.deleted = false ORDER BY t.id ASC") + fun findFirstByShopIdAndDeletedFalse(@Param("shopId") shopId: Long): List // ✅ Change to List + + @Query("SELECT t FROM Truck t WHERE t.truckNo = :truckNo AND t.deleted = false") + fun findByTruckNoAndDeletedFalse(@Param("truckNo") truckNo: String): Truck? + + @Query("SELECT t FROM Truck t WHERE t.status = :status AND t.deleted = false") + fun findByStatusAndDeletedFalse(@Param("status") status: String): List +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt index d3d5555..0d1562f 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt @@ -48,7 +48,9 @@ import java.time.format.DateTimeFormatter import kotlin.jvm.optionals.getOrNull import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderGroupInfo import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository -@Service +import com.ffii.fpsms.modules.pickOrder.entity.TruckRepository +import com.ffii.fpsms.modules.pickOrder.entity.RouterRepository +@Service open class PickOrderService( private val jdbcDao: JdbcDao, private val pickOrderRepository: PickOrderRepository, @@ -66,6 +68,8 @@ open class PickOrderService( private val jobOrderRepository: JobOrderRepository, private val itemUomService: ItemUomService, private val deliveryOrderRepository: DeliveryOrderRepository, + private val truckRepository: TruckRepository, + private val routerRepository: RouterRepository, ) : AbstractBaseEntityService(jdbcDao, pickOrderRepository) { open fun create(request: SavePickOrderRequest): MessageResponse { val code = assignPickCode() @@ -2220,6 +2224,234 @@ open class PickOrderService( println("✅ Filtered result count: ${filteredResults.size}") - return filteredResults + // ✅ Add router information for each lot + val enrichedResults = filteredResults.map { row -> + val inventoryLotId = row["debugInventoryLotId"] as? Number + + // Get router information for this inventory lot + val routerInfo = if (inventoryLotId != null) { + try { + val router = routerRepository.findFirstByInventoryLotIdAndDeletedFalse(inventoryLotId.toInt()) + if (router != null) { + mapOf( + "routerIndex" to (router.index ?: 0), + "routerRoute" to (router.route ?: ""), + "routerArea" to (router.area ?: ""), + "routerItemCode" to (router.itemCode ?: 0), + "routerItemName" to (router.itemName ?: ""), + "routerUomId" to (router.uomId ?: 0), + "routerNoofCarton" to (router.noofCarton ?: 0) + ) + } else { + mapOf( + "routerIndex" to 0, + "routerRoute" to "", + "routerArea" to "", + "routerItemCode" to 0, + "routerItemName" to "", + "routerUomId" to 0, + "routerNoofCarton" to 0 + ) + } + } catch (e: Exception) { + println("⚠️ Error getting router info for inventoryLotId $inventoryLotId: ${e.message}") + mapOf( + "routerIndex" to 0, + "routerRoute" to "", + "routerArea" to "", + "routerItemCode" to 0, + "routerItemName" to "", + "routerUomId" to 0, + "routerNoofCarton" to 0 + ) + } + } else { + mapOf( + "routerIndex" to 0, + "routerRoute" to "", + "routerArea" to "", + "routerItemCode" to 0, + "routerItemName" to "", + "routerUomId" to 0, + "routerNoofCarton" to 0 + ) + } + + // Combine original row with router information + row.toMutableMap().apply { + putAll(routerInfo) + } + } + + return enrichedResults + } + + open fun getFgPickOrders(): List> { + try { + println("🔍 Starting getFgPickOrders method - using repository") + + // Use repository to find pick orders with type 'do' + val pickOrders = pickOrderRepository.findAll().filter { + it.type?.value == "do" && + it.status?.value in listOf("assigned", "released", "picking") + } + + println("🔍 Found ${pickOrders.size} FG pick orders using repository") + + val results = pickOrders.map { po -> + val deliveryOrder = po.deliveryOrder + val shop = deliveryOrder?.shop + val supplier = deliveryOrder?.supplier + + // ✅ Get truck information for this shop - handle Optional properly + val truckInfo = if (shop?.id != null) { + try { + jdbcDao.queryForMap(""" + SELECT truckNo, DepartureTime + FROM truck + WHERE shopId = :shopId AND deleted = false + LIMIT 1 + """, mapOf("shopId" to shop.id)).orElse(null) + } catch (e: Exception) { + println("⚠️ No truck found for shop ${shop.id}: ${e.message}") + null + } + } else null + + mapOf( + "pickOrderId" to (po.id ?: 0L), + "pickOrderCode" to (po.code ?: ""), + "pickOrderConsoCode" to (po.consoCode ?: ""), + "pickOrderTargetDate" to (po.targetDate?.toString() ?: ""), + "pickOrderStatus" to (po.status?.value ?: ""), + "deliveryOrderId" to (deliveryOrder?.id ?: 0L), + "deliveryNo" to (deliveryOrder?.code ?: ""), + "deliveryDate" to (deliveryOrder?.orderDate?.toString() ?: ""), + "shopId" to (shop?.id ?: 0L), + "shopCode" to (shop?.code ?: ""), + "shopName" to (shop?.name ?: ""), + "shopAddress" to buildShopAddress(shop), + "shopPoNo" to (supplier?.code ?: ""), + "numberOfCartons" to (po.pickOrderLines.size), + "truckNo" to (truckInfo?.get("truckNo") ?: ""), // ✅ Add truck number + "DepartureTime" to (truckInfo?.get("DepartureTime") ?: ""), // ✅ Add departure time + "qrCodeData" to (po.id ?: 0L) + ) + } + + println("✅ FG Pick Orders result count: ${results.size}") + return results + + } catch (e: Exception) { + println("❌ Error in getFgPickOrders: ${e.message}") + e.printStackTrace() + return emptyList() + } + } + + open fun getFgPickOrdersByPickOrderId(pickOrderId: Long): List> { + try { + println("🔍 Starting getFgPickOrdersByPickOrderId method with pickOrderId: $pickOrderId") + + val pickOrder = pickOrderRepository.findById(pickOrderId).orElse(null) + + if (pickOrder == null) { + println("❌ Pick order not found with ID: $pickOrderId") + return emptyList() + } + + println("🔍 Found pick order: ${pickOrder.code}, type: ${pickOrder.type?.value}, status: ${pickOrder.status?.value}") + + if (pickOrder.type?.value != "do") { + println("❌ Pick order is not of type 'do': ${pickOrder.type?.value}") + return emptyList() + } + + if (pickOrder.status?.value !in listOf("assigned", "released", "picking")) { + println("❌ Pick order status is not in allowed states: ${pickOrder.status?.value}") + return emptyList() + } + + val deliveryOrder = pickOrder.deliveryOrder + val shop = deliveryOrder?.shop + val supplier = deliveryOrder?.supplier + + println(" Delivery order: ${deliveryOrder?.code}, Shop: ${shop?.name}, Supplier: ${supplier?.code}") + println("🔍 Shop ID: ${shop?.id}") + + // ✅ Get truck information using repository with detailed debugging + val truck = if (shop?.id != null) { + try { + println("🔍 Querying truck repository for shopId: ${shop.id}") + + // Get all trucks for this shop + val trucksForShop = truckRepository.findByShopIdAndDeletedFalse(shop.id) + println("🔍 Trucks for shop ${shop.id}: ${trucksForShop.size}") + trucksForShop.forEach { t -> + println(" - Truck ID: ${t.id}, TruckNo: ${t.truckNo}, ShopId: ${t.shop?.id}, Deleted: ${t.deleted}") + } + + // Take the first truck (or null if none found) + val selectedTruck = trucksForShop.firstOrNull() + + if (selectedTruck != null) { + println("✅ Selected truck: ID=${selectedTruck.id}, TruckNo=${selectedTruck.truckNo}, DepartureTime=${selectedTruck.departureTime}") + } else { + println("❌ No truck found for shopId ${shop.id}") + } + + selectedTruck + } catch (e: Exception) { + println("⚠️ Error querying truck repository for shop ${shop.id}: ${e.message}") + e.printStackTrace() + null + } + } else { + println("⚠️ Shop ID is null") + null + } + + val result = mapOf( + "pickOrderId" to (pickOrder.id ?: 0L), + "pickOrderCode" to (pickOrder.code ?: ""), + "pickOrderConsoCode" to (pickOrder.consoCode ?: ""), + "pickOrderTargetDate" to (pickOrder.targetDate?.toString() ?: ""), + "pickOrderStatus" to (pickOrder.status?.value ?: ""), + "deliveryOrderId" to (deliveryOrder?.id ?: 0L), + "deliveryNo" to (deliveryOrder?.code ?: ""), + "deliveryDate" to (deliveryOrder?.orderDate?.toString() ?: ""), + "shopId" to (shop?.id ?: 0L), + "shopCode" to (shop?.code ?: ""), + "shopName" to (shop?.name ?: ""), + "shopAddress" to buildShopAddress(shop), + "shopPoNo" to (supplier?.code ?: ""), + "numberOfCartons" to (pickOrder.pickOrderLines.size), + "truckNo" to (truck?.truckNo ?: ""), // ✅ Use entity property + "DepartureTime" to (truck?.departureTime?.toString() ?: ""), + "qrCodeData" to (pickOrder.id ?: 0L) + ) + + println("✅ FG Pick Orders by ID result count: 1") + return listOf(result) + + } catch (e: Exception) { + println("❌ Error in getFgPickOrdersByPickOrderId: ${e.message}") + e.printStackTrace() + return emptyList() + } + } + + private fun buildShopAddress(shop: com.ffii.fpsms.modules.master.entity.Shop?): String { + if (shop == null) return "" + + val addressParts = mutableListOf() + + shop.addr1?.let { if (it.isNotBlank()) addressParts.add(it) } + shop.addr2?.let { if (it.isNotBlank()) addressParts.add(it) } + shop.addr3?.let { if (it.isNotBlank()) addressParts.add(it) } + shop.addr4?.let { if (it.isNotBlank()) addressParts.add(it) } + shop.district?.let { if (it.isNotBlank()) addressParts.add(it) } + + return addressParts.joinToString(", ") } -} +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt index c81a3e4..18494e6 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt @@ -239,5 +239,12 @@ class PickOrderController( fun getAllPickOrderLotsWithDetails(@PathVariable userId: Long): List> { return pickOrderService.getAllPickOrderLotsWithDetailsWithAutoAssign(userId) } - + @GetMapping("/fg-pick-orders") + fun getFgPickOrders(): List> { + return pickOrderService.getFgPickOrders() + } + @GetMapping("/fg-pick-orders/{pickOrderId}") + fun getFgPickOrdersByPickOrderId(@PathVariable pickOrderId: Long): List> { + return pickOrderService.getFgPickOrdersByPickOrderId(pickOrderId) + } } \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250902_02_enson/05_create_group_enson.sql b/src/main/resources/db/changelog/changes/20250902_02_enson/05_create_group_enson.sql new file mode 100644 index 0000000..fda2fad --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250902_02_enson/05_create_group_enson.sql @@ -0,0 +1,45 @@ +--liquibase formatted sql + +--changeset enson:update pick_order_group + +CREATE TABLE `Router` ( + `id` int NOT NULL AUTO_INCREMENT, + `index` int NOT NULL, + `route` varchar(50) NOT NULL, + `area` varchar(50) NOT NULL, + `item_code` int NOT NULL, + `item_name` varchar(255) DEFAULT NULL, + `uomId` int NOT NULL, + `NoofCarton` int NOT NULL, + `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(30) DEFAULT NULL, + `version` int NOT NULL DEFAULT '0', + `modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modifiedBy` varchar(30) DEFAULT NULL, + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `FK_Router_ON_ITEM` (`item_code`), + KEY `FK_Router_ON_UOM` (`uomId`), + CONSTRAINT `FK_Router_ON_ITEM` FOREIGN KEY (`item_code`) REFERENCES `items` (`id`), + CONSTRAINT `FK_Router_ON_UOM` FOREIGN KEY (`uomId`) REFERENCES `uom_conversion` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +CREATE TABLE `Truck` ( + `id` int NOT NULL AUTO_INCREMENT, + `truckNo` varchar(50) NOT NULL, + `truckName` varchar(100) DEFAULT NULL, + `DepartureTime` TIME NULL DEFAULT NULL, + `shopId` INT NULL DEFAULT NULL, + `capacity` decimal(10,2) DEFAULT NULL, + `status` varchar(20) DEFAULT NULL, + `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(30) DEFAULT NULL, + `version` int NOT NULL DEFAULT '0', + `modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modifiedBy` varchar(30) DEFAULT NULL, + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `UK_Truck_truckNo` (`truckNo`), + KEY `FK_Truck_ON_SHOP` (`shopId`), + CONSTRAINT `FK_Truck_ON_SHOP` FOREIGN KEY (`shopId`) REFERENCES `shop` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; \ No newline at end of file