xf 4 months ago
parent
commit
4b3c515c2b
50 changed files with 959 additions and 574 deletions
  1. 0 11
      src/Hotline.Api/Controllers/ArticleController.cs
  2. 1 1
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  3. 3 0
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  4. 0 3
      src/Hotline.Api/Controllers/CalloldController.cs
  5. 54 2
      src/Hotline.Api/Controllers/IPPbxController.cs
  6. 0 5
      src/Hotline.Api/Controllers/KnowledgeCommonController.cs
  7. 0 27
      src/Hotline.Api/Controllers/KnowledgeController.cs
  8. 163 97
      src/Hotline.Api/Controllers/OrderController.cs
  9. 50 0
      src/Hotline.Api/Controllers/OrderModuleControllers/OrderCarbonCopyController.cs
  10. 1 1
      src/Hotline.Api/Controllers/OrderModuleControllers/OrderComplementController.cs
  11. 0 1
      src/Hotline.Api/Controllers/OrderTerminateController.cs
  12. 0 6
      src/Hotline.Api/Controllers/OrgController.cs
  13. 0 17
      src/Hotline.Api/Controllers/QualityController.cs
  14. 0 4
      src/Hotline.Api/Controllers/RoleController.cs
  15. 0 11
      src/Hotline.Api/Controllers/SettingController.cs
  16. 0 5
      src/Hotline.Api/Controllers/SysController.cs
  17. 0 3
      src/Hotline.Api/Controllers/UserController.cs
  18. 0 7
      src/Hotline.Api/Controllers/WorkflowController.cs
  19. 0 4
      src/Hotline.Api/Hotline.Api.csproj
  20. 1 1
      src/Hotline.Api/StartupExtensions.cs
  21. 12 0
      src/Hotline.Application/Knowledge/KnowApplication.cs
  22. 28 12
      src/Hotline.Application/Mappers/OrderMapperConfigs.cs
  23. 106 75
      src/Hotline.Application/Orders/OrderApplication.cs
  24. 2 2
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs
  25. 10 0
      src/Hotline.Application/StatisticalReport/CallReport/CallReportApplicationBase.cs
  26. 9 0
      src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs
  27. 6 1
      src/Hotline.Application/StatisticalReport/ICallReportApplication.cs
  28. 2 1
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  29. 35 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/StepBasicDto.cs
  30. 130 90
      src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs
  31. 15 1
      src/Hotline.Share/Dtos/Order/Detail/OrderFlowTraceDto.cs
  32. 31 6
      src/Hotline.Share/Dtos/Order/OrderDto.cs
  33. 21 1
      src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs
  34. 5 0
      src/Hotline.Share/Dtos/Order/OrderVisitDto.cs
  35. 134 115
      src/Hotline.Share/Dtos/Order/Publish/QueryOrderPublishDto.cs
  36. 6 0
      src/Hotline.Share/Dtos/Order/QueryOrderDto.cs
  37. 1 1
      src/Hotline.Share/Dtos/Org/OrgDto.cs
  38. 6 1
      src/Hotline.Share/Enums/FlowEngine/EReviewResult.cs
  39. 9 0
      src/Hotline.Share/Enums/Order/EVisitType.cs
  40. 6 0
      src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs
  41. 4 3
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  42. 7 0
      src/Hotline/Orders/Order.cs
  43. 27 0
      src/Hotline/Orders/OrderCarboncopy.cs
  44. 40 37
      src/Hotline/Orders/OrderDomainService.cs
  45. 6 0
      src/Hotline/Settings/SettingConstants.cs
  46. 5 5
      src/Hotline/Statistics/StatisticsDepart.cs
  47. 5 5
      src/Hotline/Statistics/StatisticsDepartSatisfied.cs
  48. 5 5
      src/Hotline/Statistics/StatisticsHotspotSatisfied.cs
  49. 5 5
      src/Hotline/Statistics/StatisticsPurTypeSatisfied.cs
  50. 8 2
      src/Hotline/dataview.md

+ 0 - 11
src/Hotline.Api/Controllers/ArticleController.cs

@@ -118,7 +118,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.QueryCircularList)]
         [HttpGet("circular/query")]
         public async Task<PagedDto<CircularDto>> QueryCircularList([FromQuery] QueryCircularListRequestDto dto)
         {
@@ -155,7 +154,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.ExamineCircular)]
         [HttpPost("circular/examine")]
         public async Task ExamineCircular([FromBody] ExamineCircularDto dto)
         {
@@ -217,7 +215,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        [Permission(EPermission.CommitCircular)]
         [HttpGet("circular/commit/{id}")]
         public async Task CommitCircular(string id)
         {
@@ -238,7 +235,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateCircular)]
         [HttpPost("circular/update")]
         public async Task UpdateCircular([FromBody] UpdateCircularDto dto)
         {
@@ -280,7 +276,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        [Permission(EPermission.DelCircular)]
         [HttpGet("circular/del/{id}")]
         public async Task DelCircular(string id)
         {
@@ -300,7 +295,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddCircular)]
         [HttpPost("circular/add")]
         public async Task AddCircular([FromBody] AddCircularDto dto)
         {
@@ -475,7 +469,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.ExamineBulletin)]
         [HttpPost("bulletin/examine")]
         public async Task ExamineBulletin([FromBody] ExamineBulletinDto dto)
         {
@@ -515,7 +508,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        [Permission(EPermission.CommitBulletin)]
         [HttpGet("bulletin/commit")]
         public async Task CommitBulletin(string id)
         {
@@ -536,7 +528,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateBulletin)]
         [HttpPost("bulletin/update")]
         public async Task UpdateBulletin([FromBody] UpdateBulletinDto dto)
         {
@@ -564,7 +555,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        [Permission(EPermission.DelBulletin)]
         [HttpGet("bulletin/del/{id}")]
         public async Task DelBulletin(string id)
         {
@@ -584,7 +574,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddBulletin)]
         [HttpPost("bulletin/add")]
         public async Task AddBulletin([FromBody] AddBulletinDto dto)
         {

+ 1 - 1
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -636,7 +636,7 @@ public class BiCallController : BaseController
     [HttpGet("query-callout-date-statistics")]
     public async Task<object> QueryCallOutDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto)
     {
-        //var list = await _callReportApplication.QueryCallOutDateStatisticsDetail(dto);
+        var list = await _callReportApplication.QueryCallOutDateStatisticsDetail(dto);
         //return new { List = null, Total = null };
         return null;
 

+ 3 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -3858,6 +3858,8 @@ namespace Hotline.Api.Controllers.Bi
             else
                 items = await _systemOrganizeRepository.GetOrgJsonForUser(_sessionContext.RequiredOrgId); ;
 
+            var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
+            var definition = wfModule.Definition;
             return new Dictionary<string, dynamic>
             {
                 { "visitSatisfaction", _systemDicDataCacheManager.GetVisitSatisfaction() },
@@ -3867,6 +3869,7 @@ namespace Hotline.Api.Controllers.Bi
                 { "channelOptions",_sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel) },
                 { "acceptTypeOptions",_sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType)},
                 { "orderStatusOptions", EnumExts.GetDescriptions<EOrderStatus>()},
+                { "currentStepOptions",definition?.Steps.Select(x => new Kv(x.Code, x.Name))}
             };
         }
 

+ 0 - 3
src/Hotline.Api/Controllers/CalloldController.cs

@@ -175,7 +175,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddBlackList)]
         [HttpPost("blacklist")]
         public async Task AddBlacklist([FromBody] AddBlacklistDto dto)
         {
@@ -186,7 +185,6 @@ namespace Hotline.Api.Controllers
         /// 删除黑名单数据
         /// </summary>
         /// <param name="phone"></param>
-        [Permission(EPermission.RemoveBlacklist)]
         [HttpDelete("blacklist/{phone}")]
         public void RemoveBlacklist(string phone)
         {
@@ -198,7 +196,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.QueryPagedBlack)]
         [HttpGet("blacklist/paged")]
         public async Task<PagedDto<Blacklist>> QueryPaged([FromQuery] BlacklistPagedDto dto)
         {

+ 54 - 2
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -43,6 +43,7 @@ using Hotline.Repository.SqlSugar.CallCenter;
 using SqlSugar;
 using Hotline.Tools;
 using Hotline.Api.Filter;
+using XF.Domain.Cache;
 
 namespace Hotline.Api.Controllers
 {
@@ -69,7 +70,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<QualityTemplate> _qualityTemplate;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<TelActionRecord> _telActionRecordRepository;
-        
+        private readonly ITypedCache<Work> _cacheWork;
         private readonly ISystemMobilAreaApplication _systemMobilAreaApplication;
         private readonly IRepository<Work> _workRepository;
         private readonly Publisher _publisher;
@@ -85,7 +86,7 @@ namespace Hotline.Api.Controllers
             ITelApplication telApplication, IRepository<Quality.Quality> qualiteyRepository,
             IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate,
             ISystemSettingCacheManager systemSettingCacheManager, IRepository<TelActionRecord> telActionRecordRepository,
-            ISystemMobilAreaApplication systemMobilAreaApplication, IRepository<Work> workRepository, Publisher publisher, ITrCallRecordRepository callRecordRepository)
+            ISystemMobilAreaApplication systemMobilAreaApplication, IRepository<Work> workRepository, Publisher publisher, ITrCallRecordRepository callRecordRepository, ITypedCache<Work> cacheWork)
         {
             _trClient = trClient;
             _mapper = mapper;
@@ -112,6 +113,7 @@ namespace Hotline.Api.Controllers
             _workRepository = workRepository;
             _publisher = publisher;
             _callRecordRepository = callRecordRepository;
+            _cacheWork = cacheWork;
         }
 
         #region 添添呼
@@ -885,6 +887,56 @@ namespace Hotline.Api.Controllers
 
         #endregion
 
+        #region 话机状态
+
+        /// <summary>
+        /// 重置话机状态
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("tels-status-refreshservice")]
+        [AllowAnonymous]
+        public async Task TelsStatusRefreshService()
+        {
+            try
+            {
+                var list = await _workRepository.Queryable().Where(x => 1 == 1 && !x.EndTime.HasValue).ToListAsync();
+                var tellist = await _trClient.QueryTelStateAsync(new Tr.Sdk.Tels.QueryTelStateRequest { },HttpContext.RequestAborted);
+                foreach (var item in list)
+                {
+                    var telmodel = tellist.AgentList.First(x => x.TelNo == item.TelNo);
+                    if (telmodel != null)
+                    {
+                        if (telmodel.State == "logout")
+                        {
+                            var telRest = await _telRestRepository.GetAsync(x => x.TelNo == item.TelNo && !x.EndTime.HasValue, HttpContext.RequestAborted);
+                            if (telRest is not null)
+                            {
+                                telRest.EndRest();
+                                await _telRestRepository.UpdateAsync(telRest, HttpContext.RequestAborted);
+                            }
+
+                            item.OffDuty();
+                            await _workRepository.UpdateAsync(item, HttpContext.RequestAborted);
+                            _cacheWork.Remove(item.GetKey(KeyMode.UserId));
+                            _cacheWork.Remove(item.GetKey(KeyMode.TelNo));
+                            var listx = await _telActionRecordRepository.Queryable().Where(x => x.TelNo == item.TelNo && !x.EndTime.HasValue).ToListAsync();
+                            foreach (var itemx in listx)
+                            {
+                                itemx.EndAction();
+                                await _telActionRecordRepository.UpdateAsync(itemx);
+                            }
+                        }
+                    }
+                }
+            }
+            catch
+            {
+
+            }
+        }
+
+        #endregion
+
         #endregion
     }
 }

+ 0 - 5
src/Hotline.Api/Controllers/KnowledgeCommonController.cs

@@ -55,7 +55,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddKnowledgeType)]
         [HttpPost("add")]
         public async Task<string> AddType([FromBody] AddKnowledgeTypeDto dto)
         {
@@ -67,7 +66,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateKnowledgeType)]
         [HttpPut("update")]
         public async Task UpdateType([FromBody] UpdateKnowledgeTypeDto dto)
         {
@@ -108,7 +106,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-       [Permission(EPermission.RemoveKnowledgeType)]
         [HttpDelete("remove")]
         public async Task RemoveType(string Id)
         {
@@ -262,7 +259,6 @@ namespace Hotline.Api.Controllers
         /// 编写规范-查询详情
         /// </summary>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeStandardInfo)]
         [HttpGet("info-standard")]
         public async Task<KnowledgeStandard> GetStandard()
         {
@@ -285,7 +281,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeStandardUpdate)]
         [HttpPut("update-standard")]
         public async Task UpdateStandard([FromBody] UpdateKnowledgeStandardDto dto)
         {

+ 0 - 27
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -167,7 +167,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddKnowledge)]
         [HttpPost("add")]
         [LogFilter("知识新增")]
         public async Task<string> AddKnowledge([FromBody] AddStartFlowDto dto)
@@ -214,7 +213,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeOffShelf)]
         [HttpPut("offshelf")]
         [LogFilter("知识下架")]
         public async Task KnowledgeOffShelf([FromBody] OffShelfStartFlowDto dto)
@@ -256,7 +254,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeOnTheShelf)]
         [HttpPut("ontheshelf")]
         [LogFilter("知识上架")]
         public async Task KnowledgeOnTheShelf(string Id)
@@ -951,7 +948,6 @@ namespace Hotline.Api.Controllers
         ///// <param name="id">知识id</param>
         ///// <param name="dto">流程开启参数</param>
         ///// <returns></returns>
