|
@@ -53,6 +53,7 @@ using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
using Hotline.Share.Enums.Push;
|
|
|
using Hotline.Share.Enums.Settings;
|
|
|
+using Hotline.Share.Enums.Snapshot;
|
|
|
using Hotline.Share.Mq;
|
|
|
using Hotline.Share.Requests;
|
|
|
using Hotline.Share.Tools;
|
|
@@ -70,6 +71,7 @@ using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.Extensions.Options;
|
|
|
using MiniExcelLibs;
|
|
|
using SqlSugar;
|
|
|
+using System.Diagnostics;
|
|
|
using System.Text;
|
|
|
using System.Text.Json;
|
|
|
using System.Threading;
|
|
@@ -90,6 +92,7 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
#region 注入
|
|
|
|
|
|
+ private readonly ISystemLogRepository _systemLogRepository;
|
|
|
private readonly IOrderDomainService _orderDomainService;
|
|
|
private readonly BaseDataApplication _baseDataApplication;
|
|
|
private readonly IOrderRepository _orderRepository;
|
|
@@ -165,6 +168,7 @@ public class OrderController : BaseController
|
|
|
private readonly ICircularRecordDomainService _circularRecordDomainService;
|
|
|
private readonly IRepository<Hotline.Special.SpecialNumber> _specialNumberRepository;
|
|
|
private readonly IRepository<OrderVisitDetailCopy> _orderVisitDetailCopyRepository;
|
|
|
+ private readonly IRedPackAuditRepository _redPackAuditRepository;
|
|
|
|
|
|
public OrderController(
|
|
|
IOrderDomainService orderDomainService,
|
|
@@ -241,8 +245,10 @@ public class OrderController : BaseController
|
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
|
IRepository<OrderComplement> orderComplementRepository,
|
|
|
ICircularRecordDomainService circularRecordDomainService,
|
|
|
+ IRedPackAuditRepository redPackAuditRepository,
|
|
|
IRepository<Hotline.Special.SpecialNumber> specialNumberRepository,
|
|
|
- IRepository<OrderVisitDetailCopy> orderVisitDetailCopyRepository)
|
|
|
+ IRepository<OrderVisitDetailCopy> orderVisitDetailCopyRepository,
|
|
|
+ ISystemLogRepository systemLogRepository)
|
|
|
{
|
|
|
_orderDomainService = orderDomainService;
|
|
|
_orderRepository = orderRepository;
|
|
@@ -318,8 +324,10 @@ public class OrderController : BaseController
|
|
|
_systemOrganizeRepository = systemOrganizeRepository;
|
|
|
_orderComplementRepository = orderComplementRepository;
|
|
|
_circularRecordDomainService = circularRecordDomainService;
|
|
|
+ _redPackAuditRepository = redPackAuditRepository;
|
|
|
_specialNumberRepository = specialNumberRepository;
|
|
|
_orderVisitDetailCopyRepository = orderVisitDetailCopyRepository;
|
|
|
+ _systemLogRepository = systemLogRepository;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
@@ -4045,7 +4053,7 @@ public class OrderController : BaseController
|
|
|
.Includes(d => d.OrderScreens)
|
|
|
.Includes(d => d.OrderTerminates)
|
|
|
.Where(d => d.Contact == dto.PhoneNo)
|
|
|
- .WhereIF(_sessionContext.OrgIsCenter == false && (_appOptions.Value.IsYiBin == true || _appOptions.Value.IsLuZhou == true ), d => d.IsSecret == false)
|
|
|
+ .WhereIF(_sessionContext.OrgIsCenter == false && (_appOptions.Value.IsYiBin == true || _appOptions.Value.IsLuZhou == true), d => d.IsSecret == false)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.OrderId) && _appOptions.Value.IsLuZhou == false, d => d.Id != dto.OrderId)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
|
|
|
.Select(d => new OrderHistoryOutDto
|
|
@@ -4332,14 +4340,21 @@ public class OrderController : BaseController
|
|
|
List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto
|
|
|
{ Remark = x.Remark, RemarkTime = x.HandleTime, RemarkUser = x.HandlerName }).ToList();
|
|
|
dto.OrderRemarks = remarks;
|
|
|
+ //退回
|
|
|
if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.BackToUnAccept)
|
|
|
{
|
|
|
var backTrace = workflow.Traces.Where(x => x.Status == EWorkflowStepStatus.Handled).OrderByDescending(x => x.CreationTime).First();
|
|
|
- backTrace.Opinion = backTrace.Opinion.Replace("流程归档", "");
|
|
|
- dto.SendBackOpinion = string.IsNullOrEmpty(backTrace.Opinion) ? string.Empty : backTrace.HandlerOrgName + " " + backTrace.Opinion;
|
|
|
+ // backTrace.Opinion = backTrace.Opinion.Replace("流程归档", "");
|
|
|
+ dto.SendBackOpinion = string.IsNullOrEmpty(backTrace.Opinion) ? string.Empty : "【" + backTrace.HandlerOrgName + "】" + backTrace.Opinion;
|
|
|
//var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
|
|
|
//dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
|
|
|
}
|
|
|
+ //重办
|
|
|
+ if (order.Status == EOrderStatus.Special || order.Status == EOrderStatus.SpecialToUnAccept)
|
|
|
+ {
|
|
|
+ var reTransactTrace = workflow.Traces.Where(x => x.Status == EWorkflowStepStatus.Handled).OrderByDescending(x => x.CreationTime).First();
|
|
|
+ dto.ReTransactOpinion = string.IsNullOrEmpty(reTransactTrace.Opinion) ? string.Empty : "【" + reTransactTrace.HandlerOrgName + "】" + reTransactTrace.Opinion;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//工单是否在退回审批中
|
|
@@ -4548,13 +4563,13 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
if (_appOptions.Value.IsLuZhou)
|
|
|
{
|
|
|
- //期满时间
|
|
|
- var expiredTimeConfig =
|
|
|
- await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToCenter, order.Adapt<OrderTimeClacInfo>());
|
|
|
- _mapper.Map(expiredTimeConfig, order);
|
|
|
- }
|
|
|
+ //期满时间
|
|
|
+ var expiredTimeConfig =
|
|
|
+ await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToCenter, order.Adapt<OrderTimeClacInfo>());
|
|
|
+ _mapper.Map(expiredTimeConfig, order);
|
|
|
+ }
|
|
|
|
|
|
- await _orderDomainService.AddAsync(order, true, HttpContext.RequestAborted);
|
|
|
+ await _orderDomainService.AddAsync(order, true, HttpContext.RequestAborted);
|
|
|
|
|
|
if (_systemSettingCacheManager.Snapshot && dto.IndustryId.NotNullOrEmpty() && dto.IndustryName.NotNullOrEmpty())
|
|
|
{
|
|
@@ -4978,7 +4993,7 @@ public class OrderController : BaseController
|
|
|
try
|
|
|
{
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
- startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
|
|
|
+ startDto.DefinitionModuleCode = await _orderSnapshotApplication.GetStartflowAsync(order.Id, HttpContext.RequestAborted);
|
|
|
startDto.Title = order.Title;
|
|
|
var (workflow, startStep) =
|
|
|
await _workflowDomainService.StartAsync(startDto, order.Id, order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
|
|
@@ -5002,12 +5017,12 @@ public class OrderController : BaseController
|
|
|
/// <summary>
|
|
|
/// 查询工单办理流程开启参数
|
|
|
/// </summary>
|
|
|
- /// <returns></returns>4
|
|
|
+ /// <returns></returns>
|
|
|
[HttpGet("startflow")]
|
|
|
public async Task<NextStepsDto> GetFlowStartOptions([FromQuery] string? orderId)
|
|
|
{
|
|
|
- var dto = await _workflowApplication.GetStartStepsAsync(await _orderSnapshotApplication.GetStartflowAsync(orderId, HttpContext.RequestAborted),
|
|
|
- HttpContext.RequestAborted);
|
|
|
+ var modelCode = await _orderSnapshotApplication.GetStartflowAsync(orderId, HttpContext.RequestAborted);
|
|
|
+ var dto = await _workflowApplication.GetStartStepsAsync(modelCode, HttpContext.RequestAborted);
|
|
|
if (orderId.NotNullOrEmpty())
|
|
|
{
|
|
|
dto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
|
|
@@ -5109,10 +5124,8 @@ public class OrderController : BaseController
|
|
|
var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
|
|
|
|
|
|
// 随手拍业务处理
|
|
|
- if (_systemSettingCacheManager.Snapshot)
|
|
|
- {
|
|
|
- await _orderSnapshotApplication.SaveOrderWorkflowInfo(dto);
|
|
|
- }
|
|
|
+ await _orderSnapshotApplication.SaveOrderWorkflowInfo(dto);
|
|
|
+
|
|
|
//await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
|
|
|
var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);
|
|
|
await HandleOrderAsync(order, workflow, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
|
|
@@ -5137,69 +5150,91 @@ public class OrderController : BaseController
|
|
|
public async Task<string> OrderSignBathAsync([FromBody] OrderSignBathInDto dto)
|
|
|
{
|
|
|
var stringBuilder = new StringBuilder();
|
|
|
- foreach (var orderId in dto.OrderIds)
|
|
|
+ if (dto.Status == 1)
|
|
|
{
|
|
|
- var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
|
|
|
- if (order is null)
|
|
|
+ foreach (var orderId in dto.OrderIds)
|
|
|
{
|
|
|
- continue;
|
|
|
- }
|
|
|
+ var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
|
|
|
+ if (order is null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- var snapshot = await _orderSnapshotApplication.UpdateSafetyAsync(orderId, dto.IsSafetyDepartment, dto.Remark);
|
|
|
- if (snapshot is null)
|
|
|
- {
|
|
|
- stringBuilder.Append($"随手拍: {order.No} 不存在");
|
|
|
- continue;
|
|
|
- }
|
|
|
+ var snapshot = await _orderSnapshotApplication.UpdateSafetyAsync(orderId, dto.IsSafetyDepartment, dto.Remark);
|
|
|
+ if (snapshot is null)
|
|
|
+ {
|
|
|
+ stringBuilder.Append($"随手拍: {order.No} 不存在");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
|
|
|
- cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
|
|
|
- NextStepsWithOpinionDto<NextStepOption> nextSteps;
|
|
|
- try
|
|
|
- {
|
|
|
- nextSteps = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
|
- }
|
|
|
- catch (UserFriendlyException e)
|
|
|
- {
|
|
|
- if (e.Message.Contains("未找到对应节点"))
|
|
|
+ NextStepsWithOpinionDto<NextStepOption> nextSteps;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ nextSteps = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ catch (UserFriendlyException e)
|
|
|
+ {
|
|
|
+ if (e.Message.Contains("未找到对应节点"))
|
|
|
+ {
|
|
|
+ stringBuilder.AppendLine($"{order.No} " + e.Message);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+
|
|
|
+ var stepInfo = nextSteps.Steps.FirstOrDefault(m => m.BusinessType == EBusinessType.Send);
|
|
|
+ if (stepInfo == null)
|
|
|
{
|
|
|
- stringBuilder.AppendLine($"{order.No} 修改成功");
|
|
|
+ stringBuilder.Append($"下一步节点: [派单组] 未找到");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- throw;
|
|
|
+ var data = new OrderHandleFlowDto
|
|
|
+ {
|
|
|
+ OrderId = orderId,
|
|
|
+ IsSafetyDepartment = dto.IsSafetyDepartment
|
|
|
+ };
|
|
|
+ var workflowDto = new NextWorkflowDto
|
|
|
+ {
|
|
|
+ WorkflowId = order.WorkflowId,
|
|
|
+ StepId = nextSteps.StepId,
|
|
|
+ NextStepCode = stepInfo.Key,
|
|
|
+ NextStepName = stepInfo.Value,
|
|
|
+ Opinion = dto.Remark,
|
|
|
+ BackToCountersignEnd = false,
|
|
|
+ IsSms = false,
|
|
|
+ IsForwarded = false,
|
|
|
+ HandlerType = EHandlerType.OrgLevel,
|
|
|
+ BusinessType = EBusinessType.Send,
|
|
|
+ FlowDirection = EFlowDirection.CenterToCenter,
|
|
|
+ };
|
|
|
+ var startStep = workflow.Steps.First(d => d.Id == nextSteps.StepId);
|
|
|
+ await HandleOrderAsync(order, workflow, startStep, data, workflowDto, HttpContext.RequestAborted);
|
|
|
+ stringBuilder.AppendLine($"{orderId} 标注完成;");
|
|
|
}
|
|
|
-
|
|
|
- var stepInfo = nextSteps.Steps.FirstOrDefault(m => m.BusinessType == EBusinessType.Send);
|
|
|
- if (stepInfo == null)
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var orderNo = await _redPackAuditRepository.Queryable()
|
|
|
+ .LeftJoin<Order>((m, order) => m.OrderId == order.Id)
|
|
|
+ .Where(m => dto.OrderIds.Contains(m.OrderId) && m.Status != ERedPackAuditStatus.Pending)
|
|
|
+ .Select((m, order) => order.No)
|
|
|
+ .ToListAsync();
|
|
|
+ if (orderNo.NotNullOrEmpty())
|
|
|
+ throw new UserFriendlyException("该工单已红包审批,无法修改标记状态!");
|
|
|
+ else
|
|
|
{
|
|
|
- stringBuilder.Append($"下一步节点: [派单组] 未找到");
|
|
|
- continue;
|
|
|
+ await _orderSnapshotRepository.Updateable()
|
|
|
+ .SetColumns(m => m.IsSafetyDepartment, dto.IsSafetyDepartment)
|
|
|
+ .SetColumns(m => m.SignRemark, dto.Remark)
|
|
|
+ .Where(m => dto.OrderIds.Contains(m.Id))
|
|
|
+ .ExecuteCommandAsync();
|
|
|
+ stringBuilder.AppendLine("标注完成;");
|
|
|
}
|
|
|
-
|
|
|
- var data = new OrderHandleFlowDto
|
|
|
- {
|
|
|
- OrderId = orderId,
|
|
|
- IsSafetyDepartment = dto.IsSafetyDepartment
|
|
|
- };
|
|
|
- var workflowDto = new NextWorkflowDto
|
|
|
- {
|
|
|
- WorkflowId = order.WorkflowId,
|
|
|
- StepId = nextSteps.StepId,
|
|
|
- NextStepCode = stepInfo.Key,
|
|
|
- NextStepName = stepInfo.Value,
|
|
|
- Opinion = dto.Remark,
|
|
|
- BackToCountersignEnd = false,
|
|
|
- IsSms = false,
|
|
|
- IsForwarded = false,
|
|
|
- HandlerType = EHandlerType.OrgLevel,
|
|
|
- BusinessType = EBusinessType.Send,
|
|
|
- FlowDirection = EFlowDirection.CenterToCenter,
|
|
|
- };
|
|
|
- var startStep = workflow.Steps.First(d => d.Id == nextSteps.StepId);
|
|
|
- await HandleOrderAsync(order, workflow, startStep, data, workflowDto, HttpContext.RequestAborted);
|
|
|
- stringBuilder.AppendLine($"{orderId} 标注完成;");
|
|
|
}
|
|
|
|
|
|
return stringBuilder.ToString();
|
|
@@ -5366,7 +5401,7 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
return (_, _, stepDefine, newStep) =>
|
|
|
{
|
|
|
- if (stepDefine.BusinessType is EBusinessType.Department or EBusinessType.DepartmentLeader)
|
|
|
+ if (stepDefine.BusinessType is EBusinessType.Department)
|
|
|
{
|
|
|
newStep.HandlerId = null;
|
|
|
newStep.HandlerName = null;
|
|
@@ -5780,8 +5815,17 @@ public class OrderController : BaseController
|
|
|
.Where(d => d.WorkflowId == workflowId && (d.HandleMode != EHandleMode.PreviousNoDisplay || d.HandleMode == null))
|
|
|
.OrderBy(d => d.CreationTime)
|
|
|
.ToTreeAsync(d => d.Traces, d => d.ParentId, null);
|
|
|
+ var data = _mapper.Map<List<OrderFlowTraceDto>>(traces);
|
|
|
+ foreach (var item in data)
|
|
|
+ {
|
|
|
+ if (item.TraceStyle == ETraceStyle.Publish && item.PublishState.HasValue)
|
|
|
+ item.OpinionResult = item.PublishState == true ? "公开" : "不公开";
|
|
|
|
|
|
- return _mapper.Map<IReadOnlyList<OrderFlowTraceDto>>(traces);
|
|
|
+ if (item.TraceStyle == ETraceStyle.Visit && item.OrderFlowVisitDetails != null && item.OrderFlowVisitDetails.Any())
|
|
|
+ item.OpinionResult = string.Join(",", item.OrderFlowVisitDetails.Select(x => x.OrgProcessingResults));
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -7023,11 +7067,24 @@ public class OrderController : BaseController
|
|
|
// { CenterToOrgHandlerId = flowStepHandler.UserId, CenterToOrgHandlerName = flowStepHandler.Username })
|
|
|
// .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
// }
|
|
|
+ var handleMode = EHandleMode.Redo;
|
|
|
+ var workflowTraceType = EWorkflowTraceType.Redo;
|
|
|
+ if (dto.SpecialType == ESpecialType.Special)
|
|
|
+ {
|
|
|
+ handleMode = EHandleMode.Recall;
|
|
|
+ workflowTraceType = EWorkflowTraceType.Recall;
|
|
|
+ }
|
|
|
+ if (dto.SpecialType == ESpecialType.SendBack)
|
|
|
+ {
|
|
|
+ handleMode = EHandleMode.PublishPrevious;
|
|
|
+ workflowTraceType = EWorkflowTraceType.PublishPrevious;
|
|
|
+ }
|
|
|
+
|
|
|
DateTime endTime = order.ExpiredTime!.Value;
|
|
|
var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) =
|
|
|
await _workflowDomainService.RecallAsync(
|
|
|
- recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Redo,
|
|
|
- endTime, order.Status >= EOrderStatus.Filed, EHandleMode.Redo,
|
|
|
+ recall, recall.NextHandlers.FirstOrDefault(), workflowTraceType,
|
|
|
+ endTime, order.Status >= EOrderStatus.Filed, handleMode,
|
|
|
(workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
|
|
|
{
|
|
|
var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
|
|
@@ -7647,7 +7704,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (_appOptions.Value.IsYiBin && _appOptions.Value.IsLuZhou)
|
|
|
+ if (_appOptions.Value.IsYiBin || _appOptions.Value.IsLuZhou)
|
|
|
{
|
|
|
if (order.FileOrgIsCenter.Value)
|
|
|
{
|