tmp 供应商结算

This commit is contained in:
2025-10-15 18:19:38 +08:00
parent a572d3258a
commit 6615033983
6 changed files with 341 additions and 4 deletions

View File

@@ -109,4 +109,5 @@ public class DeviceUploadLogsController : ControllerBase
}
}

View File

@@ -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;
}
/// <summary>
@@ -115,7 +121,6 @@ public class AssignmentsController : ControllerBase
.ExecuteCommandAsync();
}
//
// var userCodes = await _dbContext.Queryable<GainfoLeaveEntity>().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<BalanceRecordEntity>()
.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<BusinessPlaceEntity>()
.Where(x => businessPlaceCodes.Contains(x.Code))
.Where(x => x.TenantId == "2401")
.ToListAsync();
var previousData = await _dbContext.Queryable<SettlementSupplierMonthly>()
.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<SettlementSupplierMonthly>()
.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<SettlementSupplierMonthly>()
.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<Pagination<SettlementSupplierPageResponse>> GetSettlementSupplierPageAsync([FromQuery] SettlementSupplierPageRequest request)
{
var page = await _dbContext.Queryable<SettlementSupplierMonthly>()
.Where(x => x.SettleMonth == request.SettleMonth && x.TenantId == "2401")
.Where(x => x.Valid)
.OrderByDescending(x => x.CreateTime)
.Select<SettlementSupplierPageResponse>()
.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<Pagination<SettlementSupplierPageResponse>> GetSettlementSupplierOriginPageAsync([FromQuery] SettlementSupplierPageRequest request)
{
var page = await _dbContext.Queryable<SettlementSupplierMonthly>()
.Where(x => x.SettleMonth == request.SettleMonth && x.TenantId == "2401")
.OrderByDescending(x => x.CreateTime)
.Select<SettlementSupplierPageResponse>()
.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;
}
}

View File

@@ -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; }
}

View File

@@ -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<Guid> BusinessPlaceCodes { get; set; }
}

View File

@@ -0,0 +1,47 @@
namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class SettlementSupplierPageResponse
{
/// <summary>
/// YYYYMM
/// </summary>
public string SettleMonth { get; set; }
public string SupplierName { get; set; }
public Guid BusinessPlaceCode { get; set; }
public string BusinessPlaceName { get; set; }
/// <summary>
/// 期初
/// </summary>
public decimal OpeningBalance { get; set; }
/// <summary>
/// 消费总额
/// </summary>
public decimal CostAmount { get; set; }
/// <summary>
/// 结算金额
/// </summary>
public decimal PaidAmount { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public decimal RefundAmount { get; set; }
/// <summary>
/// 期末
/// </summary>
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; }
}