EnforcementApplication.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. using Hotline.JudicialManagement;
  2. using Hotline.Orders;
  3. using Hotline.Settings;
  4. using Hotline.Share.Dtos;
  5. using Hotline.Share.Dtos.JudicialManagement;
  6. using Hotline.Share.Dtos.Order;
  7. using Hotline.Share.Enums.JudicialManagement;
  8. using Hotline.Share.Enums.Order;
  9. using Hotline.Share.Tools;
  10. using Hotline.Snapshot;
  11. using MapsterMapper;
  12. using SqlSugar;
  13. using XF.Domain.Authentications;
  14. using XF.Domain.Dependency;
  15. using XF.Domain.Repository;
  16. namespace Hotline.Application.JudicialManagement
  17. {
  18. public class EnforcementApplication : IEnforcementApplication, IScopeDependency
  19. {
  20. private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
  21. private readonly IMapper _mapper;
  22. private readonly ISessionContext _sessionContext;
  23. private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
  24. /// <summary>
  25. ///
  26. /// </summary>
  27. /// <param name="judicialManagementOrdersRepository"></param>
  28. /// <param name="enforcementOrdersHandlerRepository"></param>
  29. /// <param name="mapper"></param>
  30. /// <param name="sessionContext"></param>
  31. /// <param name="lawEnforcementAgenciesRepository"></param>
  32. public EnforcementApplication(
  33. IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
  34. IMapper mapper,
  35. ISessionContext sessionContext,
  36. IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository)
  37. {
  38. _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
  39. _mapper = mapper;
  40. _sessionContext = sessionContext;
  41. _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
  42. }
  43. /// <summary>
  44. /// 受理工单
  45. /// </summary>
  46. /// <param name="dto"></param>
  47. /// <returns></returns>
  48. public ISugarQueryable<JudicialManagementOrders> GetOwnOrderList(QueryEnforcementOrderNewDto dto)
  49. {
  50. return _judicialManagementOrdersRepository.Queryable()
  51. .Where(d => d.CreatorId == _sessionContext.UserId)
  52. .WhereIF(dto.IsEnforcementOrder.HasValue, d => d.IsEnforcementOrder == dto.IsEnforcementOrder)//是否行政执法类
  53. .WhereIF(dto.IsPassTheBuckOrder.HasValue, d => d.IsPassTheBuckOrder == dto.IsPassTheBuckOrder)//是否推诿
  54. .WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
  55. .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => dto.EventTypeId == d.EventTypeId)//事项分类
  56. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!)) //标题
  57. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
  58. .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  59. .WhereIF(!string.IsNullOrEmpty(dto.ChannelCode), d => d.SourceChannelCode == dto.ChannelCode) //来源渠道
  60. .WhereIF(!string.IsNullOrEmpty(dto.HotspotId), d => d.TransferPhone == dto.HotspotId) //热点类型
  61. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
  62. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  63. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  64. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
  65. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) //区域
  66. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.EnforcementOrdersHandler, "Value", dto.OrgCode))//接办部门
  67. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.LawEnforcementAgencies, "Value", dto.LawEnforcementOrgCode))//执法部门
  68. .OrderByDescending(d => d.CreationTime)
  69. .MergeTable();
  70. }
  71. /// <summary>
  72. /// 司法行政监督管理工单查询
  73. /// </summary>
  74. /// <param name="dto"></param>
  75. /// <returns></returns>
  76. public ISugarQueryable<JudicialManagementOrders> GetOrderList(QueryEnforcementOrderNewDto dto)
  77. {
  78. var areaCode = _sessionContext.OrgAreaCode ?? "511500";
  79. return _judicialManagementOrdersRepository.Queryable()
  80. .Where(d => d.IsItCounted == true)
  81. .WhereIF(areaCode != "511500", d => d.AreaCode.StartsWith(areaCode))
  82. // .WhereIF(dto.IsEnforcementOrder.HasValue, d => d.IsEnforcementOrder == dto.IsEnforcementOrder)//是否行政执法类
  83. //.WhereIF(dto.IsPassTheBuckOrder.HasValue, d => d.IsPassTheBuckOrder == dto.IsPassTheBuckOrder)//是否推诿
  84. //.WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
  85. .WhereIF(dto.IsTheClueTrueText == "1", d => d.IsTheClueTrue == null)//待核实
  86. .WhereIF(dto.IsTheClueTrueText == "2", d => d.IsTheClueTrue == true)//线索属实
  87. .WhereIF(dto.IsTheClueTrueText == "3", d => d.IsEnforcementOrder == false)//线索不属实 调整为非行政执法类工单
  88. .WhereIF(dto.IsTheClueTrueText == "4", d => d.IsPassTheBuckOrder == true)//推诿工单
  89. .WhereIF(dto.IsTheClueTrueText == "5", d => d.IsEnforcementOrder == true)//行政执法类工单
  90. .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => dto.EventTypeId == d.EventTypeId)//事项分类
  91. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!)) //标题
  92. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
  93. .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  94. .WhereIF(!string.IsNullOrEmpty(dto.ChannelCode), d => d.SourceChannelCode == dto.ChannelCode) //来源渠道
  95. .WhereIF(!string.IsNullOrEmpty(dto.HotspotId), d => d.TransferPhone == dto.HotspotId) //热点类型
  96. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
  97. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  98. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  99. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
  100. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) //区域
  101. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.EnforcementOrdersHandler, "Value", dto.OrgCode))//接办部门
  102. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.LawEnforcementAgencies, "Value", dto.LawEnforcementOrgCode))//执法部门
  103. .OrderByDescending(d => d.CreationTime)
  104. .MergeTable();
  105. }
  106. /// <summary>
  107. /// 事项分类统计--明细
  108. /// </summary>
  109. /// <param name="dto"></param>
  110. /// <returns></returns>
  111. public ISugarQueryable<JudicialManagementOrders> GetEventClassificationStatisticsOrderListAsync(QueryEventClassificationStatisticsDto dto)
  112. {
  113. string areCodeText = "";
  114. if (string.IsNullOrEmpty(dto.AreaCode))
  115. {
  116. if (_sessionContext.OrgAreaCode != "511500")
  117. areCodeText = _sessionContext.OrgAreaCode;
  118. }
  119. else
  120. areCodeText = dto.AreaCode;
  121. return _judicialManagementOrdersRepository.Queryable()
  122. .Where(d => d.IsItCounted == true && d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime && d.EventTypeId != null)
  123. .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => d.EventTypeId.StartsWith(dto.EventTypeId))
  124. .WhereIF(!string.IsNullOrEmpty(areCodeText), d => d.AreaCode.StartsWith(areCodeText))
  125. .OrderByDescending(d => d.CreationTime)
  126. .MergeTable();
  127. }
  128. /// <summary>
  129. /// 执法部门办件统计
  130. /// </summary>
  131. /// <param name="StartTime"></param>
  132. /// <param name="EndTime"></param>
  133. /// <returns></returns>
  134. public ISugarQueryable<EmDepartmentalProcessingStatisticsDto> GetDepartmentalProcessingStatisticsAsync(DateTime StartTime, DateTime EndTime)
  135. {
  136. return _enforcementOrdersHandlerRepository.Queryable()
  137. .LeftJoin<JudicialManagementOrders>((h, o) => h.OrderId == o.Id)
  138. .Where((h, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  139. .GroupBy((h, o) => new
  140. {
  141. OrgCode = h.OrgCode,
  142. OrgName = h.OrgName
  143. })
  144. .Select((h, o) => new EmDepartmentalProcessingStatisticsDto
  145. {
  146. OrgCode = h.OrgCode,
  147. OrgName = h.OrgName,
  148. CountNum = SqlFunc.AggregateSum(SqlFunc.IIF(h.OrgCode != null, 1, 0)),
  149. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsTheClueTrue.HasValue && o.IsTheClueTrue.Value == true, 1, 0)),
  150. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsTheClueTrue.HasValue && o.IsTheClueTrue.Value == false, 1, 0)),
  151. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsEnforcementOrder.HasValue && o.IsEnforcementOrder.Value == true, 1, 0))
  152. })
  153. .MergeTable();
  154. }
  155. /// <summary>
  156. /// 执法部门办件统计---明细
  157. /// </summary>
  158. /// <param name="dto"></param>
  159. /// <returns></returns>
  160. public ISugarQueryable<EnforcementOrderListDto> GetDepartmentalProcessingStatisticsOrderListAsync(QueryDepartmentalProcessingStatisticsDto dto)
  161. {
  162. return _enforcementOrdersHandlerRepository.Queryable()
  163. .LeftJoin<JudicialManagementOrders>((x, o) => x.OrderId == o.Id)
  164. .Where((x, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null && o.IsItCounted == true)
  165. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o) => x.OrgCode == dto.OrgCode)
  166. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o) => x.OrgCode.StartsWith(dto.OrgCode))
  167. .WhereIF(dto.TheClueIsTrue == true, (x, o) => o.IsTheClueTrue == true)
  168. .WhereIF(dto.TheClueIsNotTrue == true, (x, o) => o.IsTheClueTrue == false)
  169. .WhereIF(dto.EnforcementOrder == true, (x, o) => o.IsEnforcementOrder == true)
  170. .OrderByDescending((x, o) => o.CreationTime)
  171. .Select((x, o) => new EnforcementOrderListDto
  172. {
  173. Id = o.Id,
  174. No = o.No,
  175. SourceChannel = o.SourceChannel,
  176. SourceChannelCode = o.SourceChannelCode,
  177. FromPhone = o.FromPhone,
  178. TransferPhone = o.TransferPhone,
  179. FromName = o.FromName,
  180. Contact = o.Contact,
  181. AcceptType = o.AcceptType,
  182. AcceptTypeCode = o.AcceptTypeCode,
  183. Title = o.Title,
  184. HotspotId = o.HotspotId,
  185. HotspotName = o.HotspotName,
  186. HotspotSpliceName = o.HotspotSpliceName,
  187. CreationTime = o.CreationTime,
  188. Province = o.Province,
  189. City = o.City,
  190. County = o.County,
  191. Town = o.Town,
  192. IsEnforcementOrder = o.IsEnforcementOrder,
  193. IsPassTheBuckOrder = o.IsPassTheBuckOrder,
  194. IsTheClueTrue = o.IsTheClueTrue,
  195. EventTypeId = o.EventTypeId,
  196. EventTypeName = o.EventTypeName,
  197. EventTypeSpliceName = o.EventTypeSpliceName,
  198. AcceptorId = o.AcceptorId,
  199. AcceptorName = o.AcceptorName,
  200. AcceptorStaffNo = o.AcceptorStaffNo,
  201. AcceptorOrgCode = o.AcceptorOrgCode,
  202. AcceptorOrgName = o.AcceptorOrgName,
  203. })
  204. .MergeTable();
  205. }
  206. /// <summary>
  207. /// 区域分类统计
  208. /// </summary>
  209. /// <returns></returns>
  210. public ISugarQueryable<RegionalClassificationStatisticsDto> GetRegionalClassificationStatisticsAsync(DateTime StartTime, DateTime EndTime)
  211. {
  212. var areaCode = _sessionContext.OrgAreaCode ?? "511500";
  213. return _judicialManagementOrdersRepository.Queryable()
  214. .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.IsItCounted == true)
  215. .LeftJoin<SystemArea>((x, o) => x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  216. .WhereIF(areaCode != "511500", (x, o) => x.AreaCode.StartsWith(areaCode))
  217. .GroupBy((x, o) => new
  218. {
  219. AreaCode = x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  220. o.AreaName,
  221. })
  222. .Select((x, o) => new RegionalClassificationStatisticsDto
  223. {
  224. AreaCode = x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  225. AreaName = o.AreaName,
  226. OrderCountNum = SqlFunc.AggregateCount(x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
  227. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == true, 1, 0)),
  228. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == false, 1, 0)),
  229. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsEnforcementOrder.HasValue && x.IsEnforcementOrder.Value == true, 1, 0))
  230. }).MergeTable()
  231. .Where(x => x.AreaCode != "519800" && x.AreaCode != "519900")
  232. .OrderByDescending(it => it.OrderCountNum)
  233. .MergeTable();
  234. }
  235. /// <summary>
  236. /// 区域分类统计---明细
  237. /// </summary>
  238. /// <param name="dto"></param>
  239. /// <returns></returns>
  240. public ISugarQueryable<JudicialManagementOrders> GetRegionalClassificationStatisticsOrderListAsync(QueryRegionalClassificationStatisticsDto dto)
  241. {
  242. return _judicialManagementOrdersRepository.Queryable()
  243. .Where(d => d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime && d.IsItCounted == true)
  244. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode.StartsWith(dto.AreaCode))
  245. .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
  246. .WhereIF(dto.TheClueIsNotTrue == true, d => d.IsTheClueTrue == false)
  247. .WhereIF(dto.EnforcementOrder == true, d => d.IsEnforcementOrder == true)
  248. .OrderByDescending(d => d.CreationTime)
  249. .MergeTable();
  250. }
  251. /// <summary>
  252. /// 部门满意度统计
  253. /// </summary>
  254. /// <param name="StartTime"></param>
  255. /// <param name="EndTime"></param>
  256. /// <param name="TypeId">1:办件结果 2:办件态度</param>
  257. /// <returns></returns>
  258. public ISugarQueryable<VisitAndOrgSatisfactionStatisticsDto> GetVisitAndOrgSatisfactionStatisticsAsync(DateTime StartTime, DateTime EndTime, int TypeId)
  259. {
  260. return _judicialManagementOrdersRepository.Queryable()
  261. .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
  262. .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
  263. .Where((x, o, p) => o.VisitTime >= StartTime && o.VisitTime <= EndTime && x.IsItCounted == true && p.VisitTarget == EVisitTarget.Org
  264. && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode) && x.OrderSoure == EOrderSoure.Hotline)
  265. .GroupBy((x, o, p) => new
  266. {
  267. VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  268. })
  269. .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto()
  270. {
  271. OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  272. TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
  273. VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
  274. SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
  275. RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
  276. DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
  277. NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
  278. NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
  279. NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
  280. })
  281. .MergeTable()
  282. .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
  283. .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
  284. {
  285. OrgName = o.Name,
  286. OrgCode = it.OrgCode,
  287. OrgType = o.OrgType,
  288. TotalSumCount = it.TotalSumCount,
  289. VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
  290. SatisfiedCount = it.SatisfiedCount, //满意数
  291. RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
  292. DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
  293. NoSatisfiedCount = it.NoSatisfiedCount,//不满意
  294. NoEvaluateCount = it.NoEvaluateCount,//未做评价
  295. NoPutThroughCount = it.NoPutThroughCount,//未接通
  296. })
  297. .MergeTable();
  298. }
  299. /// <summary>
  300. /// 部门满意度统计---明细
  301. /// </summary>
  302. /// <param name="dto"></param>
  303. /// <returns></returns>
  304. public ISugarQueryable<EnforcementOrgSatisfactionOrderListDto> GetVisitAndOrgSatisfactionStatisticsOrderListAsync(QueryOrgSatisfactionStatisticsDto dto)
  305. {
  306. return _judicialManagementOrdersRepository.Queryable()
  307. .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
  308. .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
  309. .Where((x, o, p) => o.VisitTime >= dto.StartTime && o.VisitTime <= dto.EndTime && x.IsItCounted == true && p.VisitTarget == EVisitTarget.Org && x.OrderSoure == EOrderSoure.Hotline)
  310. .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
  311. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o, p) => p.VisitOrgCode == dto.OrgCode)
  312. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o, p) => p.VisitOrgCode.StartsWith(dto.OrgCode))
  313. .WhereIF(dto.TypeId == 1, (x, o, p) => SqlFunc.JsonField(p.OrgProcessingResults, "Key") == dto.DateValue)
  314. .WhereIF(dto.TypeId == 2, (x, o, p) => SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == dto.DateValue)
  315. .Select((x, o, p) => new EnforcementOrgSatisfactionOrderListDto
  316. {
  317. Id = x.Id,
  318. No = x.No,
  319. SourceChannel = x.SourceChannel,
  320. SourceChannelCode = x.SourceChannelCode,
  321. FromPhone = x.FromPhone,
  322. TransferPhone = x.TransferPhone,
  323. FromName = x.FromName,
  324. Contact = x.Contact,
  325. AcceptType = x.AcceptType,
  326. AcceptTypeCode = x.AcceptTypeCode,
  327. Title = x.Title,
  328. HotspotId = x.HotspotId,
  329. HotspotName = x.HotspotName,
  330. HotspotSpliceName = x.HotspotSpliceName,
  331. CreationTime = x.CreationTime,
  332. Province = x.Province,
  333. City = x.City,
  334. County = x.County,
  335. Town = x.Town,
  336. IsEnforcementOrder = x.IsEnforcementOrder,
  337. IsPassTheBuckOrder = x.IsPassTheBuckOrder,
  338. IsTheClueTrue = x.IsTheClueTrue,
  339. EventTypeId = x.EventTypeId,
  340. EventTypeName = x.EventTypeName,
  341. EventTypeSpliceName = x.EventTypeSpliceName,
  342. AcceptorId = x.AcceptorId,
  343. AcceptorName = x.AcceptorName,
  344. AcceptorStaffNo = x.AcceptorStaffNo,
  345. AcceptorOrgCode = x.AcceptorOrgCode,
  346. AcceptorOrgName = x.AcceptorOrgName,
  347. VisitId = p.VisitId
  348. })
  349. .MergeTable();
  350. }
  351. public async Task<List<IndustryOrderStaticsDto>> QueryIndustryOrderStatics(QueryIndustryOrderStatisticsRequest queryIndustryOrderStatisticsRequest)
  352. {
  353. var judicialManagementOrderTable = _judicialManagementOrdersRepository.Queryable()
  354. .Where(x => x.CreationTime >= queryIndustryOrderStatisticsRequest.StartTime && x.CreationTime <= queryIndustryOrderStatisticsRequest.EndTime);
  355. var queryable = judicialManagementOrderTable.InnerJoin<OrderSnapshot>((j, o) => j.Id == o.Id)
  356. .GroupBy((j, o) => o.IndustryName)
  357. .Select((j, o) => new IndustryOrderStaticsDto
  358. {
  359. IndustryName = o.IndustryName,
  360. TotalOrderCount = SqlFunc.AggregateCount(o.Id),
  361. EnforcementOrderCount = SqlFunc.AggregateCount(SqlFunc.IIF(j.IsEnforcementOrder.HasValue && j.IsEnforcementOrder == true, 1, 0)),
  362. NotEnforcementOrderCount = SqlFunc.AggregateCount(SqlFunc.IIF(j.IsEnforcementOrder.HasValue && j.IsEnforcementOrder != true, 1, 0)),
  363. ToBeVerifiedOrderCount = SqlFunc.AggregateCount(SqlFunc.IIF(j.IsEnforcementOrder == null, 1, 0))
  364. });
  365. var result = await queryable.ToListAsync();
  366. return result;
  367. }
  368. public async Task<List<IndustryOrderStaticsRateDto>> QueryIndustryOrderStaticsRate(QueryIndustryOrderStatisticsRateRequest queryIndustryOrderStatisticsRateRequest)
  369. {
  370. var judicialManagementOrderTable = _judicialManagementOrdersRepository.Queryable()
  371. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  372. .Where((x, o) => x.CreationTime >= queryIndustryOrderStatisticsRateRequest.StartTime && x.CreationTime <= queryIndustryOrderStatisticsRateRequest.EndTime)
  373. .WhereIF(string.IsNullOrEmpty(queryIndustryOrderStatisticsRateRequest.AreaCode), (x, o) => o.AreaCode != null && o.AreaCode.StartsWith(queryIndustryOrderStatisticsRateRequest.AreaCode));
  374. var queryable = judicialManagementOrderTable.InnerJoin<OrderSnapshot>((x, o, s) => x.Id == s.Id)
  375. .GroupBy((x, o, s) => s.IndustryName)
  376. .Select((x, o, s) => new IndustryOrderStaticsRateDto
  377. {
  378. IndustryName = s.IndustryName,
  379. Rate = SqlFunc.AggregateCount(SqlFunc.IIF(o.IsEnforcementOrder.HasValue && o.IsEnforcementOrder == true, 1, 0)) / SqlFunc.AggregateCount(o.Id),
  380. Count = SqlFunc.AggregateCount(SqlFunc.IIF(o.IsEnforcementOrder.HasValue && o.IsEnforcementOrder == true, 1, 0))
  381. });
  382. var result = await queryable.ToListAsync();
  383. return result;
  384. }
  385. public async Task<List<EventTypeOrderStaticsDto>> QueryEventTypeOrderStatics(QueryEventTypeOrderStaticsRequest queryEventTypeOrderStaticsRequest)
  386. {
  387. var judicialManagementOrderTable = _judicialManagementOrdersRepository.Queryable()
  388. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  389. .Where((x, o) => x.CreationTime >= queryEventTypeOrderStaticsRequest.StartTime && x.CreationTime <= queryEventTypeOrderStaticsRequest.EndTime)
  390. .WhereIF(string.IsNullOrEmpty(queryEventTypeOrderStaticsRequest.AreaCode), (x, o) => o.AreaCode != null && o.AreaCode.StartsWith(queryEventTypeOrderStaticsRequest.AreaCode));
  391. var queryable = judicialManagementOrderTable
  392. .GroupBy((x, o) => x.EventTypeName)
  393. .Select((x, o) => new EventTypeOrderStaticsDto
  394. {
  395. EventTypeName = x.EventTypeName,
  396. Count = SqlFunc.AggregateCount(o.Id),
  397. });
  398. var result = await queryable.ToListAsync();
  399. return result;
  400. }
  401. }
  402. }