using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using System.Data.SqlClient;
using Dapper;
using ChatworkBulkSender.Dtos;
using ChatworkBulkSender.Utils;
namespace ChatworkBulkSender.Daos
{
public class SendHistoryDao
{
private readonly DBAccess _db = new DBAccess();
public List<SendHistoryDto> GetSendTypeList(int type)
{
string sql = $@"
SELECT
*,
CASE
WHEN 送信失敗件数 > 0
THEN 'エラーあり'
ELSE '成功'
END AS '送信結果'
FROM dbo.送信履歴
WHERE 送信タイプ = @type
ORDER BY 送信日時 DESC";
var param = new Dictionary<string, object>
{
{"@type",type }
,
};
DataTable dt = _db.ExecQuery(sql,param);
var list = new List<SendHistoryDto>();
foreach (DataRow row in dt.Rows)
{
var dto = new SendHistoryDto
{
SendHistoryId = row.Field<int>("送信履歴ID"),
SendType = row.Field<int>("送信タイプ"),
SuccessCount = row.Field<int>("送信成功件数"),
FailureCount = row.Field<int>("送信失敗件数"),
SenderApiToken = row.Field<string>("C_APIトークン"),
PatternId = row.Field<int>("送信パターンID"),
PatternName = row.Field<string>("送信パターン名称"),
PatternTemplateText = row.Field<string>("送信パターン定型文"),
PatternTarget = row.Field<int>("送信パターン送信対象"),
PatternSortOrder = row.Field<int>("送信パターン並び順"),
SendContents = row.Field<string>("送信内容"),
RegularDestinationSelectType = (Constants.DESTINAION_SELECT_TYPE)Convert.ToInt32(row["定期送信_送信対象"]),
RegularFolderPath = row.Field<string>("定期送信_添付ファイル管理フォルダパス"),
AdhocHasAttachment = row.Field<bool>("不定期送信_添付ファイル有無"),
AdhocAttachmentFilePath = row.Field<string>("不定期送信_添付ファイルパス"),
SendDt = row.Field<DateTime?>("送信日時"),
SendResults = row.Field<string>("送信結果")
,
};
list.Add(dto);
}
return list;
}
public SendHistoryDto GetSendHistory(int sendHistoryId)
{
string sql = $@"
SELECT *
FROM dbo.送信履歴
WHERE 送信履歴ID = @SendHistoryId";
var param = new Dictionary<string, object> {
{ "@SendHistoryId", sendHistoryId },
};
DataTable dt = _db.ExecQuery(sql, param);
foreach (DataRow row in dt.Rows)
{
var dto = new SendHistoryDto
{
SendHistoryId = Convert.ToInt32(row["送信履歴ID"]),
SendType = Convert.ToInt32(row["送信タイプ"]),
SendDt = row["送信日時"] != DBNull.Value
? (DateTime?)Convert.ToDateTime(row["送信日時"])
: null,
SuccessCount = Convert.ToInt32(row["送信成功件数"]),
FailureCount = Convert.ToInt32(row["送信失敗件数"]),
SenderApiToken = row["C_APIトークン"] as string,
PatternId = row["送信パターンID"] != DBNull.Value
? (int?)Convert.ToInt32(row["送信パターンID"])
: null,
PatternName = row["送信パターン名称"] as string,
PatternTemplateText = row["送信パターン定型文"] as string,
PatternTarget = row["送信パターン送信対象"] != DBNull.Value
? (int?)Convert.ToInt32(row["送信パターン送信対象"])
: null,
PatternSortOrder = row["送信パターン並び順"] != DBNull.Value
? (int?)Convert.ToInt32(row["送信パターン並び順"])
: null,
SendContents = row["送信内容"] as string,
RegularDestinationSelectType = (Constants.DESTINAION_SELECT_TYPE)Convert.ToInt32(row["定期送信_送信対象"]),
RegularFolderPath = row["定期送信_添付ファイル管理フォルダパス"] as string,
AdhocHasAttachment = Convert.ToBoolean(row["不定期送信_添付ファイル有無"]),
AdhocAttachmentFilePath = row["不定期送信_添付ファイルパス"] as string,
CreateDate = (DateTime?)Convert.ToDateTime(row["登録日時"]),
CreateBy = row["登録ユーザ"] as string,
WindowsUserName = row["Windowsログインユーザー名"] as string
};
return dto;
}
return null;
}
/// <summary>
/// 送信履歴ヘッダーを登録し、生成された履歴IDを返す。
/// </summary>
/// <param name="dto"></param>
/// <param name="conn"></param>
/// <returns></returns>
public async Task<int> InsertSendHistoryHeaderAsync(BulkSendJobDto dto, SqlConnection conn)
{
const string sql = @"
INSERT INTO dbo.送信履歴
(送信タイプ, 送信日時, C_APIトークン, 送信パターンID, 送信パターン名称,
送信パターン定型文, 送信パターン送信対象, 送信パターン並び順, 送信内容,
定期送信_送信対象, 定期送信_添付ファイル管理フォルダパス,
不定期送信_添付ファイル有無, 不定期送信_添付ファイルパス,
登録日時, 登録ユーザ, Windowsログインユーザー名)
OUTPUT INSERTED.送信履歴ID
VALUES
(@SendType, @SendAt, @ApiToken, @PatternId, @PatternName,
@PatternTemplate, @PatternTarget, @PatternOrder, @Content,
@RegularDestinationSelectType, @RegularAttachmentFolderPath,
@AdhocHasAttachment, @AdhocAttachmentFilePath,
@CreatedAt, @CreatedBy, @WindowsUserName)";
var param = new
{
SendType = dto.SendType,
SendAt = dto.SendCompletedDt,
ApiToken = dto.ApiToken,
PatternId = dto.PatternMaster?.PatternId,
PatternName = dto.PatternMaster?.PatternName,
PatternTemplate = dto.PatternMaster?.TemplateText,
PatternTarget = dto.PatternMaster?.Target,
PatternOrder = dto.PatternMaster?.SortOrder,
Content = dto.SendContents,
RegularDestinationSelectType = dto.RegularDestinationSelectType,
RegularAttachmentFolderPath = dto.RegularAttachmentFolderPath,
AdhocHasAttachment = dto.AdhocHasAttachment,
AdhocAttachmentFilePath = dto.AdhocAttachmentFilePath,
CreatedAt = DateTime.Now,
CreatedBy = Environment.MachineName,
WindowsUserName = Environment.UserName
};
return await conn.ExecuteScalarAsync<int>(sql, param);
}
/// <summary>
/// ヘッダーの成功件数/失敗件数を更新する。
/// </summary>
/// <param name="headerId"></param>
/// <param name="successCount"></param>
/// <param name="failureCount"></param>
/// <param name="conn"></param>
/// <returns></returns>
public async Task UpdateSendHistoryHeaderCountsAsync(int headerId, int successCount, int failureCount, SqlConnection conn)
{
const string sql = @"
UPDATE dbo.送信履歴
SET 送信成功件数 = @SuccessCount,
送信失敗件数 = @FailureCount,
送信日時 = SYSDATETIME()
WHERE 送信履歴ID = @HistoryId";
var param = new
{
SuccessCount = successCount,
FailureCount = failureCount,
HistoryId = headerId
};
await conn.ExecuteAsync(sql, param);
}
}
}