diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index cde1ca92..b4fc36b5 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -83,7 +83,7 @@ public class BalancesController : ControllerBase /// /// [HttpGet("recordByCostI")] - public async Task> RecordByCostIdAsync([FromQuery] BalanceRecordPageByCostIdRequest request) + public async Task> RecordByCostIdAsync([FromQuery] BalanceRecordPageByCostIdRequest request) { return await _balanceService.RecordByCostIdAsync(request); } diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs index 37124c20..327b6a1c 100644 --- a/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs @@ -3,12 +3,37 @@ using System.ComponentModel.DataAnnotations; namespace Dlhis.Canteen.Order.Request { - public class BalanceRecordPageByCostIdRequest : PageDto + public class BalanceRecordPageByCostIdRequest :PageDto { /// /// 成本中心 /// [Required(ErrorMessage = "成本中心号不能为空")] public string CostId { get; set; } + + /// + /// 学工号 + /// + public string UserCode { get; set; } + + /// + /// 开始日期 + /// + public DateTime? StartDatetime { get; set; } + + /// + /// 结束日期 + /// + public DateTime? EndDatetime { get; set; } + + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 人事范围 + /// + public string OriginTenantId { get; set; } } } diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordCostIdResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordCostIdResponse.cs new file mode 100644 index 00000000..0823b9a7 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordCostIdResponse.cs @@ -0,0 +1,94 @@ +namespace Dlhis.Canteen.Order.Response +{ + public class BalanceRecordCostIdResponse + { + /// + /// 成本中心 + /// + public string CostId { get; set; } + + /// + /// 早餐人数 + /// + + public int BreakfastNumberOfPeople { get; set; } + + /// + /// 早餐单价price + /// + + public decimal BreakfastPrice { get; set; } + + /// + /// 早餐金额 + /// + + public decimal BreakfastAmount { get; set; } + + /// + /// 午餐人数 + /// + + public int LunchNumberOfPeople { get; set; } + + /// + /// 午餐单价price + /// + + public decimal LunchPrice { get; set; } + + /// + /// 午餐金额 + /// + + public decimal LunchAmount { get; set; } + + /// + /// 晚餐人数 + /// + + public int DinnerNumberOfPeople { get; set; } + + /// + /// 晚餐单价price + /// + + public decimal DinnerPrice { get; set; } + + /// + /// 晚餐金额 + /// + + public decimal DinnerAmount { get; set; } + + /// + /// 宵夜人数 + /// + + public int LateNightNumberOfPeople { get; set; } + + /// + /// 宵夜单价price + /// + + public decimal LateNightPrice { get; set; } + + /// + /// 宵夜金额 + /// + + public decimal LateNightAmount { get; set; } + + /// + /// 总金额 + /// + + public decimal TotalAmount { get; set; } + + /// + /// 总人数 + /// + + public int TotalNumberOfPeople { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index 36f39e85..3e4b672c 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -14,7 +14,7 @@ public interface IBalanceService : IScopeDependency Task ObsoluteAsync(BalanceRecordObsoluteRequest request); - Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request); + Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request); Task> RecordPageDetailsAsync(BalanceRecordPageDetailsRequest request); diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index bb3c60e7..764466fd 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -73,45 +73,61 @@ public class BalanceService : IBalanceService /// /// /// - public async Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request) + public async Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request) { - var pageinfo = await _dbContext.Queryable() - .LeftJoin((record, department) => record.DepartmentNo == department.No) - .LeftJoin((record, department, bplace) => record.BusinessPlaceCode == bplace.Code) - .LeftJoin((record, department, bplace, bshift) => record.BusinessShiftCode == bshift.Code) - .LeftJoin((record, department, bplace, bshift, type) => record.BusinessShiftCode.ToString() == type.Code) - .Where(record => record.CostId == request.CostId) - .OrderBy(record => record.CreateTime, OrderByType.Desc) - .Select((record, department, bplace, bshift, type) => new BalanceRecordResponse - { - Id = record.Id, - Amount = record.Amount, - BusinessPlaceCode = record.BusinessPlaceCode, - BusinessShiftCode = record.BusinessShiftCode, - CostDate = record.CostDate, - CostId = record.CostId, - DepartmentNo = record.DepartmentNo, - DeviceInfo = record.DeviceInfo, - IP = record.IP, - UserNo = record.UserNo, - UserCode = record.UserCode, - Type = record.Type, - SubsidiesFromMonth = record.SubsidiesFromMonth, - Status = record.Status, - Source = record.Source, - No = record.No, - IsCostCrossTenant = record.IsCostCrossTenant, - OriginTenantId = record.OriginTenantId, - Name = record.Name, - DepartmentName = department.Name, - BusinessPlaceName = bplace.Name, - BusinessShiftName = type.Display, - CostDateTime = record.CreateTime // todo - }) - .ToPageListAsync(request); + var shiftCodeDict = await GetShiftCode(); - return pageinfo; + var paeginfos = await _dbContext.Queryable() + .WhereIF(!request.UserCode.IsEmpty(), record => record.UserCode == request.UserCode) + .WhereIF(!request.DepartmentNo.IsEmpty(), record => record.DepartmentNo == request.DepartmentNo) + .WhereIF(!request.OriginTenantId.IsEmpty(), record => record.OriginTenantId == request.OriginTenantId) + .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) + .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) + .Where(record => record.Type == BalanceRecordTypeEnumType.Out) + .OrderBy(record => record.CreateTime, OrderByType.Desc) + .ToListAsync(); + + var lst = new List(); + foreach (var costIdGroup in paeginfos.GroupBy(record => record.CostId)) + { + //每个costID + var obj = new BalanceRecordCostIdResponse + { + CostId = costIdGroup.Key + }; + + // 每个餐次人数 + obj.BreakfastNumberOfPeople = costIdGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]); + + obj.LunchNumberOfPeople = costIdGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]); + + obj.DinnerNumberOfPeople = costIdGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]); + + obj.LateNightNumberOfPeople = costIdGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]); + + //餐次金额 + obj.BreakfastAmount = costIdGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]).Sum(x => x.Amount); + + obj.LunchAmount = costIdGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]).Sum(x => x.Amount); + + obj.DinnerAmount = costIdGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]).Sum(x => x.Amount); + + obj.LateNightAmount = costIdGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]).Sum(x => x.Amount); + + // 每个餐次单价 + obj.BreakfastPrice = obj.BreakfastNumberOfPeople == 0 ? 0 : obj.BreakfastAmount / obj.BreakfastNumberOfPeople; + obj.LunchPrice = obj.LunchNumberOfPeople == 0 ? 0 : obj.LunchAmount / obj.LunchNumberOfPeople; + obj.DinnerPrice = obj.DinnerNumberOfPeople == 0 ? 0 : obj.DinnerAmount / obj.DinnerNumberOfPeople; + obj.LateNightPrice = obj.LateNightNumberOfPeople == 0 ? 0 : obj.LateNightAmount / obj.LateNightNumberOfPeople; + + // 总人数 总金额 + obj.TotalNumberOfPeople = obj.BreakfastNumberOfPeople + obj.LunchNumberOfPeople + obj.DinnerNumberOfPeople + obj.LateNightNumberOfPeople; + obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; + lst.Add(obj); + } + return lst; } + /// /// 消费明细 /// diff --git a/Src/Dlhis.Common/Controllers/ApkFIileController.cs b/Src/Dlhis.Common/Controllers/ApkFIileController.cs index 29215940..43ff9171 100644 --- a/Src/Dlhis.Common/Controllers/ApkFIileController.cs +++ b/Src/Dlhis.Common/Controllers/ApkFIileController.cs @@ -27,20 +27,20 @@ public class ApkFIileController : ControllerBase /// /// [HttpPost] - public async Task FormSingleFileUpload([FromForm] ApkRequest request) + public async Task FormSingleFileUpload([FromForm] ApkRequest request) { - await _apkFIileService.FormSingleFileUpload(request); + return await _apkFIileService.FormSingleFileUpload(request); } /// /// 文件下载 /// - /// + /// /// [HttpGet("url")] - public async Task RequestDownloadFile() + public async Task RequestDownloadFile(string fileName) { - return await _apkFIileService.RequestDownloadFile(); + return await _apkFIileService.RequestDownloadFile(fileName); } diff --git a/Src/Dlhis.Common/Packs/MinioPack.cs b/Src/Dlhis.Common/Packs/MinioPack.cs index b9a97279..636a2a7b 100644 --- a/Src/Dlhis.Common/Packs/MinioPack.cs +++ b/Src/Dlhis.Common/Packs/MinioPack.cs @@ -3,11 +3,11 @@ using Kurisu.SqlSugar.Extensions; using Microsoft.Extensions.DependencyInjection; using Minio; -//namespace Dlhis.Common.Packs -//{ -// public class MinioPack : BaseAppPack -// { -// public override bool IsBeforeUseRouting { get; } +namespace Dlhis.Common.Packs +{ + public class MinioPack : BaseAppPack + { + public override bool IsBeforeUseRouting { get; } public override void ConfigureServices(IServiceCollection services) { diff --git a/Src/Dlhis.Common/Services/IApkFIileService.cs b/Src/Dlhis.Common/Services/IApkFIileService.cs index f9240845..deb37bdf 100644 --- a/Src/Dlhis.Common/Services/IApkFIileService.cs +++ b/Src/Dlhis.Common/Services/IApkFIileService.cs @@ -10,13 +10,13 @@ namespace Dlhis.Common.Services; /// /// /// - Task FormSingleFileUpload(ApkRequest request); + Task FormSingleFileUpload(ApkRequest request); /// /// 文件下载 /// /// - Task RequestDownloadFile(); + Task RequestDownloadFile(string fileName); } diff --git a/Src/Dlhis.Common/Services/IMinioService.cs b/Src/Dlhis.Common/Services/IMinioService.cs index c09a08ce..0e7c4a56 100644 --- a/Src/Dlhis.Common/Services/IMinioService.cs +++ b/Src/Dlhis.Common/Services/IMinioService.cs @@ -4,8 +4,8 @@ namespace Dlhis.Common.Services { public interface IMinioService : IScopeDependency { - Task MinloUploadFileAsync(ApkRequest request); - Task MinloDownloadLinkAsync(); - Task MinloRemoveFileAsync(ApkRequest request); + Task MinloUploadFileAsync(ApkRequest request); + Task MinloDownloadLinkAsync(string fileName); + Task MinloRemoveFileAsync(string fileName); } } diff --git a/Src/Dlhis.Common/Services/Implements/ApkFIileService.cs b/Src/Dlhis.Common/Services/Implements/ApkFIileService.cs index 3a93e131..83d8523e 100644 --- a/Src/Dlhis.Common/Services/Implements/ApkFIileService.cs +++ b/Src/Dlhis.Common/Services/Implements/ApkFIileService.cs @@ -2,29 +2,19 @@ using Dlhis.Common.Response; using Dlhis.Entity.Common; using Kurisu.SqlSugar.Services; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Minio; -using Minio.DataModel; -using Minio.DataModel.Args; -using Minio.Exceptions; -using System.Xml.Linq; -using System; -using Google.Protobuf.WellKnownTypes; -using Minio.DataModel.Encryption; -using MySqlX.XDevAPI; -using Microsoft.AspNetCore.Http; -using System.IO; +using Mapster; namespace Dlhis.Common.Services.Implements; public class ApkFIileService : IApkFIileService { private readonly IMinioService _minioService; + private readonly IDbContext _dbContext; - public ApkFIileService( IMinioService minioService) + public ApkFIileService(IMinioService minioService, IDbContext dbContext) { _minioService = minioService; + _dbContext = dbContext; } /// @@ -32,18 +22,45 @@ public class ApkFIileService : IApkFIileService /// /// /// - public async Task FormSingleFileUpload(ApkRequest request) + public async Task FormSingleFileUpload(ApkRequest request) { - await _minioService.MinloUploadFileAsync(request); + //上传 + var fileUrl = await _minioService.MinloUploadFileAsync(request); + + string fileName = request.formFile.FileName; + + //更新数据库 + var entity = await _dbContext.Queryable().Where(x => x.Name == fileName).FirstAsync(); + if (entity == null) + { + var info = new ApkFileEntity + { + Name = fileName, + Url = fileUrl, + VersionCode = request.VersionCode, + UpdateMessage = request.UpdateMessage, + }; + await _dbContext.InsertAsync(info); + } + else + { + entity.Url = fileUrl; + entity.VersionCode = request.VersionCode; + entity.UpdateMessage = request.UpdateMessage; + await _dbContext.UpdateAsync(entity); + } + var newEntity = await _dbContext.Queryable().Where(x => x.Name == fileName).FirstAsync(); + var res = newEntity.Adapt(); + return res; } /// /// 文件下载 /// /// - public async Task RequestDownloadFile() + public async Task RequestDownloadFile(string fileName) { - return await _minioService.MinloDownloadLinkAsync(); + return await _minioService.MinloDownloadLinkAsync(fileName); } } diff --git a/Src/Dlhis.Common/Services/Implements/MinioService.cs b/Src/Dlhis.Common/Services/Implements/MinioService.cs index 78ea94b2..f505483d 100644 --- a/Src/Dlhis.Common/Services/Implements/MinioService.cs +++ b/Src/Dlhis.Common/Services/Implements/MinioService.cs @@ -12,15 +12,12 @@ namespace Dlhis.Common.Services.Implements { public class MinioService : IMinioService { - - private readonly IDbContext _dbContext; private readonly IMinioClient _client; private static string bucketName = "apk"; - public MinioService(IDbContext dbContext, IMinioClient client) + public MinioService( IMinioClient client) { - _dbContext = dbContext; _client = client; } @@ -30,55 +27,36 @@ namespace Dlhis.Common.Services.Implements /// /// /// - public async Task MinloUploadFileAsync(ApkRequest request) + public async Task MinloUploadFileAsync(ApkRequest request) { + string fileName = request.formFile.FileName; using (MemoryStream filestream = new MemoryStream()) { await request.formFile.CopyToAsync(filestream); filestream.Position = 0; - string fileName = request.formFile.FileName; - var res = await _client.PutObjectAsync(new PutObjectArgs() .WithBucket(bucketName) .WithObject(fileName) .WithStreamData(filestream) .WithObjectSize(filestream.Length)); - //"\"698d51a19d8a121ce581499d7b701668\"" - //更新数据库 - var entity = await _dbContext.Queryable().Where(x => x.Name == fileName).FirstAsync(); - if (entity == null) - { - var info = new ApkFileEntity - { - Name = fileName, - Url = fileName, - VersionCode = request.VersionCode, - UpdateMessage = request.UpdateMessage, - }; - await _dbContext.InsertAsync(info); - } - else - { - entity.Url = fileName; - entity.VersionCode = request.VersionCode; - entity.UpdateMessage = request.UpdateMessage; - } } + var filerl = await MinloDownloadLinkAsync(fileName); + return filerl; } /// /// 文件下载链接 /// /// - public async Task MinloDownloadLinkAsync() + public async Task MinloDownloadLinkAsync(string fileName) { try { var url = await _client.PresignedGetObjectAsync(new PresignedGetObjectArgs() .WithBucket(bucketName) - .WithObject("消费API逻辑.txt") + .WithObject(fileName) .WithExpiry(60 * 60 * 24));//链接时效 return url; } @@ -93,11 +71,10 @@ namespace Dlhis.Common.Services.Implements /// /// 单个删除文件 /// - /// + /// /// - public async Task MinloRemoveFileAsync(ApkRequest request) + public async Task MinloRemoveFileAsync(string fileName) { - string fileName = request.formFile.FileName; await _client.RemoveObjectAsync(new RemoveObjectArgs() .WithBucket(bucketName) .WithObject(fileName)); diff --git a/Src/Dlhis.Common/appsettings.json b/Src/Dlhis.Common/appsettings.json index 29a0d019..06b8f3e0 100644 --- a/Src/Dlhis.Common/appsettings.json +++ b/Src/Dlhis.Common/appsettings.json @@ -37,6 +37,16 @@ "ClientSecret": "123456" } }, + "MinIO": { + //服务器IP + "Endpoint": "http://192.168.199.124:9000", + //账号 + "AccessKey": "Zbjj05OFtR19e5TJopQU", + //密码 + "SecretKey": "UMXtNdZhufhAAyYJ3XND4cEgZNUsgOWtbUzksizK", + //apk默认存储桶 + "Bucket": "apk" + }, "Serilog": { "MinimumLevel": { "Default": "Information",