瀏覽代碼

Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop

yuanrf 1 年之前
父節點
當前提交
62d3f46c59
共有 25 個文件被更改,包括 1134 次插入76 次删除
  1. 10 5
      OASystem/OASystem.Api/Controllers/AuthController.cs
  2. 1 1
      OASystem/OASystem.Api/Controllers/GroupsController.cs
  3. 198 0
      OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs
  4. 8 5
      OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs
  5. 95 0
      OASystem/OASystem.Api/OAMethodLib/Hubs/MessageHub.cs
  6. 3 2
      OASystem/OASystem.Api/OAMethodLib/Quartz/Business/DeleReminderMessage.cs
  7. 194 0
      OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs
  8. 30 0
      OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskJob.cs
  9. 29 0
      OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskNewsFeedJob.cs
  10. 21 3
      OASystem/OASystem.Api/OAMethodLib/Quartz/QuartzFactory.cs
  11. 1 0
      OASystem/OASystem.Api/OASystem.API.csproj
  12. 24 0
      OASystem/OASystem.Api/Program.cs
  13. 0 3
      OASystem/OASystem.Api/appsettings.json
  14. 73 0
      OASystem/OASystem.Domain/Dtos/PersonnelModule/TaskAllocationDto.cs
  15. 8 7
      OASystem/OASystem.Domain/Dtos/System/MessageDto.cs
  16. 7 0
      OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskAllocation.cs
  17. 3 2
      OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskRelevanceUser.cs
  18. 7 4
      OASystem/OASystem.Domain/Entities/System/Sys_Message.cs
  19. 46 0
      OASystem/OASystem.Domain/Enums/MessgeTypeEnum.cs
  20. 50 0
      OASystem/OASystem.Domain/Enums/TaskEnum.cs
  21. 83 1
      OASystem/OASystem.Domain/ViewModels/PersonnelModule/TaskAllocationView.cs
  22. 19 0
      OASystem/OASystem.Domain/ViewModels/System/MessageReadAuthView.cs
  23. 208 43
      OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs
  24. 7 0
      OASystem/OASystem.SignalR/Class1.cs
  25. 9 0
      OASystem/OASystem.SignalR/OASystem.SignalR.csproj

+ 10 - 5
OASystem/OASystem.Api/Controllers/AuthController.cs

@@ -14,6 +14,7 @@ using OASystem.Domain.Dtos.QiYeWeChat;
 using OASystem.Domain.Entities.System;
 using TinyPinyin;
 using System.Globalization;
