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; 019 020import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 021import org.opengion.fukurou.system.DateSet; // 6.4.2.0 (2016/01/29) 022import org.opengion.fukurou.system.LogWriter; 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.fukurou.db.ApplicationInfo; 025import org.opengion.fukurou.db.DBUtil; 026import org.opengion.fukurou.mail.MailTX ; 027import org.opengion.fukurou.db.ConnectionFactory; // 5.9.31.2 (2018/04/20) 028import org.opengion.fukurou.db.DBFunctionName; // 5.9.31.2 (2018/04/20) 029import org.opengion.fukurou.db.Transaction; // 5.9.31.2 (2018/04/20) 030import org.opengion.fukurou.db.TransactionReal; // 5.9.31.2 (2018/04/20) 031 032import java.util.Arrays; 033 034/** 035 * 帳票要求テーブル(GE50)と、エラーテーブル(GE56)に対して、データ書込みを行います。 036 * 037 * このクラスでは、4つの機能を実装しています。 038 * 039 * ●要求番号採番機能: makeYkno() 040 * 新たな要求番号を採番します(シーケンスより取得) 041 * 採番後、内部の要求番号(ykno)もこの値に再セットされます。 042 * ●帳票要求テーブルデータセット機能: insertGE50( final String fgkan ) 043 * 内部変数にセットされている値を利用して、データ登録を行います。 044 * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、 045 * このメソッドを呼び出してください。 046 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 047 * ●完成フラグ設定機能: updateGE50( final String fgkan ) 048 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 049 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 050 * ●エラーメッセージ登録機能: insertErrorGE56( final String inErrMsg ) 051 * エラー発生時に、エラーメッセージを登録します。 052 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 053 * なお、このメソッドは、要求テーブルの完成フラグは、なにもしませんので、 054 * 完成フラグ設定機能と併用してください。 055 * また、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 056 * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 057 * がすべて設定されている場合に、エラー情報のメール送信を行います。 058 * 059 * @og.rev 3.8.0.0 (2005/06/07) 新規追加 060 * @og.group 帳票システム 061 * 062 * @version 4.0 063 * @author Kazuhiko Hasegawa 064 * @since JDK5.0, 065 */ 066public class GE50Access { 067 /** 完成フラグのフラグ定義(登録) {@value} */ 068 public static final String FG_SET = "1"; // 登録 069 /** 完成フラグのフラグ定義(済み) {@value} */ 070 public static final String FG_OK = "2"; // 済み 071 /** 完成フラグのフラグ定義(実行中) {@value} */ 072 public static final String FG_RUN = "3"; // 実行中 073 /** 完成フラグのフラグ定義(手動) {@value} */ 074 public static final String FG_HAND = "4"; // 手動 075 /** 完成フラグのフラグ定義(印刷待ち) {@value} */ 076 public static final String FG_WAIT = "5"; // 印刷待ち 077 /** 完成フラグのフラグ定義(取込済) {@value} */ 078 public static final String FG_DBIN = "6"; // 取込済 Ver 3.8.0.0 079 /** 完成フラグのフラグ定義(デーモンエラー) {@value} */ 080 public static final String FG_ERR1 = "7"; // デーモンエラー 081 /** 完成フラグのフラグ定義(アプリエラー) {@value} */ 082 public static final String FG_ERR2 = "8"; // アプリエラー 083 084 // GE50 の要求番号のシーケンスを取得します。 085// private static final String GE50_SEQ = "SELECT GE50_SEQUENCE.NEXTVAL FROM DUAL" ; 086 private static final String GE50_SEQ = "GE50_SEQUENCE"; // 5.9.31.2 (2018/04/20) 087 088// // 5.2.0.0 (2010/09/01) Ver4互換モード対応 089// // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 090// private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE"; 091// private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR"; 092 093 // GE50 に要求データを設定します。 094 // 5.0.3.0 (2009/11/04) OUTFILE ⇒ OUT_FILE , OUTDIR ⇒ OUT_DIR 095 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 096 // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 097 private static final String GE50_INSERT = 098 "INSERT INTO GE50" + 099// " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,"+OUT_DIR+","+OUT_FILE+",COMMENTS," + 100 " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,OUT_DIR,OUT_FILE,COMMENTS," + 101 " FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD,DMN_NAME,DMN_HOST )" + 102 " VALUES" + 103 " (?,?,?,?,?,?,?,SUBSTRB(?,1,100)," + 104 " '1',?,?,?,?,?,?,? )" ; 105 106 // GE50 の完成フラグを設定するSQL文です。 107 // 3.8.0.4 (2005/08/08) PGUPD も更新するように変更 108 private static final String GE50_UPDATE = 109 "UPDATE GE50 SET FGKAN = ? , DYUPD = ? , DMN_NAME = ? , DMN_HOST = ? " + 110 " WHERE FGJ = '1'" + 111 " AND SYSTEM_ID = ?" + 112 " AND YKNO = ?" ; 113 114 // GE56 のエラー情報を書き込むためのSQL文です。 115 private static final String GE56_ERRMSG = 116 "INSERT INTO GE56" + 117 " ( FGJ,SYSTEM_ID,YKNO,ERRMSG,DYSET,DYUPD,USRSET,USRUPD,PGUPD )" + 118 " VALUES ( '1',? ,? ,? ,? ,? ,? ,? ,? )" ; 119 120 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 121 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 122 123 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 124 private final ApplicationInfo appInfo; 125 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 126 127 private final String USRSET ; 128 private final String PGUPD ; 129 private final String DMN_NAME ; // 3.8.5.0 (2006/03/02) 130 131 private String systemId ; 132 private String ykno ; 133 private String listid ; 134 private String joken ; 135 private String outdir ; 136 private String outfile ; 137 private String comments ; 138// private String fgnoml ; // 5.10.0.0 (2018/06/08) ADD 帳票エラーメールの改修 139 private boolean fgnoml ; // 6.9.8.1 (2018/06/11) 帳票エラーメールの改修(メール不要フラグ=trueで不要、falseが必要) 140 141 protected final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) ); // 5.9.31.2 (2018/04/20) 142 143 /** 144 * ユーザーとプログラムIDを指定して、オブジェクトを構築します。 145 * このオブジェクトを構築した時刻を、DYSET、DYUPD にセットします。 146 * つまり、このオブジェクトで登録する一連のデータは、すべて同一時刻での登録になります。 147 * 148 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 149 * 150 * @param usrset ユーザー 151 * @param prgupd プログラムID 152 * @param dmnName 更新デーモン名 153 */ 154 public GE50Access( final String usrset, final String prgupd ,final String dmnName) { 155 USRSET = substr( usrset, 10, "UNNONE" ) ; 156 PGUPD = substr( prgupd, 10, "UNNONE" ) ; 157 DMN_NAME = substr( dmnName,50, "UNNONE" ) ; 158 159 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 160 if( USE_DB_APPLICATION_INFO ) { 161 appInfo = new ApplicationInfo(); 162 // ユーザーID,IPアドレス,ホスト名 163 appInfo.setClientInfo( USRSET,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 164 // 画面ID,操作,プログラムID 165 appInfo.setModuleInfo( "GE50Access",null,DMN_NAME ); 166 } 167 else { 168 appInfo = null; 169 } 170 } 171 172 /** 173 * systemId をセットします。 174 * 175 * @param systemId システムID 176 */ 177 public void setSystemId ( final String systemId ) { this.systemId = systemId; } 178 179 /** 180 * systemId を取得します。 181 * 182 * @return システムID 183 */ 184 public String getSystemId() { return systemId; } 185 186 /** 187 * listid をセットします。 188 * 189 * @param listid 帳票ID 190 */ 191 public void setListId( final String listid ) { this.listid = listid; } 192 193 /** 194 * joken をセットします。 195 * 196 * @param joken 振分条件 197 */ 198 public void setJoken( final String joken ) { this.joken = joken; } 199 200 /** 201 * outdir をセットします。 202 * 203 * @param outdir 出力DIR 204 */ 205 public void setOutDir( final String outdir ) { this.outdir = outdir; } 206 207 /** 208 * outfile をセットします。 209 * 210 * @param outfile 出力ファイル 211 */ 212 public void setOutFile( final String outfile ) { this.outfile = outfile; } 213 214 /** 215 * comments をセットします。 216 * 217 * @param comments コメント 218 */ 219 public void setComments( final String comments ) { this.comments = comments; } 220 221 /** 222 * ykno をセットします。 223 * 224 * @param ykno 要求番号 225 */ 226 public void setYkno( final String ykno ) { this.ykno = ykno; } 227 228 /** 229 * ykno を取得します。 230 * 231 * @return 要求番号 232 */ 233 public String getYkno() { return ykno; } 234 235 /** 236 * 帳票エラー時のメール不要フラグをセットします(初期値=false:送信する)。 237 * 238 * 帳票エラー時のメール送信は帳票IDの正規表現でコントロール可能でしたが、 239 * ID単位に未送信フラグを持たせてコントロール可能にします。 240 * GE54にFGNOMLカラムを追加し、これが1の場合はエラーメールを送信しないようにします。 241 * 帳票の動作にDBのカラム追加が伴うためバージョンを5.10系に上げます。 242 * エラーメールが不要の場合は、"true", もしくは、1文字の場合のみ、"0" 以外の場合が、 243 * メール不要として、エラーメールを送信しません。 244 * 245 * @og.rev 5.10.0.0 (2018/06/08) ADD 246 * @og.rev 6.9.8.1 (2018/06/11) 帳票エラーメールの改修(メール不要フラグ=trueで不要、falseが必要) 247 * 248// * @param fgnoml メール不要フラグ 249 * @param flag メール不要フラグ 250 */ 251// public void setFgNoMl( final String fgnoml ) { this.fgnoml = fgnoml; } 252 public void setFgNoMl( final String flag ) { 253 fgnoml = StringUtil.nval( flag,fgnoml ); // true,TRUE,0以外の1文字の場合、true、それ以外は、初期値 254 } 255 256 /** 257 * 新たな要求番号を採番します(シーケンスより取得) 258 * 採番後、内部の要求番号(ykno)もこの値に再セットされます。 259 * 260 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 261 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 262 * @og.rev 5.9.31.2 (2018/04/20) シーケンスの取り方を変更 263 * 264 * @return 要求番号 265 */ 266 public String makeYkno() { 267 try { 268// final String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 269// ykno = vals[0][0].trim(); 270 final Transaction tran = new TransactionReal( appInfo ); // 5.9.31.2 (2018/04/20)f 271 ykno = Integer.toString( dbName.getSequence( GE50_SEQ, tran, DBID ) ); 272 } 273 catch( final RuntimeException ex ) { 274 final String errMsg = "要求番号の採番に失敗しました。" + CR 275 + " SQL=" + GE50_SEQ + CR 276 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 277 LogWriter.log( errMsg ); 278 LogWriter.log( ex ); 279 } 280 return ykno ; 281 } 282 283 /** 284 * 帳票要求テーブルにデータをセットします。 285 * 内部変数にセットされている値を利用して、データ登録を行います。 286 * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、 287 * このメソッドを呼び出してください。 288 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 289 * 290 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 291 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 292 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 293 * 294 * @param fgkan 完成フラグ 295 */ 296 public void insertGE50( final String fgkan ) { 297 final String DYSET = DateSet.getDate( "yyyyMMddHHmmss" ) ; // 6.4.2.0 (2016/01/29) 298 299 // GE50_INSERT の引数 300 final String[] args = new String[] { 301 systemId, // SYSTEM_ID 302 ykno , // YKNO 303 StringUtil.nval( listid,"NO_LIST" ), // LISTID 304 StringUtil.nval( joken,"NO_JOKEN" ), // JOKEN 305 fgkan, // FGKAN 306 StringUtil.nval( outdir,"" ), // OUT_DIR 307 StringUtil.nval( outfile,"" ), // OUT_FILE 308 StringUtil.nval( comments,"" ), // COMMENTS 309 DYSET, // DYSET 310 DYSET, // DYUPD 311 USRSET, // USRSET 312 USRSET, // USRUPD 313 PGUPD, // PGUPD 314 DMN_NAME, // DMN_NAME 315 HybsSystem.HOST_NAME // DMN_HOST 316 } ; 317 318 try { 319 DBUtil.dbExecute( GE50_INSERT,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 320 } 321 catch( final RuntimeException ex ) { 322 final String errMsg = "帳票要求テーブルデータセットに失敗しました。" + CR 323 + " SQL=" + GE50_INSERT + CR 324 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 325 LogWriter.log( errMsg ); 326 LogWriter.log( ex ); 327 } 328 } 329 330 /** 331 * 処理終了後に完成フラグを設定します。 332 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 333 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 334 * 335 * @og.rev 3.8.0.4 (2005/08/08) PGUPDを追加 336 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 337 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 338 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 339 * 340 * @param fgkan 完成フラグ 341 */ 342 public void updateGE50( final String fgkan ) { 343 final String DYSET = DateSet.getDate( "yyyyMMddHHmmss" ) ; // 6.4.2.0 (2016/01/29) 344 345 final String[] args = new String[] { 346 fgkan, // FGKAN 347 DYSET, // DYUPD 348 DMN_NAME, // DMN_NAME 349 HybsSystem.HOST_NAME, // DMN_HOST 350 systemId, // SYSTEM_ID 351 ykno // YKNO 352 } ; 353 354 try { 355 DBUtil.dbExecute( GE50_UPDATE,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 356 } 357 catch( final RuntimeException ex ) { 358 final String errMsg = "完成フラグ設定に失敗しました。" + CR 359 + " SQL=" + GE50_UPDATE + CR 360 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 361 LogWriter.log( errMsg ); 362 LogWriter.log( ex ); 363 } 364 } 365 366 /** 367 * エラー発生時に、エラーメッセージを登録します。 368 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 369 * 370 * @og.rev 3.8.5.3 (2006/06/30) エラーメッセージを 4000Byte以下にする。 371 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 372 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 373 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 374 * @og.rev 5.10.0.0 (2018/06/08) メール不要フラグ(fgNoMl)の判定を追加。 375 * @og.rev 6.9.8.1 (2018/06/11) 帳票エラーメールの改修(メール不要フラグ=trueで不要、falseが必要) 376 * 377 * @param inErrMsg エラーメッセージ 378 */ 379 public void insertErrorGE56( final String inErrMsg ) { 380 381 String outErrMsg = (inErrMsg == null) ? "" : inErrMsg.trim(); 382 if( outErrMsg.length() > 2000 ) { 383 final String code = HybsSystem.sys( "DB_ENCODE" ); 384 final byte[] byteValue = StringUtil.makeByte( outErrMsg,code ); 385 if( byteValue.length > 4000 ) { 386 outErrMsg = StringUtil.makeString( byteValue,0,4000,code ); 387 } 388 } 389 final String DYSET = DateSet.getDate( "yyyyMMddHHmmss" ) ; // 6.4.2.0 (2016/01/29) 390 391 final String[] args = new String[] { 392 systemId, 393 ykno, 394 outErrMsg , // ERRMSG 395 DYSET, // DYSET 396 DYSET, // DYUPD 397 USRSET, // USRSET 398 USRSET, // USRUPD 399 PGUPD }; // PGUPD 400 401 try { 402 DBUtil.dbExecute( GE56_ERRMSG,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 403 } 404 catch( final RuntimeException ex ) { 405 final String errMsg = "エラーメッセージテーブルセットに失敗しました。" + CR 406 + " SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "]" + CR 407 + " SQL=" + GE56_ERRMSG + CR 408 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 409 LogWriter.log( errMsg ); 410 LogWriter.log( ex ); 411 } 412 413// sendMail( outErrMsg ); // 3.8.0.4 (2005/08/08) 414 // 5.10.0.0 (2018/06/08) MOD メール不要フラグが1以外の場合、メールを送信します 415// if( !"1".equals(fgnoml) ) { 416 // 6.9.8.1 (2018/06/11) 帳票エラーメールの改修(メール不要フラグ=trueで不要、falseが必要) 417 if( ! fgnoml ) { 418 sendMail( outErrMsg ); // 3.8.0.4 (2005/08/08) 419 } 420 } 421 422 /** 423 * substring を補完する簡易メソッド 424 * 425 * substring で、文字をカットする場合、文字列長が、カットする文字数より 426 * 長い必要があります。ここでは、最大長に制限をかけることが目的なので 427 * 入力文字長が指定文字数より小さいケースがあります。そのチェックを 428 * 簡易的に実行できるように、このメソッドで処理します。 429 * 430 * @param inStr 入力文字 431 * @param len 最大文字数 432 * @param defVal NULL 時の初期値 433 * 434 * @return 指定の文字数でカットされた新しい文字列 435 */ 436 private String substr( final String inStr, final int len, final String defVal ) { 437 return inStr == null 438 ? defVal 439 : inStr.length() > len 440 ? inStr.substring( 0,len ) 441 : inStr ; 442 443 } 444 445 /** 446 * エラー情報のメール送信を行います。 447 * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 448 * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 449 * がすべて設定されている場合に、送信されます。 450 * 451 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 452 * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み 453 * 454 * @param inErrMsg エラーメッセージ 455 */ 456 private void sendMail( final String inErrMsg ) { 457 458 final String host = HybsSystem.sys( "COMMON_MAIL_SERVER" ); 459 final String from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" ); 460 final String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) ); 461 final String match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29) 462 463 if( host != null && from != null && to.length > 0 ) { 464 if( match_txt == null || match_txt.isEmpty() 465 || listid == null || listid.isEmpty() 466 || listid.matches( match_txt ) ){ // 5.7.0.4 (2013/11/29) 467 // 3.8.5.0 (2006/03/02) DMN_NAME、DMN_HOST 追加 468 // 5.7.0.4 (2013/11/29) listid追加 469 final String subject = "SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "] , " 470 + "DMN_NAME=[" + DMN_NAME + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" 471 + "LISTID=[" + listid +"]"; 472 try { 473 final MailTX tx = new MailTX( host ); 474 // tx.setHost( host ); 475 tx.setFrom( from ); 476 tx.setTo( to ); 477 tx.setSubject( "帳票エラー:" + subject ); 478 tx.setMessage( inErrMsg ); 479 tx.sendmail(); 480 } 481 catch( final Throwable ex ) { 482 final String errMsg = "エラー時メール送信に失敗しました。" + CR 483 + " SUBJECT:" + subject + CR 484 + " HOST:" + host + CR 485 + " FROM:" + from + CR 486 + " TO:" + Arrays.toString( to ) + CR 487 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 488 LogWriter.log( errMsg ); 489 LogWriter.log( ex ); 490 } 491 } 492 } 493 } 494}