## 担当業務
- 医療情報の管理規格であるFHIRというシステムから並列に情報を取り出す処理
- 開発で扱うCLIの作成
- gqlgenの各種リゾルバー(CRUD)
- Auth0からCognitoへの移行
- Excelizeを利用しテンプレート用エクセルの内容を健診結果で置き換え、PDFに変換する処理
## 担当業務の詳細
- CLIツール
ログイン用のダミーアカウントを生成するツールやgo-gimei、gofakeit、xoを組み合わせた簡易fakerツールを作りました。
その他改善としてDBデータのマッピングに使う型をDBで定義済みのテーブル情報を利用して自動生成する処理を作成しました。
これにより、プロジェクト開始初期で頻発していた匿名の構造体(変数定義と同時に構造体も記載する書き方)によるばらつきを防ぐことができ、テーブルの変更にも柔軟に対応できるようになりました。
(以下、自分の環境でテストして動かしたサンプルコード)
https://gist.github.com/taka1156/b9fa15bcde347ab3e671e0db514aaec0
- 帳票生成
こちらは、Excelizeとos/execを利用した処理です。
こちらで行う利点としては、リッチテキストを利用して検診結果のランクや基準値以上のものには色をつけられるというのがありました。
また、先ほどのもの含めExcelのルールの定義などでユーザー側が簡単に指定でき、today()などのExcel関数を利用して生成日を表示する、ロゴ画像を挿入するなど柔軟性を保ちつつ作成することができています。
実装を具体的に記載すると
DBに保存された健診データや顧客、健診コースなどの情報を用いて置換対象データ(map)を作成し、ユーザーがS3にアップロードしたExcelテンプレートのシート内を走査し、セルに記載されたキーとmapデータを照らし合わせながら、置換するという処理がメインになります。
その後、libreOfficeのヘッドレスモードとgoのos/execという標準モジュールを利用してcliをプログラムから実行してpdfに変換します。
pdf変換後このデータは、S3にアップロードされ、特定のユーザーが見れるようになるというような流れです。
こちらは、オプションとして前回、前々回などの健診回数や矯正視力などの表示に使うカッコの有無が存在し、データ長(key+オプション)にばらつきがあるという仕様がありました。
その解決方法として、keyとして利用する部分(健診種別番号、回数など)はそのまま使い、別でオプション用の構造体を用意し、セル内のデータを適切にパースして、代入することで対応しました。
また、オプションは、最大データ長、最小データ長ごとに複数のパース処理を用意しておいて、省略して定義された時にも対応できるようにしました。
※ 構造体にした理由は、関連が近いデータをまとめて扱えて、マップやスライスとは違い、省略されても明示的にデータを定義、参照ができることと、デフォルトでゼロ値設定がされてるため参照エラーなどのミスが起こりにくいと考えたためです。仮に参照されても有効にならない点も考慮しました。