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.

411 lines
19 KiB

using Cronos;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Shentun.Peis.CriticalFollowValues;
using Shentun.Peis.Enums;
using Shentun.Peis.Models;
using SqlSugar;
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.ObjectMapping;
namespace Shentun.Peis.PhoneFollowUps
{
/// <summary>
/// 电话随访记录
/// </summary>
[ApiExplorerSettings(GroupName = "Work")]
[Authorize]
public class PhoneFollowUpAppService : ApplicationService
{
private readonly IRepository<PhoneFollowUp, Guid> _phoneFollowUpRepository;
private readonly CacheService _cacheService;
private readonly IRepository<FollowUp, Guid> _followUpRepository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly IRepository<Item, Guid> _itemRepository;
private readonly IRepository<Patient, Guid> _patientRepository;
public PhoneFollowUpAppService(
IRepository<PhoneFollowUp, Guid> phoneFollowUpRepository,
CacheService cacheService,
IRepository<FollowUp, Guid> followUpRepository,
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckItem> registerCheckItemRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<Item, Guid> itemRepository,
IRepository<Patient, Guid> patientRepository)
{
_phoneFollowUpRepository = phoneFollowUpRepository;
_cacheService = cacheService;
_followUpRepository = followUpRepository;
_patientRegisterRepository = patientRegisterRepository;
_registerCheckRepository = registerCheckRepository;
_registerCheckItemRepository = registerCheckItemRepository;
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_asbitemRepository = asbitemRepository;
_itemRepository = itemRepository;
_patientRepository = patientRepository;
}
/// <summary>
/// 获取电话随访记录信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/Get")]
public async Task<PhoneFollowUpDto> GetAsync(PhoneFollowUpIdInputDto input)
{
var phoneFollowUpEnt = await _phoneFollowUpRepository.GetAsync(input.PhoneFollowUpId);
var entityDto = ObjectMapper.Map<PhoneFollowUp, PhoneFollowUpDto>(phoneFollowUpEnt);
entityDto.CreatorName = await _cacheService.GetSurnameAsync(entityDto.CreatorId);
entityDto.LastModifierName = await _cacheService.GetSurnameAsync(entityDto.LastModifierId);
return entityDto;
}
/// <summary>
/// 获取电话随访记录信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/GetList")]
public async Task<List<PhoneFollowUpWithPatientRegisterDto>> GetListAsync(PhoneFollowUpListInputDto input)
{
var query = from phoneFollowUp in await _phoneFollowUpRepository.GetQueryableAsync()
join followUp in await _followUpRepository.GetQueryableAsync() on phoneFollowUp.FollowUpId equals followUp.Id
join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on followUp.PatientRegisterId equals patientRegister.Id
orderby patientRegister.Id, phoneFollowUp.PlanFollowDate
select new
{
patientName = patientRegister.PatientName,
phoneFollowUp
};
if (input.FollowUpId != null)
{
query = query.Where(m => m.phoneFollowUp.FollowUpId == input.FollowUpId);
}
if (!string.IsNullOrWhiteSpace(input.KeyWord))
{
query = query.Where(m => (!string.IsNullOrWhiteSpace(m.phoneFollowUp.FollowUpContent) && m.phoneFollowUp.FollowUpContent.Contains(input.KeyWord))
|| (!string.IsNullOrWhiteSpace(m.phoneFollowUp.ReplyContent) && m.phoneFollowUp.ReplyContent.Contains(input.KeyWord))
);
}
if (input.IsComplete != null)
{
query = query.Where(m => m.phoneFollowUp.IsComplete == input.IsComplete);
}
if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
{
query = query.Where(m => m.phoneFollowUp.PlanFollowDate >= Convert.ToDateTime(input.StartDate)
&& m.phoneFollowUp.PlanFollowDate <= Convert.ToDateTime(input.EndDate).AddDays(1));
}
var entListDto = query.ToList().Select(s => new PhoneFollowUpWithPatientRegisterDto
{
FollowUpId = s.phoneFollowUp.FollowUpId,
CreationTime = s.phoneFollowUp.CreationTime,
ReplyContent = s.phoneFollowUp.ReplyContent,
PlanFollowDate = DataHelper.ConversionDateToString(s.phoneFollowUp.PlanFollowDate),
CreatorId = s.phoneFollowUp.CreatorId,
FollowUpContent = s.phoneFollowUp.ReplyContent,
Id = s.phoneFollowUp.Id,
IsComplete = s.phoneFollowUp.IsComplete,
LastModificationTime = s.phoneFollowUp.LastModificationTime,
LastModifierId = s.phoneFollowUp.LastModifierId,
CreatorName = _cacheService.GetSurnameAsync(s.phoneFollowUp.CreatorId).GetAwaiter().GetResult(),
LastModifierName = _cacheService.GetSurnameAsync(s.phoneFollowUp.LastModifierId).GetAwaiter().GetResult(),
PatientName = s.patientName
}).ToList();
return entListDto;
}
/// <summary>
/// 获取人员随访记录
/// </summary>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/GetPatientRegisterCriticalList")]
public async Task<List<PhoneFollowUpWithCriticalItemDto>> GetPatientRegisterCriticalListAsync()
{
var query = from followUp in await _followUpRepository.GetQueryableAsync()
join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on followUp.PatientRegisterId equals patientRegister.Id
join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id
join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
join item in await _itemRepository.GetQueryableAsync() on registerCheckItem.ItemId equals item.Id
join phoneFollowUp in await _phoneFollowUpRepository.GetQueryableAsync() on followUp.Id equals phoneFollowUp.FollowUpId into phoneFollowUpTemp
from phoneFollowUpEmpty in phoneFollowUpTemp.DefaultIfEmpty()
select new
{
patientRegister,
registerCheck,
asbitem,
registerCheckItem,
item,
followUp,
phoneFollowUpEmpty,
patient
};
var ff = query.ToQueryString();
var followUpGroup = query.ToList().GroupBy(g => g.followUp);
var entListDto = followUpGroup.Select(s => new PhoneFollowUpWithCriticalItemDto
{
PatientName = s.FirstOrDefault().patientRegister.PatientName,
IdNo = s.FirstOrDefault().patient.IdNo,
PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
PhoneFollowUpDetail = s.Where(m => m.phoneFollowUpEmpty != null).GroupBy(g => g.phoneFollowUpEmpty).Select(ss => new PhoneFollowUpSimpleDto
{
FollowUpContent = ss.Key.FollowUpContent,
IsComplete = ss.Key.IsComplete,
PlanFollowDate = DataHelper.ConversionDateToString(ss.Key.PlanFollowDate),
ReplyContent = ss.Key.ReplyContent
}).ToList(),
AbnormalAsbitemDetail = s.Where(m => m.registerCheck.IsCriticalValue != null).GroupBy(g => g.registerCheck).Select(ss => new PhoneFollowUpWithCriticalItemAbnormalAsbitemDto
{
CriticalValueContent = ss.Key.CriticalValueContent,
AsbitemName = string.Join(",", ss.Select(sss => sss.asbitem.DisplayName).Distinct()),
IsCriticalValue = ss.Key.IsCriticalValue == null ? 'N' : ss.Key.IsCriticalValue.Value,
IsReview = ss.Key.IsReview == null ? 'N' : ss.Key.IsReview.Value
}).ToList(),
AbnormalItemDetail = s.Where(m => m.registerCheckItem.IsCriticalValue != null).GroupBy(g => g.registerCheckItem).Select(ss => new PhoneFollowUpWithCriticalItemAbnormalItemDto
{
CriticalValueContent = ss.Key.CriticalValueContent,
ItemName = ss.FirstOrDefault().item.DisplayName,
IsCriticalValue = ss.Key.IsCriticalValue == null ? 'N' : ss.Key.IsCriticalValue.Value,
IsReview = ss.Key.IsReview == null ? 'N' : ss.Key.IsReview.Value
}).ToList()
}).ToList();
return entListDto;
//var query = from phoneFollowUp in await _phoneFollowUpRepository.GetQueryableAsync()
// join followUp in await _followUpRepository.GetQueryableAsync() on phoneFollowUp.FollowUpId equals followUp.Id
// join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on followUp.PatientRegisterId equals patientRegister.Id
// orderby patientRegister.Id, phoneFollowUp.PlanFollowDate
// select new
// {
// patientName = patientRegister.PatientName,
// phoneFollowUp
// };
//if (input.FollowUpId != null)
//{
// query = query.Where(m => m.phoneFollowUp.FollowUpId == input.FollowUpId);
//}
//if (!string.IsNullOrWhiteSpace(input.KeyWord))
//{
// query = query.Where(m => (!string.IsNullOrWhiteSpace(m.phoneFollowUp.FollowUpContent) && m.phoneFollowUp.FollowUpContent.Contains(input.KeyWord))
// || (!string.IsNullOrWhiteSpace(m.phoneFollowUp.ReplyContent) && m.phoneFollowUp.ReplyContent.Contains(input.KeyWord))
// );
//}
//if (input.IsComplete != null)
//{
// query = query.Where(m => m.phoneFollowUp.IsComplete == input.IsComplete);
//}
//if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
//{
// query = query.Where(m => m.phoneFollowUp.PlanFollowDate >= Convert.ToDateTime(input.StartDate)
// && m.phoneFollowUp.PlanFollowDate <= Convert.ToDateTime(input.EndDate).AddDays(1));
//}
//var entListDto = query.ToList().Select(s => new PhoneFollowUpWithPatientRegisterDto
//{
// FollowUpId = s.phoneFollowUp.FollowUpId,
// CreationTime = s.phoneFollowUp.CreationTime,
// ReplyContent = s.phoneFollowUp.ReplyContent,
// PlanFollowDate = DataHelper.ConversionDateToString(s.phoneFollowUp.PlanFollowDate),
// CreatorId = s.phoneFollowUp.CreatorId,
// FollowUpContent = s.phoneFollowUp.ReplyContent,
// Id = s.phoneFollowUp.Id,
// IsComplete = s.phoneFollowUp.IsComplete,
// LastModificationTime = s.phoneFollowUp.LastModificationTime,
// LastModifierId = s.phoneFollowUp.LastModifierId,
// CreatorName = _cacheService.GetSurnameAsync(s.phoneFollowUp.CreatorId).GetAwaiter().GetResult(),
// LastModifierName = _cacheService.GetSurnameAsync(s.phoneFollowUp.LastModifierId).GetAwaiter().GetResult(),
// PatientName = s.patientName
//}).ToList();
//return entListDto;
}
/// <summary>
/// 创建电话随访记录
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/Create")]
public async Task CreateAsync(CreatePhoneFollowUpDto input)
{
if (string.IsNullOrWhiteSpace(input.ModeValue))
{
throw new UserFriendlyException("计划周期不能为空");
}
if (input.FollowUpMode == FollowUpModeFlag.Corn && string.IsNullOrWhiteSpace(input.EndDate))
{
throw new UserFriendlyException("采用corn表达式时需要截止日期");
}
var isPhoneFollowUp = await _phoneFollowUpRepository.CountAsync(c => c.FollowUpId == input.FollowUpId);
if (isPhoneFollowUp > 0)
{
throw new UserFriendlyException("已存在电话随访记录,不允许重复生成");
}
List<PhoneFollowUp> phoneFollowUpList = new List<PhoneFollowUp>();
if (input.FollowUpMode == FollowUpModeFlag.Corn)
{
//corn表达式
#region 解析Cron表达式
try
{
var schedule = CronExpression.Parse(input.ModeValue, CronFormat.IncludeSeconds);
var occurrences = schedule.GetOccurrences(DateTime.UtcNow, Convert.ToDateTime(input.EndDate).ToUniversalTime()); //获取截止时间前所有的计划时间
foreach (var occurrence in occurrences)
{
var phoneFollowUpEntity = new PhoneFollowUp(GuidGenerator.Create())
{
FollowUpContent = input.FollowUpContent,
FollowUpId = input.FollowUpId,
ReplyContent = input.ReplyContent,
PlanFollowDate = occurrence,
IsComplete = 'N'
};
phoneFollowUpList.Add(phoneFollowUpEntity);
}
}
catch (Exception ex)
{
throw new UserFriendlyException("Corn表达式不正确");
}
#endregion
}
else
{
//其他模式
int planCount = 0;
try
{
planCount = Convert.ToInt32(input.ModeValue);
}
catch (Exception ex)
{
throw new UserFriendlyException("Corn表达式不正确");
}
for (int i = 0; i < planCount; i++)
{
DateTime planFollowDate = DateTime.Now;
if (input.FollowUpMode == FollowUpModeFlag.Day)
{
planFollowDate = planFollowDate.AddDays(i);
}
else if (input.FollowUpMode == FollowUpModeFlag.Week)
{
planFollowDate = planFollowDate.AddDays(7 * i);
}
else if (input.FollowUpMode == FollowUpModeFlag.Month)
{
planFollowDate = planFollowDate.AddMonths(i);
}
else if (input.FollowUpMode == FollowUpModeFlag.Year)
{
planFollowDate = planFollowDate.AddYears(i);
}
var phoneFollowUpEntity = new PhoneFollowUp(GuidGenerator.Create())
{
FollowUpContent = input.FollowUpContent,
FollowUpId = input.FollowUpId,
ReplyContent = input.ReplyContent,
PlanFollowDate = planFollowDate,
IsComplete = 'N'
};
phoneFollowUpList.Add(phoneFollowUpEntity);
}
}
if (phoneFollowUpList.Any())
{
await _phoneFollowUpRepository.InsertManyAsync(phoneFollowUpList);
}
}
/// <summary>
/// 修改电话随访记录
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/Update")]
public async Task UpdateAsync(UpdatePhoneFollowUpDto input)
{
var entity = await _phoneFollowUpRepository.GetAsync(input.PhoneFollowUpId);
entity.IsComplete = input.IsComplete;
if (input.PlanFollowDate != null)
{
entity.PlanFollowDate = Convert.ToDateTime(input.PlanFollowDate);
}
if (!string.IsNullOrWhiteSpace(input.ReplyContent))
{
entity.ReplyContent = input.ReplyContent;
}
if (!string.IsNullOrWhiteSpace(input.FollowUpContent))
{
entity.FollowUpContent = input.FollowUpContent;
}
await _phoneFollowUpRepository.UpdateAsync(entity);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/PhoneFollowUp/Delete")]
public async Task DeleteAsync(PhoneFollowUpIdInputDto input)
{
await _phoneFollowUpRepository.DeleteAsync(input.PhoneFollowUpId);
}
}
}