فهرست منبع

自贡任务 221 新增【小休申请审批功能】

tangjiang 1 ماه پیش
والد
کامیت
bf0a38e98a

+ 144 - 10
src/Hotline.Api/Controllers/PbxController.cs

@@ -34,6 +34,17 @@ using Tr.Sdk;
 using Hotline.Configurations;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
+using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson;
+using Hotline.Application.CallCenter;
+using Hotline.Repository.SqlSugar.Extensions;
+using DocumentFormat.OpenXml.Spreadsheet;
+using Hotline.Share.Dtos.IndustryClassification;
+using Hotline.Share.Dtos.Order;
+using Hotline.Tools;
+using Hotline.Caching.Services;
+using Hotline.Repository.SqlSugar.System;
+using Hotline.Settings.TimeLimits;
+using Hotline.Share.Enums.Order;
 
 namespace Hotline.Api.Controllers
 {
@@ -68,6 +79,8 @@ namespace Hotline.Api.Controllers
         private readonly IWexTelGroupRepository _wexTelGroupRepository;
         private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
         private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
+        private readonly IRepository<TelRestApply> _telRestApplyRepository;
+        private readonly IPbxApplication _pbxApplication;
 
 
         public PbxController(
@@ -97,7 +110,9 @@ namespace Hotline.Api.Controllers
             IWexTelGroupRepository wexTelGroupRepository,
             IOptionsSnapshot<AppConfiguration> appOptions,
             IOptionsSnapshot<CallCenterConfiguration> options,
-            ISystemDicDataCacheManager systemDicDataCacheManager)
+            ISystemDicDataCacheManager systemDicDataCacheManager,
+            IRepository<TelRestApply> telRestApplyRepository,
+            IPbxApplication pbxApplication)
         {
             _telRepository = telRepository;
             _telRestRepository = telRestRepository;
@@ -128,15 +143,12 @@ namespace Hotline.Api.Controllers
             {
                 _newRockDeviceManager = serviceProvider.GetRequiredService<INewRockDeviceManager>();
             }
+            _telRestApplyRepository = telRestApplyRepository;
+            _pbxApplication = pbxApplication;
         }
 
-
-
-
         #region 话机
 
-
-
         /// <summary>
         /// 根据设备自动同步分机数据到数据库
         /// </summary>
@@ -305,8 +317,8 @@ namespace Hotline.Api.Controllers
                 startWorkflowDto.DefinitionModuleCode = WorkflowModuleConsts.TelRestApply;
                 startWorkflowDto.Opinion = dto.Reason;
                 startWorkflowDto.Title = "分机休息申请流程";
-				// await _workflowApplication.StartWorkflowAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
-				//await _workflowDomainService.StartAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
+                // await _workflowApplication.StartWorkflowAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
+                //await _workflowDomainService.StartAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
                 await _workflowDomainService.StartToFirstStepAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
             }
         }
@@ -343,8 +355,8 @@ namespace Hotline.Api.Controllers
             startWorkflowDto.DefinitionModuleCode = WorkflowModuleConsts.TelRestApply;
             startWorkflowDto.Opinion = dto.Reason;
             startWorkflowDto.Title = "分机休息申请流程";
-			// await _workflowApplication.StartWorkflowAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
-			//await _workflowDomainService.StartAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
+            // await _workflowApplication.StartWorkflowAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
+            //await _workflowDomainService.StartAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
             await _workflowDomainService.StartToFirstStepAsync(startWorkflowDto, telRest.Id, cancellationToken: HttpContext.RequestAborted);
         }
 
@@ -1090,6 +1102,128 @@ namespace Hotline.Api.Controllers
             return telGroup;
         }
 
