diff --git a/Src/Dlhis.Entity/SettlementSupplierMonthly.cs b/Src/Dlhis.Entity/SettlementSupplierMonthly.cs new file mode 100644 index 00000000..a08c6f3f --- /dev/null +++ b/Src/Dlhis.Entity/SettlementSupplierMonthly.cs @@ -0,0 +1,65 @@ +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity; + +/// +/// 供应商月结算表 +/// +[SugarTable("SettlementSupplierMonthly")] +public class SettlementSupplierMonthly : SugarBaseEntity, ITenantId +{ + /// + /// YYYYMM + /// + [SugarColumn(IsNullable = false)] + public string SettleMonth { get; set; } + + + [SugarColumn(IsNullable = false)] + public string SupplierName { get; set; } + + + [SugarColumn(IsNullable = false)] + public Guid BusinessPlaceCode { get; set; } + + + [SugarColumn(IsNullable = false)] + public string BusinessPlaceName { get; set; } + + /// + /// 期初 + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public decimal OpeningBalance { get; set; } + + /// + /// 消费总额 + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public decimal CostAmount { get; set; } + + /// + /// 结算金额 + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public decimal PaidAmount { get; set; } + + /// + /// 退款金额 + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public decimal RefundAmount { get; set; } + + /// + /// 期末 + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public decimal ClosingAmount { get; set; } + + [SugarColumn(IsNullable = false, DefaultValue = "1")] + public bool Valid { get; set; } + + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs index d4f9fc9c..91df64bb 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs @@ -109,4 +109,5 @@ public class DeviceUploadLogsController : ControllerBase } + } \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/AssignmentsController.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/AssignmentsController.cs index 32848b43..29dcbfa8 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/AssignmentsController.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/AssignmentsController.cs @@ -1,12 +1,16 @@ -using Dlhis.Entity.Basic.Entity; -using Dlhis.Entity.Basic.Enums; +using Dlhis.Entity; +using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; using Dlhis.ScheduledTask.TaskAssignment.Request; using Dlhis.ScheduledTask.TaskAssignment.Response; using Dlhis.ScheduledTask.TaskAssignment.Services; +using Dlhis.Sys.Api; +using Dlhis.Sys.Api.Request; using Kurisu.AspNetCore.CustomClass; +using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.UnifyResultAndValidation.Aop; using Microsoft.AspNetCore.Authorization; @@ -25,11 +29,13 @@ public class AssignmentsController : ControllerBase { private readonly IAssignmentService _assignmentService; private readonly IDbContext _dbContext; + private readonly IUserApi _userApi; - public AssignmentsController(IAssignmentService assignmentService, IDbContext dbContext) + public AssignmentsController(IAssignmentService assignmentService, IDbContext dbContext, IUserApi userApi) { _assignmentService = assignmentService; _dbContext = dbContext; + _userApi = userApi; } /// @@ -115,7 +121,6 @@ public class AssignmentsController : ControllerBase .ExecuteCommandAsync(); } - // // var userCodes = await _dbContext.Queryable().Where(x => x.ResignationDate.HasValue && x.ResignationDate >= s && x.ResignationDate <= e) // .Where(x => x.Type != GainfoUserTypeEnumType.External && x.Type != GainfoUserTypeEnumType.Outsource) @@ -150,4 +155,193 @@ public class AssignmentsController : ControllerBase // .ExecuteCommandAsync(); // } } + + [AllowAnonymous] + [IgnoreTenant] + [HttpPost("settlement/supplier/calc/{year:int}/{month:int}")] + public async Task CalcSettlementSupplier(int year, [FromQuery] int month) + { + if (month is < 1 or > 12) + { + throw new UserFriendlyException("月份错误"); + } + + //周期:上个月19号到本月18号 + var s = new DateTime(year, month, 19).AddMonths(-1); + var e = new DateTime(year, month, 19); + + var previousSettlementSupplierMonth = $"{s.Year}{s.Month:00}"; + var currentSettlementSupplierMonth = $"{e.Year}{e.Month:00}"; + + var businessSettlements = await _dbContext.Queryable() + .Where(x => x.CostDate >= s && x.CostDate < e) + .Where(x => x.Type == BalanceRecordTypeEnumType.Out && x.Status == BalanceRecordStatusEnumType.Valid) + .Where(x => x.TenantId == "2401" && x.BusinessPlaceCode.HasValue) + .GroupBy(x => new { x.BusinessPlaceCode }) + .Select(x => new + { + x.BusinessPlaceCode, + Amount = SqlFunc.IsNull(SqlFunc.AggregateSum(x.Amount), 0) + }) + .ToListAsync(); + + var businessPlaceCodes = businessSettlements.Select(x => x.BusinessPlaceCode).ToList(); + var businessPlaces = await _dbContext.Queryable() + .Where(x => businessPlaceCodes.Contains(x.Code)) + .Where(x => x.TenantId == "2401") + .ToListAsync(); + + var previousData = await _dbContext.Queryable() + .Where(x => x.SettleMonth == previousSettlementSupplierMonth) + .Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode)) + .Where(x => x.TenantId == "2401") + .ToListAsync(); + + var settlementSupplierMonthlies = businessSettlements.Select(x => + { + var businessPlace = businessPlaces.First(p => p.Code == x.BusinessPlaceCode); + var before = previousData.FirstOrDefault(p => p.BusinessPlaceCode == x.BusinessPlaceCode); + + return new SettlementSupplierMonthly + { + BusinessPlaceCode = x.BusinessPlaceCode!.Value, + BusinessPlaceName = businessPlace.Name, + SupplierName = businessPlace.Supplier, + + SettleMonth = currentSettlementSupplierMonth, + OpeningBalance = before?.ClosingAmount ?? 0, + + CostAmount = x.Amount, + PaidAmount = 0, + RefundAmount = 0, + ClosingAmount = (before?.ClosingAmount ?? 0) + x.Amount, + Valid = true, + TenantId = "2401" + }; + }).ToList(); + + await _dbContext.InsertAsync(settlementSupplierMonthlies); + } + + [AllowAnonymous] + [Transactional] + [IgnoreTenant] + [HttpPost("settlement/supplier/pay")] + public async Task ManuallySettlementSupplier1(ManuallySettlementSupplierRequest1 request) + { + var data = await _dbContext.Queryable() + .Where(x => x.SettleMonth == request.SettleMonth) + .Where(x => x.Valid) + .FirstAsync(); + + //复制data然后修改 + var newData = new SettlementSupplierMonthly + { + BusinessPlaceCode = data.BusinessPlaceCode, + BusinessPlaceName = data.BusinessPlaceName, + SupplierName = data.SupplierName, + SettleMonth = data.SettleMonth, + OpeningBalance = data.OpeningBalance, + CostAmount = data.CostAmount, + PaidAmount = request.Pay, + RefundAmount = 0, + ClosingAmount = data.ClosingAmount - request.Pay, + Valid = true, + TenantId = data.TenantId + }; + + if (newData.ClosingAmount < 0) + { + throw new UserFriendlyException("结算金额过大,导致期末金额小于0"); + } + + data.Valid = false; + await _dbContext.UpdateAsync(data); + await _dbContext.InsertAsync(newData); + } + + [AllowAnonymous] + [IgnoreTenant] + [HttpPost("settlement/supplier/refund")] + public async Task ManuallySettlementSupplier1(ManuallySettlementSupplierRequest2 request) + { + var data = await _dbContext.Queryable() + .Where(x => x.SettleMonth == request.SettleMonth) + .Where(x => x.Valid) + .FirstAsync(); + + //复制data然后修改 + var newData = new SettlementSupplierMonthly + { + BusinessPlaceCode = data.BusinessPlaceCode, + BusinessPlaceName = data.BusinessPlaceName, + SupplierName = data.SupplierName, + SettleMonth = data.SettleMonth, + OpeningBalance = data.OpeningBalance, + CostAmount = data.CostAmount, + PaidAmount = 0, + RefundAmount = request.Refund, + ClosingAmount = data.ClosingAmount - request.Refund, + Valid = true, + TenantId = data.TenantId + }; + + if (newData.ClosingAmount < 0) + { + throw new UserFriendlyException("退款金额过大,导致期末金额小于0"); + } + + data.Valid = false; + await _dbContext.UpdateAsync(data); + await _dbContext.InsertAsync(newData); + } + + [AllowAnonymous] + [IgnoreTenant] + [HttpPost("settlement/supplier/page")] + public async Task> GetSettlementSupplierPageAsync([FromQuery] SettlementSupplierPageRequest request) + { + var page = await _dbContext.Queryable() + .Where(x => x.SettleMonth == request.SettleMonth && x.TenantId == "2401") + .Where(x => x.Valid) + .OrderByDescending(x => x.CreateTime) + .Select() + .ToPageListAsync(request); + + try + { + var userIds = page.Data.Select(x => x.CreatedBy).Distinct().ToList(); + var userInfos = await _userApi.GetUserByIdsAsync(new IdsRequest { Ids = userIds }); + page.Data.ForEach(item => item.Creator = userInfos.FirstOrDefault(x => x.Id == item.CreatedBy)?.OperatorName); + } + catch (Exception) + { + } + + return page; + } + + [AllowAnonymous] + [IgnoreTenant] + [HttpPost("settlement/supplier/originPage")] + public async Task> GetSettlementSupplierOriginPageAsync([FromQuery] SettlementSupplierPageRequest request) + { + var page = await _dbContext.Queryable() + .Where(x => x.SettleMonth == request.SettleMonth && x.TenantId == "2401") + .OrderByDescending(x => x.CreateTime) + .Select() + .ToPageListAsync(request); + + try + { + var userIds = page.Data.Select(x => x.CreatedBy).Distinct().ToList(); + var userInfos = await _userApi.GetUserByIdsAsync(new IdsRequest { Ids = userIds }); + page.Data.ForEach(item => item.Creator = userInfos.FirstOrDefault(x => x.Id == item.CreatedBy)?.OperatorName); + } + catch (Exception) + { + } + + return page; + } } \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Request/ManuallySettlementSupplierRequest.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/ManuallySettlementSupplierRequest.cs new file mode 100644 index 00000000..f414fe08 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/ManuallySettlementSupplierRequest.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.ScheduledTask.TaskAssignment.Request; + +public class ManuallySettlementSupplierRequest1 +{ + [Required] + public string SettleMonth { get; set; } + + [Range(0, double.MaxValue, ErrorMessage = "结算金额必须大于等于0")] + public decimal Pay { get; set; } +} + +public class ManuallySettlementSupplierRequest2 +{ + [Required] + public string SettleMonth { get; set; } + + [Range(0, double.MaxValue, ErrorMessage = "退款金额必须大于等于0")] + public decimal Refund { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Request/SettlementSupplierPageRequest.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/SettlementSupplierPageRequest.cs new file mode 100644 index 00000000..4825cd13 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/SettlementSupplierPageRequest.cs @@ -0,0 +1,9 @@ +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.ScheduledTask.TaskAssignment.Request; + +public class SettlementSupplierPageRequest : PageDto +{ + public string SettleMonth { get; set; } + public List BusinessPlaceCodes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/SettlementSupplierPageResponse.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/SettlementSupplierPageResponse.cs new file mode 100644 index 00000000..8c471730 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/SettlementSupplierPageResponse.cs @@ -0,0 +1,47 @@ +namespace Dlhis.ScheduledTask.TaskAssignment.Response; + +public class SettlementSupplierPageResponse +{ + /// + /// YYYYMM + /// + public string SettleMonth { get; set; } + + public string SupplierName { get; set; } + + public Guid BusinessPlaceCode { get; set; } + + public string BusinessPlaceName { get; set; } + + /// + /// 期初 + /// + public decimal OpeningBalance { get; set; } + + /// + /// 消费总额 + /// + public decimal CostAmount { get; set; } + + /// + /// 结算金额 + /// + public decimal PaidAmount { get; set; } + + /// + /// 退款金额 + /// + public decimal RefundAmount { get; set; } + + /// + /// 期末 + /// + public decimal ClosingAmount { get; set; } + + public bool Valid { get; set; } + + public string TenantId { get; set; } + + public int CreatedBy { get; set; } + public string Creator { get; set; } +} \ No newline at end of file