You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
6.4 KiB
C#
136 lines
6.4 KiB
C#
using DS.Module.Core;
|
|
using DS.Module.Core.Extensions;
|
|
using DS.WMS.Core.Fee.Entity;
|
|
using DS.WMS.Core.Op.Entity;
|
|
using DS.WMS.Core.Settlement.Dtos;
|
|
using DS.WMS.Core.Settlement.Entity;
|
|
using DS.WMS.Core.Settlement.Interface;
|
|
using DS.WMS.Core.Sys.Entity;
|
|
using SqlSugar;
|
|
|
|
namespace DS.WMS.Core.Settlement.Method
|
|
{
|
|
/// <summary>
|
|
/// 付费自由结算
|
|
/// </summary>
|
|
public class FreeSettlementService : SettlementService<PaymentSettlement>, IFreeSettlementService
|
|
{
|
|
/// <summary>
|
|
/// 初始化
|
|
/// </summary>
|
|
/// <param name="provider"></param>
|
|
public FreeSettlementService(IServiceProvider provider) : base(provider)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取待结算费用分页列表
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <returns></returns>
|
|
/// <remarks>查询条件请参考<see cref="FeeDto"/>中定义的字段</remarks>
|
|
public async Task<DataResult<List<FeeBizDto>>> GeFeeListAsync(PageRequest request)
|
|
{
|
|
var whereList = request.GetConditionalModels(Db);
|
|
var result = await CreateQuery().Where(whereList)
|
|
.GroupBy(x => new { x.BusinessId, x.BusinessType })
|
|
.Select<FeeBizDto>()
|
|
.ToQueryPageAsync(request.PageCondition);
|
|
|
|
if (result.Data.Count > 0)
|
|
{
|
|
//获取统计信息
|
|
var ids = result.Data.Select(x => x.BusinessId);
|
|
var types = result.Data.Select(x => x.BusinessType).Distinct();
|
|
var fees = await TenantDb.Queryable<FeeRecord>().Where(x => ids.Contains(x.BusinessId) && types.Contains(x.BusinessType))
|
|
.Select(x => new
|
|
{
|
|
x.Currency,
|
|
x.FeeType,
|
|
//x.Amount,
|
|
//x.OrderAmount,
|
|
//x.SettlementAmount,
|
|
//x.OrderSettlementAmount,
|
|
x.InvoiceAmount,
|
|
UnSettlementAmount = x.Amount - x.SettlementAmount - x.OrderAmount + x.OrderSettlementAmount //剩余待结算
|
|
}).ToListAsync();
|
|
|
|
//关联用户名称
|
|
var userIds = result.Data.Select(x => x.CreateBy)
|
|
.Union(result.Data.Select(x => x.OperatorId))
|
|
.Distinct();
|
|
var users = await Db.Queryable<SysUser>().Where(x => userIds.Contains(x.Id)).Select(x => new { x.Id, x.UserName }).ToListAsync();
|
|
|
|
var orgIds = result.Data.Select(x => x.SaleDeptId).Distinct();
|
|
var orgs = await Db.Queryable<SysOrg>().Where(x => orgIds.Contains(x.Id)).Select(x => new { x.Id, x.OrgName }).ToListAsync();
|
|
|
|
foreach (var item in result.Data)
|
|
{
|
|
item.UnpaidRMB = fees.FindAll(x => x.Currency == RMB_CODE && x.FeeType == FeeType.Payable).Sum(x => x.UnSettlementAmount);
|
|
item.UnpaidUSD = fees.FindAll(x => x.Currency == USD_CODE && x.FeeType == FeeType.Payable).Sum(x => x.UnSettlementAmount);
|
|
item.UnpaidOther = fees.FindAll(x => x.Currency != RMB_CODE && x.Currency != USD_CODE && x.FeeType == FeeType.Payable).Sum(x => x.UnSettlementAmount);
|
|
item.UnchargedRMB = fees.FindAll(x => x.Currency == RMB_CODE && x.FeeType == FeeType.Receivable).Sum(x => x.UnSettlementAmount);
|
|
item.UnchargedUSD = fees.FindAll(x => x.Currency == USD_CODE && x.FeeType == FeeType.Receivable).Sum(x => x.UnSettlementAmount);
|
|
item.UnchargedOther = fees.FindAll(x => x.Currency != RMB_CODE && x.Currency != USD_CODE && x.FeeType == FeeType.Receivable).Sum(x => x.UnSettlementAmount);
|
|
item.UnpaidInvoiceRMB = fees.FindAll(x => x.Currency == RMB_CODE && x.FeeType == FeeType.Payable && x.UnSettlementAmount == 0).Sum(x => x.InvoiceAmount);
|
|
item.UnpaidInvoiceUSD = fees.FindAll(x => x.Currency == USD_CODE && x.FeeType == FeeType.Payable && x.UnSettlementAmount == 0).Sum(x => x.InvoiceAmount);
|
|
|
|
item.CreateByName = users.Find(x => x.Id == item.CreateBy)?.UserName;
|
|
item.Operator = users.Find(x => x.Id == item.OperatorId)?.UserName;
|
|
|
|
item.SaleDeptName = orgs.Find(x => x.Id == item.SaleDeptId)?.OrgName;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
//创建各项费用数据的查询并集
|
|
internal ISugarQueryable<FeeDto> CreateQuery()
|
|
{
|
|
var query1 = TenantDb.Queryable<FeeRecord, SeaExport>((f, s) => new JoinQueryInfos(
|
|
JoinType.Inner, s.Id == f.BusinessId && f.BusinessType == BusinessType.OceanShippingExport && f.FeeStatus == FeeStatus.AuditPassed &&
|
|
(f.Amount - f.SettlementAmount - f.OrderAmount + f.OrderSettlementAmount) != 0))
|
|
.Select((f, s) => new FeeDto
|
|
{
|
|
Id = f.Id,
|
|
FeeId = f.FeeId,
|
|
FeeCode = f.FeeCode,
|
|
FeeName = f.FeeName,
|
|
FeeType = f.FeeType,
|
|
CustomerId = f.CustomerId,
|
|
CustomerName = f.CustomerName,
|
|
BusinessId = f.BusinessId,
|
|
BusinessType = BusinessType.OceanShippingExport,
|
|
Currency = f.Currency,
|
|
DebitNo = f.DebitNo,
|
|
SaleOrgId = f.SaleOrgId,
|
|
SaleOrg = f.SaleOrg,
|
|
CreateBy = f.CreateBy,
|
|
|
|
AccountDate = s.AccountDate,
|
|
BusinessDate = s.BusinessDate,//业务日期
|
|
ClientName = s.CustomerName,//委托单位
|
|
CustomerNo = s.CustomerNo,
|
|
CustomNo = s.CustomNo,
|
|
DischargePort = s.DischargePort,
|
|
ETD = s.ETD,
|
|
HBLNO = s.HBLNO,
|
|
LoadPort = s.LoadPort,
|
|
MBLNO = s.MBLNO,
|
|
OperatorId = s.OperatorId,
|
|
SaleDeptId = s.SaleDeptId,
|
|
Sale = s.Sale,//揽货人
|
|
Vessel = s.Vessel,//船名
|
|
Voyage = s.Voyno,//航次
|
|
BookingNo = s.BookingNo,
|
|
Enterprise = s.Enterprise,
|
|
});
|
|
|
|
//海运进口
|
|
|
|
return TenantDb.UnionAll(new List<ISugarQueryable<FeeDto>> { query1 });
|
|
}
|
|
}
|
|
}
|