@@ -14,7 +14,6 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
""" | |||
select max(ps.scheduleAt) from ProductionSchedule ps | |||
where (:type is null or ps.type = :type) | |||
or ps.type = 'manual' | |||
""" | |||
) | |||
fun getLatestRoughScheduleAt(type: String?): LocalDateTime | |||
@@ -28,8 +27,9 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
ps.id, | |||
ps.deleted, | |||
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.totalFGType, | |||
ps.`type` | |||
@@ -38,6 +38,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
select * from prod | |||
where deleted = false | |||
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 (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | |||
and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | |||
@@ -51,8 +52,9 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
ps.id, | |||
ps.deleted, | |||
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.totalFGType, | |||
ps.`type` | |||
@@ -61,6 +63,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
select count(*) from prod | |||
where deleted = false | |||
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 (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) | |||
and (:totalEstProdCount is null or :totalEstProdCount = '' or totalEstProdCount = :totalEstProdCount) | |||
@@ -70,6 +73,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule, | |||
) | |||
fun findProdScheduleInfoByPage( | |||
scheduleAt: String?, | |||
// produceAt: String?, | |||
schedulePeriod: String?, | |||
schedulePeriodTo: String?, | |||
totalEstProdCount: Double?, | |||
@@ -31,6 +31,8 @@ import org.springframework.transaction.annotation.Transactional | |||
import java.lang.reflect.Type | |||
import java.math.BigDecimal | |||
import java.math.RoundingMode | |||
import java.time.DayOfWeek | |||
import java.time.LocalDate | |||
import java.time.LocalDateTime | |||
import java.time.format.DateTimeFormatter | |||
import kotlin.collections.component1 | |||
@@ -64,11 +66,23 @@ open class ProductionScheduleService( | |||
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> { | |||
val pageable = PageRequest.of(request.pageNum ?: 0, request.pageSize ?: 10); | |||
val response = productionScheduleRepository.findProdScheduleInfoByPage( | |||
scheduleAt = request.scheduleAt, | |||
// produceAt = request.produceAt, | |||
schedulePeriod = request.schedulePeriod, | |||
schedulePeriodTo = request.schedulePeriodTo, | |||
totalEstProdCount = request.totalEstProdCount, | |||
@@ -462,7 +476,6 @@ open class ProductionScheduleService( | |||
//用缺口決定生產順序 | |||
val productionPriorityMap: HashMap<ProductionScheduleRecord, Double> = HashMap(); | |||
//TODO: update to use SQL get shop order record for detailed scheduling (real prodQty and openBal) | |||
for (record in scheduledList) { | |||
println("Object - " + record.toString()); | |||
@@ -595,10 +608,11 @@ open class ProductionScheduleService( | |||
+ " LEFT JOIN bom b ON i.id = b.itemId " | |||
+ " WHERE ps.deleted = FALSE " | |||
+ " AND psl.deleted = FALSE " | |||
+ " AND ps.`type` = 'rough' " | |||
); | |||
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")) { | |||
sql.append(" AND i.name LIKE :name "); | |||
@@ -613,6 +627,7 @@ open class ProductionScheduleService( | |||
sql.append(" ORDER BY psl.assignDate, psl.itemPriority ASC "); | |||
print(sql) | |||
print(args.toString()) | |||
val resultList = jdbcDao.queryForList(sql.toString(), args); | |||
print(resultList) | |||
@@ -81,12 +81,15 @@ class ProductionScheduleController( | |||
// For test | |||
val genDate = request?.getParameter("genDate")?.let { LocalDate.parse(it).atStartOfDay() } | |||
println(request) | |||
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 finalAssignDate = if (assignDate.toInt() == 0) { | |||
@@ -94,8 +97,8 @@ class ProductionScheduleController( | |||
// } else assignDate.toInt() | |||
//TODO: update this to receive selectedDate and assignDate from schedule | |||
// 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 | |||
} catch (e: Exception) { | |||
throw RuntimeException("Error generate schedule: ${e.message}", e) | |||