Prechádzať zdrojové kódy

feat(web):油罐接口

Zhenghanjv 7 mesiacov pred
rodič
commit
aa1ea51be4
23 zmenil súbory, kde vykonal 860 pridanie a 12 odobranie
  1. 55 0
      src/FccLife.Web/Controller/TankController.cs
  2. 13 5
      src/FccLife.Web/Core/database/MysqlDbContext.cs
  3. 44 0
      src/FccLife.Web/Domain/FccNozzleInfo/FccNozzleInfo.cs
  4. 48 0
      src/FccLife.Web/Domain/FccNozzleInfo/Input/UploadNozzleInfoInput.cs
  5. 0 6
      src/FccLife.Web/Domain/FccNozzleInfo/NozzleInfo.cs
  6. 4 1
      src/FccLife.Web/Domain/FccOilInfo/FccOilInfo.cs
  7. 2 0
      src/FccLife.Web/Domain/FccStationInfo/FccStationInfo.cs
  8. 49 0
      src/FccLife.Web/Domain/FccTankInfo/FccTankInfo.cs
  9. 43 0
      src/FccLife.Web/Domain/FccTankInfo/Input/AddTankInput.cs
  10. 32 0
      src/FccLife.Web/Domain/FccTankInfo/Input/UpdateTankInput.cs
  11. 44 0
      src/FccLife.Web/Domain/FccTankInfo/Output/BaseTankInfoOutput.cs
  12. 48 0
      src/FccLife.Web/Domain/FccTankInfo/Output/DetailsTankInfoOutput.cs
  13. 19 0
      src/FccLife.Web/Domain/FccTankInfo/Output/SetTankInfoOutput.cs
  14. 4 0
      src/FccLife.Web/FccLite.Web.csproj
  15. 4 0
      src/FccLife.Web/Program.cs
  16. 28 0
      src/FccLife.Web/Repositories/FccNozzleInfo/INozzleInfoReposity.cs
  17. 75 0
      src/FccLife.Web/Repositories/FccNozzleInfo/NozzleInfoReposity.cs
  18. 6 0
      src/FccLife.Web/Repositories/FccOilInfo/IOilInfoReposity.cs
  19. 13 0
      src/FccLife.Web/Repositories/FccOilInfo/OilInfoReposity.cs
  20. 44 0
      src/FccLife.Web/Repositories/FccTankInfo/ITankReposity.cs
  21. 106 0
      src/FccLife.Web/Repositories/FccTankInfo/TankReposity.cs
  22. 43 0
      src/FccLife.Web/Services/FccTankInfo/ITankInfoService.cs
  23. 136 0
      src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs

+ 55 - 0
src/FccLife.Web/Controller/TankController.cs

@@ -0,0 +1,55 @@
+using FccLite.Web.Domain.FccTankInfo.Input;
+using FccLite.Web.Services.FccTankInfo;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace FccLite.Web.Controller
+{
+    [Route("qrFueling/tank")]
+    [ApiController]
+    public class TankController : ControllerBase
+    {
+        private readonly ITankInfoService _tankInfoService;
+        public TankController(ITankInfoService tankInfoService) 
+        {
+            _tankInfoService = tankInfoService;
+        }
+
+
+        [HttpGet("getBaseTankInfo")]
+        public async Task<IActionResult> GetBaseTankInfo(long id)
+        {
+            List<Domain.FccTankInfo.Output.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);
+            if(detailsTankInfoOutput == null) return Ok("查找不到该油罐详情");
+            return Ok(detailsTankInfoOutput);
+        }
+
+        [HttpPost("addDetailsTankInfo")]
+        public async Task<IActionResult> AddDetailsTankInfo(AddTankInput addTankInput)
+        {
+            Domain.FccTankInfo.Output.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);
+            return Ok(result);
+        }
+
+        [HttpPost("deleteTank")]
+        public async Task<IActionResult> DeleteTank(long id)
+        {
+            Domain.FccTankInfo.Output.SetTankInfoOutput result = await _tankInfoService.DeleteTankById(id);
+            return Ok(result);
+        }
+    }
+}

