浏览代码

Merge branch 'feature/后支付相关补充暂存问题' into develop

Zhenghanjv 9 月之前
父节点
当前提交
bf1f52f5b5
共有 47 个文件被更改,包括 1253 次插入673 次删除
  1. 14 0
      Edge.Core/Core/database/MysqlDbContext.cs
  2. 5 0
      Edge.Core/Domain/FccOrderInfo/FccOrderInfo.cs
  3. 1 1
      Edge.Core/Domain/FccStationInfo/FccStationInfo.cs
  4. 1 1
      Edge.Core/Domain/FccStationInfo/Output/StationInfoOutput.cs
  5. 1 0
      Edge.Core/Edge.Core.csproj
  6. 1 0
      Edge.Core/MqttClient/MqttClientService.cs
  7. 56 33
      Edge.Core/Processor/Communicator/TcpServerCommunicator.cs
  8. 74 29
      Edge.Core/Processor/Dispatcher/ProcessorLoader/DbJSonLoader.cs
  9. 63 25
      HengshanPaymentTerminal/HengshanPayTermHandler.cs
  10. 0 1
      HengshanPaymentTerminal/HengshanPaymentTerminal.csproj
  11. 6 0
      HengshanPaymentTerminal/Http/Request/HttpRequest.cs
  12. 44 0
      HengshanPaymentTerminal/Http/Response/Response.cs
  13. 23 6
      HengshanPaymentTerminal/MessageEntity/Incoming/OrderFromMachine.cs
  14. 8 2
      HengshanPaymentTerminal/MessageEntity/Outgoing/SendQrCode.cs
  15. 25 0
      HengshanPaymentTerminal/Mqtt/Request/MqttRequest.cs
  16. 1 1
      HengshanPaymentTerminal/StateMachineMessageCutter.cs
  17. 13 0
      src/FccLife.Web/.config/dotnet-tools.json
  18. 8 0
      src/FccLife.Web/Controller/OrderInfoController.cs
  19. 1 2
      src/FccLife.Web/FccLite.Web.csproj
  20. 43 1
      src/FccLife.Web/Program.cs
  21. 9 1
      src/FccLife.Web/Repositories/FccOrderInfo/IOrderInfoReposity.cs
  22. 37 13
      src/FccLife.Web/Repositories/FccOrderInfo/OrderInfoReposity.cs
  23. 19 5
      src/FccLife.Web/Services/FccNozzleInfo/NozzleInfoServiceImpl.cs
  24. 7 3
      src/FccLife.Web/Services/FccOilInfo/OilInfoServiceImpl.cs
  25. 8 0
      src/FccLife.Web/Services/FccOrderInfo/IOrderInfoService.cs
  26. 73 3
      src/FccLife.Web/Services/FccOrderInfo/OrderInfoService.cs
  27. 6 3
      src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs
  28. 7 0
      src/FccLife.Web/appsettings.Development.json
  29. 19 0
      src/FccLife.Web/appsettings.Production.json
  30. 1 1
      src/FccLife.Web/nlog.config
  31. 1 0
      src/FccWeb/admin.ui.plus-master/.env.development
  32. 1 0
      src/FccWeb/admin.ui.plus-master/.env.production
  33. 524 462
      src/FccWeb/admin.ui.plus-master/package-lock.json
  34. 1 0
      src/FccWeb/admin.ui.plus-master/package.json
  35. 1 0
      src/FccWeb/admin.ui.plus-master/src/api/FormValidation.ts
  36. 10 0
      src/FccWeb/admin.ui.plus-master/src/api/api.ts
  37. 1 1
      src/FccWeb/admin.ui.plus-master/src/api/request.ts
  38. 5 1
      src/FccWeb/admin.ui.plus-master/src/main.ts
  39. 3 1
      src/FccWeb/admin.ui.plus-master/src/router/backEnd.ts
  40. 2 0
      src/FccWeb/admin.ui.plus-master/src/router/index.ts
  41. 59 60
      src/FccWeb/admin.ui.plus-master/src/router/route.ts
  42. 7 0
      src/FccWeb/admin.ui.plus-master/src/views/admin/components/addStation.vue
  43. 2 0
      src/FccWeb/admin.ui.plus-master/src/views/admin/login/component/account.vue
  44. 2 0
      src/FccWeb/admin.ui.plus-master/src/views/admin/login/component/mobile.vue
  45. 59 11
      src/FccWeb/admin.ui.plus-master/src/views/admin/order/index.vue
  46. 1 0
      src/FccWeb/admin.ui.plus-master/src/views/admin/station/station.vue
  47. 0 6
      src/FccWeb/admin.ui.plus-master/vite.config.ts

+ 14 - 0
Edge.Core/Core/database/MysqlDbContext.cs

@@ -65,6 +65,20 @@ namespace Edge.Core.Core.database
                 .HasForeignKey(nozzle => nozzle.MachineId)
                 .OnDelete(DeleteBehavior.Restrict);
 
+            //modelBuilder.Entity<FccOrderInfo>(entity =>
+            //{
+                
+            //    entity.Property(order => order.EndTime).IsRequired(false);
+            //    entity.Property(order => order.PaymentTime).IsRequired(false);
+            //    entity.Property(order => order.PayType).IsRequired(false);
+            //    entity.Property(order => order.CloundOrderId).IsRequired(false);
+            //    entity.Property(order => order.AmountPayable).IsRequired(false);
+            //    entity.Property(order => order.RefundAmount).IsRequired(false);
+            //    entity.Property(order => order.UserName).IsRequired(false);
+            //    entity.Property(order => order.PhoneNumber).IsRequired(false);
+            //    entity.Property(order => order.PaymentName).IsRequired(false);
+            //    entity.Property(order => order.PumpCode).IsRequired(false);
+            //});
 
             base.OnModelCreating(modelBuilder);
         }

+ 5 - 0
Edge.Core/Domain/FccOrderInfo/FccOrderInfo.cs

@@ -111,6 +111,11 @@ namespace Edge.Core.Domain.FccOrderInfo
         /// 支付类型名称
         /// </summary>
         public string PaymentName { get; set; }
+
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal? PumpCode { get; set; }
     }
 
 }

+ 1 - 1
Edge.Core/Domain/FccStationInfo/FccStationInfo.cs

@@ -70,7 +70,7 @@ namespace Edge.Core.Domain.FccStationInfo
         public string WebSocketPort { get; set; }
 
         /// <summary>
-        /// 支付方式,逗号隔开
+        /// 支付方式【id+支付名称,id+支付名称】
         /// </summary>
         public string PaymentType { get; set; }
 

+ 1 - 1
Edge.Core/Domain/FccStationInfo/Output/StationInfoOutput.cs

@@ -99,7 +99,7 @@ namespace Edge.Core.Domain.FccStationInfo.Output
         public string WebSocketPort { get; set; }
 
         /// <summary>
-        /// 支付方式,逗号隔开
+        /// 支付方式,【id+支付名称,id+支付名称】
         /// </summary>
         public string PaymentType { get; set; }
     }

+ 1 - 0
Edge.Core/Edge.Core.csproj

@@ -15,6 +15,7 @@
     <PackageReference Include="AutoMapper" Version="13.0.1" />
     <PackageReference Include="Castle.Core" Version="5.1.1" />
     <PackageReference Include="DFS.Infrastructure" Version="6.2.1" />
+    <PackageReference Include="EPPlus" Version="7.5.3" />
     <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />

+ 1 - 0
Edge.Core/MqttClient/MqttClientService.cs

@@ -88,6 +88,7 @@ namespace Edge.Core.MqttClient
         {
             Logger.Info($"mqtt disconnect",JsonConvert.SerializeObject(args));
 
+            Thread.Sleep(3000);
             Start();
             OnDisconnect?.Invoke(this, args);
             return Task.CompletedTask;

+ 56 - 33
Edge.Core/Processor/Communicator/TcpServerCommunicator.cs

@@ -24,8 +24,8 @@ namespace Edge.Core.Processor.Communicator
         private CancellationTokenSource readAsyncCancellationTokenSource;
         private DateTime? lastReceiveMsgDataFromTcpClientDateTime;
         private System.Timers.Timer clientSideActiveDetectionByCheckingLongTimeNoSeeDataIncomingWatchTimer;
-        //protected static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator");
-        protected ILogger logger = NullLogger.Instance;
+        private static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("TcpServerCommunicator");
+        //protected ILogger logger = NullLogger.Instance;
         public static int tcpReceiveBufferSize = 1500;
 
         private Edge.Core.Parser.BinaryParser.ParserBase parser;
@@ -71,16 +71,17 @@ namespace Edge.Core.Processor.Communicator
             IServiceProvider services)
         {
             this.Identity = "*:" + localTcpServerTcpListeningPortNumber;
-            if (services != null)
-            {
-                var loggerFactory = services.GetRequiredService<ILoggerFactory>();
-                this.logger = loggerFactory.CreateLogger("Communicator");
-                if (!string.IsNullOrEmpty(customLoggerFileName))
-                    if (customLoggerFileName == "*")
-                        this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_" + localTcpServerTcpListeningPortNumber);
-                    else
-                        this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_" + customLoggerFileName);
-            }
+            //if (services != null)
+            //{
+            //    var loggerFactory = services.GetRequiredService<ILoggerFactory>();
+            //    this.logger = loggerFactory.CreateLogger("Communicator");
+            //    if (!string.IsNullOrEmpty(customLoggerFileName))
+            //        if (customLoggerFileName == "*")
+            //            this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_" + localTcpServerTcpListeningPortNumber);
+            //        else
+            //            this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_" + customLoggerFileName);
+            //}
+
 
             this.messageCutter = binaryMsgCutter;
 
@@ -92,7 +93,8 @@ namespace Edge.Core.Processor.Communicator
                 this.messageCutter.OnInvalidMessageRead += (____, ______) =>
                 {
                     var loggingStr = $"Bytes msg from tcp client: {exclusiveTcpClient_ClientRemoteEndPoint_Str} Read Invalid data, detail: {(______?.Message ?? "")}";
-                    this.logger.LogInformation(loggingStr);
+                    //this.logger.LogInformation(loggingStr);
+                    logger.Info(loggingStr);
                     this.OnErrorMessageRead?.Invoke(this, new CommunicatorErrorMessageReadEventArg(null, loggingStr));
                 };
                 this.messageCutter.OnMessageCut += (s, _) =>
@@ -103,14 +105,16 @@ namespace Edge.Core.Processor.Communicator
                     {
                         eventArg.Data = this.messageCutter.Message;
                         eventArg.Message = this.parser.Deserialize(this.messageCutter.Message.ToArray()) as T;
-                        if (logger.IsEnabled(LogLevel.Debug))
-                            this.logger.LogDebug("      Parsed: " + eventArg.Message.ToLogString());
+                        //if (logger.IsEnabled(LogLevel.Debug))
+                            //this.logger.LogDebug("      Parsed: " + eventArg.Message.ToLogString());
+                        logger.Debug("      Parsed: " + eventArg.Message.ToLogString());
                     }
                     catch (Exception ex)
                     {
                         var loggingStr = "Message from " + exclusiveTcpClient_ClientRemoteEndPoint_Str
                             + " exceptioned in deserilaizing bytes:\r\n 0x" + this.messageCutter.Message.ToHexLogString() + "\r\n exception detail:\r\n" + ex;
-                        this.logger.LogError(loggingStr);
+                        //this.logger.LogError(loggingStr);
+                        logger.Error(loggingStr);
                         this.OnErrorMessageRead?.Invoke(this, new CommunicatorErrorMessageReadEventArg(this.messageCutter.Message, loggingStr));
                         return;
                     }
@@ -121,7 +125,9 @@ namespace Edge.Core.Processor.Communicator
                     }
                     catch (Exception ex)
                     {
-                        this.logger.LogError("Message from " + exclusiveTcpClient_ClientRemoteEndPoint_Str
+                        //this.logger.LogError("Message from " + exclusiveTcpClient_ClientRemoteEndPoint_Str
+                        //    + " exceptioned in handle message:\r\n" + eventArg.Message.ToLogString() + "\r\n exceptioned detail: \r\n" + ex);
+                        logger.Error("Message from " + exclusiveTcpClient_ClientRemoteEndPoint_Str
                             + " exceptioned in handle message:\r\n" + eventArg.Message.ToLogString() + "\r\n exceptioned detail: \r\n" + ex);
                     }
                 };
