@@ -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) | ||||