Kaynağa Gözat

Merge branch 'master' of http://git.fwt.com/Hotline/hotline

xf 2 yıl önce
ebeveyn
işleme
5f815e1d0c
24 değiştirilmiş dosya ile 574 ekleme ve 82 silme
  1. 5 2
      src/Hotline.Api/Controllers/HotSpotController.cs
  2. 34 5
      src/Hotline.Api/Controllers/KnowledgeApplyController.cs
  3. 37 3
      src/Hotline.Api/Controllers/KnowledgeController.cs
  4. 17 1
      src/Hotline.Api/Controllers/TestController.cs
  5. 1 1
      src/Hotline.Application.Contracts/Validators/Knowledge/AddKnowledgeApplyDtoValidator.cs
  6. 1 1
      src/Hotline.Application.Contracts/Validators/Knowledge/UpdateKnowledgeApplyDtoValidator.cs
  7. 2 5
      src/Hotline.Application/Knowledge/KnowApplication.cs
  8. 15 0
      src/Hotline.Application/TimeLimits/ITimeLimitApplication.cs
  9. 182 0
      src/Hotline.Application/TimeLimits/TimeLimitApplication.cs
  10. 26 0
      src/Hotline.Repository.SqlSugar/System/DaySettingRepository.cs
  11. 53 3
      src/Hotline.Share/Dtos/Knowledge/KnowledgeApplyDto.cs
  12. 26 0
      src/Hotline.Share/Dtos/Knowledge/KnowledgeDataDto.cs
  13. 1 1
      src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs
  14. 49 14
      src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs
  15. 19 0
      src/Hotline.Share/Enums/Settings/ETimeType.cs
  16. 3 2
      src/Hotline/KnowledgeBase/Knowledge.cs
  17. 23 8
      src/Hotline/KnowledgeBase/KnowledgeApply.cs
  18. 31 10
      src/Hotline/KnowledgeBase/KnowledgeDomainService.cs
  19. 12 0
      src/Hotline/Settings/TimeLimits/DaySetting.cs
  20. 9 0
      src/Hotline/Settings/TimeLimits/IDaySettingRepository.cs
  21. 3 3
      src/Hotline/Settings/TimeLimits/TimeLimit.cs
  22. 1 1
      src/Hotline/Settings/TimeLimits/TimeLimitBaseDataConsts.cs
  23. 3 21
      src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs
  24. 21 1
      src/Hotline/Tools/WeekTool.cs

+ 5 - 2
src/Hotline.Api/Controllers/HotSpotController.cs

@@ -82,13 +82,16 @@ namespace Hotline.Api.Controllers
         public async Task<object> GetTimeLimitBaseData()
         {
             return new {
+                ModuleOptions = WorkflowModule.Modules.ToList(),
+                TimeType = EnumExts.GetDescriptions<ETimeType>(),
                 BaseData = TimeLimitBaseData.GetBaseData(),
+
                 AcceptType = EnumExts.GetDescriptions<EAcceptType>(),
-                PushType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.PushType),
+                //PushType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.PushType),
                 SourceChannel = EnumExts.GetDescriptions<EChannel>(),
                 IdentityType = EnumExts.GetDescriptions<EIdentityType>(),
                 OrderType = EnumExts.GetDescriptions<EOrderType>(),
-                CertType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.CertType),
+                CertType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.LicenceType),
                 EmergencyLevel = EnumExts.GetDescriptions<EEmergencyLevel>()
             };
         }

+ 34 - 5
src/Hotline.Api/Controllers/KnowledgeApplyController.cs

@@ -1,9 +1,11 @@
 using Hotline.Application.Knowledge;
 using Hotline.KnowledgeBase;
 using Hotline.Permissions;
+using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Requests;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using XF.Domain.Authentications;
@@ -70,18 +72,21 @@ namespace Hotline.Api.Controllers
         /// <summary>
         ///知识申请-信息办理
         /// </summary>
-        /// <param name="Id"></param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [Permission(EPermission.KnowApplyHandle)]
         [HttpPut("apply-handle")]
-        public async Task ApplyHandle(string Id)
+        public async Task ApplyHandle([FromBody] KnowledgeApplyHandleDto dto)
         {
             //查询申请信息
-            var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
+            var handle = await _knowledgeApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
 
-            if (handle is null)
+            if (handle is null || handle.Status != EKnowledgeApplyStatus.Handling)
                 throw UserFriendlyException.SameMessage("办理失败");
             handle.Status = EKnowledgeApplyStatus.Succeed;
+            handle.HandleTime = DateTime.Now;
+            handle.KnowledgeId = dto.KnowledgeId;
+            handle.Opinion = dto.Opinion;
             //修改办理信息
             await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
         }
@@ -98,6 +103,8 @@ namespace Hotline.Api.Controllers
             var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
             if (handle is null)
                 throw UserFriendlyException.SameMessage("申请信息撤销失败");
+            if (handle.Status != EKnowledgeApplyStatus.Handling)
+                throw UserFriendlyException.SameMessage("只能撤销办理中的申请");
             handle.Status = EKnowledgeApplyStatus.Revert;
             await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
         }
