using Furion.DependencyInjection; 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; using Myshipping.Core.Service; using SqlSugar; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Myshipping.Application { /// /// 费用录入 /// [ApiDescriptionSettings("Application", Name = "FeeRecord", Order = 1)] public class FeeRecordService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _repRecord; private readonly ILogger _logger; private readonly ISysCacheService _cache; private readonly ISysUserRoleService _sysUserRoleService; private readonly IDjyCustomerService _customerService; private readonly IEventPublisher _publisher; public FeeRecordService(ILogger logger, ISysCacheService cache, IEventPublisher publisher, SqlSugarRepository repRecord, ISysUserRoleService sysUserRoleService, IDjyCustomerService customerService) { _logger = logger; _cache = cache; _sysUserRoleService = sysUserRoleService; _customerService = customerService; _publisher = publisher; _repRecord = repRecord; } /// /// 费用记录查询 /// [HttpGet("/FeeRecord/Query")] public async Task> Query([FromQuery] FeeRecordInputDto input) { List 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.SECRET_FEE_REVIEW); if (!canReviewSecretFee) { feeRecords.RemoveAll(r => !r.IsOpen && r.CreatedUserId != UserManager.UserId); } } var result = feeRecords.Adapt>(); return result; } /// /// 费用录入保存 /// [HttpPost("/FeeRecord/Save")] [SqlSugarUnitOfWork] public async Task Save(FeeRecordSaveDto input) { input.SaveList ??= new List(); input.DeleteList ??= new List(); var waitInsertList = input.SaveList.Where(r => r.Id == 0).ToList(); var waitUpdateList = input.SaveList.Where(r => r.Id != 0 && r.MarkModify).ToList(); #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()) { var waitDeleteListTemp = input.DeleteList.Select(r => r.Id).ToList(); await _repRecord.UpdateAsync(r => waitDeleteListTemp.Contains(r.Id), r => new FeeRecord() { IsDeleted = true }); } // 新增 if (waitInsertList.Any()) { var waitInsertListTemp = waitInsertList.Adapt>(); await _repRecord.InsertAsync(waitInsertListTemp); } // 更新 if (waitUpdateList.Any()) { await _repRecord.AsUpdateable(waitUpdateList).UpdateColumns(r => new { r.FeeCode, r.FeeName, r.CustomerType, 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 }).ExecuteCommandAsync(); } } /// /// 根据类型获取结算对象列表 /// /// [HttpGet("/FeeRecord/GetFeeCustomerList")] public async Task> GetFeeCustomerList(string code) { List result = new(); switch (code) { // 船司 case "carrier": { List list = await _cache.GetAllCodeCarrier(); return list.Select(x => new FeeCustomerDto() { Code = x.Code, Name = x.CnName }).ToList(); } // 船代 case "shipagency": { List list = await _cache.GetAllCodeForwarder(); return list.Select(x => new FeeCustomerDto() { Code = x.Code, Name = x.Name }).ToList(); } // 场站 case "yard": { List 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(new string[] { code }); return list.Select(x => new FeeCustomerDto() { Code = x.codeName, Name = x.shortName }).ToList(); } } } } }