initial version with inspection edition

This commit is contained in:
2020-04-29 14:08:00 +08:00
commit 6a5629fc3b
186 changed files with 33984 additions and 0 deletions

View File

@ -0,0 +1,131 @@
using Foresight.Fleet.Services.AssetHealth;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class AlertInfo
{
public long AlertID { get; set; }
public long WorkOrderID { get; set; }
public string WorkOrderStatus { get; set; }
public string AlertType { get; set; }
public DateTime AlertTime_UTC { get; set; }
public string AlertTime_UTCStr { get { return AlertTime_UTC == DateTime.MinValue ? "" : AlertTime_UTC.ToString(); } }
public bool Completed { get; set; }
public long MachineID { get; set; }
public int ModelID { get; set; }
public string Model { get; set; }
public int MakeID { get; set; }
public string Make { get; set; }
public string VIN { get; set; }
public string MachineName { get; set; }
private double _EngineHours;
public double EngineHours
{
get
{
return _EngineHours;
}
set
{
value = value > 0 ? value : 0;
_EngineHours = Math.Round(value, 2);
}
}
private double _CurrentHours;
public double CurrentHours
{
get
{
return _CurrentHours;
}
set
{
value = value > 0 ? value : 0;
_CurrentHours = Math.Round(value, 2);
}
}
public string Description { get; set; }
public string ServiceDescription { get; set; }
public int AlertCount { get; set; }
public List<long> RepeatedAlerts { get; set; }
public int OpenWorkOrderCount { get; set; }//针对Alert对应的机器
public string PMType { get; set; }
public string AcknowledgedBy { get; set; }
public string AcknowledgedByName { get; set; }
public DateTime AcknowledgedTime_UTC { get; set; }
public string AcknowledgedTime_UTCStr { get { return AcknowledgedTime_UTC == DateTime.MinValue ? "" : AcknowledgedTime_UTC.ToString(); } }
public string AcknowledgedComment { get; set; }
}
public class MachineInfoForAlert
{
public long MachineID { get; set; }
public string VIN { get; set; }
public string MachineName { get; set; }
public string Make { get; set; }
public string Model { get; set; }
private double _EngineHours;
public double EngineHours
{
get
{
return _EngineHours;
}
set
{
value = value > 0 ? value : 0;
_EngineHours = Math.Round(value, 2);
}
}
public int DTCAlertCount { get; set; }
public int PMAlertCount { get; set; }
public int InspectAlertCount { get; set; }
public int OpenWorkOrders { get; set; }
public DateTime LatestAlertDateTime { get; set; }
public string LatestAlertDateTimeStr { get { return LatestAlertDateTime == DateTime.MinValue ? "" : LatestAlertDateTime.ToString(); } }
public List<AlertInfo> Alerts { get; } = new List<AlertInfo>();
}
public class AssetAlertInfo
{
public long ID { get; set; }
public DateTime AlertTime { get; set; }
public string AlertTimeStr { get { return AlertTime == DateTime.MinValue ? "" : AlertTime.ToString(); } }
public string AlertType { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public long AssetID { get; set; }
public string VIN { get; set; }
public string AssetName { get; set; }
public string ModelName { get; set; }
public string MakeName { get; set; }
public string AssetTypeName { get; set; }
private double _EngineHours;
public double EngineHours
{
get
{
return _EngineHours;
}
set
{
value = value > 0 ? value : 0;
_EngineHours = Math.Round(value, 2);
}
}
public bool Completed { get; set; }
public DateTime? CompletedDate { get; set; }
public string CompletedDateStr { get { return CompletedDate == null ? "" : CompletedDate.ToString(); } }
public AssetAlertCategory Category { get; set; }
}
}

View File

@ -0,0 +1,566 @@
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;
}
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class FuelRecordInfo
{
public string RetailerName { get; set; }
public string Notes { get; set; }
public decimal TotalCost { get; set; }
public decimal UnitCost { get; set; }
public decimal Quantity { get; set; }
public string Uom { get; set; }
public string FuelTypeName { get; set; }
public string FuelType { get; set; }
public double Odomerter { get; set; }
public string RetailerZip { get; set; }
public string RetailerState { get; set; }
public string RetailerCity { get; set; }
public string RetailerAddress { get; set; }
public bool IsComesFromAPI { get; set; }
public string DriverName { get; set; }
public string TicketNumber { get; set; }
public DateTime TransactionDate { get; set; }
public string TransactionDateStr { get { return TransactionDate == DateTime.MinValue ? "" : TransactionDate.ToString("MM/dd/yyyy HH:mm"); } }
public string AssetModel { get; set; }
public string AssetMake { get; set; }
public string AssetType { get; set; }
public string VIN { get; set; }
public string AssetName { get; set; }
public long AssetID { get; set; }
public long FuelID { get; set; }
public string DataSource { get; set; }
public string BrandName { get; set; }
}
public class FuelRecordAuditItem : FuelRecordInfo
{
public long LogID { get; set; }
public DateTime LogTime { get; set; }
public string AddedByName { get; set; }
public string AddedBy { get; set; }
public string LasetUpdatedBy { get; set; }
public string LasetUpdatedByName { get; set; }
public DateTime AddedOn { get; set; }
public string AddedOnStr { get { return AddedOn == DateTime.MinValue ? "" : AddedOn.ToString("MM/dd/yyyy HH:mm:ss"); } }
public DateTime LastUpdatedOn { get; set; }
public string LastUpdatedOnStr { get { return LastUpdatedOn == DateTime.MinValue ? "" : LastUpdatedOn.ToString("MM/dd/yyyy HH:mm:ss"); } }
}
}

View File