@@ -115,7 +122,10 @@ namespace Hotline.Api.Controllers
             var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
             if (handle is null)
                 throw UserFriendlyException.SameMessage("退回失败");
+            if (handle.Status != EKnowledgeApplyStatus.Handling)
+                throw UserFriendlyException.SameMessage("只能退回办理中的申请");
             handle.Status = EKnowledgeApplyStatus.Failed;
+            handle.ReturnTime = DateTime.Now;
             await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
         }
 
@@ -131,6 +141,8 @@ namespace Hotline.Api.Controllers
             var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
             if (handle is null)
                 throw UserFriendlyException.SameMessage("申请不存在");
+            if (handle.Status != EKnowledgeApplyStatus.Revert || handle.Status != EKnowledgeApplyStatus.Failed)
+                throw UserFriendlyException.SameMessage("只能删除已退回或者撤回的知识申请");
             await _knowledgeApplyRepository.RemoveAsync(handle, false, HttpContext.RequestAborted);
         }
 
@@ -148,7 +160,7 @@ namespace Hotline.Api.Controllers
             DataKnowledgeApplyDto dataKnowledgeApplyDto = new();
             _mapper.Map(handle, dataKnowledgeApplyDto);
 
-            var knowledge = await _knowledgeRepository.GetAsync(p => p.Applies.Contains(Id), HttpContext.RequestAborted);
+            var knowledge = await _knowledgeRepository.GetAsync(p => p.Id == handle.KnowledgeId, HttpContext.RequestAborted);
             if (knowledge != null)
             {
                 dataKnowledgeApplyDto.KBID = knowledge.Id;
@@ -158,6 +170,23 @@ namespace Hotline.Api.Controllers
             return dataKnowledgeApplyDto;
         }
 
+        /// <summary>
+        /// 查询知识申请-新增知识申请
+        /// </summary>
+        /// <param name="pagedDto"></param>
+        /// <returns></returns>
+        [HttpGet("addapply")]
+        public async Task<PagedDto<DataAddApplyDto>> GetAddApply([FromQuery] PagedRequest pagedDto)
+        {
+            var (total, items) = await _knowledgeApplyRepository
+               .Queryable()
+               .Where(d => d.CreatorId == _sessionContext.RequiredUserId && d.KnowledgeApplyType == EKnowledgeApplyType.Add && d.Status == EKnowledgeApplyStatus.Handling)
+               .OrderByDescending(p => p.CreationTime)
+               .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<DataAddApplyDto>(total, _mapper.Map<IReadOnlyList<DataAddApplyDto>>(items));
+        }
+
         #region 我的知识申请
         /// <summary>
         /// 我的知识申请--全部

+ 37 - 3
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -10,6 +10,8 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Requests;
+using Hotline.Users;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -129,8 +131,8 @@ namespace Hotline.Api.Controllers
         /// <param name="pagedDto"></param>
         /// <returns></returns>
         [Permission(EPermission.KnowledgeMyDraftsList)]
-        [HttpPost("mydraftslist")]
-        public async Task<PagedDto<KnowledgeDataDto>> MyDraftsList([FromBody] MyDraftsListPagedDto pagedDto)
+        [HttpGet("mydraftslist")]
+        public async Task<PagedDto<KnowledgeDataDto>> MyDraftsList([FromQuery] MyDraftsListPagedDto pagedDto)
         {
             var (total, items) = await _knowledgeTempRepository
              .Queryable()
@@ -325,6 +327,38 @@ namespace Hotline.Api.Controllers
         {
             return await _workflowDomainService.GetWorkflowAsync(workFlowId, withSupplements: true, cancellationToken: HttpContext.RequestAborted);
         }
+
+        /// <summary>
+        /// 知识申请-关联知识-获取知识列表
+        /// </summary>
+        /// <param name="pagedDto"></param>
+        /// <returns></returns>
+        [HttpGet("getknowledge")]
+        public async Task<PagedDto<KnowledgeCreateBMDataDto>> GetKnowledge([FromQuery] PagedRequest pagedDto)
+        {
+            RefAsync<int> total = 0;
+            var temp = await _knowledgeRepository
+               .Queryable(true)
+               .LeftJoin<SystemOrganize>((o, sys) => o.CreatorOrgId == sys.Id)
+               .Where((o, sys) => o.IsDeleted == false && o.Status == EKnowledgeStatus.OnShelf)
+               //重新构建数据
+               .Select((o, sys) => new
+               {
+                   index = SqlFunc.RowNumber($"{o.Version} desc ", $"{o.Code}"),
+                   DepartmentId = sys.Id,
+                   Department = sys.OrgName,
+                   o.Id,
+                   o.Title
+               })
+           //将结果合并成一个表
+           .MergeTable()
+           //取第一条数据
+           .Where(d => d.index == 1)
+          //转分页数据
+          .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total);
+            //返回数据
+            return new PagedDto<KnowledgeCreateBMDataDto>(total.Value, _mapper.Map<IReadOnlyList<KnowledgeCreateBMDataDto>>(temp));
+        }
         #endregion
 
         #region 知识列表
