Преглед изворни кода

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf пре 1 година
родитељ
комит
53dfde2e25
32 измењених фајлова са 498 додато и 69 уклоњено
  1. 1 1
      src/Hotline.Api/Controllers/AiController.cs
  2. 1 1
      src/Hotline.Api/Controllers/ArticleController.cs
  3. 1 0
      src/Hotline.Api/Controllers/BaseController.cs
  4. 118 22
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  5. 32 7
      src/Hotline.Api/Controllers/OrderController.cs
  6. 25 1
      src/Hotline.Api/Controllers/OrgController.cs
  7. 23 1
      src/Hotline.Api/Controllers/RoleController.cs
  8. 1 0
      src/Hotline.Api/Controllers/UserController.cs
  9. 71 0
      src/Hotline.Api/Controllers/WorkflowController.cs
  10. 1 1
      src/Hotline.Api/config/appsettings.Development.json
  11. 1 1
      src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs
  12. 3 2
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  13. 1 1
      src/Hotline.Application/Subscribers/DatasharingSubscriber.cs
  14. 8 0
      src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs
  15. 49 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/QueryWorkflowCountersignDto.cs
  16. 3 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowCountersignDto.cs
  17. 11 1
      src/Hotline.Share/Dtos/Order/OrderBiDto.cs
  18. 4 2
      src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs
  19. 20 0
      src/Hotline.Share/Dtos/Order/OrderVisitDto.cs
  20. 7 1
      src/Hotline.Share/Dtos/Roles/RoleDto.cs
  21. 18 0
      src/Hotline.Share/Enums/User/ERoleType.cs
  22. 5 0
      src/Hotline.Share/Requests/DepartmentKeyWordRequest.cs
  23. 16 0
      src/Hotline.Share/Requests/PagedKeywordRequest.cs
  24. 3 2
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  25. 6 0
      src/Hotline/Identity/Roles/Role.cs
  26. 10 1
      src/Hotline/Orders/Order.cs
  27. 6 20
      src/Hotline/Orders/OrderDomainService.cs
  28. 3 2
      src/Hotline/Orders/OrderSpecial.cs
  29. 28 0
      src/Hotline/Orders/OrderSpecialDetail.cs
  30. 18 0
      src/Hotline/Orders/OrderVisitDetail.cs
  31. 2 0
      src/Hotline/Settings/ISystemOrganizeRepository.cs
  32. 2 1
      src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

+ 1 - 1
src/Hotline.Api/Controllers/AiController.cs

@@ -230,7 +230,7 @@ namespace Hotline.Api.Controllers
                                     VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
                                     VisitName = aiOrderVisitDetail.OrderVisit.CreatorName,
                                     VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
-                                    VisitRemark = visitContent,
+                                    VisitRemark = string.IsNullOrEmpty(visitContent)?aiOrderVisitDetail.OrderVisit.NowEvaluate?.Value: visitContent,
                                     AreaCode = aiOrderVisitDetail.OrderVisit.Order.AreaCode!,
                                     SubjectResultSatifyCode = orgProcessingResults.Key,
                                     FirstSatisfactionCode = aiOrderVisitDetail.OrderVisit.Order.FirstVisitResultCode!,

+ 1 - 1
src/Hotline.Api/Controllers/ArticleController.cs