+ 13 - 5
src/FccLife.Web/Core/database/MysqlDbContext.cs

@@ -1,5 +1,7 @@
-using FccLite.Web.Domain.FccOilInfo;
+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
@@ -12,12 +14,18 @@ namespace FccLite.Web.utils.database
 
         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<FccStationInfo>(entity =>
-            //{
-            //    entity.ToTable("qr_station_info");
-            //});
+            modelBuilder.Entity<FccTankInfo>()
+                .HasOne(tankInfos => tankInfos.Oil)
+                .WithMany(oilInfo => oilInfo.FccTankInfo)
+                .HasForeignKey(tankInfo => tankInfo.OilId)
+                .OnDelete(DeleteBehavior.Restrict);
+                
             base.OnModelCreating(modelBuilder);
         }
     }

+ 44 - 0
src/FccLife.Web/Domain/FccNozzleInfo/FccNozzleInfo.cs

@@ -0,0 +1,44 @@
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace FccLite.Web.Domain.FccNozzleInfo
+{
+    [Table("qr_nozzle")]
+    public class FccNozzleInfo
+    {
+        /// <summary>
+        /// 油枪id
+        /// </summary>
+        [Key]
+        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 油机ip
+        /// </summary>
+        public string MachineIp { get; set; }
+
+        /// <summary>
+        /// 加油点
+        /// </summary>
+        public int FuelPoint { get; set; }
+
+        /// <summary>
+        /// 内部枪号
+        /// </summary>
+        public int InternalNum { get; set; }
+
+        /// <summary>
+        /// 外部枪号
+        /// </summary>
+        public int ExternalNum { get; set; }
+
+        /// <summary>
+        /// 油罐id
+        /// </summary>
+        [ForeignKey("Tank")]
+        public long TankId { get; set; }
+
+        public FccTankInfo.FccTankInfo Tank { get; set; }
+    }
+}

+ 48 - 0
src/FccLife.Web/Domain/FccNozzleInfo/Input/UploadNozzleInfoInput.cs

@@ -0,0 +1,48 @@
+
+namespace FccLite.Web.Domain.FccNozzleInfo.Input
+{
+    public class UploadNozzleInfoInput
+    {
+        /// <summary>
+        /// 油枪id
+        /// </summary>
+        public long? Id { get; set; }
+
+        /// <summary>
+        /// 油机ip
+        /// </summary>
+        public string MachineIp { get; set; }
+
+        /// <summary>
+        /// 加油点
+        /// </summary>
+        public int FuelPoint { get; set; }
+
+        /// <summary>
+        /// 内部枪号
+        /// </summary>
+        public int InternalNum { get; set; }
+
+        /// <summary>
+        /// 外部枪号
+        /// </summary>
+        public int ExternalNum { get; set; }
+
+        /// <summary>
+        /// 油罐id
+        /// </summary>
+        public long TankId { get; set; }
+
+        public FccNozzleInfo ToComponent()
+        {
+            return new FccNozzleInfo()
+            {
+                MachineIp = this.MachineIp,
+                FuelPoint = this.FuelPoint,
+                InternalNum = this.InternalNum,
+                ExternalNum = this.ExternalNum,
+                TankId = this.TankId
+            };
+        }
+    }
+}

+ 0 - 6
src/FccLife.Web/Domain/FccNozzleInfo/NozzleInfo.cs

@@ -1,6 +0,0 @@
-namespace FccLite.Web.Domain.FccNozzleInfo
-{
-    public class NozzleInfo
-    {
-    }
-}

+ 4 - 1
src/FccLife.Web/Domain/FccOilInfo/FccOilInfo.cs

@@ -1,4 +1,5 @@
-using System.ComponentModel.DataAnnotations;
+using FccLite.Web.Domain.FccTankInfo;
+using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 
 namespace FccLite.Web.Domain.FccOilInfo
@@ -27,5 +28,7 @@ namespace FccLite.Web.Domain.FccOilInfo
         /// 单价
         /// </summary>
         public decimal Price { get; set; }
+
+        public ICollection<FccTankInfo.FccTankInfo> FccTankInfo { get; set; }
     }
 }

