private void InitializeMasterConverter(MasterVersion masterVersion)
        {
            傷病名Converter.Instance.傷病名Dict   = this.Read傷病名(masterVersion);
            傷病名Converter.Instance.修飾語Dict   = this.Read修飾語(masterVersion);
            コメントConverter.Instance.コメントDict = this.Readコメント(masterVersion);

            var 診療行為List = this.Read診療行為(masterVersion);

            DictConverter.診療行為Instance((int)masterVersion).Dict = 診療行為List.ToDictionary(x => x.Id, x => x.称);
            DictConverter.診療行為単位Instance.Dict = 診療行為List.ToDictionary(x => x.Id, x => x.単位);
            var 医薬品List = this.Read医薬品(masterVersion);

            DictConverter.医薬品Instance((int)masterVersion).Dict = 医薬品List.ToDictionary(x => x.Id, x => x.称);
            DictConverter.医薬品単位Instance.Dict = 医薬品List.ToDictionary(x => x.Id, x => x.単位);
            var 特定器材List = this.Read特定器材(masterVersion);

            DictConverter.特定器材Instance((int)masterVersion).Dict = 特定器材List.ToDictionary(x => x.Id, x => x.称);
            DictConverter.特定器材単位Instance.Dict = 特定器材List.ToDictionary(x => x.Id, x => x.単位);
        }
예제 #2
0
 public override string Convert(int 診療年月, string レコード識別情報, object 内容, object parameter)
 {
     if (レコード識別情報 == レコード識別情報定数.診療行為)
     {
         return(DictConverter.診療行為Instance(診療年月).Convert((int)内容, parameter));
     }
     else if (レコード識別情報 == レコード識別情報定数.医薬品)
     {
         return(DictConverter.医薬品Instance(診療年月).Convert((int)内容, parameter));
     }
     else if (レコード識別情報 == レコード識別情報定数.特定器材)
     {
         return(DictConverter.特定器材Instance(診療年月).Convert((int)内容, parameter));
     }
     else if (レコード識別情報 == レコード識別情報定数.コメント)
     {
         var tuple = (Tuple <int, string>)内容;
         return(コメントConverter.Instance.Convert(tuple.Item1, tuple.Item2, parameter));
     }
     else
     {
         return(string.Empty);
     }
 }
