@@ -45,6 +45,8 @@ import com.ffii.fpsms.modules.jobOrder.entity.JobTypeRepository
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository
import java.time.ZoneOffset
import java.time.ZoneOffset
import com.ffii.fpsms.modules.jobOrder.entity.JoPickOrderRepository
import com.ffii.fpsms.modules.jobOrder.entity.JoPickOrderRepository
import com.ffii.fpsms.modules.jobOrder.enums.JoPickOrderStatus
import com.ffii.fpsms.modules.master.entity.UomConversionRepository
@Service
@Service
@Transactional
@Transactional
open class ProductProcessService(
open class ProductProcessService(
@@ -68,6 +70,7 @@ open class ProductProcessService(
private val jobTypeRepository: JobTypeRepository,
private val jobTypeRepository: JobTypeRepository,
private val pickOrderRepository: PickOrderRepository,
private val pickOrderRepository: PickOrderRepository,
private val joPickOrderRepository: JoPickOrderRepository,
private val joPickOrderRepository: JoPickOrderRepository,
private val uomConversionRepository: UomConversionRepository,
) {
) {
open fun findAll(pageable: Pageable): Page<ProductProcess> {
open fun findAll(pageable: Pageable): Page<ProductProcess> {
@@ -603,6 +606,7 @@ open class ProductProcessService(
operatorId = line.operator?.id?:0,
operatorId = line.operator?.id?:0,
operatorName = line.operator?.name?:"",
operatorName = line.operator?.name?:"",
equipmentId = line.equipment?.id?:0,
equipmentId = line.equipment?.id?:0,
equipmentDetailId = line.equipmentDetailId?:0,
handlerId = line.handler?.id?:0,
handlerId = line.handler?.id?:0,
seqNo = line.seqNo?:0,
seqNo = line.seqNo?:0,
name = line.name?:"",
name = line.name?:"",
@@ -637,12 +641,15 @@ open class ProductProcessService(
jobOrderLines = bomMaterials.map { line ->
jobOrderLines = bomMaterials.map { line ->
val itemId = line.item?.id ?: 0L
val itemId = line.item?.id ?: 0L
val stockQty = stockQtyMap[itemId]?.toInt() ?: 0
val stockQty = stockQtyMap[itemId]?.toInt() ?: 0
val uom = line.uom
val shortUom = uom?.udfShortDesc ?: uom?.udfudesc ?: ""
// 首先通过 bomId 和 itemId 找到 BomMaterial
// 首先通过 bomId 和 itemId 找到 BomMaterial
val bomMaterial = bom?.id?.let { bomId ->
val bomMaterial = bom?.id?.let { bomId ->
bomMaterialRepository.findByBomIdAndItemId(bomId, itemId)
bomMaterialRepository.findByBomIdAndItemId(bomId, itemId)
}
}
// 使用 bom_material.uom_name 而不是关联的 uom 对象
val uom = uomConversionRepository.findByCodeAndDeletedFalse(bomMaterial?.uomName?:"")
val uomName = uom?.udfShortDesc
val shortUom = uom?.udfShortDesc
// 然后遍历 bomProcessIds 找到第一个匹配的 BomProcessMaterial
// 然后遍历 bomProcessIds 找到第一个匹配的 BomProcessMaterial
val bomProcessMaterial = bomMaterial?.id?.let { bomMaterialId ->
val bomProcessMaterial = bomMaterial?.id?.let { bomMaterialId ->
bomProcessIds.firstNotNullOfOrNull { bomProcessId ->
bomProcessIds.firstNotNullOfOrNull { bomProcessId ->
@@ -663,8 +670,8 @@ open class ProductProcessService(
itemName = line.item?.name?:"",
itemName = line.item?.name?:"",
reqQty = line.reqQty?.toInt() ?: 0,
reqQty = line.reqQty?.toInt() ?: 0,
stockQty = stockQty,
stockQty = stockQty,
uom = uom?.udfudesc ?: "",
shortUom = shortUom,
uom = uomName?: "",
shortUom = shortUom?:"" ,
type = line.item?.type?: "",
type = line.item?.type?: "",
availableStatus = availableStatus,
availableStatus = availableStatus,
bomProcessId = bomProcessMaterial?.bomProcess?.id?:0,
bomProcessId = bomProcessMaterial?.bomProcess?.id?:0,
@@ -723,59 +730,36 @@ open class ProductProcessService(
}
}
open fun UpdateProductProcessLineOperatorIdOrEquipmentId(request: UpdateProductProcessLineOperatorIdOrEquipmentIdRequest): MessageResponse {
open fun UpdateProductProcessLineOperatorIdOrEquipmentId(request: UpdateProductProcessLineOperatorIdOrEquipmentIdRequest): MessageResponse {
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
/*
val equipmentId = request.equipmentId
val user = userRepository.findById(request.operatorId?:0L).orElse(null)
val bomProcess= bomProcessRepository.findById(productProcessLine?.bomProcess?.id?:0L).orElse(null)
val bomProcessEquipment=bomProcess?.equipment
if (equipmentId != null && user != null) {
// 检查 equipmentId 是否与 bomProcessEquipment 匹配
if (equipmentId != bomProcessEquipment?.id) {
println("productProcessLine id${request.productProcessLineId}")
println("operator id${request.operatorId}")
println("user ${user?.id}")
println("bomProcess ${bomProcess?.id}")
println("not match equipment id${equipmentId} and ${bomProcessEquipment?.id}")
// 返回错误响应
return MessageResponse(
id = request.productProcessLineId,
code = "400",
name = "Equipment Validation Failed",
type = "error",
message = "Input Equipment ID($equipmentId) and BOM Process Equipment ID(${bomProcessEquipment?.id}) not match",
errorPosition = "equipmentId"
)
}
}
if(equipmentId != null &&( equipmentId==bomProcessEquipment?.id)) {
productProcessLine?.equipment = bomProcessEquipment
productProcessLineRepository.save(productProcessLine)
}
else
{ println("productProcessLine id${request.productProcessLineId}")
println("operator id${request?.operatorId}")
println("user ${user?.id}")
println("bomProcess ${bomProcess?.id}")
println("not match equipment id${equipmentId} and ${bomProcessEquipment?.id}")
}
if(user != null) {
productProcessLine.operator = user
productProcessLineRepository.save(productProcessLine)
}
*/
val equipmentTypeSubTypeEquipmentNo = request.equipmentTypeSubTypeEquipmentNo
val equipmentTypeSubTypeEquipmentNo = request.equipmentTypeSubTypeEquipmentNo
println("equipmentTypeSubTypeEquipmentNo ${equipmentTypeSubTypeEquipmentNo}")
println("equipmentTypeSubTypeEquipmentNo ${equipmentTypeSubTypeEquipmentNo}")
val staffNo = request.staffNo
val staffNo = request.staffNo
println("staffNo ${staffNo}")
println("staffNo ${staffNo}")
if (staffNo.isNullOrBlank()) {
println("staffNo is null or blank")
return MessageResponse(
id = request.productProcessLineId,
code = "400",
name = "Staff No Required",
type = "error",
message = "Staff No is required",
errorPosition = "staffNo"
)
}
val user = userRepository.findByStaffNo(staffNo?:"").orElse(null)
val user = userRepository.findByStaffNo(staffNo?:"").orElse(null)
println("user ${user?.id}")
println("user ${user?.id}")
if (user == null) {
println("User not found with staffNo: $staffNo")
return MessageResponse(
id = request.productProcessLineId,
code = "404",
name = "User Not Found",
type = "error",
message = "User not found with staffNo: $staffNo",
errorPosition = "staffNo"
)
}
val equipmentDetail = equipmentDetailRepository.findByCode(equipmentTypeSubTypeEquipmentNo?:"")
val equipmentDetail = equipmentDetailRepository.findByCode(equipmentTypeSubTypeEquipmentNo?:"")
println("equipmentDetail ${equipmentDetail?.id}")
println("equipmentDetail ${equipmentDetail?.id}")
val equipmentId = equipmentDetail?.equipmentTypeId
val equipmentId = equipmentDetail?.equipmentTypeId
@@ -809,10 +793,10 @@ open class ProductProcessService(
productProcessLine?.equipmentDetailId = equipmentDetail?.id
productProcessLine?.equipmentDetailId = equipmentDetail?.id
productProcessLineRepository.save(productProcessLine)
productProcessLineRepository.save(productProcessLine)
}
}
if(user != null) {
productProcessLine.operator = user
productProcessLine.operator = user
productProcessLineRepository.save(productProcessLine)
productProcessLineRepository.save(productProcessLine)
}
return MessageResponse(
return MessageResponse(
id = null,
id = null,
@@ -826,61 +810,77 @@ open class ProductProcessService(
open fun NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetail(request: NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetailRequest): MessageResponse {
open fun NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetail(request: NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetailRequest): MessageResponse {
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val equipmentDetail = equipmentDetailRepository.findByCode(request.EquipmentTypeSubTypeEquipmentNo )
val equipmentDetail = equipmentDetailRepository.findByEquipmentCode(request.equipmentCode )
val user = userRepository.findByName(request.Name?:"" )
val user = userRepository.findByStaffNo(request.staffNo?:"").orElse(null )
val bomProcess= bomProcessRepository.findById(productProcessLine?.bomProcess?.id?:0L).orElse(null)
val bomProcess= bomProcessRepository.findById(productProcessLine?.bomProcess?.id?:0L).orElse(null)
val bomProcessEquipment=bomProcess?.equipment
val bomProcessEquipment=bomProcess?.equipment
if (equipmentDetail != null && user != null) {
// 检查 equipmentId 是否与 bomProcessEquipment 匹配
if (equipmentDetail.equipmentTypeId != bomProcessEquipment?.id) {
println("productProcessLine id${request.productProcessLineId}")
println("operator Name${request.Name}")
println("user ${user}")
println("bomProcess ${bomProcess?.id}")
println("not match equipment id${equipmentDetail.equipmentTypeId} and ${bomProcessEquipment?.id}")
// 返回错误响应
return MessageResponse(
id = request.productProcessLineId,
code = "400",
name = "Equipment Validation Failed",
type = "error",
message = "Input Equipment ID($equipmentDetail.equipmentTypeId ) and BOM Process Equipment ID(${bomProcessEquipment?.id}) not match",
errorPosition = "equipmentId"
)
}
}
if(equipmentDetail?.equipmentTypeId != null &&( equipmentDetail.equipmentTypeId ==bomProcessEquipment?.id)) {
// ===== 校验区 =====
val equipment = equipmentRepository.findById(equipmentDetail.equipmentTypeId).orElse(null)
productProcessLine?.equipment = equipment
productProcessLine?.equipmentDetailId = equipmentDetail.id
productProcessLineRepository.save(productProcessLine)
}
else
{ println("productProcessLine id${request.productProcessLineId}")
println("operator Name${request?.Name}")
println("user ${user}")
println("bomProcess ${bomProcess?.id}")
println("not match equipment id${equipmentDetail?.equipmentTypeId} and ${bomProcessEquipment?.id}")
}
if(user != null) {
//productProcessLine.operator = user.name
// productProcessLineRepository.save(productProcessLine)
}
// 情况:设备有 + 人空 → 不通过
if (equipmentDetail != null && user == null) {
return MessageResponse(
id = request.productProcessLineId,
code = "400",
name = "User Required",
type = "error",
message = "Staff No is required when equipment is provided",
errorPosition = "staffNo"
)
}
// 情况:设备有 + 人有 + 设备不匹配 → 不通过
if (equipmentDetail != null && user != null &&
equipmentDetail.equipmentTypeId != bomProcessEquipment?.id
) {
println("not match equipment id${equipmentDetail.equipmentTypeId} and ${bomProcessEquipment?.id}")
return MessageResponse(
id = request.productProcessLineId,
code = "400",
name = "Equipment Validation Failed",
type = "error",
message = "Input Equipment ID(${equipmentDetail.equipmentTypeId}) and BOM Process Equipment ID(${bomProcessEquipment?.id}) not match",
errorPosition = "equipmentId"
)
}
// 情况:设备空 + 人空 → 不通过(如你不需要这个,可以去掉或改成通过)
if (equipmentDetail == null && user == null) {
return MessageResponse(
return MessageResponse(
id = null,
code = null,
name = null,
type = null,
message = null,
errorPosition = null,
id = request.productProcessLineId ,
code = "400" ,
name = "User Required" ,
type = "error" ,
message = "Staff No is required" ,
errorPosition = "staffNo"
)
)
}
}
// ===== 通过校验,开始更新 =====
// 设备有(且已通过匹配校验) → 更新 equipment / equipmentDetailId
if (equipmentDetail != null) {
val equipment = equipmentRepository.findById(equipmentDetail.equipmentTypeId!!).orElse(null)
productProcessLine?.equipment = equipment
productProcessLine?.equipmentDetailId = equipmentDetail.id
}
// 人有(设备可以有也可以没有) → 更新 operator
if (user != null) {
productProcessLine?.operator = user
}
productProcessLineRepository.save(productProcessLine)
return MessageResponse(
id = null,
code = null,
name = null,
type = null,
message = null,
errorPosition = null,
)
}
open fun UpdateProductProcessLineHandlerId(request: UpdateProductProcessLineHandlerIdRequest): MessageResponse {
open fun UpdateProductProcessLineHandlerId(request: UpdateProductProcessLineHandlerIdRequest): MessageResponse {
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val handlerId = request.handlerId
val handlerId = request.handlerId
@@ -1081,7 +1081,7 @@ open class ProductProcessService(
val stockInLine = jobOrder?.stockInLines?.firstOrNull()
val stockInLine = jobOrder?.stockInLines?.firstOrNull()
val stockInLineId = stockInLine?.id
val stockInLineId = stockInLine?.id
val pickOrder = pickOrderRepository.findAllByJobOrder_Id(jobOrder?.id?:0L).firstOrNull()
val pickOrder = pickOrderRepository.findAllByJobOrder_Id(jobOrder?.id?:0L).firstOrNull()
val joPickOrders = joPickOrderRepository.findByPickOrderId(pickOrder?.id?:0L).firstOrNull()
val joPickOrdersList = joPickOrderRepository.findByPickOrderId(pickOrder?.id?:0L)
//val silHandlerId = stockInLine?.escalationLog?.firstOrNull { it.status == "pending" }?.handler?.id
//val silHandlerId = stockInLine?.escalationLog?.firstOrNull { it.status == "pending" }?.handler?.id
@@ -1091,13 +1091,21 @@ open class ProductProcessService(
status = productProcesses.status.value,
status = productProcesses.status.value,
startTime = productProcesses.startTime,
startTime = productProcesses.startTime,
endTime = productProcesses.endTime,
endTime = productProcesses.endTime,
matchStatus = joPickOrders?.matchStatus?.value?:"",
matchStatus = if (joPickOrdersList.isNotEmpty() &&
joPickOrdersList.all { it.matchStatus == JoPickOrderStatus.completed }) {
"completed"
} else if (joPickOrdersList.any { it.matchStatus == JoPickOrderStatus.scanned }) {
"scanned"
} else {
"pending"
},
RequiredQty = jobOrder?.reqQty?.toInt() ?: 0,
RequiredQty = jobOrder?.reqQty?.toInt() ?: 0,
date = productProcesses.date,
date = productProcesses.date,
bomId = productProcesses.bom?.id,
bomId = productProcesses.bom?.id,
assignedTo = pickOrder?.assignTo?.id,
assignedTo = pickOrder?.assignTo?.id,
itemName = productProcesses.item?.name,
itemName = productProcesses.item?.name,
pickOrderId = pickOrder?.id,
pickOrderId = pickOrder?.id,
pickOrderStatus = pickOrder?.status?.value,
jobOrderId = productProcesses.jobOrder?.id,
jobOrderId = productProcesses.jobOrder?.id,
stockInLineId = stockInLineId,
stockInLineId = stockInLineId,
jobOrderCode = jobOrder?.code,
jobOrderCode = jobOrder?.code,