Quellcode durchsuchen

update scan equipemntcode

master^2
CANCERYS\kw093 vor 7 Stunden
Ursprung
Commit
8523918bb3
12 geänderte Dateien mit 186 neuen und 110 gelöschten Zeilen
  1. +50
    -1
      src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt
  2. +2
    -2
      src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt
  3. +5
    -0
      src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt
  4. +10
    -0
      src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt
  5. +0
    -1
      src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt
  6. +1
    -1
      src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt
  7. +2
    -0
      src/main/java/com/ffii/fpsms/modules/master/entity/projections/BomCombo.kt
  8. +1
    -0
      src/main/java/com/ffii/fpsms/modules/productProcess/entity/projections/ProductProcessInfo.kt
  9. +107
    -99
      src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt
  10. +4
    -0
      src/main/java/com/ffii/fpsms/modules/productProcess/web/ProductProcessController.kt
  11. +2
    -4
      src/main/java/com/ffii/fpsms/modules/productProcess/web/model/SaveProductProcessRequest.kt
  12. +2
    -2
      src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt

+ 50
- 1
src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt Datei anzeigen

@@ -17,6 +17,7 @@ import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderLineStatus
import java.time.LocalDateTime
import com.ffii.core.support.JdbcDao
import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderListForPrintQrCodeResponse
import com.ffii.fpsms.modules.jobOrder.web.model.SecondScanSubmitRequest
import java.util.Optional
import com.ffii.fpsms.modules.jobOrder.web.model.SecondScanIssueRequest
@@ -44,6 +45,9 @@ import com.ffii.fpsms.modules.jobOrder.web.model.PickOrderInfoResponse
import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderBasicInfoResponse
import com.ffii.fpsms.modules.jobOrder.web.model.PickOrderLineWithLotsResponse
import com.ffii.fpsms.modules.jobOrder.web.model.LotDetailResponse