@@ -138,7 +144,8 @@ namespace Edge.Core.Processor.Communicator
                     if (DateTime.Now.Subtract(this.lastReceiveMsgDataFromTcpClientDateTime ?? DateTime.MinValue).TotalSeconds >= enableClientSideActiveDetection
                         && this.exclusiveTcpClient != null)
                     {
-                        this.logger.LogInformation($"Long time no see data from tcp client with: { this.exclusiveTcpClient_ClientRemoteEndPoint_Str }, will actively disconnect it...");
+                        //this.logger.LogInformation($"Long time no see data from tcp client with: { this.exclusiveTcpClient_ClientRemoteEndPoint_Str }, will actively disconnect it...");
+                        logger.Info($"Long time no see data from tcp client with: { this.exclusiveTcpClient_ClientRemoteEndPoint_Str }, will actively disconnect it...");
                         this.readAsyncCancellationTokenSource?.Cancel();
                     }
                 };
@@ -173,18 +180,22 @@ namespace Edge.Core.Processor.Communicator
                 {
                     this.tcpListener = new TcpListener(IPAddress.Any, this.localTcpServerListeningPort);
                     this.tcpListener.Start();
-                    this.logger.LogInformation($"TcpListener listened on localPort: {this.localTcpServerListeningPort}");
+                    //this.logger.LogInformation($"TcpListener listened on localPort: {this.localTcpServerListeningPort}");
+                    logger.Info($"TcpListener listened on localPort: {this.localTcpServerListeningPort}");
                     var _ = Task.Run(async () =>
                     {
                         while (this.isStarted == 1)
                         {
-                            logger.LogInformation($"Waitting for connection on localPort: {this.localTcpServerListeningPort}");
+                            //logger.LogInformation($"Waitting for connection on localPort: {this.localTcpServerListeningPort}");
+                            logger.Info($"Waitting for connection on localPort: {this.localTcpServerListeningPort}");
                             var newTcpClient = await this.tcpListener.AcceptTcpClientAsync();
-                            this.logger.LogInformation($"   A tcp client with remote ip/port: {newTcpClient.Client.RemoteEndPoint} has connected in");
+                            //this.logger.LogInformation($"   A tcp client with remote ip/port: {newTcpClient.Client.RemoteEndPoint} has connected in");
+                            logger.Info($"   A tcp client with remote ip/port: {newTcpClient.Client.RemoteEndPoint} has connected in");
 
                             if (this.exclusiveTcpClient != null)
                             {
-                                logger.LogInformation($"    There's already a previous TcpClient established as exclusive, so close this new one with remote ip/port: {newTcpClient.Client.RemoteEndPoint}");
+                                //logger.LogInformation($"    There's already a previous TcpClient established as exclusive, so close this new one with remote ip/port: {newTcpClient.Client.RemoteEndPoint}");
+                                logger.Info($"    There's already a previous TcpClient established as exclusive, so close this new one with remote ip/port: {newTcpClient.Client.RemoteEndPoint}");
                                 try
                                 {
                                     newTcpClient.Close();
@@ -195,7 +206,8 @@ namespace Edge.Core.Processor.Communicator
 
                             this.exclusiveTcpClient = newTcpClient;
                             this.exclusiveTcpClient_ClientRemoteEndPoint_Str = this.exclusiveTcpClient.Client.RemoteEndPoint.ToString();
-                            this.logger.LogInformation($"   Tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} has been chosen as exclusive");
+                            //this.logger.LogInformation($"   Tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} has been chosen as exclusive");
+                            logger.Info($"   Tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} has been chosen as exclusive");
                             var ___ = Task.Run(async () =>
                             {
 
@@ -231,12 +243,15 @@ namespace Edge.Core.Processor.Communicator
                                         bytesReadCount = await this.exclusiveTcpClient.GetStream().ReadAsync(buffer, this.readAsyncCancellationTokenSource.Token);
                                         if (bytesReadCount == 0)
                                             throw new Exception("tcp server received 0 count data indicates the connection is broken");
-                                        if (logger.IsEnabled(LogLevel.Debug))
-                                            this.logger.LogDebug($"TCP from { this.exclusiveTcpClient_ClientRemoteEndPoint_Str } <---Incoming: 0x" + buffer.Take(bytesReadCount).ToHexLogString());
+                                        //if (logger.IsEnabled(LogLevel.Debug))
+                                        //    this.logger.LogDebug($"TCP from { this.exclusiveTcpClient_ClientRemoteEndPoint_Str } <---Incoming: 0x" + buffer.Take(bytesReadCount).ToHexLogString());
+                                        
+                                        logger.Debug($"TCP from {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} <---Incoming: 0x" + buffer.Take(bytesReadCount).ToHexLogString());
                                     }
                                     catch (Exception eeee)
                                     {
-                                        logger.LogError($"tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} exceptioned in GetStream().ReadAsync(), treat as tcp disconnection, detail: {eeee}");
+                                        //logger.LogError($"tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} exceptioned in GetStream().ReadAsync(), treat as tcp disconnection, detail: {eeee}");
+                                        logger.Error($"tcp client with remote ip/port: {this.exclusiveTcpClient_ClientRemoteEndPoint_Str} exceptioned in GetStream().ReadAsync(), treat as tcp disconnection, detail: {eeee}");
                                         try
                                         {
                                             this.exclusiveTcpClient.Close();
@@ -266,7 +281,8 @@ namespace Edge.Core.Processor.Communicator
                                     }
                                     catch (Exception ex)
                                     {
-                                        this.logger.LogError($"Exception in Parsing msg bytes: 0x{ buffer.Take(bytesReadCount).ToHexLogString()}, detail: {Environment.NewLine}{ ex.ToString()}");
+                                        //this.logger.LogError($"Exception in Parsing msg bytes: 0x{ buffer.Take(bytesReadCount).ToHexLogString()}, detail: {Environment.NewLine}{ ex.ToString()}");
+                                        logger.Error($"Exception in Parsing msg bytes: 0x{ buffer.Take(bytesReadCount).ToHexLogString()}, detail: {Environment.NewLine}{ ex.ToString()}");
                                     }
                                 }
                             });
@@ -277,7 +293,8 @@ namespace Edge.Core.Processor.Communicator
                 }
                 catch (Exception exxx)
                 {
-                    logger.LogError($"Start tcp listener on port: {this.localTcpServerListeningPort} exceptioned: {exxx}");
+                    //logger.LogError($"Start tcp listener on port: {this.localTcpServerListeningPort} exceptioned: {exxx}");
+                    logger.Error($"Start tcp listener on port: {this.localTcpServerListeningPort} exceptioned: {exxx}");
                     return Task.FromResult(false);
                 }
             }
@@ -302,7 +319,8 @@ namespace Edge.Core.Processor.Communicator
                 //rawData = this.parser.Serialize(message);
                 var arg = new CommunicatorEventArg<byte[], T>() { Data = rawData, Message = message, Continue = true };
                 this.OnRawDataWriting?.Invoke(this, arg);
-                if (this.exclusiveTcpClient == null || !arg.Continue) { this.logger.LogError("Write failed, this.tcpClient is null: " + (this.exclusiveTcpClient is null)); return false; }
+                //if (this.exclusiveTcpClient == null || !arg.Continue) { this.logger.LogError("Write failed, this.tcpClient is null: " + (this.exclusiveTcpClient is null)); return false; }
+                if (this.exclusiveTcpClient == null || !arg.Continue) { logger.Error("Write failed, this.tcpClient is null: " + (this.exclusiveTcpClient is null)); return false; }
             }
             catch (Exception exx)
             {
@@ -316,7 +334,8 @@ namespace Edge.Core.Processor.Communicator
                     msgLogStr = "exceptioned for get ToLogString()";
                 }
 
-                this.logger.LogError("Tcp Write failed in serialize or event raise for msg: " + message.GetType() + " -> " + msgLogStr + "\r\n detail: " + exx);
+                //this.logger.LogError("Tcp Write failed in serialize or event raise for msg: " + message.GetType() + " -> " + msgLogStr + "\r\n detail: " + exx);
+                logger.Error("Tcp Write failed in serialize or event raise for msg: " + message.GetType() + " -> " + msgLogStr + "\r\n detail: " + exx);
                 return false;
             }
 
@@ -324,15 +343,19 @@ namespace Edge.Core.Processor.Communicator
             {
                 try
                 {
-                    if (logger.IsEnabled(LogLevel.Debug))
-                        this.logger.LogDebug("TCP to " + (this.exclusiveTcpClient_ClientRemoteEndPoint_Str) + " Outgoing--->: " + message.ToLogString() + "\r\n     0x" + rawData.ToHexLogString());
+                    //if (logger.IsEnabled(LogLevel.Debug))
+                    //    this.logger.LogDebug("TCP to " + (this.exclusiveTcpClient_ClientRemoteEndPoint_Str) + " Outgoing--->: " + message.ToLogString() + "\r\n     0x" + rawData.ToHexLogString());
+                    if(rawData.Length>8 && rawData[6] != 0x55 && rawData[7] != 0x10)
+                        logger.Info("TCP to " + (this.exclusiveTcpClient_ClientRemoteEndPoint_Str) + " Outgoing--->: " + message.ToLogString() + "\r\n     0x" + rawData.ToHexLogString());
                     var sendCount = this.exclusiveTcpClient.Client.Send(rawData);
                     if (sendCount == 0)
                         throw new InvalidOperationException("the send count in this.exclusiveTcpClient.Client.Send is 0");
                 }
                 catch (Exception exx)
                 {
-                    this.logger.LogError("Send tcp msg to "
+                    //this.logger.LogError("Send tcp msg to "
+                    //    + (this.exclusiveTcpClient_ClientRemoteEndPoint_Str) + " Write(...) exceptioned, treat as a broken tcp connection, will cancel the data read as well, detail: " + exx);
+                    logger.Error("Send tcp msg to "
                         + (this.exclusiveTcpClient_ClientRemoteEndPoint_Str) + " Write(...) exceptioned, treat as a broken tcp connection, will cancel the data read as well, detail: " + exx);
                     try
                     {

+ 74 - 29
Edge.Core/Processor/Dispatcher/ProcessorLoader/DbJSonLoader.cs

@@ -1,7 +1,9 @@
 using AutoMapper;
 using Edge.Core.Configuration;
+using Edge.Core.Core.database;
 using Edge.Core.Database;
 using Edge.Core.Database.Configuration.Models;
+using Edge.Core.Domain.FccMachineInfo.Output;
 using Edge.Core.Parser.BinaryParser;
 using Edge.Core.Processor.Communicator;
 using Edge.Core.Processor.Dispatcher.Attributes;
@@ -34,37 +36,80 @@ namespace Edge.Core.Processor.Dispatcher
 
         protected virtual IEnumerable<ProcessorMetaConfig> LoadProcessorMetaConfigs()
         {
-            string json = @"[
-    {
-        ""Id"": 16,
-        ""Name"": ""HengshanPaymentTerminal.HengshanPayTerminal.Hengs_938d2e2bd48b45ba_8"",
-        ""Description"": """",
-        ""Type"": 0,
-        ""Parts"": [
-            {
-                ""Id"": 38,
-                ""Type"": 1,
-                ""FullTypeString"": ""HengshanPaymentTerminal.HengshanPayTermHandler, HengshanPaymentTerminal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
-                ""ParametersJsonArrayStr"": ""[{\""pumpIds\"":\""1,2,3,4\"",\""pumpSubAddresses\"":[{\""PumpId\"":1,\""SubAddress\"":1},{\""PumpId\"":2,\""SubAddress\"":2},{\""PumpId\"":3,\""SubAddress\"":3},{\""PumpId\"":4,\""SubAddress\"":4}],\""pumpNozzleLogicIds\"":[{\""PumpId\"":1,\""LogicIds\"":\""1\""},{\""PumpId\"":2,\""LogicIds\"":\""1\""},{\""PumpId\"":3,\""LogicIds\"":\""1\""},{\""PumpId\"":4,\""LogicIds\"":\""1\""}],\""pumpSiteNozzleNos\"":[{\""PumpId\"":1,\""SiteNozzleNos\"":\""1\""},{\""PumpId\"":2,\""SiteNozzleNos\"":\""2\""},{\""PumpId\"":3,\""SiteNozzleNos\"":\""3\""},{\""PumpId\"":4,\""SiteNozzleNos\"":\""4\""}],\""nozzleLogicIds\"":[{\""NozzleNo\"":1,\""LogicId\"":1},{\""NozzleNo\"":2,\""LogicId\"":1},{\""NozzleNo\"":3,\""LogicId\"":1},{\""NozzleNo\"":4,\""LogicId\"":1}]}]""
-            },
+            List<ProcessorMetaConfig> processorMetaConfigs = new List<ProcessorMetaConfig>();
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
+            List<Domain.FccMachineInfo.FccMachineInfo> fccMachineInfos = mysqlDbContext.FccMachineInfos.ToList();
+            foreach (var item in fccMachineInfos)
             {
-                ""Id"": 40,
-                ""Type"": 0,
-                ""FullTypeString"": ""Edge.Core.Processor.GenericDeviceProcessor`2, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
-                ""ParametersJsonArrayStr"": ""[]""
-            },
-            {
-                ""Id"": 41,
-                ""Type"": 5,
-                ""FullTypeString"": ""Edge.Core.Processor.Communicator.TcpServerCommunicator`1, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
-              ""ParametersJsonArrayStr"": ""[23456, 30, \""enabled\"", \""enabled\"", \""2\""]""
+                int port = item.Port;
+                ProcessorMetaConfig processorMetaConfig = new ProcessorMetaConfig();
+                processorMetaConfig.Id = 16;
+                processorMetaConfig.Name = "HengshanPaymentTerminal.HengshanPayTerminal.Hengs_938d2e2bd48b45ba_8";
+                processorMetaConfig.Description = "";
+                processorMetaConfig.Type = ProcessorTypeEnum.DeviceProcessor;
+
+                ProcessorMetaPartsConfig hengshanPayTermHandler = new ProcessorMetaPartsConfig();
+                hengshanPayTermHandler.Id = 38;
+                hengshanPayTermHandler.Type = ProcessorMetaPartsTypeEnum.DeviceHandler;
+                hengshanPayTermHandler.FullTypeString = "HengshanPaymentTerminal.HengshanPayTermHandler, HengshanPaymentTerminal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
+                hengshanPayTermHandler.ParametersJsonArrayStr = @"[{""pumpIds"":""1,2,3,4"",""pumpSubAddresses"":[{""PumpId"":1,""SubAddress"":1},{""PumpId"":2,""SubAddress"":2},{""PumpId"":3,""SubAddress"":3},{""PumpId"":4,""SubAddress"":4}],""pumpNozzleLogicIds"":[{""PumpId"":1,""LogicIds"":""1""},{""PumpId"":2,""LogicIds"":""1""},{""PumpId"":3,""LogicIds"":""1""},{""PumpId"":4,""LogicIds"":""1""}],""pumpSiteNozzleNos"":[{""PumpId"":1,""SiteNozzleNos"":""1""},{""PumpId"":2,""SiteNozzleNos"":""2""},{""PumpId"":3,""SiteNozzleNos"":""3""},{""PumpId"":4,""SiteNozzleNos"":""4""}],""nozzleLogicIds"":[{""NozzleNo"":1,""LogicId"":1},{""NozzleNo"":2,""LogicId"":1},{""NozzleNo"":3,""LogicId"":1},{""NozzleNo"":4,""LogicId"":1}]}]";
+
+                ProcessorMetaPartsConfig generDeviceProcessor = new ProcessorMetaPartsConfig();
+                generDeviceProcessor.Id = 40;
+                generDeviceProcessor.Type = ProcessorMetaPartsTypeEnum.DeviceProcessor;
+                generDeviceProcessor.FullTypeString = "Edge.Core.Processor.GenericDeviceProcessor`2, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
+                generDeviceProcessor.ParametersJsonArrayStr = "[]";
+
+                ProcessorMetaPartsConfig tcpServerCommunicator = new ProcessorMetaPartsConfig();
+                tcpServerCommunicator.Id = 41;
+                tcpServerCommunicator.Type = ProcessorMetaPartsTypeEnum.Communicator;
+                tcpServerCommunicator.FullTypeString = "Edge.Core.Processor.Communicator.TcpServerCommunicator`1, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
+                tcpServerCommunicator.ParametersJsonArrayStr = @"[" + port + @", 30, ""enabled"", ""enabled"", ""2""]";
+
+                List<ProcessorMetaPartsConfig> processorMetaPartsConfigs = new List<ProcessorMetaPartsConfig>();
+                processorMetaPartsConfigs.Add(hengshanPayTermHandler);
+                processorMetaPartsConfigs.Add(generDeviceProcessor);
+                processorMetaPartsConfigs.Add(tcpServerCommunicator);
+                processorMetaConfig.Parts = processorMetaPartsConfigs;
+
+                processorMetaConfig.Activated = true;
+
+
+                processorMetaConfigs.Add(processorMetaConfig);
             }
-        ],
-        ""Activated"": true
-    }
-]";
-            IEnumerable<ProcessorMetaConfig> configs = JsonSerializer.Deserialize<IEnumerable<ProcessorMetaConfig>>(json);
-            return configs;
+
+            return processorMetaConfigs;
+            //string json = @"[
+            //    {
+            //        ""Id"": 16,
+            //        ""Name"": ""HengshanPaymentTerminal.HengshanPayTerminal.Hengs_938d2e2bd48b45ba_8"",
+            //        ""Description"": """",
+            //        ""Type"": 0,
+            //        ""Parts"": [
+            //            {
+            //                ""Id"": 38,
+            //                ""Type"": 1,
+            //                ""FullTypeString"": ""HengshanPaymentTerminal.HengshanPayTermHandler, HengshanPaymentTerminal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
+            //                ""ParametersJsonArrayStr"": ""[{\""pumpIds\"":\""1,2,3,4\"",\""pumpSubAddresses\"":[{\""PumpId\"":1,\""SubAddress\"":1},{\""PumpId\"":2,\""SubAddress\"":2},{\""PumpId\"":3,\""SubAddress\"":3},{\""PumpId\"":4,\""SubAddress\"":4}],\""pumpNozzleLogicIds\"":[{\""PumpId\"":1,\""LogicIds\"":\""1\""},{\""PumpId\"":2,\""LogicIds\"":\""1\""},{\""PumpId\"":3,\""LogicIds\"":\""1\""},{\""PumpId\"":4,\""LogicIds\"":\""1\""}],\""pumpSiteNozzleNos\"":[{\""PumpId\"":1,\""SiteNozzleNos\"":\""1\""},{\""PumpId\"":2,\""SiteNozzleNos\"":\""2\""},{\""PumpId\"":3,\""SiteNozzleNos\"":\""3\""},{\""PumpId\"":4,\""SiteNozzleNos\"":\""4\""}],\""nozzleLogicIds\"":[{\""NozzleNo\"":1,\""LogicId\"":1},{\""NozzleNo\"":2,\""LogicId\"":1},{\""NozzleNo\"":3,\""LogicId\"":1},{\""NozzleNo\"":4,\""LogicId\"":1}]}]""
+            //            },
+            //            {
+            //                ""Id"": 40,
+            //                ""Type"": 0,
+            //                ""FullTypeString"": ""Edge.Core.Processor.GenericDeviceProcessor`2, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
+            //                ""ParametersJsonArrayStr"": ""[]""
+            //            },
+            //            {
+            //                ""Id"": 41,
+            //                ""Type"": 5,
+            //                ""FullTypeString"": ""Edge.Core.Processor.Communicator.TcpServerCommunicator`1, Edge.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"",
+            //              ""ParametersJsonArrayStr"": ""[23456, 30, \""enabled\"", \""enabled\"", \""2\""]""
+            //            }
+            //        ],
+            //        ""Activated"": true
+            //    }
+            //]";
+            //IEnumerable<ProcessorMetaConfig> configs = JsonSerializer.Deserialize<IEnumerable<ProcessorMetaConfig>>(json);
+            //return configs;
             //using (var scope = this.services.CreateScope())
             //{
             //var dbContext = scope.ServiceProvider.GetRequiredService<SqliteDbContext>();

+ 63 - 25
HengshanPaymentTerminal/HengshanPayTermHandler.cs

@@ -76,10 +76,12 @@ namespace HengshanPaymentTerminal
 
         public Dictionary<int, List<int>> PumpSiteNozzleNoDict { get; private set; }
 
-        public MysqlDbContext MysqlDbContext { get; private set; }
+        //public MysqlDbContext MysqlDbContext { get; private set; }
 
         public StationInfo stationInfo { get; set; }
 
+        public Dictionary<long,string> stationPayment = new Dictionary<long,string>();
+
         public List<DetailsNozzleInfoOutput> nozzleInfoList { get; private set; }
 
         public TcpClient? client { get; set; }
@@ -101,7 +103,7 @@ namespace HengshanPaymentTerminal
 
         #region Logger
 
-        private static NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("IPosPlusApp");
+        private static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("HengshanPayTermHandler");
 
         #endregion
 
@@ -437,7 +439,7 @@ namespace HengshanPaymentTerminal
             CommIdentity = context.Processor.Communicator.Identity;
             _context = context;
 
-            this.MysqlDbContext = new MysqlDbContext();
+            //this.MysqlDbContext = new MysqlDbContext();
             this.httpClientUtil = new HttpClientUtils();
 
             this.serverPort = CommIdentity.Replace("*:", "").ToInt();
@@ -466,7 +468,7 @@ namespace HengshanPaymentTerminal
                         OrderFromMachine orderFromMachine = (OrderFromMachine)context.Incoming.Message;
                         FccOrderInfo fccOrderInfo = UpLoadOrder(orderFromMachine);
                         logger.Info($"receive order from machine,database had change");
-                        CreateTransaction(fccOrderInfo);
+                        CreateOrRedeemTransaction(fccOrderInfo);
                         break;
                     }
                     /**
@@ -706,15 +708,32 @@ namespace HengshanPaymentTerminal
         /// </summary>
         private async void GetInfo()
         {
-            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = MysqlDbContext.FccStationInfos.FirstOrDefault();
-            if(fccStationInfo != null) stationInfo = new StationInfo(fccStationInfo);
-            Edge.Core.Domain.FccMachineInfo.FccMachineInfo? fccMachineInfo = await MysqlDbContext.FccMachineInfos.FirstOrDefaultAsync(machine => machine.Port == serverPort);
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = mysqlDbContext.FccStationInfos.FirstOrDefault();
+            if(fccStationInfo != null)
+            {
+                stationInfo = new StationInfo(fccStationInfo);
+                string paymentType = stationInfo.PaymentType;
+                string[] paymentGround = paymentType.Split(",");
+                foreach (var item in paymentGround)
+                {
+                    string[] payment = item.Split("+");
+                    if (payment.Length == 2)
+                    {
+                        if (long.TryParse(payment[0], out long id))
+                        {
+                            stationPayment.Add(id, payment[1]);
+                        }
+                    }
+                }
+            }
+            Edge.Core.Domain.FccMachineInfo.FccMachineInfo? fccMachineInfo = await mysqlDbContext.FccMachineInfos.FirstOrDefaultAsync(machine => machine.Port == serverPort);
             if(fccMachineInfo == null)
             {
                 nozzleInfoList = new List<DetailsNozzleInfoOutput>();
             } else
             {
-                nozzleInfoList = MysqlDbContext.NozzleInfos.Where(nozzle => nozzle.MachineId == fccMachineInfo.Id).Select(n => new DetailsNozzleInfoOutput(n)).ToList();
+                nozzleInfoList = mysqlDbContext.NozzleInfos.Where(nozzle => nozzle.MachineId == fccMachineInfo.Id).Select(n => new DetailsNozzleInfoOutput(n)).ToList();
             }
             
         }
@@ -749,7 +768,7 @@ namespace HengshanPaymentTerminal
                 case MQTT_TYPE.PAID:
                     {
                         MqttPaidRequest? mqttPaidRequest = JsonConvert.DeserializeObject<MqttPaidRequest>(mqttRequest.data);
-                        await SendActuallyPaid(mqttPaidRequest);
+                        await SendActuallyPaid(mqttPaidRequest, mqttRequest.UserName, mqttRequest.UserPhoneNumber);
                         break;
                     }
                 case MQTT_TYPE.REFUND:
@@ -786,7 +805,7 @@ namespace HengshanPaymentTerminal
                 //list.AddRange(qrCodeBytes);
                 //byte[] sendBytes = content2data(list.ToArray(), null);
 
-                SendQrCode sendQrCode = new SendQrCode(item.NozzleNum, smallProgram, getFrame(null));
+                SendQrCode sendQrCode = new SendQrCode((int)item.CloundNozzleId,item.NozzleNum, smallProgram, getFrame(null));
                 byte[] commandAndNozzle = { sendQrCode.Handle, (byte)sendQrCode.NozzleNum };
 
                 Thread.Sleep(5000);
@@ -826,8 +845,9 @@ namespace HengshanPaymentTerminal
         /// 发送实付金额给油机
         /// </summary>
         /// <param name="orderInfo"></param>
-        public async Task SendActuallyPaid(MqttPaidRequest? request) 
+        public async Task SendActuallyPaid(MqttPaidRequest? request,string? userName,string? phoneNumber) 
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt get paid request is null");
@@ -842,16 +862,28 @@ namespace HengshanPaymentTerminal
             };
             await httpClientUtil.SendRecievePaidNotice(JsonConvert.SerializeObject(onGetPaidInfo));
 
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => 
+            order.NozzleNum == request.NozzleId 
+            && order.Ttc.ToString() == request.TransactionNumber
+            && order.PumpCode == request.FuelItemPumpTotalizerVolume);
             if (fccOrderInfo == null)
             {
                 logger.Error($"[mqtt paid order notice]:can not find order by clounid:{request.Id}");
                 return;
             }
+            fccOrderInfo.CloundOrderId = request.Id;
             fccOrderInfo.AmountPayable = request.ActualPaymentAmount;
             fccOrderInfo.PaymentTime = request.TransactionTime;
+            if(request.PaymentMethod != null)
+            {
+                fccOrderInfo.PayType = (int)request.PaymentMethod;
+                fccOrderInfo.PaymentName = stationPayment[request.PaymentMethod ?? 0] ?? "未知类型";
+            }
+            fccOrderInfo.UserName = userName??"";
+            fccOrderInfo.PhoneNumber = phoneNumber ?? string.Empty;
             fccOrderInfo.PaymentStatus = 1;
-            MysqlDbContext.SaveChanges();
+
+            mysqlDbContext.SaveChanges();
 
             //SendActuallyPaid sendActuallyPaid = new SendActuallyPaid(orderInfo.NozzleNum, orderInfo.Ttc, orderInfo.AmountPayable ?? orderInfo.Amount, getFrame(null));
             //byte[] commandAndNozzle = { sendActuallyPaid.Handle, (byte)sendActuallyPaid.NozzleNum };
@@ -874,6 +906,7 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         public async Task SendAuthorizationAsync(MqttAuthorizationRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if(request == null)
             {
                 logger.Error($"mqtt authorization request is null");
@@ -883,7 +916,7 @@ namespace HengshanPaymentTerminal
             //添加订单到数据库
             DateTime authorizationTime = request.AuthorizationTime ?? DateTime.Now;
             FccOrderInfo fccOrderInfo = request.ToComponent(authorizationTime);
-            MysqlDbContext.FccOrderInfos.Add(fccOrderInfo);
+            mysqlDbContext.FccOrderInfos.Add(fccOrderInfo);
 
             //发送授权申请到油机
             SendAuthorization sendAuthorization = new SendAuthorization((int)request.NozzleId, authorizationTime, 1,request.OriginalAmount, getFrame(null));
@@ -934,7 +967,7 @@ namespace HengshanPaymentTerminal
             logger.Info($"send authorization result response:{JsonConvert.SerializeObject(httpResponseMessage.Content)}");
 
             //更新订单
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
         }
 
         /// <summary>
@@ -943,6 +976,7 @@ namespace HengshanPaymentTerminal
         /// <param name="request"></param>
         public async Task SendUnAuthorizartion(MqttUnAhorizationRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt unauthorization request is null");
@@ -955,7 +989,7 @@ namespace HengshanPaymentTerminal
             bool ttsIntResult = int.TryParse(request.TransactionNumber, out ttc);
             if (request.AuthorizationTime == null || !ttsIntResult)
             {
-                FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+                FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
                 if(fccOrderInfo != null)
                 {
                     ttc = fccOrderInfo.Ttc;
@@ -1023,6 +1057,7 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         private async Task OnRecieveOrderRefund(MqttRefundRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt OnRecieveOrderRefund request is null");
@@ -1036,7 +1071,7 @@ namespace HengshanPaymentTerminal
             };
             await httpClientUtil.SendRecieveRefundNotice(JsonConvert.SerializeObject(onGetRefundInfo));
 
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
             if (fccOrderInfo == null)
             {
                 logger.Error($"[mqtt refund order notice]:can not find order by clounid:{request.Id}");
@@ -1044,7 +1079,7 @@ namespace HengshanPaymentTerminal
             }
             fccOrderInfo.AmountPayable = request.ActualPaymentAmount;
             fccOrderInfo.PaymentStatus = 2;
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
 
         }
 
@@ -1076,6 +1111,7 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         private async Task<CommonMessage> SendMessageToMaichine(string sendTag, Func<CommonMessage, CommonMessage, bool> responseCapture,CommonMessage sendMessage)
         {
+            logger.Info($"send request to machine:{sendTag}");
             int retryCount = 0;
             while (retryCount < 3)
             {
@@ -1298,16 +1334,17 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         public FccOrderInfo UpLoadOrder(OrderFromMachine order)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             //接收到油机发送过来的订单信息
             OrderFromMachine orderFromMachine = (OrderFromMachine)order;
-            string? oilName = MysqlDbContext.OilInfos.Where(oil => orderFromMachine.oilCode.Equals(oil.Code)).Select(oil => oil.Name).FirstOrDefault();
+            string? oilName = mysqlDbContext.OilInfos.Where(oil => orderFromMachine.oilCode.Equals(oil.Code)).Select(oil => oil.Name).FirstOrDefault();
             FccOrderInfo orderByMessage = orderFromMachine.ToComponent(oilName);
 
             /** 根据枪号+流水号+授权时间来确定订单,因为冷启动后流水号会从头开始计算
              * 后支付时直接将数据库直接插入
              * 预支付时由于是云端先创建订单,发起授权响应成功后会插入数据库,响应成功时会回复授权时间,枪号,流水号
              */
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos
                 .Where(order =>
                     order.NozzleNum == orderFromMachine.nozzleNum && order.Ttc == orderFromMachine.ttc
                     && order.AuthorizationTime == orderFromMachine.dispenserTime)
@@ -1315,22 +1352,23 @@ namespace HengshanPaymentTerminal
             if (fccOrderInfo == null)
             {
                 logger.Info($"receive order from machine,find order from database is null");
-                MysqlDbContext.FccOrderInfos.Add(orderByMessage);
-                MysqlDbContext.SaveChanges();
+                mysqlDbContext.FccOrderInfos.Add(orderByMessage);
+                mysqlDbContext.SaveChanges();
                 return orderByMessage;
             }
             else
             {
                 logger.Info($"receive order from machine,padding data right now");
                 orderFromMachine.PaddingAuthorizationOrderData(fccOrderInfo);
-                MysqlDbContext.SaveChanges();
+                mysqlDbContext.SaveChanges();
                 return fccOrderInfo;
             }
             
         }
 
-        private async void CreateTransaction(FccOrderInfo fccOrderInfo)
+        private async void CreateOrRedeemTransaction(FccOrderInfo fccOrderInfo)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             CreateTransaction createTransaction = new CreateTransaction(fccOrderInfo);
             logger.Info($"create transaction, {JsonConvert.SerializeObject(createTransaction)}");
             HttpResponseMessage httpResponseMessage = await httpClientUtil.CreateTransaction(JsonConvert.SerializeObject(createTransaction));
@@ -1343,7 +1381,7 @@ namespace HengshanPaymentTerminal
             
             fccOrderInfo.CloundOrderId = response?.data?.Id;
             fccOrderInfo.UploadState = response?.data == null ? 0 : 1;
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
         }
 
         /// <summary>

+ 0 - 1
HengshanPaymentTerminal/HengshanPaymentTerminal.csproj

@@ -19,7 +19,6 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Edge.Core\Edge.Core.csproj" />
-    <ProjectReference Include="..\Web\Web.csproj" />
   </ItemGroup>
 
   <ItemGroup>

+ 6 - 0
HengshanPaymentTerminal/Http/Request/HttpRequest.cs

@@ -413,6 +413,7 @@ namespace HengshanPaymentTerminal.Http.Request
             this.TransactionNumber = fccOrderInfo.Ttc.ToString();
             this.MiniProgramID = null;
             this.PaymentMethod = null;
+            this.FuelItemPumpTotalizerVolume = fccOrderInfo.PumpCode;
         }
 
         /// <summary>
@@ -469,6 +470,11 @@ namespace HengshanPaymentTerminal.Http.Request
         /// 支付方式
         /// </summary>
         public int? PaymentMethod { get; set; }
+
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal? FuelItemPumpTotalizerVolume {  get; set; }
     }
 
     /// <summary>

+ 44 - 0
HengshanPaymentTerminal/Http/Response/Response.cs

@@ -23,6 +23,50 @@ namespace HengshanPaymentTerminal.Http.Response
 
     }
 
+    /// <summary>
+    /// 请求云端上传油枪信息回复
+    /// </summary>
+    public class UploadNozzleInfoResponse
+    {
+        /// <summary>
+        /// 云端油枪id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// fcc油枪id
+        /// </summary>
+        public long NozzleId { get; set; }
+
+        /// <summary>
+        /// 加油点
+        /// </summary>
+        public int PumpId { get; set; }
+
+        /// <summary>
+        /// 内部枪号
+        /// </summary>
+        public int InternalGunNumber { get; set; }
+
+        /// <summary>
+        /// 外部枪号
+        /// </summary>
+        public int ExternalGunNumber { get; set; }
+
+        /// <summary>
+        /// fcc 油罐id
+        /// </summary>
+        public long TankID { get; set; }
+
+        /// <summary>
+        /// 油品id
+        /// </summary>
+        public long ProductId { get; set; }
+    }
+
+    /// <summary>
+    /// 请求云端创建订单回复
+    /// </summary>
     public class CreateTransactionResponse
     {
         /// <summary>

+ 23 - 6
HengshanPaymentTerminal/MessageEntity/Incoming/OrderFromMachine.cs

@@ -1,5 +1,6 @@
 using Castle.Components.DictionaryAdapter.Xml;
 using Edge.Core.Domain.FccOrderInfo;
+using Edge.Core.Domain.FccStationInfo.Output;
 using Edge.Core.Parser.BinaryParser.MessageEntity;
 using Microsoft.EntityFrameworkCore.Metadata.Internal;
 using System;
@@ -61,6 +62,11 @@ namespace HengshanPaymentTerminal.MessageEntity.Incoming
         /// </summary>
         public decimal volume { get; set; }
 
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal pumpCode { get; set; }
+
         public override byte[] ToCommonByteArray()
         {
             byte[] content = new byte[] { 0x55, this.Handle, (byte)this.nozzleNum, ((byte)RESULT.OVER) };
@@ -94,29 +100,40 @@ namespace HengshanPaymentTerminal.MessageEntity.Incoming
             uint volumeInt = Bytes2Number<uint>(datas, 34, 3);
             this.volume = volumeInt / 100m;
 
+            int punpCodeInt = Bytes2Number<int>(datas, 37, 4);
+            this.pumpCode = punpCodeInt / 100m;
+
+
+
             return this;
         }
 
         public FccOrderInfo ToComponent(string? oilName)
         {
-            
+
             return new FccOrderInfo
             {
                 Ttc = this.ttc,
                 AuthorizationTime = this.dispenserTime,
                 EndTime = this.endTime,
+                PaymentTime = null,
                 NozzleNum = this.nozzleNum,
-                //PayType = 0x21,
+                OilName = oilName ?? "",
                 PaymentStatus = 0,
+                //PayType = 0x21,
+                CloundOrderId = null,
                 Amount = this.amount,
                 Volume = this.volume,
                 //AmountPayable = this.amount,
-                Price = this.price,
                 UploadState = 0,
                 IsDelete = 0,
-                PaymentTime = null,
-                OilName = oilName ?? "",
-                CloundOrderId = null
+                Price = this.price,
+                //RefundAmount = 0,
+                UserName = "",
+                PhoneNumber = "",
+                PaymentName = "",
+                PumpCode = this.pumpCode
+
             };
         }
 

+ 8 - 2
HengshanPaymentTerminal/MessageEntity/Outgoing/SendQrCode.cs

@@ -12,6 +12,11 @@ namespace HengshanPaymentTerminal.MessageEntity.Outgoing
     /// </summary>
     public class SendQrCode : CommonMessage
     {
+        /// <summary>
+        /// 云端油枪id
+        /// </summary>
+        public long CloundNozzleId { get; set; }
+
         /// <summary>
         /// 油枪号
         /// </summary>
@@ -22,10 +27,11 @@ namespace HengshanPaymentTerminal.MessageEntity.Outgoing
         /// </summary>
         private string SmallProgram {  get; set; }
 
-        public SendQrCode(int nozzle,string samllProgram,byte frame)
+        public SendQrCode(long cloundNozzleId,int nozzle,string samllProgram,byte frame)
         {
             this.Handle = (byte)Command.SEND_QR_CODE;
             this.NozzleNum = nozzle;
+            this.CloundNozzleId = cloundNozzleId;
             this.SmallProgram = samllProgram;
             this.FrameNum = frame;
         }
@@ -34,7 +40,7 @@ namespace HengshanPaymentTerminal.MessageEntity.Outgoing
         {
             List<Byte> list = new List<Byte>();
             byte[] commandAndNozzle = { this.Handle, (byte)this.NozzleNum };
-            string qrCode = this.SmallProgram + "/" + this.NozzleNum;
+            string qrCode = this.SmallProgram + "?id=" + this.CloundNozzleId;
             byte[] qrCodeBytes = Encoding.ASCII.GetBytes(qrCode);
             list.AddRange(commandAndNozzle);
             list.Add((byte)qrCodeBytes.Length);

+ 25 - 0
HengshanPaymentTerminal/Mqtt/Request/MqttRequest.cs

@@ -25,6 +25,10 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// </summary>
         public string data { get; set; }
 
+        public string? UserName { get; set; }
+
+        public string? UserPhoneNumber { get; set; }
+
     }
 
     /// <summary>
@@ -497,6 +501,17 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// 单价
         /// </summary>
         public decimal? Price { get; set; }
+
+        public decimal? FuelItemPumpTotalizerVolume {  get; set; }
+        ///// <summary>
+        ///// 用户名
+        ///// </summary>
+        //public string? UserName { get; set; }
+
+        ///// <summary>
+        ///// 手机号
+        ///// </summary>
+        //public string? UserPhoneNumber { get; set; }
     }
 
     /// <summary>
@@ -638,5 +653,15 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// 单价
         /// </summary>
         public decimal? Price { get; set; }
+
+        ///// <summary>
+        ///// 用户名
+        ///// </summary>
+        //public string? UserName {  get; set; }
+
+        ///// <summary>
+        ///// 手机号
+        ///// </summary>
+        //public string? UserPhoneNumber { get; set; }
     }
 }

