| @@ -14,7 +14,6 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| """ | """ | ||||
| select max(ps.scheduleAt) from ProductionSchedule ps | select max(ps.scheduleAt) from ProductionSchedule ps | ||||
| where (:type is null or ps.type = :type) | where (:type is null or ps.type = :type) | ||||
| or ps.type = 'manual' | |||||
| """ | """ | ||||
| ) | ) | ||||
| fun getLatestRoughScheduleAt(type: String?): LocalDateTime | fun getLatestRoughScheduleAt(type: String?): LocalDateTime | ||||
| @@ -28,8 +27,9 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| ps.id, | ps.id, | ||||
| ps.deleted, | ps.deleted, | ||||
| ps.scheduleAt, | ps.scheduleAt, | ||||
| date_add(ps.scheduleAt, interval 7 + 4 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriod, | |||||
| date_add(ps.scheduleAt, interval 7 + 4 + 6 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriodTo, | |||||
| -- ps.produceAt, | |||||
| date_add(ps.scheduleAt, interval 7 + 1 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriod, | |||||
| date_add(ps.scheduleAt, interval 7 + 1 + 6 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriodTo, | |||||
| ps.totalEstProdCount, | ps.totalEstProdCount, | ||||
| ps.totalFGType, | ps.totalFGType, | ||||
| ps.`type` | ps.`type` | ||||
| @@ -38,6 +38,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| select * from prod | select * from prod | ||||
| where deleted = false | where deleted = false | ||||
| and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) | and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) | ||||
| -- and (:produceAt = '' or datediff(produceAt, coalesce(:produceAt, produceAt)) = 0) | |||||
| and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) | and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) | ||||
| and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | ||||
| and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | ||||
| @@ -51,8 +52,9 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| ps.id, | ps.id, | ||||
| ps.deleted, | ps.deleted, | ||||
| ps.scheduleAt, | ps.scheduleAt, | ||||
| date_add(ps.scheduleAt, interval 7 + 4 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriod, | |||||
| date_add(ps.scheduleAt, interval 7 + 4 + 6 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriodTo, | |||||
| -- ps.produceAt, | |||||
| date_add(ps.scheduleAt, interval 7 + 1 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriod, | |||||
| date_add(ps.scheduleAt, interval 7 + 1 + 6 - if(weekday(ps.scheduleAt) = 6, 0, weekday(ps.scheduleAt) + 1) day) as schedulePeriodTo, | |||||
| ps.totalEstProdCount, | ps.totalEstProdCount, | ||||
| ps.totalFGType, | ps.totalFGType, | ||||
| ps.`type` | ps.`type` | ||||
| @@ -61,6 +63,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| select count(*) from prod | select count(*) from prod | ||||
| where deleted = false | where deleted = false | ||||
| and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) | and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) | ||||
| -- and (:produceAt = '' or datediff(produceAt, coalesce(:produceAt, produceAt)) = 0) | |||||
| and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) | and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) | ||||
| and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | ||||
| and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | ||||
| @@ -70,6 +73,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||||
| ) | ) | ||||
| fun findProdScheduleInfoByPage( | fun findProdScheduleInfoByPage( | ||||
| scheduleAt: String?, | scheduleAt: String?, | ||||
| // produceAt: String?, | |||||
| schedulePeriod: String?, | schedulePeriod: String?, | ||||
| schedulePeriodTo: String?, | schedulePeriodTo: String?, | ||||
| totalEstProdCount: Double?, | totalEstProdCount: Double?, | ||||
| @@ -31,6 +31,8 @@ import org.springframework.transaction.annotation.Transactional | |||||
| import java.lang.reflect.Type | import java.lang.reflect.Type | ||||
| import java.math.BigDecimal | import java.math.BigDecimal | ||||
| import java.math.RoundingMode | import java.math.RoundingMode | ||||
| import java.time.DayOfWeek | |||||
| import java.time.LocalDate | |||||
| import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
| import java.time.format.DateTimeFormatter | import java.time.format.DateTimeFormatter | ||||
| import kotlin.collections.component1 | import kotlin.collections.component1 | ||||
| @@ -64,11 +66,23 @@ open class ProductionScheduleService( | |||||
| return productionScheduleRepository.getLatestRoughScheduleAt(type) | return productionScheduleRepository.getLatestRoughScheduleAt(type) | ||||
| } | } | ||||
| open fun getScheduledAtByDate(inputDate: LocalDate): LocalDate { | |||||
| val daysToSubtract = when (inputDate.dayOfWeek) { | |||||
| DayOfWeek.WEDNESDAY -> 7 | |||||
| else -> (inputDate.dayOfWeek.value + 7 - DayOfWeek.WEDNESDAY.value) % 7 | |||||
| } | |||||
| val lastWednesday = inputDate.minusDays(daysToSubtract.toLong()) | |||||
| return lastWednesday; | |||||
| } | |||||
| open fun allProdSchedulesByPage(request: SearchProdScheduleRequest): RecordsRes<ProdScheduleInfo> { | open fun allProdSchedulesByPage(request: SearchProdScheduleRequest): RecordsRes<ProdScheduleInfo> { | ||||
| val pageable = PageRequest.of(request.pageNum ?: 0, request.pageSize ?: 10); | val pageable = PageRequest.of(request.pageNum ?: 0, request.pageSize ?: 10); | ||||
| val response = productionScheduleRepository.findProdScheduleInfoByPage( | val response = productionScheduleRepository.findProdScheduleInfoByPage( | ||||
| scheduleAt = request.scheduleAt, | scheduleAt = request.scheduleAt, | ||||
| // produceAt = request.produceAt, | |||||
| schedulePeriod = request.schedulePeriod, | schedulePeriod = request.schedulePeriod, | ||||
| schedulePeriodTo = request.schedulePeriodTo, | schedulePeriodTo = request.schedulePeriodTo, | ||||
| totalEstProdCount = request.totalEstProdCount, | totalEstProdCount = request.totalEstProdCount, | ||||
| @@ -462,7 +476,6 @@ open class ProductionScheduleService( | |||||
| //用缺口決定生產順序 | //用缺口決定生產順序 | ||||
| val productionPriorityMap: HashMap<ProductionScheduleRecord, Double> = HashMap(); | val productionPriorityMap: HashMap<ProductionScheduleRecord, Double> = HashMap(); | ||||
| //TODO: update to use SQL get shop order record for detailed scheduling (real prodQty and openBal) | //TODO: update to use SQL get shop order record for detailed scheduling (real prodQty and openBal) | ||||
| for (record in scheduledList) { | for (record in scheduledList) { | ||||
| println("Object - " + record.toString()); | println("Object - " + record.toString()); | ||||
| @@ -595,10 +608,11 @@ open class ProductionScheduleService( | |||||
| + " LEFT JOIN bom b ON i.id = b.itemId " | + " LEFT JOIN bom b ON i.id = b.itemId " | ||||
| + " WHERE ps.deleted = FALSE " | + " WHERE ps.deleted = FALSE " | ||||
| + " AND psl.deleted = FALSE " | + " AND psl.deleted = FALSE " | ||||
| + " AND ps.`type` = 'rough' " | |||||
| ); | ); | ||||
| if (args.containsKey("selectedDate")) { | if (args.containsKey("selectedDate")) { | ||||
| sql.append(" AND DATE(ps.scheduleAt) LIKE DATE(:selectedDate) AND ps.id = (select max(ps1.id) from production_schedule ps1 where DATE(ps1.scheduleAt) LIKE DATE(:selectedDate))"); | |||||
| sql.append(" AND DATE(ps.scheduleAt) LIKE DATE(:selectedDate) AND ps.id = (select max(ps1.id) from production_schedule ps1 where DATE(ps1.scheduleAt) LIKE DATE(:selectedDate) AND ps1.`type` = 'rough') "); | |||||
| } | } | ||||
| if (args.containsKey("name")) { | if (args.containsKey("name")) { | ||||
| sql.append(" AND i.name LIKE :name "); | sql.append(" AND i.name LIKE :name "); | ||||
| @@ -613,6 +627,7 @@ open class ProductionScheduleService( | |||||
| sql.append(" ORDER BY psl.assignDate, psl.itemPriority ASC "); | sql.append(" ORDER BY psl.assignDate, psl.itemPriority ASC "); | ||||
| print(sql) | print(sql) | ||||
| print(args.toString()) | |||||
| val resultList = jdbcDao.queryForList(sql.toString(), args); | val resultList = jdbcDao.queryForList(sql.toString(), args); | ||||
| print(resultList) | print(resultList) | ||||
| @@ -81,12 +81,15 @@ class ProductionScheduleController( | |||||
| // For test | // For test | ||||
| val genDate = request?.getParameter("genDate")?.let { LocalDate.parse(it).atStartOfDay() } | val genDate = request?.getParameter("genDate")?.let { LocalDate.parse(it).atStartOfDay() } | ||||
| println(request) | |||||
| val today = LocalDateTime.now() | val today = LocalDateTime.now() | ||||
| val latestRoughScheduleAt = productionScheduleService.getLatestScheduleAt("rough") | |||||
| // assume schedule period is thursday to wednesday | |||||
| val assignDate = ((genDate ?: today).dayOfWeek.value + 3) % 7 + 1 | |||||
| val latestRoughScheduleAt = productionScheduleService.getLatestScheduleAt("rough"); | |||||
| // val latestRoughScheduleAt = productionScheduleService.getSecondLatestRoughScheduleAt("rough"); | |||||
| // val latestRoughScheduleAt = productionScheduleService.getScheduledAtByDate(genDate?.toLocalDate() ?: today.toLocalDate()); | |||||
| // assume schedule period is monday to sunday | |||||
| val assignDate = (genDate ?: today).dayOfWeek.value | |||||
| // val day = 1 | |||||
| // val assignDate = ((genDate ?: today).dayOfWeek.value + day) % 7 + 1 | |||||
| // val assignDate = abs(Duration.between(latestRoughScheduleAt, today).toDays() % 7) + 1 | // val assignDate = abs(Duration.between(latestRoughScheduleAt, today).toDays() % 7) + 1 | ||||
| // val finalAssignDate = if (assignDate.toInt() == 0) { | // val finalAssignDate = if (assignDate.toInt() == 0) { | ||||
| @@ -94,8 +97,8 @@ class ProductionScheduleController( | |||||
| // } else assignDate.toInt() | // } else assignDate.toInt() | ||||
| //TODO: update this to receive selectedDate and assignDate from schedule | //TODO: update this to receive selectedDate and assignDate from schedule | ||||
| // productionScheduleService.generateDetailedScheduleByDay(1, LocalDateTime.of(2025,6,25,0,0,0)) | // productionScheduleService.generateDetailedScheduleByDay(1, LocalDateTime.of(2025,6,25,0,0,0)) | ||||
| println("genDate: $genDate | today: $today | latestRoughScheduleAty: $latestRoughScheduleAt | assignDate: $assignDate ") | |||||
| productionScheduleService.generateDetailedScheduleByDay(assignDate, genDate ?: LocalDateTime.now()) | |||||
| println("genDate: $genDate | today: $today | latestRoughScheduleAt: $latestRoughScheduleAt | assignDate: $assignDate ") | |||||
| productionScheduleService.generateDetailedScheduleByDay(assignDate, latestRoughScheduleAt ?: LocalDateTime.now()) | |||||
| return 200 | return 200 | ||||
| } catch (e: Exception) { | } catch (e: Exception) { | ||||
| throw RuntimeException("Error generate schedule: ${e.message}", e) | throw RuntimeException("Error generate schedule: ${e.message}", e) | ||||