瀏覽代碼

update

master
CANCERYS\kw093 1 月之前
父節點
當前提交
0cc69229ea
共有 5 個檔案被更改,包括 207 行新增61 行删除
  1. +1
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt
  2. +6
    -6
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickExecutionIssue.kt
  3. +4
    -4
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt
  4. +7
    -5
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt
  5. +189
    -45
      src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt

+ 1
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt 查看文件

@@ -58,7 +58,7 @@ open class DoPickOrderService(
@Lazy private val deliveryOrderRepository: DeliveryOrderRepository,
private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository
) {
fun findReleasedDoPickOrders(): List<DoPickOrder> {
open fun findReleasedDoPickOrders(): List<DoPickOrder> {
return doPickOrderRepository.findByTicketStatusIn(
listOf(DoPickOrderStatus.released, DoPickOrderStatus.pending)
)


+ 6
- 6
src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickExecutionIssue.kt 查看文件

@@ -13,8 +13,8 @@ class PickExecutionIssue(
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,

@Column(name = "pick_order_id", nullable = false)
val pickOrderId: Long,
@Column(name = "pick_order_id", nullable = true)
val pickOrderId: Long? = null,

@Column(name = "pick_order_code", length = 50, nullable = false)
val pickOrderCode: String,
@@ -30,8 +30,8 @@ val joPickOrderId: Long? = null,

@Column(name = "Do_pick_order_id")
val doPickOrderId: Long? = null,
@Column(name = "pick_order_line_id", nullable = false)
val pickOrderLineId: Long,
@Column(name = "pick_order_line_id", nullable = true)
val pickOrderLineId: Long? = null,
@Column(name = "issue_no", length = 50)
val issueNo: String? = null,

@@ -105,11 +105,11 @@ val doPickOrderId: Long? = null,
) {
// ✅ 添加默认构造函数
constructor() : this(
pickOrderId = 0L,
pickOrderId = null,
pickOrderCode = "",
pickOrderCreateDate = null,
pickExecutionDate = null,
pickOrderLineId = 0L,
pickOrderLineId = null,
itemId = 0L,
itemCode = null,
itemDescription = null,


+ 4
- 4
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt 查看文件

@@ -711,8 +711,8 @@ open fun createBatchReleaseIssue(
val linesSql = """
SELECT dol.id, dol.itemId, i.code as itemCode, i.name as itemName, dol.qty
FROM fpsmsdb.delivery_order_line dol
INNER JOIN fpsmsdb.item i ON i.id = dol.itemId
WHERE dol.doId = :deliveryOrderId
INNER JOIN fpsmsdb.items i ON i.id = dol.itemId
WHERE dol.deliveryOrderId = :deliveryOrderId
AND dol.deleted = 0
""".trimIndent()
@@ -736,11 +736,11 @@ open fun createBatchReleaseIssue(
val issue = PickExecutionIssue(
id = null,
pickOrderId = 0L, // batch release 失败时可能还没有 pick order
pickOrderId = null, // batch release 失败时可能还没有 pick order
pickOrderCode = deliveryOrder["code"] as? String ?: "",
pickOrderCreateDate = LocalDate.now(),
pickExecutionDate = LocalDate.now(),
pickOrderLineId = 0L, // batch release 失败时可能还没有 pick order line
pickOrderLineId = null, // batch release 失败时可能还没有 pick order line
issueNo = issueNo,
joPickOrderId = null,
doPickOrderId = null,


+ 7
- 5
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt 查看文件

@@ -3566,7 +3566,8 @@ open fun getAllPickOrderLotsWithDetailsHierarchical(userId: Long): Map<String, A
dpo.TruckLanceCode,
dpo.truck_departure_time,
dpo.ShopCode,
dpo.ShopName
dpo.ShopName,
dpo.ticket_status as doTicketStatus
FROM fpsmsdb.do_pick_order dpo
INNER JOIN fpsmsdb.do_pick_order_line dpol ON dpol.do_pick_order_id = dpo.id AND dpol.deleted = 0
INNER JOIN fpsmsdb.pick_order po ON po.id = dpol.pick_order_id
@@ -3597,7 +3598,7 @@ open fun getAllPickOrderLotsWithDetailsHierarchical(userId: Long): Map<String, A
val doPickOrderId = (doPickOrderInfo["do_pick_order_id"] as? Number)?.toLong()
println("🔍 Found do_pick_order ID: $doPickOrderId")
val doTicketStatus = doPickOrderInfo["ticket_status"]
// ✅ Step 2: 获取该 do_pick_order 下的所有 pick orders
val pickOrdersSql = """
SELECT DISTINCT
@@ -3822,7 +3823,8 @@ open fun getAllPickOrderLotsWithDetailsHierarchical(userId: Long): Map<String, A
"truckLanceCode" to doPickOrderInfo["TruckLanceCode"],
"departureTime" to doPickOrderInfo["truck_departure_time"]
)
val allConsoCodes = pickOrdersInfo.mapNotNull { it["consoCode"] as? String }.distinct()

// ✅ 构建合并后的 pick order 对象
val mergedPickOrder = if (pickOrdersInfo.isNotEmpty()) {
val firstPickOrderInfo = pickOrdersInfo.first()
@@ -3832,8 +3834,8 @@ open fun getAllPickOrderLotsWithDetailsHierarchical(userId: Long): Map<String, A
"doOrderIds" to doOrderIds,
"deliveryOrderCodes" to deliveryOrderCodes,
"lineCountsPerPickOrder" to lineCountsPerPickOrder,
"consoCode" to firstPickOrderInfo["consoCode"],
"status" to firstPickOrderInfo["status"],
"consoCodes" to allConsoCodes,
"status" to doTicketStatus,
"targetDate" to firstPickOrderInfo["targetDate"],
"pickOrderLines" to allPickOrderLines
)


+ 189
- 45
src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt 查看文件

@@ -19,7 +19,18 @@ import java.time.LocalDate
import java.time.LocalDateTime
import com.ffii.fpsms.modules.stock.service.SuggestedPickLotService
import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus

import com.ffii.fpsms.modules.pickOrder.enums.PickOrderStatus
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository
import com.ffii.fpsms.modules.deliveryOrder.service.DoPickOrderService
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository
import com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord
import com.ffii.fpsms.modules.deliveryOrder.enums.DeliveryOrderStatus
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository
@Service
open class StockOutLineService(
private val jdbcDao: JdbcDao,
@@ -29,8 +40,14 @@ open class StockOutLineService(
private val itemRepository: ItemsRepository,
private val inventoryRepository: InventoryRepository,
private val itemUomRespository: ItemUomRespository,
private val pickOrderRepository: PickOrderRepository,
private val inventoryLotLineRepository: InventoryLotLineRepository,
private val suggestedPickLotService: SuggestedPickLotService
private val suggestedPickLotService: SuggestedPickLotService,
private val doPickOrderRepository: DoPickOrderRepository,
private val doPickOrderRecordRepository: DoPickOrderRecordRepository,
private val deliveryOrderRepository: DeliveryOrderRepository,
private val doPickOrderLineRepository: DoPickOrderLineRepository,
private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository,
): AbstractBaseEntityService<StockOutLine, Long, StockOutLIneRepository>(jdbcDao, stockOutLineRepository) {
@Throws(IOException::class)
@Transactional
@@ -325,6 +342,86 @@ private fun getStockOutIdFromPickOrderLine(pickOrderLineId: Long): Long {
})
}
}
private fun completeDoIfAllPickOrdersCompleted(pickOrderId: Long) {
// 1) 先用 line 关联找 do_pick_order_id
val lines = doPickOrderLineRepository.findByPickOrderIdAndDeletedFalse(pickOrderId)
val doPickOrderIds =
if (lines.isNotEmpty()) lines.mapNotNull { it.doPickOrderId }.distinct()
else doPickOrderRepository.findByPickOrderId(pickOrderId).mapNotNull { it.id } // 兼容旧设计
doPickOrderIds.forEach { dpoId ->
val allLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(dpoId)
val allPickOrderIdsInDpo = if (allLines.isNotEmpty())
allLines.mapNotNull { it.pickOrderId }.distinct()
else
doPickOrderRepository.findById(dpoId).orElse(null)?.pickOrderId?.let { listOf(it) } ?: emptyList()
if (allPickOrderIdsInDpo.isEmpty()) return@forEach
// 2) 检查这个 do_pick_order 下所有 pick orders 是否都 COMPLETED
val statuses = allPickOrderIdsInDpo.map { id ->
pickOrderRepository.findById(id).orElse(null)?.status
}
val allCompleted = statuses.all { it == PickOrderStatus.COMPLETED }
if (!allCompleted) return@forEach
// 3) 全部完成 → 更新 do_pick_order 为 completed,并可复制到 record 表(可选)
val dpo = doPickOrderRepository.findById(dpoId).orElse(null) ?: return@forEach
dpo.ticketStatus = DoPickOrderStatus.completed
dpo.ticketCompleteDateTime = LocalDateTime.now()
doPickOrderRepository.save(dpo)
// 4) 可选:复制 header 到 record 表,复制 lines 到 line_record,再删除原有行/头(与你在 PickOrderService.completeStockOut 的做法保持一致)
val dpoRecord = DoPickOrderRecord(
storeId = dpo.storeId ?: "",
ticketNo = dpo.ticketNo ?: "",
ticketStatus = DoPickOrderStatus.completed,
truckId = dpo.truckId,
pickOrderId = dpo.pickOrderId,
truckDepartureTime = dpo.truckDepartureTime,
shopId = dpo.shopId,
handledBy = dpo.handledBy,
handlerName = dpo.handlerName,
doOrderId = dpo.doOrderId,
pickOrderCode = dpo.pickOrderCode,
deliveryOrderCode = dpo.deliveryOrderCode,
loadingSequence = dpo.loadingSequence,
ticketReleaseTime = dpo.ticketReleaseTime,
ticketCompleteDateTime = LocalDateTime.now(),
truckLanceCode = dpo.truckLanceCode,
shopCode = dpo.shopCode,
shopName = dpo.shopName,
requiredDeliveryDate = dpo.requiredDeliveryDate
)
val savedHeader = doPickOrderRecordRepository.save(dpoRecord)
val lineRecords = allLines.map { l ->
DoPickOrderLineRecord().apply {
this.doPickOrderId = savedHeader.id
this.pickOrderId = l.pickOrderId
this.doOrderId = l.doOrderId
this.pickOrderCode = l.pickOrderCode
this.deliveryOrderCode = l.deliveryOrderCode
this.status = l.status
}
}
if (lineRecords.isNotEmpty()) doPickOrderLineRecordRepository.saveAll(lineRecords)
// 若你流程要求,把原行/头删掉(或保留 completed 状态)
if (allLines.isNotEmpty()) doPickOrderLineRepository.deleteAll(allLines)
doPickOrderRepository.delete(dpo)
// 5) 可选:同步 delivery_order → COMPLETED
dpo.doOrderId?.let { doId ->
val deliveryOrder = deliveryOrderRepository.findByIdAndDeletedIsFalse(doId)
if (deliveryOrder != null && deliveryOrder.status != DeliveryOrderStatus.COMPLETED) {
deliveryOrder.status = DeliveryOrderStatus.COMPLETED
deliveryOrderRepository.save(deliveryOrder)
}
}
}
}
@Transactional
open fun update(request: UpdateStockOutLineRequest): MessageResponse {
val stockOutLine = stockOutLineRepository.findById(request.id).orElseThrow()
@@ -373,54 +470,101 @@ private fun getStockOutIdFromPickOrderLine(pickOrderLineId: Long): Long {
entity = lineInfoList,
)
}
private fun completeDoForPickOrder(pickOrderId: Long) {
// 1) 原表 do_pick_order → completed
val dpos = doPickOrderRepository.findByPickOrderId(pickOrderId)
if (dpos.isNotEmpty()) {
dpos.forEach {
it.ticketStatus = com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus.completed
it.ticketCompleteDateTime = java.time.LocalDateTime.now()
}
doPickOrderRepository.saveAll(dpos)

@Transactional
open fun updateStatus(request: UpdateStockOutLineStatusRequest): MessageResponse {
try {
val stockOutLine = stockOutLineRepository.findById(request.id).orElseThrow {
IllegalArgumentException("StockOutLine not found with ID: ${request.id}")
}
println("Updating StockOutLine ID: ${request.id}")
println("Current status: ${stockOutLine.status}")
println("New status: ${request.status}")
// Update status
stockOutLine.status = request.status
// Update quantity if provided
if (request.qty != null) {
val currentQty = stockOutLine.qty?.toDouble() ?: 0.0
val newQty = currentQty + request.qty
stockOutLine.qty = (newQty)
// 2) 同步相关 delivery_order 状态
dpos.forEach { dpo ->
dpo.doOrderId?.let { doId ->
val deliveryOrder = deliveryOrderRepository.findByIdAndDeletedIsFalse(doId)
if (deliveryOrder != null &&
deliveryOrder.status != com.ffii.fpsms.modules.deliveryOrder.enums.DeliveryOrderStatus.COMPLETED
) {
deliveryOrder.status = com.ffii.fpsms.modules.deliveryOrder.enums.DeliveryOrderStatus.COMPLETED
deliveryOrderRepository.save(deliveryOrder)
}
}
}
}

val savedStockOutLine = stockOutLineRepository.saveAndFlush(stockOutLine)
println("Updated StockOutLine: ${savedStockOutLine.id} with status: ${savedStockOutLine.status}")
// ✅ FIX: Only call once and add debugging
if (request.status == "rejected" || request.status == "REJECTED") {
println("=== TRIGGERING LOT REJECTION LOGIC ===")
handleLotRejectionFromStockOutLine(savedStockOutLine)
// 3) 记录表 do_pick_order_record → completed(可选)
val dporList = doPickOrderRecordRepository.findByPickOrderId(pickOrderId)
if (dporList.isNotEmpty()) {
dporList.forEach {
it.ticketStatus = com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus.completed
it.ticketCompleteDateTime = java.time.LocalDateTime.now()
}
doPickOrderRecordRepository.saveAll(dporList)
}
}
open fun updateStatus(request: UpdateStockOutLineStatusRequest): MessageResponse {
try {
// 1. 查当前 stockOutLine
val stockOutLine = stockOutLineRepository.findById(request.id).orElseThrow {
IllegalArgumentException("StockOutLine not found with ID: ${request.id}")
}
println("Updating StockOutLine ID: ${request.id}")
println("Current status: ${stockOutLine.status}")
println("New status: ${request.status}")
// 2. 更新自身 status/qty
stockOutLine.status = request.status
if (request.qty != null) {
val currentQty = stockOutLine.qty?.toDouble() ?: 0.0
val newQty = currentQty + request.qty
stockOutLine.qty = (newQty)
}
val savedStockOutLine = stockOutLineRepository.saveAndFlush(stockOutLine)
println("Updated StockOutLine: ${savedStockOutLine.id} with status: ${savedStockOutLine.status}")
// 3. 如果被拒绝,触发特殊处理
if (request.status == "rejected" || request.status == "REJECTED") {
println("=== TRIGGERING LOT REJECTION LOGIC ===")
handleLotRejectionFromStockOutLine(savedStockOutLine)
}
// 4. 自动刷 pickOrderLine 状态
val pickOrderLine = stockOutLine.pickOrderLine
if (pickOrderLine != null) {
checkIsStockOutLineCompleted(pickOrderLine.id)
// 5. 自动刷 pickOrder 状态
val pickOrder = pickOrderLine.pickOrder
if (pickOrder != null) {
val allLines = pickOrder.pickOrderLines
val allCompleted = allLines.all { it.status == PickOrderLineStatus.COMPLETED }
if (allCompleted && allLines.isNotEmpty()) {
pickOrder.status = PickOrderStatus.COMPLETED
pickOrderRepository.save(pickOrder)
completeDoForPickOrder(pickOrder.id!!)
completeDoIfAllPickOrdersCompleted(pickOrder.id!!)
}
}
}
val mappedSavedStockOutLine = stockOutLineRepository.findStockOutLineInfoById(savedStockOutLine.id!!)
return MessageResponse(
id = savedStockOutLine.id,
name = savedStockOutLine.inventoryLotLine!!.inventoryLot!!.lotNo,
code = savedStockOutLine.stockOut!!.consoPickOrderCode,
type = savedStockOutLine.status,
message = "Stock out line status updated successfully",
errorPosition = null,
entity = mappedSavedStockOutLine,
)
} catch (e: Exception) {
println("Error updating stock out line status: ${e.message}")
e.printStackTrace()
throw e
}
val mappedSavedStockOutLine = stockOutLineRepository.findStockOutLineInfoById(savedStockOutLine.id!!)
return MessageResponse(
id = savedStockOutLine.id,
name = savedStockOutLine.inventoryLotLine!!.inventoryLot!!.lotNo,
code = savedStockOutLine.stockOut!!.consoPickOrderCode,
type = savedStockOutLine.status,
message = "Stock out line status updated successfully",
errorPosition = null,
entity = mappedSavedStockOutLine,
)
} catch (e: Exception) {
println("Error updating stock out line status: ${e.message}")
e.printStackTrace()
throw e
}
}
// ✅ ADD THIS: Handle lot rejection when stock out line is rejected
private fun handleLotRejectionFromStockOutLine(stockOutLine: StockOutLine) {
try {


Loading…
取消
儲存