using Hotline.FlowEngine.Workflows;
using Hotline.IndustryClassification;
using Hotline.Orders;
using Hotline.Settings;
using Hotline.Share.Dtos.IndustryClassification;
using Hotline.Share.Enums.FlowEngine;
using Hotline.Share.Enums.Order;
using Hotline.Share.Requests;
using MapsterMapper;
using SqlSugar;
using XF.Domain.Authentications;
using XF.Domain.Dependency;
namespace Hotline.Application.IndustryClassification
{
public class IndustryClassificationApplication : IIndustryClassificationApplication, IScopeDependency
{
private readonly IMapper _mapper;
private readonly ISystemOrganizeRepository _organizeRepository;
private readonly IIndustryClassificationRepositpry _industrialManagementRepository;
private readonly ISessionContext _sessionContext;
private readonly IOrderRepository _orderRepository;
public IndustryClassificationApplication(IMapper mapper,
ISystemOrganizeRepository organizeRepository,
IIndustryClassificationRepositpry industrialManagementRepository,
ISessionContext sessionContext,
IOrderRepository orderRepository)
{
_mapper = mapper;
_organizeRepository = organizeRepository;
_industrialManagementRepository = industrialManagementRepository;
_sessionContext = sessionContext;
_orderRepository = orderRepository;
}
///
/// 查询行业列表
///
///
///
public ISugarQueryable GetIndustrialManagementList(PagedKeywordRequest dto)
{
var query = _industrialManagementRepository.Queryable()
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.IndustrialName.Contains(dto.Keyword))
.Select(p => new IndustrialManagementDto
{
Id = p.Id,
IndustrialName = p.IndustrialName,
UpdateTime = SqlFunc.IIF(p.LastModificationTime != null, p.LastModificationTime, p.CreationTime),
OrgCount = SqlFunc.Subqueryable().Where(s => s.IndustrialManagementId == p.Id).Count()
})
.MergeTable()
.OrderByDescending(p => p.UpdateTime);
return query;
}
///
/// 行业诉求工单
///
///
///
public ISugarQueryable GetIndustrialManagementOrderList(IndustrialManagementRequestDto dto)
{
string industrialId = "";
if (!_sessionContext.OrgIsCenter)
{
var industrial = _industrialManagementRepository.Queryable()
.Includes(d => d.Orgs)
.FirstAsync(d => d.Orgs.Any(p => p.Id == _sessionContext.RequiredOrgId)).GetAwaiter().GetResult();
if (industrial is not null)
industrialId = industrial.Id;
else
industrialId = "-1";
}
var queryorder = _industrialManagementRepository.Queryable()
.InnerJoin((i, io) => i.Id == io.IndustrialManagementId)
.InnerJoin((i, io, o) => io.OrganizeId == o.ActualHandleOrgCode)
// .InnerJoin((i, io, s, o) => s.ExternalId == o.Id)
.Where((i, io, o) => o.Status >= EOrderStatus.Filed)
.WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, o) => io.IndustrialManagementId == industrialId)
.OrderBy((i, io, o) => i.Id)
.GroupBy((i, io, o) => new
{
o.Id,
o.Status,
IndustrialId = i.Id,
i.IndustrialName,
o.Title,
o.No,
o.AcceptType,
o.AcceptTypeCode,
o.HotspotId,
o.HotspotName,
o.HotspotSpliceName,
o.HotspotExternal,
o.CreationTime,
o.StartTime,
o.OrgLevelOneCode,
o.OrgLevelOneName,
o.ActualHandleOrgName,
o.ActualHandleOrgCode,
o.CounterSignType,
o.FiledTime,
o.ExpiredTime,
o.NearlyExpiredTime,
o.NearlyExpiredTimeOne
})
.Select((i, io, o) => new IndustrialManagementOrderDto
{
Id = o.Id,
Status = o.Status,
IndustrialId = i.Id,
IndustrialName = i.IndustrialName,
Title = o.Title,
No = o.No,
AcceptType = o.AcceptType,
AcceptTypeCode = o.AcceptTypeCode,
HotspotId = o.HotspotId,
HotspotName = o.HotspotName,
HotspotSpliceName = o.HotspotSpliceName,
HotspotExternal = o.HotspotExternal,
CreationTime = o.CreationTime,
StartTime = o.StartTime,
OrgLevelOneCode = o.OrgLevelOneCode,
OrgLevelOneName = o.OrgLevelOneName,
ActualHandleOrgName = o.ActualHandleOrgName,
ActualHandleOrgCode = o.ActualHandleOrgCode,
CounterSignType = o.CounterSignType,
FiledTime = o.FiledTime,
ExpiredTime = o.ExpiredTime,
NearlyExpiredTime = o.NearlyExpiredTime,
NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
}).MergeTable()
;
var queryhuiqian = _industrialManagementRepository.Queryable()
.InnerJoin((i, io) => i.Id == io.IndustrialManagementId)
.InnerJoin((i, io, s) => io.OrganizeId == s.HandlerOrgId)
.InnerJoin((i, io, s, o) => s.ExternalId == o.Id)
.Where((i, io, s, o) => o.Status >= EOrderStatus.Filed && s.CountersignPosition == ECountersignPosition.Direct)
.WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, s, o) => io.IndustrialManagementId == industrialId)
.OrderBy((i, io, s, o) => i.Id)
.GroupBy((i, io, s, o) => new
{
o.Id,
o.Status,
IndustrialId = i.Id,
i.IndustrialName,
o.Title,
o.No,
o.AcceptType,
o.AcceptTypeCode,
o.HotspotId,
o.HotspotName,
o.HotspotSpliceName,
o.HotspotExternal,
o.CreationTime,
o.StartTime,
o.OrgLevelOneCode,
o.OrgLevelOneName,
o.ActualHandleOrgName,
o.ActualHandleOrgCode,
o.CounterSignType,
o.FiledTime,
o.ExpiredTime,
o.NearlyExpiredTime,
o.NearlyExpiredTimeOne
})
.Select((i, io, s, o) => new IndustrialManagementOrderDto
{
Id = o.Id,
Status = o.Status,
IndustrialId = i.Id,
IndustrialName = i.IndustrialName,
Title = o.Title,
No = o.No,
AcceptType = o.AcceptType,
AcceptTypeCode = o.AcceptTypeCode,
HotspotId = o.HotspotId,
HotspotName = o.HotspotName,
HotspotSpliceName = o.HotspotSpliceName,
HotspotExternal = o.HotspotExternal,
CreationTime = o.CreationTime,
StartTime = o.StartTime,
OrgLevelOneCode = o.OrgLevelOneCode,
OrgLevelOneName = o.OrgLevelOneName,
ActualHandleOrgName = o.ActualHandleOrgName,
ActualHandleOrgCode = o.ActualHandleOrgCode,
CounterSignType = o.CounterSignType,
FiledTime = o.FiledTime,
ExpiredTime = o.ExpiredTime,
NearlyExpiredTime = o.NearlyExpiredTime,
NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
}).MergeTable()
;
var query = _orderRepository.UnionAll(queryorder, queryhuiqian)
.OrderBy(d => d.Id)
.GroupBy(d => new
{
d.Id,
d.Status,
d.IndustrialId,
d.IndustrialName,
d.Title,
d.No,
d.AcceptType,
d.AcceptTypeCode,
d.HotspotId,
d.HotspotName,
d.HotspotSpliceName,
d.HotspotExternal,
d.CreationTime,
d.StartTime,
d.OrgLevelOneCode,
d.OrgLevelOneName,
d.ActualHandleOrgName,
d.ActualHandleOrgCode,
d.CounterSignType,
d.FiledTime,
d.ExpiredTime,
d.NearlyExpiredTime,
d.NearlyExpiredTimeOne
})
.Select(d => new IndustrialManagementOrderDto
{
Id = d.Id,
Status = d.Status,
IndustrialId = d.IndustrialId,
IndustrialName = d.IndustrialName,
Title = d.Title,
No = d.No,
AcceptType = d.AcceptType,
AcceptTypeCode = d.AcceptTypeCode,
HotspotId = d.HotspotId,
HotspotName = d.HotspotName,
HotspotSpliceName = d.HotspotSpliceName,
HotspotExternal = d.HotspotExternal,
CreationTime = d.CreationTime,
StartTime = d.StartTime,
OrgLevelOneCode = d.OrgLevelOneCode,
OrgLevelOneName = d.OrgLevelOneName,
ActualHandleOrgName = d.ActualHandleOrgName,
ActualHandleOrgCode = d.ActualHandleOrgCode,
CounterSignType = d.CounterSignType,
FiledTime = d.FiledTime,
ExpiredTime = d.ExpiredTime,
NearlyExpiredTime = d.NearlyExpiredTime,
NearlyExpiredTimeOne = d.NearlyExpiredTimeOne
}).MergeTable()
.WhereIF(!string.IsNullOrEmpty(dto.IndustrialName), d => d.IndustrialName.Contains(dto.IndustrialName))
.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
.WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode)
.WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
.WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
.WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), d => d.HotspotSpliceName.Contains(dto.HotspotSpliceName))
.WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName))
.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
.OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
.OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //工单创建时间
.OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //工单创建时间降序
;
return query;
//var query = _industrialManagementRepository.Queryable()
// .InnerJoin((i, io) => i.Id == io.IndustrialManagementId)
// .InnerJoin((i, io, s) => io.OrganizeId == s.HandlerOrgId)
// .InnerJoin((i, io, s, o) => s.ExternalId == o.Id)
// .Where((i, io, s, o) => o.Status >= EOrderStatus.Filed)
// .WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, s, o) => io.IndustrialManagementId == industrialId)
// .OrderBy((i, io, s, o) => i.Id)
// .GroupBy((i, io, s, o) => new
// {
// o.Id,
// o.Status,
// IndustrialId = i.Id,
// i.IndustrialName,
// o.Title,
// o.No,
// o.AcceptType,
// o.AcceptTypeCode,
// o.HotspotId,
// o.HotspotName,
// o.HotspotSpliceName,
// o.HotspotExternal,
// o.CreationTime,
// o.StartTime,
// o.OrgLevelOneCode,
// o.OrgLevelOneName,
// o.ActualHandleOrgName,
// o.ActualHandleOrgCode,
// o.CounterSignType,
// o.FiledTime,
// o.ExpiredTime,
// o.NearlyExpiredTime,
// o.NearlyExpiredTimeOne
// })
// .Select((i, io, s, o) => new IndustrialManagementOrderDto
// {
// Id = o.Id,
// Status = o.Status,
// IndustrialId = i.Id,
// IndustrialName = i.IndustrialName,
// Title = o.Title,
// No = o.No,
// AcceptType = o.AcceptType,
// AcceptTypeCode = o.AcceptTypeCode,
// HotspotId = o.HotspotId,
// HotspotName = o.HotspotName,
// HotspotSpliceName = o.HotspotSpliceName,
// HotspotExternal = o.HotspotExternal,
// CreationTime = o.CreationTime,
// StartTime = o.StartTime,
// OrgLevelOneCode = o.OrgLevelOneCode,
// OrgLevelOneName = o.OrgLevelOneName,
// ActualHandleOrgName = o.ActualHandleOrgName,
// ActualHandleOrgCode = o.ActualHandleOrgCode,
// CounterSignType = o.CounterSignType,
// FiledTime = o.FiledTime,
// ExpiredTime = o.ExpiredTime,
// NearlyExpiredTime = o.NearlyExpiredTime,
// NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
// }).MergeTable()
// .WhereIF(!string.IsNullOrEmpty(dto.IndustrialName), d => d.IndustrialName.Contains(dto.IndustrialName))
// .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
// .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
// .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode)
// .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
// .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
// .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), d => d.HotspotSpliceName.Contains(dto.HotspotSpliceName))
// .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName))
// .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
// .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
// .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //工单创建时间
// .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //工单创建时间降序
// ;
}
}
}