123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- using Hotline.FlowEngine.Workflows;
- using Hotline.Share.Dtos.FlowEngine;
- using Hotline.Share.Dtos.FlowEngine.Workflow;
- using Hotline.Share.Dtos.Order.OrderDelay;
- using Hotline.Share.Enums.FlowEngine;
- using MapsterMapper;
- using Microsoft.AspNetCore.Http;
- using System.Threading;
- using Hotline.BatchTask;
- using Hotline.Orders;
- using Hotline.Share.Dtos.BatchTask;
- using Hotline.Share.Dtos.Order;
- using Hotline.Share.Enums.BatchTask;
- using Hotline.Share.Enums.Order;
- using SqlSugar;
- using XF.Domain.Authentications;
- using XF.Domain.Dependency;
- using XF.Domain.Entities;
- using XF.Domain.Exceptions;
- namespace Hotline.Application.OrderApp.OrderDelayApp;
- public class OrderDelayApplication : IOrderDelayApplication, IScopeDependency
- {
- private readonly IOrderDomainService _orderDomainService;
- private readonly IOrderDelayRepository _orderDelayRepository;
- private readonly IWorkflowDomainService _workflowDomainService;
- private readonly IApptaskDomainService _apptaskDomainService;
- private readonly ISessionContext _sessionContext;
- private readonly IMapper _mapper;
- public OrderDelayApplication(
- IOrderDomainService orderDomainService,
- IOrderDelayRepository orderDelayRepository,
- IWorkflowDomainService workflowDomainService,
- IApptaskDomainService apptaskDomainService,
- ISessionContext sessionContext,
- IMapper mapper)
- {
- _orderDomainService = orderDomainService;
- _orderDelayRepository = orderDelayRepository;
- _workflowDomainService = workflowDomainService;
- _apptaskDomainService = apptaskDomainService;
- _sessionContext = sessionContext;
- _mapper = mapper;
- }
- /// <summary>
- /// 查询延期待审批列表
- /// </summary>
- /// <returns></returns>
- public ISugarQueryable<OrderDelay> QueryWaited(DelayListDto dto)
- {
- var isAdmin = _orderDomainService.IsCheckAdmin();
- var hasHandled = dto.IsApply.HasValue && dto.IsApply.Value;
- var query = _orderDelayRepository.Queryable()
- .Includes(d => d.WorkflowSteps.Where(step =>
- ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
- step.HandlerId == _sessionContext.RequiredUserId) ||
- (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
- step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
- (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)) ||
- (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)
- && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
- .OrderByDescending(step => step.CreationTime)
- .Take(1)
- .ToList()
- );
- if (!isAdmin)
- {
- if (hasHandled)
- {
- query.Where(d => d.WorkflowSteps
- .Any(step =>
- ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
- step.HandlerId == _sessionContext.RequiredUserId) ||
- (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
- step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
- (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)) ||
- (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)
- && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
- && step.Status == EWorkflowStepStatus.Handled));
- }
- else
- {
- query.Where(d => d.WorkflowSteps
- .Any(step =>
- ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
- step.HandlerId == _sessionContext.RequiredUserId) ||
- (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
- step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
- (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)) ||
- (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
- _sessionContext.Roles.Contains(step.RoleId)
- && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
- && step.Status < EWorkflowStepStatus.Handled));
- }
- }
- query.Includes(d => d.Order)
- .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
- .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
- .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No)) //工单编号
- .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, d => d.Order.IsProvince == true) //是否省工单
- .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == false, d => d.Order.IsProvince == false)
- .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title)) //工单标题
- .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel) //来源渠道
- .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart) //受理时间Start
- .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd) //受理时间End
- .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), d => d.Order.AcceptorName == dto.AcceptorName!) //受理人
- .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
- d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
- .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
- .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
- .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), d => d.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
- .WhereIF(dto.CurrentHandleTimeStart.HasValue, d => d.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart) //接办时间Start
- .WhereIF(dto.CurrentHandleTimeEnd.HasValue, d => d.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd) //接办时间End
- .WhereIF(dto.ApplyTimeStart.HasValue, d => d.CreationTime >= dto.ApplyTimeStart) //延期申请时间Start
- .WhereIF(dto.ApplyTimeEnd.HasValue, d => d.CreationTime <= dto.ApplyTimeEnd) //延期申请时间End
- .WhereIF(!string.IsNullOrEmpty(dto.ApplyName), d => d.CreatorName.Contains(dto.ApplyName)) //延期申请人
- .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), d => d.CreatorOrgName.Contains(dto.ApplyOrgName)) //延期申请部门
- .WhereIF(dto.DelayNum.HasValue, d => d.DelayNum == dto.DelayNum) //延期申请时限
- .WhereIF(dto.DelayUnit.HasValue, d => d.DelayUnit == dto.DelayUnit) //延期申请单位
- .WhereIF(!string.IsNullOrEmpty(dto.DelayReason), d => d.DelayReason.Contains(dto.DelayReason)) //申请理由
- .WhereIF(dto.BeforeDelayStart.HasValue, d => d.BeforeDelay >= dto.BeforeDelayStart) //申请前期满时间Start
- .WhereIF(dto.BeforeDelayEnd.HasValue, d => d.BeforeDelay <= dto.BeforeDelayEnd) //申请前期满时间End
- .OrderByDescending(d => d.ApplyDelayTime)
- ;
- return query;
- }
- /// <summary>
- /// 延期审核
- /// </summary>
- /// <param name="request"></param>
- /// <param name="cancellation"></param>
- /// <returns></returns>
- public async Task ReviewAsync(OrderDelayReviewRequest request, CancellationToken cancellation)
- {
- /*
- * 查询delay
- * 查询workflow
- * 查询当前节点(待受理or待办理)
- * 查询nextStep(_workflowApplication.GetNextStepsAsync)
- * 非省工单删除省审批节点
- *!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审"删除中心终审
- * 从nextStep中查找与dto传入的nextStepName相同的节点,workflow.NextStepCode = step.Key;workflow.NextStepName = step.Value;
- * 通过:nextAsync,不同意:rejectAsync
- * endhandler:
- * 1.更新orderDelay.DelayState
- * 2.审批通过:
- * a.更新工单办理期满时间(_orderApplication.DelayOrderExpiredTimeAsync)
- * b.更新工单未办理节点的期满时间(_workflowDomainService.UpdateUnhandleExpiredTimeAsync)
- * c.cap publish EventNames.HotlineOrderExpiredTimeUpdate
- */
- request.NextWorkflow.ReviewResult = request.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
- if (request.IsPass)
- {
- await _workflowDomainService.NextAsync(request.NextWorkflow, cancellationToken: cancellation);
- }
- else
- {
- var reject = _mapper.Map<RejectDto>(request.NextWorkflow);
- await _workflowDomainService.RejectAsync(reject, cancellation);
- }
- }
- /// <summary>
- /// 批量审核
- /// </summary>
- /// <returns></returns>
- public async Task BatchReviewAsync(BatchOrderDelayReviewRequest request, CancellationToken cancellation)
- {
- var delayIds = request.DelayWithStepIds.Select(d => d.DelayId).Distinct().ToList();
- var delays = await _orderDelayRepository.Queryable()
- .Where(d => delayIds.Contains(d.Id))
- .ToListAsync(cancellation);
- var apptaskItems = new List<ApptaskItem>();
- foreach (var delay in delays)
- {
- var stepId = request.DelayWithStepIds.First(d => d.DelayId == delay.Id).StepId;
- request.NextWorkflow.StepId = stepId;
- apptaskItems.Add(new ApptaskItem
- {
- BusinessId = delay.Id,
- TaskType = ETaskType.Delay,
- TaskParams = System.Text.Json.JsonSerializer.Serialize(request.NextWorkflow)
- });
- }
- var apptask = new Apptask
- {
- TaskType = ETaskType.Delay,
- ApptaskItems = apptaskItems,
- };
-
- //
- //var addApptask = new AddApptaskRequest
- //{
-
- //}
-
-
- //_apptaskDomainService.AddAsync()
- }
- }
|