using AutoMapper; using EnumsNET; using NPOI.SS.Formula.Functions; using OASystem.Domain; using OASystem.Domain.Dtos.PersonnelModule; using OASystem.Domain.Entities.Groups; using OASystem.Domain.Entities.PersonnelModule; using OASystem.Domain.Entities.System; using OASystem.Domain.ViewModels.PersonnelModule; using Org.BouncyCastle.Ocsp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OASystem.Infrastructure.Repositories.PersonnelModule { /// <summary> /// 任务分配 /// 仓库 /// </summary> public class TaskAllocationRepository : BaseRepository<Pm_TaskAllocation, TaskAllocationView> { private readonly IMapper _mapper; private Result _result; public TaskAllocationRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar) { _mapper = mapper; _result = new Result() { Code = -1, Msg = "操作失败!" }; } /// <summary> /// 任务操作权限(任务创建人才可以进行操作) /// </summary> /// <param name="taskAllocation"></param> /// <param name="userId"></param> /// <returns></returns> public TaskOperationAudit _TaskOperationAudit(Pm_TaskAllocation taskAllocation, int userId) { TaskOperationAudit taskOperationAudit = new TaskOperationAudit(); if (taskAllocation.CreateUserId == userId) { taskOperationAudit.TaskAddAudit = 1; taskOperationAudit.TaskDelAudit = 1; taskOperationAudit.TasStopAudit = 1; taskOperationAudit.TaskComfirmAudit = 1; taskOperationAudit.TaskScoreAudit = 1; } return taskOperationAudit; } /// <summary> /// 基础数据源 /// </summary> /// <returns></returns> public async Task<Result> _Init(int portType, int userId) { if (portType == 1 || portType == 2 || portType == 3) { if (userId < 1) { _result.Msg = string.Format("请传入有效的UserId参数!"); return _result; } //任务名称 List<string> _TaskNameInfos = new List<string>(); _TaskNameInfos = _sqlSugar.Queryable<Pm_TaskAllocation, Pm_TaskRelevanceUser>((ta, tau) => new JoinQueryInfos(JoinType.Left, ta.Id == tau.Id)) .Where((ta, tau) => ta.CreateUserId == userId || tau.UserId == userId) .Select(ta => ta.TaskName).ToList(); //团组名称 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 = "未选择" }); //部门名称 ValueInfo _DepartmentNameInfos = new ValueInfo(); _DepartmentNameInfos = _sqlSugar.Queryable<Sys_Users, Sys_Department>((u, d) => new JoinQueryInfos(JoinType.Left, u.DepId == d.Id)) .Select((u, d) => new ValueInfo() { Id = d.Id, Name = d.DepName }) .First(); //执行任务人员信息 1 公司总经理/副总 可分配 所有人的任务 2 公司 部门经理/主管 可分配 部门下的人员的任务 List<ExecuteTaskUserInfo> _ExecuteTaskUserInfos = new List<ExecuteTaskUserInfo>(); TaskOperationAudit _TaskOpertionAudit = new TaskOperationAudit(); List<Pm_TaskJobRelevancy> taskAudits = new List<Pm_TaskJobRelevancy>(); taskAudits = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.PrimaryUserId == userId).ToList(); if (taskAudits.Count > 0) { //任务权限 _TaskOpertionAudit.TaskAddAudit = 1; _TaskOpertionAudit.TaskDelAudit = 1; _TaskOpertionAudit.TasStopAudit = 1; List<int> userIds = taskAudits.Select(it => it.SubUserId).ToList(); string userSql = string.Format(@"Select u.Id,u.CnName As Name,c.CompanyName, d.DepName As DepartmentName,jp.JobName From Sys_Users u Left Join Sys_Company c On u.CompanyId = c.Id Left Join Sys_Department d On u.DepId = d.Id Left Join Sys_JobPost jp On u.JobPostId = jp.Id Where u.IsDel = 0 "); _ExecuteTaskUserInfos = _sqlSugar.SqlQueryable<ExecuteTaskUserInfo>(userSql).Where(it => userIds.Contains(it.Id)).ToList(); } InitView _view = new InitView() { TaskOperationAudit = _TaskOpertionAudit, TaskNameInfos = _TaskNameInfos, ExecuteTaskUserInfos = _ExecuteTaskUserInfos, GroupNameInfos = _GroupNameInfos, DepartmentNameInfo = _DepartmentNameInfos }; _result.Code = 0; _result.Data = _view; } else { _result.Msg = string.Format("请传入有效的PortType参数!"); } return _result; } /// <summary> /// 任务指派 /// 详情 /// </summary> /// <param name="portType"></param> /// <param name="Id"></param> /// <returns></returns> public async Task<Result> _Details(int portType, int Id) { if (Id < 1) { _result.Msg = string.Format("请传入有效的Id参数!"); return _result; } if (portType == 1 || portType == 2 || portType == 3) { //团组名称 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 = _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 = "查询成功!"; } } else { _result.Msg = string.Format("请传入有效的PortType参数!"); } return _result; } /// <summary> /// Add Or Edit /// </summary> /// <param name="dto"></param> /// <returns></returns> public async Task<Result> _AddOrEdit(TaskAllocationAddOrEditDto dto) { if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3) { if (dto.UserIds.Count < 1) { _result.Msg = string.Format("指派人员不能为空!"); return _result; } #region 参数处理 Pm_TaskAllocation _TaskAllocation = new Pm_TaskAllocation(); List<Pm_TaskRelevanceUser> _TaskRelevanceUsers = new List<Pm_TaskRelevanceUser>(); _TaskAllocation = _mapper.Map<Pm_TaskAllocation>(dto); _TaskAllocation.CreateUserId = dto.UserId; foreach (var item in dto.UserIds) { _TaskRelevanceUsers.Add(new Pm_TaskRelevanceUser() { TAId = dto.Id, UserId = item, CreateUserId = dto.UserId, }); } #endregion if (dto.Id == 0) //添加 { // 1 按 任务名称 查询重 Pm_TaskAllocation taskAllocation1 = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.TaskName.Equals(_TaskAllocation.TaskName)).FirstAsync(); if (taskAllocation1 != null) { _result.Msg = string.Format("任务名称重复,请重命名!"); return _result; } _sqlSugar.BeginTran(); int addId = await _sqlSugar.Insertable<Pm_TaskAllocation>(_TaskAllocation).ExecuteReturnIdentityAsync(); if (addId < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务发布失败!"); return _result; } foreach (var item in _TaskRelevanceUsers) { item.TAId = addId; } int addSub = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers).ExecuteCommandAsync(); if (addSub < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务发布失败!"); return _result; } _result.Code = 0; _result.Msg = "添加成功!"; _sqlSugar.CommitTran(); } else if (dto.Id > 0) //修改 { _sqlSugar.BeginTran(); int updateStatus1 = await _sqlSugar.Updateable<Pm_TaskAllocation>(_TaskAllocation) .UpdateColumns(it => new { it.DepId, it.DiId, it.TaskPriority, it.TaskName, it.TaskContent, it.PredictBeginTime, it.PredictEndTime, it.IsIntoPerformance, }) .Where(it => it.Id == _TaskAllocation.Id) .ExecuteCommandAsync(); if (updateStatus1 < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务编辑失败!"); return _result; } List<int> selectUserId = new List<int>(); selectUserId = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>() .Where(it => it.IsDel == 0 && it.TAId == _TaskAllocation.Id) .Select(it => it.UserId) .ToListAsync(); if (selectUserId.Count < 1) { int addSub1 = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers).ExecuteCommandAsync(); if (addSub1 < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务编辑失败!"); return _result; } } else { List<int> SelectUserIdDiff = new List<int>(); //select 差集 SelectUserIdDiff = selectUserId.Except(dto.UserIds).ToList(); if (SelectUserIdDiff.Count > 0) //删除 { List<Pm_TaskRelevanceUser> _TaskRelevanceUsers1 = new List<Pm_TaskRelevanceUser>(); _TaskRelevanceUsers1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>() .Where(it => it.IsDel == 0 && it.TAId == _TaskAllocation.Id && SelectUserIdDiff.Contains(it.UserId)) .ToListAsync(); if (_TaskRelevanceUsers1.Count > 0) { foreach (var item in _TaskRelevanceUsers1) { item.IsDel = 1; } var updateIsDel = await _sqlSugar.Updateable(_TaskRelevanceUsers1) .UpdateColumns(it => it.IsDel) .WhereColumns(it => new { it.Id, it.TAId }) .ExecuteCommandAsync(); if (updateIsDel < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务编辑失败!"); return _result; } } } List<int> ParaUserIdDiff = new List<int>(); //para 差集 ParaUserIdDiff = dto.UserIds.Except(selectUserId).ToList(); if (ParaUserIdDiff.Count > 0) { List<Pm_TaskRelevanceUser> _TaskRelevanceUsers1 = new List<Pm_TaskRelevanceUser>(); _TaskRelevanceUsers1 = _TaskRelevanceUsers.Where(it => ParaUserIdDiff.Contains(it.UserId)).ToList(); if (_TaskRelevanceUsers1.Count > 0) { int addSub1 = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers1).ExecuteCommandAsync(); if (addSub1 < 1) { _sqlSugar.RollbackTran(); _result.Msg = string.Format("任务编辑失败!"); return _result; } } } } /* * 发送消息 */ _result.Code = 0; _result.Msg = "编辑成功!"; _sqlSugar.CommitTran(); } else { _result.Msg = string.Format("请传入有效的Id参数!"); return _result; } } 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 { _result.Msg = string.Format("请传入有效的PortType参数!"); } return _result; } } }