+using OASystem.API.OAMethodLib.Hubs;
 
 namespace OASystem.API.Controllers
 {
@@ -32,7 +33,7 @@ namespace OASystem.API.Controllers
         private readonly IQiYeWeChatApiService _qiYeWeChatApiServic;
 
         public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper,MessageRepository message,
-            SystemMenuPermissionRepository systemMenuPermissionRepository, IQiYeWeChatApiService qiYeWeChatApiService)
+            SystemMenuPermissionRepository systemMenuPermissionRepository, IQiYeWeChatApiService qiYeWeChatApiService, MessageHub msgHub)
         {
             _config = config;
             _loginRep = loginRep;
@@ -62,12 +63,16 @@ namespace OASystem.API.Controllers
 
             #endregion
             Result authData = null;
+            string uName = string.Empty;
+            int uId = 0;
             if (userData.Data != null)
             {
-                var uid = (userData.Data as UserLoginInfoView).UserId;
-                authData = _SystemMenuPermissionRepository.QueryMenuLoad(uid, dto.PortType);
+                uId = (userData.Data as UserLoginInfoView).UserId;
+                uName = (userData.Data as UserLoginInfoView).CnName;
+                authData = _SystemMenuPermissionRepository.QueryMenuLoad(uId, dto.PortType);
             }
 
+
             var view = new LoginView
             {
                 UserInfo = userData == null ? null : userData.Data,
@@ -87,7 +92,7 @@ namespace OASystem.API.Controllers
 
                 if (expDt >= createZebraTime)  //超时重新获取token
                 {
-                    authorToken = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
+                    authorToken = GeneralMethod.GetToken(_config, dto.Number, uId,uName, createZebraTime);
                 }
 
                 view.Expires = expDt;
@@ -97,7 +102,7 @@ namespace OASystem.API.Controllers
             else
             {
                 view.Expires = createZebraTime.AddMinutes(30);
-                view.Token = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
+                view.Token = GeneralMethod.GetToken(_config, dto.Number, uId, uName, createZebraTime);
                 TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
                 await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(authorId, view.Token, ts);//string 存
 

+ 1 - 1
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -818,7 +818,7 @@ namespace OASystem.API.Controllers
 
                         bool rst = await _message.AddMsg(new MessageDto()
                         {
-                            Type = 5,
+                            Type = MessgeTypeEnum.GroupVisaProgressUpdate,
                             IssuerId = dto.publisher,
                             Title = title,
                             Content = content,

+ 198 - 0
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -7,6 +7,7 @@ using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
+using StackExchange.Redis;
 using System.Collections.Generic;
 using System.Data;
 using System.Diagnostics;
@@ -993,6 +994,93 @@ namespace OASystem.API.Controllers
             }
         }
 
+        /// <summary>
+        /// 任务分配 
+        /// page
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationPage(TaskAllocationPageDto _dto)
+        {
+            try
+            {
+                #region  参数验证
+                if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
+                if (_dto.PageId < 1) _dto.PageId = 172; //任务指派Id
+
+                PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+                #region 页面操作权限验证
+                pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+                if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限!"));
+                #endregion
+
+                #endregion
+
+                string whereSql = "";
+                #region 分页参数处理
+                //类型处理
+                if (_dto.Type == 0) whereSql = "";
+                else if (_dto.Type == 1) //1 由我指派
+                {
+                    whereSql = string.Format(@" And ta.CreateUserId = {0}",_dto.UserId); 
+                }
+                else if (_dto.Type == 2)// 2 指派给我
+                {
+                    whereSql = string.Format(@" And (Select COUNT(1) As PeopleNumber From Pm_TaskRelevanceUser Where IsDel = 0 And ta.Id = TAId And UserId = {0}) > 0", _dto.UserId);
+                }
+                //状态 -1 全部 0 未开始 1 进行中 2 待审核 3 未完成 4 已完成
+                if (_dto.Status == -1) //全部
+                {
+                    whereSql += "";
+                }
+                else
+                {
+                    whereSql += string.Format(@" And ta.Status = {0} ", _dto.Status);
+                }
+
+                //任务名称
+                if (!string.IsNullOrEmpty(_dto.TaskName))
+                {
+                    whereSql += string.Format(@" And ta.TaskName Like '%{0}%' ", _dto.TaskName);
+                }
+
+                #endregion
+
+                string pageSql = string.Format(@"Select * From(
+                                                 Select ROW_NUMBER() OVER(ORDER BY ta.CreateTime Desc) AS RowNumber,
+                                                 ta.Id,ta.TaskName,ta.TaskPriority,d.DepName,di.TeamName,ta.Status,
+                                                 ta.PredictBeginTime,ta.PredictEndTime,u.CnName As CreateUserName,ta.CreateTime,
+                                                 (SELECT STUFF(
+                                                  (Select  ',' + u.CnName From Pm_TaskRelevanceUser tra
+                                                 Left Join Sys_Users u On tra.UserId = u.Id
+                                                 Where tra.Isdel = 0 And tra.TAId = ta.Id
+                                                 FOR XML PATH('')),1,1,'')) As Participant,
+                                                 (SELECT STUFF(
+                                                  (Select  ',' + u.CnName From Pm_TaskRelevanceUser tra
+                                                 Left Join Sys_Users u On tra.UserId = u.Id
+                                                 Where tra.Isdel = 0 And tra.TAId = ta.Id And tra.TaskStatus = 4
+                                                 FOR XML PATH('')),1,1,'')) As Consummator
+                                                 From Pm_TaskAllocation ta
+                                                 Left Join Sys_Department d  On ta.DepId = d.Id 
+                                                 Left Join Grp_DelegationInfo di  On ta.DiId = di.Id 
+                                                 Left Join Sys_Users u On ta.CreateUserId = u.Id
+                                                 Where ta.IsDel = 0 {0} ) As temp ", whereSql);
+
+                RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
+                var _view = await _taskAllocationRep._sqlSugar.SqlQueryable<TaskListView>(pageSql).ToPageListAsync(_dto.PageIndex, _dto.PageSize, total);//ToPageAsync
+
+                return Ok(JsonView(true, "查询成功!", _view, total));
+            }
+            catch (Exception ex)
+            {
+
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
         /// <summary>
         /// 任务分配
         /// 详情
@@ -1080,6 +1168,116 @@ namespace OASystem.API.Controllers
                 return Ok(JsonView(false, ex.Message));
             }
         }
+
+
+        /// <summary>
+        /// 任务分配
+        /// 设置知晓状态
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationSetHaveStatus(TaskAllocationStatusDto _dto)
+        {
+            try
+            {
+
+                var _view = await _taskAllocationRep._TaskSetHaveStatus(_dto.SubId);
+                if (_view.Code == 0)
+                {
+                    return Ok(JsonView(true, "操作成功!"));
+                }
+
+                return Ok(JsonView(false, _view.Msg));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
+
+        /// <summary>
+        /// 任务分配
+        /// 确认任务是否可操作完成
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationIsConfirmCompletion(TaskAllocationScoreDto _dto)
+        {
+            try
+            {
+                #region  参数验证
+                if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
+                if (_dto.PageId < 1) _dto.PageId = 172; //任务指派Id
+
+                PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+                #region 页面操作权限验证
+                pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+                if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
+
+                #endregion
+
+                #endregion
+
+                var _view = await _taskAllocationRep._TaskConfirmCompletion(_dto.PortType, _dto.Id);
+                if (_view.Code == 0)
+                {
+                    return Ok(JsonView(true, "操作成功!"));
+                }
+
+                return Ok(JsonView(false, _view.Msg));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
+
+        /// <summary>
+        /// 任务分配
+        /// 任务确认完成
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationConfirmCompletion(TaskAllocationConfirmCompletionDto _dto)
+        {
+            try
+            {
+                #region  参数验证
+                if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
+                if (_dto.PageId < 1) _dto.PageId = 172; //任务指派Id
+
+                PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+                #region 页面操作权限验证
+                pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+                if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
+
+                #endregion
+
+                #endregion
+
+                var _view = await _taskAllocationRep._TaskConfirmCompletion(_dto.PortType,_dto.Id);
+                if (_view.Code == 0)
+                {
+                    return Ok(JsonView(true, "操作成功!"));
+                }
+
+                return Ok(JsonView(false, _view.Msg));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
         #endregion
     }
 }

+ 8 - 5
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -86,10 +86,13 @@ namespace OASystem.API.OAMethodLib
         /// <param name="Number"></param>
         /// <param name="exp"></param>
         /// <returns></returns>
-        public static string GetToken(IConfiguration _config,string Number,DateTime exp) 
+        public static string GetToken(IConfiguration _config, string Number, int uId, string uName, DateTime exp)
         {
+            string userId = Guid.NewGuid().ToString().Replace("-", "");
             var claims = new[] {
-                new Claim(ClaimTypes.NameIdentifier, "Future"),
+                new Claim(ClaimTypes.NameIdentifier, uName),
+                new Claim(ClaimTypes.NameIdentifier, uId.ToString()),
+                new Claim(ClaimTypes.NameIdentifier, userId),
                 new Claim("Number",Number)
             };
             var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"]));
@@ -100,9 +103,9 @@ namespace OASystem.API.OAMethodLib
                 claims: claims,
                 expires: exp,
                 signingCredentials: creds);
-           
-            
-            return   new JwtSecurityTokenHandler().WriteToken(token);
+
+
+            return new JwtSecurityTokenHandler().WriteToken(token);
 
         }
 

+ 95 - 0
OASystem/OASystem.Api/OAMethodLib/Hubs/MessageHub.cs

@@ -0,0 +1,95 @@
+using Microsoft.AspNetCore.Cors;
+using Microsoft.AspNetCore.SignalR;
+using System.ComponentModel.DataAnnotations;
+
+namespace OASystem.API.OAMethodLib.Hubs
+{
+    /// <summary>
+    /// 站内通信 Hub
+    /// </summary>
+    public class MessageHub : Hub
+    {
+        private readonly ILogger<MessageHub> _logger;
+
+        public static List<HubUser> _userList = new List<HubUser> { };
+        public MessageHub(ILogger<MessageHub> logger)
+        {
+            _logger = logger;
+        }
+
+
+        //发送消息--发送给所有连接的客户端
+        public Task SendMessage(string msg)
+        {
+            return Clients.All.SendAsync("ReceiveMessage", msg);
+        }
+        //发送消息--发送给指定用户
+        public Task SendPrivateMessage(string connectionId, string message)
+        {
+            return Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
+        }
+
+
+
+        /// <summary>
+        /// 登录功能,将用户ID和ConntectionId关联起来
+        /// </summary>
+        /// <param name="userId"></param>
+        public void Login(int userId,string userName)
+        {
+            try
+            {
+                HubUser hu = _userList.Find(a => a.UserId == userId);
+                if (hu != null)
+                {
+                    _userList.Remove(hu);
+                }
+                string connectionId = Context.ConnectionId;
+                _userList.Add(new HubUser
+                {
+                    UserId = userId,
+                    UserName = userName,
+                    ConnectionId = connectionId
+                });
+                Console.WriteLine($"{userId}登录成功,ConnectionId={connectionId}");
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"{userId}登录失败");
+            }
+            
+        }
+
+        /// <summary>
+        /// 退出功能,当客户端退出时调用
+        /// </summary>
+        /// <param name="userId"></param>
+        public void Logout(int userId)
+        {
+            HubUser hu = _userList.Find(a => a.UserId == userId);
+            if (hu != null)
+            {
+                _userList.Remove(hu);
+            }
+            Console.WriteLine($"{userId}退出成功,ConnectionId={hu.ConnectionId}");
+        }
+
+        public class HubUser
+        {
+            /// <summary>
+            /// 连接ID
+            /// </summary>
+            [Key]
+            public string ConnectionId { get; set; } = string.Empty;
+            /// <summary>
+            /// 用户id
+            /// </summary>
+            public int UserId { get; set; }
+            /// <summary>
+            /// 姓名
+            /// </summary>
+            public string UserName { get; set; }
+        }
+    }
+}
+

+ 3 - 2
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/DeleReminderMessage.cs

@@ -2,8 +2,10 @@
 using OASystem.Domain.Dtos.Business;
 using OASystem.Domain.Entities.Business;
 using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.Groups;
 using OASystem.Infrastructure.Repositories.Groups;
+using OASystem.Infrastructure.Repositories.PersonnelModule;
 
 namespace OASystem.API.OAMethodLib.Quartz.Business
 {
@@ -77,10 +79,9 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                         _entity.PostResult = postResult;
                         _grpDeleRep._sqlSugar.Insertable<Bus_MsgPostInfo>(_entity);
                     }
-
-
                 }
             }
         }
+
     }
 }