@@ -497,7 +531,7 @@ namespace Hotline.Api.Controllers
            .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total);
 
             return new PagedDto<KnowledgeRetrievalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeRetrievalDataDto>>(temp));
-        } 
+        }
         #endregion
 
     }

+ 17 - 1
src/Hotline.Api/Controllers/TestController.cs

@@ -1,4 +1,5 @@
 using Dapr;
+using Hotline.Application.TimeLimits;
 using Hotline.CallCenter.BlackLists;
 using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
@@ -9,6 +10,8 @@ using Hotline.Identity.Roles;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
 using Hotline.Share.Dtos.Realtime;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
 using Hotline.Users;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -43,6 +46,8 @@ public class TestController : BaseController
     private readonly IRoleRepository _roleRepository;
     private readonly IMediator _mediator;
 
+    private readonly ITimeLimitApplication _timeLimitApplication;
+
     //private readonly ITypedCache<List<User>> _cache;
     //private readonly ICacheManager<User> _cache;
 
@@ -74,7 +79,8 @@ public class TestController : BaseController
         IIvrDomainService ivrDomainService,
         ISugarUnitOfWork<HotlineDbContext> uow,
         IRoleRepository roleRepository,
-        IMediator mediator
+        IMediator mediator,
+        ITimeLimitApplication timeLimitApplication
     )
     {
         _logger = logger;
@@ -89,6 +95,7 @@ public class TestController : BaseController
         _uow = uow;
         _roleRepository = roleRepository;
         _mediator = mediator;
+        _timeLimitApplication = timeLimitApplication;
     }
 
     [AllowAnonymous]
@@ -104,6 +111,15 @@ public class TestController : BaseController
         return a;
     }
 
+    [AllowAnonymous]
+    [HttpGet("testtime")]
+    public async Task<TimeResult> TestTime(DateTime beginTime, ETimeType timeType, int timeValue)
+    {
+        return _timeLimitApplication.CalcEndTime(beginTime, timeType, timeValue);
+    }
+
+
+
     //[AllowAnonymous]
     [HttpGet("hash")]
     public async Task Hash()

+ 1 - 1
src/Hotline.Application.Contracts/Validators/Knowledge/AddKnowledgeApplyDtoValidator.cs

@@ -11,7 +11,7 @@ namespace Hotline.Application.Contracts.Validators.Knowledge
         public AddKnowledgeApplyDtoValidator()
         {
             RuleFor(d => d.Content).NotEmpty();
-            RuleFor(d => d.DepartmentCode).NotEmpty();
+            RuleFor(d => d.DepartmentId).NotEmpty();
             RuleFor(d => d.Department).NotEmpty();
         }
     }

+ 1 - 1
src/Hotline.Application.Contracts/Validators/Knowledge/UpdateKnowledgeApplyDtoValidator.cs

@@ -13,7 +13,7 @@ namespace Hotline.Application.Contracts.Validators.Knowledge
             RuleFor(d => d.Id).NotEmpty();
             RuleFor(d => d.KnowledgeApplyType).NotEmpty();
             RuleFor(d => d.Content).NotEmpty();
-            RuleFor(d => d.DepartmentCode).NotEmpty();
+            RuleFor(d => d.DepartmentId).NotEmpty();
             RuleFor(d => d.Department).NotEmpty();
         }
     }

+ 2 - 5
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -1,16 +1,13 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.KnowledgeBase;
+using Hotline.KnowledgeBase;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
-using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Users;
 using MapsterMapper;
 using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
-using XF.Domain.Exceptions;
 
 namespace Hotline.Application.Knowledge
 {
@@ -138,7 +135,7 @@ namespace Hotline.Application.Knowledge
                  .Queryable()
                  .Includes(it => it.User)
                  .Includes(it => it.SystemOrganize)
-                 .Where(p => p.DepartmentCode == _sessionContext.RequiredOrgCode)
+                 .Where(p => p.DepartmentId == _sessionContext.RequiredOrgId)
                  .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
                  .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.OrgName.Contains(pagedDto.Keyword!))
                  .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)

+ 15 - 0
src/Hotline.Application/TimeLimits/ITimeLimitApplication.cs

@@ -0,0 +1,15 @@
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.TimeLimits
+{
+    public interface ITimeLimitApplication
+    {
+        TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue);
+    }
+}

+ 182 - 0
src/Hotline.Application/TimeLimits/TimeLimitApplication.cs

