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.

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