+ 194 - 0
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs

@@ -0,0 +1,194 @@
+using Microsoft.AspNetCore.SignalR;
+using OASystem.API.OAMethodLib.Hubs;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.PersonnelModule;
+using OASystem.Infrastructure.Repositories.PersonnelModule;
+using ILogger = Microsoft.Extensions.Logging.ILogger;
+
+namespace OASystem.API.OAMethodLib.Quartz.Business
+{
+    /// <summary>
+    /// 任务指派
+    /// 定时任务
+    /// </summary>
+    public static class TaskAssignment
+    {
+        private readonly static TaskAllocationRepository _taskAllocationRep = AutofacIocManager.Instance.GetService<TaskAllocationRepository>();
+        private readonly static ILogger _logger;
+        private readonly static IHubContext<ChatHub> _hubContext;
+        /// <summary>
+        /// 定时任务更改状态
+        /// 每天下午六点定时更新
+        /// </summary>
+        public static async void PostTaskUpdateStatus()
+        {
+            var data = await _taskAllocationRep._sqlSugar
+                                               .Queryable<Pm_TaskAllocation>()
+                                               .Where(it => it.IsDel == 0 &&
+                                                            !string.IsNullOrEmpty(it.PredictEndTime) &&
+                                                            Convert.ToDateTime(it.PredictEndTime) >= DateTime.Now
+                                                     )
+                                               .ToListAsync();
+            if (data.Count > 0)
+            {
+                //处理要变更状态的员工
+                List<int> primaryIds = new List<int>();
+                primaryIds = data.Select(it => it.Id).ToList();
+                var subData = await _taskAllocationRep._sqlSugar
+                                                      .Queryable<Pm_TaskRelevanceUser>()
+                                                      .Where(it => it.IsDel == 0 &&
+                                                                   primaryIds.Contains(it.TAId) &&
+                                                                   it.TaskStatus <= (int)TaskEnum.UnderWay
+                                                            )
+                                                      .ToListAsync();
+                foreach (var item in subData)
+                {
+                    item.OverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm-ss");
+                    item.TaskStatus = (int)TaskEnum.UnFinished;
+                    item.Cause = string.Format(@"任务没有提交完成或者超时,由系统设置任务未完成");
+                }
+                if (subData.Count > 0)
+                {
+                    var updateStatus = await _taskAllocationRep._sqlSugar
+                                                               .Updateable(subData)
+                                                               .WhereColumns(it => it.Id)
+                                                               .ExecuteCommandAsync();
+
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// 任务消息推送
+        /// 每天下午2点定时推送
+        /// </summary>
+        public static async void PostTaskNewsFeed()
+        {
+            #region 消息处理
+
+           
+            //var data = _taskAllocationRep._sqlSugar
+            //                             .Queryable<Pm_TaskAllocation>()
+            //                             .Where(it => it.IsDel == 0 &&
+            //                                          !string.IsNullOrEmpty(it.PredictEndTime) &&
+            //                                          Convert.ToDateTime(it.PredictEndTime).ToString("yyyy-MM-dd").Equals(DateTime.Now.ToString("yyyy-MM-dd"))
+            //                                   )
+            //                             .ToList();
+            //if (data.Count > 0)
+            //{
+            //    //处理要任务提醒的员工
+            //    List<int> primaryIds = new List<int>();
+            //    primaryIds = data.Select(it => it.Id).ToList();
+            //    var subData = _taskAllocationRep._sqlSugar
+            //                                    .Queryable<Pm_TaskRelevanceUser>()
+            //                                    .Where(it => it.IsDel == 0 &&
+            //                                                 primaryIds.Contains(it.TAId) &&
+            //                                                 it.TaskStatus <= (int)TaskEnum.UnderWay
+            //                                          )
+            //                                    .ToList();
+
+            //    _taskAllocationRep._sqlSugar.BeginTran();
+            //    var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
+            //    var groupDatas = _taskAllocationRep._sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
+            //    var userDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
+
+            //    foreach (var item in data)
+            //    {
+            //        string depName = string.Empty;
+            //        string groupName = string.Empty;
+            //        var depData = depDatas.Where(it => it.Id == item.DepId).FirstOrDefault();
+            //        if (depData != null) { depName = depData.DepName; }
+            //        if (item.DiId == -1) { groupName = "其他"; }
+            //        else
+            //        {
+            //            var groupData = groupDatas.Where(it => it.Id == item.DiId).FirstOrDefault();
+            //            if (groupData != null) { groupName = groupData.TeamName; }
+            //        }
+
+            //        var subData1 = subData.Where(it => it.TAId == item.Id).ToList();
+
+            //        foreach (var subItem in subData1)
+            //        {
+            //            string realityStartTime = string.Empty;
+            //            string userName = string.Empty;
+            //            if (!string.IsNullOrEmpty(subItem.BeginTime))
+            //            {
+            //                realityStartTime = subItem.BeginTime;
+            //            }
+            //            else
+            //            {
+            //                if (subItem.TaskStatus == -1) realityStartTime = "未开始";
+            //                else if (subItem.TaskStatus == 0) realityStartTime = "已知晓";
+            //            }
+
+            //            var userData = userDatas.Where(it => it.Id == subItem.UserId).FirstOrDefault();
+            //            if (userData != null) { userName = userData.CnName; }
+            //            string msgContent = string.Format(@"任务归属:{0}<br/>
+            //                                                归属团组:{1}<br/>
+            //                                                预计起止时间:{2} 至 {3}<br/>
+            //                                                实际开始时间:{4}<br/>
+            //                                                任务优先级:{5}<br/>
+            //                                                任务参与者:{6}<br/>
+            //                                                任务内容:{7}", depName, groupName, item.PredictBeginTime, item.PredictEndTime,
+            //                                                realityStartTime, item.TaskPriority, userName, item.TaskContent);
+            //            Sys_Message _Message = new Sys_Message()
+            //            {
+            //                Type = MessgeTypeEnum.TaskProgressUpdate,
+            //                Title = item.TaskName,
+            //                IssuerId = 4, //管理员
+            //                Content = msgContent,
+            //                ReleaseTime = DateTime.Now,
+            //                CreateUserId = 4,
+            //                CreateTime = DateTime.Now,
+            //                DeleteTime = "1990-01-01 00:00:00.000",
+            //                DiId = item.DiId,
+            //            };
+            //            var msgAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_Message>(_Message).ExecuteReturnIdentity();
+            //            if (msgAddId < 0)
+            //            {
+            //                _taskAllocationRep._sqlSugar.RollbackTran();
+            //                _logger.LogError("任务通知消息推送失败!");
+            //                return;
+            //            }
+
+            //            Sys_MessageReadAuth _MessageReadAuth = new Sys_MessageReadAuth()
+            //            {
+            //                MsgId = msgAddId,
+            //                ReadableUId = subItem.UserId,
+            //                IsRead = 0,
+            //                ReadTime = Convert.ToDateTime("1990-01-01 00:00:00.000"),
+            //                CreateUserId = 4,
+            //                CreateTime = DateTime.Now,
+            //                DeleteTime = "1990-01-01 00:00:00.000"
+            //            };
+
+            //            var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_MessageReadAuth>(_MessageReadAuth).ExecuteReturnIdentity();
+            //            if (msgAuthAddId < 0)
+            //            {
+            //                _taskAllocationRep._sqlSugar.RollbackTran();
+            //                _logger.LogError("任务通知消息推送失败!");
+            //                return;
+            //            }
+            //        }
+            //    }
+            //    _taskAllocationRep._sqlSugar.CommitTran();
+            //}
+            #endregion
+
+            //查询需要提示的消息 Singlr
+            string sql = string.Format(@"Select smra.Id,su.CnName As Issuer,sm.ReleaseTime,sm.Title,
+										 sm.Content,smra.ReadableUId,smra.IsRead,smra.CreateTime
+										 From Sys_Message sm
+										 Left Join Sys_MessageReadAuth smra On sm.Id = smra.MsgId
+										 Left Join Sys_Users su On sm.IssuerId = su.Id
+										 Where sm.IsDel = 0 And sm.Type = 6 And smra.IsRead = 0
+										 Order By smra.ReadableUId,smra.CreateTime Desc");
+            var datas = _taskAllocationRep._sqlSugar.SqlQueryable<MessageReadAuthPushView>(sql).ToList();
+
+            await _hubContext.Clients.All.SendAsync("ReceiveMessage","系统通知","${da}");
+
+
+        }
+    }
+}

+ 30 - 0
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskJob.cs

@@ -0,0 +1,30 @@
+using OASystem.API.OAMethodLib.Quartz.Business;
+using Quartz;
+using QuzrtzJob.Factory;
+
+namespace OASystem.API.OAMethodLib.Quartz.Jobs
+{
+    /// <summary>
+    /// 任务指派
+    /// 定时器
+    /// </summary>
+    public class TaskJob:IJob
+    {
+        private readonly ILogger<TaskJob> _logger;
+
+        public TaskJob(ILogger<TaskJob> logger)
+        {
+            _logger = logger;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            _logger.LogInformation("调用任务状态变更Function " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+
+            //在此处编写任务业务代码
+            TaskAssignment.PostTaskUpdateStatus();
+
+            return Task.CompletedTask;
+        }
+    }
+}

+ 29 - 0
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskNewsFeedJob.cs

@@ -0,0 +1,29 @@
+using OASystem.API.OAMethodLib.Quartz.Business;
+using Quartz;
+
+namespace OASystem.API.OAMethodLib.Quartz.Jobs
+{
+    /// <summary>
+    /// 任务消息推送
+    /// 每天下午两点推送
+    /// </summary>
+    public class TaskNewsFeedJob : IJob
+    {
+        private readonly ILogger<TaskNewsFeedJob> _logger;
+
+        public TaskNewsFeedJob(ILogger<TaskNewsFeedJob> logger)
+        {
+            _logger = logger;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            _logger.LogInformation("调用任务消息推送 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+
+            //在此处编写任务业务代码
+            TaskAssignment.PostTaskNewsFeed();
+
+            return Task.CompletedTask;
+        }
+    }
+}

+ 21 - 3
OASystem/OASystem.Api/OAMethodLib/Quartz/QuartzFactory.cs

@@ -1,4 +1,5 @@
 using OASystem.API.OAMethodLib.Quartz;
+using OASystem.API.OAMethodLib.Quartz.Jobs;
 using Quartz;
 using Quartz.Spi;
 
@@ -19,21 +20,38 @@ namespace QuzrtzJob.Factory
         {
             //2、通过调度工厂获得调度器
             _scheduler = await _schedulerFactory.GetScheduler();
+
             //这里是指定容器仓库
             _scheduler.JobFactory = _IOCjobFactory;
             //3、开启调度器
             await _scheduler.Start();
+
             //4、创建一个触发器
             var trigger = TriggerBuilder.Create()
                             //.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
                             .WithCronSchedule("0 15 9 * * ?")
                             .Build();
-            //5、创建任务
-            var jobDetail = JobBuilder.Create<ALiYunPostMessageJob>()
-                            .WithIdentity("job", "group")
+            
+            var taskTrigger = TriggerBuilder.Create()
+                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
+                            .WithCronSchedule("0 0 18 * * ?")
+                            .Build();
+            var taskMsgTrigger = TriggerBuilder.Create()
+                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每两秒执行一次
+                            //.WithCronSchedule("0 0 14 * * ?")
                             .Build();
+
+            //5、创建任务
+            var jobDetail = JobBuilder.Create<ALiYunPostMessageJob>().WithIdentity("job1", "group") .Build();
+            var taskJobDetail = JobBuilder.Create<TaskJob>().WithIdentity("job2", "group").Build();
+            var taskMsgJobDetail = JobBuilder.Create<TaskNewsFeedJob>().WithIdentity("job3", "group").Build();
+
             //6、将触发器和任务器绑定到调度器中
             await _scheduler.ScheduleJob(jobDetail, trigger);
+            await _scheduler.ScheduleJob(taskJobDetail, taskTrigger);
+            await _scheduler.ScheduleJob(taskMsgJobDetail, taskMsgTrigger);
+
+
             return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
         }
     }

+ 1 - 0
OASystem/OASystem.Api/OASystem.API.csproj

@@ -32,6 +32,7 @@
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.11" />
     <PackageReference Include="QRCoder" Version="1.4.1" />
     <PackageReference Include="Quartz" Version="3.6.2" />
+    <PackageReference Include="QuartzUI.Extension.AspNetCore" Version="1.1.8" />
     <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.3.35" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />

+ 24 - 0
OASystem/OASystem.Api/Program.cs

@@ -15,6 +15,10 @@ using Quartz;
 using QuzrtzJob.Factory;
 using System.Runtime.CompilerServices;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
+using OASystem.API.OAMethodLib.Quartz.Jobs;
+using Microsoft.AspNetCore.Cors.Infrastructure;
+using Microsoft.AspNetCore.SignalR;
+using OASystem.API.OAMethodLib.Hubs;
 
 var builder = WebApplication.CreateBuilder(args);
 var basePath = AppContext.BaseDirectory;
@@ -270,11 +274,22 @@ builder.Services.AddHttpClient("PublicQiYeWeChatApi", c => c.BaseAddress = new U
 builder.Services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
 builder.Services.AddSingleton<QuartzFactory>();
 builder.Services.AddSingleton<ALiYunPostMessageJob>();
+builder.Services.AddSingleton<TaskJob>();
+builder.Services.AddSingleton<TaskNewsFeedJob>();
 //# new business
 builder.Services.AddSingleton<IJobFactory, IOCJobFactory>();
 
 #endregion
 
+#region SignalR
+builder.Services.AddSignalR().AddJsonProtocol(options =>
+{
+    //加配置可以传给客户端对象,否则只能传字符串
+    options.PayloadSerializerOptions.PropertyNamingPolicy = null;
+});
+
+#endregion
+
 var app = builder.Build();
 AutofacIocManager.Instance.Container = app.UseHostFiltering().ApplicationServices.GetAutofacRoot();//AutofacIocManager
 
@@ -291,6 +306,7 @@ app.UseAuthorization();  // 
 app.UseCors("Cors");  //Cors
 //app.UseCors("AllowSpecificOrigin");  //Cors
 
+
 #region 启用swaggerUI
 if (AppSettingsHelper.Get("UseSwagger").ToBool())
 {
@@ -327,6 +343,14 @@ app.Lifetime.ApplicationStopped.Register(() =>
 #endregion
 
 
+#region SignalR
+app.UseEndpoints(endpoints =>
+{
+    endpoints.MapControllers();
+    endpoints.MapHub<ChatHub>("/api/chatHub");
+});
+#endregion
+
 app.MapControllerRoute(
     name: "default",
     pattern: "{controller=Home}/{action=Index}/{id?}");

+ 0 - 3
OASystem/OASystem.Api/appsettings.json

@@ -137,7 +137,6 @@
       "PageIdDatas": [ //页面Ids
         28
       ]
-
     },
     {
       "CTableId": 77, //CtableId  行程
@@ -148,7 +147,6 @@
       "CTableId": 79, //CtableId 车/导游地接
       "PageIdDatas": [ //页面Id
       ]
-
     },
     {
       "CTableId": 80, //CtableId  签证
@@ -188,5 +186,4 @@
       ]
     }
   ]
-
 }

+ 73 - 0
OASystem/OASystem.Domain/Dtos/PersonnelModule/TaskAllocationDto.cs

@@ -22,6 +22,31 @@ namespace OASystem.Domain.Dtos.PersonnelModule
 
     }
 
+    /// <summary>
+    /// 任务分配 Page
+    /// </summary>
+    public class TaskAllocationPageDto : UserPageFuncDtoBase
+    {
+        public int PageIndex { get; set; } = 1;
+        public int PageSize { get; set; } = 10;
+
+        /// <summary>
+        /// 数据类型
+        /// 0 全部 1 由我指派 2 指派给我
+        /// </summary>
+        public int Type { get; set; }
+
+        /// <summary>
+        /// 任务状态
+        /// </summary>
+        public int Status { get; set; }
+
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string? TaskName { get; set; }
+    }
+
     /// <summary>
     /// 任务分配 Details Dto
     /// </summary>
@@ -92,4 +117,52 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         /// </summary>
         public int IsIntoPerformance { get; set; } = 0;
     }
+
+    /// <summary>
+    /// 任务分配 
+    /// 任务确认完成 
+    /// </summary>
+    public class TaskAllocationConfirmCompletionDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+
+    }
+
+    /// <summary>
+    /// 任务分配 
+    /// 任务状态更改
+    /// </summary>
+    public class TaskAllocationStatusDto
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int SubId { get; set; }
+
+    }
+
+    /// <summary>
+    /// 任务分配 
+    /// 任务评分
+    /// </summary>
+    public class TaskAllocationScoreDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+
+        public List<ScoreInfo> ScoreInfos { get; set; }
+
+    }
+
+    public class ScoreInfo
+    {
+        public int Id { get; set; }
+
+        public int Score { get; set; }
+    }
 }

