ドキュメント

View Categories

クライアント

3 min read

クライアントはGUI3を使ったSPAアプリケーションです。

Drogonクライアントと連携しRestAPIサーバーにリクエストを送受信します。

画面はヘッダー、コンテンツに分けて表示します。

カーソルホバー時に可能な操作の注釈を表示します。

左側はデータ操作、右側はシステム操作に分けています。

左側「仕訳帳」「補助簿」「総勘定元帳」「決算書」「適用」「勘定科目」

右側「錠」「集計」「年度選択」「新年度作成」「通知」「終了」

ヘッダー下にコンテンツは配置します。

編集可能なテーブルコンテンツを表示します。

クライアントのコンポーネントはGUI3を元に作成しています。詳細はそちらを確認ください。

Drogonクライアントを使用してHttpリクエストを送受信します。


Storeオブジェクトのプロパティを各コンポーネントで参照して全体の制御を行います。

rest_api_format_callback関数でStoreオブジェクトのcacheコンテナを更新します。このキャッシュ値に変更がある場合、関係するコンポーネントはデータを再取得します。

年度変更を行うとStoreオブジェクトのyearプロパティを更新しルートコンポーネントを再作成します。選択した年度でシステムの利用を再開します。

操作中の例外を捕捉してStoreオブジェクトのmessageコンテナに保存します。システム通知画面で表示します。

Storeオブジェクトのjournal_closed_idプロパティは選択中の締IDを保持します。このIDを元に元帳、決算書データを取得します。

一括処理系の操作をStoreオブジェクトのlock_bulk_updateプロパティで制御します。lock、unlockをヘッダの施錠解錠をクリックして制御します。

バッチサーバーから送られてきた状態をStoreオブジェクトのbatch_statusに保持します。

struct Store : public Share
  {
    std::string user = "user";
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::chrono::year_month_day today = std::chrono::floor<std::chrono::days>(now);
    unsigned int year = (today.month() > std::chrono::March) 
      ? (int)today.year() 
      : (int)today.year() - 1;
    unsigned int journal_closed_id = 0;
    bool refresh = false;
    bool notify = false;
    bool lock_bulk_update = true;
    std::list<spa::utils::Message> message;
    spa::format::batch::STATUS batch_status = spa::format::batch::STATUS::DISCONNECTED;
    std::string batch_message ="";

    Store() {
      cache["batchlogs"] = "";
      cache["account_items"] = "";
      cache["journal_descriptions"] = "";
      cache["journals"] = "";
      cache["journal_closed"] = "";
      cache["general_ledgers"] = "";
      cache["financial_statements"] = "";
      cache["bulk_update"] = "";
    }
    
    void recache() {
      journal_closed_id = 0;
      cache["batchlogs"] = "";
      cache["account_items"] = "";
      cache["journal_descriptions"] = "";
      cache["journals"] = "";
      cache["journal_closed"] = "";
      cache["general_ledgers"] = "";
      cache["financial_statements"] = "";
      cache["bulk_update"] = "";
      for (auto [id, val] : window)
        window[id] = false;
      refresh = false;
    }
  };


ヘッダクリックで表示中のテーブル操作ウィンドウを起動します。

選択した操作のコンテンツを表示します。

勘定科目テーブル操作画面のコンテンツ選択です。

操作なし、フォーム、フィルターで表示するコンテンツを分けています。

void AccountItemOperationPageComponent::configure()
{
  attach(window.get());
  window->attach(window_bg_layer.get());

  if (mod.store->page_main != spa::gui::page::MAIN::ACCOUNT_ITEMS)
    *operation_ptr = OPERATION::EMPTY;

  switch (*operation_ptr)
  {
  case OPERATION::EMPTY:
    close();
    break;
  case OPERATION::FORM:
    window_bg_layer->attach(account_item_form_template.get());
    open();
    break;
  case OPERATION::FILTER:
    window_bg_layer->attach(account_item_filter_template.get());
    open();
    break;
  default:
    break;
  }
}

テーブルコンテンツは取得したデータをページネーション付きで表示します。

選択中のページ番号から前後のページを順番にコルーチンを使用して初期化します。

ページ初期化のスケジューリングキュー作成関数create_queue_fc、初期化クラスconstructorとキューqueueを使って順番にページを初期化します。

  template<typename Format>
  TablePageCoro<Format> table_page_coro(
    std::unique_ptr<TablePageConstructor<Format>> constructor,
    std::queue<unsigned int>* queue,
    std::function<std::queue<unsigned int>(unsigned int)> create_queue_fc)
  {
    co_yield std::move(constructor);
    co_yield queue;
    co_yield create_queue_fc;
    while (!queue->empty())
    {
      unsigned int page_number = queue->front();
      queue->pop();
      co_yield page_number;
      co_await page_number;
    }
    co_yield true;
    co_return;
  }


作成したページは初期化クラスconstructorのgetメソッドから取得します。

  std::unique_ptr<TableScrollBoxComponent> get(unsigned int page_number)
  {
    return std::make_unique<TableScrollBoxComponent>(*page[page_number]);
  }


ページ番号入力にてページを指定した場合、キューqueueを再生成して優先的に指定ページからページの作成を行います。

  void request_construct_table(unsigned int page_number)
  {
    *handle.promise().queue = handle.promise().create_queue_fc(page_number);
  }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です