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