瀏覽代碼

update

master
CANCERYS\kw093 3 月之前
父節點
當前提交
6c63f3ac5b
共有 7 個檔案被更改,包括 411 行新增4 行删除
  1. +39
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Router.kt
  2. +25
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt
  3. +37
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/Truck.kt
  4. +22
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/TruckRepository.kt
  5. +235
    -3
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt
  6. +8
    -1
      src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt
  7. +45
    -0
      src/main/resources/db/changelog/changes/20250902_02_enson/05_create_group_enson.sql

+ 39
- 0
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<Long>() {
@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
}

+ 25
- 0
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<Router, Long> {
@Query("SELECT r FROM Router r WHERE r.inventoryLotId = :inventoryLotId AND r.deleted = false")
fun findByInventoryLotIdAndDeletedFalse(@Param("inventoryLotId") inventoryLotId: Int): List<Router>
@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<Router>
@Query("SELECT r FROM Router r WHERE r.`index` = :index AND r.deleted = false")
fun findByIndexAndDeletedFalse(@Param("index") index: Int): List<Router>
@Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false")
fun findByRouteAndDeletedFalse(@Param("route") route: String): List<Router>
}

+ 37
- 0
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<Long>() {
@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
}

+ 22
- 0
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<Truck, Long> {
@Query("SELECT t FROM Truck t WHERE t.shop.id = :shopId AND t.deleted = false")
fun findByShopIdAndDeletedFalse(@Param("shopId") shopId: Long): List<Truck>
@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<Truck> // ✅ Change to List<Truck>
@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<Truck>
}

+ 235
- 3
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<PickOrder, Long, PickOrderRepository>(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<Map<String, Any?>> {
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<Map<String, Any?>> {
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<String>()
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(", ")
}
}
}

+ 8
- 1
src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt 查看文件

@@ -239,5 +239,12 @@ class PickOrderController(
fun getAllPickOrderLotsWithDetails(@PathVariable userId: Long): List<Map<String, Any?>> {
return pickOrderService.getAllPickOrderLotsWithDetailsWithAutoAssign(userId)
}

@GetMapping("/fg-pick-orders")
fun getFgPickOrders(): List<Map<String, Any?>> {
return pickOrderService.getFgPickOrders()
}
@GetMapping("/fg-pick-orders/{pickOrderId}")
fun getFgPickOrdersByPickOrderId(@PathVariable pickOrderId: Long): List<Map<String, Any?>> {
return pickOrderService.getFgPickOrdersByPickOrderId(pickOrderId)
}
}

+ 45
- 0
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;

Loading…
取消
儲存