@ -0,0 +1,211 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data;
using Foresight.Data;
using IronIntel.Contractor.Machines;
namespace IronIntel.Contractor.Maintenance
{
public class IATCAlertsSyncService
{
private static bool isrunning = false;
private static Dictionary<string, string> _AlertTypeMapping = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
public static void Start()
{
if (isrunning)
{
return;
}
isrunning = true;
InitAlertTypeMapping();
Thread thd = new Thread(DoWork);
thd.Start();
}
public static void Stop()
{
isrunning = false;
}
private static void InitAlertTypeMapping()
{
_AlertTypeMapping.Clear();
_AlertTypeMapping["FI-DTCJ1939"] = "FI - DTC";
_AlertTypeMapping["FI-Jpod2"] = "FI - DTC";
_AlertTypeMapping["Green-Inspect"] = "Green-Inspect";
_AlertTypeMapping["INFO"] = "Info";
_AlertTypeMapping["Info-Inspect"] = "Info-Inspect";
_AlertTypeMapping["OTHER-Abnormality"] = "Red";
_AlertTypeMapping["OTHER-Caution"] = "Yellow";
_AlertTypeMapping["OTHER-OilSampleResult"] = "Oil Sample";
_AlertTypeMapping["OTHER-PreventativeMaintenance"] = null;
_AlertTypeMapping["RED"] = "Red";
_AlertTypeMapping["Red-Inspect"] = "Red-Inspect";
_AlertTypeMapping["YELLOW"] = "Yellow";
_AlertTypeMapping["Yellow-Inspect"] = "Yellow-Inspect";
}
private static void DoWork()
{
const int SLEEPTIME = 60;
while (isrunning)
{
DateTime dt1 = DateTime.Now;
try
{
IATCAlertsSyncService svc = new IATCAlertsSyncService();
svc.SyncAlerts();
}
catch
{
}
TimeSpan sp = DateTime.Now - dt1;
int delta = SLEEPTIME - Convert.ToInt32(sp.TotalSeconds);
if (delta < 0)
{
delta = 1;
}
Thread.Sleep(delta * 1000);
}
}
private IATCAlertsSyncService()
{
}
private Dictionary<long, machinedata> _Machines = new Dictionary<long, machinedata>();
private machinedata GetMachinedata(long id)
{
const string SQL = "select MACHINEID,VIN,MACHINENAME,MACHINENAME2,MAKEID,MODELID,TYPEID from MACHINES where MACHINEID={0}";
machinedata m = null;
if (_Machines.TryGetValue(id, out m))
{
return m;
}
FISqlConnection db = SystemParams.GetDbInstance();
DataTable tb = db.GetDataTableBySQL(SQL, id);
if (tb.Rows.Count == 0)
{
_Machines.Add(id, null);
return null;
}
m = new machinedata();
m.ID = Convert.ToInt64(tb.Rows[0]["MACHINEID"]);
m.Name = FIDbAccess.GetFieldString(tb.Rows[0]["MACHINENAME"], string.Empty);
m.Name2 = FIDbAccess.GetFieldString(tb.Rows[0]["MACHINENAME2"], string.Empty);
m.VIN = FIDbAccess.GetFieldString(tb.Rows[0]["VIN"], string.Empty);
m.MakeID = FIDbAccess.GetFieldInt(tb.Rows[0]["MAKEID"], -1);
m.ModelID = FIDbAccess.GetFieldInt(tb.Rows[0]["MODELID"], -1);
m.TypeID = FIDbAccess.GetFieldInt(tb.Rows[0]["TYPEID"], -1);
m.ModelName = MachineManagement.GetMachineModelName(m.ModelID);
m.MakeName = MachineManagement.GetMachineMakeName(m.MakeID);
m.TypeName = MachineManagement.GetMachineTypeName(m.TypeID);
_Machines[id] = m;
return m;
}
public void SyncAlerts()
{
const string SQL = "select top 100 * from IATCALERTS where ALERTID>(select isnull(max(IATCALERTID),-1) from ALERTS where SRC='LOCALTABLE_IATCALERTS') order by ALERTID";//process most 100 alerts each time
FISqlConnection db = SystemParams.GetDbInstance();
DataTable tb = db.GetDataTableBySQL(SQL);
foreach (DataRow dr in tb.Rows)
{
long alertid = Convert.ToInt64(dr["ALERTID"]);
try
{
InsertData(db, dr);
}
catch (Exception ex)
{
SystemParams.WriteLog("Error", GetType().FullName + ". DoWork()", "Sync IATCALERTS failed: " + alertid, ex.ToString());
}
}
}
private void InsertData(FISqlConnection db, DataRow dr)
{
const string SQL = "if not exists(select 1 from ALERTS where SRC='LOCALTABLE_IATCALERTS' and IATCALERTID={0}) "
+ "insert into ALERTS(ALERTTIME_UTC,ALERTTYPE,ALERTTITLE,ALERTDESC,MACHINEID,VIN,MACHINENAME,MODELID,MODELNAME,"
+ "MAKEID,MAKENAME,TYPEID,TYPENAME,ENGINGHOURS,LATITUDE,LONGITUDE,LOCDATE_UTC,SRC,INSERTTIME,REFID,IATCALERTID) "
+ " values({1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},'LOCALTABLE_IATCALERTS',getdate(),{0},{0})";
long machineid = Convert.IsDBNull(dr["MACHINEID"]) ? -1 : Convert.ToInt64(dr["MACHINEID"]);
machinedata m = GetMachinedata(machineid);
if (m == null)
{
m = new machinedata();
m.ID = machineid;
m.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
m.Name2 = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
m.MakeName = FIDbAccess.GetFieldString(dr["MAKE"], string.Empty);
m.ModelName = FIDbAccess.GetFieldString(dr["MODEL"], string.Empty);
m.TypeName = FIDbAccess.GetFieldString(dr["MACHINETYPE"], string.Empty);
}
long alertid = Convert.ToInt64(dr["ALERTID"]);
double hours = FIDbAccess.GetFieldDouble(dr["ENGINEHOURS"], 0);
double lat = FIDbAccess.GetFieldDouble(dr["CUR_LATITUDE"], 0);
double lon = FIDbAccess.GetFieldDouble(dr["CUR_LONGITUDE"], 0);
DateTime? locdate = FIDbAccess.GetNullableDateTime(dr["LOCATIONTIME_UTC"]);
DateTime? alerttime = FIDbAccess.GetNullableDateTime(dr["RECEIVEDDATE"]);
string title = FIDbAccess.GetFieldString(dr["ALERTTITLE"], string.Empty);
string desc = FIDbAccess.GetFieldString(dr["ALERTDESC"], string.Empty);
string alerttype = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty);
alerttype = DetermineAlertType(alerttype.Trim());
if (alerttype == null)
return;
db.ExecSQL(SQL, alertid, alerttime, alerttype, title, desc, m.ID, m.VIN, m.CustName, m.ModelID, m.ModelName, m.MakeID, m.MakeName, m.TypeID, m.TypeName, hours, lat, lon, locdate);
}
private string DetermineAlertType(string alerttype)
{
if (!string.IsNullOrEmpty(alerttype))
{
string temp = alerttype.Trim().Replace(" ", "");
if (_AlertTypeMapping.ContainsKey(temp))
alerttype = _AlertTypeMapping[temp];
}
else
alerttype = "";
return alerttype;
}
class machinedata
{
public long ID = 0;
public string VIN = string.Empty;
public string Name = string.Empty;
public string Name2 = string.Empty;
public int MakeID = -1;
public int ModelID = -1;
public int TypeID = -1;
public string MakeName = string.Empty;
public string ModelName = string.Empty;
public string TypeName = string.Empty;
public string CustName
{
get
{
if (!string.IsNullOrWhiteSpace(Name2))
{
return Name2;
}
return string.IsNullOrWhiteSpace(Name) ? VIN : Name;
}
}
}
}
}

View File

@ -0,0 +1,247 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class PmScheduleInfo
{
public string PmScheduleID { get; set; }
public string PmScheduleName { get; set; }
public string PmScheduleUom { get; set; }
public string PmScheduleType { get; set; } //PM,TBM,HM
public string Notes { get; set; }
public PmIntervalItem[] Intervals { get; set; }
public int[] AllIntervals { get; set; }
}
public class PmIntervalItem
{
public string PmIntervalID { get; set; }
public string ScheduleId { get; set; }
public int Interval { get; set; }
public int NotificationPeriod { get; set; }
public string ServiceName { get; set; }
public bool Recurring { get; set; }
public int Priority { get; set; }
public string ServiceDescription { get; set; }
}
public class MaintenanceLogInfo
{
public string MaintenanceID { get; set; }
public long MachineID { get; set; }
public string MachinePin { get; set; }
public string MachineName { get; set; }
public string MachineName2 { get; set; }
public DateTime MaintenanceDate { get; set; }
public double MaintenanceHours { get; set; }
public string MachineMake { get; set; }
public string MachineModel { get; set; }
public string MachineType { get; set; }
private double _EngineHours;
public double EngineHours
{
get
{
return _EngineHours;
}
set
{
value = value > 0 ? value : 0;
_EngineHours = Math.Round(value, 2);
}
}
public string Notes { get; set; }
public long AlertID { get; set; }
private double _ODOMeter;
public double ODOMeter
{
get
{
return _ODOMeter;
}
set
{
value = value > 0 ? value : 0;
_ODOMeter = Math.Round(value, 2);
}
}
public string ODOMemterUOM { get; set; }
public string LogType { get; set; }
public string AlertTitle { get; set; }
public string AlertType { get; set; }
public DateTime AlertTime { get; set; }
public string StrForMaintenanceDate { get { return MaintenanceDate.ToShortDateString(); } }
public string StrForAlertTime
{
get
{
if (AlertTime != DateTime.MinValue)
{
return AlertTime.ToString("yyyy-MM-dd HH:mm:ss");
}
return "";
}
}
public double Cost { get; set; }
public string InvoiceNumber { get; set; }
public bool Completed { get; set; }
public string CompletedByName { get; set; }
public bool HasAttachment { get; set; }
public string[] AttachmentIDs { get; set; }//用于保存
public string ShowName
{
get
{
//Name取值顺序为Name2,Name,VIN,ID用于前端显示
string name = MachineName2;
if (string.IsNullOrWhiteSpace(name))
name = MachineName;
if (string.IsNullOrWhiteSpace(name))
name = MachinePin;
if (string.IsNullOrWhiteSpace(name))
name = MachineID.ToString();
return name;
}
}
}
public class MaintenanceMachineInfo
{
public long MachineID { get; set; }
public string VIN { get; set; }
public string MachineName { get; set; }
public string MachineName2 { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public int TypeID { get; set; }
public string MachineType { get; set; }
private double _EngineHours;
public double EngineHours
{
get
{
return _EngineHours;
}
set
{
value = value > 0 ? value : 0;
_EngineHours = Math.Round(value, 2);
}
}
public DateTime StartDate { get; set; }
public double StartHours { get; set; }
public string StartDateString
{
get
{
if (StartDate == DateTime.MinValue)
return "";
else
return StartDate.ToShortDateString();
}
}
public string ShowName
{
get
{
//Name取值顺序为Name2,Name,VIN,ID用于前端显示
string name = MachineName2;
if (string.IsNullOrWhiteSpace(name))
name = MachineName;
if (string.IsNullOrWhiteSpace(name))
name = VIN;
if (string.IsNullOrWhiteSpace(name))
name = MachineID.ToString();
return name;
}
}
private double _Odometer;
public double Odometer
{
get
{
return _Odometer;
}
set
{
value = value > 0 ? value : 0;
_Odometer = Math.Round(value, 2);
}
}
public double StartOdometer { get; set; }
public bool Hide { get; set; }
}
public class PMAlert
{
public string LogID { get; set; }
public string AlertID { get; set; }
public string AlertTitle { get; set; }
public string AlertTime { get; set; }
}
public class PMAssetAlertInfo
{
public string PmScheduleID { get; set; }
public string PmIntervalId { get; set; }
public string ServiceName { get; set; }
public DateTime? LastAlertTime { get; set; }
public long AssetId { get; set; }
public DateTime? StartDate { get; set; }
public double? StartHours { get; set; }
public double? StartOdometer { get; set; }
public int? StartIntervalValue { get; set; }
public bool Selected { get; set; }
public int UnMaintainedAlert { get; set; }
public string PmScheduleName { get; set; }
public string PmScheduleUom { get; set; }
public string PmScheduleType { get; set; }
public string Notes { get; set; }
public PmIntervalItem[] Intervals { get; set; }
public int[] AllIntervals { get; set; }
public string StartDateString
{
get
{
if (StartDate == null)
return "";
else
return StartDate.Value.ToString("MM/dd/yyyy");
}
}
public string LastAlertTimeString
{
get
{
if (LastAlertTime == null)
return "";
else
return LastAlertTime.Value.ToString("MM/dd/yyyy");
}
}
}
}

