227 lines
8.3 KiB
C#
227 lines
8.3 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.Extensions.Logging;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using SolarPower.Models.User;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.AspNetCore.Mvc.Filters;
|
||
using Dapper;
|
||
using SolarPower.Models;
|
||
using System.Data.SqlClient;
|
||
using Microsoft.Extensions.Configuration;
|
||
using SolarPower.Repository.Interface;
|
||
using System.IO;
|
||
using System.Text;
|
||
using SolarPower.Models.OperatorLogModel;
|
||
using Newtonsoft.Json;
|
||
using SolarPower.Models.Company;
|
||
using SolarPower.Models.Role;
|
||
using Microsoft.AspNetCore.Routing;
|
||
|
||
namespace SolarPower.Controllers
|
||
{
|
||
public class MyBaseController<T> : Controller where T : MyBaseController<T>
|
||
{
|
||
private ILogger<T> _logger;
|
||
|
||
protected ILogger<T> Logger => _logger ?? (_logger = HttpContext?.RequestServices.GetService<ILogger<T>>());
|
||
private IUserRepository userRepository => HttpContext?.RequestServices.GetService<IUserRepository>();
|
||
private ICompanyRepository companyRepository => HttpContext?.RequestServices.GetService<ICompanyRepository>();
|
||
private IRoleRepository roleRepository => HttpContext?.RequestServices.GetService<IRoleRepository>();
|
||
private IPowerStationRepository powerStationRepository => HttpContext?.RequestServices.GetService<IPowerStationRepository>();
|
||
private IOperatorLogRepository operatorLogRepository => HttpContext?.RequestServices.GetService<IOperatorLogRepository>();
|
||
|
||
protected MyUser myUser = null;
|
||
public string controllerName;
|
||
public string actionName;
|
||
public string baseURL => HttpContext?.Request.Scheme + "://" + HttpContext?.Request.Host + "/";
|
||
|
||
public ErrorCode errorCode = new ErrorCode();
|
||
|
||
public MyBaseController()
|
||
{
|
||
}
|
||
|
||
public override void OnActionExecuting(ActionExecutingContext filterContext)
|
||
{
|
||
//base.OnActionExecuting(filterContext);
|
||
|
||
EDFunction edFunction = new EDFunction();
|
||
var myAccount = edFunction.AESDecrypt(HttpContext.Session.GetString("MyAccount")); //取得登入後,該位使用者的Account
|
||
|
||
controllerName = ControllerContext.RouteData.Values["controller"].ToString(); //controller名稱
|
||
actionName = ControllerContext.RouteData.Values["action"].ToString(); //action名稱
|
||
|
||
bool isAjaxCall = filterContext.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest";
|
||
|
||
if (string.IsNullOrEmpty(myAccount))
|
||
{
|
||
|
||
if (isAjaxCall)
|
||
{
|
||
filterContext.HttpContext.Response.Clear();
|
||
filterContext.HttpContext.Response.StatusCode = 499;
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
filterContext.Result = new RedirectToRouteResult(
|
||
new RouteValueDictionary
|
||
{
|
||
{"controller", "Login"},
|
||
{"action", "Index"}
|
||
});
|
||
return;
|
||
}
|
||
}
|
||
|
||
//取得當前登入使用者資訊
|
||
myUser = userRepository.GetMyUserInfoByAccount(myAccount);
|
||
myUser.Company = companyRepository.GetMyCompanyInfoById(myUser.CompanyId);
|
||
myUser.Role = roleRepository.GetMyRoleInfoById(myUser.RoleId);
|
||
|
||
List<string> auth_arr = new List<string>();
|
||
|
||
foreach (var auth in myUser.Role.Auths)
|
||
{
|
||
var per_auch_arr = auth.Split(',');
|
||
foreach (var x in per_auch_arr)
|
||
{
|
||
auth_arr.Add(x);
|
||
}
|
||
}
|
||
|
||
if (myUser.Role.Layer != (int)RoleLayerEnum.PlatformAdmin && !auth_arr.Contains(controllerName))
|
||
{
|
||
filterContext.Result = new RedirectToRouteResult(
|
||
new RouteValueDictionary
|
||
{
|
||
{"controller", "Login"},
|
||
{"action", "SignOut"}
|
||
});
|
||
return;
|
||
}
|
||
|
||
|
||
//取得當前使用者可以查看的電站
|
||
var myPowerStationSummaries = powerStationRepository.GetMyPowerStationSummary(myUser);
|
||
ViewBag.myPowerStationSummaries = myPowerStationSummaries;
|
||
|
||
if (controllerName == "PowerStation" && actionName == "Edit")
|
||
{
|
||
//電站資訊的各電站
|
||
string stationId_param = filterContext.HttpContext.Request.Query["stationId"];
|
||
|
||
int stationId = stationId_param == "new" ? 0 : int.Parse(stationId_param);
|
||
|
||
if (stationId > 0)
|
||
{
|
||
var hasSubTagNum = false;
|
||
int i = 0;
|
||
foreach(var myPowerStationSummary in myPowerStationSummaries)
|
||
{
|
||
if (hasSubTagNum)
|
||
{
|
||
break;
|
||
}
|
||
int j = 0;
|
||
foreach(var myPowerStation in myPowerStationSummary.MyPowerStations)
|
||
{
|
||
if(myPowerStation.PowerStationId == stationId)
|
||
{
|
||
ViewData["SubNum"] = i;
|
||
ViewData["TagNum"] = j;
|
||
hasSubTagNum = true;
|
||
break;
|
||
}
|
||
j++;
|
||
}
|
||
i++;
|
||
}
|
||
}
|
||
}
|
||
|
||
ViewBag.auths = auth_arr;
|
||
|
||
ViewBag.myUser = myUser;
|
||
|
||
#region 記錄人員操作記錄
|
||
var content = JsonConvert.SerializeObject(filterContext.ActionArguments);
|
||
|
||
OperatorLog operatorLog = new OperatorLog()
|
||
{
|
||
ControllerName = controllerName,
|
||
ActionName = actionName,
|
||
Parameter = content.CompareTo("{}") == 0 ? null : content,
|
||
CreatedBy = myUser.Id,
|
||
};
|
||
|
||
List<string> removeParam = new List<string>() { "ChangePassword" }; //移除不紀錄參數的actionName
|
||
if (removeParam.Any(x => actionName.Contains(x)))
|
||
{
|
||
operatorLog.Parameter = "{}";
|
||
}
|
||
|
||
List<string> properties = new List<string>()
|
||
{
|
||
"ControllerName",
|
||
"ActionName",
|
||
"Parameter",
|
||
"CreatedBy",
|
||
};
|
||
operatorLogRepository.Add(operatorLog, properties);
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判斷是否維平台的管理員或平台使用者
|
||
/// </summary>
|
||
/// <param name="roleLayer"></param>
|
||
/// <returns></returns>
|
||
public bool IsPlatformLayer(byte roleLayer)
|
||
{
|
||
if (roleLayer == (int)RoleLayerEnum.PlatformAdmin || roleLayer == (int)RoleLayerEnum.PlatformUser)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取得最新的流水號
|
||
/// </summary>
|
||
/// <param name="current">當前的</param>
|
||
/// <param name="pad"></param>
|
||
/// <param name="direction">0: PadLeft;1: PadRight</param>
|
||
/// <returns></returns>
|
||
public string GetLastSerialNumber(string current = "", int pad = 4, byte direction = 0)
|
||
{
|
||
var tempSerialNumber = 0;
|
||
if (!string.IsNullOrEmpty(current))
|
||
{
|
||
tempSerialNumber = Convert.ToInt32(current) + 1;
|
||
}
|
||
else
|
||
{
|
||
tempSerialNumber = 1;
|
||
}
|
||
|
||
if (direction == 0)
|
||
{
|
||
return tempSerialNumber.ToString().Trim().PadLeft(pad, '0');
|
||
}
|
||
else
|
||
{
|
||
return tempSerialNumber.ToString().Trim().PadRight(pad, '0');
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|