+ 1 - 1
HengshanPaymentTerminal/StateMachineMessageCutter.cs

@@ -40,7 +40,7 @@ namespace HengshanPaymentTerminal
 
         #region Logger
 
-        static NLog.Logger innerLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator");
+        static NLog.Logger innerLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("StateMachineMessageCutter");
 
         #endregion
 

+ 13 - 0
src/FccLife.Web/.config/dotnet-tools.json

@@ -0,0 +1,13 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {
+    "dotnet-ef": {
+      "version": "9.0.2",
+      "commands": [
+        "dotnet-ef"
+      ],
+      "rollForward": false
+    }
+  }
+}

+ 8 - 0
src/FccLife.Web/Controller/OrderInfoController.cs

@@ -24,5 +24,13 @@ namespace FccLite.Web.Controller
             OrderInfoOutput orderInfoOutput = await _orderInfoService.GetPage(orderInfoPageInput);
             return Ok(orderInfoOutput);
         }
+
+        [HttpPost("downloadOrderAfterPayOrderExcel")]
+        public async Task<IActionResult> DownloadOrderAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput)
+        {
+            logger.Info($"download after pay order excel:{JsonConvert.SerializeObject(orderInfoPageInput)}");
+            byte[] fileBytes = await _orderInfoService.DownloadAfterPayOrderExcel(orderInfoPageInput);
+            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "orders.xlsx");
+        }
     }
 }

