Bladeren bron

2020/05/20 Jessica
Actions:
1.新增統計API
2.修正抓取命令執行結果回覆

Jessica.Tseng 4 jaren geleden
bovenliggende
commit
de4b71c905

+ 6 - 0
EVCB_OCPP.WEBAPI/App_Start/WebApiConfig.cs

@@ -1,4 +1,5 @@
 using EVCB_OCPP.WEBAPI.Handlers;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -12,6 +13,11 @@ namespace EVCB_OCPP.WEBAPI
     {
         public static void Register(HttpConfiguration config)
         {
+            config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
+            {
+                NullValueHandling = NullValueHandling.Ignore,
+                DateFormatString = EVCBConfiguration.UTC_DATETIMEFORMAT
+            };
 
             config.MessageHandlers.Add(new ApiLogHandler());
             // Web API 設定和服務

+ 373 - 20
EVCB_OCPP.WEBAPI/Controllers/Version1/CPOController.cs

@@ -53,7 +53,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                     var _innerResponse = new { Stations = _service.GetStationsbyCustomerId(_customerId) };
                     result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 return Request.CreateResponse(statusCode, result);
@@ -85,7 +85,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     var _customerId = Request.Headers.GetValues(EVCBConfiguration.Header_PartnerId).First();
 
-                    var _innerResponse = new { EVSEs =new List<EVSE>() };
+                    var _innerResponse = new { EVSEs = new List<EVSE>() };
                     ChargingStationService _stationService = new ChargingStationService();
 
                     if (_stationService.ContainsStation(_customerId, StationId))
@@ -94,20 +94,20 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                         {
                             if (!DateFrom.HasValue)
                             {
-                                                                      
+
                                 result.StatusMessage = CPO_StatusMessage.ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT;
-                                result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;                               
+                                result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;
                                 statusCode = HttpStatusCode.BadRequest;
                                 return Request.CreateResponse(statusCode, result);
                             }
                         }
                         _innerResponse = new { EVSEs = _stationService.GetEVSEsbyStationId(StationId, DateFrom, DateTo, Offset.Value, Limit.Value) };
-                    
+
 
                     }
                     result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
 
                 }
@@ -183,7 +183,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                     {
                         result.SerialNo = _innerResult.SerialNo;
                         result.StatusCode = (int)CPO_StatusCode.Success;
-                        result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                        result.StatusMessage = CPO_StatusMessage.Success;
                         statusCode = HttpStatusCode.OK;
 
                     }
@@ -264,7 +264,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -338,7 +338,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -404,7 +404,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -470,7 +470,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -538,7 +538,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -603,7 +603,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -671,7 +671,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -740,7 +740,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 {
                     result.SerialNo = _innerResult.SerialNo;
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
                 }
                 else
@@ -903,8 +903,8 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                             break;
                         default:
                             {
-                                if (_execution.IsTimeout.HasValue && _execution.IsTimeout.Value) _cmdResult = CommandResultType.Timeout;
-                                if (_execution.IsWaited.HasValue && _execution.IsWaited.Value) _cmdResult = CommandResultType.Waited;
+                                if (_execution.Detail == "Timeout") _cmdResult = CommandResultType.Timeout;
+                                if (_execution.Detail == "Waited") _cmdResult = CommandResultType.Waited;
 
                             }
                             break;
@@ -925,7 +925,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                         result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
                         result.SerialNo = _innerResult.SerialNo;
                         result.StatusCode = (int)CPO_StatusCode.Success;
-                        result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                        result.StatusMessage = CPO_StatusMessage.Success;
                         statusCode = HttpStatusCode.OK;
                     }
 
@@ -1000,7 +1000,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
 
                     result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
                     result.StatusCode = (int)CPO_StatusCode.Success;
-                    result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                    result.StatusMessage = CPO_StatusMessage.Success;
                     statusCode = HttpStatusCode.OK;
 
                 }
