Установка статусов состояния дополнительных элементов изделий

Материал из ADGroupWiki
Перейти к навигации Перейти к поиску

Дополнительные элементы изделий имеют особые статусы, которыми тоже можно управлять посредством скриптов. На основании состояния готовности элементов можно устанавливать состояния для изделий. Ниже приведен пример кода.

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.