|
@@ -35,14 +35,12 @@ using Hotline.Share.Dtos.FlowEngine.Workflow;
|
|
|
using Hotline.Share.Dtos.Order;
|
|
|
using Hotline.Share.Dtos.Order.Migration;
|
|
|
using Hotline.Share.Dtos.Order.Publish;
|
|
|
-using Hotline.Share.Dtos.Push;
|
|
|
using Hotline.Share.Dtos.Settings;
|
|
|
using Hotline.Share.Enums.CallCenter;
|
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
using Hotline.Share.Enums.Push;
|
|
|
using Hotline.Share.Enums.Settings;
|
|
|
-using Hotline.Share.Mq;
|
|
|
using Hotline.Share.Requests;
|
|
|
using Hotline.Share.Tools;
|
|
|
using Hotline.Tools;
|
|
@@ -56,15 +54,18 @@ using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.Extensions.Options;
|
|
|
using MiniExcelLibs;
|
|
|
using SqlSugar;
|
|
|
-using StackExchange.Redis;
|
|
|
using System.Text;
|
|
|
+using System.Text.Json;
|
|
|
+using Hotline.Share.Dtos.Order.Handle;
|
|
|
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 Newtonsoft.Json;
|
|
|
+using Hotline.Application.Contracts.Validators.FlowEngine;
|
|
|
+using Hotline.Authentications;
|
|
|
+using Microsoft.AspNetCore.Components;
|
|
|
|
|
|
namespace Hotline.Api.Controllers;
|
|
|
|
|
@@ -322,6 +323,12 @@ public class OrderController : BaseController
|
|
|
.WhereIF(dto.FiledTimeStart.HasValue, d => d.FiledTime >= dto.FiledTimeStart)
|
|
|
.WhereIF(dto.FiledTimeEnd.HasValue, d => d.FiledTime <= dto.FiledTimeEnd)
|
|
|
.WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
|
|
|
+ .WhereIF(dto.IsOverTime == true,
|
|
|
+ d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
|
|
|
+ .WhereIF(dto.IsOverTime == false,
|
|
|
+ d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
|
|
|
.OrderByDescending(d => d.FiledTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
|
|
@@ -695,6 +702,12 @@ public class OrderController : BaseController
|
|
|
.WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
|
|
|
.WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
|
|
|
.WhereIF(dto.Resolve.HasValue, x => x.Resolve == dto.Resolve)
|
|
|
+ .WhereIF(dto.IsOverTime == true,
|
|
|
+ d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
|
|
|
+ .WhereIF(dto.IsOverTime == false,
|
|
|
+ d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期
|
|
|
.OrderByDescending(d => d.CreationTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
|
|
@@ -865,15 +878,15 @@ public class OrderController : BaseController
|
|
|
.Includes(d => d.Order)
|
|
|
.Includes(d => d.Employee)
|
|
|
.Includes(d => d.OrderVisitDetails)
|
|
|
- .WhereIF(dto.VisitState == EVisitStateQuery.NoVisit,
|
|
|
+ .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoVisit,
|
|
|
d => d.VisitState == EVisitState.WaitForVisit ||
|
|
|
d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
|
|
|
- .WhereIF(dto.VisitState == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
|
|
|
- .WhereIF(dto.VisitState == EVisitStateQuery.SMSUnsatisfied, m => m.VisitState == EVisitState.SMSUnsatisfied)
|
|
|
- .WhereIF(dto.VisitState == EVisitStateQuery.SMSVisiting, m => m.VisitState == EVisitState.SMSVisiting)
|
|
|
+ .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(!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, x => x.VisitType == dto.VisitType)
|
|
|
+ .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
|
|
|
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
|
|
|
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
|
|
|
.WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
|
|
@@ -883,17 +896,25 @@ public class OrderController : BaseController
|
|
|
.WhereIF(dto.IsProvince != null && dto.IsProvince == true, d => d.Order.IsProvince == true)
|
|
|
.WhereIF(dto.IsProvince != null && dto.IsProvince == false, d => d.Order.IsProvince == false)
|
|
|
.WhereIF(dto.IsEffectiveAiVisit != null, d => d.IsEffectiveAiVisit == dto.IsEffectiveAiVisit)
|
|
|
- .WhereIF(dto.FromPhone.NotNullOrEmpty(), m => m.Order.FromPhone == dto.FromPhone)
|
|
|
- .WhereIF(dto.Contact.NotNullOrEmpty(), m => m.Order.Contact == dto.Contact)
|
|
|
+ .WhereIF(dto.FromPhone.NotNullOrEmpty(), d => d.Order.FromPhone == dto.FromPhone)
|
|
|
+ .WhereIF(dto.Contact.NotNullOrEmpty(), d => d.Order.Contact == dto.Contact)
|
|
|
.WhereIF(dto.VoiceEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.VoiceEvaluate.Contains(m.VoiceEvaluate.Value)))
|
|
|
.WhereIF(dto.SeatEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.SeatEvaluate.Contains(m.SeatEvaluate.Value)))
|
|
|
.WhereIF(dto.OrgProcessingResults.Any(),
|
|
|
d => d.OrderVisitDetails.Any(m => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(m.OrgProcessingResults, "Key"))))
|
|
|
.WhereIF(dto.OrgHandledAttitude.Any(),
|
|
|
d => d.OrderVisitDetails.Any(q => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(q.OrgHandledAttitude, "Key"))))
|
|
|
+ .WhereIF(dto.IsOverTime == true,
|
|
|
+ d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
|
|
|
+ .WhereIF(dto.IsOverTime == false,
|
|
|
+ d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
|
|
|
+ (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期
|
|
|
.WhereIF(dto.StartTime.HasValue,d=>d.VisitTime>= dto.StartTime)
|
|
|
.WhereIF(dto.EndTime.HasValue,d=>d.VisitTime<= dto.EndTime)
|
|
|
.OrderByDescending(x => x.PublishTime)
|
|
|
+ .WhereIF(dto.Channel.NotNullOrEmpty(), d => d.Order.SourceChannelCode == dto.Channel)
|
|
|
+ .OrderByDescending(d => d.PublishTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
|
|
|
}
|
|
@@ -1615,7 +1636,7 @@ public class OrderController : BaseController
|
|
|
//[Permission(EPermission.ApplyDelay)]
|
|
|
[HttpPost("delay")]
|
|
|
[LogFilter("新增工单延期申请")]
|
|
|
- public async Task ApplyDelay([FromBody] DelayStartFlowDto dto)
|
|
|
+ public async Task ApplyDelay([FromBody] StartWorkflowDto<ApplyDelayDto> dto)
|
|
|
{
|
|
|
var delaydto = dto.Data;
|
|
|
|
|
@@ -1955,11 +1976,12 @@ public class OrderController : BaseController
|
|
|
.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.SendBackApply == true) || x.OrderScreens.Any() == false
|
|
|
- //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
|
|
|
+ .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.ScreenSendBack is 1, x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.SendBackApply == true))
|
|
|
- .WhereIF(dto.ScreenSendBack is 2, x => 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)
|
|
@@ -2007,12 +2029,14 @@ public class OrderController : BaseController
|
|
|
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 && (
|
|
|
+ .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
|
|
@@ -2038,97 +2062,67 @@ public class OrderController : BaseController
|
|
|
[HttpGet("screen")]
|
|
|
public async Task<PagedDto<OrderScreenListDto>> ScreenList([FromQuery] ScreenListDto dto)
|
|
|
{
|
|
|
- var handler = dto.TabStatus is EScreenStatus.Apply;
|
|
|
- var isAdmin = _orderDomainService.IsCheckAdmin();
|
|
|
- ISugarQueryable<OrderScreen> query;
|
|
|
+ var (total, items) = await _orderApplication.OrderScreenList(dto)
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ return new PagedDto<OrderScreenListDto>(total, _mapper.Map<IReadOnlyList<OrderScreenListDto>>(items));
|
|
|
+ }
|
|
|
|
|
|
- if (dto.source == 1)
|
|
|
- {
|
|
|
- query = _orderScreenRepository.Queryable(hasHandled: !handler, isAdmin: isAdmin);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- query = _orderScreenRepository.Queryable(isAdmin: isAdmin)
|
|
|
- .WhereIF(!isAdmin, x => x.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId));
|
|
|
- }
|
|
|
|
|
|
- query = query
|
|
|
- .Includes(d => d.Order)
|
|
|
- .Includes(d => d.VisitDetail)
|
|
|
- .Includes(d => d.Visit, v => v.Order)
|
|
|
- .Includes(d => d.Workflow)
|
|
|
- .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1)
|
|
|
- .ToList())
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Visit.Order.Title.Contains(dto.Title!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Visit.Order.No.Contains(dto.No!));
|
|
|
- if (dto.TabStatus is EScreenStatus.Apply)
|
|
|
- {
|
|
|
- query.Where(d =>
|
|
|
- (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval ||
|
|
|
- (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)));
|
|
|
- }
|
|
|
+ /// <summary>
|
|
|
+ /// 工单甄别列表导出
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("screen_list/_export")]
|
|
|
+ public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<ScreenListDto> dto)
|
|
|
+ {
|
|
|
+ var query = _orderApplication.OrderScreenList(dto.QueryDto);
|
|
|
+ List<OrderScreen> data;
|
|
|
+ if (dto.IsExportAll)
|
|
|
+ {
|
|
|
+ data = await query.ToListAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
|
|
|
+ data = items;
|
|
|
+ }
|
|
|
|
|
|
- if (dto.TabStatus.HasValue && dto.Status == EScreenStatus.MyHandle)
|
|
|
- {
|
|
|
- query.Where(d => (d.Status != EScreenStatus.Apply));
|
|
|
- }
|
|
|
+ var dataDtos = _mapper.Map<ICollection<OrderScreenListDto>>(data);
|
|
|
|
|
|
- var (total, items) = await query
|
|
|
- .WhereIF(dto.DataScope is 1, x => x.CreatorId == _sessionContext.RequiredUserId)
|
|
|
- .WhereIF(dto.Status.HasValue, x => x.Status == dto.Status)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.Order!.AcceptTypeCode! == dto.AcceptType!)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), x => x.Order!.Hotspot.HotSpotFullName!.StartsWith(dto.HotspotSpliceName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.Order!.SourceChannelCode! == dto.SourceChannel!)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitDetail.VisitOrgName!.Contains(dto.VisitOrgName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.CreatorOrgName), d => d.CreatorOrgName == dto.CreatorOrgName)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), d => d.CreatorName == dto.CreatorName)
|
|
|
- .WhereIF(dto.IsProvince.HasValue, x => x.Order!.IsProvince == dto.IsProvince)
|
|
|
- .WhereIF(dto.IsSendBackApplyNum is true, x => x.SendBackApplyNum > 0)
|
|
|
- .WhereIF(dto.IsSendBackApplyNum is false, x => x.SendBackApplyNum == 0)
|
|
|
- .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
|
|
|
- .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.OrderId), d => d.OrderId == dto.OrderId)
|
|
|
- //甄别列表
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
|
|
|
- .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue,
|
|
|
- x => x.Order!.CreationTime >= dto.CreationTime && x.Order!.CreationTime <= dto.EndCreationTime)
|
|
|
- .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue,
|
|
|
- x => x.Order!.CurrentHandleTime >= dto.CurrentHandleTime && x.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
|
|
|
- .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue,
|
|
|
- x => x.Order!.FiledTime >= dto.FiledTime && x.Order!.FiledTime <= dto.EndFiledTime)
|
|
|
- .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue,
|
|
|
- x => x.Visit.VisitTime >= dto.VisitTime && x.Visit.VisitTime <= dto.EndVisitTime)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Contact), x => x.Order!.Contact! == dto.Contact!)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), x => x.Order!.FromPhone! == dto.FromPhone!)
|
|
|
- .OrderByIF(dto is { SortRule: 0, SortField: "creationTime" }, x => x.CreationTime, OrderByType.Asc)
|
|
|
- .OrderByIF(dto is { SortRule: 1, SortField: "creationTime" } || dto.SortRule is null, x => x.CreationTime, OrderByType.Desc)
|
|
|
- .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
- return new PagedDto<OrderScreenListDto>(total, _mapper.Map<IReadOnlyList<OrderScreenListDto>>(items));
|
|
|
+ dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
|
|
|
+
|
|
|
+ var dtos = dataDtos
|
|
|
+ .Select(stu => _mapper.Map(stu, typeof(OrderScreenListDto), dynamicClass))
|
|
|
+ .Cast<object>()
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var stream = ExcelHelper.CreateStream(dtos);
|
|
|
+
|
|
|
+ return ExcelStreamResult(stream, "工单甄别列表数据");
|
|
|
}
|
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 开始工单甄别流程
|
|
|
- /// </summary>
|
|
|
- [Permission(EPermission.ApplyScreen)]
|
|
|
+ /// <summary>
|
|
|
+ /// 开始工单甄别流程
|
|
|
+ /// </summary>
|
|
|
+ [Permission(EPermission.ApplyScreen)]
|
|
|
[HttpPost("screen/startflow")]
|
|
|
[LogFilter("开始工单甄别流程")]
|
|
|
- public async Task StartFlow([FromBody] ScreenStartFlowDto dto)
|
|
|
+ public async Task StartFlow([FromBody] StartWorkflowDto<OrderScreenDto> dto)
|
|
|
{
|
|
|
var screenAny = await _orderScreenRepository.AnyAsync(x =>
|
|
|
- x.VisitDetailId == dto.Data.VisitDetailId &&
|
|
|
+ x.VisitDetailId == dto.Data.VisitDetailId && x.ScreenType == dto.Data.ScreenType &&
|
|
|
(x.Status == EScreenStatus.Apply || x.Status == EScreenStatus.Approval));
|
|
|
if (screenAny)
|
|
|
throw UserFriendlyException.SameMessage("该工单已提起甄别申请,正在审批过程中,不能申请");
|
|
|
|
|
|
- var isNoPass = await _orderScreenRepository.AnyAsync(x => x.Status == EScreenStatus.Refuse && x.VisitDetailId == dto.Data.VisitDetailId);
|
|
|
+ var isNoPass = await _orderScreenRepository.AnyAsync(x => x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType && x.VisitDetailId == dto.Data.VisitDetailId);
|
|
|
if (isNoPass)
|
|
|
throw UserFriendlyException.SameMessage("该工单已被拒绝过甄别申请,不能再次申请");
|
|
|
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyNum);
|
|
|
int count = await _orderScreenRepository.CountAsync(x =>
|
|
|
- x.OrderId == dto.Data.OrderId && x.Status == EScreenStatus.Refuse && x.VisitDetailId == dto.Data.VisitDetailId);
|
|
|
+ x.OrderId == dto.Data.OrderId && x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType && x.VisitDetailId == dto.Data.VisitDetailId);
|
|
|
if (count > int.Parse(setting?.SettingValue[0]) && int.Parse(setting?.SettingValue[0]) > -1)
|
|
|
throw UserFriendlyException.SameMessage("甄别申请已超过系统预定设置,不能申请");
|
|
|
|
|
@@ -2309,7 +2303,8 @@ public class OrderController : BaseController
|
|
|
var rsp = new
|
|
|
{
|
|
|
ScreenStatus = EnumExts.GetDescriptions<EScreenStatus>(),
|
|
|
- ScreenType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ScreenType),
|
|
|
+ OrderScreenType = EnumExts.GetDescriptions<EOrderScreenType>(),
|
|
|
+ ScreenType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ScreenType),
|
|
|
CounterSignType = EnumExts.GetDescriptions<ECounterSignType>(),
|
|
|
AcceptType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
|
|
|
SourceChannel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel),
|
|
@@ -2457,7 +2452,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
//推省上
|
|
|
if (!string.IsNullOrEmpty(model.Id) && (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
|
|
|
{
|
|
@@ -2703,7 +2698,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
//推省上
|
|
|
if (!string.IsNullOrEmpty(model.Id) && (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
|
|
|
{
|
|
@@ -2936,8 +2931,8 @@ public class OrderController : BaseController
|
|
|
.Includes(d => d.OrderPublish)
|
|
|
.Includes(d => d.OrderPushTypes)
|
|
|
//.Includes(d => d.OrderScreens)
|
|
|
- .Includes(d => d.OrderVisits, x => x.OrderVisitDetails)
|
|
|
- .Includes(d => d.OrderVisits, x => x.Employee)
|
|
|
+ .Includes(d => d.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).ToList(), x => x.OrderVisitDetails)
|
|
|
+ .Includes(d => d.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).ToList(), x => x.Employee)
|
|
|
.FirstAsync(d => d.Id == id);
|
|
|
if (order == null) return new();
|
|
|
|
|
@@ -2973,8 +2968,6 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
canInsteadHandle = false;
|
|
|
}
|
|
|
-
|
|
|
- ;
|
|
|
}
|
|
|
|
|
|
if (canInsteadHandle)
|
|
@@ -3126,7 +3119,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.CreationTime, RemarkUser = x.CreatorName }).ToList();
|
|
|
dto.OrderRemarks = remarks;
|
|
|
if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
|
|
|
{
|
|
@@ -3181,7 +3174,7 @@ public class OrderController : BaseController
|
|
|
"不同意" : orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
|
|
|
|
|
|
|
|
|
- return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
|
|
|
+ return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3493,15 +3486,20 @@ public class OrderController : BaseController
|
|
|
/// 开始工单办理流程
|
|
|
/// </summary>
|
|
|
[HttpPost("startflow")]
|
|
|
- public async Task StartFlow([FromBody] OrderStartFlowDto dto)
|
|
|
- {
|
|
|
- var order = await _orderDomainService.GetOrderAsync(dto.Data, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ public async Task StartFlow([FromBody] StartWorkflowDto<OrderHandleFlowDto> dto)
|
|
|
+ {
|
|
|
+ var validator = new BasicWorkflowDtoValidator();
|
|
|
+ var validResult = await validator.ValidateAsync(dto.Workflow, HttpContext.RequestAborted);
|
|
|
+ if (!validResult.IsValid)
|
|
|
+ throw new UserFriendlyException(
|
|
|
+ $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
|
|
|
+ var order = await _orderDomainService.GetOrderAsync(dto.Data.OrderId, cancellationToken: HttpContext.RequestAborted);
|
|
|
if (!string.IsNullOrEmpty(order.WorkflowId))
|
|
|
throw new UserFriendlyException($"该工单已开启办理流程, No:{order.No}", "该工单已开启办理流程");
|
|
|
|
|
|
ExpiredTimeWithConfig expiredTimeConfig;
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
if (dto.Workflow.NextHandlers.Any(d => d.Key == cityBase.CityProvince.OrgId || d.Key == cityBase.CityProvinceAssign.OrgId))
|
|
|
{
|
|
|
var timeResult = await _expireTime.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
|
|
@@ -3527,7 +3525,7 @@ public class OrderController : BaseController
|
|
|
expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ order.IsForwarded = dto.Workflow.IsForwarded;
|
|
|
_mapper.Map(expiredTimeConfig, order);
|
|
|
|
|
|
if (dto.Workflow.BusinessType is EBusinessType.Department or EBusinessType.DepartmentLeader)
|
|
@@ -3537,22 +3535,25 @@ public class OrderController : BaseController
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- // 平均派单
|
|
|
- var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
- if (dto.Workflow.BusinessType == EBusinessType.Send && averageSendOrder)
|
|
|
- {
|
|
|
- if (!dto.Workflow.NextHandlers.Any())
|
|
|
- {
|
|
|
- var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
- dto.Workflow.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
- }
|
|
|
- }
|
|
|
+ // // 平均派单
|
|
|
+ // var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
+ // if (dto.Workflow.BusinessType == EBusinessType.Send && averageSendOrder)
|
|
|
+ // {
|
|
|
+ // var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
+ // dto.Workflow.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
+ // startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
|
|
|
+ // startDto.Title = order.Title;
|
|
|
+ // await _workflowApplication.StartWorkflowAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
|
|
|
startDto.Title = order.Title;
|
|
|
- startDto.Transpond = dto.IsForwarded;
|
|
|
- await _workflowApplication.StartWorkflowAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
+ var startStep = await _workflowDomainService.StartAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ await HandleOrderAsync(order, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -3560,8 +3561,12 @@ public class OrderController : BaseController
|
|
|
throw new UserFriendlyException($"工单开启流程失败!, {e.Message}, {e.StackTrace}", "工单开启流程失败");
|
|
|
}
|
|
|
|
|
|
- //开启流程处理事件,处理市州互转
|
|
|
- await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll, HttpContext.RequestAborted);
|
|
|
+ if (_appOptions.Value.IsYiBin && dto.Data.Transpond.HasValue && dto.Data.Transpond.Value)
|
|
|
+ {
|
|
|
+ //开启流程处理事件,处理市州互转
|
|
|
+ await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll,
|
|
|
+ HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3569,31 +3574,42 @@ public class OrderController : BaseController
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet("startflow")]
|
|
|
- public async Task<NextStepsDto> GetFlowStartOptions()
|
|
|
+ public async Task<NextStepsDto> GetFlowStartOptions([FromQuery]string? orderId)
|
|
|
{
|
|
|
- return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderHandle,
|
|
|
+ var outDto = await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderHandle,
|
|
|
HttpContext.RequestAborted);
|
|
|
+ if (orderId.NotNullOrEmpty())
|
|
|
+ {
|
|
|
+ outDto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ return outDto;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 工单办理
|
|
|
/// </summary>
|
|
|
[HttpPost("handle")]
|
|
|
- public async Task Handle([FromBody] NextWorkflowDto dto)
|
|
|
+ public async Task Handle([FromBody] NextWorkflowDto<OrderHandleFlowDto> dto)
|
|
|
{
|
|
|
+ var validator = new BasicWorkflowDtoValidator();
|
|
|
+ var validResult = await validator.ValidateAsync(dto.Workflow, HttpContext.RequestAborted);
|
|
|
+ if (!validResult.IsValid)
|
|
|
+ throw new UserFriendlyException(
|
|
|
+ $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
|
|
|
var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
|
|
|
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withSteps: true, withTraces: true,
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
//1.是否是判断节点 2.是否存在历史派单节点 3.存在获取上个派单节点 4.不存在走平均派单
|
|
|
- if (dto.BusinessType == EBusinessType.Send)
|
|
|
+ if (dto.Data.OrderAssignMode is EOrderAssignMode.AdjoinLevel && dto.Workflow.BusinessType == EBusinessType.Send)
|
|
|
{
|
|
|
- var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withTraces: true,
|
|
|
- cancellationToken: HttpContext.RequestAborted);
|
|
|
var sendOrderTraces = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send);
|
|
|
if (sendOrderTraces.Any())
|
|
|
{
|
|
|
- var sendOrderTrace = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send).OrderByDescending(x => x.CreationTime)
|
|
|
+ var sendOrderTrace = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send)
|
|
|
+ .OrderByDescending(x => x.CreationTime)
|
|
|
.FirstOrDefault();
|
|
|
- dto.NextHandlers = new List<FlowStepHandler>
|
|
|
+ dto.Workflow.NextHandlers = new List<FlowStepHandler>
|
|
|
{
|
|
|
new FlowStepHandler()
|
|
|
{
|
|
@@ -3609,13 +3625,101 @@ public class OrderController : BaseController
|
|
|
var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
if (averageSendOrder)
|
|
|
{
|
|
|
- var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
- dto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ if (!dto.Workflow.NextHandlers.Any())
|
|
|
+ {
|
|
|
+ var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
+ dto.Workflow.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- await _workflowApplication.NextAsync(dto, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
+ //await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
+ var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);
|
|
|
+ await HandleOrderAsync(order, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ if (_appOptions.Value.IsZiGong && dto.Data.Transpond.HasValue && dto.Data.Transpond.Value)
|
|
|
+ {
|
|
|
+ var count = await _transpondCityRawDataRepository.Queryable()
|
|
|
+ .CountAsync(m => m.OrderCode == order.No && m.CityName == order.TranspondCityName
|
|
|
+ && m.Direction == ETranspondDirection.Out, HttpContext.RequestAborted);
|
|
|
+ //处理市州互转
|
|
|
+ if (count == 0)
|
|
|
+ await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task HandleOrderAsync(Order order, WorkflowStep startStep, OrderHandleFlowDto orderHandleFlowDto, BasicWorkflowDto workflowDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ switch (orderHandleFlowDto.OrderAssignMode)
|
|
|
+ {
|
|
|
+ case EOrderAssignMode.AdjoinLevel:
|
|
|
+ var nextDto = _mapper.Map<NextWorkflowDto>(workflowDto);
|
|
|
+ nextDto.WorkflowId = startStep.WorkflowId;
|
|
|
+ nextDto.StepId = startStep.Id;
|
|
|
+
|
|
|
+ // 平均派单
|
|
|
+ var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder)
|
|
|
+ .SettingValue[0]);
|
|
|
+ if (workflowDto.BusinessType == EBusinessType.Send && averageSendOrder)
|
|
|
+ {
|
|
|
+ if (!nextDto.NextHandlers.Any()) {
|
|
|
+ var handler = await _orderDomainService.AverageOrder(cancellationToken);
|
|
|
+ nextDto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime, cancellationToken);
|
|
|
+ break;
|
|
|
+ case EOrderAssignMode.CrossLevel:
|
|
|
+ if (!orderHandleFlowDto.CrossSteps.Any())
|
|
|
+ throw new UserFriendlyException("跨级指派参数异常");
|
|
|
+
|
|
|
+ orderHandleFlowDto.CrossSteps = orderHandleFlowDto.CrossSteps.OrderBy(d => d.Sort).ToList();
|
|
|
+ var stepCount = orderHandleFlowDto.CrossSteps.Count;
|
|
|
+ var unhandleSteps = new List<WorkflowStep> { startStep };
|
|
|
+ for (int i = 0; i < stepCount; i++)
|
|
|
+ {
|
|
|
+ var crossStep = orderHandleFlowDto.CrossSteps[i];
|
|
|
+ var tempSteps = new List<WorkflowStep>();
|
|
|
+ foreach (var unhandleStep in unhandleSteps)
|
|
|
+ {
|
|
|
+ var lowerLevelHandlers = crossStep.NextHandlers.Where(d => d.OrgId.StartsWith(unhandleStep.HandlerOrgId)).ToList();
|
|
|
+ if (!lowerLevelHandlers.Any()) continue;
|
|
|
+ var nextflowDto = _mapper.Map<NextWorkflowDto>(crossStep);
|
|
|
+ nextflowDto.WorkflowId = unhandleStep.WorkflowId;
|
|
|
+ nextflowDto.StepId = unhandleStep.Id;
|
|
|
+ nextflowDto.IsStartCountersign = lowerLevelHandlers.Count > 1;
|
|
|
+ nextflowDto.NextHandlers = lowerLevelHandlers;
|
|
|
+ nextflowDto.Opinion = "跨级派单,自动办理";
|
|
|
+
|
|
|
+ var operater = new FakeSessionContext
|
|
|
+ {
|
|
|
+ OrgId = unhandleStep.HandlerOrgId,
|
|
|
+ OrgName = unhandleStep.HandlerOrgName,
|
|
|
+ };
|
|
|
+ var nextSteps = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime, cancellationToken);
|
|
|
+ tempSteps.AddRange(nextSteps);
|
|
|
+ }
|
|
|
+ unhandleSteps = tempSteps;
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case EOrderAssignMode.MainAndSecondary:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 跨级指派查询下一步可选节点及办理对象参数
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("nextsteps/cross")]
|
|
|
+ public async Task<NextStepsDto<NextStepOption>> GetCrossLevelStepsOptions([FromQuery] GetCrossLevelStepsDto dto)
|
|
|
+ {
|
|
|
+ return await _workflowApplication.GetCrossLevelStepsAsync(dto, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3652,13 +3756,15 @@ public class OrderController : BaseController
|
|
|
return rsp;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 临时保存
|
|
|
/// </summary>
|
|
|
[HttpPost("steps/temp")]
|
|
|
public async Task TempSaveAsync([FromBody] StepTempInDto dto)
|
|
|
{
|
|
|
- //await _typeCache.SetAsync($"tmp_opinion_{dto.OrderId}{_sessionContext.UserId}", dto.Opinion, TimeSpan.FromDays(3), HttpContext.RequestAborted);
|
|
|
+ await _typeCache.SetAsync($"tmp_opinion_{dto.OrderId}{_sessionContext.UserId}", dto.Opinion, TimeSpan.FromDays(3), HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3745,8 +3851,9 @@ public class OrderController : BaseController
|
|
|
PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType),
|
|
|
OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
|
|
|
CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
|
|
|
- IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>()
|
|
|
- };
|
|
|
+ IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
|
|
|
+ OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag)
|
|
|
+ };
|
|
|
return rsp;
|
|
|
}
|
|
|
|
|
@@ -3873,14 +3980,22 @@ public class OrderController : BaseController
|
|
|
var isHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
|
|
|
|
|
|
var isAdmin = _orderDomainService.IsCheckAdmin();
|
|
|
-
|
|
|
- var (total, items) = await _orderRepository
|
|
|
+ var query = _orderRepository
|
|
|
.Queryable(hasHandled: isHandled, isAdmin: isAdmin)
|
|
|
- .Includes(d => d.OrderSpecials)
|
|
|
- .Where(d => d.Status != EOrderStatus.WaitForAccept &&
|
|
|
+ .Includes(d => d.OrderSpecials);
|
|
|
+ if (dto.QueryType is 1 || dto.QueryType is 2)
|
|
|
+ {
|
|
|
+ query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
|
|
|
+ .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
|
|
|
+ .Where(d=>SqlFunc.Subqueryable<OrderSpecial>().Where(os=>os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact).NotAny());
|
|
|
+ }
|
|
|
+
|
|
|
+ var (total, items) = await query
|
|
|
+ .Where(d => d.Status != EOrderStatus.WaitForAccept &&
|
|
|
d.Status != EOrderStatus.BackToUnAccept &&
|
|
|
d.Status != EOrderStatus.SpecialToUnAccept &&
|
|
|
d.Status != EOrderStatus.HandOverToUnAccept)
|
|
|
+ .WhereIF(dto.QueryType is 3, d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact).Any())
|
|
|
.WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
|
|
@@ -3910,64 +4025,18 @@ public class OrderController : BaseController
|
|
|
/// 查询坐席待办
|
|
|
/// </summary>
|
|
|
[HttpGet("waited/sign")]
|
|
|
- public async Task<PagedDto<OrderDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
|
|
|
+ public async Task<List<OrderListOutDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
|
|
|
{
|
|
|
- EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
|
|
|
- handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
|
|
|
- d => dto.IsHandled!.Value
|
|
|
- ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept
|
|
|
- and not EOrderStatus.HandOverToUnAccept
|
|
|
- : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept
|
|
|
- or EOrderStatus.HandOverToUnAccept)
|
|
|
- .ToArray();
|
|
|
-
|
|
|
- var query = _orderRepository.Queryable();
|
|
|
- if (dto.IsHandled.HasValue)
|
|
|
- {
|
|
|
- var hasHandled = dto.IsHandled.Value;
|
|
|
- query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
|
|
|
- .Where(step => step.ExternalId == d.Id &&
|
|
|
- (hasHandled || step.Status != EWorkflowStepStatus.Handled) &&
|
|
|
- (!hasHandled || step.Status == EWorkflowStepStatus.Handled &&
|
|
|
- step.TraceState != EWorkflowTraceState.StepRemoveByPrevious) &&
|
|
|
- ((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)))).Any() ||
|
|
|
- (string.IsNullOrEmpty(d.WorkflowId) &&
|
|
|
- (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId))
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- var (total, items) = await query
|
|
|
- .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
|
|
|
- .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
|
|
|
- .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
|
|
|
- .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
|
|
|
- .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
|
|
|
- d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
|
|
|
- (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
|
|
|
- .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,
|
|
|
- d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
|
|
|
- .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
|
|
|
- .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
|
|
|
- //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
|
|
|
- //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
|
|
|
- .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
|
|
|
- .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
|
|
|
- .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
|
|
|
- .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
|
|
|
- .OrderBy(d => d.Status)
|
|
|
- .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
|
|
|
- .OrderByIF(dto.IsHandled == false, d => new { IsUrgent = d.IsUrgent, CreationTime = d.CreationTime }, OrderByType.Desc)
|
|
|
- .ToPagedListAsync(dto, HttpContext.RequestAborted);
|
|
|
+ return await _orderApplication
|
|
|
+ .QueryWaitedForSeat(dto)
|
|
|
+ .ToFixedListAsync(dto, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
|
|
|
- return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
|
|
|
+ [HttpGet("waited/sign/count")]
|
|
|
+ public async Task<int> QueryWaitedForSeatCount([FromQuery] QueryOrderWaitedDto dto)
|
|
|
+ {
|
|
|
+ return await _orderApplication.QueryWaitedForSeat(dto)
|
|
|
+ .CountAsync(HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -4446,6 +4515,26 @@ public class OrderController : BaseController
|
|
|
return rsp;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 查询工单退回目标步节点信息
|
|
|
+ /// </summary>
|
|
|
+ [HttpGet("previous/targetStep/{orderId}")]
|
|
|
+ public async Task<TargetStepInfo> GetPreviousTargetStepInfo(string orderId)
|
|
|
+ {
|
|
|
+ var order = await _orderDomainService.GetOrderAsync(orderId, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ if (string.IsNullOrEmpty(order.WorkflowId))
|
|
|
+ throw UserFriendlyException.SameMessage("该工单未开启流程");
|
|
|
+
|
|
|
+ var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
|
|
|
+ order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ return new TargetStepInfo
|
|
|
+ {
|
|
|
+ CurrentBusinessType = currentStep.BusinessType,
|
|
|
+ TargetBusinessType = prevStep.BusinessType
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 省工单退回
|
|
@@ -4755,10 +4844,13 @@ public class OrderController : BaseController
|
|
|
// ETimeType.WorkDay,
|
|
|
// dto.TimeLimit.Value, order.AcceptTypeCode);
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
- NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType, Status = EOrderStatus.Special
|
|
|
- })
|
|
|
+ {
|
|
|
+ ExpiredTime = expiredTime.ExpiredTime,
|
|
|
+ NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
+ NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
|
|
|
+ ProcessType = processType,
|
|
|
+ Status = EOrderStatus.Special
|
|
|
+ })
|
|
|
.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
var orderDto = _mapper.Map<OrderDto>(order);
|
|
|
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
|
|
@@ -4793,7 +4885,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
if (order != null && (cityBase.CityProvince.OrgId.Equals(model.OrgId) ||
|
|
|
cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId) || cityBase.CityEnterprise.OrgId.Equals(model.OrgId) ||
|
|
|
cityBase.PublicSecurity.OrgId.Equals(model.OrgId)))
|
|
@@ -4914,10 +5006,11 @@ public class OrderController : BaseController
|
|
|
|
|
|
endTime = expiredTime.EndTime;
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
- NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
|
|
|
- })
|
|
|
+ {
|
|
|
+ ExpiredTime = expiredTime.EndTime,
|
|
|
+ NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
+ NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
|
|
|
+ })
|
|
|
.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
var orderDto = _mapper.Map<OrderDto>(order);
|
|
|
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
|
|
@@ -5022,10 +5115,13 @@ public class OrderController : BaseController
|
|
|
? EProcessType.Zhiban
|
|
|
: EProcessType.Jiaoban;
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
- NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType, Status = EOrderStatus.Special
|
|
|
- })
|
|
|
+ {
|
|
|
+ ExpiredTime = expiredTime.ExpiredTime,
|
|
|
+ NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
+ NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
|
|
|
+ ProcessType = processType,
|
|
|
+ Status = EOrderStatus.Special
|
|
|
+ })
|
|
|
.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
var orderDto = _mapper.Map<OrderDto>(order);
|
|
|
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
|
|
@@ -5062,7 +5158,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
if (order != null && (cityBase.CityProvince.OrgId.Equals(special.OrgId) ||
|
|
|
cityBase.CityProvinceAssign.OrgId.Equals(special.OrgId) || cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||
|
|
|
cityBase.PublicSecurity.OrgId.Equals(special.OrgId)))
|
|
@@ -5142,10 +5238,13 @@ public class OrderController : BaseController
|
|
|
? EProcessType.Zhiban
|
|
|
: EProcessType.Jiaoban;
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
|
|
|
- {
|
|
|
- ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
- NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType, Status = EOrderStatus.Special
|
|
|
- })
|
|
|
+ {
|
|
|
+ ExpiredTime = expiredTime.ExpiredTime,
|
|
|
+ NearlyExpiredTime = expiredTime.NearlyExpiredTime,
|
|
|
+ NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
|
|
|
+ ProcessType = processType,
|
|
|
+ Status = EOrderStatus.Special
|
|
|
+ })
|
|
|
.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
var orderDto = _mapper.Map<OrderDto>(order);
|
|
|
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
|
|
@@ -5181,7 +5280,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
|
|
|
- CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
|
|
|
+ CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
|
|
|
if (order != null && (cityBase.CityProvince.OrgId.Equals(special.OrgId) ||
|
|
|
cityBase.CityProvinceAssign.OrgId.Equals(special.OrgId) || cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||
|
|
|
cityBase.PublicSecurity.OrgId.Equals(special.OrgId)))
|
|
@@ -5298,7 +5397,7 @@ public class OrderController : BaseController
|
|
|
d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
|
|
|
//.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
|
|
|
- //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
|
|
|
+ //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel) //来源渠道
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
|
|
@@ -5392,8 +5491,8 @@ public class OrderController : BaseController
|
|
|
SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
|
|
|
InstaShotSpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason),
|
|
|
Step = step,
|
|
|
- IsTerminate = await _orderTerminateRepository.Queryable().Where(d=>d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
|
|
|
- BaseTypeId = baseTypeId
|
|
|
+ IsTerminate = await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
|
|
|
+ BaseTypeId = baseTypeId
|
|
|
};
|
|
|
return rsp;
|
|
|
}
|
|
@@ -5422,7 +5521,7 @@ public class OrderController : BaseController
|
|
|
: _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
|
|
|
ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
|
|
|
IsTerminate = await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
|
|
|
- Step = step,
|
|
|
+ Step = step,
|
|
|
Orgs = orgs,
|
|
|
};
|
|
|
return rsp;
|
|
@@ -6428,7 +6527,11 @@ public class OrderController : BaseController
|
|
|
|
|
|
return new
|
|
|
{
|
|
|
- Count = count, ErrorCount = errorCount, AddCount = addCount, ModifyCount = modifyCount, ErrorMessage = errorMessage.ToString()
|
|
|
+ Count = count,
|
|
|
+ ErrorCount = errorCount,
|
|
|
+ AddCount = addCount,
|
|
|
+ ModifyCount = modifyCount,
|
|
|
+ ErrorMessage = errorMessage.ToString()
|
|
|
};
|
|
|
}
|
|
|
}
|
|
@@ -7029,7 +7132,7 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
await _orderRepository.Updateable()
|
|
|
.SetColumns(o => new Orders.Order()
|
|
|
- { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
|
|
|
+ { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
|
|
|
.Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
}
|
|
|
else
|