| @@ -4542,16 +4542,26 @@ println("DEBUG sol polIds in linesResults: " + linesResults.mapNotNull { it["sto | |||
| request: GetCompletedDoPickOrdersRequest | |||
| ): List<CompletedDoPickOrderResponse> { | |||
| return try { | |||
| val completedRecords = doPickOrderRecordRepository | |||
| .findByHandledByAndTicketStatusAndDeletedFalse(userId, DoPickOrderStatus.completed) | |||
| .filter { record -> | |||
| val matchTicket = request.ticketNo.isNullOrBlank() || | |||
| record.ticketNo?.contains(request.ticketNo, ignoreCase = true) == true | |||
| val matchShop = request.shopName.isNullOrBlank() || | |||
| record.shopName?.contains(request.shopName, ignoreCase = true) == true | |||
| matchTicket && matchShop | |||
| } | |||
| .filter { (it.recordId ?: 0L) > 0 } | |||
| val normalizedTargetDate = request.targetDate | |||
| ?.takeIf { it.isNotBlank() } | |||
| ?.replace("-", "") | |||
| println("request.targetDate: $request.targetDate") | |||
| println("request.shopName: $request.shopName") | |||
| println("request.deliveryNoteCode: $request.deliveryNoteCode") | |||
| val completedRecords = doPickOrderRecordRepository | |||
| .findByHandledByAndTicketStatusAndDeletedFalse(userId, DoPickOrderStatus.completed) | |||
| .filter { record -> | |||
| val matchTargetDate = normalizedTargetDate.isNullOrBlank() || | |||
| record.ticketCompleteDateTime | |||
| ?.format(DateTimeFormatter.ofPattern("yyyyMMdd")) | |||
| ?.contains(normalizedTargetDate, ignoreCase = true) == true | |||
| val matchShop = request.shopName.isNullOrBlank() || | |||
| record.shopName?.contains(request.shopName, ignoreCase = true) == true | |||
| val matchDeliveryNoteCode = request.deliveryNoteCode.isNullOrBlank() || | |||
| record.deliveryNoteCode?.contains(request.deliveryNoteCode, ignoreCase = true) == true | |||
| matchTargetDate && matchShop && matchDeliveryNoteCode | |||
| } | |||
| .filter { (it.recordId ?: 0L) > 0 } | |||
| if (completedRecords.isEmpty()) { | |||
| return emptyList() | |||
| @@ -4563,11 +4573,12 @@ println("DEBUG sol polIds in linesResults: " + linesResults.mapNotNull { it["sto | |||
| val filteredRecords = completedRecords.filter { record -> | |||
| val lines = lineRecordsByRecordId[record.recordId] ?: emptyList() | |||
| val matchPo = request.pickOrderCode.isNullOrBlank() || | |||
| lines.any { it.pickOrderCode?.contains(request.pickOrderCode, ignoreCase = true) == true } | |||
| val matchDelivery = request.deliveryNo.isNullOrBlank() || | |||
| lines.any { it.deliveryOrderCode?.contains(request.deliveryNo, ignoreCase = true) == true } | |||
| matchPo && matchDelivery | |||
| val matchTargetDate = normalizedTargetDate.isNullOrBlank() || | |||
| record.ticketCompleteDateTime | |||
| ?.format(DateTimeFormatter.ofPattern("yyyyMMdd")) | |||
| ?.contains(normalizedTargetDate, ignoreCase = true) == true | |||
| matchTargetDate | |||
| }.sortedByDescending { it.ticketCompleteDateTime } | |||
| if (filteredRecords.isEmpty()) { | |||
| @@ -296,16 +296,14 @@ fun confirmLotSubstitution(@RequestBody req: LotSubstitutionConfirmRequest): Mes | |||
| @GetMapping("/completed-do-pick-orders/{userId}") | |||
| fun getCompletedDoPickOrders( | |||
| @PathVariable userId: Long, | |||
| @RequestParam(required = false) pickOrderCode: String?, | |||
| @RequestParam(required = false) shopName: String?, | |||
| @RequestParam(required = false) deliveryNo: String?, | |||
| @RequestParam(required = false) ticketNo: String? | |||
| @RequestParam(required = false) targetDate: String?, | |||
| @RequestParam(required = false) deliveryNoteCode: String?, | |||
| ): List<CompletedDoPickOrderResponse> { | |||
| val request = GetCompletedDoPickOrdersRequest( | |||
| pickOrderCode = pickOrderCode, | |||
| targetDate = targetDate, | |||
| shopName = shopName, | |||
| deliveryNo = deliveryNo, | |||
| ticketNo = ticketNo | |||
| deliveryNoteCode = deliveryNoteCode | |||
| ) | |||
| return pickOrderService.getCompletedDoPickOrders(userId, request) | |||
| } | |||
| @@ -16,10 +16,9 @@ data class SearchPickOrderRequest ( | |||
| val pageNum: Int?, | |||
| ) | |||
| data class GetCompletedDoPickOrdersRequest( | |||
| val pickOrderCode: String? = null, | |||
| val targetDate: String? = null, | |||
| val shopName: String? = null, | |||
| val deliveryNo: String? = null, | |||
| val ticketNo: String? = null | |||
| val deliveryNoteCode: String? = null, | |||
| ) | |||
| data class CompletedDoPickOrderResponse( | |||
| val id: Long, | |||
| @@ -16,8 +16,17 @@ data class ProductProcessInfo( | |||
| val endTime: LocalDateTime?, | |||
| @JsonFormat(pattern = "yyyy-MM-dd") | |||
| val date: LocalDate?, | |||
| val bomId: Long?, | |||
| val jobOrderId: Long?, | |||
| val jobOrderCode: String?, | |||
| val isDark: String?, | |||
| val isDense: Int?, | |||
| val isFloat: String?, | |||
| val outputQtyUom: String?, | |||
| val outputQty: Int?, | |||
| val productProcessLines: List<ProductProcessLineInfo>? | |||
| ) | |||
| @@ -455,12 +455,34 @@ open class ProductProcessService( | |||
| open fun productProcessDetailfindbyjoid(joid: Long): List<ProductProcessInfo> { | |||
| val productProcesses = productProcessRepository.findByJobOrder_Id(joid) | |||
| val jobOrder = jobOrderRepository.findById(joid).orElse(null) | |||
| val bom = bomRepository.findById(jobOrder?.bom?.id?:0L).orElse(null) | |||
| fun calculateColourScore(value: Int?): String { | |||
| return when (value) { | |||
| 0 -> "淺" | |||
| 1 -> "深" | |||
| else -> "" | |||
| } | |||
| } | |||
| fun calculateFloatScore(value: Int?): String { | |||
| return when (value) { | |||
| 0 -> "沉" | |||
| 1 -> "浮" | |||
| else -> "" | |||
| } | |||
| } | |||
| //val processId = productProcess.id ?: 0 | |||
| return productProcesses.map { process -> | |||
| ProductProcessInfo( | |||
| id = process.id?:0, | |||
| bomId = process.bom?.id?:0, | |||
| jobOrderId = process.jobOrder?.id?:0, | |||
| jobOrderCode = jobOrder?.code?:"", | |||
| isDark = calculateColourScore(bom?.isDark?:0), | |||
| isDense = bom?.isDense?:0, | |||
| isFloat = calculateFloatScore(bom?.isFloat?:0), | |||
| outputQtyUom = bom?.outputQtyUom?:"", | |||
| outputQty = bom?.outputQty?.toInt()?:0, | |||
| productProcessCode = process.productProcessCode?:"", | |||
| status = process.status?:ProductProcessStatus.PENDING, | |||
| startTime = process.startTime?:LocalDateTime.now(), | |||
| @@ -494,6 +516,7 @@ open class ProductProcessService( | |||
| ) | |||
| } | |||
| } | |||
| /* | |||
| open fun productProcessDetailfindbyidtest(id: Long): ProductProcessInfo { | |||
| val zero = BigDecimal.ZERO | |||
| val productProcess = productProcessRepository.findById(id).orElse(null) | |||
| @@ -536,6 +559,7 @@ open class ProductProcessService( | |||
| } | |||
| ) | |||
| } | |||
| */ | |||
| open fun createProductProcessByJobOrderId(jobOrderId: Long): MessageResponse { | |||
| val jobOrder = jobOrderRepository.findById(jobOrderId).orElse(null) | |||
| val bom = bomRepository.findById(jobOrder?.bom?.id ?: 0L).orElse(null) | |||
| @@ -587,6 +611,26 @@ open class ProductProcessService( | |||
| 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 | |||
| @@ -599,6 +643,7 @@ open class ProductProcessService( | |||
| println("user ${user?.id}") | |||
| println("bomProcess ${bomProcess?.id}") | |||
| println("not match equipment id${equipmentId} and ${bomProcessEquipment?.id}") | |||
| } | |||
| if(user != null) { | |||
| productProcessLine.operator = user | |||
| @@ -646,8 +691,8 @@ open class ProductProcessService( | |||
| seqNo = productProcessLine.seqNo?:0, | |||
| name = productProcessLine.name?:"", | |||
| description = productProcessLine.description?:"", | |||
| equipmentType = productProcessLine.equipmentType?:"", | |||
| equipment = productProcessLine.equipment?.name?:"", | |||
| equipmentType = productProcessLine.equipmentType, | |||
| equipmentId = productProcessLine.equipment?.id?:0, | |||
| startTime = productProcessLine.startTime?:LocalDateTime.now(), | |||
| endTime = productProcessLine.endTime?:LocalDateTime.now(), | |||
| status = productProcessLine.status?:"", | |||
| @@ -150,11 +150,12 @@ class ProductProcessController( | |||
| // 修复:返回正确的 DTO | |||
| return productProcessService.getLinesAsDto(entity.productProcess?.id!!).find { it.id == entity.id!! }!! | |||
| } | |||
| /* | |||
| @GetMapping("/demo/{id}") | |||
| fun demo(@PathVariable id: Long): ProductProcessInfo { | |||
| return productProcessService.productProcessDetailfindbyidtest(id) | |||
| } | |||
| */ | |||
| @GetMapping("/demo/joid/{joid}") | |||
| fun demojoid(@PathVariable joid: Long): List<ProductProcessInfo> { | |||
| return productProcessService.productProcessDetailfindbyjoid(joid) | |||
| @@ -117,7 +117,7 @@ data class JobOrderProcessLineDetailResponse( | |||
| val seqNo: Long?, | |||
| val name: String?, | |||
| val description: String?, | |||
| val equipment: String?, | |||
| val equipmentId: Long?, | |||
| val startTime: LocalDateTime?, | |||
| val endTime: LocalDateTime?, | |||