diff --git a/SimpleAdmin.Application/Services/Medicinal/MedicinalService.cs b/SimpleAdmin.Application/Services/Medicinal/MedicinalService.cs index a7f8a5b..f939c05 100644 --- a/SimpleAdmin.Application/Services/Medicinal/MedicinalService.cs +++ b/SimpleAdmin.Application/Services/Medicinal/MedicinalService.cs @@ -187,7 +187,7 @@ public class MedicinalService : DbRepository, IMedicinalService decimal unitPrice = 0m; if (input.AddWeight > 0) { - unitPrice = Decimal.Round(input.TotalPrice / input.AddWeight, 2, MidpointRounding.AwayFromZero); + unitPrice = Decimal.Round(input.TotalPrice / input.AddWeight, 5, MidpointRounding.AwayFromZero); } // 添加记录 await Context.Insertable(new MedicinalAddLog @@ -239,7 +239,7 @@ public class MedicinalService : DbRepository, IMedicinalService // 更新记录 log.AddWeight = input.AddWeight; log.TotalPrice = input.TotalPrice; - log.UnitPrice = Decimal.Round(input.TotalPrice / input.AddWeight, 2, MidpointRounding.AwayFromZero); + log.UnitPrice = Decimal.Round(input.TotalPrice / input.AddWeight, 5, MidpointRounding.AwayFromZero); await Context.Updateable(log).ExecuteCommandAsync(); // 更新药材库存 diff --git a/SimpleAdmin.Application/Services/Prescription/IPrescriptionService.cs b/SimpleAdmin.Application/Services/Prescription/IPrescriptionService.cs index 2191722..0bce9c1 100644 --- a/SimpleAdmin.Application/Services/Prescription/IPrescriptionService.cs +++ b/SimpleAdmin.Application/Services/Prescription/IPrescriptionService.cs @@ -26,6 +26,12 @@ namespace SimpleAdmin.Application.Services.Prescription /// Task> GetPrescriptionList(PrescriptionQueryInput input); + /// + /// 获取所有处方的成本 + /// + /// + Task GetAllPrescriptionTotalCost(); + /// /// 获取处方详情 /// diff --git a/SimpleAdmin.Application/Services/Prescription/PrescriptionService.cs b/SimpleAdmin.Application/Services/Prescription/PrescriptionService.cs index a1156fc..f9ad682 100644 --- a/SimpleAdmin.Application/Services/Prescription/PrescriptionService.cs +++ b/SimpleAdmin.Application/Services/Prescription/PrescriptionService.cs @@ -305,7 +305,8 @@ public class PrescriptionService : DbRepository, IPrescriptionServ } } - + //var all= prescriptionPage.List.Sum(a => a.TotalMedicineCost); + //var cc = await GetAllPrescriptionTotalCost(); return prescriptionPage; } catch (Exception ex) @@ -314,6 +315,111 @@ public class PrescriptionService : DbRepository, IPrescriptionServ throw; } } + /// + /// 获取所有处方的总药材成本 + /// + /// + public async Task GetAllPrescriptionTotalCost() + { + // 1) 获取所有处方的 ID(按创建时间升序),并明确类型为 long + var allPrescriptionIds = await Context.Queryable() + .OrderBy(p => p.CreateTime) + .Select(p => p.Id) // 确保这里的 Id 类型是 long 或 long? + .ToListAsync(); + + if (!allPrescriptionIds.Any()) + return 0m; + + // 把 id 列表规范为 long 列表(处理可能的 nullable) + var allIdsLong = allPrescriptionIds.Select(id => Convert.ToInt64(id)).ToList(); + + // 2) 获取所有处方的药材使用明细 + var allPrescriptionHerbList = await Context.Queryable() + .Where(ph => allIdsLong.Contains(Convert.ToInt64(ph.PrescriptionId))) + .ToListAsync(); + + var allUsageGroups = allPrescriptionHerbList + .GroupBy(h => new { PrescriptionId = Convert.ToInt64(h.PrescriptionId), h.MedicinalId }) + .Select(g => new + { + PrescriptionId = g.Key.PrescriptionId, + g.Key.MedicinalId, + TotalUsedWeight = g.Sum(h => h.AmountG) + }) + .ToList(); + + // 3) 获取所有药材的 FIFO 入库记录 + var allMedicinalIds = allUsageGroups.Select(u => u.MedicinalId).Distinct().ToList(); + var fifoData = await GetMedicinalFifoData(allMedicinalIds); + + // 4) 按处方构建使用分组(key 为 long) + var groupedByPrescriptionAll = allUsageGroups + .GroupBy(u => u.PrescriptionId) + .ToDictionary(g => g.Key, g => g.ToList()); + + // 5) FIFO 偏移量 + var fifoOffsets = new Dictionary(); + + decimal totalSum = 0m; + + // 6) 获取每张处方的人员类型(IsRelative: bool),并把 key 明确为 long,避免类型不匹配 + var personTmp = await Context.Queryable() + .LeftJoin((p, pe) => p.PersonId == pe.Id) + .Where(p => allIdsLong.Contains(Convert.ToInt64(p.Id))) + .Select((p, pe) => new + { + Id = p.Id, + IsRelative = pe.EmployeeId != null + }) + .ToListAsync(); + + // 明确转换 key 为 long(处理 nullable) + var personInfoDict = personTmp + .ToDictionary(x => Convert.ToInt64(x.Id), x => x.IsRelative); + + // 7) FIFO 成本计算(按时间顺序已由 allIdsLong 保持) + foreach (var pidObj in allIdsLong) + { + long pid = pidObj; // 明确 pid 是 long + + decimal presCost = 0m; + + if (groupedByPrescriptionAll.TryGetValue(pid, out var usages)) + { + foreach (var usage in usages) + { + var cost = CalculateHerbCostByFifoWithOffset( + fifoData, + fifoOffsets, + usage.MedicinalId, + usage.TotalUsedWeight + ); + + presCost += cost; + } + } + + // 处方级别保留 4 位小数 + presCost = Math.Round(presCost, 4, MidpointRounding.AwayFromZero); + + // 家属加价 10%(若字典缺失,默认不是家属) + var isRelative = personInfoDict.TryGetValue(pid, out var rel) && rel; + if (isRelative) + { + presCost = Math.Round(presCost * 1.1m, 2, MidpointRounding.AwayFromZero); + } + else + { + presCost = Math.Round(presCost, 2, MidpointRounding.AwayFromZero); + } + + totalSum += presCost; + } + + return totalSum; + } + + /// diff --git a/SimpleAdmin.Application/SimpleAdmin.Application.xml b/SimpleAdmin.Application/SimpleAdmin.Application.xml index f7a66db..4676701 100644 --- a/SimpleAdmin.Application/SimpleAdmin.Application.xml +++ b/SimpleAdmin.Application/SimpleAdmin.Application.xml @@ -181,6 +181,12 @@ 筛选条件 + + + 获取所有处方的成本 + + + 获取处方详情 @@ -794,14 +800,20 @@ 需要计算的药材ID列表 + + + 获取所有处方的总药材成本 + + + 获取药材FIFO计算所需的基础数据(入库记录) - + - 按FIFO规则计算单种药材的使用成本 + 按FIFO规则计算单种药材的使用成本(累计消耗) diff --git a/SimpleAdmin.SqlSugar/SqlSugar.Development.json b/SimpleAdmin.SqlSugar/SqlSugar.Development.json index 02f697e..b9f6e60 100644 --- a/SimpleAdmin.SqlSugar/SqlSugar.Development.json +++ b/SimpleAdmin.SqlSugar/SqlSugar.Development.json @@ -5,9 +5,9 @@ "ConnectionStrings": [ { "ConfigId": "SimpleAdmin", //租户ID - "ConnectionString": "AllowLoadLocalInfile=true;Server=58.17.132.2;User ID=admin;Password=so^867z$4S;Port=16306;Database=weibingjutest;CharSet=utf8mb4;pooling=true;SslMode=None;min pool size=1;Connection Timeout=30;Pooling=false", //连接字符串 - "DbType": "MySql", //数据库类型 - "IsAutoCloseConnection": true //是否自动释放 + "ConnectionString": "AllowLoadLocalInfile=true;Server=58.17.132.2;User ID=admin;Password=so^867z$4S;Port=16306;Database=WeiBingJu;CharSet=utf8mb4;pooling=true;SslMode=None;min pool size=1;Connection Timeout=30;Pooling=false", //连接字符串 + "DbType": "MySql", //数据库类型 WeiBingJu + "IsAutoCloseConnection": true //是否自动释放 weibingjutest } // { // "ConfigId": "SimpleAdmin", //租户ID diff --git a/SimpleAdmin.Web.Core/Controllers/Application/WeiBingJu/PrescriptionController.cs b/SimpleAdmin.Web.Core/Controllers/Application/WeiBingJu/PrescriptionController.cs index ef1d839..6b86a28 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/WeiBingJu/PrescriptionController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/WeiBingJu/PrescriptionController.cs @@ -35,6 +35,16 @@ public class PrescriptionController : IDynamicApiController return await _service.GetPrescriptionList(input); } + /// + /// 获取处方总列表使用成本 + /// + [HttpGet("gettotalcost")] + [DisplayName("获取处方总列表使用成本")] + public async Task GetAllPrescriptionTotalCost() + { + return await _service.GetAllPrescriptionTotalCost(); + } + /// /// 获取处方详情 /// diff --git a/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index a103e0e..5ecb907 100644 --- a/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -395,6 +395,11 @@ 获取处方列表 + + + 获取处方总列表使用成本 + + 获取处方详情