1233 lines
59 KiB
C#
1233 lines
59 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Web;
|
|
using Foresight.Data;
|
|
using Foresight.ServiceModel;
|
|
using IronIntel.Services.Business.Admin;
|
|
using IronIntel.Contractor.Machines;
|
|
using IronIntel.Services.MapView;
|
|
using Foresight.Fleet.Services.Asset;
|
|
|
|
namespace IronIntel.Contractor.MapView
|
|
{
|
|
public class MachinesMapViewerManagement : MachineManagement
|
|
{
|
|
|
|
private const string MachineFields = "{0}MACHINEID,{0}MACHINENAME,{0}MAKEID,{0}MODELID,{0}TYPEID,{0}MACHINEICONID,{0}DEVICEID,{0}VIN,{0}MAKEYEAR,{0}NOTES,{0}STATUS,{0}CONTRACTORID,{0}DEALERID,{0}UID,{0}ADDEDON,{0}CUR_LONGITUDE,{0}CUR_LATITUDE,{0}LOCDATE_UTC,{0}ENGINEHOURS,{0}HOURSDATE_UTC,{0}DATASOURCE,{0}HIDE,{0}FUEL_CONSUMED,{0}FUEL_UNITS,{0}FUEL_DATE,{0}ODOMETER,{0}ODODATE_UTC,{0}ODOMETERUOM,{0}FUELCOST,{0}FUELCOSTUOM,{0}MACHINERATE,{0}WORKTYPE,{0}RETIREMENTHOURS,{0}RETIREMENTODO,{0}ALTITUDE,{0}ALTITUDEUNITS,{0}IDLEHOURSUTC,{0}IDLEHOURS,{0}LOADCOUNTUTC,{0}LOADCOUNT,{0}PAYLOADTOTALUTC,{0}PAYLOADTOTAL,{0}PAYLOADTOTALUNITS,{0}DEFREMAININGUTC,{0}DEFREMAINING,{0}FUELREMAININGUTC,{0}FUELREMAININGPERCENT,{0}MACHINENAME2,{0}ONROAD,{0}LEASESTART,{0}LEASEEND,{0}LEASEHOURS,{0}UNDERCARRIAGEHOURS,{0}ODOSTART2,{0}ISDELETED,{0}DELETEDDATE,{0}ODOSTART2DATASOURCE,{0}LOCDATASOURCE,{0}HOURSDATASOURCE,{0}FUELDATASOURCE,{0}AQUISITIONTYPE,{0}ICONFILENAME,{0}STARTINGENGINEHOURS,{0}DISTANCECALCBY,{0}TELEMATICSENABLED,{0}COSTCENTER,{0}EQCLASS,{0}DESCRIPTION,{0}MoveStatus,{0}DIRECTIONALHEADING";
|
|
|
|
private static readonly List<string> Status_InMotion = new List<string> { "InMotion", "START", "PRIOD", "TOWING_START" };
|
|
/// <summary>
|
|
/// 根据Contractorid获取机器列表
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static MachineViewItem[] GetMachines(string sessionid, string companyid, string useriid, string filtertext, int onroad, MachineAlertViewQueryParameter param)
|
|
{
|
|
string companyid1 = string.IsNullOrWhiteSpace(companyid) ? SystemParams.CompanyID : companyid;
|
|
MachineViewItem[] rst = GetMachineMapViewItem(sessionid, companyid1, useriid, filtertext, onroad);
|
|
if (param == null || string.IsNullOrWhiteSpace(param.ViewID))
|
|
return ProcessMachineIconUrl(rst);
|
|
else
|
|
return ProcessMachineIconUrl(rst, companyid1, param);
|
|
}
|
|
|
|
private static long[] ToMachineLongID(IEnumerable<string> machines)
|
|
{
|
|
List<long> ls = new List<long>();
|
|
foreach (string s in machines)
|
|
{
|
|
ls.Add(Convert.ToInt64(s));
|
|
}
|
|
return ls.ToArray();
|
|
}
|
|
|
|
public static MachineViewItem[] GetMachines(string sessionid, string companyid, string useriid, MachineAlertViewQueryParameter param, string[] machines)
|
|
{
|
|
string companyid1 = string.IsNullOrWhiteSpace(companyid) ? SystemParams.CompanyID : companyid;
|
|
MachineViewItem[] rst = GetMachineMapViewItems(sessionid, companyid1, useriid, ToMachineLongID(machines));
|
|
if (param == null || string.IsNullOrWhiteSpace(param.ViewID))
|
|
return ProcessMachineIconUrl(rst);
|
|
else
|
|
return ProcessMachineIconUrl(rst, companyid1, param);
|
|
}
|
|
|
|
public static MachineViewItem GetMachine(string sessionid, string companyid, string useriid, MachineAlertViewQueryParameter param, string machineid)
|
|
{
|
|
string companyid1 = string.IsNullOrWhiteSpace(companyid) ? SystemParams.CompanyID : companyid;
|
|
MachineViewItem item = GetMachineMapViewItem(sessionid, companyid1, useriid, machineid);
|
|
MachineViewItem[] result;
|
|
if (param == null || string.IsNullOrWhiteSpace(param.ViewID))
|
|
result = ProcessMachineIconUrl(new MachineViewItem[] { item });
|
|
else
|
|
result = ProcessMachineIconUrl(new MachineViewItem[] { item }, companyid1, param);
|
|
if (result != null && result.Length > 0)
|
|
return result[0];
|
|
return null;
|
|
}
|
|
|
|
public static MachineViewItem GetMachineWithDatasource(string sessionid, string companyid, string useriid, string machineid, string datasource)
|
|
{
|
|
companyid = string.IsNullOrWhiteSpace(companyid) ? SystemParams.CompanyID : companyid;
|
|
MachineViewItem item = GetMachineMapViewItem(companyid, useriid, machineid, datasource);
|
|
MachineViewItem[] result = ProcessMachineIconUrl(new MachineViewItem[] { item });
|
|
if (result != null && result.Length > 0)
|
|
{
|
|
item = result[0];
|
|
var locs = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid).GetAssetCurrentLocation(companyid, item.ID);
|
|
var loc = locs.FirstOrDefault(l => l.IsPrimary);
|
|
if (loc != null)
|
|
{
|
|
item.Location.Latitude = loc.Latitude;
|
|
item.Location.Longitude = loc.Longitude;
|
|
item.Location.LocationTime = loc.AsofTimeLocal;
|
|
}
|
|
return item;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static Dictionary<string, List<MachineViewItem>> GetGroupAssets(string useriid, FISqlConnection db = null)
|
|
{
|
|
const string SQL = @"if(select count(1) from USERMACHINEGROUPMAP where USERIID={0})=0
|
|
select a.MACHINEID,a.GROUPID,b.VIN,b.MACHINENAME,b.MACHINENAME2 from MACHINEGROUPMAP a,MACHINES b where a.MACHINEID=b.MACHINEID and ISNULL(b.HIDE,0)=0
|
|
else
|
|
select a.MACHINEID,a.GROUPID,b.VIN,b.MACHINENAME,b.MACHINENAME2 from MACHINEGROUPMAP a,MACHINES b where a.MACHINEID=b.MACHINEID and ISNULL(b.HIDE,0)=0
|
|
and b.MACHINEID in (select distinct MACHINEID from MACHINEGROUPMAP
|
|
where GROUPID in (select GROUPID from USERMACHINEGROUPMAP where USERIID={0}))";
|
|
|
|
if (db == null)
|
|
db = SystemParams.GetDbInstance();
|
|
DataTable dt = null;
|
|
dt = db.GetDataTableBySQL(SQL, useriid);
|
|
|
|
Dictionary<string, List<MachineViewItem>> result = new Dictionary<string, List<MachineViewItem>>(StringComparer.OrdinalIgnoreCase);
|
|
if (dt.Rows.Count == 0)
|
|
{
|
|
return result;
|
|
}
|
|
foreach (DataRow dr in dt.Rows)
|
|
{
|
|
MachineViewItem mi = new MachineViewItem();
|
|
mi.ID = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
mi.Name = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
|
|
mi.Name2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
|
|
mi.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
|
|
string groupID = FIDbAccess.GetFieldString(dr["GROUPID"], string.Empty);
|
|
if (!result.ContainsKey(groupID))
|
|
result[groupID] = new List<MachineViewItem>();
|
|
result[groupID].Add(mi);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static List<MachineViewItem> GetNoGroupAssets(FISqlConnection db = null)
|
|
{
|
|
const string SQL = @"select b.MACHINEID,b.VIN,b.MACHINENAME,b.MACHINENAME2 from MACHINES b where not exists(select 1 from MACHINEGROUPMAP a where a.MACHINEID=b.MACHINEID)";
|
|
|
|
if (db == null)
|
|
db = SystemParams.GetDbInstance();
|
|
DataTable dt = db.GetDataTableBySQL(SQL);
|
|
|
|
List<MachineViewItem> result = new List<MachineViewItem>();
|
|
if (dt.Rows.Count == 0)
|
|
{
|
|
return result;
|
|
}
|
|
foreach (DataRow dr in dt.Rows)
|
|
{
|
|
MachineViewItem mi = new MachineViewItem();
|
|
mi.ID = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
mi.Name = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
|
|
mi.Name2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
|
|
mi.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
|
|
result.Add(mi);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static ViewTemp GetMapAlertViewData(string companyid, string alertviewid)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(alertviewid))
|
|
{
|
|
return null;
|
|
}
|
|
MapAlertLayerClient mc = SystemParams.GetMapAlertLayerClient();
|
|
MapAlertViewItem view = mc.GetMapAlertView(alertviewid, true);
|
|
if (view == null)
|
|
{
|
|
return null;
|
|
}
|
|
List<LayerDataTemp> ls = new List<LayerDataTemp>();
|
|
foreach (MapAlertLayerItem layer in view.Layers)
|
|
{
|
|
LayerDataTemp ld = new LayerDataTemp();
|
|
ld.Layer = layer;
|
|
ld.Machines = GetAlertViewMachines(companyid, layer.ID);
|
|
if (!string.IsNullOrWhiteSpace(layer.AlertSQL))
|
|
{
|
|
ld.AlertDescriptions = GetAlertSQLResult(companyid, layer.ID);
|
|
}
|
|
ls.Add(ld);
|
|
}
|
|
ViewTemp tmp = new ViewTemp();
|
|
tmp.Layers = ls.ToArray();
|
|
return tmp;
|
|
}
|
|
|
|
private static MachineViewItem[] ProcessMachineIconUrl(MachineViewItem[] items)
|
|
{
|
|
const string DEFAULT_BACKCOLOR = "#FF000000";
|
|
const string DEFAULT_DOTCOLOR = "#FF000000";
|
|
const string DEFAULT_COLOR_InMotion = "#FF008000";//Color.Green
|
|
const string PARAM = "?typeid={0}&bkcolor={1}&dotcolor={2}&move={3}&angle={4}&sn={5}";
|
|
const string PARAMMACHINE = "?mid={0}&typeid={1}&bkcolor={2}&dotcolor={3}&move={4}&angle={5}&sn={6}";
|
|
|
|
if (items.Count() == 0)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
|
|
string path = SystemParams.MachineTypeMapViewIconUrl;
|
|
foreach (MachineViewItem item in items)
|
|
{
|
|
string pcolor = HttpUtility.UrlEncode(DEFAULT_BACKCOLOR);
|
|
string scolor = HttpUtility.UrlEncode(DEFAULT_DOTCOLOR);
|
|
if (Status_InMotion.Contains(item.MoveStatus, StringComparer.OrdinalIgnoreCase) && item.Directionalheading >= 0)
|
|
scolor = HttpUtility.UrlEncode(DEFAULT_COLOR_InMotion);
|
|
|
|
if (!string.IsNullOrWhiteSpace(item.IconFileName))
|
|
item.IconUrl = path + string.Format(PARAMMACHINE, item.ID, item.TypeID, pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
else
|
|
item.IconUrl = path + string.Format(PARAM, item.TypeID, pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
item.EmptyIconUrl = path + string.Format(PARAM, "-1", pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
|
|
}
|
|
return items;
|
|
}
|
|
|
|
private static MachineViewItem[] ProcessMachineIconUrl(MachineViewItem[] items, string companyid, MachineAlertViewQueryParameter param)
|
|
{
|
|
const string DEFAULT_BACKCOLOR = "#FF000000";
|
|
const string DEFAULT_DOTCOLOR = "#FF000000";
|
|
const string DEFAULT_COLOR_InMotion = "#FF008000";//Color.Green
|
|
const string PARAM = "?typeid={0}&bkcolor={1}&dotcolor={2}&move={3}&angle={4}&sn={5}";
|
|
const string PARAMMACHINE = "?mid={0}&typeid={1}&bkcolor={2}&dotcolor={3}&move={4}&angle={5}&sn={6}";
|
|
|
|
if (items.Count() == 0)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
|
|
string path = SystemParams.MachineTypeMapViewIconUrl;
|
|
|
|
MachineAlertViewQueryResult result = null;
|
|
if (param != null)
|
|
{
|
|
MachineAlertViewClient mc = GetMachineAlertViewClient();
|
|
result = mc.QueryMachineAlertView(companyid, param.ViewID, param);
|
|
}
|
|
|
|
List<MachineViewItem> list = new List<MachineViewItem>();
|
|
foreach (MachineViewItem item in items)
|
|
{
|
|
long machineid = Convert.ToInt64(item.ID);
|
|
MachineAlertViewLayerQueryResult primarylayer = null;
|
|
MachineAlertViewLayerQueryResult secondlayer = null;
|
|
if (result != null)
|
|
{
|
|
primarylayer = result.GetLayer(machineid, true);
|
|
secondlayer = result.GetLayer(machineid, false);
|
|
}
|
|
if ((primarylayer == null) && (secondlayer == null))
|
|
{
|
|
continue;//如果机器没有出现在alert view当中,则不在地图上显示
|
|
}
|
|
|
|
list.Add(item);
|
|
string pcolor = HttpUtility.UrlEncode(primarylayer == null ? DEFAULT_BACKCOLOR : primarylayer.Layer.IconColor);
|
|
string scolor = "";
|
|
if (Status_InMotion.Contains(item.MoveStatus, StringComparer.OrdinalIgnoreCase) && item.Directionalheading >= 0)//InMotion
|
|
{
|
|
scolor = HttpUtility.UrlEncode(secondlayer == null ? DEFAULT_COLOR_InMotion : secondlayer.Layer.IconColor);
|
|
}
|
|
else
|
|
{
|
|
scolor = HttpUtility.UrlEncode(secondlayer == null ? DEFAULT_DOTCOLOR : secondlayer.Layer.IconColor);
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(item.IconFileName))
|
|
item.IconUrl = path + string.Format(PARAMMACHINE, item.ID, item.TypeID, pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
else
|
|
item.IconUrl = path + string.Format(PARAM, item.TypeID, pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
item.EmptyIconUrl = path + string.Format(PARAM, -1, pcolor, scolor, item.MoveStatus, item.Directionalheading, DateTime.Now.Ticks);
|
|
if (primarylayer != null)
|
|
item.MapAlertLayerPriority = primarylayer.Layer.Priority;
|
|
if (primarylayer != null)
|
|
{
|
|
item.AlertTip = primarylayer.GetAlertTip(machineid);
|
|
}
|
|
if (secondlayer != null)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(item.AlertTip))
|
|
{
|
|
item.AlertTip = secondlayer.GetAlertTip(machineid);
|
|
}
|
|
else
|
|
{
|
|
item.AlertTip = item.AlertTip + "\r\n" + secondlayer.GetAlertTip(machineid);
|
|
}
|
|
}
|
|
}
|
|
|
|
return list.ToArray();
|
|
}
|
|
|
|
private static long[] GetAlertViewMachines(string companyid, string alertlayerid)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(companyid) || string.IsNullOrWhiteSpace(alertlayerid))
|
|
{
|
|
return new long[0];
|
|
}
|
|
try
|
|
{
|
|
MapAlertLayerClient mc = SystemParams.GetMapAlertLayerClient();
|
|
return mc.GetCriteriaMachines(companyid, alertlayerid);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
SystemParams.WriteLog("Error", typeof(MachinesMapViewerManagement).FullName + ".GetAlertViewMachines(string companyid, string alertlayerid)", ex.Message, ex.ToString());
|
|
return new long[0];
|
|
}
|
|
}
|
|
|
|
private static StringKeyValue[] GetAlertSQLResult(string companyid, string alertlayerid)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(companyid) || string.IsNullOrWhiteSpace(alertlayerid))
|
|
{
|
|
return new StringKeyValue[0];
|
|
}
|
|
try
|
|
{
|
|
MapAlertLayerClient mc = SystemParams.GetMapAlertLayerClient();
|
|
return mc.GetAlertDescriptionResult(companyid, alertlayerid);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
SystemParams.WriteLog("Error", typeof(MachinesMapViewerManagement).FullName + ".GetAlertSQLResult(string companyid, string alertlayerid)", ex.Message, ex.ToString());
|
|
return new StringKeyValue[0];
|
|
}
|
|
}
|
|
|
|
|
|
private static MachineViewItem[] GetMachineMapViewItem(string sessionid, string companyid, string useriid, string filtertext, int onroad)
|
|
{
|
|
string SQL_M = "select " + string.Format(MachineFields, "") + " from MACHINES where ISNULL(HIDE,0)=0";
|
|
|
|
const string SQL_L = @"select AssetId as MACHINEID,LATITUDE,LONGITUDE,AsofTime as ASOFTIME_UTC,MOVESTATUS,HEADING, Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocation where IsPrimary=1";
|
|
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";
|
|
|
|
FISqlConnection db = SystemParams.GetCompanyDbConnection(companyid);
|
|
if (db == null)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
DataTable tb = db.GetDataTableBySQL(SQL_M, useriid);
|
|
if (tb.Rows.Count == 0)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
|
|
double timeadjust = SystemParams.GetHoursOffset();
|
|
DataTable tbl = null;
|
|
DataTable tbeh = null;
|
|
string dbString2 = SystemParams.GetIronIntelReportDataDbString(companyid);
|
|
if (!string.IsNullOrWhiteSpace(dbString2))
|
|
{
|
|
var db2 = new FISqlConnection(dbString2);
|
|
tbl = db2.GetDataTableBySQL(SQL_L);
|
|
//tbeh = db2.GetDataTableBySQL(SQL_EH);
|
|
}
|
|
|
|
Dictionary<long, AssetLocation> machineLocations = new Dictionary<long, AssetLocation>();
|
|
if (tbl != null && tbl.Rows.Count > 0)
|
|
{
|
|
foreach (DataRow dr in tbl.Rows)
|
|
{
|
|
long mID = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
var ml = new AssetLocation();
|
|
ml.Location = new LocationViewItem();
|
|
ml.Location.Latitude = FIDbAccess.GetFieldDouble(dr["LATITUDE"], 0);
|
|
ml.Location.Longitude = FIDbAccess.GetFieldDouble(dr["LONGITUDE"], 0);
|
|
ml.Location.LocationTime = FIDbAccess.GetFieldDateTime(dr["ASOFTIME_UTC"], DateTime.MinValue);
|
|
if (ml.Location.LocationTime != DateTime.MinValue)
|
|
ml.Location.LocationTime = ml.Location.LocationTime.AddHours(timeadjust);
|
|
|
|
ml.MoveStatus = FIDbAccess.GetFieldString(dr["MOVESTATUS"], string.Empty);
|
|
ml.Directionalheading = FIDbAccess.GetFieldInt(dr["HEADING"], -1);
|
|
ml.Location.Speed = FIDbAccess.GetFieldDouble(dr["Speed"], -1);
|
|
ml.Location.SpeedUnit = FIDbAccess.GetFieldString(dr["SpeedUnits"], string.Empty);
|
|
ml.Location.PostedSpeed = FIDbAccess.GetFieldDouble(dr["PostedSpeedLimit"], -1);
|
|
ml.Location.PostedSpeedUnit = FIDbAccess.GetFieldString(dr["SpeedLimitUnits"], string.Empty);
|
|
ml.Location.Street = FIDbAccess.GetFieldString(dr["Street"], string.Empty);
|
|
|
|
machineLocations[mID] = ml;
|
|
}
|
|
}
|
|
|
|
//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(timeadjust);
|
|
|
|
// machineEngineHours[mID] = meh;
|
|
// }
|
|
//}
|
|
|
|
var mids = tb.AsEnumerable().Select(c => c.Field<long>("MACHINEID")).ToArray();
|
|
var client = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid);
|
|
var ehs = client.GetAssetsCurrentPrimaryEngineHours(companyid, mids);
|
|
var odos = client.GetAssetsCurrentPrimaryOdometer(companyid, mids);
|
|
|
|
long[] availableAssetsids = null;
|
|
var user = Users.UserManagement.GetUserByIID(useriid);
|
|
if (user.UserType < Users.UserTypes.Admin)
|
|
availableAssetsids = client.GetAvailableAssetsForUsers(companyid, useriid);
|
|
|
|
RefreshBaseData();
|
|
MachineMake[] makes = GetMachineMakes();
|
|
MachineModel[] models = GetMachineModels();
|
|
MachineType[] types = GetMachineTypes();
|
|
List<MachineViewItem> ls = new List<MachineViewItem>();
|
|
if (tb.Rows.Count > 0)
|
|
{
|
|
var groupassets = GetGroupsAssets(db);
|
|
foreach (DataRow dr in tb.Rows)
|
|
{
|
|
long mid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
|
|
continue;
|
|
MachineViewItem mi = ConvertToMachineViewItem(dr, makes, models, types, timeadjust);
|
|
if (onroad >= 0 && onroad != mi.Onroad)
|
|
continue;
|
|
|
|
if (!string.IsNullOrWhiteSpace(filtertext)
|
|
&& !Contains(mi.Name, filtertext)
|
|
&& !Contains(mi.Name2.ToString(), filtertext)
|
|
&& !Contains(mi.VIN.ToString(), filtertext)
|
|
&& !Contains(mi.ID.ToString(), filtertext)
|
|
&& !Contains(mi.Make, filtertext)
|
|
&& !Contains(mi.MachineType, filtertext)
|
|
&& !Contains(mi.Model, filtertext))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (groupassets.ContainsKey(Convert.ToInt32(mi.ID)))
|
|
{
|
|
var groups = groupassets[Convert.ToInt32(mi.ID)].ToArray();
|
|
mi.AssetGroupNames = string.Join(", ", groups.Select(m => m.Value));
|
|
}
|
|
else
|
|
mi.AssetGroupNames = string.Empty;
|
|
|
|
if (machineLocations.ContainsKey(mi.ID))
|
|
{
|
|
var ml = machineLocations[mi.ID];
|
|
mi.Location = ml.Location;
|
|
mi.MoveStatus = ml.MoveStatus;
|
|
mi.Directionalheading = ml.Directionalheading;
|
|
}
|
|
|
|
ConvertSpeedUnitToMile(mi.Location);
|
|
//if (machineEngineHours.ContainsKey(mi.ID))
|
|
//{
|
|
// var meh = machineEngineHours[mi.ID];
|
|
// mi.EngineHours = meh.EngineHours;
|
|
// mi.EngineHoursDate = meh.EngineHoursDate;
|
|
//}
|
|
if (ehs != null && ehs.Length > 0)
|
|
{
|
|
var eh = ehs.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (eh != null)
|
|
{
|
|
mi.EngineHours = eh.Corrected;
|
|
mi.EngineHoursDate = eh.AsofTimeLocal;
|
|
}
|
|
}
|
|
|
|
if (odos != null && odos.Length > 0)
|
|
{
|
|
var odo = odos.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (odo != null)
|
|
{
|
|
mi.Odometer = odo.Corrected;
|
|
mi.OdometerUOM = odo.UOM;
|
|
}
|
|
}
|
|
ls.Add(mi);
|
|
}
|
|
}
|
|
return ls.ToArray();
|
|
}
|
|
|
|
private static MachineViewItem[] GetMachineMapViewItems(string sessionid, string companyid, string useriid, long[] machinids)
|
|
{
|
|
string SQL = "select " + string.Format(MachineFields, "") + " from MACHINES where MACHINEID in({MIDS}) and ISNULL(HIDE,0)=0";
|
|
|
|
const string SQL_L = @"select AssetId as MACHINEID,LATITUDE,LONGITUDE,AsofTime as ASOFTIME_UTC,MOVESTATUS,HEADING, Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocation where IsPrimary=1 and AssetId in({MIDS})";
|
|
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 AssetId in({MIDS}) and Datasource<>'Calamp') t
|
|
where RowIndex=1";
|
|
|
|
FISqlConnection db = SystemParams.GetCompanyDbConnection(companyid);
|
|
if (db == null)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
string wh = string.Empty;
|
|
foreach (long id in machinids)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(wh))
|
|
{
|
|
wh = id.ToString();
|
|
}
|
|
else
|
|
{
|
|
wh = wh + "," + id.ToString();
|
|
}
|
|
}
|
|
DataTable tb = db.GetDataTableBySQL(SQL.Replace("{MIDS}", wh), useriid);
|
|
if (tb.Rows.Count == 0)
|
|
{
|
|
return new MachineViewItem[0];
|
|
}
|
|
|
|
double timeadjust = SystemParams.GetHoursOffset();
|
|
DataTable tbl = null;
|
|
DataTable tbeh = null;
|
|
string dbString2 = SystemParams.GetIronIntelReportDataDbString(companyid);
|
|
if (!string.IsNullOrWhiteSpace(dbString2))
|
|
{
|
|
var db2 = new FISqlConnection(dbString2);
|
|
tbl = db2.GetDataTableBySQL(SQL_L.Replace("{MIDS}", wh));
|
|
//tbeh = db2.GetDataTableBySQL(SQL_EH.Replace("{MIDS}", wh));
|
|
}
|
|
|
|
Dictionary<long, AssetLocation> machineLocations = new Dictionary<long, AssetLocation>();
|
|
if (tbl != null && tbl.Rows.Count > 0)
|
|
{
|
|
foreach (DataRow dr in tbl.Rows)
|
|
{
|
|
long mID = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
var ml = new AssetLocation();
|
|
ml.Location = new LocationViewItem();
|
|
ml.Location.Latitude = FIDbAccess.GetFieldDouble(dr["LATITUDE"], 0);
|
|
ml.Location.Longitude = FIDbAccess.GetFieldDouble(dr["LONGITUDE"], 0);
|
|
ml.Location.LocationTime = FIDbAccess.GetFieldDateTime(dr["ASOFTIME_UTC"], DateTime.MinValue);
|
|
if (ml.Location.LocationTime != DateTime.MinValue)
|
|
ml.Location.LocationTime = ml.Location.LocationTime.AddHours(timeadjust);
|
|
|
|
ml.MoveStatus = FIDbAccess.GetFieldString(dr["MOVESTATUS"], string.Empty);
|
|
ml.Directionalheading = FIDbAccess.GetFieldInt(dr["HEADING"], -1);
|
|
ml.Location.Speed = FIDbAccess.GetFieldDouble(dr["Speed"], -1);
|
|
ml.Location.SpeedUnit = FIDbAccess.GetFieldString(dr["SpeedUnits"], string.Empty);
|
|
ml.Location.PostedSpeed = FIDbAccess.GetFieldDouble(dr["PostedSpeedLimit"], -1);
|
|
ml.Location.PostedSpeedUnit = FIDbAccess.GetFieldString(dr["SpeedLimitUnits"], string.Empty);
|
|
ml.Location.Street = FIDbAccess.GetFieldString(dr["Street"], string.Empty);
|
|
|
|
machineLocations[mID] = ml;
|
|
}
|
|
}
|
|
|
|
//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(timeadjust);
|
|
|
|
// machineEngineHours[mID] = meh;
|
|
// }
|
|
//}
|
|
var client = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid);
|
|
var ehs = client.GetAssetsCurrentPrimaryEngineHours(companyid, machinids);
|
|
var odos = client.GetAssetsCurrentPrimaryOdometer(companyid, machinids);
|
|
|
|
long[] availableAssetsids = null;
|
|
var user = Users.UserManagement.GetUserByIID(useriid);
|
|
if (user.UserType < Users.UserTypes.Admin)
|
|
availableAssetsids = client.GetAvailableAssetsForUsers(companyid, useriid);
|
|
|
|
MachineMake[] makes = GetMachineMakes();
|
|
MachineModel[] models = GetMachineModels();
|
|
MachineType[] types = GetMachineTypes();
|
|
List<MachineViewItem> ls = new List<MachineViewItem>();
|
|
if (tb.Rows.Count > 0)
|
|
{
|
|
var groupassets = GetGroupsAssets(db);
|
|
foreach (DataRow dr in tb.Rows)
|
|
{
|
|
long mid = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
if (user.UserType < Users.UserTypes.Admin && !availableAssetsids.Contains(mid))
|
|
continue;
|
|
|
|
MachineViewItem mi = ConvertToMachineViewItem(dr, makes, models, types, timeadjust);
|
|
|
|
if (groupassets.ContainsKey(Convert.ToInt32(mi.ID)))
|
|
{
|
|
var groups = groupassets[Convert.ToInt32(mi.ID)].ToArray();
|
|
mi.AssetGroupNames = string.Join(", ", groups.Select(m => m.Value));
|
|
}
|
|
else
|
|
mi.AssetGroupNames = string.Empty;
|
|
|
|
if (machineLocations.ContainsKey(mi.ID))
|
|
{
|
|
var ml = machineLocations[mi.ID];
|
|
mi.Location = ml.Location;
|
|
mi.MoveStatus = ml.MoveStatus;
|
|
mi.Directionalheading = ml.Directionalheading;
|
|
}
|
|
|
|
ConvertSpeedUnitToMile(mi.Location);
|
|
//if (machineEngineHours.ContainsKey(mi.ID))
|
|
//{
|
|
// var meh = machineEngineHours[mi.ID];
|
|
// mi.EngineHours = meh.EngineHours;
|
|
// mi.EngineHoursDate = meh.EngineHoursDate;
|
|
//}
|
|
|
|
if (ehs != null && ehs.Length > 0)
|
|
{
|
|
var eh = ehs.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (eh != null)
|
|
{
|
|
mi.EngineHours = eh.Corrected;
|
|
}
|
|
}
|
|
|
|
if (odos != null && odos.Length > 0)
|
|
{
|
|
var odo = odos.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (odo != null)
|
|
{
|
|
mi.Odometer = odo.Corrected;
|
|
mi.OdometerUOM = odo.UOM;
|
|
}
|
|
}
|
|
ls.Add(mi);
|
|
}
|
|
}
|
|
return ls.ToArray();
|
|
}
|
|
|
|
private static MachineViewItem GetMachineMapViewItem(string sessionid, string companyid, string useriid, string machineid, string datasource = "")
|
|
{
|
|
string SQL = "select " + string.Format(MachineFields, "") + " from MACHINES where MACHINEID={1}";
|
|
|
|
const string SQL_L = @"select AssetId as MACHINEID,LATITUDE,LONGITUDE,AsofTime as ASOFTIME_UTC,MOVESTATUS,HEADING, Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocation where IsPrimary=1 and AssetId={0}";
|
|
const string SQL_L_Datasource = @"select top 1 a.AssetId as MACHINEID,LATITUDE,LONGITUDE,AsofTime as ASOFTIME_UTC,MOVESTATUS,HEADING,Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocation a where a.AssetId={0} and a.Datasource={1} order by AsofTime desc";
|
|
|
|
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 AssetId={0} and Datasource<>'Calamp') t
|
|
where RowIndex=1";
|
|
FISqlConnection db = SystemParams.GetCompanyDbConnection(companyid);
|
|
if (db == null)
|
|
{
|
|
return null;
|
|
}
|
|
DataTable tb = db.GetDataTableBySQL(SQL, useriid, machineid);
|
|
if (tb.Rows.Count == 0)
|
|
{
|
|
return null;
|
|
}
|
|
DataTable tbl = null;
|
|
DataTable tbeh = null;
|
|
string dbString2 = SystemParams.GetIronIntelReportDataDbString(companyid);
|
|
if (!string.IsNullOrWhiteSpace(dbString2))
|
|
{
|
|
var db2 = new FISqlConnection(dbString2);
|
|
if (string.IsNullOrEmpty(datasource))
|
|
tbl = db2.GetDataTableBySQL(SQL_L, machineid);
|
|
else
|
|
tbl = db2.GetDataTableBySQL(SQL_L_Datasource, machineid, datasource);
|
|
//tbeh = db2.GetDataTableBySQL(SQL_EH, machineid);
|
|
}
|
|
|
|
double timeadjust = SystemParams.GetHoursOffset();
|
|
AssetLocation machineLocation = null;
|
|
if (tbl != null && tbl.Rows.Count > 0)
|
|
{
|
|
DataRow dr = tbl.Rows[0];
|
|
string mID = FIDbAccess.GetFieldString(dr["MACHINEID"], string.Empty);
|
|
var ml = new AssetLocation();
|
|
ml.Location = new LocationViewItem();
|
|
ml.Location.Latitude = FIDbAccess.GetFieldDouble(dr["LATITUDE"], 0);
|
|
ml.Location.Longitude = FIDbAccess.GetFieldDouble(dr["LONGITUDE"], 0);
|
|
ml.Location.LocationTime = FIDbAccess.GetFieldDateTime(dr["ASOFTIME_UTC"], DateTime.MinValue);
|
|
if (ml.Location.LocationTime != DateTime.MinValue)
|
|
ml.Location.LocationTime = ml.Location.LocationTime.AddHours(timeadjust);
|
|
|
|
ml.MoveStatus = FIDbAccess.GetFieldString(dr["MOVESTATUS"], string.Empty);
|
|
ml.Directionalheading = FIDbAccess.GetFieldInt(dr["HEADING"], -1);
|
|
ml.Location.Speed = FIDbAccess.GetFieldDouble(dr["Speed"], -1);
|
|
ml.Location.SpeedUnit = FIDbAccess.GetFieldString(dr["SpeedUnits"], string.Empty);
|
|
ml.Location.PostedSpeed = FIDbAccess.GetFieldDouble(dr["PostedSpeedLimit"], -1);
|
|
ml.Location.PostedSpeedUnit = FIDbAccess.GetFieldString(dr["SpeedLimitUnits"], string.Empty);
|
|
ml.Location.Street = FIDbAccess.GetFieldString(dr["Street"], string.Empty);
|
|
|
|
machineLocation = ml;
|
|
}
|
|
|
|
//AssetEngineHour machineEngineHour = null;
|
|
//if (tbeh != null && tbeh.Rows.Count > 0)
|
|
//{
|
|
// DataRow dr = tbeh.Rows[0];
|
|
// 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(timeadjust);
|
|
|
|
// machineEngineHour = meh;
|
|
//}
|
|
|
|
var client = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid);
|
|
var ehs = client.GetAssetsCurrentPrimaryEngineHours(companyid, new long[] { long.Parse(machineid) });
|
|
var odos = client.GetAssetsCurrentPrimaryOdometer(companyid, new long[] { long.Parse(machineid) });
|
|
|
|
MachineMake[] makes = GetMachineMakes();
|
|
MachineModel[] models = GetMachineModels();
|
|
MachineType[] types = GetMachineTypes();
|
|
if (tb.Rows.Count > 0)
|
|
{
|
|
var groupassets = GetGroupsAssets(db);
|
|
|
|
DataRow dr = tb.Rows[0];
|
|
MachineViewItem mi = ConvertToMachineViewItem(dr, makes, models, types, timeadjust);
|
|
|
|
if (groupassets.ContainsKey(Convert.ToInt32(mi.ID)))
|
|
{
|
|
var groups = groupassets[Convert.ToInt32(mi.ID)].ToArray();
|
|
mi.AssetGroupNames = string.Join(", ", groups.Select(m => m.Value));
|
|
}
|
|
else
|
|
mi.AssetGroupNames = string.Empty;
|
|
|
|
if (machineLocation != null)
|
|
{
|
|
var ml = machineLocation;
|
|
mi.Location = ml.Location;
|
|
mi.MoveStatus = ml.MoveStatus;
|
|
mi.Directionalheading = ml.Directionalheading;
|
|
}
|
|
|
|
ConvertSpeedUnitToMile(mi.Location);
|
|
//if (machineEngineHour != null)
|
|
//{
|
|
// var meh = machineEngineHour;
|
|
// mi.EngineHours = meh.EngineHours;
|
|
// mi.EngineHoursDate = meh.EngineHoursDate;
|
|
//}
|
|
|
|
if (ehs != null && ehs.Length > 0)
|
|
{
|
|
var eh = ehs.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (eh != null)
|
|
{
|
|
mi.EngineHours = eh.Corrected;
|
|
}
|
|
}
|
|
|
|
if (odos != null && odos.Length > 0)
|
|
{
|
|
var odo = odos.FirstOrDefault((o) => o.AssetID == mi.ID);
|
|
if (odo != null)
|
|
{
|
|
mi.Odometer = odo.Corrected;
|
|
mi.OdometerUOM = odo.UOM;
|
|
}
|
|
}
|
|
|
|
return mi;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private static MachineViewItem ConvertToMachineViewItem(DataRow dr, MachineMake[] makes, MachineModel[] models, MachineType[] types, double timeadjust)
|
|
{
|
|
MachineViewItem mi = new MachineViewItem();
|
|
mi.ID = FIDbAccess.GetFieldInt64(dr["MACHINEID"], 0);
|
|
mi.Name = FIDbAccess.GetFieldString(dr["MACHINENAME"], string.Empty);
|
|
mi.Name2 = FIDbAccess.GetFieldString(dr["MACHINENAME2"], string.Empty);
|
|
mi.VIN = FIDbAccess.GetFieldString(dr["VIN"], string.Empty);
|
|
mi.MakeYear = FIDbAccess.GetFieldInt(dr["MAKEYEAR"], 0);
|
|
mi.EngineHours = FIDbAccess.GetFieldDouble(dr["ENGINEHOURS"], 0);
|
|
mi.EngineHoursDate = FIDbAccess.GetFieldDateTime(dr["HOURSDATE_UTC"], DateTime.MinValue);
|
|
if (mi.EngineHoursDate != DateTime.MinValue)
|
|
mi.EngineHoursDate = mi.EngineHoursDate.AddHours(timeadjust);
|
|
|
|
mi.Location = new LocationViewItem();
|
|
mi.Location.Latitude = FIDbAccess.GetFieldDouble(dr["CUR_LATITUDE"], 0);
|
|
mi.Location.Longitude = FIDbAccess.GetFieldDouble(dr["CUR_LONGITUDE"], 0);
|
|
mi.Location.LocationTime = FIDbAccess.GetFieldDateTime(dr["LOCDATE_UTC"], DateTime.MinValue);
|
|
if (mi.Location.LocationTime != DateTime.MinValue)
|
|
mi.Location.LocationTime = mi.Location.LocationTime.AddHours(timeadjust);
|
|
|
|
mi.Odometer = FIDbAccess.GetFieldDouble(dr["ODOMETER"], 0);
|
|
mi.OdometerUOM = FIDbAccess.GetFieldString(dr["ODOMETERUOM"], string.Empty);
|
|
mi.IconFileName = FIDbAccess.GetFieldString(dr["ICONFILENAME"], string.Empty);
|
|
mi.Onroad = FIDbAccess.GetFieldInt(dr["ONROAD"], 0);
|
|
|
|
mi.MoveStatus = FIDbAccess.GetFieldString(dr["MOVESTATUS"], string.Empty);
|
|
mi.Directionalheading = FIDbAccess.GetFieldInt(dr["DIRECTIONALHEADING"], -1);
|
|
|
|
int makeid = FIDbAccess.GetFieldInt(dr["MAKEID"], 0);
|
|
MachineMake make = GetMachineMake(makes, makeid);
|
|
mi.Make = make == null ? string.Empty : make.Name;
|
|
|
|
int modelid = FIDbAccess.GetFieldInt(dr["MODELID"], 0);
|
|
MachineModel model = GetMachineModel(models, modelid);
|
|
mi.Model = model == null ? string.Empty : model.Name;
|
|
|
|
int typeid = FIDbAccess.GetFieldInt(dr["TYPEID"], 0);
|
|
mi.TypeID = typeid;
|
|
MachineType mtype = GetMachineType(types, typeid);
|
|
if (mtype != null)
|
|
{
|
|
mi.MachineType = mtype.Name;
|
|
mi.IconUrl = mtype.IconUrl;
|
|
}
|
|
else
|
|
{
|
|
mi.MachineType = string.Empty;
|
|
mi.IconUrl = DefaultMachineTypeIconUrl;
|
|
}
|
|
return mi;
|
|
}
|
|
|
|
public static MachineViewItem GetMachineViewItem(string companyid, long machineid)
|
|
{
|
|
string SQL = "select " + string.Format(MachineFields, "") + " from MACHINES where MACHINEID={0}";
|
|
|
|
FISqlConnection db = SystemParams.GetCompanyDbConnection(companyid);
|
|
if (db == null)
|
|
{
|
|
return null;
|
|
}
|
|
DataTable tb = db.GetDataTableBySQL(SQL, machineid);
|
|
if (tb.Rows.Count == 0)
|
|
{
|
|
return null;
|
|
}
|
|
RefreshBaseData();
|
|
MachineMake[] makes = GetMachineMakes();
|
|
MachineModel[] models = GetMachineModels();
|
|
MachineType[] types = GetMachineTypes();
|
|
|
|
double timeadjust = SystemParams.GetHoursOffset();
|
|
MachineViewItem mi = ConvertToMachineViewItem(tb.Rows[0], makes, models, types, timeadjust);
|
|
|
|
SQL = "select string_agg(g.GROUPNAME,',') from MACHINEGROUPMAP mg left join MACHINEGROUPS g on mg.GROUPID=g.GROUPID where mg.MACHINEID={0} group by mg.MACHINEID";
|
|
mi.AssetGroupNames = FIDbAccess.GetFieldString(db.GetRC1BySQL(SQL, machineid), "");
|
|
|
|
return mi;
|
|
}
|
|
|
|
public static MachineLocationHistoryViewItem GetMachineLocation(string machineid, DateTime startTime, DateTime endTime, string companyid, bool notShow00loc, string datasource)
|
|
{
|
|
const string SQL = "select LATITUDE,LONGITUDE,EVENTTIME_UTC from MACHINE_EVENTS where MACHINEID={0} and EVENTTIME_UTC>={1} and EVENTTIME_UTC<={2} order by EVENTTIME_UTC";
|
|
const string SQL_L = "select LATITUDE,LONGITUDE, AsofTime as EVENTTIME_UTC,Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocationHis where AssetId={0} and AsofTime>={1} and AsofTime<={2} and Datasource=(select top 1 from AssetLocation where AssetId={0} and IsPrimary=1) order by AsofTime";
|
|
const string SQL_L_Datasource = "select LATITUDE,LONGITUDE, AsofTime as EVENTTIME_UTC,Speed,SpeedUnits,PostedSpeedLimit,SpeedLimitUnits,Street from AssetLocationHis where AssetId={0} and AsofTime>={1} and AsofTime<={2} and Datasource={3} order by AsofTime";
|
|
const string SQL_EXISTS = "select COUNT(1) from AssetLocationHis where AssetId={0}";
|
|
|
|
if (string.IsNullOrEmpty(companyid))
|
|
companyid = SystemParams.CompanyID;
|
|
|
|
MachineViewItem machine = GetMachineViewItem(companyid, Convert.ToInt64(machineid));//暂时确定为取本单位的机器,因为Dealer目前不显示机器的历史位置
|
|
if (machine == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
FISqlConnection db = SystemParams.GetCompanyDbConnection(companyid);//暂时确定为取本单位的机器,因为Dealer目前不显示机器的历史位置
|
|
DataTable tb = null;
|
|
string dbString2 = SystemParams.GetIronIntelReportDataDbString(companyid);
|
|
if (!string.IsNullOrWhiteSpace(dbString2))
|
|
{
|
|
var db2 = new FISqlConnection(dbString2);
|
|
object obj = db2.GetRC1BySQL(SQL_EXISTS, machineid);
|
|
if (Convert.ToInt32(obj) > 0)
|
|
if (string.IsNullOrEmpty(datasource))
|
|
tb = db2.GetDataTableBySQL(SQL_L, machineid, startTime.ToUniversalTime(), endTime.ToUniversalTime());
|
|
else
|
|
tb = db2.GetDataTableBySQL(SQL_L_Datasource, machineid, startTime.ToUniversalTime(), endTime.ToUniversalTime(), datasource);
|
|
else
|
|
tb = db.GetDataTableBySQL(SQL, machineid, startTime.ToUniversalTime(), endTime.ToUniversalTime());
|
|
}
|
|
else
|
|
tb = db.GetDataTableBySQL(SQL, machineid, startTime.ToUniversalTime(), endTime.ToUniversalTime());
|
|
|
|
List<LocationViewItem> ls = new List<LocationViewItem>();
|
|
double timeOffset = SystemParams.GetHoursOffset();
|
|
foreach (DataRow dr in tb.Rows)
|
|
{
|
|
double lat = FIDbAccess.GetFieldDouble(dr["LATITUDE"], 0);
|
|
double lon = FIDbAccess.GetFieldDouble(dr["LONGITUDE"], 0);
|
|
if (notShow00loc && lat == 0 && lon == 0)
|
|
continue;
|
|
LocationViewItem li = new LocationViewItem();
|
|
li.Latitude = lat;
|
|
li.Longitude = lon;
|
|
li.LocationTime = FIDbAccess.GetFieldDateTime(dr["EVENTTIME_UTC"], DateTime.Now);
|
|
li.LocationTime = li.LocationTime.AddHours(timeOffset);
|
|
|
|
if (tb.Columns.Count > 3)
|
|
{
|
|
li.Speed = FIDbAccess.GetFieldDouble(dr["Speed"], -1);
|
|
li.SpeedUnit = FIDbAccess.GetFieldString(dr["SpeedUnits"], string.Empty);
|
|
li.PostedSpeed = FIDbAccess.GetFieldDouble(dr["PostedSpeedLimit"], -1);
|
|
li.PostedSpeedUnit = FIDbAccess.GetFieldString(dr["SpeedLimitUnits"], string.Empty);
|
|
li.Street = FIDbAccess.GetFieldString(dr["Street"], string.Empty);
|
|
}
|
|
ConvertSpeedUnitToMile(li);
|
|
ls.Add(li);
|
|
}
|
|
MachineLocationHistoryViewItem ml = new MachineLocationHistoryViewItem();
|
|
ml.Machine = machine;
|
|
ml.Locations = ls.ToArray();
|
|
return ml;
|
|
}
|
|
|
|
private static void ConvertSpeedUnitToMile(LocationViewItem loc)
|
|
{
|
|
if (loc == null) return;
|
|
if (loc.Speed >= 0 && loc.SpeedUnit.StartsWith("K", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
loc.Speed = loc.Speed * 0.6213712;
|
|
loc.SpeedUnit = "mi/h";
|
|
}
|
|
if (loc.PostedSpeed > 0 && loc.PostedSpeedUnit.StartsWith("K", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
loc.PostedSpeed = loc.PostedSpeed * 0.6213712;
|
|
loc.PostedSpeedUnit = "mi/h";
|
|
}
|
|
}
|
|
|
|
public static MachineLocationHistoryViewItem GetMachineLocationHistory(string sessionid, string machineid, DateTime startTime, DateTime endTime, string companyid, bool notShow00loc, string datasource)
|
|
{
|
|
if (string.IsNullOrEmpty(companyid))
|
|
companyid = SystemParams.CompanyID;
|
|
|
|
MachineViewItem machine = GetMachineViewItem(companyid, Convert.ToInt64(machineid));//暂时确定为取本单位的机器,因为Dealer目前不显示机器的历史位置
|
|
if (machine == null)
|
|
{
|
|
return null;
|
|
}
|
|
double timeOffset = SystemParams.GetHoursOffset();
|
|
startTime = startTime.AddHours(-timeOffset);
|
|
endTime = endTime.AddHours(-timeOffset);
|
|
|
|
AssetLocationInfo[] assetLocs = FleetServiceClientHelper.CreateClient<AssetQueryClient>(companyid, sessionid).GetAssetBasicLocationHistory(companyid, long.Parse(machineid), startTime, endTime, datasource, "", !notShow00loc);
|
|
|
|
List<LocationViewItem> ls = new List<LocationViewItem>();
|
|
foreach (AssetLocationInfo assetLoc in assetLocs)
|
|
{
|
|
LocationViewItem li = new LocationViewItem();
|
|
li.Latitude = assetLoc.Latitude;
|
|
li.Longitude = assetLoc.Longitude;
|
|
li.LocationTime = assetLoc.AsofTime.AddHours(timeOffset);
|
|
|
|
li.Speed = assetLoc.Speed;
|
|
li.SpeedUnit = assetLoc.SpeedUnits;
|
|
li.PostedSpeed = assetLoc.PostedSpeedLimit;
|
|
li.PostedSpeedUnit = assetLoc.SpeedLimitUnits;
|
|
li.Street = assetLoc.Street;
|
|
li.HarshDringEvent = assetLoc.HarshDringEvent;
|
|
li.SpeedingBehavior = assetLoc.SpeedingBehavior;
|
|
li.IconURL = GenerateLocationIconUrl(assetLoc);
|
|
li.SmartWitnessVideoUrl = assetLoc.SmartWitnessVideoUrl;
|
|
|
|
ConvertSpeedUnitToMile(li);
|
|
ls.Add(li);
|
|
}
|
|
MachineLocationHistoryViewItem ml = new MachineLocationHistoryViewItem();
|
|
ml.Machine = machine;
|
|
ml.Locations = ls.ToArray();
|
|
return ml;
|
|
}
|
|
|
|
private static string GenerateLocationIconUrl(AssetLocationInfo loc)
|
|
{
|
|
//http://iron.soft.rz/admin/machinetypeicon.ashx
|
|
//http://iron.soft.rz/admin/machinemovingicon.ashx
|
|
string path = SystemParams.MachineTypeMapViewIconUrl.ToLower().Replace("machinetypeicon.ashx", "machinemovingicon.ashx");
|
|
const string PARAM = "?tp={0}&bkcolor={1}&heading={2}";
|
|
int tp = (int)HarshDrivingEvents.HardAccelerationEvent;
|
|
string color = "";
|
|
switch (loc.HarshDringEvent)
|
|
{
|
|
case HarshDrivingEvents.None:
|
|
break;
|
|
case HarshDrivingEvents.HardAccelerationEvent:
|
|
color = "#ff3f48cc";
|
|
break;
|
|
case HarshDrivingEvents.HardBrakeEvent:
|
|
color = "#ff00a8f3";
|
|
break;
|
|
case HarshDrivingEvents.HardTurnEvent:
|
|
color = "#fffff200";
|
|
break;
|
|
}
|
|
if (string.IsNullOrEmpty(color))
|
|
{
|
|
if (loc.SpeedingBehavior == SpeedingBehaviors.MinorSpeeding)
|
|
color = "#ffff7f27";
|
|
else if (loc.SpeedingBehavior == SpeedingBehaviors.SevereSpeeding)
|
|
color = "#ffec1c24";
|
|
}
|
|
if (string.IsNullOrEmpty(color))
|
|
{
|
|
if (loc.MoveStatus == AssetMoveStatus.InMotion)
|
|
color = "#ff228B22";
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(color))
|
|
{
|
|
if (loc.MoveStatus == AssetMoveStatus.StoppedOn)
|
|
return path + "?legend=StoppedOn";
|
|
else if (loc.MoveStatus == AssetMoveStatus.StoppedOff)
|
|
return path + "?legend=StoppedOff";
|
|
}
|
|
color = HttpUtility.UrlEncode(color);
|
|
path = path + string.Format(PARAM, tp, color, loc.Heading);
|
|
|
|
return path;
|
|
}
|
|
|
|
public static MapAlertViewDefinitionItem[] GetMapAlertViews(string companyid, string selectedViewID)
|
|
{
|
|
MachineAlertViewItem[] views = null;
|
|
MachineAlertViewClient mc = GetMachineAlertViewClient();
|
|
if (string.IsNullOrWhiteSpace(companyid))
|
|
companyid = SystemParams.CompanyID;
|
|
views = mc.GetAvailableAlertViews(companyid, true);
|
|
|
|
MachineAlertViewQueryResult viewInfo = null;
|
|
try
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(selectedViewID))//获取View下使用的数据源信息
|
|
viewInfo = mc.QueryMachineAlertView(companyid, selectedViewID, null);
|
|
}
|
|
catch { }
|
|
|
|
string path = SystemParams.MachineTypeMapViewIconUrl;
|
|
List<MapAlertViewDefinitionItem> ls = new List<MapAlertViewDefinitionItem>();
|
|
foreach (MachineAlertViewItem ai in views)
|
|
{
|
|
MapAlertViewDefinitionItem mi = new MapAlertViewDefinitionItem();
|
|
mi.ID = ai.ID;
|
|
mi.Name = ai.Name;
|
|
mi.Layers = new MapAlertLayerDefinitionItem[ai.Layers.Count];
|
|
for (int i = 0; i < ai.Layers.Count; i++)
|
|
{
|
|
mi.Layers[i] = new MapAlertLayerDefinitionItem();
|
|
mi.Layers[i].ID = ai.Layers[i].ID;
|
|
mi.Layers[i].Title = ai.Layers[i].Title;
|
|
mi.Layers[i].AlertLayerType = ai.Layers[i].AlertLayerType;
|
|
mi.Layers[i].IconColor = ai.Layers[i].IconColor;
|
|
mi.Layers[i].Description = ai.Layers[i].Description;
|
|
mi.Layers[i].LegendUrl = path + "?legend=" + ai.Layers[i].AlertLayerType + "&bkcolor=" + HttpUtility.UrlEncode(ai.Layers[i].IconColor);
|
|
if (ai.Layers[i].CriteriaSQLParameters != null && ai.Layers[i].CriteriaSQLParameters.Count > 0)
|
|
mi.Layers[i].CriteriaSQLParameters = ConvertToDbQueryParameterDefine(ai.Layers[i].CriteriaSQLParameters);
|
|
|
|
if (ai.Layers[i].AlertSQLParameters != null && ai.Layers[i].AlertSQLParameters.Count > 0)
|
|
mi.Layers[i].AlertSQLParameters = ConvertToDbQueryParameterDefine(ai.Layers[i].AlertSQLParameters);
|
|
}
|
|
mi.Layers = mi.Layers.OrderBy((l) => l.AlertLayerType).ToArray();
|
|
|
|
if (viewInfo != null && viewInfo.ID.Equals(mi.ID, StringComparison.OrdinalIgnoreCase))
|
|
mi.LookupDataSources = ConvertLookupData(viewInfo.LookupDataSources);
|
|
ls.Add(mi);
|
|
}
|
|
return ls.OrderBy((mal) => mal.Name).ToArray();
|
|
|
|
}
|
|
|
|
private static List<LookupDataSourceDataItem> ConvertLookupData(List<LookupDataSourceData> data)
|
|
{
|
|
List<LookupDataSourceDataItem> result = new List<LookupDataSourceDataItem>();
|
|
if (data != null)
|
|
{
|
|
foreach (LookupDataSourceData d in data)
|
|
{
|
|
LookupDataSourceDataItem item = new LookupDataSourceDataItem();
|
|
item.ID = d.ID;
|
|
item.Name = d.Name;
|
|
item.Items.AddRange(d.Items);
|
|
result.Add(item);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
private static DbQueryParameterItem[] ConvertToDbQueryParameterDefine(List<DbQueryParameterDefine> paramerters)
|
|
{
|
|
List<DbQueryParameterItem> list = new List<DbQueryParameterItem>();
|
|
foreach (DbQueryParameterDefine pd in paramerters)
|
|
{
|
|
DbQueryParameterItem pi = new DbQueryParameterItem();
|
|
Helper.CloneProperty(pi, pd);
|
|
pi.DisplayCaptionField = pd.DisplayCaptionField;
|
|
pi.IsField = pd.IsField;
|
|
pi.IsAllAllowed = pd.IsAllAllowed;
|
|
pi.MutipleSelect = pd.MutipleSelect;
|
|
if (pi.DataType == Services.Common.DataTypes.Datetime)
|
|
{
|
|
try
|
|
{
|
|
pi.DefaultValue = DateTime.Parse(pi.DefaultValue).ToString("M/d/yyyy");
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
list.Add(pi);
|
|
}
|
|
|
|
return list.ToArray();
|
|
}
|
|
|
|
class ViewTemp
|
|
{
|
|
public LayerDataTemp[] Layers = null;
|
|
|
|
public LayerDataTemp GetLayer(string machineid, bool isprimary)
|
|
{
|
|
if ((Layers == null) || (Layers.Length == 0))
|
|
{
|
|
return null;
|
|
}
|
|
foreach (LayerDataTemp tmp in Layers)
|
|
{
|
|
if (tmp.Layer.IsPrimary == isprimary)
|
|
{
|
|
if (tmp.Met(machineid))
|
|
{
|
|
return tmp;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class LayerDataTemp
|
|
{
|
|
public MapAlertLayerItem Layer = null;
|
|
public long[] Machines = null;
|
|
public StringKeyValue[] AlertDescriptions = null;
|
|
|
|
public string GetAlertTip(string machineid)
|
|
{
|
|
if ((AlertDescriptions == null) || (AlertDescriptions.Length == 0))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
string rst = string.Empty;
|
|
foreach (StringKeyValue kv in AlertDescriptions)
|
|
{
|
|
if (string.Compare(kv.Key, machineid, true) == 0)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(kv.Value))
|
|
{
|
|
if (string.IsNullOrEmpty(rst))
|
|
{
|
|
rst = kv.Value;
|
|
}
|
|
else
|
|
{
|
|
rst = rst + "\r\n" + kv.Value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return rst;
|
|
}
|
|
|
|
public bool Met(string machineid)
|
|
{
|
|
if ((Machines == null) || (Machines.Length == 0))
|
|
{
|
|
return false;
|
|
}
|
|
foreach (long m in Machines)
|
|
{
|
|
if (string.Compare(m.ToString(), machineid, true) == 0)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
class AssetLocation
|
|
{
|
|
public string MachineID { get; set; }
|
|
public LocationViewItem Location { get; set; }
|
|
public string MoveStatus { get; set; }
|
|
public int Directionalheading { get; set; }
|
|
}
|
|
|
|
public class AssetEngineHour
|
|
{
|
|
public string MachineID { get; set; }
|
|
|
|
private double _EngineHours;
|
|
public double EngineHours
|
|
{
|
|
get
|
|
{
|
|
return _EngineHours;
|
|
}
|
|
set
|
|
{
|
|
value = value > 0 ? value : 0;
|
|
_EngineHours = Math.Round(value, 2);
|
|
}
|
|
}
|
|
public DateTime EngineHoursDate { get; set; }
|
|
}
|
|
}
|
|
}
|