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 の8文字か、YYYYMMDDHHMMSS の14文字のどちらかです。 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}