+ 2 - 0
src/FccLife.Web/Domain/FccStationInfo/FccStationInfo.cs

@@ -63,5 +63,7 @@ namespace FccLite.Web.Domain.FccStationInfo
         /// 本地 fcc 与 fcc 页面 webSocket 端口
         /// </summary>
         public string WebSocketPort { get; set; }
+
+        public ICollection<FccTankInfo.FccTankInfo> FccTankInfo { get; set; }
     }
 }

+ 49 - 0
src/FccLife.Web/Domain/FccTankInfo/FccTankInfo.cs

@@ -0,0 +1,49 @@
+using FccLite.Web.Domain.FccOilInfo;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace FccLite.Web.Domain.FccTankInfo
+{
+
+    [Table("qr_oil_tank")]
+    public class FccTankInfo
+    {
+        /// <summary>
+        /// 油罐id
+        /// </summary>
+        [Key]
+        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 油罐号
+        /// </summary>
+        public int Number { get; set; }
+
+        /// <summary>
+        /// 油罐容量
+        /// </summary>
+        public decimal Capacity { get; set; }
+
+        /// <summary>
+        /// 关联油品名
+        /// </summary>
+        public string? OilName { get; set; }
+
+        /// <summary>
+        /// 关联油品id
+        /// </summary>
+        [ForeignKey("Oil")]
+        public long? OilId { get; set; }
+
+        /// <summary>
+        /// 关联站点id
+        /// </summary>
+        [ForeignKey("Station")]
+        public long? StationId { get; set; }
+
+        public FccOilInfo.FccOilInfo? Oil { get; set; }
+
+        public FccStationInfo.FccStationInfo? Station { get; set; }
+    }
+}

+ 43 - 0
src/FccLife.Web/Domain/FccTankInfo/Input/AddTankInput.cs

@@ -0,0 +1,43 @@
+namespace FccLite.Web.Domain.FccTankInfo.Input
+{
+    public class AddTankInput
+    {
+        /// <summary>
+        /// 关联的油站id
+        /// </summary>
+        public long StationId { get; set; }
+
+        /// <summary>
+        /// 油罐号
+        /// </summary>
+        public int Number {  get; set; }
+
+        /// <summary>
+        /// 要关联的油品id
+        /// </summary>
+        public long OilId { get; set; }
+
+        /// <summary>
+        /// 要关联的油品名
+        /// </summary>
+        public String OilName { get; set; }
+
+        /// <summary>
+        /// 油罐容量
+        /// </summary>
+        public decimal Capacity { get; set; }
+
+        public FccTankInfo ToComponent()
+        {
+            return new FccTankInfo()
+            {
+                StationId = this.StationId,
+                Number = this.Number,
+                OilId = this.OilId,
+                OilName = this.OilName,
+                Capacity = this.Capacity
+            };
+        }
+
+    }
+}

+ 32 - 0
src/FccLife.Web/Domain/FccTankInfo/Input/UpdateTankInput.cs

@@ -0,0 +1,32 @@
+namespace FccLite.Web.Domain.FccTankInfo.Input
+{
+    public class UpdateTankInput
+    {
+        /// <summary>
+        /// 要修改的油罐对应的id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 油罐号
+        /// </summary>
+        public int Number { get; set; }
+
+        /// <summary>
+        /// 要关联的油品id
+        /// </summary>
+        public long? OilId { get; set; }
+
+        /// <summary>
+        /// 要关联的油品名
+        /// </summary>
+        public String? OilName { get; set; }
+
+        /// <summary>
+        /// 油罐容量
+        /// </summary>
+        public decimal Capacity { get; set; }
+
+        
+    }
+}

+ 44 - 0
src/FccLife.Web/Domain/FccTankInfo/Output/BaseTankInfoOutput.cs