@@ -1053,7 +1053,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
 
                 result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
                 result.StatusCode = (int)CPO_StatusCode.Success;
-                result.StatusMessage = CPO_StatusMessage.SUCCESS;
+                result.StatusMessage = CPO_StatusMessage.Success;
                 statusCode = HttpStatusCode.OK;
                 return Request.CreateResponse(statusCode, result);
             }
@@ -1067,6 +1067,359 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
 
         }
 
+
+        [Route("statistics/charging_sessions")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> ChargingSessionsStatistics([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 1;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId", chargeBoxIds },
+                  { "Type", request.Type.ToString() },
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    _innerresult.Response = _innerresult.Response.Replace("item", "Title");
+                    _innerresult.Response = _innerresult.Response.Replace("Data", "Count");
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        [Route("statistics/energy_delivered")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> Energy_Delivered([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 2;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId",chargeBoxIds },
+                  { "Type", request.Type.ToString() },
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    _innerresult.Response = _innerresult.Response.Replace("item", "Title");
+                    _innerresult.Response = _innerresult.Response.Replace("Data", "DeliveredEnergy");
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        [Route("statistics/time_of_use")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> Time_of_Use([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 3;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId",chargeBoxIds },
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    _innerresult.Response = _innerresult.Response.Replace("item", "Title");
+                    _innerresult.Response = _innerresult.Response.Replace("data", "Count");
+                    _innerresult.Response = _innerresult.Response.Replace("data2", "DeliveredEnergy");
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        [Route("statistics/peak_load")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> Peak_Load([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 4;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId", chargeBoxIds },
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    _innerresult.Response = _innerresult.Response.Replace("item", "Title");
+                    _innerresult.Response = _innerresult.Response.Replace("data", "DeliveredEnergy");
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        [Route("statistics/sessions")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> Sessions([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 6;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId", chargeBoxIds },
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    string titles = "\"Title\":[\"ChargeBox Id\",\"Connector Id\",\"Session Id\",\"DateFrom\",\"DateTo\",\"Duration(sec)\",\"Energy(kWh)\",\"Stop Reason\"],";
+        
+                    _innerresult.Response = _innerresult.Response.Replace("data", "Session");
+                    _innerresult.Response= _innerresult.Response.Insert(1, titles);
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        [Route("statistics/fault")]
+        [ResponseType(typeof(CPOOuterResponse))]
+        [HttpPost]
+        async public Task<HttpResponseMessage> Fault([FromBody]StatisticsRequest request)
+        {
+            var result = new CPOOuterResponse();
+            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
+            var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
+            try
+            {
+
+                InternalHttpClient _client = new InternalHttpClient();
+                CustomerService _customer = new CustomerService();
+
+                string url = System.Web.Configuration.WebConfigurationManager.AppSettings["StatisticsAPI"] + 5;
+                string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
+
+                HttpClientService service = new HttpClientService();
+
+                Dictionary<string, string> postData = new Dictionary<string, string>()
+                {
+                  { "ChargeBoxId", chargeBoxIds},
+                  { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
+                  { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
+
+                };
+                var _innerresult = await service.PostFormDataAsync(url, postData, null);
+
+
+                if (_innerresult.StatusCode == HttpStatusCode.OK)
+                {
+                    _innerresult.Response = _innerresult.Response.Replace("item", "Title");
+                    _innerresult.Response = _innerresult.Response.Replace("data", "Count");
+                    _innerresult.Response = _innerresult.Response.Replace("data2", "CumulativePercentage");
+                    result.Data = _innerresult.Response;
+                    result.StatusCode = (int)CPO_StatusCode.Success;
+                    result.StatusMessage = CPO_StatusMessage.Success;
+                    statusCode = HttpStatusCode.OK;
+                }
+                else
+                {
+                    result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
+                    result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
+                    statusCode = HttpStatusCode.BadRequest;
+                }
+            }
+            catch (Exception ex)
+            {
+                result.ErrorDetail = ex.ToString();
+                result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
+                result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
+                return Request.CreateResponse(statusCode, result);
+            }
+
+            return Request.CreateResponse(statusCode, result);
+        }
+
+        private string GetStatisticChargeBoxIds(List<string> chargeBoxIds)
+        {
+            string result = JsonConvert.SerializeObject(chargeBoxIds, Formatting.None).Replace("\"", "'");
+            result = result.Replace("[", "");
+            result = result.Replace("]", "");
+
+            return result;
+        }
+
+
         private CPOOuterResponse GetErrorDescription(InternalHttpResult innerResponse)
         {
             CPOOuterResponse result = new CPOOuterResponse();

+ 2 - 1
EVCB_OCPP.WEBAPI/EVCB_OCPP.WEBAPI.csproj

@@ -259,6 +259,7 @@
     <Compile Include="Models\WebAPI\SingleConfigurationRequest.cs" />
     <Compile Include="Models\WebAPI\StartTransactionRequest.cs" />
     <Compile Include="Models\WebAPI\Station.cs" />
+    <Compile Include="Models\WebAPI\StatisticsRequest.cs" />
     <Compile Include="Models\WebAPI\TriggerMessageRequest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Services\ChargePointService.cs" />
@@ -373,7 +374,7 @@
           <AutoAssignPort>True</AutoAssignPort>
           <DevelopmentServerPort>63823</DevelopmentServerPort>
           <DevelopmentServerVPath>/</DevelopmentServerVPath>
-          <IISUrl>http://localhost:63823/</IISUrl>
+          <IISUrl>http://172.17.40.23:63823/</IISUrl>
           <NTLMAuthentication>False</NTLMAuthentication>
           <UseCustomServer>False</UseCustomServer>
           <CustomServerUrl>

+ 1 - 1
EVCB_OCPP.WEBAPI/Models/WebAPI/CPOResponseDescription.cs

@@ -27,7 +27,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
 
     public static class CPO_StatusMessage
     {
-        public static readonly string SUCCESS = "Success";
+        public static readonly string Success = "Success";
         public static readonly string ERROR_MSG_INVALIDHEADER = "Invaild Headers";
         public static readonly string ERROR_MSG_INVALIDTIMESTAMP = "Invaild Timestamp";
         public static readonly string ERROR_MSG_INVALIDSIGNATURE = "Invaild Signature";

+ 1 - 3
EVCB_OCPP.WEBAPI/Models/WebAPI/ComandExecution.cs

@@ -8,9 +8,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
 {
     public class ComandExecution
     {
-        public bool? IsTimeout { set; get; }
-
-        public bool? IsWaited { set; get; }
+       
 
         public bool IsRepliedbyEVSE { set; get; }
 

+ 1 - 1
EVCB_OCPP.WEBAPI/Models/WebAPI/InternalGenericResponse.cs

@@ -10,7 +10,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
         public InternalGenericResponse()
         {
             Message = string.Empty;
-            SerialNo = string.Empty;
+            SerialNo = null;
         }
 
         public string SerialNo { set; get; }

+ 18 - 0
EVCB_OCPP.WEBAPI/Models/WebAPI/StatisticsRequest.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace EVCB_OCPP.WEBAPI.Models.WebAPI
+{
+    public class StatisticsRequest
+    {
+        public List<string> ChargeBoxIds { set; get; }
+
+        public int? Type { set; get; }
+
+        public DateTime DateFrom { set; get; }
+
+        public DateTime DateTo { set; get; }
+    }
+}

+ 55 - 3
EVCB_OCPP.WEBAPI/Services/HttpClientService.cs

@@ -1,6 +1,7 @@
 using Microsoft.Extensions.DependencyInjection;
 using System;
 using System.Collections.Generic;
+using System.Collections.Specialized;
 using System.Linq;
 using System.Net;
 using System.Net.Http;
@@ -66,7 +67,7 @@ namespace EVCB_OCPP.WEBAPI.Services
 
             Init();
         }
-       
+
 
         private void Init()
         {
@@ -142,7 +143,7 @@ namespace EVCB_OCPP.WEBAPI.Services
                     }
                 }
 
-               // client.DefaultRequestHeaders.Add("Content-Type", "application/json");
+                // client.DefaultRequestHeaders.Add("Content-Type", "application/json");
 
 
                 var response = await client.GetAsync(Url).ConfigureAwait(false);
@@ -234,7 +235,7 @@ namespace EVCB_OCPP.WEBAPI.Services
                     }
                 }
 
-             //   client.DefaultRequestHeaders.Add("Content-Type", "application/json");
+                //   client.DefaultRequestHeaders.Add("Content-Type", "application/json");
 
 
                 var response = await client.DeleteAsync(Url).ConfigureAwait(false);
@@ -247,6 +248,57 @@ namespace EVCB_OCPP.WEBAPI.Services
 
 
 
+            }
+            catch (Exception ex)
+            {
+                result.IsError = true;
+                result.Exception = ex;
+
+            }
+
+
+            return result;
+        }
+
+        public virtual async Task<HttpResponse> PostFormDataAsync(string Url, Dictionary<string, string> bodyData, Dictionary<string, string> headers, string clientName = "Default", bool bearerToken = false, string authorizationToken = null)
+        {
+            HttpResponse result = new HttpResponse() { IsError = false };
+
+            try
+            {
+                var client = _clientFactory.CreateClient(clientName);
+
+                if (!string.IsNullOrEmpty(authorizationToken))
+                {
+                    client.DefaultRequestHeaders.Authorization = bearerToken ? new AuthenticationHeaderValue("Bearer", authorizationToken) : new AuthenticationHeaderValue(authorizationToken);
+                }
+                if (headers != null)
+                {
+                    for (int idx = 0; idx < headers.Count; idx++)
+                    {
+                        client.DefaultRequestHeaders.Add(headers.ElementAt(idx).Key, headers.ElementAt(idx).Value);
+                    }
+                }
+
+                var content = new MultipartFormDataContent();
+
+                foreach (var keyValuePair in bodyData)
+                {
+                    content.Add(new StringContent(keyValuePair.Value), "\""+keyValuePair.Key+"\"");
+                }
+
+                var response = await client.PostAsync(Url, content).ConfigureAwait(false);
+
+
+
+                result.IsSuccessStatusCode = response.IsSuccessStatusCode;
+                result.Headers = response.Headers;
+                result.RequestMessage = response.RequestMessage;
+                result.StatusCode = response.StatusCode;
+                result.Response = await response.Content.ReadAsStringAsync();
+
+
+
             }
             catch (Exception ex)
             {

+ 3 - 2
EVCB_OCPP.WEBAPI/Services/ServerTriggerService.cs

@@ -195,12 +195,13 @@ namespace EVCB_OCPP.WEBAPI.Services
                     if (operation.Status == 0)
                     {
                         excution.Code = 0;
-                        excution.IsWaited = true;
+                        //excution.IsWaited = true;
+                        excution.Detail = "Waited";
 
                     }
                     if (operation.Status == -1)
                     {
-                        excution.IsTimeout = true;
+                      //  excution.IsTimeout = true;
                         excution.Code = 0;
                         excution.Detail = "Timeout";
                     }

+ 1 - 0
EVCB_OCPP.WEBAPI/Web.config

@@ -20,6 +20,7 @@
     <add key="webpages:Enabled" value="false" />
     <add key="ClientValidationEnabled" value="true" />
     <add key="UnobtrusiveJavaScriptEnabled" value="true" />
+    <add key="StatisticsAPI" value="http://test.evsocket.phihong.com.cn:1337/StatisticsReportApi/"/>
   </appSettings>
   <system.web>
     <compilation debug="true" targetFramework="4.7.2" />