+ 8 - 7
OASystem/OASystem.Domain/Dtos/System/MessageDto.cs

@@ -1,4 +1,5 @@
-using System;
+using OASystem.Domain.Enums;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -13,14 +14,14 @@ namespace OASystem.Domain.Dtos.System
     {
         /// <summary>
         /// 消息类型 
-        /// 0
-        /// 1 公告消息
-        /// 2 团组流程管控消息
-        /// 1 团组业务操作消息
-        /// 2 费用审核消息
+        /// 1 公告通知
+        /// 2 团组流程管控通知
+        /// 1 团组业务操作通知
+        /// 2 团组费用审核消息
         /// 5 团组签证进度通知
+        /// 6 团组任务进度通知
         /// </summary>
-        public int Type { get; set; }
+        public MessgeTypeEnum Type { get; set; }
 
         /// <summary>
         /// 发布人

+ 7 - 0
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskAllocation.cs

@@ -56,6 +56,13 @@ namespace OASystem.Domain.Entities.PersonnelModule
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
         public string? PredictEndTime { get; set; }
 
+        /// <summary>
+        /// 任务状态
+        /// 0 未开始 1 进行中 2 待审核 3 未完成 4 已完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int Status { get; set; } = 0;
+
         /// <summary>
         ///  0 否 1 是  
         ///  发布者确认任务是否完成(员工任务完成时间小于或等于有效时间 默认完成)

+ 3 - 2
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskRelevanceUser.cs

@@ -1,4 +1,5 @@
-using System;
+using OASystem.Domain.Enums;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -44,7 +45,7 @@ namespace OASystem.Domain.Entities.PersonnelModule
         /// -1 未开始 0 已知晓 1 进行中 2 待审核 3 未完成  4 已完成 5任务中止
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
-        public int TaskStatus { get; set; } = -1;
+        public int TaskStatus { get; set; } = (int)TaskEnum.NotStarted;
 
         /// <summary>
         /// 未完成原因

+ 7 - 4
OASystem/OASystem.Domain/Entities/System/Sys_Message.cs

@@ -1,4 +1,5 @@
-using System;
+using OASystem.Domain.Enums;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -17,11 +18,13 @@ namespace OASystem.Domain.Entities.System
         /// 0 
         /// 1 公告消息
         /// 2 团组流程管控消息
-        /// 1 团组业务操作消息
-        /// 2 费用审核消息
+        /// 3 团组业务操作消息
+        /// 4 费用审核消息
+        /// 5 签证进度更新消息
+        /// 6 任务进度更新消息
         /// </summary>
         [SugarColumn(IsNullable = true,ColumnDataType = "int")]
-        public int Type { get; set; }
+        public MessgeTypeEnum Type { get; set; }
 
         /// <summary>
         /// 发布者用户Id

+ 46 - 0
OASystem/OASystem.Domain/Enums/MessgeTypeEnum.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Enums
+{
+    /// <summary>
+    /// 消息类型
+    /// </summary>
+    public enum MessgeTypeEnum :int
+    {
+        /// <summary>
+        /// 公告消息
+        /// </summary>
+        [Description("公告消息")]
+        Announcement  =1,
+        /// <summary>
+        /// 团组流程管控消息
+        /// </summary>
+        [Description("团组流程管控消息")]
+        GroupProcessControl = 2,
+        /// <summary>
+        /// 团组业务操作消息
+        /// </summary>
+        [Description("团组业务操作消息")]
+        GroupBusinessOperations = 3,
+        /// <summary>
+        /// 团组费用审核消息
+        /// </summary>
+        [Description("团组费用审核消息")]
+        GroupExpenseAudit = 4,
+        /// <summary>
+        /// 团组签证进度更新消息
+        /// </summary>
+        [Description("团组签证进度更新消息")]
+        GroupVisaProgressUpdate = 5,
+        /// <summary>
+        /// 任务进度更新消息
+        /// </summary>
+        [Description("任务相关消息")]
+        TaskProgressUpdate = 6,
+    }
+}

+ 50 - 0
OASystem/OASystem.Domain/Enums/TaskEnum.cs

@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Enums
+{
+    /// <summary>
+    /// 任务指派状态
+    /// </summary>
+    public enum TaskEnum : int
+    {
+        /// <summary>
+        /// 任务指派状态
+        /// 未开始
+        /// </summary>
+        NotStarted = -1,
+        /// <summary>
+        /// 任务指派状态
+        /// 已知晓
+        /// </summary>
+        HaveKnown = 0,
+        /// <summary>
+        /// 任务指派状态
+        /// 进行中
+        /// </summary>
+        UnderWay = 1,
+        /// <summary>
+        /// 任务指派状态
+        /// 待审核
+        /// </summary>
+        WaitConfirm = 2,
+        /// <summary>
+        /// 任务指派状态
+        /// 未完成
+        /// </summary>
+        UnFinished = 3,
+        /// <summary>
+        /// 任务指派状态
+        /// 已完成
+        /// </summary>
+        Finished = 4,
+        /// <summary>
+        /// 任务指派状态
+        /// 任务终止
+        /// </summary>
+        TaskStop = 5
+    }
+}

+ 83 - 1
OASystem/OASystem.Domain/ViewModels/PersonnelModule/TaskAllocationView.cs

@@ -99,6 +99,83 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         /// 0 否 1 是
         /// </summary>
         public int TasStopAudit { get; set; } = 0;
+
+        /// <summary>
+        /// 任务确认权限
+        /// 0 否 1 是
+        /// </summary>
+        public int TaskComfirmAudit { get; set; } = 0;
+
+        /// <summary>
+        /// 任务评分权限
+        /// 0 否 1 是
+        /// </summary>
+        public int TaskScoreAudit { get; set; } = 0;
+    }
+
+    /// <summary>
+    /// 任务指派
+    /// Item View
+    /// </summary>
+    public class TaskListView
+    {
+        public int RowNumber { get; set; }
+
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string? TaskName { get; set; }
+
+        /// <summary>
+        /// 任务等级
+        /// </summary>
+        public int TaskPriority { get; set; }
+
+        /// <summary>
+        /// 归属部门
+        /// </summary>
+        public string? DepName { get; set; }
+
+        /// <summary>
+        /// 归属团组
+        /// </summary>
+        public string? TeamName { get; set; }
+
+        /// <summary>
+        /// 任务状态
+        /// </summary>
+        public int Status { get; set; }
+
+        /// <summary>
+        /// 任务发布人
+        /// </summary>
+        public string? CreateUserName { get; set; }
+
+        /// <summary>
+        /// 任务发布时间
+        /// </summary>
+        public DateTime? CreateTime { get; set; }
+
+        /// <summary>
+        /// 预计开始时间
+        /// </summary>
+        public string? PredictBeginTime { get; set; }
+
+        /// <summary>
+        /// 预计开始时间
+        /// </summary>
+        public string? PredictEndTime { get; set; }
+        /// <summary>
+        /// 任务参与者
+        /// </summary>
+        public string? Participant { get; set; }
+
+        /// <summary>
+        /// 任务完成者
+        /// </summary>
+        public string? Consummator { get; set; }
     }
 
     /// <summary>
