|
|
@@ -673,10 +673,14 @@ open class ProductionScheduleService( |
|
|
do.deleted = 0 and |
|
|
do.deleted = 0 and |
|
|
dol.itemId = items.id |
|
|
dol.itemId = items.id |
|
|
-- AND MONTH(do.estimatedArrivalDate) = MONTH(DATE_SUB(NOW(), INTERVAL 1 MONTH)) |
|
|
-- AND MONTH(do.estimatedArrivalDate) = MONTH(DATE_SUB(NOW(), INTERVAL 1 MONTH)) |
|
|
AND do.estimatedArrivalDate >= '2026-01-08' AND do.estimatedArrivalDate < '2026-01-31' |
|
|
|
|
|
|
|
|
AND do.estimatedArrivalDate >= '2026-02-07' AND do.estimatedArrivalDate < '2026-03-07' |
|
|
GROUP BY do.estimatedArrivalDate) AS d) AS avgQtyLastMonth, |
|
|
GROUP BY do.estimatedArrivalDate) AS d) AS avgQtyLastMonth, |
|
|
|
|
|
|
|
|
(select sum(reqQty) from job_order where bomId = bom.id and status != 'completed') AS pendingJobQty, |
|
|
(select sum(reqQty) from job_order where bomId = bom.id and status != 'completed') AS pendingJobQty, |
|
|
|
|
|
|
|
|
|
|
|
(select count(1) from coffee_or_tea where systemType = 'coffee' and itemCode = items.code) as isCoffee, |
|
|
|
|
|
(select count(1) from coffee_or_tea where systemType = 'tea' and itemCode = items.code) as isTea, |
|
|
|
|
|
(select count(1) from coffee_or_tea where systemType = 'lemon' and itemCode = items.code) as isLemon, |
|
|
|
|
|
|
|
|
CASE WHEN item_fake_onhand.onHandQty is not null THEN item_fake_onhand.onHandQty |
|
|
CASE WHEN item_fake_onhand.onHandQty is not null THEN item_fake_onhand.onHandQty |
|
|
ELSE inventory.onHandQty - 500 END AS stockQty, |
|
|
ELSE inventory.onHandQty - 500 END AS stockQty, |
|
|
@@ -727,7 +731,7 @@ open class ProductionScheduleService( |
|
|
LEFT JOIN inventory ON items.id = inventory.itemId |
|
|
LEFT JOIN inventory ON items.id = inventory.itemId |
|
|
left join item_fake_onhand on items.code = item_fake_onhand.itemCode |
|
|
left join item_fake_onhand on items.code = item_fake_onhand.itemCode |
|
|
WHERE 1 |
|
|
WHERE 1 |
|
|
and bom.itemId != 16771 |
|
|
|
|
|
|
|
|
-- and bom.itemId != 16771 |
|
|
) AS i |
|
|
) AS i |
|
|
WHERE 1 |
|
|
WHERE 1 |
|
|
and i.avgQtyLastMonth is not null |
|
|
and i.avgQtyLastMonth is not null |
|
|
@@ -751,8 +755,10 @@ open class ProductionScheduleService( |
|
|
daysLeft = (row["daysLeft"] as Number).toDouble() |
|
|
daysLeft = (row["daysLeft"] as Number).toDouble() |
|
|
batchNeed = row["batchNeed"] as Number |
|
|
batchNeed = row["batchNeed"] as Number |
|
|
priority = row["priority"] as Number |
|
|
priority = row["priority"] as Number |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
isCoffee = row["isCoffee"] as Number |
|
|
|
|
|
isTea = row["isTea"] as Number |
|
|
|
|
|
isLemon = row["isLemon"] as Number |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -837,10 +843,10 @@ open class ProductionScheduleService( |
|
|
//do for 9 days to predict |
|
|
//do for 9 days to predict |
|
|
for (i in 0..(days)) { |
|
|
for (i in 0..(days)) { |
|
|
val targetDate = produceAt.plusDays(i.toLong()) |
|
|
val targetDate = produceAt.plusDays(i.toLong()) |
|
|
val isSat = targetDate.dayOfWeek == DayOfWeek.SATURDAY |
|
|
|
|
|
val isFri = targetDate.dayOfWeek == DayOfWeek.FRIDAY |
|
|
|
|
|
|
|
|
|
|
|
val isSunday = targetDate.dayOfWeek == DayOfWeek.SUNDAY |
|
|
|
|
|
|
|
|
val dayOfWeek = targetDate.dayOfWeek |
|
|
|
|
|
val isSat = dayOfWeek == DayOfWeek.SATURDAY |
|
|
|
|
|
val isFri = dayOfWeek == DayOfWeek.FRIDAY |
|
|
|
|
|
val isSunday = dayOfWeek == DayOfWeek.SUNDAY |
|
|
val isFriSat = isFri || isSat |
|
|
val isFriSat = isFri || isSat |
|
|
|
|
|
|
|
|
println("##targetDate:" + targetDate + " isFri:"+ isFri + " isSat:" + isSat + " isSunday:" + isSunday) |
|
|
println("##targetDate:" + targetDate + " isFri:"+ isFri + " isSat:" + isSat + " isSunday:" + isSunday) |
|
|
@@ -849,6 +855,13 @@ open class ProductionScheduleService( |
|
|
fgCount = 0 |
|
|
fgCount = 0 |
|
|
accProdCount = 0.0 |
|
|
accProdCount = 0.0 |
|
|
sortedOutputList.forEach { record -> |
|
|
sortedOutputList.forEach { record -> |
|
|
|
|
|
// isCoffee > 0: only Mon, Wed, Fri; isTea > 0: only Tue, Thu, Sat; isLemon > 0: any day including Sunday |
|
|
|
|
|
val canProduceOnDay = when { |
|
|
|
|
|
(record.isLemon.toDouble()) > 0 -> true |
|
|
|
|
|
(record.isCoffee.toDouble()) > 0 -> dayOfWeek in listOf(DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) |
|
|
|
|
|
(record.isTea.toDouble()) > 0 -> dayOfWeek in listOf(DayOfWeek.TUESDAY, DayOfWeek.THURSDAY, DayOfWeek.SATURDAY) |
|
|
|
|
|
else -> !isSunday |
|
|
|
|
|
} |
|
|
if(i > 0) |
|
|
if(i > 0) |
|
|
record.stockQty = record.stockQty + (record.outputQty * record.needNoOfJobOrder.toInt()) - record.avgQtyLastMonth |
|
|
record.stockQty = record.stockQty + (record.outputQty * record.needNoOfJobOrder.toInt()) - record.avgQtyLastMonth |
|
|
else |
|
|
else |
|
|
@@ -870,8 +883,7 @@ open class ProductionScheduleService( |
|
|
if(record.daysLeft < redLine){ |
|
|
if(record.daysLeft < redLine){ |
|
|
record.needQty = (record.avgQtyLastMonth * safetyStockDay) - record.stockQty; |
|
|
record.needQty = (record.avgQtyLastMonth * safetyStockDay) - record.stockQty; |
|
|
|
|
|
|
|
|
if(!isSunday && record.needQty > 0.0){ |
|
|
|
|
|
//if(record.needQty > 0.0){ |
|
|
|
|
|
|
|
|
if(canProduceOnDay && record.needQty > 0.0){ |
|
|
record.batchNeed = ceil(record.needQty / record.outputQty) |
|
|
record.batchNeed = ceil(record.needQty / record.outputQty) |
|
|
record.needNoOfJobOrder = record.batchNeed |
|
|
record.needNoOfJobOrder = record.batchNeed |
|
|
|
|
|
|
|
|
@@ -987,6 +999,9 @@ open class ProductionScheduleService( |
|
|
open var daysLeft: Double = 0.0 |
|
|
open var daysLeft: Double = 0.0 |
|
|
open var batchNeed: Number = 0 |
|
|
open var batchNeed: Number = 0 |
|
|
open var priority: Number = 0 |
|
|
open var priority: Number = 0 |
|
|
|
|
|
open var isCoffee: Number = 0 |
|
|
|
|
|
open var isTea: Number = 0 |
|
|
|
|
|
open var isLemon: Number = 0 |
|
|
|
|
|
|
|
|
override fun toString(): String { |
|
|
override fun toString(): String { |
|
|
return "NeedQtyRecord(name=${name}," + |
|
|
return "NeedQtyRecord(name=${name}," + |
|
|
|