+ 1 - 2
src/FccLife.Web/FccLite.Web.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
@@ -17,7 +17,6 @@
   <ItemGroup>
     <ProjectReference Include="..\..\Edge.Core\Edge.Core.csproj" />
     <ProjectReference Include="..\..\HengshanPaymentTerminal\HengshanPaymentTerminal.csproj" />
-    <ProjectReference Include="..\..\Web\Web.csproj" />
   </ItemGroup>
 
   <ItemGroup>

+ 43 - 1
src/FccLife.Web/Program.cs

@@ -17,9 +17,18 @@ using FccLite.Web.Services.FccOrderInfo;
 using FccLite.Web.Repositories.FccOrderInfo;
 using FccLite.Web.Services.FccMachineInfo;
 using FccLite.Web.Repositories.FccMachineInfo;
+using OfficeOpenXml;
+using System.Text.Json;
 
 var builder = WebApplication.CreateBuilder(args);
- DefaultDispatcher processorsDispatcher = null;
+// 自动加载 appsettings.json 和 appsettings.{Environment}.json
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+    var kestrelConfig = context.Configuration.GetSection("Kestrel");
+    options.Configure(kestrelConfig);
+});
+
+DefaultDispatcher processorsDispatcher = null;
 //数据库
 builder.Services.AddDbContext<MysqlDbContext>(options =>
     options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"), ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("DefaultConnection")))
@@ -48,6 +57,9 @@ builder.Services.AddScoped<IMachineRepository, MachineReposity>();
 builder.Services.AddScoped<IHttpClient, HttpClientService>();
 builder.Services.AddScoped<IHttpClientUtil, HttpClientUtils>();
 
+//excel
+ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+
 //swagger
 builder.Services.AddSwaggerGen(c =>
 {
@@ -76,8 +88,38 @@ builder.Services.AddSwaggerGen(c =>
                  instantiateResults.Where(r => r.Succeed).Select(r => r.ProcessorInstance),
                  "Main starting");
 }
+
+builder.Services.AddControllers()
+    .AddJsonOptions(options =>
+    {
+        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 支持 camelCase
+        options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
+    });
+// 添加CORS服务,并允许所有来源
+builder.Services.AddCors(options =>
+{
+    options.AddPolicy("AllowAll", policy =>
+    {
+        policy.AllowAnyOrigin()    // 允许所有来源(生产环境应指定具体域名)
+              .AllowAnyMethod()    // 允许所有 HTTP 方法
+              .AllowAnyHeader()    // 允许所有请求头
+              .SetPreflightMaxAge(TimeSpan.FromSeconds(86400)); // 预检请求缓存时间
+    });
+});
 var app = builder.Build();
 
+//跨域
+app.UseCors("AllowAll");
+app.Use(async (context, next) =>
+{
+    context.Response.Headers["Referrer-Policy"] = "strict-origin-when-cross-origin";
+    context.Request.EnableBuffering(); // 允许多次读取
+    var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
+    Console.WriteLine($"Request Body: {requestBody}");
+    context.Request.Body.Position = 0; // 重置流的位置
+    await next();
+});
+
 //controller
 app.UseHttpsRedirection();
 app.UseAuthorization();

+ 9 - 1
src/FccLife.Web/Repositories/FccOrderInfo/IOrderInfoReposity.cs

@@ -1,5 +1,6 @@
 using Edge.Core.Domain.FccOrderInfo;
 using Edge.Core.Domain.FccOrderInfo.Input;
+using Edge.Core.Domain.FccOrderInfo.Output;
 
 namespace FccLite.Web.Repositories.FccOrderInfo
 {
@@ -10,6 +11,13 @@ namespace FccLite.Web.Repositories.FccOrderInfo
         /// </summary>
         /// <param name="orderInfoPageInput"></param>
         /// <returns></returns>
-        Task<IEnumerable<Edge.Core.Domain.FccOrderInfo.FccOrderInfo>> GetPage(OrderInfoPageInput orderInfoPageInput);
+        Task<IEnumerable<OrderInfo>> GetPage(OrderInfoPageInput orderInfoPageInput);
+
+        /// <summary>
+        /// 过滤查询订单
+        /// </summary>
+        /// <param name="orderInfoPageInput"></param>
+        /// <returns></returns>
+        Task<IEnumerable<OrderInfo>> GetOrderFilter(OrderInfoPageInput orderInfoPageInput);
     }
 }

+ 37 - 13
src/FccLife.Web/Repositories/FccOrderInfo/OrderInfoReposity.cs

@@ -1,5 +1,6 @@
 using Edge.Core.Core.database;
 using Edge.Core.Domain.FccOrderInfo.Input;
+using Edge.Core.Domain.FccOrderInfo.Output;
 using Microsoft.EntityFrameworkCore;
 
 namespace FccLite.Web.Repositories.FccOrderInfo
@@ -18,22 +19,45 @@ namespace FccLite.Web.Repositories.FccOrderInfo
         /// </summary>
         /// <param name="orderInfoPageInput"></param>
         /// <returns></returns>
-        public async Task<IEnumerable<Edge.Core.Domain.FccOrderInfo.FccOrderInfo>> GetPage(OrderInfoPageInput orderInfoPageInput)
+        public async Task<IEnumerable<OrderInfo>> GetPage(OrderInfoPageInput orderInfoPageInput)
         {
-            IQueryable<Edge.Core.Domain.FccOrderInfo.FccOrderInfo> query = _dbContext.FccOrderInfos.AsQueryable();
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = await _dbContext.FccStationInfos.FirstOrDefaultAsync();
+            var stationName = fccStationInfo?.Name ?? "";
+
+            var query = from qo in _dbContext.FccOrderInfos
+                        join qn in _dbContext.NozzleInfos on qo.NozzleNum equals qn.ExternalNum
+                        join qm in _dbContext.FccMachineInfos on qn.MachineId equals qm.Id
+                        where qo.IsDelete == 0
+                        where string.IsNullOrEmpty(orderInfoPageInput.oilName) || qo.OilName == orderInfoPageInput.oilName
+                        where orderInfoPageInput.nozzleNum == null || qo.NozzleNum == orderInfoPageInput.nozzleNum
+                        where orderInfoPageInput.paymentType == null || qo.PayType == orderInfoPageInput.paymentType
+                        where (orderInfoPageInput.startCheckTime == null || orderInfoPageInput.endCheckTime == null || qo.EndTime == null)
+                                || qo.EndTime >= orderInfoPageInput.startCheckTime && qo.EndTime <= orderInfoPageInput.endCheckTime
+                        where string.IsNullOrEmpty(orderInfoPageInput.phoneNumberOruserName) || qo.UserName == orderInfoPageInput.phoneNumberOruserName || qo.PhoneNumber == orderInfoPageInput.phoneNumberOruserName
+                        orderby qo.AuthorizationTime descending
+                        select new OrderInfo(qo, stationName, qm.Name);
 
-            query = query.Where(order => order.IsDelete == 0);
-            query = query.WhereIf(orderInfoPageInput.oilName != null && !"".Equals(orderInfoPageInput.oilName),order => order.OilName.Equals(orderInfoPageInput.oilName));
-            query = query.WhereIf(orderInfoPageInput.nozzleNum != null, order => order.NozzleNum == orderInfoPageInput.nozzleNum);
-            //query = query.WhereIf(orderInfoPageInput.ttc != null, order => order.Ttc == orderInfoPageInput.ttc);
-            if (orderInfoPageInput.startCheckTime != null && orderInfoPageInput.endCheckTime != null)
-            {
-                query = query.Where(order => order.EndTime != null && (order.EndTime >= orderInfoPageInput.startCheckTime && order.EndTime <= orderInfoPageInput.endCheckTime));
-            }
-            query = query.WhereIf(orderInfoPageInput.paymentType != null, order => order.PayType == orderInfoPageInput.paymentType);
-            query = query.WhereIf(orderInfoPageInput.phoneNumberOruserName != null, order => order.UserName.Equals(orderInfoPageInput.phoneNumberOruserName) || order.PhoneNumber.Equals(orderInfoPageInput.phoneNumberOruserName));
-            query = query.OrderByDescending(order => order.EndTime);
             return await query.Skip((orderInfoPageInput.page - 1) * orderInfoPageInput.pageSize).Take(orderInfoPageInput.pageSize).ToListAsync();
         }
+
+        public async Task<IEnumerable<OrderInfo>> GetOrderFilter(OrderInfoPageInput orderInfoPageInput)
+        {
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = await _dbContext.FccStationInfos.FirstOrDefaultAsync();
+            var stationName = fccStationInfo?.Name ?? "";
+
+            var query = from qo in _dbContext.FccOrderInfos
+                        join qn in _dbContext.NozzleInfos on qo.NozzleNum equals qn.ExternalNum
+                        join qm in _dbContext.FccMachineInfos on qn.MachineId equals qm.Id
+                        where qo.IsDelete == 0
+                        where string.IsNullOrEmpty(orderInfoPageInput.oilName) || qo.OilName == orderInfoPageInput.oilName
+                        where orderInfoPageInput.nozzleNum == null || qo.NozzleNum == orderInfoPageInput.nozzleNum
+                        where orderInfoPageInput.paymentType == null || qo.PayType == orderInfoPageInput.paymentType
+                        where (orderInfoPageInput.startCheckTime == null || orderInfoPageInput.endCheckTime == null || qo.EndTime == null)
+                                || qo.EndTime >= orderInfoPageInput.startCheckTime && qo.EndTime <= orderInfoPageInput.endCheckTime
+                        where string.IsNullOrEmpty(orderInfoPageInput.phoneNumberOruserName) || qo.UserName == orderInfoPageInput.phoneNumberOruserName || qo.PhoneNumber == orderInfoPageInput.phoneNumberOruserName
+                        orderby qo.AuthorizationTime descending
+                        select new OrderInfo(qo, stationName, qm.Name);
+            return await query.ToListAsync();
+        }
     }
 }

