|
@@ -57,6 +57,7 @@ using MiniExcelLibs;
|
|
|
using MongoDB.Driver;
|
|
|
using SqlSugar;
|
|
|
using StackExchange.Redis;
|
|
|
+using System.Text;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Cache;
|
|
|
using XF.Domain.Entities;
|
|
@@ -304,6 +305,14 @@ public class OrderController : BaseController
|
|
|
[HttpPost("batch-publish")]
|
|
|
public async Task BatchPublishOrder([FromBody] BatchPublishOrderDto dto)
|
|
|
{
|
|
|
+ var hasHuiQian = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.CounterSignType != null);
|
|
|
+ if (hasHuiQian)
|
|
|
+ throw UserFriendlyException.SameMessage("选择的工单中含有会签工单, 不能批量发布. 请排除会签工单.");
|
|
|
+
|
|
|
+ var hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.IsProvince == true);
|
|
|
+ if (hasProvince)
|
|
|
+ throw UserFriendlyException.SameMessage("选择的工单中含有省工单, 不能批量发布. 请排除省工单.");
|
|
|
+
|
|
|
foreach (var item in dto.Ids)
|
|
|
{
|
|
|
var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
|
|
@@ -355,6 +364,11 @@ public class OrderController : BaseController
|
|
|
orderVisit.IsCanAiVisit = true;
|
|
|
}
|
|
|
|
|
|
+ if (_appOptions.Value.IsZiGong)
|
|
|
+ {
|
|
|
+ orderVisit.EmployeeId = string.Empty;
|
|
|
+ }
|
|
|
+
|
|
|
string visitId = await _orderVisitRepository.AddAsync(orderVisit);
|
|
|
|
|
|
//新增回访信息
|
|
@@ -488,7 +502,7 @@ public class OrderController : BaseController
|
|
|
orderVisit.EmployeeId = _sessionContext.RequiredUserId;
|
|
|
}
|
|
|
|
|
|
- if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
|
|
|
+ if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null } && !order.IsProvince)
|
|
|
{
|
|
|
orderVisit.VisitState = EVisitState.Visited;
|
|
|
orderVisit.VisitTime = DateTime.Now;
|
|
@@ -496,6 +510,12 @@ public class OrderController : BaseController
|
|
|
orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
|
|
|
}
|
|
|
|
|
|
+ if (_appOptions.Value.IsZiGong)
|
|
|
+ {
|
|
|
+ orderVisit.EmployeeId = string.Empty;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
if (order.CounterSignType != ECounterSignType.Center)
|
|
|
{
|
|
|
orderVisit.IsCanAiVisit = true;
|
|
@@ -539,7 +559,7 @@ public class OrderController : BaseController
|
|
|
await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
|
|
|
|
|
|
|
|
|
- if (orderVisit.VisitState == EVisitState.Visited)
|
|
|
+ if (orderVisit.VisitState == EVisitState.Visited && !order.IsProvince)
|
|
|
{
|
|
|
//推省上
|
|
|
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
|
|
@@ -776,6 +796,8 @@ public class OrderController : BaseController
|
|
|
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(!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)
|
|
@@ -788,11 +810,27 @@ 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.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"))))
|
|
|
.OrderByDescending(x => x.PublishTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 发送 回访短信
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("visit/sms")]
|
|
|
+ public async Task VisitPushSMSAsync([FromBody] VisitSmsInDto dto)
|
|
|
+ => await _orderApplication.VisitPushSMSAsync(dto, HttpContext.RequestAborted);
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 回访查询基础数据
|
|
|
/// </summary>
|
|
@@ -803,6 +841,13 @@ public class OrderController : BaseController
|
|
|
var rsp = new
|
|
|
{
|
|
|
VisitType = EnumExts.GetDescriptions<EVisitType>(),
|
|
|
+ VoiceEvaluate = EnumExts.GetDescriptions<EVoiceEvaluate>(),
|
|
|
+ SeatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>(),
|
|
|
+ // 部门办件结果
|
|
|
+ VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
|
|
|
+ // 部门办件态度
|
|
|
+ VisitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
|
|
|
+ VisitStateQuery = EnumExts.GetDescriptions<EVisitStateQuery>()
|
|
|
};
|
|
|
return rsp;
|
|
|
}
|
|
@@ -832,6 +877,10 @@ public class OrderController : BaseController
|
|
|
// x => x.OrderId == orderVisit.OrderId && x.AgainState == EAgainState.DoAgain, HttpContext.RequestAborted);
|
|
|
var voiceEvaluate = EnumExts.GetDescriptions<EVoiceEvaluate>();
|
|
|
var seatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>();
|
|
|
+ if (_appOptions.Value.IsZiGong == false)
|
|
|
+ {
|
|
|
+ seatEvaluate = seatEvaluate.Where(m => new int[] { 1, 3 }.Contains(m.Key) == false).ToList();
|
|
|
+ }
|
|
|
var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1");
|
|
|
var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
|
|
|
var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1");
|
|
@@ -864,6 +913,20 @@ public class OrderController : BaseController
|
|
|
//获取系统配置智能回访语音URL头
|
|
|
aiVisitVoiceBaseUrl = _systemSettingCacheManager.GetSetting(SettingConstants.AiVisitVoiceBaseUrl)?.SettingValue[0];
|
|
|
|
|
|
+ var histories = await _orderVisitRepository.Queryable()
|
|
|
+ .Includes(m => m.OrderVisitDetails)
|
|
|
+ .Where(m => m.OrderId == orderVisit.OrderId)
|
|
|
+ .Select(m => new OrderVisitDetailHistiryDto
|
|
|
+ {
|
|
|
+ VoiceEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.VoiceEvaluate).First(),
|
|
|
+ SeatEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.SeatEvaluate).First(),
|
|
|
+ VisitOrgName = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitOrgName).First(),
|
|
|
+ OrgProcessingResults = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgProcessingResults).First(),
|
|
|
+ OrgHandledAttitude = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgHandledAttitude).First(),
|
|
|
+ VisitContent = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitContent).First(),
|
|
|
+ VisitTime = m.VisitTime
|
|
|
+ }).ToListAsync();
|
|
|
+
|
|
|
return new
|
|
|
{
|
|
|
OrderVisitModel = _mapper.Map<OrderVisitDto>(orderVisit),
|
|
@@ -878,6 +941,7 @@ public class OrderController : BaseController
|
|
|
RecordingBaseAddress = recordingBaseAddress,
|
|
|
RecordingAbsolutePath = recordingAbsolutePath,
|
|
|
AiVisitVoiceBaseUrl = aiVisitVoiceBaseUrl,
|
|
|
+ Histories = histories
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -911,120 +975,111 @@ public class OrderController : BaseController
|
|
|
[HttpPost("visit")]
|
|
|
[LogFilter("工单回访")]
|
|
|
public async Task Visit([FromBody] VisitDto dto)
|
|
|
- {
|
|
|
- //var visit = await _orderVisitRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
|
|
|
- var visit = await _orderVisitRepository.Queryable()
|
|
|
- .Includes(d => d.Order)
|
|
|
- .Includes(d => d.OrderVisitDetails)
|
|
|
- .FirstAsync(d => d.Id == dto.Id, HttpContext.RequestAborted);
|
|
|
- if (visit is null)
|
|
|
- throw UserFriendlyException.SameMessage("未知回访信息");
|
|
|
+ => await _orderApplication.SaveOrderVisit(dto, HttpContext.RequestAborted);
|
|
|
|
|
|
- if (visit.VisitState == EVisitState.Visited)
|
|
|
- throw UserFriendlyException.SameMessage("已回访,不能重复回访");
|
|
|
-
|
|
|
- var first = dto.VisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
|
|
|
-
|
|
|
- visit.IsPutThrough = dto.IsPutThrough;
|
|
|
- visit.AgainState = dto.IsAgain ? EAgainState.NeedAgain : EAgainState.NoAgain;
|
|
|
- visit.EmployeeId = _sessionContext.UserId;
|
|
|
- visit.CallId = dto.CallId;
|
|
|
- if (first != null)
|
|
|
- {
|
|
|
- visit.NowEvaluate = first.OrgProcessingResults;
|
|
|
- }
|
|
|
-
|
|
|
- //update order
|
|
|
- //if (dto.IsPutThrough)
|
|
|
- //{
|
|
|
- visit.VisitState = Share.Enums.Order.EVisitState.Visited;
|
|
|
- visit.VisitTime = DateTime.Now;
|
|
|
- if (!string.IsNullOrEmpty(visit.CallId))
|
|
|
- {
|
|
|
- visit.VisitType = EVisitType.CallVisit;
|
|
|
- }
|
|
|
-
|
|
|
- if (visit.VisitType is null)
|
|
|
- {
|
|
|
- visit.VisitType = EVisitType.ArtificialVisit;
|
|
|
- }
|
|
|
+ /// <summary>
|
|
|
+ /// 批量保存回访
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [Permission(EPermission.Visit)]
|
|
|
+ [HttpPost("visit/batch")]
|
|
|
+ [LogFilter("批量工单回访")]
|
|
|
+ public async Task<VisitBatchOutDto> VisitBatch([FromBody] VisitBatchInDto dto)
|
|
|
+ {
|
|
|
+ var errorMessage = new StringBuilder();
|
|
|
+ var outDto = new VisitBatchOutDto();
|
|
|
+ var orderIds = dto.Visit.Select(m => m.OrderId).ToList();
|
|
|
+ var hasHuiQian = await _orderRepository.Queryable().AnyAsync(x => orderIds.Contains(x.Id) && x.CounterSignType != null);
|
|
|
+ if (hasHuiQian)
|
|
|
+ throw UserFriendlyException.SameMessage("选择的回访单中含有会签工单, 不能批量回访. 请排除会签工单.");
|
|
|
|
|
|
- if (first != null)
|
|
|
- {
|
|
|
- visit.Order.Visited(first.OrgProcessingResults.Key, first.OrgProcessingResults.Value);
|
|
|
- }
|
|
|
+ var hasProvince = await _orderRepository.Queryable().AnyAsync(x => orderIds.Contains(x.Id) && x.IsProvince == true);
|
|
|
+ if (hasProvince)
|
|
|
+ throw UserFriendlyException.SameMessage("选择的回访单中含有省工单, 不能批量回访. 请排除省工单.");
|
|
|
|
|
|
- visit.OrgJudge = dto.OrgJudge;
|
|
|
- visit.SeatJudge = dto.SeatJudge;
|
|
|
|
|
|
- if (visit.OrgJudge == true || visit.SeatJudge == true)
|
|
|
+ foreach (var visit in dto.Visit)
|
|
|
{
|
|
|
- visit.JudgeState = EJudgeState.Judging;
|
|
|
- }
|
|
|
|
|
|
- //_mapper.Map(dto.VisitDetails,visit.OrderVisitDetails);
|
|
|
- for (int i = 0;i < visit.OrderVisitDetails.Count;i++)
|
|
|
- {
|
|
|
- var detail = visit.OrderVisitDetails[i];
|
|
|
- var detaildto = dto.VisitDetails.FirstOrDefault(x => x.Id == detail.Id);
|
|
|
- if (detaildto != null)
|
|
|
+ try
|
|
|
{
|
|
|
- if (visit.Order.SourceChannelCode != "RGDH" && detaildto.VisitTarget == EVisitTarget.Seat)
|
|
|
+ var details = await _orderVisitedDetailRepository
|
|
|
+ .Queryable()
|
|
|
+ .Where(m => m.VisitId == visit.VisitId)
|
|
|
+ .ToListAsync();
|
|
|
+ var seatDetail = details.First(m => m.VisitTarget == EVisitTarget.Seat);
|
|
|
+ var visitDto = new VisitDto
|
|
|
{
|
|
|
- detaildto.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
|
|
|
- }
|
|
|
-
|
|
|
- _mapper.Map(detaildto, visit.OrderVisitDetails[i]);
|
|
|
- }
|
|
|
- }
|
|
|
+ Id = visit.VisitId,
|
|
|
+ IsPutThrough = true,
|
|
|
+ IsAgain = false,
|
|
|
+ VisitDetails = new List<VisitDetailDto>
|
|
|
+ {
|
|
|
+ new()
|
|
|
+ {
|
|
|
+ Id = seatDetail.Id,
|
|
|
+ VisitId = visit.VisitId,
|
|
|
+ VisitContent = dto.SeatVisitContent,
|
|
|
+ SeatEvaluate = dto.SeatEvaluate,
|
|
|
+ VisitTarget = EVisitTarget.Seat
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
- await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
|
|
|
- await _orderVisitedDetailRepository.UpdateRangeAsync(visit.OrderVisitDetails, HttpContext.RequestAborted);
|
|
|
- await _orderRepository.UpdateAsync(visit.Order, HttpContext.RequestAborted);
|
|
|
- var orderDto = _mapper.Map<OrderDto>(visit.Order);
|
|
|
- if (first != null)
|
|
|
- {
|
|
|
- //推省上
|
|
|
- await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
|
|
|
- new PublishVisitDto()
|
|
|
+ var orgDetails = details.Where(m => m.VisitTarget == EVisitTarget.Org).ToList();
|
|
|
+ foreach (var orgDetail in orgDetails)
|
|
|
{
|
|
|
- Order = orderDto,
|
|
|
- No = visit.No,
|
|
|
- VisitType = visit.VisitType,
|
|
|
- VisitName = visit.CreatorName,
|
|
|
- VisitTime = visit.VisitTime,
|
|
|
- VisitRemark = string.IsNullOrEmpty(first.VisitContent) ? first.OrgProcessingResults?.Value : first.VisitContent,
|
|
|
- AreaCode = visit.Order.AreaCode!,
|
|
|
- SubjectResultSatifyCode = first.OrgProcessingResults.Key,
|
|
|
- FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
|
|
|
- ClientGuid = ""
|
|
|
- }, cancellationToken: HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //推门户
|
|
|
- await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
|
|
|
+ visitDto.VisitDetails.Add(
|
|
|
+ new()
|
|
|
+ {
|
|
|
+ Id = orgDetail.Id,
|
|
|
+ VisitId = visit.VisitId,
|
|
|
+ VisitContent = dto.OrgVisitContent,
|
|
|
+ VisitTarget = EVisitTarget.Org,
|
|
|
+ OrgNoSatisfiedReason = dto.OrgNoSatisfiedReason,
|
|
|
+ OrgProcessingResults = dto.OrgProcessingResults,
|
|
|
+ OrgHandledAttitude = dto.OrgHandledAttitude
|
|
|
+ });
|
|
|
+ }
|
|
|
+ await _orderApplication.SaveOrderVisit(visitDto, HttpContext.RequestAborted);
|
|
|
+ outDto.CompleteCount += 1;
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
{
|
|
|
- Id = visit.Id,
|
|
|
- Order = orderDto,
|
|
|
- OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
|
|
|
- VisitName = _sessionContext.UserName,
|
|
|
- VisitTime = visit.VisitTime,
|
|
|
- VisitType = visit.VisitType,
|
|
|
- VisitState = visit.VisitState,
|
|
|
- PublishTime = visit.PublishTime,
|
|
|
- }, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ outDto.ErrorCount += 1;
|
|
|
+ errorMessage.Append($"【{visit.No}】 保存失败.");
|
|
|
+ _logger.LogError($"orderVisitId:{visit.VisitId} 保存回访失败, err: {e.Message}");
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ outDto.TotalCount += 1;
|
|
|
+ }
|
|
|
}
|
|
|
+ outDto.ErrorMessage = errorMessage.ToString();
|
|
|
+ return outDto;
|
|
|
+ }
|
|
|
|
|
|
- if (first != null)
|
|
|
+ /// <summary>
|
|
|
+ /// 批量保存回访基础数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("visit/batch-basedata")]
|
|
|
+ [AllowAnonymous]
|
|
|
+ public async Task<dynamic> VisitBatchBaseDat()
|
|
|
+ {
|
|
|
+ return new
|
|
|
{
|
|
|
- //写入质检
|
|
|
- await _qualityApplication.AddQualityAsync(EQualitySource.Visit, visit.Order.Id, visit.Id,
|
|
|
- HttpContext.RequestAborted);
|
|
|
- }
|
|
|
- //}
|
|
|
- //else
|
|
|
- //{
|
|
|
- // await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
|
|
|
- //}
|
|
|
+ // 话务员评价
|
|
|
+ SeatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>(),
|
|
|
+ // 不满意原因
|
|
|
+ DissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason).Select(m => new { m.Id, m.DicDataName, m.DicDataValue}),
|
|
|
+ // 回访满意度
|
|
|
+ VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
|
|
|
+ // 回访态度
|
|
|
+ VisitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue })
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -3979,13 +4034,26 @@ public class OrderController : BaseController
|
|
|
ApplyOrgName = currentStep!.AcceptorOrgName,
|
|
|
SendBackOrgId = prevStep.HandlerOrgId, //prevStep.AcceptorOrgId,
|
|
|
SendBackOrgName = prevStep.HandlerOrgName, //prevStep!.AcceptorOrgName,
|
|
|
- WorkflowOrgId = _sessionContext.RequiredOrgId,
|
|
|
+ SendBackStepName = prevStep.Name,
|
|
|
+ WorkflowStepSendBackCrTime = currentStep.CreationTime,
|
|
|
+ WorkflowOrgId = _sessionContext.RequiredOrgId,
|
|
|
WorkflowUserId = _sessionContext.RequiredUserId,
|
|
|
WorkflowRoleIds = _sessionContext.Roles.ToList(),
|
|
|
Status = order.Status,
|
|
|
TraceId = currentStep.Id
|
|
|
};
|
|
|
- if (oneSendBack || twoSendBack)
|
|
|
+ if (_appOptions.Value.IsZiGong && prevStep.BusinessType == EBusinessType.Send)
|
|
|
+ {
|
|
|
+ // 平均派单
|
|
|
+ var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
|
|
|
+ if (averageSendOrder)
|
|
|
+ {
|
|
|
+ var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
|
|
|
+ dto.NextHandlers = new List<FlowStepHandler> { handler };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (oneSendBack || twoSendBack)
|
|
|
{
|
|
|
var sendBack = await _orderSendBackAuditRepository.Queryable()
|
|
|
.Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
|
|
@@ -3996,7 +4064,15 @@ public class OrderController : BaseController
|
|
|
.AnyAsync();
|
|
|
if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
|
|
|
if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
|
|
|
- if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
|
|
|
+ if (oneSendBack && isOrgToCenter && _appOptions.Value.IsZiGong)
|
|
|
+ {
|
|
|
+ if (order.SendBackAuditEndTime.HasValue && order.SendBackAuditEndTime.Value < DateTime.Now )
|
|
|
+ throw UserFriendlyException.SameMessage("工单截至退回时间【" + order.SendBackAuditEndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") + "】,无法进行退回!");
|
|
|
+ var sendBackAgain = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == workflow.ExternalId && x.IsReturnAgain == true).AnyAsync();
|
|
|
+ if (sendBackAgain)
|
|
|
+ throw UserFriendlyException.SameMessage("工单已不允许退回!");
|
|
|
+ }
|
|
|
+ if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
|
|
|
{
|
|
|
|
|
|
await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = EOrderStatus.SendBackAudit })
|
|
@@ -4008,7 +4084,7 @@ public class OrderController : BaseController
|
|
|
audit.AuditUser = "默认通过";
|
|
|
audit.AuditTime = DateTime.Now;
|
|
|
dto.ExpiredTime = order.ExpiredTime;
|
|
|
- var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
|
|
|
+ var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
|
|
|
var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
|
|
|
? EProcessType.Zhiban
|
|
|
: EProcessType.Jiaoban;
|
|
@@ -4618,7 +4694,7 @@ public class OrderController : BaseController
|
|
|
model.StepName = step.Name;
|
|
|
model.StepCode = step.Code;
|
|
|
model.State = 1;
|
|
|
- model.ESpecialType = ESpecialType.ReTransact;
|
|
|
+ model.SpecialType = dto.SpecialType;
|
|
|
model.LastFileOpinion = order.FileOpinion;
|
|
|
model.FirstFileOpinion = order.FileOpinion;
|
|
|
var firstSpecial = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId).FirstAsync();
|
|
@@ -5115,7 +5191,8 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
|
|
|
SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
|
|
|
- Step = step,
|
|
|
+ InstaShotSpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason),
|
|
|
+ Step = step,
|
|
|
BaseTypeId = baseTypeId
|
|
|
};
|
|
|
return rsp;
|
|
@@ -5129,7 +5206,8 @@ public class OrderController : BaseController
|
|
|
public async Task<object> ReTransactBaseData(string id)
|
|
|
{
|
|
|
var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
|
|
|
- List<Kv> orgs = new();
|
|
|
+ var isInstaShot = order.SourceChannel.Contains("随手拍");
|
|
|
+ List<Kv> orgs = new();
|
|
|
if (order == null) throw UserFriendlyException.SameMessage("无效工单信息!");
|
|
|
//中心会签调取方法
|
|
|
var org = await _workflowDomainService.GetLevelOneOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
@@ -5139,8 +5217,8 @@ public class OrderController : BaseController
|
|
|
var rsp = new
|
|
|
{
|
|
|
SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
|
|
|
- SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
|
|
|
- ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
|
|
|
+ SpecialReason = isInstaShot ? _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason) : _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
|
|
|
+ ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
|
|
|
Step = step,
|
|
|
Orgs = orgs,
|
|
|
};
|