@@ -110,13 +187,17 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
 
         public int DiId { get; set; }
 
+        //public string TeamName { get; set; }
+
         /// <summary>
         /// 任务部门Id 
-        /// CompanyId = 2 的部门Id 为任务部门Id
         /// </summary>
         public int DepId { get; set; }
 
+        //public string DepName { get; set; }
+
         public int CreateUserId { get; set; }
+        //public string CreateUserName { get; set; }
 
         public DateTime? CreateTime { get; set; }
 
@@ -170,6 +251,7 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         public int TAId { get; set; }
 
         public int UserId { get; set; }
+        //public string UserName { get; set; }
 
         /// <summary>
         /// 实际开始时间

+ 19 - 0
OASystem/OASystem.Domain/ViewModels/System/MessageReadAuthView.cs

@@ -10,4 +10,23 @@ namespace OASystem.Domain.ViewModels.System
     public class MessageReadAuthView : Sys_MessageReadAuth
     {
     }
+
+    /// <summary>
+    /// 消息推送 View
+    /// </summary>
+    public class MessageReadAuthPushView
+    {
+        public int Id { get; set; }
+
+        public string Issuer { get; set; }
+
+        public string ReleaseTime { get; set; }
+
+        public string Title { get; set; }
+
+        public string Content { get; set; }
+
+        public int ReadableUId { get; set; }
+
+    }
 }

