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

Material from ADGroupWiki
Go to navigation Go to search

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

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.