Ver código fonte

feat(HengshanPaymentTerminal):
1、fcc获取油枪状态
2、fcc推送二维码信息给油机
3、fcc获取订单信息
4、推送实付金额给油机

Zhenghanjv 6 meses atrás
pai
commit
35dfccfc40
52 arquivos alterados com 945 adições e 215 exclusões
  1. 59 0
      Edge.Core/Core/database/MysqlDbContext.cs
  2. 1 1
      Edge.Core/Core/database/QueryableExtensions.cs
  3. 1 1
      Edge.Core/Domain/FccNozzleInfo/FccNozzleInfo.cs
  4. 7 8
      Edge.Core/Domain/FccNozzleInfo/Input/UploadNozzleInfoInput.cs
  5. 13 1
      Edge.Core/Domain/FccNozzleInfo/Output/DetailsNozzleInfoOutput.cs
  6. 3 3
      Edge.Core/Domain/FccNozzleInfo/Output/SetNozzleInfoOutput.cs
  7. 2 3
      Edge.Core/Domain/FccOilInfo/FccOilInfo.cs
  8. 4 4
      Edge.Core/Domain/FccOilInfo/Input/OilInfoInput.cs
  9. 2 2
      Edge.Core/Domain/FccOilInfo/Ouput/OilInfoOutput.cs
  10. 1 1
      Edge.Core/Domain/FccOilInfo/Ouput/OilInfoSetOutput.cs
  11. 92 0
      Edge.Core/Domain/FccOrderInfo/FccOrderInfo.cs
  12. 102 0
      Edge.Core/Domain/FccOrderInfo/Output/OrderInfoOutput.cs
  13. 2 2
      Edge.Core/Domain/FccStationInfo/FccStationInfo.cs
  14. 15 15
      Edge.Core/Domain/FccStationInfo/Input/StationInfoInput.cs
  15. 17 1
      Edge.Core/Domain/FccStationInfo/Output/StationInfoOutput.cs
  16. 1 1
      Edge.Core/Domain/FccStationInfo/Output/StationSetOutput.cs
  17. 4 6
      Edge.Core/Domain/FccTankInfo/FccTankInfo.cs
  18. 8 8
      Edge.Core/Domain/FccTankInfo/Input/AddTankInput.cs
  19. 3 3
      Edge.Core/Domain/FccTankInfo/Input/UpdateTankInput.cs
  20. 2 3
      Edge.Core/Domain/FccTankInfo/Output/BaseTankInfoOutput.cs
  21. 1 1
      Edge.Core/Domain/FccTankInfo/Output/DetailsTankInfoOutput.cs
  22. 3 3
      Edge.Core/Domain/FccTankInfo/Output/SetTankInfoOutput.cs
  23. 11 0
      Edge.Core/Edge.Core.csproj
  24. 18 0
      Edge.Core/Processor/Communicator/IClinet.cs
  25. 2 0
      Edge.Core/Processor/Communicator/ICommunicator.cs
  26. 8 2
      Edge.Core/Processor/Communicator/TcpServerCommunicator.cs
  27. 10 0
      Edge.Core/Processor/GenericDeviceProcessor.cs
  28. 19 1
      Edge.Core/Processor/IDeviceHandler.cs
  29. 213 13
      HengshanPaymentTerminal/HengshanPayTermHandler.cs
  30. 10 0
      HengshanPaymentTerminal/MessageEntity/CommonMessage.cs
  31. 177 0
      HengshanPaymentTerminal/MessageEntity/Incoming/OrderFromMachine.cs
  32. 45 0
      HengshanPaymentTerminal/Test/CalculatorTest.cs
  33. 4 4
      src/FccLife.Web/Controller/ConfigController.cs
  34. 12 10
      src/FccLife.Web/Controller/TankController.cs
  35. 0 41
      src/FccLife.Web/Core/database/MysqlDbContext.cs
  36. 1 1
      src/FccLife.Web/Program.cs
  37. 2 2
      src/FccLife.Web/Repositories/FccNozzleInfo/INozzleInfoReposity.cs
  38. 6 6
      src/FccLife.Web/Repositories/FccNozzleInfo/NozzleInfoReposity.cs
  39. 4 5
      src/FccLife.Web/Repositories/FccOilInfo/IOilInfoReposity.cs
  40. 10 11
      src/FccLife.Web/Repositories/FccOilInfo/OilInfoReposity.cs
  41. 4 4
      src/FccLife.Web/Repositories/FccStationInfo/IStationRepository.cs
  42. 10 11
      src/FccLife.Web/Repositories/FccStationInfo/StationRepository.cs
  43. 4 5
      src/FccLife.Web/Repositories/FccTankInfo/ITankReposity.cs
  44. 8 8
      src/FccLife.Web/Repositories/FccTankInfo/TankReposity.cs
  45. 2 2
      src/FccLife.Web/Services/FccNozzleInfo/INozzleInfnService.cs
  46. 3 3
      src/FccLife.Web/Services/FccNozzleInfo/NozzleInfoServiceImpl.cs
  47. 2 2
      src/FccLife.Web/Services/FccOilInfo/IOilInfoService.cs
  48. 4 4
      src/FccLife.Web/Services/FccOilInfo/OilInfoServiceImpl.cs
  49. 2 2
      src/FccLife.Web/Services/FccStaionInfo/IStationService.cs
  50. 5 5
      src/FccLife.Web/Services/FccStaionInfo/StationServiceImpl.cs
  51. 2 2
      src/FccLife.Web/Services/FccTankInfo/ITankInfoService.cs
  52. 4 4
      src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs

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

@@ -0,0 +1,59 @@
+using Edge.Core.Domain.FccNozzleInfo;
+using Edge.Core.Domain.FccOilInfo;
+using Edge.Core.Domain.FccOrderInfo;
+using Edge.Core.Domain.FccStationInfo;
+using Edge.Core.Domain.FccTankInfo;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Edge.Core.Core.database
+{
+    public class MysqlDbContext : DbContext
+    {
+        public MysqlDbContext() { }
+
+        [ActivatorUtilitiesConstructor]
+        public MysqlDbContext(DbContextOptions<MysqlDbContext> options) : base(options) { }
+
+        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+        {
+            if (!optionsBuilder.IsConfigured)
+            {
+                /* Default constructor with no parameter init this class will use below appsettings.json*/
+                IConfigurationRoot configuration = new ConfigurationBuilder()
+                   .SetBasePath(Directory.GetCurrentDirectory())
+                   .AddJsonFile("appsettings.Development.json")
+                   .Build();
+                var connectionString = configuration.GetConnectionString("DefaultConnection");
+                optionsBuilder.UseMySql(connectionString,ServerVersion.AutoDetect(connectionString));
+            }
+        }
+        public DbSet<FccStationInfo> FccStationInfos { get; set; }
+
+        public DbSet<FccOilInfo> OilInfos { get; set; }
+
+        public DbSet<FccTankInfo> TankInfos { get; set; }
+
+        public DbSet<FccNozzleInfo> NozzleInfos { get; set; }
+
+        public DbSet<FccOrderInfo> fccOrderInfos { get; set; }
+
+        protected override void OnModelCreating(ModelBuilder modelBuilder)
+        {
+            modelBuilder.Entity<FccTankInfo>()
+                .HasOne(tankInfos => tankInfos.Oil)
+                .WithMany(oilInfo => oilInfo.FccTankInfo)
+                .HasForeignKey(tankInfo => tankInfo.OilId)
+                .OnDelete(DeleteBehavior.Restrict);
+
+            modelBuilder.Entity<FccNozzleInfo>()
+                .HasOne(nozzleInfo => nozzleInfo.Tank)
+                .WithMany(tankInfo => tankInfo.FccNozzleInfos)
+                .HasForeignKey(nozzleInfo => nozzleInfo.TankId)
+                .OnDelete(DeleteBehavior.Restrict);
+
+            base.OnModelCreating(modelBuilder);
+        }
+    }
+}

+ 1 - 1
src/FccLife.Web/Core/database/QueryableExtensions.cs → Edge.Core/Core/database/QueryableExtensions.cs

@@ -1,6 +1,6 @@
 using System.Linq.Expressions;
 