View File

@ -0,0 +1,939 @@
using Foresight.Data;
using Foresight.Fleet.Services.Asset;
using Foresight.Fleet.Services.AssetHealth;
using Foresight.Fleet.Services.User;
using IronIntel.Contractor.Machines;
using IronIntel.Services;
using IronIntel.Services.Business.Admin;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class MaintenanceManagement
{
#region PM SCHEDULES
public static PmScheduleInfo[] GetPmSchedule(string sessionid, string pmtype)
{
var items = FleetServiceClientHelper.CreateClient<PMClient>(sessionid).GetPMScheduleItems(SystemParams.CompanyID, pmtype, string.Empty, true);
if (items == null || items.Length == 0)
return new PmScheduleInfo[0];
List<PmScheduleInfo> list = new List<PmScheduleInfo>();
foreach (var item in items)
{
PmScheduleInfo pm = new PmScheduleInfo();
pm.PmScheduleID = item.Id;
pm.PmScheduleName = item.Name;
pm.PmScheduleUom = item.UOM;
pm.PmScheduleType = item.ScheduleType;
pm.Notes = item.Notes;
if (item.Intervals != null || item.Intervals.Count > 0)
{
List<PmIntervalItem> lsinterval = new List<PmIntervalItem>();
foreach (var pi in item.Intervals)
{
PmIntervalItem piclient = new PmIntervalItem();
Helper.CloneProperty(piclient, pi);
piclient.PmIntervalID = pi.Id;
lsinterval.Add(piclient);
}
pm.Intervals = lsinterval.ToArray();
if (pm.PmScheduleType == "HM" || pm.PmScheduleType == "RDM" || pm.PmScheduleType == "TBM")
pm.AllIntervals = GetAllIntervals(item);
}
else
pm.Intervals = new PmIntervalItem[0];
list.Add(pm);
}
return list.ToArray();
}
public static PmScheduleInfo GetPMScheduleByID(string sessionid, string scheduleid)
{
var item = FleetServiceClientHelper.CreateClient<PMClient>(sessionid).GetPMScheduleItem(SystemParams.CompanyID, scheduleid, true);
PmScheduleInfo pm = new PmScheduleInfo();
pm.PmScheduleID = item.Id;
pm.PmScheduleName = item.Name;
pm.PmScheduleUom = item.UOM;
pm.PmScheduleType = item.ScheduleType;
pm.Notes = item.Notes;
if (item.Intervals != null || item.Intervals.Count > 0)
{
List<PmIntervalItem> lsinterval = new List<PmIntervalItem>();
foreach (var pi in item.Intervals)
{
PmIntervalItem piclient = new PmIntervalItem();
Helper.CloneProperty(piclient, pi);
piclient.PmIntervalID = pi.Id;
lsinterval.Add(piclient);
}
pm.Intervals = lsinterval.ToArray();
if (pm.PmScheduleType == "HM" || pm.PmScheduleType == "RDM" || pm.PmScheduleType == "TBM")
pm.AllIntervals = GetAllIntervals(item);
}
else
pm.Intervals = new PmIntervalItem[0];
return pm;
}
//private static int[] GetAllIntervals(PMScheduleItem sc)
//{
// Dictionary<int, List<PMIntervalItem>> result = new Dictionary<int, List<PMIntervalItem>>();
// var intervals = sc.Intervals.Where(i => i.Recurring).OrderBy(i => i.Interval).ThenByDescending(i => i.Priority).ToList();
// if (intervals.Count == 0)
// return new int[0];
// int maxInterval = intervals[intervals.Count() - 1].Interval;
// for (int i = intervals.Count - 1; i >= 0; i--)
// {//从最大的Interval开始
// PMIntervalItem ia = intervals[i];
// int tempInterval = ia.Interval;
// var existIntervals = result.OrderBy(kv => kv.Key).Select(kv => kv.Key).ToList();
// if (!result.ContainsKey(tempInterval))//加入自己
// {
// result[tempInterval] = new List<PMIntervalItem>();
// }
// result[tempInterval].Add(ia);
// tempInterval += ia.Interval;
// foreach (var ti in existIntervals)
// {//result排序后找第一个比tempInterval大的值
// while (tempInterval < ti)
// {
// if (!result.ContainsKey(tempInterval))
// {
// result[tempInterval] = new List<PMIntervalItem>();
// }
// result[tempInterval].Add(ia);
// tempInterval += ia.Interval;
// }
// tempInterval = ti;
// tempInterval += ia.Interval;
// }
// }
// return result.Select(r => r.Key).OrderBy(r => r).ToArray();
//}
private static int[] GetAllIntervals(PMScheduleItem sc)
{
Dictionary<int, PMIntervalItem> result = new Dictionary<int, PMIntervalItem>();
var intervals = sc.Intervals.Where(i => i.Recurring).OrderBy(i => i.Interval).ThenByDescending(i => i.Priority).ToList();
if (intervals.Count == 0)
return null;
int maxInterval = 0;
for (int i = 0; i < intervals.Count; i++)
{
PMIntervalItem ia = intervals[i];
if (maxInterval == 0)
maxInterval = ia.Interval;
else
maxInterval = GetMinCommonMultiple(maxInterval, ia.Interval);
}
for (int i = 0; i < intervals.Count; i++)
{
PMIntervalItem ia = intervals[i];
int tempInterval = ia.Interval;
while (tempInterval <= maxInterval)
{
if (result.ContainsKey(tempInterval))
{
if (ia.Priority < result[tempInterval].Priority
|| (ia.Priority == result[tempInterval].Priority
&& ia.Interval == result[tempInterval].Interval))
result[tempInterval] = ia;
}
else
result[tempInterval] = ia;
tempInterval += ia.Interval;
}
}
return result.Select(r => r.Key).OrderBy(r => r).Take(1000).ToArray();
//最大只取1000个正常设置不会超过1000异常设置数量太多会使前端页面卡死
}
private static int GetMaxCommonDivisor(int a, int b)
{
if (a < b) { a = a + b; b = a - b; a = a - b; }
return (a % b == 0) ? b : GetMaxCommonDivisor(a % b, b);
}
private static int GetMinCommonMultiple(int a, int b)
{
return a * b / GetMaxCommonDivisor(a, b);
}
public static PmIntervalItem[] GetPmInterval(string sessionid, string scheduleid)
{
var items = FleetServiceClientHelper.CreateClient<PMClient>(sessionid).GetPMIntervals(SystemParams.CompanyID, scheduleid);
if (items == null || items.Length == 0)
return new PmIntervalItem[0];
List<PmIntervalItem> list = new List<PmIntervalItem>();
foreach (var pi in items)
{
PmIntervalItem piclient = new PmIntervalItem();
Helper.CloneProperty(piclient, pi);
piclient.PmIntervalID = pi.Id;
list.Add(piclient);
}
return list.ToArray();
}
public static PMAssetAlertInfo[] GetPmScheduleByAsset(string sessionid, long assetid)
{
List<PMAssetAlertInfo> result = new List<PMAssetAlertInfo>();
var client = FleetServiceClientHelper.CreateClient<PMClient>(sessionid);
var sches = client.GetPMScheduleItems(SystemParams.CompanyID, "", string.Empty, true);
var aas = client.GetPMAssetAlertItems(SystemParams.CompanyID, assetid);
foreach (var item in sches)
{
PMAssetAlertInfo pm = new PMAssetAlertInfo();
pm.PmScheduleID = item.Id;
pm.PmScheduleName = item.Name;
pm.PmScheduleUom = item.UOM;
pm.PmScheduleType = item.ScheduleType;
pm.Notes = item.Notes;
if (item.Intervals != null || item.Intervals.Count > 0)
{
List<PmIntervalItem> lsinterval = new List<PmIntervalItem>();
foreach (var pi in item.Intervals)
{
PmIntervalItem piclient = new PmIntervalItem();
Helper.CloneProperty(piclient, pi);
piclient.PmIntervalID = pi.Id;
lsinterval.Add(piclient);
}
pm.Intervals = lsinterval.ToArray();
if (pm.PmScheduleType == "HM" || pm.PmScheduleType == "RDM" || pm.PmScheduleType == "TBM")
pm.AllIntervals = GetAllIntervals(item);
}
else
pm.Intervals = new PmIntervalItem[0];
if (aas != null)
{
var aa = aas.FirstOrDefault(a => a.PMScheduleId.Equals(pm.PmScheduleID, StringComparison.OrdinalIgnoreCase));
if (aa != null)
{
pm.Selected = true;
pm.AssetId = aa.AssetId;
pm.PmScheduleID = aa.PMScheduleId;
pm.PmIntervalId = aa.PMIntervalId;
pm.ServiceName = aa.ServiceName;
pm.LastAlertTime = aa.LastAlertTime;
pm.StartDate = aa.StartDate;
pm.StartHours = aa.StartHours;
pm.StartOdometer = aa.StartOdometer;
pm.StartIntervalValue = aa.StartIntervalValue;
pm.UnMaintainedAlert = aa.UnMaintainedAlert;
}
}
result.Add(pm);
}
return result.ToArray();
}
public static PmScheduleInfo GetPmScheduleByID(string sessionid, string scheduleid)
{
const string SQL = @"select PMSCHEDULEID,SCHEDULENAME,SCHEDULETYPE,NOTES,SCHEDULEUOM from PM_SCHEDULES where PMSCHEDULEID={0}";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(SQL, scheduleid);
if (dt.Rows.Count == 0)
{
return new PmScheduleInfo();
}
PmScheduleInfo si = ConvertPmScheduleInfo(dt.Rows[0]);
si.Intervals = GetPmInterval(sessionid, si.PmScheduleID);
return si;
}
public static void UpdatePmSchedule(string sessionid, PmScheduleInfo si, string useriid)
{
PMScheduleItem pm = new PMScheduleItem();
pm.Id = si.PmScheduleID;
pm.Name = si.PmScheduleName;
pm.UOM = si.PmScheduleUom;
pm.ScheduleType = si.PmScheduleType;
pm.Notes = si.Notes;
if (si.Intervals != null && si.Intervals.Length > 0)
{
List<PMIntervalItem> list = new List<PMIntervalItem>();
foreach (PmIntervalItem piclient in si.Intervals)
{
PMIntervalItem pi = new PMIntervalItem();
Helper.CloneProperty(pi, piclient);
pi.Id = piclient.PmIntervalID;
pi.ScheduleId = pm.Id;
list.Add(pi);
}
pm.Intervals.AddRange(list);
}
FleetServiceClientHelper.CreateClient<PMClient>(sessionid).UpdatePMSchedule(SystemParams.CompanyID, pm, useriid);
}
public static void UpdatePmInterval(string sessionid, PmIntervalItem piclient, string useriid)
{
PMIntervalItem interval = new PMIntervalItem();
Helper.CloneProperty(interval, piclient);
interval.Id = piclient.PmIntervalID;
FleetServiceClientHelper.CreateClient<PMClient>(sessionid).UpdatePMInterval(SystemParams.CompanyID, interval, useriid);
}
public static MaintenanceMachineInfo[] GetPmMachinesByScheduleId(string scheduleid)
{
const string SQL = @"select a.MACHINEID,a.STARTDATE,a.STARTHOURS,a.STARTOTOMETER,b.MACHINENAME,b.MACHINENAME2,b.VIN,b.MAKEID,b.MODELID,b.TYPEID,b.HIDE,
ISNULL(b.ENGINEHOURS,0) as ENGINEHOURS,ISNULL(b.ODOMETER,0) as ODOMETER,ISNULL(b.ODOMETERUOM,'Mile') AS ODOMETERUOM
from PM_MACHINES a,MACHINES b where a.MACHINEID=b.MACHINEID and a.PMSCHEDULEID={0}";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable tb = db.GetDataTableBySQL(SQL, scheduleid);
if (tb.Rows.Count == 0)
{
return new MaintenanceMachineInfo[0];
}
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
List<MaintenanceMachineInfo> ls = new List<MaintenanceMachineInfo>();
foreach (DataRow dr in tb.Rows)
{
MaintenanceMachineInfo mi = ConvertToMaintenanceMachineInfo(dr, makes, models, types);
ls.Add(mi);
}
return ls.ToArray();
}
private static object GetValueOrNull(DateTime v)
{
if (v == DateTime.MinValue || v == new DateTime(1900, 1, 1))
return null;
else
return v;
}
public static void DeletePmMachine(string scheduleid, string machineid)
{
const string SQL = "delete from PM_MACHINES where PMSCHEDULEID={0} and MACHINEID={1}";
FISqlConnection db = SystemParams.GetDbInstance();
db.ExecSQL(SQL, scheduleid, machineid);
}
private static bool CheckPmScheduleNameRepeat(string scheduleid, string schedulename)
{
const string SQL = "select COUNT(1) from PM_SCHEDULES where PMSCHEDULEID!={0} and SCHEDULENAME={1}";
FIDbAccess db = SystemParams.GetDbInstance();
object obj = db.GetRC1BySQL(SQL, scheduleid, schedulename);
if (Convert.ToInt32(obj) > 0)
{
return true;
}
return false;
}
public static bool CheckPmScheduleHasMachine(string scheduleid)
{
const string SQL_M = "select COUNT(1) from PM_MACHINES where PMSCHEDULEID={0}";
FIDbAccess db = SystemParams.GetDbInstance();
object objm = db.GetRC1BySQL(SQL_M, scheduleid);
if (Convert.ToInt32(objm) > 0)
{
return true;
}
return false;
}
private static PmScheduleInfo ConvertPmScheduleInfo(DataRow dr)
{
PmScheduleInfo si = new PmScheduleInfo();
si.PmScheduleID = FIDbAccess.GetFieldString(dr["PMSCHEDULEID"], string.Empty);
si.PmScheduleName = FIDbAccess.GetFieldString(dr["SCHEDULENAME"], string.Empty);
si.PmScheduleType = FIDbAccess.GetFieldString(dr["SCHEDULETYPE"], string.Empty);
si.Notes = FIDbAccess.GetFieldString(dr["NOTES"], string.Empty);
si.PmScheduleUom = FIDbAccess.GetFieldString(dr["SCHEDULEUOM"], string.Empty);
return si;
}
#endregion
#region Maintenance Log
public static MaintenanceLogInfo[] GetMaintenanceLog(string sessionid, long assetid, string maintenancetype, int machinetype, string searchtxt, string useriid)
{
const string SQL = @"select a.MAINTENANCEID,a.MACHINEID,a.MAINTENANCEDATE,a.MAINTENANCEHOURS,a.NOTES,a.ALERTID,b.MACHINENAME,b.MACHINENAME2, b.VIN,b.MAKEID, b.MODELID,b.TYPEID,ISNULL(b.ENGINEHOURS,0) as ENGINEHOURS,
t.ALERTTYPE,t.ALERTTITLE,t.ALERTTIME_UTC,ISNULL(a.ODOMETER,0) AS ODOMETER,ISNULL(a.ODOMETERUOM,'Hour') AS ODOMETERUOM, isnull(LOGTYPE,'Hours') AS LOGTYPE ,a.COST,a.INVOICENUMBER,a.COMPLETEDBY,a.COMPLETEDBYUSERNAME,
(select top 1 ATTACHID from ATTACHES where SOURCE='MaintenanceLog' and REFID=a.MAINTENANCEID and isnull(DELETED,0)=0) ATTACHID
from MAINTENANCELOG a left join ALERTS t on a.ALERTID=t.ALERTID,MACHINES b
where a.MACHINEID = b.MACHINEID and ISNULL(b.HIDE,0)<>1";
const string ORDER_BY = " ORDER BY a.ADDEDON DESC";
string sql = SQL;
//if (string.Compare("Distance", maintenancetype, true) == 0)
//{
// sql = SQL + " and a.LOGTYPE='" + maintenancetype + "'";
//}
//else
//{
// sql = SQL + " and a.LOGTYPE='" + maintenancetype + "'";
// sql = SQL + " and (a.LOGTYPE='" + maintenancetype + "' or a.LOGTYPE is null)";
//}
if (assetid > 0)
{
sql = sql + " and a.MACHINEID=" + assetid;
}
if (machinetype >= 0)
{
sql = sql + " and b.TYPEID=" + machinetype.ToString() + ORDER_BY;
}
else
{
sql = sql + ORDER_BY;
}
FISqlConnection db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(sql, useriid);
if (dt.Rows.Count == 0)
{
return new MaintenanceLogInfo[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);
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
List<MaintenanceLogInfo> list = new List<MaintenanceLogInfo>();
foreach (DataRow dr in dt.Rows)
{
long mid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
continue;
MaintenanceLogInfo ml = ConvertToMaintenanceLogInfo(dr, makes, models, types);
ml.AlertTitle = FIDbAccess.GetFieldString(dr["ALERTTITLE"], string.Empty);
ml.AlertType = FIDbAccess.GetFieldString(dr["ALERTTYPE"], string.Empty);
ml.AlertTime = FIDbAccess.GetFieldDateTime(dr["ALERTTIME_UTC"], DateTime.MinValue);
ml.HasAttachment = !string.IsNullOrWhiteSpace(FIDbAccess.GetFieldString(dr["ATTACHID"], string.Empty));
if (!string.IsNullOrWhiteSpace(searchtxt))
{
if (Helper.Contains(ml.MachineID.ToString(), searchtxt)
|| Helper.Contains(ml.MachinePin, searchtxt)
|| Helper.Contains(ml.MachineName, searchtxt)
|| Helper.Contains(ml.MachineName2, searchtxt)
|| Helper.Contains(ml.MachineMake, searchtxt)
|| Helper.Contains(ml.MachineModel, searchtxt)
|| Helper.Contains(ml.MachineType, searchtxt)
|| Helper.Contains(ml.StrForMaintenanceDate, searchtxt)
|| Helper.Contains(ml.Notes, searchtxt))
{
list.Add(ml);
}
}
else
{
list.Add(ml);
}
}
return list.ToArray();
}
public static MaintenanceLogInfo GetMaintenanceInfo(string maintenanceid)
{
const string SQL = @"select a.MAINTENANCEID,a.MACHINEID,a.MAINTENANCEDATE,a.MAINTENANCEHOURS,a.NOTES,a.ALERTID,b.MACHINENAME,b.MACHINENAME2,b.VIN,b.MAKEID,b.MODELID,b.TYPEID,ISNULL(b.ENGINEHOURS,0) as ENGINEHOURS,
t.ALERTTYPE,t.ALERTTITLE,t.ALERTTIME_UTC,ISNULL(a.ODOMETER,0) AS ODOMETER,ISNULL(a.ODOMETERUOM,'Hour') AS ODOMETERUOM, isnull(LOGTYPE,'Hours') AS LOGTYPE
,a.COST,a.INVOICENUMBER,a.COMPLETEDBY,a.COMPLETEDBYUSERNAME from MAINTENANCELOG a left join ALERTS t on a.ALERTID=t.ALERTID,MACHINES b
where a.MACHINEID = b.MACHINEID and ISNULL(b.HIDE,0)<>1 and a.MAINTENANCEID={0} ORDER BY a.ADDEDON DESC";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(SQL, maintenanceid);
if (dt.Rows.Count == 0)
{
return new MaintenanceLogInfo();
}
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
MaintenanceLogInfo ml = ConvertToMaintenanceLogInfo(dt.Rows[0], makes, models, types);
return ml;
}
public static MaintenanceLogInfo[] GetMaintenanceLogByMachineID(long MachineID, string maintenanceType)
{
string SQL = @"select a.MAINTENANCEID,a.MACHINEID,a.MAINTENANCEDATE,a.MAINTENANCEHOURS,a.NOTES,a.ALERTID,b.MACHINENAME,b.MACHINENAME2,b.VIN,b.MAKEID,b.MODELID,b.TYPEID,ISNULL(b.ENGINEHOURS,0) as ENGINEHOURS, ISNULL(a.ODOMETER,0) AS ODOMETER,ISNULL(a.ODOMETERUOM,'Mile') AS ODOMETERUOM, isnull(LOGTYPE,'Hours') AS LOGTYPE
,a.COST,a.INVOICENUMBER,a.COMPLETEDBY,a.COMPLETEDBYUSERNAME from MAINTENANCELOG a, MACHINES b where a.MACHINEID = b.MACHINEID and a.MACHINEID={0}";
if (maintenanceType != null)
SQL += " and LOGTYPE={1} ";
SQL += " ORDER BY a.ADDEDON DESC";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(SQL, MachineID, maintenanceType);
if (dt.Rows.Count == 0)
{
return new MaintenanceLogInfo[0];
}
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
List<MaintenanceLogInfo> list = new List<MaintenanceLogInfo>();
foreach (DataRow dr in dt.Rows)
{
MaintenanceLogInfo ml = ConvertToMaintenanceLogInfo(dr, makes, models, types);
list.Add(ml);
}
return list.ToArray();
}
public static MaintenanceLogInfo GetMaintenanceLogByMaintenanceID(string MaintenanceID)
{
const string SQL = @"select a.MAINTENANCEID,a.MACHINEID,a.MAINTENANCEDATE,a.MAINTENANCEHOURS,a.NOTES,a.ALERTID,b.MACHINENAME,b.MACHINENAME2,b.VIN,b.MAKEID,b.MODELID,b.TYPEID
,ISNULL(b.ENGINEHOURS,0) as ENGINEHOURS,ISNULL(a.ODOMETER,0) AS ODOMETER,ISNULL(a.ODOMETERUOM,'Mile') AS ODOMETERUOM, isnull(LOGTYPE,'Hours') AS LOGTYPE
,a.COST,a.INVOICENUMBER,a.COMPLETEDBY,a.COMPLETEDBYUSERNAME from MAINTENANCELOG a , MACHINES b where a.MACHINEID = b.MACHINEID and a.MAINTENANCEID={0}";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(SQL, MaintenanceID);
if (dt.Rows.Count == 0)
{
return new MaintenanceLogInfo();
}
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
MaintenanceLogInfo ml = ConvertToMaintenanceLogInfo(dt.Rows[0], makes, models, types);
return ml;
}
public static void UpdateMaintenanceLog(MaintenanceLogInfo ml, string addedby)
{
const string SQL = @"if exists(select 1 from MAINTENANCELOG where MAINTENANCEID={0}) update MAINTENANCELOG set MACHINEID ={1},MAINTENANCEDATE ={2},
MAINTENANCEHOURS={3},NOTES={4},LASTUPDATEDBY={5},LASTUPDATEDON=GETUTCDATE(),ALERTID={6},ODOMETER={7},ODOMETERUOM={8},LOGTYPE={9},COST={10},INVOICENUMBER={11},COMPLETEDBYUSERNAME={12},COMPLETED={13},COMPLETEDDATE_UTC= (case {13} when 1 then GETUTCDATE() else null end) where MAINTENANCEID={0} else insert into MAINTENANCELOG(MAINTENANCEID,
MACHINEID,MAINTENANCEDATE,MAINTENANCEHOURS,NOTES,ADDEDBY,ADDEDON,LASTUPDATEDBY,LASTUPDATEDON,ALERTID,ODOMETER,ODOMETERUOM,LOGTYPE,COST,INVOICENUMBER,COMPLETEDBYUSERNAME,COMPLETED,COMPLETEDDATE_UTC) values({0},{1},{2},{3},{4},{5},GETUTCDATE(),{5},GETUTCDATE(),{6},{7},{8},{9},{10},{11},{12},{13},(case {13} when 1 then GETUTCDATE() else null end))";
FISqlConnection db = SystemParams.GetDbInstance();
db.ExecSQL(SQL, ml.MaintenanceID, ml.MachineID, ml.MaintenanceDate, ml.MaintenanceHours, ml.Notes, addedby, ml.AlertID, ml.ODOMeter, ml.ODOMemterUOM, ml.LogType, ml.Cost, ml.InvoiceNumber, ml.CompletedByName, ml.Completed ? 1 : 0);
}
public static void DeleteMaintenanceLog(string maintencelogid)
{
const string SQL = "delete from MAINTENANCELOG where MAINTENANCEID={0}";
FISqlConnection db = SystemParams.GetDbInstance();
db.ExecSQL(SQL, maintencelogid);
}
public static bool HasMaintenanceLog(long machineid)
{
const string SQL = "SELECT count([MAINTENANCEDATE]) FROM [MAINTENANCELOG] where MACHINEID={0}";
var db = SystemParams.GetDbInstance();
return (int?)db.GetRC1BySQL(SQL, machineid) > 0;
}
public static PMAlert[] GetUnCompletedPMAlerts(long machineid, string maintencelogid)
{
List<PMAlert> alerts = new List<PMAlert>();
const string SQL = "select LOGID,pm.ALERTID,pm.ALERTTIME_UTC,ALERTTITLE from PM_ALERTS pm left join ALERTS a on pm.ALERTID=a.ALERTID where pm.MACHINEID={0} and ((ISNULL(a.COMPLETED,0)<>1 and ISNULL(a.ACKNOWLEDGED,0)<>1) or exists(select 1 from MAINTENANCELOG ml where ml.ALERTID=a.ALERTID and MAINTENANCEID={1} ))";
var db = SystemParams.GetDbInstance();
DataTable dt = db.GetDataTableBySQL(SQL, machineid, maintencelogid);
foreach (DataRow dr in dt.Rows)
{
PMAlert alert = new PMAlert();
alert.LogID = FIDbAccess.GetFieldString(dr["LOGID"], string.Empty);
alert.AlertID = FIDbAccess.GetFieldString(dr["ALERTID"], string.Empty);
alert.AlertTitle = FIDbAccess.GetFieldString(dr["ALERTTITLE"], string.Empty);
DateTime at = FIDbAccess.GetFieldDateTime(dr["ALERTTIME_UTC"], DateTime.MinValue);
if (at != DateTime.MinValue)
alert.AlertTime = at.ToString("yyyy-MM-dd HH:mm:ss");
alerts.Add(alert);
}
return alerts.ToArray();
}
public static void SetPMAlertCompleted(long alertID, bool completed, string completedby)
{
const string SQL = "update ALERTS set COMPLETED={0},COMPLETEDBY={2},COMPLETEDDATE_UTC=(case {0} when 1 then GETUTCDATE() else null end) where ALERTID={1}";
var db = SystemParams.GetDbInstance();
db.ExecSQL(SQL, completed ? 1 : 0, alertID, completedby);
}
private static MaintenanceLogInfo ConvertToMaintenanceLogInfo(DataRow dr, MachineMake[] makes, MachineModel[] models, MachineType[] types)
{
MaintenanceLogInfo ml = new MaintenanceLogInfo();
ml.MaintenanceID = FIDbAccess.GetFieldString(dr["MAINTENANCEID"], string.Empty);
ml.MachineID = FIDbAccess.GetFieldInt(dr["MACHINEID"], 0);
ml.MaintenanceDate = FIDbAccess.GetFieldDateTime(dr["MAINTENANCEDATE"], DateTime.MinValue);
ml.MaintenanceHours = FIDbAccess.GetFieldDouble(dr["MAINTENANCEHOURS"], 0);
ml.Notes = FIDbAccess.GetFieldString(dr["NOTES"], string.Empty);
ml.AlertID = FIDbAccess.GetFieldInt(dr["ALERTID"], -1);
ml.MachinePin = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
ml.MachineName = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
ml.MachineName2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
ml.EngineHours = FIDbAccess.GetFieldDouble(dr["ENGINEHOURS"], 0);
ml.ODOMeter = FIDbAccess.GetFieldDouble(dr["ODOMETER"], 0);
ml.ODOMemterUOM = FIDbAccess.GetFieldString(dr["ODOMETERUOM"], "Mile");
ml.LogType = FIDbAccess.GetFieldString(dr["LOGTYPE"], "Hours");
ml.Cost = FIDbAccess.GetFieldDouble(dr["COST"], 0);
ml.InvoiceNumber = FIDbAccess.GetFieldString(dr["INVOICENUMBER"], "");
ml.CompletedByName = FIDbAccess.GetFieldString(dr["COMPLETEDBYUSERNAME"], "");
int makeid = FIDbAccess.GetFieldInt(dr["MAKEID"], 0);
MachineMake make = MachineManagement.GetMachineMake(makes, makeid);
ml.MachineMake = make == null ? string.Empty : make.Name;
int modelid = FIDbAccess.GetFieldInt(dr["MODELID"], 0);
MachineModel model = MachineManagement.GetMachineModel(models, modelid);
ml.MachineModel = model == null ? string.Empty : model.Name;
int typeid = FIDbAccess.GetFieldInt(dr["TYPEID"], 0);
MachineType mtype = MachineManagement.GetMachineType(types, typeid);
ml.MachineType = mtype == null ? string.Empty : mtype.Name;
return ml;
}
public static WorkOrderInfo[] GetMaintenanceWorkOrders(string sessionid, string custid, string[] assignedusers, string[] asseitgroups, string filter, string useriid)
{
const string SQL = @"select m.MAINTENANCEID,m.COMPLETEDBY,(select USERNAME from USERS where USERS.USERIID=m.COMPLETEDBY) as ASSIGNEDTONAME,m.NOTES,m.MAINTENANCEDATE
,b.MACHINEID,b.VIN,b.MACHINENAME,b.MACHINENAME2 from MAINTENANCELOG m left join MACHINES b on b.MACHINEID=m.MACHINEID
where m.ALERTID not in (select ALERTID from WORKORDER_ALERTS) and m.MACHINEID = b.MACHINEID and ISNULL(b.HIDE,0)<>1 ";
const string SQL_FILTER = " and (m.NOTES like {0} or b.MACHINEID like {0} or b.VIN like {0} or b.MACHINENAME like {0} or b.MACHINENAME2 like {0}) ";
const string SQL_ORDERBY = " order by m.MAINTENANCEID";
var user = FleetServiceClientHelper.CreateClient<UserQueryClient>(custid, sessionid).GetUserByIID(useriid);
if (user == null || (!user.Active))
{
return new WorkOrderInfo[0];
}
if (user == null || (!user.Active))
{
return new WorkOrderInfo[0];
}
if (string.Compare(user.CompanyID, SystemParams.CompanyID, true) != 0 && (!user.IsForesightUser))
{
return new WorkOrderInfo[0];
}
string sql = SQL;
if ((!user.IsForesightUser) && (user.ContactType == Foresight.Fleet.Services.User.ContactTypes.Technician))
{
sql += " and m.COMPLETEDBY in ('" + useriid + "') ";
}
else if (assignedusers != null && assignedusers.Length > 0)
{
string uids = JoinSQLString(assignedusers);
sql += " and m.COMPLETEDBY in (" + uids + ") ";
}
FISqlConnection db = SystemParams.GetDbInstance();
long[] assets = null;
if (asseitgroups != null && asseitgroups.Length > 0)
{
assets = MachineManagement.GetGroupMachines(asseitgroups, db);
}
DataTable dt = null;
if (string.IsNullOrWhiteSpace(filter))
dt = db.GetDataTableBySQL(sql + SQL_ORDERBY);
else
dt = db.GetDataTableBySQL(sql + SQL_FILTER + SQL_ORDERBY, "%" + filter + "%");
if (dt.Rows.Count == 0)
return new WorkOrderInfo[0];
List<WorkOrderInfo> list = new List<WorkOrderInfo>();
foreach (DataRow dr in dt.Rows)
{
WorkOrderInfo wo = new WorkOrderInfo();
long assetid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
if (assets != null && assets.Length > 0)
{
if (!assets.Contains(assetid))
{
continue;
}
}
wo.AssetID = assetid;
wo.AssignedTo = FIDbAccess.GetFieldString(dr["COMPLETEDBY"], string.Empty);
wo.MaintenanceID = FIDbAccess.GetFieldString(dr["MAINTENANCEID"], string.Empty);
wo.Description = FIDbAccess.GetFieldString(dr["NOTES"], string.Empty);
wo.CompleteDate = FIDbAccess.GetFieldDateTime(dr["MAINTENANCEDATE"], DateTime.MinValue);
wo.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
wo.AssetName = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
wo.AssignedToName = FIDbAccess.GetFieldString(dr["ASSIGNEDTONAME"], wo.AssignedTo);
list.Add(wo);
}
return list.ToArray();
}
public static string JoinSQLString(IEnumerable<string> items)
{
StringBuilder sb = new StringBuilder();
foreach (string s in items)
{
if (sb.Length == 0)
{
sb.Append("'" + s + "'");
}
else
{
sb.Append(",'" + s + "'");
}
}
return sb.ToString();
}
#endregion
#region Machines
public static MaintenanceMachineInfo[] GetMaintenanceMachines1(string sessionid, int machinetype, string searchtxt, string useriid, string companyid = null)
{
if (string.IsNullOrEmpty(companyid))
companyid = SystemParams.CompanyID;
//普通用户机器权限过滤
long[] availableAssetsids = null;
var user = Users.UserManagement.GetUserByIID(useriid);
var client = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid);
if (user.UserType < Users.UserTypes.Admin)
availableAssetsids = client.GetAvailableAssetsForUsers(companyid, useriid);
AssetBasicInfo[] assets = client.GetAssetBasicInfo(companyid, searchtxt, availableAssetsids);
if (assets != null && machinetype != -1)
assets = assets.Where(m => m.TypeID == machinetype).ToArray();
long[] mids = null;
if (assets != null)
mids = assets.AsEnumerable().Select(m => m.ID).ToArray();
//var ehs = SystemParams.AssetClient.GetAssetsCurrentPrimaryEngineHours(companyid, mids);
var odos = client.GetAssetsCurrentPrimaryOdometer(companyid, mids);
List<MaintenanceMachineInfo> list = new List<MaintenanceMachineInfo>();
foreach (var a in assets)
{
if (a.Hide) continue;
MaintenanceMachineInfo mi = new MaintenanceMachineInfo();
mi.MachineID = a.ID;
mi.VIN = a.VIN;
mi.MachineName = a.Name;
mi.MachineName2 = a.Name2;
mi.Make = a.MakeName;
mi.Model = a.ModelName;
mi.TypeID = a.TypeID;
mi.MachineType = a.TypeName;
mi.Hide = a.Hide;
mi.EngineHours = a.EngineHours;
if (odos != null && odos.Length > 0)
{
var odo = odos.FirstOrDefault((o) => o.AssetID == mi.MachineID);
if (odo != null)
mi.Odometer = odo.Corrected;
}
list.Add(mi);
}
return list.ToArray();
}
public static MaintenanceMachineInfo[] GetMaintenanceMachines(string sessionid, int machinetype, string searchtxt, string useriid, string companyid = null)
{
const string SQL = @"select m.MACHINEID,m.MACHINENAME2,m.MACHINENAME,m.MAKEID,m.MODELID,m.TYPEID,m.VIN,ISNULL(m.ENGINEHOURS,0) as ENGINEHOURS,
ISNULL(m.ODOMETER,0) as ODOMETER,ISNULL(m.ODOMETERUOM,'Mile') AS ODOMETERUOM,m.HIDE from MACHINES m
where 1=1";
const string ORDER_BY = " order by MACHINEID";
string sql = string.Empty;
if (machinetype >= 0)
{
sql = SQL + " and TYPEID=" + machinetype.ToString() + ORDER_BY;
}
else
{
sql = SQL + ORDER_BY;
}
FIDbAccess db = null;
if (string.IsNullOrEmpty(companyid))
{
companyid = SystemParams.CompanyID;
db = SystemParams.GetDbInstance();
}
else
{
string connetionstring = SystemParams.GetDbStringByCompany(companyid);
db = new FISqlConnection(connetionstring);
}
DataTable tb = db.GetDataTableBySQL(sql);
if (tb.Rows.Count == 0)
{
return new MaintenanceMachineInfo[0];
}
long[] availableAssetsids = null;
var user = Users.UserManagement.GetUserByIID(useriid);
if (user.UserType < Users.UserTypes.Admin)
availableAssetsids = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid).GetAvailableAssetsForUsers(companyid, useriid);
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
List<MaintenanceMachineInfo> ls = new List<MaintenanceMachineInfo>();
foreach (DataRow dr in tb.Rows)
{
long mid = Convert.ToInt64(dr["MACHINEID"]);
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
continue;
MaintenanceMachineInfo mi = ConvertToMaintenanceMachineInfo(dr, makes, models, types);
mi.Hide = FIDbAccess.GetFieldInt(dr["HIDE"], 0) == 1;
if (mi.Hide) continue;
if (!string.IsNullOrWhiteSpace(searchtxt))
{
if (Helper.Contains(mi.VIN, searchtxt)
|| Helper.Contains(mi.MachineID.ToString(), searchtxt)
|| Helper.Contains(mi.MachineName, searchtxt)
|| Helper.Contains(mi.MachineName2, searchtxt)
|| Helper.Contains(mi.Make, searchtxt)
|| Helper.Contains(mi.MachineType, searchtxt)
|| Helper.Contains(mi.Model, searchtxt))
{
ls.Add(mi);
}
}
else
{
ls.Add(mi);
}
}
return ls.ToArray();
}
public static MaintenanceMachineInfo GetmachineByMachineID(long machineid)
{
string SQL = @"select MACHINEID,MACHINENAME,MACHINENAME2,MAKEID,MODELID,TYPEID,VIN,ISNULL(ENGINEHOURS,0) as ENGINEHOURS,
ISNULL(ODOMETER,0) as ODOMETER,ISNULL(ODOMETERUOM,'Mile') AS ODOMETERUOM from MACHINES where MACHINEID={0}";
FISqlConnection db = SystemParams.GetDbInstance();
DataTable tb = db.GetDataTableBySQL(SQL, machineid);
MaintenanceMachineInfo mi = new MaintenanceMachineInfo();
if (tb.Rows.Count == 0)
{
mi.MachineID = -1;
return mi;
}
MachineManagement.RefreshBaseData();
MachineMake[] makes = MachineManagement.GetMachineMakes();
MachineModel[] models = MachineManagement.GetMachineModels();
MachineType[] types = MachineManagement.GetMachineTypes();
foreach (DataRow dr in tb.Rows)
{
mi = ConvertToMaintenanceMachineInfo(dr, makes, models, types);
}
return mi;
}
public static MaintenanceMachineInfo ConvertToMaintenanceMachineInfo(DataRow dr, MachineMake[] makes, MachineModel[] models, MachineType[] types)
{
MaintenanceMachineInfo mi = new MaintenanceMachineInfo();
mi.MachineID = Convert.ToInt64(dr["MACHINEID"]);
mi.MachineName = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
mi.MachineName2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
mi.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
mi.EngineHours = FIDbAccess.GetFieldDouble(dr["ENGINEHOURS"], 0);
mi.Odometer = FIDbAccess.GetFieldDouble(dr["ODOMETER"], 0);
int makeid = FIDbAccess.GetFieldInt(dr["MAKEID"], 0);
MachineMake make = MachineManagement.GetMachineMake(makes, makeid);
mi.Make = make == null ? string.Empty : make.Name;
int modelid = FIDbAccess.GetFieldInt(dr["MODELID"], 0);
MachineModel model = MachineManagement.GetMachineModel(models, modelid);
mi.Model = model == null ? string.Empty : model.Name;
int typeid = FIDbAccess.GetFieldInt(dr["TYPEID"], 0);
MachineType mtype = MachineManagement.GetMachineType(types, typeid);
mi.TypeID = mtype == null ? 0 : mtype.ID;
mi.MachineType = mtype == null ? string.Empty : mtype.Name;
if (dr.Table.Columns.Contains("STARTDATE"))
{
mi.StartDate = FIDbAccess.GetFieldDateTime(dr["STARTDATE"], DateTime.MinValue);
}
if (dr.Table.Columns.Contains("STARTHOURS"))
{
mi.StartHours = FIDbAccess.GetFieldDouble(dr["STARTHOURS"], 0);
}
if (dr.Table.Columns.Contains("STARTOTOMETER"))
{
mi.StartOdometer = FIDbAccess.GetFieldDouble(dr["STARTOTOMETER"], 0);
}
return mi;
}
#endregion
public static string[] GetPMDescriptionByAssetID(string companyid, long assetid)
{
const string SQL_1 = @"select * from usvMaintenanceAlertsMapLayer ml with (nolock) right join
(select cast(MachineID as nvarchar) + cast(max(MaintenanceDate) as nvarchar) as MaintenanceID from usvMaintenanceAlertsMapLayer with (nolock) where PMStatus = 'Complete'
group by MachineID) a on ml.MaintenanceID = a.MaintenanceID where PMStatus = 'Complete' and MachineID={0}";
const string SQL_2 = "select * from usvMaintenanceAlertsMapLayer with (nolock) where PMStatus = 'Overdue' and MachineID={0}";
const string SQL_3 = "select * from usvMaintenanceAlertsMapLayer with (nolock) where PMStatus = 'Upcoming' and MachineID={0}";
string connetionstring = SystemParams.DataDbConnectionString;
if (SystemParams.IsDealer)
connetionstring = SystemParams.GetDbStringByCompany(companyid);
FISqlConnection db = new FISqlConnection(connetionstring);
DataTable dt = db.GetDataTableBySQL(SQL_1, assetid);
if (dt == null || dt.Rows.Count == 0)
dt = db.GetDataTableBySQL(SQL_2, assetid);
if (dt == null || dt.Rows.Count == 0)
dt = db.GetDataTableBySQL(SQL_3, assetid);
if (dt == null || dt.Rows.Count == 0)
return new string[0];
List<string> list = new List<string>();
foreach (DataRow dr in dt.Rows)
{
string desc = FIDbAccess.GetFieldString(dr["DESCRIPTION"], string.Empty);
list.Add(desc);
}
return list.ToArray();
}
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class SegmentInfo
{
public long SegmentID { get; set; }
public long WorkOrderID { get; set; }
public long JobsiteID { get; set; }
public string JobsiteName { get; set; }
public string UserIID { get; set; }
public string UserName { get; set; }
public decimal Cost { get; set; }
public decimal Hours { get; set; }
public string Description { get; set; }
public string Notes { get; set; }
public bool Completed { get; set; } = false;
public DateTime? CompletedDate { get; set; }
public string CompletedDateStr { get { return CompletedDate == null ? "" : CompletedDate.Value.ToShortDateString(); } }
public string Component { get; set; }
}
}

