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.

742 lines
34 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
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Shentun.Peis.Charges;
  4. using Shentun.Peis.Enums;
  5. using Shentun.Peis.ItemTypes;
  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 TencentCloud.Faceid.V20180301.Models;
  13. using TencentCloud.Mrs.V20200910.Models;
  14. using Volo.Abp.Application.Services;
  15. using Volo.Abp.Domain.Repositories;
  16. using Volo.Abp.Identity;
  17. using Volo.Abp.Users;
  18. namespace Shentun.Peis.ChargeReports
  19. {
  20. /// <summary>
  21. /// 收费统计报表
  22. /// </summary>
  23. [Authorize]
  24. [ApiExplorerSettings(GroupName = "Work")]
  25. public class ChargeReportAppService : ApplicationService
  26. {
  27. private readonly IRepository<Charge, Guid> _chargeRepository;
  28. private readonly IRepository<ChargePay> _chargePayRepository;
  29. private readonly IRepository<ChargeAsbitem, Guid> _chargeAsbitemRepository;
  30. private readonly IRepository<PayMode> _payModeRepository;
  31. private readonly IRepository<ChargeBack, Guid> _chargeBackRepository;
  32. private readonly IRepository<ChargeBackPay> _chargeBackPayRepository;
  33. private readonly IRepository<IdentityUser, Guid> _userRepository;
  34. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  35. private readonly IRepository<InvoiceItemType, Guid> _invoiceItemTypeRepository;
  36. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  37. private readonly IRepository<RegisterAsbitem, Guid> _registerAsbitemRepository;
  38. private readonly IRepository<CustomerOrgRegister, Guid> _customerOrgRegisterRepository;
  39. private readonly IRepository<CustomerOrg, Guid> _customerOrgRepository;
  40. private readonly IRepository<ItemType, Guid> _itemTypeRepository;
  41. private readonly ItemTypeManager _itemTypeManager;
  42. public ChargeReportAppService(
  43. IRepository<Charge, Guid> chargeRepository,
  44. IRepository<ChargeBack, Guid> chargeBackRepository,
  45. IRepository<ChargePay> chargePayRepository,
  46. IRepository<PayMode> payModeRepository,
  47. IRepository<ChargeBackPay> chargeBackPayRepository,
  48. IRepository<IdentityUser, Guid> userRepository,
  49. IRepository<ChargeAsbitem, Guid> chargeAsbitemRepository,
  50. IRepository<Asbitem, Guid> asbitemRepository,
  51. IRepository<InvoiceItemType, Guid> invoiceItemTypeRepository,
  52. IRepository<PatientRegister, Guid> patientRegisterRepository,
  53. IRepository<RegisterAsbitem, Guid> registerAsbitemRepository,
  54. IRepository<CustomerOrgRegister, Guid> customerOrgRegisterRepository,
  55. IRepository<CustomerOrg, Guid> customerOrgRepository,
  56. IRepository<ItemType, Guid> itemTypeRepository,
  57. ItemTypeManager itemTypeManager
  58. )
  59. {
  60. _chargeRepository = chargeRepository;
  61. _chargeBackRepository = chargeBackRepository;
  62. _chargePayRepository = chargePayRepository;
  63. _payModeRepository = payModeRepository;
  64. _chargeBackPayRepository = chargeBackPayRepository;
  65. _userRepository = userRepository;
  66. _chargeAsbitemRepository = chargeAsbitemRepository;
  67. _asbitemRepository = asbitemRepository;
  68. _invoiceItemTypeRepository = invoiceItemTypeRepository;
  69. _patientRegisterRepository = patientRegisterRepository;
  70. _registerAsbitemRepository = registerAsbitemRepository;
  71. _customerOrgRegisterRepository = customerOrgRegisterRepository;
  72. _customerOrgRepository = customerOrgRepository;
  73. _itemTypeRepository = itemTypeRepository;
  74. _itemTypeManager = itemTypeManager;
  75. }
  76. /// <summary>
  77. /// 收费员收费报表 按支付方式
  78. /// </summary>
  79. /// <param name="input"></param>
  80. /// <returns></returns>
  81. [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-pay-mode")]
  82. public async Task<GetTollCollectorFeeReportInPayModeDto> GetTollCollectorFeeReportInPayModeAsync(GetTollCollectorFeeReportInPayModeRequestDto input)
  83. {
  84. #region 收费
  85. var chargeQuery = from a in await _chargeRepository.GetQueryableAsync()
  86. join b in await _chargePayRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  87. join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc
  88. from ac in cc.DefaultIfEmpty()
  89. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  90. from ad in dd.DefaultIfEmpty()
  91. select new
  92. {
  93. a,
  94. b,
  95. PayModeName = ac != null ? ac.DisplayName : "",
  96. UserName = ad != null ? ad.UserName : ""
  97. };
  98. if (input.UserIds.Any())
  99. {
  100. chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  101. }
  102. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  103. {
  104. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  105. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  106. }
  107. //收费归总
  108. var chargeDetails = chargeQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeDetail
  109. {
  110. UserName = s.FirstOrDefault().UserName,
  111. PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail
  112. {
  113. PayModeName = ss.FirstOrDefault().PayModeName,
  114. Money = Math.Round(ss.Sum(sss => sss.b.ChargeMoney), 2)
  115. }).ToList()
  116. });
  117. #endregion
  118. #region 退费
  119. var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync()
  120. join b in await _chargeBackPayRepository.GetQueryableAsync() on a.Id equals b.ChargeBackId
  121. join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc
  122. from ac in cc.DefaultIfEmpty()
  123. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  124. from ad in dd.DefaultIfEmpty()
  125. select new
  126. {
  127. a,
  128. b,
  129. PayModeName = ac != null ? ac.DisplayName : "",
  130. UserName = ad != null ? ad.UserName : ""
  131. };
  132. if (input.UserIds.Any())
  133. {
  134. chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  135. }
  136. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  137. {
  138. chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  139. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  140. }
  141. //收费归总
  142. var chargeBackDetails = chargeBackQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeBackDetail
  143. {
  144. UserName = s.FirstOrDefault().UserName,
  145. PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail
  146. {
  147. PayModeName = ss.FirstOrDefault().PayModeName,
  148. Money = Math.Round(ss.Sum(sss => sss.b.BackMoeny), 2)
  149. }).ToList()
  150. });
  151. #endregion
  152. #region 拼接收费数据
  153. List<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail> chargeAndChargeBackDetails = new List<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail>();
  154. //去重所有收费员
  155. var userNameList = chargeDetails.ToList().Select(s => s.UserName).Union(chargeBackDetails.ToList().Select(s => s.UserName));
  156. foreach (var userName in userNameList)
  157. {
  158. //添加收费数据
  159. foreach (var payMode in chargeDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails)
  160. {
  161. chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail
  162. {
  163. ChargeName = userName,
  164. PayModeName = payMode.PayModeName,
  165. ChargeMoney = payMode.Money,
  166. ChargeBackMoney = 0
  167. });
  168. }
  169. //添加退费数据
  170. foreach (var payMode in chargeBackDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails)
  171. {
  172. //支付方式是否已存在
  173. var isPayModeName = chargeAndChargeBackDetails.Where(m => m.ChargeName == userName && m.PayModeName == payMode.PayModeName).FirstOrDefault();
  174. if (isPayModeName != null)
  175. {
  176. //收费处已存在
  177. chargeAndChargeBackDetails.ForEach(m =>
  178. {
  179. if (m.PayModeName == payMode.PayModeName && m.ChargeName == userName)
  180. {
  181. m.ChargeBackMoney = payMode.Money;
  182. m.TotalMoney = m.ChargeMoney - payMode.Money;
  183. }
  184. });
  185. }
  186. else
  187. {
  188. chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail
  189. {
  190. ChargeName = userName,
  191. PayModeName = payMode.PayModeName,
  192. ChargeMoney = 0,
  193. ChargeBackMoney = payMode.Money,
  194. TotalMoney = 0 - payMode.Money
  195. });
  196. }
  197. }
  198. }
  199. #endregion
  200. string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日");
  201. var tollCollectorFeeReportInPayModeDto = new GetTollCollectorFeeReportInPayModeDto
  202. {
  203. ChargeDate = chargeDate,
  204. ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(),
  205. ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(),
  206. ChargeDetails = chargeAndChargeBackDetails,
  207. SumTotalMoney = chargeAndChargeBackDetails.Any() ? Math.Round(chargeAndChargeBackDetails.Sum(s => s.TotalMoney), 2) : 0
  208. };
  209. return tollCollectorFeeReportInPayModeDto;
  210. }
  211. /// <summary>
  212. /// 收费员收费报表 按发票类型
  213. /// </summary>
  214. /// <param name="input"></param>
  215. /// <returns></returns>
  216. [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-invoice-type")]
  217. public async Task<GetTollCollectorFeeReportInInvoiceTypeDto> GetTollCollectorFeeReportInInvoiceTypeAsync(GetTollCollectorFeeReportInInvoiceTypeRequestDto input)
  218. {
  219. #region 收费
  220. var chargeQuery = from a in await _chargeRepository.GetQueryableAsync()
  221. join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId
  222. join c in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals c.Id into cc
  223. from ac in cc.DefaultIfEmpty()
  224. join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ac.InvoiceItemTypeId equals e.Id into ee
  225. from ae in ee.DefaultIfEmpty()
  226. join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd
  227. from ad in dd.DefaultIfEmpty()
  228. select new
  229. {
  230. a,
  231. b,
  232. ac,
  233. InvoiceItemTypeName = ae != null ? ae.DisplayName : "",
  234. UserName = ad != null ? ad.UserName : ""
  235. };
  236. if (input.UserIds.Any())
  237. {
  238. chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  239. }
  240. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  241. {
  242. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  243. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  244. }
  245. //收费归总
  246. var chargeDetails = chargeQuery.GroupBy(g => g.ac.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail
  247. {
  248. InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName,
  249. InvoiceTypeMoney = Math.Round(s.Sum(ss => ss.b.Amount * ss.b.ChargePrice), 2)
  250. }).ToList();
  251. #endregion
  252. #region 退费
  253. var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync()
  254. join b in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals b.Id
  255. join c in await _chargeAsbitemRepository.GetQueryableAsync() on b.Id equals c.ChargeId
  256. join d in await _asbitemRepository.GetQueryableAsync() on c.AsbitemId equals d.Id into dd
  257. from ad in dd.DefaultIfEmpty()
  258. join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ad.InvoiceItemTypeId equals e.Id into ee
  259. from ae in ee.DefaultIfEmpty()
  260. join f in await _userRepository.GetQueryableAsync() on a.CreatorId equals f.Id into ff
  261. from af in ff.DefaultIfEmpty()
  262. select new
  263. {
  264. a,
  265. c,
  266. ad,
  267. InvoiceItemTypeName = ae != null ? ae.DisplayName : "",
  268. UserName = af != null ? af.UserName : ""
  269. };
  270. if (input.UserIds.Any())
  271. {
  272. chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value));
  273. }
  274. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  275. {
  276. chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  277. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  278. }
  279. //收费归总
  280. var chargeBackDetails = chargeBackQuery.GroupBy(g => g.ad.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail
  281. {
  282. InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName,
  283. InvoiceTypeMoney = Math.Round(s.Sum(ss => ss.c.Amount * ss.c.ChargePrice), 2)
  284. }).ToList();
  285. #endregion
  286. string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日");
  287. //收款合计
  288. decimal chargeTotalMoney = chargeDetails.Any() ? Math.Round(chargeDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0;
  289. //退费合计
  290. decimal chargeBackTotalMoney = chargeBackDetails.Any() ? Math.Round(chargeBackDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0;
  291. var tollCollectorFeeReportInInvoiceTypeDto = new GetTollCollectorFeeReportInInvoiceTypeDto
  292. {
  293. ChargeDate = chargeDate,
  294. ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(),
  295. ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(),
  296. ChargeDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeDetail
  297. {
  298. InvoiceTypeDetails = chargeDetails,
  299. TotalMoney = chargeTotalMoney
  300. },
  301. ChargeBackDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeBackDetail
  302. {
  303. InvoiceTypeDetails = chargeBackDetails,
  304. TotalMoney = chargeBackTotalMoney
  305. },
  306. SumTotalMoney = chargeTotalMoney - chargeBackTotalMoney
  307. };
  308. return tollCollectorFeeReportInInvoiceTypeDto;
  309. }
  310. /// <summary>
  311. /// 项目收费报表
  312. /// </summary>
  313. /// <param name="input"></param>
  314. /// <returns></returns>
  315. [HttpPost("api/app/charge-report/get-project-fees-report")]
  316. public async Task<GetProjectFeesReportDto> GetProjectFeesReportAsync(GetProjectFeesReportRequestDto input)
  317. {
  318. #region 查询项目类别ID
  319. List<Guid> itmeTypeIds = new List<Guid>();
  320. if (input.ItemTypeId != null)
  321. {
  322. itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value);
  323. }
  324. #endregion
  325. #region 登记
  326. var query = from a in await _registerAsbitemRepository.GetQueryableAsync()
  327. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  328. from ab in bb.DefaultIfEmpty()
  329. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  330. from ac in cc.DefaultIfEmpty()
  331. where a.IsCharge == 'Y'
  332. select new
  333. {
  334. a,
  335. ab,
  336. ac,
  337. AsbitemName = ab != null ? ab.DisplayName : "",
  338. ItemTypeName = ac != null ? ac.DisplayName : ""
  339. };
  340. if (itmeTypeIds.Any())
  341. {
  342. query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  343. }
  344. if (input.Asbitems.Any())
  345. {
  346. query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId));
  347. }
  348. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  349. {
  350. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  351. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  352. }
  353. //按项目类别分组
  354. var itemTypeGroups = query.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail
  355. {
  356. ItemTypeId = s.Key.ItemTypeId,
  357. AsbitemId = s.Key.AsbitemId,
  358. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  359. AsbitemName = s.FirstOrDefault().AsbitemName,
  360. ChargeMoney = Math.Round(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2),
  361. ReceivedChargeMoney = 0
  362. }).ToList();
  363. #endregion
  364. #region 收费金额统计
  365. var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync()
  366. join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id
  367. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  368. from ab in bb.DefaultIfEmpty()
  369. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  370. from ac in cc.DefaultIfEmpty()
  371. where d.ChargeFlag == ChargeFlag.Charge
  372. select new
  373. {
  374. a,
  375. ab,
  376. AsbitemName = ab != null ? ab.DisplayName : "",
  377. ItemTypeName = ac != null ? ac.DisplayName : ""
  378. };
  379. if (itmeTypeIds.Any())
  380. {
  381. chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  382. }
  383. if (input.Asbitems.Any())
  384. {
  385. query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId));
  386. }
  387. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  388. {
  389. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  390. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  391. }
  392. //按项目类别分组 收费
  393. var itemTypeGroupCharges = chargeQuery.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail
  394. {
  395. ItemTypeId = s.Key.ItemTypeId,
  396. AsbitemId = s.Key.AsbitemId,
  397. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  398. AsbitemName = s.FirstOrDefault().AsbitemName,
  399. ReceivedChargeMoney = Math.Round(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2),
  400. ChargeMoney = 0
  401. }).ToList();
  402. #endregion
  403. #region 拼接收费数据
  404. List<GetProjectFeesReport_Detail> projectFeesReport_Details = new List<GetProjectFeesReport_Detail>();
  405. //去重科室Id
  406. var itemTypeIdList = itemTypeGroups.Select(s => new { s.ItemTypeId, s.AsbitemId }).Union(itemTypeGroupCharges.Select(s => new { s.ItemTypeId, s.AsbitemId }));
  407. foreach (var item in itemTypeIdList)
  408. {
  409. var tempData = itemTypeGroups.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  410. if (tempData != null)
  411. {
  412. var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  413. if (itemTypeGroupCharge != null)
  414. {
  415. tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney;
  416. }
  417. }
  418. else
  419. {
  420. tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault();
  421. }
  422. tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney;
  423. projectFeesReport_Details.Add(tempData);
  424. }
  425. #endregion
  426. decimal sumChargeMoney = projectFeesReport_Details.Any() ? Math.Round(projectFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0;
  427. decimal sumDiscountMoney = projectFeesReport_Details.Any() ? Math.Round(projectFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0;
  428. decimal sumReceivedChargeMoney = projectFeesReport_Details.Any() ? Math.Round(projectFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0;
  429. var projectFeesReportDto = new GetProjectFeesReportDto
  430. {
  431. Details = projectFeesReport_Details,
  432. SumChargeMoney = sumChargeMoney,
  433. SumDiscountMoney = sumDiscountMoney,
  434. SumReceivedChargeMoney = sumReceivedChargeMoney
  435. };
  436. return projectFeesReportDto;
  437. }
  438. /// <summary>
  439. /// 科室收费汇总表
  440. /// </summary>
  441. /// <param name="input"></param>
  442. /// <returns></returns>
  443. [HttpPost("api/app/charge-report/get-summary-of-departmental-fees-report")]
  444. public async Task<GetSummaryOfDepartmentalFeesReportDto> GetSummaryOfDepartmentalFeesReportAsync(GetSummaryOfDepartmentalFeesReportRequestDto input)
  445. {
  446. #region 查询项目类别ID
  447. List<Guid> itmeTypeIds = new List<Guid>();
  448. if (input.ItemTypeId != null)
  449. {
  450. itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value);
  451. }
  452. #endregion
  453. #region 登记
  454. var query = from a in await _registerAsbitemRepository.GetQueryableAsync()
  455. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  456. from ab in bb.DefaultIfEmpty()
  457. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  458. from ac in cc.DefaultIfEmpty()
  459. where a.IsCharge == 'Y'
  460. select new
  461. {
  462. a,
  463. ab,
  464. ac,
  465. ItemTypeName = ac != null ? ac.DisplayName : ""
  466. };
  467. if (itmeTypeIds.Any())
  468. {
  469. query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  470. }
  471. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  472. {
  473. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  474. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  475. }
  476. //按项目类别分组
  477. var itemTypeGroups = query.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail
  478. {
  479. ItemTypeId = s.Key,
  480. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  481. ChargeMoney = Math.Round(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2),
  482. ReceivedChargeMoney = 0
  483. }).ToList();
  484. #endregion
  485. #region 收费金额统计
  486. var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync()
  487. join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id
  488. join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb
  489. from ab in bb.DefaultIfEmpty()
  490. join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc
  491. from ac in cc.DefaultIfEmpty()
  492. where d.ChargeFlag == ChargeFlag.Charge
  493. select new
  494. {
  495. a,
  496. ab,
  497. ItemTypeName = ac != null ? ac.DisplayName : ""
  498. };
  499. if (itmeTypeIds.Any())
  500. {
  501. chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId));
  502. }
  503. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  504. {
  505. chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  506. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  507. }
  508. //按项目类别分组 收费
  509. var itemTypeGroupCharges = chargeQuery.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail
  510. {
  511. ItemTypeId = s.Key,
  512. ItemTypeName = s.FirstOrDefault().ItemTypeName,
  513. ReceivedChargeMoney = Math.Round(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2),
  514. ChargeMoney = 0
  515. }).ToList();
  516. #endregion
  517. #region 拼接收费数据
  518. List<GetSummaryOfDepartmentalFeesReport_Detail> summaryOfDepartmentalFeesReport_Details = new List<GetSummaryOfDepartmentalFeesReport_Detail>();
  519. //去重科室Id
  520. var itemTypeIdList = itemTypeGroups.Select(s => s.ItemTypeId).Union(itemTypeGroupCharges.Select(s => s.ItemTypeId));
  521. foreach (var itemTypeId in itemTypeIdList)
  522. {
  523. var tempData = itemTypeGroups.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  524. if (tempData != null)
  525. {
  526. var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  527. if (itemTypeGroupCharge != null)
  528. {
  529. tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney;
  530. }
  531. }
  532. else
  533. {
  534. tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault();
  535. }
  536. tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney;
  537. summaryOfDepartmentalFeesReport_Details.Add(tempData);
  538. }
  539. #endregion
  540. decimal sumChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? Math.Round(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0;
  541. decimal sumDiscountMoney = summaryOfDepartmentalFeesReport_Details.Any() ? Math.Round(summaryOfDepartmentalFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0;
  542. decimal sumReceivedChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? Math.Round(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0;
  543. var summaryOfDepartmentalFeesReportDto = new GetSummaryOfDepartmentalFeesReportDto
  544. {
  545. Details = summaryOfDepartmentalFeesReport_Details,
  546. SumChargeMoney = sumChargeMoney,
  547. SumDiscountMoney = sumDiscountMoney,
  548. SumReceivedChargeMoney = sumReceivedChargeMoney
  549. };
  550. return summaryOfDepartmentalFeesReportDto;
  551. }
  552. /// <summary>
  553. /// 体检人次汇总
  554. /// </summary>
  555. /// <param name="input"></param>
  556. /// <returns></returns>
  557. [HttpPost("api/app/charge-report/get-summary-of-physical-examination-personnel-report")]
  558. public async Task<GetSummaryOfPhysicalExaminationPersonnelReportDto> GetSummaryOfPhysicalExaminationPersonnelReportAsync(GetSummaryOfPhysicalExaminationPersonnelReportRequestDto input)
  559. {
  560. var query = from a in await _patientRegisterRepository.GetQueryableAsync()
  561. join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.PatientRegisterId
  562. join c in await _customerOrgRegisterRepository.GetQueryableAsync() on a.CustomerOrgRegisterId equals c.Id into cc
  563. from ac in cc.DefaultIfEmpty()
  564. join d in await _customerOrgRepository.GetQueryableAsync() on ac.CustomerOrgId equals d.Id into dd
  565. from ad in dd.DefaultIfEmpty()
  566. where a.CompleteFlag == PatientRegisterCompleteFlag.GeneralInspected
  567. select new
  568. {
  569. a,
  570. b,
  571. ac,
  572. CustomerOrgName = ad != null ? ad.DisplayName : ""
  573. };
  574. if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
  575. {
  576. query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate)
  577. && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1));
  578. }
  579. //按单位分组
  580. var customerOrgGroup = query.GroupBy(g => g.ac.CustomerOrgId).Select(s => new GetSummaryOfPhysicalExaminationPersonnelReport_Detail
  581. {
  582. CustomerOrgName = s.FirstOrDefault().CustomerOrgName,
  583. SummaryCount = s.Count(),
  584. ChargeMoney = Math.Round(s.Sum(ss => ss.b.Amount.Value * ss.b.ChargePrice.Value), 2)
  585. }).ToList();
  586. //个人次数
  587. int personalCount = customerOrgGroup.Where(m => m.CustomerOrgId == GuidFlag.PersonCustomerOrgId).Count();
  588. //单位次数
  589. int customerOrgCount = customerOrgGroup.Count - personalCount;
  590. var summaryOfPhysicalExaminationPersonnelReportDto = new GetSummaryOfPhysicalExaminationPersonnelReportDto
  591. {
  592. CustomerOrgCount = customerOrgCount,
  593. PersonalCount = personalCount,
  594. Details = customerOrgGroup,
  595. SumCount = customerOrgCount + personalCount
  596. };
  597. return summaryOfPhysicalExaminationPersonnelReportDto;
  598. }
  599. }
  600. }