@@ -394,7 +394,7 @@ namespace Hotline.Api.Controllers
         [HttpGet("megcount")]
         public async Task<CircularRecordDto> QueryMegCount()
         {
-            var list = await _circularRecordRepository.Queryable().Where(x => x.UserId == _sessionContext.UserId || x.OrgId == _sessionContext.OrgId).ToListAsync();
+            var list = await _circularRecordRepository.Queryable().Where(x => x.UserId == _sessionContext.RequiredUserId || x.OrgId == _sessionContext.RequiredOrgId).ToListAsync();
             if (list != null && list.Count > 0)
             {
                 var rsp = new CircularRecordDto();

+ 1 - 0
src/Hotline.Api/Controllers/BaseController.cs

@@ -7,6 +7,7 @@ namespace Hotline.Api.Controllers;
 [ApiController]
 [Produces("application/json")]
 [Route("api/v1/[controller]")]
+[LogFilter]
 public class BaseController : ControllerBase
 {
     

+ 118 - 22
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -11,7 +11,9 @@ using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
@@ -21,6 +23,7 @@ using XF.Domain.Authentications;
 using XF.Domain.Constants;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -41,9 +44,9 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
         private readonly ISessionContext _sessionContext;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
 
-
-        public BiOrderController(
+		public BiOrderController(
             IOrderRepository orderRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             ISystemDicDataCacheManager sysDicDataCacheManager,
@@ -58,8 +61,9 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<SystemOrganize> systemOrganizeRepository,
             IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
             ISessionContext sessionContext,
-            ISystemSettingCacheManager systemSettingCacheManager
-            )
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<OrderSpecialDetail> orderSpecialDetailRepository
+			)
         {
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -76,7 +80,9 @@ namespace Hotline.Api.Controllers.Bi
             _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
             _sessionContext = sessionContext;
             _systemSettingCacheManager = systemSettingCacheManager;
-        }
+            _orderSpecialDetailRepository = orderSpecialDetailRepository;
+
+		}
 
         //public async Task OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
         //{
@@ -534,9 +540,11 @@ namespace Hotline.Api.Controllers.Bi
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
             dto.PageIndex = 1;
             dto.PageSize = 10;
+            var IsCenter = _sessionContext.OrgIsCenter;
             var query = _orderRepository.Queryable(false, false, false)
                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(IsCenter == false, x => x.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
                 .Select(x => new
                 {
                     AcceptType = x.AcceptType,
@@ -742,16 +750,20 @@ namespace Hotline.Api.Controllers.Bi
 
             var list = await _orderVisitDetailRepository.Queryable()
                 .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
-                .WhereIF(!string.IsNullOrEmpty(OrgName), x => x.VisitOrgName.Contains(OrgName))
-                .WhereIF(!string.IsNullOrEmpty(LineNum), x => x.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
+                .WhereIF(string.IsNullOrEmpty(OrgName)==false, x => x.VisitOrgName.Contains(OrgName))
+                .WhereIF(string.IsNullOrEmpty(LineNum)==false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
                 .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
-                .GroupBy(x => new
+                .GroupByIF(IsCenter,x => new
                 {
                     VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
                 })
+                .GroupByIF(IsCenter == false, x => new
+                {
+                    VisitOrgCode = x.VisitOrgCode
+                })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
-                    OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    OrgCode = SqlFunc.IIF(IsCenter,x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")), x.VisitOrgCode),
                     TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
                     VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
                     SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
@@ -847,11 +859,11 @@ namespace Hotline.Api.Controllers.Bi
                 .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                  .GroupBy((x, it) => new
                  {
-                     VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))
+                     VisitOrgCode = it.VisitOrgCode
                  })
                  .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
                  {
-                     OrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9")),
+                     OrgCode = it.VisitOrgCode,
                      TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
                      VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
                      SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
@@ -1186,21 +1198,33 @@ namespace Hotline.Api.Controllers.Bi
             var IsCenter = _sessionContext.OrgIsCenter;
 
             var orderData = await _orderRepository.Queryable()
-              .LeftJoin<SystemOrganize>((it, o) => it.OrgLevelOneCode == o.Id)
-              .Where((it, o) => it.CreationTime >= StartDate && it.CreationTime <= EndDate && (int)it.Status >= 300)
-                .WhereIF(TypeCode == 1, (it, o) => it.OrgLevelOneCode == "001")
-                .WhereIF(TypeCode == 2, (it, o) => it.OrgLevelOneCode != "001")
-                .WhereIF(IsCenter == false, (it, o) => it.OrgLevelOneCode.StartsWith(_sessionContext.RequiredOrgId))
+              // .LeftJoin<SystemOrganize>((it, o) => it.OrgLevelOneCode == o.Id)
+              .Where(it => it.CreationTime >= StartDate && it.CreationTime <= EndDate && it.Status >= EOrderStatus.Filed)
+
+              .Select(it => new
+              {
+                  OrgCode = IsCenter == true ? it.OrgLevelOneCode  : it.ActualHandleOrgCode.Substring(0, _sessionContext.RequiredOrgId.Length + 3),
+                  it.AcceptTypeCode,
+                  it.FileDurationWorkday,
+                  it.AllDuration
+              })
+              .MergeTable()
+              .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+
+              .WhereIF(TypeCode == 1, (it, o) => it.OrgCode == "001")
+              .WhereIF(TypeCode == 2, (it, o) => it.OrgCode != "001")
+              .WhereIF(IsCenter == false, (it, o) => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
+
                .GroupBy((it, o) => new
                {
-                   it.OrgLevelOneCode,
+                   it.OrgCode,
                    o.Name,
                    o.OrgType
                })
                 .Select((it, o) => new DepartmentAcceptanceTypeStatisticsDto
                 {
-                    OrgName = it.OrgLevelOneCode == "001" ? "热线中心" : o.Name,
-                    OrgCode = it.OrgLevelOneCode,
+                    OrgName = it.OrgCode == "001" ? "热线中心" : o.Name,
+                    OrgCode = it.OrgCode,
                     OrgType = (int)o.OrgType == 2 ? "区县部门" : "市直部门",
                     ZxAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "10", 1, 0)),
                     ZxAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "10" && it.AllDuration != null, it.AllDuration, 0)),
@@ -1245,9 +1269,12 @@ namespace Hotline.Api.Controllers.Bi
         {
             dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
             var (total, items) = await _orderRepository.Queryable()
-                .Where(p => p.CreationTime >= dto.StartDate && p.CreationTime <= dto.EndDate && (int)p.Status >= 300)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneCode), p => p.OrgLevelOneCode == dto.OrgLevelOneCode)
+                .Where(p => p.CreationTime >= dto.StartDate && p.CreationTime <= dto.EndDate && p.Status >= EOrderStatus.Filed)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneCode) && dto.OrgLevelOneCode == "001", p => p.OrgLevelOneCode == dto.OrgLevelOneCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneCode) && dto.OrgLevelOneCode != "001", p => p.ActualHandleOrgCode.StartsWith(dto.OrgLevelOneCode))
                 .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
+                .WhereIF(dto.TypeCode == 1, p => p.OrgLevelOneCode == "001")
+                .WhereIF(dto.TypeCode == 2, p => p.OrgLevelOneCode != "001")
                 .OrderByDescending(d => d.CreationTime)
                 .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
@@ -1552,5 +1579,74 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
 
-    }
+		/// <summary>
+		/// 回退错件
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("reTransact")]
+		public async Task<PagedDto<OrderReTransactVo>> OrderReTransact([FromQuery] QueryOrderReTransactRequest dto) 
+        {
+			if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
+				throw UserFriendlyException.SameMessage("请选择时间!");
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			var (total, items) = await _orderSpecialDetailRepository.Queryable()
+                .Includes(x=>x.OrderSpecial)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
+				.Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+                .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+                .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
+                .GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
+                .Select(x => new OrderReTransactVo
+                {
+	                Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"),
+					OrgId = x.OrgId,
+                    OrgName = x.OrgName,
+                    Num = SqlFunc.AggregateCount(1)
+                }).MergeTable()
+				.OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
+                .OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc)
+                .ToPagedListAsync(dto, HttpContext.RequestAborted);
+            return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
+		}
+
+		/// <summary>
+		/// 回退错件明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("reTransact_detail")]
+		public async Task<PagedDto<OrderSpecialDetailDto>> OrderReTransactDetail([FromQuery] QueryOrderReTransactDetailRequest dto) 
+        {
+			if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
+				throw UserFriendlyException.SameMessage("请选择时间!");
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			var (total, items) = await _orderSpecialDetailRepository.Queryable()
+				.Includes(x => x.OrderSpecial,s=>s.Order)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName),x=>x.OrgName.Contains(dto.OrgName!))
+				.WhereIF(!string.IsNullOrEmpty(dto.ErrorName), x => x.ErrorName.Contains(dto.ErrorName!))
+				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderSpecial!.Order!.No!.Contains(dto.No!))
+				.Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+				.Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+				.Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
+				.ToPagedListAsync(dto, HttpContext.RequestAborted);
+			return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
+		}
+
+        /// <summary>
+        /// 获取基本信息
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+		[HttpGet("reTransact_base")]
+		public async Task<object> ReTransactBaseData()
+		{
+			var rsp = new
+			{
+				ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
+			};
+			return rsp;
+		}
+
+	}
 }