+        #endregion
+
+        #region 小休审批
+
+        /// <summary>
+        /// 列表页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("base-data")]
+        public async Task<object> BaseData()
+        {
+            var rsp = new
+            {
+                RestReason = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.RestReason),
+                AuditStatus = EnumExts.GetDescriptions<ETelRestAuditStatus>()
+            };
+            return rsp;
+        }
+
+        /// <summary>
+        /// 小休申请
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        [HttpPost("addtelrest")]
+        public async Task AddTelRest([FromBody] TelRestApplyAddDto dto)
+        {
+            if (string.IsNullOrEmpty(dto.TelNo))
+                throw new UserFriendlyException("分机号不能为空!");
+            if (dto.Reason == null)
+                throw new UserFriendlyException("小休原因不能为空!");
+
+            var data = await _telRestApplyRepository.GetAsync(p => p.TelNo == dto.TelNo && p.CreatorId == _sessionContext.RequiredUserId &&
+            p.AuditStatus == ETelRestAuditStatus.NoAudit, HttpContext.RequestAborted);
+            if (data != null)
+                throw new UserFriendlyException("小休申请审批中,暂时无法操作!");
+
+            TelRestApply telRestApply = new()
+            {
+                TelNo = dto.TelNo,
+                Reason = dto.Reason.Value,
+                ReasonId = dto.Reason.Key,
+                StaffNo = _sessionContext.StaffNo,
+                AuditStatus = ETelRestAuditStatus.NoAudit
+            };
+            await _telRestApplyRepository.AddAsync(telRestApply, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 小休审批
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        [HttpPost("telrest_apply_audit")]
+        public async Task TelRestApplyAudit([FromBody] TelRestApplyAuditDto dto)
+        {
+            if (dto.IsPass == false && string.IsNullOrEmpty(dto.AuditOpinion))
+                throw new UserFriendlyException("审批原因不能为空!");
+            var data = await _telRestApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+            if (data == null)
+                throw new UserFriendlyException("审批数据查询失败!");
+            data.AuditUserName = _sessionContext.UserName;
+            data.AuditUserId = _sessionContext.RequiredUserId;
+            data.AuditOrgId = _sessionContext.RequiredOrgId;
+            data.AuditOrgName = _sessionContext.OrgName;
+            data.AuditTime = DateTime.Now;
+            data.AuditOpinion = dto.AuditOpinion;
+            data.AuditStatus = dto.IsPass == true ? ETelRestAuditStatus.Pass : ETelRestAuditStatus.NoPass;
+            await _telRestApplyRepository.UpdateAsync(data, HttpContext.RequestAborted);
+            if (dto.IsPass)
+            {
+                //审批通过发送通知给前端
+                await _telDomainService.TelRestApplyPassAsync(data.CreatorId, HttpContext.RequestAborted);
+            }
+        }
+
+        /// <summary>
+        /// 小修申请记录
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_restapply_list")]
+        public async Task<PagedDto<TelRestApplyListDto>> GetRestApplyList([FromQuery] TelRestApplyRequestDto dto)
+        {
+            var (total, items) = await _pbxApplication.GetRestApplyList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<TelRestApplyListDto>(total, items);
+        }
+
+        /// <summary>
+        /// 小修申请记录--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_restapply_list_export")]
+        public async Task<FileStreamResult> GetRestApplyListExport([FromBody] ExportExcelDto<TelRestApplyRequestDto> dto)
+        {
+            var query = _pbxApplication.GetRestApplyList(dto.QueryDto);
+
+            List<TelRestApplyListDto> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+                .Select(stu => _mapper.Map(stu, typeof(TelRestApplyListDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "小修申请记录数据");
+        }
+
+
         #endregion
     }
 }

+ 15 - 0
src/Hotline.Application/CallCenter/IPbxApplication.cs

@@ -0,0 +1,15 @@
+using Hotline.Share.Dtos.CallCenter;
+using SqlSugar;
+
+namespace Hotline.Application.CallCenter
+{
+    public interface IPbxApplication
+    {
+        /// <summary>
+        /// 小修申请记录
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<TelRestApplyListDto> GetRestApplyList(TelRestApplyRequestDto dto);
+    }
+}

+ 59 - 0
src/Hotline.Application/CallCenter/PbxApplication.cs

@@ -0,0 +1,59 @@
+using Hotline.CallCenter.Tels;
+using Hotline.Share.Dtos.CallCenter;
+using Hotline.Share.Enums.CallCenter;
+using SqlSugar;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.CallCenter
+{
+    public class PbxApplication : IPbxApplication, IScopeDependency
+    {
+        private readonly IRepository<TelRestApply> _telRestApplyRepository;
+
+        public PbxApplication(IRepository<TelRestApply> telRestApplyRepository)
+        {
+            _telRestApplyRepository = telRestApplyRepository;
+        }
+
+        /// <summary>
+        /// 小修申请记录
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<TelRestApplyListDto> GetRestApplyList(TelRestApplyRequestDto dto)
+        {
+            var query = _telRestApplyRepository.Queryable()
+                .WhereIF(dto.Type is 0, p => p.AuditStatus == ETelRestAuditStatus.NoAudit)
+                .WhereIF(dto.Type is 1, p => p.AuditStatus == ETelRestAuditStatus.Pass || p.AuditStatus == ETelRestAuditStatus.NoPass)
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.CreatorName == dto.ApplyUserName)
+                .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime >= dto.ApplyStartTime)
+                .WhereIF(dto.ApplyEndTime.HasValue, p => p.CreationTime <= dto.ApplyEndTime)
+                .WhereIF(dto.AuditStatus.HasValue, p => p.AuditStatus == dto.AuditStatus)
+                .WhereIF(!string.IsNullOrEmpty(dto.AuditUserName), p => p.AuditUserName == dto.AuditUserName)
+                .WhereIF(dto.AuditStartTime.HasValue, p => p.AuditTime >= dto.AuditStartTime)
+                .WhereIF(dto.AuditEndTime.HasValue, p => p.AuditTime <= dto.AuditEndTime)
+                .Select(p => new TelRestApplyListDto
+                {
+                    ApplyUserName = p.CreatorName,
+                    ApplyTime = p.CreationTime,
+                    Reason = p.Reason,
+                    ReasonId = p.ReasonId,
+                    AuditUserName = p.AuditUserName,
+                    AuditUserId = p.AuditUserId,
+                    AuditOrgName = p.AuditOrgName,
+                    AuditOrgId = p.AuditOrgId,
+                    AuditTime = p.AuditTime,
+                    AuditStatus = p.AuditStatus,
+                    AuditOpinion = p.AuditOpinion
+                })
+                .OrderByIF(dto is { SortField: "applyTime", SortRule: 0 }, p => p.ApplyTime, OrderByType.Asc) //申请时间升序
+                .OrderByIF(dto is { SortField: "applyTime", SortRule: 1 }, p => p.ApplyTime, OrderByType.Desc) //申请时间降序
+                .OrderByIF(dto is { SortField: "auditTime", SortRule: 0 }, p => p.AuditTime, OrderByType.Asc) //审核时间升序
+                .OrderByIF(dto is { SortField: "auditTime", SortRule: 1 }, p => p.AuditTime, OrderByType.Desc) //审核时间降序
+                .OrderByIF(string.IsNullOrEmpty(dto.SortField), p => p.ApplyTime, OrderByType.Desc)
+               ;
+            return query;
+        }
+    }
+}

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

