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.

1183 lines
56 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
  1. using JetBrains.Annotations;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using NPOI.SS.Formula.Functions;
  5. using Shentun.Peis.Charges;
  6. using Shentun.Peis.Enums;
  7. using Shentun.Peis.ItemTypes;
  8. using Shentun.Peis.Models;
  9. using Shentun.Peis.Patients;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using TencentCloud.Faceid.V20180301.Models;
  16. using TencentCloud.Mrs.V20200910.Models;
  17. using Volo.Abp.Application.Services;
  18. using Volo.Abp.Domain.Repositories;
  19. using Volo.Abp.Identity;
  20. using Volo.Abp.OpenIddict.Applications;
  21. using Volo.Abp.Users;
  22. namespace Shentun.Peis.ChargeReports
  23. {
  24. /// <summary>
  25. /// 收费统计报表
  26. /// </summary>
  27. [Authorize]
  28. [ApiExplorerSettings(GroupName = "Work")]
  29. public class ChargeReportAppService : ApplicationService
  30. {
  31. private readonly IRepository<Charge, Guid> _chargeRepository;
  32. private readonly IRepository<ChargePay> _chargePayRepository;
  33. private readonly IRepository<ChargeAsbitem, Guid> _chargeAsbitemRepository;
  34. private readonly IRepository<PayMode> _payModeRepository;
  35. private readonly IRepository<ChargeBack, Guid> _chargeBackRepository;
  36. private readonly IRepository<ChargeBackPay> _chargeBackPayRepository;
  37. private readonly IRepository<IdentityUser, Guid> _userRepository;
  38. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  39. private readonly IRepository<InvoiceItemType, Guid> _invoiceItemTypeRepository;
  40. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  41. private readonly IRepository<RegisterAsbitem, Guid> _registerAsbitemRepository;
  42. private readonly IRepository<CustomerOrgRegister, Guid> _customerOrgRegisterRepository;
  43. private readonly IRepository<CustomerOrg, Guid> _customerOrgRepository;
  44. private readonly IRepository<ItemType, Guid> _itemTypeRepository;
  45. private readonly IRepository<Patient, Guid> _patientRepository;
  46. private readonly IRepository<Sex> _sexRepository;
  47. private readonly ItemTypeManager _itemTypeManager;
  48. public ChargeReportAppService(
  49. IRepository<Charge, Guid> chargeRepository,
  50. IRepository<ChargeBack, Guid> chargeBackRepository,
  51. IRepository<ChargePay> chargePayRepository,
  52. IRepository<PayMode> payModeRepository,
  53. IRepository<ChargeBackPay> chargeBackPayRepository,
  54. IRepository<IdentityUser, Guid> userRepository,
  55. IRepository<ChargeAsbitem, Guid> chargeAsbitemRepository,
  56. IRepository<Asbitem, Guid> asbitemRepository,
  57. IRepository<InvoiceItemType, Guid> invoiceItemTypeRepository,
  58. IRepository<PatientRegister, Guid> patientRegisterRepository,
  59. IRepository<RegisterAsbitem, Guid> registerAsbitemRepository,
  60. IRepository<CustomerOrgRegister, Guid> customerOrgRegisterRepository,
  61. IRepository<CustomerOrg, Guid> customerOrgRepository,
  62. IRepository<ItemType, Guid> itemTypeRepository,
  63. ItemTypeManager itemTypeManager
  64. ,
  65. IRepository<Patient, Guid> patientRepository,
  66. IRepository<Sex> sexRepository)
  67. {
  68. _chargeRepository = chargeRepository;
  69. _chargeBackRepository = chargeBackRepository;
  70. _chargePayRepository = chargePayRepository;
  71. _payModeRepository = payModeRepository;
  72. _chargeBackPayRepository = chargeBackPayRepository;
  73. _userRepository = userRepository;
  74. _chargeAsbitemRepository = chargeAsbitemRepository;
  75. _asbitemRepository = asbitemRepository;
  76. _invoiceItemTypeRepository = invoiceItemTypeRepository;
  77. _patientRegisterRepository = patientRegisterRepository;
  78. _registerAsbitemRepository = registerAsbitemRepository;
  79. _customerOrgRegisterRepository = customerOrgRegisterRepository;
  80. _customerOrgRepository = customerOrgRepository;
  81. _itemTypeRepository = itemTypeRepository;
  82. _itemTypeManager = itemTypeManager;
  83. _patientRepository = patientRepository;
  84. _sexRepository = sexRepository;
  85. }
  86. /// <summary>
  87. /// 收费员收费报表 按支付方式
  88. /// </summary>
  89. /// <param name="input"></param>
  90. /// <returns></returns>
  91. [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-pay-mode")]
  92. public async Task<GetTollCollectorFeeReportInPayModeDto> GetTollCollectorFeeReportInPayModeAsync(GetTollCollectorFeeReportInPayModeRequestDto input)
  93. {
  94. #region 收费
  95. var chargeQuery = from a in await _chargeRepository.GetQueryableAsync()
  96. join b in await _chargePayRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  97. join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc
  98. from ac in cc.DefaultIfEmpty()
  99. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  100. from ad in dd.DefaultIfEmpty()
  101. select new
  102. {
  103. a,
  104. b,
  105. PayModeName = ac != null ? ac.DisplayName : "",
  106. UserName = ad != null ? ad.UserName : ""
  107. };
  108. if (input.UserIds.Any())
  109. {
  110. chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  111. }
  112. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  113. {
  114. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  115. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  116. }
  117. //收费归总
  118. var chargeDetails = chargeQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeDetail
  119. {
  120. UserName = s.FirstOrDefault().UserName,
  121. PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail
  122. {
  123. PayModeName = ss.FirstOrDefault().PayModeName,
  124. Money = DataHelper.DecimalRetainDecimals(ss.Sum(sss => sss.b.ChargeMoney), 2)
  125. }).ToList()
  126. });
  127. #endregion
  128. #region 退费
  129. var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync()
  130. join b in await _chargeBackPayRepository.GetQueryableAsync() on a.Id equals b.ChargeBackId
  131. join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc
  132. from ac in cc.DefaultIfEmpty()
  133. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  134. from ad in dd.DefaultIfEmpty()
  135. select new
  136. {
  137. a,
  138. b,
  139. PayModeName = ac != null ? ac.DisplayName : "",
  140. UserName = ad != null ? ad.UserName : ""
  141. };
  142. if (input.UserIds.Any())
  143. {
  144. chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  145. }
  146. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  147. {
  148. chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  149. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  150. }
  151. //收费归总
  152. var chargeBackDetails = chargeBackQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeBackDetail
  153. {
  154. UserName = s.FirstOrDefault().UserName,
  155. PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail
  156. {
  157. PayModeName = ss.FirstOrDefault().PayModeName,
  158. Money = DataHelper.DecimalRetainDecimals(ss.Sum(sss => sss.b.BackMoeny), 2)
  159. }).ToList()
  160. });
  161. #endregion
  162. #region 拼接收费数据
  163. List<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail> chargeAndChargeBackDetails = new List<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail>();
  164. //去重所有收费员
  165. var userNameList = chargeDetails.ToList().Select(s => s.UserName).Union(chargeBackDetails.ToList().Select(s => s.UserName));
  166. foreach (var userName in userNameList)
  167. {
  168. //添加收费数据
  169. foreach (var payMode in chargeDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails)
  170. {
  171. chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail
  172. {
  173. ChargeName = userName,
  174. PayModeName = payMode.PayModeName,
  175. ChargeMoney = payMode.Money,
  176. ChargeBackMoney = 0
  177. });
  178. }
  179. //添加退费数据
  180. foreach (var payMode in chargeBackDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails)
  181. {
  182. //支付方式是否已存在
  183. var isPayModeName = chargeAndChargeBackDetails.Where(m => m.ChargeName == userName && m.PayModeName == payMode.PayModeName).FirstOrDefault();
  184. if (isPayModeName != null)
  185. {
  186. //收费处已存在
  187. chargeAndChargeBackDetails.ForEach(m =>
  188. {
  189. if (m.PayModeName == payMode.PayModeName && m.ChargeName == userName)
  190. {
  191. m.ChargeBackMoney = payMode.Money;
  192. m.TotalMoney = m.ChargeMoney - payMode.Money;
  193. }
  194. });
  195. }
  196. else
  197. {
  198. chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail
  199. {
  200. ChargeName = userName,
  201. PayModeName = payMode.PayModeName,
  202. ChargeMoney = 0,
  203. ChargeBackMoney = payMode.Money,
  204. TotalMoney = 0 - payMode.Money
  205. });
  206. }
  207. }
  208. }
  209. #endregion
  210. string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日");
  211. var tollCollectorFeeReportInPayModeDto = new GetTollCollectorFeeReportInPayModeDto
  212. {
  213. ChargeDate = chargeDate,
  214. ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(),
  215. ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(),
  216. ChargeDetails = chargeAndChargeBackDetails,
  217. SumTotalMoney = chargeAndChargeBackDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeAndChargeBackDetails.Sum(s => s.TotalMoney), 2) : 0
  218. };
  219. return tollCollectorFeeReportInPayModeDto;
  220. }
  221. /// <summary>
  222. /// 收费员收费报表 按发票类型
  223. /// </summary>
  224. /// <param name="input"></param>
  225. /// <returns></returns>
  226. [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-invoice-type")]
  227. public async Task<GetTollCollectorFeeReportInInvoiceTypeDto> GetTollCollectorFeeReportInInvoiceTypeAsync(GetTollCollectorFeeReportInInvoiceTypeRequestDto input)
  228. {
  229. #region 收费
  230. var chargeQuery = from a in await _chargeRepository.GetQueryableAsync()
  231. join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  232. join c in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals c.Id into cc
  233. from ac in cc.DefaultIfEmpty()
  234. join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ac.InvoiceItemTypeId equals e.Id into ee
  235. from ae in ee.DefaultIfEmpty()
  236. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  237. from ad in dd.DefaultIfEmpty()
  238. select new
  239. {
  240. a,
  241. b,
  242. ac,
  243. InvoiceItemTypeName = ae != null ? ae.DisplayName : "",
  244. UserName = ad != null ? ad.UserName : ""
  245. };
  246. if (input.UserIds.Any())
  247. {
  248. chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  249. }
  250. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  251. {
  252. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  253. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  254. }
  255. //收费归总
  256. var chargeDetails = chargeQuery.GroupBy(g => g.ac.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail
  257. {
  258. InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName,
  259. InvoiceTypeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.Amount * ss.b.ChargePrice), 2)
  260. }).ToList();
  261. #endregion
  262. #region 退费
  263. var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync()
  264. join b in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals b.Id
  265. join c in await _chargeAsbitemRepository.GetQueryableAsync() on b.Id equals c.ChargeId
  266. join d in await _asbitemRepository.GetQueryableAsync() on c.AsbitemId equals d.Id into dd
  267. from ad in dd.DefaultIfEmpty()
  268. join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ad.InvoiceItemTypeId equals e.Id into ee
  269. from ae in ee.DefaultIfEmpty()
  270. join f in await _userRepository.GetQueryableAsync() on a.CreatorId equals f.Id into ff
  271. from af in ff.DefaultIfEmpty()
  272. select new
  273. {
  274. a,
  275. c,
  276. ad,
  277. InvoiceItemTypeName = ae != null ? ae.DisplayName : "",
  278. UserName = af != null ? af.UserName : ""
  279. };
  280. if (input.UserIds.Any())
  281. {
  282. chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  283. }
  284. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  285. {
  286. chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  287. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  288. }
  289. //收费归总
  290. var chargeBackDetails = chargeBackQuery.GroupBy(g => g.ad.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail
  291. {
  292. InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName,
  293. InvoiceTypeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.c.Amount * ss.c.ChargePrice), 2)
  294. }).ToList();
  295. #endregion
  296. string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日");
  297. //收款合计
  298. decimal chargeTotalMoney = chargeDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0;
  299. //退费合计
  300. decimal chargeBackTotalMoney = chargeBackDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeBackDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0;
  301. var tollCollectorFeeReportInInvoiceTypeDto = new GetTollCollectorFeeReportInInvoiceTypeDto
  302. {
  303. ChargeDate = chargeDate,
  304. ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(),
  305. ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(),
  306. ChargeDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeDetail
  307. {
  308. InvoiceTypeDetails = chargeDetails,
  309. TotalMoney = chargeTotalMoney
  310. },
  311. ChargeBackDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeBackDetail
  312. {
  313. InvoiceTypeDetails = chargeBackDetails,
  314. TotalMoney = chargeBackTotalMoney
  315. },
  316. SumTotalMoney = chargeTotalMoney - chargeBackTotalMoney
  317. };
  318. return tollCollectorFeeReportInInvoiceTypeDto;
  319. }
  320. /// <summary>
  321. /// 收费员收费报表 按组合项目
  322. /// </summary>
  323. /// <param name="input"></param>
  324. /// <returns></returns>
  325. [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-asbitem")]
  326. public async Task<List<GetTollCollectorFeeReportInAsbitemDto>> GetTollCollectorFeeReportInAsbitemAsync(GetTollCollectorFeeReportInAsbitemRequestDto input)
  327. {
  328. var query = from a in await _chargeRepository.GetQueryableAsync()
  329. join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  330. join c in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals c.Id into cc
  331. from ac in cc.DefaultIfEmpty()
  332. join d in await _itemTypeRepository.GetQueryableAsync() on ac.ItemTypeId equals d.Id into dd
  333. from ad in dd.DefaultIfEmpty()
  334. select new
  335. {
  336. a,
  337. b,
  338. AsbitemName = ac != null ? ac.DisplayName : "",
  339. ItemTypeName = ad != null ? ad.DisplayName : ""
  340. };
  341. if (input.UserIds.Any())
  342. {
  343. query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  344. }
  345. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  346. {
  347. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  348. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  349. }
  350. var asbitemGroup = query.GroupBy(g => g.b.AsbitemId).Select(s => new GetTollCollectorFeeReportInAsbitem_Detail
  351. {
  352. AsbitemName = s.FirstOrDefault().AsbitemName,
  353. ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.ChargePrice * ss.b.Amount), 2),
  354. ItemTypeName = s.FirstOrDefault().ItemTypeName
  355. }).ToList();
  356. var tollCollectorFeeReportInAsbitemDtos = asbitemGroup.GroupBy(g => g.ItemTypeName).Select(s => new GetTollCollectorFeeReportInAsbitemDto
  357. {
  358. Details = s.ToList(),
  359. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  360. TotalMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.ChargeMoney), 2)
  361. }).ToList();
  362. return tollCollectorFeeReportInAsbitemDtos;
  363. }
  364. /// <summary>
  365. /// 个人收费明细报表 按收费明细
  366. /// </summary>
  367. /// <param name="input"></param>
  368. /// <returns></returns>
  369. [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-details")]
  370. public async Task<List<GetPersonalFeeDetailsReportInFeeDetailsDto>> GetPersonalFeeDetailsReportInFeeDetailsAsync(GetPersonalFeeDetailsReportInFeeDetailsRequestDto input)
  371. {
  372. var query = from a in await _chargeRepository.GetQueryableAsync()
  373. join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  374. join c in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals c.Id
  375. join d in await _patientRepository.GetQueryableAsync() on c.PatientId equals d.Id into dd
  376. from ad in dd.DefaultIfEmpty()
  377. join e in await _sexRepository.GetQueryableAsync() on c.SexId equals e.Id into ee
  378. from ae in ee.DefaultIfEmpty()
  379. join f in await _registerAsbitemRepository.GetQueryableAsync() on c.Id equals f.PatientRegisterId
  380. join g in await _asbitemRepository.GetQueryableAsync() on f.AsbitemId equals g.Id into gg
  381. from ag in gg.DefaultIfEmpty()
  382. join h in await _userRepository.GetQueryableAsync() on a.CreatorId equals h.Id into hh
  383. from ah in hh.DefaultIfEmpty()
  384. where c.CustomerOrgId == GuidFlag.PersonCustomerOrgId && a.ChargeFlag == ChargeFlag.Charge
  385. select new
  386. {
  387. a,
  388. b,
  389. c,
  390. f,
  391. PatientNo = ad != null ? ad.PatientNo : "",
  392. SexName = ae != null ? ae.DisplayName : "",
  393. AsbitemName = ag != null ? ag.DisplayName : "",
  394. BookKeepingName = ah != null ? ah.UserName : ""
  395. };
  396. if (input.UserIds.Any())
  397. {
  398. query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  399. }
  400. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  401. {
  402. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  403. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  404. }
  405. if (!string.IsNullOrWhiteSpace(input.PatientName))
  406. {
  407. query = query.Where(m => m.c.PatientName == input.PatientName);
  408. }
  409. if (!string.IsNullOrWhiteSpace(input.PatientNo))
  410. {
  411. query = query.Where(m => m.PatientNo == input.PatientNo);
  412. }
  413. var patientRegisterGroup = query.Select(s => new GetPersonalFeeDetailsReportInFeeDetailsDto
  414. {
  415. Age = s.c.Age,
  416. AsbitemName = s.AsbitemName,
  417. BookKeepingName = s.BookKeepingName,
  418. BookkeepingTiem = s.a.CreationTime.ToString("yyyy-MM-dd HH:mm"),
  419. CharePrice = DataHelper.DecimalRetainDecimals(s.b.ChargePrice * s.b.Amount, 2),
  420. MedicalTimes = s.c.MedicalTimes,
  421. PatientName = s.c.PatientName,
  422. PatientNo = s.PatientNo,
  423. SexName = s.SexName,
  424. StandardPrice = DataHelper.DecimalRetainDecimals(s.f.StandardPrice * s.f.Amount, 2),
  425. Discount = Math.Floor((s.b.ChargePrice * s.b.Amount) / (s.f.StandardPrice.Value * s.f.Amount.Value)) + "%"
  426. }).ToList();
  427. return patientRegisterGroup;
  428. }
  429. /// <summary>
  430. /// 个人收费明细报表 按退费明细
  431. /// </summary>
  432. /// <param name="input"></param>
  433. /// <returns></returns>
  434. [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-refund-details")]
  435. public async Task<List<GetPersonalFeeDetailsReportInRefundDetailsDto>> GetPersonalFeeDetailsReportInRefundDetailsAsync(GetPersonalFeeDetailsReportInRefundDetailsRequestDto input)
  436. {
  437. var query = from a in await _chargeRepository.GetQueryableAsync()
  438. join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  439. join c in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals c.Id
  440. join d in await _patientRepository.GetQueryableAsync() on c.PatientId equals d.Id into dd
  441. from ad in dd.DefaultIfEmpty()
  442. join e in await _sexRepository.GetQueryableAsync() on c.SexId equals e.Id into ee
  443. from ae in ee.DefaultIfEmpty()
  444. join f in await _registerAsbitemRepository.GetQueryableAsync() on c.Id equals f.PatientRegisterId
  445. join g in await _asbitemRepository.GetQueryableAsync() on f.AsbitemId equals g.Id into gg
  446. from ag in gg.DefaultIfEmpty()
  447. join h in await _userRepository.GetQueryableAsync() on a.CreatorId equals h.Id into hh
  448. from ah in hh.DefaultIfEmpty()
  449. where c.CustomerOrgId == GuidFlag.PersonCustomerOrgId && a.ChargeFlag == ChargeFlag.ChargeBack
  450. select new
  451. {
  452. a,
  453. b,
  454. c,
  455. f,
  456. PatientNo = ad != null ? ad.PatientNo : "",
  457. SexName = ae != null ? ae.DisplayName : "",
  458. AsbitemName = ag != null ? ag.DisplayName : "",
  459. BookKeepingName = ah != null ? ah.UserName : ""
  460. };
  461. if (input.UserIds.Any())
  462. {
  463. query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  464. }
  465. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  466. {
  467. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  468. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  469. }
  470. if (!string.IsNullOrWhiteSpace(input.PatientName))
  471. {
  472. query = query.Where(m => m.c.PatientName == input.PatientName);
  473. }
  474. if (!string.IsNullOrWhiteSpace(input.PatientNo))
  475. {
  476. query = query.Where(m => m.PatientNo == input.PatientNo);
  477. }
  478. var patientRegisterGroup = query.Select(s => new GetPersonalFeeDetailsReportInRefundDetailsDto
  479. {
  480. Age = s.c.Age,
  481. AsbitemName = s.AsbitemName,
  482. BookKeepingName = s.BookKeepingName,
  483. BookkeepingTiem = s.a.CreationTime.ToString("yyyy-MM-dd HH:mm"),
  484. CharePrice = DataHelper.DecimalRetainDecimals(s.b.ChargePrice * s.b.Amount, 2),
  485. MedicalTimes = s.c.MedicalTimes,
  486. PatientName = s.c.PatientName,
  487. PatientNo = s.PatientNo,
  488. SexName = s.SexName,
  489. StandardPrice = DataHelper.DecimalRetainDecimals(s.f.StandardPrice * s.f.Amount, 2),
  490. Discount = Math.Floor((s.b.ChargePrice * s.b.Amount) / (s.f.StandardPrice.Value * s.f.Amount.Value)) + "%"
  491. }).ToList();
  492. return patientRegisterGroup;
  493. }
  494. /// <summary>
  495. /// 个人收费明细报表 按收费汇总
  496. /// </summary>
  497. /// <param name="input"></param>
  498. /// <returns></returns>
  499. [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-summary")]
  500. public async Task<GetPersonalFeeDetailsReportInFeeSummaryDto> GetPersonalFeeDetailsReportInFeeSummaryAsync(GetPersonalFeeDetailsReportInFeeSummaryRequestDto input)
  501. {
  502. var query = from a in await _patientRegisterRepository.GetQueryableAsync()
  503. join b in await _patientRepository.GetQueryableAsync() on a.PatientId equals b.Id into bb
  504. from ab in bb.DefaultIfEmpty()
  505. join c in await _sexRepository.GetQueryableAsync() on a.SexId equals c.Id into cc
  506. from ac in cc.DefaultIfEmpty()
  507. join d in (await _registerAsbitemRepository.GetQueryableAsync()).Where(m => m.IsCharge == 'Y')
  508. .GroupBy(g => g.PatientRegisterId)
  509. .Select(s => new
  510. {
  511. PatientRegisterId = s.Key,
  512. AsbitemChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.ChargePrice.Value * ss.Amount.Value), 2)
  513. }) on a.Id equals d.PatientRegisterId
  514. join e in await _chargeRepository.GetQueryableAsync() on a.Id equals e.PatientRegisterId
  515. join f in await _chargePayRepository.GetQueryableAsync() on e.Id equals f.ChargeId
  516. join g in await _payModeRepository.GetQueryableAsync() on f.PayModeId equals g.Id into gg
  517. from ag in gg.DefaultIfEmpty()
  518. join h in await _userRepository.GetQueryableAsync() on e.CreatorId equals h.Id into hh
  519. from ah in hh.DefaultIfEmpty()
  520. where a.CustomerOrgGroupId == GuidFlag.PersonCustomerOrgId
  521. select new
  522. {
  523. a,
  524. e,
  525. f,
  526. PatientName = a.PatientName,
  527. Age = a.Age,
  528. PatientNo = ab != null ? ab.PatientNo : "",
  529. SexName = ac != null ? ac.DisplayName : "",
  530. AsbitemChargeMoney = d.AsbitemChargeMoney,
  531. BookKeepingName = ah != null ? ah.UserName : "",
  532. PayModeName = ag != null ? ag.DisplayName : ""
  533. };
  534. if (input.UserIds.Any())
  535. {
  536. query = query.Where(m => input.UserIds.Contains(m.e.CreatorId.Value));
  537. }
  538. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  539. {
  540. query = query.Where(m => m.e.CreationTime >= Convert.ToDateTime(input.StartDate)
  541. && m.e.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  542. }
  543. if (!string.IsNullOrWhiteSpace(input.PatientName))
  544. {
  545. query = query.Where(m => m.PatientName == input.PatientName);
  546. }
  547. if (!string.IsNullOrWhiteSpace(input.PatientNo))
  548. {
  549. query = query.Where(m => m.PatientNo == input.PatientNo);
  550. }
  551. var personalFeeDetailsReportInFeeSummary_Details = query.GroupBy(g => g.e.Id).Select(s => new GetPersonalFeeDetailsReportInFeeSummary_Detail
  552. {
  553. Age = s.FirstOrDefault().Age,
  554. BookKeepingName = s.FirstOrDefault().BookKeepingName,
  555. BookkeepingTiem = s.FirstOrDefault().e.CreationTime.ToString("yyyy-MM-dd HH:mm"),
  556. ChargeFlagName = s.FirstOrDefault().e.ChargeFlag == ChargeFlag.Charge ? "收费" : "退费",
  557. ChargeMoney = s.FirstOrDefault().AsbitemChargeMoney,
  558. PatientName = s.FirstOrDefault().PatientName,
  559. PatientNo = s.FirstOrDefault().PatientNo,
  560. ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.f.ChargeMoney), 2),
  561. SexName = s.FirstOrDefault().SexName,
  562. DiscountMoney = s.FirstOrDefault().AsbitemChargeMoney - DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.f.ChargeMoney), 2),
  563. PayModes = s.Select(ss => new GetPersonalFeeDetailsReportInFeeSummary_PayMode
  564. {
  565. PayModeName = ss.PayModeName,
  566. ReceivedChargeMoney = ss.f.ChargeMoney
  567. }).ToList()
  568. }).ToList();
  569. decimal sumChargeMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.ChargeMoney), 2) : 0;
  570. decimal sumDiscountMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.DiscountMoney), 2) : 0;
  571. decimal sumReceivedChargeMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0;
  572. var personalFeeDetailsReportInFeeSummaryDto = new GetPersonalFeeDetailsReportInFeeSummaryDto
  573. {
  574. ChargeCount = personalFeeDetailsReportInFeeSummary_Details.Count,
  575. Details = personalFeeDetailsReportInFeeSummary_Details,
  576. SumChargeMoney = sumChargeMoney,
  577. SumDiscountMoney = sumDiscountMoney,
  578. SumReceivedChargeMoney = sumReceivedChargeMoney
  579. };
  580. return personalFeeDetailsReportInFeeSummaryDto;
  581. }
  582. /// <summary>
  583. /// 收费人收费汇总报表
  584. /// </summary>
  585. /// <param name="input"></param>
  586. /// <returns></returns>
  587. [HttpPost("api/app/charge-report/get-toll-collector-fee-summary-report")]
  588. public async Task<GetTollcollectorFeeSummaryReportDto> GetTollcollectorFeeSummaryReportAsync(GetTollcollectorFeeSummaryReportRequestDto input)
  589. {
  590. #region 收费
  591. var chargeQuery = from a in await _chargeRepository.GetQueryableAsync()
  592. join b in await _chargePayRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  593. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  594. from ad in dd.DefaultIfEmpty()
  595. select new
  596. {
  597. a,
  598. b,
  599. UserName = ad != null ? ad.UserName : ""
  600. };
  601. if (input.UserIds.Any())
  602. {
  603. chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  604. }
  605. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  606. {
  607. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  608. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  609. }
  610. //收费归总
  611. var chargeDetails = chargeQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetTollcollectorFeeSummaryReport_Detail
  612. {
  613. ChargeBackMoney = 0,
  614. ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.ChargeMoney), 2),
  615. ChargeName = s.FirstOrDefault().UserName,
  616. TotalMoney = 0
  617. }).ToList();
  618. #endregion
  619. #region 退费
  620. var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync()
  621. join b in await _chargeBackPayRepository.GetQueryableAsync() on a.Id equals b.ChargeBackId
  622. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  623. from ad in dd.DefaultIfEmpty()
  624. select new
  625. {
  626. a,
  627. b,
  628. UserName = ad != null ? ad.UserName : ""
  629. };
  630. if (input.UserIds.Any())
  631. {
  632. chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  633. }
  634. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  635. {
  636. chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  637. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  638. }
  639. //收费归总
  640. var chargeBackDetails = chargeBackQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetTollcollectorFeeSummaryReport_Detail
  641. {
  642. ChargeBackMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.BackMoeny), 2),
  643. ChargeMoney = 0,
  644. ChargeName = s.FirstOrDefault().UserName,
  645. TotalMoney = 0
  646. }).ToList();
  647. #endregion
  648. #region 拼接收费数据
  649. List<GetTollcollectorFeeSummaryReport_Detail> tollcollectorFeeSummaryReport_Detail = new List<GetTollcollectorFeeSummaryReport_Detail>();
  650. //去重科室Id
  651. var ChargeNameList = chargeDetails.Select(s => s.ChargeName).Union(chargeBackDetails.Select(s => s.ChargeName));
  652. foreach (var item in ChargeNameList)
  653. {
  654. var tempData = chargeDetails.Where(m => m.ChargeName == item).FirstOrDefault();
  655. if (tempData != null)
  656. {
  657. var chargeBackDetail = chargeBackDetails.Where(m => m.ChargeName == item).FirstOrDefault();
  658. if (chargeBackDetail != null)
  659. {
  660. tempData.ChargeBackMoney = chargeBackDetail.ChargeBackMoney;
  661. }
  662. }
  663. else
  664. {
  665. tempData = chargeBackDetails.Where(m => m.ChargeName == item).FirstOrDefault();
  666. }
  667. tempData.TotalMoney = tempData.ChargeMoney - tempData.ChargeBackMoney;
  668. tollcollectorFeeSummaryReport_Detail.Add(tempData);
  669. }
  670. #endregion
  671. decimal sumChargeMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.ChargeMoney), 2) : 0;
  672. decimal sumChargeBackMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.ChargeBackMoney), 2) : 0;
  673. decimal sumTotalMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.TotalMoney), 2) : 0;
  674. var tollcollectorFeeSummaryReportDto = new GetTollcollectorFeeSummaryReportDto
  675. {
  676. Details = tollcollectorFeeSummaryReport_Detail,
  677. SumChargeMoney = sumChargeMoney,
  678. SumChargeBackMoney = sumChargeBackMoney,
  679. SumTotalMoney = sumTotalMoney
  680. };
  681. return tollcollectorFeeSummaryReportDto;
  682. }
  683. /// <summary>
  684. /// 项目收费报表
  685. /// </summary>
  686. /// <param name="input"></param>
  687. /// <returns></returns>
  688. [HttpPost("api/app/charge-report/get-project-fees-report")]
  689. public async Task<GetProjectFeesReportDto> GetProjectFeesReportAsync(GetProjectFeesReportRequestDto input)
  690. {
  691. #region 查询项目类别ID
  692. List<Guid> itmeTypeIds = new List<Guid>();
  693. if (input.ItemTypeId != null)
  694. {
  695. itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value);
  696. }
  697. #endregion
  698. #region 登记
  699. var query = from a in await _registerAsbitemRepository.GetQueryableAsync()
  700. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  701. from ab in bb.DefaultIfEmpty()
  702. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  703. from ac in cc.DefaultIfEmpty()
  704. where a.IsCharge == 'Y'
  705. select new
  706. {
  707. a,
  708. ab,
  709. ac,
  710. AsbitemName = ab != null ? ab.DisplayName : "",
  711. ItemTypeName = ac != null ? ac.DisplayName : ""
  712. };
  713. if (itmeTypeIds.Any())
  714. {
  715. query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  716. }
  717. if (input.Asbitems.Any())
  718. {
  719. query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId));
  720. }
  721. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  722. {
  723. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  724. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  725. }
  726. //按项目类别分组
  727. var itemTypeGroups = query.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail
  728. {
  729. ItemTypeId = s.Key.ItemTypeId,
  730. AsbitemId = s.Key.AsbitemId,
  731. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  732. AsbitemName = s.FirstOrDefault().AsbitemName,
  733. ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2),
  734. ReceivedChargeMoney = 0
  735. }).ToList();
  736. #endregion
  737. #region 收费金额统计
  738. var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync()
  739. join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id
  740. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  741. from ab in bb.DefaultIfEmpty()
  742. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  743. from ac in cc.DefaultIfEmpty()
  744. where d.ChargeFlag == ChargeFlag.Charge
  745. select new
  746. {
  747. a,
  748. ab,
  749. AsbitemName = ab != null ? ab.DisplayName : "",
  750. ItemTypeName = ac != null ? ac.DisplayName : ""
  751. };
  752. if (itmeTypeIds.Any())
  753. {
  754. chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  755. }
  756. if (input.Asbitems.Any())
  757. {
  758. query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId));
  759. }
  760. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  761. {
  762. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  763. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  764. }
  765. //按项目类别分组 收费
  766. var itemTypeGroupCharges = chargeQuery.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail
  767. {
  768. ItemTypeId = s.Key.ItemTypeId,
  769. AsbitemId = s.Key.AsbitemId,
  770. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  771. AsbitemName = s.FirstOrDefault().AsbitemName,
  772. ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2),
  773. ChargeMoney = 0
  774. }).ToList();
  775. #endregion
  776. #region 拼接收费数据
  777. List<GetProjectFeesReport_Detail> projectFeesReport_Details = new List<GetProjectFeesReport_Detail>();
  778. //去重科室Id
  779. var itemTypeIdList = itemTypeGroups.Select(s => new { s.ItemTypeId, s.AsbitemId }).Union(itemTypeGroupCharges.Select(s => new { s.ItemTypeId, s.AsbitemId }));
  780. foreach (var item in itemTypeIdList)
  781. {
  782. var tempData = itemTypeGroups.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  783. if (tempData != null)
  784. {
  785. var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  786. if (itemTypeGroupCharge != null)
  787. {
  788. tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney;
  789. }
  790. }
  791. else
  792. {
  793. tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  794. }
  795. tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney;
  796. projectFeesReport_Details.Add(tempData);
  797. }
  798. #endregion
  799. decimal sumChargeMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0;
  800. decimal sumDiscountMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0;
  801. decimal sumReceivedChargeMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0;
  802. var projectFeesReportDto = new GetProjectFeesReportDto
  803. {
  804. Details = projectFeesReport_Details,
  805. SumChargeMoney = sumChargeMoney,
  806. SumDiscountMoney = sumDiscountMoney,
  807. SumReceivedChargeMoney = sumReceivedChargeMoney
  808. };
  809. return projectFeesReportDto;
  810. }
  811. /// <summary>
  812. /// 科室收费汇总表
  813. /// </summary>
  814. /// <param name="input"></param>
  815. /// <returns></returns>
  816. [HttpPost("api/app/charge-report/get-summary-of-departmental-fees-report")]
  817. public async Task<GetSummaryOfDepartmentalFeesReportDto> GetSummaryOfDepartmentalFeesReportAsync(GetSummaryOfDepartmentalFeesReportRequestDto input)
  818. {
  819. #region 查询项目类别ID
  820. List<Guid> itmeTypeIds = new List<Guid>();
  821. if (input.ItemTypeId != null)
  822. {
  823. itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value);
  824. }
  825. #endregion
  826. #region 登记
  827. var query = from a in await _registerAsbitemRepository.GetQueryableAsync()
  828. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  829. from ab in bb.DefaultIfEmpty()
  830. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  831. from ac in cc.DefaultIfEmpty()
  832. where a.IsCharge == 'Y'
  833. select new
  834. {
  835. a,
  836. ab,
  837. ac,
  838. ItemTypeName = ac != null ? ac.DisplayName : ""
  839. };
  840. if (itmeTypeIds.Any())
  841. {
  842. query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  843. }
  844. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  845. {
  846. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  847. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  848. }
  849. //按项目类别分组
  850. var itemTypeGroups = query.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail
  851. {
  852. ItemTypeId = s.Key,
  853. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  854. ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2),
  855. ReceivedChargeMoney = 0
  856. }).ToList();
  857. #endregion
  858. #region 收费金额统计
  859. var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync()
  860. join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id
  861. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  862. from ab in bb.DefaultIfEmpty()
  863. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  864. from ac in cc.DefaultIfEmpty()
  865. where d.ChargeFlag == ChargeFlag.Charge
  866. select new
  867. {
  868. a,
  869. ab,
  870. ItemTypeName = ac != null ? ac.DisplayName : ""
  871. };
  872. if (itmeTypeIds.Any())
  873. {
  874. chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  875. }
  876. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  877. {
  878. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  879. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  880. }
  881. //按项目类别分组 收费
  882. var itemTypeGroupCharges = chargeQuery.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail
  883. {
  884. ItemTypeId = s.Key,
  885. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  886. ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2),
  887. ChargeMoney = 0
  888. }).ToList();
  889. #endregion
  890. #region 拼接收费数据
  891. List<GetSummaryOfDepartmentalFeesReport_Detail> summaryOfDepartmentalFeesReport_Details = new List<GetSummaryOfDepartmentalFeesReport_Detail>();
  892. //去重科室Id
  893. var itemTypeIdList = itemTypeGroups.Select(s => s.ItemTypeId).Union(itemTypeGroupCharges.Select(s => s.ItemTypeId));
  894. foreach (var itemTypeId in itemTypeIdList)
  895. {
  896. var tempData = itemTypeGroups.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  897. if (tempData != null)
  898. {
  899. var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  900. if (itemTypeGroupCharge != null)
  901. {
  902. tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney;
  903. }
  904. }
  905. else
  906. {
  907. tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  908. }
  909. tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney;
  910. summaryOfDepartmentalFeesReport_Details.Add(tempData);
  911. }
  912. #endregion
  913. decimal sumChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0;
  914. decimal sumDiscountMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0;
  915. decimal sumReceivedChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0;
  916. var summaryOfDepartmentalFeesReportDto = new GetSummaryOfDepartmentalFeesReportDto
  917. {
  918. Details = summaryOfDepartmentalFeesReport_Details,
  919. SumChargeMoney = sumChargeMoney,
  920. SumDiscountMoney = sumDiscountMoney,
  921. SumReceivedChargeMoney = sumReceivedChargeMoney
  922. };
  923. return summaryOfDepartmentalFeesReportDto;
  924. }
  925. /// <summary>
  926. /// 体检人次汇总
  927. /// </summary>
  928. /// <param name="input"></param>
  929. /// <returns></returns>
  930. [HttpPost("api/app/charge-report/get-summary-of-physical-examination-personnel-report")]
  931. public async Task<GetSummaryOfPhysicalExaminationPersonnelReportDto> GetSummaryOfPhysicalExaminationPersonnelReportAsync(GetSummaryOfPhysicalExaminationPersonnelReportRequestDto input)
  932. {
  933. var query = from a in await _patientRegisterRepository.GetQueryableAsync()
  934. join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.PatientRegisterId
  935. join c in await _customerOrgRegisterRepository.GetQueryableAsync() on a.CustomerOrgRegisterId equals c.Id into cc
  936. from ac in cc.DefaultIfEmpty()
  937. join d in await _customerOrgRepository.GetQueryableAsync() on ac.CustomerOrgId equals d.Id into dd
  938. from ad in dd.DefaultIfEmpty()
  939. where a.CompleteFlag == PatientRegisterCompleteFlag.GeneralInspected
  940. select new
  941. {
  942. a,
  943. b,
  944. ac,
  945. CustomerOrgName = ad != null ? ad.DisplayName : ""
  946. };
  947. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  948. {
  949. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  950. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  951. }
  952. //按单位分组
  953. var customerOrgGroup = query.GroupBy(g => g.ac.CustomerOrgId).Select(s => new GetSummaryOfPhysicalExaminationPersonnelReport_Detail
  954. {
  955. CustomerOrgName = s.FirstOrDefault().CustomerOrgName,
  956. SummaryCount = s.Count(),
  957. ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.Amount.Value * ss.b.ChargePrice.Value), 2)
  958. }).ToList();
  959. //个人次数
  960. int personalCount = customerOrgGroup.Where(m => m.CustomerOrgId == GuidFlag.PersonCustomerOrgId).Count();
  961. //单位次数
  962. int customerOrgCount = customerOrgGroup.Count - personalCount;
  963. var summaryOfPhysicalExaminationPersonnelReportDto = new GetSummaryOfPhysicalExaminationPersonnelReportDto
  964. {
  965. CustomerOrgCount = customerOrgCount,
  966. PersonalCount = personalCount,
  967. Details = customerOrgGroup,
  968. SumCount = customerOrgCount + personalCount
  969. };
  970. return summaryOfPhysicalExaminationPersonnelReportDto;
  971. }
  972. }
  973. }