Изменение ProdRouteJob не влияет на WrkCtrCapRes или пересчитывает резервирование емкости
Я изменяю задания маршрута (ProdRouteJob) с оптимизированными данными из внешнего инструмента оптимизации. Измененные данные записываются с помощью простого класса axe и prodRouteJob.update(). Проблема в том, что резервирование емкости (WrkCtrCapRes) не будет обновлено. Можно ли пересчитать резервирование емкости? Или создать новые возможности бронирования?
2 ответа
Единственное место, где WrkCtrCapRes
обновляется в WrkCtrJobData.updateCapacityReservations()
метод. Класс WrkCtrJobData
требует WrkCtrScheduleJobs
и другие глубокие сложности.
ProdRouteJob
не обладает достаточными знаниями для обновления резервирования мощностей, необходимо будет принять во внимание календарь.
Я сделал следующий метод, чтобы сделать подобное обновление. Он не поддерживает "Базовый календарь", но в остальном сделал то, что мне было нужно.
Hours updateWrkCtrCapRes(ProdRouteJob prodRouteJob, WrkCtrTable wrkCtrTable = WrkCtrTable::find(prodRouteJob.WrkCtrId))
{
WrkCtrCapRes wrkCtrCapRes;
WorkCalendarDateLine workCalendarDateLine;
Seconds sec;
delete_from wrkCtrCapRes
where wrkCtrCapRes.RefType == WrkCtrCapRefType::Production &&
wrkCtrCapRes.RefId == prodRouteJob.ProdId &&
wrkCtrCapRes.OprNum == prodRouteJob.OprNum &&
wrkCtrCapRes.OprPriority == prodRouteJob.OprPriority &&
wrkCtrCapRes.JobId == prodRouteJob.JobId;
wrkCtrCapRes.ReqPlanId = ReqPlanSched::defaultDynamicId();
wrkCtrCapRes.LoadType = WrkCtrCapacityType::JobSched;
wrkCtrCapRes.RefType = WrkCtrCapRefType::Production;
wrkCtrCapRes.RefId = prodRouteJob.ProdId;
wrkCtrCapRes.OprNum = prodRouteJob.OprNum;
wrkCtrCapRes.OprPriority = prodRouteJob.OprPriority;
wrkCtrCapRes.JobType = prodRouteJob.JobType;
wrkCtrCapRes.JobId = prodRouteJob.JobId;
wrkCtrCapRes.Locked = prodRouteJob.Locked;
wrkCtrCapRes.WrkCtrGroupId = wrkCtrTable.WrkCtrGroupId;
wrkCtrCapRes.WrkCtrId = wrkCtrTable.WrkCtrId;
wrkCtrCapRes.WrkCtrLoadPct = 100.0;
while select workCalendarDateLine
where workCalendarDateLine.CalendarId == wrkCtrTable.CalendarId &&
workCalendarDateLine.TransDate >= prodRouteJob.FromDate &&
workCalendarDateLine.TransDate <= prodRouteJob.ToDate
{
if (workCalendarDateLine.TransDate == prodRouteJob.FromDate)
workCalendarDateLine.FromTime = max(workCalendarDateLine.FromTime, prodRouteJob.FromTime);
if (workCalendarDateLine.TransDate == prodRouteJob.ToDate)
workCalendarDateLine.ToTime = min(workCalendarDateLine.ToTime, prodRouteJob.ToTime);
if (workCalendarDateLine.FromTime < workCalendarDateLine.ToTime)
{
wrkCtrCapRes.TransDate = workCalendarDateLine.TransDate;
wrkCtrCapRes.StartTime = workCalendarDateLine.FromTime;
wrkCtrCapRes.EndTime = workCalendarDateLine.ToTime;
wrkCtrCapRes.WrkCtrSec = wrkCtrCapRes.EndTime - wrkCtrCapRes.StartTime;
wrkCtrCapRes.insert();
sec += wrkCtrCapRes.WrkCtrSec;
}
}
return decRound(sec / 3600.0, 5);
}
Я просто добавил этот метод:
static void ProdSchedule(ProdId _ProdId)
{
ProdTableType ProdTableType;
ProdTable ProdTable=ProdTable::find(_ProdId);
ProdParmScheduling ProdParmScheduling;
;
ProdTableType=new ProdTableType(ProdTable);
ProdParmScheduling = ProdParmScheduling::findLast(_ProdId,ProdSchedMethod::JobScheduling); ProdTableType.runJobScheduling(ProdParmScheduling);
}