@@ -0,0 +1,182 @@
+
+using Hotline.Settings.TimeLimits;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
+using XF.Domain.Dependency;
+
+namespace Hotline.Application.TimeLimits
+{
+    public class TimeLimitApplication:ITimeLimitApplication, IScopeDependency
+    {
+        private readonly ITimeLimitRepository _timeLimitRepository;
+        private readonly IDaySettingRepository _daySettingRepository;
+
+        public TimeLimitApplication(ITimeLimitRepository timeLimitRepository, IDaySettingRepository daySettingRepository)
+        {
+            _timeLimitRepository = timeLimitRepository;
+            _daySettingRepository = daySettingRepository;
+        }
+
+
+
+        /// <summary>
+        /// 计算结束时间
+        /// </summary>
+        /// <param name="beginTime"></param>
+        /// <param name="timeType"></param>
+        /// <param name="timeValue"></param>
+        public TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue)
+        {
+            switch (timeType)
+            {
+                //新增对应小时
+                case ETimeType.Hour:
+                    return new TimeResult { EndTime = beginTime.AddHours(timeValue), RuleStr = timeValue + "小时" };
+                //新增工作日
+                case ETimeType.WorkDay:
+                    //检查时间段内是否存在休息日或者工作日
+                    int day = 1;
+                    for (int i = 1; i < timeValue+1; i++)
+                    {
+                        if(IsWorkDay(beginTime.AddDays(day)))
+                        {
+                            beginTime = beginTime.AddDays(day);
+                            day = 1;
+                        }
+                        else
+                        {
+                            i--;
+                            day++;
+                        }
+                    }
+                    return new TimeResult { EndTime = beginTime, RuleStr = timeValue + "个工作日" };
+                //新增自然日
+                case ETimeType.Day:
+                    return new TimeResult { EndTime = beginTime.AddDays(timeValue), RuleStr = timeValue + "个自然日" };
+                default:
+                    return null;
+            }
+        }
+
+        private bool IsWorkDay(DateTime date)
+        {
+            return _daySettingRepository.IsWorkDay(date).GetAwaiter().GetResult();
+        }
+
+
+
+        //public async Task<TimeResult> Get(string WorkflowCode, DateTime BeginTime, Dictionary<string, string> param)
+        //{
+        //    //1>> 取出对应已启用的配置
+        //    var model = await _timeLimitRepository.GetAsync(x => x.WorkflowCode == WorkflowCode && x.TimeLimitState == Share.Enums.Settings.ETimeLimitState.Enable);
+        //    if (model != null)
+        //    {
+        //        #region  组合优先级
+        //        //2>> 优先级 组合逻辑判定 (组合重复取最短时间)
+        //        if (model.Combination?.Count > 0)
+        //        {
+        //            //待计算集合
+        //            List<CombinationModel> list = new List<CombinationModel>();
+        //            foreach (var item in model.Combination)
+        //            {
+        //                //判断是否包含当前组合的所有参数
+        //                int countx = item.CombinationParam.Count(x => param.Any(d => d.Key == x.Code && d.Value == x.ParamValue));
+        //                //如果包含 就加入到待计算的集合中
+        //                if (countx == item.CombinationParam.Count)
+        //                {
+        //                    list.Add(item);
+        //                }
+        //            }
+        //            if (list.Count>0)
+        //            {
+        //                //获取符合参数条件的组合最小时间单位
+        //                var comHavMinParam = list.OrderBy(x => x.Hour).FirstOrDefault();
+        //                if (comHavMinParam != null && comHavMinParam?.TimeLimit != ETimeType.WorkDay)
+        //                {
+        //                    return CalcEndTime(BeginTime, comHavMinParam.TimeLimit, comHavMinParam.TimeLimitValue);
+        //                }
+        //                else
+        //                {
+        //                    //获取符合参数条件的组合(工作日)最小单位
+        //                    var comHavMinParamWorkDay = list.OrderBy(x => x.Hour).FirstOrDefault(x => x.TimeLimit == ETimeType.WorkDay);
+                            
+        //                    //如果符合条件的组合和符合条件的组合(工作日)都存在
+        //                    if (comHavMinParam != null && comHavMinParamWorkDay != null)
+        //                    {
+        //                        var comMinParamResult = CalcEndTime(BeginTime, comHavMinParam.TimeLimit, comHavMinParam.TimeLimitValue);
+        //                        var comMinParamWorkDayResult = CalcEndTime(BeginTime, comHavMinParamWorkDay.TimeLimit, comHavMinParamWorkDay.TimeLimitValue);
+        //                        if (comMinParamResult.EndTime != null && comMinParamWorkDayResult.EndTime != null && DateTime.Compare(comMinParamResult.EndTime.Value, comMinParamWorkDayResult.EndTime.Value) <= 0)
+        //                        {
+        //                            return comMinParamResult;
+        //                        }
+        //                        else
+        //                        {
+        //                            return comMinParamWorkDayResult;
+        //                        }
+        //                    }
+        //                }
+        //            }
+        //        }
+        //        #endregion
+
+        //        #region 排序优先级
+        //        //3>> 优先级 排序逻辑判定
+        //        if (model.Priority?.Count > 0)
+        //        {
+        //            var firstModel = model.Priority.OrderBy(x => x.Sort).FirstOrDefault(x => param.Any(d => d.Key == x.Code && d.Value == x.ParamTypeValue));
+        //            //如果找到排序条件 走排序逻辑
+        //            if (firstModel!=null)
+        //            {
+        //                var CanUseModel = model.ParamArr?.FirstOrDefault(x => x.ParamType == firstModel.ParamType && x.Id == firstModel.Code);
+        //                if(CanUseModel!=null)
+        //                {
+        //                    #region 计算结束时间
+        //                    return CalcEndTime(BeginTime, CanUseModel.TimeLimitType, CanUseModel.TimeLimitValue);
+        //                    #endregion
+        //                }
+        //            }
+
+        //        }
+        //        #endregion
+
+        //        #region 配置优先级
+        //        // 4>> 优先级 配置逻辑判定
+        //        if (model.ParamArr?.Count>0)
+        //        {
+        //            //获取符合参数条件的配置最小时间单位
+        //            var havMinParam = model.ParamArr.OrderBy(x=>x.Hour).FirstOrDefault(x => x.TimeLimitType != ETimeType.WorkDay && param.Any(d => d.Key == x.ParamType && d.Value == x.Id));
+        //            //获取符合参数条件的配置(工作日)最小时间单位
+        //            var havMinParamWorkDay = model.ParamArr.OrderBy(x => x.Hour).FirstOrDefault(x => x.TimeLimitType == ETimeType.WorkDay && param.Any(d => d.Key == x.ParamType && d.Value == x.Id));
+        //            //如果符合条件的参数和符合条件的参数(工作日)都存在
+        //            if (havMinParam!=null && havMinParamWorkDay != null)
+        //            {
+        //                var minParamResult = CalcEndTime(BeginTime, havMinParam.TimeLimitType, havMinParam.TimeLimitValue);
+        //                var minParamWorkDayResult = CalcEndTime(BeginTime, havMinParam.TimeLimitType, havMinParam.TimeLimitValue);
+        //                if(minParamResult.EndTime != null && minParamWorkDayResult.EndTime != null && DateTime.Compare(minParamResult.EndTime.Value, minParamWorkDayResult.EndTime.Value) <= 0)
+        //                {
+        //                    return minParamResult;
+        //                }
+        //                else
+        //                {
+        //                    return minParamWorkDayResult;
+        //                }
+        //            }
+        //            else
+        //            {
+        //                return new TimeResult() { EndTime = null, RuleId = "", RuleStr = "" };
+        //            }
+        //        }
+        //        else
+        //        {
+        //            return new TimeResult() { EndTime = null, RuleId = "", RuleStr = "" };
+        //        }
+
+        //        #endregion
+
+        //    }
+        //}
+
+
+
+    }
+}

