|
|
@@ -8,6 +8,7 @@ using OASystem.Domain.Entities.Groups;
|
|
|
using OASystem.Domain.Entities.PersonnelModule;
|
|
|
using OASystem.Domain.Entities.System;
|
|
|
using OASystem.Domain.ViewModels.PersonnelModule;
|
|
|
+using OASystem.Infrastructure.Logging;
|
|
|
using Org.BouncyCastle.Asn1.Tsp;
|
|
|
using Org.BouncyCastle.Ocsp;
|
|
|
using SqlSugar;
|
|
|
@@ -15,7 +16,9 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Net.NetworkInformation;
|
|
|
+using System.Reflection;
|
|
|
using System.Text;
|
|
|
+using System.Text.Json.Serialization;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
@@ -28,12 +31,14 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
private readonly IMapper _mapper;
|
|
|
private Result _result;
|
|
|
+ private readonly ITaskTextFileLogger _taskTextFileLogger;
|
|
|
|
|
|
- public TaskAllocationRepository(SqlSugarClient sqlSugar, IMapper mapper)
|
|
|
+ public TaskAllocationRepository(SqlSugarClient sqlSugar, IMapper mapper, ITaskTextFileLogger taskTextFileLogger)
|
|
|
: base(sqlSugar)
|
|
|
{
|
|
|
_mapper = mapper;
|
|
|
_result = new Result() { Code = -1, Msg = "操作失败!" };
|
|
|
+ _taskTextFileLogger = taskTextFileLogger;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -196,6 +201,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
CreateTime = it.CreateTime,
|
|
|
TaskName = it.TaskName,
|
|
|
TaskContent = it.TaskContent,
|
|
|
+ TaskType = it.TaskType,
|
|
|
TaskPriority = it.TaskPriority,
|
|
|
PredictBeginTime = it.PredictBeginTime,
|
|
|
PredictEndTime = it.PredictEndTime,
|
|
|
@@ -325,6 +331,41 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return (true, string.Empty);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 任务知晓权限验证
|
|
|
+ /// </summary>
|
|
|
+ public (bool CanEdit, string Message) TaskHavePerm(int taskId, int currentUserId)
|
|
|
+ {
|
|
|
+ var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.Id == taskId && x.IsDel == 0);
|
|
|
+
|
|
|
+ if (taskInfo == null)
|
|
|
+ return (false, "任务不存在!");
|
|
|
+
|
|
|
+ var taskerInfo = _sqlSugar.Queryable<Pm_TaskRelevanceUser>().First(x => x.TAId == taskId && x.UserId == currentUserId && x.IsDel == 0);
|
|
|
+ if (taskerInfo == null)
|
|
|
+ return (false, "任务指派单不存在!");
|
|
|
+
|
|
|
+ if (taskerInfo.UserId != currentUserId)
|
|
|
+ return (false, "只有任务归属者可设置“已知晓”状态!");
|
|
|
+
|
|
|
+ // 检查当前状态是否设置已知晓
|
|
|
+ //if (taskerInfo.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
+ //{
|
|
|
+ // return (false, "当前状态已设置,无需重复操作!");
|
|
|
+ //}
|
|
|
+
|
|
|
+ //if (taskInfo.Status == TaskEnum.UnFinished)
|
|
|
+ //{
|
|
|
+ // return (false, "当前状态 “未完成”,不可设置该状态!");
|
|
|
+ //}
|
|
|
+ //if (taskInfo.Status == TaskEnum.Finished)
|
|
|
+ //{
|
|
|
+ // return (false, "当前状态 “已完成”,不可设置该状态!");
|
|
|
+ //}
|
|
|
+
|
|
|
+ return (true, string.Empty);
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 安全解析字符串为 DateTime?
|
|
|
/// </summary>
|
|
|
@@ -365,13 +406,15 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
_TaskRelevanceUsers.Add(new Pm_TaskRelevanceUser() {
|
|
|
TAId = dto.Id,
|
|
|
UserId = item,
|
|
|
- TaskStatus = TaskerEnum.NotStarted,
|
|
|
+ TaskStatus = TaskEnum.NotStarted,
|
|
|
CreateUserId = dto.UserId,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
+ var createUserName = _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == dto.UserId).First()?.CnName ?? "-";
|
|
|
+
|
|
|
if (dto.Id == 0) //添加
|
|
|
{
|
|
|
//// 1 按 任务名称 查询重
|
|
|
@@ -388,7 +431,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
if (addId < 1)
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
- _result.Msg = string.Format("任务发布失败!");
|
|
|
+ _result.Msg = string.Format("任务发布失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务新增[失败],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
@@ -403,18 +447,22 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
_result.Msg = string.Format("任务发布失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务新增[失败],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
_result.Code = 0;
|
|
|
_result.Msg = "添加成功!";
|
|
|
+ _taskTextFileLogger.LogInformation("任务新增[成功],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
+
|
|
|
_sqlSugar.CommitTran();
|
|
|
}
|
|
|
else if (dto.Id > 0) //修改
|
|
|
{
|
|
|
_sqlSugar.BeginTran();
|
|
|
|
|
|
- #region 编辑验证 1. 仅创建者可以修改 2.状态完成不可修改
|
|
|
+
|
|
|
+ #region 编辑验证 1. 仅创建者可以修改
|
|
|
|
|
|
var taskInfo = await _sqlSugar
|
|
|
.Queryable<Pm_TaskAllocation>()
|
|
|
@@ -427,13 +475,27 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
if (!isEdit)
|
|
|
{
|
|
|
_result.Msg = msg;
|
|
|
+ _taskTextFileLogger.LogInformation("任务编辑[无操作权限],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
+
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
-
|
|
|
- int updateStatus1 = await _sqlSugar.Updateable<Pm_TaskAllocation>(_TaskAllocation)
|
|
|
+ var mainTaskInfoOld = new Pm_TaskAllocation() {
|
|
|
+ DepId = taskInfo.DepId,
|
|
|
+ DiId = taskInfo.DiId,
|
|
|
+ TaskType = taskInfo.TaskType,
|
|
|
+ TaskPriority = taskInfo.TaskPriority,
|
|
|
+ TaskName = taskInfo.TaskName,
|
|
|
+ TaskContent = taskInfo.TaskContent,
|
|
|
+ PredictBeginTime = taskInfo.PredictBeginTime,
|
|
|
+ PredictEndTime = taskInfo.PredictEndTime,
|
|
|
+ IsIntoPerformance = taskInfo.IsIntoPerformance
|
|
|
+ };
|
|
|
+
|
|
|
+ int updateStatus1 = await _sqlSugar.Updateable<Pm_TaskAllocation>(_TaskAllocation)
|
|
|
.UpdateColumns(it => new
|
|
|
{
|
|
|
it.DepId,
|
|
|
@@ -452,6 +514,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
_result.Msg = string.Format("任务编辑失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务编辑[失败],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
+
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
@@ -468,6 +532,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
_result.Msg = string.Format("任务编辑失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务编辑[失败],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
+
|
|
|
return _result;
|
|
|
}
|
|
|
}
|
|
|
@@ -518,17 +584,36 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
{
|
|
|
_sqlSugar.RollbackTran();
|
|
|
_result.Msg = string.Format("任务编辑失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务编辑[失败],任务名称:{TaskName},创建人:{CreateUserName}", _TaskAllocation.TaskName, createUserName);
|
|
|
+
|
|
|
return _result;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ var mainTaskInfoNew = new Pm_TaskAllocation()
|
|
|
+ {
|
|
|
+ DepId = _TaskAllocation.DepId,
|
|
|
+ DiId = _TaskAllocation.DiId,
|
|
|
+ TaskType = _TaskAllocation.TaskType,
|
|
|
+ TaskPriority = _TaskAllocation.TaskPriority,
|
|
|
+ TaskName = _TaskAllocation.TaskName,
|
|
|
+ TaskContent = _TaskAllocation.TaskContent,
|
|
|
+ PredictBeginTime = _TaskAllocation.PredictBeginTime,
|
|
|
+ PredictEndTime = _TaskAllocation.PredictEndTime,
|
|
|
+ IsIntoPerformance = _TaskAllocation.IsIntoPerformance
|
|
|
+ }; ;
|
|
|
+
|
|
|
/*
|
|
|
* 发送消息
|
|
|
*/
|
|
|
_result.Code = 0;
|
|
|
_result.Msg = "编辑成功!";
|
|
|
+ var changeMsg = ChangeMsg(mainTaskInfoOld, mainTaskInfoNew);
|
|
|
+
|
|
|
+ _taskTextFileLogger.LogInformation("任务完成设置[成功],任务名称:{TaskName},操作者:{OperatorName}{ChangeMsg}", _TaskAllocation.TaskName, createUserName, changeMsg);
|
|
|
+
|
|
|
_sqlSugar.CommitTran();
|
|
|
}
|
|
|
else _result.Msg = string.Format("请传入有效的Id参数!");
|
|
|
@@ -590,7 +675,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
_sqlSugar.BeginTran();
|
|
|
|
|
|
var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.UnderWay)
|
|
|
.ExecuteCommandAsync();
|
|
|
if (update1 < 1)
|
|
|
{
|
|
|
@@ -624,7 +709,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
_result.Msg = string.Format("该任务不在!");
|
|
|
return _result;
|
|
|
}
|
|
|
- if (selectData.TaskStatus >= TaskerEnum.UnderWay)
|
|
|
+ if (selectData.TaskStatus >= TaskEnum.UnderWay)
|
|
|
{
|
|
|
_result.Msg = string.Format("该任务已知晓,不可重复设置!");
|
|
|
return _result;
|
|
|
@@ -632,7 +717,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
|
|
|
_sqlSugar.BeginTran();
|
|
|
var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.UnderWay)
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.UnderWay)
|
|
|
.SetColumns(it => it.BeginTime == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
|
|
|
.Where(it => it.TAId == id)
|
|
|
.Where(it => it.UserId == userId )
|
|
|
@@ -683,14 +768,14 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- if (selectData.TaskStatus >= TaskerEnum.WaitConfirm)
|
|
|
+ if (selectData.TaskStatus >= TaskEnum.WaitConfirm)
|
|
|
{
|
|
|
_result.Msg = string.Format("该任务已提交待审核状态,不可重复提交!");
|
|
|
return _result;
|
|
|
}
|
|
|
_sqlSugar.BeginTran();
|
|
|
var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.WaitConfirm)
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.WaitConfirm)
|
|
|
.SetColumns(it => it.OverTime == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
|
|
|
.Where(it => it.TAId == id)
|
|
|
.Where(it => it.UserId == userId)
|
|
|
@@ -732,31 +817,45 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- var taskUserInfo = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == id && it.UserId == userId).FirstAsync();
|
|
|
- if (taskUserInfo == null)
|
|
|
+ //状态校验
|
|
|
+ (bool havePerm, string msg3) = TaskHavePerm(id, userId);
|
|
|
+ if (!havePerm)
|
|
|
{
|
|
|
- _result.Msg = string.Format("该任务不存在!");
|
|
|
+ _result.Msg = msg3;
|
|
|
return _result;
|
|
|
}
|
|
|
- var taskerId = taskUserInfo.Id;
|
|
|
|
|
|
- //状态确认
|
|
|
- if (taskUserInfo.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
+ _sqlSugar.BeginTran();
|
|
|
+ var taskName = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == id).Select(it => it.TaskName).FirstAsync();
|
|
|
+ var operatorName = await _sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0 && it.Id == userId).Select(it => it.CnName).FirstAsync();
|
|
|
+ var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.UnderWay)
|
|
|
+ .Where(it => it.TAId == id && it.UserId == userId)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
+ if (update1 < 1)
|
|
|
{
|
|
|
- _result.Msg = string.Format("已设置“已知晓”状态,不可重复设置!");
|
|
|
+ _result.Msg = string.Format("操作失败!");
|
|
|
+
|
|
|
+ _taskTextFileLogger.LogInformation("任务知晓设置[失败],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
+
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
|
|
|
- .Where(it => it.Id == taskerId && it.UserId == userId)
|
|
|
+ var update2 = await _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
+ .SetColumns(it => it.Status == TaskEnum.UnderWay)
|
|
|
+ .Where(it => it.Id == id)
|
|
|
.ExecuteCommandAsync();
|
|
|
- if (update1 < 1)
|
|
|
+ if (update2 < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("操作失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务知晓设置[失败],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
+
|
|
|
_result.Msg = string.Format("操作成功!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务知晓设置[成功],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
_result.Code = 0;
|
|
|
_sqlSugar.CommitTran();
|
|
|
|
|
|
@@ -768,7 +867,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public Result TaskSetAuditStatus(int id,int userId,string overTime)
|
|
|
+ public Result TaskSetAuditStatus(int id,int userId,string overTime,string remark)
|
|
|
{
|
|
|
if (id < 1)
|
|
|
{
|
|
|
@@ -793,6 +892,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
|
|
|
_sqlSugar.BeginTran();
|
|
|
|
|
|
+ var taskName = _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == id).Select(it => it.TaskName).First();
|
|
|
+ var operatorName = _sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0 && it.Id == userId).Select(it => it.CnName).First();
|
|
|
+
|
|
|
try
|
|
|
{
|
|
|
//状态验证
|
|
|
@@ -811,24 +913,27 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
if (subTaskInfo.CreateUserId != userId)
|
|
|
{
|
|
|
_result.Msg = string.Format("只有任务创建者可审批'已完成'状态!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务完成设置[尝试审批],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
//不可重复设置状态
|
|
|
- if (subTaskInfo.TaskStatus == TaskerEnum.Finished)
|
|
|
- {
|
|
|
- _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.TaskStatus == TaskEnum.Finished)
|
|
|
.SetColumns(it => it.OverTime == overTime)
|
|
|
+ .SetColumns(it => it.Remark == remark)
|
|
|
.Where(it => it.Id == taskerId)
|
|
|
.ExecuteCommand();
|
|
|
if (subTaskUpd < 1)
|
|
|
{
|
|
|
_result.Msg = string.Format("操作失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务完成设置[失败],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
_sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
@@ -841,35 +946,59 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
.Select(x => new
|
|
|
{
|
|
|
x.Id,
|
|
|
+ x.UserId,
|
|
|
x.TaskStatus
|
|
|
})
|
|
|
.ToList();
|
|
|
|
|
|
+ var mainTaskInfoOld = _sqlSugar.Queryable<Pm_TaskAllocation>()
|
|
|
+ .Where(x => x.Id == mainTaskId && x.IsDel == 0)
|
|
|
+ .Select(x => new Pm_TaskAllocation
|
|
|
+ {
|
|
|
+ OverTime = x.OverTime,
|
|
|
+ Status = x.Status,
|
|
|
+ Remark = x.Remark
|
|
|
+ })
|
|
|
+ .First();
|
|
|
+ var mainTaskInfoNew = new Pm_TaskAllocation();
|
|
|
+
|
|
|
// 计算任务状态统计
|
|
|
int totalCount = allRelevanceTasks.Count;
|
|
|
|
|
|
- // 已完成状态数量
|
|
|
- int finishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.Finished);
|
|
|
- // 未完成状态数量
|
|
|
- int unfinishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.UnFinished);
|
|
|
+ // 未开始 数量
|
|
|
+ int notStartedCount = allRelevanceTasks.Count(x => x.TaskStatus <= TaskEnum.NotStarted);
|
|
|
+ int underWayCount = allRelevanceTasks.Count(x => x.TaskStatus > TaskEnum.NotStarted);
|
|
|
+
|
|
|
+ if (notStartedCount > 0)
|
|
|
+ {
|
|
|
+ //其他人未设置已知晓 不可设置 完成状态
|
|
|
+ var userIds = allRelevanceTasks.Where(x => x.TaskStatus < TaskEnum.UnderWay).Select(x => x.UserId).ToList();
|
|
|
+ var names = _sqlSugar.Queryable<Sys_Users>()
|
|
|
+ .Where(x => userIds.Contains(x.Id))
|
|
|
+ .Select(x => x.CnName)
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ string userLabel = string.Join("、",names);
|
|
|
|
|
|
- // 结束状态数量(已完成 + 未完成)
|
|
|
- int endedCount = finishedCount + unfinishedCount;
|
|
|
+ _result.Msg = string.Format($"{userLabel} 未点击已知晓,不可设置任务完成。");
|
|
|
+ _sqlSugar.RollbackTran();
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
|
|
|
// 判断是否所有子任务均处于结束状态 是 则更新主任务状态
|
|
|
- bool allTasksInEndStatus = totalCount == endedCount;
|
|
|
+ bool allTasksInEndStatus = totalCount == underWayCount;
|
|
|
if (allTasksInEndStatus)
|
|
|
{
|
|
|
TaskEnum newMainTaskStatus;
|
|
|
|
|
|
- if (unfinishedCount > 0)
|
|
|
+ if (notStartedCount > 0)
|
|
|
{
|
|
|
// 存在未完成的子任务
|
|
|
newMainTaskStatus = TaskEnum.UnFinished;
|
|
|
}
|
|
|
- else if (finishedCount == totalCount)
|
|
|
+ else if (underWayCount == totalCount)
|
|
|
{
|
|
|
- // 所有子任务都已完成
|
|
|
+ // 所有子任务都在进行中
|
|
|
newMainTaskStatus = TaskEnum.Finished;
|
|
|
}
|
|
|
else
|
|
|
@@ -882,7 +1011,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
.SetColumns(x => new Pm_TaskAllocation
|
|
|
{
|
|
|
Status = newMainTaskStatus,
|
|
|
- OverTime = overTime
|
|
|
+ OverTime = overTime,
|
|
|
+ Remark = remark
|
|
|
})
|
|
|
.Where(x => x.Id == mainTaskId && x.IsDel == 0)
|
|
|
.ExecuteCommand();
|
|
|
@@ -890,14 +1020,26 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
if (rowsAffected <= 0)
|
|
|
{
|
|
|
_result.Msg = string.Format("更新主任务状态失败!");
|
|
|
+ _taskTextFileLogger.LogInformation("任务完成设置[失败],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
_sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
- }
|
|
|
+ mainTaskInfoNew = new Pm_TaskAllocation
|
|
|
+ {
|
|
|
+ OverTime = overTime,
|
|
|
+ Status = newMainTaskStatus,
|
|
|
+ Remark = remark
|
|
|
+ };
|
|
|
+ }else
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
_result.Msg = string.Format("操作成功!");
|
|
|
+ var logMsgChange = new StringBuilder();
|
|
|
+
|
|
|
+ var changeMsg = ChangeMsg(mainTaskInfoOld, mainTaskInfoNew);
|
|
|
+
|
|
|
+ _taskTextFileLogger.LogInformation("任务完成设置[成功],任务名称:{TaskName},操作者:{OperatorName}{ChangeMsg}", taskName, operatorName, changeMsg);
|
|
|
_result.Code = 0;
|
|
|
_sqlSugar.CommitTran();
|
|
|
|
|
|
@@ -934,7 +1076,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
|
|
|
_sqlSugar.BeginTran();
|
|
|
var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.UnFinished)
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.UnFinished)
|
|
|
.SetColumns(it => it.Cause == cause)
|
|
|
.Where(it => it.Id == id)
|
|
|
.ExecuteCommandAsync();
|
|
|
@@ -947,8 +1089,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
|
|
|
//设置任务状态
|
|
|
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();
|
|
|
+ var data3 = data2.Where(it => it.TaskStatus == TaskEnum.Finished && it.Id != id).ToList();
|
|
|
+ var data4 = data2.Where(it => it.TaskStatus == TaskEnum.UnFinished && it.Id != id).ToList();
|
|
|
|
|
|
if ((data2.Count - 1) == (data3.Count + data4.Count))
|
|
|
{
|
|
|
@@ -987,7 +1129,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
}
|
|
|
|
|
|
var data = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
|
|
|
- .Where(it => it.IsDel == 0 && it.Id == id && it.TaskStatus <= TaskerEnum.UnFinished)
|
|
|
+ .Where(it => it.IsDel == 0 && it.Id == id && it.TaskStatus <= TaskEnum.UnFinished)
|
|
|
.ToListAsync();
|
|
|
if (data.Count > 0)
|
|
|
{
|
|
|
@@ -1051,7 +1193,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
|
|
|
- if (data.TaskStatus != TaskerEnum.Finished)
|
|
|
+ if (data.TaskStatus != TaskEnum.Finished)
|
|
|
{
|
|
|
_result.Msg = string.Format("本任务尚未由发布人确认任务完成,不可评分!");
|
|
|
return _result;
|
|
|
@@ -1116,7 +1258,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
var subTaskUpdate = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
|
|
|
- .SetColumns(it => it.TaskStatus == TaskerEnum.TaskStop)
|
|
|
+ .SetColumns(it => it.TaskStatus == TaskEnum.TaskStop)
|
|
|
.Where(it => it.TAId == taskId)
|
|
|
.ExecuteCommand();
|
|
|
|
|
|
@@ -1145,6 +1287,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
return _result;
|
|
|
}
|
|
|
_sqlSugar.BeginTran();
|
|
|
+
|
|
|
+ var taskName = _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == taskId).Select(it => it.TaskName).First();
|
|
|
+ var operatorName = _sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0 && it.Id == userId).Select(it => it.CnName).First();
|
|
|
var nowStrig = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
var taskUpdate = _sqlSugar.Updateable<Pm_TaskAllocation>()
|
|
|
.SetColumns(it => it.IsDel == 1)
|
|
|
@@ -1168,13 +1313,161 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
|
|
|
if (taskUpdate < 1)
|
|
|
{
|
|
|
_result.Msg = "任务删除失败!";
|
|
|
+ _taskTextFileLogger.LogInformation("任务删除[失败],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
_sqlSugar.RollbackTran();
|
|
|
return _result;
|
|
|
}
|
|
|
_result.Msg = "操作成功!";
|
|
|
+ _taskTextFileLogger.LogInformation("任务删除[成功],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
|
|
|
_result.Code = 0;
|
|
|
_sqlSugar.CommitTran();
|
|
|
return _result;
|
|
|
}
|
|
|
+
|
|
|
+ #region 操作日志
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 记录任务分配步骤值改变
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="before">操作前的步骤数据实体</param>
|
|
|
+ /// <param name="after">操作后的步骤数据实体</param>
|
|
|
+ /// <returns>表示同步操作的任务</returns>
|
|
|
+ /// <remarks>此方法会自动比较前后数据的差异,生成变更字段列表和操作描述</remarks>
|
|
|
+ public string ChangeMsg(Pm_TaskAllocation before, Pm_TaskAllocation after)
|
|
|
+ {
|
|
|
+ // 合并基础排除字段和额外排除字段
|
|
|
+ var allExcludedFields = GetDefaultExcludedFields();
|
|
|
+ var changedFields = GetChangeDetails(before, after, allExcludedFields);
|
|
|
+
|
|
|
+ if (!changedFields.Any()) return "\r\n无内容变更\r\n\r\n";
|
|
|
+
|
|
|
+ return "\r\n值改变内容(只记录有变化的信息):\r\n" + string.Join("\r\n", changedFields.Select(x =>
|
|
|
+ $"{x.FieldName} ({x.BeforeValue} -> {x.AfterValue});")) + "\r\n";
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取字段变更详情
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="before">变更前</param>
|
|
|
+ /// <param name="after">变更后</param>
|
|
|
+ /// <param name="exclFields">排除字段</param>
|
|
|
+ /// <returns>变更详情列表</returns>
|
|
|
+ private List<FieldChangeDetail> GetChangeDetails(Pm_TaskAllocation before, Pm_TaskAllocation after, List<string> exclFields = null)
|
|
|
+ {
|
|
|
+ var changeDetails = new List<FieldChangeDetail>();
|
|
|
+ var defaultExclFields = GetDefaultExcludedFields();
|
|
|
+
|
|
|
+ // 合并排除字段
|
|
|
+ var allExclFields = defaultExclFields;
|
|
|
+ if (exclFields != null && exclFields.Any())
|
|
|
+ {
|
|
|
+ allExclFields = defaultExclFields.Union(exclFields).ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (before == null || after == null) return changeDetails;
|
|
|
+
|
|
|
+ var properties = typeof(Pm_TaskAllocation).GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
|
|
+
|
|
|
+ foreach (var prop in properties)
|
|
|
+ {
|
|
|
+ // 跳过排除的字段
|
|
|
+ if (allExclFields.Contains(prop.Name))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ var beforeValue = prop.GetValue(before);
|
|
|
+ var afterValue = prop.GetValue(after);
|
|
|
+
|
|
|
+ // 处理字符串类型的特殊比较(忽略前后空格)
|
|
|
+ if (prop.PropertyType == typeof(string))
|
|
|
+ {
|
|
|
+ var beforeString = beforeValue?.ToString()?.Trim();
|
|
|
+ var afterString = afterValue?.ToString()?.Trim();
|
|
|
+
|
|
|
+ if (beforeString != afterString)
|
|
|
+ {
|
|
|
+ changeDetails.Add(new FieldChangeDetail
|
|
|
+ {
|
|
|
+ FieldName = prop.Name,
|
|
|
+ BeforeValue = FormatValue(beforeString),
|
|
|
+ AfterValue = FormatValue(afterString)
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 其他类型使用默认比较
|
|
|
+ if (!Equals(beforeValue, afterValue))
|
|
|
+ {
|
|
|
+ changeDetails.Add(new FieldChangeDetail
|
|
|
+ {
|
|
|
+ FieldName = prop.Name,
|
|
|
+ BeforeValue = FormatValue(beforeValue),
|
|
|
+ AfterValue = FormatValue(afterValue)
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return changeDetails;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 格式化值显示
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="value">原始值</param>
|
|
|
+ /// <returns>格式化后的值</returns>
|
|
|
+ private static string FormatValue(object value)
|
|
|
+ {
|
|
|
+ if (value == null) return "null";
|
|
|
+
|
|
|
+ var strValue = value.ToString();
|
|
|
+
|
|
|
+ // 处理空字符串
|
|
|
+ if (string.IsNullOrEmpty(strValue)) return "空";
|
|
|
+
|
|
|
+ // 处理布尔值
|
|
|
+ if (value is bool boolValue) return boolValue ? "是" : "否";
|
|
|
+
|
|
|
+ // 处理日期时间
|
|
|
+ if (value is DateTime dateTimeValue) return dateTimeValue.ToString("yyyy-MM-dd HH:mm");
|
|
|
+
|
|
|
+ // 处理枚举类型
|
|
|
+ if (value is Enum enumBool) return enumBool.GetDescription();
|
|
|
+
|
|
|
+ return strValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 字段变更详情类
|
|
|
+ /// </summary>
|
|
|
+ private class FieldChangeDetail
|
|
|
+ {
|
|
|
+ public string FieldName { get; set; }
|
|
|
+ public string BeforeValue { get; set; }
|
|
|
+ public string AfterValue { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取默认排除的字段列表(包含系统字段和忽略字段)
|
|
|
+ /// </summary>
|
|
|
+ /// <returns>默认排除的字段列表</returns>
|
|
|
+ private static List<string> GetDefaultExcludedFields()
|
|
|
+ {
|
|
|
+ var defaultExcludedFields = new List<string>
|
|
|
+ {
|
|
|
+ nameof(Pm_TaskAllocation.Id),
|
|
|
+ nameof(Pm_TaskAllocation.CreateTime),
|
|
|
+ nameof(Pm_TaskAllocation.CreateUserId),
|
|
|
+ nameof(Pm_TaskAllocation.DeleteTime),
|
|
|
+ nameof(Pm_TaskAllocation.DeleteUserId)
|
|
|
+ };
|
|
|
+
|
|
|
+ return defaultExcludedFields.Distinct().ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|