567 lines
28 KiB
C#

using Foresight.Data;
using Foresight.Fleet.Services.Asset;
using Foresight.ServiceModel;
using IronIntel.Contractor.Users;
using IronIntel.Services.Business.Admin;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static IronIntel.Contractor.MapView.MachinesMapViewerManagement;
namespace IronIntel.Contractor.Maintenance
{
public class AlertManager : BusinessBase
{
public AlertManager(string dbstr) : base(dbstr)
{
}
const string SEL_ALERT = "select ALERTID,ALERTTYPE,ALERTTIME_UTC,COMPLETED,MACHINEID,VIN,MACHINENAME,ENGINGHOURS,ALERTDESC,PMTYPE from ALERTS";
public MachineInfoForAlert[] SearchMachineAlerts(string sessionid, string filtertext, string[] alertstatus, string[] alerttypes, string[] assetgroups, DateTime beginDate, DateTime endDate, string useriid)
{
string SQL = @"select a.ALERTID,w.WORKORDERID,wo.STATUS,ALERTTYPE,a.ALERTTIME_UTC,ISNULL(COMPLETED,0) COMPLETED,a.MACHINEID,a.VIN,a.MACHINENAME,a.ENGINGHOURS,m.ENGINEHOURS as CENGINGHOURS,ALERTDESC,m.MACHINENAME2
,a.MAKEID,a.MODELID,pit.SERVICEDESCRIPTION
,(select count(1) from WORKORDER wo1 where wo1.MACHINEID=a.MACHINEID and wo1.STATUS<>'Completed') as OpenWorkOrderCount,m.ONROAD,a.PMTYPE from ALERTS a with (nolock)
left join WORKORDER_ALERTS w with (nolock) on a.ALERTID=w.ALERTID
left join WORKORDER wo with (nolock) on w.WORKORDERID=wo.WORKORDERID
left join MACHINES m with (nolock) on a.MACHINEID=m.MACHINEID
left join PM_ALERTS pa with (nolock) on a.ALERTID=pa.ALERTID
left join PM_INTERAVLS pit with (nolock) on pa.PMINTERVALID=pit.PMINTERVALID
where m.MACHINEID is not null and (m.HIDE=0 or m.HIDE is null) and ISNULL(ACKNOWLEDGED,0)<>1 and a.ALERTTIME_UTC>={0} and a.ALERTTIME_UTC<={1} ";
if (Array.IndexOf(alertstatus, "Completed") >= 0 && Array.IndexOf(alertstatus, "Uncompleted") < 0)
SQL = SQL + " and ISNULL(COMPLETED,0)=1 ";
if (Array.IndexOf(alertstatus, "Completed") < 0 && Array.IndexOf(alertstatus, "Uncompleted") >= 0)
SQL = SQL + " and ISNULL(COMPLETED,0)=0 ";
if (Array.IndexOf(alertstatus, "Assigned") >= 0 && Array.IndexOf(alertstatus, "Unassigned") < 0)
SQL = SQL + " and w.WORKORDERID is not null ";
else if (Array.IndexOf(alertstatus, "Assigned") < 0 && Array.IndexOf(alertstatus, "Unassigned") >= 0)
SQL = SQL + " and w.WORKORDERID is null ";
if (assetgroups.Length > 0)//asset group
{
SQL = SQL + string.Format(" and exists(select 1 from MACHINEGROUPMAP mg where mg.MACHINEID=m.MACHINEID and GROUPID in ('{0}'))", string.Join("','", assetgroups));
}
string SQL_FILTER = SQL + " and (ALERTTYPE like {0} or a.MACHINEID like {0} or a.VIN like {0} or a.MACHINENAME like {0} or m.MACHINENAME2 like {0} or ALERTDESC like {0} or SERVICEDESCRIPTION like {0})";
string ORDER_BY = " order by ALERTID";
double timeadjust = SystemParams.GetHoursOffset();
if (beginDate != Helper.DBMinDateTime)
beginDate = beginDate.AddHours(-timeadjust);
if (endDate != DateTime.MaxValue)
endDate = endDate.AddHours(-timeadjust);
DataTable dt = GetDataTableBySQL(SQL + ORDER_BY, beginDate, endDate);
if (dt.Rows.Count == 0)
{
return new MachineInfoForAlert[0];
}
long[] availableAssetsids = null;
var user = Users.UserManagement.GetUserByIID(useriid);
if (user.UserType < Users.UserTypes.Admin)
availableAssetsids = FleetServiceClientHelper.CreateClient<AssetQueryClient>(sessionid).GetAvailableAssetsForUsers(SystemParams.CompanyID, useriid);
MachineServiceClient2 mc = SystemParams.GetMachineServiceClient();
MachineMake[] _makes = mc.GetMachineMakes();
MachineModel[] _models = mc.GetMachineModels();
List<MachineInfoForAlert> results = new List<MachineInfoForAlert>(dt.Rows.Count);
Dictionary<string, AssetEngineHour> machineEngineHours = GetAssetEngineHour();
foreach (DataRow dr in dt.Rows)
{
long mid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
continue;
string alerttype = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty).Trim();
if (alerttypes.Length > 0 && !alerttypes.Contains(alerttype))//alerttype
continue;
AlertInfo ai = ConvertToAlertInfo(dr, timeadjust);
ai.ServiceDescription = FIDbAccess.GetFieldString(dr["SERVICEDESCRIPTION"], string.Empty);
ai.WorkOrderID = FIDbAccess.GetFieldInt(dr["WORKORDERID"], 0);
ai.WorkOrderStatus = FIDbAccess.GetFieldString(dr["STATUS"], string.Empty);
ai.MakeID = FIDbAccess.GetFieldInt(dr["MAKEID"], 0);
ai.ModelID = FIDbAccess.GetFieldInt(dr["MODELID"], 0);
string name2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
string showname = name2;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.MachineName;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.VIN;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.MachineID.ToString();
ai.MachineName = showname;
MachineMake mk = _makes.FirstOrDefault(m => m.ID == ai.MakeID);
if (mk != null)
ai.Make = mk.Name;
MachineModel md = _models.FirstOrDefault(m => m.ID == ai.ModelID);
if (md != null)
ai.Model = md.Name;
MachineInfoForAlert mi = results.FirstOrDefault((i) => i.MachineID == ai.MachineID);
if (mi == null)
{
mi = new MachineInfoForAlert();
mi.MachineID = ai.MachineID;
mi.MachineName = ai.MachineName;
mi.VIN = ai.VIN;
mi.Make = ai.Make;
mi.Model = ai.Model;
mi.EngineHours = FIDbAccess.GetFieldDouble(dr["CENGINGHOURS"], 0);// ai.EngineHours;
if (machineEngineHours.ContainsKey(mi.MachineID.ToString()))
{
var meh = machineEngineHours[mi.MachineID.ToString()];
mi.EngineHours = meh.EngineHours;
}
if (!string.IsNullOrWhiteSpace(filtertext))
{
if (Helper.Contains(ai.AlertType, filtertext)
|| Helper.Contains(ai.MachineID.ToString(), filtertext)
|| Helper.Contains(ai.VIN, filtertext)
|| Helper.Contains(ai.MachineName, filtertext)
|| Helper.Contains(ai.Description, filtertext)
//|| Helper.Contains(ai.ServiceDescription, filtertext)
|| Helper.Contains(mi.Make, filtertext)
|| Helper.Contains(mi.Model, filtertext))
results.Add(mi);
}
else
results.Add(mi);
}
if (ai.PMType == "PM_ALERT" || ai.PMType == "TBM_ALERT" || ai.PMType == "HM_ALERT"
|| ai.PMType == "RDM_ALERT" || ai.PMType == "ADM_ALERT")
mi.PMAlertCount++;
else if (ai.AlertType == "Red-Inspect" || ai.AlertType == "Yellow-Inspect" || ai.AlertType == "Info-Inspect")
mi.InspectAlertCount++;
else
mi.DTCAlertCount++;
AlertInfo oildai = mi.Alerts.FirstOrDefault(m => m.Description == ai.Description && m.MachineID == ai.MachineID);
if (oildai == null)
{
ai.AlertCount = 1;
mi.Alerts.Add(ai);
}
else
{
ai.AlertCount = oildai.AlertCount;
int index = mi.Alerts.IndexOf(oildai);
if (ai.AlertTime_UTC > oildai.AlertTime_UTC)
{
ai.AlertCount++;
mi.Alerts[index] = ai;
}
else
mi.Alerts[index].AlertCount++;
}
mi.OpenWorkOrders = FIDbAccess.GetFieldInt(dr["OpenWorkOrderCount"], 0);
//mi.OpenWorkOrders = mi.Alerts.Where(m => m.WorkOrderID != 0 && m.WorkOrderStatus != "Completed").Select(m => m.WorkOrderID).Distinct().Count();
var timealerts = mi.Alerts.OrderByDescending(m => m.AlertTime_UTC).ToArray();
mi.LatestAlertDateTime = timealerts == null ? DateTime.MinValue : timealerts[0].AlertTime_UTC;
}
return results.ToArray();
}
public AlertInfo[] SearchAcknowledgedAlerts(string sessionid, string filtertext, string[] alertstatus, string[] alerttypes, string[] assetgroups, DateTime beginDate, DateTime endDate, string useriid)
{
string SQL = @"select a.ALERTID,w.WORKORDERID,wo.STATUS,ALERTTYPE,a.ALERTTIME_UTC,COMPLETED,a.MACHINEID,a.VIN,a.MACHINENAME, ENGINGHOURS,ALERTDESC,m.MACHINENAME2
,a.MAKEID,a.MODELID,pit.SERVICEDESCRIPTION,a.PMTYPE
,(select count(1) from WORKORDER wo1 where wo1.MACHINEID=a.MACHINEID and wo1.STATUS<>'Completed') as OpenWorkOrderCount
,a.ACKNOWLEDGEDBY,a.ACKNOWLEDGEDDATE_UTC,a.ACKNOWLEDGMENTCOMMENT
from ALERTS a with (nolock)
left join WORKORDER_ALERTS w with (nolock) on a.ALERTID=w.ALERTID
left join WORKORDER wo with (nolock) on w.WORKORDERID=wo.WORKORDERID
left join MACHINES m with (nolock) on a.MACHINEID=m.MACHINEID
left join PM_ALERTS pa with (nolock) on a.ALERTID=pa.ALERTID
left join PM_INTERAVLS pit with (nolock) on pa.PMINTERVALID=pit.PMINTERVALID
where m.MACHINEID is not null and (m.HIDE=0 or m.HIDE is null) and ISNULL(ACKNOWLEDGED,0)=1 and a.ALERTTIME_UTC>={0} and a.ALERTTIME_UTC<={1} ";
if (assetgroups.Length > 0)//asset group
{
SQL = SQL + string.Format(" and exists(select 1 from MACHINEGROUPMAP mg where mg.MACHINEID=m.MACHINEID and GROUPID in ('{0}'))", string.Join("','", assetgroups));
}
const string ORDER_BY = " order by ALERTID";
double timeadjust = SystemParams.GetHoursOffset();
if (beginDate != Helper.DBMinDateTime)
beginDate = beginDate.AddHours(-timeadjust);
if (endDate != DateTime.MaxValue)
endDate = endDate.AddHours(-timeadjust);
DataTable dt = GetDataTableBySQL(SQL + ORDER_BY, beginDate, endDate);
if (dt.Rows.Count == 0)
{
return new AlertInfo[0];
}
long[] availableAssetsids = null;
var user = Users.UserManagement.GetUserByIID(useriid);
if (user.UserType < Users.UserTypes.Admin)
availableAssetsids = FleetServiceClientHelper.CreateClient<AssetQueryClient>(sessionid).GetAvailableAssetsForUsers(SystemParams.CompanyID, useriid);
MachineServiceClient2 mc = SystemParams.GetMachineServiceClient();
MachineMake[] _makes = mc.GetMachineMakes();
MachineModel[] _models = mc.GetMachineModels();
UserInfo[] _users = UserManagement.GetAllAvailableUsers();
List<AlertInfo> result = new List<AlertInfo>(dt.Rows.Count);
foreach (DataRow dr in dt.Rows)
{
long mid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
continue;
string alerttype = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty).Trim();
if (alerttypes.Length > 0 && !alerttypes.Contains(alerttype))//alerttype
continue;
AlertInfo ai = ConvertToAlertInfo(dr, timeadjust);
ai.ServiceDescription = FIDbAccess.GetFieldString(dr["SERVICEDESCRIPTION"], string.Empty);
ai.WorkOrderID = FIDbAccess.GetFieldInt(dr["WORKORDERID"], 0);
ai.WorkOrderStatus = FIDbAccess.GetFieldString(dr["STATUS"], string.Empty);
ai.MakeID = FIDbAccess.GetFieldInt(dr["MAKEID"], 0);
ai.ModelID = FIDbAccess.GetFieldInt(dr["MODELID"], 0);
string name2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
string showname = name2;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.MachineName;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.VIN;
if (string.IsNullOrWhiteSpace(showname))
showname = ai.MachineID.ToString();
ai.MachineName = showname;
MachineMake mk = _makes.FirstOrDefault(m => m.ID == ai.MakeID);
if (mk != null)
ai.Make = mk.Name;
MachineModel md = _models.FirstOrDefault(m => m.ID == ai.ModelID);
if (md != null)
ai.Model = md.Name;
ai.AcknowledgedBy = FIDbAccess.GetFieldString(dr["ACKNOWLEDGEDBY"], string.Empty);
ai.AcknowledgedTime_UTC = FIDbAccess.GetFieldDateTime(dr["ACKNOWLEDGEDDATE_UTC"], DateTime.MinValue);
if (ai.AcknowledgedTime_UTC != DateTime.MinValue)
ai.AcknowledgedTime_UTC = ai.AcknowledgedTime_UTC.AddHours(timeadjust);
ai.AcknowledgedComment = FIDbAccess.GetFieldString(dr["ACKNOWLEDGMENTCOMMENT"], string.Empty);
if (!string.IsNullOrWhiteSpace(ai.AcknowledgedBy))
{
UserInfo ui = _users.FirstOrDefault(m => m.IID == ai.AcknowledgedBy);
if (ui != null)
ai.AcknowledgedByName = ui.DisplayName;
}
ai.OpenWorkOrderCount = FIDbAccess.GetFieldInt(dr["OpenWorkOrderCount"], 0);
AlertInfo existAlert = result.FirstOrDefault(m => m.Description == ai.Description && m.MachineID == ai.MachineID && m.AcknowledgedComment == ai.AcknowledgedComment);
if (existAlert == null)
{
ai.AlertCount = 1;
if (!string.IsNullOrWhiteSpace(filtertext))
{
if (Helper.Contains(ai.AlertType, filtertext)
|| Helper.Contains(ai.MachineID.ToString(), filtertext)
|| Helper.Contains(ai.VIN, filtertext)
|| Helper.Contains(ai.MachineName, filtertext)
|| Helper.Contains(ai.Description, filtertext)
//|| Helper.Contains(ai.ServiceDescription, filtertext)
|| Helper.Contains(ai.Make, filtertext)
|| Helper.Contains(ai.Model, filtertext))
result.Add(ai);
}
else
result.Add(ai);
}
else
{
existAlert.AlertCount++;
if (ai.AlertTime_UTC > existAlert.AlertTime_UTC)
existAlert.AlertTime_UTC = ai.AlertTime_UTC;
}
}
return result.ToArray();
}
public StringKeyValue[] GetAlertTypes()
{
const string SQL = "select distinct ltrim(rtrim(ALERTTYPE)) as ALERTTYPE from ALERTS where ISNULL(ALERTTYPE,'')<>'' order by ALERTTYPE";
DataTable tb = GetDataTableBySQL(SQL);
if (tb.Rows.Count == 0)
{
return new StringKeyValue[0];
}
List<StringKeyValue> list = new List<StringKeyValue>();
foreach (DataRow dr in tb.Rows)
{
string type = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty);
StringKeyValue kv = new StringKeyValue();
kv.Key = type;
kv.Value = type;
list.Add(kv);
}
return list.ToArray();
}
public AlertInfo[] GetAlertByID(long[] alertid)
{
if (alertid == null || alertid.Length == 0)
return new AlertInfo[0];
string SQL = SEL_ALERT + string.Format(" where ALERTID in ({0})", string.Join(",", alertid));
DataTable tb = GetDataTableBySQL(SQL);
if (tb.Rows.Count == 0)
{
return new AlertInfo[0];
}
List<AlertInfo> ls = new List<AlertInfo>(tb.Rows.Count);
double timeadjust = SystemParams.GetHoursOffset();
foreach (DataRow dr in tb.Rows)
{
ls.Add(ConvertToAlertInfo(dr, timeadjust));
}
return ls.ToArray();
}
public AlertInfo[] GetAlertsByWorkOrder(long workorderid)
{
const string SQL = @"select a.ALERTID,ALERTTYPE,a.ALERTTIME_UTC,COMPLETED,a.MACHINEID,a.VIN,a.MACHINENAME,a.ENGINGHOURS,a.ALERTDESC,pit.SERVICEDESCRIPTION,a.PMTYPE from ALERTS a
left join PM_ALERTS pa on a.ALERTID=pa.ALERTID left join PM_INTERAVLS pit on pa.PMINTERVALID=pit.PMINTERVALID
where a.ALERTID in (select ALERTID from WORKORDER_ALERTS where WORKORDERID={0}) order by ALERTID";
DataTable tb = GetDataTableBySQL(SQL, workorderid);
if (tb.Rows.Count == 0)
{
return new AlertInfo[0];
}
List<AlertInfo> ls = new List<AlertInfo>(tb.Rows.Count);
double timeadjust = SystemParams.GetHoursOffset();
foreach (DataRow dr in tb.Rows)
{
AlertInfo ai = ConvertToAlertInfo(dr, timeadjust);
ai.ServiceDescription = FIDbAccess.GetFieldString(dr["SERVICEDESCRIPTION"], string.Empty);
ls.Add(ai);
}
return ls.ToArray();
}
public AlertInfo[] GetAlertsByAlerts(long[] alertids)
{
const string SQL = SEL_ALERT + " where ALERTID in ({ALERTIDS}) order by ALERTID";
string gids = "'" + string.Join("','", alertids) + "'";
DataTable tb = GetDataTableBySQL(SQL.Replace("{ALERTIDS}", gids));
if (tb.Rows.Count == 0)
{
return new AlertInfo[0];
}
List<AlertInfo> ls = new List<AlertInfo>(tb.Rows.Count);
double timeadjust = SystemParams.GetHoursOffset();
foreach (DataRow dr in tb.Rows)
{
ls.Add(ConvertToAlertInfo(dr, timeadjust));
}
return ls.ToArray();
}
public AlertInfo[] GetAlertsByMachineID(long machineid)
{
const string SQL = SEL_ALERT + " where MACHINEID={0} and ISNULL(COMPLETED,0)=0 and ALERTID not in(select ALERTID from WORKORDER_ALERTS)";
DataTable tb = GetDataTableBySQL(SQL, machineid);
if (tb.Rows.Count == 0)
{
return new AlertInfo[0];
}
List<AlertInfo> ls = new List<AlertInfo>(tb.Rows.Count);
double timeadjust = SystemParams.GetHoursOffset();
foreach (DataRow dr in tb.Rows)
{
AlertInfo ai = ConvertToAlertInfo(dr, timeadjust);
AlertInfo oildai = ls.FirstOrDefault(m => m.Description == ai.Description);
if (oildai == null)
{
ai.AlertCount = 1;
ls.Add(ai);
}
else
{
ai.AlertCount = oildai.AlertCount;
int index = ls.IndexOf(oildai);
if (ai.AlertTime_UTC > oildai.AlertTime_UTC)
{
ai.AlertCount++;
ls[index] = ai;
}
else
ls[index].AlertCount++;
}
}
return ls.ToArray();
}
public void AcknowledgeAlert(string useriid, long[] alertids, string acknowledgmentcomment)
{
const string SQL = "update ALERTS set ACKNOWLEDGED=1,ACKNOWLEDGEDBY={1},ACKNOWLEDGMENTCOMMENT={2},ACKNOWLEDGEDDATE_UTC=GETUTCDATE() where ALERTID={0}";
const string SQL_S = "select ALERTID from ALERTS where ISNULL(ACKNOWLEDGED,0)<>1 and ISNULL(COMPLETED,0)<>1 and MACHINEID=(select MACHINEID from ALERTS where ALERTID={0}) and ALERTDESC=(select ALERTDESC from ALERTS where ALERTID={0}) ";
if (alertids != null && alertids.Length > 0)
{
FISqlConnection db = new FISqlConnection(DbConnectionString);
foreach (long aid in alertids)
{
DataTable dt = db.GetDataTableBySQL(SQL_S, aid);
if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
long alertid = FIDbAccess.GetFieldInt64(dr["ALERTID"], 0);
ExecSQL(SQL, alertid, useriid, acknowledgmentcomment);
}
}
}
}
}
public void AssignedAlertsToWorkOrder(long workorderid, long[] alertid)
{
const string SQL_Del = "delete from WORKORDER_ALERTS where WORKORDERID={0}";
const string SQL_ALERT = "insert into WORKORDER_ALERTS(WORKORDERID,ALERTID,ADDEDON_UTC) values({0},{1},GETUTCDATE())";
ExecSQL(SQL_Del, workorderid);
if ((alertid != null) && (alertid.Length > 0))
{
foreach (long aid in alertid)
{
ExecSQL(SQL_ALERT, workorderid, aid);
}
}
}
private static void AddMaintenanceLog(AlertInfo alert, List<Tuple<long, double, double, string>> machines, string useriid, FISqlConnection db)
{
const string SQL_MR = @" insert into MAINTENANCELOG(MAINTENANCEID,MACHINEID,MAINTENANCEDATE,MAINTENANCEHOURS,NOTES,ADDEDBY,ADDEDON,LASTUPDATEDBY,LASTUPDATEDON,
ALERTID,ODOMETER,ODOMETERUOM,LOGTYPE,COMPLETEDBY,COMPLETED,COMPLETEDDATE_UTC) values({0},{1},getdate(),{2},{3},{4},GETUTCDATE(),{4},GETUTCDATE(),{5},{6},{7},{8},{4},1,GETUTCDATE())";
string logtype = "";
double enginehours = 0;
double odometer = 0;
string odometeruom = "";
var machine = machines.FirstOrDefault(m => m.Item1 == alert.MachineID);
if (machine != null)
{
if (string.Compare(alert.PMType, "HM_ALERT", true) == 0
|| string.Compare(alert.PMType, "PM_ALERT", true) == 0
|| string.Compare(alert.PMType, "TBM_ALERT", true) == 0)
{
logtype = "Hours";
enginehours = machine.Item2;
enginehours = enginehours > 0 ? enginehours : 0;
}
else if (string.Compare(alert.PMType, "ADM_ALERT", true) == 0
|| string.Compare(alert.PMType, "RDM_ALERT", true) == 0)
{
logtype = "Distance";
odometer = machine.Item3;
odometer = odometer > 0 ? odometer : 0;
odometeruom = machine.Item4;
}
}
db.ExecSQL(SQL_MR, Guid.NewGuid().ToString().ToUpper(), alert.MachineID, enginehours, alert.Description, useriid,
alert.AlertID, odometer, odometeruom, logtype);
}
private static List<Tuple<long, double, double, string>> GetMachines(FISqlConnection db)
{
const string SQL = "select MACHINEID,ENGINEHOURS,ODOMETER,ODOMETERUOM from MACHINES";
List<Tuple<long, double, double, string>> list = new List<Tuple<long, double, double, string>>();
DataTable dt = db.GetDataTableBySQL(SQL);
foreach (DataRow dr in dt.Rows)
{
long machineid = FIDbAccess.GetFieldInt(dr["MACHINEID"], 0);
double enginhours = FIDbAccess.GetFieldDouble(dr["ENGINEHOURS"], 0);
double odometer = FIDbAccess.GetFieldDouble(dr["ODOMETER"], 0);
string odometeruom = FIDbAccess.GetFieldString(dr["ODOMETERUOM"], string.Empty);
Tuple<long, double, double, string> t = new Tuple<long, double, double, string>(machineid, enginhours, odometer, odometeruom);
list.Add(t);
}
return list;
}
private static StringKeyValue[] GetMachineJobSites(FISqlConnection db)
{
const string SQL = "select jm.MACHINEID,j.JOBSITENAME from JOBSITEMACHINES jm left join JOBSITES j on jm.JOBSITEID=j.JOBSITEID";
List<StringKeyValue> list = new List<StringKeyValue>();
DataTable dt = db.GetDataTableBySQL(SQL);
foreach (DataRow dr in dt.Rows)
{
StringKeyValue kv = new StringKeyValue();
kv.Key = FIDbAccess.GetFieldInt(dr["MACHINEID"], 0).ToString();
kv.Value = FIDbAccess.GetFieldString(dr["JOBSITENAME"], string.Empty);
list.Add(kv);
}
return list.ToArray();
}
private static AlertInfo ConvertToAlertInfo(DataRow dr, double timeadjust)
{
AlertInfo ai = new AlertInfo();
ai.AlertID = FIDbAccess.GetFieldInt(dr["ALERTID"], 0);
ai.AlertType = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty);
ai.AlertTime_UTC = FIDbAccess.GetFieldDateTime(dr["ALERTTIME_UTC"], DateTime.MinValue);
if (ai.AlertTime_UTC != DateTime.MinValue)
ai.AlertTime_UTC = ai.AlertTime_UTC.AddHours(timeadjust);
ai.Completed = FIDbAccess.GetFieldInt(dr["COMPLETED"], 0) == 1;
ai.MachineID = FIDbAccess.GetFieldInt(dr["MACHINEID"], 0);
ai.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
ai.MachineName = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
ai.EngineHours = FIDbAccess.GetFieldDouble(dr["ENGINGHOURS"], 0);
ai.Description = FIDbAccess.GetFieldString(dr["ALERTDESC"], string.Empty);
ai.PMType = FIDbAccess.GetFieldString(dr["PMTYPE"], string.Empty);
return ai;
}
private static Dictionary<string, AssetEngineHour> GetAssetEngineHour()
{
const string SQL_EH = @"select * from(select AssetId as MACHINEID,AsofTime as ASOFTIME_UTC,Amount,UOM,ROW_NUMBER() over(partition by AssetId order by AsofTime desc) as RowIndex from AssetEngineHours where Datasource<>'Calamp') t where RowIndex=1";
DataTable tbeh = null;
string dbString2 = SystemParams.GetIronIntelReportDataDbString(SystemParams.CompanyID);
if (!string.IsNullOrWhiteSpace(dbString2))
{
var db2 = new FISqlConnection(dbString2);
tbeh = db2.GetDataTableBySQL(SQL_EH);
}
Dictionary<string, AssetEngineHour> machineEngineHours = new Dictionary<string, AssetEngineHour>();
if (tbeh != null && tbeh.Rows.Count > 0)
{
foreach (DataRow dr in tbeh.Rows)
{
string mID = FIDbAccess.GetFieldString(dr["MACHINEID"], string.Empty);
var meh = new AssetEngineHour();
meh.EngineHours = FIDbAccess.GetFieldDouble(dr["Amount"], -1);
string uom = FIDbAccess.GetFieldString(dr["UOM"], string.Empty);
if (uom.ToLower() == "s")
meh.EngineHours = meh.EngineHours / 3600;
meh.EngineHoursDate = FIDbAccess.GetFieldDateTime(dr["ASOFTIME_UTC"], DateTime.MinValue);
if (meh.EngineHoursDate != DateTime.MinValue)
meh.EngineHoursDate = meh.EngineHoursDate.AddHours(SystemParams.GetHoursOffset());
machineEngineHours[mID] = meh;
}
}
return machineEngineHours;
}
}
}