|
|
@@ -8,10 +8,13 @@ using OASystem.Domain.Entities.Groups;
|
|
|
using OASystem.Domain.Entities.PersonnelModule;
|
|
|
using OASystem.Domain.Entities.System;
|
|
|
using OASystem.Domain.ViewModels.PersonnelModule;
|
|
|
+using Org.BouncyCastle.Asn1.Tsp;
|
|
|
using Org.BouncyCastle.Ocsp;
|
|
|
+using SqlSugar;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
+using System.Net.NetworkInformation;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
@@ -39,7 +42,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// <param name="taskAllocation"></param>
|
|
|
/// <param name="userId"></param>
|
|
|
/// <returns></returns>
|
|
|
- public TaskOperationAudit _TaskOperationAudit(Pm_TaskAllocation taskAllocation, int userId)
|
|
|
+ public TaskOperationAudit TaskOperationAudit(Pm_TaskAllocation taskAllocation, int userId)
|
|
|
{
|
|
|
TaskOperationAudit taskOperationAudit = new TaskOperationAudit();
|
|
|
if (taskAllocation.CreateUserId == userId)
|
|
|
@@ -58,7 +61,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// 基础数据源
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _Init(int portType, int userId)
|
|
|
+ public async Task<Result> Init(int portType, int userId)
|
|
|
{
|
|
|
if (portType == 1 || portType == 2 || portType == 3)
|
|
|
{
|
|
|
@@ -68,34 +71,37 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
+ //任务类型
|
|
|
+ var taskTypeInfos = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.STid == 127 && x.IsDel == 0)
|
|
|
+ .Select(x => new ValueInfo { Id = x.Id, Name = x.Name })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
//任务名称
|
|
|
- List<string?> _TaskNameInfos = new List<string?>();
|
|
|
- _TaskNameInfos = _sqlSugar.Queryable<Pm_TaskAllocation, Pm_TaskRelevanceUser>((ta, tau) => new JoinQueryInfos(JoinType.Left, ta.Id == tau.TAId))
|
|
|
+ var taskNameInfos = _sqlSugar.Queryable<Pm_TaskAllocation, Pm_TaskRelevanceUser>((ta, tau) => new JoinQueryInfos(JoinType.Left, ta.Id == tau.TAId))
|
|
|
.Where((ta, tau) => ta.IsDel == 0 && tau.IsDel == 0)
|
|
|
.Where((ta, tau) => ta.CreateUserId == userId || tau.UserId == userId)
|
|
|
.Select(ta => ta.TaskName).ToList()
|
|
|
.Distinct().ToList();
|
|
|
|
|
|
//团组名称
|
|
|
- List<ValueInfo> _GroupNameInfos = new List<ValueInfo>();
|
|
|
- _GroupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>()
|
|
|
+ var groupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>()
|
|
|
.Where(it => it.IsDel == 0)
|
|
|
.OrderByDescending(it => it.VisitStartDate)
|
|
|
.Select(it => new ValueInfo { Id = it.Id, Name = it.TeamName })
|
|
|
.ToList();
|
|
|
- _GroupNameInfos.Insert(0, new ValueInfo() { Id = -1, Name = "未选择" });
|
|
|
+ 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))
|
|
|
+ var departmentNameInfos = _sqlSugar.Queryable<Sys_Users, Sys_Department>((u, d) => new JoinQueryInfos(JoinType.Left, u.DepId == d.Id))
|
|
|
.Where((u, d) => u.Id == userId)
|
|
|
.Select((u, d) => new ValueInfo() { Id = d.Id, Name = d.DepName })
|
|
|
.First();
|
|
|
|
|
|
//执行任务人员信息 1 公司总经理/副总 可分配 所有人的任务 2 公司 部门经理/主管 可分配 部门下的人员的任务
|
|
|
- List<ExecuteTaskUserInfo> _ExecuteTaskUserInfos = new List<ExecuteTaskUserInfo>();
|
|
|
- TaskOperationAudit _TaskOpertionAudit = new TaskOperationAudit();
|
|
|
- var taskAudits = new List<Pm_TaskJobRelevancy>();
|
|
|
- taskAudits = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.PrimaryUserId == userId).ToList();
|
|
|
+ var executeTaskUserInfos = new List<ExecuteTaskUserInfo>();
|
|
|
+ var taskOpertionAudit = new TaskOperationAudit();
|
|
|
+
|
|
|
+ var taskAudits = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.PrimaryUserId == userId).ToList();
|
|
|
var taslPerm = taskAudits.Any();
|
|
|
if (!taskAudits.Any())
|
|
|
{
|
|
|
@@ -111,13 +117,12 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
//任务权限
|
|
|
if (taslPerm)
|
|
|
{
|
|
|
-
|
|
|
- _TaskOpertionAudit.TaskAddAudit = 1;
|
|
|
- _TaskOpertionAudit.TaskDelAudit = 1;
|
|
|
- _TaskOpertionAudit.TasStopAudit = 1;
|
|
|
+ taskOpertionAudit.TaskAddAudit = 1;
|
|
|
+ taskOpertionAudit.TaskDelAudit = 1;
|
|
|
+ taskOpertionAudit.TasStopAudit = 1;
|
|
|
}
|
|
|
|
|
|
- List<int> userIds = taskAudits.Select(it => it.SubUserId).ToList();
|
|
|
+ var 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
|
|
|
@@ -125,25 +130,23 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
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();
|
|
|
+ executeTaskUserInfos = _sqlSugar.SqlQueryable<ExecuteTaskUserInfo>(userSql).Where(it => userIds.Contains(it.Id)).ToList();
|
|
|
|
|
|
}
|
|
|
|
|
|
- InitView _view = new InitView()
|
|
|
+ var view = new InitView()
|
|
|
{
|
|
|
- TaskOperationAudit = _TaskOpertionAudit,
|
|
|
- TaskNameInfos = _TaskNameInfos,
|
|
|
- ExecuteTaskUserInfos = _ExecuteTaskUserInfos,
|
|
|
- GroupNameInfos = _GroupNameInfos,
|
|
|
- DepartmentNameInfo = _DepartmentNameInfos
|
|
|
+ TaskOperationAudit = taskOpertionAudit,
|
|
|
+ TaskNameInfos = taskNameInfos,
|
|
|
+ ExecuteTaskUserInfos = executeTaskUserInfos,
|
|
|
+ GroupNameInfos = groupNameInfos,
|
|
|
+ DepartmentNameInfo = departmentNameInfos,
|
|
|
+ TaskTypeInfos = taskTypeInfos
|
|
|
};
|
|
|
_result.Code = 0;
|
|
|
- _result.Data = _view;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _result.Msg = string.Format("请传入有效的PortType参数!");
|
|
|
+ _result.Data = view;
|
|
|
}
|
|
|
+ else _result.Msg = string.Format("请传入有效的PortType参数!");
|
|
|
|
|
|
return _result;
|
|
|
}
|
|
|
@@ -155,7 +158,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// <param name="portType"></param>
|
|
|
/// <param name="Id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _Details(int portType, int Id)
|
|
|
+ public async Task<Result> Details(int portType, int Id)
|
|
|
{
|
|
|
if (Id < 1)
|
|
|
{
|
|
|
@@ -166,59 +169,56 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
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 = "未选择" });
|
|
|
+ var _groupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0)
|
|
|
+ .OrderByDescending(it => it.VisitDate)
|
|
|
+ .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();
|
|
|
+ var _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();
|
|
|
+ var _userNameInfos = _sqlSugar.Queryable<Sys_Users>()
|
|
|
+ .Select(d => new ValueInfo() { Id = d.Id, Name = d.CnName })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var _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();
|
|
|
+ var 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;
|
|
|
@@ -233,12 +233,118 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 编辑权限验证
|
|
|
+ /// </summary>
|
|
|
+ public (bool CanEdit, string Message) EditPerm(int taskId, int currentUserId)
|
|
|
+ {
|
|
|
+ var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.Id == taskId && x.IsDel == 0);
|
|
|
+
|
|
|
+ if (taskInfo == null)
|
|
|
+ return (false, "任务不存在!");
|
|
|
+
|
|
|
+ if (taskInfo.CreateUserId != currentUserId)
|
|
|
+ return (false, "当前任务仅创建人可编辑!");
|
|
|
+
|
|
|
+ // 定义结束状态集合
|
|
|
+ var UneditableStatuses = new List<TaskEnum>
|
|
|
+ {
|
|
|
+ TaskEnum.UnFinished,
|
|
|
+ TaskEnum.Finished,
|
|
|
+ TaskEnum.TaskStop
|
|
|
+ };
|
|
|
+
|
|
|
+ if (UneditableStatuses.Contains(taskInfo.Status))
|
|
|
+ return (false,
|
|
|
+ taskInfo.Status switch
|
|
|
+ {
|
|
|
+ TaskEnum.UnFinished => "当前任务状态为“未完成”结束状态,不可编辑!",
|
|
|
+ TaskEnum.Finished => "当前任务状态为“已完成”结束状态,不可编辑!",
|
|
|
+ TaskEnum.TaskStop => "当前任务状态为“任务终止”结束状态,不可编辑!",
|
|
|
+ _ => "当前任务状态不可编辑!"
|
|
|
+ });
|
|
|
+
|
|
|
+ return (true, string.Empty);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 任务终止权限验证
|
|
|
+ /// </summary>
|
|
|
+ public (bool CanEdit, string Message) TaskStopPerm(int taskId, int currentUserId)
|
|
|
+ {
|
|
|
+ var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.Id == taskId && x.IsDel == 0);
|
|
|
+
|
|
|
+ if (taskInfo == null)
|
|
|
+ return (false, "任务不存在!");
|
|
|
+
|
|
|
+ if (taskInfo.CreateUserId != currentUserId)
|
|
|
+ return (false, "只有创建人可以终止任务!");
|
|
|
+
|
|
|
+ // 2. 检查当前状态是否允许终止
|
|
|
+ if (taskInfo.Status == TaskEnum.TaskStop)
|
|
|
+ {
|
|
|
+ return (false, "任务已终止,无需重复操作!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 定义不允许终止的状态
|
|
|
+ var cannotStopStatuses = new List<TaskEnum>
|
|
|
+ {
|
|
|
+ TaskEnum.Finished,
|
|
|
+ TaskEnum.UnFinished
|
|
|
+ };
|
|
|
+
|
|
|
+ if (cannotStopStatuses.Contains(taskInfo.Status))
|
|
|
+ {
|
|
|
+ var statusDesc = taskInfo.Status switch
|
|
|
+ {
|
|
|
+ TaskEnum.Finished => "已完成",
|
|
|
+ TaskEnum.UnFinished => "未完成",
|
|
|
+ _ => "未知状态"
|
|
|
+ };
|
|
|
+ return (false, $"任务已{statusDesc},不能终止!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 安全解析时间
|
|
|
+ var predictBeginTime = SafeParse(taskInfo.PredictBeginTime);
|
|
|
+ var predictEndTime = SafeParse(taskInfo.PredictEndTime);
|
|
|
+ var currTime = DateTime.Now;
|
|
|
+
|
|
|
+ // 时间范围检查
|
|
|
+ if (predictBeginTime.HasValue && currTime < predictBeginTime.Value)
|
|
|
+ return (false, "任务尚未开始,不能终止!");
|
|
|
+
|
|
|
+ if (predictEndTime.HasValue && currTime > predictEndTime.Value.AddHours(24))
|
|
|
+ return (false, "任务已超过预计结束时间24小时,不能终止!");
|
|
|
+
|
|
|
+ // 检查创建时间(防止恶意创建后立即终止)
|
|
|
+ if ((currTime - taskInfo.CreateTime).TotalMinutes < 5)
|
|
|
+ {
|
|
|
+ return (false, "任务创建时间不足5分钟,请先执行一段时间才可执行任务终止!");
|
|
|
+ }
|
|
|
+
|
|
|
+ return (true, string.Empty);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 安全解析字符串为 DateTime?
|
|
|
+ /// </summary>
|
|
|
+ public static DateTime? SafeParse(string dateTimeString)
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(dateTimeString))
|
|
|
+ return null;
|
|
|
+
|
|
|
+ if (DateTime.TryParse(dateTimeString, out DateTime result))
|
|
|
+ return result;
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Add Or Edit
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _AddOrEdit(TaskAllocationAddOrEditDto dto)
|
|
|
+ public async Task<Result> AddOrEdit(TaskAllocationAddOrEditDto dto)
|
|
|
{
|
|
|
if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3)
|
|
|
{
|
|
|
@@ -249,8 +355,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
}
|
|
|
|
|
|
#region 参数处理
|
|
|
- Pm_TaskAllocation _TaskAllocation = new Pm_TaskAllocation();
|
|
|
- List<Pm_TaskRelevanceUser> _TaskRelevanceUsers = new List<Pm_TaskRelevanceUser>();
|
|
|
+ var _TaskAllocation = new Pm_TaskAllocation();
|
|
|
+ var _TaskRelevanceUsers = new List<Pm_TaskRelevanceUser>();
|
|
|
_TaskAllocation = _mapper.Map<Pm_TaskAllocation>(dto);
|
|
|
_TaskAllocation.CreateUserId = dto.UserId;
|
|
|
_TaskAllocation.Status = TaskEnum.NotStarted;
|
|
|
@@ -308,20 +414,40 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
_sqlSugar.BeginTran();
|
|
|
|
|
|
+ #region 编辑验证 1. 仅创建者可以修改 2.状态完成不可修改
|
|
|
+
|
|
|
+ var taskInfo = await _sqlSugar
|
|
|
+ .Queryable<Pm_TaskAllocation>()
|
|
|
+ .Where(it => it.Id == dto.Id && it.IsDel == 0)
|
|
|
+ .FirstAsync();
|
|
|
+ if (taskInfo != null)
|
|
|
+ {
|
|
|
+ (bool isEdit, string msg) = EditPerm(dto.Id, dto.UserId);
|
|
|
+
|
|
|
+ if (!isEdit)
|
|
|
+ {
|
|
|
+ _result.Msg = msg;
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
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();
|
|
|
+ .UpdateColumns(it => new
|
|
|
+ {
|
|
|
+ it.DepId,
|
|
|
+ it.DiId,
|
|
|
+ it.TaskType,
|
|
|
+ it.TaskPriority,
|
|
|
+ it.TaskName,
|
|
|
+ it.TaskContent,
|
|
|
+ it.PredictBeginTime,
|
|
|
+ it.PredictEndTime,
|
|
|
+ it.IsIntoPerformance,
|
|
|
+ })
|
|
|
+ .Where(it => it.Id == _TaskAllocation.Id)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
if (updateStatus1 < 1)
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
@@ -331,9 +457,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
|
|
|
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();
|
|
|
+ .Where(it => it.IsDel == 0 && it.TAId == _TaskAllocation.Id)
|
|
|
+ .Select(it => it.UserId)
|
|
|
+ .ToListAsync();
|
|
|
|
|
|
if (selectUserId.Count < 1)
|
|
|
{
|
|
|
@@ -354,10 +480,10 @@ 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 &&
|
|
|
- SelectUserIdDiff.Contains(it.UserId))
|
|
|
- .ToListAsync();
|
|
|
+ .Where(it => it.IsDel == 0 &&
|
|
|
+ it.TAId == _TaskAllocation.Id &&
|
|
|
+ SelectUserIdDiff.Contains(it.UserId))
|
|
|
+ .ToListAsync();
|
|
|
if (_TaskRelevanceUsers1.Count > 0)
|
|
|
{
|
|
|
foreach (var item in _TaskRelevanceUsers1)
|
|
|
@@ -366,9 +492,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
}
|
|
|
|
|
|
var updateIsDel = await _sqlSugar.Updateable(_TaskRelevanceUsers1)
|
|
|
- .UpdateColumns(it => it.IsDel)
|
|
|
- .WhereColumns(it => new { it.Id, it.TAId })
|
|
|
- .ExecuteCommandAsync();
|
|
|
+ .UpdateColumns(it => it.IsDel)
|
|
|
+ .WhereColumns(it => new { it.Id, it.TAId })
|
|
|
+ .ExecuteCommandAsync();
|
|
|
if (updateIsDel < 1)
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
@@ -405,19 +531,10 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
_result.Msg = "编辑成功!";
|
|
|
_sqlSugar.CommitTran();
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- _result.Msg = string.Format("请传入有效的Id参数!");
|
|
|
- return _result;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _result.Msg = string.Format("请传入有效的PortType参数!");
|
|
|
+ else _result.Msg = string.Format("请传入有效的Id参数!");
|
|
|
}
|
|
|
+ else _result.Msg = string.Format("请传入有效的PortType参数!");
|
|
|
+
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
@@ -426,7 +543,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskerDetails(int id)
|
|
|
+ public async Task<Result> TaskerDetails(int id)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -454,7 +571,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskerStatus(int id)
|
|
|
+ public async Task<Result> TaskerStatus(int id)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -493,7 +610,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskerSetStartStatus(int userId, int id)
|
|
|
+ public async Task<Result> TaskerSetStartStatus(int userId, int id)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -544,14 +661,13 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 任务归属人设置完成状态
|
|
|
/// 1.待审核
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskerSetOverStatus(int userId, int id)
|
|
|
+ public async Task<Result> TaskerSetOverStatus(int userId, int id)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -608,7 +724,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskSetHaveStatus(int id)
|
|
|
+ public async Task<Result> TaskSetHaveStatus(int id,int userId)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -616,17 +732,25 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- var data1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.Id == id).FirstAsync();
|
|
|
- if (data1 == null)
|
|
|
+ var taskUserInfo = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == id && it.UserId == userId).FirstAsync();
|
|
|
+ if (taskUserInfo == null)
|
|
|
{
|
|
|
_result.Msg = string.Format("该任务不存在!");
|
|
|
return _result;
|
|
|
}
|
|
|
- var data2 = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == data1.TAId).FirstAsync();
|
|
|
+ var taskerId = taskUserInfo.Id;
|
|
|
+
|
|
|
+ //状态确认
|
|
|
+ if (taskUserInfo.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
+ {
|
|
|
+ _result.Msg = string.Format("已设置“已知晓”状态,不可重复设置!");
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
|
|
|
var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
- .ExecuteCommandAsync();
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
+ .Where(it => it.Id == taskerId && it.UserId == userId)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
if (update1 < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("操作失败!");
|
|
|
@@ -636,70 +760,155 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
_result.Code = 0;
|
|
|
_sqlSugar.CommitTran();
|
|
|
|
|
|
-
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 设置任务审批状态
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskSetAuditStatus(int id)
|
|
|
+ public Result TaskSetAuditStatus(int id,int userId,string overTime)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
- _result.Msg = string.Format("请传入有效的Id参数!");
|
|
|
+ _result.Msg = string.Format("请传入有效的任务关联ID!");
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- var data1 = _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.Id == id).First();
|
|
|
- if (data1 == null)
|
|
|
+ // 实际完成时间验证
|
|
|
+ // 验证完成时间格式
|
|
|
+ if (!DateTime.TryParse(overTime,out DateTime overDt))
|
|
|
{
|
|
|
- _result.Msg = string.Format("该任务不存在或者该任务未分配给你!");
|
|
|
+ _result.Msg = string.Format("实际完成时间格式不正确,正确时间格式为: yyyy-MM-dd HH:mm:ss");
|
|
|
return _result;
|
|
|
}
|
|
|
- int _taId = data1.TAId;
|
|
|
|
|
|
- _sqlSugar.BeginTran();
|
|
|
- var update1 = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.Finished)
|
|
|
- .Where(it => it.Id == id)
|
|
|
- .ExecuteCommand();
|
|
|
- if (update1 < 1)
|
|
|
+ // 验证时间合理性(不能是未来时间)
|
|
|
+ if (overDt > DateTime.Now.AddMinutes(5)) // 允许5分钟内的未来时间(考虑时差)
|
|
|
{
|
|
|
- _result.Msg = string.Format("操作失败!");
|
|
|
- _sqlSugar.RollbackTran();
|
|
|
+ _result.Msg = string.Format("实际完成时间不能是未来时间!");
|
|
|
return _result;
|
|
|
}
|
|
|
- //设置任务状态
|
|
|
- TaskEnum taskStatus = TaskEnum.Finished;
|
|
|
- var data2 = _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == _taId).ToList();
|
|
|
- var data3 = data2.Where(it => it.TaskStatus == TaskerEnum.Finished && it.Id != id).ToList();
|
|
|
- var data4 = data2.Where(it => it.TaskStatus == TaskerEnum.UnFinished && it.Id != id).ToList();
|
|
|
|
|
|
- if (data4.Count > 0) taskStatus = TaskEnum.UnFinished;
|
|
|
+ _sqlSugar.BeginTran();
|
|
|
|
|
|
- if ((data2.Count - 1) == (data3.Count + data4.Count))
|
|
|
+ try
|
|
|
{
|
|
|
- var update2 = _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
- .SetColumns(it => it.Status == taskStatus)
|
|
|
- .Where(it => it.Id == _taId)
|
|
|
- .ExecuteCommand();
|
|
|
- if (update2 < 1)
|
|
|
+ //状态验证
|
|
|
+ var subTaskInfo = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
|
|
|
+ .Where(it => it.IsDel == 0 && it.TAId == id)
|
|
|
+ .First();
|
|
|
+ if (subTaskInfo == null)
|
|
|
+ {
|
|
|
+ _result.Msg = string.Format("该任务关联信息不存在!");
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+ int mainTaskId = subTaskInfo.TAId;
|
|
|
+ int taskerId = subTaskInfo.Id;
|
|
|
+
|
|
|
+ //只有创建人可以审批完成状态
|
|
|
+ if (subTaskInfo.CreateUserId != userId)
|
|
|
+ {
|
|
|
+ _result.Msg = string.Format("只有任务创建者可审批'已完成'状态!");
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //不可重复设置状态
|
|
|
+ if (subTaskInfo.TaskStatus == TaskerEnum.Finished)
|
|
|
+ {
|
|
|
+ _result.Msg = string.Format("“已完成”状态,已设置不可重复操作!");
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+
|
|
|
+ var subTaskUpd = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskerEnum.Finished)
|
|
|
+ .SetColumns(it => it.OverTime == overTime)
|
|
|
+ .Where(it => it.Id == taskerId)
|
|
|
+ .ExecuteCommand();
|
|
|
+ if (subTaskUpd < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("操作失败!");
|
|
|
_sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- _result.Msg = string.Format("操作成功!");
|
|
|
- _result.Code = 0;
|
|
|
- _sqlSugar.CommitTran();
|
|
|
+ #region 更新主任务状态
|
|
|
|
|
|
- return _result;
|
|
|
+ // 查询所有关联任务的状态
|
|
|
+ var allRelevanceTasks = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
|
|
|
+ .Where(x => x.TAId == mainTaskId && x.IsDel == 0)
|
|
|
+ .Select(x => new
|
|
|
+ {
|
|
|
+ x.Id,
|
|
|
+ x.TaskStatus
|
|
|
+ })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ // 计算任务状态统计
|
|
|
+ int totalCount = allRelevanceTasks.Count;
|
|
|
+
|
|
|
+ // 已完成状态数量
|
|
|
+ int finishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.Finished);
|
|
|
+ // 未完成状态数量
|
|
|
+ int unfinishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.UnFinished);
|
|
|
+
|
|
|
+ // 结束状态数量(已完成 + 未完成)
|
|
|
+ int endedCount = finishedCount + unfinishedCount;
|
|
|
+
|
|
|
+ // 判断是否所有子任务均处于结束状态 是 则更新主任务状态
|
|
|
+ bool allTasksInEndStatus = totalCount == endedCount;
|
|
|
+ if (allTasksInEndStatus)
|
|
|
+ {
|
|
|
+ TaskEnum newMainTaskStatus;
|
|
|
+
|
|
|
+ if (unfinishedCount > 0)
|
|
|
+ {
|
|
|
+ // 存在未完成的子任务
|
|
|
+ newMainTaskStatus = TaskEnum.UnFinished;
|
|
|
+ }
|
|
|
+ else if (finishedCount == totalCount)
|
|
|
+ {
|
|
|
+ // 所有子任务都已完成
|
|
|
+ newMainTaskStatus = TaskEnum.Finished;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 理论上不会走到这里,但为了安全
|
|
|
+ newMainTaskStatus = TaskEnum.UnFinished;
|
|
|
+ }
|
|
|
+
|
|
|
+ var rowsAffected = _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
+ .SetColumns(x => new Pm_TaskAllocation
|
|
|
+ {
|
|
|
+ Status = newMainTaskStatus,
|
|
|
+ OverTime = overTime
|
|
|
+ })
|
|
|
+ .Where(x => x.Id == mainTaskId && x.IsDel == 0)
|
|
|
+ .ExecuteCommand();
|
|
|
+
|
|
|
+ if (rowsAffected <= 0)
|
|
|
+ {
|
|
|
+ _result.Msg = string.Format("更新主任务状态失败!");
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ _result.Msg = string.Format("操作成功!");
|
|
|
+ _result.Code = 0;
|
|
|
+ _sqlSugar.CommitTran();
|
|
|
+
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
+ _result.Msg = string.Format("操作失败!");
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -707,7 +916,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskSetUnFinishedStatus(int id, string cause)
|
|
|
+ public async Task<Result> TaskSetUnFinishedStatus(int id, string cause)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -762,13 +971,12 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 任务确认完成
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskConfirmCompletion(int portType,int id)
|
|
|
+ public async Task<Result> TaskConfirmCompletion(int portType,int id)
|
|
|
{
|
|
|
if (portType == 1 || portType == 2 || portType == 3)
|
|
|
{
|
|
|
@@ -814,7 +1022,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskScore(TaskAllocationScoreDto dto)
|
|
|
+ public async Task<Result> TaskScore(TaskAllocationScoreDto dto)
|
|
|
{
|
|
|
int portType = dto.PortType;
|
|
|
if (portType == 1 || portType == 2 || portType == 3)
|
|
|
@@ -880,34 +1088,27 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskTermination(int taskId)
|
|
|
+ public async Task<Result> TaskTermination(int taskId,int userId)
|
|
|
{
|
|
|
-
|
|
|
if (taskId < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("请传入有效的taskId参数!");
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.IsDel == 0 && x.Id == taskId);
|
|
|
- if (taskInfo == null)
|
|
|
+ //权限验证
|
|
|
+ (bool taskStopPerm,string msg) = TaskStopPerm(taskId, userId);
|
|
|
+ if (!taskStopPerm)
|
|
|
{
|
|
|
- _result.Msg = "该任务不存在,不可执行终止!";
|
|
|
+ _result.Msg = msg;
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- if (taskInfo.Status == TaskEnum.Finished)
|
|
|
- {
|
|
|
- _result.Msg = "该任务已完成,不可执行终止!";
|
|
|
- return _result;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
_sqlSugar.BeginTran();
|
|
|
var taskUpdate = _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
- .SetColumns(it => it.Status == TaskEnum.TaskStop)
|
|
|
- .Where(it => it.Id == taskId)
|
|
|
- .ExecuteCommand();
|
|
|
+ .SetColumns(it => it.Status == TaskEnum.TaskStop)
|
|
|
+ .Where(it => it.Id == taskId)
|
|
|
+ .ExecuteCommand();
|
|
|
if (taskUpdate < 1)
|
|
|
{
|
|
|
_result.Msg = "任务终止失败!";
|
|
|
@@ -915,10 +1116,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
var subTaskUpdate = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
-
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.TaskStop)
|
|
|
- .Where(it => it.TAId == taskId)
|
|
|
- .ExecuteCommand();
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskerEnum.TaskStop)
|
|
|
+ .Where(it => it.TAId == taskId)
|
|
|
+ .ExecuteCommand();
|
|
|
|
|
|
if (taskUpdate < 1)
|
|
|
{
|
|
|
@@ -937,19 +1137,21 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<Result> _TaskDel(int taskId)
|
|
|
+ public async Task<Result> TaskDel(int taskId,int userId)
|
|
|
{
|
|
|
-
|
|
|
if (taskId < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("请传入有效的taskId参数!");
|
|
|
return _result;
|
|
|
}
|
|
|
_sqlSugar.BeginTran();
|
|
|
+ var nowStrig = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
var taskUpdate = _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
- .SetColumns(it => it.IsDel == 1)
|
|
|
- .Where(it => it.Id == taskId)
|
|
|
- .ExecuteCommand();
|
|
|
+ .SetColumns(it => it.IsDel == 1)
|
|
|
+ .SetColumns(it => it.DeleteUserId == userId)
|
|
|
+ .SetColumns(it => it.DeleteTime == nowStrig)
|
|
|
+ .Where(it => it.Id == taskId)
|
|
|
+ .ExecuteCommand();
|
|
|
if (taskUpdate < 1)
|
|
|
{
|
|
|
_result.Msg = "任务删除失败!";
|
|
|
@@ -957,9 +1159,11 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
var subTaskUpdate = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.IsDel == 1)
|
|
|
- .Where(it => it.TAId == taskId)
|
|
|
- .ExecuteCommand();
|
|
|
+ .SetColumns(it => it.IsDel == 1)
|
|
|
+ .SetColumns(it => it.DeleteUserId == userId)
|
|
|
+ .SetColumns(it => it.DeleteTime == nowStrig)
|
|
|
+ .Where(it => it.TAId == taskId)
|
|
|
+ .ExecuteCommand();
|
|
|
|
|
|
if (taskUpdate < 1)
|
|
|
{
|