|
@@ -1,4 +1,5 @@
|
|
|
using DotNetCore.CAP;
|
|
|
+using FluentValidation;
|
|
|
using Hotline.Api.Filter;
|
|
|
using Hotline.Application.CallCenter;
|
|
|
using Hotline.Application.ExportExcel;
|
|
@@ -23,7 +24,6 @@ using Hotline.Orders.Notifications;
|
|
|
using Hotline.OrderTranspond;
|
|
|
using Hotline.Push.FWMessage;
|
|
|
using Hotline.Push.Notifies;
|
|
|
-using Hotline.Repository.SqlSugar.CallCenter;
|
|
|
using Hotline.Repository.SqlSugar.Extensions;
|
|
|
using Hotline.Repository.SqlSugar.Ts;
|
|
|
using Hotline.SeedData;
|
|
@@ -32,8 +32,8 @@ using Hotline.Settings.Hotspots;
|
|
|
using Hotline.Settings.TimeLimitDomain;
|
|
|
using Hotline.Settings.TimeLimits;
|
|
|
using Hotline.Share.Dtos;
|
|
|
+using Hotline.Share.Dtos.Article;
|
|
|
using Hotline.Share.Dtos.CallCenter;
|
|
|
-using Hotline.Share.Dtos.File;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
using Hotline.Share.Dtos.FlowEngine.Workflow;
|
|
|
using Hotline.Share.Dtos.Order;
|
|
@@ -44,6 +44,7 @@ using Hotline.Share.Dtos.Order.Publish;
|
|
|
using Hotline.Share.Dtos.Org;
|
|
|
using Hotline.Share.Dtos.Settings;
|
|
|
using Hotline.Share.Dtos.Snapshot;
|
|
|
+using Hotline.Share.Enums.Article;
|
|
|
using Hotline.Share.Enums.CallCenter;
|
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
@@ -56,6 +57,7 @@ using Hotline.Snapshot;
|
|
|
using Hotline.Snapshot.Interfaces;
|
|
|
using Hotline.Tools;
|
|
|
using Hotline.Users;
|
|
|
+using Hotline.Validators.FlowEngine;
|
|
|
using Hotline.YbEnterprise.Sdk;
|
|
|
using Mapster;
|
|
|
using MapsterMapper;
|
|
@@ -67,20 +69,12 @@ using MiniExcelLibs;
|
|
|
using SqlSugar;
|
|
|
using System.Text;
|
|
|
using System.Text.Json;
|
|
|
-using FluentValidation;
|
|
|
-using Hotline.Validators.FlowEngine;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Cache;
|
|
|
-using XF.Domain.Entities;
|
|
|
using XF.Domain.Exceptions;
|
|
|
using XF.Domain.Repository;
|
|
|
using XF.Utility.EnumExtensions;
|
|
|
using OrderDto = Hotline.Share.Dtos.Order.OrderDto;
|
|
|
-using System.Threading;
|
|
|
-using Hotline.Realtimes;
|
|
|
-using Hotline.Article;
|
|
|
-using Hotline.Share.Dtos.Article;
|
|
|
-using Hotline.Api.Realtimes;
|
|
|
|
|
|
namespace Hotline.Api.Controllers;
|
|
|
|
|
@@ -162,8 +156,6 @@ public class OrderController : BaseController
|
|
|
private readonly IRepository<SystemDicData> _sysDicDataRepository;
|
|
|
private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
|
|
|
private readonly IRepository<OrderComplement> _orderComplementRepository;
|
|
|
- private readonly IRealtimeService _realtimeService;
|
|
|
- private readonly IRepository<NotificationWaitSend> _notificationWaitSendRepository;
|
|
|
|
|
|
public OrderController(
|
|
|
IOrderDomainService orderDomainService,
|
|
@@ -237,9 +229,7 @@ public class OrderController : BaseController
|
|
|
IOrderSnapshotApplication orderSnapshotApplication,
|
|
|
IRepository<SystemDicData> sysDicDataRepository,
|
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
|
- IRepository<OrderComplement> orderComplementRepository,
|
|
|
- IRealtimeService realtimeService,
|
|
|
- IRepository<NotificationWaitSend> notificationWaitSendRepository)
|
|
|
+ IRepository<OrderComplement> orderComplementRepository)
|
|
|
{
|
|
|
_orderDomainService = orderDomainService;
|
|
|
_orderRepository = orderRepository;
|
|
@@ -313,8 +303,6 @@ public class OrderController : BaseController
|
|
|
_sysDicDataRepository = sysDicDataRepository;
|
|
|
_systemOrganizeRepository = systemOrganizeRepository;
|
|
|
_orderComplementRepository = orderComplementRepository;
|
|
|
- _realtimeService = realtimeService;
|
|
|
- _notificationWaitSendRepository = notificationWaitSendRepository;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
@@ -3177,8 +3165,8 @@ public class OrderController : BaseController
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.Order.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
|
|
|
.WhereIF(_sessionContext.OrgIsCenter == false, d =>
|
|
|
- (SqlFunc.IsNullOrEmpty(d.RoleId) && d.OrderId.StartsWith(_sessionContext.RequiredOrgId)) ||
|
|
|
- (SqlFunc.IsNullOrEmpty(d.RoleId) == false && d.OrderId.StartsWith(_sessionContext.RequiredOrgId)) && _sessionContext.Roles.Contains(d.RoleId)
|
|
|
+ (SqlFunc.IsNullOrEmpty(d.RoleId)==true&& d.OrgId.StartsWith(_sessionContext.RequiredOrgId)) ||
|
|
|
+ (SqlFunc.IsNullOrEmpty(d.RoleId) == false && d.OrgId.StartsWith(_sessionContext.RequiredOrgId) && _sessionContext.Roles.Contains(d.RoleId))
|
|
|
)
|
|
|
|
|
|
// .WhereIF(_sessionContext.RequiredOrgId!="001", x => x.OrgId == _sessionContext.OrgId)
|
|
@@ -3994,12 +3982,15 @@ public class OrderController : BaseController
|
|
|
//泸州任务 311 投诉件需限制受理内容的字数等需求
|
|
|
if (_appOptions.Value.IsLuZhou && dto.AcceptTypeCode == "35")
|
|
|
{
|
|
|
- if (dto.Content.Length < 25)
|
|
|
- throw UserFriendlyException.SameMessage("保存失败,投诉类型受理内容字数需要至少25个字!");
|
|
|
+ if (dto.SourceChannelCode != "S12345" && dto.SourceChannelCode != "SZMHD" && dto.SourceChannelCode != "XCX" && dto.SourceChannelCode != "JCeT")
|
|
|
+ {
|
|
|
+ if (dto.Content.Length < 25)
|
|
|
+ throw UserFriendlyException.SameMessage("保存失败,投诉类型受理内容字数需要至少25个字!");
|
|
|
|
|
|
- if (dto.Title.Contains("咨询") || dto.Title.Contains("建议") || dto.Title.Contains("求助") || dto.Title.Contains("举报")
|
|
|
- || dto.Content.Contains("咨询") || dto.Content.Contains("建议") || dto.Content.Contains("求助") || dto.Content.Contains("举报"))
|
|
|
- throw UserFriendlyException.SameMessage("保存失败!投诉类型标题和受理内容不能出现'咨询、建议、求助、举报'");
|
|
|
+ if (dto.Title.Contains("咨询") || dto.Title.Contains("建议") || dto.Title.Contains("求助") || dto.Title.Contains("举报")
|
|
|
+ || dto.Content.Contains("咨询") || dto.Content.Contains("建议") || dto.Content.Contains("求助") || dto.Content.Contains("举报"))
|
|
|
+ throw UserFriendlyException.SameMessage("保存失败!投诉类型标题和受理内容不能出现'咨询、建议、求助、举报'");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//todo dto validation
|
|
@@ -4224,12 +4215,15 @@ public class OrderController : BaseController
|
|
|
//泸州任务 311 投诉件需限制受理内容的字数等需求
|
|
|
if (_appOptions.Value.IsLuZhou && dto.AcceptTypeCode == "35")
|
|
|
{
|
|
|
- if (dto.Content.Length < 25)
|
|
|
- throw UserFriendlyException.SameMessage("保存失败,投诉类型受理内容字数需要至少25个字!");
|
|
|
+ if (dto.SourceChannelCode != "S12345" && dto.SourceChannelCode != "SZMHD" && dto.SourceChannelCode != "XCX" && dto.SourceChannelCode != "JCeT")
|
|
|
+ {
|
|
|
+ if (dto.Content.Length < 25)
|
|
|
+ throw UserFriendlyException.SameMessage("保存失败,投诉类型受理内容字数需要至少25个字!");
|
|
|
|
|
|
- if (dto.Title.Contains("咨询") || dto.Title.Contains("建议") || dto.Title.Contains("求助") || dto.Title.Contains("举报")
|
|
|
- || dto.Content.Contains("咨询") || dto.Content.Contains("建议") || dto.Content.Contains("求助") || dto.Content.Contains("举报"))
|
|
|
- throw UserFriendlyException.SameMessage("保存失败!投诉类型标题和受理内容不能出现'咨询、建议、求助、举报'");
|
|
|
+ if (dto.Title.Contains("咨询") || dto.Title.Contains("建议") || dto.Title.Contains("求助") || dto.Title.Contains("举报")
|
|
|
+ || dto.Content.Contains("咨询") || dto.Content.Contains("建议") || dto.Content.Contains("求助") || dto.Content.Contains("举报"))
|
|
|
+ throw UserFriendlyException.SameMessage("保存失败!投诉类型标题和受理内容不能出现'咨询、建议、求助、举报'");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//交通工单校验
|
|
@@ -4513,7 +4507,7 @@ public class OrderController : BaseController
|
|
|
cancellationToken: HttpContext.RequestAborted);
|
|
|
|
|
|
#region 中心归档,自动延期一天
|
|
|
- if (dto.Workflow.StepType == EStepType.End && dto.Workflow.NextStepCode == "end" && _appOptions.Value.IsYiBin && _sessionContext.OrgIsCenter)
|
|
|
+ if (dto.Workflow.NextStepCode == "end" && _appOptions.Value.IsYiBin && _sessionContext.OrgIsCenter)
|
|
|
{
|
|
|
var dOrder = await _orderRepository.GetAsync(workflow.ExternalId, HttpContext.RequestAborted);
|
|
|
if (dOrder != null && dOrder.ExpiredTime < DateTime.Now)
|
|
@@ -5189,7 +5183,7 @@ public class OrderController : BaseController
|
|
|
var traces = await _workflowTraceRepository.Queryable()
|
|
|
.Includes(d => d.OrderPublish)
|
|
|
.Includes(d => d.OrderVisit, x => x.OrderVisitDetails)
|
|
|
- .Where(d => d.WorkflowId == workflowId)
|
|
|
+ .Where(d => d.WorkflowId == workflowId && (d.HandleMode != EHandleMode.PreviousNoDisplay || d.HandleMode == null))
|
|
|
.OrderBy(d => d.CreationTime)
|
|
|
.ToTreeAsync(d => d.Traces, d => d.ParentId, null);
|
|
|
|
|
@@ -5506,54 +5500,25 @@ public class OrderController : BaseController
|
|
|
var oneSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.OneOrgSendBack)?.SettingValue[0]);
|
|
|
var twoSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.TwoOrgSendBack)?.SettingValue[0]);
|
|
|
//var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
|
|
|
- var order = await _orderRepository
|
|
|
- .Queryable()
|
|
|
- .Includes(d => d.Workflow)
|
|
|
- .FirstAsync(d => d.Id == dto.OrderId);
|
|
|
+ var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
|
|
|
dto.ExpiredTime = order.ExpiredTime;
|
|
|
- var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
- dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
|
|
|
var audit = new OrderSendBackAudit
|
|
|
{
|
|
|
OrderId = dto.OrderId,
|
|
|
State = ESendBackAuditState.Apply,
|
|
|
Content = dto.Opinion,
|
|
|
SendBackData = dto,
|
|
|
- ApplyOrgId = currentStep.AcceptorOrgId,
|
|
|
- ApplyOrgName = currentStep!.AcceptorOrgName,
|
|
|
- SendBackOrgId = prevStep.HandlerOrgId, //prevStep.AcceptorOrgId,
|
|
|
- SendBackOrgName = prevStep.HandlerOrgName, //prevStep!.AcceptorOrgName,
|
|
|
- SendBackStepName = prevStep.Name,
|
|
|
- WorkflowStepSendBackCrTime = currentStep.CreationTime,
|
|
|
WorkflowOrgId = _sessionContext.RequiredOrgId,
|
|
|
WorkflowUserId = _sessionContext.RequiredUserId,
|
|
|
WorkflowRoleIds = _sessionContext.Roles.ToList(),
|
|
|
Status = order.Status,
|
|
|
- TraceId = currentStep.Id,
|
|
|
- OrderExpiredTime = order.ExpiredTime
|
|
|
+ OrderExpiredTime = order.ExpiredTime,
|
|
|
+ AssignStepId = dto.AssignStepId,
|
|
|
+ IsAssign = !string.IsNullOrEmpty(dto.AssignStepId),
|
|
|
};
|
|
|
audit.InitId();
|
|
|
if (dto.Files.Any())
|
|
|
audit.FileJson = await _fileRepository.AddFileAsync(dto.Files, audit.Id, "", HttpContext.RequestAborted);
|
|
|
- // if (_appOptions.Value.IsZiGong && prevStep.BusinessType == EBusinessType.Send)
|
|
|
- // {
|
|
|
- // // 平均派单
|
|
|
- // var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
- // if (averageSendOrder)
|
|
|
- // {
|
|
|
- // var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
- // dto.Handler = handler;
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
- //todo 需整理各个地市退回业务的需求(指派类型及指派对象)
|
|
|
- //if (workflow.FlowType == EFlowType.Handle) //该逻辑需放在退回操作前依据业务判断
|
|
|
- //{
|
|
|
- // prevStep.FlowAssignType = prevStep.BusinessType is EBusinessType.Seat ? EFlowAssignType.Role :
|
|
|
- // prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
|
|
|
- //}
|
|
|
-
|
|
|
-
|
|
|
if (oneSendBack || twoSendBack)
|
|
|
{
|
|
|
var sendBack = await _orderSendBackAuditRepository.Queryable()
|
|
@@ -5565,13 +5530,16 @@ public class OrderController : BaseController
|
|
|
.AnyAsync();
|
|
|
if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
|
|
|
if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
|
|
|
+
|
|
|
+ var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
+ dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
|
|
|
+
|
|
|
if (oneSendBack && isOrgToCenter && _appOptions.Value.IsZiGong)
|
|
|
{
|
|
|
if (order.SendBackAuditEndTime.HasValue && order.SendBackAuditEndTime.Value < DateTime.Now)
|
|
|
- throw UserFriendlyException.SameMessage("工单截至退回时间【" + order.SendBackAuditEndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") +
|
|
|
- "】,无法进行退回!");
|
|
|
- var sendBackAgain = await _orderSendBackAuditRepository.Queryable()
|
|
|
- .Where(x => x.OrderId == dto.OrderId && x.IsReturnAgain == false).AnyAsync();
|
|
|
+ throw UserFriendlyException.SameMessage("工单截至退回时间【" + order.SendBackAuditEndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") + "】,无法进行退回!");
|
|
|
+
|
|
|
+ var sendBackAgain = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.IsReturnAgain == false).AnyAsync();
|
|
|
if (sendBackAgain)
|
|
|
throw UserFriendlyException.SameMessage("工单已不允许退回!");
|
|
|
}
|
|
@@ -5580,52 +5548,29 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = EOrderStatus.SendBackAudit })
|
|
|
.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ audit.ApplyOrgId = currentStep.AcceptorOrgId;
|
|
|
+ audit.ApplyOrgName = currentStep!.AcceptorOrgName;
|
|
|
+ ///判断是否指定
|
|
|
+
|
|
|
+ var assignStep = new WorkflowStep();
|
|
|
+ if (audit.IsAssign.Value)
|
|
|
+ {
|
|
|
+ assignStep = steps.FirstOrDefault(x => x.Id == dto.AssignStepId);
|
|
|
+ }
|
|
|
+ audit.SendBackOrgId = audit.IsAssign.Value ? assignStep.HandlerOrgId : prevStep.HandlerOrgId;
|
|
|
+ audit.SendBackOrgName = audit.IsAssign.Value ? assignStep.HandlerOrgName : prevStep.HandlerOrgName;
|
|
|
+ audit.SendBackStepName = audit.IsAssign.Value ? assignStep.Name : prevStep.Name;
|
|
|
+
|
|
|
+ audit.WorkflowStepSendBackCrTime = currentStep.CreationTime;
|
|
|
+ audit.TraceId = currentStep.Id;
|
|
|
+ await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
audit.State = ESendBackAuditState.End;
|
|
|
audit.AuditUser = "默认通过";
|
|
|
audit.AuditTime = DateTime.Now;
|
|
|
- // if (prevStep.BusinessType == EBusinessType.Send && dto.Handler != null)
|
|
|
- // {
|
|
|
- // await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- // { CenterToOrgHandlerId = dto.Handler.UserId, CenterToOrgHandlerName = dto.Handler.Username })
|
|
|
- // .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
- // }
|
|
|
-
|
|
|
- var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
|
|
|
- await _workflowApplication.PreviousAsync(dto,
|
|
|
- async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
|
|
|
- {
|
|
|
- var stepAssignInfo =
|
|
|
- await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1,
|
|
|
- HttpContext.RequestAborted);
|
|
|
- if (stepAssignInfo is null) return;
|
|
|
- var validator = new StepAssignInfoValidator();
|
|
|
- await validator.ValidateAndThrowAsync(stepAssignInfo);
|
|
|
- newStep.Assign(stepAssignInfo);
|
|
|
- },
|
|
|
- HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //记录退回后最新的流程节点
|
|
|
- if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
|
|
|
- audit.NewCurrentStepId = newStep.Id;
|
|
|
-
|
|
|
- if (prevStep.BusinessType == EBusinessType.Send)
|
|
|
- {
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Order()
|
|
|
- { CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName })
|
|
|
- .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
- }
|
|
|
-
|
|
|
- var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
|
|
|
- ? EProcessType.Zhiban
|
|
|
- : EProcessType.Jiaoban;
|
|
|
- if (currentStep.AcceptorOrgId != OrgSeedData.CenterId && prevStep.BusinessType == EBusinessType.Send)
|
|
|
- order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
|
|
|
- .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
- //发送短信TODO
|
|
|
+ await _orderApplication.OrderPrevious(audit, order, HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -5633,49 +5578,9 @@ public class OrderController : BaseController
|
|
|
audit.State = ESendBackAuditState.End;
|
|
|
audit.AuditUser = "默认通过";
|
|
|
audit.AuditTime = DateTime.Now;
|
|
|
- // if (prevStep.BusinessType == EBusinessType.Send && dto.Handler != null)
|
|
|
- // {
|
|
|
- // await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- // { CenterToOrgHandlerId = dto.Handler.UserId, CenterToOrgHandlerName = dto.Handler.Username })
|
|
|
- // .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
- // }
|
|
|
-
|
|
|
- var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
|
|
|
- await _workflowApplication.PreviousAsync(dto,
|
|
|
- async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
|
|
|
- {
|
|
|
- var stepAssignInfo =
|
|
|
- await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, HttpContext.RequestAborted);
|
|
|
- if (stepAssignInfo is null) return;
|
|
|
- var validator = new StepAssignInfoValidator();
|
|
|
- await validator.ValidateAndThrowAsync(stepAssignInfo);
|
|
|
- newStep.Assign(stepAssignInfo);
|
|
|
- },
|
|
|
- HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //记录退回后最新的流程节点
|
|
|
- if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
|
|
|
- audit.NewCurrentStepId = newStep.Id;
|
|
|
-
|
|
|
- if (prevStep.BusinessType == EBusinessType.Send)
|
|
|
- {
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Order()
|
|
|
- { CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName })
|
|
|
- .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
- }
|
|
|
-
|
|
|
- var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
|
|
|
- ? EProcessType.Zhiban
|
|
|
- : EProcessType.Jiaoban;
|
|
|
- if (currentStep.AcceptorOrgId != OrgSeedData.CenterId && prevStep.BusinessType == EBusinessType.Send)
|
|
|
- order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
|
|
|
- .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ await _orderApplication.OrderPrevious(audit, order, HttpContext.RequestAborted);
|
|
|
|
|
|
- //发送短信TODO
|
|
|
}
|
|
|
-
|
|
|
- await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -5706,7 +5611,7 @@ public class OrderController : BaseController
|
|
|
var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == sendBack.OrderId);
|
|
|
if (_appOptions.Value.IsZiGong)
|
|
|
{
|
|
|
- var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
+ var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
HttpContext.RequestAborted);
|
|
|
|
|
@@ -5719,60 +5624,17 @@ public class OrderController : BaseController
|
|
|
var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
sendBack.SendBackData.Handler = handler;
|
|
|
}
|
|
|
-
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- CenterToOrgHandlerId = sendBack.SendBackData.Handler.UserId,
|
|
|
- CenterToOrgHandlerName = sendBack.SendBackData.Handler.Username
|
|
|
- })
|
|
|
- .Where(o => o.Id == sendBack.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- //string applicantId, string applicantOrgId, string[] applicantRoleIds,
|
|
|
- // ISessionContext current, CancellationToken cancellationToken);
|
|
|
sendBack.SendBackData.ExpiredTime = order.ExpiredTime;
|
|
|
- //var result = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId,
|
|
|
- // sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
- // cancellationToken: HttpContext.RequestAborted);
|
|
|
-
|
|
|
- var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
|
|
|
- await _workflowApplication.PreviousAsync(sendBack.SendBackData,
|
|
|
- sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
- async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
|
|
|
- {
|
|
|
- var stepAssignInfo =
|
|
|
- await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine,
|
|
|
- prevStep1, HttpContext.RequestAborted);
|
|
|
- if (stepAssignInfo is null) return;
|
|
|
- var validator = new StepAssignInfoValidator();
|
|
|
- await validator.ValidateAndThrowAsync(stepAssignInfo);
|
|
|
- newStep.Assign(stepAssignInfo);
|
|
|
- },
|
|
|
- HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
|
|
|
- var processType = flowDirection == EFlowDirection.OrgToCenter ||
|
|
|
- flowDirection == EFlowDirection.CenterToCenter
|
|
|
- ? EProcessType.Zhiban
|
|
|
- : EProcessType.Jiaoban;
|
|
|
- if (sendBack.ApplyOrgId != OrgSeedData.CenterId && sendBack.SendBackOrgId == OrgSeedData.CenterId)
|
|
|
- order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
|
|
|
- .Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //记录退回后最新的流程节点
|
|
|
- if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
|
|
|
- sendBack.NewCurrentStepId = newStep.Id;
|
|
|
- //发送短信TODO
|
|
|
+ await _orderApplication.OrderPrevious(sendBack, order, HttpContext.RequestAborted);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = sendBack.Status.Value })
|
|
|
.Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
|
|
|
}
|
|
|
-
|
|
|
- await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -5804,7 +5666,7 @@ public class OrderController : BaseController
|
|
|
var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == sendBack.OrderId);
|
|
|
if (_appOptions.Value.IsZiGong)
|
|
|
{
|
|
|
- var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
+ var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
HttpContext.RequestAborted);
|
|
|
if (prevStep.BusinessType == EBusinessType.Send)
|
|
@@ -5816,57 +5678,20 @@ public class OrderController : BaseController
|
|
|
var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
sendBack.SendBackData.Handler = handler;
|
|
|
}
|
|
|
-
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- CenterToOrgHandlerId = sendBack.SendBackData.Handler.UserId,
|
|
|
- CenterToOrgHandlerName = sendBack.SendBackData.Handler.Username
|
|
|
- })
|
|
|
- .Where(o => o.Id == sendBack.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
sendBack.SendBackData.ExpiredTime = order.ExpiredTime;
|
|
|
- //var result = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
|
|
|
- // sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
- // cancellationToken: HttpContext.RequestAborted);
|
|
|
- //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
|
|
|
-
|
|
|
- var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
|
|
|
- await _workflowApplication.PreviousAsync(sendBack.SendBackData,
|
|
|
- sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
|
|
|
- async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
|
|
|
- {
|
|
|
- var stepAssignInfo =
|
|
|
- await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine,
|
|
|
- prevStep1, HttpContext.RequestAborted);
|
|
|
- if (stepAssignInfo is null) return;
|
|
|
- var validator = new StepAssignInfoValidator();
|
|
|
- await validator.ValidateAndThrowAsync(stepAssignInfo);
|
|
|
- newStep.Assign(stepAssignInfo);
|
|
|
- },
|
|
|
- HttpContext.RequestAborted);
|
|
|
-
|
|
|
- var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
|
|
|
- ? EProcessType.Zhiban
|
|
|
- : EProcessType.Jiaoban;
|
|
|
- if (sendBack.ApplyOrgId != OrgSeedData.CenterId && sendBack.SendBackOrgId == OrgSeedData.CenterId)
|
|
|
- order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
|
|
|
- await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
|
|
|
- .Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //记录退回后最新的流程节点
|
|
|
- if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
|
|
|
- sendBack.NewCurrentStepId = newStep.Id;
|
|
|
- //发送短信TODO
|
|
|
+ await _orderApplication.OrderPrevious(sendBack, order, HttpContext.RequestAborted);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = sendBack.Status.Value })
|
|
|
.Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
- await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5965,8 +5790,25 @@ public class OrderController : BaseController
|
|
|
if (string.IsNullOrEmpty(order.WorkflowId))
|
|
|
throw UserFriendlyException.SameMessage("该工单未开启流程");
|
|
|
|
|
|
- var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
+ var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
|
|
|
+ ///查询上一节点是否是领导节点
|
|
|
+ ///ture 流程排除领导节点 排除当前节点 prevStep.BusinessType == EBusinessType.DepartmentLeader
|
|
|
+ if (_appOptions.Value.IsYiBin && prevStep.Name.Contains("领导"))
|
|
|
+ {
|
|
|
+ var step = steps.Where(x => !x.Name.Contains("领导") && x.Code != currentStep.Code).OrderByDescending(x => x.CreationTime).FirstOrDefault();
|
|
|
+ var resStep = new List<WorkflowStep>
|
|
|
+ {
|
|
|
+ step,
|
|
|
+ prevStep
|
|
|
+ };
|
|
|
+ return new TargetStepInfo
|
|
|
+ {
|
|
|
+ CurrentBusinessType = currentStep.BusinessType,
|
|
|
+ TargetBusinessType = prevStep.BusinessType,
|
|
|
+ Steps = _mapper.Map<List<TargetStep>>(resStep)
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
return new TargetStepInfo
|
|
|
{
|
|
@@ -8991,6 +8833,7 @@ public class OrderController : BaseController
|
|
|
var id = await _orderComplementRepository.AddAsync(complement, HttpContext.RequestAborted);
|
|
|
if (!string.IsNullOrEmpty(id))
|
|
|
{
|
|
|
+ #region 处理推送消息
|
|
|
//获取当前办理节点数据
|
|
|
var work = await _workflowStepRepository.GetAsync(p => p.Id == data.ActualHandleStepId, HttpContext.RequestAborted);
|
|
|
if (work != null)
|
|
@@ -8999,60 +8842,61 @@ public class OrderController : BaseController
|
|
|
var workflowStepHandler = work.GetWorkflowStepHandler();
|
|
|
if (workflowStepHandler != null)
|
|
|
{
|
|
|
- List<string> users = [];
|
|
|
+
|
|
|
+ AddCircularDto circularDto = new AddCircularDto()
|
|
|
+ {
|
|
|
+ Title = "工单补充",
|
|
|
+ Content = "工单" + data.No + "有补充内容,请注意查收!",
|
|
|
+ CircularTypeId = "6",
|
|
|
+ CircularTypeName = "工单补充",
|
|
|
+ IsMustRead = true,
|
|
|
+ SourceOrgId = _sessionContext.RequiredOrgId,
|
|
|
+ SourceOrgName = _sessionContext.OrgName,
|
|
|
+ CircularType = ECircularType.Person
|
|
|
+ };
|
|
|
+
|
|
|
+ List<CircularReadGroupDto> users = [];
|
|
|
if (!string.IsNullOrEmpty(workflowStepHandler.UserId)) //指定用户
|
|
|
{
|
|
|
- users.Add(workflowStepHandler.UserId);
|
|
|
+ users.Add(new CircularReadGroupDto()
|
|
|
+ {
|
|
|
+ UserId = workflowStepHandler.UserId,
|
|
|
+ UserName = workflowStepHandler.Username
|
|
|
+ });
|
|
|
}
|
|
|
else if (!string.IsNullOrEmpty(workflowStepHandler.RoleId))//指定角色
|
|
|
{
|
|
|
//查询指定角色下面所有的用户
|
|
|
var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
- x.OrgId == workflowStepHandler.OrgId && x.Roles.Any(d => workflowStepHandler.RoleId.Contains(d.Id))).Select(p => p.Id).ToListAsync();
|
|
|
- if (userlist != null && userlist.Count > 0)
|
|
|
- users.AddRange(userlist);
|
|
|
+ x.OrgId == workflowStepHandler.OrgId && x.Roles.Any(d => workflowStepHandler.RoleId.Contains(d.Id)))
|
|
|
+ .Select(d => new CircularReadGroupDto
|
|
|
+ {
|
|
|
+ UserId = d.Id,
|
|
|
+ UserName = d.Name
|
|
|
+ }).ToListAsync();
|
|
|
+ users.AddRange(userlist);
|
|
|
}
|
|
|
else if (!string.IsNullOrEmpty(workflowStepHandler.OrgId))//指定部门
|
|
|
{
|
|
|
- //添加成功以后查询需要发送的人员信息
|
|
|
- var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
|
|
|
-
|
|
|
- //查询指定部门下面经办人的信息
|
|
|
- var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
- x.OrgId == workflowStepHandler.OrgId && x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).Select(p => p.Id).ToListAsync();
|
|
|
- if (userlist != null && userlist.Count > 0)
|
|
|
- users.AddRange(userlist);
|
|
|
+ users.Add(new CircularReadGroupDto()
|
|
|
+ {
|
|
|
+ OrgId = workflowStepHandler.OrgId,
|
|
|
+ OrgName = workflowStepHandler.OrgName
|
|
|
+ });
|
|
|
+ circularDto.CircularType = ECircularType.Org;
|
|
|
}
|
|
|
+
|
|
|
if (users != null && users.Count > 0)
|
|
|
{
|
|
|
- var msg = @"工单" + data.No + "有补充内容,请注意查收!";
|
|
|
- foreach (var item in users)
|
|
|
- {
|
|
|
- //发送消息
|
|
|
- await _realtimeService.OrderComplementAsync(item, msg, HttpContext.RequestAborted);
|
|
|
- }
|
|
|
+ circularDto.CircularReadGroups = users;
|
|
|
+ //调用推送消息通用接口
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 根据userid查询补充消息
|
|
|
- /// </summary>
|
|
|
- /// <param name="userId"></param>
|
|
|
- /// <returns></returns>
|
|
|
- [HttpGet("get_notification_wait_send/{userId}")]
|
|
|
- public async Task<List<NotificationWaitSendDto>> GetNotificationWaitSend(string userId)
|
|
|
- {
|
|
|
- var data = await _notificationWaitSendRepository.Queryable()
|
|
|
- .Where(p => p.UserId == userId && p.Method == RealtimeMethods.OrderComplementRecord&&p.State=="0")
|
|
|
- .ToListAsync();
|
|
|
- if (data != null && data.Count > 0)
|
|
|
- {
|
|
|
- await _notificationWaitSendRepository.RemoveRangeAsync(data, HttpContext.RequestAborted);
|
|
|
+ #endregion
|
|
|
}
|
|
|
- return _mapper.Map<List<NotificationWaitSendDto>>(data);
|
|
|
}
|
|
|
+
|
|
|
#endregion
|
|
|
}
|