@@ -0,0 +1,44 @@
+
+namespace FccLite.Web.Domain.FccTankInfo.Output
+{
+    public class BaseTankInfoOutput
+    {
+        /// <summary>
+        /// 油罐id
+        /// </summary>
+        public long Id {  get; set; }
+
+        /// <summary>
+        /// 油罐号
+        /// </summary>
+        public int Number { get; set; }
+
+        /// <summary>
+        /// 关联油品名
+        /// </summary>
+        public string? OilName { get; set; }
+
+        /// <summary>
+        /// 关联油品id
+        /// </summary>
+        public long? OilId { get; set; }
+
+        /// <summary>
+        /// 当前关联的油枪
+        /// </summary>
+        public List<AssociatedNozzle> AssociatedNozzles { get; set; }
+
+        public class AssociatedNozzle
+        {
+            /// <summary>
+            /// 油枪id
+            /// </summary>
+            public long NozzleId { get; set; }
+
+            /// <summary>
+            /// 油枪号
+            /// </summary>
+            public int NozzleNum { get; set; }
+        }
+    }
+}

+ 48 - 0
src/FccLife.Web/Domain/FccTankInfo/Output/DetailsTankInfoOutput.cs

@@ -0,0 +1,48 @@
+namespace FccLite.Web.Domain.FccTankInfo.Output
+{
+    public class DetailsTankInfoOutput
+    {
+        /// <summary>
+        /// 油罐id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 油罐号
+        /// </summary>
+        public int Number { get; set; }
+
+        /// <summary>
+        /// 当前关联的油品id
+        /// </summary>
+        public long? AssociatedOilId { get; set; }
+
+        /// <summary>
+        /// 当前关联的油品名
+        /// </summary>
+        public string? AssociatedOilName { get; set; }
+
+        /// <summary>
+        /// 油罐容量
+        /// </summary>
+        public decimal Capacity { get; set; }
+
+        /// <summary>
+        /// 可关联的油品
+        /// </summary>
+        public List<RelatableOil> RelatableOils { get; set; }
+
+        public class RelatableOil
+        {
+            /// <summary>
+            /// 油品id
+            /// </summary>
+            public long OilId { get; set; }
+
+            /// <summary>
+            /// 油品名
+            /// </summary>
+            public string OilName { get; set; }
+        }
+    }
+}

+ 19 - 0
src/FccLife.Web/Domain/FccTankInfo/Output/SetTankInfoOutput.cs

@@ -0,0 +1,19 @@
+namespace FccLite.Web.Domain.FccTankInfo.Output
+{
+    /// <summary>
+    /// 新增、修改、删除油罐结果
+    /// </summary>
+    public class SetTankInfoOutput
+    {
+        /// <summary>
+        /// 结果
+        /// </summary>
+        public Boolean Result { get; set; }
+
+
+        /// <summary>
+        /// 信息
+        /// </summary>
+        public String Message { get; set; }
+    }
+}

+ 4 - 0
src/FccLife.Web/FccLite.Web.csproj

@@ -19,4 +19,8 @@
     </Content>
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Domain\FccNozzleInfo\Output\" />
+  </ItemGroup>
+
 </Project>

+ 4 - 0
src/FccLife.Web/Program.cs

@@ -1,7 +1,9 @@
 using FccLite.Web.Repositories.FccOilInfo;
 using FccLite.Web.Repositories.FccStationInfo;
+using FccLite.Web.Repositories.FccTankInfo;
 using FccLite.Web.Services.FccOilInfo;
 using FccLite.Web.Services.FccStaionInfo;
+using FccLite.Web.Services.FccTankInfo;
 using FccLite.Web.utils.database;
 using Microsoft.EntityFrameworkCore;
 
@@ -20,6 +22,8 @@ builder.Services.AddScoped<IStationService, StationServiceImpl>();
 builder.Services.AddScoped<IStationRepository, StationRepository>();
 builder.Services.AddScoped<IOilInfoService, OilInfoServiceImpl>();
 builder.Services.AddScoped<IOilInfoReposity, OilInfoReposity>();
