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
018import org.opengion.fukurou.db.DBUtil;
019import org.opengion.fukurou.db.Transaction;
020import org.opengion.fukurou.util.StringUtil;
021import org.opengion.fukurou.util.HybsDateUtil;
022
023/**
024 * 伝送要求に対して旧伝送DB(CB01)に登録を行います。
025 *
026 * 旧伝送DB登録時のデータコード、送り先、テキスト種別は、伝送定義マスタの実行対象で指定します。
027 * 具体的には以下の形式で定義します。
028 *   (データコード) (送り先) (テキスト種別) [(レコード長)] 例):"3 D9 B119 [400]"
029 * 4番目のパラメーターであるレコード長は任意です。レコード長が指定されない場合、
030 * デフォルト値として 400 が定義されます。
031 *
032 * CB01の各項目のセット基準は以下の通りです。
033 *
034 *                                              ヘッダーデータ         明細データ
035 *  ---------------------------------------------------
036 *  HCDJ(状況)                    1                                       5
037 *  HCDD(カードコード)        [実行対象]                  [実行対象]
038 *  HTO(送り先)                    [実行対象]                  [実行対象]
039 *  HSYU(テキスト種別)        [実行対象]                  [実行対象]
040 *  HLDAY(登録日)          システム日付          システム日付
041 *  HLTIME(登録時間)        システム日付          システム日付
042 *  HDPDAY(削除日)         システム日付+14日      システム日付+14日
043 *  HFROM(送り元)          [システムリソース]      [システムリソース]      ※TRANSFER_HOST_CODEの値
044 *  HTCNO(通番NO)         CB010001.NEXTVAL        CB010001.NEXTVAL
045 *  HTC(通番)                     CB010002.NEXTVAL        CB010002.NEXTVAL
046 *  HTEXT(データ)          送り先+登録件数                データ
047 *  DYUNYOU(運用日)                CJ03.DYUNYOU            CJ03.DYUNYOU
048 *  RECL(レコード長) [実行対象]                  [実行対象]                  ※初期値400
049 *
050 *  この_CB01を利用する場合CB01テーブル以外に次のテーブル及びシーケンスが必要です
051 *  テーブル:CB02
052 *  シーケンス:CB010001,CB010002
053 *
054 * @og.rev 5.4.4.1 コメント修正
055 * @og.rev 5.5.7.3 CB01登録時のHPASS,HNAME変更
056 * @og.group 伝送システム
057 *
058 * @version  5.0
059 * @author   Hiroki.Nakamura
060 * @since    JDK1.6
061 */
062public class TransferExec_CB01 implements TransferExec {
063
064        // 旧伝送DB(CB01)登録
065        // 5.5.7.3 (2012/10/12) HPASS,HNAMEがnullでは駄目なのでスペース
066        private static final String CB01_INSERT =
067                "INSERT INTO CB01 ("
068                + "HCDJ,HCDD,HTO,HSYU,HLDAY,HLTIME,HDPDAY,HTEXT1,HTEXT2"
069                + ",HPASS,HFROM,HNAME,HTCNO,HTC,HTEXT,DYUNYOU,RECL"
070                + ") VALUES ("
071                + "?,?,?,?,?,?,?,null,null"
072                + ",'        ',?,'                    ',?,?,?,?,?"
073                + ")";
074
075        // 通番NO取得
076        private static final String HTCNO_GET = "SELECT CB010001.NEXTVAL FROM DUAL";
077
078        // 通番取得
079        private static final String HTC_GET = "SELECT CB010002.NEXTVAL FROM DUAL";
080
081        // 運用日取得
082        private static final String DYUNYOU_GET = "SELECT DYUNYOU FROM CJ03";
083
084        // 削除日付基準日数
085        private static final int HDAY = 14;
086
087        // レコード長の初期値
088        private static final String DEFAULT_RECL = "400";
089
090        /**
091         * CB01に登録します。
092         *
093         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
094         *
095         * @param vals 伝送データ(配列)
096         * @param config 伝送設定オブジェクト
097         * @param tran トランザクションオブジェクト
098         */
099        @Override
100        public void execute( final String[] vals, final TransferConfig config, final Transaction tran ) {
101                if( vals == null || vals.length == 0 ) { return; }
102
103                String execObj = config.getExecObj();
104                String[] obj = StringUtil.csv2Array( execObj, ' ' );
105                if( obj.length < 3 ) {
106                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) の形式で指定して下さい。"
107                                                        + "EXECOBJ=[" + execObj + "]";
108                        throw new RuntimeException( errMsg );
109                }
110                String hcdd = obj[0];
111                String hto = obj[1];
112                String hsyu = obj[2];
113                if( hcdd == null || hcdd.length() == 0
114                 || hto  == null || hto.length()  == 0
115                 || hsyu == null || hsyu.length() == 0 ) {
116                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) は必須です。"
117                                                        + "EXECOBJ=[" + execObj + "]";
118                        throw new RuntimeException( errMsg );
119                }
120                String recl = ( obj.length > 3 ) ? obj[3] : DEFAULT_RECL;
121
122                String execDbid = config.getExecDbid();
123
124                String htcno = getHtcno( tran, execDbid );
125                String hlday  = HybsDateUtil.getDate( "yyyyMMdd" );                     // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
126                String hltime = HybsDateUtil.getDate( "HHmm" );                         // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
127                String hdpday = HybsDateUtil.getDatePlus( hlday, HDAY );        // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
128
129                // ヘッダー行追加
130                String[] headerArgs = new String[] {
131                                "1",                                                            // HCDJ
132                                hcdd ,                                                          // HCDD
133                                hto,                                                            // HTO
134                                hsyu,                                                           // HSYU
135                                hlday.substring( 2 ),                           // HLDAY
136                                hltime,                                                         // HLTIME
137                                hdpday.substring( 2 ),                          // HDPDAY
138                                config.getHfrom(),                                      // HFROM
139                                htcno,                                                          // HTCNO
140                                getHtc( tran, execDbid ),                       // HTC
141                                getHeaderText( hto, vals.length ),      // HTEXT
142                                getDyunyou( tran, execDbid ),           // DYUNYOU
143                                recl                                                            // RECL
144                        };
145                DBUtil.dbExecute( CB01_INSERT, headerArgs, tran, execDbid );
146
147                // 明細行追加
148                for( String text : vals ) {
149                        String[] dataArgs = new String[] {
150                                        "5",                                                            // HCDJ
151                                        hcdd ,                                                          // HCDD
152                                        hto,                                                            // HTO
153                                        hsyu,                                                           // HSYU
154                                        hlday.substring( 2 ),                           // HLDAY
155                                        hltime,                                                         // HLTIME
156                                        hdpday.substring( 2 ),                          // HDPDAY
157                                        config.getHfrom(),                                      // HFROM
158                                        htcno,                                                          // HTCNO
159                                        getHtc( tran, execDbid ),                       // HTC
160                                        text,                                                           // HTEXT
161                                        getDyunyou( tran, execDbid ),           // DYUNYOU
162                                        recl                                                            // RECL
163                                };
164                        DBUtil.dbExecute( CB01_INSERT, dataArgs, tran, execDbid );
165                }
166        }
167
168        /**
169         * ヘッダーデータのテキストを返します。
170         * (CSP00007と同じ仕様で実装)
171         *
172         * @param hto 送り先
173         * @param cnt 登録件数
174         *
175         * @return ヘッダーデータのテキスト
176         */
177        private static String getHeaderText( final String hto, final int cnt ) {
178                return StringUtil.stringFill( hto, 8, "UTF-8" )
179                                                + " 登録件数 = " + cnt;
180        }
181
182        /**
183         * 通番NOを採番します。
184         * (CSP00007と同じ仕様で実装)
185         *
186         * @param tran トランザクションオブジェクト
187         * @param execDbid 実行接続先DBID
188         *
189         * @return 通番NO
190         */
191        private static String getHtcno( final Transaction tran, final String execDbid ) {
192                String[][] rtn = DBUtil.dbExecute( HTCNO_GET, new String[0], tran, execDbid );
193                return rtn[0][0];
194        }
195
196        /**
197         * 通番を採番します。
198         * (CSP00007と同じ仕様で実装)
199         *
200         * @param tran トランザクションオブジェクト
201         * @param execDbid 実行接続先DBID
202         *
203         * @return 通番
204         */
205        private static String getHtc( final Transaction tran, final String execDbid ) {
206                String[][] rtn = DBUtil.dbExecute( HTC_GET, new String[0], tran, execDbid );
207                return rtn[0][0];
208        }
209
210        /**
211         * 運用日を取得します。(CJ03>運用日)
212         * (CSP00007と同じ仕様で実装)
213         *
214         * @param tran トランザクションオブジェクト
215         * @param execDbid 実行接続先DBID
216         *
217         * @return 運用日
218         */
219        private static String getDyunyou( final Transaction tran, final String execDbid ) {
220                String[][] rtn = DBUtil.dbExecute( DYUNYOU_GET, new String[0], tran, execDbid );
221                return rtn[0][0];
222        }
223}