313 lines
13 KiB
C#
313 lines
13 KiB
C#
using AutoMapper;
|
|
using IRaCIS.Application.Interfaces;
|
|
using IRaCIS.Application.Contracts.Pay;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Panda.DynamicWebApi.Attributes;
|
|
|
|
namespace IRaCIS.Application.Services
|
|
{
|
|
[ApiExplorerSettings(GroupName = "Financial")]
|
|
public class PaymentAdjustmentService : BaseService, IPaymentAdjustmentService
|
|
{
|
|
private readonly IRepository<PaymentAdjustment> _payAdjustmentRepository;
|
|
private readonly IRepository<Doctor> _doctorRepository;
|
|
private readonly IRepository<ExchangeRate> _exchangeRateRepository;
|
|
private readonly IRepository<Payment> _paymentRepository;
|
|
|
|
|
|
public PaymentAdjustmentService(IRepository<PaymentAdjustment> costAdjustmentRepository, IRepository<Doctor> doctorRepository,
|
|
IRepository<ExchangeRate> exchangeRateRepository, IRepository<Payment> paymentRepository, IMapper mapper)
|
|
{
|
|
_payAdjustmentRepository = costAdjustmentRepository;
|
|
_doctorRepository = doctorRepository;
|
|
_exchangeRateRepository = exchangeRateRepository;
|
|
_paymentRepository = paymentRepository;
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 添加或更新费用调整[AUTH]
|
|
/// </summary>
|
|
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdatePaymentAdjustment(PaymentAdjustmentCommand addOrUpdateModel)
|
|
{
|
|
|
|
var yearMonthDate = new DateTime(addOrUpdateModel.YearMonth.Year, addOrUpdateModel.YearMonth.Month, 1);
|
|
var yearMonth = addOrUpdateModel.YearMonth.ToString("yyyy-MM");
|
|
|
|
var payment = await _paymentRepository.FirstOrDefaultAsync(u => u.DoctorId == addOrUpdateModel.ReviewerId
|
|
&& u.YearMonth == yearMonth);
|
|
|
|
//判断付费表中是否有记录
|
|
if (payment == null)
|
|
{
|
|
//没有 添加仅有的调整费用记录
|
|
payment = new Payment
|
|
{
|
|
DoctorId = addOrUpdateModel.ReviewerId,
|
|
YearMonth = yearMonth,
|
|
YearMonthDate = yearMonthDate,
|
|
PaymentCNY = 0,
|
|
PaymentUSD = 0,
|
|
AdjustmentCNY = 0,
|
|
AdjustmentUSD = 0
|
|
};
|
|
await _paymentRepository.AddAsync(payment);
|
|
await _paymentRepository.SaveChangesAsync();
|
|
}
|
|
else
|
|
{
|
|
if (payment.IsLock)
|
|
{
|
|
return ResponseOutput.NotOk("Doctor payment has confirmed lock");
|
|
}
|
|
}
|
|
|
|
var exchangeRate = await _exchangeRateRepository.FirstOrDefaultAsync(t => t.YearMonth == yearMonth);
|
|
if (addOrUpdateModel.Id == Guid.Empty || addOrUpdateModel.Id == null)
|
|
{
|
|
var costAdjustment = _mapper.Map<PaymentAdjustment>(addOrUpdateModel);
|
|
|
|
//视图模型和领域模型没对应 重新赋值
|
|
costAdjustment.ExchangeRate = exchangeRate?.Rate ?? 0;
|
|
costAdjustment.AdjustmentCNY = addOrUpdateModel.AdjustPaymentUSD * (exchangeRate?.Rate ?? 0);
|
|
costAdjustment.AdjustmentUSD = addOrUpdateModel.AdjustPaymentUSD;
|
|
|
|
await _payAdjustmentRepository.AddAsync(costAdjustment);
|
|
|
|
//添加的时候,每个月调整汇总费用 需要加上本次调整的费用
|
|
payment.AdjustmentCNY += costAdjustment.AdjustmentCNY;
|
|
payment.AdjustmentUSD += costAdjustment.AdjustmentUSD;
|
|
|
|
//await _paymentRepository.UpdateAsync(payment);
|
|
|
|
await _paymentRepository.UpdateAsync(payment, u => new Payment()
|
|
{
|
|
AdjustmentCNY = payment.AdjustmentCNY + costAdjustment.AdjustmentCNY,
|
|
AdjustmentUSD = payment.AdjustmentUSD + costAdjustment.AdjustmentUSD
|
|
});
|
|
|
|
await _payAdjustmentRepository.SaveChangesAsync();
|
|
|
|
|
|
return ResponseOutput.Ok(costAdjustment.Id.ToString());
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
|
|
// 更新的时候,先查出来,更新前的调整费用数据
|
|
|
|
var paymentAdjust = await _payAdjustmentRepository.FirstOrDefaultAsync(t => t.Id == addOrUpdateModel.Id);
|
|
|
|
|
|
_mapper.Map(addOrUpdateModel, paymentAdjust);
|
|
|
|
paymentAdjust.ExchangeRate = exchangeRate?.Rate ?? 0;
|
|
paymentAdjust.AdjustmentUSD = addOrUpdateModel.AdjustPaymentUSD;
|
|
paymentAdjust.AdjustmentCNY = addOrUpdateModel.AdjustPaymentUSD * (exchangeRate?.Rate ?? 0);
|
|
|
|
//await _payAdjustmentRepository.UpdateAsync(paymentAdjust);
|
|
|
|
var success = await _payAdjustmentRepository.SaveChangesAsync();
|
|
|
|
if (success)
|
|
{
|
|
|
|
var adjustmentList = await _payAdjustmentRepository.Where(u => u.ReviewerId == addOrUpdateModel.ReviewerId && u.YearMonth == yearMonth).ToListAsync();
|
|
|
|
|
|
await _paymentRepository.UpdateAsync(payment, u => new Payment()
|
|
{
|
|
AdjustmentCNY = adjustmentList.Sum(t => t.AdjustmentCNY),
|
|
AdjustmentUSD = adjustmentList.Sum(t => t.AdjustmentUSD)
|
|
});
|
|
|
|
//payment.AdjustmentCNY = adjustmentList.Sum(t => t.AdjustmentCNY);
|
|
//payment.AdjustmentUSD = adjustmentList.Sum(t => t.AdjustmentUSD);
|
|
|
|
//await _paymentRepository.UpdateAsync(payment);
|
|
|
|
await _paymentRepository.SaveChangesAsync();
|
|
}
|
|
|
|
//查询得到历史汇总
|
|
|
|
|
|
|
|
return ResponseOutput.Ok(success);
|
|
|
|
#region 逻辑存在错误 问题待查
|
|
|
|
//// 更新的时候,先查出来,更新前的调整费用数据
|
|
//var paymentAdjust = _payAdjustmentRepository.FindSingleOrDefault(t => t.Id == addOrUpdateModel.Id);
|
|
|
|
////减去数据库本条记录的值
|
|
//payment.AdjustmentCNY = -paymentAdjust.AdjustmentCNY;
|
|
//payment.AdjustmentUSD = -paymentAdjust.AdjustmentUSD;
|
|
|
|
//_mapper.Map(addOrUpdateModel, paymentAdjust);
|
|
|
|
//paymentAdjust.ExchangeRate = exchangeRate?.Rate ?? 0;
|
|
//paymentAdjust.AdjustmentUSD = addOrUpdateModel.AdjustPaymentUSD;
|
|
//paymentAdjust.AdjustmentCNY = addOrUpdateModel.AdjustPaymentUSD * (exchangeRate?.Rate ?? 0);
|
|
|
|
//_payAdjustmentRepository.Update(paymentAdjust);
|
|
|
|
////查询得到历史汇总
|
|
//var adjustment = _payAdjustmentRepository.Find(u => u.ReviewerId == addOrUpdateModel.ReviewerId && u.YearMonth == yearMonth)
|
|
// .GroupBy(u => new { u.ReviewerId, u.YearMonth }).Select(g => new
|
|
// {
|
|
// AdjustCNY = g.Sum(t => t.AdjustmentCNY),
|
|
// AdjustUSD = g.Sum(t => t.AdjustmentUSD)
|
|
// }).FirstOrDefault();
|
|
|
|
////最终的值 等于历史汇总 减去更新前的加上当前更新的值
|
|
//payment.AdjustmentCNY += (adjustment.AdjustCNY + paymentAdjust.AdjustmentCNY);
|
|
//payment.AdjustmentUSD += (adjustment.AdjustUSD + paymentAdjust.AdjustmentUSD);
|
|
|
|
//_paymentRepository.Update(payment);
|
|
|
|
//var success = _payAdjustmentRepository.SaveChanges();
|
|
//return ResponseOutput.Result(success, success ? string.Empty : StaticData.UpdateFailed);
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 删除费用调整记录
|
|
/// </summary>
|
|
|
|
[HttpDelete("{id:guid}")]
|
|
public async Task<IResponseOutput> DeletePaymentAdjustment(Guid id)
|
|
{
|
|
var adjustPayment = await _payAdjustmentRepository.FirstOrDefaultAsync(u => u.Id == id);
|
|
|
|
|
|
await _payAdjustmentRepository.DeleteAsync(new PaymentAdjustment() { Id = id });
|
|
|
|
var success = await _payAdjustmentRepository.SaveChangesAsync();
|
|
|
|
if (success)
|
|
{
|
|
|
|
var adjustmentList = await _payAdjustmentRepository.Where(u =>
|
|
u.ReviewerId == adjustPayment.ReviewerId && u.YearMonth == adjustPayment.YearMonth).ToListAsync();
|
|
|
|
|
|
var monthPay = await _paymentRepository.FirstOrDefaultAsync(t =>
|
|
t.DoctorId == adjustPayment.ReviewerId && t.YearMonth == adjustPayment.YearMonth);
|
|
|
|
|
|
|
|
await _paymentRepository.UpdateAsync(monthPay, u => new Payment()
|
|
{
|
|
AdjustmentCNY = adjustmentList.Sum(t => t.AdjustmentCNY),
|
|
AdjustmentUSD = adjustmentList.Sum(t => t.AdjustmentUSD)
|
|
});
|
|
|
|
|
|
//monthPay.AdjustmentCNY = adjustmentList.Sum(t => t.AdjustmentCNY);
|
|
//monthPay.AdjustmentUSD = adjustmentList.Sum(t => t.AdjustmentUSD);
|
|
//await _paymentRepository.UpdateAsync(monthPay);
|
|
|
|
await _paymentRepository.SaveChangesAsync();
|
|
}
|
|
|
|
|
|
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取费用调整列表
|
|
/// </summary>
|
|
[HttpPost]
|
|
public async Task<PageOutput<PaymentAdjustmentDetailDTO>> GetPaymentAdjustmentList(PaymentAdjustmentQueryDTO queryParam)
|
|
{
|
|
|
|
var beginYearMonth = queryParam.BeginMonth.AddDays(1 - queryParam.BeginMonth.Day);
|
|
var endYearMonth = queryParam.EndMonth.AddDays(1 - queryParam.EndMonth.Day).AddMonths(1).AddDays(-1);
|
|
|
|
var costAdjustmentQueryable = from costAdjustment in _payAdjustmentRepository
|
|
.Where(t => t.YearMonthDate >= beginYearMonth && t.YearMonthDate <= endYearMonth)
|
|
join doctor in _doctorRepository.AsQueryable().
|
|
WhereIf(!string.IsNullOrWhiteSpace(queryParam.Reviewer),
|
|
u => u.ChineseName.Contains(queryParam.Reviewer) ||
|
|
(u.LastName + u.FirstName).Contains(queryParam.Reviewer) ||
|
|
u.ReviewerCode.Contains(queryParam.Reviewer))
|
|
on costAdjustment.ReviewerId equals doctor.Id
|
|
|
|
select new PaymentAdjustmentDetailDTO()
|
|
{
|
|
AdjustPaymentCNY = costAdjustment.AdjustmentCNY,
|
|
AdjustPaymentUSD = costAdjustment.AdjustmentUSD,
|
|
IsLock = costAdjustment.IsLock,
|
|
Id = costAdjustment.Id,
|
|
YearMonth = costAdjustment.YearMonth,
|
|
YearMonthDate = costAdjustment.YearMonthDate,
|
|
Note = costAdjustment.Note,
|
|
ReviewerId = costAdjustment.ReviewerId,
|
|
ReviewerCode = doctor.ReviewerCode,
|
|
FirstName = doctor.FirstName,
|
|
LastName = doctor.LastName,
|
|
ChineseName = doctor.ChineseName
|
|
};
|
|
|
|
return await costAdjustmentQueryable.ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize, string.IsNullOrWhiteSpace(queryParam.SortField) ? "YearMonthDate" : queryParam.SortField, queryParam.Asc);
|
|
|
|
|
|
}
|
|
|
|
public async Task<List<DoctorSelectDTO>> GetReviewerSelectList()
|
|
{
|
|
return await _doctorRepository.Where(t => t.CooperateStatus == ContractorStatusEnum.Cooperation && t.ResumeStatus == ResumeStatusEnum.Pass).ProjectTo<DoctorSelectDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
|
}
|
|
|
|
[NonDynamicMethod]
|
|
public async Task CalculateCNY(string yearMonth, decimal rate)
|
|
{
|
|
|
|
//如果是double 不会保留两位小数
|
|
await _payAdjustmentRepository.BatchUpdateNoTrackingAsync(u => u.YearMonth == yearMonth &&
|
|
!u.IsLock, t => new PaymentAdjustment
|
|
{
|
|
AdjustmentCNY = t.AdjustmentUSD * rate,
|
|
ExchangeRate = rate,
|
|
UpdateTime = DateTime.Now
|
|
});
|
|
|
|
var adjustList = await _payAdjustmentRepository.Where(u => u.YearMonth == yearMonth &&
|
|
!u.IsLock).ToListAsync();
|
|
|
|
|
|
|
|
var needUpdatePayment = adjustList.GroupBy(t => t.ReviewerId).Select(g => new
|
|
{
|
|
ReviewerId = g.Key,
|
|
AdjustCNY = g.Sum(t => t.AdjustmentCNY),
|
|
AdjustUSD = g.Sum(t => t.AdjustmentUSD)
|
|
});
|
|
|
|
foreach (var reviewer in needUpdatePayment)
|
|
{
|
|
await _paymentRepository.BatchUpdateNoTrackingAsync(u => u.YearMonth == yearMonth &&
|
|
!u.IsLock && u.DoctorId == reviewer.ReviewerId, t => new Payment()
|
|
{
|
|
AdjustmentUSD = reviewer.AdjustUSD,
|
|
AdjustmentCNY = reviewer.AdjustCNY
|
|
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
} |