+builder.Services.AddScoped<ITankInfoService, TankInfoServiceImpl>();
+builder.Services.AddScoped<ITankReposity, TankReposity>();
 
 //swagger
 builder.Services.AddSwaggerGen(c =>

+ 28 - 0
src/FccLife.Web/Repositories/FccNozzleInfo/INozzleInfoReposity.cs

@@ -0,0 +1,28 @@
+using FccLite.Web.Domain.FccNozzleInfo.Input;
+
+namespace FccLite.Web.Repositories.FccNozzleInfo
+{
+    public interface INozzleInfoReposity
+    {
+        /// <summary>
+        /// 根据油枪 id 找油枪信息
+        /// </summary>
+        /// <param name="id">油枪id</param>
+        /// <returns></returns>
+        Task<Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id);
+
+        /// <summary>
+        /// 新增、修改油枪信息
+        /// </summary>
+        /// <param name="uploadNozzleInfoInput">油枪信息</param>
+        /// <returns></returns>
+        Task<int> UploadNozzleInfo(UploadNozzleInfoInput uploadNozzleInfoInput);
+
+        /// <summary>
+        /// 根据id 删除油枪信息
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        Task<int> DeleteNozzleInfoById(long id);
+    }
+}

+ 75 - 0
src/FccLife.Web/Repositories/FccNozzleInfo/NozzleInfoReposity.cs

@@ -0,0 +1,75 @@
+using FccLite.Web.Domain.FccNozzleInfo.Input;
+using FccLite.Web.utils.database;
+using Microsoft.EntityFrameworkCore;
+
+namespace FccLite.Web.Repositories.FccNozzleInfo
+{
+    public class NozzleInfoReposity : INozzleInfoReposity
+    {
+        static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
+
+        private readonly MysqlDbContext _dbContext;
+
+        public NozzleInfoReposity(MysqlDbContext dbContext)
+        {
+            _dbContext = dbContext;
+        }
+
+        /// <summary>
+        /// 根据油枪 id 找油枪信息
+        /// </summary>
+        /// <param name="id">油枪id</param>
+        /// <returns></returns>
+        public async Task<Domain.FccNozzleInfo.FccNozzleInfo?> GetNozzleInfoById(long id)
+        {
+            return await _dbContext.NozzleInfos.FirstOrDefaultAsync(info => info.Id == id);
+        }
+
+        /// <summary>
+        /// 新增、修改油枪信息
+        /// </summary>
+        /// <param name="uploadNozzleInfoInput">油枪信息</param>
+        /// <returns></returns>
+        public async Task<int> UploadNozzleInfo(UploadNozzleInfoInput uploadNozzleInfoInput)
+        {
+            if(uploadNozzleInfoInput.Id != null)
+            {
+                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");
+                    return 0;
+                }
+                fccNozzleInfo.MachineIp = uploadNozzleInfoInput.MachineIp;
+                fccNozzleInfo.FuelPoint = uploadNozzleInfoInput.FuelPoint;
+                fccNozzleInfo.InternalNum = uploadNozzleInfoInput.InternalNum;
+                fccNozzleInfo.ExternalNum = uploadNozzleInfoInput.ExternalNum;
+                fccNozzleInfo.TankId = uploadNozzleInfoInput.TankId;
+                
+                return await _dbContext.SaveChangesAsync();
+            }
+
+            Domain.FccNozzleInfo.FccNozzleInfo info = uploadNozzleInfoInput.ToComponent();
+            _dbContext.NozzleInfos.Add(info);
+            return await _dbContext.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 根据id 删除油枪信息
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public async Task<int> DeleteNozzleInfoById(long id)
+        {
+            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");
+                return 0;
+            }
+
+            _dbContext.NozzleInfos.Remove(fccNozzleInfo);
+            return await _dbContext.SaveChangesAsync();
+        }
+    }
+}

+ 6 - 0
src/FccLife.Web/Repositories/FccOilInfo/IOilInfoReposity.cs

@@ -29,5 +29,11 @@ namespace FccLite.Web.Repositories.FccOilInfo
         /// <param name="id"></param>
         /// <returns></returns>
         Task<Boolean> DeleteByID(long id);
+
+        /// <summary>
+        /// 获取所有油品
+        /// </summary>
+        /// <returns></returns>
+        Task<List<Domain.FccOilInfo.FccOilInfo>> GetOilInfo();
     }
 }

+ 13 - 0
src/FccLife.Web/Repositories/FccOilInfo/OilInfoReposity.cs

@@ -32,6 +32,8 @@ namespace FccLite.Web.Repositories.FccOilInfo
             return true;
         }
 