-        //[Permission(EPermission.AddKnowledge)]
         //[HttpPost("{id}/add-startflow")]
         //public async Task AddStartFlow(string id, [FromBody] StartWorkflowDto dto)
         //{
@@ -964,7 +960,6 @@ namespace Hotline.Api.Controllers
         ///// <param name="id">知识id</param>
         ///// <param name="dto">流程开启参数</param>
         ///// <returns></returns>
-        //[Permission(EPermission.KnowledgeDelete)]
         //[HttpPost("{id}/remove-startflow")]
         //public async Task RemoveStartFlow(string id, [FromBody] StartWorkflowDto dto)
         //{
@@ -975,7 +970,6 @@ namespace Hotline.Api.Controllers
         /// 查询知识库办理流程开启参数-新增
         /// </summary>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledge)]
         [HttpGet("add-flow-start")]
         public async Task<NextStepsDto> GetAddFlowStartOptionsAsync()
         {
@@ -987,7 +981,6 @@ namespace Hotline.Api.Controllers
         /// 查询知识库办理流程开启参数-新增
         /// </summary>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledge)]
         [HttpGet("update-flow-start")]
         public async Task<NextStepsDto> GetUpdateFlowStartOptionsAsync()
         {
@@ -999,7 +992,6 @@ namespace Hotline.Api.Controllers
         /// 查询知识库办理流程开启参数-删除
         /// </summary>
         /// <returns></returns>
-        //[Permission(EPermission.KnowledgeDelete)]
         [HttpGet("remove-flow-start")]
         public async Task<NextStepsDto> GetRemoveFlowStartOptionsAsync()
         {
@@ -1011,7 +1003,6 @@ namespace Hotline.Api.Controllers
         /// 查询知识库办理流程开启参数-下架
         /// </summary>
         /// <returns></returns>
-        //[Permission(EPermission.KnowledgeDelete)]
         [HttpGet("offshelf-flow-start")]
         public async Task<NextStepsDto> GetOffshelfFlowStartOptionsAsync()
         {
@@ -1054,7 +1045,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddKnowledgeWord)]
         [HttpPost("knowledge_word")]
         [LogFilter("新增知识库词库")]
         public async Task Add([FromBody] KnowledgeWordAddDto dto)
@@ -1068,7 +1058,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteKnowledgeWord)]
         [HttpDelete("knowledge_word")]
         [LogFilter("删除知识库词库")]
         public async Task Delete([FromBody] KnowledgeWordDeleteDto dto)
@@ -1081,7 +1070,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateKnowledgeWord)]
         [HttpPut("knowledge_word")]
         [LogFilter("更新知识库词库")]
         public async Task Update([FromBody] KnowledgeWordUpdateDto dto)
@@ -1145,7 +1133,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledgeCorrection)]
         [HttpPost("knowledge_correction")]
         [LogFilter("新增知识纠错")]
         public async Task Add([FromBody] KnowledgeCorrectionAddDto dto)
@@ -1159,7 +1146,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[Permission(EPermission.DeleteKnowledgeCorrection)]
         //[HttpDelete("knowledge_correction")]
         //public async Task Delete([FromBody] KnowledgeCorrectionDeleteDto dto)
         //{
@@ -1171,7 +1157,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[Permission(EPermission.UpdateKnowledgeCorrection)]
         //[HttpPut("knowledge_correction")]
         //public async Task Update([FromBody] KnowledgeCorrectionUpdateDto dto)
         //{
@@ -1187,7 +1172,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.ReplyKnowledgeCorrection)]
         [HttpPut("knowledge_correction/Reply")]
         [LogFilter("答复知识纠错")]
         public async Task Reply([FromBody] KnowledgeCorrectionUpdateDto dto)
@@ -1207,7 +1191,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeCorrectionList)]
         [HttpGet("knowledge_correction/list")]
         public async Task<PagedDto<KnowledgeCorrectionDto>> List([FromQuery] KnowledgeCorrectionListDto dto)
         {
@@ -1235,7 +1218,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        //[Permission(EPermission.KnowledgeCorrectionEntity)]
         [HttpGet("knowledge_correction/{id}")]
         public async Task<KnowledgeCorrection> CorrectionEntity(string id)
         {
@@ -1251,7 +1233,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledgeQuestions)]
         [HttpPost("knowledge_questions")]
         [LogFilter("新增知识提问")]
         public async Task Add([FromBody] KnowledgeQuestionsAddDto dto)
@@ -1265,7 +1246,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[Permission(EPermission.DeleteKnowledgeQuestions)]
         //[HttpDelete("knowledge_questions")]
         //public async Task Delete([FromBody] KnowledgeQuestionsDeleteDto dto)
         //{
@@ -1277,7 +1257,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[Permission(EPermission.UpdateKnowledgeQuestions)]
         //[HttpPut("knowledge_questions")]
         //public async Task Update([FromBody] KnowledgeQuestionsUpdateDto dto)
         //{
@@ -1293,7 +1272,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.ReplyKnowledgeQuestions)]
         [HttpPut("knowledge_questions/Reply")]
         [LogFilter("答复知识提问")]
         public async Task Reply([FromBody] KnowledgeQuestionsUpdateDto dto)
@@ -1313,7 +1291,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeQuestionsList)]
         [HttpGet("knowledge_questions/list")]
         public async Task<PagedDto<KnowledgeQuestionsDto>> List([FromQuery] KnowledgeQuestionsListDto dto)
         {
@@ -1340,7 +1317,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        //[Permission(EPermission.KnowledgeQuestionsEntity)]
         [HttpGet("knowledge_questions/{id}")]
         public async Task<KnowledgeQuestions> QuestionsEntity(string id)
         {
@@ -1357,7 +1333,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeCollectList)]
         [HttpGet("knowledge_collect/list")]
         public async Task<PagedDto<KnowledgeCollectDto>> List([FromQuery] KnowledgeCollectListDto dto)
         {
@@ -1378,7 +1353,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledgeCollect)]
         [HttpPost("knowledge_collect")]
         [LogFilter("知识收藏")]
         public async Task Add([FromBody] KnowledgeCollectAddDto dto)
@@ -1408,7 +1382,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[Permission(EPermission.AddKnowledgeScore)]
         [HttpDelete("knowledge_score")]
         [LogFilter("知识评分")]
         public async Task Delete([FromBody] KnowledgeCollectAddDto dto)

+ 163 - 97
src/Hotline.Api/Controllers/OrderController.cs

@@ -72,6 +72,7 @@ using Hotline.Share.Mq;
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Dtos.Order.Detail;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.Org;
 
 namespace Hotline.Api.Controllers;
 
@@ -146,6 +147,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IRepository<OrderRevoke> _orderRevokeRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
+    private readonly IRepository<OrderCarboncopy> _orderCarboncopy;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -211,6 +213,7 @@ public class OrderController : BaseController
         IRepository<OrderRevoke> orderRevokeRepository,
         BaseDataApplication baseDataApplication,
         IOrderTerminateRepository orderTerminateRepository,
+        IRepository<OrderCarboncopy> orderCarboncopy,
         ITypedCache<string> typeCache)
     {
         _orderDomainService = orderDomainService;
@@ -275,6 +278,7 @@ public class OrderController : BaseController
         _callNativeRepository = callNativeRepository;
         _baseDataApplication = baseDataApplication;
         _orderTerminateRepository = orderTerminateRepository;
+        _orderCarboncopy = orderCarboncopy;
         _orderRevokeRepository = orderRevokeRepository;
         _typeCache = typeCache;
         _baseDataApplication = baseDataApplication;
@@ -290,11 +294,15 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet("publish/items")]
-    public async Task<IList<PublishDto>> GetPublishOrderListAsync([FromQuery] QueryOrderPublishDto dto)
+    public async Task<IReadOnlyList<PublishDto>> GetPublishOrderListAsync([FromQuery] QueryOrderPublishDto dto)
     {
-        var query = _orderApplication.GetPublishOrderList(dto);
-        return (await query.ToFixedListAsync(dto.QueryIndex, 200, HttpContext.RequestAborted))
-            .Adapt<List<PublishDto>>();
+        var orders = await _orderApplication.GetPublishOrderList(dto)
+            .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+
+        return _mapper.Map<IReadOnlyList<PublishDto>>(orders);
+
+        //return (await query.ToFixedListAsync(dto.QueryIndex, 200, HttpContext.RequestAborted))
+        //    .Adapt<List<PublishDto>>();
     }
 
     /// <summary>
@@ -409,7 +417,7 @@ public class OrderController : BaseController
         if (hasHuiQian)
             throw UserFriendlyException.SameMessage("选择的工单中含有会签工单, 不能批量发布. 请排除会签工单.");
 
-        var hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.IsProvince == true);
+        var hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.Source == ESource.ProvinceStraight);
         if (hasProvince)
             throw UserFriendlyException.SameMessage("选择的工单中含有省工单, 不能批量发布. 请排除省工单.");
 
@@ -434,7 +442,6 @@ public class OrderController : BaseController
     /// 发布工单
     /// </summary>
     /// <returns></returns>
-    [Permission(EPermission.PublishOrder)]
     [HttpPost("publish")]
     [LogFilter("发布工单")]
     public async Task PublishOrder([FromBody] PublishOrderDto dto)
@@ -603,46 +610,52 @@ public class OrderController : BaseController
 
         //需求251  某些工单需自动发送短信
         //任何类型的省工单都不需要发送短信
-        try
+
+        var isOpenSendEndSms = _systemSettingCacheManager.GetSetting(SettingConstants.IsOpenSendEndSms)?.SettingValue[0];
+        if (isOpenSendEndSms == "true")
         {
-            if (order.Source != ESource.ProvinceStraight && _appOptions.Value.IsYiBin)
+            try
             {
-                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);
-                }
-                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);
+                    var code = "";
+                    //受理类型为“投诉、举报”
+                    if ((order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35") && orderVisit.VisitState != EVisitState.Visited)
+                    {
+                        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)
+            {
             }
-        }
-        catch (Exception)
-        {
         }
 
         if (orderVisit.VisitState == EVisitState.Visited && !order.IsProvince)
@@ -755,11 +768,15 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet("published/items")]
-    public async Task<IList<PublishedDto>> GetPublishedOrderListAsync([FromQuery] PublishedPagedRequest dto)
+    public async Task<IReadOnlyList<PublishedDto>> GetPublishedOrderListAsync([FromQuery] PublishedPagedRequest dto)
     {
-        var query = _orderApplication.GetPublishedOrder(dto);
-        return (await query.ToFixedListAsync(dto.QueryIndex, 200, HttpContext.RequestAborted))
-            .Adapt<List<PublishedDto>>();
+        //var query = _orderApplication.GetPublishedOrder(dto);
+        //return (await query.ToFixedListAsync(dto.QueryIndex, 200, HttpContext.RequestAborted))
+        //.Adapt<List<PublishedDto>>();
+        var orderPublishs = await _orderApplication.GetPublishedOrder(dto)
+            .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+
+        return _mapper.Map<IReadOnlyList<PublishedDto>>(orderPublishs);
     }
 
     /// <summary>
@@ -844,7 +861,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.PublishedModify)]
     [HttpPost("published-order-modify")]
     [LogFilter("修改发布内容")]
     public async Task PublishedModify([FromBody] PublishOrderModifyDto dto)
@@ -997,8 +1013,11 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderVisitDto>> QueryOrderVisitList([FromQuery] QueryOrderVisitDto dto)
     {
         var (total, items) = await _orderApplication.QueryOrderVisitList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
+
+        //var orderVisits = await _orderApplication.QueryOrderVisitList(dto)
+        //    .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+        //return _mapper.Map<>()
     }
 
     /// <summary>
@@ -1058,7 +1077,8 @@ public class OrderController : BaseController
             { "visitSatisfaction", _sysDicDataCacheManager.GetVisitSatisfaction().Where(m => m.DicDataValue != "-1").ToList() },
             { "visitMananer", _sysDicDataCacheManager.VisitMananer.Where(x => x.DicDataValue != "-1").ToList() },
             { "visitStateQuery", EnumExts.GetDescriptions<EVisitStateQuery>() },
-            { "sourceChannel", _sysDicDataCacheManager.SourceChannel }
+            { "sourceChannel", _sysDicDataCacheManager.SourceChannel },
+            { "aiVisitResult", EnumExts.GetDescriptions<EAiVisitResult>() }
         };
 
     /// <summary>
@@ -1222,7 +1242,6 @@ public class OrderController : BaseController
     /// 回访保存
     /// </summary>
     /// <returns></returns>
-    [Permission(EPermission.Visit)]
     [HttpPost("visit")]
     [LogFilter("工单回访")]
     public async Task Visit([FromBody] VisitDto dto)
@@ -1238,7 +1257,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.Visit)]
     [HttpPost("visit/batch")]
     [LogFilter("批量工单回访")]
     public async Task<VisitBatchOutDto> VisitBatch([FromBody] VisitBatchInDto dto)
@@ -1865,7 +1883,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[Permission(EPermission.ApplyDelay)]
     [HttpPost("delay")]
     [LogFilter("新增工单延期申请")]
     public async Task ApplyDelay([FromBody] StartWorkflowDto<ApplyDelayDto> dto)
@@ -2059,7 +2076,6 @@ public class OrderController : BaseController
     /// 延期列表
     /// </summary>
     /// <returns></returns>
