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.hayabusa.common.HybsSystem; 019import org.opengion.fukurou.util.LogWriter; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.ApplicationInfo; 022import org.opengion.fukurou.db.DBUtil; 023import org.opengion.fukurou.mail.MailTX ; 024import org.opengion.fukurou.db.ConnectionFactory; 025import org.opengion.fukurou.db.DBFunctionName; 026import org.opengion.fukurou.db.Transaction; 027import org.opengion.fukurou.db.TransactionReal; 028 029import java.util.Arrays; 030 031/** 032 * 帳票要求テーブル(GE50)と、エラーテーブル(GE56)に対して、データ書込みを行います。 033 * 034 * このクラスでは、4つの機能を実装しています。 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.32.0 (2018/05/02) 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 134 protected final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) ); // 5.9.32.0 (2018/05/02) 135 136 /** 137 * ユーザーとプログラムIDを指定して、オブジェクトを構築します。 138 * このオブジェクトを構築した時刻を、DYSET、DYUPD にセットします。 139 * つまり、このオブジェクトで登録する一連のデータは、すべて同一時刻での登録になります。 140 * 141 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 142 * 143 * @param usrset ユーザー 144 * @param prgupd プログラムID 145 * @param dmnName 更新デーモン名 146 */ 147 public GE50Access( final String usrset, final String prgupd ,final String dmnName) { 148 USRSET = substr( usrset, 10, "UNNONE" ) ; 149 PGUPD = substr( prgupd, 10, "UNNONE" ) ; 150 DMN_NAME = substr( dmnName,50, "UNNONE" ) ; 151 152 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 153 if( USE_DB_APPLICATION_INFO ) { 154 appInfo = new ApplicationInfo(); 155 // ユーザーID,IPアドレス,ホスト名 156 appInfo.setClientInfo( USRSET,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 157 // 画面ID,操作,プログラムID 158 appInfo.setModuleInfo( "GE50Access",null,DMN_NAME ); 159 } 160 else { 161 appInfo = null; 162 } 163 } 164 165 /** 166 * systemId をセットします。 167 * 168 * @param systemId システムID 169 */ 170 public void setSystemId ( final String systemId ) { this.systemId = systemId; } 171 172 /** 173 * systemId を取得します。 174 * 175 * @return システムID 176 */ 177 public String getSystemId() { return systemId; } 178 179 /** 180 * listid をセットします。 181 * 182 * @param listid 帳票ID 183 */ 184 public void setListId( final String listid ) { this.listid = listid; } 185 186 /** 187 * joken をセットします。 188 * 189 * @param joken 振分条件 190 */ 191 public void setJoken( final String joken ) { this.joken = joken; } 192 193 /** 194 * outdir をセットします。 195 * 196 * @param outdir 出力DIR 197 */ 198 public void setOutDir( final String outdir ) { this.outdir = outdir; } 199 200 /** 201 * outfile をセットします。 202 * 203 * @param outfile 出力ファイル 204 */ 205 public void setOutFile( final String outfile ) { this.outfile = outfile; } 206 207 /** 208 * comments をセットします。 209 * 210 * @param comments コメント 211 */ 212 public void setComments( final String comments ) { this.comments = comments; } 213 214 /** 215 * ykno をセットします。 216 * 217 * @param ykno 要求番号 218 */ 219 public void setYkno( final String ykno ) { this.ykno = ykno; } 220 221 /** 222 * ykno を取得します。 223 * 224 * @return 要求番号 225 */ 226 public String getYkno() { return ykno; } 227 228 /** 229 * 新たな要求番号を採番します(シーケンスより取得) 230 * 採番後、内部の要求番号(ykno)もこの値に再セットされます。 231 * 232 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 233 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 234 * @og.rev 5.9.32.0 (2018/05/02) シーケンスの取り方を変更 235 * 236 * @return 要求番号 237 */ 238 public String makeYkno() { 239 try { 240// String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo ); // 3.8.7.0 (2006/12/15) 241// String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 242// ykno = vals[0][0].trim(); 243 Transaction tran = new TransactionReal( appInfo ); // 5.9.32.0 (2018/05/02)f 244 ykno = Integer.toString(dbName.getSequence(GE50_SEQ, tran, DBID)); 245 } 246 catch( RuntimeException ex ) { 247 String errMsg = "要求番号の採番に失敗しました。" + HybsSystem.CR 248 + " SQL=" + GE50_SEQ + HybsSystem.CR 249 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 250 LogWriter.log( errMsg ); 251 LogWriter.log( ex ); 252 } 253 return ykno ; 254 } 255 256 /** 257 * 帳票要求テーブルにデータをセットします。 258 * 内部変数にセットされている値を利用して、データ登録を行います。 259 * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、 260 * このメソッドを呼び出してください。 261 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 262 * 263 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 264 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 265 * 266 * @param fgkan 完成フラグ 267 */ 268 public void insertGE50( final String fgkan ) { 269 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 270 271 // GE50_INSERT の引数 272 String[] args = new String[] { 273 systemId, // SYSTEM_ID 274 ykno , // YKNO 275 StringUtil.nval( listid,"NO_LIST" ), // LISTID 276 StringUtil.nval( joken,"NO_JOKEN" ), // JOKEN 277 fgkan, // FGKAN 278 StringUtil.nval( outdir,"" ), // OUT_DIR 279 StringUtil.nval( outfile,"" ), // OUT_FILE 280 StringUtil.nval( comments,"" ), // COMMENTS 281 DYSET, // DYSET 282 DYSET, // DYUPD 283 USRSET, // USRSET 284 USRSET, // USRUPD 285 PGUPD, // PGUPD 286 DMN_NAME, // DMN_NAME 287 HybsSystem.HOST_NAME // DMN_HOST 288 } ; 289 290 try { 291// DBUtil.dbExecute( GE50_INSERT,args,appInfo ); // 3.8.7.0 (2006/12/15) 292 DBUtil.dbExecute( GE50_INSERT,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 293 } 294 catch( RuntimeException ex ) { 295 String errMsg = "帳票要求テーブルデータセットに失敗しました。" + HybsSystem.CR 296 + " SQL=" + GE50_INSERT + HybsSystem.CR 297 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 298 LogWriter.log( errMsg ); 299 LogWriter.log( ex ); 300 } 301 } 302 303 /** 304 * 処理終了後に完成フラグを設定します。 305 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 306 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 307 * 308 * @og.rev 3.8.0.4 (2005/08/08) PGUPDを追加 309 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 310 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 311 * 312 * @param fgkan 完成フラグ 313 */ 314 public void updateGE50( final String fgkan ) { 315 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 316 317 String[] args = new String[] { 318 fgkan, // FGKAN 319 DYSET, // DYUPD 320 DMN_NAME, // DMN_NAME 321 HybsSystem.HOST_NAME, // DMN_HOST 322 systemId, // SYSTEM_ID 323 ykno // YKNO 324 } ; 325 326 try { 327// DBUtil.dbExecute( GE50_UPDATE,args,appInfo ); // 3.8.7.0 (2006/12/15) 328 DBUtil.dbExecute( GE50_UPDATE,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 329 } 330 catch( RuntimeException ex ) { 331 String errMsg = "完成フラグ設定に失敗しました。" + HybsSystem.CR 332 + " SQL=" + GE50_UPDATE + HybsSystem.CR 333 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 334 LogWriter.log( errMsg ); 335 LogWriter.log( ex ); 336 } 337 } 338 339 /** 340 * エラー発生時に、エラーメッセージを登録します。 341 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 342 * 343 * @og.rev 3.8.5.3 (2006/06/30) エラーメッセージを 4000Byte以下にする。 344 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 345 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 346 * 347 * @param inErrMsg エラーメッセージ 348 */ 349 public void insertErrorGE56( final String inErrMsg ) { 350 351 String outErrMsg = (inErrMsg == null) ? "" : inErrMsg.trim(); 352 if( outErrMsg.length() > 2000 ) { 353 String code = HybsSystem.sys( "DB_ENCODE" ); 354 byte[] byteValue = StringUtil.makeByte( outErrMsg,code ); 355 if( byteValue.length > 4000 ) { 356 outErrMsg = StringUtil.makeString( byteValue,0,4000,code ); 357 } 358 } 359 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 360 361 String[] args = new String[] { 362 systemId, 363 ykno, 364 outErrMsg , // ERRMSG 365 DYSET, // DYSET 366 DYSET, // DYUPD 367 USRSET, // USRSET 368 USRSET, // USRUPD 369 PGUPD }; // PGUPD 370 371 try { 372// DBUtil.dbExecute( GE56_ERRMSG,args,appInfo ); // 3.8.7.0 (2006/12/15) 373 DBUtil.dbExecute( GE56_ERRMSG,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 374 } 375 catch( RuntimeException ex ) { 376 String errMsg = "エラーメッセージテーブルセットに失敗しました。" + HybsSystem.CR 377 + " SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "]" + HybsSystem.CR 378 + " SQL=" + GE56_ERRMSG + HybsSystem.CR 379 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 380 LogWriter.log( errMsg ); 381 LogWriter.log( ex ); 382 } 383 sendMail( outErrMsg ); // 3.8.0.4 (2005/08/08) 384 } 385 386 /** 387 * substring を補完する簡易メソッド 388 * 389 * substring で、文字をカットする場合、文字列長が、カットする文字数より 390 * 長い必要があります。ここでは、最大長に制限をかけることが目的なので 391 * 入力文字長が指定文字数より小さいケースがあります。そのチェックを 392 * 簡易的に実行できるように、このメソッドで処理します。 393 * 394 * @param in 入力文字 395 * @param len 最大文字数 396 * @param defVal NULL 時の初期値 397 * 398 * @return 指定の文字数でカットされた新しい文字列 399 */ 400 private String substr( final String in, final int len, final String defVal ) { 401 String rtn = in; 402 if( in == null ) { 403 rtn = defVal; 404 } 405 else if( in.length() > len ) { 406 rtn = in.substring( 1,len ); 407 } 408 409 return rtn ; 410 } 411 412 /** 413 * エラー情報のメール送信を行います。 414 * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 415 * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 416 * がすべて設定されている場合に、送信されます。 417 * 418 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 419 * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み 420 * 421 * @param inErrMsg エラーメッセージ 422 */ 423 private void sendMail( final String inErrMsg ) { 424 425 String host = HybsSystem.sys( "COMMON_MAIL_SERVER" ); 426 String from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" ); 427 String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) ); 428 String match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29) 429 430 if( host != null && from != null && to.length > 0 ) { 431 if( match_txt == null || match_txt.length() == 0 432 || listid == null || listid.length() == 0 433 || listid.matches( match_txt ) ){ // 5.7.0.4 (2013/11/29) 434 // 3.8.5.0 (2006/03/02) DMN_NAME、DMN_HOST 追加 435 // 5.7.0.4 (2013/11/29) listid追加 436 String subject = "SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "] , " 437 + "DMN_NAME=[" + DMN_NAME + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" 438 + "LISTID=[" + listid +"]"; 439 try { 440 MailTX tx = new MailTX( host ); 441 // tx.setHost( host ); 442 tx.setFrom( from ); 443 tx.setTo( to ); 444 tx.setSubject( "帳票エラー:" + subject ); 445 tx.setMessage( inErrMsg ); 446 tx.sendmail(); 447 } 448 catch( Throwable ex ) { 449 String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR 450 + " SUBJECT:" + subject + HybsSystem.CR 451 + " HOST:" + host + HybsSystem.CR 452 + " FROM:" + from + HybsSystem.CR 453 + " TO:" + Arrays.toString( to ) + HybsSystem.CR 454 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 455 LogWriter.log( errMsg ); 456 LogWriter.log( ex ); 457 } 458 } 459 } 460 } 461}