+ 208 - 43
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs

@@ -1,4 +1,5 @@
 using AutoMapper;
+using EnumsNET;
 using NPOI.SS.Formula.Functions;
 using OASystem.Domain;
 using OASystem.Domain.Dtos.PersonnelModule;
@@ -45,6 +46,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 taskOperationAudit.TaskAddAudit = 1;
                 taskOperationAudit.TaskDelAudit = 1;
                 taskOperationAudit.TasStopAudit = 1;
+                taskOperationAudit.TaskComfirmAudit = 1;
+                taskOperationAudit.TaskScoreAudit = 1;
             }
 
             return taskOperationAudit;
@@ -144,42 +147,63 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
             if (portType == 1 || portType == 2 || portType == 3)
             {
-                TaskDetailsView _view = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == Id)
-                                                                                      .Select(it => new TaskDetailsView
-                                                                                  {
-                                                                                      Id = it.Id,
-                                                                                      DiId = it.DiId,
-                                                                                      DepId = it.DepId,
-                                                                                      CreateUserId = it.CreateUserId,
-                                                                                      CreateTime = it.CreateTime,
-                                                                                      TaskName = it.TaskName,
-                                                                                      TaskContent = it.TaskContent,
-                                                                                      TaskPriority = it.TaskPriority,
-                                                                                      PredictBeginTime = it.PredictBeginTime,
-                                                                                      PredictEndTime = it.PredictEndTime,
-                                                                                      IsIntoPerformance = it.IsIntoPerformance,
-                                                                                      Remark = it.Remark,
-                                                                                  })
-                                                                                      .FirstAsync();
-                if (_view != null)
+                //团组名称
+                List<ValueInfo> _GroupNameInfos = new List<ValueInfo>();
+                _GroupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0)
+                                                                           .OrderByDescending(it => it.CreateTime)
+                                                                           .Select(it => new ValueInfo { Id = it.Id, Name = it.TeamName })
+                                                                           .ToList();
+                _GroupNameInfos.Insert(0, new ValueInfo() { Id = -1, Name = "未选择" });
+                //部门名称
+                List<ValueInfo> _DepartmentNameInfos = new List<ValueInfo>();
+                _DepartmentNameInfos = _sqlSugar.Queryable<Sys_Department>()
+                                                .Select(d => new ValueInfo() { Id = d.Id, Name = d.DepName })
+                                                .ToList();
+                //用户名称
+                List<ValueInfo> _UserNameInfos = new List<ValueInfo>();
+                _UserNameInfos = _sqlSugar.Queryable<Sys_Users>()
+                                                .Select(d => new ValueInfo() { Id = d.Id, Name = d.CnName })
+                                                .ToList();
+
+                TaskDetailsView _view = _sqlSugar.Queryable<Pm_TaskAllocation>()
+                                                 .Where(it => it.IsDel == 0 && it.Id == Id)
+                                                 .Select(it => new TaskDetailsView
+                                                 {
+                                                     Id = it.Id,
+                                                     DiId = it.DiId,
+                                                     DepId = it.DepId,
+                                                     CreateUserId = it.CreateUserId,
+                                                     CreateTime = it.CreateTime,
+                                                     TaskName = it.TaskName,
+                                                     TaskContent = it.TaskContent,
+                                                     TaskPriority = it.TaskPriority,
+                                                     PredictBeginTime = it.PredictBeginTime,
+                                                     PredictEndTime = it.PredictEndTime,
+                                                     IsIntoPerformance = it.IsIntoPerformance,
+                                                     Remark = it.Remark,
+                                                 })
+                                                 .First();
+                if (_view != null)      
                 {
                     List<TaskUserDetailsView> taskUserDetailsViews = new List<TaskUserDetailsView>();
 
-                    taskUserDetailsViews = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == _view.Id)
-                                                                                              .Select(it => new TaskUserDetailsView
-                                                                                              {
-                                                                                                  Id = it.Id,
-                                                                                                  TAId = it.TAId,
-                                                                                                  UserId = it.UserId,
-                                                                                                  BeginTime = it.BeginTime,
-                                                                                                  OverTime = it.OverTime,
-                                                                                                  TaskStatus = it.TaskStatus,
-                                                                                                  Cause = it.Cause,
-                                                                                                  Remark = it.Remark
-                                                                                              })
-                                                                                              .ToListAsync();
+                    taskUserDetailsViews = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
+                                                    .Where(it => it.IsDel == 0 && it.TAId == _view.Id)
+                                                    .Select(it => new TaskUserDetailsView
+                                                    {
+                                                        Id = it.Id,
+                                                        TAId = it.TAId,
+                                                        UserId = it.UserId,
+                                                        BeginTime = it.BeginTime,
+                                                        OverTime = it.OverTime,
+                                                        TaskStatus = it.TaskStatus,
+                                                        Cause = it.Cause,
+                                                        Remark = it.Remark
+                                                    })
+                                                    .ToList();
                     _view.UserTaskInfos = taskUserDetailsViews;
 
