TaskAllocationRepository.cs 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181
  1. using AutoMapper;
  2. using EnumsNET;
  3. using Microsoft.VisualBasic;
  4. using NPOI.SS.Formula.Functions;
  5. using OASystem.Domain;
  6. using OASystem.Domain.Dtos.PersonnelModule;
  7. using OASystem.Domain.Entities.Groups;
  8. using OASystem.Domain.Entities.PersonnelModule;
  9. using OASystem.Domain.Entities.System;
  10. using OASystem.Domain.ViewModels.PersonnelModule;
  11. using Org.BouncyCastle.Asn1.Tsp;
  12. using Org.BouncyCastle.Ocsp;
  13. using SqlSugar;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Net.NetworkInformation;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. namespace OASystem.Infrastructure.Repositories.PersonnelModule
  21. {
  22. /// <summary>
  23. /// 任务分配
  24. /// 仓库
  25. /// </summary>
  26. public class TaskAllocationRepository : BaseRepository<Pm_TaskAllocation, TaskAllocationView>
  27. {
  28. private readonly IMapper _mapper;
  29. private Result _result;
  30. public TaskAllocationRepository(SqlSugarClient sqlSugar, IMapper mapper)
  31. : base(sqlSugar)
  32. {
  33. _mapper = mapper;
  34. _result = new Result() { Code = -1, Msg = "操作失败!" };
  35. }
  36. /// <summary>
  37. /// 任务操作权限(任务创建人才可以进行操作)
  38. /// </summary>
  39. /// <param name="taskAllocation"></param>
  40. /// <param name="userId"></param>
  41. /// <returns></returns>
  42. public TaskOperationAudit TaskOperationAudit(Pm_TaskAllocation taskAllocation, int userId)
  43. {
  44. TaskOperationAudit taskOperationAudit = new TaskOperationAudit();
  45. if (taskAllocation.CreateUserId == userId)
  46. {
  47. taskOperationAudit.TaskAddAudit = 1;
  48. taskOperationAudit.TaskDelAudit = 1;
  49. taskOperationAudit.TasStopAudit = 1;
  50. taskOperationAudit.TaskComfirmAudit = 1;
  51. taskOperationAudit.TaskScoreAudit = 1;
  52. }
  53. return taskOperationAudit;
  54. }
  55. /// <summary>
  56. /// 基础数据源
  57. /// </summary>
  58. /// <returns></returns>
  59. public async Task<Result> Init(int portType, int userId)
  60. {
  61. if (portType == 1 || portType == 2 || portType == 3)
  62. {
  63. if (userId < 1)
  64. {
  65. _result.Msg = string.Format("请传入有效的UserId参数!");
  66. return _result;
  67. }
  68. //任务类型
  69. var taskTypeInfos = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.STid == 127 && x.IsDel == 0)
  70. .Select(x => new ValueInfo { Id = x.Id, Name = x.Name })
  71. .ToList();
  72. //任务名称
  73. var taskNameInfos = _sqlSugar.Queryable<Pm_TaskAllocation, Pm_TaskRelevanceUser>((ta, tau) => new JoinQueryInfos(JoinType.Left, ta.Id == tau.TAId))
  74. .Where((ta, tau) => ta.IsDel == 0 && tau.IsDel == 0)
  75. .Where((ta, tau) => ta.CreateUserId == userId || tau.UserId == userId)
  76. .Select(ta => ta.TaskName).ToList()
  77. .Distinct().ToList();
  78. //团组名称
  79. var groupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>()
  80. .Where(it => it.IsDel == 0)
  81. .OrderByDescending(it => it.VisitStartDate)
  82. .Select(it => new ValueInfo { Id = it.Id, Name = it.TeamName })
  83. .ToList();
  84. groupNameInfos.Insert(0, new ValueInfo() { Id = -1, Name = "未选择" });
  85. //部门名称
  86. var departmentNameInfos = _sqlSugar.Queryable<Sys_Users, Sys_Department>((u, d) => new JoinQueryInfos(JoinType.Left, u.DepId == d.Id))
  87. .Where((u, d) => u.Id == userId)
  88. .Select((u, d) => new ValueInfo() { Id = d.Id, Name = d.DepName })
  89. .First();
  90. //执行任务人员信息 1 公司总经理/副总 可分配 所有人的任务 2 公司 部门经理/主管 可分配 部门下的人员的任务
  91. var executeTaskUserInfos = new List<ExecuteTaskUserInfo>();
  92. var taskOpertionAudit = new TaskOperationAudit();
  93. var taskAudits = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.PrimaryUserId == userId).ToList();
  94. var taslPerm = taskAudits.Any();
  95. if (!taskAudits.Any())
  96. {
  97. var taskUserIds = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.SubUserId == userId).Select(x => x.PrimaryUserId).ToList();
  98. if (taskUserIds.Any())
  99. {
  100. taskAudits = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && taskUserIds.Contains(it.PrimaryUserId)).ToList();
  101. }
  102. }
  103. if (taskAudits.Any())
  104. {
  105. //任务权限
  106. if (taslPerm)
  107. {
  108. taskOpertionAudit.TaskAddAudit = 1;
  109. taskOpertionAudit.TaskDelAudit = 1;
  110. taskOpertionAudit.TasStopAudit = 1;
  111. }
  112. var userIds = taskAudits.Select(it => it.SubUserId).ToList();
  113. string userSql = string.Format(@"Select u.Id,u.CnName As Name,c.CompanyName,
  114. d.DepName As DepartmentName,jp.JobName
  115. From Sys_Users u
  116. Left Join Sys_Company c On u.CompanyId = c.Id
  117. Left Join Sys_Department d On u.DepId = d.Id
  118. Left Join Sys_JobPost jp On u.JobPostId = jp.Id
  119. Where u.IsDel = 0 ");
  120. executeTaskUserInfos = _sqlSugar.SqlQueryable<ExecuteTaskUserInfo>(userSql).Where(it => userIds.Contains(it.Id)).ToList();
  121. }
  122. var view = new InitView()
  123. {
  124. TaskOperationAudit = taskOpertionAudit,
  125. TaskNameInfos = taskNameInfos,
  126. ExecuteTaskUserInfos = executeTaskUserInfos,
  127. GroupNameInfos = groupNameInfos,
  128. DepartmentNameInfo = departmentNameInfos,
  129. TaskTypeInfos = taskTypeInfos
  130. };
  131. _result.Code = 0;
  132. _result.Data = view;
  133. }
  134. else _result.Msg = string.Format("请传入有效的PortType参数!");
  135. return _result;
  136. }
  137. /// <summary>
  138. /// 任务指派
  139. /// 详情
  140. /// </summary>
  141. /// <param name="portType"></param>
  142. /// <param name="Id"></param>
  143. /// <returns></returns>
  144. public async Task<Result> Details(int portType, int Id)
  145. {
  146. if (Id < 1)
  147. {
  148. _result.Msg = string.Format("请传入有效的Id参数!");
  149. return _result;
  150. }
  151. if (portType == 1 || portType == 2 || portType == 3)
  152. {
  153. //团组名称
  154. var _groupNameInfos = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0)
  155. .OrderByDescending(it => it.VisitDate)
  156. .Select(it => new ValueInfo { Id = it.Id, Name = it.TeamName })
  157. .ToList();
  158. _groupNameInfos.Insert(0, new ValueInfo() { Id = -1, Name = "未选择" });
  159. //部门名称
  160. var _departmentNameInfos = _sqlSugar.Queryable<Sys_Department>()
  161. .Select(d => new ValueInfo() { Id = d.Id, Name = d.DepName })
  162. .ToList();
  163. //用户名称
  164. var _userNameInfos = _sqlSugar.Queryable<Sys_Users>()
  165. .Select(d => new ValueInfo() { Id = d.Id, Name = d.CnName })
  166. .ToList();
  167. var _view = _sqlSugar.Queryable<Pm_TaskAllocation>()
  168. .Where(it => it.IsDel == 0 && it.Id == Id)
  169. .Select(it => new TaskDetailsView
  170. {
  171. Id = it.Id,
  172. DiId = it.DiId,
  173. DepId = it.DepId,
  174. CreateUserId = it.CreateUserId,
  175. CreateTime = it.CreateTime,
  176. TaskName = it.TaskName,
  177. TaskContent = it.TaskContent,
  178. TaskPriority = it.TaskPriority,
  179. PredictBeginTime = it.PredictBeginTime,
  180. PredictEndTime = it.PredictEndTime,
  181. IsIntoPerformance = it.IsIntoPerformance,
  182. Remark = it.Remark,
  183. })
  184. .First();
  185. if (_view != null)
  186. {
  187. var taskUserDetailsViews = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  188. .Where(it => it.IsDel == 0 && it.TAId == _view.Id)
  189. .Select(it => new TaskUserDetailsView
  190. {
  191. Id = it.Id,
  192. TAId = it.TAId,
  193. UserId = it.UserId,
  194. BeginTime = it.BeginTime,
  195. OverTime = it.OverTime,
  196. TaskStatus = it.TaskStatus,
  197. Cause = it.Cause,
  198. Remark = it.Remark
  199. })
  200. .ToList();
  201. _view.UserTaskInfos = taskUserDetailsViews;
  202. _result.Data = _view;
  203. _result.Code = 0;
  204. _result.Msg = "查询成功!";
  205. }
  206. }
  207. else
  208. {
  209. _result.Msg = string.Format("请传入有效的PortType参数!");
  210. }
  211. return _result;
  212. }
  213. /// <summary>
  214. /// 编辑权限验证
  215. /// </summary>
  216. public (bool CanEdit, string Message) EditPerm(int taskId, int currentUserId)
  217. {
  218. var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.Id == taskId && x.IsDel == 0);
  219. if (taskInfo == null)
  220. return (false, "任务不存在!");
  221. if (taskInfo.CreateUserId != currentUserId)
  222. return (false, "当前任务仅创建人可编辑!");
  223. // 定义结束状态集合
  224. var UneditableStatuses = new List<TaskEnum>
  225. {
  226. TaskEnum.UnFinished,
  227. TaskEnum.Finished,
  228. TaskEnum.TaskStop
  229. };
  230. if (UneditableStatuses.Contains(taskInfo.Status))
  231. return (false,
  232. taskInfo.Status switch
  233. {
  234. TaskEnum.UnFinished => "当前任务状态为“未完成”结束状态,不可编辑!",
  235. TaskEnum.Finished => "当前任务状态为“已完成”结束状态,不可编辑!",
  236. TaskEnum.TaskStop => "当前任务状态为“任务终止”结束状态,不可编辑!",
  237. _ => "当前任务状态不可编辑!"
  238. });
  239. return (true, string.Empty);
  240. }
  241. /// <summary>
  242. /// 任务终止权限验证
  243. /// </summary>
  244. public (bool CanEdit, string Message) TaskStopPerm(int taskId, int currentUserId)
  245. {
  246. var taskInfo = _sqlSugar.Queryable<Pm_TaskAllocation>().First(x => x.Id == taskId && x.IsDel == 0);
  247. if (taskInfo == null)
  248. return (false, "任务不存在!");
  249. if (taskInfo.CreateUserId != currentUserId)
  250. return (false, "只有创建人可以终止任务!");
  251. // 2. 检查当前状态是否允许终止
  252. if (taskInfo.Status == TaskEnum.TaskStop)
  253. {
  254. return (false, "任务已终止,无需重复操作!");
  255. }
  256. // 3. 定义不允许终止的状态
  257. var cannotStopStatuses = new List<TaskEnum>
  258. {
  259. TaskEnum.Finished,
  260. TaskEnum.UnFinished
  261. };
  262. if (cannotStopStatuses.Contains(taskInfo.Status))
  263. {
  264. var statusDesc = taskInfo.Status switch
  265. {
  266. TaskEnum.Finished => "已完成",
  267. TaskEnum.UnFinished => "未完成",
  268. _ => "未知状态"
  269. };
  270. return (false, $"任务已{statusDesc},不能终止!");
  271. }
  272. // 安全解析时间
  273. var predictBeginTime = SafeParse(taskInfo.PredictBeginTime);
  274. var predictEndTime = SafeParse(taskInfo.PredictEndTime);
  275. var currTime = DateTime.Now;
  276. // 时间范围检查
  277. if (predictBeginTime.HasValue && currTime < predictBeginTime.Value)
  278. return (false, "任务尚未开始,不能终止!");
  279. if (predictEndTime.HasValue && currTime > predictEndTime.Value.AddHours(24))
  280. return (false, "任务已超过预计结束时间24小时,不能终止!");
  281. // 检查创建时间(防止恶意创建后立即终止)
  282. if ((currTime - taskInfo.CreateTime).TotalMinutes < 5)
  283. {
  284. return (false, "任务创建时间不足5分钟,请先执行一段时间才可执行任务终止!");
  285. }
  286. return (true, string.Empty);
  287. }
  288. /// <summary>
  289. /// 安全解析字符串为 DateTime?
  290. /// </summary>
  291. public static DateTime? SafeParse(string dateTimeString)
  292. {
  293. if (string.IsNullOrWhiteSpace(dateTimeString))
  294. return null;
  295. if (DateTime.TryParse(dateTimeString, out DateTime result))
  296. return result;
  297. return null;
  298. }
  299. /// <summary>
  300. /// Add Or Edit
  301. /// </summary>
  302. /// <param name="dto"></param>
  303. /// <returns></returns>
  304. public async Task<Result> AddOrEdit(TaskAllocationAddOrEditDto dto)
  305. {
  306. if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3)
  307. {
  308. if (dto.UserIds.Count < 1)
  309. {
  310. _result.Msg = string.Format("指派人员不能为空!");
  311. return _result;
  312. }
  313. #region 参数处理
  314. var _TaskAllocation = new Pm_TaskAllocation();
  315. var _TaskRelevanceUsers = new List<Pm_TaskRelevanceUser>();
  316. _TaskAllocation = _mapper.Map<Pm_TaskAllocation>(dto);
  317. _TaskAllocation.CreateUserId = dto.UserId;
  318. _TaskAllocation.Status = TaskEnum.NotStarted;
  319. foreach (var item in dto.UserIds)
  320. {
  321. _TaskRelevanceUsers.Add(new Pm_TaskRelevanceUser() {
  322. TAId = dto.Id,
  323. UserId = item,
  324. TaskStatus = TaskerEnum.NotStarted,
  325. CreateUserId = dto.UserId,
  326. });
  327. }
  328. #endregion
  329. if (dto.Id == 0) //添加
  330. {
  331. //// 1 按 任务名称 查询重
  332. //Pm_TaskAllocation taskAllocation1 = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.TaskName.Equals(_TaskAllocation.TaskName)).FirstAsync();
  333. //if (taskAllocation1 != null)
  334. //{
  335. // _result.Msg = string.Format("任务名称重复,请重命名!");
  336. // return _result;
  337. //}
  338. _sqlSugar.BeginTran();
  339. int addId = await _sqlSugar.Insertable<Pm_TaskAllocation>(_TaskAllocation).ExecuteReturnIdentityAsync();
  340. if (addId < 1)
  341. {
  342. _sqlSugar.RollbackTran();
  343. _result.Msg = string.Format("任务发布失败!");
  344. return _result;
  345. }
  346. foreach (var item in _TaskRelevanceUsers)
  347. {
  348. item.TAId = addId;
  349. }
  350. int addSub = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers).ExecuteCommandAsync();
  351. if (addSub < 1)
  352. {
  353. _sqlSugar.RollbackTran();
  354. _result.Msg = string.Format("任务发布失败!");
  355. return _result;
  356. }
  357. _result.Code = 0;
  358. _result.Msg = "添加成功!";
  359. _sqlSugar.CommitTran();
  360. }
  361. else if (dto.Id > 0) //修改
  362. {
  363. _sqlSugar.BeginTran();
  364. #region 编辑验证 1. 仅创建者可以修改 2.状态完成不可修改
  365. var taskInfo = await _sqlSugar
  366. .Queryable<Pm_TaskAllocation>()
  367. .Where(it => it.Id == dto.Id && it.IsDel == 0)
  368. .FirstAsync();
  369. if (taskInfo != null)
  370. {
  371. (bool isEdit, string msg) = EditPerm(dto.Id, dto.UserId);
  372. if (!isEdit)
  373. {
  374. _result.Msg = msg;
  375. return _result;
  376. }
  377. }
  378. #endregion
  379. int updateStatus1 = await _sqlSugar.Updateable<Pm_TaskAllocation>(_TaskAllocation)
  380. .UpdateColumns(it => new
  381. {
  382. it.DepId,
  383. it.DiId,
  384. it.TaskType,
  385. it.TaskPriority,
  386. it.TaskName,
  387. it.TaskContent,
  388. it.PredictBeginTime,
  389. it.PredictEndTime,
  390. it.IsIntoPerformance,
  391. })
  392. .Where(it => it.Id == _TaskAllocation.Id)
  393. .ExecuteCommandAsync();
  394. if (updateStatus1 < 1)
  395. {
  396. _sqlSugar.RollbackTran();
  397. _result.Msg = string.Format("任务编辑失败!");
  398. return _result;
  399. }
  400. List<int> selectUserId = new List<int>();
  401. selectUserId = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  402. .Where(it => it.IsDel == 0 && it.TAId == _TaskAllocation.Id)
  403. .Select(it => it.UserId)
  404. .ToListAsync();
  405. if (selectUserId.Count < 1)
  406. {
  407. int addSub1 = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers).ExecuteCommandAsync();
  408. if (addSub1 < 1)
  409. {
  410. _sqlSugar.RollbackTran();
  411. _result.Msg = string.Format("任务编辑失败!");
  412. return _result;
  413. }
  414. }
  415. else
  416. {
  417. List<int> SelectUserIdDiff = new List<int>(); //select 差集
  418. SelectUserIdDiff = selectUserId.Except(dto.UserIds).ToList();
  419. if (SelectUserIdDiff.Count > 0) //删除
  420. {
  421. List<Pm_TaskRelevanceUser> _TaskRelevanceUsers1 = new List<Pm_TaskRelevanceUser>();
  422. _TaskRelevanceUsers1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  423. .Where(it => it.IsDel == 0 &&
  424. it.TAId == _TaskAllocation.Id &&
  425. SelectUserIdDiff.Contains(it.UserId))
  426. .ToListAsync();
  427. if (_TaskRelevanceUsers1.Count > 0)
  428. {
  429. foreach (var item in _TaskRelevanceUsers1)
  430. {
  431. item.IsDel = 1;
  432. }
  433. var updateIsDel = await _sqlSugar.Updateable(_TaskRelevanceUsers1)
  434. .UpdateColumns(it => it.IsDel)
  435. .WhereColumns(it => new { it.Id, it.TAId })
  436. .ExecuteCommandAsync();
  437. if (updateIsDel < 1)
  438. {
  439. _sqlSugar.RollbackTran();
  440. _result.Msg = string.Format("任务编辑失败!");
  441. return _result;
  442. }
  443. }
  444. }
  445. List<int> ParaUserIdDiff = new List<int>(); //para 差集
  446. ParaUserIdDiff = dto.UserIds.Except(selectUserId).ToList();
  447. if (ParaUserIdDiff.Count > 0)
  448. {
  449. List<Pm_TaskRelevanceUser> _TaskRelevanceUsers1 = new List<Pm_TaskRelevanceUser>();
  450. _TaskRelevanceUsers1 = _TaskRelevanceUsers.Where(it => ParaUserIdDiff.Contains(it.UserId)).ToList();
  451. if (_TaskRelevanceUsers1.Count > 0)
  452. {
  453. int addSub1 = await _sqlSugar.Insertable<Pm_TaskRelevanceUser>(_TaskRelevanceUsers1).ExecuteCommandAsync();
  454. if (addSub1 < 1)
  455. {
  456. _sqlSugar.RollbackTran();
  457. _result.Msg = string.Format("任务编辑失败!");
  458. return _result;
  459. }
  460. }
  461. }
  462. }
  463. /*
  464. * 发送消息
  465. */
  466. _result.Code = 0;
  467. _result.Msg = "编辑成功!";
  468. _sqlSugar.CommitTran();
  469. }
  470. else _result.Msg = string.Format("请传入有效的Id参数!");
  471. }
  472. else _result.Msg = string.Format("请传入有效的PortType参数!");
  473. return _result;
  474. }
  475. /// <summary>
  476. /// 任务归属人状态 Items
  477. /// </summary>
  478. /// <param name="id"></param>
  479. /// <returns></returns>
  480. public async Task<Result> TaskerDetails(int id)
  481. {
  482. if (id < 1)
  483. {
  484. _result.Msg = string.Format("请传入有效的Id参数!");
  485. return _result;
  486. }
  487. string sql = string.Format(@"Select tau.Id,u.CnName As UserName,tau.BeginTime,tau.OverTime,tau.TaskStatus,
  488. tau.Cause,tau.Score,tau.Remark As ScoreRemark,tau.CreateUserId As TaskCreateUserId
  489. From Pm_TaskRelevanceUser tau
  490. Left Join Sys_Users u On tau.UserId = u.Id
  491. Where tau.IsDel = 0 And tau.TAId = {0}", id);
  492. var data = await _sqlSugar.SqlQueryable<TaskerDetailsView>(sql).ToListAsync();
  493. _result.Data = data;
  494. _result.Msg = string.Format("操作成功!");
  495. _result.Code = 0;
  496. return _result;
  497. }
  498. /// <summary>
  499. /// 任务归属人状态
  500. /// </summary>
  501. /// <param name="id"></param>
  502. /// <returns></returns>
  503. public async Task<Result> TaskerStatus(int id)
  504. {
  505. if (id < 1)
  506. {
  507. _result.Msg = string.Format("请传入有效的Id参数!");
  508. return _result;
  509. }
  510. var data1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.Id == id).FirstAsync();
  511. if (data1 == null)
  512. {
  513. _result.Msg = string.Format("该任务不存在!");
  514. return _result;
  515. }
  516. var data2 = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == data1.TAId).FirstAsync();
  517. _sqlSugar.BeginTran();
  518. var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  519. .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
  520. .ExecuteCommandAsync();
  521. if (update1 < 1)
  522. {
  523. _result.Msg = string.Format("操作失败!");
  524. return _result;
  525. }
  526. _result.Msg = string.Format("操作成功!");
  527. _result.Code = 0;
  528. _sqlSugar.CommitTran();
  529. return _result;
  530. }
  531. /// <summary>
  532. /// 任务归属人设置开始状态
  533. /// </summary>
  534. /// <param name="id"></param>
  535. /// <returns></returns>
  536. public async Task<Result> TaskerSetStartStatus(int userId, int id)
  537. {
  538. if (id < 1)
  539. {
  540. _result.Msg = string.Format("请传入有效的Id参数!");
  541. return _result;
  542. }
  543. //状态限制
  544. var selectData = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.UserId == userId && it.TAId == id).FirstAsync();
  545. if (selectData == null)
  546. {
  547. _result.Msg = string.Format("该任务不在!");
  548. return _result;
  549. }
  550. if (selectData.TaskStatus >= TaskerEnum.UnderWay)
  551. {
  552. _result.Msg = string.Format("该任务已知晓,不可重复设置!");
  553. return _result;
  554. }
  555. _sqlSugar.BeginTran();
  556. var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  557. .SetColumns(it => it.TaskStatus == TaskerEnum.UnderWay)
  558. .SetColumns(it => it.BeginTime == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
  559. .Where(it => it.TAId == id)
  560. .Where(it => it.UserId == userId )
  561. .ExecuteCommandAsync();
  562. if (update1 < 1)
  563. {
  564. _result.Msg = string.Format("操作失败!");
  565. _sqlSugar.RollbackTran();
  566. return _result;
  567. }
  568. var update2 = await _sqlSugar.Updateable<Pm_TaskAllocation>()
  569. .SetColumns(it => it.Status == TaskEnum.UnderWay)
  570. .Where(it => it.Id == id)
  571. .ExecuteCommandAsync();
  572. if (update2 < 1)
  573. {
  574. _result.Msg = string.Format("操作失败!");
  575. _sqlSugar.RollbackTran();
  576. return _result;
  577. }
  578. _sqlSugar.CommitTran();
  579. _result.Msg = string.Format("操作成功!");
  580. _result.Code = 0;
  581. return _result;
  582. }
  583. /// <summary>
  584. /// 任务归属人设置完成状态
  585. /// 1.待审核
  586. /// </summary>
  587. /// <param name="id"></param>
  588. /// <returns></returns>
  589. public async Task<Result> TaskerSetOverStatus(int userId, int id)
  590. {
  591. if (id < 1)
  592. {
  593. _result.Msg = string.Format("请传入有效的Id参数!");
  594. return _result;
  595. }
  596. //状态限制
  597. var selectData = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.UserId == userId && it.TAId == id).FirstAsync();
  598. if (selectData == null)
  599. {
  600. _result.Msg = string.Format("该任务不在!");
  601. return _result;
  602. }
  603. if (selectData.TaskStatus >= TaskerEnum.WaitConfirm)
  604. {
  605. _result.Msg = string.Format("该任务已提交待审核状态,不可重复提交!");
  606. return _result;
  607. }
  608. _sqlSugar.BeginTran();
  609. var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  610. .SetColumns(it => it.TaskStatus == TaskerEnum.WaitConfirm)
  611. .SetColumns(it => it.OverTime == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
  612. .Where(it => it.TAId == id)
  613. .Where(it => it.UserId == userId)
  614. .ExecuteCommandAsync();
  615. if (update1 < 1)
  616. {
  617. _result.Msg = string.Format("操作失败!");
  618. _sqlSugar.RollbackTran();
  619. return _result;
  620. }
  621. var update2 = await _sqlSugar.Updateable<Pm_TaskAllocation>()
  622. .SetColumns(it => it.Status == TaskEnum.UnderWay)
  623. .Where(it => it.Id == id)
  624. .ExecuteCommandAsync();
  625. if (update2 < 1)
  626. {
  627. _result.Msg = string.Format("操作失败!");
  628. _sqlSugar.RollbackTran();
  629. return _result;
  630. }
  631. _sqlSugar.CommitTran();
  632. _result.Msg = string.Format("操作成功!");
  633. _result.Code = 0;
  634. return _result;
  635. }
  636. /// <summary>
  637. /// 设置任务知晓
  638. /// </summary>
  639. /// <param name="id"></param>
  640. /// <returns></returns>
  641. public async Task<Result> TaskSetHaveStatus(int id,int userId)
  642. {
  643. if (id < 1)
  644. {
  645. _result.Msg = string.Format("请传入有效的Id参数!");
  646. return _result;
  647. }
  648. var taskUserInfo = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == id && it.UserId == userId).FirstAsync();
  649. if (taskUserInfo == null)
  650. {
  651. _result.Msg = string.Format("该任务不存在!");
  652. return _result;
  653. }
  654. var taskerId = taskUserInfo.Id;
  655. //状态确认
  656. if (taskUserInfo.TaskStatus == TaskerEnum.HaveKnown)
  657. {
  658. _result.Msg = string.Format("已设置“已知晓”状态,不可重复设置!");
  659. return _result;
  660. }
  661. var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  662. .SetColumns(it => it.TaskStatus == TaskerEnum.HaveKnown)
  663. .Where(it => it.Id == taskerId && it.UserId == userId)
  664. .ExecuteCommandAsync();
  665. if (update1 < 1)
  666. {
  667. _result.Msg = string.Format("操作失败!");
  668. return _result;
  669. }
  670. _result.Msg = string.Format("操作成功!");
  671. _result.Code = 0;
  672. _sqlSugar.CommitTran();
  673. return _result;
  674. }
  675. /// <summary>
  676. /// 设置任务审批状态
  677. /// </summary>
  678. /// <param name="id"></param>
  679. /// <returns></returns>
  680. public Result TaskSetAuditStatus(int id,int userId,string overTime)
  681. {
  682. if (id < 1)
  683. {
  684. _result.Msg = string.Format("请传入有效的任务关联ID!");
  685. return _result;
  686. }
  687. // 实际完成时间验证
  688. // 验证完成时间格式
  689. if (!DateTime.TryParse(overTime,out DateTime overDt))
  690. {
  691. _result.Msg = string.Format("实际完成时间格式不正确,正确时间格式为: yyyy-MM-dd HH:mm:ss");
  692. return _result;
  693. }
  694. // 验证时间合理性(不能是未来时间)
  695. if (overDt > DateTime.Now.AddMinutes(5)) // 允许5分钟内的未来时间(考虑时差)
  696. {
  697. _result.Msg = string.Format("实际完成时间不能是未来时间!");
  698. return _result;
  699. }
  700. _sqlSugar.BeginTran();
  701. try
  702. {
  703. //状态验证
  704. var subTaskInfo = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  705. .Where(it => it.IsDel == 0 && it.TAId == id)
  706. .First();
  707. if (subTaskInfo == null)
  708. {
  709. _result.Msg = string.Format("该任务关联信息不存在!");
  710. return _result;
  711. }
  712. int mainTaskId = subTaskInfo.TAId;
  713. int taskerId = subTaskInfo.Id;
  714. //只有创建人可以审批完成状态
  715. if (subTaskInfo.CreateUserId != userId)
  716. {
  717. _result.Msg = string.Format("只有任务创建者可审批'已完成'状态!");
  718. return _result;
  719. }
  720. //不可重复设置状态
  721. if (subTaskInfo.TaskStatus == TaskerEnum.Finished)
  722. {
  723. _result.Msg = string.Format("“已完成”状态,已设置不可重复操作!");
  724. return _result;
  725. }
  726. var subTaskUpd = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  727. .SetColumns(it => it.TaskStatus == TaskerEnum.Finished)
  728. .SetColumns(it => it.OverTime == overTime)
  729. .Where(it => it.Id == taskerId)
  730. .ExecuteCommand();
  731. if (subTaskUpd < 1)
  732. {
  733. _result.Msg = string.Format("操作失败!");
  734. _sqlSugar.RollbackTran();
  735. return _result;
  736. }
  737. #region 更新主任务状态
  738. // 查询所有关联任务的状态
  739. var allRelevanceTasks = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  740. .Where(x => x.TAId == mainTaskId && x.IsDel == 0)
  741. .Select(x => new
  742. {
  743. x.Id,
  744. x.TaskStatus
  745. })
  746. .ToList();
  747. // 计算任务状态统计
  748. int totalCount = allRelevanceTasks.Count;
  749. // 已完成状态数量
  750. int finishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.Finished);
  751. // 未完成状态数量
  752. int unfinishedCount = allRelevanceTasks.Count(x => x.TaskStatus == TaskerEnum.UnFinished);
  753. // 结束状态数量(已完成 + 未完成)
  754. int endedCount = finishedCount + unfinishedCount;
  755. // 判断是否所有子任务均处于结束状态 是 则更新主任务状态
  756. bool allTasksInEndStatus = totalCount == endedCount;
  757. if (allTasksInEndStatus)
  758. {
  759. TaskEnum newMainTaskStatus;
  760. if (unfinishedCount > 0)
  761. {
  762. // 存在未完成的子任务
  763. newMainTaskStatus = TaskEnum.UnFinished;
  764. }
  765. else if (finishedCount == totalCount)
  766. {
  767. // 所有子任务都已完成
  768. newMainTaskStatus = TaskEnum.Finished;
  769. }
  770. else
  771. {
  772. // 理论上不会走到这里,但为了安全
  773. newMainTaskStatus = TaskEnum.UnFinished;
  774. }
  775. var rowsAffected = _sqlSugar.Updateable<Pm_TaskAllocation>()
  776. .SetColumns(x => new Pm_TaskAllocation
  777. {
  778. Status = newMainTaskStatus,
  779. OverTime = overTime
  780. })
  781. .Where(x => x.Id == mainTaskId && x.IsDel == 0)
  782. .ExecuteCommand();
  783. if (rowsAffected <= 0)
  784. {
  785. _result.Msg = string.Format("更新主任务状态失败!");
  786. _sqlSugar.RollbackTran();
  787. return _result;
  788. }
  789. }
  790. #endregion
  791. _result.Msg = string.Format("操作成功!");
  792. _result.Code = 0;
  793. _sqlSugar.CommitTran();
  794. return _result;
  795. }
  796. catch (Exception)
  797. {
  798. _sqlSugar.RollbackTran();
  799. _result.Msg = string.Format("操作失败!");
  800. return _result;
  801. }
  802. }
  803. /// <summary>
  804. /// 设置任务未完成状态
  805. /// </summary>
  806. /// <param name="id"></param>
  807. /// <returns></returns>
  808. public async Task<Result> TaskSetUnFinishedStatus(int id, string cause)
  809. {
  810. if (id < 1)
  811. {
  812. _result.Msg = string.Format("请传入有效的Id参数!");
  813. return _result;
  814. }
  815. var data1 = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.Id == id).FirstAsync();
  816. if (data1 == null)
  817. {
  818. _result.Msg = string.Format("该任务不存在或者该任务未分配给你!");
  819. return _result;
  820. }
  821. int _taId = data1.TAId;
  822. _sqlSugar.BeginTran();
  823. var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  824. .SetColumns(it => it.TaskStatus == TaskerEnum.UnFinished)
  825. .SetColumns(it => it.Cause == cause)
  826. .Where(it => it.Id == id)
  827. .ExecuteCommandAsync();
  828. if (update1 < 1)
  829. {
  830. _result.Msg = string.Format("操作失败!");
  831. _sqlSugar.RollbackTran();
  832. return _result;
  833. }
  834. //设置任务状态
  835. var data2 = _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.IsDel == 0 && it.TAId == _taId).ToList();
  836. var data3 = data2.Where(it => it.TaskStatus == TaskerEnum.Finished && it.Id != id).ToList();
  837. var data4 = data2.Where(it => it.TaskStatus == TaskerEnum.UnFinished && it.Id != id).ToList();
  838. if ((data2.Count - 1) == (data3.Count + data4.Count))
  839. {
  840. var update2 = _sqlSugar.Updateable<Pm_TaskAllocation>()
  841. .SetColumns(it => it.Status == TaskEnum.UnFinished)
  842. .Where(it => it.Id == _taId)
  843. .ExecuteCommand();
  844. if (update2 < 1)
  845. {
  846. _result.Msg = string.Format("操作失败!");
  847. _sqlSugar.RollbackTran();
  848. return _result;
  849. }
  850. }
  851. _result.Msg = string.Format("操作成功!");
  852. _result.Code = 0;
  853. _sqlSugar.CommitTran();
  854. return _result;
  855. }
  856. /// <summary>
  857. /// 任务确认完成
  858. /// </summary>
  859. /// <param name="dto"></param>
  860. /// <returns></returns>
  861. public async Task<Result> TaskConfirmCompletion(int portType,int id)
  862. {
  863. if (portType == 1 || portType == 2 || portType == 3)
  864. {
  865. if (id < 1)
  866. {
  867. _result.Msg = string.Format("请传入有效的Id参数!");
  868. return _result;
  869. }
  870. var data = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  871. .Where(it => it.IsDel == 0 && it.Id == id && it.TaskStatus <= TaskerEnum.UnFinished)
  872. .ToListAsync();
  873. if (data.Count > 0)
  874. {
  875. _result.Msg = string.Format("本任务参与人员并未全部完成,不可确认任务完成!");
  876. return _result;
  877. }
  878. var update = await _sqlSugar.Updateable<Pm_TaskAllocation>()
  879. .SetColumns(it => it.IsComplete == 1)
  880. .SetColumns(it => it.Status == TaskEnum.Finished)
  881. .Where(it => it.Id == id)
  882. .ExecuteCommandAsync();
  883. if (update > 0)
  884. {
  885. _result.Code = 0;
  886. return _result;
  887. }
  888. else _result.Msg = "确认完成失败!";
  889. }
  890. else
  891. {
  892. _result.Msg = string.Format("请传入有效的PortType参数!");
  893. }
  894. return _result;
  895. }
  896. /// <summary>
  897. /// 任务评分
  898. /// </summary>
  899. /// <param name="dto"></param>
  900. /// <returns></returns>
  901. public async Task<Result> TaskScore(TaskAllocationScoreDto dto)
  902. {
  903. int portType = dto.PortType;
  904. if (portType == 1 || portType == 2 || portType == 3)
  905. {
  906. if (dto.SubId < 1)
  907. {
  908. _result.Msg = string.Format("请传入有效的SubId参数!");
  909. return _result;
  910. }
  911. //var data = await _sqlSugar.Queryable<Pm_TaskAllocation>()
  912. // .Where(it => it.IsDel == 0 )
  913. // .FirstAsync();
  914. //if (data == null)
  915. //{
  916. // _result.Msg = string.Format("本任务尚未由发布人确认任务完成,不可评分!");
  917. // return _result;
  918. //}
  919. var data = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
  920. .Where(it => it.IsDel == 0 && it.Id == dto.SubId)
  921. .First();
  922. if (data == null)
  923. {
  924. _result.Msg = string.Format("本任务尚未由发布人确认任务完成,不可评分!");
  925. return _result;
  926. }
  927. if (data.TaskStatus != TaskerEnum.Finished)
  928. {
  929. _result.Msg = string.Format("本任务尚未由发布人确认任务完成,不可评分!");
  930. return _result;
  931. }
  932. Pm_TaskRelevanceUser _TaskRelevanceUser = new Pm_TaskRelevanceUser() {
  933. Id = dto.SubId,
  934. Score = dto.Score,
  935. Remark = dto.ScoreRemark
  936. };
  937. var update = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>(_TaskRelevanceUser)
  938. .UpdateColumns(it => new { it.Score, it.Remark })
  939. .WhereColumns(it => it.Id)
  940. .ExecuteCommandAsync();
  941. if (update > 0)
  942. {
  943. _result.Code = 0;
  944. return _result;
  945. }
  946. else _result.Msg = "评分失败!";
  947. }
  948. else
  949. {
  950. _result.Msg = string.Format("请传入有效的PortType参数!");
  951. }
  952. return _result;
  953. }
  954. /// <summary>
  955. /// 任务终止
  956. /// </summary>
  957. /// <param name="dto"></param>
  958. /// <returns></returns>
  959. public async Task<Result> TaskTermination(int taskId,int userId)
  960. {
  961. if (taskId < 1)
  962. {
  963. _result.Msg = string.Format("请传入有效的taskId参数!");
  964. return _result;
  965. }
  966. //权限验证
  967. (bool taskStopPerm,string msg) = TaskStopPerm(taskId, userId);
  968. if (!taskStopPerm)
  969. {
  970. _result.Msg = msg;
  971. return _result;
  972. }
  973. _sqlSugar.BeginTran();
  974. var taskUpdate = _sqlSugar.Updateable<Pm_TaskAllocation>()
  975. .SetColumns(it => it.Status == TaskEnum.TaskStop)
  976. .Where(it => it.Id == taskId)
  977. .ExecuteCommand();
  978. if (taskUpdate < 1)
  979. {
  980. _result.Msg = "任务终止失败!";
  981. _sqlSugar.RollbackTran();
  982. return _result;
  983. }
  984. var subTaskUpdate = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  985. .SetColumns(it => it.TaskStatus == TaskerEnum.TaskStop)
  986. .Where(it => it.TAId == taskId)
  987. .ExecuteCommand();
  988. if (taskUpdate < 1)
  989. {
  990. _result.Msg = "任务终止失败!";
  991. _sqlSugar.RollbackTran();
  992. return _result;
  993. }
  994. _result.Msg = "操作成功!";
  995. _result.Code = 0;
  996. _sqlSugar.CommitTran();
  997. return _result;
  998. }
  999. /// <summary>
  1000. /// 任务删除
  1001. /// </summary>
  1002. /// <param name="dto"></param>
  1003. /// <returns></returns>
  1004. public async Task<Result> TaskDel(int taskId,int userId)
  1005. {
  1006. if (taskId < 1)
  1007. {
  1008. _result.Msg = string.Format("请传入有效的taskId参数!");
  1009. return _result;
  1010. }
  1011. _sqlSugar.BeginTran();
  1012. var nowStrig = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  1013. var taskUpdate = _sqlSugar.Updateable<Pm_TaskAllocation>()
  1014. .SetColumns(it => it.IsDel == 1)
  1015. .SetColumns(it => it.DeleteUserId == userId)
  1016. .SetColumns(it => it.DeleteTime == nowStrig)
  1017. .Where(it => it.Id == taskId)
  1018. .ExecuteCommand();
  1019. if (taskUpdate < 1)
  1020. {
  1021. _result.Msg = "任务删除失败!";
  1022. _sqlSugar.RollbackTran();
  1023. return _result;
  1024. }
  1025. var subTaskUpdate = _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
  1026. .SetColumns(it => it.IsDel == 1)
  1027. .SetColumns(it => it.DeleteUserId == userId)
  1028. .SetColumns(it => it.DeleteTime == nowStrig)
  1029. .Where(it => it.TAId == taskId)
  1030. .ExecuteCommand();
  1031. if (taskUpdate < 1)
  1032. {
  1033. _result.Msg = "任务删除失败!";
  1034. _sqlSugar.RollbackTran();
  1035. return _result;
  1036. }
  1037. _result.Msg = "操作成功!";
  1038. _result.Code = 0;
  1039. _sqlSugar.CommitTran();
  1040. return _result;
  1041. }
  1042. }
  1043. }