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.

383 lines
18 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore;
  4. using NUglify.Helpers;
  5. using Shentun.Peis.Models;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Volo.Abp.Application.Services;
  12. using Volo.Abp.Domain.Repositories;
  13. using Volo.Abp.Identity;
  14. namespace Shentun.Peis.InternalReports
  15. {
  16. /// <summary>
  17. /// 内部报表
  18. /// </summary>
  19. [ApiExplorerSettings(GroupName = "Work")]
  20. [Authorize]
  21. public class InternalReportAppService : ApplicationService
  22. {
  23. private readonly IRepository<IdentityUser, Guid> _userRepository;
  24. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  25. private readonly IRepository<RegisterAsbitem, Guid> _registerAsbitemRepository;
  26. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  27. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  28. private readonly IRepository<ItemType, Guid> _itemTypeRepository;
  29. private readonly IRepository<CustomerOrg, Guid> _customerOrgRepository;
  30. public InternalReportAppService(
  31. IRepository<IdentityUser, Guid> userRepository,
  32. IRepository<PatientRegister, Guid> patientRegisterRepository,
  33. IRepository<RegisterAsbitem, Guid> registerAsbitemRepository,
  34. IRepository<RegisterCheck, Guid> registerCheckRepository,
  35. IRepository<Asbitem, Guid> asbitemRepository,
  36. IRepository<ItemType, Guid> itemTypeRepository,
  37. IRepository<CustomerOrg, Guid> customerOrgRepository
  38. )
  39. {
  40. this._userRepository = userRepository;
  41. this._patientRegisterRepository = patientRegisterRepository;
  42. this._registerAsbitemRepository = registerAsbitemRepository;
  43. this._registerCheckRepository = registerCheckRepository;
  44. this._asbitemRepository = asbitemRepository;
  45. this._itemTypeRepository = itemTypeRepository;
  46. this._customerOrgRepository = customerOrgRepository;
  47. }
  48. /// <summary>
  49. /// 登记人员工作量统计
  50. /// </summary>
  51. /// <param name="input"></param>
  52. /// <returns></returns>
  53. [HttpPost("api/app/internalreport/getregistrationpersonnelworkloadreport")]
  54. public async Task<List<GetRegistrationPersonnelWorkLoadReportDto>> GetRegistrationPersonnelWorkLoadReportAsync(GetRegistrationPersonnelWorkLoadReportRequestDto input)
  55. {
  56. var query = (from a in await _patientRegisterRepository.GetQueryableAsync()
  57. join b in await _userRepository.GetQueryableAsync() on a.CreatorId equals b.Id into bb
  58. from ab in bb.DefaultIfEmpty()
  59. where (a.CreationTime >= Convert.ToDateTime(input.StartDate) &&
  60. a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1))
  61. select new { a, PersonnelName = ab != null ? ab.UserName : "" });
  62. var sumCount = query.Count(); //总数
  63. if (input.UserIds.Count > 0)
  64. {
  65. query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  66. }
  67. var entlistdto = query.GroupBy(g => new { g.a.CreatorId, g.PersonnelName })
  68. .Select(s => new GetRegistrationPersonnelWorkLoadReportDto
  69. {
  70. PersonnelName = s.Key.PersonnelName,
  71. RegisterCount = s.Count(),
  72. Percentage = Math.Round(Convert.ToDecimal(s.Count() * 100) / sumCount, 2).ToString()
  73. }).ToList();
  74. return entlistdto;
  75. }
  76. /// <summary>
  77. /// 医生工作量统计
  78. /// </summary>
  79. /// <param name="input"></param>
  80. /// <returns></returns>
  81. [HttpPost("api/app/internalreport/getdoctorpersonnelworkloadreport")]
  82. public async Task<List<GetDoctorPersonnelWorkLoadReportDto>> GetDoctorPersonnelWorkLoadReportAsync(GetDoctorPersonnelWorkLoadReportRequestDto input)
  83. {
  84. var query = (from a in await _registerAsbitemRepository.GetQueryableAsync()
  85. join c in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals c.Id into cc
  86. from ac in cc.DefaultIfEmpty()
  87. join d in await _registerCheckRepository.GetQueryableAsync() on a.RegisterCheckId equals d.Id into dd
  88. from ad in dd.DefaultIfEmpty()
  89. join b in await _userRepository.GetQueryableAsync() on ad.CheckDoctorId equals b.Id.ToString() into bb
  90. from ab in bb.DefaultIfEmpty()
  91. where (a.CreationTime >= Convert.ToDateTime(input.StartDate) &&
  92. a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)
  93. && ad.CompleteFlag == '1'
  94. )
  95. select new
  96. {
  97. a,
  98. CheckDoctorId = ad.CheckDoctorId,
  99. DoctorName = ab != null ? ab.UserName : ad.CheckDoctorId,
  100. AsbitemName = ac != null ? ac.DisplayName : ""
  101. });
  102. if (input.UserIds.Count > 0)
  103. {
  104. query = query.Where(m => input.UserIds.Contains(m.CheckDoctorId));
  105. }
  106. //var ssd = query.ToQueryString();
  107. var entlistdto = query.GroupBy(g => new { g.a.AsbitemId, g.a.CreatorId, })
  108. .Select(s => new GetDoctorPersonnelWorkLoadReportDto
  109. {
  110. AsbitemName = s.FirstOrDefault().AsbitemName,
  111. CheckCount = s.Count(),
  112. DoctorName = s.FirstOrDefault().DoctorName,
  113. AvgChargePrice = Math.Round(s.Average(v => v.a.ChargePrice.Value), 2),
  114. AvgStandardPrice = Math.Round(s.Average(v => v.a.StandardPrice.Value), 2),
  115. SumChargePrice = Math.Round(s.Sum(v => v.a.ChargePrice.Value * v.a.Amount.Value), 2),
  116. SumStandardPrice = Math.Round(s.Sum(v => v.a.StandardPrice.Value * v.a.Amount.Value), 2)
  117. }).ToList();
  118. return entlistdto;
  119. }
  120. /// <summary>
  121. /// 总检医生工作量统计
  122. /// </summary>
  123. /// <param name="input"></param>
  124. /// <returns></returns>
  125. [HttpPost("api/app/internalreport/getsumcheckdoctorworkloadreport")]
  126. public async Task<List<GetSumCheckDoctorWorkLoadReportDto>> GetSumCheckDoctorWorkLoadReportAsync(GetSumCheckDoctorWorkLoadReportRequestDto input)
  127. {
  128. var query = (from a in await _patientRegisterRepository.GetQueryableAsync()
  129. join b in await _userRepository.GetQueryableAsync() on a.SummaryDoctor equals b.Id.ToString() into bb
  130. from ab in bb.DefaultIfEmpty()
  131. where (!string.IsNullOrEmpty(a.SummaryDoctor) && a.SummaryDate != null && a.SummaryDate.Value.ToDateTime(TimeOnly.MinValue) >= Convert.ToDateTime(input.StartDate) &&
  132. a.SummaryDate.Value.ToDateTime(TimeOnly.MinValue) < Convert.ToDateTime(input.EndDate).AddDays(1))
  133. select new
  134. {
  135. a,
  136. SumCheckDoctorName = ab != null ? ab.UserName : ""
  137. });
  138. var sumCount = query.Count(); //总数
  139. if (input.UserIds.Count > 0)
  140. {
  141. query = query.Where(m => input.UserIds.ToString().Contains(m.a.SummaryDoctor));
  142. }
  143. var entlistdto = query.GroupBy(g => new { g.a.SummaryDoctor, g.SumCheckDoctorName })
  144. .Select(s => new GetSumCheckDoctorWorkLoadReportDto
  145. {
  146. SumCheckDoctorName = s.Key.SumCheckDoctorName,
  147. SumCheckCount = s.Count(),
  148. Percentage = Math.Round(Convert.ToDecimal(s.Count() * 100) / sumCount, 2).ToString()
  149. }).ToList();
  150. return entlistdto;
  151. }
  152. /// <summary>
  153. /// 审核医生工作量统计
  154. /// </summary>
  155. /// <param name="input"></param>
  156. /// <returns></returns>
  157. [HttpPost("api/app/internalreport/getauditdoctorworkloadreport")]
  158. public async Task<List<GetAuditDoctorWorkLoadReportDto>> GetAuditDoctorWorkLoadReportAsync(GetAuditDoctorWorkLoadReportRequestDto input)
  159. {
  160. var query = (from a in await _patientRegisterRepository.GetQueryableAsync()
  161. join b in await _userRepository.GetQueryableAsync() on a.SummaryDoctor equals b.Id.ToString() into bb
  162. from ab in bb.DefaultIfEmpty()
  163. where (!string.IsNullOrEmpty(a.AuditDoctor) && a.AuditDate != null && a.AuditDate.Value.ToDateTime(TimeOnly.MinValue) >= Convert.ToDateTime(input.StartDate) &&
  164. a.AuditDate.Value.ToDateTime(TimeOnly.MinValue) < Convert.ToDateTime(input.EndDate).AddDays(1))
  165. select new
  166. {
  167. a,
  168. AuditDoctorName = ab != null ? ab.UserName : ""
  169. });
  170. var sumCount = query.Count(); //总数
  171. if (input.UserIds.Count > 0)
  172. {
  173. query = query.Where(m => input.UserIds.ToString().Contains(m.a.AuditDoctor));
  174. }
  175. var entlistdto = query.GroupBy(g => new { g.a.AuditDoctor, g.AuditDoctorName })
  176. .Select(s => new GetAuditDoctorWorkLoadReportDto
  177. {
  178. AuditDoctorName = s.Key.AuditDoctorName,
  179. AuditCount = s.Count(),
  180. Percentage = Math.Round(Convert.ToDecimal(s.Count() * 100) / sumCount, 2).ToString()
  181. }).ToList();
  182. return entlistdto;
  183. }
  184. /// <summary>
  185. /// 科室工作量统计 标准格式 只统计RegisterCheck表标记检查了的数据
  186. /// </summary>
  187. /// <param name="input"></param>
  188. /// <returns></returns>
  189. [HttpPost("api/app/internalreport/getitemtypeworkloadinstandard")]
  190. public async Task<List<GetItemTypeWorkLoadInStandardDto>> GetItemTypeWorkLoadInStandardAsync(GetItemTypeWorkLoadInStandardRequestDto input)
  191. {
  192. var qeruy = from a in await _registerAsbitemRepository.GetQueryableAsync()
  193. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id
  194. join c in await _itemTypeRepository.GetQueryableAsync() on b.ItemTypeId equals c.Id
  195. join d in await _registerCheckRepository.GetQueryableAsync() on a.RegisterCheckId equals d.Id into dd
  196. from ad in dd.DefaultIfEmpty()
  197. where (!string.IsNullOrEmpty(ad.CheckDoctorId) && ad.CheckDate != null)
  198. select new
  199. {
  200. a.AsbitemId,
  201. a.StandardPrice,
  202. a.ChargePrice,
  203. a.Amount,
  204. AsbitemName = b.DisplayName,
  205. ItemTypeId = b.ItemTypeId,
  206. ItemTypeName = c.DisplayName,
  207. ad.CheckDate
  208. };
  209. if (input.ItemTypeId.Any())
  210. {
  211. qeruy = qeruy.Where(m => input.ItemTypeId.Contains(m.ItemTypeId));
  212. }
  213. if (!string.IsNullOrEmpty(input.StartDate) && !string.IsNullOrEmpty(input.EndDate))
  214. {
  215. qeruy = qeruy.Where(m => m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) >= Convert.ToDateTime(input.StartDate) &&
  216. m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) < Convert.ToDateTime(input.EndDate).AddDays(1));
  217. }
  218. var entlist = qeruy.GroupBy(g => new { g.ItemTypeId, g.AsbitemId })
  219. .Select(s => new GetItemTypeWorkLoadInStandardDto
  220. {
  221. AsbitemName = s.First().AsbitemName,
  222. AsbitemCount = s.Count(),
  223. ItemTypeName = s.First().ItemTypeName,
  224. AvgChargePrice = Math.Round(s.Average(v => v.ChargePrice.Value), 2),
  225. AvgStandardPrice = Math.Round(s.Average(v => v.StandardPrice.Value), 2),
  226. SumChargePrice = Math.Round(s.Sum(v => v.ChargePrice.Value * v.Amount.Value), 2),
  227. SumStandardPrice = Math.Round(s.Sum(v => v.StandardPrice.Value * v.Amount.Value), 2)
  228. }).ToList();
  229. return entlist;
  230. }
  231. /// <summary>
  232. /// 科室工作量统计 单位和医生
  233. /// </summary>
  234. /// <param name="input"></param>
  235. /// <returns></returns>
  236. [HttpPost("api/app/internalreport/getitemtypeworkloadincustomeranddoctor")]
  237. public async Task<List<GetItemTypeWorkLoadInCustomerAndDoctorDto>> GetItemTypeWorkLoadInCustomerAndDoctorAsync(GetItemTypeWorkLoadInCustomerAndDoctorRequestDto input)
  238. {
  239. var qeruy = from a in await _registerAsbitemRepository.GetQueryableAsync()
  240. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id
  241. join c in await _itemTypeRepository.GetQueryableAsync() on b.ItemTypeId equals c.Id
  242. join d in await _registerCheckRepository.GetQueryableAsync() on a.RegisterCheckId equals d.Id into dd
  243. from ad in dd.DefaultIfEmpty()
  244. join e in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals e.Id
  245. join f in await _customerOrgRepository.GetQueryableAsync() on e.CustomerOrgId equals f.Id into ff
  246. from af in ff.DefaultIfEmpty()
  247. join g in await _userRepository.GetQueryableAsync() on ad.CheckDoctorId equals g.Id.ToString() into gg
  248. from ag in gg.DefaultIfEmpty()
  249. where (!string.IsNullOrEmpty(ad.CheckDoctorId) && ad.CheckDate != null)
  250. select new
  251. {
  252. a.AsbitemId,
  253. AsbitemName = b.DisplayName,
  254. ItemTypeId = b.ItemTypeId,
  255. ItemTypeName = c.DisplayName,
  256. CustomerName = af.DisplayName,
  257. CustomerOrgId = e.CustomerOrgId,
  258. ad.CheckDoctorId,
  259. ad.CheckDate,
  260. DoctorName = ag != null ? ag.UserName : ""
  261. };
  262. if (input.ItemTypeId.Any())
  263. {
  264. qeruy = qeruy.Where(m => input.ItemTypeId.Contains(m.ItemTypeId));
  265. }
  266. if (!string.IsNullOrEmpty(input.StartDate) && !string.IsNullOrEmpty(input.EndDate))
  267. {
  268. qeruy = qeruy.Where(m => m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) >= Convert.ToDateTime(input.StartDate) &&
  269. m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) < Convert.ToDateTime(input.EndDate).AddDays(1));
  270. }
  271. var entlist = qeruy.GroupBy(g => new { g.CustomerOrgId, g.ItemTypeId, g.AsbitemId, g.CheckDoctorId })
  272. .Select(s => new GetItemTypeWorkLoadInCustomerAndDoctorDto
  273. {
  274. AsbitemName = s.First().AsbitemName,
  275. DoctorCheckCount = s.Count(),
  276. ItemTypeName = s.First().ItemTypeName,
  277. CustomerName = s.First().CustomerName,
  278. DoctorName = s.First().DoctorName
  279. }).ToList();
  280. return entlist;
  281. }
  282. /// <summary>
  283. /// 科室工作量统计 单位和组合项目
  284. /// </summary>
  285. /// <param name="input"></param>
  286. /// <returns></returns>
  287. [HttpPost("api/app/internalreport/getitemtypeworkloadincustomerandasbitem")]
  288. public async Task<List<GetItemTypeWorkLoadInCustomerAndAsbitemDto>> GetItemTypeWorkLoadInCustomerAndAsbitemAsync(GetItemTypeWorkLoadInCustomerAndAsbitemRequestDto input)
  289. {
  290. var qeruy = from a in await _registerAsbitemRepository.GetQueryableAsync()
  291. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id
  292. join c in await _itemTypeRepository.GetQueryableAsync() on b.ItemTypeId equals c.Id
  293. join d in await _registerCheckRepository.GetQueryableAsync() on a.RegisterCheckId equals d.Id into dd
  294. from ad in dd.DefaultIfEmpty()
  295. join e in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals e.Id
  296. join f in await _customerOrgRepository.GetQueryableAsync() on e.CustomerOrgId equals f.Id into ff
  297. from af in ff.DefaultIfEmpty()
  298. where (!string.IsNullOrEmpty(ad.CheckDoctorId) && ad.CheckDate != null)
  299. select new
  300. {
  301. a.AsbitemId,
  302. AsbitemName = b.DisplayName,
  303. ItemTypeId = b.ItemTypeId,
  304. ItemTypeName = c.DisplayName,
  305. CustomerName = af.DisplayName,
  306. CustomerOrgId = e.CustomerOrgId,
  307. ad.CheckDate
  308. };
  309. if (input.ItemTypeId.Any())
  310. {
  311. qeruy = qeruy.Where(m => input.ItemTypeId.Contains(m.ItemTypeId));
  312. }
  313. if (!string.IsNullOrEmpty(input.StartDate) && !string.IsNullOrEmpty(input.EndDate))
  314. {
  315. qeruy = qeruy.Where(m => m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) >= Convert.ToDateTime(input.StartDate) &&
  316. m.CheckDate.Value.ToDateTime(TimeOnly.MinValue) < Convert.ToDateTime(input.EndDate).AddDays(1));
  317. }
  318. var entlist = qeruy.GroupBy(g => new { g.CustomerOrgId, g.ItemTypeId, g.AsbitemId })
  319. .Select(s => new GetItemTypeWorkLoadInCustomerAndAsbitemDto
  320. {
  321. AsbitemName = s.First().AsbitemName,
  322. DoctorCheckCount = s.Count(),
  323. ItemTypeName = s.First().ItemTypeName,
  324. CustomerName = s.First().CustomerName
  325. }).ToList();
  326. return entlist;
  327. }
  328. }
  329. }