using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using IRaCIS.Application.Interfaces; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.AspNetCore.Authorization; using System.Threading.Tasks; using IRaCIS.Application.Services; namespace IRaCIS.Core.API.Controllers.Special { //谨慎修改 涉及到财务模块 [ApiController, Authorize, ApiExplorerSettings(GroupName = "Financial")] public class FinancialChangeController : ControllerBase { private readonly ITrialService _trialService; private readonly ICalculateService _calculateService; public FinancialChangeController(ITrialService trialService, ICalculateService calculateService) { _trialService = trialService; _calculateService = calculateService; } /// 添加实验项目-返回新增Id[AUTH] /// /// 新记录Id //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddOrUpdateTrial)] [HttpPost, Route("trial/addOrUpdateTrial")] public async Task AddOrUpdateTrial(TrialCommand param) { var userId = Guid.Parse(User.FindFirst("id").Value); var result = await _trialService.AddOrUpdateTrial(param); if (_trialService.TrialExpeditedChange) { var needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(param.Id.Value); var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty); calcList.ForEach(t => { if (needCalReviewerIds.Contains(t.DoctorId)) { _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { t.DoctorId }, CalculateMonth = DateTime.Parse(t.YearMonth) }, User.FindFirst("id").Value); } }); } return result; } /// /// 添加或更新工作量[AUTH] /// /// /// /// [HttpPost, Route("doctorWorkload/workLoadAddOrUpdate")] [TypeFilter(typeof(TrialResourceFilter))] public async Task WorkLoadAddOrUpdate([FromServices] IDoctorWorkloadService _trialWorkloadService, WorkloadCommand workLoadAddOrUpdateModel) { var userId = Guid.Parse(User.FindFirst("id").Value); var result = await _trialWorkloadService.AddOrUpdateWorkload(workLoadAddOrUpdateModel, userId); if (result.IsSuccess && workLoadAddOrUpdateModel.DataFrom == 2) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { workLoadAddOrUpdateModel.DoctorId }, CalculateMonth = workLoadAddOrUpdateModel.WorkTime }, User.FindFirst("id").Value); } return result; } [HttpDelete, Route("doctorWorkload/deleteWorkLoad/{id:guid}/{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task DeleteWorkLoad([FromServices] IDoctorWorkloadService _trialWorkloadService, Guid id) { //先判断该工作量的费用是否被锁定,如果被锁定,则不能删除 var workload = await _trialWorkloadService.GetWorkloadDetailById(id); var yearMonth = workload.WorkTime.ToString("yyyy-MM"); var isLock = await _calculateService.IsLock(workload.DoctorId, yearMonth); if (isLock) { return ResponseOutput.NotOk("Expenses have been settled and workload can not be reset."); } var deleteResult = await _trialWorkloadService.DeleteWorkload(id); if (workload.DataFrom == (int)Domain.Share.WorkLoadFromStatus.FinalConfirm) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { workload.DoctorId }, CalculateMonth = workload.WorkTime }, User.FindFirst("id").Value); } return deleteResult; } /// /// 添加或更新汇率(会触发没有对锁定的费用计算) /// [HttpPost, Route("exchangeRate/addOrUpdateExchangeRate")] public async Task AddOrUpdateExchangeRate([FromServices] IExchangeRateService _exchangeRateService, [FromServices] IPaymentAdjustmentService _costAdjustmentService, ExchangeRateCommand addOrUpdateModel) { var result = await _exchangeRateService.AddOrUpdateExchangeRate(addOrUpdateModel); var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, addOrUpdateModel.YearMonth); foreach (var item in calcList) { if (item != null) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { item.DoctorId }, CalculateMonth = DateTime.Parse(item.YearMonth) }, User.FindFirst("id").Value); } } _costAdjustmentService.CalculateCNY(addOrUpdateModel.YearMonth, addOrUpdateModel.Rate); return result; } /// /// 添加或更新 职称单价[AUTH] /// [HttpPost, Route("rankPrice/addOrUpdateRankPrice")] public async Task AddOrUpdateRankPrice([FromServices] IReviewerPayInfoService _reviewerPayInfoService, [FromServices] IRankPriceService _rankPriceService, RankPriceCommand addOrUpdateModel) { if (addOrUpdateModel.Id != Guid.Empty && addOrUpdateModel.Id != null) { var needCalReviewerIds =await _reviewerPayInfoService.GetReviewerIdByRankId(Guid.Parse(addOrUpdateModel.Id.ToString())); var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty); foreach (var item in calcList) { if (item != null && needCalReviewerIds.Contains(item.DoctorId)) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { item.DoctorId }, CalculateMonth = DateTime.Parse(item.YearMonth) }, User.FindFirst("id").Value); } } } var userId = Guid.Parse(User.FindFirst("id").Value); return await _rankPriceService.AddOrUpdateRankPrice(addOrUpdateModel, userId); } /// /// 添加或更新(替换)医生支付展信息[AUTH] /// [HttpPost, Route("reviewerPayInfo/addOrUpdateReviewerPayInfo")] public async Task AddOrUpdateReviewerPayInfo([FromServices] IReviewerPayInfoService _doctorPayInfoService, ReviewerPayInfoCommand addOrUpdateModel) { var userId = Guid.Parse(User.FindFirst("id").Value); var result =await _doctorPayInfoService.AddOrUpdateReviewerPayInfo(addOrUpdateModel, userId); var calcList = await _calculateService.GetNeedCalculateReviewerList(addOrUpdateModel.DoctorId, string.Empty); foreach (var item in calcList) { if (item != null) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { item.DoctorId }, CalculateMonth = DateTime.Parse(item.YearMonth) }, User.FindFirst("id").Value); } } return result; } /// /// 保存(替换)项目支付价格信息(会触发没有被锁定的费用计算)[AUTH] /// [HttpPost, Route("trialPaymentPrice/addOrUpdateTrialPaymentPrice")] public async Task AddOrUpdateTrialPaymentPrice([FromServices] ITrialPaymentPriceService _trialPaymentPriceService, TrialPaymentPriceCommand addOrUpdateModel) { var userId = Guid.Parse(User.FindFirst("id").Value); var result =await _trialPaymentPriceService.AddOrUpdateTrialPaymentPrice(addOrUpdateModel); var needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(addOrUpdateModel.TrialId); var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty); foreach (var item in calcList) { if (item != null && needCalReviewerIds.Contains(item.DoctorId)) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { item.DoctorId }, CalculateMonth = DateTime.Parse(item.YearMonth) }, User.FindFirst("id").Value); } } return result; } /// /// 批量更新奖励费用[AUTH] /// [HttpPost, Route("volumeReward/addOrUpdatevolumeRewardPriceList")] public async Task AddOrUpdateAwardPriceList([FromServices] IVolumeRewardService _volumeRewardService, IEnumerable addOrUpdateModel) { var result =await _volumeRewardService.AddOrUpdateVolumeRewardPriceList(addOrUpdateModel); var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty); foreach (var item in calcList) { if (item != null) { await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO() { NeedCalculateReviewers = new List() { item.DoctorId }, CalculateMonth = DateTime.Parse(item.YearMonth) }, User.FindFirst("id").Value); } } return result; } /// /// 计算医生月度费用,并将计算的结果存入费用表 /// [HttpPost, Route("financial/calculateMonthlyPayment")] public async Task CalculateMonthlyPayment(CalculateDoctorAndMonthDTO param) { if (!ModelState.IsValid) { return ResponseOutput.NotOk("Invalid parameter."); } return await _calculateService.CalculateMonthlyPayment(param, User.FindFirst("id").Value); } /// /// Financials /Monthly Payment 列表查询接口 /// [HttpPost, Route("financial/getMonthlyPaymentList")] public async Task> GetMonthlyPaymentList([FromServices] IPaymentService _paymentService, [FromServices] IExchangeRateService _exchangeRateService, MonthlyPaymentQueryDTO queryParam) { return ResponseOutput.Ok(new PaymentDTO { CostList = await _paymentService.GetMonthlyPaymentList(queryParam), ExchangeRate = await _exchangeRateService.GetExchangeRateByMonth(queryParam.StatisticsDate.ToString("yyyy-MM")) }); } } }