@@ -4,6 +4,7 @@ using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
 using Hotline.Push.Notifies;
+using Hotline.SeedData;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
@@ -155,7 +156,7 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                 if (_appOptions.Value.IsZiGong)
                 {
                     var user = await _userRepository.GetAsync(p => p.Id == screen.CreatorId, cancellationToken);
-                    if (user != null)
+                    if (user != null && user.OrgId != OrgSeedData.CenterId)
                     {
                         var isReviewPassText = isReviewPass == true ? "审批通过" : "审批拒绝";
                         var messageDto = new Share.Dtos.Push.MessageDto

+ 138 - 0
src/Hotline.Share/Dtos/CallCenter/TelRestApplyAddDto.cs

@@ -0,0 +1,138 @@
+using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Requests;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.CallCenter
+{
+    /// <summary>
+    /// 申请
+    /// </summary>
+    public class TelRestApplyAddDto
+    {
+        /// <summary>
+        /// 分机号(冗余)
+        /// </summary>
+        public string TelNo { get; set; }
+
+        /// <summary>
+        /// 小休原因
+        /// </summary>
+        public Kv Reason { get; set; }
+    }
+
+    /// <summary>
+    /// 审批
+    /// </summary>
+    public class TelRestApplyAuditDto
+    {
+        /// <summary>
+        /// 数据Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 审批原因
+        /// </summary>
+        public string AuditOpinion { get; set; }
+
+        /// <summary>
+        /// 是否通过
+        /// </summary>
+        public bool IsPass { get; set; }
+    }
+
+    public record TelRestApplyRequestDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 0:待审批  1:已审批
+        /// </summary>
+        public int Type { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string ApplyUserName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime? ApplyStartTime { get; set; }
+        public DateTime? ApplyEndTime { get; set; }
+
+        /// <summary>
+        /// 小休原因
+        /// </summary>
+        public string ReasonId { get; set; }
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public ETelRestAuditStatus? AuditStatus { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditUserName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditStartTime { get; set; }
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditEndTime { get; set; }
+    }
+
+    /// <summary>
+    /// 列表数据
+    /// </summary>
+    public class TelRestApplyListDto
+    {
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string ApplyUserName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime? ApplyTime { get; set; }
+
+        public string Reason { get; set; }
+
+        public string ReasonId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditUserName { get; set; }
+        public string? AuditUserId { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+        public string? AuditOrgId { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? AuditOpinion { get; set; }
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public ETelRestAuditStatus AuditStatus { get; set; }
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public string AuditStatusText => AuditStatus.GetDescription();
+    }
+}

+ 28 - 0
src/Hotline.Share/Enums/CallCenter/ETelRestAuditStatus.cs

@@ -0,0 +1,28 @@
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.CallCenter
+{
+    public enum ETelRestAuditStatus
+    {
+        /// <summary>
+        /// 待审核
+        /// </summary>
+        [Description("待审核")]
+        NoAudit = 0,
+        /// <summary>
+        /// 审核通过
+        /// </summary>
+        [Description("审核通过")]
+        Pass = 1,
+        /// <summary>
+        /// 审核不通过
+        /// </summary>
+        [Description("审核不通过")]
+        NoPass = 2,
+        /// <summary>
+        /// 撤销
+        /// </summary>
+        [Description("撤销")]
+        Revoke = 3,
+    }
+}

+ 49 - 6
src/Hotline/CallCenter/Tels/TelRestApply.cs

@@ -1,13 +1,56 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Hotline.Share.Enums.CallCenter;
+using SqlSugar;
 using XF.Domain.Repository;
 
 namespace Hotline.CallCenter.Tels
 {
-    public class TelRestApply: PositionWorkflowEntity
+    public class TelRestApply : CreationEntity
     {
+        /// <summary>
+        /// 分机id
+        /// </summary>
+        public string? TelId { get; set; }
+
+        /// <summary>
+        /// 分机号(冗余)
+        /// </summary>
+        public string TelNo { get; set; }
+
+        public string Reason { get; set; }
+
+        public string ReasonId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditUserName { get; set; }
+        public string? AuditUserId { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+        public string? AuditOrgId { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核意见", ColumnDataType = "varchar(2000)")]
+        public string? AuditOpinion { get; set; }
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public ETelRestAuditStatus AuditStatus { get; set; }
+
+        /// <summary>
+        /// 工号(冗余)
+        /// </summary>
+        public string? StaffNo { get; set; }
     }
 }