+        
+
         /// <summary>
         /// 分页获取油品信息
         /// </summary>
@@ -83,5 +85,16 @@ namespace FccLite.Web.Repositories.FccOilInfo
             await _dbContext.SaveChangesAsync();
             return fccOilInfo;
         }
+
+
+        /// <summary>
+        /// 获取所有油品
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task<List<Domain.FccOilInfo.FccOilInfo>> GetOilInfo()
+        {
+            return await _dbContext.OilInfos.ToListAsync();
+        }
     }
 }

+ 44 - 0
src/FccLife.Web/Repositories/FccTankInfo/ITankReposity.cs

@@ -0,0 +1,44 @@
+using FccLite.Web.Domain.FccTankInfo;
+using FccLite.Web.Domain.FccTankInfo.Input;
+using FccLite.Web.Domain.FccTankInfo.Output;
+
+namespace FccLite.Web.Repositories.FccTankInfo
+{
+    public interface ITankReposity
+    {
+        /// <summary>
+        /// 统计站点 id 获取油罐基本信息
+        /// </summary>
+        /// <param name="stationId">站点id</param>
+        /// <returns></returns>
+        Task<List<BaseTankInfoOutput>> GetBaseTankByStationIdAsync(long stationId);
+
+        /// <summary>
+        /// 通过油罐id获取油罐详情信息
+        /// </summary>
+        /// <param name="tankId">油罐id</param>
+        /// <returns></returns>
+        Task<Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId);
+
+        /// <summary>
+        /// 增加油罐
+        /// </summary>
+        /// <param name="addTankInput">油罐信息</param>
+        /// <returns></returns>
+        Task<int> AddDetailsTankAsync(AddTankInput addTankInput);
+
+        /// <summary>
+        /// 修改油罐
+        /// </summary>
+        /// <param name="updateTankInput">油罐信息</param>
+        /// <returns></returns>
+        Task<int> UpdateDetailsTankAsync(UpdateTankInput updateTankInput);
+
+        /// <summary>
+        /// 通过油罐id删除油罐
+        /// </summary>
+        /// <param name="id">油罐id</param>
+        /// <returns></returns>
+        Task<int> DeleteTankById(long id);
+    }
+}

+ 106 - 0
src/FccLife.Web/Repositories/FccTankInfo/TankReposity.cs

@@ -0,0 +1,106 @@
+using FccLite.Web.Domain.FccTankInfo.Input;
+using FccLite.Web.Domain.FccTankInfo.Output;
+using FccLite.Web.utils.database;
+using Microsoft.EntityFrameworkCore;
+
+namespace FccLite.Web.Repositories.FccTankInfo
+{
+    public class TankReposity : ITankReposity
+    {
+        static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
+
+        private readonly MysqlDbContext _dbContext;
+
+        public TankReposity(MysqlDbContext dbContext)
+        {
+            _dbContext = dbContext;
+        }
+
+        /// <summary>
+        /// 增加油罐
+        /// </summary>
+        /// <param name="addTankInput">油罐信息</param>
+        /// <returns></returns>
+        public async Task<int> AddDetailsTankAsync(AddTankInput addTankInput)
+        {
+            _dbContext.TankInfos.Add(addTankInput.ToComponent());
+            return await _dbContext.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 通过油罐id删除油罐
+        /// </summary>
+        /// <param name="id">油罐id</param>
+        /// <returns></returns>
+        public async Task<int> DeleteTankById(long id)
+        {
+            Domain.FccTankInfo.FccTankInfo? info = await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == id);
+            if (info == null)
+            {
+                Logger.Info($"find tank info with id :{id} for delete,result is null");
+                return 0;
+            }
+            _dbContext.TankInfos.Remove(info);
+            return await _dbContext.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 统计站点 id 获取油罐基本信息
+        /// </summary>
+        /// <param name="stationId">站点id</param>
+        /// <returns></returns>
+        public async Task<List<BaseTankInfoOutput>> GetBaseTankByStationIdAsync(long stationId)
+        {
+            var query = from tank in _dbContext.TankInfos
+                        join nozzle in _dbContext.NozzleInfos
+                        on tank.Id equals nozzle.TankId
+                        into baseTankInfo
+                        select new BaseTankInfoOutput()
+                        {
+                            Id = tank.Id,
+                            Number = tank.Number,
+                            OilId = tank.OilId,
+                            OilName = tank.OilName,
+                            AssociatedNozzles = baseTankInfo.Select(info => new BaseTankInfoOutput.AssociatedNozzle()
+                            {
+                                NozzleId = info.Id,
+                                NozzleNum = info.ExternalNum
+                            }).ToList()
+                        };
+
+            return await query.ToListAsync();
+        }
+
+        /// <summary>
+        /// 通过油罐id获取油罐详情信息
+        /// </summary>
+        /// <param name="tankId">油罐id</param>
+        /// <returns></returns>
+        public async Task<Domain.FccTankInfo.FccTankInfo?> GetDetailsTankByTankIdAsync(long tankId)
+        {
+            return await _dbContext.TankInfos.FirstOrDefaultAsync(info => info.Id == tankId);
+        }
+
+        /// <summary>
+        /// 修改油罐
+        /// </summary>
+        /// <param name="updateTankInput">油罐信息</param>
+        /// <returns></returns>
+        public async Task<int> UpdateDetailsTankAsync(UpdateTankInput updateTankInput)
+        {
+            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");
+                return 0;
+            }
+
+            fccTankInfo.Number = updateTankInput.Number;
+            fccTankInfo.OilId = updateTankInput.OilId;
+            fccTankInfo.OilName = updateTankInput.OilName;
+            fccTankInfo.Capacity = updateTankInput.Capacity;
+
+            return await _dbContext.SaveChangesAsync();
+        }
+    }
+}