-    //[Permission(EPermission.DelayList)]
     [HttpGet("delay")]
     public async Task<PagedDto<OrderDelayDto>> DelayList([FromQuery] DelayListDto dto)
     {
@@ -2112,7 +2128,6 @@ public class OrderController : BaseController
     /// 延期列表
     /// </summary>
     /// <returns></returns>
-    //[Permission(EPermission.DelayList)]
     [HttpGet("wait_delay")]
     public async Task<PagedDto<OrderDelayDto>> WaitDelayList([FromQuery] DelayListDto dto)
     {
@@ -2139,7 +2154,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    //[Permission(EPermission.DelayEntity)]
     [HttpGet("delay/{id}")]
     public async Task<OrderDelayDto> DelayEntity(string id)
     {
@@ -2236,7 +2250,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.CanOrderScreen)]
     [HttpGet("mayscreen")]
     public async Task<PagedDto<OrderVisitDetailDto>> MayScreenList([FromQuery] MayScreenListDto dto)
     {
@@ -2350,7 +2363,6 @@ public class OrderController : BaseController
     /// <summary>
     /// 开始工单甄别流程
     /// </summary>
-    [Permission(EPermission.ApplyScreen)]
     [HttpPost("screen/startflow")]
     [LogFilter("开始工单甄别流程")]
     public async Task StartFlow([FromBody] StartWorkflowDto<OrderScreenDto> dto)
@@ -2666,7 +2678,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.ApplySupervise)]
     [HttpPost("supervise/apply")]
     [LogFilter("新增工单督办")]
     public async Task ApplySupervise([FromBody] ApplyOrderSuperviseDto dto)
@@ -2916,7 +2927,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.ApplyUrge)]
     [HttpPost("urge/apply")]
     [LogFilter("新增工单催办")]
     public async Task ApplyUrge([FromBody] ApplyOrderUrgeDto dto)
@@ -3079,12 +3089,14 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet]
-    public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
+    public async Task<IReadOnlyList<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {
-        var query = _orderApplication.QueryOrders(dto);
-        var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
-
-        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        //var query = _orderApplication.QueryOrders(dto);
+        //var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
+        //return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        var orders = await _orderApplication.QueryOrders(dto)
+            .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+        return _mapper.Map<IReadOnlyList<OrderDto>>(orders);
     }
 
     /// <summary>
@@ -3470,7 +3482,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.OrderAdd)]
     [HttpPost]
     [LogFilter("新增工单")]
     public async Task<object> Add([FromBody] AddOrderDto dto)
@@ -3902,8 +3913,8 @@ public class OrderController : BaseController
                 $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
         var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
 
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withSteps: true, withTraces: true,
-            cancellationToken: HttpContext.RequestAborted);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withDefine: true,
+            withSteps: true, withTraces: true, cancellationToken: HttpContext.RequestAborted);
 
         //await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
         var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);
@@ -3970,14 +3981,6 @@ public class OrderController : BaseController
                     }).Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
 
-                //if (workflowDto.BusinessType == EBusinessType.Seat)
-                //{
-                // await _orderRepository.Updateable().SetColumns(o => new Order()
-                // {
-                //  Status = EOrderStatus.WaitForAccept
-                // }).Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                //}
-
                 await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime, isAutoFillSummaryOpinion, cancellationToken);
                 break;
             case EOrderAssignMode.CrossLevel:
@@ -4018,12 +4021,98 @@ public class OrderController : BaseController
 
                 break;
             case EOrderAssignMode.MainAndSecondary:
+                //主协办暂只支持指派给部门办理,且主办部门有且只有一个一级部门
+                nextDto = _mapper.Map<NextWorkflowDto>(workflowDto);
+                nextDto.WorkflowId = startStep.WorkflowId;
+                nextDto.StepId = startStep.Id;
+                nextDto.HandlerType = EHandlerType.OrgLevel;
+                nextDto.FlowDirection = EFlowDirection.CenterToOrg;
+                var secondaryOrgs = orderHandleFlowDto.SecondaryOrgs.DistinctBy(d => d.Id).ToList();
+                var nextHandleOrgs = secondaryOrgs
+                    .Where(d => d.Level == 1 && d.Id.StartsWith(OrgSeedData.CenterId))
+                    .ToList();
+                if (nextHandleOrgs.Any())
+                    nextDto.NextHandlers.AddRange(nextHandleOrgs.Select(d => new FlowStepHandler
+                    {
+                        Key = d.Id,
+                        Value = d.Name,
+                        OrgId = d.Id,
+                        OrgName = d.Name
+                    }));
+                nextDto.IsStartCountersign = nextDto.NextHandlers.Count > 1;
+
+                await HandleNextInMainAndSecondaryAsync(_sessionContext, workflow.WorkflowDefinition,
+                    secondaryOrgs, nextDto, order.ExpiredTime, isAutoFillSummaryOpinion,
+                    cancellationToken);
+
+                //抄送
+                var ccs = orderHandleFlowDto.Copys
+                     .Where(d => !string.IsNullOrEmpty(d.OrgId) 
+                                 || !string.IsNullOrEmpty(d.RoleId) 
+                                 || !string.IsNullOrEmpty(d.UserId))
+                     .Select(d => _mapper.Map<OrderCarboncopy>(d))
+                     .Distinct()
+                     .ToList();
+                ccs.ForEach(d=>d.OrderId = order.Id);
+                await _orderCarboncopy.AddRangeAsync(ccs, HttpContext.RequestAborted);
+
                 break;
             default:
                 throw new ArgumentOutOfRangeException();
         }
     }
 
+    private async Task HandleNextInMainAndSecondaryAsync(ISessionContext current, WorkflowDefinition definition, List<OrgDto> orgs,
+      NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
+    {
+        if (flowDto is null || !flowDto.NextHandlers.Any()) return;
+        var nextSteps = await _workflowDomainService.NextAsync(current, flowDto, expiredTime,
+            isAutoFillSummaryOpinion, cancellation);
+
+        foreach (var nextStep in nextSteps)
+        {
+            var nextStepHandlerOrgId = nextStep?.HandlerOrgId;
+            if (string.IsNullOrEmpty(nextStepHandlerOrgId))
+                throw new UserFriendlyException($"数据异常, 待办部门id为空, stepId: {nextStep.Id}");
+            var nextStepHandlerOrgLevel = nextStepHandlerOrgId.CalcOrgLevel();
+            var nextHandlers = orgs.Where(d => d.Level == nextStepHandlerOrgLevel && d.Id.StartsWith(nextStepHandlerOrgId))
+                .Select(d => new FlowStepHandler
+                {
+                    Key = d.Id,
+                    Value = d.Name,
+                    OrgId = d.Id,
+                    OrgName = d.Name
+                })
+                .ToList();
+            if (nextHandlers.Any())
+            {
+                var nextStepDefine = definition.FindStepDefines(nextStep.NextSteps.Select(d => d.Code))
+                    .FirstOrDefault(d =>
+                        d.HandlerType == EHandlerType.OrgLevel &&
+                        d.HandlerTypeItems.Any(x => x.Key == nextStepHandlerOrgLevel.ToString()));
+                if (nextStepDefine == null)
+                    throw new UserFriendlyException($"流程模板未配置该部门等级, defineId: {definition.Id}, level: {nextStepHandlerOrgLevel}");
+
+                var nextDto = new NextWorkflowDto
+                {
+                    WorkflowId = flowDto.WorkflowId,
+                    StepId = nextStep.Id,
+                    NextStepCode = nextStepDefine.Code,
+                    NextStepName = nextStepDefine.Name,
+                    FlowDirection = EFlowDirection.OrgToOrg,
+                    HandlerType = nextStepDefine.HandlerType,
+                    StepType = nextStepDefine.StepType,
+                    IsSms = false,
+                    NextHandlers = nextHandlers,
+                    IsStartCountersign = nextHandlers.Count > 1,
+                    BusinessType = nextStepDefine.BusinessType,
+                };
+
+                await HandleNextInMainAndSecondaryAsync(current, definition, orgs, nextDto, expiredTime, isAutoFillSummaryOpinion, cancellation);
+            }
+        }
+    }
+
     private async Task AverageSendOrderAsync(NextWorkflowDto nextDto, CancellationToken cancellationToken)
     {
         // 平均派单
@@ -4343,9 +4432,6 @@ public class OrderController : BaseController
             .OrderBy(d => d.CreationTime)
             .ToTreeAsync(d => d.Traces, d => d.ParentId, null);
 
-        //todo files
-        //await _fileRepository.WorkflowTraceRecursion(workflowDto.Traces, HttpContext.RequestAborted);
-
         return _mapper.Map<IReadOnlyList<OrderFlowTraceDto>>(traces);
     }
 
@@ -4750,7 +4836,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.OrderPreviousAudit)]
     [HttpPost("order_previous_audit")]
     public async Task Audit([FromBody] AuditSendBackDto dto)
     {
@@ -4892,7 +4977,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[Permission(EPermission.OrderPreviousList)]
     [HttpGet("order_previous_list")]
     public async Task<PagedDto<SendBackDto>> AuditList([FromQuery] SendBackListDto dto)
     {
@@ -5002,7 +5086,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.SendBackOrder)]
     [HttpGet("send_back")]
     public async Task<PagedDto<OrderSendBackDto>> UrgeList([FromQuery] OrderSendBackListDto dto)
     {
@@ -5085,7 +5168,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.ApplySendBack)]
     [HttpPost("send_back/apply")]
     [LogFilter("新增工单退回申请")]
     public async Task ApplyUrge([FromBody] OrderSendBackAddDto dto)
@@ -5125,7 +5207,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AuditSendBack)]
     [HttpPost("send_back/audit")]
     [LogFilter("审核工单退回申请")]
     public async Task ReplyUrge([FromBody] AuditOrderSendBackDto dto)
@@ -5184,7 +5265,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dtos"></param>
     /// <returns></returns>
-    [Permission(EPermission.ApplySpecial)]
     [HttpPost("special")]
     [LogFilter("新增工单特提")]
     public async Task Add([FromBody] OrderSpecialAddDto dto)
@@ -5573,7 +5653,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AuditSpecial)]
     [HttpPut("special")]
     [LogFilter("审批工单特提")]
     public async Task Update([FromBody] AuditOrderSpecialDto dto)
@@ -5882,7 +5961,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AuditSpecialOrderList)]
     [HttpGet("special/list")]
     public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
     {
@@ -5901,7 +5979,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="pagedDto"></param>
     /// <returns></returns>
-    // [Permission(EPermission.AuditSpecialOrderList)]
     [HttpGet("special/getspeciallist")]
     public async Task<PagedDto<SpecialOrderListDto>> GetSpecialList([FromQuery] SpecialPagedListDto pagedDto)
     {
@@ -6267,7 +6344,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.DeleteCitizen)]
     [HttpDelete("citizen")]
     [LogFilter("删除市民信息")]
     public async Task Delete([FromBody] CitizenDeleteDto dto)
@@ -6280,7 +6356,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UpdateCitizen)]
     [HttpPut("citizen")]
     [LogFilter("更新市民信息")]
     public async Task Update([FromBody] CitizenUpdateDto dto)
@@ -6298,7 +6373,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.CitizenList)]
     [HttpGet("citizen/list")]
     public async Task<PagedDto<CitizenDto>> List([FromQuery] CitizenListDto dto)
     {
@@ -6528,7 +6602,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UpdateRepeatableEvent)]
     [HttpPut("repeatable_event")]
     [LogFilter("更新重复性事件")]
     public async Task Update([FromBody] RepeatableEventUpdateDto dto)
@@ -6597,7 +6670,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dtos"></param>
     /// <returns></returns>
-    [Permission(EPermission.AddOrderWord)]
     [HttpPost("order_word")]
     [LogFilter("新增工单词库")]
     public async Task Add([FromBody] OrderWordAddDto dto)
@@ -6611,7 +6683,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.DeleteOrderWord)]
     [HttpDelete("order_word")]
     [LogFilter("删除工单词库")]
     public async Task Delete([FromBody] OrderWordDeleteDto dto)
@@ -6624,7 +6695,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UpdateOrderWord)]
     [HttpPut("order_word")]
     [LogFilter("更新工单词库")]
     public async Task Update([FromBody] OrderWordUpdateDto dto)
@@ -6642,7 +6712,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.OrderWordList)]
     [HttpGet("order_word/list")]
     public async Task<PagedDto<OrderWordDto>> List([FromQuery] OrderWordListDto dto)
     {
@@ -6690,7 +6759,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dtos"></param>
     /// <returns></returns>
-    [Permission(EPermission.AddOrderObserve)]
     [HttpPost("order_observe")]
     [LogFilter("新增工单观察")]
     public async Task Add([FromBody] OrderObserveAddDto dto)
@@ -6817,7 +6885,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dtos"></param>
     /// <returns></returns>
-    [Permission(EPermission.AddOrderFinality)]
     [HttpPost("order_finality")]
     [LogFilter("新增工单终结")]
     public async Task Add([FromBody] OrderFinalityAddDto dto)
@@ -6957,7 +7024,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[Permission(EPermission.OverdueOrderV1)]
     [HttpGet("order/about_expire/list_optimize")]
     public async Task<PagedDto<OrderDto>> GetAboutToExpireAsyncV1([FromQuery] AboutToExpireListDto dto)
     {

+ 50 - 0
src/Hotline.Api/Controllers/OrderModuleControllers/OrderCarbonCopyController.cs

@@ -0,0 +1,50 @@
+using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Requests;
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Repository;
+
+namespace Hotline.Api.Controllers.OrderModuleControllers
+{
+    /// <summary>
+    /// 工单抄送
+    /// </summary>
+    public class OrderCarbonCopyController : BaseController
+    {
+        private readonly IRepository<OrderCarboncopy> _orderccRepository;
+        private readonly IMapper _mapper;
+
+        public OrderCarbonCopyController(
+            IRepository<OrderCarboncopy> orderccRepository,
+            IMapper mapper
+        )
+        {
+            _orderccRepository = orderccRepository;
+            _mapper = mapper;
+        }
+
+        [HttpGet]
+        public async Task<IReadOnlyList<OrderDto>> Query([FromQuery]PagedKeywordRequest dto)
+        {
+            var orderccs = await _orderccRepository.Queryable()
+                .Includes(d => d.Order)
+                //todo 按照抄送权限查询
+                //.Where(d=> !string.IsNullOrEmpty())
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.No == dto.Keyword)
+                .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+
+            return _mapper.Map<IReadOnlyList<OrderDto>>(orderccs);
+        }
+
+        [HttpGet("count")]
+        public async Task<int> Count([FromQuery] PagedKeywordRequest dto)
+        {
+            return await _orderccRepository.Queryable()
+                .Includes(d => d.Order)
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.No == dto.Keyword)
+                .CountAsync(HttpContext.RequestAborted);
+        }
+    }
+}

