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.

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