+ 43 - 0
src/FccLife.Web/Services/FccTankInfo/ITankInfoService.cs

@@ -0,0 +1,43 @@
+using FccLite.Web.Domain.FccTankInfo.Input;
+using FccLite.Web.Domain.FccTankInfo.Output;
+
+namespace FccLite.Web.Services.FccTankInfo
+{
+    public interface ITankInfoService
+    {
+        /// <summary>
+        /// 统计站点 id 获取油罐基本信息
+        /// </summary>
+        /// <param name="stationId">站点id</param>
+        /// <returns></returns>
+        Task<List<BaseTankInfoOutput>> GetBaseTankByStationIdAsync(long stationId);
+
+        /// <summary>
+        /// 通过油罐id获取油罐详情信息
+        /// </summary>
+        /// <param name="tankId">油罐id</param>
+        /// <returns></returns>
+        Task<DetailsTankInfoOutput?> GetDetailsTankByTankIdAsync(long tankId);
+
+        /// <summary>
+        /// 增加油罐
+        /// </summary>
+        /// <param name="addTankInput">油罐信息</param>
+        /// <returns></returns>
+        Task<SetTankInfoOutput> AddDetailsTankAsync(AddTankInput addTankInput);
+
+        /// <summary>
+        /// 修改油罐
+        /// </summary>
+        /// <param name="updateTankInput">油罐信息</param>
+        /// <returns></returns>
+        Task<SetTankInfoOutput> UpdateDetailsTankAsync(UpdateTankInput updateTankInput);
+
+        /// <summary>
+        /// 通过油罐id删除油罐
+        /// </summary>
+        /// <param name="id">油罐id</param>
+        /// <returns></returns>
+        Task<SetTankInfoOutput> DeleteTankById(long id);
+    }
+}

+ 136 - 0
src/FccLife.Web/Services/FccTankInfo/TankInfoServiceImpl.cs