예제 #3
0
        public override string Convert(int コメントコード, string 文字データ, object parameter)
        {
            var x = this.Find(コメントコード);

            // TODO: コメントパターンについては10/20/30/40/90以外の資料が見当たらない。
            // 他のコメントパターンはとりあえず↓のorcaの資料を参考にして作っている。
            // https://ftp.orca.med.or.jp/pub/data/receipt/outline/update/improvement/pdf/2020comment-2020-06-30.pdf

            // 自由入力の文字データを定型コメント文と区別するために表示を変える。
            Func <string, string> 文字データの表示 = s => string.Format("※{0}", s);

            if (x.パターン == 10)
            {
                // 10: 症状の説明等、任意の文字列情報を記録する。
                return(文字データの表示(文字データ));
            }
            else if (x.パターン == 20)
            {
                // 20: 定型のコメント文を設定する。
                return(x.漢字名称);
            }
            else if (x.パターン == 30)
            {
                // 30: 定型のコメント文に、一部の文字列情報を記録する。
                //
                return(x.漢字名称 + 文字データの表示(文字データ));
            }
            else if (x.パターン == 31)
            {
                // 31: 定型のコメント文に、診療行為を記載する。
                var 診療行為名 = string.Empty;
                if (int.TryParse(StringUtil.ZenToHan(文字データ), out int 診療行為コード))
                {
                    // TODO: マスターバージョン指定が必要。面倒なので最新版。
                    診療行為名 = DictConverter.診療行為Instance(99999).Convert(診療行為コード, null);
                }

                if (string.IsNullOrEmpty(診療行為名))
                {
                    return(x.漢字名称 + ";" + 文字データの表示(文字データ));  // 妥協して元の文字列を返す。
                }
                else
                {
                    return(x.漢字名称 + ";" + 診療行為名);
                }
            }
            else if (x.パターン == 40)
            {
                // 40: 定型のコメント文に、一部の数字情報を記録する。
                var result   = x.漢字名称;
                var tmp文字データ = 文字データ;

                foreach (var カラム位置桁数 in x.カラム位置桁数)
                {
                    var 文字足りない = カラム位置桁数.Item2 - tmp文字データ.Length;
                    if (0 < 文字足りない)
                    {
                        // 桁数分ゼロ埋めまたは空白埋めしていないレセコン対策
                        // コメントマスターは全角なので、全角スペースで問題ない。
                        tmp文字データ = new string(' ', 文字足りない) + tmp文字データ;
                    }

                    var rep = tmp文字データ.Substring(0, カラム位置桁数.Item2);

                    var idxカラム位置 = カラム位置桁数.Item1 - 1;
                    result = result.Substring(0, idxカラム位置) + rep + result.Substring(idxカラム位置 + カラム位置桁数.Item2);

                    // 置き換えが済んだ文字データは削除しておく。
                    tmp文字データ = tmp文字データ.Substring(カラム位置桁数.Item2);
                }

                return(result);
            }
            else if (x.パターン == 42)
            {
                // 42: 定型のコメント文に、実施回数や検査値など数値を記載する。
                // 30との違いは、30は定型文に「;」が既についている模様。
                return(x.漢字名称 + ";" + 文字データの表示(文字データ));
            }
            else if (x.パターン == 50)
            {
                // 50: コメント内容に年月日を記載する。
                var split = StringUtil.ZenToHan(文字データ).Split(new char[] { ' ', ' ', }, StringSplitOptions.RemoveEmptyEntries);
                if (split.Length == 1)
                {
                    if (int.TryParse(split[0], out int ymd))
                    {
                        var showDate = DateUtil.ReceiptDateToShowDate(ymd);
                        if (!string.IsNullOrEmpty(showDate))
                        {
                            return(x.漢字名称 + ";" + showDate);
                        }
                    }
                }
                else if (split.Length == 3)
                {
                    if (int.TryParse(split[0], out int y) &&
                        int.TryParse(split[1], out int m) &&
                        int.TryParse(split[2], out int d))
                    {
                        var ymd      = (y * 10000) + (m * 100) + d;
                        var showDate = DateUtil.ReceiptDateToShowDate(ymd);
                        if (!string.IsNullOrEmpty(showDate))
                        {
                            return(x.漢字名称 + ";" + showDate);
                        }
                    }
                }
                return(x.漢字名称 + ";" + 文字データの表示(文字データ));
            }
            else if (x.パターン == 51)
            {
                // 51: コメント内容に時刻を記載する。
                var split = StringUtil.ZenToHan(文字データ).Split(new char[] { ' ', ' ', }, StringSplitOptions.RemoveEmptyEntries);
                if (split.Length == 2)
                {
                    if (int.TryParse(split[0], out int h) &&
                        int.TryParse(split[1], out int m))
                    {
                        var time = string.Format("{0}時{1}分", h, m);
                        return(x.漢字名称 + ";" + time);
                    }
                }
                return(x.漢字名称 + ";" + 文字データの表示(文字データ));
            }
            else if (x.パターン == 52)
            {
                // 52: コメント内容に時間(分単位)を記載する。
                if (int.TryParse(StringUtil.ZenToHan(文字データ), out int m))
                {
                    return(x.漢字名称 + ";" + m + "分");
                }
                else
                {
                    return(x.漢字名称 + ";" + 文字データの表示(文字データ));
                }
            }
            else if (x.パターン == 90)
            {
                // 90: 処置、手術及び画像診断等を行った部位を、修飾語(部位)コードを使用して記録する。
                return("(未実装)" + 文字データの表示(文字データ));
            }
            else
            {
                return(コメントコード.ToString() + ";" + 文字データの表示(文字データ));
            }
        }