+ 26 - 0
src/Hotline.Repository.SqlSugar/System/DaySettingRepository.cs

@@ -0,0 +1,26 @@
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings.TimeLimits;
+using Hotline.Tools;
+using SqlSugar;
+using XF.Domain.Dependency;
+
+namespace Hotline.Repository.SqlSugar.System
+{
+    public class DaySettingRepository : BaseRepository<DaySetting>, IDaySettingRepository, IScopeDependency
+    {
+        public DaySettingRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+        {
+        }
+
+        public async Task<bool> IsWorkDay(DateTime date)
+        {
+            var model = await Db.Queryable<DaySetting>().FirstAsync(x=> x.Day.Date == date.Date);
+            if (model!=null)
+            {
+                return model.IsWorkDay;
+            }
+            return WeekTool.IsWorkDay(date);
+        }
+
+    }
+}

+ 53 - 3
src/Hotline.Share/Dtos/Knowledge/KnowledgeApplyDto.cs

@@ -18,6 +18,11 @@ namespace Hotline.Share.Dtos.Knowledge
     /// </summary>
     public record KnowledgeApplyDto
     {
+        /// <summary>
+        /// 知识ID
+        /// </summary>
+        public string KnowledgeId { get; set; }
+
         /// <summary>
         /// 内容
         /// </summary>
@@ -29,12 +34,12 @@ namespace Hotline.Share.Dtos.Knowledge
         public EKnowledgeApplyType KnowledgeApplyType { get; set; }
 
         /// <summary>
-        /// 申请处理部门编码
+        /// 处理部门Id
         /// </summary>
-        public string DepartmentCode { get; set; }
+        public string DepartmentId { get; set; }
 
         /// <summary>
-        /// 申请处理部门名称
+        /// 处理部门名称
         /// </summary>
         public string Department { get; set; }
 
@@ -63,5 +68,50 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 知识标题
         /// </summary>
         public string KBTitle { get; set; }
+
+        /// <summary>
+        /// 处理完成时间
+        /// </summary>
+        public DateTime? HandleTime { get; set; }
+
+        /// <summary>
+        /// 退回时间
+        /// </summary>
+        public DateTime? ReturnTime { get; set; }
+    }
+
+    /// <summary>
+    /// 知识申请办理
+    /// </summary>
+    public record KnowledgeApplyHandleDto
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 知识ID
+        /// </summary>
+        public string KnowledgeId { get; set; }
+
+        /// <summary>
+        /// 办理或者退回意见
+        /// </summary>
+        public string Opinion { get; set; }
+
+    }
+
+    public record DataAddApplyDto
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 内容
+        /// </summary>
+        public string Content { get; set; }
     }
 }

+ 26 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeDataDto.cs

@@ -122,4 +122,30 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public string Content { get; set; }
     }
