Встановлення статусів стану додаткових елементів виробів

Матеріал з 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.