+ 1 - 1
src/Hotline.Api/Controllers/OrderControlls/OrderComplementController.cs → src/Hotline.Api/Controllers/OrderModuleControllers/OrderComplementController.cs

@@ -2,7 +2,7 @@
 using Hotline.Share.Dtos.Order;
 using Microsoft.AspNetCore.Mvc;
 
-namespace Hotline.Api.Controllers.OrderControlls;
+namespace Hotline.Api.Controllers.OrderModuleControllers;
 
 public class OrderComplementController : BaseController
 {

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

@@ -147,7 +147,6 @@ namespace Hotline.Api.Controllers
 		/// <summary>
 		/// 开始工单终止流程
 		/// </summary>
-		//[Permission(EPermission.ApplyTerminate)]
 		[HttpPost("startflow")]
 		[LogFilter("开始工单终止流程")]
 		public async Task StartFlow([FromBody] StartWorkflowDto<OrderTerminateDto> dto)

+ 0 - 6
src/Hotline.Api/Controllers/OrgController.cs

@@ -46,7 +46,6 @@ namespace Hotline.Api.Controllers
         /// 组织机构获取树形列表
         /// </summary>
         /// <returns></returns>
-        [Permission(EPermission.GetOrgJson)]
         [HttpGet("getorgjson")]
         [AllowAnonymous]
         public async Task<IReadOnlyList<SystemOrganize>> GetOrgJson()
@@ -54,7 +53,6 @@ namespace Hotline.Api.Controllers
             return await _systemOrganizeRepository.GetOrgJson();
         }
 
-        [Permission(EPermission.GetOrgJson)]
         [HttpGet("getorgjsonforuser")]
         [AllowAnonymous]
         public async Task<IReadOnlyList<SystemOrganize>> GetOrgJsonForUser()
@@ -74,7 +72,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="dto"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.AddOrg)]
         //[HttpPost("add-org")]
         //[Obsolete]
         //public async Task AddOrg([FromBody] AddOrgDto dto)
@@ -98,7 +95,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddOrg)]
         [HttpPost]
         public async Task Add([FromBody] AddOrgDto dto)
         {
@@ -115,7 +111,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="dto"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.UpdateOrg)]
         //[HttpPost("update-org")]
         //[Obsolete]
         //public async Task UpdateOrg([FromBody] UpdateOrgDto dto)
@@ -140,7 +135,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateOrg)]
         [HttpPut]
         public async Task Update([FromBody] UpdateOrgDto dto)
         {

+ 0 - 17
src/Hotline.Api/Controllers/QualityController.cs

@@ -111,7 +111,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateQuality)]
         [HttpPut]
         public async Task Update([FromBody] UpdateQualityDto dto)
         {
@@ -237,7 +236,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddQualityItem)]
         [HttpPost("item")]
         public async Task Add([FromBody] QualityItemAddDto dto)
         {
@@ -253,7 +251,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="dto"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.DeleteQualityItem)]
         //[HttpDelete("item")]
         //public async Task Delete([FromBody] QualityItemDeleteDto dto)
         //{
