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.
BookingHeChuan/Myshipping.Application/Service/Fee/FeeRecordService.cs

225 lines
8.3 KiB
C#

using Furion.DependencyInjection;
10 months ago
using Furion.DynamicApiController;
using Furion.EventBus;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Myshipping.Application.Entity;
using Myshipping.Application.Service.Fee.Dto;
using Myshipping.Core;
using Myshipping.Core.Entity;
10 months ago
using Myshipping.Core.Service;
using SqlSugar;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Myshipping.Application
{
/// <summary>
/// 费用录入
/// </summary>
[ApiDescriptionSettings("Application", Name = "FeeRecord", Order = 1)]
public class FeeRecordService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<FeeRecord> _repRecord;
private readonly ILogger<FeeRecordService> _logger;
private readonly ISysCacheService _cache;
private readonly ISysUserRoleService _sysUserRoleService;
private readonly IDjyCustomerService _customerService;
10 months ago
private readonly IEventPublisher _publisher;
public FeeRecordService(ILogger<FeeRecordService> logger,
ISysCacheService cache,
IEventPublisher publisher,
SqlSugarRepository<FeeRecord> repRecord,
ISysUserRoleService sysUserRoleService,
IDjyCustomerService customerService)
10 months ago
{
_logger = logger;
_cache = cache;
_sysUserRoleService = sysUserRoleService;
_customerService = customerService;
10 months ago
_publisher = publisher;
_repRecord = repRecord;
}
/// <summary>
/// 费用记录查询
/// </summary>
[HttpGet("/FeeRecord/Query")]
public async Task<List<FeeRecordDto>> Query([FromQuery] FeeRecordInputDto input)
{
List<FeeRecord> feeRecords = await _repRecord.AsQueryable()
.Where(r => r.BussId == input.BussId)
.OrderBy(r => new { r.FeeType, r.Sort, r.CreatedTime })
.ToListAsync();
// 如果费用中含有机密费用,再判断是否有查询的权限
if (feeRecords.Any(r => !r.IsOpen))
{
bool canReviewSecretFee = await _sysUserRoleService.IsUserInRole(UserManager.UserId, CommonConst.ROLE_SECRET_FEE_REVIEW);
10 months ago
if (!canReviewSecretFee)
{
feeRecords.RemoveAll(r => !r.IsOpen && r.CreatedUserId != UserManager.UserId);
}
}
var result = feeRecords.Adapt<List<FeeRecordDto>>();
return result;
}
/// <summary>
/// 费用录入保存并返回完整的费用列表
10 months ago
/// </summary>
[HttpPost("/FeeRecord/Save")]
[SqlSugarUnitOfWork]
public async Task<List<FeeRecordDto>> Save(FeeRecordSaveDto input)
10 months ago
{
input.SaveList ??= new List<FeeRecordDto>();
input.DeleteList ??= new List<FeeRecordDto>();
10 months ago
var waitInsertList = input.SaveList.Where(r => r.Id == 0).ToList();
var waitUpdateList = input.SaveList.Where(r => r.Id != 0 && r.MarkModify).ToList();
10 months ago
#region 校验
foreach (var item in waitInsertList.Concat(waitUpdateList))
{
// 人民币汇率必须为1其它外币汇率不能为空
if (item.ExchangeRate == 0) throw Oops.Bah("汇率不能为空或0请调整");
if (string.IsNullOrEmpty(item.Currency)) throw Oops.Bah("币别不能为空");
if (item.Currency?.ToUpper() == "RMB")
{
if (item.ExchangeRate != 1) throw Oops.Bah("币别为人民币时汇率需为1请调整");
}
}
#endregion
// 删除
if (input.DeleteList.Any())
10 months ago
{
var waitDeleteListTemp = input.DeleteList.Select(r => r.Id).ToList();
10 months ago
await _repRecord.UpdateAsync(r => waitDeleteListTemp.Contains(r.Id), r => new FeeRecord() { IsDeleted = true });
}
// 新增
if (waitInsertList.Any())
{
var waitInsertListTemp = waitInsertList.Adapt<List<FeeRecord>>();
await _repRecord.InsertAsync(waitInsertListTemp);
}
// 更新
if (waitUpdateList.Any())
{
await _repRecord.AsUpdateable(waitUpdateList).UpdateColumns(r => new
10 months ago
{
r.UpdatedTime,
r.UpdatedUserId,
r.UpdatedUserName,
r.FeeCode,
r.FeeName,
r.CustomerType,
r.CustomerCode,
r.CustomerName,
r.FeeDescription,
r.Currency,
r.ExchangeRate,
r.TaxRate,
r.Tax,
r.Unit,
r.UnitPrice,
r.Quantity,
r.Amount,
r.NoTaxAmount,
r.Remark,
r.IsOpen,
r.IsAdvancedPay,
r.Sort,
r.IsInvoice
10 months ago
}).ExecuteCommandAsync();
}
// 返回完整的费用列表
return await Query(new FeeRecordInputDto() { BussId = input.BussId });
10 months ago
}
/// <summary>
/// 根据类型获取结算对象列表
/// </summary>
/// <returns></returns>
[HttpGet("/FeeRecord/GetFeeCustomerList")]
public async Task<List<FeeCustomerDto>> GetFeeCustomerList(string code)
{
List<FeeCustomerDto> result = new();
switch (code)
{
// 船司
case "carrier":
{
List<CodeCarrier> list = await _cache.GetAllCodeCarrier();
return list.Select(x => new FeeCustomerDto()
{
Code = x.Code,
Name = x.CnName
}).ToList();
}
// 船代
case "shipagency":
{
List<CodeForwarder> list = await _cache.GetAllCodeForwarder();
return list.Select(x => new FeeCustomerDto()
{
Code = x.Code,
Name = x.Name
}).ToList();
}
// 场站
case "yard":
{
List<CodeYard> list = await _cache.GetAllCodeYard();
return list.Select(x => new FeeCustomerDto()
{
Code = x.Code,
Name = x.Name
}).ToList();
}
// 往来单位
default:
{
List<(string codeName, string shortName)> list = await _customerService.QueryDjyCustomerByProp(code);
return list.Select(x => new FeeCustomerDto()
{
Code = x.codeName,
Name = x.shortName
}).ToList();
}
}
}
/// <summary>
/// 获取费用单位列表
/// </summary>
[HttpGet("/FeeRecord/GetFeeUnitList")]
public async Task<List<FeeUnitDto>> GetFeeUnitList()
{
var codeCtnList = (await _cache.GetAllCodeCtn()).Select(x => new FeeUnitDto(x.Code, x.Name)).ToList();
var feeUnitList = (await _cache.GetAllDictData()).Where(d => d.TypeCode == "FeeUnit")
.Select(x => new FeeUnitDto(x.Code, x.Value))
.ToList();
var result = codeCtnList.Concat(feeUnitList).ToList();
return result;
}
10 months ago
}
}