161 lines
7.0 KiB
C#
161 lines
7.0 KiB
C#
using FrontendWebApi.Models;
|
||
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.AspNetCore.Routing;
|
||
using Microsoft.Extensions.Configuration;
|
||
using Microsoft.Extensions.Logging;
|
||
using Newtonsoft.Json;
|
||
using Repository.BackendRepository.Interface;
|
||
using Repository.FrontendRepository.Interface;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace FrontendWebApi.ApiControllers
|
||
{
|
||
public class ReceiveDataDeliveryController : Controller
|
||
{
|
||
private readonly IBackendRepository backendRepository;
|
||
private readonly IFrontendRepository frontendRepository;
|
||
private readonly ILogger<ReceiveDataDeliveryController> logger;
|
||
private string fileSaveAsPath = "";
|
||
|
||
public class ReceiveData
|
||
{
|
||
public int Id { get; set; }
|
||
public string TargetTable { get; set; }
|
||
public string Mode { get; set; }
|
||
public string TargetData { get; set; }
|
||
public List<FileInfo> FileInfos { get; set; }
|
||
}
|
||
public class FileInfo
|
||
{
|
||
public string Folder { get; set; }
|
||
public string OriginalFileName { get; set; }
|
||
public string FileName { get; set; }
|
||
public IFormFile File { get; set; }
|
||
}
|
||
|
||
public ReceiveDataDeliveryController
|
||
(
|
||
ILogger<ReceiveDataDeliveryController> logger,
|
||
IBackendRepository backendRepository,
|
||
IFrontendRepository frontendRepository,
|
||
IConfiguration configuration
|
||
)
|
||
{
|
||
this.logger = logger;
|
||
this.backendRepository = backendRepository;
|
||
this.frontendRepository = frontendRepository;
|
||
|
||
fileSaveAsPath = configuration.GetValue<string>("FileSaveASPath");
|
||
}
|
||
|
||
[HttpPost]
|
||
[Route("api/ReceiveDataDelivery/GetData")]
|
||
public async Task<ActionResult<ApiResult<string>>> GetData(ReceiveData receiveData)
|
||
{
|
||
ApiResult<string> apiResult = new ApiResult<string>();
|
||
|
||
//logger.LogInformation("傳入的內容:{0}", System.Text.Json.JsonSerializer.Serialize(receiveData));
|
||
|
||
var gotoListDictionary = new List<string>() { "insert_list", "update_list", "purge_specify_insert", "purge_all_insert" };
|
||
|
||
try
|
||
{
|
||
//解析要記錄的資料
|
||
if (!string.IsNullOrEmpty(receiveData.TargetData))
|
||
{
|
||
Dictionary<string, object> targetDataDic = new Dictionary<string, object>();
|
||
List<Dictionary<string, object>> targetDataListDic = new List<Dictionary<string, object>>();
|
||
|
||
var json = receiveData.TargetData.ToString();
|
||
if (!gotoListDictionary.Contains(receiveData.Mode.ToLower()))
|
||
{
|
||
targetDataDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(receiveData.TargetData);
|
||
}
|
||
else
|
||
{
|
||
targetDataListDic = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(receiveData.TargetData);
|
||
}
|
||
|
||
//找出pk,確保資料派送要儲存的紀錄
|
||
var pk_sql = $@"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
||
WHERE TABLE_SCHEMA = 'taipei_dome'
|
||
AND TABLE_NAME = @TargetTable
|
||
ORDER BY COLUMN_NAME";
|
||
var pks = await frontendRepository.GetAllAsync<string>(pk_sql, new { TargetTable = receiveData.TargetTable });
|
||
|
||
switch (receiveData.Mode.ToLower())
|
||
{
|
||
case "insert": //儲存資料(單筆)
|
||
await frontendRepository.AddOneFromDataDelivery(receiveData.Id, pks ,targetDataDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "insert_list": //儲存資料(多筆)
|
||
await frontendRepository.AddMutiFromDataDelivery(receiveData.Id, pks, targetDataListDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "update": //更新資料
|
||
case "delete": //軟刪除資料
|
||
await frontendRepository.UpdateOneFromDataDelivery(receiveData.Id, pks, targetDataDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "update_list":
|
||
await frontendRepository.UpdateListFromDataDelivery(receiveData.Id, pks, targetDataListDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "purge_specify_insert": //依據條件實際刪除再新增
|
||
await frontendRepository.PurgeSpecifyInsertFromDataDelivery(receiveData.Id, pks, targetDataListDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "purge_all_insert": //刪除全部再新增
|
||
await frontendRepository.PurgeAllInsertFromDataDelivery(receiveData.Id, pks, targetDataListDic, receiveData.TargetTable);
|
||
break;
|
||
|
||
case "purge": //實際刪除資料
|
||
await frontendRepository.PurgeOneFromDataDelivery(receiveData.Id, pks, targetDataDic, receiveData.TargetTable);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (receiveData.FileInfos != null && receiveData.FileInfos.Count > 0)
|
||
{
|
||
//儲存檔案
|
||
FolderFunction folderFunction = new FolderFunction();
|
||
foreach (var fileInfo in receiveData.FileInfos)
|
||
{
|
||
//刪除原本檔案
|
||
if (!string.IsNullOrEmpty(fileInfo.OriginalFileName))
|
||
{
|
||
folderFunction.DeleteFile(Path.Combine(fileSaveAsPath, fileInfo.Folder, fileInfo.OriginalFileName));
|
||
}
|
||
|
||
//判斷資料夾是否存在
|
||
folderFunction.CreateFolder(Path.Combine(fileSaveAsPath, fileInfo.Folder), 0);
|
||
|
||
var fullPath = Path.Combine(fileSaveAsPath, fileInfo.Folder, fileInfo.FileName);
|
||
|
||
using (var stream = new FileStream(fullPath, FileMode.Create))
|
||
{
|
||
fileInfo.File.CopyTo(stream);
|
||
}
|
||
}
|
||
}
|
||
|
||
apiResult.Code = "0000";
|
||
}
|
||
catch (Exception exception)
|
||
{
|
||
apiResult.Code = "9999";
|
||
logger.LogError("【ReceiveDataDelivery/GetData】" + exception.ToString());
|
||
return BadRequest(apiResult);
|
||
}
|
||
return Ok(apiResult);
|
||
}
|
||
}
|
||
}
|