+
+    /// <summary>
+    /// 获取知识创建部门信息
+    /// </summary>
+    public record KnowledgeCreateBMDataDto
+    {
+        /// <summary>
+        /// 知识ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 处理部门Id
+        /// </summary>
+        public string DepartmentId { get; set; }
+
+        /// <summary>
+        /// 处理部门名称
+        /// </summary>
+        public string Department { get; set; }
+    }
 }

+ 1 - 1
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -77,7 +77,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// <summary>
         /// 关联知识申请
         /// </summary>
-        public List<string> Applies { get; set; }
+        public string Applies { get; set; }
 
         /// <summary>
         /// 关联知识

+ 49 - 14
src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.Settings
@@ -23,7 +24,7 @@ namespace Hotline.Share.Dtos.Settings
         /// <summary>
         /// 已配置参数
         /// </summary>
-        public List<ParamTypeModel>? ParamArr { get; set; }
+        public List<ParamValueModel>? ParamArr { get; set; }
 
         /// <summary>
         /// 排序
@@ -38,6 +39,9 @@ namespace Hotline.Share.Dtos.Settings
 
     #region Model
 
+    /// <summary>
+    /// 组合对象
+    /// </summary>
     public class CombinationModel
     {
         /// <summary>
@@ -64,15 +68,17 @@ namespace Hotline.Share.Dtos.Settings
         /// <summary>
         /// 时限类型
         /// </summary>
-        public string TimeLimit { get; set; }
+        public ETimeType TimeLimit { get; set; }
 
         /// <summary>
-        /// 换算时间(小时
+        /// 换算小时
         /// </summary>
         public int Hour { get; set; }
     }
 
-
+    /// <summary>
+    /// 组合对象子对象
+    /// </summary>
     public class CombinationParamModel
     {
         /// <summary>
@@ -89,30 +95,44 @@ namespace Hotline.Share.Dtos.Settings
         /// 组合参数值
         /// </summary>
         public string ParamValue { get; set; }
-    }
 
+        /// <summary>
+        /// 类型
+        /// </summary>
+        public string ParamType { get; set; }
+
+       
+    }
 
 
+    /// <summary>
+    /// 排序对象
+    /// </summary>
     public class PriorityModel
     {
-        public string Id { get; set; }
+        public string Code { get; set; }
 
         public string ParamTypeName { get; set; }
 
-        public int Sort { get; set; }
-    }
-
+        public string ParamTypeValue { get; set; }
 
-    public class ParamTypeModel
-    {
         public string ParamType { get; set; }
 
-        public List<ParamValueModel> ParamValue { get; set; }
+        public int Sort { get; set; }
     }
 
+    /// <summary>
+    /// 已配置参数对象
+    /// </summary>
     public class ParamValueModel
     {
         public string Id { get; set; }
+
+        /// <summary>
+        /// 参数类型
+        /// </summary>
+        public string ParamType { get; set; }
+
         /// <summary>
         /// 
         /// </summary>
@@ -124,10 +144,10 @@ namespace Hotline.Share.Dtos.Settings
         /// <summary>
         /// 时限类型
         /// </summary>
-        public string TimeLimit { get; set; }
+        public ETimeType TimeLimitType { get; set; }
 
         /// <summary>
-        /// 换算时间(小时
+        /// 换算小时
         /// </summary>
         public int Hour { get; set; }
     }
@@ -143,4 +163,19 @@ namespace Hotline.Share.Dtos.Settings
     {
 
     }
+
+
+    #region 时间计算返回参数
+
+    public record TimeResult
+    {
+        public string RuleId { get; set; }
+
+        public DateTime? EndTime { get; set; }
+
+        public string RuleStr { get; set; }
+    }
+
+    #endregion
+
 }

+ 19 - 0
src/Hotline.Share/Enums/Settings/ETimeType.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Settings
+{
+    public enum ETimeType
+    {
+        [Description("小时")]
+        Hour = 1,
+        [Description("工作日")]
+        WorkDay = 2,
+        [Description("自然日")]
+        Day= 3,
+    }
+}

+ 3 - 2
src/Hotline/KnowledgeBase/Knowledge.cs

@@ -87,8 +87,9 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// <summary>
     /// 关联知识申请
     /// </summary>