+ 32 - 7
src/Hotline.Api/Controllers/OrderController.cs

@@ -106,8 +106,9 @@ public class OrderController : BaseController
     private readonly IRepository<User> _userRepository;
     private readonly IExportApplication _exportApplication;
     private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
+    private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -156,8 +157,9 @@ public class OrderController : BaseController
         IRepository<OrderSendBackAudit> orderSendBackAuditRepository,
         IRepository<User> userRepository,
         IExportApplication exportApplication,
-        IRepository<TranspondCityRawData> transpondCityRawDataRepository
-        )
+        IRepository<TranspondCityRawData> transpondCityRawDataRepository,
+        IRepository<OrderSpecialDetail> orderSpecialDetailRepository
+		)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -208,7 +210,8 @@ public class OrderController : BaseController
         _userRepository = userRepository;
         _exportApplication = exportApplication;
         _transpondCityRawDataRepository = transpondCityRawDataRepository;
-    }
+        _orderSpecialDetailRepository = orderSpecialDetailRepository;
+	}
 
     #region 工单发布
 
@@ -771,7 +774,7 @@ public class OrderController : BaseController
                         VisitType = visit.VisitType,
                         VisitName = visit.CreatorName,
                         VisitTime = visit.VisitTime,
-                        VisitRemark = first.VisitContent,
+                        VisitRemark = string.IsNullOrEmpty(first.VisitContent)? first.OrgProcessingResults?.Value:first.VisitContent,
                         AreaCode = visit.Order.AreaCode!,
                         SubjectResultSatifyCode = first.OrgProcessingResults.Key,
                         FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
@@ -1679,6 +1682,10 @@ public class OrderController : BaseController
             ScreenStatus = EnumExts.GetDescriptions<EScreenStatus>(),
             ScreenType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ScreenType),
             CounterSignType = EnumExts.GetDescriptions<ECounterSignType>(),
+            AcceptType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
+            SourceChannel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel),
+            VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction),
+            DissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason),
 		};
         return rsp;
     }
@@ -2611,8 +2618,14 @@ public class OrderController : BaseController
             //写入质检
             await _qualityApplication.AddQualityAsync(EQualitySource.Send, order.Id, HttpContext.RequestAborted);
         }
