You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
15 KiB

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Asn1.Ocsp;
using Shentun.Peis.ChargeRequestAsbitems;
using Shentun.Peis.Enums;
using Shentun.Peis.LisRequests;
using Shentun.Peis.Models;
using Shentun.Peis.PatientRegisters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;
namespace Shentun.Peis.ChargeRequests
{
[ApiExplorerSettings(GroupName = "Work")]
[Authorize]
public class ChargeRequestAppService : ApplicationService
{
private readonly IRepository<ChargeRequest, Guid> _chargeRequestRepository;
private readonly IRepository<ChargeRequestAsbitem, Guid> _chargeRequestAsbitemRepository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly ChargeRequestManager _chargeRequestManager;
private readonly ChargeRequestAsbitemManager _chargeRequestAsbitemManager;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IRepository<ThirdInterface, Guid> _thirdInterfaceRepository;
public ChargeRequestAppService(
IRepository<ChargeRequest, Guid> chargeRequestRepository,
IRepository<ChargeRequestAsbitem, Guid> chargeRequestAsbitemRepository,
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<Asbitem, Guid> asbitemRepository,
ChargeRequestManager chargeRequestManager,
ChargeRequestAsbitemManager chargeRequestAsbitemManager,
IUnitOfWorkManager unitOfWorkManager,
IRepository<ThirdInterface, Guid> thirdInterfaceRepository)
{
_chargeRequestRepository = chargeRequestRepository;
_chargeRequestAsbitemRepository = chargeRequestAsbitemRepository;
_patientRegisterRepository = patientRegisterRepository;
_registerCheckRepository = registerCheckRepository;
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_chargeRequestManager = chargeRequestManager;
_chargeRequestAsbitemManager = chargeRequestAsbitemManager;
_unitOfWorkManager = unitOfWorkManager;
_asbitemRepository = asbitemRepository;
_thirdInterfaceRepository = thirdInterfaceRepository;
}
/// <summary>
/// 创建申请单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/ChargeRequest/Create")]
public async Task<ChargeRequestDto> CreateAsync(CreateChargeRequestDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
var patientRegisterEnt = await _patientRegisterRepository.FirstOrDefaultAsync(f => f.Id == input.PatientRegisterId);
if (patientRegisterEnt == null)
throw new UserFriendlyException("人员不存在");
var isThirdInterface = await _thirdInterfaceRepository.CountAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ChargeRequest
&& o.MedicalCenterId == patientRegisterEnt.MedicalCenterId && o.IsActive == 'Y');
if (isThirdInterface == 0)
return null;
var list = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
join asbitem in await _asbitemRepository.GetQueryableAsync()
on registerCheckAsbitem.AsbitemId equals asbitem.Id
where registerCheck.PatientRegisterId == input.PatientRegisterId &&
input.RegisterCheckAsbitems.Select(o => o.RegisterCheckAsbitemId)
.Contains(registerCheckAsbitem.Id)
select new
{
registerCheckAsbitem,
asbitem
}).ToList();
var chargeRequestSource = new ChargeRequest()
{
PatientRegisterId = input.PatientRegisterId
};
var chargeRequest = await _chargeRequestManager.CreateAsync(chargeRequestSource);
//更新登记组合项目
foreach (var item in list)
{
if (item.registerCheckAsbitem.ChargeRequestId != null)
{
var haveChargeRequest = await _chargeRequestRepository.GetAsync((Guid)item.registerCheckAsbitem.ChargeRequestId);
if (haveChargeRequest.ChargeRequestFlag == ChargeRequestFlag.ChargeRequest ||
haveChargeRequest.ChargeRequestFlag == ChargeRequestFlag.CancelChargeRequest ||
haveChargeRequest.ChargeRequestFlag == ChargeRequestFlag.RefundRequest)
{
throw new UserFriendlyException($"{item.asbitem.DisplayName}已经处于收费、作废、退费申请状态");
}
}
item.registerCheckAsbitem.ChargeRequestId = chargeRequest.Id;
await _registerCheckAsbitemRepository.UpdateAsync(item.registerCheckAsbitem);
}
//插入申请单信息
chargeRequest = await _chargeRequestRepository.InsertAsync(chargeRequest);
foreach (var item in list)
{
var chargeRequestAsbitemSource = new ChargeRequestAsbitem()
{
ChargeRequestId = chargeRequest.Id,
AsbitemId = item.registerCheckAsbitem.AsbitemId,
RegisterCheckAsbitemId = item.registerCheckAsbitem.Id,
Amount = item.registerCheckAsbitem.Amount,
ChargePrice = item.registerCheckAsbitem.ChargePrice,
IsCharge = 'N'
};
var chargeRequestAsbitem = await _chargeRequestAsbitemManager.CreateAsync(chargeRequestAsbitemSource);
await _chargeRequestAsbitemRepository.InsertAsync(chargeRequestAsbitem);
}
await _unitOfWorkManager.Current.SaveChangesAsync();
await _unitOfWorkManager.Current.CompleteAsync();
//await UnitOfWorkManager.Current.SaveChangesAsync();
//await UnitOfWorkManager.Current.CompleteAsync();
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
await _chargeRequestManager.SendThirChargeRequestAsync(chargeRequest.Id, "SendChargeRequestAsync");
await unitOfWork.CompleteAsync();
}
ChargeRequestDto result = new ChargeRequestDto();
result.Id = chargeRequest.Id;
result.ChargeRequestNo = chargeRequest.ChargeRequestNo;
return result;
}
/// <summary>
/// 作废申请单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[HttpPost("api/app/ChargeRequest/CancelChargeRequest")]
public async Task<ChargeRequestDto> CancelChargeRequestAsync(ChargeRequestIdInputDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
var chargeRequest = await _chargeRequestRepository.GetAsync(input.ChargeRequestId);
if (chargeRequest.ChargeRequestFlag != ChargeRequestFlag.ChargeRequest)
{
throw new UserFriendlyException("状态不是收费申请,不允许作废申请");
}
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
await _chargeRequestManager.SendThirChargeRequestAsync(input.ChargeRequestId, "CancelChargeRequestAsync");
await unitOfWork.CompleteAsync();
}
ChargeRequestDto result = new ChargeRequestDto();
return result;
}
/// <summary>
/// 退费申请单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[HttpPost("api/app/ChargeRequest/RefundChargeRequest")]
public async Task<ChargeRequestDto> ReundChargeRequestAsync(ChargeRequestIdInputDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
var chargeRequest = await _chargeRequestRepository.GetAsync(input.ChargeRequestId);
if (chargeRequest.ChargeRequestFlag != ChargeRequestFlag.AlreadyCharge)
{
throw new UserFriendlyException("状态不是已收费,不允许退费申请");
}
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
await _chargeRequestManager.SendThirChargeRequestAsync(input.ChargeRequestId, "RefundRequestAsync");
await unitOfWork.CompleteAsync();
}
ChargeRequestDto result = new ChargeRequestDto();
return result;
}
/// <summary>
/// 同步收费状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[HttpPost("api/app/ChargeRequest/SyncChargeRequestFlagFromInterface")]
public async Task<ChargeRequestDto> SyncChargeRequestFlagFromInterfaceAsync(ChargeRequestIdInputDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
var chargeRequest = await _chargeRequestRepository.GetAsync(input.ChargeRequestId);
if (chargeRequest.ChargeRequestFlag != ChargeRequestFlag.RefundRequest)
{
throw new UserFriendlyException("状态不是退费申请,不允许同步");
}
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
await _chargeRequestManager.SendThirChargeRequestAsync(input.ChargeRequestId, "SyncChargeRequestFlagFromInterfaceAsync");
await unitOfWork.CompleteAsync();
}
ChargeRequestDto result = new ChargeRequestDto();
return result;
}
/// <summary>
///
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[HttpPost("api/app/ChargeRequest/GetChargeRequestsByPatientRegisterId")]
public async Task<List<ChargeRequestDto>> GetChargeRequestsByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
//var patientRegister = _patientRegisterRepository.GetAsync(input.PatientRegisterId);
var list = (from chargeRequest in await _chargeRequestRepository.GetQueryableAsync()
join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
on chargeRequest.PatientRegisterId equals patientRegister.Id
join chargeRequestAsbitem in await _chargeRequestAsbitemRepository.GetQueryableAsync()
on chargeRequest.Id equals chargeRequestAsbitem.ChargeRequestId
where patientRegister.Id == input.PatientRegisterId
select new
{
chargeRequest,
chargeRequestAsbitem
}).ToList();
var result = list.GroupBy(o => o.chargeRequest).Select(o => new ChargeRequestDto()
{
Id = o.First().chargeRequest.Id,
ChargeRequestNo = o.First().chargeRequest.ChargeRequestNo,
ChargeRequestFlag = o.First().chargeRequest.ChargeRequestFlag,
HisChargeNo = o.First().chargeRequest.HisChargeNo,
Charges = o.Sum(o => o.chargeRequestAsbitem.Amount * o.chargeRequestAsbitem.ChargePrice),
CreationTime = o.First().chargeRequest.CreationTime,
}).OrderByDescending(o => o.CreationTime).ToList();
return result;
}
[HttpPost("api/app/ChargeRequest/GetChargeRequestAsbitemsByChargeRequestId")]
public async Task<List<ChargeRequestAsbitemDto>> GetChargeRequestAsbitemsByChargeRequestIdAsync(ChargeRequestIdInputDto input)
{
if (input == null)
{
throw new UserFriendlyException("input参数不能为空");
}
//var patientRegister = _patientRegisterRepository.GetAsync(input.PatientRegisterId);
var list = (from chargeRequest in await _chargeRequestRepository.GetQueryableAsync()
join chargeRequestAsbitem in await _chargeRequestAsbitemRepository.GetQueryableAsync()
on chargeRequest.Id equals chargeRequestAsbitem.ChargeRequestId
join asbitem in await _asbitemRepository.GetQueryableAsync()
on chargeRequestAsbitem.AsbitemId equals asbitem.Id
where chargeRequest.Id == input.ChargeRequestId
select new
{
chargeRequest,
chargeRequestAsbitem,
asbitem
}).ToList();
var result = list.Select(o => new ChargeRequestAsbitemDto()
{
AsbitemId = o.chargeRequest.Id,
AsbitemName = o.asbitem.DisplayName,
ChargePrice = o.chargeRequestAsbitem.ChargePrice,
Amount = o.chargeRequestAsbitem.Amount
}).ToList();
return result;
}
}
}