import com.ffii.fpsms.modules.stock.entity.enum.StockInLineStatus
import com.ffii.fpsms.modules.stock.entity.StockInLineRepository
@Service
open class JoPickOrderService(
private val joPickOrderRepository: JoPickOrderRepository,
@@ -64,7 +68,8 @@ open class JoPickOrderService(
private val productProcessRepository: ProductProcessRepository,
private val productProcessLineRepository: ProductProcessLineRepository,
private val stockOutRepository: StockOutRepository,
private val jobOrderProcessRepository: JobOrderProcessRepository
private val jobOrderProcessRepository: JobOrderProcessRepository,
private val stockInLineRepository: StockInLineRepository

) {
@@ -1300,6 +1305,50 @@ open fun getCompletedJobOrderPickOrdersWithCompletedSecondScan(): List<Map<Strin
emptyList()
}
}
open fun getJobOrderListForPrintQrCode(): List<JobOrderListForPrintQrCodeResponse> {
println("=== getJobOrderListForPrintQrCode ===")
return try {
val jobOrders = jobOrderRepository.findAllByStatusIn(listOf(JobOrderStatus.COMPLETED))
// Get all stockInLines and filter for "received" status and BOM type "半成品"
val allStockInLines = stockInLineRepository.findAll()
val stockInLines = allStockInLines.filter {
it.jobOrder != null &&
it.status == "received" &&
it.deleted == false &&
it.jobOrder?.bom?.description == "半成品"
}
val result = mutableListOf<JobOrderListForPrintQrCodeResponse>()

for (stockInLine in stockInLines) {
val jobOrder = jobOrders.find { it.id == stockInLine.jobOrder?.id }
if (jobOrder != null && jobOrder.bom?.description == "半成品") {
// Check if this job order is already in the result (to avoid duplicates)
val existing = result.find {
it.stockInLineId == stockInLine.id
}

if (existing == null) {
val response = JobOrderListForPrintQrCodeResponse(
id = stockInLine.id!!,
code = jobOrder.code ?: "JO-${jobOrder.id}",
name = jobOrder.bom?.name ?: "",
reqQty = jobOrder.reqQty ?: BigDecimal.ZERO,
stockInLineId = stockInLine.id!!,
stockInLineQty = stockInLine.acceptedQty?.toDouble() ?: 0.0,
stockInLineStatus = stockInLine.status ?: "received",
finihedTime = jobOrder.planEnd ?: jobOrder.modified ?: LocalDateTime.now()
)
result.add(response)
}
}
}
result
} catch (e: Exception) {
println("❌ Error in getJobOrderListForPrintQrCode: ${e.message}")
e.printStackTrace()
emptyList()
}
}
open fun getCompletedJobOrderPickOrderLotDetails(pickOrderId: Long): List<Map<String, Any?>> {
println("=== getCompletedJobOrderPickOrderLotDetails ===")
println("pickOrderId: $pickOrderId")


+ 2
- 2
src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt Datei anzeigen

@@ -206,7 +206,7 @@ open class JobOrderService(
// 过滤掉 consumables 和 CMB 类型的物料
val nonConsumablesJobms = jobOrder.jobms.filter { jobm ->
val itemType = jobm.item?.type?.lowercase()
itemType != "consumables" && itemType != "cmb"
itemType != "consumables" && itemType != "cmb"&& itemType != "nm"
}
if (nonConsumablesJobms.isEmpty()) {
@@ -394,7 +394,7 @@ open class JobOrderService(
}
jobOrderRepository.save(jo)
val pols = jo.jobms.filter { it.item?.type != "CMB"&& it.item?.type != "consumables"}.
val pols = jo.jobms.filter { it.item?.type != "CMB"&& it.item?.type != "consumables" && it.item?.type != "NM"}.
map {
SavePickOrderLineRequest(
itemId = it.item?.id,


+ 5
- 0
src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt Datei anzeigen

@@ -41,6 +41,7 @@ import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderInfo
import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderInfoWithTypeName
import com.ffii.fpsms.modules.jobOrder.web.model.ExportFGStockInLabelRequest


@RestController
@RequestMapping("/jo")
class JobOrderController(
@@ -230,6 +231,10 @@ fun recordSecondScanIssue(
fun getCompletedJobOrderPickOrders(): List<Map<String, Any?>> {
return joPickOrderService.getCompletedJobOrderPickOrders()
}
@GetMapping("/joForPrintQrCode")
fun getJoForPrintQrCode(): List<JobOrderListForPrintQrCodeResponse> {
return joPickOrderService.getJobOrderListForPrintQrCode()
}

@GetMapping("/completed-job-order-pick-order-lot-details-completed-pick/{pickOrderId}")
fun getCompletedJobOrderPickOrderLotDetailsForCompletedPick(@PathVariable pickOrderId: Long): List<Map<String, Any?>> {


+ 10
- 0
src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt Datei anzeigen

@@ -121,3 +121,13 @@ data class LotDetailResponse(
)


data class JobOrderListForPrintQrCodeResponse(
val id: Long,
val code: String,
val name: String,
val reqQty: BigDecimal,
val stockInLineId: Long,
val stockInLineQty: Double,
val stockInLineStatus: String,
val finihedTime: LocalDateTime,
)

+ 0
- 1
src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt Datei anzeigen

@@ -33,5 +33,4 @@ open class EquipmentDetail : BaseEntity<Long>() {
@Column(name = "equipmentTypeID")
open var equipmentTypeId: Long? = null


}

+ 1
- 1
src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt Datei anzeigen

@@ -12,5 +12,5 @@ interface EquipmentDetailRepository : AbstractRepository<EquipmentDetail, Long>

fun findByDescriptionAndDeletedIsFalse(description: String): EquipmentDetail?;
fun findByEquipmentTypeIdAndDeletedFalse(equipmentTypeId: Long): List<EquipmentDetail>;
fun findByEquipmentCode(equipmentCode: String): EquipmentDetail?;
}

+ 2
- 0
src/main/java/com/ffii/fpsms/modules/master/entity/projections/BomCombo.kt Datei anzeigen

@@ -11,4 +11,6 @@ interface BomCombo {
val label: String;
val outputQty: BigDecimal;
val outputQtyUom: String?;
@get:Value("#{target.description}")
val description: String?;
}

+ 1
- 0
src/main/java/com/ffii/fpsms/modules/productProcess/entity/projections/ProductProcessInfo.kt Datei anzeigen

@@ -50,6 +50,7 @@ data class ProductProcessLineInfo(
val operatorId: Long?,
val operatorName: String?,
val equipmentId: Long?,
val equipmentDetailId: Long?,
val handlerId: Long?,
val seqNo: Long?,
val name: String?,


+ 107
- 99
src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt Datei anzeigen

@@ -45,6 +45,8 @@ import com.ffii.fpsms.modules.jobOrder.entity.JobTypeRepository
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository
import java.time.ZoneOffset
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
@Transactional
open class ProductProcessService(
@@ -68,6 +70,7 @@ open class ProductProcessService(
private val jobTypeRepository: JobTypeRepository,
private val pickOrderRepository: PickOrderRepository,
private val joPickOrderRepository: JoPickOrderRepository,
private val uomConversionRepository: UomConversionRepository,
) {
open fun findAll(pageable: Pageable): Page<ProductProcess> {
@@ -603,6 +606,7 @@ open class ProductProcessService(
operatorId = line.operator?.id?:0,
operatorName = line.operator?.name?:"",
equipmentId = line.equipment?.id?:0,
equipmentDetailId = line.equipmentDetailId?:0,
handlerId = line.handler?.id?:0,
seqNo = line.seqNo?:0,
name = line.name?:"",
@@ -637,12 +641,15 @@ open class ProductProcessService(
jobOrderLines = bomMaterials.map { line ->
val itemId = line.item?.id ?: 0L
val stockQty = stockQtyMap[itemId]?.toInt() ?: 0
val uom = line.uom
val shortUom = uom?.udfShortDesc ?: uom?.udfudesc ?: ""
// 首先通过 bomId 和 itemId 找到 BomMaterial
val bomMaterial = bom?.id?.let { bomId ->
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
val bomProcessMaterial = bomMaterial?.id?.let { bomMaterialId ->
bomProcessIds.firstNotNullOfOrNull { bomProcessId ->
@@ -663,8 +670,8 @@ open class ProductProcessService(
itemName = line.item?.name?:"",
reqQty = line.reqQty?.toInt() ?: 0,
stockQty = stockQty,
uom = uom?.udfudesc ?: "",
shortUom = shortUom,
uom = uomName?:"",
shortUom = shortUom?:"",
type = line.item?.type?: "",
availableStatus = availableStatus,
bomProcessId = bomProcessMaterial?.bomProcess?.id?:0,
@@ -723,59 +730,36 @@ open class ProductProcessService(
}
open fun UpdateProductProcessLineOperatorIdOrEquipmentId(request: UpdateProductProcessLineOperatorIdOrEquipmentIdRequest): MessageResponse {
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
println("equipmentTypeSubTypeEquipmentNo ${equipmentTypeSubTypeEquipmentNo}")
val staffNo = request.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)
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?:"")
println("equipmentDetail ${equipmentDetail?.id}")
val equipmentId = equipmentDetail?.equipmentTypeId
@@ -809,10 +793,10 @@ open class ProductProcessService(
productProcessLine?.equipmentDetailId = equipmentDetail?.id
productProcessLineRepository.save(productProcessLine)
}
if(user != null) {
productProcessLine.operator = user
productProcessLineRepository.save(productProcessLine)
}

return MessageResponse(
id = null,
@@ -826,61 +810,77 @@ open class ProductProcessService(

open fun NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetail(request: NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetailRequest): MessageResponse {
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 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(
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 {
val productProcessLine = productProcessLineRepository.findById(request.productProcessLineId).orElse(null)
val handlerId = request.handlerId
@@ -1081,7 +1081,7 @@ open class ProductProcessService(
val stockInLine = jobOrder?.stockInLines?.firstOrNull()
val stockInLineId = stockInLine?.id
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

@@ -1091,13 +1091,21 @@ open class ProductProcessService(
status = productProcesses.status.value,
startTime = productProcesses.startTime,
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,
date = productProcesses.date,
bomId = productProcesses.bom?.id,
assignedTo = pickOrder?.assignTo?.id,
itemName = productProcesses.item?.name,
pickOrderId = pickOrder?.id,
pickOrderStatus = pickOrder?.status?.value,
jobOrderId = productProcesses.jobOrder?.id,
stockInLineId = stockInLineId,
jobOrderCode = jobOrder?.code,


+ 4
- 0
src/main/java/com/ffii/fpsms/modules/productProcess/web/ProductProcessController.kt Datei anzeigen

@@ -168,6 +168,10 @@ class ProductProcessController(
fun demoupdate(@RequestBody request: UpdateProductProcessLineOperatorIdOrEquipmentIdRequest): MessageResponse {
return productProcessService.UpdateProductProcessLineOperatorIdOrEquipmentId(request)
}
@PostMapping("/Demo/NewUpdate")
fun demoNewUpdate(@RequestBody request: NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetailRequest): MessageResponse {
return productProcessService.NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetail(request)
}
@PostMapping("/Demo/update/handler")
fun demoupdatehandler(@RequestBody request: UpdateProductProcessLineHandlerIdRequest): MessageResponse {
return productProcessService.UpdateProductProcessLineHandlerId(request)


+ 2
- 4
src/main/java/com/ffii/fpsms/modules/productProcess/web/model/SaveProductProcessRequest.kt Datei anzeigen

@@ -9,8 +9,6 @@ data class SaveProductProcessRequest(
)
data class UpdateProductProcessLineOperatorIdOrEquipmentIdRequest(
val productProcessLineId: Long,
//val operatorId: Long?,
//val equipmentId: Long?,
@JsonProperty("EquipmentType-SubType-EquipmentNo")
val equipmentTypeSubTypeEquipmentNo: String?,
val staffNo: String?,
@@ -169,6 +167,7 @@ data class AllJoborderProductProcessInfoResponse(
val jobOrderCode: String?,
val assignedTo: Long?,
val pickOrderId: Long?,
val pickOrderStatus: String?,
val productProcessLineCount: Int,
val FinishedProductProcessLineCount: Int,
val stockInLineId: Long?,
@@ -191,9 +190,8 @@ data class UpdateProductProcessLineStatusRequest(
)
data class NewUpdateProductProcessLineOperatorIdOrEquipmentIdAndEquipmentDetailRequest(
val productProcessLineId: Long,
val EquipmentTypeSubTypeEquipmentNo: String,
val equipmentCode: String,
val staffNo: String?,
val Name: String?,
)
data class SaveProductProcessIssueTimeRequest(
val productProcessLineId: Long,


+ 2
- 2
src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt Datei anzeigen

@@ -47,8 +47,8 @@ interface StockInLineInfo {
@get:Value("#{target.item?.type}")
val itemType: String?
val dnNo: String?
// val dnDate: LocalDateTime?
// val qcDecision: LocalDateTime?
@get:Value("#{target.jobOrder?.bom?.description}")
val bomDescription: String?
@get:Value("#{target.escalationLog.^[status.value == 'pending']?.handler?.id}")
val handlerId: Long?
@get:Value("#{target.inventoryLot?.inventoryLotLines ?: new java.util.ArrayList()}")


Laden…
Abbrechen
Speichern