+ 19 - 5
src/FccLife.Web/Services/FccNozzleInfo/NozzleInfoServiceImpl.cs

@@ -5,6 +5,7 @@ using FccLite.Web.Repositories.FccNozzleInfo;
 using FccLite.Web.Repositories.FccTankInfo;
 using HengshanPaymentTerminal.Http;
 using HengshanPaymentTerminal.Http.Request;
+using HengshanPaymentTerminal.Http.Response;
 using Newtonsoft.Json;
 using Org.BouncyCastle.Asn1.Ocsp;
 using System.Text;
@@ -46,13 +47,15 @@ namespace FccLite.Web.Services.FccNozzleInfo
                         SendNozzleInfo sendNozzleInfo = new SendNozzleInfo(id,nozzleInfoInput, fccTankInfo);
                         var requestJson = JsonConvert.SerializeObject(sendNozzleInfo);
                         HttpResponseMessage httpResponseMessage = await _httpClientUtils.SendNozzleInfo(requestJson);
-                        Logger.Info($"send nozzle response : {httpResponseMessage.Content}");
+                        string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                        Logger.Info($"send nozzle response : {responseJson}");
                     } else
                     {
                         UpdateNozzleInfo updateNozzleInfo = new UpdateNozzleInfo(id, nozzleInfoInput, fccTankInfo);
                         var requestJson = JsonConvert.SerializeObject(updateNozzleInfo);
                         HttpResponseMessage httpResponseMessage = await _httpClientUtils.UpdateNozzleInfo(requestJson);
-                        Logger.Info($"update nozzle response : {httpResponseMessage.Content}");
+                        string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                        Logger.Info($"update nozzle response : {responseJson}");
                     }
                 }
                 catch (Exception e)
