/// <summary> /// /// </summary> /// <param name="p_invoicerId"></param> /// <param name="p_issue_id"></param> /// <param name="p_newMailAddress"></param> /// <returns></returns> public int DoMailReSend(string p_invoicerId, string p_issue_id, string p_newMailAddress) { IMailer.WriteDebug(p_invoicerId); int _result = -1; var _sqlstr = "UPDATE TB_eTAX_ISSUING " + " SET isInvoiceeMail=@isInvoiceeMail " + " FROM TB_eTAX_ISSUING a INNER JOIN TB_eTAX_INVOICE b " + " ON a.issueId=b.issueId " + " WHERE a.isMailSending!=@isMailSendingX " + " AND ( " + " (RIGHT(b.typeCode, 2) IN ('01', '02', '04') AND b.invoicerId=@invoicerId) " + " OR " + " (RIGHT(b.typeCode, 2) IN ('03', '05') AND b.brokerId=@invoicerId) " + " ) " + " AND a.issueId=@issueId"; var _dbps = new PgDatParameters(); { _dbps.Add("@isMailSendingX", NpgsqlDbType.Varchar, "X"); _dbps.Add("@invoicerId", NpgsqlDbType.Varchar, p_invoicerId); _dbps.Add("@isInvoiceeMail", NpgsqlDbType.Varchar, "X"); _dbps.Add("@issueId", NpgsqlDbType.Varchar, p_issue_id); } if (LSQLHelper.ExecuteText(UAppHelper.ConnectionString, _sqlstr, _dbps) > 0) { var _where = " AND a.issueId=@issueId "; _dbps.Clear(); { _dbps.Add("@issueId", NpgsqlDbType.Varchar, p_issue_id); } lock (SyncEngine) _result = CheckReEnter(p_invoicerId, _where, _dbps); if (_result > 0) { MailingArgs _args = new MailingArgs() { reSending = true, invoiceeEMail = p_newMailAddress, invoicerId = p_invoicerId, noInvoicee = 1, noSending = _result, where = _where, dbps = _dbps }; DoMailing(_args); } } return(_result); }
private int CheckMailing(string p_invoicerId, int p_noInvoicee, string p_where, PgDatParameters p_dbps) { int _noSending = 0; lock (SyncEngine) _noSending = CheckReEnter(p_invoicerId, p_where, p_dbps); if (_noSending > 0) { MailingArgs _args = new MailingArgs() { reSending = false, invoiceeEMail = "", invoicerId = p_invoicerId, noInvoicee = p_noInvoicee, noSending = _noSending, where = p_where, dbps = p_dbps }; // Do not use using statement ThreadPoolWait _doneEvent = new ThreadPoolWait(); _doneEvent.QueueUserWorkItem(DoMailing, _args); if (Environment.UserInteractive == true) { _doneEvent.WaitOne(); } } return(_noSending); }
private void DoMailing(object p_args) { MailingArgs _args = (MailingArgs)p_args; _args.noInvoicee = _args.noSending; _args.noSending = 0; try { int _toprow = 800; var _sqlstr = "SELECT a.issueId, a.document, a.securityId, b.issueDate, b.typeCode, b.invoiceeKind, " + " b.chargeTotal, b.taxTotal, b.grandTotal, b.description, a.isMailSending, " + " b.invoicerId, b.invoicerEMail, b.invoicerName, b.invoicerPerson, b.invoicerPhone, " + " a.isInvoiceeMail, b.invoiceeId, b.invoiceeEMail1 as invoiceeEMail, b.invoiceeName, " + " b.invoiceePerson, b.invoiceePhone1 as invoiceePhone, a.isProviderMail, a.providerId, " + " a.providerEMail, a.sendMailCount, a.mailSendingDate " + " FROM TB_eTAX_ISSUING a INNER JOIN TB_eTAX_INVOICE b " + " ON a.issueId=b.issueId " + " WHERE a.isMailSending=@isMailSendingX " // to avoid infinite loop, do check isMailSending here. + " AND ( " + " (RIGHT(b.typeCode, 2) IN ('01', '02', '04') AND b.invoicerId=@invoicerId) " + " OR " + " (RIGHT(b.typeCode, 2) IN ('03', '05') AND b.brokerId=@invoicerId) " + " ) " + _args.where + " ORDER BY a.providerEMail" + " LIMIT " + _toprow; { _args.dbps.Add("@isMailSendingX", NpgsqlDbType.Varchar, "X"); _args.dbps.Add("@invoicerId", NpgsqlDbType.Varchar, _args.invoicerId); } //if (LogCommands == true) // ELogger.SNG.WriteLog(String.Format("begin: invoicerId->'{0}', noInvoicee->{1}", _args.invoicerId, _args.noInvoicee)); var _random = new Random(); // 만약 InsertDeltaSet을 처리하는 중에 오류가 발생하면 무한 loop를 발생 하게 되므로, // 'X'로 marking한 레코드의 총 갯수를 감소하여 '0'보다 큰 경우에만 반복한다. while (_args.noInvoicee > 0) { IssuingTbl.Clear(); ResultTbl.Clear(); var _workingSet = LSQLHelper.SelectDataSet(UAppHelper.ConnectionString, _sqlstr, _args.dbps); if (LSQLHelper.IsNullOrEmpty(_workingSet) == true) { break; } var _rows = _workingSet.Tables[0].Rows; var _doneEvents = new ThreadPoolWait[_rows.Count]; for (int i = 0; i < _rows.Count; i++) { if (String.IsNullOrEmpty(Convert.ToString(_rows[i]["securityId"])) == true) { _rows[i]["securityId"] = Convert.ToString(_random.Next(100000, 999999)); } if (_args.reSending == true) { _rows[i]["invoiceeEMail"] = _args.invoiceeEMail; } _doneEvents[i] = new ThreadPoolWait(); AsyncWorker _worker = new AsyncWorker(IssuingTbl, ResultTbl); _doneEvents[i].QueueUserWorkItem(_worker.MailerCallback, _rows[i]); if (Environment.UserInteractive == true) { _doneEvents[i].WaitOne(); } } ThreadPoolWait.WaitForAll(_doneEvents); // 처리된 레코드가 한개 이하 인 경우는 종료한다. (문제가 있는 경우로 보여 짐) if (_rows.Count < 1) { break; } //if (LogCommands == true) // ELogger.SNG.WriteLog(String.Format("loop: invoicerId->'{0}', noInvoicee->{1}, noSending->{2}", _args.invoicerId, _args.noInvoicee, _rows.Count)); _args.noInvoicee -= _rows.Count; _args.noSending += IssuingTbl.Rows.Count; LDltaHelper.InsertDeltaSet(UAppHelper.ConnectionString, IssuingSet); } } catch (MailerException ex) { ELogger.SNG.WriteLog(ex); } catch (Exception ex) { ELogger.SNG.WriteLog(ex); } finally { if (LogCommands == true) { ELogger.SNG.WriteLog(String.Format("end: invoicerId->'{0}', noInvoicee->{1}, noSending->{2}", _args.invoicerId, _args.noInvoicee, _args.noSending)); } int _noClearing = ClearXFlag(_args.invoicerId); if (_noClearing > 0) { if (LogCommands == true) { ELogger.SNG.WriteLog(String.Format("clearX: invoicerId->'{0}', noClear->{1}", _args.invoicerId, _noClearing)); } } } }