+        else if (dto.FlowDirection is EFlowDirection.CenterToCenter)
+        {
+	        expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.AcceptTypeCode);
+	        order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
+		        expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime);
+        }
 
-        _mapper.Map(expiredTimeConfig, order);
+		_mapper.Map(expiredTimeConfig, order);
         await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
         var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
 		// 平均派单
@@ -3370,7 +3383,19 @@ public class OrderController : BaseController
 		if (dto.Files.Any())
 			model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", HttpContext.RequestAborted);
 		await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
-		if (model.State == 1)
+        if (dto.ReTransactError.Any()) {
+            List<OrderSpecialDetail> details = new();
+			foreach (var item in dto.ReTransactError)
+	        {
+                var detail = new OrderSpecialDetail();
+                _mapper.Map(item, detail);
+                detail.SpecialId = model.Id;
+				details.Add(detail);
+			}
+            await  _orderSpecialDetailRepository.AddRangeAsync(details, HttpContext.RequestAborted);
+		}
+
+        if (model.State == 1)
 		{
 			var recall = new RecallDto
 			{

+ 25 - 1
src/Hotline.Api/Controllers/OrgController.cs

@@ -6,6 +6,7 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Threading.Channels;
+using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Utility.EnumExtensions;
 
@@ -20,17 +21,21 @@ namespace Hotline.Api.Controllers
         private readonly ISystemDomainService _systemDomainService;
         private readonly ISystemAreaDomainService _areaDomainService;
         private readonly IMapper _mapper;
+        private readonly ISessionContext _sessionContext;
+
 
         public OrgController(
             ISystemOrganizeRepository systemOrganizeRepository,
             ISystemDomainService systemDomainService,
             ISystemAreaDomainService areaDomainService,
-            IMapper mapper)
+            IMapper mapper,
+            ISessionContext sessionContext)
         {
             _systemOrganizeRepository = systemOrganizeRepository;
             _systemDomainService = systemDomainService;
             _areaDomainService = areaDomainService;
             _mapper = mapper;
+            _sessionContext = sessionContext;
         }
 
         /// <summary>
@@ -160,6 +165,25 @@ namespace Hotline.Api.Controllers
             return await _systemOrganizeRepository.GetCanUseOrg();
         }
 
+
+        /// <summary>
+        /// 获取可用组织架构树形(用户管理)
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("getcanuseorgforuser")]
+        public async Task<IReadOnlyList<SystemOrganize>> GetCanUseOrgForUser()
+        {
+            if (_sessionContext.OrgIsCenter)
+            {
+                return await _systemOrganizeRepository.GetCanUseOrg();
+            }
+            else
+            {
+                return await _systemOrganizeRepository.GetCanUseOrgByOrgCode(_sessionContext.RequiredOrgId);
+            }
+        }
+
+
         /// <summary>
         /// 新增页面基础数据
         /// </summary>

+ 23 - 1
src/Hotline.Api/Controllers/RoleController.cs

@@ -9,11 +9,14 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Roles;
 using Hotline.Share.Enums.Identity;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Enums.User;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using SqlSugar;
+using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Options;
 using XF.Domain.Repository;
@@ -35,6 +38,7 @@ public class RoleController : BaseController
     private readonly IRolePermissionsCacheManager _rolePermissionsCacheManager;
     private readonly IOptions<IdentityConfiguration> _identityConfigurationAccessor;
     private readonly IRepository<SystemDataTable> _systemDataTableRepository;
+    private readonly ISessionContext _sessionContext;
 
     public RoleController(
         IRepository<Role> roleRepository,
@@ -45,7 +49,8 @@ public class RoleController : BaseController
         IRolePermissionsCacheManager rolePermissionsCacheManager,
         IMapper mapper,
         IOptions<IdentityConfiguration> identityConfigurationAccessor,
-        IRepository<SystemDataTable> systemDataTableRepository)
+        IRepository<SystemDataTable> systemDataTableRepository,
+        ISessionContext sessionContext)
     {
         _roleRepository = roleRepository;
         _systemAuthorityRepository = systemAuthorityRepository;
@@ -56,6 +61,7 @@ public class RoleController : BaseController
         _mapper = mapper;
         _identityConfigurationAccessor = identityConfigurationAccessor;
         _systemDataTableRepository = systemDataTableRepository;
+        _sessionContext = sessionContext;
     }
 
     /// <summary>
@@ -73,6 +79,7 @@ public class RoleController : BaseController
         var (total, items) = await query
             .Includes(d => d.Accounts.Where(x => !x.IsDeleted && x.Status == EAccountStatus.Normal).ToList())
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Name.Contains(dto.Keyword!) || d.DisplayName.Contains(dto.Keyword!))
+            .WhereIF(_sessionContext.OrgIsCenter==false,d=>d.RoleType == ERoleType.OrgRole)
             .Where(x=>x.Id != RoleSeedData.AdminId)
             .OrderBy(d => d.IsDeleted)
             .OrderByDescending(d => d.CreationTime)
