|
@@ -1,12 +1,13 @@
|
|
|
-using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
+using DocumentFormat.OpenXml.Wordprocessing;
|
|
|
using DotNetCore.CAP;
|
|
|
using FluentValidation;
|
|
|
using Hotline.Api.Filter;
|
|
|
using Hotline.Application.CallCenter;
|
|
|
using Hotline.Application.ExportExcel;
|
|
|
using Hotline.Application.FlowEngine;
|
|
|
+using Hotline.Application.OrderApp;
|
|
|
using Hotline.Application.Quality;
|
|
|
-using Hotline.Application.Snapshot;
|
|
|
+using Hotline.Application.Snapshot.Contracts;
|
|
|
using Hotline.Application.Systems;
|
|
|
using Hotline.Article;
|
|
|
using Hotline.Authentications;
|
|
@@ -48,7 +49,6 @@ using Hotline.Share.Dtos.Settings;
|
|
|
using Hotline.Share.Dtos.Snapshot;
|
|
|
using Hotline.Share.Enums.Article;
|
|
|
using Hotline.Share.Enums.CallCenter;
|
|
|
-using Hotline.Share.Enums.Caselibrary;
|
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
using Hotline.Share.Enums.Push;
|
|
@@ -57,25 +57,22 @@ using Hotline.Share.Mq;
|
|
|
using Hotline.Share.Requests;
|
|
|
using Hotline.Share.Tools;
|
|
|
using Hotline.Snapshot;
|
|
|
-using Hotline.Snapshot.Interfaces;
|
|
|
+using Hotline.Snapshot.IRepository;
|
|
|
using Hotline.Tools;
|
|
|
using Hotline.Users;
|
|
|
using Hotline.Validators.FlowEngine;
|
|
|
using Hotline.YbEnterprise.Sdk;
|
|
|
using Mapster;
|
|
|
using MapsterMapper;
|
|
|
-using MathNet.Numerics.LinearAlgebra.Factorization;
|
|
|
using MediatR;
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.Extensions.Options;
|
|
|
using MiniExcelLibs;
|
|
|
-using NPOI.SS.Formula.Functions;
|
|
|
using SqlSugar;
|
|
|
using System.Text;
|
|
|
using System.Text.Json;
|
|
|
using System.Threading;
|
|
|
-using Hotline.Application.OrderApp;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Cache;
|
|
|
using XF.Domain.Exceptions;
|
|
@@ -167,6 +164,7 @@ public class OrderController : BaseController
|
|
|
private readonly IRepository<OrderComplement> _orderComplementRepository;
|
|
|
private readonly ICircularRecordDomainService _circularRecordDomainService;
|
|
|
private readonly IRepository<Hotline.Special.SpecialNumber> _specialNumberRepository;
|
|
|
+ private readonly IRepository<OrderVisitDetailCopy> _orderVisitDetailCopyRepository;
|
|
|
|
|
|
public OrderController(
|
|
|
IOrderDomainService orderDomainService,
|
|
@@ -243,7 +241,8 @@ public class OrderController : BaseController
|
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
|
IRepository<OrderComplement> orderComplementRepository,
|
|
|
ICircularRecordDomainService circularRecordDomainService,
|
|
|
- IRepository<Hotline.Special.SpecialNumber> specialNumberRepository)
|
|
|
+ IRepository<Hotline.Special.SpecialNumber> specialNumberRepository,
|
|
|
+ IRepository<OrderVisitDetailCopy> orderVisitDetailCopyRepository)
|
|
|
{
|
|
|
_orderDomainService = orderDomainService;
|
|
|
_orderRepository = orderRepository;
|
|
@@ -320,6 +319,7 @@ public class OrderController : BaseController
|
|
|
_orderComplementRepository = orderComplementRepository;
|
|
|
_circularRecordDomainService = circularRecordDomainService;
|
|
|
_specialNumberRepository = specialNumberRepository;
|
|
|
+ _orderVisitDetailCopyRepository = orderVisitDetailCopyRepository;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
@@ -679,40 +679,65 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (order.Source != ESource.ProvinceStraight && order.FileOrgIsCenter.Value == false)
|
|
|
+ if (_appOptions.Value.IsZiGong)
|
|
|
{
|
|
|
- var code = "";
|
|
|
- //受理类型为“投诉、举报”
|
|
|
- if ((order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35") && orderVisit.VisitState != EVisitState.Visited)
|
|
|
+ if (order.Source == ESource.ProvinceStraight)
|
|
|
{
|
|
|
- code = "1017";
|
|
|
- orderVisit.VisitState = EVisitState.SMSVisiting;
|
|
|
- await _orderVisitRepository.UpdateAsync(orderVisit);
|
|
|
+ //发送查询短信
|
|
|
+ var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ {
|
|
|
+ PushBusiness = EPushBusiness.SearchSms,
|
|
|
+ ExternalId = visitId,
|
|
|
+ OrderId = order.Id,
|
|
|
+ PushPlatform = EPushPlatform.Sms,
|
|
|
+ Remark = order.Title,
|
|
|
+ Name = order.FromName,
|
|
|
+ TemplateCode = "1021",
|
|
|
+ Params = new List<string>() { order.No, order.Password },
|
|
|
+ TelNumber = order.Contact,
|
|
|
+ };
|
|
|
+ await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
}
|
|
|
- else
|
|
|
- code = "1018";
|
|
|
-
|
|
|
- var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (order.Source != ESource.ProvinceStraight && order.FileOrgIsCenter.Value == false)
|
|
|
{
|
|
|
- PushBusiness = EPushBusiness.SearchSms,
|
|
|
- ExternalId = visitId,
|
|
|
- OrderId = order.Id,
|
|
|
- PushPlatform = EPushPlatform.Sms,
|
|
|
- Remark = order.Title,
|
|
|
- Name = order.FromName,
|
|
|
- TemplateCode = code,
|
|
|
- Params = new List<string>() { order.No, order.Password },
|
|
|
- TelNumber = order.Contact,
|
|
|
- };
|
|
|
- await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
-
|
|
|
- // 发送短信后推送一个 48小时的延迟消息队列. 当消息队列收到消息时, 判断用户是否回复了, 如果未回复短信就 默认满意
|
|
|
- var delaySecond = _systemSettingCacheManager.DefaultVisitSmsDelaySecond;
|
|
|
- await _capPublisher.PublishDelayAsync(
|
|
|
- TimeSpan.FromSeconds(delaySecond),
|
|
|
- EventNames.UpdateVisitDelaySms,
|
|
|
- messageDto,
|
|
|
- cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var isOpenSendVisitSms = _systemSettingCacheManager.GetSetting(SettingConstants.IsOpenSendVisitSms)?.SettingValue[0];
|
|
|
+
|
|
|
+ var code = "";
|
|
|
+ //受理类型为“投诉、举报”
|
|
|
+ if ((order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35") && orderVisit.VisitState != EVisitState.Visited && isOpenSendVisitSms == "true")
|
|
|
+ {
|
|
|
+ code = "1017";
|
|
|
+ orderVisit.VisitState = EVisitState.SMSVisiting;
|
|
|
+ await _orderVisitRepository.UpdateAsync(orderVisit);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ code = "1018";
|
|
|
+
|
|
|
+ var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ {
|
|
|
+ PushBusiness = EPushBusiness.SearchSms,
|
|
|
+ ExternalId = visitId,
|
|
|
+ OrderId = order.Id,
|
|
|
+ PushPlatform = EPushPlatform.Sms,
|
|
|
+ Remark = order.Title,
|
|
|
+ Name = order.FromName,
|
|
|
+ TemplateCode = code,
|
|
|
+ Params = new List<string>() { order.No, order.Password },
|
|
|
+ TelNumber = order.Contact,
|
|
|
+ };
|
|
|
+ await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ // 发送短信后推送一个 48小时的延迟消息队列. 当消息队列收到消息时, 判断用户是否回复了, 如果未回复短信就 默认满意
|
|
|
+ var delaySecond = _systemSettingCacheManager.DefaultVisitSmsDelaySecond;
|
|
|
+ await _capPublisher.PublishDelayAsync(
|
|
|
+ TimeSpan.FromSeconds(delaySecond),
|
|
|
+ EventNames.UpdateVisitDelaySms,
|
|
|
+ messageDto,
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
catch (Exception)
|
|
@@ -1079,6 +1104,53 @@ public class OrderController : BaseController
|
|
|
|
|
|
#region 工单回访
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 获取修改历史记录
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("getordervisitdetailcopy/{id}")]
|
|
|
+ public async Task<OrderVisitDetailCopyDto> GetOrderVisitDetailCopy(string id)
|
|
|
+ {
|
|
|
+ var listCopyData = await _orderVisitDetailCopyRepository.Queryable()
|
|
|
+ .Where(p => p.VisitId == id)
|
|
|
+ .OrderByDescending(p => p.CreationTime)
|
|
|
+ .Take(1)
|
|
|
+ .ToListAsync();
|
|
|
+
|
|
|
+ var data = new OrderVisitDetailCopyDto();
|
|
|
+ if (listCopyData != null && listCopyData.Any())
|
|
|
+ {
|
|
|
+ //修改数据
|
|
|
+ var list = await _orderVisitDetailCopyRepository.Queryable().Where(p => p.BacthId == listCopyData[0].BacthId).OrderBy(p => p.VisitTarget).ToListAsync();
|
|
|
+ if (list != null && list.Any())
|
|
|
+ {
|
|
|
+ var orderVisitDetailCopyDtos = new List<OrderVisitDetailDto>();
|
|
|
+ foreach (var item in list)
|
|
|
+ {
|
|
|
+ orderVisitDetailCopyDtos.Add(_mapper.Map<OrderVisitDetailDto>(item));
|
|
|
+ }
|
|
|
+ data.OrderVisitDetailCopyDtos = orderVisitDetailCopyDtos;
|
|
|
+ data.CreatorName = list[0].CreatorName;
|
|
|
+ data.CreationTime = list[0].CreationTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ //正常数据
|
|
|
+ var listData = await _orderVisitedDetailRepository.Queryable().Where(p => p.VisitId == id).OrderBy(p => p.VisitTarget).ToListAsync();
|
|
|
+ if (listData != null && listData.Any())
|
|
|
+ {
|
|
|
+ var orderVisitDetailDtos = new List<OrderVisitDetailDto>();
|
|
|
+ foreach (var item in listData)
|
|
|
+ {
|
|
|
+ orderVisitDetailDtos.Add(_mapper.Map<OrderVisitDetailDto>(item));
|
|
|
+ }
|
|
|
+ data.OrderVisitDetailDtos = orderVisitDetailDtos;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 回访列表
|
|
|
/// </summary>
|
|
@@ -1340,12 +1412,15 @@ public class OrderController : BaseController
|
|
|
Histories = histories,
|
|
|
IsCanUpdate = isCanUpdate
|
|
|
};
|
|
|
- if (_appOptions.Value.IsLuZhou
|
|
|
- && !_sessionContext.OrgIsCenter
|
|
|
- && rsp.OrderVisitModel.Order.IsSecret)
|
|
|
+ if (!_sessionContext.OrgIsCenter && rsp.OrderVisitModel.Order.IsSecret)
|
|
|
{
|
|
|
- rsp.OrderVisitModel.Order.FromPhone = "****";//rsp.OrderVisitModel.Order.FromPhone?.Replace(rsp.OrderVisitModel.Order.FromPhone.Substring(3, 4), "****");
|
|
|
- rsp.OrderVisitModel.Order.Contact = "****"; //rsp.OrderVisitModel.Order.Contact?.Replace(rsp.OrderVisitModel.Order.Contact.Substring(3, 4), "****");
|
|
|
+ if (_appOptions.Value.IsZiGong)
|
|
|
+ rsp.OrderVisitModel.Order = rsp.OrderVisitModel.Order.DataMask();
|
|
|
+ if (_appOptions.Value.IsLuZhou)
|
|
|
+ {
|
|
|
+ rsp.OrderVisitModel.Order.FromPhone = "****";//rsp.OrderVisitModel.Order.FromPhone?.Replace(rsp.OrderVisitModel.Order.FromPhone.Substring(3, 4), "****");
|
|
|
+ rsp.OrderVisitModel.Order.Contact = "****"; //rsp.OrderVisitModel.Order.Contact?.Replace(rsp.OrderVisitModel.Order.Contact.Substring(3, 4), "****");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return rsp;
|
|
@@ -2560,7 +2635,7 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
|
|
|
var (total, items) = await _orderApplication.MayScreenList(dto)
|
|
|
- .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
var data = _mapper.Map<List<OrderVisitDetailDto>>(items);
|
|
|
var isAdmin = _orderDomainService.IsCheckAdmin();
|
|
|
data.ForEach(d => d.IsShowOperate = (dto.ScreenType == EOrderScreenType.Org && d.VisitOrgCode == _sessionContext.OrgId)
|
|
@@ -2621,7 +2696,7 @@ public class OrderController : BaseController
|
|
|
public async Task<PagedDto<OrderScreenListDto>> ScreenList([FromQuery] ScreenListDto dto)
|
|
|
{
|
|
|
var (total, items) = await _orderApplication.OrderScreenList(dto)
|
|
|
- .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<OrderScreenListDto>(total, _mapper.Map<IReadOnlyList<OrderScreenListDto>>(items));
|
|
|
}
|
|
|
|
|
@@ -2876,6 +2951,19 @@ public class OrderController : BaseController
|
|
|
[HttpGet("screen/base")]
|
|
|
public async Task<object> ScreenBaseData()
|
|
|
{
|
|
|
+ var screenStatisticalNodes = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenStatisticalNodes).SettingValue;
|
|
|
+ var screenStatisticalNodesList = new List<Kv>();
|
|
|
+ if (screenStatisticalNodes != null && screenStatisticalNodes.Any())
|
|
|
+ {
|
|
|
+ foreach (var item in screenStatisticalNodes)
|
|
|
+ {
|
|
|
+ screenStatisticalNodesList.Add(new Kv
|
|
|
+ {
|
|
|
+ Key = item,
|
|
|
+ Value = item
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
var rsp = new
|
|
|
{
|
|
|
ScreenStatus = EnumExts.GetDescriptions<EScreenStatus>(),
|
|
@@ -2887,6 +2975,7 @@ public class OrderController : BaseController
|
|
|
SourceChannel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel),
|
|
|
VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction),
|
|
|
DissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason),
|
|
|
+ ScreenStatisticalNodes = screenStatisticalNodesList,
|
|
|
};
|
|
|
return rsp;
|
|
|
}
|
|
@@ -3119,6 +3208,86 @@ public class OrderController : BaseController
|
|
|
return new PagedDto<SuperviseOrderDto>(total, _mapper.Map<IReadOnlyList<SuperviseOrderDto>>(items));
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 督办查询部门经办人手机号
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="orgCode"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("supervise/geturgetel/{orgCode}")]
|
|
|
+ public async Task<Kv> GetUrgeTel(string orgCode)
|
|
|
+ {
|
|
|
+ Kv k = new Kv();
|
|
|
+ var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
|
|
|
+ //查询部门所有账号
|
|
|
+ var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
+ x.OrgId == orgCode && !string.IsNullOrEmpty(x.PhoneNo) &&
|
|
|
+ x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
|
|
|
+ if (userlist != null && userlist.Count > 0)
|
|
|
+ {
|
|
|
+ k.Key = userlist[0].Name;
|
|
|
+ k.Value = userlist[0].PhoneNo;
|
|
|
+ }
|
|
|
+ return k;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 旅游列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("supervise/travel")]
|
|
|
+ public async Task<IReadOnlyList<OrderDto>> QueryTravel([FromQuery] QueryOrderDto dto)
|
|
|
+ {
|
|
|
+ var orders = await _orderApplication.QueryTravel(dto)
|
|
|
+ .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
|
|
|
+ var list = _mapper.Map<IReadOnlyList<OrderDto>>(orders);
|
|
|
+ if (_appOptions.Value.IsLuZhou && !_sessionContext.OrgIsCenter)
|
|
|
+ list = list.Select(p => p.DataMask()).ToList();
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 旅游列表查询总数
|
|
|
+ /// </summary>
|
|
|
+ [HttpGet("supervise/travel/count")]
|
|
|
+ public async Task<int> QueryTravelCount([FromQuery] QueryOrderDto dto)
|
|
|
+ {
|
|
|
+ var query = _orderApplication.QueryTravel(dto);
|
|
|
+ return await query.CountAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ [HttpPost("supervise/travel/export")]
|
|
|
+ public async Task<FileStreamResult> ExportTravel([FromBody] ExportExcelDto<QueryOrderDto> dto)
|
|
|
+ {
|
|
|
+ var query = _orderApplication.QueryTravel(dto.QueryDto);
|
|
|
+ List<Order> orders;
|
|
|
+ if (dto.IsExportAll)
|
|
|
+ {
|
|
|
+ orders = await query.ToListAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
|
|
|
+ orders = items;
|
|
|
+ }
|
|
|
+
|
|
|
+ var orderDtos = _mapper.Map<ICollection<OrderDto>>(orders);
|
|
|
+
|
|
|
+ if (_appOptions.Value.IsLuZhou)
|
|
|
+ orderDtos = orderDtos.Select(p => p.DataMask()).ToList();
|
|
|
+
|
|
|
+ dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
|
|
|
+
|
|
|
+ var dtos = orderDtos
|
|
|
+ .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
|
|
|
+ .Cast<object>()
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var stream = ExcelHelper.CreateStream(dtos);
|
|
|
+
|
|
|
+ return ExcelStreamResult(stream, "旅游数据");
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 申请督办
|
|
|
/// </summary>
|
|
@@ -3154,27 +3323,64 @@ public class OrderController : BaseController
|
|
|
//发送短信
|
|
|
try
|
|
|
{
|
|
|
- var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
|
|
|
- //查询部门所有账号
|
|
|
- var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
- x.OrgId == model.OrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
|
|
|
- x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
|
|
|
- //发送短信
|
|
|
- foreach (var user in userlist)
|
|
|
+ if (string.IsNullOrEmpty(dto.PhoneNo))
|
|
|
{
|
|
|
- var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ #region 普通督办短信内容
|
|
|
+ var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
|
|
|
+ //查询部门所有账号
|
|
|
+ var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
+ x.OrgId == model.OrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
|
|
|
+ x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
|
|
|
+ //发送短信
|
|
|
+ foreach (var user in userlist)
|
|
|
{
|
|
|
- PushBusiness = EPushBusiness.OrderSupervise,
|
|
|
- ExternalId = order.Id,
|
|
|
- OrderId = order.Id,
|
|
|
- PushPlatform = EPushPlatform.Sms,
|
|
|
- Remark = order.Title,
|
|
|
- Name = user.Name,
|
|
|
- TemplateCode = "1003",
|
|
|
- Params = new List<string>() { order.No },
|
|
|
- TelNumber = user.PhoneNo,
|
|
|
- };
|
|
|
- await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
+ var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ {
|
|
|
+ PushBusiness = EPushBusiness.OrderSupervise,
|
|
|
+ ExternalId = order.Id,
|
|
|
+ OrderId = order.Id,
|
|
|
+ PushPlatform = EPushPlatform.Sms,
|
|
|
+ Remark = order.Title,
|
|
|
+ Name = user.Name,
|
|
|
+ TemplateCode = "1003",
|
|
|
+ Params = new List<string>() { order.No },
|
|
|
+ TelNumber = user.PhoneNo,
|
|
|
+ };
|
|
|
+ await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ #region 旅游督办短信内容
|
|
|
+
|
|
|
+ var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
|
|
|
+ //查询部门所有账号
|
|
|
+ var userlist = await _userRepository.Queryable().Where(x =>
|
|
|
+ x.OrgId == model.OrgId && x.PhoneNo == dto.PhoneNo &&
|
|
|
+ x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
|
|
|
+
|
|
|
+ var Contact = !string.IsNullOrEmpty(order.FromPhone) ? order.FromPhone : order.Contact;
|
|
|
+
|
|
|
+ //发送短信
|
|
|
+ if (userlist != null && userlist.Count > 0)
|
|
|
+ {
|
|
|
+ var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ {
|
|
|
+ PushBusiness = EPushBusiness.OrderSupervise,
|
|
|
+ ExternalId = order.Id,
|
|
|
+ OrderId = order.Id,
|
|
|
+ PushPlatform = EPushPlatform.Sms,
|
|
|
+ Remark = order.Title,
|
|
|
+ Name = userlist[0].Name,
|
|
|
+ TemplateCode = "1022",
|
|
|
+ Params = new List<string>() { dto.ApplyContent, order.No, Contact, order.Content },
|
|
|
+ TelNumber = userlist[0].PhoneNo,
|
|
|
+ };
|
|
|
+ await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|
|
|
catch
|
|
@@ -4190,11 +4396,14 @@ public class OrderController : BaseController
|
|
|
{
|
|
|
await _orderSnapshotRepository.Queryable()
|
|
|
.Where(m => m.Id == order.Id)
|
|
|
- .Select(m => new { m.IndustryId, m.IndustryName })
|
|
|
+ .Select(m => new { m.IndustryId, m.IndustryName, m.IndustryCase })
|
|
|
.FirstAsync(HttpContext.RequestAborted)
|
|
|
.Then(async snapshot =>
|
|
|
{
|
|
|
- dto.IndustryName = snapshot.IndustryName;
|
|
|
+ if (snapshot.IndustryCase.IsNullOrEmpty())
|
|
|
+ dto.IndustryName = snapshot.IndustryName;
|
|
|
+ else
|
|
|
+ dto.IndustryName = snapshot.IndustryName + " " + snapshot.IndustryCase;
|
|
|
dto.IndustryId = snapshot.IndustryId;
|
|
|
});
|
|
|
}
|
|
@@ -4330,7 +4539,7 @@ public class OrderController : BaseController
|
|
|
order.PushTypeCode = string.Join(",", pushTypeCode);
|
|
|
order.PushType = string.Join(",", pushTypes);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (dto.Tags != null && dto.Tags.Any())
|
|
|
{
|
|
|
var orderTags = new List<SystemDicData>();
|
|
@@ -4641,6 +4850,7 @@ public class OrderController : BaseController
|
|
|
|
|
|
//处理工单的期满时间
|
|
|
//首先是工单编辑页面提交的、流程已经开启、工单未归档的工单才能修改期满时间
|
|
|
+ var isUpdateExpiredTime = false;
|
|
|
if (dto.IsEdit && !string.IsNullOrEmpty(order.WorkflowId) && order.Status < EOrderStatus.Filed && dto.AcceptTypeCode != acceptTypeCode)
|
|
|
{
|
|
|
//查询当前工单的实际办理节点,如果在热线中心不处理,如果在部门需要更新期满时间
|
|
@@ -4659,6 +4869,7 @@ public class OrderController : BaseController
|
|
|
order.Adapt<OrderTimeClacInfo>());
|
|
|
if (expiredTimeConfig is not null && expiredTimeConfig.ExpiredTime > order.ExpiredTime)
|
|
|
{
|
|
|
+ isUpdateExpiredTime = true;
|
|
|
order.ExpiredTime = expiredTimeConfig.ExpiredTime;
|
|
|
order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
|
|
|
order.NearlyExpiredTimeOne = expiredTimeConfig.NearlyExpiredTimeOne;
|
|
@@ -4670,7 +4881,12 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- await _orderRepository.UpdateNav(order, new UpdateNavRootOptions { IgnoreColumns = ["CallId"] }).Include(d => d.OrderExtension)
|
|
|
+ var updateNavRootOptions = isUpdateExpiredTime
|
|
|
+ ? new UpdateNavRootOptions { IgnoreColumns = ["CallId"] }
|
|
|
+ : new UpdateNavRootOptions { IgnoreColumns = ["CallId", "ExpiredTime", "NearlyExpiredTime", "NearlyExpiredTimeOne"] };
|
|
|
+
|
|
|
+ await _orderRepository.UpdateNav(order, updateNavRootOptions)
|
|
|
+ .Include(d => d.OrderExtension)
|
|
|
.Include(d => d.OrderTags).ExecuteCommandAsync();
|
|
|
|
|
|
//订阅此事件的内部处理工单数据只能更新各自业务的字段,不能全部更新
|
|
@@ -4789,27 +5005,31 @@ public class OrderController : BaseController
|
|
|
[HttpGet("startflow")]
|
|
|
public async Task<NextStepsDto> GetFlowStartOptions([FromQuery] string? orderId)
|
|
|
{
|
|
|
- var outDto = await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderHandle,
|
|
|
+ var dto = await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.OrderHandle,
|
|
|
HttpContext.RequestAborted);
|
|
|
if (orderId.NotNullOrEmpty())
|
|
|
{
|
|
|
- outDto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
|
|
|
- outDto.Content = (await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted))?.Content;
|
|
|
+ dto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
|
|
|
+ dto.Content = (await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted))?.Content;
|
|
|
}
|
|
|
|
|
|
//随手拍
|
|
|
- bool.TryParse(_systemSettingCacheManager.GetSetting(SettingConstants.Snapshot)?.SettingValue[0],
|
|
|
- out bool isSnapshotEnable);
|
|
|
+ var isSnapshotEnable = _systemSettingCacheManager.Snapshot;
|
|
|
+ var isAqyh = false;//行业类型是否为随手拍安全隐患
|
|
|
if (isSnapshotEnable)
|
|
|
{
|
|
|
- var orderSnapshot = await _orderSnapshotRepository.GetAsync(orderId, HttpContext.RequestAborted);
|
|
|
- if (orderSnapshot != null && string.CompareOrdinal(orderSnapshot.IndustryName, "安全隐患") == 0)
|
|
|
+ var orderSnapShot = await _orderSnapshotRepository.GetAsync(orderId, HttpContext.RequestAborted);
|
|
|
+ if(orderSnapShot != null && string.CompareOrdinal(orderSnapShot.IndustryName, "安全隐患") == 0)
|
|
|
{
|
|
|
- outDto.Steps = outDto.Steps.Where(d => d.BusinessType != EBusinessType.Send).ToList();
|
|
|
+ isAqyh = true;
|
|
|
+ dto.Steps.RemoveAll(d => d.BusinessType == EBusinessType.Send);
|
|
|
}
|
|
|
}
|
|
|
+ if (!isAqyh)
|
|
|
+ dto.Steps = dto.Steps.Where(d => string.CompareOrdinal(d.Value, "网格员") != 0
|
|
|
+ && string.CompareOrdinal(d.Value, "工单标记") != 0).ToList();
|
|
|
|
|
|
- return outDto;
|
|
|
+ return dto;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -5041,6 +5261,7 @@ public class OrderController : BaseController
|
|
|
var (_, currentStep, _, _) = await _workflowDomainService.NextAsync(nextDto,
|
|
|
expiredTime: order.ExpiredTime,
|
|
|
isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
|
|
|
+ newStepConfig: OrderHandleNewStepConfig(),
|
|
|
cancellationToken: cancellationToken);
|
|
|
if (currentStep.BusinessType is EBusinessType.Send)
|
|
|
{
|
|
@@ -5089,7 +5310,9 @@ public class OrderController : BaseController
|
|
|
|
|
|
var (_, _, _, nextSteps) = await _workflowDomainService.NextAsync(nextflowDto,
|
|
|
EHandleMode.CrossLevel, order.ExpiredTime,
|
|
|
- isAutoFillSummaryOpinion, cancellationToken: cancellationToken);
|
|
|
+ isAutoFillSummaryOpinion,
|
|
|
+ newStepConfig: OrderHandleNewStepConfig(),
|
|
|
+ cancellationToken: cancellationToken);
|
|
|
tempSteps.AddRange(nextSteps);
|
|
|
}
|
|
|
|
|
@@ -5140,6 +5363,18 @@ public class OrderController : BaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private static Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? OrderHandleNewStepConfig()
|
|
|
+ {
|
|
|
+ return (_, _, stepDefine, newStep) =>
|
|
|
+ {
|
|
|
+ if (stepDefine.BusinessType is EBusinessType.Department or EBusinessType.DepartmentLeader)
|
|
|
+ {
|
|
|
+ newStep.HandlerId = null;
|
|
|
+ newStep.HandlerName = null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
private async Task HandleNextInMainAndSecondaryAsync(WorkflowDefinition definition, List<OrgDto> orgs,
|
|
|
NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
|
|
|
{
|
|
@@ -5147,6 +5382,7 @@ public class OrderController : BaseController
|
|
|
var (_, _, _, currentSteps) = await _workflowDomainService.NextAsync(flowDto,
|
|
|
expiredTime: expiredTime,
|
|
|
isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
|
|
|
+ newStepConfig: OrderHandleNewStepConfig(),
|
|
|
cancellationToken: cancellation);
|
|
|
|
|
|
foreach (var currentStep in currentSteps)
|
|
@@ -5230,21 +5466,35 @@ public class OrderController : BaseController
|
|
|
[HttpGet("nextsteps/{orderId}")]
|
|
|
public async Task<NextStepsWithOpinionDto<RecommendStepOption>> GetNextStepsWithRecommend(string orderId)
|
|
|
{
|
|
|
+ var isSnapshotEnable = _systemSettingCacheManager.Snapshot;
|
|
|
var order = await _orderDomainService.GetOrderAsync(orderId, cancellationToken: HttpContext.RequestAborted);
|
|
|
+
|
|
|
if (string.IsNullOrEmpty(order.WorkflowId))
|
|
|
throw UserFriendlyException.SameMessage("该工单未开启流程");
|
|
|
var dto = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
|
+ var isAqyh = false;//行业类型是否为随手拍安全隐患
|
|
|
+ if (isSnapshotEnable)
|
|
|
+ {
|
|
|
+ var orderSnapShot = await _orderSnapshotRepository.GetAsync(orderId, HttpContext.RequestAborted);
|
|
|
+ isAqyh = orderSnapShot != null && string.CompareOrdinal(orderSnapShot.IndustryName, "安全隐患") == 0;
|
|
|
+ }
|
|
|
+ if(!isAqyh)
|
|
|
+ dto.Steps = dto.Steps.Where(d => string.CompareOrdinal(d.Value, "网格员") != 0
|
|
|
+ && string.CompareOrdinal(d.Value, "工单标记") != 0).ToList();
|
|
|
+
|
|
|
dto.ExpiredTime = order.ExpiredTime;
|
|
|
dto.Content = order.Content;
|
|
|
var rsp = _mapper.Map<NextStepsWithOpinionDto<RecommendStepOption>>(dto);
|
|
|
- foreach (var step in rsp.Steps)
|
|
|
+ var org = await _organizeRepository.GetAsync(d => d.AreaCode == order.AreaCode, HttpContext.RequestAborted);
|
|
|
+ if (org != null)
|
|
|
{
|
|
|
- if (dto.CurrentStepBusinessType is not EBusinessType.Send ||
|
|
|
- step.BusinessType is not EBusinessType.Department) continue;
|
|
|
- var org = await _organizeRepository.GetAsync(d => d.AreaCode == order.AreaCode, HttpContext.RequestAborted);
|
|
|
- if (org is null) continue;
|
|
|
- step.RecommendOrgId = org.Id;
|
|
|
- step.RecommendOrgName = org.Name;
|
|
|
+ foreach (var step in rsp.Steps)
|
|
|
+ {
|
|
|
+ if (dto.CurrentStepBusinessType is not EBusinessType.Send ||
|
|
|
+ step.BusinessType is not EBusinessType.Department) continue;
|
|
|
+ step.RecommendOrgId = org.Id;
|
|
|
+ step.RecommendOrgName = org.Name;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
rsp.LeaderSMS = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.LeaderSMS)
|
|
@@ -5542,6 +5792,105 @@ public class OrderController : BaseController
|
|
|
return order.WorkflowTraces.Count(d => d.IsOrigin && d.BusinessType == EBusinessType.Seat);
|
|
|
}
|
|
|
|
|
|
+ #region 附件列表
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取工单所有文件
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("all_file/{id}")]
|
|
|
+ public async Task<List<FileDto>> GetOrderAllFile(string id)
|
|
|
+ {
|
|
|
+ var order = await _orderRepository.GetAsync(id);
|
|
|
+ var steps = await _workflowStepRepository.Queryable().Where(x => x.WorkflowId == order.WorkflowId).ToListAsync();
|
|
|
+ var allFiles = new List<FileDto>();
|
|
|
+ if (order != null && _sessionContext.OrgIsCenter)
|
|
|
+ {
|
|
|
+ if (order.FileJson != null)
|
|
|
+ {
|
|
|
+ var ids = order.FileJson.Select(x => x.Id).ToList();
|
|
|
+ allFiles = await _fileRepository.GetFilesAsync(ids, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ allFiles.ForEach(x => x.GetStepName("工单受理"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var step in steps)
|
|
|
+ {
|
|
|
+ if (step.FileJson != null && step.FileJson.Any())
|
|
|
+ {
|
|
|
+ var ids = step.FileJson.Select(x => x.Id).ToList();
|
|
|
+ var stepFiles = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
|
|
|
+ stepFiles.ForEach(x => x.GetStepName(step.Name));
|
|
|
+ allFiles.AddRange(stepFiles);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return allFiles;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取流程信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="workflowId"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("all_file/workflow/{workflowId}")]
|
|
|
+ public async Task<WorkflowDto> GetOrderWorkflowAsync(string workflowId)
|
|
|
+ {
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true,
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
+ var steps = _mapper.Map<List<WorkflowTraceDto>>(workflow.Steps);
|
|
|
+ if (!_sessionContext.OrgIsCenter)
|
|
|
+ {
|
|
|
+ steps = steps.Where(x => x.HandlerOrgId != null && x.HandlerOrgId.StartsWith(_sessionContext.RequiredOrgId)).ToList();
|
|
|
+ }
|
|
|
+ var workflowDto = _mapper.Map<WorkflowDto>(workflow);
|
|
|
+ workflowDto.Traces = steps;
|
|
|
+ foreach (var item in workflowDto.Traces)
|
|
|
+ {
|
|
|
+ if (item.FileJson != null)
|
|
|
+ {
|
|
|
+ var ids = item.FileJson.Select(x => x.Id).ToList();
|
|
|
+ item.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ item.Name = item.Name + "(" + item.HandlerOrgName + ")";
|
|
|
+ }
|
|
|
+ return workflowDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 附件列表补充附件
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dtos"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("list/file_upload")]
|
|
|
+ [LogFilter("附件列表补充附件")]
|
|
|
+
|
|
|
+ public async Task Add([FromBody] OrderStepUploadFilesDto dto)
|
|
|
+ {
|
|
|
+ var order = await _orderRepository.GetAsync(dto.OrderId);
|
|
|
+ var step = await _workflowStepRepository.GetAsync(dto.StepId);
|
|
|
+
|
|
|
+ var listFileJson = new List<FileJson>();
|
|
|
+ if (dto.Files.Any())
|
|
|
+ {
|
|
|
+ listFileJson = await _fileRepository.AddFileAsync(dto.Files, dto.StepId, "", HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ await _workflowStepRepository.Updateable().SetColumns(x => new WorkflowStep { FileJson = listFileJson }).Where(x => x.Id == dto.StepId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+ await _workflowTraceRepository.Updateable().SetColumns(x => new WorkflowTrace { FileJson = listFileJson }).Where(x => x.Id == dto.StepId).ExecuteCommandAsync(HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ ////附件上传后推送省上
|
|
|
+ var orderDto = _mapper.Map<OrderDto>(order);
|
|
|
+ var flowDto = new OrderFlowDto
|
|
|
+ {
|
|
|
+ Order = orderDto,
|
|
|
+ WorkflowTrace = _mapper.Map<WorkflowTraceDto>(step),
|
|
|
+ ExpiredTimeChanged = false,
|
|
|
+ HandlerOrgLevel = step.HandlerOrgId.CalcOrgLevel()
|
|
|
+ };
|
|
|
+ await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowFile, flowDto, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 工单待办
|