using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump; using Newtonsoft.Json; using Edge.Core.Parser.HttpMessageParser; using SinochemCarplateService.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Wayne.FDCPOSLibrary; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using Edge.Core.Processor; namespace Sinochem_CarPlateRecognizeCamera_HuLianWangJia { public delegate void NewCarPlateHandler(CarPlateTrxRequest request); public delegate void QRCodePayResultHandler(QRCodePayResultRequest request); public delegate void IndoorPayResultHandler(IndoorPayResultRequest request); public class Handler : IDeviceHandler>, IFdcCommunicableController { public Guid Id => Guid.NewGuid(); public Func BroadcastMessageViaFdc { get; set; } public Func> OnMessageReceivedViaFdc { get; set; } public Func SendMessageViaFdc { get; set; } public event NewCarPlateHandler NewCarPlateScanned; public event QRCodePayResultHandler QRCodePaid; public event IndoorPayResultHandler IndoorPaid; private int bindingPumpId; static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("SinochemEpsApp"); public Handler(int bindingPumpId) { this.bindingPumpId = bindingPumpId; } public void Init(IContext> context) { } public Task Process(IContext> context) { var httpRequest = context.Incoming.Message; logger.Info("Incoming HTTP request: " + httpRequest.Content); var urlStr = httpRequest.ApiController.Request.GetUri().OriginalString; logger.Info($"URL: {urlStr}"); if (urlStr.Contains("qrCodePayment")) { QRCodePayResultRequest qrCodePayResultRequest = JsonConvert.DeserializeObject(httpRequest.Content); if (qrCodePayResultRequest != null) { logger.Info("Receive Request: QRCode Paid"); QRCodePayResultRequest qRCodePayResultRequest = JsonConvert.DeserializeObject(httpRequest.Content); PayResultResponse payResultResponse = new PayResultResponse { code = "200", message = "QRCode Pay OK", }; var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, new OkObjectResult(payResultResponse)); //var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, // new OkNegotiatedContentResult(payResultResponse, context.Incoming.Message.ApiController)); context.Outgoing.Write(httpResponse); QRCodePaid?.Invoke(qRCodePayResultRequest); } } else if (urlStr.Contains("indoorPayment")) { IndoorPayResultRequest indoorPayResultRequest = JsonConvert.DeserializeObject(httpRequest.Content); if (indoorPayResultRequest != null) { logger.Info("Receive Request: Indoor Paid"); PayResultResponse payResultResponse = new PayResultResponse { code = "200", message = "Indoor Pay OK", }; var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, new OkObjectResult(payResultResponse)); //var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, // new OkNegotiatedContentResult(payResultResponse, context.Incoming.Message.ApiController)); context.Outgoing.Write(httpResponse); IndoorPaid?.Invoke(indoorPayResultRequest); } } else { CarPlateTrxRequest carPlateTrxRequest = JsonConvert.DeserializeObject(httpRequest.Content); if (carPlateTrxRequest != null) { logger.Info("Receipt Request:" + carPlateTrxRequest.car_Number); CarPlateTrxResponse carPlateTrxResponse = new CarPlateTrxResponse { code = "200", message = "this is from Sinochem_CarPlateRecognizeCamera_HuLianWangJia" }; var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, new OkObjectResult(carPlateTrxResponse)); //var httpResponse = SimpleHttpOutgoingMessage.CreatedFrom(httpRequest, // new OkNegotiatedContentResult(carPlateTrxResponse, context.Incoming.Message.ApiController)); context.Outgoing.Write(httpResponse); // fire event NewCarPlateScanned?.Invoke(carPlateTrxRequest); } } return Task.CompletedTask; //logger.Info("Ending Process Request"); } private void Handler_OnCurrentFuellingStatusChange(object sender, FdcTransactionDoneEventArg e) { // wait for fuelling done if (e.Transaction.Finished) { // send msg to 15` to show 'fuelling is done' var chargeAmount = e.Transaction.Amount; // send msg to cloud to charge. } else { var runningAmount = e.Transaction.Amount; // send msg to 15` to show 'fuelling is in progress' } } } public static class Extensions { public static Uri GetUri(this HttpRequest request) { var uriBuilder = new UriBuilder { Scheme = request.Scheme, Host = request.Host.Host, Port = request.Host.Port.GetValueOrDefault(80), Path = request.Path.ToString(), Query = request.QueryString.ToString() }; return uriBuilder.Uri; } } }