@@ -147,6 +154,21 @@ public class RoleController : BaseController
         await _roleRepository.UpdateAsync(role, HttpContext.RequestAborted);
     }
 
+
+    /// <summary>
+    /// 角色基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("role/basedata")]
+    public object RoleBaseData()
+    {
+        return new
+        {
+            RoleType = EnumExts.GetDescriptions<ERoleType>(),
+        };
+    }
+
+
     #region 应用权限管理
 
     /// <summary>

+ 1 - 0
src/Hotline.Api/Controllers/UserController.cs

@@ -157,6 +157,7 @@ public class UserController : BaseController
              .Includes(d => d.Roles)
              .Includes(d => d.Organization)
              .Where(d => d.Account.AccountType == EAccountType.Personal && d.Id != SysAccountSeedData.Id)
+             .WhereIF(_sessionContext.OrgIsCenter==false,d=>d.OrgId.StartsWith(_sessionContext.RequiredOrgId))
              .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                  d => d.Name.Contains(dto.Keyword!) || d.PhoneNo.Contains(dto.Keyword!) || d.Account.UserName.Contains(dto.Keyword))
              .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => d.OrgId == dto.OrgCode)

+ 71 - 0
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -24,6 +24,7 @@ using Hotline.File;
 using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.FlowEngine.Definition;
+using Microsoft.AspNetCore.Authorization;
 
 namespace Hotline.Api.Controllers;
 
@@ -541,12 +542,82 @@ public class WorkflowController : BaseController
             return dto;
         }).ToList();
 
+        return new PagedDto<WorkflowCountersignDto>(total, dtos);
+    }
 
 
 
+    /// <summary>
+    /// 查询会签信息
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("order-countersign")]
+    [AllowAnonymous]
+    public async Task<PagedDto<WorkflowCountersignDto>> QueryOrderCountersigns([FromQuery] QueryOrderCountersignDto dto)
+    {
+        RefAsync<int> total = 0;
 
+        var Role = _sessionContext.Roles;
 
+        var query = _workflowCountersignRepository.Queryable()
+            .Includes(x => x.Members)
+            .LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
+            .InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
+            .WhereIF(!_sessionContext.OrgIsCenter, (c, w, o) => c.Members.Any(m => m.Key == _sessionContext.OrgId))
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), (c, w, o) => o.Title.Contains(dto.Title))
+            .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (c, w, o) => o.No.Contains(dto.OrderNo))
+            .WhereIF(dto.AcceptTypes.Any(), (c, w, o) => dto.AcceptTypes.Contains(o.AcceptTypeCode)) //受理类型
+            .WhereIF(dto.Channels.Any(), (c, w, o) => dto.Channels.Contains(o.SourceChannelCode)) //来源渠道
+            .WhereIF(dto.HotspotIds.Any(), (c, w, o) => dto.HotspotIds.Contains(o.HotspotId)) //热点类型
+            .WhereIF(dto.OrgCodes.Any(), (c, w, o) => dto.OrgCodes.Contains(c.FinisherOrgAreaCode)) //接办部门
+            .WhereIF(dto.CounterSignType != null, (c, w, o) => c.CounterSignType == dto.CounterSignType) //会签类型
+
+        ;
+
+        //发起会签:班长角色能看所有会签信件;
+        //派单员角色只能看到自己发起的会签信件;
+        //承办部门用户能看到自己发起的和同级部门用户发起的会签件
+        if (dto.InitiatedCountersignature.HasValue && dto.InitiatedCountersignature == true)
+        {
+            if (_sessionContext.Roles.Select(p => "banzhang") != null)
+            {
+
+            }
+            else
+            if (_sessionContext.Roles.Select(p => "paidanyuan") != null)
+            {
+
+            }
+            else
+            {
+
+            }
+        }
 