+                    _result.Data = _view;
                     _result.Code = 0;
                     _result.Msg = "查询成功!";
                 }
@@ -233,8 +257,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                     }
 
                     _sqlSugar.BeginTran();
-                    
-                    int addId = await _sqlSugar.Insertable< Pm_TaskAllocation >(_TaskAllocation).ExecuteReturnIdentityAsync();
+
+                    int addId = await _sqlSugar.Insertable<Pm_TaskAllocation>(_TaskAllocation).ExecuteReturnIdentityAsync();
                     if (addId < 1)
                     {
                         _sqlSugar.RollbackTran();
@@ -256,15 +280,11 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                         return _result;
                     }
 
-                    /*
-                     * 发送消息
-                     */
-
                     _result.Code = 0;
                     _result.Msg = "添加成功!";
                     _sqlSugar.CommitTran();
                 }
-                else if(dto.Id > 0) //修改
+                else if (dto.Id > 0) //修改
                 {
                     _sqlSugar.BeginTran();
 
@@ -295,7 +315,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                                                   .Select(it => it.UserId)
                                                   .ToListAsync();
 
-                    if (selectUserId.Count < 1) 
+                    if (selectUserId.Count < 1)
                     {
                         int addSub1 = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers).ExecuteCommandAsync();
                         if (addSub1 < 1)
@@ -314,8 +334,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                             List<Pm_TaskRelevanceUser> _TaskRelevanceUsers1 = new List<Pm_TaskRelevanceUser>();
 
                             _TaskRelevanceUsers1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
-                                                                  .Where(it => it.IsDel == 0 && 
-                                                                               it.TAId == _TaskAllocation.Id && 
+                                                                  .Where(it => it.IsDel == 0 &&
+                                                                               it.TAId == _TaskAllocation.Id &&
                                                                                SelectUserIdDiff.Contains(it.UserId))
                                                                   .ToListAsync();
                             if (_TaskRelevanceUsers1.Count > 0)
@@ -327,7 +347,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
                                 var updateIsDel = await _sqlSugar.Updateable(_TaskRelevanceUsers1)
                                                                  .UpdateColumns(it => it.IsDel)
-                                                                 .WhereColumns(it => new { it.Id,it.TAId})
+                                                                 .WhereColumns(it => new { it.Id, it.TAId })
                                                                  .ExecuteCommandAsync();
                                 if (updateIsDel < 1)
                                 {
@@ -373,7 +393,152 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 }
 
 
-                
+
+            }
+            else
+            {
+                _result.Msg = string.Format("请传入有效的PortType参数!");
+            }
+            return _result;
+        }
+
+        /// <summary>
+        /// 设置任务知晓
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public async Task<Result> _TaskSetHaveStatus(int id)
+        {
+            if (id < 1)
+            {
+                _result.Msg = string.Format("请传入有效的Id参数!");
+                return _result;
+            }
+
+            var data1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.Id == id).FirstAsync();
+            if (data1 == null)
+            {
+                _result.Msg = string.Format("该任务不存在!");
+                return _result;
+            }
+            var data2 = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == data1.TAId).FirstAsync();
+
+            _sqlSugar.BeginTran();
+
+            var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
+                                         .SetColumns(it => it.TaskStatus == (int)TaskEnum.HaveKnown)
+                                         .ExecuteCommandAsync();
+            if (update1 < 1)
+            {
+                _result.Msg = string.Format("操作失败!");
+                return _result;
+            }
+            _result.Msg = string.Format("操作成功!");
+            _result.Code = 0;
+            _sqlSugar.CommitTran();
+
+
+            return _result;
+        }
+
+        /// <summary>
+        /// 任务确认完成
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Result> _TaskConfirmCompletion(int portType,int id)
+        {
+            if (portType == 1 || portType == 2 || portType == 3)
+            {
+                if (id < 1)
+                {
+                    _result.Msg = string.Format("请传入有效的Id参数!");
+                    return _result;
+                }
+
+                var data = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
+                                          .Where(it => it.IsDel == 0 && it.Id == id && it.TaskStatus <= (int)TaskEnum.UnFinished)
+                                          .ToListAsync();
+                if (data.Count > 0)
+                {
+                    _result.Msg = string.Format("本任务参与人员并未全部完成,不可确认任务完成!");
+                    return _result;
+                }
+
+
+                var update = await _sqlSugar.Updateable<Pm_TaskAllocation>()
+                                            .SetColumns(it => it.IsComplete == 1)
+                                            .SetColumns(it => it.Status == 4)
+                                            .Where(it => it.Id == id)
+                                            .ExecuteCommandAsync();
+                if (update > 0)
+                {
+                    _result.Code = 0;
+                    return _result;
+                }
+                else _result.Msg = "确认完成失败!";
+
+
+            }
+            else
+            {
+                _result.Msg = string.Format("请传入有效的PortType参数!");
+            }
+            return _result;
+        }
+
+        /// <summary>
+        /// 任务评分
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Result> _TaskScore(int portType, int id, List<ScoreInfo> subIds)
+        {
+            if (portType == 1 || portType == 2 || portType == 3)
+            {
+                if (id < 1)
+                {
+                    _result.Msg = string.Format("请传入有效的Id参数!");
+                    return _result;
+                }
+
+                if (subIds.Count < 1)
+                {
+                    _result.Msg = string.Format("请传入有效的SubIds参数!");
+                    return _result;
+                }
+
+                var data = await _sqlSugar.Queryable<Pm_TaskAllocation>()
+                                          .Where(it => it.IsDel == 0 && it.Id == id && it.IsComplete == 1)
+                                          .FirstAsync();
+                if (data == null)
+                {
+                    _result.Msg = string.Format("本任务尚未由发布人确认任务完成,不可评分!");
+                    return _result;
+                }
+
+                List<Pm_TaskRelevanceUser> _TaskRelevanceUsers = new List<Pm_TaskRelevanceUser>();
+                foreach (var item in subIds)
+                {
+                    _TaskRelevanceUsers.Add(new Pm_TaskRelevanceUser()
+                    {
+                        Id = item.Id,
+                        Score = item.Score,
+                    });
+                }
+
+                var update = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers)
+                                            .UpdateColumns(it => it.Score)
+                                            .WhereColumns(it => it.Id)
+                                            .ExecuteCommandAsync();
+                if (update > 0)
+                {
+                    _result.Code = 0;
+                    return _result;
+                }
+                else _result.Msg = "评分失败!";
+
+
             }
             else
             {

+ 7 - 0
OASystem/OASystem.SignalR/Class1.cs

@@ -0,0 +1,7 @@
+namespace OASystem.SignalR
+{
+    public class Class1
+    {
+
+    }
+}

+ 9 - 0
OASystem/OASystem.SignalR/OASystem.SignalR.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>