@@ -93,14 +96,24 @@ namespace FccLite.Web.Services.FccNozzleInfo
                         SendNozzleInfo sendNozzleInfo = new SendNozzleInfo(id, nozzleInfoInput, fccTankInfo);
                         var requestJson = JsonConvert.SerializeObject(sendNozzleInfo);
                         HttpResponseMessage httpResponseMessage = await _httpClientUtils.SendNozzleInfo(requestJson);
-                        Logger.Info($"send nozzle response : {httpResponseMessage.Content}");
+                        string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                        Logger.Info($"send nozzle response : {responseJson}");
+                        Response<UploadNozzleInfoResponse>? response = JsonConvert.DeserializeObject<Response<UploadNozzleInfoResponse>>(responseJson);
+                        if(response?.data?.Id != null)
+                        {
+                            nozzleInfoInput.Id = id;
+                            nozzleInfoInput.CloundNozzleId = response?.data.Id;
+                            await _nozzleInfoReposity.UploadNozzleInfoFroMachine(nozzleInfoInput);
+                        }
+                        
                     }
                     else
                     {
                         UpdateNozzleInfo updateNozzleInfo = new UpdateNozzleInfo(id, nozzleInfoInput, fccTankInfo);
                         var requestJson = JsonConvert.SerializeObject(updateNozzleInfo);
                         HttpResponseMessage httpResponseMessage = await _httpClientUtils.UpdateNozzleInfo(requestJson);
-                        Logger.Info($"update nozzle response : {httpResponseMessage.Content}");
+                        string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                        Logger.Info($"update nozzle response : {responseJson}");
                     }
                 }
                 catch (Exception e)
