Изменение ProdRouteJob не влияет на WrkCtrCapRes или перерасчет резервирования емкости - PullRequest
1 голос
/ 28 ноября 2011

Я изменяю задания маршрута (ProdRouteJob) с оптимизированными данными из внешнего инструмента оптимизации.Измененные данные записываются с помощью простого класса axe и prodRouteJob.update ().Проблема в том, что резервирование емкости (WrkCtrCapRes) не будет обновлено.Можно ли пересчитать резервирование емкости?Или создать резервирование новых мощностей?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Единственное место, где обновляется 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);
}
1 голос
/ 08 мая 2014

Я просто добавил этот метод:

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); 
}
...