|
@@ -20,8 +20,12 @@ using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
using Hotline.Share.Requests;
|
|
|
using Hotline.Tools;
|
|
|
+using JiebaNet.Segmenter.Common;
|
|
|
using MapsterMapper;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
+using Microsoft.IdentityModel.Tokens;
|
|
|
+using MongoDB.Bson;
|
|
|
+using Nacos.V2.Utils;
|
|
|
using SqlSugar;
|
|
|
using System.Data;
|
|
|
using XF.Domain.Authentications;
|
|
@@ -450,6 +454,25 @@ namespace Hotline.Api.Controllers.Bi
|
|
|
return new { List = res, Total = total };
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 部门不满意统计--导出
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("visit-nosatisfied/export")]
|
|
|
+ public async Task<FileStreamResult> ExportQueryVisitNoSatisfied([FromBody] QueryVisitNoSatisfiedDto dto)
|
|
|
+ {
|
|
|
+ if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
|
|
|
+ if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
|
|
|
+ if (dto.AddColumnName.FirstOrDefault() != "部门名称") throw UserFriendlyException.SameMessage("导出字段第一个必须是'部门名称'");
|
|
|
+ dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
|
|
|
+
|
|
|
+ var (dissatisfiedReason, list) = await _orderReportApplication.QueryVisitNoSatisfiedAsync(dto, _sessionContext.OrgIsCenter);
|
|
|
+ var dataTable = await _orderReportApplication.ExportQueryVisitNoSatisfiedAsync(dissatisfiedReason, list, dto.AddColumnName);
|
|
|
+
|
|
|
+ return ExcelStreamResult(ExcelHelper.CreateStream(dataTable), "回访不满意原因统计");
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 部门不满意统计
|
|
|
/// 已加验证部门
|
|
@@ -463,38 +486,8 @@ namespace Hotline.Api.Controllers.Bi
|
|
|
|
|
|
dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
|
|
|
|
|
|
- var IsCenter = _sessionContext.OrgIsCenter;
|
|
|
-
|
|
|
-
|
|
|
- var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
|
|
|
- List<dynamic>? list = new List<dynamic>();
|
|
|
- //DataTable dt = new DataTable();
|
|
|
- foreach (var item in dissatisfiedReason)
|
|
|
- {
|
|
|
- var table = _orderVisitDetailRepository.Queryable()
|
|
|
- .Includes(x => x.OrderVisit)
|
|
|
- .Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Org)
|
|
|
- .Where(x => x.OrgNoSatisfiedReason != null)
|
|
|
- .Where(x => x.OrderVisit.VisitState == EVisitState.Visited)
|
|
|
- .Where(x => !string.IsNullOrEmpty(x.VisitOrgName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.VisitOrgName.Contains(dto.OrgName))
|
|
|
- .WhereIF(dto.StartTime.HasValue, x => x.OrderVisit.VisitTime >= dto.StartTime.Value)
|
|
|
- .WhereIF(dto.EndTime.HasValue, x => x.OrderVisit.VisitTime <= dto.EndTime.Value)
|
|
|
- .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
|
|
|
- .GroupBy(x => new { x.VisitOrgName, x.VisitOrgCode })
|
|
|
- .Select(x => new BiVisitNoSatisfiedDto
|
|
|
- {
|
|
|
- Count = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(x.OrgNoSatisfiedReason, "Key", item.DicDataValue), 1, 0)),
|
|
|
- Key = item.DicDataValue,
|
|
|
- OrgName = x.VisitOrgName,
|
|
|
- OrgCode = x.VisitOrgCode
|
|
|
- })
|
|
|
- .OrderByDescending(x => x.Count)
|
|
|
- //.ToPivotTable(x => x.Key, x => x.OrgName, x => x.Sum(x => x.Count));
|
|
|
- .ToPivotList(x => x.Key, x => new { x.OrgCode, x.OrgName }, x => x.Sum(x => x.Count));
|
|
|
-
|
|
|
- list.AddRange(table);
|
|
|
- }
|
|
|
+ var (dissatisfiedReason, list) = await _orderReportApplication
|
|
|
+ .QueryVisitNoSatisfiedAsync(_mapper.Map<QueryVisitNoSatisfiedDto>(dto), _sessionContext.OrgIsCenter);
|
|
|
return new { DicReason = dissatisfiedReason, Data = list };
|
|
|
}
|
|
|
|
|
@@ -2254,70 +2247,52 @@ namespace Hotline.Api.Controllers.Bi
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet("send_order_report")]
|
|
|
- public async Task<object> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
|
|
|
+ public async Task<List<SendOrderReportOutDto>> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
|
|
|
{
|
|
|
if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
|
|
|
throw UserFriendlyException.SameMessage("请选择时间!");
|
|
|
dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
|
|
|
+ return await _orderApplication.SendOrderReportAsync(dto);
|
|
|
+ }
|
|
|
|
|
|
- var items = await _workflowStepRepository.Queryable()
|
|
|
- .InnerJoin<SchedulingUser>((x , su) => x.HandlerId == su.UserId)
|
|
|
- .Where((x, su) => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send )
|
|
|
- .Where((x, su) => x.CreationTime >= dto.StartTime.Value)
|
|
|
- .Where((x, su) => x.CreationTime <= dto.EndTime.Value)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, su) => su.UserName == dto.UserName)
|
|
|
- .GroupBy((x, su) => new { su.UserId, su.UserName })
|
|
|
- .Select((x, su) => new BiOrderSendVo
|
|
|
- {
|
|
|
- UserId = su.UserId,
|
|
|
- UserName = su.UserName,
|
|
|
- SendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status == EWorkflowStepStatus.Handled, 1, 0)),
|
|
|
- NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status != EWorkflowStepStatus.Handled, 1, 0)),
|
|
|
- }).ToListAsync();
|
|
|
+ /// <summary>
|
|
|
+ /// 派单量统计-导出
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("send_order_report/export")]
|
|
|
+ public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
|
|
|
+ {
|
|
|
+ if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
|
|
|
+ throw UserFriendlyException.SameMessage("请选择时间!");
|
|
|
+ dto.QueryDto.EndTime = dto.QueryDto.EndTime.Value.AddDays(1).AddSeconds(-1);
|
|
|
+ var list = await _orderApplication.SendOrderReportAsync(dto.QueryDto);
|
|
|
|
|
|
- var items2 = await _workflowTraceRepository.Queryable()
|
|
|
- .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
|
|
|
- //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
|
|
|
- .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
|
|
|
- .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
|
|
|
- .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
|
|
|
- .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
|
|
|
- .GroupBy((x, w, su) => x.WorkflowId)
|
|
|
- .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
|
|
|
- .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
|
|
|
- .MergeTable()
|
|
|
- .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
|
|
|
- .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
|
|
|
- //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
|
|
|
- .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt, wf, su) => su.UserName == dto.UserName))
|
|
|
- .GroupBy((a, wt, wf, su) => new { su.UserId, su.UserName })
|
|
|
- .Select((a, wt, wf, su) => new BiOrderSendVo
|
|
|
+ if (list != null && list.Count > 0)
|
|
|
+ {
|
|
|
+ list.Add(new SendOrderReportOutDto()
|
|
|
{
|
|
|
- UserId = su.UserId,
|
|
|
- UserName = su.UserName,
|
|
|
- SendOrderNum = 0,
|
|
|
- NoSendOrderNum = 0,
|
|
|
- ReSendOrderNum = SqlFunc.AggregateDistinctCount(wf.ExternalId),
|
|
|
- }).ToListAsync();
|
|
|
+ UserName = "合计",
|
|
|
+ SendOrderNum = list.Sum(p => p.SendOrderNum),
|
|
|
+ NoSendOrderNum = list.Sum(p => p.NoSendOrderNum),
|
|
|
+ ReSendOrderNum = list.Sum(p => p.ReSendOrderNum),
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- var res = (from t1 in items
|
|
|
- join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
|
|
|
- from item in t1_t2.DefaultIfEmpty()
|
|
|
- select new
|
|
|
- {
|
|
|
- UserId = t1.UserId,
|
|
|
- UserName = t1.UserName,
|
|
|
- SendOrderNum = t1.SendOrderNum,
|
|
|
- NoSendOrderNum = t1.NoSendOrderNum,
|
|
|
- ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
|
|
|
- ChainRate = t1.SendOrderNum > 0 &&(t1.SendOrderNum - t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault()) > 0 ?
|
|
|
- (Math.Round((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) / double.Parse(t1.SendOrderNum.ToString()),2) * 100).ToString() + "%" : "0.00%",
|
|
|
- }).ToList();
|
|
|
+ dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
|
|
|
+
|
|
|
+ var dtos = list
|
|
|
+ .Select(stu => _mapper.Map(stu, typeof(SendOrderReportOutDto), dynamicClass))
|
|
|
+ .Cast<object>()
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var stream = ExcelHelper.CreateStream(dtos);
|
|
|
+
|
|
|
+ return ExcelStreamResult(stream, "派单量统计");
|
|
|
|
|
|
- return res;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 派单量统计明细
|
|
|
/// </summary>
|