View File

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IronIntel.Contractor.Maintenance
{
public class WorkOrderInfo
{
public long ID { get; set; }
public string MaintenanceID { get; set; }
public string WorkOrderType { get; set; }
public string AssignedTo { get; set; }
public string AssignedToName { get; set; }
public string Status { get; set; }
public long AssetID { get; set; }
public string AssetName { get; set; }
public string VIN { get; set; }
public string Description { get; set; }
public DateTime? DueDate { get; set; }
public string DueDateStr { get { return DueDate == null ? "" : DueDate.Value.ToShortDateString(); } }
public DateTime? CompleteDate { get; set; }
public string CompleteDateStr { get { return CompleteDate == null ? "" : CompleteDate.Value.ToShortDateString(); } }
public string InvoiceNumber { get; set; }
}
public class WorkOrderDetailInfo : WorkOrderInfo
{
public string MeterType { get; set; }
public double HourMeter { get; set; }
private double _Odometer;
public double Odometer
{
get
{
return _Odometer;
}
set
{
value = value > 0 ? value : 0;
_Odometer = Math.Round(value, 2);
}
}
public string OdometerUnits { get; set; }
public decimal WorkOrderTotalCost { get; set; }
public decimal HoursToComplete { get; set; }
public string InternalID { get; set; }
public string Notes { get; set; }
public decimal PartsCost { get; set; }
public decimal TravelTimeCost { get; set; }
public decimal LaborCost { get; set; }
public decimal HourlyRate { get; set; }
public decimal OtherCost { get; set; }
}
}