+        //会签已办(会签状态为已结束):
+        //班长角色能看所有已结束的会签信件;
+        //派单员不会办理会签件只会发起会签件所以这一点派单员角色可以忽略;
+        //承办部门用户能看到和同级部门用户已办理过的会签件
+        if (dto.HandleCountersignature.HasValue && dto.HandleCountersignature == true)
+        {
+
+        }
+
+        //if (dto.IsOnlyStarter)
+        //    query = query.Where((c, w, o) => c.StarterId == _sessionContext.RequiredUserId);
+
+        var items = await query
+            .OrderByDescending((c, w, o) => o.ExpiredTime)
+            .Select((c, w, o) => new { c, o })
+            .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+        var dtos = items.Select(d =>
+        {
+            var dto = _mapper.Map<WorkflowCountersignDto>(d.c);
+            dto.Order = _mapper.Map<OrderDto>(d.o);
+            return dto;
+        }).ToList();
 
         return new PagedDto<WorkflowCountersignDto>(total, dtos);
     }

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -60,7 +60,7 @@
     }
   },
   "DatabaseConfiguration": {
-    "ApplyDbMigrations": false,
+    "ApplyDbMigrations": true,
     "ApplySeed": false
   },
   "MqConfiguration": {

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -208,7 +208,7 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                                           VisitType = visit.VisitType,
                                           VisitName = visit.CreatorName,
                                           VisitTime = visit.VisitTime,
-                                          VisitRemark = visitDe.VisitContent,
+                                          VisitRemark = string.IsNullOrEmpty(visitDe.VisitContent)? screenSatisfy.Value: visitDe.VisitContent,
                                           AreaCode = visit.Order.AreaCode!,
                                           SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
                                           FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,

+ 3 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -11,6 +11,8 @@ using Hotline.Settings;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Mq;
@@ -141,8 +143,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 
                 //    expiredTimeChanged = true;
                 //}
-
-                await _orderRepository.UpdateAsync(order, cancellationToken);
+				await _orderRepository.UpdateAsync(order, cancellationToken);
                 try
                 {
                     if (notification.Dto.IsSms)

+ 1 - 1
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -356,7 +356,7 @@ namespace Hotline.Application.Subscribers
                                 VisitType = visit.VisitType,
                                 VisitName = visit.CreatorName,
                                 VisitTime = visit.VisitTime,
-                                VisitRemark = first.VisitContent,
+                                VisitRemark = string.IsNullOrEmpty(first.VisitContent)? first.OrgProcessingResults?.Value: first.VisitContent,
                                 AreaCode = visit.Order.AreaCode!,
                                 SubjectResultSatifyCode = first.OrgProcessingResults.Key,
                                 FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,

+ 8 - 0
src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs

@@ -29,6 +29,14 @@ namespace Hotline.Repository.SqlSugar.System
             return list;
         }
 
+        public async Task<IReadOnlyList<SystemOrganize>> GetCanUseOrgByOrgCode(string orgCode)
+        {
+            var list = await Db.Queryable<SystemOrganize>()
+                .Where(x => x.IsEnable && x.Id.StartsWith(orgCode))
+                .ToTreeAsync(x => x.Children, it => it.ParentId, null);
+            return list;
+        }
+
         //public async Task<string> GetNewOrgCode(string parentId)
         //{
         //    //查是否存在下级

+ 49 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/QueryWorkflowCountersignDto.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.FlowEngine.Workflow
@@ -13,4 +14,52 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
     /// <param name="IsOnlyStarter">根据发起人过滤会签信息</param>
     /// <param name="IsProvince"></param>
     public record QueryWorkflowCountersignDto(bool IsOnlyStarter, bool? IsProvince) : PagedKeywordRequest;
+
+    public record QueryOrderCountersignDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 发起的会签
+        /// </summary>
+        public bool? InitiatedCountersignature { get; set; }
+
+        /// <summary>
+        /// 会签已办
+        /// </summary>
+        public bool? HandleCountersignature { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 工单编码
+        /// </summary>
+        public string? OrderNo { get; set; }
+
+        /// <summary>
+        /// 受理类型(√)
+        /// </summary>
+        public List<string> AcceptTypes { get; set; } = new();
+
+        /// <summary>
+        /// 来源渠道(√)
+        /// </summary>
+        public List<string> Channels { get; set; } = new();
+
+        /// <summary>
+        /// 会签类型
+        /// </summary>
+        public ECounterSignType? CounterSignType { get; set; }
+
+        /// <summary>
+        /// 接办部门(√)
+        /// </summary>
+        public List<string> OrgCodes { get; set; } = new();
+
+        /// <summary>
+        /// 热点分类(√)
+        /// </summary>
+        public List<string> HotspotIds { get; set; } = new();
+    }
 }

+ 3 - 1
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowCountersignDto.cs

@@ -120,6 +120,8 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         /// </summary>
         public DateTime StartExpiredTime { get; set; }
 
-        public OrderDto Order{ get; set; }
+        public OrderDto Order { get; set; }
+
+        public string? StateText => EndTime.HasValue ? "已结束" : "未结束";
     }
 }

+ 11 - 1
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -454,5 +454,15 @@ namespace Hotline.Share.Dtos.Order
 
 	public class BiOrderSendDto { 
 	
-	} 
+	}
+
+	public class OrderReTransactVo
+	{
+		public string Time { get; set; }
+		public string OrgName { get; set; }
+
+		public string OrgId { get; set; }
+
+		public int Num { get; set; }
+	}
 }

+ 4 - 2
src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs

@@ -414,10 +414,10 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 错件类型
 		/// </summary>
-		public List<ReTransactError> ReTransactError { get; set; }
+		public List<OrderSpecialDetailDto> ReTransactError { get; set; }
 	}
 
-	public class ReTransactError
+	public class OrderSpecialDetailDto
 	{
 
 		public string OrgId { get; set; }
@@ -427,5 +427,7 @@ namespace Hotline.Share.Dtos.Order
 		public string ErrorId { get; set; }
 
 		public string ErrorName { get; set; }
+
+		public OrderSpecialDto OrderSpecial { get; set; }
 	}
 }

+ 20 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -109,6 +109,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public Kv? OrgHandledAttitude { get; set; }
 