@@ -265,7 +262,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteQualityItem)]
         [HttpDelete("itemBatch")]
         public async Task Delete([FromBody] QualityItemBatchDeleteDto dto)
         {
@@ -289,7 +285,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateQualityItem)]
         [HttpPut("item")]
         public async Task Update([FromBody] QualityItemUpdateDto dto)
         {
@@ -311,7 +306,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.QualityItemList)]
         [HttpGet("item/list")]
         public async Task<PagedDto<QualityItemDto>> List([FromQuery] QualityItemListDto dto)
         {
@@ -344,7 +338,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddQualityTemplate)]
         [HttpPost("template")]
         public async Task Add([FromBody] TemplateAddDto dto)
         {
@@ -373,7 +366,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteQualityTemplate)]
         [HttpDelete("template")]
         public async Task Delete([FromBody] TemplateDeleteDto dto)
         {
@@ -387,7 +379,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteQualityTemplate)]
         [HttpDelete("templateBatch")]
         public async Task Delete([FromBody] TemplateBatchDeleteDto dto)
         {
@@ -402,7 +393,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateQualityTemplate)]
         [HttpPut("template")]
         public async Task Update([FromBody] TemplateUpdateDto dto)
         {
@@ -433,7 +423,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.QualityTemplateList)]
         [HttpGet("template/list")]
         public async Task<PagedDto<QualityTemplateDto>> List([FromQuery] TemplateListDto dto)
         {
@@ -467,7 +456,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.EnableQualityTemplate)]
         [HttpPut("template/enable")]
         public async Task Enable([FromBody] TemplateUpdateDto dto)
         {
@@ -489,7 +477,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddQualityProhibited)]
         [HttpPost("prohibited")]
         public async Task Add([FromBody] ProhibitedAddDto dto)
         {
@@ -502,7 +489,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteQualityProhibited)]
         [HttpDelete("prohibited")]
         public async Task Delete([FromBody] ProhibitedDeleteDto dto)
         {
@@ -514,7 +500,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteQualityProhibited)]
         [HttpDelete("prohibitedBatch")]
         public async Task Delete([FromBody] ProhibitedBatchDeleteDto dto)
         {
@@ -527,7 +512,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateQualityProhibited)]
         [HttpPut("prohibited")]
         public async Task Update([FromBody] ProhibitedUpdateDto dto)
         {
@@ -544,7 +528,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.QualityProhibitedList)]
         [HttpGet("prohibited/list")]
         public async Task<PagedDto<QualityProhibitedDto>> List([FromQuery] ProhibitedListDto dto)
         {

+ 0 - 4
src/Hotline.Api/Controllers/RoleController.cs

@@ -93,7 +93,6 @@ public class RoleController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AddRole)]
     [HttpPost]
     public async Task<string> Add([FromBody] AddRoleDto dto)
     {
@@ -120,7 +119,6 @@ public class RoleController : BaseController
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    [Permission(EPermission.RemoveRole)]
     [HttpDelete("{id}")]
     public async Task Remove(string id)
     {
@@ -144,7 +142,6 @@ public class RoleController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UpdateRole)]
     [HttpPut]
     public async Task Update([FromBody] UpdateRoleDto dto)
     {
@@ -176,7 +173,6 @@ public class RoleController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AllocationAuthority)]
     [HttpPost("allocationauthority")]
     public async Task AllocationAuthority(RoleAuthorityDto dto)
     {

+ 0 - 11
src/Hotline.Api/Controllers/SettingController.cs

@@ -101,7 +101,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        //[Permission(EPermission.GetSettingEntity)]
         [HttpGet("getsetting-entity/{id}")]
         public async Task<SystemSetting?> GetSettingEntity(string id)
         {
@@ -126,7 +125,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddSetting)]
         [HttpPost("setting-add")]
         public async Task AddSetting([FromBody]AddSettingDto dto)
         {
@@ -139,7 +137,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.ModifySettings)]
         [HttpPost("modifysettings")]
         public async Task ModifySettingsAsync([FromBody]ModifySettingDto  dto)
         {
@@ -164,7 +161,6 @@ namespace Hotline.Api.Controllers
         /// <param name="year"></param>
         /// <param name="month"></param>
         /// <returns></returns>
-        //[Permission(EPermission.DaySetingsList)]
         [HttpGet("getdaysettings-month/{year}/{month}")]
         public async Task<List<DaySetting>> GetDaySettingsByMonth(int year,int month)
         {
@@ -176,7 +172,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>`
-        [Permission(EPermission.SetDaySetting)]
         [HttpPost("setdaysettings")]
         public async Task SetDaySettings([FromBody]SetDaySettingsRequest request)
         {
@@ -204,7 +199,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.BusinessTagList)]
 		[HttpGet("businessTag")]
 		public async Task<PagedDto<BusinessTagListVo>> BusinessTagList([FromQuery] BusinessTagListDto dto)
 		{
@@ -222,7 +216,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dtos"></param>
         /// <returns></returns>
-        [Permission(EPermission.AddBusinessTag)]
 		[HttpPost("businessTag")]
 		public async Task AddBusinessTag([FromBody] List<BusinessTagDto> dtos)
 		{
@@ -240,7 +233,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.DeleteBusinessTag)]
 		[HttpDelete("businessTag")]
 		public async Task DeleteBusinessTag([FromBody] DeleteBusinessTagDto dto)
 		{
@@ -255,7 +247,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.UpdateBusinessTag)]
 		[HttpPut("businessTag")]
 		public async Task UpdateBusinessTag([FromBody] UpdateBusinessTagDto dto)
 		{
@@ -272,7 +263,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        [Permission(EPermission.BusinessTagEntity)]
 		[HttpGet("businessTag/{id}")]
 		public async Task<BusinessTag> BusinessTagEntity(string id)
 		{
@@ -300,7 +290,6 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [Permission(EPermission.BusinessTagBinding)]
         [HttpPut("businessTag/binding")]
         public async Task BusinessTagBinding([FromBody]BusinessTagBindingDto dto)
         {

+ 0 - 5
src/Hotline.Api/Controllers/SysController.cs

@@ -203,7 +203,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="menuid"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.GetButtonByMenu)]
         //[HttpGet("getbuttonmenu")]
         //public async Task<IReadOnlyList<SystemButton>> GetButtonByMenu(string menuid)
         //{
@@ -215,7 +214,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="dto"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.AddButton)]
         //[HttpPost("add-button")]
         //public async Task AddButton([FromBody] AddButtonDto dto)
         //{
@@ -228,7 +226,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="dto"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.UpdateButton)]
         //[HttpPost("update-button")]
         //public async Task UpdateButton([FromBody] UpdateButtonDto dto)
         //{
@@ -244,7 +241,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="id"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.RemoveButton)]
         //[HttpDelete("removebutton/{id}")]
         //public async Task RemoveButton(string id)
         //{
@@ -259,7 +255,6 @@ namespace Hotline.Api.Controllers
         ///// </summary>
         ///// <param name="id"></param>
         ///// <returns></returns>
-        //[Permission(EPermission.GetButton)]
         //[HttpGet("button/{id}")]
         //public async Task<SystemButton> GetButton(string id)
         //{

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

@@ -225,7 +225,6 @@ public class UserController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UpdateUser)]
     [HttpPut]
     public async Task Update([FromBody] UpdateUserDto dto)
     {
@@ -275,7 +274,6 @@ public class UserController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.AddUser)]
     [HttpPost]
     public async Task<string> Add([FromBody] AddUserDto dto)
     {
@@ -341,7 +339,6 @@ public class UserController : BaseController
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    [Permission(EPermission.RemoveUser)]
     [HttpDelete("{id}")]
     [LogFilter("删除用户")]
     public async Task Remove(string id)

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

@@ -133,7 +133,6 @@ public class WorkflowController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.FlowDefinitionQuery)]
     [HttpGet("definition")]
     public async Task<PagedDto<DefinitionDto>> QueryDefinitions([FromQuery] QueryDefinitionDto dto)
     {
@@ -191,7 +190,6 @@ public class WorkflowController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.FlowDefinitionAdd)]
     [HttpPost("definition")]
     public async Task<string> AddDefinition([FromBody] AddDefinitionDto dto)
     {
@@ -203,7 +201,6 @@ public class WorkflowController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.FlowDefinitionUpdate)]
     [HttpPut("definition")]
     public async Task UpdateDefinition([FromBody] UpdateDefinitionDto dto)
     {
@@ -228,7 +225,6 @@ public class WorkflowController : BaseController
     /// <param name="id"></param>
     /// <returns></returns>
     /// <exception cref="UserFriendlyException"></exception>
-    [Permission(EPermission.FlowDefinitionRemove)]
     [HttpDelete("definition/{id}")]
     public async Task RemoveDefinition(string id)
     {
@@ -243,7 +239,6 @@ public class WorkflowController : BaseController
     /// 发布(列表操作)
     /// </summary>
     /// <returns></returns>
-    [Permission(EPermission.FlowDefinitionPublish)]
     [HttpPost("definition/{id}/publish")]
     public async Task Publish(string id)
     {
@@ -255,7 +250,6 @@ public class WorkflowController : BaseController
     /// </summary>
     /// <returns></returns>
     [Obsolete]
-    [Permission(EPermission.FlowDefinitionPublish)]
     [HttpPost("definition/publish")]
     public async Task Publish([FromBody] AddDefinitionDto dto)
     {
@@ -405,7 +399,6 @@ public class WorkflowController : BaseController
     // /// </summary>
     // /// <param name="dto"></param>
     // /// <returns></returns>
-    // //[Permission(EPermission.FlowSupplement)]
     // [HttpPost("supplement")]
     // public async Task Supplement([FromBody] SupplementDto dto)
     // {

+ 0 - 4
src/Hotline.Api/Hotline.Api.csproj

@@ -38,10 +38,6 @@
     <None Remove="logs\**" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Controllers\OrderControlls\" />
-  </ItemGroup>
-
   <ItemGroup>
     <Compile Remove="Controllers\Order\OrderComplementController.cs" />
     <Compile Remove="logs\**" />

+ 1 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -182,7 +182,7 @@ internal static class StartupExtensions
                     .AddScoped<ICallApplication, TianRunCallApplication>()
                     .AddScoped<ITrApplication, TrApplication>()
                     .AddHostedService<CurrentWaitNumService>()
-                    .AddHostedService<TelsStatusRefreshService>()
+                    //.AddHostedService<TelsStatusRefreshService>()
                     .AddTrSdk(callCenterConfiguration.TianRun.Address,
                         callCenterConfiguration.TianRun.Username,
                         callCenterConfiguration.TianRun.Password);

+ 12 - 0
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -102,6 +102,18 @@ namespace Hotline.Application.Knowledge
                 .WhereIF(pagedDto.Status ==  EKnowledgeStatus.NewDrafts ,x=>x.Status == EKnowledgeStatus.Drafts || x.Status == EKnowledgeStatus.Revert)
                 .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Drafts , x=>x.Status == EKnowledgeStatus.Drafts)
                 .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Revert, x => x.Status == EKnowledgeStatus.Revert)
+
+                .WhereIF(pagedDto.CreationStartTime.HasValue,x=>x.CreationTime>= pagedDto.CreationStartTime)
+                .WhereIF(pagedDto.CreationEndTime.HasValue, x => x.CreationTime <= pagedDto.CreationEndTime)
+
+                  .WhereIF(pagedDto.StartOnShelfTime.HasValue, x => x.OnShelfTime >= pagedDto.StartOnShelfTime)
+                  .WhereIF(pagedDto.EndOnShelfTime.HasValue, x => x.OnShelfTime <= pagedDto.EndOnShelfTime)
+
+                   .WhereIF(pagedDto.StartOffShelfTime.HasValue, x => x.OffShelfTime >= pagedDto.StartOffShelfTime)
+                  .WhereIF(pagedDto.EndOffShelfTime.HasValue, x => x.OffShelfTime <= pagedDto.EndOffShelfTime)
+
+                  .WhereIF(pagedDto.StartUpdateTime.HasValue, x => x.LastModificationTime >= pagedDto.StartUpdateTime)
+                  .WhereIF(pagedDto.EndUpdateTime.HasValue, x => x.LastModificationTime <= pagedDto.EndUpdateTime)
                 .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution),x=>x.Attribution == pagedDto.Attribution)
 				.OrderByDescending(d => d.CreationTime)
                 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);

+ 28 - 12
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -18,6 +18,7 @@ public class OrderMapperConfigs : IRegister
         config.ForType<Order, OrderDto>()
             .IgnoreIf((s, d) => s.OrderExtension == null, d => d.OrderExtension)
             .IgnoreIf((s, d) => s.Hotspot == null, d => d.Hotspot)
+               .IgnoreIf((s, d) => s.FwCallRecord == null, d => d.FwCallRecord)
             //.Map(d => d.IsRed, s => string.IsNullOrEmpty(s.SignerId) || !s.ActualHandleStepAcceptTime.HasValue)
             .Map(d => d.IsRed, s => s.WorkflowSteps != null
                                     && s.WorkflowSteps.Any()
@@ -230,24 +231,39 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.No, s => s.CaseSerial);
 
         config.ForType<WorkflowTrace, OrderFlowTraceDto>()
-            .IgnoreIf((s, d) => s.OrderPublish == null, d => d.PublishState)
+            .IgnoreIf((s, d) => s.TraceStyle != ETraceStyle.Publish || s.OrderPublish == null, d => d.PublishState)
             .Map(d => d.PublishState, s => s.OrderPublish.PublishState)
-            .IgnoreIf((s, d) => s.OrderPublish == null, d => d.ArrangeOpinion)
+            .IgnoreIf((s, d) => s.TraceStyle != ETraceStyle.Publish || s.OrderPublish == null, d => d.ArrangeOpinion)
             .Map(d => d.ArrangeOpinion, s => s.OrderPublish.ArrangeOpinion)
-            .IgnoreIf((s, d) => s.OrderVisit == null || s.OrderVisit.OrderVisitDetails.All(x => x.VisitTarget != EVisitTarget.Seat), d => d.VoiceEvaluate)
-            .Map(d => d.VoiceEvaluate, s => s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VoiceEvaluate)
-            .IgnoreIf((s, d) => s.OrderVisit == null || s.OrderVisit.OrderVisitDetails.All(x => x.VisitTarget != EVisitTarget.Seat), d => d.SeatEvaluate)
-            .Map(d => d.SeatEvaluate, s => s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).SeatEvaluate)
-            .IgnoreIf((s, d) => s.OrderVisit == null || s.OrderVisit.OrderVisitDetails.All(x => x.VisitTarget != EVisitTarget.Seat), d => d.VisitContent)
-            .Map(d => d.VisitContent, s => s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VisitContent)
-            .IgnoreIf((s, d) => s.OrderVisit == null || s.OrderVisit.OrderVisitDetails.All(x => x.VisitTarget != EVisitTarget.Org), d => d.OrderFlowVisitDetails)
-            .Map(d => d.OrderFlowVisitDetails, s => s.OrderVisit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org))
+            .AfterMapping((s, d) =>
+            {
+                if(s.TraceStyle == ETraceStyle.Visit 
+                   && s.OrderVisit != null 
+                   && s.OrderVisit.OrderVisitDetails.Any(x => x.VisitTarget == EVisitTarget.Seat))
+                {
+                    d.VoiceEvaluate = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VoiceEvaluate;
+                    d.SeatEvaluate = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).SeatEvaluate;
+                    d.VisitContent = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VisitContent;
+                }
+                if(s.TraceStyle == ETraceStyle.Visit
+                   && s.OrderVisit != null
+                   && s.OrderVisit.OrderVisitDetails.Any(x => x.VisitTarget == EVisitTarget.Org))
+                {
+                    d.OrderFlowVisitDetails = s.OrderVisit.OrderVisitDetails
+                        .Where(x => x.VisitTarget == EVisitTarget.Org)
+                        .ToList()
+                        .Adapt<IReadOnlyList<OrderFlowVisitDetail>>();
+                }
+            })
             ;
 
         config.ForType<OrderVisitDetail, OrderFlowVisitDetail>()
             .Map(d => d.OrgProcessingResults, s => s.OrgProcessingResults.Value)
-            .Map(d => d.OrgNoSatisfiedReason, s => string.Join(',', s.OrgNoSatisfiedReason.Select(d => d.Value)))
-            .Map(d => d.OrgHandledAttitude, s => s.OrgHandledAttitude.Value);
+            .Map(d => d.OrgNoSatisfiedReason, s => s.OrgNoSatisfiedReason.Select(d => d.Value))
+            .Map(d => d.OrgHandledAttitude, s => s.OrgHandledAttitude.Value)
+            ;
 
+        config.ForType<OrderCarboncopy, OrderDto>()
+            .Map(d => d, s => s.Order);
     }
 }

+ 106 - 75
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1,4 +1,5 @@
-using DotNetCore.CAP;
+using DocumentFormat.OpenXml.Drawing;
+using DotNetCore.CAP;
 using Hotline.Application.Quality;
 using Hotline.Authentications;
 using Hotline.Caching.Interfaces;
@@ -344,9 +345,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
             .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
-                                                                                                                           //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-                                                                                                                           //.Where(d => d.ExpiredTime != null &&
-                                                                                                                           //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+                                                                                                                                   //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+                                                                                                                                   //.Where(d => d.ExpiredTime != null &&
+                                                                                                                                   //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
             .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
             .OrderByIF(dto is { SortField: "no", SortRule: 0 }, x => x.No, OrderByType.Asc) //工单编号升序
             .OrderByIF(dto is { SortField: "no", SortRule: 1 }, x => x.No, OrderByType.Desc) //工单编号降序
@@ -427,9 +428,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
             .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
-             //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-             //.Where(d => d.ExpiredTime != null &&
-            // d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+                                                                                                                                   //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+                                                                                                                                   //.Where(d => d.ExpiredTime != null &&
+                                                                                                                                   // d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
             .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
             .OrderByIF(dto is { SortField: "no", SortRule: 0 }, x => x.No, OrderByType.Asc) //工单编号升序
             .OrderByIF(dto is { SortField: "no", SortRule: 1 }, x => x.No, OrderByType.Desc) //工单编号降序
@@ -691,51 +692,58 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <returns></returns>
     public ISugarQueryable<Order> GetPublishOrderList(QueryOrderPublishDto dto)
     {
-        return _orderRepository.Queryable()
-            //.Includes(d => d.OrderPublish)
-            .Where(x => x.Status == EOrderStatus.Filed)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
-            .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
-            //.WhereIF(dto.PubState == EPubState.Pub, d => d.Status >= EOrderStatus.Published)
-            //.WhereIF(dto.PubState == EPubState.NoPub, d => d.Status == EOrderStatus.Filed)
-            .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
-            .WhereIF(!string.IsNullOrEmpty(dto.OrderTag), d => d.OrderTagCode == dto.OrderTag!) //工单标签
-            .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName.Contains(dto.CenterToOrgHandlerName)) //派单人
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo) || d.AcceptorStaffNo.Contains(dto.NameOrNo)) //受理人/坐席
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
-            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
-            .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
-                                                                                              //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
-                                                                                              //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
-                                                                                              //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
-                                                                                              //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
-            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
-            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.FileOrgIsCenter == true)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.FileOrgIsCenter == false)
-            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
-            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
-            .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
-            .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
-            //.WhereIF(dto.Resolve.HasValue, d => d.OrderPublish.Resolve == dto.Resolve)
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
-            .WhereIF(dto.FiledTimeStart.HasValue, d => d.FiledTime >= dto.FiledTimeStart)
-            .WhereIF(dto.FiledTimeEnd.HasValue, d => d.FiledTime <= dto.FiledTimeEnd)
-            .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
-             .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
-            .WhereIF(dto.IsOverTime == true,
-                d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
-                     (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
-            .WhereIF(dto.IsOverTime == false,
-                d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) ||
-                     (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
-            .OrderByDescending(d => d.FiledTime);
+        var query = _orderRepository.Queryable();
+        if (_appOptions.Value.IsLuZhou)
+            query = query.Includes(d => d.FwCallRecord);
+        //.Includes(d => d.OrderPublish)
+        return query.Where(x => x.Status == EOrderStatus.Filed)
+              .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
+              .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
+              .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
+              //.WhereIF(dto.PubState == EPubState.Pub, d => d.Status >= EOrderStatus.Published)
+              //.WhereIF(dto.PubState == EPubState.NoPub, d => d.Status == EOrderStatus.Filed)
+              .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
+              .WhereIF(!string.IsNullOrEmpty(dto.OrderTag), d => d.OrderTagCode == dto.OrderTag!) //工单标签
+              .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName.Contains(dto.CenterToOrgHandlerName)) //派单人
+              .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo) || d.AcceptorStaffNo.Contains(dto.NameOrNo)) //受理人/坐席
+              .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
+              .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
+              .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
+              .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+              .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
+                                                                                                //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
+                                                                                                //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
+                                                                                                //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
+                                                                                                //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
+              .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
+              .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+              .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.FileOrgIsCenter == true)
+              .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.FileOrgIsCenter == false)
+              .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
+              .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
+              .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
+              .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
+              //.WhereIF(dto.Resolve.HasValue, d => d.OrderPublish.Resolve == dto.Resolve)
+              .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
+              .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+              .WhereIF(dto.FiledTimeStart.HasValue, d => d.FiledTime >= dto.FiledTimeStart)
+              .WhereIF(dto.FiledTimeEnd.HasValue, d => d.FiledTime <= dto.FiledTimeEnd)
+
+              .WhereIF(dto.ExpiredTimeProvinceStart.HasValue, d => d.ExpiredTimeProvince >= dto.ExpiredTimeProvinceStart)//省期满时间开始
+              .WhereIF(dto.ExpiredTimeProvinceEnd.HasValue, d => d.ExpiredTimeProvince <= dto.ExpiredTimeProvinceEnd)//省期满时间结束
+              .WhereIF(dto.Iszgzfw.HasValue && dto.Iszgzfw == true, d => d.ReceiveProvinceNo.StartsWith("ZGZFW"))
+              .WhereIF(dto.Isgjzwfwpt.HasValue && dto.Isgjzwfwpt == true, d => d.ReceiveProvinceNo.StartsWith("GJZWFWPT"))
+              .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
+               .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
+              .WhereIF(dto.IsOverTime == true,
+                  d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
+                       (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
+              .WhereIF(dto.IsOverTime == false,
+                  d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) ||
+                       (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed))//否 超期
+              .OrderByDescending(d => d.FiledTime);
     }
 
     public ISugarQueryable<OrderPublish> GetPublishedOrder(PublishedPagedRequest dto)
@@ -1028,7 +1036,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
         else if (dto.Workflow.FlowDirection is EFlowDirection.CenterToOrg)
         {
-            expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
+            if (_appOptions.Value.IsLuZhou)
+            {
+                expiredTimeConfig = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, new TimeConfig() { Count = dto.Data.TimeLimit, TimeType = dto.Data.TimeLimitUnit.Value }, order.AcceptTypeCode);
+            }
+            else
+            {
+                expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
+            }
             var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
             order.CenterToOrg(
                 expiredTimeConfig.TimeText, expiredTimeConfig.Count,
@@ -1337,7 +1352,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
          .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
          .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
          .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
-                                                                                            //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
+         .WhereIF(dto.StartTimeStart.HasValue, d => d.StartTime >= dto.StartTimeStart) //流程开启时间开始
+         .WhereIF(dto.StartTimeEnd.HasValue, d => d.StartTime <= dto.StartTimeEnd) //流程开启时间结束
+                                                                                   //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
          .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
          .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact.Contains(dto.PhoneNo)) //联系电话
                                                                                             //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
@@ -2978,8 +2995,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
             .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体
-           .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
+            .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)
+            .WhereIF(dto.AiVisitResult.HasValue && dto.AiVisitResult == EAiVisitResult.OrgProcessingResultsNoSatisfied, d => d.VisitState == EVisitState.WaitForVisit && d.VisitType == EVisitType.ChipVoiceVisit && d.OrderVisitDetails.Any(m => SqlFunc.JsonField(m.OrgProcessingResults, "Key") == "2"))
             .OrderByDescending(x => x.PublishTime)
             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel)
             .OrderByDescending(d => d.PublishTime);
@@ -3439,33 +3457,46 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept or EOrderStatus.Handling)
             .ToArray();
 
-        var query = _orderRepository.Queryable()
-            .Includes(d => d.WorkflowSteps.Where(step =>
-                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
-                .OrderByDescending(step => step.CreationTime)
-                .Take(1)
-                .ToList()
-            );
+        //var query = _orderRepository.Queryable()
+        //    .Includes(d => d.WorkflowSteps.Where(step =>
+        //            ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+        //             (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+        //             (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+        //             (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+        //              && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+        //        .OrderByDescending(step => step.CreationTime)
+        //        .Take(1)
+        //        .ToList()
+        //    );
+        var query = _orderRepository.Queryable();
 
         var hasHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
         if (hasHandled)
         {
-            query.Where(d => d.WorkflowSteps
-                .Any(step =>
-                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
-                    && step.Status == EWorkflowStepStatus.Handled));
+            query.Includes(d => d.WorkflowSteps.Where(step =>
+                    !string.IsNullOrEmpty(step.HandlerId)
+                    && step.HandlerId == _sessionContext.UserId
+                    && step.Status == EWorkflowStepStatus.Handled
+                ))
+                .Where(d => d.WorkflowSteps
+                    .Any(step =>
+                        !string.IsNullOrEmpty(step.HandlerId)
+                        && step.HandlerId == _sessionContext.UserId
+                        && step.Status == EWorkflowStepStatus.Handled));
         }
         else
         {
-            query.Where(d => d.WorkflowSteps
+
+            query.Includes(d => d.WorkflowSteps.Where(step =>
+                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+                    .OrderByDescending(step => step.CreationTime)
+                    .Take(1)
+                    .ToList())
+                .Where(d => d.WorkflowSteps
                 .Any(step =>
                     ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
                      (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||

+ 2 - 2
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -81,8 +81,8 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                         {
                             var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
                             visitDetail.OrgProcessingResults = screenSatisfy;
-                            if (_appOptions.Value.IsYiBin)
-                                visitDetail.OrgNoSatisfiedReason = new List<Kv>();
+                            //if (_appOptions.Value.IsYiBin)
+                            //    visitDetail.OrgNoSatisfiedReason = new List<Kv>();
 
                             //visitDetail.OrgHandledAttitude = screenSatisfy;
                             await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);

+ 10 - 0
src/Hotline.Application/StatisticalReport/CallReport/CallReportApplicationBase.cs

@@ -257,6 +257,16 @@ public abstract class CallReportApplicationBase : ICallReportApplication
         throw new NotImplementedException();
     }
 
+    /// <summary>
+    /// 呼出话务统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public virtual Task<List<QueryCallOutDateStatisticsDetailResp>> QueryCallOutDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto)
+    {
+        throw new NotImplementedException();
+    }
+
     /// <summary>
     /// 坐席话务统计分析
     /// </summary>

+ 9 - 0
src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs

@@ -280,6 +280,15 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
         return await _trCallRecordRepositoryEx.QueryEnterpriseCallDateStatisticsDetail(dto.StartTime.Value, dto.EndTime.Value);
     }
 
+    /// <summary>
+    /// 呼出话务统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public override async Task<List<QueryCallOutDateStatisticsDetailResp>> QueryCallOutDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto)
+    {
+        return null;
+    }
 
 
     //public override async Task<PagedDto<TrCallDto>> GetCallDetailListAsync(GetCallListDto dto, CancellationToken cancellationToken)

+ 6 - 1
src/Hotline.Application/StatisticalReport/ICallReportApplication.cs

@@ -70,6 +70,11 @@ namespace Hotline.Application.StatisticalReport
         /// <returns></returns>
         Task<List<QueryEnterpriseCallDateStatisticsDetailResp>> QueryEnterpriseCallDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto);
 
-        //Task<List<object>> QueryCallOutDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto);
+        /// <summary>
+        /// 呼出话务统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<List<QueryCallOutDateStatisticsDetailResp>> QueryCallOutDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto);
     }
 }

+ 2 - 1
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1648,7 +1648,8 @@ namespace Hotline.Application.StatisticalReport
                 .WhereIF(dto.StartTime.HasValue, x => x.OrderVisit.VisitTime >= dto.StartTime.Value)
                 .WhereIF(dto.EndTime.HasValue, x => x.OrderVisit.VisitTime <= dto.EndTime.Value)
                 .WhereIF(isCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key")== dto.OrgProcessingResults)
+                .WhereIF(dto.OrgProcessingResults == "-1", x => SqlFunc.JsonArrayLength(x.OrgNoSatisfiedReason) > 0)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
                 .GroupBy((x, org) => new { VisitOrgName = org.Name, VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) })
                 .Select((x, org) => new BiVisitNoSatisfiedDto
                 {

+ 35 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/StepBasicDto.cs

@@ -1,5 +1,6 @@
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Enums.FlowEngine;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.FlowEngine.Workflow
 {
@@ -25,6 +26,26 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         /// </summary>
         public string? PrevChosenStepCode { get; set; }
 
+        #region 交办
+
+        /// <summary>
+        /// 交办人
+        /// </summary>
+        public string? AssignerId { get; set; }
+
+        public string? AssignerName { get; set; }
+
+        /// <summary>
+        /// 交办人部门Id
+        /// </summary>
+        public string? AssignerOrgId { get; set; }
+
+        public string? AssignerOrgName { get; set; }
+
+        public bool? AssignerOrgIsCenter { get; set; }
+
+        #endregion
+
         #region 接办
 
         /// <summary>
@@ -92,6 +113,20 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         /// </summary>
         public DateTime? HandleTime { get; set; }
 
+        /// <summary>
+        /// 办理方式
+        /// </summary>
+        public EHandleMode? HandleMode { get; set; }
+
+        public string? HandleModeText => HandleMode.HasValue ? HandleMode.GetDescription() : "";
+
+        /// <summary>
+        /// 审核结果(非审批流程无意义)
+        /// </summary>
+        public EReviewResult ReviewResult { get; set; }
+
+        public string ReviewResultText => ReviewResult.GetDescription();
+
         #endregion
 
         #region Definition

+ 130 - 90
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -14,68 +14,68 @@ namespace Hotline.Share.Dtos.Knowledge
     /// <param name="id"></param>
     public record AuditLogListPagedDto(string? id) : PagedKeywordRequest;
 
-	/// <summary>
-	/// 审核管理
-	/// </summary>
-	/// <param name="EKnowledgeApplyType">申请类型</param>
-	/// <param name="EKnowledgeWorkFlowStatus">审核状态</param>
-	public record KnowledgeApprovalPagedListDto(EKnowledgeApplyType? EKnowledgeApplyType, EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus) : PagedKeywordRequest;
-
-	/// <summary>
-	/// 知识检索
-	/// </summary>
-	/// <param name="RetrievalType">检索类型</param>
-	/// <param name="Attribution">归属</param>
-	/// <param name="Sort">排序字段</param>
-	/// <param name="CreateOrgId">部门id</param>
-	/// <param name="HotspotId">热点id</param>
-	/// <param name="HotspotName">热点名称</param>;
-	/// <param name="KnowledgeTypeId">类型id</param>
-	/// <param name="Content">受理内容</param>
-	public record KnowledgeRetrievalPagedListDto : PagedKeywordRequest
-	{
-		/// <summary>
-		/// 检索类型
-		/// </summary>
-		public EKnowledgeRetrievalType? RetrievalType { get; set; }
-
-		/// <summary>
-		/// 归属
-		/// </summary>
-		public string? Attribution { get; set; }
-
-		/// <summary>
-		/// 排序字段
-		/// </summary>
-		public string Sort { get; set; }
-
-		/// <summary>
-		/// 部门id
-		/// </summary>
-		public string? CreateOrgId { get; set; }
-
-		/// <summary>
-		/// 热点id
-		/// </summary>
-		public string? HotspotId { get; set; }
-
-		/// <summary>
-		/// 热点名称
-		/// </summary>
-		public string? HotspotName { get; set; }
-
-		/// <summary>
-		/// 类型id
-		/// </summary>
-		public string? KnowledgeTypeId { get; set; }
-
-		/// <summary>
-		/// 受理内容
-		/// </summary>
-		public string? Content { get; set; }
-	};
-
-	/// <summary>
+    /// <summary>
+    /// 审核管理
+    /// </summary>
+    /// <param name="EKnowledgeApplyType">申请类型</param>
+    /// <param name="EKnowledgeWorkFlowStatus">审核状态</param>
+    public record KnowledgeApprovalPagedListDto(EKnowledgeApplyType? EKnowledgeApplyType, EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus) : PagedKeywordRequest;
+
+    /// <summary>
+    /// 知识检索
+    /// </summary>
+    /// <param name="RetrievalType">检索类型</param>
+    /// <param name="Attribution">归属</param>
+    /// <param name="Sort">排序字段</param>
+    /// <param name="CreateOrgId">部门id</param>
+    /// <param name="HotspotId">热点id</param>
+    /// <param name="HotspotName">热点名称</param>;
+    /// <param name="KnowledgeTypeId">类型id</param>
+    /// <param name="Content">受理内容</param>
+    public record KnowledgeRetrievalPagedListDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 检索类型
+        /// </summary>
+        public EKnowledgeRetrievalType? RetrievalType { get; set; }
+
+        /// <summary>
+        /// 归属
+        /// </summary>
+        public string? Attribution { get; set; }
+
+        /// <summary>
+        /// 排序字段
+        /// </summary>
+        public string Sort { get; set; }
+
+        /// <summary>
+        /// 部门id
+        /// </summary>
+        public string? CreateOrgId { get; set; }
+
+        /// <summary>
+        /// 热点id
+        /// </summary>
+        public string? HotspotId { get; set; }
+
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        public string? HotspotName { get; set; }
+
+        /// <summary>
+        /// 类型id
+        /// </summary>
+        public string? KnowledgeTypeId { get; set; }
+
+        /// <summary>
+        /// 受理内容
+        /// </summary>
+        public string? Content { get; set; }
+    };
+
+    /// <summary>
     /// 来电弹屏知识库查询
     /// </summary>
     /// <param name="HotspotId">热点ID</param>
@@ -87,7 +87,7 @@ namespace Hotline.Share.Dtos.Knowledge
     /// <param name="EKnowledgeWorkFlowStatus"></param>
     /// <param name="StartApplyTime"></param>
     /// <param name="EndApplyTime"></param>
-    public record KnowledgeDeletelPagedListDto(EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus,DateTime? StartApplyTime, DateTime? EndApplyTime) : PagedKeywordRequest;
+    public record KnowledgeDeletelPagedListDto(EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus, DateTime? StartApplyTime, DateTime? EndApplyTime) : PagedKeywordRequest;
 
     /// <summary>
     /// 
@@ -105,42 +105,42 @@ namespace Hotline.Share.Dtos.Knowledge
     //public record KnowPagedListDto(string? CreateOrgId, string? HotspotId, string? KnowledgeTypeId, EKnowledgeStatus? Status, DateTime? CreationStartTime, DateTime? CreationEndTime,
     //  DateTime? StartOnShelfTime, DateTime? EndOnShelfTime, DateTime? StartOffShelfTime, DateTime? EndOffShelfTime) : PagedKeywordRequest;
 
-    public record KnowPagedListDto : PagedKeywordRequest 
+    public record KnowPagedListDto : PagedKeywordRequest
     {
         /// <summary>
         /// 标题
         /// </summary>
-        public string? Title { get; set; }  
+        public string? Title { get; set; }
 
         /// <summary>
         /// 状态
         /// </summary>
         public EKnowledgeStatus? Status { get; set; }
 
-		/// <summary>
-		/// 草稿状态下的查询条件
-		/// </summary>
-		public EKnowledgeStatus? NewDraftsStatus { get; set; }
+        /// <summary>
+        /// 草稿状态下的查询条件
+        /// </summary>
+        public EKnowledgeStatus? NewDraftsStatus { get; set; }
 
-		/// <summary>
-		/// 是否公开
-		/// </summary>
-		public bool? IsPublic { get; set; }
+        /// <summary>
+        /// 是否公开
+        /// </summary>
+        public bool? IsPublic { get; set; }
 
-		/// <summary>
-		/// 摘要
-		/// </summary>
-		public string? Summary { get; set; }
+        /// <summary>
+        /// 摘要
+        /// </summary>
+        public string? Summary { get; set; }
 
-		/// <summary>
-		/// 部门
-		/// </summary>
-		public string? CreateOrgId { get; set; }
+        /// <summary>
+        /// 部门
+        /// </summary>
+        public string? CreateOrgId { get; set; }
 
-		/// <summary>
-		/// 热点
-		/// </summary>
-		public string? HotspotId { get; set; }
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotId { get; set; }
 
         /// <summary>
         /// 分类
@@ -152,10 +152,50 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public string? ModuleCode { get; set; }
 
-		/// <summary>
-		///   归属
-		/// </summary>
-		public string? Attribution { get; set; }
+        /// <summary>
+        ///   归属
+        /// </summary>
+        public string? Attribution { get; set; }
+
+        /// <summary>
+        /// 创建开始
+        /// </summary>
+        public DateTime? CreationStartTime { get; set; }
+
+        /// <summary>
+        /// 创建结束
+        /// </summary>
+        public DateTime? CreationEndTime { get; set; }
+
+        /// <summary>
+        /// 上架开始
+        /// </summary>
+        public DateTime? StartOnShelfTime { get; set; }
+
+        /// <summary>
+        /// 上架结束
+        /// </summary>
+        public DateTime? EndOnShelfTime { get; set; }
+
+        /// <summary>
+        /// 下架开始
+        /// </summary>
+        public DateTime? StartOffShelfTime { get; set; }
+
+        /// <summary>
+        /// 下架结束
+        /// </summary>
+        public DateTime? EndOffShelfTime { get; set; }
+
+        /// <summary>
+        /// 更新时间开始
+        /// </summary>
+        public DateTime? StartUpdateTime { get; set; }
+
+        /// <summary>
+        /// 更新时间结束
+        /// </summary>
+        public DateTime? EndUpdateTime { get; set; }
 
-	}
+    }
 }

+ 15 - 1
src/Hotline.Share/Dtos/Order/Detail/OrderFlowTraceDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using XF.Utility.EnumExtensions;
@@ -78,6 +79,14 @@ public class OrderFlowTraceDto
     /// </summary>
     public ETraceStyle TraceStyle { get; set; }
 
+    public EWorkflowStepStatus Status { get; set; }
+    public string StatusText => Status.GetDescription();
+
+    /// <summary>
+    /// 会签流转记录
+    /// </summary>
+    public List<OrderFlowTraceDto> Traces { get; set; }
+
     #region 流程节点展开
 
     /// <summary>
@@ -88,7 +97,7 @@ public class OrderFlowTraceDto
     /// <summary>
     /// 附件
     /// </summary>
-    public List<FileDto>? Files { get; set; }
+    public List<FileJson>? FileJson { get; set; }
 
     /// <summary>
     /// 备注
@@ -144,6 +153,11 @@ public class OrderFlowTraceDto
 /// </summary>
 public class OrderFlowVisitDetail
 {
+    /// <summary>
+    /// 回访部门名称
+    /// </summary>
+    public string VisitOrgName { get; set; }
+
     /// <summary>
     /// 部门办件结果
     /// </summary>

+ 31 - 6
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.CallCenter;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Hotspots;
 using Hotline.Share.Enums.FlowEngine;
@@ -31,10 +32,10 @@ namespace Hotline.Share.Dtos.Order
 
         public string ActualHandleOrgName { get; set; }
 
-		/// <summary>
-		/// 工单状态
-		/// </summary>
-		public EOrderStatus Status { get; set; }
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus Status { get; set; }
 
         public string StatusText => Status.GetDescription();
     }
@@ -171,7 +172,7 @@ namespace Hotline.Share.Dtos.Order
         /// <summary>
         /// 第一次评价结果代码
         /// </summary>
-        public string? FirstVisitResultCode { get; set; }        
+        public string? FirstVisitResultCode { get; set; }
 
         #region 实际办理信息(节点,部门,意见)
 
@@ -648,6 +649,28 @@ namespace Hotline.Share.Dtos.Order
             return string.Empty;
         }
 
+        /// <summary>
+        /// 剩余办理时长
+        /// </summary>
+        public string RemainingTime => RemainingTimeTextVoid();
+
+        public string RemainingTimeTextVoid()
+        {
+            if (Status >= EOrderStatus.Filed && FiledTime !=null)
+            {
+                return Math.Round((ExpiredTime.Value - FiledTime.Value).TotalDays,1) + "天";
+            }
+            else if(Status < EOrderStatus.Filed && ExpiredTime!=null)
+            {
+                return Math.Round((ExpiredTime.Value - DateTime.Now).TotalDays,1) + "天";
+            }
+            else
+            {
+                return "-";
+            }
+        }
+
+
         /// <summary>
         /// 超期部门
         /// </summary>
@@ -707,6 +730,8 @@ namespace Hotline.Share.Dtos.Order
 
         public List<OrderVisitDto>? OrderVisits { get; set; }
 
+        public CallNativeDto? FwCallRecord { get; set; }
+
         public List<FileJson>? FileJson { get; set; }
 
         /// <summary>

+ 21 - 1
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -1,6 +1,8 @@
 using System.ComponentModel;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.Org;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Settings;
 
 namespace Hotline.Share.Dtos.Order
 {
@@ -21,10 +23,20 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public List<CrossStep> CrossSteps { get; set; }
 
+        /// <summary>
+        /// 协办部门
+        /// </summary>
+        public List<OrgDto> SecondaryOrgs { get; set; }
+
         /// <summary>
         /// 抄送对象
         /// </summary>
-        public List<FlowStepHandler> CopyToHandlers { get; set; }
+        public List<FlowStepHandler> Copys { get; set; }
+
+        /// <summary>
+        /// 是否直派
+        /// </summary>
+        public bool IsDirect{ get; set; }
         
         #region 手动填入办理人信息
 
@@ -125,6 +137,14 @@ namespace Hotline.Share.Dtos.Order
         public string? TranspondCityValue { get; set; }
 
         #endregion
+
+        #region 延期信息
+
+        public int TimeLimit { get; set; }
+
+        public ETimeType? TimeLimitUnit { get; set; }
+
+        #endregion
     }
 
     public class CrossStep : BasicWorkflowDto

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

@@ -132,6 +132,11 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? CreationTimeStart { get; set; }
         public DateTime? CreationTimeEnd { get; set; }
 
+        /// <summary>
+        /// 智能回访结果
+        /// </summary>
+        public EAiVisitResult? AiVisitResult { get; set; }
+
     }
 
     public record QueryOrderPublishStatisticsAllDto : PagedRequest

+ 134 - 115
src/Hotline.Share/Dtos/Order/Publish/QueryOrderPublishDto.cs

@@ -5,127 +5,137 @@ namespace Hotline.Share.Dtos.Order.Publish;
 
 public record QueryOrderPublishDto : PagedKeywordRequest
 {
-	/// <summary>
-	/// 发布状态
-	/// </summary>
-	public EPubState? PubState { get; set; }
-
-	/// <summary>
-	/// 工单编号
-	/// </summary>
-	public string? No { get; set; }
-
-	/// <summary>
-	/// 工单标题
-	/// </summary>
-	public string? Title { get; set; }
-
-	/// <summary>
-	/// 受理时间(工单创建时间)
-	/// </summary>
-	public DateTime? CreationTimeStart { get; set; }
-	public DateTime? CreationTimeEnd { get; set; }
-
-	/// <summary>
-	/// 来电号码(×)
-	/// </summary>
-	public string? FromPhone { get; set; }
-
-	/// <summary>
-	/// 接办名称(综合查询使用)
-	/// </summary>
-	public string? ActualHandleOrgName { get; set; }
-
-	/// <summary>
-	/// 受理类型
-	/// </summary>
-	public List<string>? AcceptTypes { get; set; } = new();
-
-
-	/// <summary>
-	/// 受理类型(√)
-	/// </summary>
-	public string? AcceptType { get; set; }
-
-	/// <summary>
-	/// 热点分类关键词
-	/// </summary>
-	public string? Hotspot { get; set; }
-
-	/// <summary>
-	/// 热点分类
-	/// </summary>
-	public List<string>? HotspotIds { get; set; } = new();
-
-	/// <summary>
-	/// 受理坐席名字或工号(×)
-	/// </summary>
-	public string? NameOrNo { get; set; }
-
-	/// <summary>
-	/// 派单人
-	/// </summary>
-	public string? CenterToOrgHandlerName { get; set; }
-
-	/// <summary>
-	/// 发布范围
-	/// </summary>
-	public EPublicState? PubRange { get; set; }
-
-	/// <summary>
-	/// 归档时间
-	/// </summary>
-	public DateTime? FiledTimeStart { get; set; }
-	public DateTime? FiledTimeEnd { get; set; }
-
-	/// <summary>
-	/// 工单标签
-	/// </summary>
-	public string? OrderTag { get; set; }
-
-	/// <summary>
-	/// 归档方式
-	/// </summary>
-	public FiledType? FiledType { get; set; }
-
-	/// <summary>
-	/// 是否会签
-	/// </summary>
-	public bool? IsCountersign { get; set; }
-
-	/// <summary>
-	/// 是否解决
-	/// </summary>
-	public bool? Resolve { get; set; }
-
-	/// <summary>
-	/// 是否只查询自己的待发布工单
-	/// </summary>
-	public bool? QuerySelf { get; set; }
-
-	/// <summary>
-	/// 是否省工单(空为全部  true为省工单 false为市工单)
-	/// </summary>
-	public bool? IsProvinceOrder { get; set; }
-
-	/// <summary>
-	/// 来源渠道(√)
-	/// </summary>
-	public string? Channel { get; set; }
-
-	/// <summary>
-	/// 是否超期
-	/// </summary>
-	public bool? IsOverTime { get; set; }
+    /// <summary>
+    /// 发布状态
+    /// </summary>
+    public EPubState? PubState { get; set; }
+
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 工单标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 受理时间(工单创建时间)
+    /// </summary>
+    public DateTime? CreationTimeStart { get; set; }
+    public DateTime? CreationTimeEnd { get; set; }
+
+    /// <summary>
+    /// 省期满时间开始
+    /// </summary>
+    public DateTime? ExpiredTimeProvinceStart { get; set; }
+
+    /// <summary>
+    /// 省期满时间结束
+    /// </summary>
+    public DateTime? ExpiredTimeProvinceEnd { get; set; }
+
+    /// <summary>
+    /// 来电号码(×)
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 接办名称(综合查询使用)
+    /// </summary>
+    public string? ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public List<string>? AcceptTypes { get; set; } = new();
+
+
+    /// <summary>
+    /// 受理类型(√)
+    /// </summary>
+    public string? AcceptType { get; set; }
+
+    /// <summary>
+    /// 热点分类关键词
+    /// </summary>
+    public string? Hotspot { get; set; }
+
+    /// <summary>
+    /// 热点分类
+    /// </summary>
+    public List<string>? HotspotIds { get; set; } = new();
+
+    /// <summary>
+    /// 受理坐席名字或工号(×)
+    /// </summary>
+    public string? NameOrNo { get; set; }
+
+    /// <summary>
+    /// 派单人
+    /// </summary>
+    public string? CenterToOrgHandlerName { get; set; }
+
+    /// <summary>
+    /// 发布范围
+    /// </summary>
+    public EPublicState? PubRange { get; set; }
+
+    /// <summary>
+    /// 归档时间
+    /// </summary>
+    public DateTime? FiledTimeStart { get; set; }
+    public DateTime? FiledTimeEnd { get; set; }
+
+    /// <summary>
+    /// 工单标签
+    /// </summary>
+    public string? OrderTag { get; set; }
+
+    /// <summary>
+    /// 归档方式
+    /// </summary>
+    public FiledType? FiledType { get; set; }
+
+    /// <summary>
+    /// 是否会签
+    /// </summary>
+    public bool? IsCountersign { get; set; }
+
+    /// <summary>
+    /// 是否解决
+    /// </summary>
+    public bool? Resolve { get; set; }
+
+    /// <summary>
+    /// 是否只查询自己的待发布工单
+    /// </summary>
+    public bool? QuerySelf { get; set; }
+
+    /// <summary>
+    /// 是否省工单(空为全部  true为省工单 false为市工单)
+    /// </summary>
+    public bool? IsProvinceOrder { get; set; }
+
+    /// <summary>
+    /// 来源渠道(√)
+    /// </summary>
+    public string? Channel { get; set; }
+
+    /// <summary>
+    /// 是否超期
+    /// </summary>
+    public bool? IsOverTime { get; set; }
 
     /// <summary>
     /// 查询批次
     /// </summary>
     public int QueryIndex { get; set; }
 
-	/// <summary>
-	/// 一级部门
-	/// </summary>
+    /// <summary>
+    /// 一级部门
+    /// </summary>
     public string? OrgLevelOneName { get; set; }
 
     /// <summary>
@@ -133,4 +143,13 @@ public record QueryOrderPublishDto : PagedKeywordRequest
     /// </summary>
     public EIdentityType? IdentityType { get; set; }
 
+    /// <summary>
+    /// 中国政府网
+    /// </summary>
+    public bool? Iszgzfw { get; set; }
+
+    /// <summary>
+    /// 国家平台转办件
+    /// </summary>
+    public bool? Isgjzwfwpt { get; set; }
 }

+ 6 - 0
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -75,6 +75,12 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? CreationTimeStart { get; set; }
         public DateTime? CreationTimeEnd { get; set; }
 
+         /// <summary>
+        /// 开始时间(流程开启时间)
+        /// </summary>
+        public DateTime? StartTimeStart { get; set; }
+        public DateTime? StartTimeEnd { get; set; }
+
         /// <summary>
         /// 来电号码(×)
         /// </summary>

+ 1 - 1
src/Hotline.Share/Dtos/Org/OrgDto.cs

@@ -53,7 +53,7 @@ namespace Hotline.Share.Dtos.Org
         public string Id { get; set; }
     }
 
-    public class OrgDto : AddOrgDto
+    public class OrgDto : UpdateOrgDto
     {
         ///// <summary>
         ///// 组织架构Code

+ 6 - 1
src/Hotline.Share/Enums/FlowEngine/EReviewResult.cs

@@ -1,19 +1,24 @@
-namespace Hotline.Share.Enums.FlowEngine;
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.FlowEngine;
 
 public enum EReviewResult
 {
     /// <summary>
     /// 未知
     /// </summary>
+    [Description("未办理")]
     Unknown = 0,
 
     /// <summary>
     /// 通过
     /// </summary>
+    [Description("同意")]
     Approval = 1,
 
     /// <summary>
     /// 审核失败
     /// </summary>
+    [Description("不同意")]
     Failed = 2,
 }

+ 9 - 0
src/Hotline.Share/Enums/Order/EVisitType.cs

@@ -57,4 +57,13 @@ namespace Hotline.Share.Enums.Order
         [Description("其他")]
         OtherVisit = 100,
     }
+
+    public enum EAiVisitResult
+    {
+        /// <summary>
+        /// 部门办件不满意
+        /// </summary>
+        [Description("部门办件不满意")]
+        OrgProcessingResultsNoSatisfied = 1,
+    }
 }

+ 6 - 0
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -249,6 +249,12 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     public EHandleMode? HandleMode { get; set; } = EHandleMode.Normal;
 
+    /// <summary>
+    /// 审核结果(非审批流程无意义)
+    /// </summary>
+    [SugarColumn(DefaultValue = "0")]
+    public EReviewResult ReviewResult { get; set; }
+
     #endregion
 
     #region Definition

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

@@ -2073,6 +2073,7 @@ namespace Hotline.FlowEngine.Workflows
             step.IsSms = dto.IsSms;
             step.Opinion = dto.Opinion;
             step.Remark = dto.Remark;
+            step.ReviewResult = dto.ReviewResult;
 
             //step办理状态
             HandleStep(step, handleMode, dto.Opinion, dto.NextStepCode);
@@ -3238,6 +3239,7 @@ namespace Hotline.FlowEngine.Workflows
             pubTrace.HandlerOrgAreaName = null;
             pubTrace.StepExpiredTime = null;
 
+            pubTrace.CreationTime = endTrace.CreationTime.AddSeconds(1);
             await _workflowTraceRepository.AddAsync(pubTrace, cancellation);
 
             return pubTrace;
@@ -3281,7 +3283,6 @@ namespace Hotline.FlowEngine.Workflows
         {
             var now = DateTime.Now;
             var TrashEndTrace = _mapper.Map<WorkflowTrace>(visitTrace);
-            TrashEndTrace.Id = null;
             TrashEndTrace.StepId = null;
             TrashEndTrace.OrderPublishId = null;
             TrashEndTrace.OrderVisitId = null;
@@ -3316,9 +3317,9 @@ namespace Hotline.FlowEngine.Workflows
 
             TrashEndTrace.StepExpiredTime = null;
 
-            await _workflowTraceRepository.AddAsync(visitTrace, cancellation);
+            await _workflowTraceRepository.AddAsync(TrashEndTrace, cancellation);
 
-            return visitTrace;
+            return TrashEndTrace;
         }
 
         /// <summary>

+ 7 - 0
src/Hotline/Orders/Order.cs

@@ -1158,6 +1158,13 @@ namespace Hotline.Orders
         [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.OtherAccept))]
         public TrCallRecord CallRecord { get; set; }
 
+        /// <summary>
+        /// 兴唐通话记录
+        /// </summary>
+        //[Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))] //由CallAccept改成OtherAccept
+        [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(CallNative.Id))]
+        public CallNative FwCallRecord { get; set; }
+
         [Navigate(NavigateType.OneToMany, nameof(WorkflowStep.ExternalId))]
         public List<WorkflowStep> WorkflowSteps { get; set; }
 

+ 27 - 0
src/Hotline/Orders/OrderCarboncopy.cs

@@ -0,0 +1,27 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    [Description("工单抄送")]
+    [SugarIndex("index_ordercc_orderid", nameof(OrderCarboncopy.OrderId), OrderByType.Desc)]
+    public class OrderCarboncopy : CreationEntity
+    {
+        public string OrderId { get; set; }
+        public string? UserId { get; set; }
+        public string? Username { get; set; }
+        public string? OrgId { get; set; }
+        public string? OrgName { get; set; }
+        public string? RoleId { get; set; }
+        public string? RoleName { get; set; }
+
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+    }
+}

+ 40 - 37
src/Hotline/Orders/OrderDomainService.cs

@@ -295,49 +295,52 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
         //需求251  某些工单需自动发送短信
         //任何类型的省工单都不需要发送短信
-        try
+        var isOpenSendEndSms = _systemSettingCacheManager.GetSetting(SettingConstants.IsOpenSendEndSms)?.SettingValue[0];
+        if (isOpenSendEndSms == "true")
         {
-            if (order.Source != ESource.ProvinceStraight && _appOptions.Value.IsYiBin)
+            try
             {
-                var code = "";
-                //受理类型为“投诉、举报”
-                if ((order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35") && orderVisit.VisitState != EVisitState.Visited)
-                {
-                    code = "1017";
-                    orderVisit.VisitState = EVisitState.SMSVisiting;
-                    await _orderVisitRepository.UpdateAsync(orderVisit);
-                }
-                else
-                    code = "1018";
-
-                //发送查询短信
-                var messageDto = new Share.Dtos.Push.MessageDto
+                if (order.Source != ESource.ProvinceStraight)
                 {
-                    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), cancellationToken);
+                    var code = "";
+                    //受理类型为“投诉、举报”
+                    if ((order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35") && orderVisit.VisitState != EVisitState.Visited)
+                    {
+                        code = "1017";
+                        orderVisit.VisitState = EVisitState.SMSVisiting;
+                        await _orderVisitRepository.UpdateAsync(orderVisit);
+                    }
+                    else
+                        code = "1018";
 
-                // 发送短信后推送一个 48小时的延迟消息队列. 当消息队列收到消息时, 判断用户是否回复了, 如果未回复短信就 默认满意
-                var delaySecond = _systemSettingCacheManager.DefaultVisitSmsDelaySecond;
-                await _capPublisher.PublishDelayAsync(
-                    TimeSpan.FromSeconds(delaySecond),
-                    EventNames.UpdateVisitDelaySms,
-                    messageDto,
-                    cancellationToken: cancellationToken);
+                    //发送查询短信
+                    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), cancellationToken);
+
+                    // 发送短信后推送一个 48小时的延迟消息队列. 当消息队列收到消息时, 判断用户是否回复了, 如果未回复短信就 默认满意
+                    var delaySecond = _systemSettingCacheManager.DefaultVisitSmsDelaySecond;
+                    await _capPublisher.PublishDelayAsync(
+                        TimeSpan.FromSeconds(delaySecond),
+                        EventNames.UpdateVisitDelaySms,
+                        messageDto,
+                        cancellationToken: cancellationToken);
+                }
+            }
+            catch (Exception)
+            {
             }
         }
-        catch (Exception)
-        {
-        }
-
         if (order.IsProvince == false && orderVisit.VisitState == EVisitState.Visited)
         {
             //推省上

+ 6 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -682,6 +682,12 @@ namespace Hotline.Settings
         /// 网格员回复等待时间(单位:小时)
         /// 超过该时间自动退回工单
         /// </summary>
+        public const string IsTheAssignmentFormConfidential = "IsTheAssignmentFormConfidential";
+
+        /// <summary>
+        /// 办结是否发送查询短信
+        /// </summary>
+        public const string IsOpenSendEndSms = "IsOpenSendEndSms";
         public const string OvertimeBack = "OvertimeBack";
     }
 }

+ 5 - 5
src/Hotline/Statistics/StatisticsDepart.cs

@@ -198,11 +198,11 @@ namespace Hotline.Statistics
 		[SugarColumn(Length = 10, DecimalDigits = 6, ColumnDescription = "总满意率")]
 		public decimal AllSatisfaction { get; set; }
 
-		/// <summary>
-		/// 统计日期
-		/// </summary>
-		[SugarColumn(ColumnDescription = "统计日期")]
-		public int DateTime { get; set; }
+		///// <summary>
+		///// 统计日期
+		///// </summary>
+		//[SugarColumn(ColumnDescription = "统计日期")]
+		//public int DateTime { get; set; }
 
 		/// <summary>
 		/// 统计时限

+ 5 - 5
src/Hotline/Statistics/StatisticsDepartSatisfied.cs

@@ -132,11 +132,11 @@ namespace Hotline.Statistics
 		public int ScreenWaitNum { get; set; }
 
 
-		/// <summary>
-		/// 统计日期
-		/// </summary>
-		[SugarColumn(ColumnDescription = "统计日期")]
-		public int DateTime { get; set; }
+		///// <summary>
+		///// 统计日期
+		///// </summary>
+		//[SugarColumn(ColumnDescription = "统计日期")]
+		//public int DateTime { get; set; }
 
 		/// <summary>
 		/// 统计时限

+ 5 - 5
src/Hotline/Statistics/StatisticsHotspotSatisfied.cs

@@ -101,11 +101,11 @@ namespace Hotline.Statistics
 		[SugarColumn(ColumnDescription = "(自贡)甄别为满意 自贡的视为满意名字是甄别为满意")]
 		public int ScreenSatisfaction { get; set; }
 
-		/// <summary>
-		/// 统计日期
-		/// </summary>
-		[SugarColumn(ColumnDescription = "统计日期")]
-		public int DateTime { get; set; }
+		///// <summary>
+		///// 统计日期
+		///// </summary>
+		//[SugarColumn(ColumnDescription = "统计日期")]
+		//public int DateTime { get; set; }
 
 		/// <summary>
 		/// 统计时限

+ 5 - 5
src/Hotline/Statistics/StatisticsPurTypeSatisfied.cs

@@ -102,11 +102,11 @@ namespace Hotline.Statistics
 		[SugarColumn(ColumnDescription = "无效")]
 		public int Invalid { get; set; }
 
-		/// <summary>
-		/// 统计日期
-		/// </summary>
-		[SugarColumn(ColumnDescription = "统计日期")]
-		public int DateTime { get; set; }
+		///// <summary>
+		///// 统计日期
+		///// </summary>
+		//[SugarColumn(ColumnDescription = "统计日期")]
+		//public int DateTime { get; set; }
 
 		/// <summary>
 		/// 统计时限

+ 8 - 2
src/Hotline/dataview.md

@@ -342,7 +342,7 @@ WHERE ordervisitdetailtemp."VisitTarget" = 20 and ordervisittemp."VisitTime">='2
 
 
  ### 信件清单查询(新)
- select '' as "序号",
+  select '' as "序号",
 aaa.信件状态,aaa."是否超期",aaa.来源,aaa.转接来源,aaa.当前节点,aaa.重办次数,aaa.甄别状态,aaa.受理编号,aaa.省编号,aaa.受理时间,aaa.标题,aaa.期满时间,aaa."一级部门",
 aaa.二级部门,aaa."接办部门",aaa."办结时间",aaa."受理类型",aaa."热点类型",aaa.热点全称,aaa."区域",aaa.区域全称,aaa."受理人",aaa."姓名",aaa."联系电话",aaa."来电电话",
 aaa."事发地址",aaa."具体对象",aaa."来电人主体",aaa."性别",ccc."SeatVisitResult" as "坐席满意度",bbb."OrgProcessingResults" as "满意度",aaa."推送分类",aaa."受理内容",
@@ -411,7 +411,12 @@ CASE
   WHEN "County" is not null and "County" <>'' THEN "County"
 	ELSE "City"
 END AS "区域",
-"Address"  As "区域全称",
+--"Address"  As "区域全称",
+CASE 
+	WHEN "Town" is not null and "Town" <> '' THEN "City" || '-' || "County" || '-' || "Town"
+	WHEN "County" is not null and "Town" <> '' THEN "City" || '-' || "County"
+	ELSE "City"
+END "区域全称",
 "AcceptorName" AS "受理人" ,
  "FromName" AS "姓名" , 
  "Contact" AS "联系电话" , 
@@ -458,6 +463,7 @@ where visittemp."CreationTime">='2024-08-29' and visitdetailtemp."VisitTarget"=1
 on aaa."SugarNav_Id" = ccc."OrderId"
 
 
+
 ### 重置工单回访部门信息
 update order_visit_detail set 
 "VisitOrgCode"= hhh."HandlerOrgId","VisitOrgName"=hhh."HandlerOrgName"