-    [SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
-    public List<string> Applies { get; set; }
+    //[SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
+    //public List<string> Applies { get; set; }
+    public string Applies { get; set; }
 
     /// <summary>
     /// 关联知识

+ 23 - 8
src/Hotline/KnowledgeBase/KnowledgeApply.cs

@@ -11,6 +11,11 @@ namespace Hotline.KnowledgeBase;
 /// </summary>
 public class KnowledgeApply : FullStateEntity
 {
+    /// <summary>
+    /// 知识ID
+    /// </summary>
+    public string KnowledgeId { get; set; }
+
     /// <summary>
     /// 内容
     /// </summary>
@@ -27,12 +32,12 @@ public class KnowledgeApply : FullStateEntity
     public EKnowledgeApplyStatus Status { get; set; }
 
     /// <summary>
-    /// 申请处理部门编码
+    /// 处理部门Id
     /// </summary>
-    public string DepartmentCode { get; set; }
+    public string DepartmentId { get; set; }
 
     /// <summary>
-    /// 申请处理部门名称
+    /// 处理部门名称
     /// </summary>
     public string Department { get; set; }
 
@@ -41,6 +46,21 @@ public class KnowledgeApply : FullStateEntity
     /// </summary>
     public DateTime? ExpiredTime { get; set; }
 
+    /// <summary>
+    /// 处理完成时间
+    /// </summary>
+    public DateTime? HandleTime { get; set; }
+
+    /// <summary>
+    /// 退回时间
+    /// </summary>
+    public DateTime? ReturnTime { get; set; }
+
+    /// <summary>
+    /// 办理或者退回意见
+    /// </summary>
+    public string Opinion { get; set; }
+
     /// <summary>
     /// 
     /// </summary>
@@ -53,9 +73,4 @@ public class KnowledgeApply : FullStateEntity
     [Navigate(NavigateType.OneToOne, nameof(CreatorOrgId))]//一对一 
     public SystemOrganize SystemOrganize { get; set; }
 
-
-    ///// <summary>
-    ///// 处理完成
-    ///// </summary>
-    //public Operation? Handled { get; set; }
 }

+ 31 - 10
src/Hotline/KnowledgeBase/KnowledgeDomainService.cs

@@ -17,6 +17,7 @@ namespace Hotline.KnowledgeBase
         private readonly IKnowledgePVRepository _knowledgePVRepository;
         private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
         private readonly IWorkflowDomainService _workflowDomainService;
+        private readonly IKnowledgeApplyRepository _knowledgeApplyRepository;
 
         /// <summary>
         /// 
@@ -28,7 +29,7 @@ namespace Hotline.KnowledgeBase
         /// <param name="knowledgeWorkFlowRepository"></param>
         /// <param name="workflowDomainService"></param>
         public KnowledgeDomainService(IKnowledgeRepository knowledgeRepository, IKnowledgeTempRepository knowledgeTempRepository, IMapper mapper, IKnowledgePVRepository knowledgePVRepository, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository
-           , IWorkflowDomainService workflowDomainService)
+           , IWorkflowDomainService workflowDomainService, IKnowledgeApplyRepository knowledgeApplyRepository)
         {
             _knowledgeRepository = knowledgeRepository;
             _mapper = mapper;
@@ -36,6 +37,7 @@ namespace Hotline.KnowledgeBase
             _knowledgePVRepository = knowledgePVRepository;
             _knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
             _workflowDomainService = workflowDomainService;
+            _knowledgeApplyRepository = knowledgeApplyRepository;
         }
 
         /// <summary>
@@ -126,8 +128,18 @@ namespace Hotline.KnowledgeBase
             if (string.IsNullOrEmpty(kn.Code))
                 kn.Code = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
             kn.Status = EKnowledgeStatus.Auditing;
+            var knowledgeId = await _knowledgeRepository.AddAsync(kn, cancellationToken);
+            if (!string.IsNullOrEmpty(dto.Applies))
+            {
+                var apply = await _knowledgeApplyRepository.GetAsync(p => p.Id == dto.Applies, cancellationToken);
+                if (apply!=null)
+                {
+                    apply.KnowledgeId = knowledgeId;
+                    await _knowledgeApplyRepository.UpdateAsync(apply, cancellationToken);
+                }
+            }
 
-            return await _knowledgeRepository.AddAsync(kn, cancellationToken);
+            return knowledgeId;
         }
 
         /// <summary>
@@ -153,8 +165,20 @@ namespace Hotline.KnowledgeBase
             knowledge.Status = EKnowledgeStatus.Auditing;
             knowledge.Id = "";
             knowledge.Version = 0;
+
+            var knowledgeId = await _knowledgeRepository.AddAsync(knowledge, cancellationToken);
+            if (!string.IsNullOrEmpty(dto.Applies))
+            {
+                var apply = await _knowledgeApplyRepository.GetAsync(p => p.Id == dto.Applies, cancellationToken);
+                if (apply != null)
+                {
+                    apply.KnowledgeId = knowledgeId;
+                    await _knowledgeApplyRepository.UpdateAsync(apply, cancellationToken);
+                }
+            }
+
             //新增一条数据
-            return await _knowledgeRepository.AddAsync(knowledge, cancellationToken);
+            return knowledgeId;
 
         }
 
@@ -222,14 +246,11 @@ namespace Hotline.KnowledgeBase
 
             //将数据组装到集合
             List<string> strList = new();
-            foreach (var item in temp)
+            temp.ForEach(p =>
             {
-                if (!string.IsNullOrEmpty(item.Keywords))
-                {
-                    //添加数据
-                    strList.AddRange(item.Keywords.Split(',').ToList());
-                }
-            }
+                if (!string.IsNullOrEmpty(p.Keywords))
+                    strList.AddRange(p.Keywords.Split(',').ToList());//添加数据
+            });
 
             //取10条数据返回
             return strList.Distinct().Take(10).ToList();

+ 12 - 0
src/Hotline/Settings/TimeLimits/DaySetting.cs