+        /// <summary>
+        /// 是否联系
+        /// </summary>
+        public bool? IsContact { get; set; }
+
+        /// <summary>
+        /// 处理结果
+        /// </summary>
+        public bool? Volved { get; set; }
+
         /// <summary>
         /// 回访内容
         /// </summary>
@@ -379,6 +389,16 @@ namespace Hotline.Share.Dtos.Order
 
         public string? SeatEvaluateText => SeatEvaluate?.GetDescription();
 
+        /// <summary>
+        /// 是否联系
+        /// </summary>
+        public bool? IsContact { get; set; }
+
+        /// <summary>
+        /// 处理结果
+        /// </summary>
+        public bool? Volved { get; set; }
+
         /// <summary>
         /// 部门办件结果
         /// </summary>

+ 7 - 1
src/Hotline.Share/Dtos/Roles/RoleDto.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Dtos.Roles
+using Hotline.Share.Enums.User;
+
+namespace Hotline.Share.Dtos.Roles
 {
     public class RoleDto : AddRoleDto
     {
@@ -26,6 +28,8 @@
         public string DisplayName { get; set; }
 
         public string? Description { get; set; }
+
+        public ERoleType RoleType { get; set; }
     }
 
     public class UpdateRoleDto
@@ -35,5 +39,7 @@
         public string DisplayName { get; set; }
 
         public string? Description { get; set; }
+
+        public ERoleType RoleType { get; set; }
     }
 }

+ 18 - 0
src/Hotline.Share/Enums/User/ERoleType.cs

@@ -0,0 +1,18 @@
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.User
+{
+    public enum ERoleType
+    {
+        /// <summary>
+        /// 中心角色
+        /// </summary>
+        [Description("中心角色")]
+        CenterRole = 1,
+        /// <summary>
+        /// 部门角色
+        /// </summary>
+        [Description("部门角色")]
+        OrgRole = 2,
+    }
+}

+ 5 - 0
src/Hotline.Share/Requests/DepartmentKeyWordRequest.cs

@@ -21,5 +21,10 @@
         /// 受理类型编码
         /// </summary>
         public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 0:全部,1:中心,2:部门
+        /// </summary>
+        public int TypeCode { get; set; }
     }
 }

+ 16 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -134,4 +134,20 @@ public record BiQueryVisitNoSatisfiedDetailDto: ReportPagedRequest
 public record QueryOrderDelayDataListRequest:ReportPagedRequest 
 { 
 	public string? OrgName { get; set; }
+}
+
+public record QueryOrderReTransactRequest : ReportPagedRequest
+{
+	public string? OrgName { get; set; }
+
+}
+
+public record QueryOrderReTransactDetailRequest : ReportPagedRequest
+{
+	public string? OrgName { get; set; }
+
+	public string? ErrorName { get; set; }
+
+	public string? No { get; set; }
+
 }

+ 3 - 2
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -692,12 +692,13 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<ICollection<Kv>> GetLevelOneOrgsAsync(string workflowId, CancellationToken cancellation)
         {
             var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
-            return workflow.Steps.Where(d => d.BusinessType == EBusinessType.Department &&
+            var list = workflow.Steps.Distinct().Where(d => d.BusinessType == EBusinessType.Department &&
                                              d.HandlerType == EHandlerType.OrgLevel &&
                                              d.StepHandlers.Any(d =>
                                                  !string.IsNullOrEmpty(d.OrgId) && d.OrgId.CheckIfOrgLevelIs(1)))
                 .Select(d => new Kv(d.StepHandlers.First().OrgId, d.StepHandlers.First().OrgName))
-                .ToList();
+				.ToList();
+            return list.Where((x, i) => list.FindIndex(z => z.Key == x.Key) == i).ToList();
         }
 
         /// <summary>

+ 6 - 0
src/Hotline/Identity/Roles/Role.cs

@@ -1,4 +1,5 @@
 using Hotline.Identity.Accounts;
+using Hotline.Share.Enums.User;
 using SqlSugar;
 using XF.Domain.Repository;
 
@@ -21,5 +22,10 @@ namespace Hotline.Identity.Roles
 
         [Navigate(typeof(AccountRole), nameof(AccountRole.RoleId), nameof(AccountRole.AccountId))]
         public List<Account> Accounts { get; set; }
+
+        /// <summary>
+        /// 角色类型
+        /// </summary>
+        public ERoleType? RoleType { get; set; }
     }
 }

+ 10 - 1
src/Hotline/Orders/Order.cs

@@ -872,7 +872,16 @@ namespace Hotline.Orders
             CenterToOrgTime = null;
         }
 