-namespace FccLite.Web.Core.database
+namespace Edge.Core.Core.database
 {
     public static class QueryableExtensions
     {

+ 1 - 1
src/FccLife.Web/Domain/FccNozzleInfo/FccNozzleInfo.cs → Edge.Core/Domain/FccNozzleInfo/FccNozzleInfo.cs

@@ -1,7 +1,7 @@
 using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 
-namespace FccLite.Web.Domain.FccNozzleInfo
+namespace Edge.Core.Domain.FccNozzleInfo
 {
     [Table("qr_nozzle")]
     public class FccNozzleInfo

+ 7 - 8
src/FccLife.Web/Domain/FccNozzleInfo/Input/UploadNozzleInfoInput.cs → Edge.Core/Domain/FccNozzleInfo/Input/UploadNozzleInfoInput.cs

@@ -1,5 +1,4 @@
-
-namespace FccLite.Web.Domain.FccNozzleInfo.Input
+namespace Edge.Core.Domain.FccNozzleInfo.Input
 {
     public class UploadNozzleInfoInput
     {
@@ -42,12 +41,12 @@ namespace FccLite.Web.Domain.FccNozzleInfo.Input
         {
             return new FccNozzleInfo()
             {
-                MachineIp = this.Ip,
-                FuelPoint = this.FuelPoint,
-                InternalNum = this.InternalNum,
-                ExternalNum = this.NozzleNum,
-                TankId = this.TankId,
-                TankNum = this.TankNum
+                MachineIp = Ip,
+                FuelPoint = FuelPoint,
+                InternalNum = InternalNum,
+                ExternalNum = NozzleNum,
+                TankId = TankId,
+                TankNum = TankNum
             };
         }
     }

+ 13 - 1
src/FccLife.Web/Domain/FccNozzleInfo/Output/DetailsNozzleInfoOutput.cs → Edge.Core/Domain/FccNozzleInfo/Output/DetailsNozzleInfoOutput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccNozzleInfo.Output
+namespace Edge.Core.Domain.FccNozzleInfo.Output
 {
     public class DetailsNozzleInfoOutput
     {
@@ -42,6 +42,18 @@
         /// </summary>
         public List<RelatableTank> RelatableTanks { get; set; }
 
+        public DetailsNozzleInfoOutput() { }
+
+        public DetailsNozzleInfoOutput(FccNozzleInfo fccNozzleInfo)
+        {
+            this.Id = fccNozzleInfo.Id;
+            this.Ip = fccNozzleInfo.MachineIp;
+            this.FuelPoint = fccNozzleInfo.FuelPoint;
+            this.InternalNum = fccNozzleInfo.InternalNum;
+            this.NozzleNum = fccNozzleInfo.ExternalNum;
+            this.TankId = fccNozzleInfo.TankId;
+            this.TankNum = fccNozzleInfo.TankNum;
+        }
         public class RelatableTank
         {
             /// <summary>

+ 3 - 3
src/FccLife.Web/Domain/FccNozzleInfo/Output/SetNozzleInfoOutput.cs → Edge.Core/Domain/FccNozzleInfo/Output/SetNozzleInfoOutput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccNozzleInfo.Output
+namespace Edge.Core.Domain.FccNozzleInfo.Output
 {
     /// <summary>
     /// 新增、修改、删除油枪结果
@@ -8,12 +8,12 @@
         /// <summary>
         /// 结果
         /// </summary>
-        public Boolean Result { get; set; }
+        public bool Result { get; set; }
 
 
         /// <summary>
         /// 信息
         /// </summary>
-        public String Message { get; set; }
+        public string Message { get; set; }
     }
 }

+ 2 - 3
src/FccLife.Web/Domain/FccOilInfo/FccOilInfo.cs → Edge.Core/Domain/FccOilInfo/FccOilInfo.cs

@@ -1,8 +1,7 @@
-using FccLite.Web.Domain.FccTankInfo;
-using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 
-namespace FccLite.Web.Domain.FccOilInfo
+namespace Edge.Core.Domain.FccOilInfo
 {
     [Table("qr_oil")]
     public class FccOilInfo

+ 4 - 4
src/FccLife.Web/Domain/FccOilInfo/Input/OilInfoInput.cs → Edge.Core/Domain/FccOilInfo/Input/OilInfoInput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccOilInfo.Input
+namespace Edge.Core.Domain.FccOilInfo.Input
 {
     public class OilInfoInput
     {
@@ -26,9 +26,9 @@
         {
             return new FccOilInfo()
             {
-                Code = this.Code,
-                Name = this.Name,
-                Price = this.Price,
+                Code = Code,
+                Name = Name,
+                Price = Price,
             };
         }
     }

+ 2 - 2
src/FccLife.Web/Domain/FccOilInfo/Ouput/OilInfoOutput.cs → Edge.Core/Domain/FccOilInfo/Ouput/OilInfoOutput.cs

@@ -1,8 +1,8 @@
-namespace FccLite.Web.Domain.FccOilInfo.Ouput
+namespace Edge.Core.Domain.FccOilInfo.Ouput
 {
     public class OilInfoOutput
     {
-        public int Total {  get; set; }
+        public int Total { get; set; }
 
         public List<OilInfo> OilInfoList { get; set; }
 

+ 1 - 1
src/FccLife.Web/Domain/FccOilInfo/Ouput/OilInfoSetOutput.cs → Edge.Core/Domain/FccOilInfo/Ouput/OilInfoSetOutput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccOilInfo.Ouput
+namespace Edge.Core.Domain.FccOilInfo.Ouput
 {
     /// <summary>
     /// 新增/修改/删除油品基本信息结果

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

@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Edge.Core.Domain.FccOrderInfo
+{
+    [Table("qr_order")]
+    public class FccOrderInfo
+    {
+        /// <summary>
+        /// 订单id
+        /// </summary>
+        [Key]
+        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 流水号
+        /// </summary>
+        public int Ttc { get; set; }
+
+        /// <summary>
+        /// 授权时间
+        /// </summary>
+        public DateTime? AuthorizationTime { get; set; }
+
+        /// <summary>
+        /// 挂枪时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public DateTime? PaymentTime { get; set; }
+
+        /// <summary>
+        /// 枪号
+        /// </summary>
+        public int NozzleNum { get; set; }
+
+        /// <summary>
+        /// 油品名
+        /// </summary>
+        public String OilName { get; set; }
+
+        /// <summary>
+        /// 支付状态
+        /// </summary>
+        public int PaymentStatus {  get; set; }
+
+        /// <summary>
+        /// 支付类型
+        /// </summary>
+        public int? PayType { get; set; }
+
+        /// <summary>
+        /// 云端id
+        /// </summary>
+        public long? CloundOrderId { get; set; }
+
+        /// <summary>
+        /// 实际加油金额
+        /// </summary>
+        public decimal Amount { get; set; }
+
+        /// <summary>
+        /// 实际加油升数
+        /// </summary>
+        public decimal Volume { get; set; }
+
+        /// <summary>
+        /// 实际支付金额
+        /// </summary>
+        public decimal AmountPayable { get; set; }
+
+        /// <summary>
+        /// 是否已上传云端—— 0:未上传;1:已上传;2:不需要上传
+        /// </summary>
+        public int UploadState { get; set; }
+
+        /// <summary>
+        /// 是否删除——0:否;1:是
+        /// </summary>
+        public int IsDelete { get; set; }
+    }
+
+}

+ 102 - 0
Edge.Core/Domain/FccOrderInfo/Output/OrderInfoOutput.cs

@@ -0,0 +1,102 @@
+
+namespace Edge.Core.Domain.FccOrderInfo.Output
+{
+    public class OrderInfoOutput
+    {
+        /// <summary>
+        /// 订单id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 流水号
+        /// </summary>
+        public int Ttc { get; set; }
+
+        /// <summary>
+        /// 授权时间
+        /// </summary>
+        public DateTime? AuthorizationTime { get; set; }
+
+        /// <summary>
+        /// 挂枪时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public DateTime? PaymentTime { get; set; }
+
+        /// <summary>
+        /// 枪号
+        /// </summary>
+        public int NozzleNum { get; set; }
+
+        /// <summary>
+        /// 油品名
+        /// </summary>
+        public String OilName { get; set; }
+
+        /// <summary>
+        /// 支付状态
+        /// </summary>
+        public int PaymentStatus { get; set; }
+
+        /// <summary>
+        /// 支付类型
+        /// </summary>
+        public int? PayType { get; set; }
+
+        /// <summary>
+        /// 云端id
+        /// </summary>
+        public long? CloundOrderId { get; set; }
+
+        /// <summary>
+        /// 实际加油金额
+        /// </summary>
+        public decimal Amount { get; set; }
+
+        /// <summary>
+        /// 实际加油升数
+        /// </summary>
+        public decimal Volume { get; set; }
+
+        /// <summary>
+        /// 实际支付金额
+        /// </summary>
+        public decimal AmountPayable { get; set; }
+
+        /// <summary>
+        /// 是否已上传云端—— 0:未上传;1:已上传;2:不需要上传
+        /// </summary>
+        public int UploadState { get; set; }
+
+        /// <summary>
+        /// 是否删除——0:否;1:是
+        /// </summary>
+        public int IsDelete { get; set; }
+
+        public FccOrderInfo ToComponent()
+        {
+            return new FccOrderInfo
+            {
+                Ttc = this.Ttc,
+                AuthorizationTime = this.AuthorizationTime,
+                EndTime = this.EndTime,
+                PaymentTime = this.PaymentTime,
+                NozzleNum = this.NozzleNum,
+                OilName = this.OilName,
+                PaymentStatus = this.PaymentStatus,
+                PayType = this.PayType,
+                CloundOrderId = this.CloundOrderId,
+                Amount = this.Amount,
+                Volume = this.Volume,
+                AmountPayable = this.AmountPayable,
+                UploadState = this.UploadState,
+                IsDelete = this.IsDelete
+            };
+        }
+    }
+}

+ 2 - 2
src/FccLife.Web/Domain/FccStationInfo/FccStationInfo.cs → Edge.Core/Domain/FccStationInfo/FccStationInfo.cs

@@ -2,7 +2,7 @@
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Numerics;
 
-namespace FccLite.Web.Domain.FccStationInfo
+namespace Edge.Core.Domain.FccStationInfo
 {
     [Table("qr_station_info")]
     public class FccStationInfo
@@ -42,7 +42,7 @@ namespace FccLite.Web.Domain.FccStationInfo
         /// <summary>
         /// 云端地址
         /// </summary>
-        public string CloudService {  get; set; }
+        public string CloudService { get; set; }
 
         /// <summary>
         /// 云端  MQTT 地址

+ 15 - 15
src/FccLife.Web/Domain/FccStationInfo/Input/StationInfoInput.cs → Edge.Core/Domain/FccStationInfo/Input/StationInfoInput.cs

@@ -1,6 +1,6 @@
 using System.Numerics;
 
-namespace FccLite.Web.Domain.FccStationInfo.Input
+namespace Edge.Core.Domain.FccStationInfo.Input
 {
     public class StationInfoInput
     {
@@ -62,26 +62,26 @@ namespace FccLite.Web.Domain.FccStationInfo.Input
         public FccStationInfo? ToComponent()
         {
             if (IsNotNorm()) return null;
-            
+
             return new FccStationInfo()
             {
-                BuildId = this.BuildId,
-                Name = this.Name != null ? this.Name : "",
-                Longitude = (decimal)(this.Longitude != null ? this.Longitude : new decimal(0)),
-                Latitude = (decimal)(this.Latitude != null ? this.Latitude : new decimal(0)),
-                SmallProgram = this.SmallProgram,
-                CloudService = this.CloudService,
-                MqttService = this.MqttService,
-                IcardService = this.IcardService != null ? this.IcardService : "",
-                ServicePort = this.ServicePort,
-                WebSocketPort = this.WebSocketPort
+                BuildId = BuildId,
+                Name = Name != null ? Name : "",
+                Longitude = (decimal)(Longitude != null ? Longitude : new decimal(0)),
+                Latitude = (decimal)(Latitude != null ? Latitude : new decimal(0)),
+                SmallProgram = SmallProgram,
+                CloudService = CloudService,
+                MqttService = MqttService,
+                IcardService = IcardService != null ? IcardService : "",
+                ServicePort = ServicePort,
+                WebSocketPort = WebSocketPort
             };
         }
 
-        public Boolean IsNotNorm()
+        public bool IsNotNorm()
         {
-            return string.IsNullOrEmpty(this.BuildId) || !this.Longitude.HasValue || !this.Latitude.HasValue || string.IsNullOrEmpty(this.SmallProgram) || string.IsNullOrEmpty(this.CloudService)
-                || string.IsNullOrEmpty(this.MqttService) || string.IsNullOrEmpty(this.ServicePort) || string.IsNullOrEmpty(this.WebSocketPort);
+            return string.IsNullOrEmpty(BuildId) || !Longitude.HasValue || !Latitude.HasValue || string.IsNullOrEmpty(SmallProgram) || string.IsNullOrEmpty(CloudService)
+                || string.IsNullOrEmpty(MqttService) || string.IsNullOrEmpty(ServicePort) || string.IsNullOrEmpty(WebSocketPort);
         }
     }
 }

+ 17 - 1
src/FccLife.Web/Domain/FccStationInfo/Output/StationInfoOutput.cs → Edge.Core/Domain/FccStationInfo/Output/StationInfoOutput.cs

@@ -1,6 +1,6 @@
 using System.Numerics;
 
-namespace FccLite.Web.Domain.FccStationInfo.Output
+namespace Edge.Core.Domain.FccStationInfo.Output
 {
     /// <summary>
     /// 获取站点基本信息结果
@@ -20,6 +20,22 @@ namespace FccLite.Web.Domain.FccStationInfo.Output
 
     public class StationInfo
     {
+        public StationInfo() { }
+
+        public StationInfo(FccStationInfo fccStationInfo)
+        {
+            this.Id = fccStationInfo.Id;
+            this.BuildId = fccStationInfo.BuildId;
+            this.Name = fccStationInfo.Name;
+            this.Longitude = fccStationInfo.Longitude;
+            this.Latitude = fccStationInfo.Latitude;
+            this.SmallProgram = fccStationInfo.SmallProgram;
+            this.CloudService = fccStationInfo.CloudService;
+            this.MqttService = fccStationInfo.MqttService;
+            this.IcardService = fccStationInfo.IcardService;
+            this.ServicePort = fccStationInfo.ServicePort;
+            this.WebSocketPort = fccStationInfo.WebSocketPort;
+        }
         /// <summary>
         /// id
         /// </summary>

+ 1 - 1
src/FccLife.Web/Domain/FccStationInfo/Output/StationSetOutput.cs → Edge.Core/Domain/FccStationInfo/Output/StationSetOutput.cs

@@ -1,6 +1,6 @@
 using System.Numerics;
 
-namespace FccLite.Web.Domain.FccStationInfo.Output
+namespace Edge.Core.Domain.FccStationInfo.Output
 {
     /// <summary>
     /// 新增/修改/删除站点基本信息结果

+ 4 - 6
src/FccLife.Web/Domain/FccTankInfo/FccTankInfo.cs → Edge.Core/Domain/FccTankInfo/FccTankInfo.cs

@@ -1,9 +1,7 @@
-using FccLite.Web.Domain.FccNozzleInfo;
-using FccLite.Web.Domain.FccOilInfo;
-using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 
-namespace FccLite.Web.Domain.FccTankInfo
+namespace Edge.Core.Domain.FccTankInfo
 {
 
     [Table("qr_oil_tank")]
@@ -43,9 +41,9 @@ namespace FccLite.Web.Domain.FccTankInfo
         [ForeignKey("Station")]
         public long? StationId { get; set; }
 
-        public FccOilInfo.FccOilInfo? Oil { get; set; }
+        public FccOilInfo.FccOilInfo Oil { get; set; }
 
-        public FccStationInfo.FccStationInfo? Station { get; set; }
+        public FccStationInfo.FccStationInfo Station { get; set; }
 
         public ICollection<FccNozzleInfo.FccNozzleInfo> FccNozzleInfos { get; set; }
     }

+ 8 - 8
src/FccLife.Web/Domain/FccTankInfo/Input/AddTankInput.cs → Edge.Core/Domain/FccTankInfo/Input/AddTankInput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccTankInfo.Input
+namespace Edge.Core.Domain.FccTankInfo.Input
 {
     public class AddTankInput
     {
@@ -10,7 +10,7 @@
         /// <summary>
         /// 油罐号
         /// </summary>
-        public int Number {  get; set; }
+        public int Number { get; set; }
 
         /// <summary>
         /// 要关联的油品id
@@ -20,7 +20,7 @@
         /// <summary>
         /// 要关联的油品名
         /// </summary>
-        public String OilName { get; set; }
+        public string OilName { get; set; }
 
         /// <summary>
         /// 油罐容量
@@ -31,11 +31,11 @@
         {
             return new FccTankInfo()
             {
-                StationId = this.StationId,
-                Number = this.Number,
-                OilId = this.OilId,
-                OilName = this.OilName,
-                Capacity = this.Capacity
+                StationId = StationId,
+                Number = Number,
+                OilId = OilId,
+                OilName = OilName,
+                Capacity = Capacity
             };
         }
 

+ 3 - 3
src/FccLife.Web/Domain/FccTankInfo/Input/UpdateTankInput.cs → Edge.Core/Domain/FccTankInfo/Input/UpdateTankInput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccTankInfo.Input
+namespace Edge.Core.Domain.FccTankInfo.Input
 {
     public class UpdateTankInput
     {
@@ -20,13 +20,13 @@
         /// <summary>
         /// 要关联的油品名
         /// </summary>
-        public String? OilName { get; set; }
+        public string? OilName { get; set; }
 
         /// <summary>
         /// 油罐容量
         /// </summary>
         public decimal Capacity { get; set; }
 
-        
+
     }
 }

+ 2 - 3
src/FccLife.Web/Domain/FccTankInfo/Output/BaseTankInfoOutput.cs → Edge.Core/Domain/FccTankInfo/Output/BaseTankInfoOutput.cs

@@ -1,12 +1,11 @@
-
-namespace FccLite.Web.Domain.FccTankInfo.Output
+namespace Edge.Core.Domain.FccTankInfo.Output
 {
     public class BaseTankInfoOutput
     {
         /// <summary>
         /// 油罐id
         /// </summary>
-        public long Id {  get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// 油罐号

+ 1 - 1
src/FccLife.Web/Domain/FccTankInfo/Output/DetailsTankInfoOutput.cs → Edge.Core/Domain/FccTankInfo/Output/DetailsTankInfoOutput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccTankInfo.Output
+namespace Edge.Core.Domain.FccTankInfo.Output
 {
     public class DetailsTankInfoOutput
     {

+ 3 - 3
src/FccLife.Web/Domain/FccTankInfo/Output/SetTankInfoOutput.cs → Edge.Core/Domain/FccTankInfo/Output/SetTankInfoOutput.cs

@@ -1,4 +1,4 @@
-namespace FccLite.Web.Domain.FccTankInfo.Output
+namespace Edge.Core.Domain.FccTankInfo.Output
 {
     /// <summary>
     /// 新增、修改、删除油罐结果
@@ -8,12 +8,12 @@
         /// <summary>
         /// 结果
         /// </summary>
-        public Boolean Result { get; set; }
+        public bool Result { get; set; }
 
 
         /// <summary>
         /// 信息
         /// </summary>
-        public String Message { get; set; }
+        public string Message { get; set; }
     }
 }

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

@@ -6,6 +6,11 @@
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
+  <ItemGroup>
+    <Content Include="..\src\FccLife.Web\appsettings.Development.json" Link="appsettings.Development.json" />
+    <Content Include="..\src\FccLife.Web\appsettings.json" Link="appsettings.json" />
+  </ItemGroup>
+
   <ItemGroup>
     <PackageReference Include="AutoMapper" Version="13.0.1" />
     <PackageReference Include="Castle.Core" Version="5.1.1" />
@@ -15,6 +20,7 @@
     <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
     <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.10" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.20" />
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
@@ -25,8 +31,13 @@
     <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
     <PackageReference Include="Newtonsoft.Json.Schema" Version="3.0.14" />
     <PackageReference Include="NLog" Version="5.3.4" />
+    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
     <PackageReference Include="RestSharp" Version="112.1.0" />
     <PackageReference Include="System.IO.Ports" Version="8.0.0" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Domain\FccOrderInfo\Input\" />
+  </ItemGroup>
+
 </Project>

+ 18 - 0
Edge.Core/Processor/Communicator/IClinet.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Edge.Core.Processor.Communicator
+{
+    internal interface IClinet
+    {
+        /// <summary>
+        /// 获取链接客户端
+        /// </summary>
+        /// <returns></returns>
+        TcpClient? GetTcpClient();
+    }
+}

+ 2 - 0
Edge.Core/Processor/Communicator/ICommunicator.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net.Sockets;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -38,5 +39,6 @@ namespace Edge.Core.Processor.Communicator
         /// Used to get or set the abstract description for this comm.
         /// </summary>
         string Identity { get; set; }
+
     }
 }

+ 8 - 2
Edge.Core/Processor/Communicator/TcpServerCommunicator.cs

@@ -19,7 +19,7 @@ namespace Edge.Core.Processor.Communicator
     [MetaPartsDescriptor(
         "lang-zh-cn:Tcp(本程序为服务器端)通讯器lang-en-us:Tcp(as server) communicator",
         "lang-zh-cn:基于TCP/IP技术的通讯器, FC作为服务器端等待客户端连接lang-en-us:TCP/IP based communicator, FC as the server and wait for connections")]
-    public class TcpServerCommunicator<T> : ICommunicator<byte[], T> where T : MessageTemplateBase
+    public class TcpServerCommunicator<T> : IClinet, ICommunicator<byte[], T> where T : MessageTemplateBase
     {
         private CancellationTokenSource readAsyncCancellationTokenSource;
         private DateTime? lastReceiveMsgDataFromTcpClientDateTime;
@@ -32,7 +32,7 @@ namespace Edge.Core.Processor.Communicator
 
         private int localTcpServerListeningPort;
         protected TcpListener tcpListener;
-        private TcpClient exclusiveTcpClient;
+        public TcpClient exclusiveTcpClient { get; set; }
         private string exclusiveTcpClient_ClientRemoteEndPoint_Str = "?:?";
         //private bool isTcpConnBrokenDuringWrite = false;
         private object syncObject = new object();
@@ -350,5 +350,11 @@ namespace Edge.Core.Processor.Communicator
         {
             throw new NotImplementedException();
         }
+
+
+        public TcpClient? GetTcpClient()
+        {
+            return this.exclusiveTcpClient;
+        }
     }
 }

+ 10 - 0
Edge.Core/Processor/GenericDeviceProcessor.cs

@@ -1,4 +1,5 @@
 using Edge.Core.Parser;
+using Edge.Core.Parser.BinaryParser.MessageEntity;
 using Edge.Core.Processor.Communicator;
 using Edge.Core.Processor.Dispatcher.Attributes;
 using Microsoft.Extensions.DependencyInjection;
@@ -101,6 +102,15 @@ namespace Edge.Core.Processor
                 else
                     this.Communicator.Write(a.Message);
             };
+            this.Communicator.OnConnected += (communicator, a) =>
+            {
+                if(communicator is IClinet)
+                {
+                    IClinet clinet = (IClinet)communicator;
+                    handler.SetTcpClient(clinet?.GetTcpClient());
+                    handler.SendQRCode();
+                }
+            };
             this.Communicator.OnDataReceived += (s, a) =>
             {
                 lock (this.syncObject)

+ 19 - 1
Edge.Core/Processor/IDeviceHandler.cs

@@ -1,7 +1,9 @@
-using Edge.Core.Parser;
+using Edge.Core.Domain.FccOrderInfo;
+using Edge.Core.Parser;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net.Sockets;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -30,6 +32,22 @@ namespace Edge.Core.Processor
         /// <param name="parameters"></param>
         /// <returns>throw exception to indicates the test failed, otherwise, return a Completed task.</returns>
         Task Test(params object[] parameters) { throw new NotImplementedException("暂不支持测试"); }
+
+        /// <summary>
+        /// 发送二维码信息
+        /// </summary>
+        void SendQRCode() { }
+
+        /// <summary>
+        /// 发送实付金额给油机
+        /// </summary>
+        /// <param name="orderInfo"></param>
+        void SendActuallyPaid(FccOrderInfo orderInfo) { }
+
+        /// <summary>
+        /// 设置tcp连接客户端
+        /// </summary>
+        void SetTcpClient(TcpClient? client) { }
     }
 
     public abstract class TestableActivePollingDeviceHandler<TRaw, TMessage> : IDeviceHandler<TRaw, TMessage> where TMessage : MessageBase

+ 213 - 13
HengshanPaymentTerminal/HengshanPayTermHandler.cs

@@ -13,6 +13,15 @@ using Edge.Core.Processor.Dispatcher.Attributes;
 using Edge.Core.IndustryStandardInterface.Pump;
 using Edge.Core.IndustryStandardInterface.Pump.Fdc;
 using Edge.Core.Processor;
+using Edge.Core.Core.database;
+using Edge.Core.Domain.FccStationInfo.Output;
+using Edge.Core.Domain.FccNozzleInfo;
+using Edge.Core.Domain.FccNozzleInfo.Output;
+using System.Net.Sockets;
+using Edge.Core.Domain.FccOrderInfo;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities;
+using static Microsoft.AspNetCore.Hosting.Internal.HostingApplication;
 
 namespace HengshanPaymentTerminal
 {
@@ -56,6 +65,13 @@ namespace HengshanPaymentTerminal
 
         public Dictionary<int, List<int>> PumpSiteNozzleNoDict { get; private set; }
 
+        public MysqlDbContext MysqlDbContext { get; private set; }
+
+        public StationInfo stationInfo { get; set; }
+
+        public List<DetailsNozzleInfoOutput> nozzleInfoList { get; private set; }
+
+        public TcpClient? client { get; set; }
         #endregion
 
         #region Logger
@@ -112,7 +128,9 @@ namespace HengshanPaymentTerminal
             this.pumpNozzles = pumpNozzles;
             this.pumpSiteNozzleNos = pumpSiteNozzleNos;
             this.nozzleLogicIds = nozzleLogicIds;
+            this.MysqlDbContext = new MysqlDbContext();
 
+            GetInfo();
             AssociatedPumpIds = GetPumpIdList(pumpIds);
             pumpIdSubAddressDict = InitializePumpSubAddressMapping();
             PumpNozzlesDict = ParsePumpNozzlesList(pumpNozzles);
@@ -402,9 +420,12 @@ namespace HengshanPaymentTerminal
             
             switch(context.Incoming.Message.Handle)
             {
-                //通用
-                case 0x55:
-
+                //订单
+                case 0x18:
+                    //添加或修改数据库订单
+                    OrderFromMachine message = (OrderFromMachine)context.Incoming.Message;
+                    int row = UpLoadOrder(message);
+                    logger.Info($"receive order from machine,database had ${row} count change");
                     break;
             }
             
@@ -582,28 +603,207 @@ namespace HengshanPaymentTerminal
         #region 二维码加油机相关方法
 
         /// <summary>
-        /// 移除多余FA,有效数据中,一个 0xfa 会转成两个 0xfa
+        /// 获取站点信息
+        /// </summary>
+        private void GetInfo()
+        {
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = MysqlDbContext.FccStationInfos.FirstOrDefault();
+            if(fccStationInfo != null) stationInfo = new StationInfo(fccStationInfo);
+            nozzleInfoList = MysqlDbContext.NozzleInfos.ToList().Select(n => new DetailsNozzleInfoOutput(n)).ToList();
+        }
+
+        /// <summary>
+        /// 发送二维码信息给油机
+        /// </summary>
+        /// <param name="tcpClient"></param>
+        public void SendQRCode()
+        {
+            string? smallProgram = stationInfo?.SmallProgram;
+            if (smallProgram == null)
+            {
+                logger.Info($"can not get smallProgram link");
+                return;
+            }
+            System.Net.EndPoint? remoteEndPoint = this.client?.Client.RemoteEndPoint;
+            if (remoteEndPoint == null)
+            {
+                logger.Info($"can not get client");
+                return;
+            }
+            string[] remoteAddr = remoteEndPoint.ToString().Split(":");
+            string ip = remoteAddr[0];
+
+            List<DetailsNozzleInfoOutput> nozzles = nozzleInfoList.FindAll(nozzle => nozzle.Ip == ip);
+            foreach (var item in nozzles)
+            {
+                List<Byte> list = new List<Byte>();
+                byte[] commandAndNozzle = { 0x63, (byte)item.NozzleNum };
+                string qrCode = smallProgram + "/" + item.NozzleNum;
+                byte[] qrCodeBytes = Encoding.ASCII.GetBytes(qrCode);
+                list.AddRange(commandAndNozzle);
+                list.Add((byte)qrCodeBytes.Length);
+                list.AddRange(qrCodeBytes);
+                byte[] sendBytes = content2data(list.ToArray());
+                this.client?.Client.Send(sendBytes);
+            }
+        }
+
+        /// <summary>
+        /// 发送实付金额给油机
+        /// </summary>
+        /// <param name="orderInfo"></param>
+        public void SendActuallyPaid(FccOrderInfo orderInfo) 
+        {
+            List<Byte> list = new List<Byte>();
+            byte[] commandAndNozzle = { 0x19, (byte)orderInfo.NozzleNum };
+            byte[] ttcBytes = NumberToByteArrayWithPadding(orderInfo.Ttc, 4);
+
+            byte[] amountPayableBytes = FormatDecimal(orderInfo.AmountPayable);
+            list.AddRange(commandAndNozzle);    //添加命令字和枪号
+            list.AddRange(ttcBytes);            //添加流水号
+            list.Add(0x21);                     //由fcc推送实付金额表示该订单是二维码小程序支付的
+            list.AddRange(amountPayableBytes);  //添加实付金额
+            //添加3位交易金额1,3位交易金额2,2位优惠规则代码,10位卡应用号,4位消息鉴别码
+            list.AddRange(new byte[] { 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 });
+            byte[] sendBytes = content2data(list.ToArray());
+            this.client?.Client.Send(sendBytes);
+        }
+
+        public void SetTcpClinet(TcpClient? tcpClient)
+        {
+            this.client = tcpClient;
+        }
+
+        /// <summary>
+        /// 添加或修改订单
+        /// </summary>
+        /// <param name="order">接收到油机的订单信息</param>
+        /// <returns></returns>
+        public int UpLoadOrder(OrderFromMachine order)
+        {
+            FccOrderInfo orderByMessage = order.ToComponent();
+            FccOrderInfo? fccOrderInfo = MysqlDbContext.fccOrderInfos.FirstOrDefault(fccOrder => 
+                fccOrder.NozzleNum == order.nozzleNum && fccOrder.Ttc == order.ttc);
+            if (fccOrderInfo == null)
+            {
+                logger.Info($"receive order from machine,find order from database is null");
+                MysqlDbContext.fccOrderInfos.Add(orderByMessage);
+            }
+            else
+            {
+                logger.Info($"receive order from machine,padding data right now");
+                order.PaddingAuthorizationOrderData(fccOrderInfo);
+            }
+            return MysqlDbContext.SaveChanges();
+        }
+
+        /// <summary>
+        /// 传入有效数据,拼接为要发送给油机包
         /// </summary>
-        /// <param name="input"></param>
+        /// <param name="content"></param>
         /// <returns></returns>
-        private static Byte[] RemoveFA(Byte[] input)
+        public byte[] content2data(byte[] content)
+        {
+            List<byte> list = new List<byte>();
+            //目标地址,源地址,帧号
+            byte[] head = new byte[] { 0xFF, 0xE0, 0x01 };
+            byte[] length = Int2BCD(content.Length);
+            list.AddRange(head);
+            list.AddRange(length);
+            list.AddRange(content);
+            byte[] crc = HengshanCRC16.ComputeChecksumToBytes(list.ToArray());
+            list.AddRange(crc);
+            List<byte> addFAList = addFA(list);
+            addFAList.Insert(0, 0xFA);
+            return addFAList.ToArray();
+        }
+
+        public int Bcd2Int(byte byte1, byte byte2)
+        {
+            // 提取第一个字节的高四位和低四位  
+            int digit1 = (byte1 >> 4) & 0x0F; // 高四位  
+            int digit2 = byte1 & 0x0F;        // 低四位  
+
+            // 提取第二个字节的高四位和低四位  
+            int digit3 = (byte2 >> 4) & 0x0F; // 高四位  
+            int digit4 = byte2 & 0x0F;        // 低四位  
+
+            // 组合成一个整数  
+            int result = digit1 * 1000 + digit2 * 100 + digit3 * 10 + digit4;
+
+            return result;
+        }
+
+        public byte[] Int2BCD(int number)
+        {
+            // 提取千位、百位、十位和个位  
+            int thousands = number / 1000;
+            int hundreds = (number / 100) % 10;
+            int tens = (number / 10) % 10;
+            int units = number % 10;
+
+            // 将千位和百位组合成一个字节(千位在高四位,百位在低四位)  
+            byte firstByte = (byte)((thousands * 16) + hundreds); // 乘以16相当于左移4位  
+
+            // 将十位和个位组合成一个字节(十位在高四位,个位在低四位)  
+            byte secondByte = (byte)((tens * 16) + units);
+
+            // 返回结果数组  
+            return new byte[] { firstByte, secondByte };
+        }
+
+        public List<Byte> addFA(List<Byte> list)
         {
-            List<byte> resultList = new List<byte>();
+            List<byte> result = new List<byte>();
 
-            for (int i = 0; i < input.Length; i++)
+            foreach (byte b in list)
             {
-                if (i < input.Length - 1 && input[i] == 0xFA && input[i + 1] == 0xFA)
+                if (b == 0xFA)
                 {
-                    resultList.Add(0xFA);
-                    i++; // 跳过下一个元素  
+                    result.Add(0xFA);
+                    result.Add(0xFA);
                 }
                 else
                 {
-                    resultList.Add(input[i]);
+                    result.Add(b);
                 }
             }
 
-            return resultList.ToArray();
+            return result;
+        }
+
+        /// <summary>
+        /// 将数值转为byte[]
+        /// </summary>
+        /// <param name="value">数值</param>
+        /// <param name="length">数组长度,不够高位补0</param>
+        /// <returns></returns>
+        /// <exception cref="ArgumentException"></exception>
+        public static byte[] NumberToByteArrayWithPadding(int value, int length)
+        {
+            if (length < 0)
+            {
+                throw new ArgumentException("Length must be non-negative.");
+            }
+
+            // 创建一个指定长度的字节数组
+            byte[] paddedBytes = new byte[length];
+
+            // 确保是大端序
+            for (int i = 0; i < length && i < 4; i++)
+            {
+                paddedBytes[length - 1 - i] = (byte)(value >> (i * 8));
+            }
+
+            return paddedBytes;
+        }
+
+        public static byte[] FormatDecimal(decimal value)
+        {
+            // 四舍五入到两位小数
+            decimal roundedValue = Math.Round(value, 2, MidpointRounding.AwayFromZero);
+            int valueInt = (int)(roundedValue * 100m);
+            return NumberToByteArrayWithPadding(valueInt, 3); ;
         }
 
         // CRC16 constants  

+ 10 - 0
HengshanPaymentTerminal/MessageEntity/CommonMessage.cs

@@ -183,5 +183,15 @@ namespace HengshanPaymentTerminal.MessageEntity
 
             return result;
         }
+
+        public DateTime? bytes2DateTime(byte[] timeBytes)
+        {
+            string formate = "yyyyMMddHHmmss";
+            string timeStr = BitConverter.ToString(timeBytes).Replace("-", "");
+            DateTime parsedDateTime;
+
+            bool success = DateTime.TryParseExact(timeStr, formate, null, System.Globalization.DateTimeStyles.None, out parsedDateTime);
+            return success ? parsedDateTime : null;
+        }
     }
 }

+ 177 - 0
HengshanPaymentTerminal/MessageEntity/Incoming/OrderFromMachine.cs

@@ -0,0 +1,177 @@
+using Castle.Components.DictionaryAdapter.Xml;
+using Edge.Core.Domain.FccOrderInfo;
+using Edge.Core.Parser.BinaryParser.MessageEntity;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HengshanPaymentTerminal.MessageEntity.Incoming
+{
+    /// <summary>
+    /// 油机推送订单信息数据对象
+    /// </summary>
+    public class OrderFromMachine:CommonMessage
+    {
+        /// <summary>
+        /// 枪号
+        /// </summary>
+        public int nozzleNum { get; set; }
+
+        /// <summary>
+        /// 交易流水号
+        /// </summary>
+        public int ttc { get; set; }
+
+        /// <summary>
+        /// 加油时间
+        /// </summary>
+        public DateTime? dispenserTime { get; set; }
+
+        /// <summary>
+        /// 挂枪时间
+        /// </summary>
+        public DateTime? endTime { get; set; }
+
+        /// <summary>
+        /// 油品代码
+        /// </summary>
+        public string oilCode { get; set; }
+
+        /// <summary>
+        /// 付款方式/地点
+        /// </summary>
+        public byte payType { get; set; }
+
+        /// <summary>
+        /// 价格
+        /// </summary>
+        public decimal price { get; set; }
+
+        /// <summary>
+        /// 卡交易流水
+        /// </summary>
+        public int ctc { get; set; }
+
+        /// <summary>
+        /// 升累计
+        /// </summary>
+        public decimal volumeTotal { get; set; }
+
+        /// <summary>
+        /// 金额
+        /// </summary>
+        public decimal amount { get; set; }
+
+        /// <summary>
+        /// 升数
+        /// </summary>
+        public decimal volume { get; set; }
+
+        /// <summary>
+        /// 卡号
+        /// </summary>
+        public string cardNum { get; set; }
+
+        /// <summary>
+        /// 消息鉴别码
+        /// </summary>
+        public string MAC { get; set; }
+
+        public override byte[] ToCommonByteArray()
+        {
+            byte[] content = new byte[] { 0x55, this.Handle, 0x00, ((byte)RESULT.OVER) };
+            return content2data(content);
+        }
+
+        public override CommonMessage ToObject(byte[] datas)
+        {
+            getBaseData(datas);
+            this.nozzleNum = datas[7];
+            Span<byte> ttcSpan = datas.AsSpan(8, 4);
+            if (BitConverter.IsLittleEndian) ttcSpan.Reverse();
+            this.ttc = MemoryMarshal.Read<int>(ttcSpan);
+
+            Span<byte> dispenserSpan = datas.AsSpan(12, 7);
+            this.dispenserTime = bytes2DateTime(dispenserSpan.ToArray());
+
+            Span<byte> endSpan = datas.AsSpan(19, 7);
+            this.endTime = bytes2DateTime(endSpan.ToArray());
+
+            Span<byte> oilCodeSpan = datas.AsSpan(26, 2);
+            this.oilCode = BitConverter.ToString(oilCodeSpan.ToArray()).Replace("-", "");
+
+            this.payType = datas[28];
+
+            Span<byte> priceSpan = datas.AsSpan(29, 2);
+            if (BitConverter.IsLittleEndian) priceSpan.Reverse();
+            ushort priceShort = MemoryMarshal.Read<ushort>(priceSpan);
+            this.price = priceShort / 100;
+
+            Span<byte> ctcSpan = datas.AsSpan(31, 2);
+            if (BitConverter.IsLittleEndian) ctcSpan.Reverse();
+            this.ctc = MemoryMarshal.Read<ushort>(ctcSpan);
+
+            Span<byte> volumeTotalSpan = datas.AsSpan(33, 4);
+            if (BitConverter.IsLittleEndian) volumeTotalSpan.Reverse();
+            uint volumeTotalInt = MemoryMarshal.Read<UInt32>(volumeTotalSpan);
+            this.volumeTotal = volumeTotalInt / 100;
+
+            Span<byte> amountSpan = datas.AsSpan(37, 3);
+            if (BitConverter.IsLittleEndian) amountSpan.Reverse();
+            uint amountInt = MemoryMarshal.Read<UInt32>(amountSpan);
+            this.amount = amountInt / 100;
+
+            Span<byte> volumeSpan = datas.AsSpan(40, 3);
+            if (BitConverter.IsLittleEndian) volumeSpan.Reverse();
+            uint volumeInt = MemoryMarshal.Read<UInt32>(volumeSpan);
+            this.volume = volumeInt / 100;
+
+            Span<byte> cardNumSpan = datas.AsSpan(43, 10);
+            this.cardNum = BitConverter.ToString(cardNumSpan.ToArray()).Replace("-", "");
+
+            Span<byte> MACSpan = datas.AsSpan(53, 10);
+            this.MAC = BitConverter.ToString(MACSpan.ToArray()).Replace("-", "");
+
+            return this;
+        }
+
+        public FccOrderInfo ToComponent()
+        {
+            
+            return new FccOrderInfo
+            {
+                Ttc = this.ttc,
+                AuthorizationTime = this.dispenserTime,
+                EndTime = this.endTime,
+                NozzleNum = this.nozzleNum,
+                PayType = this.payType,
+                PaymentStatus = payType == (int)0x21 ? 0 : 4 ,
+                Amount = this.amount,
+                Volume = this.volume,
+                AmountPayable = this.amount,
+                UploadState = 0,
+                IsDelete = 0,
+                PaymentTime = null,
+                OilName = "",
+                CloundOrderId = null
+            };
+        }
+
+        /// <summary>
+        /// 补充授权订单数据
+        /// </summary>
+        /// <param name="order">当前数据库中订单数据</param>
+        /// <returns></returns>
+        public FccOrderInfo PaddingAuthorizationOrderData(FccOrderInfo order)
+        {
+            order.EndTime = this.endTime;
+            order.Amount = this.amount;
+            order.Volume = this.volume;
+            return order;
+        }
+    }
+}

+ 45 - 0
HengshanPaymentTerminal/Test/CalculatorTest.cs

@@ -80,5 +80,50 @@ namespace HengshanPaymentTerminal.Test
             // 返回结果数组  
             return new byte[] { firstByte, secondByte };
         }
+
+        [Fact]
+        private void stringFromate()
+        {
+            byte[] timeBytes = { 0x20, 0x24, 0x12, 0x09, 0x14, 0x02, 0x11 };
+            string time = 0x20.ToString("X2");
+            Console.WriteLine(time);
+        }
+
+        [Fact]
+        private void bytes2DateTime()
+        {
+            string formate = "yyyyMMddHHmmss";
+            string timeStr = "20241209141011";
+            DateTime parsedDateTime;
+
+            bool success = DateTime.TryParseExact(timeStr, formate, null, System.Globalization.DateTimeStyles.None, out parsedDateTime);
+            Console.WriteLine(parsedDateTime);
+        }
+
+        [Fact]
+        private void testNumber2Bytes()
+        {
+            byte[] bytes = HengshanPayTermHandler.NumberToByteArrayWithPadding(123123, 5);
+            string result = BitConverter.ToString(bytes).Replace("-", "");
+            Console.WriteLine(result);
+        }
+
+        [Fact]
+        private void testFormatDecimal()
+        {
+            byte[] bytes1 = HengshanPayTermHandler.FormatDecimal(new decimal(12.1));
+            string result1 = BitConverter.ToString(bytes1).Replace("-", "");
+            Console.WriteLine(result1);
+
+            byte[] bytes2 = HengshanPayTermHandler.FormatDecimal(new decimal(12.10));
+            string result2 = BitConverter.ToString(bytes2).Replace("-", "");
+            Console.WriteLine(result2);
+
+            byte[] bytes3 = HengshanPayTermHandler.FormatDecimal(new decimal(12.54));
+            string result3 = BitConverter.ToString(bytes3).Replace("-", "");
+            Console.WriteLine(result3);
+
+           
+        }
     }
 }

+ 4 - 4
src/FccLife.Web/Controller/ConfigController.cs

@@ -1,7 +1,7 @@
-using FccLite.Web.Domain.FccOilInfo.Input;
-using FccLite.Web.Domain.FccOilInfo.Ouput;
-using FccLite.Web.Domain.FccStationInfo.Input;
-using FccLite.Web.Domain.FccStationInfo.Output;
+using Edge.Core.Domain.FccOilInfo.Input;
+using Edge.Core.Domain.FccOilInfo.Ouput;
+using Edge.Core.Domain.FccStationInfo.Input;
+using Edge.Core.Domain.FccStationInfo.Output;
 using FccLite.Web.Services.FccOilInfo;
 using FccLite.Web.Services.FccStaionInfo;
 using Microsoft.AspNetCore.Http;

+ 12 - 10
src/FccLife.Web/Controller/TankController.cs

@@ -1,5 +1,7 @@
-using FccLite.Web.Domain.FccNozzleInfo.Input;
-using FccLite.Web.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccNozzleInfo.Input;
+using Edge.Core.Domain.FccNozzleInfo.Output;
+using Edge.Core.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccTankInfo.Output;
 using FccLite.Web.Services.FccNozzleInfo;
 using FccLite.Web.Services.FccTankInfo;
 using Microsoft.AspNetCore.Http;
@@ -23,42 +25,42 @@ namespace FccLite.Web.Controller
         [HttpGet("getBaseTankInfo")]
         public async Task<IActionResult> GetBaseTankInfo(long id)
         {
-            List<Domain.FccTankInfo.Output.BaseTankInfoOutput> baseTankInfos = await _tankInfoService.GetBaseTankByStationIdAsync(id);
+            List<BaseTankInfoOutput> baseTankInfos = await _tankInfoService.GetBaseTankByStationIdAsync(id);
             return Ok(baseTankInfos);
         }
 
         [HttpGet("getDetailsTankInfo")]
         public async Task<IActionResult> GetDetailsTankInfo(long id)
         {
-            Domain.FccTankInfo.Output.DetailsTankInfoOutput detailsTankInfoOutput = await _tankInfoService.GetDetailsTankByTankIdAsync(id);
+            DetailsTankInfoOutput detailsTankInfoOutput = await _tankInfoService.GetDetailsTankByTankIdAsync(id);
             return Ok(detailsTankInfoOutput);
         }
 
         [HttpPost("addDetailsTankInfo")]
         public async Task<IActionResult> AddDetailsTankInfo(AddTankInput addTankInput)
         {
-            Domain.FccTankInfo.Output.SetTankInfoOutput result = await _tankInfoService.AddDetailsTankAsync(addTankInput);
+            SetTankInfoOutput result = await _tankInfoService.AddDetailsTankAsync(addTankInput);
             return Ok(result);
         }
 
         [HttpPost("updateDetailsTankInfo")]
         public async Task<IActionResult> UpdateDetailsTankInfo(UpdateTankInput updateTankInput)
         {
-            Domain.FccTankInfo.Output.SetTankInfoOutput result = await _tankInfoService.UpdateDetailsTankAsync(updateTankInput);
+            SetTankInfoOutput result = await _tankInfoService.UpdateDetailsTankAsync(updateTankInput);
             return Ok(result);
         }
 
         [HttpPost("deleteTank")]
         public async Task<IActionResult> DeleteTank(long id)
         {
-            Domain.FccTankInfo.Output.SetTankInfoOutput result = await _tankInfoService.DeleteTankById(id);
+            SetTankInfoOutput result = await _tankInfoService.DeleteTankById(id);
             return Ok(result);
         }
 
         [HttpGet("getDetailsNozzleInfo")]
         public async Task<IActionResult> GetDetailsNozzleInfo(long id)
         {
-            Domain.FccNozzleInfo.Output.DetailsNozzleInfoOutput? result = await _nozzleInfnService.GetDetailsNozzleInfoById(id);
+            DetailsNozzleInfoOutput? result = await _nozzleInfnService.GetDetailsNozzleInfoById(id);
             if (result == null) return Ok("查找不到该油枪信息");
             return Ok(result);
         }
@@ -66,14 +68,14 @@ namespace FccLite.Web.Controller
         [HttpPost("uploadDetailsNozzleInfo")]
         public async Task<IActionResult> UploadDetailsNozzleInfo(UploadNozzleInfoInput uploadNozzleInfoInput)
         {
-            Domain.FccNozzleInfo.Output.SetNozzleInfoOutput result = await _nozzleInfnService.UploadDetailsNozzleInfo(uploadNozzleInfoInput);
+            SetNozzleInfoOutput result = await _nozzleInfnService.UploadDetailsNozzleInfo(uploadNozzleInfoInput);
             return Ok(result);
         }
 
         [HttpPost("deleteNozzle")]
         public async Task<IActionResult> DeleteNozzle(long id)
         {
-            Domain.FccNozzleInfo.Output.SetNozzleInfoOutput result = await _nozzleInfnService.DeleteNozzleInfoByID(id);
+            SetNozzleInfoOutput result = await _nozzleInfnService.DeleteNozzleInfoByID(id);
             return Ok(result);
         }
     }

+ 0 - 41
src/FccLife.Web/Core/database/MysqlDbContext.cs

@@ -1,41 +0,0 @@
-using FccLite.Web.Domain.FccNozzleInfo;
-using FccLite.Web.Domain.FccOilInfo;
-using FccLite.Web.Domain.FccStationInfo;
-using FccLite.Web.Domain.FccTankInfo;
-using Microsoft.EntityFrameworkCore;
-
-namespace FccLite.Web.utils.database
-{
-    public class MysqlDbContext:DbContext
-    {
-        public MysqlDbContext() { }
-
-        [ActivatorUtilitiesConstructor]
-        public MysqlDbContext(DbContextOptions<MysqlDbContext> options):base(options) { }
-
-        public DbSet<FccStationInfo> FccStationInfos { get; set; }
-
-        public DbSet<FccOilInfo> OilInfos { get; set; }
-
-        public DbSet<FccTankInfo> TankInfos { get; set; }
-
-        public DbSet<FccNozzleInfo> NozzleInfos { get; set; }
-
-        protected override void OnModelCreating(ModelBuilder modelBuilder)
-        {
-            modelBuilder.Entity<FccTankInfo>()
-                .HasOne(tankInfos => tankInfos.Oil)
-                .WithMany(oilInfo => oilInfo.FccTankInfo)
-                .HasForeignKey(tankInfo => tankInfo.OilId)
-                .OnDelete(DeleteBehavior.Restrict);
-                
-            modelBuilder.Entity<FccNozzleInfo>()
-                .HasOne(nozzleInfo => nozzleInfo.Tank)
-                .WithMany(tankInfo => tankInfo.FccNozzleInfos)
-                .HasForeignKey(nozzleInfo => nozzleInfo.TankId)
-                .OnDelete(DeleteBehavior.Restrict);
-
-            base.OnModelCreating(modelBuilder);
-        }
-    }
-}

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

@@ -6,11 +6,11 @@ using FccLite.Web.Services.FccNozzleInfo;
 using FccLite.Web.Services.FccOilInfo;
 using FccLite.Web.Services.FccStaionInfo;
 using FccLite.Web.Services.FccTankInfo;
-using FccLite.Web.utils.database;
 using Microsoft.EntityFrameworkCore;
 using Edge.Core.Processor.Dispatcher;
 using Edge.Core.Processor;
 using Edge.Core.Processor.Dispatcher.ProcessorLoader;
+using Edge.Core.Core.database;
 
 var builder = WebApplication.CreateBuilder(args);
  DefaultDispatcher processorsDispatcher = null;

+ 2 - 2
src/FccLife.Web/Repositories/FccNozzleInfo/INozzleInfoReposity.cs

@@ -1,4 +1,4 @@
-using FccLite.Web.Domain.FccNozzleInfo.Input;
+using Edge.Core.Domain.FccNozzleInfo.Input;
 
 namespace FccLite.Web.Repositories.FccNozzleInfo
 {
@@ -9,7 +9,7 @@ namespace FccLite.Web.Repositories.FccNozzleInfo
         /// </summary>
         /// <param name="id">油枪id</param>
         /// <returns></returns>
-        Task<Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id);
+        Task<Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id);
 
         /// <summary>
         /// 新增、修改油枪信息

+ 6 - 6
src/FccLife.Web/Repositories/FccNozzleInfo/NozzleInfoReposity.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccNozzleInfo.Input;
-using FccLite.Web.utils.database;
+using Edge.Core.Core.database;
+using Edge.Core.Domain.FccNozzleInfo.Input;
 using Microsoft.EntityFrameworkCore;
 
 namespace FccLite.Web.Repositories.FccNozzleInfo
@@ -20,7 +20,7 @@ namespace FccLite.Web.Repositories.FccNozzleInfo
         /// </summary>
         /// <param name="id">油枪id</param>
         /// <returns></returns>
-        public async Task<Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id)
+        public async Task<Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id)
         {
             return await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == id);
         }
@@ -34,7 +34,7 @@ namespace FccLite.Web.Repositories.FccNozzleInfo
         {
             if(uploadNozzleInfoInput.Id != null)
             {
-                Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == uploadNozzleInfoInput.Id);
+                Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == uploadNozzleInfoInput.Id);
                 if(fccNozzleInfo == null)
                 {
                     Logger.Info($"find nozzle info with id : {uploadNozzleInfoInput.Id} for update, result is null");
@@ -50,7 +50,7 @@ namespace FccLite.Web.Repositories.FccNozzleInfo
                 return await _dbContext.SaveChangesAsync();
             }
 
-            Domain.FccNozzleInfo.FccNozzleInfo info = uploadNozzleInfoInput.ToComponent();
+            Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo info = uploadNozzleInfoInput.ToComponent();
             _dbContext.NozzleInfos.Add(info);
             return await _dbContext.SaveChangesAsync();
         }
@@ -62,7 +62,7 @@ namespace FccLite.Web.Repositories.FccNozzleInfo
         /// <returns></returns>
         public async Task<int> DeleteNozzleInfoById(long id)
         {
-            Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == id);
+            Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == id);
             if (fccNozzleInfo == null)
             {
                 Logger.Info($"find nozzle info with id : {id} for delete,result is null");

+ 4 - 5
src/FccLife.Web/Repositories/FccOilInfo/IOilInfoReposity.cs

@@ -1,5 +1,4 @@
-
-using FccLite.Web.Domain.FccOilInfo.Input;
+using Edge.Core.Domain.FccOilInfo.Input;
 
 namespace FccLite.Web.Repositories.FccOilInfo
 {
@@ -10,7 +9,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// </summary>
         /// <param name="oilInfoInput"></param>
         /// <returns></returns>
-        Task<FccLite.Web.Domain.FccOilInfo.FccOilInfo> UploadOilInfo(OilInfoInput oilInfoInput);
+        Task<Edge.Core.Domain.FccOilInfo.FccOilInfo> UploadOilInfo(OilInfoInput oilInfoInput);
 
         /// <summary>
         /// 分页获取油品信息
@@ -21,7 +20,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// <param name="name">过滤信息——油品名</param>
         /// <param name="code">过滤信息——油品码</param>
         /// <returns></returns>
-        Task<IEnumerable<FccLite.Web.Domain.FccOilInfo.FccOilInfo>> GetPage(int page, int size, long? id, string? name, int? code);
+        Task<IEnumerable<Edge.Core.Domain.FccOilInfo.FccOilInfo>> GetPage(int page, int size, long? id, string? name, int? code);
 
         /// <summary>
         /// 通过id 删除油品信息
@@ -34,6 +33,6 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// 获取所有油品
         /// </summary>
         /// <returns></returns>
-        Task<List<Domain.FccOilInfo.FccOilInfo>> GetOilInfo();
+        Task<List<Edge.Core.Domain.FccOilInfo.FccOilInfo>> GetOilInfo();
     }
 }

+ 10 - 11
src/FccLife.Web/Repositories/FccOilInfo/OilInfoReposity.cs

@@ -1,6 +1,5 @@
-using FccLite.Web.Core.database;
-using FccLite.Web.Domain.FccOilInfo.Input;
-using FccLite.Web.utils.database;
+using Edge.Core.Core.database;
+using Edge.Core.Domain.FccOilInfo.Input;
 using Microsoft.EntityFrameworkCore;
 
 namespace FccLite.Web.Repositories.FccOilInfo
@@ -21,14 +20,14 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// <returns></returns>
         public async Task<bool> DeleteByID(long id)
         {
-            Domain.FccOilInfo.FccOilInfo? oilInfo = await _dbContext.OilInfos.FirstOrDefaultAsync(info => info.Id == id);
+            Edge.Core.Domain.FccOilInfo.FccOilInfo? oilInfo = await _dbContext.OilInfos.FirstOrDefaultAsync(info => info.Id == id);
             if (oilInfo == null)
             {
                 Logger.Info($"find oil info with id:{id} for delete,result is null");
                 return false;
             }
             //批量将油罐关联的油品置为null
-            List<Domain.FccTankInfo.FccTankInfo> fccTankInfos = await _dbContext.TankInfos.Where(info => info.OilId == oilInfo.Id).ToListAsync();
+            List<Edge.Core.Domain.FccTankInfo.FccTankInfo> fccTankInfos = await _dbContext.TankInfos.Where(info => info.OilId == oilInfo.Id).ToListAsync();
             foreach(var tank in fccTankInfos)
             {
                 _dbContext.Entry(tank).State = EntityState.Modified;
@@ -52,9 +51,9 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// <param name="name">过滤信息——油品名</param>
         /// <param name="code">过滤信息——油品码</param>
         /// <returns></returns>
-        public async Task<IEnumerable<Domain.FccOilInfo.FccOilInfo>> GetPage(int page, int size, long? id, string? name, int? code)
+        public async Task<IEnumerable<Edge.Core.Domain.FccOilInfo.FccOilInfo>> GetPage(int page, int size, long? id, string? name, int? code)
         {
-            IQueryable<Domain.FccOilInfo.FccOilInfo> query = _dbContext.OilInfos.AsQueryable();
+            IQueryable<Edge.Core.Domain.FccOilInfo.FccOilInfo> query = _dbContext.OilInfos.AsQueryable();
 
             query = query.WhereIf(id != null, info => info.Id == id);
             query = query.WhereIf(!string.IsNullOrEmpty(name), info => info.Name.Contains(name));
@@ -68,7 +67,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// </summary>
         /// <param name="oilInfoInput"></param>
         /// <returns></returns>
-        public async Task<Domain.FccOilInfo.FccOilInfo?> UploadOilInfo(OilInfoInput? oilInfoInput)
+        public async Task<Edge.Core.Domain.FccOilInfo.FccOilInfo?> UploadOilInfo(OilInfoInput? oilInfoInput)
         {
             if (oilInfoInput == null)
             {
@@ -77,7 +76,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
             }
             if(oilInfoInput.Id != null)
             {
-                Domain.FccOilInfo.FccOilInfo? info = await _dbContext.OilInfos.FindAsync(oilInfoInput.Id);
+                Edge.Core.Domain.FccOilInfo.FccOilInfo? info = await _dbContext.OilInfos.FindAsync(oilInfoInput.Id);
                 if (info == null)
                 {
                     Logger.Info($"find oil info with id: {oilInfoInput.Id} for update,result is null");
@@ -89,7 +88,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
                 await _dbContext.SaveChangesAsync();
                 return info;
             }
-            Domain.FccOilInfo.FccOilInfo fccOilInfo = oilInfoInput.ToComponent();
+            Edge.Core.Domain.FccOilInfo.FccOilInfo fccOilInfo = oilInfoInput.ToComponent();
             _dbContext.OilInfos.Add(fccOilInfo);
             await _dbContext.SaveChangesAsync();
             return fccOilInfo;
@@ -101,7 +100,7 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// </summary>
         /// <returns></returns>
         /// <exception cref="NotImplementedException"></exception>
-        public async Task<List<Domain.FccOilInfo.FccOilInfo>> GetOilInfo()
+        public async Task<List<Edge.Core.Domain.FccOilInfo.FccOilInfo>> GetOilInfo()
         {
             return await _dbContext.OilInfos.ToListAsync();
         }

+ 4 - 4
src/FccLife.Web/Repositories/FccStationInfo/IStationRepository.cs

@@ -1,4 +1,4 @@
-using FccLite.Web.Domain.FccStationInfo.Input;
+using Edge.Core.Domain.FccStationInfo.Input;
 
 namespace FccLite.Web.Repositories.FccStationInfo
 {
@@ -14,21 +14,21 @@ namespace FccLite.Web.Repositories.FccStationInfo
         /// <param name="longitude">过滤条件——经度</param>
         /// <param name="latitude">过滤条件——纬度</param>
         /// <returns></returns>
-        Task<IEnumerable<FccLite.Web.Domain.FccStationInfo.FccStationInfo>> GetPage(int page, int pageSize, long? id, string? name, decimal? longitude, decimal? latitude);
+        Task<IEnumerable<Edge.Core.Domain.FccStationInfo.FccStationInfo>> GetPage(int page, int pageSize, long? id, string? name, decimal? longitude, decimal? latitude);
 
         /// <summary>
         /// 通过 id 查找站点信息
         /// </summary>
         /// <param name="id">id</param>
         /// <returns>站点信息</returns>
-        Task<FccLite.Web.Domain.FccStationInfo.FccStationInfo?> FindByID(long id);
+        Task<Edge.Core.Domain.FccStationInfo.FccStationInfo?> FindByID(long id);
 
         /// <summary>
         /// 保存
         /// </summary>
         /// <param name="stationInfoInput">站点信息</param>
         /// <returns></returns>
-        Task<FccLite.Web.Domain.FccStationInfo.FccStationInfo> Save(StationInfoInput stationInfoInput);
+        Task<Edge.Core.Domain.FccStationInfo.FccStationInfo> Save(StationInfoInput stationInfoInput);
 
         /// <summary>
         /// 通过 id 删除站点信息

+ 10 - 11
src/FccLife.Web/Repositories/FccStationInfo/StationRepository.cs

@@ -1,6 +1,5 @@
-using FccLite.Web.Core.database;
-using FccLite.Web.Domain.FccStationInfo.Input;
-using FccLite.Web.utils.database;
+using Edge.Core.Core.database;
+using Edge.Core.Domain.FccStationInfo.Input;
 using Microsoft.AspNetCore.Cors.Infrastructure;
 using Microsoft.EntityFrameworkCore;
 using System.Net;
@@ -26,9 +25,9 @@ namespace FccLite.Web.Repositories.FccStationInfo
         /// <param name="id"></param>
         /// <returns></returns>
         /// <exception cref="NotImplementedException"></exception>
-        public async Task<Domain.FccStationInfo.FccStationInfo?> FindByID(long id)
+        public async Task<Edge.Core.Domain.FccStationInfo.FccStationInfo?> FindByID(long id)
         {
-            Domain.FccStationInfo.FccStationInfo? station = await _dbContext.FccStationInfos.FindAsync(id);
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? station = await _dbContext.FccStationInfos.FindAsync(id);
             return station;
         }
 
@@ -42,9 +41,9 @@ namespace FccLite.Web.Repositories.FccStationInfo
         /// <param name="longitude">过滤条件——经度</param>
         /// <param name="latitude">过滤条件——纬度</param>
         /// <returns></returns>
-        public async Task<IEnumerable<Domain.FccStationInfo.FccStationInfo>> GetPage(int page, int pageSize, long? id, string? name, decimal? longitude, decimal? latitude)
+        public async Task<IEnumerable<Edge.Core.Domain.FccStationInfo.FccStationInfo>> GetPage(int page, int pageSize, long? id, string? name, decimal? longitude, decimal? latitude)
         {
-            IQueryable<Domain.FccStationInfo.FccStationInfo> query = _dbContext.FccStationInfos.AsQueryable();
+            IQueryable<Edge.Core.Domain.FccStationInfo.FccStationInfo> query = _dbContext.FccStationInfos.AsQueryable();
             query = query.WhereIf(id != null, info => info.Id == id);
             query = query.WhereIf(!string.IsNullOrEmpty(name), info => info.Name.Contains(name));
             query = query.WhereIf(longitude != null, info => info.Longitude == longitude);
@@ -58,7 +57,7 @@ namespace FccLite.Web.Repositories.FccStationInfo
         /// </summary>
         /// <param name="stationInfoInput">站点信息</param>
         /// <returns></returns>
-        public async Task<Domain.FccStationInfo.FccStationInfo?> Save(StationInfoInput stationInfoInput)
+        public async Task<Edge.Core.Domain.FccStationInfo.FccStationInfo?> Save(StationInfoInput stationInfoInput)
         {
            
             if (stationInfoInput == null || stationInfoInput.IsNotNorm())
@@ -68,7 +67,7 @@ namespace FccLite.Web.Repositories.FccStationInfo
             }
             if (stationInfoInput.Id != null)
             {
-                Domain.FccStationInfo.FccStationInfo? station = await _dbContext.FccStationInfos.FindAsync(stationInfoInput.Id);
+                Edge.Core.Domain.FccStationInfo.FccStationInfo? station = await _dbContext.FccStationInfos.FindAsync(stationInfoInput.Id);
 
                 if (station == null)
                 {
@@ -89,7 +88,7 @@ namespace FccLite.Web.Repositories.FccStationInfo
                 _dbContext.SaveChanges();
                 return station;
             }
-            Domain.FccStationInfo.FccStationInfo? fccStationInfo = stationInfoInput.ToComponent();
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = stationInfoInput.ToComponent();
             _dbContext.FccStationInfos.Add(fccStationInfo);
             _dbContext.SaveChanges();
             return fccStationInfo;
@@ -102,7 +101,7 @@ namespace FccLite.Web.Repositories.FccStationInfo
         /// <returns></returns>
         public async Task<bool> DeleteByID(long id)
         {
-            Domain.FccStationInfo.FccStationInfo? info = await _dbContext.FccStationInfos.FindAsync(id);
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? info = await _dbContext.FccStationInfos.FindAsync(id);
             if (info == null)
             {
                 Logger.Info($"find station info with id:{id} for delete,result is null");

+ 4 - 5
src/FccLife.Web/Repositories/FccTankInfo/ITankReposity.cs

@@ -1,7 +1,6 @@
-using FccLite.Web.Domain.FccNozzleInfo.Output;
-using FccLite.Web.Domain.FccTankInfo;
-using FccLite.Web.Domain.FccTankInfo.Input;
-using FccLite.Web.Domain.FccTankInfo.Output;
+using Edge.Core.Domain.FccNozzleInfo.Output;
+using Edge.Core.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccTankInfo.Output;
 
 namespace FccLite.Web.Repositories.FccTankInfo
 {
@@ -19,7 +18,7 @@ namespace FccLite.Web.Repositories.FccTankInfo
         /// </summary>
         /// <param name="tankId">油罐id</param>
         /// <returns></returns>
-        Task<Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId);
+        Task<Edge.Core.Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId);
 
         /// <summary>
         /// 增加油罐

+ 8 - 8
src/FccLife.Web/Repositories/FccTankInfo/TankReposity.cs

@@ -1,7 +1,7 @@
-using FccLite.Web.Domain.FccNozzleInfo.Output;
-using FccLite.Web.Domain.FccTankInfo.Input;
-using FccLite.Web.Domain.FccTankInfo.Output;
-using FccLite.Web.utils.database;
+using Edge.Core.Core.database;
+using Edge.Core.Domain.FccNozzleInfo.Output;
+using Edge.Core.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccTankInfo.Output;
 using Microsoft.EntityFrameworkCore;
 
 namespace FccLite.Web.Repositories.FccTankInfo
@@ -35,14 +35,14 @@ namespace FccLite.Web.Repositories.FccTankInfo
         /// <returns></returns>
         public async Task<int> DeleteTankById(long id)
         {
-            Domain.FccTankInfo.FccTankInfo? tankInfo = await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == id);
+            Edge.Core.Domain.FccTankInfo.FccTankInfo? tankInfo = await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == id);
             if (tankInfo == null)
             {
                 Logger.Info($"find tank info with id :{id} for delete,result is null");
                 return 0;
             }
             //先批量删除所关联的油枪
-            List<Domain.FccNozzleInfo.FccNozzleInfo> fccNozzleInfos = await _dbContext.NozzleInfos.Where(info => info.TankId == tankInfo.Id).ToListAsync();
+            List<Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo> fccNozzleInfos = await _dbContext.NozzleInfos.Where(info => info.TankId == tankInfo.Id).ToListAsync();
             _dbContext.NozzleInfos.RemoveRange(fccNozzleInfos);
             //再删除油罐
             _dbContext.TankInfos.Remove(tankInfo);
@@ -81,7 +81,7 @@ namespace FccLite.Web.Repositories.FccTankInfo
         /// </summary>
         /// <param name="tankId">油罐id</param>
         /// <returns></returns>
-        public async Task<Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId)
+        public async Task<Edge.Core.Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId)
         {
             return await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == tankId);
         }
@@ -93,7 +93,7 @@ namespace FccLite.Web.Repositories.FccTankInfo
         /// <returns></returns>
         public async Task<int> UpdateDetailsTankAsync(UpdateTankInput updateTankInput)
         {
-            Domain.FccTankInfo.FccTankInfo? fccTankInfo = await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == updateTankInput.Id);
+            Edge.Core.Domain.FccTankInfo.FccTankInfo? fccTankInfo = await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == updateTankInput.Id);
             if (fccTankInfo == null)
             {
                 Logger.Info($"find tank info with id : {updateTankInput.Id} for update,result is null");

+ 2 - 2
src/FccLife.Web/Services/FccNozzleInfo/INozzleInfnService.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccNozzleInfo.Input;
-using FccLite.Web.Domain.FccNozzleInfo.Output;
+using Edge.Core.Domain.FccNozzleInfo.Input;
+using Edge.Core.Domain.FccNozzleInfo.Output;
 
 namespace FccLite.Web.Services.FccNozzleInfo
 {

+ 3 - 3
src/FccLife.Web/Services/FccNozzleInfo/NozzleInfoServiceImpl.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccNozzleInfo.Input;
-using FccLite.Web.Domain.FccNozzleInfo.Output;
+using Edge.Core.Domain.FccNozzleInfo.Input;
+using Edge.Core.Domain.FccNozzleInfo.Output;
 using FccLite.Web.Repositories.FccNozzleInfo;
 using FccLite.Web.Repositories.FccTankInfo;
 
@@ -48,7 +48,7 @@ namespace FccLite.Web.Services.FccNozzleInfo
         /// <returns></returns>
         public async Task<DetailsNozzleInfoOutput?> GetDetailsNozzleInfoById(long id)
         {
-            Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _nozzleInfoReposity.GetNozzleInfoById(id);
+            Edge.Core.Domain.FccNozzleInfo.FccNozzleInfo? fccNozzleInfo = await _nozzleInfoReposity.GetNozzleInfoById(id);
             if (fccNozzleInfo == null)
             {
                 Logger.Info($"find nozzle Info with id {id} for details ,result is null");

+ 2 - 2
src/FccLife.Web/Services/FccOilInfo/IOilInfoService.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccOilInfo.Input;
-using FccLite.Web.Domain.FccOilInfo.Ouput;
+using Edge.Core.Domain.FccOilInfo.Input;
+using Edge.Core.Domain.FccOilInfo.Ouput;
 
 namespace FccLite.Web.Services.FccOilInfo
 {

+ 4 - 4
src/FccLife.Web/Services/FccOilInfo/OilInfoServiceImpl.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccOilInfo.Input;
-using FccLite.Web.Domain.FccOilInfo.Ouput;
+using Edge.Core.Domain.FccOilInfo.Input;
+using Edge.Core.Domain.FccOilInfo.Ouput;
 using FccLite.Web.Repositories.FccOilInfo;
 using System.Text.Json;
 
@@ -50,7 +50,7 @@ namespace FccLite.Web.Services.FccOilInfo
         /// <returns></returns>
         public async Task<OilInfoOutput> GetPage(int page, int size, long? id, string? name, int? code)
         {
-            IEnumerable<Domain.FccOilInfo.FccOilInfo> enumerable = await _oilInfoReposity.GetPage(page, size, id, name, code);
+            IEnumerable<Edge.Core.Domain.FccOilInfo.FccOilInfo> enumerable = await _oilInfoReposity.GetPage(page, size, id, name, code);
 
             List<OilInfoOutput.OilInfo> oilInfos = enumerable.Select(info =>
                 new OilInfoOutput.OilInfo()
@@ -77,7 +77,7 @@ namespace FccLite.Web.Services.FccOilInfo
         /// <returns></returns>
         public async Task<OilInfoSetOutput> Save(OilInfoInput oilInfoInput)
         {
-            Domain.FccOilInfo.FccOilInfo fccOilInfo = await _oilInfoReposity.UploadOilInfo(oilInfoInput);
+            Edge.Core.Domain.FccOilInfo.FccOilInfo fccOilInfo = await _oilInfoReposity.UploadOilInfo(oilInfoInput);
             Logger.Info($"add or update oil info,{JsonSerializer.Serialize(fccOilInfo)}");
             if (fccOilInfo == null)
             {

+ 2 - 2
src/FccLife.Web/Services/FccStaionInfo/IStationService.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccStationInfo.Input;
-using FccLite.Web.Domain.FccStationInfo.Output;
+using Edge.Core.Domain.FccStationInfo.Input;
+using Edge.Core.Domain.FccStationInfo.Output;
 
 namespace FccLite.Web.Services.FccStaionInfo
 {

+ 5 - 5
src/FccLife.Web/Services/FccStaionInfo/StationServiceImpl.cs

@@ -1,7 +1,7 @@
-using FccLite.Web.Domain.FccStationInfo.Input;
-using FccLite.Web.Domain.FccStationInfo.Output;
+using Edge.Core.Domain.FccStationInfo;
+using Edge.Core.Domain.FccStationInfo.Input;
+using Edge.Core.Domain.FccStationInfo.Output;
 using FccLite.Web.Repositories.FccStationInfo;
-using FccLite.Web.utils.database;
 using System.Text.Json;
 
 namespace FccLite.Web.Services.FccStaionInfo
@@ -30,7 +30,7 @@ namespace FccLite.Web.Services.FccStaionInfo
         /// <returns></returns>
         public async Task<StationInfoOutput> GetBaseInfo(int page, int size, long? id, string? name, decimal? longitude, decimal? latitude)
         {
-            IEnumerable<Domain.FccStationInfo.FccStationInfo> enumerable = await _stationRepository.GetPage(page, size, id, name, longitude, latitude);
+            IEnumerable<FccStationInfo> enumerable = await _stationRepository.GetPage(page, size, id, name, longitude, latitude);
             
             List<StationInfo> fccStationInfos = enumerable.Select(stationInfo =>
                 new StationInfo()
@@ -63,7 +63,7 @@ namespace FccLite.Web.Services.FccStaionInfo
         /// <returns></returns>
         public async Task<StationSetOutput> UploadBaseInfo(StationInfoInput stationInfoInput)
         {
-            Domain.FccStationInfo.FccStationInfo info = await _stationRepository.Save(stationInfoInput);
+            FccStationInfo info = await _stationRepository.Save(stationInfoInput);
             Logger.Info($"add or update result: {JsonSerializer.Serialize(info)}");
             if (info == null)
             {

+ 2 - 2
src/FccLife.Web/Services/FccTankInfo/ITankInfoService.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccTankInfo.Input;
-using FccLite.Web.Domain.FccTankInfo.Output;
+using Edge.Core.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccTankInfo.Output;
 
 namespace FccLite.Web.Services.FccTankInfo
 {

+ 4 - 4
src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs

@@ -1,5 +1,5 @@
-using FccLite.Web.Domain.FccTankInfo.Input;
-using FccLite.Web.Domain.FccTankInfo.Output;
+using Edge.Core.Domain.FccTankInfo.Input;
+using Edge.Core.Domain.FccTankInfo.Output;
 using FccLite.Web.Repositories.FccOilInfo;
 using FccLite.Web.Repositories.FccTankInfo;
 
@@ -35,11 +35,11 @@ namespace FccLite.Web.Services.FccTankInfo
         /// <returns></returns>
         public async Task<DetailsTankInfoOutput> GetDetailsTankByTankIdAsync(long tankId)
         {
-            Domain.FccTankInfo.FccTankInfo? fccTankInfo = null;
+            Edge.Core.Domain.FccTankInfo.FccTankInfo? fccTankInfo = null;
             if (tankId > 0) fccTankInfo = await _tankReposity.GetDetailsTankByTankIdAsync(tankId);
             Logger.Info($"find tank info with id : {tankId} for details,can got result? {fccTankInfo != null} ");
 
-            List<Domain.FccOilInfo.FccOilInfo> oilInfos = await _oiilInfoReposity.GetOilInfo();
+            List<Edge.Core.Domain.FccOilInfo.FccOilInfo> oilInfos = await _oiilInfoReposity.GetOilInfo();
             List<DetailsTankInfoOutput.RelatableOil> relatableOils = oilInfos.Select(info => new DetailsTankInfoOutput.RelatableOil()
             {
                 OilId = info.Id,