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