|
@@ -66,6 +66,11 @@ using XF.Utility.EnumExtensions;
|
|
|
using Hotline.Application.Contracts.Validators.FlowEngine;
|
|
|
using Hotline.Authentications;
|
|
|
using Microsoft.AspNetCore.Components;
|
|
|
+using Quartz.Simpl;
|
|
|
+using static Lucene.Net.Util.Fst.Util;
|
|
|
+using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
+using System.Threading;
|
|
|
+using Hotline.Caching.Services;
|
|
|
|
|
|
namespace Hotline.Api.Controllers;
|
|
|
|
|
@@ -415,6 +420,22 @@ public class OrderController : BaseController
|
|
|
await _publisher.PublishAsync(new ContingencyManagementNotify(order, dto.ArrangeTitle, dto.ArrangeContent, dto.ArrangeOpinion),
|
|
|
PublishStrategy.ParallelWhenAll, HttpContext.RequestAborted);
|
|
|
|
|
|
+ // 取消发布功能开关
|
|
|
+ var cancelPublishOrderEnabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
|
|
|
+ // 取消发布的工单数量
|
|
|
+ var orderPublishDeletedCount = await _orderPublishRepository.Queryable(includeDeleted: true)
|
|
|
+ .Where(m => m.OrderId == order.Id && m.IsDeleted == true)
|
|
|
+ .CountAsync(HttpContext.RequestAborted);
|
|
|
+ var orderVisitVisitedCount = await _orderVisitRepository.Queryable()
|
|
|
+ .Where(m => m.OrderId == order.Id && m.VisitState == EVisitState.Visited)
|
|
|
+ .CountAsync(HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ // 若取消发布的工单,已经被回访过了,没有经过重新办理,再次发布后,自动跳过回访环节,展示取消发布前的回访结果
|
|
|
+ if (orderPublishDeletedCount != 0 && orderVisitVisitedCount != 0 && cancelPublishOrderEnabled == true)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
var orderVisit = new OrderVisit();
|
|
|
orderVisit.No = order.No;
|
|
|
orderVisit.OrderId = order.Id;
|
|
@@ -554,7 +575,6 @@ public class OrderController : BaseController
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 已发布列表
|
|
|
/// </summary>
|
|
@@ -741,6 +761,22 @@ public class OrderController : BaseController
|
|
|
return rsp;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 取消发布
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPut("publish/cancel")]
|
|
|
+ public async Task<string> PublishCancelAsync([FromBody]PublishCancelInDto dto)
|
|
|
+ {
|
|
|
+ var enabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
|
|
|
+ if (enabled == false) return "取消发布功能已被关闭";
|
|
|
+ var publish = await _orderPublishRepository.GetAsync(dto.OrderPublishId)
|
|
|
+ ?? throw UserFriendlyException.SameMessage("发布单不存在");
|
|
|
+ publish.IsDeleted = true;
|
|
|
+ await _orderPublishRepository.UpdateAsync(publish);
|
|
|
+ return "取消成功";
|
|
|
+ }
|
|
|
#endregion
|
|
|
|
|
|
#region 工单回访
|
|
@@ -763,6 +799,7 @@ public class OrderController : BaseController
|
|
|
.WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
|
|
|
.WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
|
|
|
.WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
|
|
|
+ .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough , d=>d.IsPutThrough == false)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
|
|
|
.WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
|
|
@@ -1193,16 +1230,29 @@ public class OrderController : BaseController
|
|
|
}).ToList();
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
-
|
|
|
- #region 二次回访申请
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 可二次回访申请列表
|
|
|
+ /// 设置未接通
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- [HttpGet("visitapply/visitagainlist")]
|
|
|
+ [HttpPut("visit/put_through")]
|
|
|
+ public async Task VisitPutThrough([FromBody] VisitPutThroughDto dto ) {
|
|
|
+
|
|
|
+ await _orderVisitRepository.Updateable().SetColumns(x => new OrderVisit { IsPutThrough = false }).Where(x => x.Id == dto.id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 二次回访申请
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 可二次回访申请列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("visitapply/visitagainlist")]
|
|
|
public async Task<PagedDto<OrderCanVisitAgainDto>> OrderVisitAgainList([FromQuery] OrderVisitAgainListDto dto)
|
|
|
{
|
|
|
var (total, items) = await _orderVisitedDetailRepository.Queryable()
|
|
@@ -1631,23 +1681,34 @@ public class OrderController : BaseController
|
|
|
[HttpGet("delay/{workflowId}/nextsteps")]
|
|
|
public async Task<NextStepsDto> OrderDelayNextsteps(string workflowId)
|
|
|
{
|
|
|
- var workflow = await _workflowRepository.GetAsync(workflowId, HttpContext.RequestAborted);
|
|
|
+ //var workflow = await _workflowRepository.GetAsync(workflowId, HttpContext.RequestAborted);
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var currentStep = workflow.Steps.FirstOrDefault(d => d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
|
|
|
if (workflow != null)
|
|
|
{
|
|
|
- var orderDelay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId)
|
|
|
+
|
|
|
+ var orderDelay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId)
|
|
|
.FirstAsync(HttpContext.RequestAborted);
|
|
|
if (orderDelay != null)
|
|
|
{
|
|
|
- var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
|
|
|
- if (!orderDelay.Order.IsProvince)
|
|
|
+ var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
|
|
|
+ if (!orderDelay.Order.IsProvince)
|
|
|
{
|
|
|
if (result.Steps.Any(x => x.Value == "省审批"))
|
|
|
{
|
|
|
result.Steps.Remove(result.Steps.First(x => x.Value == "省审批"));
|
|
|
}
|
|
|
}
|
|
|
+ if (!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审")
|
|
|
+ {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心终审"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return result;
|
|
|
+ return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1813,9 +1874,23 @@ public class OrderController : BaseController
|
|
|
[HttpGet("delay/startflow")]
|
|
|
public async Task<NextStepsDto> GetDelayFlowStartOptions()
|
|
|
{
|
|
|
- return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderDelay,
|
|
|
+ var result = await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderDelay,
|
|
|
HttpContext.RequestAborted);
|
|
|
- }
|
|
|
+ if (_sessionContext.OrgIsCenter)
|
|
|
+ {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心初审"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心初审"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心终审"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 延期页面基础信息
|
|
@@ -1854,103 +1929,61 @@ public class OrderController : BaseController
|
|
|
// dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
|
|
|
dto.CreationTimeStart = await _expireTime.CalcWorkTimeReduce(DateTime.Now, 5);
|
|
|
}
|
|
|
-
|
|
|
- var query = _orderVisitedDetailRepository.Queryable(false, true)
|
|
|
- .Includes(x => x.OrderVisit)
|
|
|
- .Includes(x => x.OrderVisit, y => y.Order)
|
|
|
- .Includes(x => x.OrderVisit, y => y.Employee)
|
|
|
- //.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.IsDeleted == false)
|
|
|
- .Includes(x => x.OrderScreens)
|
|
|
- .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
|
|
|
- x.OrderScreens.Any() == false
|
|
|
- //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
|
|
|
- )
|
|
|
- .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
|
|
|
- .WhereIF(dto.ScreenSendBack is 1,
|
|
|
- x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true))
|
|
|
- .WhereIF(dto.ScreenSendBack is 2,
|
|
|
- x => x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply != true)) ==
|
|
|
- false)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
|
|
|
- .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName),
|
|
|
- x => x.OrderVisit.Order!.Hotspot.HotSpotFullName!.StartsWith(dto.HotspotSpliceName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName),
|
|
|
- x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
|
|
|
- .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue,
|
|
|
- x => x.OrderVisit.Order!.CreationTime >= dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
|
|
|
- .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue,
|
|
|
- x => x.OrderVisit.Order!.CurrentHandleTime >= dto.CurrentHandleTime &&
|
|
|
- x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
|
|
|
- .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue,
|
|
|
- x => x.OrderVisit.Order!.FiledTime >= dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
|
|
|
- .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue,
|
|
|
- x => x.OrderVisit.VisitTime >= dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
|
|
|
- .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true,
|
|
|
- x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
|
|
|
- //.WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults),
|
|
|
- // x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude),
|
|
|
- // x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason),
|
|
|
- // x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
|
|
|
- .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle);
|
|
|
- if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
|
|
|
- {
|
|
|
- query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
|
|
|
- x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
|
|
|
- x.OrderVisit.Order.No.Contains(dto.Keyword!))
|
|
|
- .Where(x => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
|
|
|
- SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
|
|
|
- SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
|
|
|
- SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
|
|
|
- SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
|
|
|
- ));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
|
|
|
- x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
|
|
|
- x.OrderVisit.Order.No.Contains(dto.Keyword!))
|
|
|
- .WhereIF(dto.ScreenType == EOrderScreenType.Org, x => x.VisitTarget == EVisitTarget.Org && (
|
|
|
- SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
|
|
|
- SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
|
|
|
- SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
|
|
|
- SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
|
|
|
- ))
|
|
|
- .WhereIF(dto.ScreenType == EOrderScreenType.Seat,
|
|
|
- x => x.VisitTarget == EVisitTarget.Seat &&
|
|
|
- (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
|
|
|
- ;
|
|
|
- }
|
|
|
-
|
|
|
- var (total, items) = await query
|
|
|
- .OrderByIF(dto is { SortRule: 0, SortField: "order.startTime" }, x => x.OrderVisit.Order.StartTime, OrderByType.Asc)
|
|
|
- .OrderByIF(dto is { SortRule: 1, SortField: "order.startTime" }, x => x.OrderVisit.Order.StartTime, OrderByType.Desc)
|
|
|
- .OrderByIF(dto is { SortRule: 0, SortField: "order.actualHandleTime" }, x => x.OrderVisit.Order.ActualHandleTime, OrderByType.Asc)
|
|
|
- .OrderByIF(dto is { SortRule: 1, SortField: "order.actualHandleTime" }, x => x.OrderVisit.Order.ActualHandleTime, OrderByType.Desc)
|
|
|
- .OrderByIF(dto is { SortRule: 0, SortField: "order.filedTime" }, x => x.OrderVisit.Order.FiledTime, OrderByType.Asc)
|
|
|
- .OrderByIF(dto is { SortRule: 1, SortField: "order.filedTime" }, x => x.OrderVisit.Order.FiledTime, OrderByType.Desc)
|
|
|
- .OrderByIF(dto is { SortRule: 0, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Asc)
|
|
|
- .OrderByIF(dto is { SortRule: 1, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Desc)
|
|
|
- .OrderByIF(dto.SortRule is null, x => x.CreationTime, OrderByType.Desc)
|
|
|
- .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ var (total, items) = await _orderApplication.MayScreenList(dto)
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
- /// 工单甄别列表
|
|
|
+ /// 工单甄别待申请列表导出
|
|
|
/// </summary>
|
|
|
- /// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- [HttpGet("screen")]
|
|
|
+ [HttpPost("mayscreen/_export")]
|
|
|
+ public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
|
|
|
+ {
|
|
|
+ if (_appOptions.Value.IsYiBin) dto.QueryDto.ScreenType = EOrderScreenType.Org;
|
|
|
+
|
|
|
+ dto.QueryDto.CreationTimeEnd = DateTime.Now;
|
|
|
+ dto.QueryDto.CreationTimeStart = DateTime.Now;
|
|
|
+ if (dto.QueryDto.IsHomePage != null && dto.QueryDto.IsHomePage == true)
|
|
|
+ {
|
|
|
+ // dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
|
|
|
+ dto.QueryDto.CreationTimeStart = await _expireTime.CalcWorkTimeReduce(DateTime.Now, 5);
|
|
|
+ }
|
|
|
+
|
|
|
+ var query = _orderApplication.MayScreenList(dto.QueryDto);
|
|
|
+ List<OrderVisitDetail> data;
|
|
|
+ if (dto.IsExportAll)
|
|
|
+ {
|
|
|
+ data = await query.ToListAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
|
|
|
+ data = items;
|
|
|
+ }
|
|
|
+
|
|
|
+ var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
|
|
|
+
|
|
|
+ dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
|
|
|
+
|
|
|
+ var dtos = dataDtos
|
|
|
+ .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
|
|
|
+ .Cast<object>()
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var stream = ExcelHelper.CreateStream(dtos);
|
|
|
+
|
|
|
+ return ExcelStreamResult(stream, "工单甄别待申请列表数据");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 工单甄别列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("screen")]
|
|
|
public async Task<PagedDto<OrderScreenListDto>> ScreenList([FromQuery] ScreenListDto dto)
|
|
|
{
|
|
|
var (total, items) = await _orderApplication.OrderScreenList(dto)
|
|
@@ -2139,9 +2172,22 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
//return await _workflowApplication.GetStartOptionsAsync(WorkflowModuleConsts.OrderScreen,
|
|
|
// HttpContext.RequestAborted);
|
|
|
-
|
|
|
- return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderScreen,
|
|
|
+ var result = await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderScreen,
|
|
|
HttpContext.RequestAborted);
|
|
|
+ if (_sessionContext.OrgIsCenter)
|
|
|
+ {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心初审"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心初审"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心班长"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -2179,6 +2225,13 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!_sessionContext.OrgIsCenter)
|
|
|
+ {
|
|
|
+ if (result.Steps.Any(x => x.Value == "中心班长"))
|
|
|
+ {
|
|
|
+ result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
|
|
|
+ }
|
|
|
+ }
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
@@ -3026,7 +3079,7 @@ public class OrderController : BaseController
|
|
|
cancellationToken: HttpContext.RequestAborted);
|
|
|
|
|
|
List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto
|
|
|
- { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
|
|
|
+ { Remark = x.Remark, RemarkTime = x.HandleTime, RemarkUser = x.HandlerName }).ToList();
|
|
|
dto.OrderRemarks = remarks;
|
|
|
if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
|
|
|
{
|
|
@@ -3220,7 +3273,8 @@ public class OrderController : BaseController
|
|
|
/// </summary>
|
|
|
[HttpPost("add-anonymous")]
|
|
|
[AllowAnonymous]
|
|
|
- public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
|
|
|
+ [LogFilter("省平台调用记录")]
|
|
|
+ public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
|
|
|
{
|
|
|
return await _orderApplication.ReceiveOrderFromExternalAsync(dto, HttpContext.RequestAborted);
|
|
|
}
|
|
@@ -3565,30 +3619,12 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // 平均派单
|
|
|
- var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
- if (averageSendOrder)
|
|
|
- {
|
|
|
- if (!nextDto.NextHandlers.Any())
|
|
|
- {
|
|
|
- var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
- nextDto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
- }
|
|
|
- }
|
|
|
+ await AverageSendOrderAsync(nextDto, HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // 平均派单
|
|
|
- var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
- if (averageSendOrder)
|
|
|
- {
|
|
|
- if (!nextDto.NextHandlers.Any())
|
|
|
- {
|
|
|
- var handler = await _orderDomainService.AverageOrder(cancellationToken);
|
|
|
- nextDto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
- }
|
|
|
- }
|
|
|
+ await AverageSendOrderAsync(nextDto, HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3638,6 +3674,20 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private async Task AverageSendOrderAsync(NextWorkflowDto nextDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ // 平均派单
|
|
|
+ var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
+ if (averageSendOrder)
|
|
|
+ {
|
|
|
+ if (!nextDto.NextHandlers.Any())
|
|
|
+ {
|
|
|
+ var handler = await _orderDomainService.AverageOrder(cancellationToken);
|
|
|
+ nextDto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 跨级指派查询下一步可选节点及办理对象参数
|
|
|
/// </summary>
|
|
@@ -3735,13 +3785,14 @@ public class OrderController : BaseController
|
|
|
[HttpPost("endcs")]
|
|
|
public async Task EndCountersign([FromBody] EndCountersignDto dto)
|
|
|
{
|
|
|
- var workflow = await _workflowDomainService.TerminalCountersignAsync(dto.CountersignId, HttpContext.RequestAborted);
|
|
|
- var order = await _orderRepository.GetAsync(d => d.WorkflowId == workflow.Id, HttpContext.RequestAborted);
|
|
|
- if (order is null)
|
|
|
- throw new UserFriendlyException($"工单未开启流程, workflowId: {workflow.Id}");
|
|
|
- order.UpdateHandlingStatus(workflow.IsInCountersign);
|
|
|
- _mapper.Map(workflow, order);
|
|
|
- await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
|
|
|
+ //var workflow = await _workflowDomainService.TerminalCountersignAsync(dto.CountersignId, HttpContext.RequestAborted);
|
|
|
+ //var order = await _orderRepository.GetAsync(d => d.WorkflowId == workflow.Id, HttpContext.RequestAborted);
|
|
|
+ //if (order is null)
|
|
|
+ // throw new UserFriendlyException($"工单未开启流程, workflowId: {workflow.Id}");
|
|
|
+ //order.UpdateHandlingStatus(workflow.IsInCountersign);
|
|
|
+ //_mapper.Map(workflow, order);
|
|
|
+ //await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
|
|
|
+ await _orderApplication.EndCountersign(dto, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3780,8 +3831,9 @@ public class OrderController : BaseController
|
|
|
OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
|
|
|
CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
|
|
|
IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
|
|
|
- OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag)
|
|
|
- };
|
|
|
+ OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag),
|
|
|
+ FocusOnEvents = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FocusOnEvent)
|
|
|
+ };
|
|
|
return rsp;
|
|
|
}
|
|
|
|
|
@@ -3895,6 +3947,22 @@ public class OrderController : BaseController
|
|
|
await _orderDomainService.TriggerAverageOrder(HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 批量归档
|
|
|
+ /// </summary>
|
|
|
+ [HttpPost("batch-file")]
|
|
|
+ public async Task BatchFile([FromBody]OrderBatchFileDto dto)
|
|
|
+ {
|
|
|
+ var orders = await _orderRepository.Queryable()
|
|
|
+ .Where(d => dto.OrderIds.Contains(d.Id))
|
|
|
+ .ToListAsync(HttpContext.RequestAborted);
|
|
|
+ foreach (var order in orders)
|
|
|
+ {
|
|
|
+ await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId,dto.Opinion,dto.Files,
|
|
|
+ order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 工单待办
|
|
@@ -4677,32 +4745,18 @@ public class OrderController : BaseController
|
|
|
var specialAny = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == 0)
|
|
|
.AnyAsync();
|
|
|
if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
|
|
|
-
|
|
|
- var screen = await _orderScreenRepository.Queryable().Where(x => x.OrderId == dto.OrderId && (int)x.Status < 2).AnyAsync();
|
|
|
- if (screen) throw UserFriendlyException.SameMessage("工单存在甄别中的信息!");
|
|
|
-
|
|
|
- if (await _orderSendBackAuditRepository.AnyAsync(x => x.OrderId == dto.OrderId && x.State == ESendBackAuditState.Apply,
|
|
|
- HttpContext.RequestAborted))
|
|
|
- {
|
|
|
- throw UserFriendlyException.SameMessage("该工单存在正在审核中的退回,不能办理");
|
|
|
- }
|
|
|
-
|
|
|
- if (_appOptions.Value.IsZiGong && string.IsNullOrEmpty(dto.Cause))
|
|
|
- {
|
|
|
- dto.Cause = dto.Reason;
|
|
|
- }
|
|
|
-
|
|
|
- var order = await _orderRepository
|
|
|
- .Queryable()
|
|
|
- .Includes(d => d.Workflow)
|
|
|
- .FirstAsync(d => d.Id == dto.OrderId);
|
|
|
- if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行特提!");
|
|
|
-
|
|
|
- var model = _mapper.Map<OrderSpecial>(dto);
|
|
|
- var orgs = order.HandlerOrgs;
|
|
|
- model.OrgId = orgs != null && orgs.Count > 0 ? orgs[0].Key : "";
|
|
|
- model.OrgName = orgs != null && orgs.Count > 0 ? orgs[0].Value : "";
|
|
|
- var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
|
|
|
+ var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
|
|
|
+ await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
|
|
|
+ if (currentStep is null)
|
|
|
+ currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
|
|
|
+
|
|
|
+ var model = _mapper.Map<OrderSpecial>(dto);
|
|
|
+ model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId: currentStep.HandlerOrgId;
|
|
|
+ model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
|
|
|
+ var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
|
|
|
model.StepName = step.Name;
|
|
|
model.StepCode = step.Code;
|
|
|
model.Status = order.Status;
|
|
@@ -4872,12 +4926,13 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 工单重办信息
|
|
|
- /// </summary>
|
|
|
- /// <param name="dtos"></param>
|
|
|
- /// <returns></returns>
|
|
|
- [HttpPost("re_transact")]
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 工单重办信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("re_transact")]
|
|
|
[LogFilter("工单重办")]
|
|
|
public async Task Add([FromBody] OrderReTransactDto dto)
|
|
|
{
|
|
@@ -4901,10 +4956,15 @@ public class OrderController : BaseController
|
|
|
if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行重办!");
|
|
|
|
|
|
var model = _mapper.Map<OrderSpecial>(dto);
|
|
|
- var orgs = order.HandlerOrgs;
|
|
|
- model.OrgId = orgs != null && orgs.Count > 0 ? orgs[0].Key : "";
|
|
|
- model.OrgName = orgs != null && orgs.Count > 0 ? orgs[0].Value : "";
|
|
|
- var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
|
|
|
+ if (currentStep is null)
|
|
|
+ currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
|
|
|
+
|
|
|
+ model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId : currentStep.HandlerOrgId;
|
|
|
+ model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
|
|
|
+ var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
|
|
|
model.StepName = step.Name;
|
|
|
model.StepCode = step.Code;
|
|
|
model.State = 1;
|
|
@@ -4918,7 +4978,7 @@ public class OrderController : BaseController
|
|
|
if (dto.Files.Any())
|
|
|
model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", HttpContext.RequestAborted);
|
|
|
await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
|
|
|
- if (dto.ReTransactError.Any())
|
|
|
+ if (dto.ReTransactError != null && dto.ReTransactError.Any())
|
|
|
{
|
|
|
List<OrderSpecialDetail> details = new();
|
|
|
foreach (var item in dto.ReTransactError)
|
|
@@ -5014,6 +5074,8 @@ public class OrderController : BaseController
|
|
|
.Where(o => o.Id == order.Id)
|
|
|
.ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
|
|
|
+ // 重办清空已取消发布的工单的回访信息
|
|
|
+ await _orderDomainService.VisitNoneByCancelPublishAsync(order.Id, HttpContext.RequestAborted);
|
|
|
//var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == dto.OrderId && x.VisitState != EVisitState.None);
|
|
|
//if (visit != null)
|
|
|
//{
|