@@ -163,7 +176,8 @@ namespace FccLite.Web.Services.FccNozzleInfo
                     DeleteNozzleInfo deleteNozzleInfo = new DeleteNozzleInfo(fccNozzleInfo);
                     var requestJson = JsonConvert.SerializeObject(deleteNozzleInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtils.DeleteNozzleInfo(requestJson);
-                    Logger.Info($"delete nozzle response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"delete nozzle response : {responseJson}");
                 }
                 catch (Exception e)
                 {

+ 7 - 3
src/FccLife.Web/Services/FccOilInfo/OilInfoServiceImpl.cs

@@ -35,7 +35,9 @@ namespace FccLite.Web.Services.FccOilInfo
                     DeleteOilInfo deleteOilInfo = new DeleteOilInfo(fccOilInfo);
                     string requestJson = JsonConvert.SerializeObject(deleteOilInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtils.DeleteOilInfo(requestJson);
-                    Logger.Info($"delete oilInfo response : {httpResponseMessage.Content}");
+
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"delete oilInfo response : {responseJson}");
                 } catch (Exception e)
                 {
                     Logger.Error($"delete nozzle to cloud error:{e.Message}", e);
@@ -110,14 +112,16 @@ namespace FccLite.Web.Services.FccOilInfo
                     SendOilInfo sendOilInfo = new SendOilInfo(id, oilInfoInput);
                     var requestJson = JsonConvert.SerializeObject(sendOilInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtils.SendOilInfo(requestJson);
-                    Logger.Info($"send oilInfo response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"send oilInfo response : {responseJson}");
                 }
                 else
                 {
                     UpdateOilInfo updateOilInfo = new UpdateOilInfo(id, oilInfoInput);
                     var requestJson = JsonConvert.SerializeObject(updateOilInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtils.UpdateOilInfo(requestJson);
-                    Logger.Info($"update oilInfo response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"update oilInfo response : {responseJson}");
                 }
             }
             catch (Exception e)

+ 8 - 0
src/FccLife.Web/Services/FccOrderInfo/IOrderInfoService.cs

@@ -1,5 +1,6 @@
 using Edge.Core.Domain.FccOrderInfo.Input;
 using Edge.Core.Domain.FccOrderInfo.Output;
+using Microsoft.AspNetCore.Mvc;
 
 namespace FccLite.Web.Services.FccOrderInfo
 {
@@ -11,5 +12,12 @@ namespace FccLite.Web.Services.FccOrderInfo
         /// <param name="orderInfoOutput">过滤条件</param>
         /// <returns></returns>
         Task<OrderInfoOutput> GetPage(OrderInfoPageInput orderInfoPageInput);
+
+        /// <summary>
+        /// 下载后支付订单excel
+        /// </summary>
+        /// <param name="orderInfoPageInput"></param>
+        /// <returns></returns>
+        Task<byte[]> DownloadAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput);
     }
 }

+ 73 - 3
src/FccLife.Web/Services/FccOrderInfo/OrderInfoService.cs

@@ -2,30 +2,100 @@
 using Edge.Core.Domain.FccOrderInfo.Output;
 using FccLite.Web.Repositories.FccOrderInfo;
 using FccLite.Web.Repositories.FccStationInfo;
+using Microsoft.AspNetCore.Mvc;
+using OfficeOpenXml;
 
 namespace FccLite.Web.Services.FccOrderInfo
 {
     public class OrderInfoService : IOrderInfoService
     {
+        static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
         private readonly IOrderInfoReposity _orderInfoReposity;
         private readonly IStationRepository _stationRepository;
+
+        private readonly string[] tableTitle = { "流水号","油站", "油机号", "油枪", "油品", "单价", "升数", "金额", "挂枪时间", "交易时间", "支付方式", "支付状态", "支付用户" };
+        private readonly Dictionary<int, string> _afterPayType = new Dictionary<int, string>
+        {
+            {0,"未支付" },
+            {1,"已支付" }
+        };
+
         public OrderInfoService(IOrderInfoReposity orderInfoReposity,IStationRepository stationRepository) 
         {
             _orderInfoReposity = orderInfoReposity;
             _stationRepository = stationRepository;
         }
 
+        
 
         public async Task<OrderInfoOutput> GetPage(OrderInfoPageInput orderInfoPageInput)
         {
-            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = await _stationRepository.GetFirstStation();
-            IEnumerable<Edge.Core.Domain.FccOrderInfo.FccOrderInfo> enumerable = await _orderInfoReposity.GetPage(orderInfoPageInput);
-            List<OrderInfo> orderInfos = enumerable.Select(order => new OrderInfo(order,fccStationInfo?.Name ?? "","")).ToList();
+            IEnumerable<OrderInfo> enumerable = await _orderInfoReposity.GetPage(orderInfoPageInput);
+            List<OrderInfo> orderInfos = enumerable.ToList();
             return new OrderInfoOutput()
             {
                 Total = orderInfos.Count,
                 List = orderInfos
             };
         }
+
+
+        public async Task<byte[]> DownloadAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput)
+        {
+            IEnumerable<OrderInfo> enumerable = await _orderInfoReposity.GetOrderFilter(orderInfoPageInput);
+            try
+            {
+                var package = new ExcelPackage();
+                ExcelWorksheet excelWorksheet = package.Workbook.Worksheets.Add("Sheet1");
+
+                for (int index = 0; index < tableTitle.Length; index++)
+                {
+                    excelWorksheet.Cells[1, index+1].Value = tableTitle[index];
+                }
+
+                using (var range = excelWorksheet.Cells[1, 1, 1, tableTitle.Length])
+                {
+                    range.Style.Font.Bold = true;
+                }
+
+                int row = 2;
+                decimal allVolume = 0;
+                decimal allAmount = 0;
+                foreach (var order in enumerable)
+                {
+                    excelWorksheet.Cells[row, 1].Value = order.Ttc;
+                    excelWorksheet.Cells[row, 2].Value = order.StationName;
+                    excelWorksheet.Cells[row, 3].Value = order.MachineName;
+                    excelWorksheet.Cells[row, 4].Value = order.NozzleNum;
+                    excelWorksheet.Cells[row, 5].Value = order.OilName;
+                    excelWorksheet.Cells[row, 6].Value = order.Price;
+                    excelWorksheet.Cells[row, 7].Value = order.Volume;
+                    excelWorksheet.Cells[row, 8].Value = order.Amount;
+                    excelWorksheet.Cells[row, 9].Value = order.EndTime != null ? order.EndTime?.ToString("yyyy-MM-dd HH:mm:ss") : "";
+                    excelWorksheet.Cells[row, 10].Value = order.PaymentTime != null ? order.PaymentTime?.ToString("yyyy-MM-dd HH:mm:ss") : "";
+                    excelWorksheet.Cells[row, 11].Value = order.PaymentName;
+
+                    string payTypeStr = "未知状态";
+                    _afterPayType.TryGetValue(order.PaymentStatus, out payTypeStr);
+                    excelWorksheet.Cells[row, 12].Value = payTypeStr;
+
+                    excelWorksheet.Cells[row, 13].Value = order.UserName;
+
+                    allVolume += order.Volume;
+                    allAmount += order.Amount;
+                    row++;
+                }
+                excelWorksheet.Cells[row, 7].Value = allVolume;
+                excelWorksheet.Cells[row, 8].Value = allAmount;
+
+                return package.GetAsByteArray();
+            } catch(Exception e)
+            {
+                Console.WriteLine(e);
+                Logger.Error(e.Message);
+            }
+
+            return new byte[0];
+        }
     }
 }

+ 6 - 3
src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs

@@ -81,7 +81,8 @@ namespace FccLite.Web.Services.FccTankInfo
                     SendTankInfo sendTankInfo = new SendTankInfo(id,addTankInput);
                     string requestJson = JsonConvert.SerializeObject(sendTankInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtil.SendTankInfo(requestJson);
-                    Logger.Info($"add tank response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"add tank response : {responseJson}");
                 } catch(Exception e)
                 {
                     Logger.Error($"add tank to cloud error:{e.Message}", e);
@@ -115,7 +116,8 @@ namespace FccLite.Web.Services.FccTankInfo
                     UpdateTankInfo updateTankInfo = new UpdateTankInfo(id, updateTankInput);
                     string requestJson = JsonConvert.SerializeObject(updateTankInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtil.UpdateTankInfo(requestJson);
-                    Logger.Info($"update tank response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"update tank response : {responseJson}");
                 }
                 catch (Exception e)
                 {
@@ -150,7 +152,8 @@ namespace FccLite.Web.Services.FccTankInfo
                     DeleteTankInfo deleteTankInfo = new DeleteTankInfo(fccTankInfo);
                     string requestJson = JsonConvert.SerializeObject(deleteTankInfo);
                     HttpResponseMessage httpResponseMessage = await _httpClientUtil.DeleteTankInfo(requestJson);
-                    Logger.Info($"delete tank response : {httpResponseMessage.Content}");
+                    string responseJson = await httpResponseMessage.Content.ReadAsStringAsync();
+                    Logger.Info($"delete tank response : {responseJson}");
                 }
                 catch (Exception e)
                 {

+ 7 - 0
src/FccLife.Web/appsettings.Development.json

@@ -8,5 +8,12 @@
   "ConnectionStrings": {
     "DefaultConnection": "Server=localhost;Port=3306;Database=qrFueling;User=root;Password=123456",
     "isMigrate": "true"
+  },
+  "Kestrel": {
+    "Endpoints": {
+      "Http": {
+        "Url": "http://0.0.0.0:8080"
+      }
+    }
   }
 }

+ 19 - 0
src/FccLife.Web/appsettings.Production.json

@@ -0,0 +1,19 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "ConnectionStrings": {
+    "DefaultConnection": "Server=localhost;Port=3306;Database=qrFueling;User=root;Password=123456",
+    "isMigrate": "true"
+  },
+  "Kestrel": {
+    "Endpoints": {
+      "Http": {
+        "Url": "http://0.0.0.0:9999"
+      }
+    }
+  }
+}

+ 1 - 1
src/FccLife.Web/nlog.config

@@ -9,7 +9,7 @@
 
 	<targets>
 		<!-- 将日志写入文件 -->
-		<target xsi:type="File" name="file" archiveAboveSize="20480" archiveEvery="Day" archiveNumbering="Sequence" maxArchiveFiles="7" fileName="${basedir}/logs/nlog-${shortdate}.log"
+		<target xsi:type="File" name="file" archiveAboveSize="20480000" archiveEvery="Day" archiveNumbering="Sequence" maxArchiveFiles="7" fileName="${basedir}/logs/nlog-${shortdate}.log"
 		layout="${date:format=HH\:mm\:ss.fff} [${threadid}:${level:uppercase=true}]${logger} - ${message} ${exception}" />
 
 		<!-- 将日志写入控制台 -->

+ 1 - 0
src/FccWeb/admin.ui.plus-master/.env.development

@@ -5,6 +5,7 @@ ENV = 'development'
 # VITE_API_URL = 'http://ipos.biz:8070'
 # VITE_API_URL = 'http://localhost:8000'
 VITE_API_URL = 'http://dev.hsfuel.com:8070'
+VITE_API_URL_FCC = 'http://localhost:9999'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'
 

+ 1 - 0
src/FccWeb/admin.ui.plus-master/.env.production

@@ -11,5 +11,6 @@ VITE_PUBLIC_PATH = '/'
 # VITE_API_URL = 'http://ipos.biz:8070'
 # VITE_API_URL = 'http://localhost:8000'
 VITE_API_URL = 'http://dev.hsfuel.com:8070'
+VITE_API_URL_FCC = 'http://localhost:9999'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'

文件差异内容过多而无法显示
+ 524 - 462
src/FccWeb/admin.ui.plus-master/package-lock.json


+ 1 - 0
src/FccWeb/admin.ui.plus-master/package.json

@@ -36,6 +36,7 @@
     "jsplumb": "^2.15.6",
     "lodash": "^4.17.21",
     "mitt": "^3.0.0",
+    "moment": "^2.30.1",
     "nprogress": "^0.2.0",
     "path": "^0.12.7",
     "pinia": "^2.1.4",

+ 1 - 0
src/FccWeb/admin.ui.plus-master/src/api/FormValidation.ts

@@ -12,6 +12,7 @@ const addStationRules = reactive({
     name: [{ required: true, message: '请输入油站名称', trigger: 'blur', }],
     longitude: [{ required: true, message: '请输入经度', trigger: 'blur', }],
     latitude: [{ required: true, message: '请输入纬度', trigger: 'blur', }],
+    paymentType: [{ required: true, message: '请配置支付方式', trigger: 'blur', }],
   })
   
   // 验证规则 - 添加油罐

+ 10 - 0
src/FccWeb/admin.ui.plus-master/src/api/api.ts

@@ -1,3 +1,4 @@
+import axios from 'axios'
 import request from './request'    // 引入封装的axios
 
 /** ----- 站点 ----- */
@@ -183,3 +184,12 @@ export const getOrderFilter =(data:any)=>{
 	})
 }
 
+//导出excel
+export const downloadAfterpayOrder = (data:any) => {
+	const send = axios.create({
+		timeout: 5000, // 超时
+		baseURL: import.meta.env.VITE_API_URL_FCC,
+	})
+	return send.post('/qrFueling/order/downloadOrderAfterPayOrderExcel', data, { responseType: 'arraybuffer' })
+}
+

+ 1 - 1
src/FccWeb/admin.ui.plus-master/src/api/request.ts

@@ -6,7 +6,7 @@ const axios = Axios.create({
 		'Content-Type': 'application/json'
 	},
 	timeout: 5000, // 超时
-	baseURL: '/api',
+	baseURL: import.meta.env.VITE_API_URL_FCC,
 })
 
 

+ 5 - 1
src/FccWeb/admin.ui.plus-master/src/main.ts

@@ -12,7 +12,11 @@ import VueGridLayout from 'vue-grid-layout'
 import globalProperties from '/@/globalProperties'
 // import ECharts   from '/@/components/echart/index.vue'
 import DataVVue3 from '@kjgl77/datav-vue3'
-
+// 一次性解决时区和日期格式问题
+import moment from 'moment'
+Date.prototype.toISOString = function(){
+    return moment(this).format('YYYY-MM-DDTHH:mm:ss')
+}
 
 
 const app = createApp(App)

+ 3 - 1
src/FccWeb/admin.ui.plus-master/src/router/backEnd.ts

