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