-        public void SetHandleDuration()
+        public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
+        {
+	        TimeLimit = timelimit;
+	        TimeLimitCount = timelimitCount;
+	        TimeLimitUnit = timilimitUnit;
+	        ExpiredTime = expiredTime;
+	        NearlyExpiredTime = nearlyExpiredTime;
+        }
+
+		public void SetHandleDuration()
         {
             if (!ActualHandleTime.HasValue) return;
             if (!CenterToOrgTime.HasValue) return;

+ 6 - 20
src/Hotline/Orders/OrderDomainService.cs

@@ -197,23 +197,6 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         scheduling.SendOrderNum++;
         await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
         return new List<Kv> { new(user.Id, user.Name) };
-
-
-        //var user = await _userRepository.Queryable(includeDeleted: true).Where(x => x.Id == OrderDefaults.SourceChannel.SendPoolId).FirstAsync(cancellationToken);
-        //DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
-        ////根据当前时间获取排班信息
-        //var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
-        //    .Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.AtWork == true)
-        //    .OrderBy(x => x.SendOrderNum).FirstAsync(cancellationToken);
-        //if (scheduling != null)
-        //{
-        //    user = await _userRepository.GetAsync(x => x.Id == scheduling.SchedulingUser.UserId, cancellationToken);
-        //    scheduling.SendOrderNum++;
-        //    await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
-        //}
-        //List<Kv> res = new List<Kv>();
-        //res.Add(new Kv { Key = user.Id, Value = user.Name });
-        //return res;
     }
 
     /// <summary>
@@ -244,7 +227,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             {
                 stepIds.Add(stepsList[0]);
                 stepsList.Remove(stepsList[0]);
-            }
+			}
             List<(string, string, string, string, IReadOnlyList<string> stepIds)> handlers = new();
             ; handlers.Add(new ValueTuple<string, string, string, string, IReadOnlyList<string>>(user.Id, user.Name, user.OrgId, user.Organization.Name, stepIds));
             var workflowIds = await _workflowDomainService.ChangeHandlerRangeAsync(OrderDefaults.SourceChannel.SendPoolId, handlers, cancellationToken);
@@ -254,8 +237,11 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             {
                 _mapper.Map(order.Workflow, order);
             }
-
-            await _orderRepository.UpdateRangeAsync(orders, cancellationToken);
+            var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
+	            .Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.SchedulingUser.UserId == userId).FirstAsync(cancellationToken);
+            scheduling.SendOrderNum += sendNum;
+            await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
+			await _orderRepository.UpdateRangeAsync(orders, cancellationToken);
         }
     }
 

+ 3 - 2
src/Hotline/Orders/OrderSpecial.cs

@@ -96,8 +96,9 @@ namespace Hotline.Orders
 		/// <summary>
 		/// 错件类型
 		/// </summary>
-		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<ReTransactError> ReTransactError { get; set; }
+		//[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+		[Navigate(NavigateType.OneToMany, nameof(OrderSpecialDetail.SpecialId))]
+		public List<OrderSpecialDetail> ReTransactError { get; set; }
 
 
 	}

+ 28 - 0
src/Hotline/Orders/OrderSpecialDetail.cs

@@ -0,0 +1,28 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+	public class OrderSpecialDetail : FullStateEntity
+	{
+		/// <summary>
+		/// 特提Id
+		/// </summary>
+		public string SpecialId { get; set; }
+		public string OrgId { get; set; }
+
+		public string OrgName { get; set; }
+
+		public string ErrorId { get; set; }
+
+		public string ErrorName { get; set; }
+
+		[Navigate(NavigateType.ManyToOne, nameof(SpecialId))]
+		public OrderSpecial OrderSpecial { get; set; }
+	}
+}

+ 18 - 0
src/Hotline/Orders/OrderVisitDetail.cs

@@ -28,6 +28,24 @@ namespace Hotline.Orders
         /// </summary>
         public ESeatEvaluate? SeatEvaluate { get; set; }
 
+        ///// <summary>
+        ///// 是否联系
+        ///// </summary>
+        //public bool? IsContact { get; set; }
+
+        ///// <summary>
+        ///// 处理结果
+        ///// </summary>
+        //public bool? Volved { get; set; }
+
+        ///// <summary>
+        ///// 未处理内容
+        ///// </summary>
+        //public string? VolveConent { get; set; }
+
+        //public string? RecordUrl { get; set; }
+
+
         /// <summary>
         /// 部门办件结果
         /// </summary>

+ 2 - 0
src/Hotline/Settings/ISystemOrganizeRepository.cs

@@ -9,6 +9,8 @@ namespace Hotline.Settings
 
         Task<IReadOnlyList<SystemOrganize>> GetCanUseOrg();
 
+        Task<IReadOnlyList<SystemOrganize>> GetCanUseOrgByOrgCode(string orgCode);
+
         //Task<string> GetNewOrgCode(string? parentId);
     }
 }

+ 2 - 1
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -139,7 +139,8 @@ namespace Hotline.Settings.TimeLimits
             {
                 EFlowDirection.CenterToOrg => GetOrderTimeLimitConfig(acceptTypeCode),
                 EFlowDirection.OrgToCenter => GetOrderTimeLimitConfig(),
-                _ => throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null)
+                EFlowDirection.CenterToCenter => new TimeConfig(1, ETimeType.WorkDay),
+				_ => throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null)
             };
 
             return CalcEndTime(beginTime, timeConfig, acceptTypeCode);