@@ -0,0 +1,136 @@
+using FccLite.Web.Domain.FccTankInfo.Input;
+using FccLite.Web.Domain.FccTankInfo.Output;
+using FccLite.Web.Repositories.FccOilInfo;
+using FccLite.Web.Repositories.FccTankInfo;
+
+namespace FccLite.Web.Services.FccTankInfo
+{
+    public class TankInfoServiceImpl : ITankInfoService
+    {
+        static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
+
+        private readonly ITankReposity _tankReposity;
+
+        private readonly IOilInfoReposity _oiilInfoReposity;
+        public TankInfoServiceImpl(ITankReposity tankReposity,IOilInfoReposity oilInfoReposity)
+        {
+            _tankReposity = tankReposity;
+            _oiilInfoReposity = oilInfoReposity;
+        }
+
+        /// <summary>
+        /// 统计站点 id 获取油罐基本信息
+        /// </summary>
+        /// <param name="stationId">站点id</param>
+        /// <returns></returns>
+        public async Task<List<BaseTankInfoOutput>> GetBaseTankByStationIdAsync(long stationId)
+        {
+            return await _tankReposity.GetBaseTankByStationIdAsync(stationId);
+        }
+
+        /// <summary>
+        /// 通过油罐id获取油罐详情信息
+        /// </summary>
+        /// <param name="tankId">油罐id</param>
+        /// <returns></returns>
+        public async Task<DetailsTankInfoOutput?> GetDetailsTankByTankIdAsync(long tankId)
+        {
+            Domain.FccTankInfo.FccTankInfo? fccTankInfo = await _tankReposity.GetDetailsTankByTankIdAsync(tankId);
+            if (fccTankInfo == null)
+            {
+                Logger.Info($"find tank info with id : {tankId} for details,result is null");
+                return null;
+            }
+
+            List<Domain.FccOilInfo.FccOilInfo> oilInfos = await _oiilInfoReposity.GetOilInfo();
+            List<DetailsTankInfoOutput.RelatableOil> relatableOils = oilInfos.Select(info => new DetailsTankInfoOutput.RelatableOil()
+            {
+                OilId = info.Id,
+                OilName = info.Name
+            }).ToList();
+            Logger.Info($"current oil info count is {relatableOils.Count}");
+
+            return new DetailsTankInfoOutput()
+            {
+                Id = fccTankInfo.Id,
+                Number = fccTankInfo.Number,
+                AssociatedOilId = fccTankInfo.OilId,
+                AssociatedOilName = fccTankInfo.OilName,
+                Capacity = fccTankInfo.Capacity,
+                RelatableOils = relatableOils
+            };
+        }
+
+        /// <summary>
+        /// 增加油罐
+        /// </summary>
+        /// <param name="addTankInput">油罐信息</param>
+        /// <returns></returns>
+        public async Task<SetTankInfoOutput> AddDetailsTankAsync(AddTankInput addTankInput)
+        {
+            int row = await _tankReposity.AddDetailsTankAsync(addTankInput);
+            Logger.Info($"add tank info change:{row}");
+            if(row > 0)
+            {
+                return new SetTankInfoOutput()
+                {
+                    Result = true,
+                    Message = "保存成功"
+                };
+            }
+            return new SetTankInfoOutput()
+            {
+                Result = false,
+                Message = "保存失败"
+            };
+        }
+
+        /// <summary>
+        /// 修改油罐
+        /// </summary>
+        /// <param name="updateTankInput">油罐信息</param>
+        /// <returns></returns>
+        public async Task<SetTankInfoOutput> UpdateDetailsTankAsync(UpdateTankInput updateTankInput)
+        {
+            int row = await _tankReposity.UpdateDetailsTankAsync(updateTankInput);
+            Logger.Info($"update tank info change:{row}");
+            if (row > 0)
+            {
+                return new SetTankInfoOutput()
+                {
+                    Result = true,
+                    Message = "保存成功"
+                };
+            }
+            return new SetTankInfoOutput()
+            {
+                Result = false,
+                Message = "保存失败"
+            };
+        }
+
+        /// <summary>
+        /// 通过油罐id删除油罐
+        /// </summary>
+        /// <param name="id">油罐id</param>
+        /// <returns></returns>
+        public async Task<SetTankInfoOutput> DeleteTankById(long id)
+        {
+            int row = await _tankReposity.DeleteTankById(id);
+            if (row > 0)
+            {
+                return new SetTankInfoOutput()
+                {
+                    Result = true,
+                    Message = "删除成功"
+                };
+            }
+
+            return new SetTankInfoOutput()
+            {
+                Result = false,
+                Message = "删除失败"
+            };
+        }
+    }
+}