    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 org.opengion.fukurou.db.DBUtil;
    019import org.opengion.fukurou.db.ApplicationInfo;
    020import org.opengion.fukurou.util.StringUtil;
    021import org.opengion.hayabusa.common.HybsSystem;
    022import org.opengion.hayabusa.db.DBTableModel;
    023import org.opengion.hayabusa.report2.QueueManager_DB.DBTableModelCreator;
    024import org.opengion.hayabusa.resource.ResourceFactory;
    025import org.opengion.hayabusa.resource.ResourceManager;
    026
    027import static org.opengion.fukurou.system.HybsConst.CR ;                        // 5.9.0.0 (2015/09/04)
    028import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;      // 6.4.2.1 (2016/02/05)
    029
    030/**
    031 * 帳票システムでCSV出力をする際に、データを加工、プラグインの呼び出しを行うクラスです。
    032 *
    033 * @og.group 帳票システム
    034 *
    035 * @version  4.0
    036 * @author   Takahashi Masakazu
    037 * @since    JDK8.0,
    038 */
    039public class CSVPrintRequest {
    040        private final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE );                // 6.4.2.1 (2016/02/05)
    041
    042        // DBTableModel に対して設定する情報
    043        private ResourceManager resource        ;
    044
    045        // 受け渡し変数
    046        private final String    SYSTEM_ID       ;
    047        private final String    YKNO            ;
    048        private final String    LISTID          ;
    049        private final String    LANG            ;
    050        private final String    FGRUN           ;       // G:CSV(print) H:CSV(Excel) I:CSV(PDF)
    051        private final String    PRTID           ;
    052        private final String    PRGDIR          ;
    053        private final String    PRGFILE         ;
    054        private final String    OUTDIR          ;
    055        private final String    FILENAME        ;       // 雛形ファイル名
    056        private final boolean   DEBUG           ;
    057
    058        private final String    GRPID           ;       // 5.9.2.2 (2015/11/20)
    059        private final String    DMNGRP          ;       // 5.9.2.2 (2015/11/20)
    060
    061//      private       String    BASE_SYS_ID = "**" ;    // 7.2.6.0 (2020/06/30) ベースシステムID
    062
    063        // オブジェクト変数
    064        private boolean         fgLOCAL         ;
    065        private String          prtName         ;
    066        private String          hostName        ;
    067        private String          portnm          ;
    068        private String          fgkan           = GE50Access.FG_ERR2;   // 初期値エラー
    069        private String          option          ;                                               // 5.9.3.0 (2015/12/04)
    070
    071        private int                     bodyCount       ;                                               // 5.9.2.7 (2015/11/27) bodyCount 追加
    072
    073        // GE54 の帳票定義情報を取得するSQL文です。
    074        // 8.0.1.0 (2021/10/22) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止)
    075        private static final String GE54_SELECT =
    076//              "SELECT BSQL,FGLOCAL,SYSTEM_ID,HSQL,FSQL" +                                                             // 8.0.1.0 (2021/10/22) Modify
    077                "SELECT FGLOCAL,SYSTEM_ID" +
    078                " ,OPTIONS,FGCUT" +                                                                                                             // 5.9.3.0 (2015/12/04)
    079                " FROM GE54" +
    080                " WHERE FGJ = '1'" +
    081                " AND  SYSTEM_ID IN (?,'**')" +
    082                " AND  LISTID = ?" ;
    083
    084        // GE54 の帳票定義情報を取得するSQL文です。
    085        // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
    086        // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません
    087//      private static final String GE54_SELECT =
    088//              "SELECT BSQL,FGLOCAL,SYSTEM_ID,HSQL,FSQL,OPTIONS,FGCUT"
    089//              + " from ("
    090//              + "  select 0 as SNO,B.* from GE54 B where SYSTEM_ID='**' and LISTID=? and FGJ='1'"     // ｴﾝｼﾞﾝ共通
    091//              + "  union all"
    092//              + "  select 1 as SNO,B.* from GE54 B where SYSTEM_ID=? and LISTID=? and FGJ='1'"        // RESOURCE_BASE_SYSTEM_ID
    093//              + "  union all"
    094//              + "  select 2 as SNO,B.* from GE54 B where SYSTEM_ID=? and LISTID=? and FGJ='1'"        // 最上位ののSYSTEM_ID
    095//              + " ) A"
    096//              + " order by SNO,SYSTEM_ID" ;
    097
    098//      private static final int GE54_FGLOCAL   = 1;                                                            // 8.0.1.0 (2021/10/22) Modify
    099        private static final int GE54_FGLOCAL   = 0;
    100//      private static final int GE54_SYSTEM_ID = 2;
    101//      private static final int GE54_OPTIONS   = 5;                                                            // 5.9.3.0 (2015/12/04) 8.0.1.0 (2021/10/22) Modify
    102        private static final int GE54_OPTIONS   = 2;
    103//      private static final int GE54_FGCUT             = 6;                                                            // 5.9.3.0 (2015/12/04)
    104
    105//      // 5.4.4.0 (2012/02/01) 互換モード対応漏れ
    106//      // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止
    107//      private static final String HOST = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "HOST" : "HOST_ID";
    108
    109        // GE55 の出力先マスタ情報を取得するSQL文です。
    110        // 5.1.0.0 (2009/11/04) HOST ⇒ HOST_ID
    111        // 5.4.3.1 (2011/12/27) PORTNM
    112        // 5.4.4.0 (2012/02/01) 互換モード
    113        // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止
    114        private static final String GE55_SELECT =
    115                "SELECT PRTNM,HOST_ID,SYSTEM_ID,PORTNM" +
    116                " FROM GE55" +
    117                " WHERE FGJ = '1'" +
    118                " AND  SYSTEM_ID IN (?,'**')" +
    119                " AND  PRTID = ?" ;
    120
    121        // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
    122        // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません
    123//      private static final String GE55_SELECT =
    124//              "SELECT PRTNM,HOST_ID,SYSTEM_ID,PORTNM"
    125//              + " from ("
    126//              + "  select 0 as SNO,B.* from GE55 B where SYSTEM_ID='**' and PRTID=? and FGJ='1'"      // ｴﾝｼﾞﾝ共通
    127//              + "  union all"
    128//              + "  select 1 as SNO,B.* from GE55 B where SYSTEM_ID=? and PRTID=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID
    129//              + "  union all"
    130//              + "  select 2 as SNO,B.* from GE55 B where SYSTEM_ID=? and PRTID=? and FGJ='1'" // 最上位ののSYSTEM_ID
    131//              + " ) A"
    132//              + " order by SNO,SYSTEM_ID" ;
    133
    134        private static final int GE55_PRTNM             = 0;
    135        private static final int GE55_HOST_ID   = 1;
    136//      private static final int GE55_SYSTEM_ID = 2;
    137        private static final int GE55_PORTNM    = 3;
    138
    139        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    140        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    141        private final ApplicationInfo appInfo;
    142        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    143
    144        /**
    145         * コンストラクター。
    146         *
    147         * 引数を受けとって、インスタンスを作成します。
    148         *
    149         * @og.rev 5.9.2.2 (2015/11/20) grpid,dmngrp
    150         *
    151         * @param systemId システムID
    152         * @param ykno 要求番号
    153         * @param listId 帳票ID
    154         * @param lang 言語
    155         * @param fgrun 実行方法
    156         * @param prtid プリンタID
    157         * @param prgdir プログラムディレクトリ
    158         * @param prgfile プログラムファイル
    159         * @param outdir 出力ディレクトリ
    160         * @param filename 出力ファイル
    161         * @param grpid グループID
    162         * @param dmngrp デーモングループ
    163         * @param isDebug デバッグフラグ
    164         */
    165        public CSVPrintRequest( final String systemId, final String ykno
    166                                                        , final String listId, final String lang, final String fgrun, final String prtid
    167                                                        , final String prgdir, final String prgfile, final String outdir , final String filename
    168                                                        , final String grpid, final String dmngrp, final boolean isDebug ) {    // 5.9.2.2 (2015/11/20)
    169                SYSTEM_ID       = systemId;
    170                YKNO            = ykno;
    171                LISTID          = listId;
    172                LANG            = lang;
    173                FGRUN           = fgrun;
    174                PRTID           = prtid;
    175                PRGDIR          = prgdir;
    176                PRGFILE         = prgfile;
    177                OUTDIR          = outdir;
    178                FILENAME        = filename;
    179                GRPID           = grpid;
    180                DMNGRP          = dmngrp;
    181                DEBUG           = isDebug;
    182
    183                // アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    184                if( USE_DB_APPLICATION_INFO ) {
    185                        appInfo = new ApplicationInfo();
    186                        // ユーザーID,IPアドレス,ホスト名
    187                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    188                        // 画面ID,操作,プログラムID
    189                        appInfo.setModuleInfo( "ReportConverter",YKNO,LISTID );
    190                }
    191                else {
    192                        appInfo = null;
    193                }
    194        }
    195
    196        /**
    197         * 初期データセットを行います。
    198         * ここでは、GE54,GE55 テーブルより必要な情報を取得します。
    199         *
    200         * @og.rev 5.9.3.0 (2015/12/04)
    201         * @og.rev 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
    202         * @og.rev 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません
    203         * @og.rev 8.0.1.0 (2021/10/22) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止)
    204         *
    205         * @return 結果 [true:正常/false:異常]
    206         */
    207        public boolean initialDataSet() {
    208        //      final String baseSystemId = HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false );
    209        //      BASE_SYS_ID = StringUtil.isEmpty( baseSystemId ) ? "**" : baseSystemId ;
    210
    211                // ===== GE54 から帳票定義情報を取得します =========================================
    212                // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
    213                final String[] args = new String[] { SYSTEM_ID,LISTID };
    214        // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません
    215        //      final String[] args = new String[] { LISTID,BASE_SYS_ID,LISTID,SYSTEM_ID,LISTID };
    216                final String[][] vals = DBUtil.dbExecute( GE54_SELECT,args,appInfo, DBID );             // 5.5.5.1 (2012/08/07)
    217                if( vals == null || vals.length == 0 ) {
    218                        errMsg.append( "Data does not exist in GE54 table." ).append( CR )
    219                                .append( "==============================" ).append( CR )
    220                                .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , LISTID=[" ).append( LISTID ).append( ']' )
    221                                .append( CR );
    222                        return false;
    223                }
    224
    225                // 検索結果が複数返ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。
    226                // 7.2.6.1 (2020/07/17) 一番最後のデータを採用する。
    227                final int row = vals.length;
    228//              int row = 0;
    229//              for( int i=0; i<vals.length; i++ ) {
    230//                      if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE54_SYSTEM_ID] ) ) { row = i; break; }
    231//              }
    232
    233                // GE54のbSQLは廃止となっているので下方で別で取る
    234
    235                // ローカルリソースフラグ
    236                final String localFlag = vals[row][GE54_FGLOCAL];
    237                fgLOCAL = localFlag != null && "1".equals( localFlag.trim() ) ;
    238
    239                option = vals[row][GE54_OPTIONS];               // 5.9.3.0 (2015/12/04)
    240
    241                // ===== GE55 から出力先マスタ情報を取得します =========================================
    242                // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
    243                final String[] argsGe55 = new String[] { SYSTEM_ID,PRTID };
    244        // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません
    245        //      final String[] argsGe55 = new String[] { PRTID,BASE_SYS_ID,PRTID,SYSTEM_ID,PRTID };
    246                final String[][] valsGe55 = DBUtil.dbExecute( GE55_SELECT,argsGe55,appInfo, DBID );
    247                if( valsGe55 == null || valsGe55.length == 0 ) {
    248                        errMsg.append( "Data does not exist in GE55 table." ).append( CR )
    249                                .append( "==============================" ).append( CR )
    250                                .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , PRTID=[" ).append( PRTID ).append( ']' )
    251                                .append( CR );
    252                        return false;
    253                }
    254
    255                // 検索結果が複数帰ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。
    256                // 7.2.6.1 (2020/07/17) 一番最後のデータを採用する。
    257                final int rowGe55 = valsGe55.length;
    258//              int rowGe55 = 0;
    259//              for( int i=0; i<vals.length; i++ ) {
    260//                      if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE55_SYSTEM_ID] ) ) { rowGe55 = i; break; }
    261//              }
    262
    263                prtName  = valsGe55[rowGe55][GE55_PRTNM];
    264                hostName = valsGe55[rowGe55][GE55_HOST_ID];
    265                portnm   = valsGe55[rowGe55][GE55_PORTNM];
    266
    267                return true;
    268        }
    269
    270        /**
    271         * 発行用データを作成し、発行リクエストの処理を行います。
    272         *
    273         * @og.rev 5.4.3.0 (2011/12/26) _DEFAULT対応
    274         * @og.rev 5.4.3.4 (2012/01/12) listid追加
    275         * @og.rev 5.4.3.9 (2012/01/25) FILENAME追加
    276         * @og.rev 5.9.2.2 (2015/11/20) GRPID,DEMGRP
    277         * @og.rev 5.9.2.3 (2015/11/27) rowCount
    278         * @og.rev 5.9.2.7 (2015/11/27) bodyCount 追加
    279         * @og.rev 5.9.3.0 (2015/12/04) option
    280         *
    281         * @return 結果 [true:正常/false:異常]
    282         */
    283        public boolean execute() {
    284                System.out.print( "CSV RequestData Creating ... " );
    285
    286                // FGLOCAL 指定時は、SYSTEM_ID を指定してリソース作成
    287                if( fgLOCAL ) {
    288                        // ローカルリソース指定時は、SYSTEM_ID,LANG を使用します。先読みは、使用しません。
    289                        resource = ResourceFactory.newInstance( SYSTEM_ID,LANG,false );
    290                }
    291                else {
    292                        // 従来と互換性のあるモード(ローカルリソースは使用しない。
    293                        resource = ResourceFactory.newInstance( LANG );
    294                }
    295
    296                // ボディー情報の取得
    297                DBTableModelCreator tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "B", resource );
    298                final DBTableModel table = tmc.getTable();
    299                if( table.getRowCount() <= 0 ) {
    300                        errMsg.append( "Database Body row count is Zero." ).append( CR )
    301                                .append( "==============================" ).append( CR )
    302                                .append( "SYSTEM_ID=" ).append( SYSTEM_ID )
    303                                .append( ",LISTID="   ).append( LISTID )
    304                                .append( ",YKNO="     ).append( YKNO )
    305                                .append( CR );
    306                        return false;
    307                }
    308                // 検索時の最大件数での打ち切りをエラーとする。
    309                if( table.isOverflow() ) {
    310                        errMsg.append( "Database is Overflow. [" )
    311                                .append( table.getRowCount() )
    312                                .append( ']' ).append( CR ).append( CR )
    313                                .append( "==============================" ).append( CR )
    314                                .append( "Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" )
    315                                .append( CR );
    316                        return false;
    317                }
    318
    319                bodyCount = table.getRowCount(); // 5.9.2.3 (2015/11/27)
    320
    321                // ヘッダフッタも渡す
    322                tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "H", resource );
    323                final DBTableModel tableH = tmc.getTable();
    324                tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "F", resource );
    325                final DBTableModel tableF = tmc.getTable();
    326
    327                // 発行用クラスを実行する。
    328                CSVPrintPointService service = null;
    329                try {
    330                        service = (CSVPrintPointService)StringUtil.newInstance( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) );
    331                        service.setYkno( YKNO );
    332                        service.setSystemId( SYSTEM_ID );
    333                        service.setFgrun( FGRUN );
    334                        service.setHostName( hostName );
    335                        service.setPrinterName( prtName );
    336                        service.setTable( table );
    337                        service.setTableH( tableH );
    338                        service.setTableF( tableF );
    339                        service.setPrgDir( PRGDIR );
    340                        service.setPrgFile( PRGFILE );
    341                        service.setOutDir( OUTDIR );
    342                        service.setPrtId( PRTID );
    343                        service.setPortnm( portnm );
    344                        service.setListId( LISTID );
    345                        service.setModelname( FILENAME );
    346                        service.setGrpId( GRPID );                      // 5.9.2.2 (2015/11/20)
    347                        service.setDmnGrp( DMNGRP );            // 5.9.2.2 (2015/11/20)
    348                        service.setOption( option );            // 5.9.3.0 (2015/12/04)
    349
    350                        final boolean flag = service.execute();
    351
    352                        fgkan = service.getFgkan();
    353
    354                        if( DEBUG ) {
    355                                System.out.println( service );
    356                        }
    357
    358                        if( ! flag ){
    359                                errMsg.append( service.getErrMsg() );
    360                                return false;
    361                        }
    362                }
    363                catch( final Throwable ex ) {
    364                        fgkan = GE50Access.FG_ERR2; // エラー時はアプリエラーにしておく
    365                        errMsg.append( "CSV Print Request Execution Error. " ).append( CR )
    366                                .append( "==============================" ).append( CR )
    367                                .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , YKNO=[" ).append( YKNO ).append( ']' ).append( CR )
    368                                .append( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) ).append( CR )
    369                                .append( ex.toString() )
    370                                .append( CR );
    371                        if( service != null ) { errMsg.append( service.getErrMsg() ); }         // 5.5.2.6 (2012/05/25) findbugs対応
    372                        return false;
    373                }
    374
    375                System.out.println( "End." );
    376                return true ;
    377        }
    378
    379        /**
    380         * エラーが存在した場合に、エラーメッセージを返します。
    381         *
    382         * @return エラーメッセージ String
    383         */
    384        public String getErrMsg() {
    385                return errMsg.toString();
    386        }
    387
    388        /**
    389         * 完了フラグを返します。
    390         *
    391         *
    392         * @return 完了フラグ String
    393         */
    394        public String getFgkan() {
    395                return fgkan;
    396        }
    397
    398        /**
    399         * 処理件数(bodyの件数)を返します。
    400         *
    401         * @og.rev 5.9.2.7 (2015/11/27) bodyCount 追加
    402         *
    403         * @return 処理件数 int
    404         */
    405        public int getBodyCount() {
    406                return bodyCount;
    407        }
    408}