Установка статусов состояния дополнительных элементов изделий
Перейти к навигации
Перейти к поиску
Дополнительные элементы изделий имеют особые статусы, которыми тоже можно управлять посредством скриптов. На основании состояния готовности элементов можно устанавливать состояния для изделий. Ниже приведен пример кода.
uses SysUtils, Shared;
var
g_dsr: TDopolnenieStateRec; // объект статуса в котором будем менять состояние
procedure UpdateKonState(zk_id, izd_id, okpi_num, state_id: integer);
// обновляет состояние state_id изделия
var
zk: TZakaz; // заказ
izd: TIzdTyp; // конструкция
okpi: TOneKonProcessItem; // изделие
ws: TZakazStateRec;
flag, need_update: boolean;
begin
// умеем менять только статусы с такими номерами
if not ((state_id = 9) or (state_id = 16)) then
exit;
zk := gd.Zakazes.Items.GetById(zk_id); // получаем объект заказа по идентификатору
if assigned(zk) then // если заказ найден
begin
gd.Zakazes.ReloadNew2(zk, true);
// загружаем заказ полностью из базы (во избежание потери некоторых данных из него)
izd := zk.Izd.Items.GetById(izd_id); // получаем объект конструкции
if assigned(izd) then // если конструкция получена
begin
okpi := izd.OneKonProcessItems.GetByNum(okpi_num); // получаем информацию об изделии
if assigned(okpi) then // если изделие есть
begin
case state_id of // устанавливаем флаг готовности всех элементов рассматриваемого этапа
9: flag := izd.DopolnenieSteklIsProduced(okpi.Id); // остекление готово
16: flag := izd.DopolnenieIsProduced(okpi.Id); // дополнительные элементы готовы
end;
need_update := false; // флаг необходимости обновления заказа в базе
ws := okpi.KonState.GetById(state_id); // получаем текущее состояние этапа
case ws.StateNew of // в зависимости от текущего состояния этапа
0, 1, 2: // <нет>, "нужен", "в работе"
begin
if flag then // в случае готовности
begin
okpi.KonState.SetStateById(state_id, 3);
// устанавливаем состояние "выполнен" для всего изделия
need_update := true;
end;
end;
3: // "выполнен"
begin
if not flag then // в случае НЕготовности
begin
okpi.KonState.SetStateById(state_id, 2);
// делаем откат из состояния "выполнен" до состояния "в работе"
need_update := true;
end;
end;
end;
if need_update then // если были внесены изменения и требуется обновление заказа
gd.Zakazes.Items.Update(zk); // обновляем
end;
end;
end;
end;
procedure GetDop(zk_id, izd_id, okpi_num, IdDop: integer; var item: TDopolnenieStateRec);
// получение записи статусов для элемента изделия по его IdDop
var
zk: TZakaz; // заказ
izd: TIzdTyp; // конструкция
okpi: TOneKonProcessItem; // изделие
begin
zk := gd.Zakazes.Items.GetById(zk_id); // получаем объект заказа по идентификатору
if assigned(zk) then // если заказ найден
begin
gd.Zakazes.ReloadNew2(zk, true);
// загружаем заказ полностью из базы (во избежание потери некоторых данных из него)
izd := zk.Izd.Items.GetById(izd_id); // получаем объект конструкции
if assigned(izd) then // если конструкция получена
begin
okpi := izd.OneKonProcessItems.GetByNum(okpi_num); // получаем информацию об изделии
if assigned(okpi) then // если изделие есть
begin
if okpi.KonState.IdDopToNum(IdDop)>=0 then // если информация о статусах есть
begin
item := okpi.KonState.GetByIdDopT(IdDop); // по id дополнения получаем его статусы
end else
begin
item := okpi.KonState.AddDopolnenieState(IdDop); // в противном случае создаем для дополнения с указанным IdDop пустые статусы
gd.Zakazes.Items.Update(zk);
end;
end;
end;
end;
end;
procedure SetDop(zk_id, izd_id, okpi_num, IdDop: integer; item: TDopolnenieStateRec);
// устанавливает для элемента изделия с IdDop статусы
var
zk: TZakaz; // заказ
izd: TIzdTyp; // конструкция
okpi: TOneKonProcessItem; // изделие
begin
zk := gd.Zakazes.Items.GetById(zk_id); // получаем объект заказа по идентификатору
if assigned(zk) then // если заказ найден
begin
gd.Zakazes.ReloadNew2(zk, true);
// загружаем заказ полностью из базы (во избежание потери некоторых данных из него)
izd := zk.Izd.Items.GetById(izd_id); // получаем объект конструкции
if assigned(izd) then // если конструкция получена
begin
okpi := izd.OneKonProcessItems.GetByNum(okpi_num); // получаем информацию об изделии
if assigned(okpi) then // если изделие есть
begin
okpi.KonState.SetByIdDopT(IdDop, item); // по id дополнения устанавливаем его статусы
gd.Zakazes.Items.Update(zk); // обновляем заказ в базе
UpdateKonState(zk_id, izd_id, okpi_num, 9); // обновляем статус остекления
UpdateKonState(zk_id, izd_id, okpi_num, 16); // обновляем статус готовности дополнительных элементов
end;
end;
end;
end;
begin
GetDop(1, 2, 0, 2, g_dsr);
g_dsr.Produced := true;
g_dsr.ProducedDate := now;
SetDop(1, 2, 0, 2, g_dsr);
end.