    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.fukurou.transfer;
    017
    018// import java.text.DateFormat;
    019// import java.text.SimpleDateFormat;
    020// import java.util.Calendar;
    021// import java.util.Date;
    022// import java.util.Locale;
    023
    024import org.opengion.fukurou.db.DBUtil;
    025import org.opengion.fukurou.db.Transaction;
    026import org.opengion.fukurou.util.StringUtil;
    027import org.opengion.fukurou.util.HybsDateUtil;
    028
    029/**
    030 * 伝送要求に対して旧伝送DB(CB01)に登録を行います。
    031 *
    032 * 旧伝送DB登録時のデータコード、送り先、テキスト種別は、伝送定義マスタの実行対象で指定します。
    033 * 具体的には以下の形式で定義します。
    034 *   (データコード) (送り先) (テキスト種別) [(レコード長)] 例):"3 D9 B119 [400]"
    035 * 4番目のパラメーターであるレコード長は任意です。レコード長が指定されない場合、
    036 * デフォルト値として 400 が定義されます。
    037 *
    038 * CB01の各項目のセット基準は以下の通りです。
    039 *
    040 *                                              ヘッダーデータ         明細データ
    041 *  ---------------------------------------------------
    042 *  HCDJ(状況)                    1                                       5
    043 *  HCDD(カードコード)        [実行対象]                  [実行対象]
    044 *  HTO(送り先)                    [実行対象]                  [実行対象]
    045 *  HSYU(テキスト種別)        [実行対象]                  [実行対象]
    046 *  HLDAY(登録日)          システム日付          システム日付
    047 *  HLTIME(登録時間)        システム日付          システム日付
    048 *  HDPDAY(削除日)         システム日付+14日      システム日付+14日
    049 *  HFROM(送り元)          [システムリソース]      [システムリソース]      ※TRANSFER_HOST_CODEの値
    050 *  HTCNO(通番NO)         CB010001.NEXTVAL        CB010001.NEXTVAL
    051 *  HTC(通番)                     CB010002.NEXTVAL        CB010002.NEXTVAL
    052 *  HTEXT(データ)          送り先+登録件数                データ
    053 *  DYUNYOU(運用日)                CJ03.DYUNYOU            CJ03.DYUNYOU
    054 *  RECL(レコード長) [実行対象]                  [実行対象]                  ※初期値400
    055 *
    056 *  この_CB01を利用する場合CB01テーブル以外に次のテーブル及びシーケンスが必要です
    057 *  テーブル：CB02
    058 *  シーケンス：CB010001,CB010002
    059 *
    060 * @og.rev 5.4.4.1 コメント修正
    061 * @og.rev 5.5.7.3 CB01登録時のHPASS,HNAME変更
    062 * @og.group 伝送システム
    063 *
    064 * @version  5.0
    065 * @author   Hiroki.Nakamura
    066 * @since    JDK1.6
    067 */
    068public class TransferExec_CB01 implements TransferExec {
    069
    070        // 旧伝送DB(CB01)登録
    071        // 5.5.7.3 (2012/10/12) HPASS,HNAMEがnullでは駄目なのでスペース
    072        private static final String CB01_INSERT =
    073                "INSERT INTO CB01 ("
    074                + "HCDJ,HCDD,HTO,HSYU,HLDAY,HLTIME,HDPDAY,HTEXT1,HTEXT2"
    075                + ",HPASS,HFROM,HNAME,HTCNO,HTC,HTEXT,DYUNYOU,RECL"
    076                + ") VALUES ("
    077                + "?,?,?,?,?,?,?,null,null"
    078//              + ",null,?,null,?,?,?,?,?"
    079                + ",'        ',?,'                    ',?,?,?,?,?"
    080                + ")";
    081
    082        // 通番NO取得
    083        private static final String HTCNO_GET = "SELECT CB010001.NEXTVAL FROM DUAL";
    084
    085        // 通番取得
    086        private static final String HTC_GET = "SELECT CB010002.NEXTVAL FROM DUAL";
    087
    088        // 運用日取得
    089        private static final String DYUNYOU_GET = "SELECT DYUNYOU FROM CJ03";
    090
    091        // 削除日付基準日数
    092        private static final int HDAY = 14;
    093
    094        // レコード長の初期値
    095        private static final String DEFAULT_RECL = "400";
    096
    097        /**
    098         * CB01に登録します。
    099         *
    100         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    101         *
    102         * @param vals 伝送データ(配列)
    103         * @param config 伝送設定オブジェクト
    104         * @param tran トランザクションオブジェクト
    105         */
    106        @Override
    107        public void execute( final String[] vals, final TransferConfig config, final Transaction tran ) {
    108                if( vals == null || vals.length == 0 ) { return; }
    109
    110                String execObj = config.getExecObj();
    111                String[] obj = StringUtil.csv2Array( execObj, ' ' );
    112                if( obj.length < 3 ) {
    113                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) の形式で指定して下さい。"
    114                                                        + "EXECOBJ=[" + execObj + "]";
    115                        throw new RuntimeException( errMsg );
    116                }
    117                String hcdd = obj[0];
    118                String hto = obj[1];
    119                String hsyu = obj[2];
    120                if( hcdd == null || hcdd.length() == 0
    121                 || hto  == null || hto.length()  == 0
    122                 || hsyu == null || hsyu.length() == 0 ) {
    123                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) は必須です。"
    124                                                        + "EXECOBJ=[" + execObj + "]";
    125                        throw new RuntimeException( errMsg );
    126                }
    127                String recl = ( obj.length > 3 ) ? obj[3] : DEFAULT_RECL;
    128
    129                String execDbid = config.getExecDbid();
    130
    131                String htcno = getHtcno( tran, execDbid );
    132//              String hlday = getDate( "yyyyMMdd" );
    133//              String hltime = getDate( "HHmm" );
    134//              String hdpday = getDate( hlday, HDAY );
    135                String hlday  = HybsDateUtil.getDate( "yyyyMMdd" );                     // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
    136                String hltime = HybsDateUtil.getDate( "HHmm" );                         // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
    137                String hdpday = HybsDateUtil.getDatePlus( hlday, HDAY );        // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
    138
    139                // ヘッダー行追加
    140                String[] headerArgs = new String[] {
    141                                "1",                                                            // HCDJ
    142                                hcdd ,                                                          // HCDD
    143                                hto,                                                            // HTO
    144                                hsyu,                                                           // HSYU
    145                                hlday.substring( 2 ),                           // HLDAY
    146                                hltime,                                                         // HLTIME
    147                                hdpday.substring( 2 ),                          // HDPDAY
    148                                config.getHfrom(),                                      // HFROM
    149                                htcno,                                                          // HTCNO
    150                                getHtc( tran, execDbid ),                       // HTC
    151                                getHeaderText( hto, vals.length ),      // HTEXT
    152                                getDyunyou( tran, execDbid ),           // DYUNYOU
    153                                recl                                                            // RECL
    154                        };
    155                DBUtil.dbExecute( CB01_INSERT, headerArgs, tran, execDbid );
    156
    157                // 明細行追加
    158                for( String text : vals ) {
    159                        String[] dataArgs = new String[] {
    160                                        "5",                                                            // HCDJ
    161                                        hcdd ,                                                          // HCDD
    162                                        hto,                                                            // HTO
    163                                        hsyu,                                                           // HSYU
    164                                        hlday.substring( 2 ),                           // HLDAY
    165                                        hltime,                                                         // HLTIME
    166                                        hdpday.substring( 2 ),                          // HDPDAY
    167                                        config.getHfrom(),                                      // HFROM
    168                                        htcno,                                                          // HTCNO
    169                                        getHtc( tran, execDbid ),                       // HTC
    170                                        text,                                                           // HTEXT
    171                                        getDyunyou( tran, execDbid ),           // DYUNYOU
    172                                        recl                                                            // RECL
    173                                };
    174                        DBUtil.dbExecute( CB01_INSERT, dataArgs, tran, execDbid );
    175                }
    176        }
    177
    178        /**
    179         * ヘッダーデータのテキストを返します。
    180         * (CSP00007と同じ仕様で実装)
    181         *
    182         * @param hto 送り先
    183         * @param cnt 登録件数
    184         *
    185         * @return ヘッダーデータのテキスト
    186         */
    187        private static String getHeaderText( final String hto, final int cnt ) {
    188                return StringUtil.stringFill( hto, 8, "UTF-8" )
    189//                                              + " 登録件数 = " + String.valueOf( cnt );
    190                                                + " 登録件数 = " + cnt;
    191        }
    192
    193        /**
    194         * 通番NOを採番します。
    195         * (CSP00007と同じ仕様で実装)
    196         *
    197         * @param tran トランザクションオブジェクト
    198         * @param execDbid 実行接続先DBID
    199         *
    200         * @return 通番NO
    201         */
    202        private static String getHtcno( final Transaction tran, final String execDbid ) {
    203                String[][] rtn = DBUtil.dbExecute( HTCNO_GET, new String[0], tran, execDbid );
    204                return rtn[0][0];
    205        }
    206
    207        /**
    208         * 通番を採番します。
    209         * (CSP00007と同じ仕様で実装)
    210         *
    211         * @param tran トランザクションオブジェクト
    212         * @param execDbid 実行接続先DBID
    213         *
    214         * @return 通番
    215         */
    216        private static String getHtc( final Transaction tran, final String execDbid ) {
    217                String[][] rtn = DBUtil.dbExecute( HTC_GET, new String[0], tran, execDbid );
    218                return rtn[0][0];
    219        }
    220
    221        /**
    222         * 運用日を取得します。(CJ03>運用日)
    223         * (CSP00007と同じ仕様で実装)
    224         *
    225         * @param tran トランザクションオブジェクト
    226         * @param execDbid 実行接続先DBID
    227         *
    228         * @return 運用日
    229         */
    230        private static String getDyunyou( final Transaction tran, final String execDbid ) {
    231                String[][] rtn = DBUtil.dbExecute( DYUNYOU_GET, new String[0], tran, execDbid );
    232                return rtn[0][0];
    233        }
    234
    235        /**
    236         * 現在日付、時刻をフォーマットを指定して、所得します。
    237         * フォーマットの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
    238         *
    239         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
    240         *
    241         * @param       form フォーム文字列 ( 例 "yyyy/MM/dd HH:mm:ss.SSS" )
    242         *
    243         * @return      現在日付、時刻
    244         */
    245//      private static String getDate( final String form ) {
    246//              DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
    247//              return formatter.format(new Date());
    248//      }
    249
    250        /**
    251         * 指定の引数の日付け文字列(YYYYMMDDHHMMSS)より、カレンダオブジェクトを作成します。
    252         * 引数は、YYYYMMDD の８文字か、YYYYMMDDHHMMSS の１４文字のどちらかです。
    253         *
    254         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
    255         *
    256         * @param value 日付け文字列(YYYYMMDD または YYYYMMDDHHMMSS)
    257         *
    258         * @return      カレンダオブジェクト
    259         */
    260//      private static Calendar getCalendar( final String value ) {
    261//              if ( value == null || ( value.length() != 8 && value.length() != 14 ) ) {
    262//                      String errMsg = "引数は、YYYYMMDD または YYYYMMDDHHMMSS 形式の日付け文字列のみです。"
    263//                                      + " value=[" + value + "]" ;
    264//                      throw new RuntimeException( errMsg );
    265//              }
    266//
    267//              Calendar cal = Calendar.getInstance();
    268//              cal.clear();
    269//
    270//              int hour=0,minute=0,second=0;
    271//
    272//              int year   = Integer.parseInt( value.substring( 0,4 ) );
    273//              int month  = Integer.parseInt( value.substring( 4,6 ) ) - 1;
    274//              int date   = Integer.parseInt( value.substring( 6,8 ) );
    275//
    276//              if( value.length() == 14 ) {
    277//                      hour   = Integer.parseInt( value.substring( 8,10 ) );
    278//                      minute = Integer.parseInt( value.substring( 10,12 ) );
    279//                      second = Integer.parseInt( value.substring( 12,14 ) );
    280//              }
    281//
    282//              cal.set( year,month,date,hour,minute,second );
    283//
    284//              return cal;
    285//      }
    286
    287        /**
    288         * 指定の引数の日付け文字列(YYYYMMDD)より、差分の日付を計算して返します。
    289         * 引数は、YYYYMMDD と 差分の日数。
    290         *
    291         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
    292         * ※ diffのコメント(過去の日付[+]、将来の日付は[-])と内部ロジックが異なるように思います。
    293         *    移した先の HybsDateUtil.getDatePlus でも同じ処理です。バグかどうかテストできていません。
    294         *
    295         * @param baseDate 日付け文字列(YYYYMMDD)
    296         * @param diff     差分の日数(過去の日付[+]、将来の日付は[-])
    297         *
    298         * @return      結果の日付(YYYYMMDD)
    299         */
    300//      private static String getDate( final String baseDate,final int diff ) {
    301//              if ( baseDate == null || ( baseDate.length() != 8 ) ) {
    302//                      String errMsg = "引数 baseDate は、YYYYMMDD 形式の日付け文字列のみです。"
    303//                                      + " baseDate=[" + baseDate + "]" ;
    304//                      throw new RuntimeException( errMsg );
    305//              }
    306//
    307//              Calendar cal = getCalendar( baseDate );
    308//              cal.add( Calendar.DATE,diff );
    309//              String rtn = null;
    310//
    311//              int calYear             = cal.get( Calendar.YEAR );
    312//              int calMonth    = cal.get( Calendar.MONTH ) + 1;
    313//              int calDay              = cal.get( Calendar.DATE );
    314//              rtn = String.valueOf( calYear );
    315//              if( calMonth < 10 ) {
    316//                      rtn = rtn + "0" + calMonth;
    317//              }
    318//              else {
    319//                      rtn = rtn + calMonth;
    320//              }
    321//              if( calDay < 10 ) {
    322//                      rtn = rtn + "0" + calDay;
    323//              }
    324//              else {
    325//                      rtn = rtn + calDay;
    326//              }
    327//              return rtn;
    328//      }
    329
    330}