View File

@ -0,0 +1,189 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Foresight.Data;
using System.Web;
using Foresight.Fleet.Services.AssetHealth;
using Foresight.Fleet.Services.Asset;
namespace IronIntel.Contractor.Maintenance
{
public class WorkOrderManager : BusinessBase
{
public WorkOrderManager(string dbstr) : base(dbstr)
{
}
public long[] GetOpenWorkOrderID(string machineid)
{
const string SQL = "select WORKORDERID from WORKORDER where MACHINEID={0} and STATUS<>'Completed' and and isnull(DELETED,0)=0";
DataTable tb = GetDataTableBySQL(SQL, machineid);
List<long> result = new List<long>();
foreach (DataRow dr in tb.Rows)
{
result.Add(FIDbAccess.GetFieldInt(dr[0], 0));
}
return result.ToArray();
}
public bool CanAccessWorkOrder(string sessionid, string woid, string mid, string useriid)
{
const string SQL = "select count(1) from WORKORDER where WORKORDERID={0} and ASSIGNEDTO={1}";
bool result = true;
var user = FleetServiceClientHelper.CreateClient<Foresight.Fleet.Services.User.UserQueryClient>(sessionid).GetUserByIID(useriid);
if ((!user.IsForesightUser) && (user.ContactType == Foresight.Fleet.Services.User.ContactTypes.Technician))
{
result = FIDbAccess.GetFieldInt(GetRC1BySQL(SQL, woid, useriid), 0) > 0;
}
if (result && user.UserType < Foresight.Fleet.Services.User.UserTypes.Admin)
{
long assetid = -1;
if (!string.IsNullOrEmpty(mid))
Int64.TryParse(mid, out assetid);
else
{
var client = FleetServiceClientHelper.CreateClient<WorkOrderClient>(sessionid);
var workorder = client.GetWorkOrderDetail(SystemParams.CompanyID, Convert.ToInt64(woid));
assetid = workorder.AssetID;
}
long[] availableAssetsids = FleetServiceClientHelper.CreateClient<AssetQueryClient>(sessionid).GetAvailableAssetsForUsers(SystemParams.CompanyID, useriid);
if (availableAssetsids != null && !availableAssetsids.Contains(assetid))
result = false;
}
return result;
}
public string[] GetInvoiceNumber(string woid)
{
const string SQL = @"select a.INVOICENUMBER from WORKORDER_ALERTS t left join MAINTENANCELOG a on a.ALERTID=t.ALERTID,MACHINES b
where t.WORKORDERID={0} and a.MACHINEID = b.MACHINEID and ISNULL(b.HIDE,0)<>1 and ISNULL(a.INVOICENUMBER,'')<>'' ORDER BY a.ADDEDON DESC";
DataTable dt = GetDataTableBySQL(SQL, woid);
if (dt.Rows.Count == 0)
return new string[0];
List<string> list = new List<string>();
foreach (DataRow dr in dt.Rows)
{
string num = FIDbAccess.GetFieldString(dr["INVOICENUMBER"], string.Empty);
if (!string.IsNullOrEmpty(num))
list.Add(num);
}
return list.ToArray();
}
public static string GenerateWorkOrderPrintHtml(string sessionid, string companyid, long woid)
{
StringBuilder str = new StringBuilder();
str.AppendLine("<H1 style='text-align:center;'>Work Order</H1>");
str.AppendFormat("<div style='font-weight:bold;'>Details for work order <{0}> are listed below:</div>", woid);
str.AppendLine("");
//str.AppendLine("<div class='label' style='text-align:left;'>Work Order Information:</div>");
str.AppendLine("<div style='padding-left:30px;margin-bottom:36px;'>");
var client = FleetServiceClientHelper.CreateClient<WorkOrderClient>(companyid, sessionid);
WorkOrderDetail wo = client.GetWorkOrderDetail(companyid, woid);
str.Append(GenerateWorkOrderInfoHtml(wo));
str.AppendLine("</div>");
//str.AppendLine("<div class='label' style='text-align:left;'>Segments:</div>");
WorkOrderSegmentItem[] segments = client.GetSegments(companyid, woid);
if (segments != null && segments.Length > 0)
{
for (int i = 0; i < segments.Length; i++)
{
var se = segments[i];
str.Append(GenerateSegmentHtml(se, i + 1));
}
}
return str.ToString();
}
private static string GenerateWorkOrderInfoHtml(WorkOrderDetail wo)
{
StringBuilder str = new StringBuilder();
str.Append("<table>");
str.AppendFormat("<tr><td class='label' style='width:170px;'>Work Order Type</td><td>{0}</td></tr>", wo.WorkOrderType);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Assigned To</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(wo.AssignedToName));
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Status</td><td>{0}</td></tr>", wo.Status);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Due Date</td><td>{0}</td></tr>", wo.DueDate == null ? "" : wo.DueDate.Value.ToShortDateString());
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Description</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(wo.Description).Replace("\n", "<br>"));
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Meter Type</td><td>{0}</td></tr>", wo.MeterType);
str.AppendLine("");
if (string.Compare(wo.MeterType, "HourMeter", true) == 0
|| string.Compare(wo.MeterType, "Both", true) == 0)
str.AppendFormat("<tr><td class='label'>Hour Meter</td><td>{0}</td></tr>", wo.HourMeter);
if (string.Compare(wo.MeterType, "Odometer", true) == 0
|| string.Compare(wo.MeterType, "Both", true) == 0)
str.AppendFormat("<tr><td class='label'>Odometer</td><td>{0}&nbsp;{1}</td></tr>", wo.Odometer, wo.OdometerUnits);
str.AppendFormat("<tr><td class='label'>Work Order Total Costs ($)</td><td>{0}</td></tr>", wo.WorkOrderTotalCost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Other Cost ($)</td><td>{0}</td></tr>", wo.OtherCost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Parts Cost ($)</td><td>{0}</td></tr>", wo.PartsCost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Travel Time Cost ($)</td><td>{0}</td></tr>", wo.TravelTimeCost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Labor Cost ($)</td><td>{0}</td></tr>", wo.LaborCost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Hourly Rate</td><td>{0}</td></tr>", wo.HourlyRate);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Time To Complete(Hrs)</td><td>{0}</td></tr>", wo.HoursToComplete);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Completed Date</td><td>{0}</td></tr>", wo.CompleteDate == null ? "" : wo.CompleteDate.Value.ToShortDateString());
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Internal ID</td><td>{0}</td></tr>", wo.InternalID);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Invoice Number</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(wo.InvoiceNumber));
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Notes</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(wo.Notes).Replace("\n", "<br>"));
str.AppendLine("");
str.AppendFormat("</table>");
return str.ToString();
}
private static string GenerateSegmentHtml(WorkOrderSegmentItem se, int index)
{
StringBuilder str = new StringBuilder();
//str.AppendFormat("<div style='margin-bottom:36px;margin-left:30px;{0}'>", (index - 2) % 4 == 0 ? "page-break-after: always;" : "");
//str.AppendLine("");
str.AppendLine("<div style='margin-bottom:36px;margin-left:30px;'>");
str.AppendLine("<table>");
str.AppendFormat("<tr><td class='label' colspan='2' style='text-align:left;'>Segment&nbsp;{0}</td></tr>", index);
str.AppendLine("");
str.AppendFormat("<tr><td class='label' style='width:170px;'>User</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(se.UserName));
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Hours</td><td>{0}</td></tr>", se.Hours);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Job Site</td><td>{0}</td></tr>", se.JobsiteName);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Cost</td><td>{0}</td></tr>", se.Cost);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Component</td><td>{0}</td></tr>", se.Component);
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Completed</td><td>{0}</td></tr>", se.Completed ? "Yes" : "No");
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Completed Date</td><td>{0}</td></tr>", se.CompletedDate == null ? "" : se.CompletedDate.Value.ToShortDateString());
str.AppendFormat("<tr><td class='label'>Description</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(se.Description));
str.AppendLine("");
str.AppendFormat("<tr><td class='label'>Notes</td><td>{0}</td></tr>", HttpUtility.HtmlEncode(se.Notes).Replace("\n", "<br>"));
str.AppendLine("");
str.AppendLine("</table>");
str.AppendLine("</div>");
return str.ToString();
}
}
}