@@ -0,0 +1,12 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Settings.TimeLimits
+{
+    public class DaySetting : CreationEntity
+    {
+        public DateTime Day { get; set; }
+
+        public bool IsWorkDay { get; set; }
+
+    }
+}

+ 9 - 0
src/Hotline/Settings/TimeLimits/IDaySettingRepository.cs

@@ -0,0 +1,9 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Settings.TimeLimits
+{
+    public interface IDaySettingRepository: IRepository<DaySetting>
+    {
+        Task<bool> IsWorkDay(DateTime date);
+    }
+}

+ 3 - 3
src/Hotline/Settings/TimeLimits/TimeLimit.cs

@@ -17,7 +17,7 @@ namespace Hotline.Settings.TimeLimits
         public ETimeLimitState TimeLimitState { get; set; }
 
         [SugarColumn(ColumnDataType = "longtext", IsJson = true, IsNullable = true)]
-        public List<ParamTypeModel>? ParamArr { get; set; }
+        public List<ParamValueModel>? ParamArr { get; set; }
 
         /// <summary>
         /// 排序
@@ -69,11 +69,11 @@ namespace Hotline.Settings.TimeLimits
             {
                 new TimeLimitBaseDataModel("82fde961-b1a7-11ed-ad8e-005056a2d053","受理类型", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.AcceptType),
                 new TimeLimitBaseDataModel("33b756f6-b1a9-11ed-ad8e-005056a2d053", "热点分类","Order",ETimeLimitType.HotPots,TimeLimitBaseDataConsts.HotPots),
-                new TimeLimitBaseDataModel("c45da596-b1aa-11ed-ad8e-005056a2d053", "推送分类", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.PushType),
+                //new TimeLimitBaseDataModel("c45da596-b1aa-11ed-ad8e-005056a2d053", "推送分类", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.PushType),
                 new TimeLimitBaseDataModel("ee78d588-b1aa-11ed-ad8e-005056a2d053", "来源渠道", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.SourceChannel),
                 new TimeLimitBaseDataModel("8f9209d1-b1ab-11ed-ad8e-005056a2d053", "来电人身份", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.IdentityType),
                 new TimeLimitBaseDataModel("d6100e08-b1ab-11ed-ad8e-005056a2d053", "工单类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.OrderType),
-                new TimeLimitBaseDataModel("f21424ff-b1ab-11ed-ad8e-005056a2d053", "证件类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.CertType),
+                new TimeLimitBaseDataModel("f21424ff-b1ab-11ed-ad8e-005056a2d053", "证件类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.LicenceType),
                 new TimeLimitBaseDataModel("bda69be9-b1b2-11ed-ad8e-005056a2d053", "紧急程度", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.EmergencyLevel),
                 new TimeLimitBaseDataModel("cd3b29dd-b1bf-11ed-ad8e-005056a2d053","默认参数","ZengBie,KnowledgeAdd",ETimeLimitType.DefaultTime,TimeLimitBaseDataConsts.DefaultTime)
             };

+ 1 - 1
src/Hotline/Settings/TimeLimits/TimeLimitBaseDataConsts.cs

@@ -35,7 +35,7 @@ namespace Hotline.Settings.TimeLimits
         /// <summary>
         /// 证件类型
         /// </summary>
-        public const string CertType = "CertType";
+        public const string LicenceType = "LicenceType";
         /// <summary>
         /// 紧急程度
         /// </summary>

+ 3 - 21
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -1,4 +1,6 @@
-using XF.Domain.Dependency;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
+using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 
 namespace Hotline.Settings.TimeLimits
@@ -26,25 +28,5 @@ namespace Hotline.Settings.TimeLimits
             }
             await _timeLimitRepository.UpdateAsync(model, cancellationToken);
         }
-
-
-        //public async Task Get(string WorkflowCode, DateTime BeginTime, Dictionary<string, string> param)
-        //{
-        //    //1>> 取出对应已启用的配置
-        //    var model = await _timeLimitRepository.GetAsync(x => x.WorkflowCode == WorkflowCode && x.TimeLimitState == Share.Enums.Settings.ETimeLimitState.Enable);
-        //    if (model != null)
-        //    {
-        //        //组合逻辑
-        //        if (model.Combination.Count > 0)
-        //        {
-        //            foreach (var item in model.Combination)
-        //            {
-        //                item.CombinationParam.
-        //            }
-        //        }
-        //    }
-        //}
-
-
     }
 }

+ 21 - 1
src/Hotline/Tools/WeekTool.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Tools
+using System;
+
+namespace Hotline.Tools
 {
     public static class WeekTool
     {
@@ -49,5 +51,23 @@
                     return -1;
             }
         }
+
+        /// <summary>
+        /// 是否工作日
+        /// </summary>
+        /// <param name="date"></param>
+        /// <returns></returns>
+        public static bool IsWorkDay(DateTime date)
+        {
+            var DayOfWeek = date.DayOfWeek;
+
+            if ((int)DayOfWeek==0 || (int)DayOfWeek==6)
+            {
+                return false;
+            }
+            return true;
+        }
+
+
     }
 }