@@ -41,8 +41,10 @@ export async function initBackEndControlRoutes() {
   // 无 token 停止执行下一步
   if (!useUserInfo().getToken()) return false
   // 触发初始化用户信息 pinia
-  await useUserInfo().setUserInfos()
 
+  console.log("1111")
+  await useUserInfo().setUserInfos()
+  console.log("2222")
   // 获取路由菜单数据
   // const menus = await getBackEndControlRoutes()    // ---后端接口读取路由。
   // console.log(menus)

+ 2 - 0
src/FccWeb/admin.ui.plus-master/src/router/index.ts

@@ -119,9 +119,11 @@ router.beforeEach(async (to, from, next) => {
       storesRoute.setRouteTo({ to: { path: to.path, params: JSON.stringify(to.query ? to.query : to.params) } })
       const storesRoutesList = useRoutesList(pinia)
       const { routesList } = storeToRefs(storesRoutesList)
+      console.log(routesList.value)
       if (routesList.value.length === 0) {
         if (isRequestRoutes) {
           // 后端控制路由:路由数据初始化,防止刷新时丢失
+          console.log("index.ts")
           const isNoPower = await initBackEndControlRoutes()
           // if (isNoPower) {
           //   ElMessage.warning('抱歉,您没有分配权限,请联系管理员')

+ 59 - 60
src/FccWeb/admin.ui.plus-master/src/router/route.ts

@@ -46,70 +46,68 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
     meta: {
       isKeepAlive: true,
     },
-    children: import.meta.env.PROD
-      ? []
-      : [
-        {
-          path: '/statement',
-          name: '/statement',
-          component: () => import('/@/views/admin/nozzle/index.vue'),
-          meta: {
-            title: '油枪状态',
-            isLink: '',
-            isHide: false,
-            isKeepAlive: true,
-            isAffix: false,
-            isIframe: false,
-            roles: ['admin', 'common'],
-            icon: 'iconfont icon-crew_feature',
-          },
+    children: [
+      {
+        path: '/statement',
+        name: '/statement',
+        component: () => import('/@/views/admin/nozzle/index.vue'),
+        meta: {
+          title: '油枪状态',
+          isLink: '',
+          isHide: false,
+          isKeepAlive: true,
+          isAffix: false,
+          isIframe: false,
+          roles: ['admin', 'common'],
+          icon: 'iconfont icon-crew_feature',
         },
-        {
-          path: '/station',
-          name: '/station',
-          component: () => import('/@/views/admin/station/station.vue'),
-          meta: {
-            title: '油站信息',
-            isLink: '',
-            isHide: false,
-            isKeepAlive: true,
-            isAffix: false,
-            isIframe: false,
-            roles: ['admin', 'common'],
-            icon: 'iconfont icon-crew_feature',
-          },
+      },
+      {
+        path: '/station',
+        name: '/station',
+        component: () => import('/@/views/admin/station/station.vue'),
+        meta: {
+          title: '油站信息',
+          isLink: '',
+          isHide: false,
+          isKeepAlive: true,
+          isAffix: false,
+          isIframe: false,
+          roles: ['admin', 'common'],
+          icon: 'iconfont icon-crew_feature',
         },
-        {
-          path: '/oil',
-          name: '/oil',
-          component: () => import('/@/views/admin/oil/oil.vue'),
-          meta: {
-            title: '油品信息',
-            isLink: '',
-            isHide: false,
-            isKeepAlive: true,
-            isAffix: false,
-            isIframe: false,
-            roles: ['admin', 'common'],
-            icon: 'iconfont icon-crew_feature',
-          },
+      },
+      {
+        path: '/oil',
+        name: '/oil',
+        component: () => import('/@/views/admin/oil/oil.vue'),
+        meta: {
+          title: '油品信息',
+          isLink: '',
+          isHide: false,
+          isKeepAlive: true,
+          isAffix: false,
+          isIframe: false,
+          roles: ['admin', 'common'],
+          icon: 'iconfont icon-crew_feature',
         },
-        {
-          path: '/order',
-          name: '/order',
-          component: () => import('/@/views/admin/order/index.vue'),
-          meta: {
-            title: '订单信息',
-            isLink: '',
-            isHide: false,
-            isKeepAlive: true,
-            isAffix: false,
-            isIframe: false,
-            roles: ['admin', 'common'],
-            icon: 'iconfont icon-crew_feature',
-          },
+      },
+      {
+        path: '/order',
+        name: '/order',
+        component: () => import('/@/views/admin/order/index.vue'),
+        meta: {
+          title: '订单信息',
+          isLink: '',
+          isHide: false,
+          isKeepAlive: true,
+          isAffix: false,
+          isIframe: false,
+          roles: ['admin', 'common'],
+          icon: 'iconfont icon-crew_feature',
         },
-      ],
+      },
+    ],
   },
 
 ]
@@ -147,6 +145,7 @@ export const notFoundAndNoPower = [
  */
 export const staticRoutes: Array<RouteRecordRaw> = [
   {
+    
     path: '/login',
     name: 'login',
     component: () => import('/@/views/admin/login/index.vue'),

+ 7 - 0
src/FccWeb/admin.ui.plus-master/src/views/admin/components/addStation.vue

@@ -65,6 +65,11 @@
                         <el-input v-model="dataList.mqttService" placeholder="请输入mqtt地址" clearable />
                     </el-form-item>
                 </el-col>
+                <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+                    <el-form-item label="支付方式配置" :required="true" prop="paymentType">
+                        <el-input v-model="dataList.paymentType" placeholder="请按[id+支付方式,id+支付方式]填写,如1+微信支付,2+支付宝支付" clearable />
+                    </el-form-item>
+                </el-col>
             </el-row>
         </el-form>
         <template #footer>
@@ -114,6 +119,8 @@ let dataList = ref({
     longitude: null,
     /** 纬度 */
     latitude: null,
+    /** 支付方式 */
+    paymentType:null
 })
 
 // 创建表单实例

+ 2 - 0
src/FccWeb/admin.ui.plus-master/src/views/admin/login/component/account.vue

@@ -129,6 +129,8 @@ const login = async () => {
   const token = res.data?.token
   useUserInfo().setToken(token)
   // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
+  
+  console.log("account.vue")
   const isNoPower = await initBackEndControlRoutes()
   // 执行完 initBackEndControlRoutes,再执行 signInSuccess
   signInSuccess(isNoPower)

+ 2 - 0
src/FccWeb/admin.ui.plus-master/src/views/admin/login/component/mobile.vue

@@ -100,6 +100,8 @@ const onSignIn = async () => {
     const token = res.data?.token
     useUserInfo().setToken(token)
     // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
+    
+    console.log("mobile.ts")
     const isNoPower = await initBackEndControlRoutes()
     // 执行完 initBackEndControlRoutes,再执行 signInSuccess
     signInSuccess(isNoPower)

+ 59 - 11
src/FccWeb/admin.ui.plus-master/src/views/admin/order/index.vue

@@ -32,7 +32,7 @@
                             </el-col> 
                             <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                                 <el-form-item label="加油时间">
-                                    <el-date-picker v-model="Data.time1" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" range-separator="To" start-placeholder="开始日期" end-placeholder="结束日期" />
+                                    <el-date-picker v-model="Data.time1" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" range-separator="To" start-placeholder="开始日期" end-placeholder="结束日期" clearable=false />
                                 </el-form-item>
                             </el-col>   
                             <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -50,6 +50,7 @@
                         <el-row>
                             <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
                             <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+                            <el-button type="primary" icon="ele-Search" @click="downloadExcel"> 导出EXCEL </el-button>
                         </el-row>
                     </el-row>
                 </el-card>
@@ -96,9 +97,10 @@
 
 <script setup lang="ts" name="partsManagement/oilGun">
 import { onMounted, reactive, watch, computed } from "vue";
-import { getOrderInfoPage,getOrderFilter } from "/@/api/api";
+import { getOrderInfoPage,getOrderFilter,downloadAfterpayOrder } from "/@/api/api";
 import { OrderInfoFilter } from "/@/api/admin/orderDto/QRBookDto";
 import { nextTick } from 'vue';
+import { formatDate } from '/@/utils/formatTime'
 
 /**页面对象 */
 const Data = reactive({
@@ -117,8 +119,6 @@ const Data = reactive({
         startCheckTime: null,
         /**加油结束的时间 */
         endCheckTime: null,
-        /**油站 */
-        StationName: null,
         // 支付方式类型
         paymentType:null,
         // 用户手机号码or用户名称
@@ -195,11 +195,6 @@ const onQuery = async () => {
             // 如果选择“全部”,不传递paymentType参数
             filterParams.paymentType = null; 
         }
-    
-        // if(Data.Filter.payUserName=order.userName||order.phoneNumber){
-        //     filterParams.phoneNumberOruserName = Data.Filter.payUserName
-        // }
-
         const orders = await getOrderInfoPage(filterParams);
         console.log('后端返回的原始数据:', orders);
         console.log('后端返回的总记录数:', orders.total);
@@ -248,9 +243,47 @@ const onReset = () => {
     Data.time1 = "";
     // 重置时选择“全部”
     Data.selectedPayment = '0'; 
-    onQuery();
+    initTime()
 };
 
+/** 下载excel */
+const downloadExcel = async () => {
+    // return
+    Data.loading = true;
+    try {
+        let filterParams = {
+            page: Data.pageInput.page,
+            pageSize: Data.pageInput.pageSize,
+           ...Data.Filter
+        };
+        // 根据选中的支付方式设置筛选参数
+        if (Data.selectedPayment && Data.selectedPayment!== '0') {
+            filterParams.paymentType = parseInt(Data.selectedPayment);
+        } else {
+            // 如果选择“全部”,不传递paymentType参数
+            filterParams.paymentType = null; 
+        }
+        const stream = await downloadAfterpayOrder(filterParams);
+        const url = window.URL.createObjectURL(new Blob([stream.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }))
+        const link = document.createElement('a');
+        link.href = url;
+        
+        link.setAttribute('download',
+        `${formatDate(filterParams.startCheckTime,"YYYY-mm-dd")}-${formatDate(filterParams.startCheckTime,"YYYY-mm-dd")}订单报表.xlsx`)
+        
+        document.body.appendChild(link);
+        link.click();
+        // 下载完成后移除链接,并释放内存
+        link.remove();
+        window.URL.revokeObjectURL(url);
+    } catch (error) {
+        console.error('查询订单数据时出错:', error);
+    } finally {
+        Data.loading = false;
+        await nextTick();
+    }
+}
+
 /** 页数修改 */
 const onSizeChange = (pageSize) => {
     Data.pageInput.pageSize = pageSize;
@@ -269,8 +302,19 @@ const toView = ((data: any) => {
     console.log('查看')
 })
 
+const initTime = () => {
+    const now = new Date();
+    const todayStart = new Date(now.getFullYear(),now.getMonth(),now.getDate());
+    var todayEnd = new Date(now.getFullYear(),now.getMonth(),now.getDate());
+    todayEnd.setHours(23,59,59,999);
+    Data.time1 = [formatDate(todayStart,"YYYY-mm-dd HH:MM:SS"),formatDate(todayEnd,"YYYY-mm-dd HH:MM:SS")]
+
+    Data.Filter.startCheckTime = todayStart;
+    Data.Filter.endCheckTime = todayEnd;
+}
 // 挂载时
 onMounted(async () => {
+    initTime();
     const response = await getOrderFilter();
     console.log("支付方式请求结果", response);
     // 确保response.payments是一个数组
@@ -307,7 +351,11 @@ watch(() => Data.Filter.oilName,(val) => {
 
 /** 过滤条件监听——时间 */
 watch(() => Data.time1,(val) => {
-    if(val?.length === 0) return
+    debugger
+    if(val == null || val?.length === 0) {
+        initTime()
+        return
+    }
     Data.Filter.startCheckTime = new Date(val?.[0].toString());
     Data.Filter.endCheckTime = new Date(val?.[1].toString());
 })

+ 1 - 0
src/FccWeb/admin.ui.plus-master/src/views/admin/station/station.vue

@@ -84,6 +84,7 @@ const data = reactive([
     { prop: 'acessKey', label: '云端通讯密钥' },
     { prop: 'webSocketPort', label: 'WebSokcet端口' },
     { prop: 'buildId', label: '站点id' }])
+    // { prop: 'paymentType', label: '支付方式' }])
 
 let display = reactive({
     isShow: { 1: false, 2: false } as any,

+ 0 - 6
src/FccWeb/admin.ui.plus-master/vite.config.ts

@@ -42,12 +42,6 @@ const viteConfig = defineConfig(({ mode, command }: ConfigEnv) => {
           changeOrigin: true,
           rewrite: (path) => path.replace(/^\/gitee/, ''),
         },
-        '/api': {
-          target: 'http://192.168.0.53:9999/',
-          ws: true,
-          changeOrigin: true,
-          rewrite: (path) => path.replace(/^\/api/, ''),
-        },
       },
     },
     build: {

部分文件因为文件数量过多而无法显示