    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.report;
    017
    018import java.util.Arrays;
    019
    020import org.opengion.fukurou.db.ConnectionFactory;
    021import org.opengion.fukurou.db.DBFunctionName;
    022import org.opengion.fukurou.db.DBUtil;
    023import org.opengion.fukurou.db.Transaction;
    024import org.opengion.fukurou.db.TransactionReal;
    025import org.opengion.fukurou.mail.MailTX ;
    026import org.opengion.fukurou.util.ApplicationInfo;
    027import org.opengion.fukurou.util.LogWriter;
    028import org.opengion.fukurou.util.StringUtil;
    029import org.opengion.hayabusa.common.HybsSystem;
    030
    031/**
    032 * 帳票要求テーブル(GE50)と、エラーテーブル(GE56)に対して、データ書込みを行います。
    033 *
    034 * このクラスでは、４つの機能を実装しています。
    035 *
    036 * ●要求番号採番機能： makeYkno()
    037 *   新たな要求番号を採番します(シーケンスより取得)
    038 *   採番後、内部の要求番号(ykno)もこの値に再セットされます。
    039 * ●帳票要求テーブルデータセット機能： insertGE50( final String fgkan )
    040 *   内部変数にセットされている値を利用して、データ登録を行います。
    041 *   繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、
    042 *   このメソッドを呼び出してください。
    043 *   なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    044 * ●完成フラグ設定機能： updateGE50( final String fgkan )
    045 *   内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    046 *   なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    047 * ●エラーメッセージ登録機能： insertErrorGE56( final String inErrMsg )
    048 *   エラー発生時に、エラーメッセージを登録します。
    049 *   内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    050 *   なお、このメソッドは、要求テーブルの完成フラグは、なにもしませんので、
    051 *   完成フラグ設定機能と併用してください。
    052 *   また、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
    053 *   ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
    054 *   がすべて設定されている場合に、エラー情報のメール送信を行います。
    055 *
    056 * @og.rev 3.8.0.0 (2005/06/07) 新規追加
    057 * @og.group 帳票システム
    058 *
    059 * @version  4.0
    060 * @author   Kazuhiko Hasegawa
    061 * @since    JDK5.0,
    062 */
    063public class GE50Access {
    064        /** 完成フラグのフラグ定義(登録) {@value} */
    065        public static final String FG_SET  = "1";       // 登録
    066        /** 完成フラグのフラグ定義(済み) {@value} */
    067        public static final String FG_OK   = "2";       // 済み
    068        /** 完成フラグのフラグ定義(実行中) {@value} */
    069        public static final String FG_RUN  = "3";       // 実行中
    070        /** 完成フラグのフラグ定義(手動) {@value} */
    071        public static final String FG_HAND = "4";       // 手動
    072        /** 完成フラグのフラグ定義(印刷待ち) {@value} */
    073        public static final String FG_WAIT = "5";       // 印刷待ち
    074        /** 完成フラグのフラグ定義(取込済) {@value} */
    075        public static final String FG_DBIN = "6";       // 取込済  Ver 3.8.0.0
    076        /** 完成フラグのフラグ定義(デーモンエラー) {@value} */
    077        public static final String FG_ERR1 = "7";       // デーモンエラー
    078        /** 完成フラグのフラグ定義(アプリエラー) {@value} */
    079        public static final String FG_ERR2 = "8";       // アプリエラー
    080
    081        // GE50 の要求番号のシーケンスを取得します
    082        // private static final String GE50_SEQ = "SELECT GE50_SEQUENCE.NEXTVAL FROM DUAL" ;    // 5.9.31.2 (2018/04/20)
    083        private static final String GE50_SEQ = "GE50_SEQUENCE";
    084
    085        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    086        private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE";
    087        private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR";
    088
    089        // GE50 に要求データを設定します。
    090        // 5.0.3.0 (2009/11/04) OUTFILE ⇒ OUT_FILE , OUTDIR ⇒ OUT_DIR
    091        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    092        private static final String GE50_INSERT =
    093                "INSERT INTO GE50" +
    094//              " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,OUT_DIR,OUT_FILE,COMMENTS," +
    095                " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,"+OUT_DIR+","+OUT_FILE+",COMMENTS," +
    096                "  FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD,DMN_NAME,DMN_HOST )" +
    097                " VALUES" +
    098                "  (?,?,?,?,?,?,?,SUBSTRB(?,1,100)," +
    099                "  '1',?,?,?,?,?,?,? )" ;
    100
    101        // GE50 の完成フラグを設定するSQL文です。
    102        // 3.8.0.4 (2005/08/08) PGUPD も更新するように変更
    103        private static final String GE50_UPDATE =
    104                "UPDATE GE50 SET FGKAN = ? , DYUPD = ? , DMN_NAME = ? , DMN_HOST = ? " +
    105                " WHERE FGJ = '1'" +
    106                " AND   SYSTEM_ID = ?" +
    107                " AND   YKNO  = ?" ;
    108
    109        // GE56 のエラー情報を書き込むためのSQL文です。
    110        private static final String GE56_ERRMSG =
    111                "INSERT INTO GE56" +
    112                "        ( FGJ,SYSTEM_ID,YKNO,ERRMSG,DYSET,DYUPD,USRSET,USRUPD,PGUPD )" +
    113                " VALUES ( '1',?        ,?   ,?     ,?    ,?    ,?     ,?     ,?      )" ;
    114
    115        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    116        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    117
    118        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    119        private final ApplicationInfo appInfo;
    120        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    121
    122        private final String USRSET ;
    123        private final String PGUPD ;
    124        private final String DMN_NAME ;         // 3.8.5.0 (2006/03/02)
    125
    126        private String systemId = null;
    127        private String ykno             = null;
    128        private String listid   = null;
    129        private String joken    = null;
    130        private String outdir   = null;
    131        private String outfile  = null;
    132        private String comments = null;
    133        private String fgnoml = null;   // // 5.10.0.0 (2018/06/08) ADD
    134
    135        protected final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) ); // 5.9.31.2 (2018/04/20)
    136
    137        /**
    138         * ユーザーとプログラムIDを指定して、オブジェクトを構築します。
    139         * このオブジェクトを構築した時刻を、DYSET、DYUPD にセットします。
    140         * つまり、このオブジェクトで登録する一連のデータは、すべて同一時刻での登録になります。
    141         *
    142         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    143         *
    144         * @param       usrset  ユーザー
    145         * @param       prgupd  プログラムID
    146         * @param       dmnName 更新デーモン名
    147         */
    148        public GE50Access( final String usrset, final String prgupd ,final String dmnName) {
    149                USRSET   = substr( usrset, 10, "UNNONE" ) ;
    150                PGUPD   = substr( prgupd, 10, "UNNONE" ) ;
    151                DMN_NAME = substr( dmnName,50, "UNNONE" ) ;
    152
    153                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    154                if( USE_DB_APPLICATION_INFO ) {
    155                        appInfo = new ApplicationInfo();
    156                        // ユーザーID,IPアドレス,ホスト名
    157                        appInfo.setClientInfo( USRSET,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    158                        // 画面ID,操作,プログラムID
    159                        appInfo.setModuleInfo( "GE50Access",null,DMN_NAME );
    160                }
    161                else {
    162                        appInfo = null;
    163                }
    164        }
    165
    166        /**
    167         * systemId をセットします。
    168         *
    169         * @param systemId システムID
    170         */
    171        public void setSystemId ( final String systemId ) { this.systemId = systemId; }
    172
    173        /**
    174         * systemId を取得します。
    175         *
    176         * @return      システムID
    177         */
    178        public String getSystemId() { return systemId; }
    179
    180        /**
    181         * listid をセットします。
    182         *
    183         * @param listid 帳票ID
    184         */
    185        public void setListId( final String listid ) { this.listid = listid; }
    186
    187        /**
    188         * joken をセットします。
    189         *
    190         * @param joken 振分条件
    191         */
    192        public void setJoken( final String joken ) { this.joken = joken; }
    193
    194        /**
    195         * outdir をセットします。
    196         *
    197         * @param outdir 出力DIR
    198         */
    199        public void setOutDir( final String outdir ) { this.outdir = outdir; }
    200
    201        /**
    202         * outfile をセットします。
    203         *
    204         * @param outfile 出力ファイル
    205         */
    206        public void setOutFile( final String outfile ) { this.outfile = outfile; }
    207
    208        /**
    209         * comments をセットします。
    210         *
    211         * @param comments コメント
    212         */
    213        public void setComments( final String comments ) { this.comments = comments; }
    214
    215        /**
    216         * ykno をセットします。
    217         *
    218         * @param ykno 要求番号
    219         */
    220        public void setYkno( final String ykno ) { this.ykno = ykno; }
    221
    222        /**
    223         * ykno を取得します。
    224         *
    225         * @return      要求番号
    226         */
    227        public String getYkno() { return ykno; }
    228
    229        /**
    230         * fgnoml をセットします
    231         * 5.10.0.0 (2018/06/08) ADD
    232         *
    233         * @param fgnoml メール不要フラグ
    234         */
    235        public void setFgNoMl( final String fgnoml ) { this.fgnoml = fgnoml; }
    236
    237        /**
    238         * 新たな要求番号を採番します(シーケンスより取得)
    239         * 採番後、内部の要求番号(ykno)もこの値に再セットされます。
    240         *
    241         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    242         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    243         * @og.rev 5.9.31.2 (2018/04/20) シーケンスの取り方を変更
    244         *
    245         * @return      要求番号
    246         */
    247        public String makeYkno() {
    248                try {
    249//                      String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo );            // 3.8.7.0 (2006/12/15)
    250//                      String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo, DBID );      // 5.5.5.1 (2012/08/07)
    251//                      ykno = vals[0][0].trim();
    252                        Transaction tran = new TransactionReal( appInfo );                                      // 5.9.31.2 (2018/04/20)
    253                        ykno = Integer.toString(dbName.getSequence(GE50_SEQ, tran, DBID));
    254                }
    255                catch( RuntimeException ex ) {
    256                        String errMsg = "要求番号の採番に失敗しました。" + HybsSystem.CR
    257                                                + " SQL=" + GE50_SEQ + HybsSystem.CR
    258                                                + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
    259                        LogWriter.log( errMsg );
    260                        LogWriter.log( ex );
    261                }
    262                return ykno ;
    263        }
    264
    265        /**
    266         * 帳票要求テーブルにデータをセットします。
    267         * 内部変数にセットされている値を利用して、データ登録を行います。
    268         * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、
    269         * このメソッドを呼び出してください。
    270         * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    271         *
    272         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    273         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    274         *
    275         * @param fgkan 完成フラグ
    276         */
    277        public void insertGE50( final String fgkan ) {
    278                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    279
    280                // GE50_INSERT の引数
    281                String[] args = new String[] {
    282                                                        systemId,       // SYSTEM_ID
    283                                                        ykno ,          // YKNO
    284                                                        StringUtil.nval( listid,"NO_LIST" ),            // LISTID
    285                                                        StringUtil.nval( joken,"NO_JOKEN" ),            // JOKEN
    286                                                        fgkan,          // FGKAN
    287                                                        StringUtil.nval( outdir,"" ),           // OUT_DIR
    288                                                        StringUtil.nval( outfile,"" ),          // OUT_FILE
    289                                                        StringUtil.nval( comments,"" ),         // COMMENTS
    290                                                        DYSET,                                  // DYSET
    291                                                        DYSET,                                  // DYUPD
    292                                                        USRSET,                                 // USRSET
    293                                                        USRSET,                                 // USRUPD
    294                                                        PGUPD,                                  // PGUPD
    295                                                        DMN_NAME,                               // DMN_NAME
    296                                                        HybsSystem.HOST_NAME    // DMN_HOST
    297                                                } ;
    298
    299                try {
    300//                      DBUtil.dbExecute( GE50_INSERT,args,appInfo );           // 3.8.7.0 (2006/12/15)
    301                        DBUtil.dbExecute( GE50_INSERT,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    302                }
    303                catch( RuntimeException ex ) {
    304                        String errMsg = "帳票要求テーブルデータセットに失敗しました。" + HybsSystem.CR
    305                                                + " SQL=" + GE50_INSERT + HybsSystem.CR
    306                                                + ex.getMessage();                                                      // 5.1.8.0 (2010/07/01) errMsg 修正
    307                        LogWriter.log( errMsg );
    308                        LogWriter.log( ex );
    309                }
    310        }
    311
    312        /**
    313         * 処理終了後に完成フラグを設定します。
    314         * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    315         * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    316         *
    317         * @og.rev 3.8.0.4 (2005/08/08) PGUPDを追加
    318         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    319         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    320         *
    321         * @param fgkan 完成フラグ
    322         */
    323        public void updateGE50( final String fgkan ) {
    324                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    325
    326                String[] args = new String[] {
    327                                                        fgkan,                                          // FGKAN
    328                                                        DYSET,                                          // DYUPD
    329                                                        DMN_NAME,                                       // DMN_NAME
    330                                                        HybsSystem.HOST_NAME,           // DMN_HOST
    331                                                        systemId,                                       // SYSTEM_ID
    332                                                        ykno                                            // YKNO
    333                                                } ;
    334
    335                try {
    336//                      DBUtil.dbExecute( GE50_UPDATE,args,appInfo );   // 3.8.7.0 (2006/12/15)
    337                        DBUtil.dbExecute( GE50_UPDATE,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    338                }
    339                catch( RuntimeException ex ) {
    340                        String errMsg = "完成フラグ設定に失敗しました。" + HybsSystem.CR
    341                                                + " SQL=" + GE50_UPDATE + HybsSystem.CR
    342                                                + ex.getMessage();                                                      // 5.1.8.0 (2010/07/01) errMsg 修正
    343                        LogWriter.log( errMsg );
    344                        LogWriter.log( ex );
    345                }
    346        }
    347
    348        /**
    349         * エラー発生時に、エラーメッセージを登録します。
    350         * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    351         *
    352         * @og.rev 3.8.5.3 (2006/06/30) エラーメッセージを 4000Byte以下にする。
    353         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    354         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    355         * @og.rev 5.10.0.0 (2018/06/08) メール不要フラグ(fgNoMl)の判定を追加。
    356         *
    357         * @param       inErrMsg        エラーメッセージ
    358         */
    359        public void insertErrorGE56( final String inErrMsg) {
    360
    361                String outErrMsg = (inErrMsg == null) ? "" : inErrMsg.trim();
    362                if( outErrMsg.length() > 2000 ) {
    363                        String code = HybsSystem.sys( "DB_ENCODE" );
    364                        byte[] byteValue = StringUtil.makeByte( outErrMsg,code );
    365                        if( byteValue.length > 4000 ) {
    366                                outErrMsg = StringUtil.makeString( byteValue,0,4000,code );
    367                        }
    368                }
    369                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    370
    371                String[] args = new String[] {
    372                                                                systemId,
    373                                                                ykno,
    374                                                                outErrMsg ,             // ERRMSG
    375                                                                DYSET,                  // DYSET
    376                                                                DYSET,                  // DYUPD
    377                                                                USRSET,                 // USRSET
    378                                                                USRSET,                 // USRUPD
    379                                                                PGUPD };                // PGUPD
    380
    381                try {
    382//                      DBUtil.dbExecute( GE56_ERRMSG,args,appInfo );           // 3.8.7.0 (2006/12/15)
    383                        DBUtil.dbExecute( GE56_ERRMSG,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    384                }
    385                catch( RuntimeException ex ) {
    386                        String errMsg = "エラーメッセージテーブルセットに失敗しました。" + HybsSystem.CR
    387                                                + " SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "]" + HybsSystem.CR
    388                                                + " SQL=" + GE56_ERRMSG + HybsSystem.CR
    389                                                + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
    390                        LogWriter.log( errMsg );
    391                        LogWriter.log( ex );
    392                }
    393
    394                // 5.10.0.0 (2018/06/08) MOD メール不要フラグが1以外の場合、メールを送信します
    395                if(!"1".equals(fgnoml)) {
    396                        sendMail( outErrMsg );          // 3.8.0.4 (2005/08/08)
    397                }
    398        }
    399
    400        /**
    401         * substring を補完する簡易メソッド
    402         *
    403         * substring で、文字をカットする場合、文字列長が、カットする文字数より
    404         * 長い必要があります。ここでは、最大長に制限をかけることが目的なので
    405         * 入力文字長が指定文字数より小さいケースがあります。そのチェックを
    406         * 簡易的に実行できるように、このメソッドで処理します。
    407         *
    408         * @param       in      入力文字
    409         * @param       len     最大文字数
    410         * @param       defVal  NULL 時の初期値
    411         *
    412         * @return 指定の文字数でカットされた新しい文字列
    413         */
    414        private String substr( final String in, final int len, final String defVal ) {
    415                String rtn = in;
    416                if( in == null ) {
    417                        rtn = defVal;
    418                }
    419                else if( in.length() > len ) {
    420                        rtn = in.substring( 1,len );
    421                }
    422
    423                return rtn ;
    424        }
    425
    426        /**
    427         * エラー情報のメール送信を行います。
    428         * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
    429         * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
    430         * がすべて設定されている場合に、送信されます。
    431         *
    432         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
    433         * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み
    434         *
    435         * @param       inErrMsg        エラーメッセージ
    436         */
    437        private void sendMail( final String inErrMsg ) {
    438
    439                String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    440                String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
    441                String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
    442                String   match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29)
    443
    444                if( host != null && from != null && to.length > 0 ) {
    445                        if( match_txt == null || match_txt.length() == 0
    446                                        || listid == null || listid.length() == 0
    447                                        || listid.matches( match_txt ) ){       // 5.7.0.4 (2013/11/29)
    448                                // 3.8.5.0 (2006/03/02) DMN_NAME、DMN_HOST 追加
    449                                // 5.7.0.4 (2013/11/29) listid追加
    450                                String subject = "SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "] , "
    451                                                           + "DMN_NAME=[" + DMN_NAME + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]"
    452                                                           + "LISTID=[" + listid +"]";
    453                                try {
    454                                        MailTX tx = new MailTX( host );
    455        //                              tx.setHost( host );
    456                                        tx.setFrom( from );
    457                                        tx.setTo( to );
    458                                        tx.setSubject( "帳票エラー：" + subject );
    459                                        tx.setMessage( inErrMsg );
    460                                        tx.sendmail();
    461                                }
    462                                catch( Throwable ex ) {
    463                                        String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR
    464                                                                + " SUBJECT:" + subject                                 + HybsSystem.CR
    465                                                                + " HOST:" + host                                               + HybsSystem.CR
    466                                                                + " FROM:" + from                                               + HybsSystem.CR
    467                                                                + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
    468                                                                + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
    469                                        LogWriter.log( errMsg );
    470                                        LogWriter.log( ex );
    471                                }
    472                        }
    473                }
    474        }
    475}